diff --git a/modules/material_maker/mat_maker_gd/LICENSE.md b/modules/material_maker/mat_maker_gd/LICENSE.md
new file mode 100644
index 000000000..ca6aeaf3b
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/LICENSE.md
@@ -0,0 +1,22 @@
+# MIT License
+
+Copyright (c) 2020 Péter Magyar
+Copyright (c) 2018-2020 Rodolphe Suescun and contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/modules/material_maker/mat_maker_gd/README.md b/modules/material_maker/mat_maker_gd/README.md
new file mode 100644
index 000000000..f5f42f6f5
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/README.md
@@ -0,0 +1,22 @@
+# mat_maker_gd
+
+My goal with this project is to take Material Maker's ( https://github.com/RodZill4/material-maker ) code,
+and make it an in-godot texture/image generator.
+
+If it turns out well I'll probably turn it into a c++ engine module eventually.
+
+Multi threading uses my threadpool engine module for now.
+
+## Status:
+
+Missing ~ 60 nodes from ~ 195.
+
+## TODOS
+
+- [ ] Go through the current MaterialMaker and add the code from all the new nodes.
+- [ ] Go through the current MaterialMaker and update any old code.
+- [ ] Add note to all files that has code from MaterialMaker.
+- [ ] Proper readme.md.
+- [ ] Per node seed like in the original.
+- [ ] Port all the nodes. Missing ~ 60 from ~ 195
+- [ ] Somehow get ctrl-s to always just save the edited material, instead of having to double click it (for the inspector to update), and then clicking the save icon and selecting save.
diff --git a/modules/material_maker/mat_maker_gd/editor/CreateNamePopup.gd b/modules/material_maker/mat_maker_gd/editor/CreateNamePopup.gd
new file mode 100644
index 000000000..c01422614
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/editor/CreateNamePopup.gd
@@ -0,0 +1,65 @@
+tool
+extends ConfirmationDialog
+
+signal ok_pressed
+
+export(NodePath) var line_edit_path : NodePath
+export(NodePath) var tree_path : NodePath
+
+export(PoolStringArray) var type_folders : PoolStringArray
+
+var _resource_type : String = "MMNode"
+
+var _line_edit : LineEdit
+var _tree : Tree
+
+func _ready():
+ _line_edit = get_node(line_edit_path) as LineEdit
+ _tree = get_node(tree_path) as Tree
+
+ connect("confirmed", self, "_on_OK_pressed")
+ connect("about_to_show", self, "about_to_show")
+
+func set_resource_type(resource_type : String) -> void:
+ _resource_type = resource_type
+
+func about_to_show():
+ _tree.clear()
+
+ var root : TreeItem = _tree.create_item()
+
+ for s in type_folders:
+ evaluate_folder(s, root)
+
+func evaluate_folder(folder : String, root : TreeItem) -> void:
+ var ti : TreeItem = _tree.create_item(root)
+ ti.set_text(0, folder.substr(folder.find_last("/") + 1))
+
+ var dir = Directory.new()
+ if dir.open(folder) == OK:
+ dir.list_dir_begin()
+ var file_name = dir.get_next()
+ while file_name != "":
+ if !dir.current_is_dir():
+ print("Found file: " + file_name)
+ var e : TreeItem = _tree.create_item(ti)
+
+ e.set_text(0, file_name.get_file())
+ e.set_meta("file", folder + "/" + file_name)
+
+ file_name = dir.get_next()
+ else:
+ print("An error occurred when trying to access the path.")
+
+func _on_OK_pressed():
+ var selected : TreeItem = _tree.get_selected()
+
+ if selected:
+ if !selected.has_meta("file"):
+ hide()
+ return
+
+ var file_name : String = selected.get_meta("file")
+ emit_signal("ok_pressed", file_name)
+
+ hide()
diff --git a/modules/material_maker/mat_maker_gd/editor/CreateNamePopup.tscn b/modules/material_maker/mat_maker_gd/editor/CreateNamePopup.tscn
new file mode 100644
index 000000000..b2f22ac1c
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/editor/CreateNamePopup.tscn
@@ -0,0 +1,61 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/editor/CreateNamePopup.gd" type="Script" id=1]
+
+[node name="CreateNamePopup" type="ConfirmationDialog"]
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+margin_left = -245.5
+margin_top = -220.0
+margin_right = 245.5
+margin_bottom = 220.0
+window_title = "Create New Resource"
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+line_edit_path = NodePath("VBoxContainer/LineEdit")
+tree_path = NodePath("VBoxContainer/Tree")
+
+[node name="VBoxContainer" type="VBoxContainer" parent="."]
+margin_left = 8.0
+margin_top = 8.0
+margin_right = 483.0
+margin_bottom = 404.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Label2" type="Label" parent="VBoxContainer"]
+margin_right = 475.0
+margin_bottom = 14.0
+size_flags_horizontal = 3
+text = "Type"
+
+[node name="Tree" type="Tree" parent="VBoxContainer"]
+margin_top = 18.0
+margin_right = 475.0
+margin_bottom = 350.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+hide_root = true
+
+[node name="Label" type="Label" parent="VBoxContainer"]
+visible = false
+margin_top = 354.0
+margin_right = 475.0
+margin_bottom = 368.0
+size_flags_horizontal = 3
+text = "Name"
+
+[node name="LineEdit" type="LineEdit" parent="VBoxContainer"]
+visible = false
+margin_top = 372.0
+margin_right = 475.0
+margin_bottom = 396.0
+size_flags_horizontal = 3
+caret_blink = true
diff --git a/modules/material_maker/mat_maker_gd/editor/MatMakerGDEditor.gd b/modules/material_maker/mat_maker_gd/editor/MatMakerGDEditor.gd
new file mode 100644
index 000000000..cc696407c
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/editor/MatMakerGDEditor.gd
@@ -0,0 +1,222 @@
+tool
+extends MarginContainer
+
+var MMGraphNode = preload("res://addons/mat_maker_gd/editor/mm_graph_node.gd")
+
+export(PoolColorArray) var slot_colors : PoolColorArray
+
+export(NodePath) var graph_edit_path : NodePath = "VBoxContainer/GraphEdit"
+export(NodePath) var add_popup_path : NodePath = "Popups/AddPopup"
+
+var _graph_edit : GraphEdit = null
+
+var _material : MMMateial
+var _ignore_material_change_event : int = 0
+var _recreation_in_progress : bool = false
+
+var _plugin : EditorPlugin = null
+var _undo_redo : UndoRedo = null
+
+func _enter_tree():
+ ensure_objs()
+
+func set_plugin(plugin : EditorPlugin) -> void:
+ _plugin = plugin
+ _undo_redo = plugin.get_undo_redo()
+
+func get_undo_redo() -> UndoRedo:
+ return _undo_redo
+
+func ensure_objs() -> void:
+ if !_graph_edit:
+ _graph_edit = get_node(graph_edit_path)
+
+ _graph_edit.add_valid_connection_type(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL)
+ _graph_edit.add_valid_connection_type(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_INT, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL)
+ _graph_edit.add_valid_connection_type(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL)
+ _graph_edit.add_valid_connection_type(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_VECTOR2, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL)
+ _graph_edit.add_valid_connection_type(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_VECTOR3, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL)
+ _graph_edit.add_valid_connection_type(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_COLOR, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL)
+
+ _graph_edit.add_valid_connection_type(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE)
+ _graph_edit.add_valid_connection_type(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_INT)
+ _graph_edit.add_valid_connection_type(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT)
+ _graph_edit.add_valid_connection_type(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_VECTOR2)
+ _graph_edit.add_valid_connection_type(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_VECTOR3)
+ _graph_edit.add_valid_connection_type(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_COLOR)
+
+ _graph_edit.add_valid_connection_type(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL)
+
+ _graph_edit.add_valid_connection_type(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE)
+ _graph_edit.add_valid_connection_type(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_INT, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_INT)
+ _graph_edit.add_valid_connection_type(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT)
+ _graph_edit.add_valid_connection_type(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_VECTOR2, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_VECTOR2)
+ _graph_edit.add_valid_connection_type(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_VECTOR3, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_VECTOR3)
+ _graph_edit.add_valid_connection_type(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_COLOR, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_COLOR)
+
+ _graph_edit.connect("connection_request", self, "on_graph_edit_connection_request")
+ _graph_edit.connect("disconnection_request", self, "on_graph_edit_disconnection_request")
+
+func recreate() -> void:
+ ignore_changes(true)
+
+ if _recreation_in_progress:
+ return
+
+ _recreation_in_progress = true
+
+ ensure_objs()
+
+ _graph_edit.clear_connections()
+
+ for c in _graph_edit.get_children():
+ if c is GraphNode:
+ _graph_edit.remove_child(c)
+ c.queue_free()
+
+ if !_material:
+ return
+
+ _material.cancel_render_and_wait()
+
+ for n in _material.nodes:
+ var gn : GraphNode = MMGraphNode.new()
+ gn.slot_colors = slot_colors
+ gn.set_editor(self)
+ gn.set_node(_material, n)
+ _graph_edit.add_child(gn)
+
+ #connect them
+ for n in _material.nodes:
+ if n:
+ for ip in n.input_properties:
+ if ip.input_property:
+ var input_node : Node = find_graph_node_for(n)
+ var output_node : Node = find_graph_node_for(ip.input_property.owner)
+
+ var to_slot : int = input_node.get_input_property_graph_node_slot_index(ip)
+ var from_slot : int = output_node.get_output_property_graph_node_slot_index(ip.input_property)
+
+ _graph_edit.connect_node(output_node.name, from_slot, input_node.name, to_slot)
+
+ _material.render()
+
+ _recreation_in_progress = false
+
+ ignore_changes(false)
+
+func find_graph_node_for(nnode) -> Node:
+ for c in _graph_edit.get_children():
+ if c is GraphNode:
+ if c.has_method("get_material_node"):
+ var n = c.get_material_node()
+
+ if n == nnode:
+ return c
+
+ return null
+
+func set_mmmaterial(object : MMMateial):
+ if _material:
+ _material.disconnect("changed", self, "on_material_changed")
+
+ _material = object
+
+ recreate()
+
+ if _material:
+ _material.connect("changed", self, "on_material_changed")
+
+func on_material_changed() -> void:
+ if _ignore_material_change_event > 0:
+ return
+
+ if _recreation_in_progress:
+ return
+
+ call_deferred("recreate")
+
+func ignore_changes(val : bool) -> void:
+ if val:
+ _ignore_material_change_event += 1
+ else:
+ _ignore_material_change_event -= 1
+
+func on_graph_edit_connection_request(from: String, from_slot: int, to: String, to_slot: int):
+ var from_node : GraphNode = _graph_edit.get_node(from)
+ var to_node : GraphNode = _graph_edit.get_node(to)
+
+ ignore_changes(true)
+
+ _material.cancel_render_and_wait()
+
+ if from_node.connect_slot(from_slot, to_node, to_slot):
+ _graph_edit.connect_node(from, from_slot, to, to_slot)
+
+ ignore_changes(false)
+
+func on_graph_edit_disconnection_request(from: String, from_slot: int, to: String, to_slot: int):
+ var from_node : GraphNode = _graph_edit.get_node(from)
+ var to_node : GraphNode = _graph_edit.get_node(to)
+
+ ignore_changes(true)
+
+ _material.cancel_render_and_wait()
+
+ if from_node.disconnect_slot(from_slot, to_node, to_slot):
+ _graph_edit.disconnect_node(from, from_slot, to, to_slot)
+
+ ignore_changes(false)
+
+func on_graph_node_close_request(node : GraphNode) -> void:
+ if _material:
+ ignore_changes(true)
+
+ _material.cancel_render_and_wait()
+
+ #_material.remove_node(node._node)
+
+ _undo_redo.create_action("MMGD: Remove Node")
+ _undo_redo.add_do_method(_material, "remove_node", node._node)
+ _undo_redo.add_undo_method(_material, "add_node", node._node)
+ _undo_redo.commit_action()
+
+ recreate()
+
+ ignore_changes(false)
+
+func _on_AddButton_pressed():
+ get_node(add_popup_path).popup_centered()
+
+func _on_AddPopup_ok_pressed(script_path : String):
+ if !_material:
+ return
+
+ ensure_objs()
+
+ _material.cancel_render_and_wait()
+
+ var sc = load(script_path)
+ var nnode : MMNode = sc.new()
+
+ if !nnode:
+ print("_on_AddPopup_ok_pressed: Error !nnode! script: " + script_path)
+ return
+
+ ignore_changes(true)
+
+ #_material.add_node(nnode)
+
+ _undo_redo.create_action("MMGD: Add Node")
+ _undo_redo.add_do_method(_material, "add_node", nnode)
+ _undo_redo.add_undo_method(_material, "remove_node", nnode)
+ _undo_redo.commit_action()
+
+ var gn : GraphNode = MMGraphNode.new()
+ gn.slot_colors = slot_colors
+ gn.set_editor(self)
+ gn.set_node(_material, nnode)
+ _graph_edit.add_child(gn)
+
+ ignore_changes(false)
+
diff --git a/modules/material_maker/mat_maker_gd/editor/MatMakerGDEditor.tscn b/modules/material_maker/mat_maker_gd/editor/MatMakerGDEditor.tscn
new file mode 100644
index 000000000..c8e3a6377
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/editor/MatMakerGDEditor.tscn
@@ -0,0 +1,55 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/editor/MatMakerGDEditor.gd" type="Script" id=1]
+[ext_resource path="res://addons/mat_maker_gd/editor/CreateNamePopup.tscn" type="PackedScene" id=2]
+
+[node name="MatMakerGDEditor" type="MarginContainer"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+rect_min_size = Vector2( 0, 200 )
+size_flags_horizontal = 3
+size_flags_vertical = 3
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+slot_colors = PoolColorArray( 0.905882, 0.0627451, 0.0627451, 1, 0.431373, 0.0352941, 0.0352941, 1, 0.827451, 0.376471, 0.376471, 1, 0.0431373, 0.478431, 0.427451, 1, 0.352941, 0.0352941, 0.341176, 1, 0.0352941, 0.0509804, 1, 1, 0.372549, 0.372549, 0.372549, 1 )
+
+[node name="VBoxContainer" type="VBoxContainer" parent="."]
+margin_right = 1024.0
+margin_bottom = 600.0
+
+[node name="PanelContainer" type="PanelContainer" parent="VBoxContainer"]
+margin_right = 1024.0
+margin_bottom = 34.0
+
+[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/PanelContainer"]
+margin_left = 7.0
+margin_top = 7.0
+margin_right = 1017.0
+margin_bottom = 27.0
+
+[node name="AddButton" type="Button" parent="VBoxContainer/PanelContainer/HBoxContainer"]
+margin_right = 37.0
+margin_bottom = 20.0
+text = "Add"
+
+[node name="GraphEdit" type="GraphEdit" parent="VBoxContainer"]
+margin_top = 38.0
+margin_right = 1024.0
+margin_bottom = 600.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+right_disconnects = true
+scroll_offset = Vector2( 0, -20 )
+
+[node name="Popups" type="Control" parent="."]
+margin_right = 1024.0
+margin_bottom = 600.0
+mouse_filter = 2
+
+[node name="AddPopup" parent="Popups" instance=ExtResource( 2 )]
+type_folders = PoolStringArray( "res://addons/mat_maker_gd/nodes/uniform", "res://addons/mat_maker_gd/nodes/noise", "res://addons/mat_maker_gd/nodes/filter", "res://addons/mat_maker_gd/nodes/gradient", "res://addons/mat_maker_gd/nodes/pattern", "res://addons/mat_maker_gd/nodes/sdf2d", "res://addons/mat_maker_gd/nodes/sdf3d", "res://addons/mat_maker_gd/nodes/transform", "res://addons/mat_maker_gd/nodes/simple", "res://addons/mat_maker_gd/nodes/other" )
+
+[connection signal="pressed" from="VBoxContainer/PanelContainer/HBoxContainer/AddButton" to="." method="_on_AddButton_pressed"]
+[connection signal="ok_pressed" from="Popups/AddPopup" to="." method="_on_AddPopup_ok_pressed"]
diff --git a/modules/material_maker/mat_maker_gd/editor/mm_graph_node.gd b/modules/material_maker/mat_maker_gd/editor/mm_graph_node.gd
new file mode 100644
index 000000000..ecec0d1e8
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/editor/mm_graph_node.gd
@@ -0,0 +1,727 @@
+tool
+extends GraphNode
+
+var gradient_editor_scene : PackedScene = preload("res://addons/mat_maker_gd/widgets/gradient_editor/gradient_editor.tscn")
+var polygon_edit_scene : PackedScene = preload("res://addons/mat_maker_gd/widgets/polygon_edit/polygon_edit.tscn")
+var curve_edit_scene : PackedScene = preload("res://addons/mat_maker_gd/widgets/curve_edit/curve_edit.tscn")
+
+var slot_colors : PoolColorArray
+
+var _material : MMMateial = null
+var _node : MMNode = null
+var properties : Array = Array()
+
+var _editor_node
+var _undo_redo : UndoRedo = null
+var _ignore_change_event : bool = false
+
+func _init():
+ show_close = true
+ connect("dragged", self, "on_dragged")
+ connect("close_request", self, "on_close_request")
+
+func set_editor(editor_node) -> void:
+ _editor_node = editor_node
+
+ _undo_redo = _editor_node.get_undo_redo()
+
+func ignore_changes(val : bool) -> void:
+ _ignore_change_event = val
+ _editor_node.ignore_changes(val)
+
+func add_slot_texture(getter : String, setter : String) -> int:
+ var t : TextureRect = TextureRect.new()
+ t.rect_min_size = Vector2(128, 128)
+ t.expand = true
+ t.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED
+
+ var slot_idx : int = add_slot(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_NONE, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_NONE, getter, setter, t)
+
+ t.texture = _node.call(getter, _material, slot_idx)
+ properties[slot_idx].append(t.texture)
+
+ return slot_idx
+
+func add_slot_texture_universal(property : MMNodeUniversalProperty) -> int:
+ var t : TextureRect = TextureRect.new()
+ t.rect_min_size = Vector2(128, 128)
+ t.expand = true
+ t.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED
+
+ var slot_idx : int = add_slot(property.input_slot_type, property.output_slot_type, "", "", t)
+
+ var img : Image = property.get_active_image()
+
+ var tex : ImageTexture = ImageTexture.new()
+
+ if img:
+ tex.create_from_image(img, 0)
+
+ t.texture = tex
+
+ properties[slot_idx].append(property)
+
+ property.connect("changed", self, "on_universal_texture_changed", [ slot_idx ])
+
+ return slot_idx
+
+func add_slot_image_path_universal(property : MMNodeUniversalProperty, getter : String, setter : String) -> int:
+ var t : TextureButton = load("res://addons/mat_maker_gd/widgets/image_picker_button/image_picker_button.tscn").instance()
+
+ var slot_idx : int = add_slot(property.input_slot_type, property.output_slot_type, "", "", t)
+
+ properties[slot_idx].append(property)
+ properties[slot_idx].append(getter)
+ properties[slot_idx].append(setter)
+
+ property.connect("changed", self, "on_universal_texture_changed_image_picker", [ slot_idx ])
+
+ t.connect("on_file_selected", self, "on_universal_image_path_changed", [ slot_idx ])
+
+ t.call_deferred("do_set_image_path", _node.call(getter))
+
+ return slot_idx
+
+
+func add_slot_gradient() -> int:
+ var ge : Control = gradient_editor_scene.instance()
+ ge.graph_node = self
+ ge.set_undo_redo(_undo_redo)
+
+ var slot_idx : int = add_slot(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_NONE, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_NONE, "", "", ge)
+
+ ge.set_value(_node)
+ #ge.texture = _node.call(getter, _material, slot_idx)
+ #properties[slot_idx].append(ge.texture)
+
+ return slot_idx
+
+func add_slot_polygon() -> int:
+ var ge : Control = polygon_edit_scene.instance()
+
+ var slot_idx : int = add_slot(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_NONE, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_NONE, "", "", ge)
+
+ ge.set_value(_node)
+ #ge.texture = _node.call(getter, _material, slot_idx)
+ #properties[slot_idx].append(ge.texture)
+
+ return slot_idx
+
+func add_slot_curve() -> int:
+ var ge : Control = curve_edit_scene.instance()
+
+ var slot_idx : int = add_slot(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_NONE, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_NONE, "", "", ge)
+
+ ge.set_value(_node)
+ #ge.texture = _node.call(getter, _material, slot_idx)
+ #properties[slot_idx].append(ge.texture)
+
+ return slot_idx
+
+func add_slot_color(getter : String, setter : String) -> int:
+ var cp : ColorPickerButton = ColorPickerButton.new()
+
+ var slot_idx : int = add_slot(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_NONE, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_NONE, getter, setter, cp)
+
+ cp.color = _node.call(getter)
+
+ cp.connect("color_changed", _node, setter)
+
+ return slot_idx
+
+func add_slot_color_universal(property : MMNodeUniversalProperty) -> int:
+ var cp : ColorPickerButton = ColorPickerButton.new()
+
+ var slot_idx : int = add_slot(property.input_slot_type, property.output_slot_type, "", "", cp)
+
+ cp.color = property.get_default_value()
+
+ properties[slot_idx].append(property)
+
+ cp.connect("color_changed", self, "on_universal_color_changed", [ slot_idx ])
+
+ return slot_idx
+
+func add_slot_label(getter : String, setter : String, slot_name : String) -> int:
+ var l : Label = Label.new()
+
+ l.text = slot_name
+
+ return add_slot(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_NONE, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_NONE, getter, setter, l)
+
+func add_slot_line_edit(getter : String, setter : String, slot_name : String, placeholder : String = "") -> int:
+ var bc : VBoxContainer = VBoxContainer.new()
+
+ var l : Label = Label.new()
+ l.text = slot_name
+ bc.add_child(l)
+
+ var le : LineEdit = LineEdit.new()
+ le.placeholder_text = placeholder
+ bc.add_child(le)
+
+ var slot_idx : int = add_slot(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_NONE, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_NONE, getter, setter, bc)
+
+ le.text = _node.call(getter)
+
+ le.connect("text_entered", self, "on_slot_line_edit_text_entered", [ slot_idx ])
+
+ return slot_idx
+
+func add_slot_enum(getter : String, setter : String, slot_name : String, values : Array) -> int:
+ var bc : VBoxContainer = VBoxContainer.new()
+
+ if slot_name:
+ var l : Label = Label.new()
+ l.text = slot_name
+ bc.add_child(l)
+
+ var mb : OptionButton = OptionButton.new()
+
+ for v in values:
+ mb.add_item(v)
+
+ bc.add_child(mb)
+
+ var slot_idx : int = add_slot(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_NONE, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_NONE, getter, setter, bc)
+
+ mb.selected = _node.call(getter)
+
+ mb.connect("item_selected", self, "on_slot_enum_item_selected", [ slot_idx ])
+
+ return slot_idx
+
+func add_slot_int(getter : String, setter : String, slot_name : String, prange : Vector2 = Vector2(-1000, 1000)) -> int:
+ var bc : VBoxContainer = VBoxContainer.new()
+
+ var l : Label = Label.new()
+ l.text = slot_name
+ bc.add_child(l)
+
+ var sb : SpinBox = SpinBox.new()
+ sb.rounded = true
+ sb.min_value = prange.x
+ sb.max_value = prange.y
+ bc.add_child(sb)
+
+ var slot_idx : int = add_slot(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_NONE, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_NONE, getter, setter, bc)
+
+ sb.value = _node.call(getter)
+
+ sb.connect("value_changed", self, "on_int_spinbox_value_changed", [ slot_idx ])
+
+ return slot_idx
+
+func add_slot_bool(getter : String, setter : String, slot_name : String) -> int:
+ var cb : CheckBox = CheckBox.new()
+ cb.text = slot_name
+
+ var slot_idx : int = add_slot(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_NONE, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_NONE, getter, setter, cb)
+
+ cb.pressed = _node.call(getter)
+
+ cb.connect("toggled", _node, setter)
+
+ return slot_idx
+
+func add_slot_label_universal(property : MMNodeUniversalProperty) -> int:
+ var l : Label = Label.new()
+ l.text = property.slot_name
+
+ var slot_idx : int = add_slot(property.input_slot_type, property.output_slot_type, "", "", l)
+
+ properties[slot_idx].append(property)
+
+ return slot_idx
+
+func add_slot_int_universal(property : MMNodeUniversalProperty) -> int:
+ var bc : VBoxContainer = VBoxContainer.new()
+
+ var l : Label = Label.new()
+ l.text = property.slot_name
+ bc.add_child(l)
+
+ var sb : SpinBox = SpinBox.new()
+ sb.rounded = true
+ sb.min_value = property.value_range.x
+ sb.max_value = property.value_range.y
+ bc.add_child(sb)
+
+ var slot_idx : int = add_slot(property.input_slot_type, property.output_slot_type, "", "", bc)
+
+ sb.value = property.get_default_value()
+
+ sb.connect("value_changed", self, "on_int_universal_spinbox_value_changed", [ slot_idx ])
+
+ properties[slot_idx].append(property)
+
+ return slot_idx
+
+func add_slot_float(getter : String, setter : String, slot_name : String, step : float = 0.1, prange : Vector2 = Vector2(-1000, 1000)) -> int:
+ var bc : VBoxContainer = VBoxContainer.new()
+
+ var l : Label = Label.new()
+ l.text = slot_name
+ bc.add_child(l)
+
+ var sb : SpinBox = SpinBox.new()
+ bc.add_child(sb)
+
+ var slot_idx : int = add_slot(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_NONE, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_NONE, getter, setter, bc)
+ sb.rounded = false
+ sb.step = step
+ sb.min_value = prange.x
+ sb.max_value = prange.y
+ sb.value = _node.call(getter)
+
+ sb.connect("value_changed", self, "on_float_spinbox_value_changed", [ slot_idx ])
+
+ return slot_idx
+
+func add_slot_float_universal(property : MMNodeUniversalProperty) -> int:
+ var bc : VBoxContainer = VBoxContainer.new()
+
+ var l : Label = Label.new()
+ l.text = property.slot_name
+ bc.add_child(l)
+
+ var sb : SpinBox = SpinBox.new()
+ bc.add_child(sb)
+
+ var slot_idx : int = add_slot(property.input_slot_type, property.output_slot_type, "", "", bc)
+ sb.rounded = false
+ sb.step = property.value_step
+ sb.min_value = property.value_range.x
+ sb.max_value = property.value_range.y
+ sb.value = property.get_default_value()
+
+ properties[slot_idx].append(property)
+
+ sb.connect("value_changed", self, "on_float_universal_spinbox_value_changed", [ slot_idx ])
+
+ return slot_idx
+
+func add_slot_vector2(getter : String, setter : String, slot_name : String, step : float = 0.1, prange : Vector2 = Vector2(-1000, 1000)) -> int:
+ var bc : VBoxContainer = VBoxContainer.new()
+
+ var l : Label = Label.new()
+ l.text = slot_name
+ bc.add_child(l)
+
+ var sbx : SpinBox = SpinBox.new()
+ bc.add_child(sbx)
+
+ var sby : SpinBox = SpinBox.new()
+ bc.add_child(sby)
+
+ var slot_idx : int = add_slot(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_NONE, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_NONE, getter, setter, bc)
+ sbx.rounded = false
+ sby.rounded = false
+ sbx.step = step
+ sby.step = step
+ sbx.min_value = prange.x
+ sbx.max_value = prange.y
+ sby.min_value = prange.x
+ sby.max_value = prange.y
+
+ var val : Vector2 = _node.call(getter)
+
+ sbx.value = val.x
+ sby.value = val.y
+
+ sbx.connect("value_changed", self, "on_vector2_spinbox_value_changed", [ slot_idx, sbx, sby ])
+ sby.connect("value_changed", self, "on_vector2_spinbox_value_changed", [ slot_idx, sbx, sby ])
+
+ return slot_idx
+
+func add_slot_vector3(getter : String, setter : String, slot_name : String, step : float = 0.1, prange : Vector2 = Vector2(-1000, 1000)) -> int:
+ var bc : VBoxContainer = VBoxContainer.new()
+
+ var l : Label = Label.new()
+ l.text = slot_name
+ bc.add_child(l)
+
+ var sbx : SpinBox = SpinBox.new()
+ bc.add_child(sbx)
+
+ var sby : SpinBox = SpinBox.new()
+ bc.add_child(sby)
+
+ var sbz : SpinBox = SpinBox.new()
+ bc.add_child(sbz)
+
+ var slot_idx : int = add_slot(MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_NONE, MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_NONE, getter, setter, bc)
+ sbx.rounded = false
+ sby.rounded = false
+ sbz.rounded = false
+ sbx.step = step
+ sby.step = step
+ sbz.step = step
+ sbx.min_value = prange.x
+ sbx.max_value = prange.y
+ sby.min_value = prange.x
+ sby.max_value = prange.y
+ sbz.min_value = prange.x
+ sbz.max_value = prange.y
+
+ var val : Vector3 = _node.call(getter)
+
+ sbx.value = val.x
+ sby.value = val.y
+ sbz.value = val.z
+
+ sbx.connect("value_changed", self, "on_vector3_spinbox_value_changed", [ slot_idx, sbx, sby, sbz ])
+ sby.connect("value_changed", self, "on_vector3_spinbox_value_changed", [ slot_idx, sbx, sby, sbz ])
+ sbz.connect("value_changed", self, "on_vector3_spinbox_value_changed", [ slot_idx, sbx, sby, sbz ])
+
+ return slot_idx
+
+func add_slot_vector2_universal(property : MMNodeUniversalProperty) -> int:
+ var bc : VBoxContainer = VBoxContainer.new()
+
+ var l : Label = Label.new()
+ l.text = property.slot_name
+ bc.add_child(l)
+
+ var sbx : SpinBox = SpinBox.new()
+ bc.add_child(sbx)
+
+ var sby : SpinBox = SpinBox.new()
+ bc.add_child(sby)
+
+ var slot_idx : int = add_slot(property.input_slot_type, property.output_slot_type, "", "", bc)
+ sbx.rounded = false
+ sby.rounded = false
+ sbx.step = property.value_step
+ sby.step = property.value_step
+ sbx.min_value = property.value_range.x
+ sbx.max_value = property.value_range.y
+ sby.min_value = property.value_range.x
+ sby.max_value = property.value_range.y
+
+ var val : Vector2 = property.get_default_value()
+
+ sbx.value = val.x
+ sby.value = val.y
+
+ properties[slot_idx].append(property)
+
+ sbx.connect("value_changed", self, "on_vector2_universal_spinbox_value_changed", [ slot_idx, sbx, sby ])
+ sby.connect("value_changed", self, "on_vector2_universal_spinbox_value_changed", [ slot_idx, sbx, sby ])
+
+ return slot_idx
+
+func add_slot(input_type : int, output_type : int, getter : String, setter : String, control : Control) -> int:
+ add_child(control)
+ var slot_idx : int = get_child_count() - 1
+
+ var arr : Array = Array()
+
+ arr.append(slot_idx)
+ arr.append(input_type)
+ arr.append(output_type)
+ arr.append(getter)
+ arr.append(setter)
+ arr.append(control)
+
+ properties.append(arr)
+
+ set_slot_enabled_left(slot_idx, input_type != -1)
+ set_slot_enabled_right(slot_idx, output_type != -1)
+
+ if input_type != -1:
+ set_slot_type_left(slot_idx, input_type)
+
+ if output_type != -1:
+ set_slot_type_left(slot_idx, output_type)
+
+ if input_type != -1 && slot_colors.size() > input_type:
+ set_slot_color_left(slot_idx, slot_colors[input_type])
+
+ if output_type != -1 && slot_colors.size() > output_type:
+ set_slot_color_right(slot_idx, slot_colors[output_type])
+
+ return slot_idx
+
+func connect_slot(slot_idx : int, to_node : Node, to_slot_idx : int) -> bool:
+ var from_property_index : int = -1
+ var to_property_index : int = -1
+
+ for i in range(properties.size()):
+ if properties[i][2] != -1:
+ from_property_index += 1
+
+ if from_property_index == slot_idx:
+ from_property_index = i
+ break
+
+ for i in range(to_node.properties.size()):
+ if to_node.properties[i][1] != -1:
+ to_property_index += 1
+
+ if to_property_index == to_slot_idx:
+ to_property_index = i
+ break
+
+ #to_node.properties[to_property_index][6].set_input_property(properties[from_property_index][6])
+
+ _undo_redo.create_action("MMGD: connect_slot")
+ _undo_redo.add_do_method(to_node.properties[to_property_index][6], "set_input_property", properties[from_property_index][6])
+ _undo_redo.add_undo_method(to_node.properties[to_property_index][6], "set_input_property", to_node.properties[to_property_index][6].input_property)
+ _undo_redo.commit_action()
+
+ return true
+
+func disconnect_slot(slot_idx : int, to_node : Node, to_slot_idx : int) -> bool:
+ var from_property_index : int = -1
+ var to_property_index : int = -1
+
+ for i in range(properties.size()):
+ if properties[i][2] != -1:
+ from_property_index += 1
+
+ if from_property_index == slot_idx:
+ from_property_index = i
+ break
+
+ for i in range(to_node.properties.size()):
+ if to_node.properties[i][1] != -1:
+ to_property_index += 1
+
+ if to_property_index == to_slot_idx:
+ to_property_index = i
+ break
+
+ #to_node.properties[to_property_index][6].set_input_property(null)
+
+ _undo_redo.create_action("MMGD: disconnect_slot")
+ _undo_redo.add_do_method(to_node.properties[to_property_index][6], "unset_input_property")
+ _undo_redo.add_undo_method(to_node.properties[to_property_index][6], "set_input_property", to_node.properties[to_property_index][6].input_property)
+ _undo_redo.commit_action()
+
+ return true
+
+func get_input_property_graph_node_slot_index(property) -> int:
+ var property_index : int = -1
+
+ for i in range(properties.size()):
+ if properties[i][1] != -1:
+ property_index += 1
+
+ if properties[i][6] == property:
+ break
+
+ return property_index
+
+func get_output_property_graph_node_slot_index(property) -> int:
+ var property_index : int = -1
+
+ for i in range(properties.size()):
+ if properties[i][2] != -1:
+ property_index += 1
+
+ if properties[i][6] == property:
+ break
+
+ return property_index
+
+func get_property_control(slot_idx : int) -> Node:
+ return properties[slot_idx][5]
+
+func set_node(material : MMMateial, node : MMNode) -> void:
+ _node = node
+ _material = material
+
+ if !_node:
+ return
+
+ title = _node.get_class()
+
+ if _node.get_script():
+ title = _node.get_script().resource_path.get_file().get_basename()
+
+ _node.register_methods(self)
+
+ offset = _node.get_graph_position()
+
+ #_node.connect("changed", self, "on_node_changed")
+
+func propagate_node_change() -> void:
+ pass
+
+func on_dragged(from : Vector2, to : Vector2):
+ if _node:
+ ignore_changes(true)
+ #_node.set_graph_position(offset)
+
+ _undo_redo.create_action("MMGD: value changed")
+ _undo_redo.add_do_method(_node, "set_graph_position", to)
+ _undo_redo.add_undo_method(_node, "set_graph_position", from)
+ _undo_redo.commit_action()
+
+ ignore_changes(false)
+
+#func on_node_changed():
+# if _ignore_change_event:
+# return
+#
+# _ignore_change_event = true
+# propagate_node_change()
+# _ignore_change_event = false
+
+func on_int_spinbox_value_changed(val : float, slot_idx) -> void:
+ #_node.call(properties[slot_idx][4], int(val))
+
+ ignore_changes(true)
+ _undo_redo.create_action("MMGD: value changed")
+ _undo_redo.add_do_method(_node, properties[slot_idx][4], int(val))
+ _undo_redo.add_undo_method(_node, properties[slot_idx][4], _node.call(properties[slot_idx][3]))
+ _undo_redo.commit_action()
+ ignore_changes(false)
+
+func on_float_spinbox_value_changed(val : float, slot_idx) -> void:
+ #_node.call(properties[slot_idx][4], val)
+
+ ignore_changes(true)
+ _undo_redo.create_action("MMGD: value changed")
+ _undo_redo.add_do_method(_node, properties[slot_idx][4], val)
+ _undo_redo.add_undo_method(_node, properties[slot_idx][4], _node.call(properties[slot_idx][3]))
+ _undo_redo.commit_action()
+ ignore_changes(false)
+
+func on_vector2_spinbox_value_changed(val : float, slot_idx, spinbox_x, spinbox_y) -> void:
+ var vv : Vector2 = Vector2(spinbox_x.value, spinbox_y.value)
+
+ #_node.call(properties[slot_idx][4], vv)
+
+ ignore_changes(true)
+ _undo_redo.create_action("MMGD: value changed")
+ _undo_redo.add_do_method(_node, properties[slot_idx][4], vv)
+ _undo_redo.add_undo_method(_node, properties[slot_idx][4], _node.call(properties[slot_idx][3]))
+ _undo_redo.commit_action()
+ ignore_changes(false)
+
+func on_vector3_spinbox_value_changed(val : float, slot_idx, spinbox_x, spinbox_y, spinbox_z) -> void:
+ var vv : Vector3 = Vector3(spinbox_x.value, spinbox_y.value, spinbox_z.value)
+
+ #_node.call(properties[slot_idx][4], vv)
+
+ ignore_changes(true)
+ _undo_redo.create_action("MMGD: value changed")
+ _undo_redo.add_do_method(_node, properties[slot_idx][4], vv)
+ _undo_redo.add_undo_method(_node, properties[slot_idx][4], _node.call(properties[slot_idx][3]))
+ _undo_redo.commit_action()
+ ignore_changes(false)
+
+func on_int_universal_spinbox_value_changed(val : float, slot_idx) -> void:
+ #properties[slot_idx][6].set_default_value(int(val))
+
+ ignore_changes(true)
+ _undo_redo.create_action("MMGD: value changed")
+ _undo_redo.add_do_method(properties[slot_idx][6], "set_default_value", int(val))
+ _undo_redo.add_undo_method(properties[slot_idx][6], "set_default_value", properties[slot_idx][6].get_default_value())
+ _undo_redo.commit_action()
+ ignore_changes(false)
+
+func on_float_universal_spinbox_value_changed(val : float, slot_idx) -> void:
+ #properties[slot_idx][6].set_default_value(val)
+
+ ignore_changes(true)
+ _undo_redo.create_action("MMGD: value changed")
+ _undo_redo.add_do_method(properties[slot_idx][6], "set_default_value", val)
+ _undo_redo.add_undo_method(properties[slot_idx][6], "set_default_value", properties[slot_idx][6].get_default_value())
+ _undo_redo.commit_action()
+ ignore_changes(false)
+
+func on_vector2_universal_spinbox_value_changed(val : float, slot_idx, spinbox_x, spinbox_y) -> void:
+ var vv : Vector2 = Vector2(spinbox_x.value, spinbox_y.value)
+
+ #properties[slot_idx][6].set_default_value(vv)
+
+ ignore_changes(true)
+ _undo_redo.create_action("MMGD: value changed")
+ _undo_redo.add_do_method(properties[slot_idx][6], "set_default_value", vv)
+ _undo_redo.add_undo_method(properties[slot_idx][6], "set_default_value", properties[slot_idx][6].get_default_value())
+ _undo_redo.commit_action()
+ ignore_changes(false)
+
+func on_slot_enum_item_selected(val : int, slot_idx : int) -> void:
+ #_node.call(properties[slot_idx][4], val)
+
+ ignore_changes(true)
+ _undo_redo.create_action("MMGD: value changed")
+ _undo_redo.add_do_method(_node, properties[slot_idx][4], val)
+ _undo_redo.add_undo_method(_node, properties[slot_idx][4], _node.call(properties[slot_idx][3]))
+ _undo_redo.commit_action()
+ ignore_changes(false)
+
+func on_universal_texture_changed(slot_idx : int) -> void:
+ ignore_changes(true)
+
+ var img : Image = properties[slot_idx][6].get_active_image()
+
+ var tex : ImageTexture = properties[slot_idx][5].texture
+
+ if img:
+ properties[slot_idx][5].texture.create_from_image(img, 0)
+ else:
+ properties[slot_idx][5].texture = ImageTexture.new()
+
+ ignore_changes(false)
+
+func on_universal_texture_changed_image_picker(slot_idx : int) -> void:
+ ignore_changes(true)
+
+ var img : Image = properties[slot_idx][6].get_active_image()
+
+ var tex : ImageTexture = properties[slot_idx][5].texture_normal
+
+ if img:
+ properties[slot_idx][5].texture_normal.create_from_image(img, 0)
+ else:
+ properties[slot_idx][5].texture_normal = ImageTexture.new()
+
+ ignore_changes(false)
+
+func on_slot_line_edit_text_entered(text : String, slot_idx : int) -> void:
+ #_node.call(properties[slot_idx][4], text)
+
+ ignore_changes(true)
+ _undo_redo.create_action("MMGD: value changed")
+ _undo_redo.add_do_method(_node, properties[slot_idx][4], text)
+ _undo_redo.add_undo_method(_node, properties[slot_idx][4], _node.call(properties[slot_idx][3]))
+ _undo_redo.commit_action()
+ ignore_changes(false)
+
+func on_universal_color_changed(c : Color, slot_idx : int) -> void:
+ #properties[slot_idx][6].set_default_value(c)
+
+ ignore_changes(true)
+ _undo_redo.create_action("MMGD: value changed")
+ _undo_redo.add_do_method(properties[slot_idx][6], "set_default_value", c)
+ _undo_redo.add_undo_method(properties[slot_idx][6], "set_default_value", properties[slot_idx][6].get_default_value())
+ _undo_redo.commit_action()
+ ignore_changes(false)
+
+func on_universal_image_path_changed(f : String, slot_idx : int) -> void:
+ _node.call(properties[slot_idx][8], f)
+
+ ignore_changes(true)
+ _undo_redo.create_action("MMGD: value changed")
+ _undo_redo.add_do_method(properties[slot_idx][6], "set_default_value", f)
+ _undo_redo.add_undo_method(properties[slot_idx][6], "set_default_value", properties[slot_idx][6].get_default_value())
+ _undo_redo.commit_action()
+ ignore_changes(false)
+
+func get_material_node() -> MMNode:
+ return _node
+
+func on_close_request() -> void:
+ var n : Node = get_parent()
+
+ while n:
+ if n.has_method("on_graph_node_close_request"):
+ n.call_deferred("on_graph_node_close_request", self)
+ return
+
+ n = n.get_parent()
diff --git a/modules/material_maker/mat_maker_gd/icons/custom.png b/modules/material_maker/mat_maker_gd/icons/custom.png
new file mode 100644
index 000000000..45a7a1815
Binary files /dev/null and b/modules/material_maker/mat_maker_gd/icons/custom.png differ
diff --git a/modules/material_maker/mat_maker_gd/icons/custom.png.import b/modules/material_maker/mat_maker_gd/icons/custom.png.import
new file mode 100644
index 000000000..59e236666
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/icons/custom.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/custom.png-b026bd10e22818d25d499d2eddb137a8.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/mat_maker_gd/icons/custom.png"
+dest_files=[ "res://.import/custom.png-b026bd10e22818d25d499d2eddb137a8.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/modules/material_maker/mat_maker_gd/icons/down.tres b/modules/material_maker/mat_maker_gd/icons/down.tres
new file mode 100644
index 000000000..aca6f4c98
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/icons/down.tres
@@ -0,0 +1,8 @@
+[gd_resource type="AtlasTexture" load_steps=2 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/icons/icons.tres" type="Texture" id=1]
+
+[resource]
+flags = 4
+atlas = ExtResource( 1 )
+region = Rect2( 32, 48, 16, 16 )
diff --git a/modules/material_maker/mat_maker_gd/icons/edit.tres b/modules/material_maker/mat_maker_gd/icons/edit.tres
new file mode 100644
index 000000000..aa39c2921
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/icons/edit.tres
@@ -0,0 +1,8 @@
+[gd_resource type="AtlasTexture" load_steps=2 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/icons/icons.tres" type="Texture" id=1]
+
+[resource]
+flags = 7
+atlas = ExtResource( 1 )
+region = Rect2( 16, 16, 16, 16 )
diff --git a/modules/material_maker/mat_maker_gd/icons/godot_logo.svg b/modules/material_maker/mat_maker_gd/icons/godot_logo.svg
new file mode 100644
index 000000000..d7aef39cc
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/icons/godot_logo.svg
@@ -0,0 +1 @@
+
diff --git a/modules/material_maker/mat_maker_gd/icons/godot_logo.svg.import b/modules/material_maker/mat_maker_gd/icons/godot_logo.svg.import
new file mode 100644
index 000000000..e96628e38
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/icons/godot_logo.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/godot_logo.svg-4e4bf625f601f4dc5d1d367a2f781011.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/mat_maker_gd/icons/godot_logo.svg"
+dest_files=[ "res://.import/godot_logo.svg-4e4bf625f601f4dc5d1d367a2f781011.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/modules/material_maker/mat_maker_gd/icons/icons.svg b/modules/material_maker/mat_maker_gd/icons/icons.svg
new file mode 100644
index 000000000..cc85b87da
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/icons/icons.svg
@@ -0,0 +1,3522 @@
+
+
+
+
diff --git a/modules/material_maker/mat_maker_gd/icons/icons.svg.import b/modules/material_maker/mat_maker_gd/icons/icons.svg.import
new file mode 100644
index 000000000..733f80495
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/icons/icons.svg.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/icons.svg-bac181e82e23c7264cdf6c36903654b9.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/mat_maker_gd/icons/icons.svg"
+dest_files=[ "res://.import/icons.svg-bac181e82e23c7264cdf6c36903654b9.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/modules/material_maker/mat_maker_gd/icons/icons.tres b/modules/material_maker/mat_maker_gd/icons/icons.tres
new file mode 100644
index 000000000..e347b32cd
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/icons/icons.tres
@@ -0,0 +1,30 @@
+[gd_resource type="ProxyTexture" load_steps=4 format=2]
+
+[sub_resource type="Image" id=2]
+data = {
+"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 0, 13, 13, 13, 0, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 102, 53, 0, 123, 110, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 1, 0, 117, 0, 1, 0, 234, 45, 3, 0, 235, 77, 3, 0, 235, 77, 3, 0, 235, 46, 0, 0, 171, 2, 1, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 39, 255, 255, 255, 50, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 6, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 71, 255, 255, 255, 191, 255, 255, 255, 254, 255, 255, 255, 235, 255, 255, 255, 128, 191, 191, 191, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 5, 255, 4, 4, 107, 191, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 2, 2, 0, 255, 5, 5, 101, 191, 3, 3, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 191, 6, 44, 24, 255, 9, 128, 24, 255, 9, 128, 17, 191, 5, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 0, 16, 16, 16, 78, 26, 26, 26, 179, 27, 27, 27, 204, 27, 27, 27, 204, 27, 27, 27, 204, 27, 27, 27, 204, 27, 27, 27, 204, 27, 27, 27, 204, 27, 27, 27, 204, 27, 27, 27, 204, 27, 27, 27, 204, 27, 27, 27, 204, 25, 25, 25, 163, 19, 19, 19, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 16, 14, 23, 23, 23, 158, 27, 27, 27, 221, 24, 24, 24, 163, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 79, 255, 255, 255, 151, 255, 255, 255, 156, 255, 255, 255, 103, 255, 255, 255, 20, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 54, 29, 0, 242, 214, 113, 59, 241, 213, 111, 143, 247, 221, 116, 164, 247, 221, 116, 113, 244, 216, 114, 31, 122, 109, 58, 0, 55, 55, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 8, 2, 0, 234, 117, 6, 4, 236, 229, 10, 10, 237, 255, 12, 14, 237, 255, 13, 15, 237, 255, 11, 12, 237, 255, 8, 7, 236, 231, 4, 2, 234, 127, 0, 0, 173, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 9, 255, 255, 255, 255, 255, 255, 255, 233, 191, 191, 191, 27, 0, 0, 0, 0, 191, 191, 191, 18, 255, 255, 255, 207, 255, 255, 255, 179, 191, 191, 191, 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, 64, 64, 64, 0, 191, 191, 191, 24, 255, 255, 255, 168, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 241, 255, 255, 255, 253, 255, 255, 255, 255, 255, 255, 255, 148, 128, 128, 128, 0, 0, 0, 0, 0, 191, 0, 0, 6, 255, 6, 6, 175, 255, 9, 9, 255, 255, 6, 6, 163, 191, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 2, 2, 0, 255, 8, 8, 135, 255, 9, 9, 255, 255, 7, 7, 197, 191, 4, 4, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 255, 9, 86, 24, 255, 9, 255, 24, 255, 9, 255, 22, 255, 7, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 20, 56, 67, 67, 67, 252, 207, 207, 207, 255, 232, 232, 232, 255, 232, 232, 232, 255, 232, 232, 232, 255, 232, 232, 232, 255, 232, 232, 232, 255, 232, 232, 232, 255, 232, 232, 232, 255, 232, 232, 232, 255, 244, 244, 244, 255, 247, 247, 247, 255, 166, 166, 166, 255, 26, 26, 26, 191, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 8, 26, 26, 26, 193, 147, 147, 147, 255, 239, 239, 239, 255, 155, 155, 155, 255, 27, 27, 27, 203, 17, 17, 17, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 7, 255, 255, 255, 105, 255, 255, 255, 162, 255, 255, 255, 176, 255, 255, 255, 153, 255, 255, 255, 132, 255, 255, 255, 114, 255, 255, 255, 95, 255, 255, 255, 77, 255, 255, 255, 51, 255, 255, 255, 22, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 191, 191, 191, 6, 255, 255, 255, 75, 255, 255, 255, 95, 255, 255, 255, 38, 128, 128, 128, 0, 191, 191, 191, 2, 255, 255, 255, 167, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 250, 255, 255, 255, 178, 255, 255, 255, 87, 191, 191, 191, 8, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 147, 74, 2, 246, 220, 115, 63, 247, 220, 116, 99, 247, 219, 116, 50, 120, 106, 56, 0, 120, 106, 55, 0, 247, 220, 116, 129, 248, 221, 117, 255, 249, 230, 155, 255, 251, 237, 184, 255, 249, 232, 168, 255, 243, 217, 117, 254, 244, 217, 115, 192, 235, 219, 113, 100, 185, 164, 86, 16, 122, 110, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 176, 29, 4, 13, 223, 206, 9, 43, 204, 255, 19, 27, 234, 255, 24, 33, 239, 255, 27, 38, 240, 255, 28, 39, 240, 255, 26, 36, 240, 255, 22, 30, 239, 255, 16, 20, 238, 255, 8, 8, 236, 216, 1, 0, 117, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 233, 255, 255, 255, 255, 255, 255, 255, 197, 255, 255, 255, 22, 255, 255, 255, 206, 255, 255, 255, 255, 255, 255, 255, 205, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 2, 255, 255, 255, 103, 255, 255, 255, 239, 255, 255, 255, 255, 255, 255, 255, 240, 255, 255, 255, 106, 191, 191, 191, 5, 255, 255, 255, 46, 255, 255, 255, 244, 255, 255, 255, 250, 255, 255, 255, 23, 128, 2, 2, 0, 255, 6, 6, 142, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 6, 6, 165, 191, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 64, 2, 2, 0, 255, 8, 8, 138, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 8, 8, 172, 128, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 255, 9, 85, 24, 255, 9, 255, 24, 255, 9, 255, 22, 255, 7, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 123, 158, 158, 158, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 45, 45, 45, 248, 0, 0, 0, 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, 16, 16, 16, 3, 26, 26, 26, 173, 139, 139, 139, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 155, 155, 155, 255, 26, 26, 26, 193, 15, 15, 15, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 0, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 191, 191, 191, 9, 255, 255, 255, 46, 255, 255, 255, 51, 255, 255, 255, 51, 255, 255, 255, 51, 255, 255, 255, 46, 255, 255, 255, 26, 255, 255, 255, 26, 255, 255, 255, 24, 128, 128, 128, 0, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 15, 255, 255, 255, 202, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 196, 255, 255, 255, 38, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 68, 255, 255, 255, 237, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 205, 255, 255, 255, 137, 255, 255, 255, 170, 255, 255, 255, 235, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 241, 255, 255, 255, 158, 255, 255, 255, 65, 191, 191, 191, 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, 47, 47, 23, 0, 138, 132, 67, 43, 248, 221, 116, 223, 248, 222, 122, 255, 245, 220, 126, 255, 237, 211, 112, 255, 231, 205, 108, 219, 230, 203, 106, 136, 237, 211, 110, 169, 238, 212, 111, 224, 226, 202, 106, 255, 218, 195, 105, 255, 223, 208, 149, 255, 235, 227, 194, 255, 242, 232, 195, 255, 234, 217, 150, 255, 232, 206, 108, 248, 241, 215, 113, 171, 246, 219, 115, 80, 181, 160, 85, 5, 55, 55, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 15, 5, 2, 236, 213, 6, 125, 118, 255, 0, 209, 28, 255, 12, 145, 110, 255, 38, 56, 241, 255, 42, 62, 242, 255, 43, 63, 243, 255, 39, 64, 235, 255, 22, 105, 164, 255, 29, 41, 240, 255, 20, 27, 238, 255, 10, 10, 237, 225, 2, 0, 175, 20, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 128, 128, 128, 0, 128, 128, 128, 0, 191, 191, 191, 0, 255, 255, 255, 201, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 241, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 138, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 21, 255, 255, 255, 193, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 171, 191, 191, 191, 25, 64, 64, 64, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 199, 255, 255, 255, 255, 255, 255, 255, 51, 0, 0, 0, 0, 191, 5, 5, 21, 255, 8, 8, 209, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 6, 6, 167, 191, 0, 0, 4, 191, 0, 0, 0, 255, 8, 8, 140, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 226, 191, 5, 5, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 255, 7, 84, 24, 255, 9, 255, 24, 255, 9, 255, 23, 255, 7, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 22, 22, 70, 81, 81, 81, 254, 235, 235, 235, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 241, 241, 241, 255, 232, 232, 232, 255, 161, 161, 161, 255, 26, 26, 26, 189, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 0, 20, 20, 20, 151, 117, 117, 117, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 143, 143, 143, 255, 24, 24, 24, 181, 16, 16, 16, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 3, 3, 0, 11, 11, 11, 37, 23, 23, 23, 154, 26, 26, 26, 172, 16, 16, 16, 64, 6, 6, 6, 0, 0, 0, 0, 0, 191, 191, 191, 0, 255, 255, 255, 113, 255, 255, 255, 245, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 242, 255, 255, 255, 149, 191, 191, 191, 20, 128, 128, 128, 0, 255, 255, 255, 146, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 239, 255, 255, 255, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 50, 255, 255, 255, 248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 255, 255, 255, 189, 255, 255, 255, 151, 255, 255, 255, 79, 255, 255, 255, 145, 255, 255, 255, 234, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 204, 191, 191, 191, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 195, 101, 22, 248, 221, 117, 236, 251, 239, 193, 255, 245, 237, 206, 255, 235, 223, 176, 255, 238, 230, 201, 255, 235, 224, 186, 255, 213, 196, 130, 255, 199, 177, 92, 255, 202, 180, 93, 199, 205, 182, 94, 162, 192, 176, 90, 80, 183, 164, 83, 132, 177, 157, 80, 222, 181, 162, 88, 255, 210, 198, 152, 255, 234, 227, 201, 255, 238, 227, 185, 255, 236, 216, 137, 255, 244, 218, 115, 222, 235, 216, 111, 58, 30, 26, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 20, 15, 0, 153, 19, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, 3, 1, 224, 145, 13, 15, 237, 255, 20, 58, 207, 255, 0, 207, 30, 255, 0, 209, 28, 255, 28, 137, 146, 255, 56, 87, 245, 255, 48, 105, 212, 255, 10, 184, 68, 255, 0, 208, 29, 255, 32, 85, 203, 255, 31, 44, 240, 255, 20, 26, 238, 255, 7, 6, 233, 162, 1, 0, 114, 0, 0, 0, 0, 0, 255, 255, 255, 41, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 154, 255, 255, 255, 224, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 94, 191, 191, 191, 3, 128, 128, 128, 0, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 190, 255, 255, 255, 255, 255, 255, 255, 223, 255, 255, 255, 90, 255, 255, 255, 74, 255, 255, 255, 67, 191, 191, 191, 10, 128, 128, 128, 0, 255, 255, 255, 93, 255, 255, 255, 252, 255, 255, 255, 244, 191, 191, 191, 16, 0, 0, 0, 0, 0, 0, 0, 0, 191, 5, 5, 20, 255, 8, 8, 207, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 6, 6, 169, 255, 6, 6, 144, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 224, 191, 5, 5, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 255, 7, 83, 24, 255, 9, 255, 24, 255, 9, 255, 23, 255, 7, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 0, 26, 26, 26, 106, 26, 26, 26, 208, 27, 27, 27, 230, 27, 27, 27, 230, 27, 27, 27, 230, 27, 27, 27, 230, 27, 27, 27, 230, 27, 27, 27, 219, 27, 27, 27, 204, 27, 27, 27, 204, 27, 27, 27, 204, 27, 27, 27, 204, 26, 26, 26, 157, 19, 19, 19, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 0, 26, 26, 26, 126, 98, 98, 98, 255, 244, 244, 244, 255, 246, 246, 246, 255, 246, 246, 246, 255, 230, 230, 230, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 131, 131, 131, 255, 24, 24, 24, 170, 14, 14, 14, 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, 6, 6, 6, 0, 23, 23, 23, 74, 46, 46, 46, 240, 169, 169, 169, 255, 190, 190, 190, 255, 56, 56, 56, 252, 26, 26, 26, 36, 64, 64, 64, 0, 255, 255, 255, 121, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 216, 255, 255, 255, 24, 255, 255, 255, 57, 255, 255, 255, 82, 255, 255, 255, 102, 255, 255, 255, 74, 255, 255, 255, 35, 255, 255, 255, 54, 255, 255, 255, 77, 255, 255, 255, 98, 255, 255, 255, 116, 255, 255, 255, 135, 255, 255, 255, 153, 255, 255, 255, 201, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 207, 191, 191, 191, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 171, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 177, 255, 255, 255, 137, 255, 255, 255, 211, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 244, 255, 255, 255, 137, 255, 255, 255, 17, 255, 255, 255, 74, 255, 255, 255, 166, 255, 255, 255, 245, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 215, 191, 191, 191, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 55, 29, 0, 247, 220, 116, 130, 250, 235, 173, 255, 236, 220, 159, 255, 212, 188, 98, 197, 196, 172, 91, 133, 183, 162, 83, 195, 179, 162, 92, 255, 204, 193, 153, 255, 229, 224, 203, 255, 218, 208, 169, 255, 196, 178, 109, 255, 200, 178, 92, 250, 213, 191, 98, 159, 131, 117, 60, 25, 149, 131, 67, 61, 149, 132, 66, 152, 164, 146, 74, 237, 187, 169, 99, 255, 223, 211, 167, 255, 244, 235, 199, 255, 242, 218, 121, 237, 122, 110, 57, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 207, 27, 43, 0, 207, 27, 183, 0, 153, 19, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 15, 7, 6, 236, 248, 20, 27, 238, 255, 8, 163, 85, 255, 0, 209, 28, 255, 7, 196, 51, 255, 57, 115, 218, 255, 71, 110, 247, 255, 42, 153, 155, 255, 0, 209, 28, 255, 0, 209, 28, 255, 6, 189, 58, 255, 16, 143, 119, 255, 16, 101, 160, 255, 12, 43, 207, 252, 3, 1, 232, 30, 64, 64, 64, 0, 255, 255, 255, 101, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 236, 255, 255, 255, 89, 255, 255, 255, 76, 255, 255, 255, 219, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 234, 255, 255, 255, 128, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 30, 255, 255, 255, 255, 255, 255, 255, 220, 255, 255, 255, 146, 255, 255, 255, 243, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 168, 255, 255, 255, 181, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 113, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 5, 5, 19, 255, 8, 8, 206, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 8, 8, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 223, 191, 5, 5, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 12, 255, 4, 40, 23, 255, 8, 77, 23, 255, 8, 77, 23, 255, 8, 77, 23, 255, 8, 77, 23, 255, 8, 134, 24, 255, 9, 255, 24, 255, 9, 255, 23, 255, 8, 127, 23, 255, 8, 77, 23, 255, 7, 66, 22, 255, 7, 51, 22, 255, 7, 51, 11, 255, 4, 26, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 0, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 26, 26, 26, 0, 13, 13, 13, 0, 14, 14, 14, 0, 14, 14, 14, 0, 14, 14, 14, 0, 14, 14, 14, 0, 14, 14, 14, 0, 14, 14, 14, 0, 14, 14, 14, 0, 13, 13, 13, 0, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 0, 25, 25, 25, 102, 81, 81, 81, 254, 240, 240, 240, 255, 246, 246, 246, 255, 246, 246, 246, 255, 175, 175, 175, 255, 28, 28, 28, 250, 153, 153, 153, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 118, 118, 118, 255, 20, 20, 20, 157, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 0, 26, 26, 26, 116, 67, 67, 67, 252, 220, 220, 220, 255, 246, 246, 246, 255, 246, 246, 246, 255, 138, 138, 138, 254, 26, 26, 26, 103, 191, 191, 191, 17, 255, 255, 255, 241, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 184, 255, 255, 255, 153, 255, 255, 255, 153, 255, 255, 255, 163, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 234, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 173, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 128, 128, 128, 0, 128, 128, 128, 0, 255, 255, 255, 127, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 1, 255, 255, 255, 249, 255, 255, 255, 255, 255, 255, 255, 174, 191, 191, 191, 0, 64, 64, 64, 0, 128, 128, 128, 0, 255, 255, 255, 57, 255, 255, 255, 156, 255, 255, 255, 228, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 193, 191, 191, 191, 8, 128, 128, 128, 0, 191, 191, 191, 13, 255, 255, 255, 94, 255, 255, 255, 207, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 129, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123, 110, 58, 0, 247, 220, 116, 209, 247, 238, 205, 255, 213, 190, 99, 210, 148, 135, 68, 4, 46, 39, 21, 0, 85, 74, 38, 0, 170, 157, 81, 35, 171, 151, 77, 149, 140, 125, 62, 216, 163, 149, 94, 255, 206, 198, 164, 255, 232, 226, 203, 255, 215, 199, 137, 255, 217, 193, 101, 219, 172, 151, 78, 22, 70, 61, 30, 0, 105, 96, 48, 6, 158, 141, 70, 81, 174, 156, 80, 187, 203, 184, 108, 255, 243, 233, 195, 255, 242, 216, 113, 169, 122, 109, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 14, 0, 0, 104, 14, 0, 0, 104, 14, 0, 0, 104, 14, 0, 0, 104, 14, 0, 0, 104, 14, 0, 0, 104, 14, 0, 0, 104, 14, 0, 0, 104, 14, 0, 0, 104, 14, 0, 0, 207, 27, 43, 0, 209, 28, 255, 0, 206, 27, 182, 0, 150, 20, 7, 0, 0, 0, 0, 3, 0, 235, 84, 12, 13, 237, 255, 19, 71, 194, 255, 0, 209, 28, 255, 5, 199, 46, 255, 56, 119, 212, 255, 77, 120, 248, 255, 85, 133, 250, 255, 77, 145, 224, 255, 0, 209, 28, 255, 0, 209, 28, 255, 0, 209, 28, 255, 0, 209, 28, 255, 0, 209, 28, 255, 8, 114, 135, 255, 7, 7, 234, 102, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 81, 255, 255, 255, 223, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 123, 64, 64, 64, 0, 0, 0, 0, 0, 255, 255, 255, 85, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 148, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 38, 255, 255, 255, 185, 255, 255, 255, 216, 255, 255, 255, 255, 255, 255, 255, 254, 255, 255, 255, 188, 255, 255, 255, 181, 255, 255, 255, 245, 255, 255, 255, 255, 255, 255, 255, 234, 255, 255, 255, 89, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 5, 5, 18, 255, 8, 8, 204, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 8, 8, 255, 255, 9, 9, 221, 191, 6, 6, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 12, 255, 5, 133, 24, 255, 9, 255, 24, 255, 9, 255, 24, 255, 9, 255, 24, 255, 9, 255, 24, 255, 9, 255, 24, 255, 9, 255, 24, 255, 9, 255, 24, 255, 9, 255, 24, 255, 9, 255, 24, 255, 9, 255, 24, 255, 9, 255, 24, 255, 9, 255, 12, 255, 5, 132, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 42, 27, 27, 27, 197, 45, 45, 45, 251, 50, 50, 50, 255, 50, 50, 50, 255, 50, 50, 50, 255, 50, 50, 50, 255, 50, 50, 50, 255, 50, 50, 50, 255, 63, 63, 63, 255, 31, 31, 31, 225, 25, 25, 25, 75, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 24, 24, 24, 80, 66, 66, 66, 252, 233, 233, 233, 255, 246, 246, 246, 255, 246, 246, 246, 255, 192, 192, 192, 255, 33, 33, 33, 221, 25, 25, 25, 37, 27, 27, 27, 200, 164, 164, 164, 255, 246, 246, 246, 255, 246, 246, 246, 255, 244, 244, 244, 255, 106, 106, 106, 255, 20, 20, 20, 143, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 8, 26, 26, 26, 161, 98, 98, 98, 255, 237, 237, 237, 255, 246, 246, 246, 255, 246, 246, 246, 255, 237, 237, 237, 255, 69, 69, 69, 253, 25, 25, 25, 54, 255, 255, 255, 59, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 129, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 191, 191, 191, 4, 255, 255, 255, 26, 255, 255, 255, 26, 255, 255, 255, 26, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 9, 255, 255, 255, 251, 255, 255, 255, 255, 255, 255, 255, 123, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 14, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 12, 255, 255, 255, 245, 255, 255, 255, 174, 255, 255, 255, 146, 255, 255, 255, 160, 255, 255, 255, 243, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 116, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 6, 255, 255, 255, 211, 255, 255, 255, 255, 255, 255, 255, 205, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 110, 58, 0, 244, 218, 115, 229, 237, 224, 178, 255, 198, 178, 93, 145, 95, 86, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 108, 56, 0, 242, 215, 114, 220, 219, 194, 101, 188, 162, 143, 73, 147, 147, 130, 62, 149, 162, 145, 74, 235, 216, 205, 165, 255, 215, 195, 121, 255, 228, 200, 103, 157, 104, 91, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 113, 55, 0, 182, 161, 81, 177, 226, 214, 167, 255, 234, 211, 120, 241, 180, 159, 85, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 14, 0, 0, 208, 27, 214, 0, 209, 28, 230, 0, 209, 28, 230, 0, 209, 28, 230, 0, 209, 28, 230, 0, 209, 28, 230, 0, 209, 28, 230, 0, 209, 28, 230, 0, 209, 28, 230, 0, 209, 28, 230, 0, 209, 28, 234, 0, 209, 28, 255, 0, 209, 28, 255, 0, 206, 27, 181, 0, 133, 34, 7, 2, 0, 219, 121, 15, 18, 238, 255, 27, 53, 224, 255, 0, 208, 29, 255, 39, 131, 170, 255, 72, 111, 247, 255, 85, 134, 250, 255, 97, 153, 252, 255, 101, 160, 253, 255, 67, 164, 190, 255, 56, 150, 182, 255, 37, 150, 149, 255, 2, 205, 36, 255, 0, 209, 28, 255, 19, 58, 205, 255, 6, 7, 233, 136, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 13, 255, 255, 255, 227, 255, 255, 255, 255, 255, 255, 255, 150, 191, 191, 191, 0, 128, 128, 128, 0, 255, 255, 255, 112, 255, 255, 255, 255, 255, 255, 255, 249, 255, 255, 255, 161, 255, 255, 255, 50, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 16, 255, 255, 255, 151, 255, 255, 255, 253, 255, 255, 255, 255, 255, 255, 255, 214, 255, 255, 255, 156, 255, 255, 255, 209, 255, 255, 255, 255, 255, 255, 255, 254, 255, 255, 255, 184, 255, 255, 255, 70, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 1, 255, 6, 6, 156, 255, 8, 8, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 6, 6, 180, 191, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 12, 255, 5, 131, 24, 255, 9, 255, 24, 255, 9, 255, 24, 255, 9, 255, 24, 255, 9, 255, 24, 255, 9, 255, 24, 255, 9, 255, 24, 255, 9, 255, 24, 255, 9, 255, 24, 255, 9, 255, 24, 255, 9, 255, 24, 255, 9, 255, 24, 255, 9, 255, 12, 255, 5, 133, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 0, 29, 29, 29, 213, 200, 200, 200, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 230, 230, 230, 255, 44, 44, 44, 244, 19, 19, 19, 8, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 22, 22, 22, 61, 55, 55, 55, 247, 224, 224, 224, 255, 246, 246, 246, 255, 246, 246, 246, 255, 207, 207, 207, 255, 40, 40, 40, 234, 13, 13, 13, 37, 0, 0, 0, 0, 19, 19, 19, 18, 28, 28, 28, 209, 174, 174, 174, 255, 246, 246, 246, 255, 246, 246, 246, 255, 243, 243, 243, 255, 95, 95, 95, 255, 26, 26, 26, 128, 6, 6, 6, 0, 0, 0, 0, 0, 19, 19, 19, 25, 27, 27, 27, 199, 137, 137, 137, 255, 245, 245, 245, 255, 246, 246, 246, 255, 246, 246, 246, 255, 220, 220, 220, 255, 67, 67, 67, 252, 25, 25, 25, 110, 6, 6, 6, 0, 255, 255, 255, 80, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 38, 255, 255, 255, 36, 255, 255, 255, 17, 128, 128, 128, 0, 128, 128, 128, 0, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 13, 255, 255, 255, 253, 255, 255, 255, 255, 255, 255, 255, 139, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 7, 255, 255, 255, 245, 255, 255, 255, 255, 255, 255, 255, 153, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 181, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 185, 255, 255, 255, 112, 255, 255, 255, 185, 255, 255, 255, 251, 255, 255, 255, 221, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 134, 255, 255, 255, 255, 255, 255, 255, 247, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 110, 58, 0, 242, 215, 113, 212, 237, 227, 188, 255, 194, 173, 89, 193, 124, 114, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 98, 50, 0, 227, 207, 108, 141, 230, 205, 110, 255, 216, 198, 133, 255, 181, 161, 82, 206, 161, 142, 71, 110, 170, 151, 77, 172, 200, 177, 92, 247, 223, 198, 104, 250, 181, 169, 54, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 181, 160, 81, 94, 215, 199, 138, 255, 237, 221, 157, 255, 243, 214, 112, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 14, 0, 0, 209, 28, 238, 0, 209, 28, 255, 0, 209, 28, 255, 0, 209, 28, 255, 0, 209, 28, 255, 0, 209, 28, 255, 0, 209, 28, 255, 0, 209, 28, 255, 0, 209, 28, 255, 0, 209, 28, 255, 0, 209, 28, 255, 0, 209, 28, 255, 0, 209, 28, 255, 0, 209, 28, 255, 0, 206, 26, 113, 2, 17, 139, 121, 16, 19, 238, 255, 30, 43, 240, 255, 6, 185, 62, 255, 13, 185, 72, 255, 72, 115, 245, 255, 88, 138, 250, 255, 102, 161, 253, 255, 74, 184, 180, 255, 38, 186, 116, 255, 41, 168, 139, 255, 41, 144, 161, 255, 43, 103, 205, 255, 12, 158, 97, 255, 24, 32, 239, 255, 7, 7, 236, 140, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 148, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 255, 255, 255, 167, 255, 255, 255, 153, 255, 255, 255, 249, 255, 255, 255, 255, 255, 255, 255, 229, 255, 255, 255, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 31, 255, 255, 255, 218, 255, 255, 255, 255, 255, 255, 255, 246, 255, 255, 255, 172, 255, 255, 255, 209, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 215, 255, 255, 255, 164, 255, 255, 255, 243, 255, 255, 255, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 2, 255, 6, 6, 153, 255, 9, 9, 255, 255, 9, 9, 255, 255, 8, 8, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 6, 6, 178, 191, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 12, 255, 4, 39, 23, 255, 8, 77, 23, 255, 8, 77, 23, 255, 8, 77, 23, 255, 8, 77, 22, 255, 8, 127, 24, 255, 9, 255, 24, 255, 9, 255, 23, 255, 8, 133, 23, 255, 8, 92, 23, 255, 8, 102, 23, 255, 8, 102, 23, 255, 8, 102, 12, 255, 4, 54, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 6, 50, 50, 50, 251, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 78, 78, 78, 255, 25, 25, 25, 33, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 44, 45, 45, 45, 239, 213, 213, 213, 255, 246, 246, 246, 255, 246, 246, 246, 255, 219, 219, 219, 255, 49, 49, 49, 243, 13, 13, 13, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 24, 32, 32, 32, 218, 184, 184, 184, 255, 246, 246, 246, 255, 246, 246, 246, 255, 240, 240, 240, 255, 85, 85, 85, 254, 25, 25, 25, 113, 12, 12, 12, 51, 36, 36, 36, 227, 174, 174, 174, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 194, 194, 194, 255, 46, 46, 46, 240, 24, 24, 24, 75, 6, 6, 6, 0, 0, 0, 0, 0, 255, 255, 255, 36, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 115, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 112, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 236, 255, 255, 255, 161, 255, 255, 255, 139, 255, 255, 255, 120, 255, 255, 255, 102, 255, 255, 255, 77, 255, 255, 255, 58, 255, 255, 255, 39, 255, 255, 255, 38, 255, 255, 255, 166, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 183, 255, 255, 255, 255, 255, 255, 255, 252, 255, 255, 255, 121, 191, 191, 191, 18, 128, 128, 128, 0, 0, 0, 0, 0, 255, 255, 255, 45, 255, 255, 255, 243, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 235, 255, 255, 255, 168, 255, 255, 255, 167, 255, 255, 255, 5, 64, 64, 64, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 167, 255, 255, 255, 255, 255, 255, 255, 231, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 110, 56, 0, 234, 214, 111, 143, 239, 227, 183, 255, 201, 182, 109, 255, 161, 146, 58, 148, 141, 126, 51, 28, 65, 58, 27, 0, 21, 21, 0, 0, 175, 158, 84, 21, 244, 218, 115, 227, 238, 223, 163, 255, 233, 225, 195, 255, 196, 181, 124, 255, 160, 142, 72, 243, 156, 136, 69, 175, 179, 160, 81, 165, 212, 192, 98, 32, 37, 33, 17, 0, 0, 0, 0, 0, 44, 38, 20, 0, 183, 161, 82, 126, 220, 207, 153, 255, 235, 217, 146, 255, 243, 211, 110, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 14, 0, 0, 208, 27, 190, 0, 209, 27, 204, 0, 209, 27, 204, 0, 209, 27, 204, 0, 209, 27, 204, 0, 209, 27, 204, 0, 209, 27, 204, 0, 209, 27, 204, 0, 209, 27, 204, 0, 209, 27, 204, 0, 209, 27, 213, 0, 209, 28, 255, 0, 209, 28, 255, 0, 204, 26, 165, 0, 145, 16, 3, 3, 0, 235, 90, 14, 17, 238, 255, 28, 40, 240, 255, 15, 150, 110, 255, 0, 209, 28, 255, 45, 147, 167, 255, 82, 129, 249, 255, 91, 146, 248, 255, 14, 201, 60, 255, 0, 209, 28, 255, 0, 209, 28, 255, 10, 190, 63, 255, 50, 76, 244, 255, 36, 53, 241, 255, 22, 30, 239, 255, 8, 10, 236, 107, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 112, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 160, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 172, 255, 255, 255, 255, 255, 255, 255, 195, 255, 255, 255, 36, 255, 255, 255, 25, 255, 255, 255, 115, 255, 255, 255, 142, 255, 255, 255, 98, 255, 255, 255, 142, 255, 255, 255, 255, 255, 255, 255, 249, 255, 255, 255, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 2, 255, 6, 6, 155, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 8, 8, 217, 255, 8, 8, 200, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 6, 6, 180, 191, 1, 1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 255, 8, 71, 24, 255, 9, 255, 24, 255, 9, 255, 23, 255, 7, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 0, 24, 24, 24, 108, 26, 26, 26, 186, 27, 27, 27, 204, 27, 27, 27, 204, 27, 27, 27, 204, 27, 27, 27, 204, 27, 27, 27, 204, 25, 25, 25, 161, 13, 13, 13, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 0, 26, 26, 26, 179, 138, 138, 138, 255, 207, 207, 207, 255, 209, 209, 209, 255, 209, 209, 209, 255, 209, 209, 209, 255, 209, 209, 209, 255, 209, 209, 209, 255, 209, 209, 209, 255, 190, 190, 190, 255, 140, 140, 140, 255, 27, 27, 27, 199, 3, 3, 3, 0, 0, 0, 0, 0, 19, 19, 19, 30, 36, 36, 36, 228, 199, 199, 199, 255, 246, 246, 246, 255, 246, 246, 246, 255, 229, 229, 229, 255, 61, 61, 61, 250, 23, 23, 23, 70, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 31, 35, 35, 35, 226, 194, 194, 194, 255, 246, 246, 246, 255, 246, 246, 246, 255, 236, 236, 236, 255, 76, 76, 76, 253, 53, 53, 53, 248, 205, 205, 205, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 161, 161, 161, 255, 31, 31, 31, 218, 13, 13, 13, 41, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 215, 255, 255, 255, 255, 255, 255, 255, 243, 255, 255, 255, 103, 255, 255, 255, 48, 255, 255, 255, 26, 255, 255, 255, 26, 255, 255, 255, 26, 255, 255, 255, 26, 255, 255, 255, 26, 255, 255, 255, 26, 255, 255, 255, 47, 255, 255, 255, 101, 255, 255, 255, 102, 255, 255, 255, 102, 255, 255, 255, 32, 255, 255, 255, 184, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 236, 191, 191, 191, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 54, 255, 255, 255, 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 249, 255, 255, 255, 174, 255, 255, 255, 84, 255, 255, 255, 7, 255, 255, 255, 62, 255, 255, 255, 219, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 219, 255, 255, 255, 127, 255, 255, 255, 60, 255, 255, 255, 118, 255, 255, 255, 252, 255, 255, 255, 255, 255, 255, 255, 179, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 175, 159, 82, 27, 224, 201, 109, 237, 235, 228, 197, 255, 194, 178, 119, 255, 157, 139, 71, 253, 136, 121, 59, 190, 109, 100, 33, 97, 87, 77, 37, 15, 207, 184, 96, 40, 244, 218, 115, 202, 229, 206, 115, 255, 231, 218, 166, 255, 236, 230, 206, 255, 212, 203, 167, 255, 177, 162, 101, 255, 159, 141, 72, 231, 122, 108, 55, 141, 152, 135, 69, 66, 180, 158, 83, 95, 196, 174, 91, 242, 240, 232, 202, 255, 233, 208, 110, 218, 149, 146, 53, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 13, 0, 0, 104, 13, 0, 0, 104, 13, 0, 0, 104, 13, 0, 0, 104, 13, 0, 0, 104, 13, 0, 0, 104, 13, 0, 0, 104, 13, 0, 0, 104, 13, 0, 0, 104, 13, 0, 0, 207, 27, 43, 0, 209, 28, 255, 0, 204, 26, 166, 0, 143, 16, 3, 0, 0, 0, 0, 2, 0, 233, 22, 10, 10, 236, 251, 24, 33, 239, 255, 15, 138, 121, 255, 6, 193, 53, 255, 58, 102, 232, 255, 72, 112, 247, 255, 73, 129, 232, 255, 3, 205, 37, 255, 0, 209, 28, 255, 0, 209, 28, 255, 24, 152, 124, 255, 45, 67, 243, 255, 31, 45, 241, 255, 18, 23, 238, 254, 3, 3, 234, 34, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 119, 255, 255, 255, 245, 255, 255, 255, 166, 255, 255, 255, 75, 255, 255, 255, 194, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 154, 255, 255, 255, 219, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 61, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 241, 255, 255, 255, 255, 191, 191, 191, 17, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 0, 255, 255, 255, 70, 255, 255, 255, 220, 255, 255, 255, 255, 255, 255, 255, 251, 255, 255, 255, 98, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 2, 255, 6, 6, 158, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 8, 8, 216, 191, 5, 5, 25, 191, 4, 4, 14, 255, 7, 7, 197, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 8, 8, 182, 191, 6, 6, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 255, 7, 70, 24, 255, 9, 255, 24, 255, 9, 255, 23, 255, 7, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 23, 23, 23, 108, 99, 99, 99, 255, 215, 215, 215, 255, 232, 232, 232, 255, 232, 232, 232, 255, 232, 232, 232, 255, 232, 232, 232, 255, 232, 232, 232, 255, 186, 186, 186, 255, 44, 44, 44, 239, 13, 13, 13, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 12, 25, 25, 25, 128, 26, 26, 26, 177, 26, 26, 26, 179, 26, 26, 26, 179, 26, 26, 26, 179, 26, 26, 26, 179, 26, 26, 26, 153, 26, 26, 26, 153, 26, 26, 26, 153, 26, 26, 26, 120, 18, 18, 18, 16, 0, 0, 0, 0, 18, 18, 18, 8, 30, 30, 30, 214, 183, 183, 183, 255, 246, 246, 246, 255, 246, 246, 246, 255, 237, 237, 237, 255, 74, 74, 74, 253, 26, 26, 26, 91, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 39, 39, 39, 39, 233, 203, 203, 203, 255, 246, 246, 246, 255, 246, 246, 246, 255, 240, 240, 240, 255, 237, 237, 237, 255, 246, 246, 246, 255, 246, 246, 246, 255, 243, 243, 243, 255, 122, 122, 122, 255, 25, 25, 25, 187, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 61, 255, 255, 255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 234, 191, 191, 191, 9, 191, 191, 191, 10, 255, 255, 255, 136, 255, 255, 255, 244, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 245, 255, 255, 255, 82, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 104, 255, 255, 255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 239, 255, 255, 255, 155, 255, 255, 255, 68, 255, 255, 255, 86, 255, 255, 255, 176, 255, 255, 255, 249, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 52, 26, 0, 227, 203, 102, 72, 213, 189, 100, 243, 222, 210, 162, 255, 231, 226, 204, 255, 199, 190, 154, 255, 155, 140, 83, 255, 138, 122, 61, 247, 138, 122, 61, 168, 172, 160, 80, 78, 212, 189, 96, 74, 237, 209, 111, 162, 223, 198, 104, 243, 217, 197, 119, 255, 231, 220, 175, 255, 237, 231, 207, 255, 217, 206, 161, 255, 207, 190, 121, 255, 213, 195, 124, 255, 240, 232, 204, 255, 241, 223, 154, 255, 243, 216, 114, 103, 61, 54, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 207, 27, 43, 0, 206, 25, 167, 0, 147, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 0, 4, 3, 235, 158, 18, 22, 238, 255, 11, 135, 118, 255, 31, 97, 189, 255, 52, 78, 244, 255, 60, 92, 245, 255, 65, 101, 246, 255, 31, 157, 131, 255, 0, 209, 28, 255, 6, 193, 54, 255, 44, 79, 230, 255, 37, 54, 241, 255, 24, 34, 239, 255, 9, 12, 235, 176, 1, 1, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 2, 191, 191, 191, 13, 128, 128, 128, 0, 128, 128, 128, 0, 255, 255, 255, 138, 255, 255, 255, 255, 255, 255, 255, 245, 191, 191, 191, 11, 191, 191, 191, 4, 255, 255, 255, 95, 255, 255, 255, 156, 191, 191, 191, 6, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 228, 255, 255, 255, 255, 255, 255, 255, 50, 128, 128, 128, 0, 191, 191, 191, 22, 255, 255, 255, 165, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 202, 255, 255, 255, 48, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 2, 2, 0, 255, 6, 6, 133, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 8, 8, 214, 191, 5, 5, 24, 0, 0, 0, 0, 0, 0, 0, 0, 191, 3, 3, 13, 255, 8, 8, 195, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 8, 8, 163, 128, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 255, 7, 68, 24, 255, 9, 255, 24, 255, 9, 255, 24, 255, 9, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 0, 26, 26, 26, 179, 209, 209, 209, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 115, 115, 115, 255, 26, 26, 26, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 0, 12, 12, 12, 0, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 12, 12, 12, 0, 13, 13, 13, 0, 13, 13, 13, 0, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 93, 121, 121, 121, 255, 246, 246, 246, 255, 246, 246, 246, 255, 242, 242, 242, 255, 89, 89, 89, 254, 25, 25, 25, 114, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 48, 45, 45, 45, 239, 211, 211, 211, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 232, 232, 232, 255, 86, 86, 86, 254, 20, 20, 20, 146, 12, 12, 12, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 90, 255, 255, 255, 241, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 248, 255, 255, 255, 69, 64, 64, 64, 0, 0, 0, 0, 0, 64, 64, 64, 0, 191, 191, 191, 5, 255, 255, 255, 46, 255, 255, 255, 73, 255, 255, 255, 91, 255, 255, 255, 110, 255, 255, 255, 128, 255, 255, 255, 153, 255, 255, 255, 172, 255, 255, 255, 179, 255, 255, 255, 153, 255, 255, 255, 38, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 42, 255, 255, 255, 149, 255, 255, 255, 236, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 228, 255, 255, 255, 157, 255, 255, 255, 150, 255, 255, 255, 196, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 255, 255, 255, 112, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 46, 23, 0, 216, 183, 93, 27, 207, 185, 96, 134, 194, 172, 90, 225, 198, 181, 118, 255, 220, 210, 175, 255, 225, 220, 197, 255, 200, 189, 147, 255, 176, 158, 86, 255, 184, 164, 84, 255, 198, 176, 91, 238, 218, 193, 101, 162, 236, 210, 109, 151, 235, 209, 109, 183, 230, 205, 108, 251, 236, 216, 141, 255, 246, 232, 179, 255, 248, 235, 182, 255, 246, 224, 141, 255, 233, 213, 102, 149, 160, 160, 76, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 17, 11, 0, 150, 14, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 176, 21, 9, 9, 236, 226, 17, 56, 203, 255, 31, 44, 240, 255, 39, 59, 242, 255, 46, 70, 243, 255, 50, 77, 244, 255, 48, 86, 229, 255, 3, 198, 44, 255, 32, 98, 190, 255, 36, 53, 241, 255, 27, 38, 240, 255, 16, 20, 238, 234, 3, 3, 117, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 85, 255, 255, 255, 255, 255, 255, 255, 170, 128, 128, 128, 0, 0, 0, 0, 0, 64, 64, 64, 0, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 127, 255, 255, 255, 255, 255, 255, 255, 241, 255, 255, 255, 183, 255, 255, 255, 241, 255, 255, 255, 255, 255, 255, 255, 242, 255, 255, 255, 109, 191, 191, 191, 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, 191, 5, 5, 25, 255, 8, 8, 216, 255, 9, 9, 255, 255, 8, 8, 212, 191, 6, 6, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 4, 4, 12, 255, 8, 8, 193, 255, 9, 9, 255, 255, 9, 9, 231, 255, 2, 2, 41, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 255, 7, 68, 24, 255, 9, 255, 24, 255, 9, 255, 24, 255, 9, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 0, 20, 20, 20, 129, 126, 126, 126, 255, 247, 247, 247, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 223, 223, 223, 255, 55, 55, 55, 250, 24, 24, 24, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 92, 119, 119, 119, 255, 246, 246, 246, 255, 245, 245, 245, 255, 108, 108, 108, 255, 26, 26, 26, 139, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 3, 3, 0, 21, 21, 21, 57, 50, 50, 50, 244, 218, 218, 218, 255, 246, 246, 246, 255, 246, 246, 246, 255, 212, 212, 212, 255, 59, 59, 59, 249, 26, 26, 26, 100, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 30, 255, 255, 255, 128, 255, 255, 255, 167, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 142, 255, 255, 255, 36, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 191, 191, 191, 5, 255, 255, 255, 77, 255, 255, 255, 169, 255, 255, 255, 247, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 203, 191, 191, 191, 10, 255, 255, 255, 34, 255, 255, 255, 120, 255, 255, 255, 173, 255, 255, 255, 141, 255, 255, 255, 52, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 47, 24, 0, 153, 118, 44, 1, 201, 177, 91, 63, 199, 175, 92, 155, 196, 175, 91, 239, 216, 200, 140, 255, 236, 227, 192, 255, 238, 230, 201, 255, 237, 225, 179, 255, 236, 211, 113, 255, 247, 220, 116, 226, 182, 165, 86, 26, 232, 219, 113, 22, 226, 209, 96, 108, 248, 220, 116, 169, 245, 218, 113, 153, 246, 219, 114, 68, 109, 103, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 2, 0, 202, 41, 10, 10, 237, 223, 19, 26, 238, 255, 27, 38, 240, 255, 33, 47, 241, 255, 36, 53, 241, 255, 37, 54, 242, 255, 29, 74, 207, 255, 30, 44, 240, 255, 24, 33, 239, 255, 15, 19, 237, 229, 3, 3, 224, 51, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 15, 255, 255, 255, 89, 191, 191, 191, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 2, 255, 255, 255, 147, 255, 255, 255, 250, 255, 255, 255, 255, 255, 255, 255, 251, 255, 255, 255, 168, 191, 191, 191, 27, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 5, 5, 24, 255, 8, 8, 171, 191, 6, 6, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 4, 4, 11, 255, 7, 7, 167, 255, 4, 4, 39, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 191, 5, 33, 24, 255, 9, 128, 23, 255, 8, 149, 22, 255, 8, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 6, 23, 23, 23, 148, 27, 27, 27, 222, 27, 27, 27, 230, 27, 27, 27, 230, 27, 27, 27, 230, 27, 27, 27, 230, 27, 27, 27, 230, 26, 26, 26, 202, 24, 24, 24, 77, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 8, 28, 28, 28, 204, 98, 98, 98, 255, 74, 74, 74, 255, 26, 26, 26, 149, 3, 3, 3, 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, 5, 5, 5, 0, 24, 24, 24, 67, 54, 54, 54, 248, 179, 179, 179, 255, 158, 158, 158, 255, 40, 40, 40, 234, 13, 13, 13, 61, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 191, 191, 191, 15, 255, 255, 255, 97, 255, 255, 255, 184, 255, 255, 255, 235, 255, 255, 255, 219, 255, 255, 255, 140, 191, 191, 191, 15, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 128, 128, 128, 0, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 89, 47, 0, 161, 140, 71, 7, 219, 194, 101, 84, 229, 204, 107, 173, 236, 210, 111, 227, 244, 217, 114, 228, 245, 217, 115, 160, 184, 163, 86, 27, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 16, 0, 124, 110, 58, 0, 122, 108, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 167, 17, 6, 6, 219, 144, 14, 16, 237, 244, 19, 24, 238, 255, 21, 29, 239, 255, 22, 30, 239, 255, 20, 27, 239, 255, 16, 21, 238, 249, 8, 10, 234, 152, 5, 4, 175, 22, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 24, 255, 255, 255, 51, 255, 255, 255, 23, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 35, 0, 10, 0, 70, 0, 10, 0, 70, 0, 137, 5, 73, 0, 53, 49, 80, 0, 53, 49, 80, 0, 53, 49, 80, 0, 53, 49, 80, 0, 53, 49, 80, 0, 53, 49, 80, 0, 53, 49, 80, 0, 53, 49, 80, 0, 153, 21, 76, 0, 10, 0, 70, 0, 4, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 43, 5, 0, 99, 88, 10, 0, 99, 88, 10, 0, 99, 88, 10, 0, 99, 88, 10, 0, 99, 88, 10, 0, 99, 88, 10, 0, 109, 215, 13, 0, 104, 151, 12, 0, 99, 88, 10, 0, 99, 87, 9, 0, 47, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 0, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 3, 26, 26, 26, 66, 24, 24, 24, 44, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 0, 24, 24, 24, 51, 24, 24, 24, 157, 24, 24, 24, 139, 18, 18, 18, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 105, 55, 0, 121, 108, 57, 0, 123, 110, 58, 0, 122, 107, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 101, 0, 1, 1, 176, 10, 7, 5, 235, 70, 10, 11, 236, 105, 10, 11, 236, 102, 9, 8, 235, 77, 5, 5, 176, 13, 2, 2, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 23, 46, 0, 128, 50, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 141, 77, 20, 0, 141, 153, 20, 0, 141, 153, 21, 3, 140, 153, 141, 137, 167, 173, 141, 137, 167, 173, 141, 137, 167, 173, 141, 137, 167, 173, 141, 137, 167, 173, 141, 137, 167, 173, 141, 137, 167, 173, 141, 137, 167, 173, 61, 46, 149, 160, 20, 0, 141, 153, 18, 0, 137, 86, 5, 0, 35, 0, 0, 0, 0, 0, 199, 176, 20, 51, 207, 185, 28, 179, 209, 188, 30, 179, 209, 188, 30, 179, 209, 188, 30, 179, 209, 188, 30, 179, 209, 188, 30, 179, 209, 188, 30, 179, 209, 188, 30, 179, 209, 188, 30, 179, 204, 182, 25, 179, 190, 160, 6, 67, 45, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 11, 0, 13, 13, 13, 0, 23, 23, 23, 20, 13, 13, 13, 0, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, 0, 13, 13, 13, 0, 13, 13, 13, 0, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 11, 0, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 29, 29, 0, 83, 83, 83, 5, 117, 117, 117, 59, 117, 117, 117, 92, 117, 117, 117, 95, 116, 116, 116, 63, 85, 85, 85, 7, 50, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 36, 34, 0, 255, 114, 163, 65, 255, 101, 187, 180, 191, 76, 140, 11, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 141, 128, 20, 0, 141, 255, 20, 0, 141, 255, 23, 3, 141, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 161, 159, 172, 255, 146, 142, 168, 255, 175, 175, 175, 255, 70, 57, 152, 255, 20, 0, 141, 255, 20, 0, 141, 253, 19, 0, 139, 93, 5, 0, 35, 0, 200, 180, 21, 82, 244, 225, 60, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 231, 212, 49, 255, 217, 196, 37, 251, 184, 151, 6, 67, 45, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 26, 24, 24, 24, 160, 42, 42, 42, 246, 67, 67, 67, 255, 35, 35, 35, 236, 26, 26, 26, 133, 16, 16, 16, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 11, 0, 24, 24, 24, 63, 25, 25, 25, 158, 27, 27, 27, 197, 27, 27, 27, 192, 20, 20, 20, 141, 18, 18, 18, 34, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 86, 86, 13, 116, 116, 116, 133, 119, 119, 119, 240, 122, 122, 122, 255, 123, 123, 123, 255, 124, 124, 124, 255, 123, 123, 123, 255, 120, 120, 120, 241, 110, 110, 110, 143, 83, 83, 83, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 47, 27, 0, 214, 155, 142, 79, 255, 106, 184, 252, 255, 102, 188, 255, 255, 102, 187, 192, 191, 73, 137, 11, 0, 0, 0, 0, 20, 0, 141, 128, 20, 0, 141, 255, 20, 0, 141, 255, 23, 3, 141, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 103, 94, 159, 255, 29, 10, 143, 255, 175, 175, 175, 255, 70, 57, 152, 255, 20, 0, 141, 255, 20, 0, 141, 255, 20, 0, 140, 205, 10, 0, 70, 0, 200, 180, 21, 82, 244, 225, 60, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 233, 213, 50, 255, 229, 209, 47, 255, 206, 184, 27, 251, 188, 158, 10, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, 38, 36, 36, 36, 227, 164, 164, 164, 255, 244, 244, 244, 255, 246, 246, 246, 255, 237, 237, 237, 255, 131, 131, 131, 255, 25, 25, 25, 186, 17, 17, 17, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 24, 24, 24, 165, 84, 84, 84, 255, 178, 178, 178, 255, 219, 219, 219, 255, 215, 215, 215, 255, 160, 160, 160, 255, 54, 54, 54, 247, 26, 26, 26, 102, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 87, 87, 36, 116, 116, 116, 216, 118, 118, 118, 255, 126, 126, 126, 255, 131, 131, 131, 255, 132, 132, 132, 255, 133, 133, 133, 255, 132, 132, 132, 255, 129, 129, 129, 255, 125, 125, 125, 255, 121, 121, 121, 226, 113, 113, 113, 44, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 47, 26, 0, 255, 196, 98, 58, 224, 188, 119, 243, 222, 130, 179, 255, 255, 102, 188, 255, 255, 102, 188, 255, 255, 100, 186, 183, 191, 12, 23, 0, 20, 0, 141, 128, 20, 0, 141, 255, 20, 0, 141, 255, 23, 3, 141, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 103, 94, 159, 255, 29, 10, 143, 255, 175, 175, 175, 255, 70, 57, 152, 255, 20, 0, 141, 255, 20, 0, 141, 255, 20, 0, 140, 205, 10, 0, 70, 0, 200, 180, 21, 82, 244, 225, 60, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 254, 236, 69, 255, 249, 231, 65, 255, 243, 224, 60, 255, 202, 180, 23, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 8, 30, 30, 30, 215, 192, 192, 192, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 141, 141, 141, 255, 26, 26, 26, 175, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, 0, 13, 13, 13, 0, 13, 13, 13, 0, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 36, 35, 35, 35, 226, 154, 154, 154, 255, 245, 245, 245, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 232, 232, 232, 255, 78, 78, 78, 254, 26, 26, 26, 97, 3, 3, 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, 5, 5, 5, 0, 12, 12, 12, 0, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 84, 84, 19, 118, 118, 118, 221, 114, 114, 114, 255, 105, 105, 105, 255, 114, 114, 114, 255, 138, 138, 138, 255, 141, 141, 141, 255, 142, 142, 142, 255, 139, 139, 139, 255, 123, 123, 123, 255, 133, 133, 133, 255, 128, 128, 128, 255, 122, 122, 122, 231, 86, 86, 86, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 47, 26, 0, 255, 191, 102, 58, 248, 196, 98, 242, 225, 175, 80, 255, 193, 158, 94, 255, 221, 129, 178, 255, 252, 102, 184, 254, 231, 97, 152, 83, 64, 13, 23, 0, 20, 0, 141, 128, 20, 0, 141, 255, 20, 0, 141, 255, 23, 3, 141, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 132, 126, 165, 255, 87, 76, 155, 255, 175, 175, 175, 255, 70, 57, 152, 255, 20, 0, 141, 255, 20, 0, 141, 255, 20, 0, 140, 205, 10, 0, 70, 0, 200, 180, 21, 82, 244, 225, 60, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 249, 230, 64, 255, 202, 180, 23, 108, 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, 3, 3, 0, 26, 26, 26, 125, 132, 132, 132, 255, 246, 246, 246, 255, 246, 246, 246, 255, 244, 244, 244, 255, 199, 199, 199, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 91, 91, 91, 255, 16, 16, 16, 77, 0, 0, 0, 0, 0, 0, 0, 0, 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, 3, 3, 0, 12, 12, 12, 38, 25, 25, 25, 165, 30, 30, 30, 226, 29, 29, 29, 220, 25, 25, 25, 100, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 31, 35, 35, 35, 225, 191, 191, 191, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 232, 232, 232, 255, 49, 49, 49, 243, 13, 13, 13, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 0, 23, 23, 23, 96, 26, 26, 26, 168, 24, 24, 24, 115, 9, 9, 9, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 77, 77, 17, 75, 75, 75, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 49, 49, 0, 112, 112, 112, 153, 123, 123, 123, 255, 126, 126, 126, 255, 105, 105, 105, 255, 105, 105, 105, 255, 127, 127, 127, 255, 150, 150, 150, 255, 141, 141, 141, 255, 111, 111, 111, 255, 105, 105, 105, 255, 132, 132, 132, 255, 134, 134, 134, 255, 127, 127, 127, 255, 118, 118, 118, 170, 56, 56, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 48, 24, 0, 255, 192, 99, 58, 248, 196, 98, 242, 225, 175, 80, 255, 201, 153, 61, 255, 177, 130, 42, 255, 159, 127, 69, 249, 181, 120, 123, 98, 48, 25, 28, 0, 0, 0, 0, 0, 20, 0, 141, 128, 20, 0, 141, 255, 20, 0, 141, 255, 23, 3, 141, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 70, 57, 152, 255, 20, 0, 141, 255, 20, 0, 141, 255, 20, 0, 140, 205, 10, 0, 70, 0, 200, 180, 21, 82, 244, 225, 60, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 249, 230, 64, 255, 202, 180, 23, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 26, 51, 51, 51, 245, 236, 236, 236, 255, 246, 246, 246, 255, 246, 246, 246, 255, 111, 111, 111, 255, 26, 26, 26, 226, 143, 143, 143, 255, 246, 246, 246, 255, 246, 246, 246, 255, 212, 212, 212, 255, 31, 31, 31, 217, 18, 18, 18, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 22, 22, 22, 75, 46, 46, 46, 240, 175, 175, 175, 255, 244, 244, 244, 255, 230, 230, 230, 255, 66, 66, 66, 254, 26, 26, 26, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 16, 10, 29, 29, 29, 211, 184, 184, 184, 255, 246, 246, 246, 255, 246, 246, 246, 255, 244, 244, 244, 255, 142, 142, 142, 255, 43, 43, 43, 244, 50, 50, 50, 247, 208, 208, 208, 255, 246, 246, 246, 255, 246, 246, 246, 255, 179, 179, 179, 255, 25, 25, 25, 184, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 0, 26, 26, 26, 126, 90, 90, 90, 254, 191, 191, 191, 255, 111, 111, 111, 255, 19, 19, 19, 138, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 105, 105, 43, 103, 103, 103, 194, 75, 75, 75, 12, 0, 0, 0, 0, 0, 0, 0, 0, 100, 100, 100, 18, 120, 120, 120, 250, 128, 128, 128, 255, 111, 111, 111, 255, 105, 105, 105, 255, 111, 111, 111, 255, 150, 150, 150, 255, 159, 159, 159, 255, 137, 137, 137, 255, 105, 105, 105, 255, 105, 105, 105, 255, 109, 109, 109, 255, 117, 117, 117, 255, 119, 119, 119, 255, 120, 120, 120, 254, 113, 113, 113, 34, 64, 0, 0, 0, 255, 3, 3, 18, 255, 5, 5, 26, 255, 5, 5, 26, 255, 5, 5, 26, 255, 5, 5, 26, 255, 5, 5, 26, 255, 7, 7, 20, 128, 4, 4, 0, 128, 5, 5, 0, 128, 5, 5, 0, 128, 5, 5, 0, 128, 5, 5, 0, 128, 5, 5, 0, 64, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 48, 24, 0, 255, 194, 97, 58, 248, 196, 98, 242, 225, 175, 80, 255, 201, 153, 61, 255, 177, 130, 42, 255, 153, 107, 23, 248, 127, 88, 3, 73, 33, 27, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 141, 128, 20, 0, 141, 255, 20, 0, 141, 255, 20, 0, 141, 255, 20, 0, 141, 255, 20, 0, 141, 255, 20, 0, 141, 255, 20, 0, 141, 255, 20, 0, 141, 255, 20, 0, 141, 255, 20, 0, 141, 255, 20, 0, 141, 255, 20, 0, 141, 255, 20, 0, 141, 255, 20, 0, 141, 255, 20, 0, 140, 205, 10, 0, 70, 0, 200, 180, 21, 82, 244, 225, 60, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 249, 230, 64, 255, 202, 180, 23, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 19, 19, 19, 140, 154, 154, 154, 255, 246, 246, 246, 255, 246, 246, 246, 255, 193, 193, 193, 255, 27, 27, 27, 190, 15, 15, 15, 9, 32, 32, 32, 220, 216, 216, 216, 255, 246, 246, 246, 255, 246, 246, 246, 255, 123, 123, 123, 255, 24, 24, 24, 113, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 22, 22, 43, 54, 54, 54, 247, 221, 221, 221, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 124, 124, 124, 255, 26, 26, 26, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 0, 20, 20, 20, 156, 141, 141, 141, 255, 246, 246, 246, 255, 246, 246, 246, 255, 242, 242, 242, 255, 95, 95, 95, 254, 20, 20, 20, 155, 15, 15, 15, 11, 25, 25, 25, 56, 63, 63, 63, 251, 242, 242, 242, 255, 246, 246, 246, 255, 246, 246, 246, 255, 86, 86, 86, 255, 24, 24, 24, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 0, 24, 24, 24, 83, 74, 74, 74, 253, 240, 240, 240, 255, 246, 246, 246, 255, 234, 234, 234, 255, 26, 26, 26, 214, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 52, 52, 0, 53, 53, 53, 0, 53, 53, 53, 0, 53, 53, 53, 0, 53, 53, 53, 0, 53, 53, 53, 0, 53, 53, 53, 0, 53, 53, 53, 0, 53, 53, 53, 0, 53, 53, 53, 0, 105, 105, 105, 43, 105, 105, 105, 255, 103, 103, 103, 193, 76, 76, 76, 11, 0, 0, 0, 0, 117, 117, 117, 88, 123, 123, 123, 255, 125, 125, 125, 255, 105, 105, 105, 255, 110, 110, 110, 255, 149, 149, 149, 255, 162, 162, 162, 255, 167, 167, 167, 255, 161, 161, 161, 255, 105, 105, 105, 255, 105, 105, 105, 255, 105, 105, 105, 255, 105, 105, 105, 255, 105, 105, 105, 255, 116, 116, 116, 255, 118, 118, 118, 105, 128, 4, 4, 0, 255, 8, 8, 180, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 8, 8, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 48, 24, 0, 255, 194, 97, 59, 248, 196, 97, 242, 225, 175, 80, 255, 201, 152, 61, 255, 177, 130, 42, 255, 153, 107, 23, 248, 127, 88, 3, 73, 31, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 141, 128, 20, 0, 141, 255, 64, 50, 150, 255, 111, 103, 161, 255, 113, 105, 161, 255, 113, 105, 161, 255, 113, 105, 161, 255, 113, 105, 161, 255, 113, 105, 161, 255, 113, 105, 161, 255, 113, 105, 161, 255, 113, 105, 161, 255, 113, 105, 161, 255, 89, 78, 156, 255, 22, 2, 141, 255, 20, 0, 140, 205, 10, 0, 70, 0, 200, 180, 21, 82, 244, 225, 60, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 249, 230, 64, 255, 202, 180, 23, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 21, 47, 47, 47, 242, 239, 239, 239, 255, 246, 246, 246, 255, 246, 246, 246, 255, 79, 79, 79, 255, 23, 23, 23, 56, 6, 6, 6, 0, 26, 26, 26, 84, 98, 98, 98, 255, 246, 246, 246, 255, 246, 246, 246, 255, 232, 232, 232, 255, 43, 43, 43, 239, 15, 15, 15, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, 7, 28, 28, 28, 207, 193, 193, 193, 255, 246, 246, 246, 255, 246, 246, 246, 255, 238, 238, 238, 255, 174, 174, 174, 255, 45, 45, 45, 240, 12, 12, 12, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 71, 81, 81, 81, 255, 244, 244, 244, 255, 246, 246, 246, 255, 246, 246, 246, 255, 110, 110, 110, 255, 20, 20, 20, 142, 6, 6, 6, 0, 0, 0, 0, 0, 6, 6, 6, 0, 20, 20, 20, 148, 152, 152, 152, 255, 246, 246, 246, 255, 246, 246, 246, 255, 199, 199, 199, 255, 27, 27, 27, 199, 3, 3, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 46, 50, 50, 50, 244, 224, 224, 224, 255, 246, 246, 246, 255, 246, 246, 246, 255, 174, 174, 174, 255, 25, 25, 25, 168, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 52, 52, 0, 105, 105, 105, 214, 105, 105, 105, 230, 105, 105, 105, 230, 105, 105, 105, 230, 105, 105, 105, 230, 105, 105, 105, 230, 105, 105, 105, 230, 105, 105, 105, 230, 105, 105, 105, 230, 105, 105, 105, 230, 105, 105, 105, 234, 105, 105, 105, 255, 105, 105, 105, 255, 104, 104, 104, 192, 77, 77, 77, 11, 111, 111, 111, 122, 124, 124, 124, 255, 130, 130, 130, 255, 105, 105, 105, 255, 135, 135, 135, 255, 159, 159, 159, 255, 167, 167, 167, 255, 174, 174, 174, 255, 177, 177, 177, 255, 159, 159, 159, 255, 150, 150, 150, 255, 134, 134, 134, 255, 107, 107, 107, 255, 105, 105, 105, 255, 125, 125, 125, 255, 116, 116, 116, 137, 128, 4, 4, 0, 255, 8, 8, 178, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 255, 255, 9, 9, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 48, 24, 0, 255, 194, 97, 59, 248, 195, 98, 242, 225, 175, 80, 255, 201, 152, 61, 255, 177, 129, 42, 255, 153, 107, 23, 248, 129, 85, 3, 73, 31, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 141, 128, 28, 9, 142, 255, 171, 171, 174, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 71, 58, 152, 255, 20, 0, 140, 205, 10, 0, 70, 0, 200, 180, 21, 82, 244, 225, 60, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 249, 230, 64, 255, 202, 180, 23, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 20, 20, 20, 140, 151, 151, 151, 255, 246, 246, 246, 255, 246, 246, 246, 255, 183, 183, 183, 255, 26, 26, 26, 178, 12, 12, 12, 0, 0, 0, 0, 0, 3, 3, 3, 1, 26, 26, 26, 195, 194, 194, 194, 255, 246, 246, 246, 255, 246, 246, 246, 255, 150, 150, 150, 255, 19, 19, 19, 144, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 0, 20, 20, 20, 142, 131, 131, 131, 255, 246, 246, 246, 255, 246, 246, 246, 255, 232, 232, 232, 255, 60, 60, 60, 249, 23, 23, 23, 155, 24, 24, 24, 47, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 16, 6, 30, 30, 30, 216, 209, 209, 209, 255, 246, 246, 246, 255, 246, 246, 246, 255, 160, 160, 160, 255, 25, 25, 25, 177, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 19, 42, 42, 42, 237, 230, 230, 230, 255, 246, 246, 246, 255, 246, 246, 246, 255, 103, 103, 103, 255, 22, 22, 22, 91, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 13, 13, 13, 35, 33, 33, 33, 222, 200, 200, 200, 255, 246, 246, 246, 255, 246, 246, 246, 255, 212, 212, 212, 255, 40, 40, 40, 233, 18, 18, 18, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 52, 52, 0, 105, 105, 105, 238, 105, 105, 105, 255, 105, 105, 105, 255, 105, 105, 105, 255, 105, 105, 105, 255, 105, 105, 105, 255, 105, 105, 105, 255, 105, 105, 105, 255, 105, 105, 105, 255, 105, 105, 105, 255, 105, 105, 105, 255, 105, 105, 105, 255, 105, 105, 105, 255, 105, 105, 105, 255, 93, 93, 93, 111, 108, 108, 108, 120, 125, 125, 125, 255, 133, 133, 133, 255, 111, 111, 111, 255, 113, 113, 113, 255, 158, 158, 158, 255, 168, 168, 168, 255, 176, 176, 176, 255, 154, 154, 154, 255, 128, 128, 128, 255, 131, 131, 131, 255, 133, 133, 133, 255, 141, 141, 141, 255, 117, 117, 117, 255, 130, 130, 130, 255, 116, 116, 116, 139, 64, 2, 2, 0, 255, 8, 8, 89, 255, 9, 9, 128, 255, 9, 9, 128, 255, 9, 9, 128, 255, 9, 9, 128, 255, 8, 8, 137, 255, 7, 7, 153, 255, 7, 7, 153, 255, 7, 7, 153, 255, 7, 7, 153, 255, 7, 7, 153, 255, 7, 7, 153, 255, 7, 7, 153, 255, 8, 8, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 48, 24, 0, 255, 194, 97, 59, 247, 195, 98, 242, 225, 175, 80, 255, 201, 152, 61, 255, 177, 129, 42, 255, 153, 107, 23, 248, 130, 83, 3, 72, 32, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 141, 128, 36, 19, 144, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 84, 72, 155, 255, 20, 0, 140, 205, 10, 0, 70, 0, 200, 180, 21, 82, 244, 225, 60, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 249, 230, 64, 255, 202, 180, 23, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 26, 51, 51, 51, 246, 240, 240, 240, 255, 246, 246, 246, 255, 246, 246, 246, 255, 73, 73, 73, 254, 25, 25, 25, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 23, 23, 53, 71, 71, 71, 254, 245, 245, 245, 255, 246, 246, 246, 255, 241, 241, 241, 255, 65, 65, 65, 252, 15, 15, 15, 58, 0, 0, 0, 0, 6, 6, 6, 0, 24, 24, 24, 86, 79, 79, 79, 254, 242, 242, 242, 255, 246, 246, 246, 255, 246, 246, 246, 255, 104, 104, 104, 255, 26, 26, 26, 106, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 24, 24, 24, 118, 125, 125, 125, 255, 246, 246, 246, 255, 246, 246, 246, 255, 222, 222, 222, 255, 35, 35, 35, 228, 17, 17, 17, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 0, 26, 26, 26, 111, 124, 124, 124, 255, 246, 246, 246, 255, 246, 246, 246, 255, 220, 220, 220, 255, 34, 34, 34, 226, 19, 19, 19, 10, 0, 0, 0, 0, 6, 6, 6, 0, 23, 23, 23, 63, 41, 41, 41, 236, 189, 189, 189, 255, 246, 246, 246, 255, 246, 246, 246, 255, 233, 233, 233, 255, 60, 60, 60, 250, 25, 25, 25, 62, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 52, 52, 0, 105, 105, 105, 166, 105, 105, 105, 179, 105, 105, 105, 179, 105, 105, 105, 179, 105, 105, 105, 179, 105, 105, 105, 179, 105, 105, 105, 179, 105, 105, 105, 179, 105, 105, 105, 179, 105, 105, 105, 179, 105, 105, 105, 191, 105, 105, 105, 255, 105, 105, 105, 255, 104, 104, 104, 151, 72, 72, 72, 1, 117, 117, 117, 87, 124, 124, 124, 255, 132, 132, 132, 255, 118, 118, 118, 255, 105, 105, 105, 255, 138, 138, 138, 255, 165, 165, 165, 255, 169, 169, 169, 255, 113, 113, 113, 255, 105, 105, 105, 255, 105, 105, 105, 255, 113, 113, 113, 255, 146, 146, 146, 255, 137, 137, 137, 255, 129, 129, 129, 255, 119, 119, 119, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 2, 2, 0, 128, 3, 3, 0, 128, 3, 3, 0, 128, 3, 3, 0, 128, 3, 3, 0, 128, 3, 3, 0, 128, 3, 3, 0, 128, 3, 3, 0, 64, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 48, 32, 0, 255, 194, 109, 58, 247, 196, 98, 242, 225, 174, 80, 255, 201, 152, 61, 255, 177, 129, 42, 255, 153, 107, 23, 248, 130, 83, 3, 72, 32, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 141, 128, 36, 19, 144, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 84, 72, 155, 255, 20, 0, 140, 205, 10, 0, 70, 0, 200, 180, 21, 82, 244, 225, 60, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 249, 230, 64, 255, 202, 180, 23, 108, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 0, 19, 19, 19, 32, 20, 20, 20, 169, 159, 159, 159, 255, 246, 246, 246, 255, 246, 246, 246, 255, 189, 189, 189, 255, 26, 26, 26, 180, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, 0, 26, 26, 26, 166, 169, 169, 169, 255, 246, 246, 246, 255, 246, 246, 246, 255, 206, 206, 206, 255, 37, 37, 37, 230, 16, 16, 16, 75, 24, 24, 24, 101, 50, 50, 50, 244, 226, 226, 226, 255, 246, 246, 246, 255, 246, 246, 246, 255, 172, 172, 172, 255, 26, 26, 26, 185, 3, 3, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 23, 47, 47, 47, 242, 234, 234, 234, 255, 246, 246, 246, 255, 246, 246, 246, 255, 108, 108, 108, 255, 25, 25, 25, 96, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 7, 34, 34, 34, 226, 223, 223, 223, 255, 246, 246, 246, 255, 246, 246, 246, 255, 135, 135, 135, 255, 26, 26, 26, 146, 19, 19, 19, 18, 25, 25, 25, 129, 60, 60, 60, 250, 214, 214, 214, 255, 246, 246, 246, 255, 246, 246, 246, 255, 244, 244, 244, 255, 89, 89, 89, 254, 25, 25, 25, 103, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 52, 52, 0, 53, 53, 53, 0, 53, 53, 53, 0, 53, 53, 53, 0, 53, 53, 53, 0, 53, 53, 53, 0, 53, 53, 53, 0, 53, 53, 53, 0, 53, 53, 53, 0, 53, 53, 53, 0, 105, 105, 105, 43, 105, 105, 105, 255, 104, 104, 104, 152, 77, 77, 77, 1, 0, 0, 0, 0, 113, 113, 113, 19, 121, 121, 121, 249, 130, 130, 130, 255, 118, 118, 118, 255, 111, 111, 111, 255, 150, 150, 150, 255, 158, 158, 158, 255, 158, 158, 158, 255, 108, 108, 108, 255, 105, 105, 105, 255, 105, 105, 105, 255, 124, 124, 124, 255, 142, 142, 142, 255, 134, 134, 134, 255, 126, 126, 126, 254, 112, 112, 112, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 111, 83, 0, 255, 222, 164, 193, 230, 184, 97, 238, 200, 152, 60, 255, 177, 129, 42, 255, 152, 107, 23, 248, 127, 85, 3, 72, 31, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 141, 128, 36, 19, 144, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 84, 72, 155, 255, 20, 0, 140, 205, 10, 0, 70, 0, 200, 180, 21, 82, 244, 225, 60, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 249, 230, 64, 255, 202, 180, 23, 108, 0, 0, 0, 0, 3, 3, 3, 0, 26, 26, 26, 124, 62, 62, 62, 252, 135, 135, 135, 255, 245, 245, 245, 255, 246, 246, 246, 255, 244, 244, 244, 255, 69, 69, 69, 253, 24, 24, 24, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 30, 45, 45, 45, 240, 225, 225, 225, 255, 246, 246, 246, 255, 246, 246, 246, 255, 203, 203, 203, 255, 107, 107, 107, 255, 124, 124, 124, 255, 223, 223, 223, 255, 246, 246, 246, 255, 246, 246, 246, 255, 223, 223, 223, 255, 43, 43, 43, 237, 20, 20, 20, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 0, 20, 20, 20, 139, 152, 152, 152, 255, 246, 246, 246, 255, 246, 246, 246, 255, 204, 204, 204, 255, 28, 28, 28, 206, 3, 3, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 24, 24, 24, 95, 101, 101, 101, 255, 246, 246, 246, 255, 246, 246, 246, 255, 242, 242, 242, 255, 106, 106, 106, 255, 54, 54, 54, 253, 142, 142, 142, 255, 235, 235, 235, 255, 246, 246, 246, 255, 246, 246, 246, 255, 245, 245, 245, 255, 112, 112, 112, 255, 19, 19, 19, 147, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 105, 105, 43, 100, 100, 100, 153, 74, 74, 74, 1, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 0, 116, 116, 116, 149, 126, 126, 126, 255, 116, 116, 116, 255, 132, 132, 132, 255, 146, 146, 146, 255, 151, 151, 151, 255, 154, 154, 154, 255, 130, 130, 130, 255, 105, 105, 105, 255, 111, 111, 111, 255, 141, 141, 141, 255, 137, 137, 137, 255, 130, 130, 130, 255, 119, 119, 119, 167, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 220, 164, 52, 255, 224, 167, 255, 253, 221, 162, 240, 192, 148, 67, 238, 152, 107, 23, 248, 127, 85, 3, 72, 31, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 141, 128, 36, 19, 144, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 84, 72, 155, 255, 20, 0, 140, 205, 10, 0, 70, 0, 200, 180, 21, 82, 244, 225, 60, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 249, 230, 64, 255, 202, 180, 23, 108, 0, 0, 0, 0, 13, 13, 13, 19, 57, 57, 57, 251, 240, 240, 240, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 152, 152, 152, 255, 26, 26, 26, 155, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 26, 26, 26, 89, 86, 86, 86, 254, 241, 241, 241, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 232, 232, 232, 255, 67, 67, 67, 252, 23, 23, 23, 79, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, 0, 37, 37, 37, 235, 239, 239, 239, 255, 246, 246, 246, 255, 246, 246, 246, 255, 84, 84, 84, 255, 16, 16, 16, 66, 0, 0, 0, 0, 0, 0, 0, 0, 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, 3, 3, 1, 26, 26, 26, 186, 175, 175, 175, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 241, 241, 241, 255, 110, 110, 110, 255, 20, 20, 20, 158, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 75, 75, 8, 64, 64, 64, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 86, 86, 16, 120, 120, 120, 219, 124, 124, 124, 255, 134, 134, 134, 255, 139, 139, 139, 255, 143, 143, 143, 255, 145, 145, 145, 255, 144, 144, 144, 255, 108, 108, 108, 255, 132, 132, 132, 255, 137, 137, 137, 255, 131, 131, 131, 255, 125, 125, 125, 227, 88, 88, 88, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 93, 70, 0, 239, 205, 154, 155, 255, 224, 167, 255, 255, 224, 167, 255, 250, 218, 160, 192, 158, 107, 38, 68, 31, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 141, 128, 35, 17, 144, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 82, 70, 154, 255, 20, 0, 140, 205, 10, 0, 70, 0, 200, 180, 21, 82, 244, 225, 60, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 249, 230, 64, 255, 202, 180, 23, 108, 0, 0, 0, 0, 24, 24, 24, 26, 66, 66, 66, 254, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 177, 177, 177, 255, 31, 31, 31, 217, 19, 19, 19, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 0, 26, 26, 26, 134, 86, 86, 86, 254, 227, 227, 227, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 196, 196, 196, 255, 64, 64, 64, 252, 26, 26, 26, 99, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, 5, 42, 42, 42, 243, 241, 241, 241, 255, 246, 246, 246, 255, 175, 175, 175, 255, 26, 26, 26, 180, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 29, 37, 37, 37, 228, 188, 188, 188, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 246, 246, 246, 255, 219, 219, 219, 255, 78, 78, 78, 254, 26, 26, 26, 135, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 88, 88, 33, 120, 120, 120, 214, 127, 127, 127, 255, 131, 131, 131, 255, 135, 135, 135, 255, 137, 137, 137, 255, 137, 137, 137, 255, 131, 131, 131, 255, 133, 133, 133, 255, 129, 129, 129, 255, 124, 124, 124, 221, 60, 60, 60, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 79, 62, 18, 85, 78, 65, 246, 242, 210, 153, 151, 255, 221, 163, 50, 128, 111, 83, 0, 50, 37, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 141, 128, 21, 1, 141, 255, 135, 131, 166, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 175, 175, 175, 255, 162, 160, 172, 255, 41, 24, 146, 255, 20, 0, 140, 205, 10, 0, 70, 0, 200, 180, 21, 82, 244, 225, 60, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 255, 237, 70, 255, 249, 230, 64, 255, 202, 180, 23, 108, 0, 0, 0, 0, 10, 10, 10, 0, 24, 24, 24, 161, 95, 95, 95, 255, 137, 137, 137, 255, 86, 86, 86, 255, 26, 26, 26, 195, 19, 19, 19, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 0, 26, 26, 26, 93, 37, 37, 37, 233, 110, 110, 110, 255, 148, 148, 148, 255, 140, 140, 140, 255, 88, 88, 88, 255, 27, 27, 27, 203, 26, 26, 26, 51, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 0, 20, 20, 20, 127, 77, 77, 77, 255, 124, 124, 124, 255, 39, 39, 39, 234, 19, 19, 19, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 37, 29, 29, 29, 209, 114, 114, 114, 255, 189, 189, 189, 255, 212, 212, 212, 255, 188, 188, 188, 255, 117, 117, 117, 255, 31, 31, 31, 221, 21, 21, 21, 83, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 86, 86, 11, 119, 119, 119, 128, 122, 122, 122, 235, 126, 126, 126, 255, 128, 128, 128, 255, 128, 128, 128, 255, 127, 127, 127, 255, 125, 125, 125, 241, 121, 121, 121, 136, 89, 89, 89, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 87, 70, 20, 95, 81, 64, 13, 114, 99, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 141, 102, 20, 0, 141, 204, 20, 0, 141, 204, 32, 14, 143, 204, 36, 18, 144, 204, 36, 18, 144, 204, 36, 18, 144, 204, 36, 18, 144, 204, 36, 18, 144, 204, 36, 18, 144, 204, 36, 18, 144, 204, 36, 18, 144, 204, 36, 18, 144, 204, 21, 2, 141, 204, 20, 0, 141, 204, 20, 0, 140, 164, 10, 0, 70, 0, 198, 177, 21, 47, 205, 184, 27, 170, 207, 186, 29, 168, 207, 186, 29, 168, 207, 186, 29, 168, 207, 186, 29, 168, 207, 186, 29, 168, 207, 186, 29, 168, 207, 186, 29, 168, 207, 186, 29, 168, 207, 186, 29, 168, 207, 186, 29, 168, 206, 185, 28, 169, 199, 176, 20, 63, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 16, 3, 26, 26, 26, 72, 26, 26, 26, 93, 26, 26, 26, 51, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 0, 17, 17, 17, 6, 26, 26, 26, 75, 26, 26, 26, 113, 26, 26, 26, 103, 25, 25, 25, 52, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 0, 26, 26, 26, 59, 26, 26, 26, 92, 19, 19, 19, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, 5, 16, 16, 16, 91, 26, 26, 26, 164, 26, 26, 26, 183, 26, 26, 26, 164, 26, 26, 26, 94, 19, 19, 19, 5, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 43, 0, 68, 17, 42, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 111, 102, 60, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 26, 17, 68, 0, 85, 34, 77, 0, 85, 34, 77, 0, 85, 34, 77, 0, 85, 34, 77, 0, 85, 34, 77, 0, 85, 34, 77, 0, 85, 34, 77, 0, 85, 34, 77, 0, 85, 34, 77, 0, 85, 34, 77, 0, 85, 34, 77, 0, 85, 34, 77, 0, 85, 34, 77, 0, 85, 34, 77, 0, 85, 34, 77, 0, 85, 34, 77, 0, 85, 34, 77, 0, 85, 34, 77, 0, 85, 34, 77, 0, 85, 34, 77, 0, 114, 63, 106, 0, 134, 96, 128, 4, 131, 105, 127, 55, 133, 107, 128, 90, 133, 107, 128, 88, 132, 106, 127, 59, 133, 95, 127, 5, 115, 64, 106, 0, 85, 34, 77, 0, 85, 34, 77, 0, 85, 34, 77, 0, 85, 34, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 35, 0, 226, 223, 241, 20, 255, 255, 255, 153, 226, 223, 241, 71, 10, 0, 70, 0, 10, 0, 70, 0, 10, 0, 70, 0, 10, 0, 70, 0, 10, 0, 70, 0, 10, 0, 70, 0, 10, 0, 70, 0, 10, 0, 70, 0, 10, 0, 70, 0, 10, 0, 70, 0, 10, 0, 70, 0, 10, 0, 70, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 153, 255, 255, 255, 83, 170, 161, 103, 0, 99, 88, 10, 0, 99, 88, 10, 0, 99, 88, 10, 0, 99, 88, 10, 0, 162, 151, 74, 0, 233, 225, 167, 10, 241, 235, 196, 51, 241, 235, 196, 27, 226, 215, 138, 0, 49, 43, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 1, 1, 0, 103, 2, 2, 0, 104, 2, 2, 0, 67, 1, 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, 12, 12, 12, 0, 13, 13, 13, 0, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 16, 255, 255, 255, 55, 255, 255, 255, 255, 255, 255, 255, 131, 255, 255, 255, 25, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 14, 255, 255, 255, 37, 255, 255, 255, 255, 255, 255, 255, 149, 255, 255, 255, 26, 191, 191, 191, 1, 0, 0, 0, 0, 64, 64, 64, 0, 191, 191, 191, 11, 255, 255, 255, 137, 255, 255, 255, 241, 255, 255, 255, 255, 255, 255, 255, 252, 255, 255, 255, 164, 191, 191, 191, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 1, 1, 1, 131, 0, 0, 0, 153, 0, 0, 0, 153, 0, 0, 0, 153, 0, 0, 0, 153, 0, 0, 0, 153, 0, 0, 0, 153, 0, 0, 0, 153, 0, 0, 0, 153, 1, 1, 1, 132, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 150, 2, 0, 0, 153, 74, 2, 2, 153, 192, 4, 4, 173, 231, 5, 5, 200, 231, 5, 5, 201, 194, 4, 4, 175, 77, 2, 2, 153, 3, 0, 0, 153, 0, 0, 0, 151, 0, 0, 0, 93, 0, 0, 0, 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, 15, 15, 32, 0, 42, 42, 99, 11, 82, 82, 155, 110, 102, 102, 174, 122, 102, 102, 174, 122, 102, 102, 174, 122, 102, 102, 174, 122, 102, 102, 174, 122, 102, 102, 174, 122, 102, 102, 174, 122, 102, 102, 174, 122, 102, 102, 174, 122, 110, 110, 179, 116, 120, 120, 185, 107, 120, 120, 185, 107, 120, 120, 185, 107, 120, 120, 185, 107, 120, 120, 185, 107, 143, 143, 200, 101, 41, 41, 54, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 128, 128, 128, 0, 255, 255, 255, 21, 255, 255, 255, 51, 255, 255, 255, 36, 191, 191, 191, 2, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 160, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 245, 255, 255, 255, 13, 255, 255, 255, 96, 191, 191, 191, 15, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 17, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 140, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 10, 128, 128, 128, 0, 255, 255, 255, 75, 255, 255, 255, 223, 255, 255, 255, 255, 255, 255, 255, 251, 255, 255, 255, 189, 255, 255, 255, 237, 255, 255, 255, 255, 255, 255, 255, 158, 128, 128, 128, 0, 0, 0, 0, 0, 1, 1, 1, 67, 60, 60, 60, 248, 188, 188, 188, 255, 204, 204, 204, 255, 204, 204, 204, 255, 204, 204, 204, 255, 204, 204, 204, 255, 204, 204, 204, 255, 204, 204, 204, 255, 204, 204, 204, 255, 204, 204, 204, 255, 189, 189, 189, 255, 62, 62, 62, 249, 1, 1, 1, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119, 112, 112, 112, 255, 218, 175, 175, 255, 245, 43, 43, 255, 255, 6, 6, 255, 255, 6, 6, 255, 255, 6, 6, 255, 255, 6, 6, 255, 255, 6, 6, 255, 255, 6, 6, 255, 246, 41, 41, 255, 219, 172, 172, 255, 118, 118, 118, 255, 0, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 33, 0, 50, 50, 100, 26, 68, 68, 142, 141, 75, 75, 154, 245, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 91, 91, 168, 255, 195, 195, 239, 253, 108, 108, 127, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 191, 191, 191, 19, 255, 255, 255, 125, 255, 255, 255, 230, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 248, 255, 255, 255, 169, 255, 255, 255, 53, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 80, 255, 255, 255, 144, 255, 255, 255, 255, 255, 255, 255, 186, 255, 255, 255, 123, 255, 255, 255, 109, 255, 255, 255, 255, 255, 255, 255, 175, 191, 191, 191, 1, 64, 64, 64, 0, 255, 255, 255, 94, 255, 255, 255, 248, 255, 255, 255, 101, 128, 128, 128, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 70, 255, 255, 255, 134, 255, 255, 255, 255, 255, 255, 255, 196, 255, 255, 255, 128, 255, 255, 255, 30, 255, 255, 255, 170, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 197, 255, 255, 255, 44, 128, 128, 128, 0, 191, 191, 191, 28, 255, 255, 255, 245, 255, 255, 255, 249, 255, 255, 255, 14, 0, 0, 0, 0, 3, 3, 3, 187, 237, 237, 237, 255, 211, 211, 211, 255, 144, 144, 144, 255, 247, 247, 247, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 252, 252, 255, 148, 148, 148, 255, 202, 202, 202, 255, 238, 238, 238, 255, 4, 4, 4, 191, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 206, 253, 201, 201, 255, 255, 19, 19, 255, 255, 6, 6, 255, 255, 34, 34, 255, 255, 135, 135, 255, 255, 185, 185, 255, 255, 186, 186, 255, 255, 137, 137, 255, 255, 37, 37, 255, 255, 6, 6, 255, 255, 17, 17, 255, 254, 197, 197, 255, 20, 20, 20, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 60, 0, 50, 50, 119, 45, 71, 71, 146, 161, 76, 76, 156, 252, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 89, 89, 167, 255, 194, 194, 239, 255, 216, 216, 255, 253, 108, 108, 128, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 50, 255, 255, 255, 229, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 226, 255, 255, 255, 196, 255, 255, 255, 216, 255, 255, 255, 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 141, 191, 191, 191, 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, 255, 255, 255, 33, 255, 255, 255, 255, 255, 255, 255, 118, 0, 0, 0, 0, 255, 255, 255, 76, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 117, 255, 255, 255, 92, 255, 255, 255, 253, 255, 255, 255, 255, 255, 255, 255, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 13, 255, 255, 255, 255, 255, 255, 255, 138, 255, 255, 255, 62, 255, 255, 255, 238, 255, 255, 255, 255, 255, 255, 255, 239, 255, 255, 255, 104, 191, 191, 191, 2, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 2, 255, 255, 255, 231, 255, 255, 255, 255, 255, 255, 255, 25, 0, 0, 0, 0, 30, 30, 30, 221, 255, 255, 255, 255, 74, 74, 74, 255, 0, 0, 0, 255, 176, 176, 176, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 196, 196, 196, 255, 0, 0, 0, 255, 53, 53, 53, 255, 255, 255, 255, 255, 33, 33, 33, 224, 0, 0, 0, 0, 0, 0, 0, 0, 38, 26, 26, 219, 255, 33, 33, 255, 255, 6, 6, 255, 167, 4, 4, 255, 179, 170, 170, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 202, 194, 194, 255, 164, 3, 3, 255, 255, 5, 5, 255, 255, 28, 28, 255, 49, 34, 34, 228, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 32, 65, 0, 64, 64, 128, 66, 69, 69, 143, 182, 76, 76, 158, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 88, 88, 166, 255, 192, 192, 238, 255, 215, 215, 255, 255, 216, 216, 255, 253, 108, 108, 128, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 230, 218, 156, 255, 239, 231, 192, 255, 239, 231, 192, 255, 239, 231, 192, 255, 230, 218, 156, 255, 221, 204, 119, 255, 222, 205, 121, 255, 236, 227, 181, 255, 241, 235, 201, 255, 241, 235, 201, 255, 241, 235, 201, 255, 241, 235, 201, 255, 241, 235, 201, 255, 241, 235, 201, 255, 241, 235, 201, 255, 241, 235, 201, 255, 236, 227, 181, 255, 222, 205, 121, 255, 221, 204, 119, 255, 230, 218, 156, 255, 239, 231, 192, 255, 239, 231, 192, 255, 239, 231, 192, 255, 230, 218, 156, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 0, 0, 0, 0, 255, 255, 255, 55, 255, 255, 255, 244, 255, 255, 255, 255, 255, 255, 255, 185, 255, 255, 255, 54, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 19, 255, 255, 255, 124, 255, 255, 255, 245, 255, 255, 255, 255, 255, 255, 255, 177, 191, 191, 191, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 0, 191, 191, 191, 0, 128, 128, 128, 0, 255, 255, 255, 44, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 251, 255, 255, 255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 128, 128, 128, 0, 255, 255, 255, 10, 255, 255, 255, 231, 255, 255, 255, 255, 255, 255, 255, 174, 255, 255, 255, 88, 255, 255, 255, 128, 255, 255, 255, 115, 255, 255, 255, 31, 191, 191, 191, 16, 255, 255, 255, 162, 255, 255, 255, 255, 255, 255, 255, 214, 191, 191, 191, 1, 0, 0, 0, 0, 32, 32, 32, 222, 255, 255, 255, 255, 193, 193, 193, 255, 113, 113, 113, 255, 240, 240, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 248, 248, 248, 255, 117, 117, 117, 255, 181, 181, 181, 255, 255, 255, 255, 255, 35, 35, 35, 225, 0, 0, 0, 0, 16, 0, 0, 0, 130, 7, 7, 223, 255, 6, 6, 255, 248, 53, 53, 255, 127, 123, 123, 255, 242, 242, 242, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 249, 249, 255, 250, 145, 145, 255, 233, 9, 9, 255, 255, 6, 6, 255, 255, 6, 6, 255, 137, 7, 7, 231, 19, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 33, 33, 68, 0, 65, 65, 136, 88, 72, 72, 147, 205, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 87, 87, 165, 255, 191, 191, 237, 255, 215, 215, 255, 255, 215, 215, 255, 255, 216, 216, 255, 253, 108, 108, 128, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 135, 33, 84, 255, 141, 44, 92, 255, 148, 56, 102, 255, 148, 56, 102, 255, 148, 56, 102, 255, 148, 56, 102, 255, 148, 56, 102, 255, 148, 56, 102, 255, 148, 56, 102, 255, 148, 56, 102, 255, 148, 56, 102, 255, 148, 56, 102, 255, 148, 56, 102, 255, 148, 56, 102, 255, 148, 56, 102, 255, 148, 56, 102, 255, 148, 56, 102, 255, 142, 45, 93, 255, 135, 33, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 236, 226, 178, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 250, 242, 255, 221, 204, 119, 255, 231, 220, 161, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 232, 220, 161, 255, 221, 204, 119, 255, 252, 250, 242, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 236, 227, 179, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 171, 69, 154, 255, 201, 135, 189, 255, 218, 174, 211, 255, 203, 140, 192, 255, 171, 70, 154, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 191, 191, 191, 6, 255, 255, 255, 211, 255, 255, 255, 255, 255, 255, 255, 150, 191, 191, 191, 3, 128, 128, 128, 0, 255, 255, 255, 139, 255, 255, 255, 246, 255, 255, 255, 226, 255, 255, 255, 72, 128, 128, 128, 0, 255, 255, 255, 50, 255, 255, 255, 229, 255, 255, 255, 255, 255, 255, 255, 117, 64, 64, 64, 0, 64, 64, 64, 0, 191, 191, 191, 4, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 4, 64, 64, 64, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 129, 255, 255, 255, 203, 255, 255, 255, 179, 255, 255, 255, 185, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 233, 255, 255, 255, 39, 255, 255, 255, 15, 128, 128, 128, 0, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 63, 255, 255, 255, 255, 255, 255, 255, 189, 255, 255, 255, 189, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 236, 255, 255, 255, 175, 255, 255, 255, 232, 255, 255, 255, 255, 255, 255, 255, 239, 255, 255, 255, 57, 64, 64, 64, 0, 0, 0, 0, 0, 32, 32, 32, 222, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35, 35, 35, 225, 0, 0, 0, 0, 95, 1, 1, 0, 218, 5, 5, 243, 255, 6, 6, 255, 255, 187, 187, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 251, 251, 255, 255, 157, 157, 255, 255, 35, 35, 255, 255, 6, 6, 255, 255, 6, 6, 255, 255, 6, 6, 255, 255, 6, 6, 255, 223, 5, 5, 247, 99, 1, 1, 0, 0, 0, 0, 0, 36, 36, 82, 5, 43, 43, 121, 106, 73, 73, 150, 226, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 85, 85, 164, 255, 189, 189, 236, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 216, 216, 255, 253, 108, 108, 128, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 151, 62, 106, 255, 250, 246, 248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 249, 250, 255, 155, 70, 113, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 236, 226, 178, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 251, 244, 255, 221, 204, 119, 255, 233, 223, 169, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 233, 223, 169, 255, 221, 204, 119, 255, 252, 251, 244, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 236, 227, 179, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 223, 184, 216, 255, 255, 255, 255, 255, 252, 247, 251, 255, 255, 255, 255, 255, 227, 195, 222, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 255, 255, 255, 96, 255, 255, 255, 255, 255, 255, 255, 209, 191, 191, 191, 4, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 187, 128, 128, 128, 0, 64, 64, 64, 0, 255, 255, 255, 61, 255, 255, 255, 253, 255, 255, 255, 248, 255, 255, 255, 13, 255, 255, 255, 57, 255, 255, 255, 240, 255, 255, 255, 109, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 118, 255, 255, 255, 240, 255, 255, 255, 48, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 194, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 167, 255, 255, 255, 54, 255, 255, 255, 102, 255, 255, 255, 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 246, 255, 255, 255, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 47, 255, 255, 255, 184, 255, 255, 255, 246, 255, 255, 255, 255, 255, 255, 255, 231, 255, 255, 255, 159, 255, 255, 255, 201, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 185, 255, 255, 255, 35, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 32, 32, 222, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 112, 112, 112, 255, 110, 110, 110, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35, 35, 35, 225, 0, 0, 0, 0, 255, 0, 0, 5, 254, 6, 6, 255, 255, 10, 10, 255, 255, 251, 251, 255, 255, 255, 255, 255, 255, 252, 252, 255, 255, 164, 164, 255, 251, 36, 36, 255, 255, 6, 6, 255, 255, 6, 6, 255, 255, 6, 6, 255, 255, 39, 39, 255, 255, 160, 160, 255, 255, 15, 15, 255, 255, 6, 6, 255, 255, 0, 0, 11, 0, 0, 0, 0, 102, 102, 157, 86, 132, 132, 189, 255, 126, 126, 183, 255, 123, 123, 180, 255, 119, 119, 177, 255, 115, 115, 175, 255, 114, 114, 174, 255, 109, 109, 173, 255, 108, 108, 173, 255, 106, 106, 175, 255, 103, 103, 172, 255, 98, 98, 167, 255, 103, 103, 172, 252, 112, 112, 180, 255, 108, 108, 178, 255, 107, 107, 177, 255, 95, 95, 170, 255, 92, 92, 168, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 84, 84, 164, 255, 187, 187, 235, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 216, 216, 255, 253, 108, 108, 128, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 166, 90, 128, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 172, 101, 137, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 236, 226, 178, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 251, 244, 255, 221, 204, 119, 255, 233, 223, 169, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 233, 223, 169, 255, 221, 204, 119, 255, 252, 251, 244, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 236, 227, 179, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 175, 79, 159, 255, 218, 174, 211, 255, 221, 180, 214, 255, 221, 180, 214, 255, 221, 180, 214, 255, 221, 180, 214, 255, 221, 180, 214, 255, 221, 180, 214, 255, 221, 180, 214, 255, 221, 180, 214, 255, 221, 180, 214, 255, 221, 180, 214, 255, 221, 180, 214, 255, 223, 185, 217, 255, 255, 255, 255, 255, 216, 169, 208, 255, 170, 68, 153, 255, 211, 158, 202, 255, 255, 255, 255, 255, 225, 189, 219, 255, 221, 180, 214, 255, 221, 180, 214, 255, 218, 173, 210, 255, 175, 78, 158, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 255, 255, 255, 83, 255, 255, 255, 255, 255, 255, 255, 233, 191, 191, 191, 27, 0, 0, 0, 0, 191, 191, 191, 10, 255, 255, 255, 238, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 160, 128, 128, 128, 0, 64, 64, 64, 0, 255, 255, 255, 91, 255, 255, 255, 255, 255, 255, 255, 241, 255, 255, 255, 10, 255, 255, 255, 44, 255, 255, 255, 251, 255, 255, 255, 251, 255, 255, 255, 61, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 68, 255, 255, 255, 253, 255, 255, 255, 249, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 6, 255, 255, 255, 120, 255, 255, 255, 244, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 18, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 182, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 232, 255, 255, 255, 52, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 57, 255, 255, 255, 213, 255, 255, 255, 255, 255, 255, 255, 253, 255, 255, 255, 181, 255, 255, 255, 173, 255, 255, 255, 245, 255, 255, 255, 255, 255, 255, 255, 233, 255, 255, 255, 170, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 32, 32, 222, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 248, 248, 248, 255, 10, 10, 10, 255, 9, 9, 9, 255, 246, 246, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35, 35, 35, 225, 0, 0, 0, 0, 255, 3, 3, 18, 255, 6, 6, 255, 255, 21, 21, 255, 255, 254, 254, 255, 255, 170, 170, 255, 255, 46, 46, 255, 255, 6, 6, 255, 255, 6, 6, 255, 255, 6, 6, 255, 255, 34, 34, 255, 255, 155, 155, 255, 255, 250, 250, 255, 255, 255, 255, 255, 255, 29, 29, 255, 255, 6, 6, 255, 255, 5, 5, 26, 0, 0, 0, 0, 102, 102, 157, 86, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 137, 137, 193, 255, 141, 141, 195, 255, 141, 141, 196, 255, 175, 175, 223, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 216, 216, 255, 253, 108, 108, 128, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 166, 90, 128, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 172, 101, 137, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 236, 226, 179, 255, 253, 252, 247, 255, 253, 252, 247, 255, 253, 252, 247, 255, 244, 239, 214, 255, 221, 204, 119, 255, 225, 210, 136, 255, 251, 249, 240, 255, 253, 252, 247, 255, 253, 252, 247, 255, 253, 252, 247, 255, 253, 252, 247, 255, 253, 252, 247, 255, 253, 252, 247, 255, 253, 252, 247, 255, 253, 252, 247, 255, 251, 250, 240, 255, 225, 210, 136, 255, 221, 204, 119, 255, 244, 239, 213, 255, 253, 252, 247, 255, 253, 252, 247, 255, 253, 252, 247, 255, 236, 227, 180, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 187, 106, 174, 255, 245, 232, 242, 255, 247, 236, 245, 255, 247, 236, 245, 255, 247, 236, 245, 255, 247, 236, 245, 255, 247, 236, 245, 255, 247, 236, 245, 255, 247, 236, 245, 255, 247, 236, 245, 255, 247, 236, 245, 255, 247, 236, 245, 255, 247, 236, 245, 255, 248, 239, 246, 255, 255, 255, 255, 255, 201, 136, 190, 255, 170, 68, 153, 255, 196, 126, 184, 255, 255, 255, 255, 255, 248, 240, 247, 255, 247, 236, 245, 255, 247, 236, 245, 255, 244, 231, 242, 255, 186, 104, 173, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 191, 191, 191, 0, 255, 255, 255, 171, 255, 255, 255, 255, 255, 255, 255, 210, 191, 191, 191, 31, 128, 128, 128, 0, 255, 255, 255, 58, 255, 255, 255, 146, 255, 255, 255, 127, 191, 191, 191, 24, 128, 128, 128, 0, 255, 255, 255, 81, 255, 255, 255, 245, 255, 255, 255, 255, 255, 255, 255, 86, 64, 64, 64, 0, 64, 64, 64, 0, 255, 255, 255, 120, 255, 255, 255, 255, 255, 255, 255, 236, 255, 255, 255, 64, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 70, 255, 255, 255, 239, 255, 255, 255, 255, 255, 255, 255, 111, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 84, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 60, 128, 128, 128, 0, 191, 191, 191, 8, 255, 255, 255, 216, 255, 255, 255, 255, 255, 255, 255, 209, 255, 255, 255, 97, 191, 191, 191, 7, 64, 64, 64, 0, 64, 64, 64, 0, 255, 255, 255, 74, 255, 255, 255, 248, 255, 255, 255, 255, 255, 255, 255, 211, 255, 255, 255, 146, 255, 255, 255, 244, 255, 255, 255, 255, 255, 255, 255, 252, 255, 255, 255, 161, 255, 255, 255, 190, 255, 255, 255, 255, 255, 255, 255, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 32, 32, 222, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 205, 205, 205, 255, 204, 204, 204, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35, 35, 35, 225, 0, 0, 0, 0, 189, 1, 1, 2, 250, 5, 5, 253, 255, 6, 6, 255, 255, 50, 50, 255, 255, 6, 6, 255, 255, 6, 6, 255, 255, 6, 6, 255, 255, 30, 30, 255, 250, 144, 144, 255, 255, 248, 248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 243, 243, 255, 255, 9, 9, 255, 252, 6, 6, 254, 255, 0, 0, 5, 0, 0, 0, 0, 102, 102, 157, 86, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 172, 172, 221, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 216, 216, 255, 253, 108, 108, 128, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 166, 90, 128, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 172, 101, 137, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 223, 207, 126, 255, 224, 209, 133, 255, 224, 209, 133, 255, 224, 208, 130, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 222, 205, 122, 255, 224, 209, 133, 255, 224, 209, 133, 255, 224, 209, 133, 255, 224, 209, 133, 255, 224, 209, 133, 255, 224, 209, 133, 255, 224, 209, 133, 255, 224, 209, 133, 255, 222, 205, 122, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 224, 208, 130, 255, 224, 209, 133, 255, 224, 209, 133, 255, 223, 207, 126, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 171, 71, 155, 255, 241, 224, 238, 255, 249, 242, 248, 255, 223, 185, 217, 255, 248, 239, 246, 255, 244, 231, 242, 255, 173, 74, 157, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 0, 0, 0, 0, 191, 191, 191, 15, 255, 255, 255, 204, 255, 255, 255, 255, 255, 255, 255, 234, 255, 255, 255, 106, 191, 191, 191, 10, 255, 255, 255, 0, 191, 191, 191, 0, 255, 255, 255, 31, 255, 255, 255, 150, 255, 255, 255, 253, 255, 255, 255, 255, 255, 255, 255, 133, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 1, 255, 255, 255, 162, 255, 255, 255, 255, 255, 255, 255, 250, 255, 255, 255, 142, 255, 255, 255, 33, 128, 128, 128, 0, 128, 128, 128, 0, 255, 255, 255, 37, 255, 255, 255, 148, 255, 255, 255, 251, 255, 255, 255, 255, 255, 255, 255, 152, 191, 191, 191, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 33, 255, 255, 255, 234, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 241, 255, 255, 255, 162, 255, 255, 255, 213, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 158, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 1, 255, 255, 255, 217, 255, 255, 255, 255, 255, 255, 255, 134, 191, 191, 191, 5, 191, 191, 191, 6, 255, 255, 255, 71, 255, 255, 255, 88, 255, 255, 255, 77, 255, 255, 255, 199, 255, 255, 255, 255, 255, 255, 255, 224, 191, 191, 191, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 32, 32, 222, 255, 255, 255, 255, 255, 255, 255, 255, 252, 252, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 252, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35, 35, 35, 225, 0, 0, 0, 0, 67, 1, 1, 0, 194, 4, 4, 236, 255, 6, 6, 255, 255, 6, 6, 255, 255, 6, 6, 255, 255, 27, 27, 255, 255, 142, 142, 255, 255, 246, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 247, 247, 247, 255, 255, 158, 158, 255, 255, 6, 6, 255, 199, 5, 5, 242, 81, 1, 1, 0, 0, 0, 0, 0, 102, 102, 157, 86, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 172, 172, 221, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 216, 216, 255, 253, 108, 108, 128, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 166, 90, 128, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 172, 101, 137, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 222, 205, 121, 255, 232, 220, 162, 255, 234, 223, 171, 255, 234, 223, 171, 255, 234, 223, 171, 255, 234, 223, 171, 255, 234, 223, 171, 255, 234, 223, 171, 255, 234, 223, 171, 255, 234, 223, 171, 255, 228, 215, 147, 255, 221, 204, 119, 255, 221, 204, 119, 255, 228, 214, 147, 255, 234, 223, 171, 255, 234, 223, 171, 255, 234, 223, 171, 255, 234, 223, 171, 255, 234, 223, 171, 255, 234, 223, 171, 255, 234, 223, 171, 255, 234, 223, 171, 255, 232, 220, 162, 255, 222, 205, 121, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 181, 92, 166, 255, 229, 198, 224, 255, 246, 236, 244, 255, 231, 202, 226, 255, 183, 97, 169, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 10, 255, 255, 255, 171, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 250, 255, 255, 255, 217, 255, 255, 255, 229, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 250, 255, 255, 255, 102, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 1, 255, 255, 255, 123, 255, 255, 255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 241, 255, 255, 255, 241, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 251, 255, 255, 255, 117, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 14, 255, 255, 255, 214, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 73, 64, 64, 64, 0, 0, 0, 0, 0, 255, 255, 255, 12, 255, 255, 255, 255, 255, 255, 255, 237, 191, 191, 191, 1, 0, 0, 0, 0, 64, 64, 64, 0, 191, 191, 191, 10, 255, 255, 255, 136, 255, 255, 255, 251, 255, 255, 255, 255, 255, 255, 255, 222, 255, 255, 255, 44, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 32, 32, 222, 255, 255, 255, 255, 102, 102, 102, 255, 17, 17, 17, 255, 222, 222, 222, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 210, 210, 210, 255, 14, 14, 14, 255, 117, 117, 117, 255, 255, 255, 255, 255, 35, 35, 35, 225, 0, 0, 0, 0, 2, 0, 0, 0, 93, 12, 12, 220, 255, 6, 6, 255, 255, 6, 6, 255, 150, 7, 7, 255, 219, 207, 207, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 209, 209, 209, 255, 38, 11, 11, 255, 236, 10, 10, 255, 255, 6, 6, 255, 102, 14, 14, 229, 4, 0, 0, 0, 0, 0, 0, 0, 102, 102, 157, 86, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 172, 172, 221, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 216, 216, 255, 253, 108, 108, 128, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 166, 90, 128, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 172, 101, 137, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 234, 223, 170, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 253, 252, 249, 255, 223, 208, 129, 255, 223, 207, 129, 255, 253, 253, 249, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 234, 223, 171, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 71, 255, 255, 255, 186, 255, 255, 255, 249, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 237, 255, 255, 255, 150, 255, 255, 255, 32, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 37, 255, 255, 255, 152, 255, 255, 255, 228, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 223, 255, 255, 255, 150, 255, 255, 255, 32, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 5, 255, 255, 255, 201, 255, 255, 255, 200, 255, 255, 255, 110, 255, 255, 255, 53, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 231, 255, 255, 255, 124, 255, 255, 255, 238, 255, 255, 255, 255, 255, 255, 255, 217, 191, 191, 191, 1, 0, 0, 0, 0, 191, 191, 191, 4, 255, 255, 255, 234, 255, 255, 255, 254, 255, 255, 255, 63, 128, 128, 128, 0, 255, 255, 255, 73, 255, 255, 255, 221, 255, 255, 255, 255, 255, 255, 255, 251, 255, 255, 255, 137, 191, 191, 191, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 214, 255, 255, 255, 255, 85, 85, 85, 255, 8, 8, 8, 255, 216, 216, 216, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 202, 202, 202, 255, 6, 6, 6, 255, 101, 101, 101, 255, 255, 255, 255, 255, 24, 24, 24, 217, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 218, 255, 77, 77, 255, 255, 6, 6, 255, 226, 5, 5, 255, 222, 159, 159, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 215, 157, 157, 255, 223, 5, 5, 255, 255, 6, 6, 255, 255, 71, 71, 255, 37, 36, 36, 227, 0, 0, 0, 0, 0, 0, 0, 0, 102, 102, 157, 86, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 172, 172, 221, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 216, 216, 255, 253, 108, 108, 128, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 166, 90, 128, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 240, 228, 234, 255, 238, 224, 231, 255, 255, 255, 255, 255, 255, 255, 255, 255, 172, 101, 137, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 236, 226, 178, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 227, 213, 142, 255, 226, 212, 141, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 236, 226, 179, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 191, 191, 191, 1, 255, 255, 255, 34, 255, 255, 255, 21, 128, 128, 128, 0, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 128, 128, 128, 0, 191, 191, 191, 10, 191, 191, 191, 11, 128, 128, 128, 0, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 5, 128, 128, 128, 0, 64, 64, 64, 0, 191, 191, 191, 0, 255, 255, 255, 234, 255, 255, 255, 255, 255, 255, 255, 148, 191, 191, 191, 0, 191, 191, 191, 14, 255, 255, 255, 125, 255, 255, 255, 72, 64, 64, 64, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 118, 255, 255, 255, 255, 255, 255, 255, 254, 255, 255, 255, 235, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 200, 255, 255, 255, 47, 64, 64, 64, 0, 0, 0, 0, 0, 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, 1, 1, 154, 187, 187, 187, 254, 255, 255, 255, 255, 242, 242, 242, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 242, 242, 242, 255, 255, 255, 255, 255, 190, 190, 190, 254, 1, 1, 1, 157, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 180, 223, 208, 208, 255, 255, 65, 65, 255, 255, 6, 6, 255, 255, 6, 6, 255, 255, 51, 51, 255, 255, 102, 102, 255, 255, 103, 103, 255, 255, 53, 53, 255, 255, 6, 6, 255, 255, 6, 6, 255, 255, 60, 60, 255, 227, 209, 209, 255, 5, 5, 5, 187, 0, 0, 0, 0, 0, 0, 0, 0, 102, 102, 157, 86, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 172, 172, 221, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 216, 216, 255, 253, 108, 108, 128, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 166, 90, 128, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 248, 242, 245, 255, 145, 51, 98, 255, 142, 46, 94, 255, 244, 235, 240, 255, 255, 255, 255, 255, 172, 101, 137, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 236, 226, 178, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 227, 213, 142, 255, 226, 212, 141, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 236, 226, 179, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 175, 79, 159, 255, 213, 163, 205, 255, 227, 193, 221, 255, 206, 148, 196, 255, 171, 70, 154, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 182, 255, 255, 255, 255, 255, 255, 255, 62, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 113, 255, 255, 255, 230, 255, 255, 255, 255, 255, 255, 255, 215, 255, 255, 255, 103, 191, 191, 191, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 7, 7, 7, 191, 86, 86, 86, 255, 102, 102, 102, 255, 102, 102, 102, 255, 102, 102, 102, 255, 102, 102, 102, 255, 102, 102, 102, 255, 102, 102, 102, 255, 102, 102, 102, 255, 102, 102, 102, 255, 86, 86, 86, 255, 7, 7, 7, 193, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 23, 23, 23, 223, 95, 89, 89, 255, 138, 18, 18, 255, 239, 6, 6, 255, 255, 6, 6, 255, 255, 6, 6, 255, 255, 6, 6, 255, 255, 6, 6, 255, 241, 6, 6, 255, 141, 17, 17, 255, 96, 88, 88, 255, 26, 26, 26, 226, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 102, 102, 157, 86, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 172, 172, 221, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 216, 216, 255, 253, 108, 108, 128, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 135, 33, 85, 255, 144, 50, 98, 255, 151, 62, 107, 255, 139, 40, 90, 255, 147, 54, 101, 255, 169, 94, 131, 255, 208, 168, 188, 255, 253, 251, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 196, 145, 170, 255, 137, 35, 86, 255, 138, 38, 88, 255, 189, 132, 161, 255, 255, 255, 255, 255, 172, 101, 137, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 233, 222, 167, 255, 255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 253, 251, 246, 255, 223, 207, 127, 255, 223, 207, 126, 255, 252, 251, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 253, 255, 233, 222, 168, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 172, 72, 155, 255, 239, 219, 235, 255, 254, 252, 253, 255, 243, 230, 241, 255, 255, 255, 255, 255, 222, 182, 215, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 34, 255, 255, 255, 76, 191, 191, 191, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 51, 0, 0, 0, 51, 0, 0, 0, 51, 0, 0, 0, 51, 0, 0, 0, 51, 0, 0, 0, 51, 0, 0, 0, 51, 0, 0, 0, 51, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 26, 0, 0, 0, 26, 44, 0, 0, 30, 211, 4, 4, 76, 242, 4, 4, 106, 243, 4, 4, 107, 213, 4, 4, 78, 48, 0, 0, 31, 0, 0, 0, 26, 0, 0, 0, 26, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 102, 157, 86, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 172, 172, 221, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 216, 216, 255, 253, 108, 108, 128, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 135, 33, 85, 255, 136, 34, 85, 255, 144, 50, 97, 255, 177, 110, 144, 255, 192, 137, 164, 255, 182, 120, 151, 255, 155, 70, 112, 255, 136, 34, 85, 255, 154, 67, 110, 255, 234, 216, 225, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 247, 241, 244, 255, 144, 48, 96, 255, 175, 106, 140, 255, 182, 121, 152, 255, 140, 42, 91, 255, 243, 233, 238, 255, 172, 101, 137, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 229, 215, 150, 255, 232, 221, 165, 255, 232, 221, 165, 255, 232, 221, 165, 255, 232, 221, 165, 255, 232, 221, 165, 255, 232, 221, 165, 255, 232, 221, 165, 255, 232, 221, 165, 255, 225, 210, 135, 255, 221, 204, 119, 255, 221, 204, 119, 255, 225, 210, 135, 255, 232, 221, 165, 255, 232, 221, 165, 255, 232, 221, 165, 255, 232, 221, 165, 255, 232, 221, 165, 255, 232, 221, 165, 255, 232, 221, 165, 255, 232, 221, 165, 255, 229, 215, 150, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 179, 88, 164, 255, 227, 194, 221, 255, 230, 199, 224, 255, 230, 199, 224, 255, 235, 210, 230, 255, 255, 255, 255, 255, 199, 132, 188, 255, 170, 68, 153, 255, 218, 174, 211, 255, 255, 254, 254, 255, 230, 199, 224, 255, 230, 199, 224, 255, 230, 199, 224, 255, 230, 199, 224, 255, 230, 199, 224, 255, 230, 199, 224, 255, 230, 199, 224, 255, 230, 199, 224, 255, 230, 199, 224, 255, 230, 199, 224, 255, 230, 199, 224, 255, 230, 199, 224, 255, 227, 193, 221, 255, 178, 87, 163, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 102, 157, 86, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 171, 171, 220, 254, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 216, 216, 255, 253, 108, 108, 128, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 137, 37, 87, 255, 197, 147, 172, 255, 251, 247, 249, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 222, 193, 208, 255, 149, 58, 104, 255, 142, 46, 94, 255, 235, 217, 226, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 195, 144, 170, 255, 137, 36, 86, 255, 234, 217, 226, 255, 240, 228, 234, 255, 139, 39, 89, 255, 187, 128, 158, 255, 172, 101, 137, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 225, 210, 135, 255, 230, 217, 154, 255, 230, 217, 154, 255, 229, 217, 153, 255, 222, 206, 123, 255, 221, 204, 119, 255, 221, 204, 119, 255, 225, 210, 134, 255, 230, 217, 154, 255, 230, 217, 154, 255, 230, 217, 154, 255, 230, 217, 154, 255, 230, 217, 154, 255, 230, 217, 154, 255, 230, 217, 154, 255, 230, 217, 154, 255, 225, 210, 135, 255, 221, 204, 119, 255, 221, 204, 119, 255, 222, 206, 123, 255, 229, 217, 153, 255, 230, 217, 154, 255, 230, 217, 154, 255, 225, 210, 136, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 183, 97, 169, 255, 236, 212, 232, 255, 238, 218, 235, 255, 238, 218, 235, 255, 242, 226, 239, 255, 255, 255, 255, 255, 195, 123, 183, 255, 170, 68, 153, 255, 214, 164, 206, 255, 255, 255, 255, 255, 238, 218, 235, 255, 238, 218, 235, 255, 238, 218, 235, 255, 238, 218, 235, 255, 238, 218, 235, 255, 238, 218, 235, 255, 238, 218, 235, 255, 238, 218, 235, 255, 238, 218, 235, 255, 238, 218, 235, 255, 238, 218, 235, 255, 238, 218, 235, 255, 235, 212, 231, 255, 183, 96, 168, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 0, 0, 0, 0, 191, 191, 191, 7, 255, 255, 255, 128, 255, 255, 255, 119, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 143, 255, 255, 255, 124, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 95, 0, 0, 0, 149, 0, 0, 0, 175, 0, 0, 0, 201, 0, 0, 0, 201, 0, 0, 0, 175, 0, 0, 0, 149, 0, 0, 0, 97, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 102, 157, 86, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 170, 170, 220, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 207, 207, 249, 204, 99, 99, 121, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 35, 86, 255, 214, 179, 196, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 242, 232, 237, 255, 149, 58, 104, 255, 154, 68, 111, 255, 253, 251, 252, 255, 255, 255, 255, 255, 247, 240, 244, 255, 143, 47, 95, 255, 176, 109, 143, 255, 255, 255, 255, 255, 255, 255, 255, 255, 184, 124, 155, 255, 140, 41, 90, 255, 164, 86, 125, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 236, 226, 179, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 247, 244, 226, 255, 221, 204, 119, 255, 227, 213, 144, 255, 254, 253, 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 253, 250, 255, 227, 214, 145, 255, 221, 204, 119, 255, 247, 244, 226, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 236, 227, 180, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 173, 75, 157, 255, 243, 228, 240, 255, 251, 247, 251, 255, 236, 212, 232, 255, 254, 254, 254, 255, 227, 194, 222, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 0, 0, 0, 0, 255, 255, 255, 12, 255, 255, 255, 255, 255, 255, 255, 241, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 133, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 114, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 12, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 1, 1, 1, 190, 56, 56, 56, 252, 135, 135, 135, 255, 197, 197, 197, 255, 223, 223, 223, 255, 249, 249, 249, 255, 249, 249, 249, 255, 223, 223, 223, 255, 197, 197, 197, 255, 137, 137, 137, 255, 58, 58, 58, 252, 1, 1, 1, 192, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 102, 157, 86, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 170, 170, 220, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 198, 198, 243, 86, 0, 0, 0, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 180, 116, 148, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 221, 192, 207, 255, 136, 34, 85, 255, 209, 170, 190, 255, 255, 255, 255, 255, 194, 143, 169, 255, 137, 36, 87, 255, 236, 219, 227, 255, 255, 255, 255, 255, 255, 255, 255, 255, 241, 230, 236, 255, 139, 40, 90, 255, 137, 37, 87, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 236, 226, 178, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 251, 244, 255, 221, 204, 119, 255, 233, 223, 169, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 233, 223, 169, 255, 221, 204, 119, 255, 252, 251, 244, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 236, 227, 179, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 179, 87, 164, 255, 221, 181, 214, 255, 234, 210, 230, 255, 214, 165, 206, 255, 173, 75, 157, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 0, 0, 0, 0, 255, 255, 255, 10, 255, 255, 255, 255, 255, 255, 255, 243, 191, 191, 191, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 124, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 105, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 15, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 1, 1, 1, 184, 89, 89, 89, 255, 221, 221, 221, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 224, 224, 224, 255, 92, 92, 92, 255, 2, 2, 2, 187, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 102, 157, 86, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 170, 170, 220, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 208, 208, 249, 221, 99, 99, 121, 0, 0, 0, 0, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 233, 214, 223, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 155, 69, 112, 255, 149, 58, 103, 255, 171, 100, 136, 255, 140, 42, 91, 255, 178, 112, 146, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 186, 127, 157, 255, 136, 34, 85, 255, 135, 33, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 236, 226, 178, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 251, 244, 255, 221, 204, 119, 255, 233, 223, 169, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 233, 223, 169, 255, 221, 204, 119, 255, 252, 251, 244, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 236, 227, 179, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 0, 0, 0, 0, 255, 255, 255, 7, 255, 255, 255, 255, 255, 255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 114, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 255, 255, 255, 96, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 78, 38, 38, 38, 242, 203, 203, 203, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 206, 206, 206, 255, 41, 41, 41, 244, 1, 1, 1, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 102, 157, 86, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 170, 170, 220, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 126, 126, 248, 101, 0, 0, 64, 0, 0, 0, 0, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 142, 46, 94, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 183, 121, 152, 255, 136, 34, 85, 255, 135, 33, 85, 255, 138, 37, 87, 255, 237, 222, 230, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 243, 232, 238, 255, 140, 41, 91, 255, 135, 33, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 236, 226, 178, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 251, 249, 238, 255, 221, 204, 119, 255, 230, 217, 154, 255, 255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 254, 255, 230, 217, 155, 255, 221, 204, 119, 255, 251, 249, 238, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 236, 227, 179, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 0, 0, 0, 0, 255, 255, 255, 5, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 105, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 253, 255, 255, 255, 88, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 23, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 15, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 67, 67, 67, 252, 238, 238, 238, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 207, 207, 207, 255, 132, 132, 132, 255, 202, 202, 202, 255, 255, 255, 255, 255, 255, 255, 255, 255, 205, 205, 205, 255, 130, 130, 130, 255, 205, 205, 205, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 240, 240, 240, 255, 71, 71, 71, 252, 0, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 102, 157, 86, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 170, 170, 220, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 210, 210, 251, 233, 115, 115, 167, 2, 0, 0, 0, 0, 0, 0, 0, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 148, 57, 103, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 189, 133, 161, 255, 136, 34, 85, 255, 136, 34, 85, 255, 180, 116, 148, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 188, 131, 160, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 228, 215, 147, 255, 235, 225, 176, 255, 235, 225, 176, 255, 235, 225, 175, 255, 227, 213, 144, 255, 221, 204, 119, 255, 221, 204, 119, 255, 232, 220, 162, 255, 235, 225, 176, 255, 235, 225, 176, 255, 235, 225, 176, 255, 235, 225, 176, 255, 235, 225, 176, 255, 235, 225, 176, 255, 235, 225, 176, 255, 235, 225, 176, 255, 232, 220, 162, 255, 221, 204, 119, 255, 221, 204, 119, 255, 227, 213, 143, 255, 235, 225, 175, 255, 235, 225, 176, 255, 235, 225, 176, 255, 228, 215, 148, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 204, 142, 194, 255, 239, 219, 235, 255, 239, 219, 235, 255, 204, 143, 194, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 255, 255, 255, 255, 251, 191, 191, 191, 0, 191, 191, 191, 0, 255, 255, 255, 134, 255, 255, 255, 255, 255, 255, 255, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 96, 255, 255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 251, 255, 255, 255, 80, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 27, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 24, 255, 255, 255, 34, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 70, 255, 255, 255, 189, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 71, 71, 71, 253, 251, 251, 251, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 187, 187, 187, 255, 55, 55, 55, 251, 0, 0, 0, 170, 0, 0, 0, 182, 175, 175, 175, 255, 255, 255, 255, 255, 255, 255, 255, 255, 180, 180, 180, 255, 0, 0, 0, 184, 0, 0, 0, 167, 52, 52, 52, 250, 183, 183, 183, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 252, 252, 255, 75, 75, 75, 253, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 102, 157, 86, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 170, 170, 220, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 196, 196, 241, 116, 46, 46, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 135, 33, 85, 255, 138, 38, 88, 255, 251, 248, 249, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 175, 107, 141, 255, 136, 34, 85, 255, 138, 38, 88, 255, 239, 224, 232, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 244, 234, 239, 255, 141, 43, 92, 255, 135, 33, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 199, 131, 188, 255, 255, 255, 255, 255, 236, 213, 232, 255, 236, 213, 232, 255, 255, 255, 255, 255, 199, 132, 188, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 255, 255, 255, 255, 253, 128, 128, 128, 0, 128, 128, 128, 0, 255, 255, 255, 133, 255, 255, 255, 255, 255, 255, 255, 120, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 51, 255, 255, 255, 202, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 219, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 215, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 198, 255, 255, 255, 40, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 22, 255, 255, 255, 51, 255, 255, 255, 51, 255, 255, 255, 51, 255, 255, 255, 75, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 120, 255, 255, 255, 51, 255, 255, 255, 51, 255, 255, 255, 51, 255, 255, 255, 33, 64, 64, 64, 0, 0, 0, 0, 0, 255, 255, 255, 90, 255, 255, 255, 254, 255, 255, 255, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 77, 255, 255, 255, 248, 255, 255, 255, 249, 191, 191, 191, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 39, 39, 39, 243, 239, 239, 239, 255, 255, 255, 255, 255, 255, 255, 255, 255, 250, 250, 250, 255, 103, 103, 103, 255, 0, 0, 0, 176, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 125, 175, 175, 175, 255, 255, 255, 255, 255, 255, 255, 255, 255, 180, 180, 180, 255, 0, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 172, 97, 97, 97, 255, 249, 249, 249, 255, 255, 255, 255, 255, 255, 255, 255, 255, 242, 242, 242, 255, 42, 42, 42, 244, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 102, 157, 86, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 170, 170, 220, 255, 215, 215, 255, 255, 215, 215, 255, 255, 211, 211, 252, 242, 147, 147, 176, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 217, 184, 201, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 250, 246, 248, 255, 144, 48, 96, 255, 135, 33, 85, 255, 182, 119, 151, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 190, 134, 162, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 229, 217, 153, 255, 252, 251, 244, 255, 253, 252, 247, 255, 253, 252, 247, 255, 253, 252, 247, 255, 253, 252, 247, 255, 253, 252, 247, 255, 253, 252, 247, 255, 253, 252, 247, 255, 253, 252, 247, 255, 248, 245, 229, 255, 222, 205, 122, 255, 222, 205, 122, 255, 248, 245, 229, 255, 253, 252, 247, 255, 253, 252, 247, 255, 253, 252, 247, 255, 253, 252, 247, 255, 253, 252, 247, 255, 253, 252, 247, 255, 253, 252, 247, 255, 253, 252, 247, 255, 252, 251, 244, 255, 230, 217, 153, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 187, 104, 173, 255, 244, 231, 242, 255, 247, 236, 245, 255, 247, 236, 245, 255, 247, 236, 245, 255, 247, 236, 245, 255, 247, 236, 245, 255, 247, 236, 245, 255, 247, 236, 245, 255, 252, 248, 251, 255, 243, 229, 241, 255, 171, 70, 154, 255, 171, 69, 154, 255, 243, 228, 240, 255, 252, 248, 251, 255, 247, 236, 245, 255, 247, 236, 245, 255, 247, 236, 245, 255, 247, 236, 245, 255, 247, 236, 245, 255, 247, 236, 245, 255, 247, 236, 245, 255, 244, 230, 241, 255, 186, 103, 172, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 252, 255, 255, 255, 255, 191, 191, 191, 1, 128, 128, 128, 0, 255, 255, 255, 131, 255, 255, 255, 255, 255, 255, 255, 242, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 155, 128, 128, 128, 0, 0, 0, 0, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 255, 255, 255, 73, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 54, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 14, 255, 255, 255, 201, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 232, 255, 255, 255, 40, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 126, 255, 255, 255, 255, 255, 255, 255, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 84, 255, 255, 255, 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 191, 210, 210, 210, 255, 255, 255, 255, 255, 255, 255, 255, 255, 249, 249, 249, 255, 70, 70, 70, 252, 0, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, 175, 175, 175, 255, 255, 255, 255, 255, 255, 255, 255, 255, 180, 180, 180, 255, 0, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 65, 65, 65, 251, 248, 248, 248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 214, 214, 214, 255, 3, 3, 3, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 102, 157, 86, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 170, 170, 220, 255, 215, 215, 255, 255, 215, 215, 255, 255, 201, 201, 244, 131, 48, 48, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 157, 73, 115, 255, 252, 249, 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 194, 143, 169, 255, 136, 34, 85, 255, 136, 34, 85, 255, 204, 160, 182, 255, 219, 189, 204, 255, 219, 189, 204, 255, 219, 189, 204, 255, 219, 189, 204, 255, 219, 189, 204, 255, 219, 189, 204, 255, 219, 189, 204, 255, 219, 189, 204, 255, 209, 170, 190, 255, 136, 34, 85, 255, 135, 33, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 236, 226, 178, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 227, 212, 142, 255, 226, 212, 141, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 236, 226, 179, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 176, 80, 160, 255, 219, 175, 211, 255, 221, 180, 214, 255, 221, 180, 214, 255, 221, 180, 214, 255, 221, 180, 214, 255, 221, 180, 214, 255, 221, 180, 214, 255, 221, 180, 214, 255, 241, 223, 238, 255, 249, 241, 248, 255, 178, 86, 163, 255, 178, 86, 163, 255, 249, 241, 247, 255, 241, 223, 238, 255, 221, 180, 214, 255, 221, 180, 214, 255, 221, 180, 214, 255, 221, 180, 214, 255, 221, 180, 214, 255, 221, 180, 214, 255, 221, 180, 214, 255, 218, 174, 211, 255, 175, 79, 159, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 250, 255, 255, 255, 255, 255, 255, 255, 3, 128, 128, 128, 0, 255, 255, 255, 130, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 173, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 69, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 17, 255, 255, 255, 208, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 236, 255, 255, 255, 46, 64, 64, 64, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 119, 255, 255, 255, 255, 255, 255, 255, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 12, 255, 255, 255, 139, 255, 255, 255, 255, 255, 255, 255, 236, 255, 255, 255, 119, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 74, 96, 96, 96, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 99, 99, 99, 255, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, 105, 105, 105, 255, 153, 153, 153, 255, 153, 153, 153, 255, 108, 108, 108, 255, 0, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 93, 93, 93, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 101, 101, 101, 254, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 161, 78, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 170, 170, 220, 255, 215, 215, 255, 255, 212, 212, 253, 248, 145, 145, 179, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 135, 33, 85, 255, 136, 34, 85, 255, 175, 107, 141, 255, 252, 249, 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 212, 175, 193, 255, 137, 36, 87, 255, 135, 33, 84, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 135, 33, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 236, 226, 178, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 227, 213, 142, 255, 226, 212, 141, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 236, 226, 179, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 185, 101, 171, 255, 252, 248, 251, 255, 253, 251, 253, 255, 253, 251, 253, 255, 252, 248, 251, 255, 185, 102, 171, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 247, 255, 255, 255, 255, 255, 255, 255, 6, 128, 128, 128, 0, 255, 255, 255, 130, 255, 255, 255, 255, 255, 255, 255, 136, 255, 255, 255, 26, 255, 255, 255, 26, 255, 255, 255, 26, 255, 255, 255, 26, 255, 255, 255, 26, 255, 255, 255, 17, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 65, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 21, 255, 255, 255, 213, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 240, 255, 255, 255, 51, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 79, 255, 255, 255, 255, 255, 255, 255, 99, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 178, 255, 255, 255, 246, 255, 255, 255, 17, 255, 255, 255, 17, 64, 64, 64, 0, 0, 0, 0, 0, 5, 5, 5, 199, 226, 226, 226, 255, 255, 255, 255, 255, 255, 255, 255, 255, 182, 182, 182, 254, 1, 1, 1, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 102, 0, 0, 0, 102, 0, 0, 0, 102, 0, 0, 0, 102, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 176, 176, 176, 254, 255, 255, 255, 255, 255, 255, 255, 255, 229, 229, 229, 255, 7, 7, 7, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 41, 0, 109, 109, 148, 22, 146, 146, 200, 98, 141, 141, 195, 135, 140, 140, 196, 207, 136, 136, 193, 250, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 170, 170, 220, 255, 215, 215, 255, 255, 205, 205, 247, 147, 49, 49, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 156, 72, 114, 255, 216, 182, 199, 255, 251, 247, 249, 255, 255, 255, 255, 255, 255, 255, 255, 255, 230, 209, 220, 255, 178, 112, 145, 255, 136, 34, 85, 255, 135, 33, 84, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 235, 225, 175, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 254, 251, 255, 225, 210, 135, 255, 224, 209, 134, 255, 254, 254, 251, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 235, 225, 176, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 183, 95, 168, 255, 214, 164, 205, 255, 214, 164, 205, 255, 183, 95, 168, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 245, 255, 255, 255, 255, 255, 255, 255, 8, 128, 128, 128, 0, 255, 255, 255, 131, 255, 255, 255, 255, 255, 255, 255, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 61, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 25, 255, 255, 255, 219, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 243, 255, 255, 255, 58, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 4, 255, 255, 255, 219, 255, 255, 255, 244, 255, 255, 255, 90, 191, 191, 191, 1, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 191, 191, 191, 11, 255, 255, 255, 137, 255, 255, 255, 255, 255, 255, 255, 152, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 69, 69, 69, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 48, 48, 48, 247, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 42, 42, 42, 245, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 74, 74, 74, 255, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 37, 50, 0, 73, 73, 101, 0, 71, 71, 98, 0, 149, 149, 200, 58, 142, 142, 197, 115, 140, 140, 193, 162, 139, 139, 195, 232, 135, 135, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 170, 170, 220, 255, 213, 213, 254, 253, 149, 149, 181, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 135, 33, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 148, 56, 102, 255, 140, 41, 91, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 224, 208, 130, 255, 238, 229, 187, 255, 241, 235, 201, 255, 241, 235, 201, 255, 241, 235, 201, 255, 241, 235, 201, 255, 241, 235, 201, 255, 241, 235, 201, 255, 241, 235, 201, 255, 241, 235, 201, 255, 234, 223, 171, 255, 221, 204, 119, 255, 221, 204, 119, 255, 234, 223, 171, 255, 241, 235, 201, 255, 241, 235, 201, 255, 241, 235, 201, 255, 241, 235, 201, 255, 241, 235, 201, 255, 241, 235, 201, 255, 241, 235, 201, 255, 241, 235, 201, 255, 238, 230, 187, 255, 224, 208, 130, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 255, 255, 255, 255, 253, 253, 254, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 242, 255, 255, 255, 255, 255, 255, 255, 11, 128, 128, 128, 0, 255, 255, 255, 133, 255, 255, 255, 255, 255, 255, 255, 174, 255, 255, 255, 102, 255, 255, 255, 102, 255, 255, 255, 102, 255, 255, 255, 102, 191, 191, 191, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 58, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 30, 255, 255, 255, 224, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 246, 255, 255, 255, 65, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 38, 255, 255, 255, 221, 255, 255, 255, 255, 255, 255, 255, 230, 255, 255, 255, 178, 255, 255, 255, 153, 255, 255, 255, 147, 255, 255, 255, 176, 255, 255, 255, 238, 255, 255, 255, 255, 255, 255, 255, 187, 191, 191, 191, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 147, 147, 147, 255, 255, 255, 255, 255, 255, 255, 255, 255, 196, 196, 196, 255, 0, 0, 0, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 154, 190, 190, 190, 255, 255, 255, 255, 255, 255, 255, 255, 255, 152, 152, 152, 255, 0, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 73, 98, 0, 72, 72, 100, 0, 111, 111, 149, 15, 146, 146, 201, 88, 127, 127, 175, 126, 141, 141, 196, 198, 137, 137, 194, 247, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 170, 170, 220, 255, 194, 194, 238, 163, 88, 88, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 240, 255, 255, 255, 255, 255, 255, 255, 13, 128, 128, 128, 0, 255, 255, 255, 134, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 54, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 35, 255, 255, 255, 229, 255, 255, 255, 249, 255, 255, 255, 72, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 191, 191, 191, 8, 255, 255, 255, 100, 255, 255, 255, 178, 255, 255, 255, 212, 255, 255, 255, 239, 255, 255, 255, 251, 255, 255, 255, 223, 255, 255, 255, 189, 255, 255, 255, 85, 191, 191, 191, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 166, 215, 215, 215, 255, 255, 255, 255, 255, 255, 255, 255, 255, 121, 121, 121, 254, 0, 0, 0, 139, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 102, 0, 0, 0, 102, 0, 0, 0, 102, 0, 0, 0, 102, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 135, 116, 116, 116, 255, 255, 255, 255, 255, 255, 255, 255, 255, 220, 220, 220, 255, 0, 0, 0, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 36, 0, 74, 74, 100, 0, 71, 71, 98, 0, 147, 147, 200, 47, 143, 143, 198, 110, 140, 140, 194, 150, 140, 140, 195, 225, 135, 135, 192, 254, 134, 134, 191, 255, 134, 134, 191, 255, 169, 169, 219, 254, 172, 172, 233, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 143, 255, 255, 255, 153, 255, 255, 255, 9, 128, 128, 128, 0, 255, 255, 255, 81, 255, 255, 255, 153, 255, 255, 255, 153, 255, 255, 255, 153, 255, 255, 255, 153, 255, 255, 255, 153, 255, 255, 255, 153, 255, 255, 255, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 36, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 40, 255, 255, 255, 77, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 244, 244, 244, 255, 255, 255, 255, 255, 255, 255, 255, 255, 162, 162, 162, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 60, 60, 60, 255, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 111, 111, 111, 255, 153, 153, 153, 255, 153, 153, 153, 255, 114, 114, 114, 255, 0, 0, 0, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 58, 58, 58, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 160, 160, 160, 255, 255, 255, 255, 255, 255, 255, 255, 255, 248, 248, 248, 255, 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 38, 50, 0, 73, 73, 100, 0, 110, 110, 148, 9, 147, 147, 201, 80, 140, 140, 195, 122, 156, 156, 207, 130, 81, 81, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 128, 128, 128, 0, 64, 64, 64, 0, 0, 0, 0, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, 215, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 120, 120, 120, 255, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 185, 185, 185, 255, 255, 255, 255, 255, 255, 255, 255, 255, 190, 190, 190, 255, 0, 0, 0, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 115, 115, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15, 15, 15, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 76, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 17, 43, 0, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 255, 136, 34, 85, 253, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 221, 204, 119, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 255, 51, 34, 136, 253, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 255, 170, 68, 153, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 26, 0, 0, 0, 26, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 54, 0, 0, 0, 85, 0, 0, 0, 84, 0, 0, 0, 51, 0, 0, 0, 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, 16, 16, 33, 0, 48, 48, 100, 25, 103, 103, 172, 107, 102, 102, 147, 18, 68, 68, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 22, 22, 226, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 120, 120, 120, 255, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 185, 185, 185, 255, 255, 255, 255, 255, 255, 255, 255, 255, 190, 190, 190, 255, 0, 0, 0, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 115, 115, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 27, 27, 27, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 60, 26, 0, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 222, 77, 77, 77, 255, 77, 77, 77, 255, 7, 7, 7, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 120, 22, 22, 22, 233, 97, 97, 97, 255, 132, 132, 132, 254, 131, 131, 131, 255, 93, 93, 93, 255, 19, 19, 19, 229, 0, 0, 0, 112, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 33, 0, 46, 46, 98, 23, 69, 69, 143, 146, 75, 75, 156, 250, 77, 77, 159, 255, 85, 85, 164, 251, 109, 109, 179, 167, 134, 134, 195, 69, 65, 65, 96, 0, 34, 34, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 203, 251, 251, 251, 255, 255, 255, 255, 255, 255, 255, 255, 255, 236, 236, 236, 255, 230, 230, 230, 255, 230, 230, 230, 255, 230, 230, 230, 255, 108, 108, 108, 255, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 167, 167, 167, 255, 230, 230, 230, 255, 230, 230, 230, 255, 171, 171, 171, 255, 0, 0, 0, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 104, 104, 104, 255, 230, 230, 230, 255, 230, 230, 230, 255, 230, 230, 230, 255, 235, 235, 235, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 254, 254, 255, 4, 4, 4, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 64, 0, 20, 1, 128, 0, 15, 1, 128, 0, 20, 0, 255, 13, 39, 3, 255, 60, 39, 2, 255, 105, 34, 1, 255, 74, 15, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 60, 26, 0, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 23, 123, 56, 255, 98, 165, 120, 255, 98, 165, 120, 255, 23, 123, 56, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 221, 255, 255, 255, 255, 255, 255, 255, 255, 22, 22, 22, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 6, 6, 6, 202, 138, 138, 138, 255, 248, 248, 248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 245, 245, 245, 255, 130, 130, 130, 255, 3, 3, 3, 194, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 96, 128, 0, 64, 192, 255, 40, 66, 191, 255, 77, 66, 191, 255, 70, 48, 143, 191, 17, 29, 92, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 32, 0, 49, 49, 99, 23, 70, 70, 143, 144, 76, 76, 155, 249, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 99, 99, 173, 224, 119, 119, 185, 118, 105, 105, 147, 18, 68, 68, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 179, 229, 229, 229, 255, 255, 255, 255, 255, 255, 255, 255, 255, 97, 97, 97, 255, 0, 0, 0, 202, 0, 0, 0, 179, 0, 0, 0, 179, 0, 0, 0, 179, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 0, 0, 0, 179, 0, 0, 0, 179, 0, 0, 0, 179, 0, 0, 0, 179, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 179, 0, 0, 0, 179, 0, 0, 0, 179, 0, 0, 0, 200, 91, 91, 91, 255, 255, 255, 255, 255, 255, 255, 255, 255, 234, 234, 234, 255, 0, 0, 0, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 2, 191, 24, 39, 2, 255, 133, 40, 3, 255, 178, 40, 4, 255, 223, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 255, 38, 2, 255, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 60, 26, 0, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 20, 121, 53, 255, 198, 222, 206, 255, 255, 255, 255, 255, 255, 255, 255, 255, 198, 222, 206, 255, 20, 121, 53, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 221, 255, 255, 255, 255, 255, 255, 255, 255, 22, 22, 22, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 6, 6, 6, 202, 189, 189, 189, 255, 255, 255, 255, 255, 231, 231, 231, 255, 121, 121, 121, 255, 71, 71, 71, 255, 74, 74, 74, 255, 125, 125, 125, 255, 235, 235, 235, 255, 255, 255, 255, 255, 178, 178, 178, 254, 4, 4, 4, 192, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 48, 64, 0, 64, 191, 255, 55, 66, 192, 255, 205, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 250, 62, 189, 255, 153, 46, 142, 191, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 58, 91, 6, 70, 70, 141, 141, 75, 75, 155, 249, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 84, 84, 164, 251, 112, 112, 179, 168, 139, 139, 171, 35, 0, 0, 0, 0, 0, 0, 0, 135, 176, 176, 176, 255, 255, 255, 255, 255, 255, 255, 255, 255, 167, 167, 167, 255, 0, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 161, 161, 161, 254, 255, 255, 255, 255, 255, 255, 255, 255, 181, 181, 181, 255, 0, 0, 0, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 191, 2, 40, 4, 255, 198, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 239, 35, 1, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 60, 26, 0, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 62, 145, 90, 255, 255, 255, 255, 255, 122, 179, 141, 255, 122, 179, 141, 255, 255, 255, 255, 255, 62, 145, 90, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 78, 175, 159, 255, 141, 203, 193, 255, 141, 203, 193, 255, 78, 175, 158, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 221, 255, 255, 255, 255, 255, 255, 255, 255, 22, 22, 22, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, 140, 140, 140, 255, 255, 255, 255, 255, 181, 181, 181, 254, 19, 19, 19, 226, 0, 0, 0, 89, 0, 0, 0, 26, 0, 0, 0, 29, 0, 0, 0, 94, 23, 23, 23, 231, 190, 190, 190, 254, 255, 255, 255, 255, 127, 127, 127, 255, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 45, 64, 0, 63, 186, 255, 68, 67, 193, 255, 248, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 66, 192, 255, 206, 49, 142, 191, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 91, 141, 28, 126, 126, 183, 255, 99, 99, 167, 255, 78, 78, 158, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 123, 123, 190, 255, 202, 202, 245, 255, 218, 218, 255, 99, 0, 0, 0, 0, 0, 0, 0, 56, 98, 98, 98, 255, 255, 255, 255, 255, 255, 255, 255, 255, 245, 245, 245, 255, 18, 18, 18, 226, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 15, 15, 15, 222, 242, 242, 242, 255, 255, 255, 255, 255, 255, 255, 255, 255, 102, 102, 102, 255, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 2, 255, 43, 40, 4, 255, 249, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 255, 38, 3, 255, 176, 19, 1, 255, 35, 4, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 60, 26, 0, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 45, 135, 75, 255, 253, 254, 253, 255, 185, 215, 195, 255, 185, 215, 195, 255, 253, 254, 253, 255, 45, 135, 75, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 70, 171, 154, 255, 141, 203, 193, 255, 238, 247, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255, 238, 247, 246, 255, 140, 203, 193, 255, 70, 171, 154, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 221, 255, 255, 255, 255, 255, 255, 255, 255, 22, 22, 22, 227, 0, 0, 0, 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, 25, 25, 25, 234, 249, 249, 249, 255, 231, 231, 231, 255, 18, 18, 18, 225, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 24, 24, 24, 232, 237, 237, 237, 255, 244, 244, 244, 255, 17, 17, 17, 224, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 48, 143, 191, 12, 66, 193, 255, 232, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 66, 192, 255, 144, 32, 96, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 91, 141, 28, 134, 134, 191, 255, 134, 134, 191, 255, 128, 128, 185, 255, 103, 103, 169, 255, 80, 80, 158, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 77, 77, 159, 255, 102, 102, 176, 255, 181, 181, 231, 255, 215, 215, 255, 255, 215, 215, 255, 255, 218, 218, 255, 99, 0, 0, 0, 0, 0, 0, 0, 2, 22, 22, 22, 231, 249, 249, 249, 255, 255, 255, 255, 255, 255, 255, 255, 255, 130, 130, 130, 255, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 26, 0, 0, 0, 26, 0, 0, 0, 26, 0, 0, 0, 26, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 123, 123, 123, 255, 255, 255, 255, 255, 255, 255, 255, 255, 251, 251, 251, 255, 25, 25, 25, 234, 0, 0, 0, 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, 9, 0, 64, 0, 39, 3, 255, 129, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 239, 36, 1, 255, 71, 9, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 60, 26, 0, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 122, 179, 141, 255, 251, 253, 251, 255, 251, 253, 251, 255, 122, 179, 141, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 159, 214, 241, 255, 160, 214, 241, 255, 158, 213, 241, 255, 140, 206, 239, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 113, 190, 178, 255, 219, 239, 235, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 219, 239, 235, 255, 113, 190, 178, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 0, 0, 0, 16, 7, 7, 7, 230, 26, 26, 26, 230, 26, 26, 26, 230, 26, 26, 26, 230, 26, 26, 26, 230, 43, 43, 43, 251, 255, 255, 255, 255, 255, 255, 255, 255, 46, 46, 46, 252, 26, 26, 26, 230, 26, 26, 26, 230, 26, 26, 26, 230, 26, 26, 26, 230, 7, 7, 7, 230, 0, 0, 0, 18, 0, 0, 0, 56, 101, 101, 101, 255, 255, 255, 255, 255, 119, 119, 119, 255, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 133, 133, 133, 254, 255, 255, 255, 255, 87, 87, 87, 255, 0, 0, 0, 43, 0, 0, 0, 0, 0, 32, 64, 0, 41, 167, 255, 96, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 244, 46, 141, 191, 9, 0, 0, 0, 0, 0, 0, 0, 0, 91, 91, 141, 28, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 130, 130, 187, 255, 106, 106, 170, 255, 86, 86, 162, 252, 77, 77, 159, 255, 86, 86, 165, 255, 159, 159, 216, 255, 215, 215, 254, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 218, 218, 255, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 147, 147, 147, 255, 255, 255, 255, 255, 255, 255, 255, 255, 248, 248, 248, 255, 42, 42, 42, 243, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, 53, 53, 53, 255, 77, 77, 77, 255, 77, 77, 77, 255, 54, 54, 54, 255, 0, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 37, 37, 37, 241, 246, 246, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255, 152, 152, 152, 255, 0, 0, 0, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 191, 7, 40, 3, 255, 214, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 246, 35, 1, 255, 56, 8, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 60, 26, 0, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 190, 218, 199, 255, 190, 218, 199, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 176, 221, 244, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 253, 254, 255, 255, 198, 231, 247, 255, 139, 205, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 91, 180, 165, 255, 192, 226, 220, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 226, 220, 255, 91, 180, 165, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 0, 0, 0, 18, 68, 68, 68, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 73, 73, 73, 255, 0, 0, 0, 20, 0, 0, 0, 89, 138, 138, 138, 254, 255, 255, 255, 255, 69, 69, 69, 255, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 83, 83, 83, 255, 255, 255, 255, 255, 126, 126, 126, 255, 0, 0, 0, 76, 0, 0, 0, 0, 31, 94, 128, 0, 64, 191, 255, 149, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 66, 192, 255, 51, 0, 0, 0, 0, 0, 0, 0, 0, 91, 91, 141, 28, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 135, 135, 192, 254, 136, 136, 194, 252, 208, 208, 249, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 218, 218, 255, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 22, 22, 22, 230, 243, 243, 243, 255, 255, 255, 255, 255, 255, 255, 255, 255, 218, 218, 218, 255, 19, 19, 19, 227, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, 175, 175, 175, 255, 255, 255, 255, 255, 255, 255, 255, 255, 180, 180, 180, 255, 0, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 17, 17, 17, 224, 215, 215, 215, 255, 255, 255, 255, 255, 255, 255, 255, 255, 245, 245, 245, 255, 25, 25, 25, 233, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 24, 1, 255, 59, 40, 4, 255, 254, 39, 3, 255, 192, 38, 2, 255, 80, 40, 3, 255, 221, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 222, 27, 0, 191, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 60, 26, 0, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 27, 124, 59, 255, 65, 146, 92, 255, 33, 128, 65, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 190, 218, 199, 255, 190, 218, 199, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 33, 128, 65, 255, 65, 146, 92, 255, 27, 124, 59, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 159, 214, 241, 255, 160, 214, 241, 255, 172, 219, 243, 255, 209, 235, 248, 255, 255, 255, 255, 255, 204, 233, 248, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 76, 174, 158, 255, 164, 214, 206, 255, 249, 252, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 249, 252, 252, 255, 164, 214, 205, 255, 76, 174, 157, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 0, 0, 0, 18, 68, 68, 68, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 73, 73, 73, 255, 0, 0, 0, 20, 0, 0, 0, 89, 138, 138, 138, 254, 255, 255, 255, 255, 68, 68, 68, 255, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 80, 80, 80, 255, 255, 255, 255, 255, 126, 126, 126, 255, 0, 0, 0, 76, 0, 0, 0, 0, 31, 96, 128, 0, 65, 192, 255, 156, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 66, 191, 255, 56, 0, 0, 0, 0, 0, 0, 0, 0, 91, 91, 141, 28, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 147, 147, 201, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 218, 218, 255, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 96, 96, 96, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 213, 213, 213, 255, 31, 31, 31, 238, 0, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, 175, 175, 175, 255, 255, 255, 255, 255, 255, 255, 255, 255, 180, 180, 180, 255, 0, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 28, 28, 28, 236, 209, 209, 209, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 102, 102, 102, 255, 0, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 128, 0, 29, 2, 255, 150, 35, 2, 255, 104, 8, 0, 64, 0, 28, 2, 191, 20, 40, 4, 255, 225, 40, 4, 255, 255, 40, 4, 255, 255, 38, 2, 255, 119, 9, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 60, 26, 0, 17, 119, 51, 255, 17, 119, 51, 255, 50, 138, 80, 255, 230, 241, 234, 255, 255, 255, 255, 255, 242, 247, 244, 255, 73, 151, 100, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 190, 218, 199, 255, 190, 218, 199, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 73, 151, 100, 255, 242, 247, 244, 255, 255, 255, 255, 255, 230, 241, 234, 255, 50, 138, 80, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 201, 232, 247, 255, 254, 255, 255, 255, 152, 211, 240, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 69, 170, 154, 255, 136, 201, 190, 255, 236, 246, 244, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 235, 246, 244, 255, 136, 201, 190, 255, 69, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 0, 0, 0, 16, 7, 7, 7, 230, 26, 26, 26, 230, 26, 26, 26, 230, 26, 26, 26, 230, 26, 26, 26, 230, 43, 43, 43, 251, 255, 255, 255, 255, 255, 255, 255, 255, 46, 46, 46, 252, 26, 26, 26, 230, 26, 26, 26, 230, 26, 26, 26, 230, 26, 26, 26, 230, 7, 7, 7, 230, 0, 0, 0, 18, 0, 0, 0, 56, 101, 101, 101, 255, 255, 255, 255, 255, 119, 119, 119, 255, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 131, 131, 131, 254, 255, 255, 255, 255, 88, 88, 88, 255, 0, 0, 0, 43, 0, 0, 0, 0, 15, 44, 64, 0, 63, 186, 255, 113, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 251, 59, 173, 255, 18, 0, 0, 0, 0, 0, 0, 0, 0, 91, 91, 141, 28, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 147, 147, 201, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 218, 218, 255, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, 143, 143, 143, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 238, 238, 238, 255, 97, 97, 97, 255, 2, 2, 2, 192, 0, 0, 0, 82, 0, 0, 0, 134, 175, 175, 175, 255, 255, 255, 255, 255, 255, 255, 255, 255, 180, 180, 180, 255, 0, 0, 0, 138, 0, 0, 0, 79, 1, 1, 1, 189, 94, 94, 94, 255, 236, 236, 236, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 148, 148, 148, 255, 0, 0, 0, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 3, 3, 0, 255, 11, 11, 20, 64, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 191, 14, 29, 2, 191, 19, 0, 0, 0, 0, 0, 0, 64, 0, 24, 2, 255, 87, 40, 4, 255, 255, 40, 4, 255, 255, 39, 4, 255, 221, 5, 0, 191, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 14, 14, 13, 191, 13, 13, 8, 0, 0, 0, 0, 9, 60, 26, 0, 17, 119, 51, 255, 17, 119, 51, 255, 158, 199, 171, 255, 242, 248, 244, 255, 97, 165, 120, 255, 224, 237, 228, 255, 191, 218, 200, 255, 51, 138, 80, 255, 178, 211, 189, 255, 184, 214, 194, 255, 184, 214, 194, 255, 169, 205, 181, 255, 22, 122, 55, 255, 51, 138, 80, 255, 178, 211, 189, 255, 235, 244, 238, 255, 235, 244, 238, 255, 169, 205, 181, 255, 22, 122, 55, 255, 51, 138, 80, 255, 178, 211, 189, 255, 184, 214, 194, 255, 184, 214, 194, 255, 169, 205, 181, 255, 22, 122, 55, 255, 191, 218, 200, 255, 224, 237, 228, 255, 97, 165, 120, 255, 242, 248, 244, 255, 157, 199, 171, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 157, 213, 241, 255, 255, 255, 255, 255, 176, 221, 244, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 84, 177, 162, 255, 191, 226, 220, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 190, 226, 220, 255, 84, 177, 161, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 221, 255, 255, 255, 255, 255, 255, 255, 255, 22, 22, 22, 227, 0, 0, 0, 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, 25, 25, 25, 235, 249, 249, 249, 255, 231, 231, 231, 255, 18, 18, 18, 225, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 24, 24, 24, 232, 237, 237, 237, 255, 244, 244, 244, 255, 16, 16, 16, 224, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 59, 172, 255, 26, 67, 193, 255, 246, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 66, 192, 255, 173, 31, 90, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 90, 142, 27, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 147, 147, 201, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 218, 218, 255, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 4, 4, 190, 154, 154, 154, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 219, 219, 219, 255, 116, 116, 116, 255, 44, 44, 44, 255, 175, 175, 175, 255, 255, 255, 255, 255, 255, 255, 255, 255, 180, 180, 180, 255, 42, 42, 42, 255, 115, 115, 115, 255, 217, 217, 217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 158, 158, 158, 255, 4, 4, 4, 194, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 10, 10, 17, 255, 21, 21, 236, 255, 18, 18, 85, 64, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 191, 4, 40, 4, 255, 246, 40, 4, 255, 255, 40, 4, 255, 255, 38, 3, 255, 51, 0, 0, 0, 0, 0, 0, 0, 0, 64, 5, 5, 0, 255, 20, 20, 46, 255, 21, 21, 217, 255, 20, 20, 86, 0, 0, 0, 0, 9, 60, 26, 0, 17, 119, 51, 255, 17, 119, 51, 255, 158, 199, 172, 255, 242, 248, 244, 255, 97, 165, 120, 255, 224, 237, 228, 255, 191, 219, 200, 255, 51, 138, 80, 255, 178, 211, 189, 255, 184, 214, 194, 255, 184, 214, 194, 255, 168, 205, 181, 255, 22, 122, 55, 255, 51, 138, 80, 255, 178, 211, 189, 255, 187, 216, 197, 255, 187, 216, 197, 255, 168, 205, 181, 255, 22, 122, 55, 255, 51, 138, 80, 255, 178, 211, 189, 255, 184, 214, 194, 255, 184, 214, 194, 255, 168, 205, 181, 255, 22, 122, 55, 255, 191, 219, 200, 255, 224, 237, 228, 255, 97, 165, 120, 255, 242, 248, 244, 255, 158, 199, 172, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 159, 214, 241, 255, 160, 214, 241, 255, 160, 214, 241, 255, 157, 213, 241, 255, 140, 206, 239, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 140, 206, 239, 255, 255, 255, 255, 255, 192, 228, 246, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 81, 176, 160, 255, 107, 188, 174, 255, 68, 170, 153, 255, 113, 190, 177, 255, 219, 239, 235, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 219, 239, 235, 255, 112, 190, 177, 255, 68, 170, 153, 255, 107, 188, 174, 255, 82, 176, 161, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 221, 255, 255, 255, 255, 255, 255, 255, 255, 22, 22, 22, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 139, 139, 139, 255, 255, 255, 255, 255, 182, 182, 182, 254, 19, 19, 19, 227, 0, 0, 0, 90, 0, 0, 0, 28, 0, 0, 0, 30, 0, 0, 0, 96, 23, 23, 23, 232, 191, 191, 191, 254, 255, 255, 255, 255, 127, 127, 127, 255, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 43, 64, 0, 65, 192, 255, 109, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 234, 49, 144, 191, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 43, 0, 145, 145, 199, 86, 139, 139, 194, 227, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 147, 147, 201, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 214, 214, 254, 255, 205, 205, 247, 160, 146, 146, 175, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 165, 111, 111, 111, 255, 252, 252, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 252, 252, 255, 116, 116, 116, 255, 0, 0, 0, 169, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 5, 5, 0, 255, 21, 21, 105, 255, 22, 22, 255, 255, 22, 22, 255, 255, 21, 21, 136, 191, 3, 3, 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, 19, 1, 128, 0, 39, 3, 255, 200, 40, 4, 255, 255, 40, 4, 255, 255, 24, 2, 255, 108, 0, 0, 64, 0, 128, 5, 5, 0, 255, 21, 21, 99, 255, 22, 22, 246, 255, 22, 22, 255, 255, 22, 22, 181, 128, 8, 8, 0, 9, 60, 26, 0, 17, 119, 51, 255, 17, 119, 51, 255, 51, 138, 80, 255, 230, 241, 234, 255, 255, 255, 255, 255, 242, 247, 244, 255, 73, 151, 100, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 73, 151, 100, 255, 242, 247, 244, 255, 255, 255, 255, 255, 230, 241, 234, 255, 50, 138, 80, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 176, 221, 244, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 240, 248, 253, 255, 156, 213, 241, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 237, 247, 252, 255, 221, 240, 250, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 161, 215, 242, 255, 214, 237, 249, 255, 145, 208, 239, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 96, 183, 168, 255, 254, 254, 254, 255, 184, 223, 216, 255, 86, 178, 163, 255, 70, 171, 154, 255, 142, 204, 193, 255, 239, 248, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 239, 248, 246, 255, 141, 203, 193, 255, 70, 171, 154, 255, 86, 178, 163, 255, 185, 223, 217, 255, 254, 255, 254, 255, 97, 183, 169, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 221, 255, 255, 255, 255, 255, 255, 255, 255, 22, 22, 22, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 6, 6, 6, 202, 188, 188, 188, 255, 255, 255, 255, 255, 232, 232, 232, 255, 123, 123, 123, 255, 73, 73, 73, 255, 76, 76, 76, 255, 127, 127, 127, 254, 236, 236, 236, 255, 255, 255, 255, 255, 177, 177, 177, 254, 4, 4, 4, 192, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 48, 64, 0, 65, 191, 255, 103, 67, 193, 255, 242, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 66, 193, 255, 206, 58, 172, 255, 40, 13, 38, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 103, 138, 4, 143, 143, 198, 120, 136, 136, 193, 245, 134, 134, 191, 255, 134, 134, 191, 255, 134, 134, 191, 255, 147, 147, 201, 255, 215, 215, 255, 255, 215, 215, 255, 255, 215, 215, 255, 255, 210, 210, 251, 230, 196, 196, 240, 71, 49, 49, 60, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 119, 43, 43, 43, 245, 179, 179, 179, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 182, 182, 182, 255, 45, 45, 45, 247, 0, 0, 0, 122, 0, 0, 0, 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, 128, 10, 10, 0, 255, 22, 22, 199, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 255, 255, 21, 21, 186, 191, 15, 15, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 1, 128, 0, 37, 3, 255, 153, 40, 4, 255, 255, 40, 4, 255, 255, 39, 2, 255, 151, 183, 10, 95, 10, 255, 16, 16, 161, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 251, 255, 10, 10, 24, 9, 60, 26, 0, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 27, 124, 59, 255, 65, 146, 92, 255, 33, 128, 65, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 33, 128, 65, 255, 65, 146, 92, 255, 27, 124, 59, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 159, 214, 241, 255, 160, 214, 241, 255, 160, 214, 241, 255, 175, 221, 244, 255, 243, 250, 253, 255, 226, 243, 251, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 195, 229, 246, 255, 254, 255, 255, 255, 162, 215, 242, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 156, 213, 241, 255, 250, 253, 254, 255, 233, 246, 252, 255, 145, 208, 239, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 96, 183, 168, 255, 255, 255, 255, 255, 255, 255, 255, 255, 246, 251, 250, 255, 155, 209, 200, 255, 73, 172, 156, 255, 79, 175, 159, 255, 171, 217, 209, 255, 251, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 251, 253, 253, 255, 171, 217, 209, 255, 79, 175, 159, 255, 73, 172, 156, 255, 156, 210, 201, 255, 246, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 97, 183, 169, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 221, 255, 255, 255, 255, 255, 255, 255, 255, 22, 22, 22, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 6, 6, 6, 201, 136, 136, 136, 255, 247, 247, 247, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 245, 245, 245, 255, 129, 129, 129, 255, 3, 3, 3, 193, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 48, 64, 0, 48, 143, 191, 18, 66, 192, 255, 96, 64, 187, 255, 131, 65, 190, 255, 124, 65, 192, 255, 66, 31, 138, 191, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, 50, 0, 111, 111, 150, 20, 142, 142, 197, 154, 135, 135, 192, 253, 134, 134, 191, 255, 147, 147, 201, 255, 215, 215, 255, 255, 214, 214, 254, 255, 205, 205, 247, 162, 144, 144, 180, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 159, 57, 57, 57, 252, 144, 144, 144, 255, 224, 224, 224, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 226, 226, 226, 255, 146, 146, 146, 255, 60, 60, 60, 253, 0, 0, 0, 162, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 18, 18, 39, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 255, 255, 21, 21, 214, 191, 16, 16, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 4, 255, 128, 40, 4, 255, 255, 40, 4, 255, 255, 64, 5, 228, 193, 255, 21, 21, 212, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 255, 255, 20, 20, 115, 72, 65, 31, 0, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 31, 127, 63, 255, 194, 220, 203, 255, 55, 140, 83, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 55, 141, 84, 255, 194, 220, 203, 255, 31, 127, 63, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 198, 230, 247, 255, 252, 254, 255, 255, 139, 205, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 142, 207, 239, 255, 239, 248, 253, 255, 243, 250, 253, 255, 157, 213, 241, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 166, 217, 242, 255, 250, 253, 254, 255, 233, 245, 252, 255, 145, 208, 239, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 96, 183, 168, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 229, 243, 241, 255, 125, 196, 184, 255, 68, 170, 153, 255, 97, 183, 168, 255, 201, 230, 225, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 200, 230, 225, 255, 96, 183, 168, 255, 68, 170, 153, 255, 126, 196, 185, 255, 229, 243, 241, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 97, 183, 169, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 222, 77, 77, 77, 255, 77, 77, 77, 255, 7, 7, 7, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 118, 20, 20, 20, 231, 93, 93, 93, 255, 130, 130, 130, 255, 129, 129, 129, 255, 89, 89, 89, 255, 18, 18, 18, 227, 0, 0, 0, 111, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 44, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 31, 44, 0, 125, 125, 177, 43, 139, 139, 195, 184, 147, 147, 200, 255, 210, 210, 251, 231, 196, 196, 243, 72, 48, 48, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 106, 0, 0, 0, 185, 30, 30, 30, 238, 57, 57, 57, 255, 83, 83, 83, 255, 84, 84, 84, 255, 58, 58, 58, 255, 32, 32, 32, 239, 0, 0, 0, 187, 0, 0, 0, 107, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 5, 5, 0, 255, 21, 21, 133, 255, 22, 22, 241, 255, 22, 22, 251, 255, 22, 22, 255, 255, 22, 22, 255, 255, 19, 19, 104, 191, 9, 9, 6, 64, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 4, 255, 128, 40, 4, 255, 255, 40, 4, 255, 255, 39, 3, 255, 188, 228, 16, 47, 32, 255, 21, 21, 192, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 251, 255, 22, 22, 210, 136, 67, 33, 0, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 57, 142, 85, 255, 248, 251, 249, 255, 98, 165, 120, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 98, 165, 120, 255, 248, 251, 249, 255, 57, 142, 85, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 168, 218, 243, 255, 255, 255, 255, 255, 206, 234, 248, 255, 163, 216, 242, 255, 161, 215, 241, 255, 172, 219, 243, 255, 174, 220, 243, 255, 174, 220, 243, 255, 193, 228, 246, 255, 250, 253, 254, 255, 253, 254, 255, 255, 209, 235, 248, 255, 190, 227, 246, 255, 188, 226, 245, 255, 187, 226, 245, 255, 187, 226, 245, 255, 187, 226, 245, 255, 215, 237, 249, 255, 254, 255, 255, 255, 233, 245, 252, 255, 145, 208, 239, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 96, 183, 168, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 204, 232, 227, 255, 99, 184, 170, 255, 68, 170, 153, 255, 122, 194, 182, 255, 226, 242, 239, 255, 226, 242, 239, 255, 121, 194, 182, 255, 68, 170, 153, 255, 100, 184, 170, 255, 205, 232, 228, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 97, 183, 169, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 61, 61, 22, 61, 61, 61, 26, 61, 61, 61, 26, 61, 61, 61, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 64, 64, 64, 0, 0, 0, 0, 2, 0, 0, 0, 50, 0, 0, 0, 83, 0, 0, 0, 81, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 72, 100, 0, 155, 155, 210, 63, 146, 146, 176, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 95, 58, 0, 98, 95, 60, 0, 98, 95, 60, 0, 98, 95, 60, 0, 98, 95, 60, 0, 98, 95, 60, 0, 98, 95, 60, 0, 98, 95, 60, 0, 98, 95, 60, 0, 98, 95, 60, 0, 45, 45, 26, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 35, 0, 0, 0, 36, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 5, 5, 0, 255, 20, 20, 29, 255, 9, 9, 2, 255, 21, 21, 156, 255, 22, 22, 255, 255, 22, 22, 255, 255, 20, 20, 193, 191, 12, 12, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 4, 255, 128, 40, 4, 255, 255, 40, 4, 255, 255, 39, 3, 255, 182, 210, 9, 61, 35, 255, 22, 22, 242, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 206, 255, 13, 13, 4, 255, 20, 20, 38, 166, 45, 19, 2, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 57, 142, 85, 255, 248, 251, 249, 255, 98, 165, 120, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 98, 165, 120, 255, 248, 251, 249, 255, 57, 142, 85, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 203, 233, 247, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 180, 223, 244, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 96, 183, 168, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 254, 254, 255, 174, 218, 211, 255, 81, 176, 160, 255, 70, 171, 154, 255, 69, 170, 153, 255, 81, 176, 160, 255, 175, 219, 212, 255, 252, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 97, 183, 169, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 61, 61, 0, 182, 182, 182, 15, 153, 153, 153, 102, 245, 245, 245, 171, 245, 245, 245, 202, 245, 245, 245, 201, 245, 245, 245, 171, 153, 153, 153, 101, 182, 182, 182, 15, 61, 61, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 83, 255, 255, 255, 79, 62, 62, 62, 0, 39, 39, 39, 0, 184, 184, 184, 30, 191, 191, 191, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 43, 64, 0, 42, 86, 128, 0, 80, 168, 255, 19, 88, 173, 255, 54, 87, 172, 255, 53, 80, 168, 255, 19, 40, 88, 121, 0, 21, 43, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 96, 58, 0, 194, 191, 118, 140, 196, 192, 120, 153, 196, 192, 120, 153, 196, 192, 120, 153, 196, 192, 120, 153, 196, 192, 120, 153, 196, 192, 120, 153, 196, 192, 120, 153, 196, 192, 120, 153, 195, 191, 120, 153, 188, 184, 112, 80, 48, 47, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 7, 191, 191, 191, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 16, 16, 18, 255, 21, 21, 215, 255, 22, 22, 255, 255, 22, 22, 255, 255, 21, 21, 214, 255, 20, 20, 76, 191, 3, 3, 3, 128, 10, 10, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 64, 0, 38, 3, 255, 131, 40, 4, 255, 255, 40, 4, 255, 255, 75, 6, 216, 210, 255, 22, 22, 229, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 245, 255, 11, 11, 52, 64, 0, 0, 0, 0, 0, 0, 0, 9, 60, 26, 0, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 56, 141, 85, 255, 248, 251, 249, 255, 97, 165, 120, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 97, 165, 120, 255, 248, 251, 249, 255, 56, 141, 85, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 163, 215, 242, 255, 252, 254, 255, 255, 231, 245, 252, 255, 182, 224, 244, 255, 174, 220, 243, 255, 174, 220, 243, 255, 183, 224, 244, 255, 245, 250, 253, 255, 255, 255, 255, 255, 222, 241, 250, 255, 192, 228, 246, 255, 189, 227, 245, 255, 187, 226, 245, 255, 187, 226, 245, 255, 187, 226, 245, 255, 214, 237, 249, 255, 254, 255, 255, 255, 233, 246, 252, 255, 146, 208, 239, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 96, 183, 168, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 241, 249, 247, 255, 96, 182, 168, 255, 94, 182, 167, 255, 241, 249, 248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 97, 183, 169, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 225, 167, 177, 255, 250, 239, 241, 255, 250, 239, 241, 255, 225, 167, 177, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 225, 167, 177, 255, 250, 239, 241, 255, 250, 239, 241, 255, 225, 167, 177, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 225, 167, 177, 255, 250, 239, 241, 255, 250, 239, 241, 255, 225, 167, 177, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 0, 0, 0, 0, 0, 0, 0, 0, 114, 114, 114, 0, 244, 244, 244, 102, 246, 246, 246, 233, 244, 244, 244, 167, 244, 244, 244, 92, 245, 245, 245, 55, 245, 245, 245, 55, 244, 244, 244, 92, 244, 244, 244, 168, 245, 245, 245, 232, 244, 244, 244, 100, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 199, 251, 251, 251, 247, 106, 106, 106, 180, 96, 96, 96, 179, 241, 241, 241, 234, 255, 255, 255, 202, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 21, 191, 0, 86, 172, 255, 84, 89, 174, 255, 201, 89, 174, 255, 255, 85, 179, 242, 255, 50, 226, 111, 255, 40, 240, 71, 255, 63, 208, 159, 203, 87, 171, 255, 83, 11, 21, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 97, 60, 0, 218, 219, 152, 252, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 239, 242, 181, 255, 204, 203, 132, 254, 193, 191, 119, 93, 49, 47, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 67, 255, 255, 255, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 14, 14, 26, 255, 20, 20, 197, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 255, 255, 21, 21, 230, 255, 21, 21, 172, 255, 13, 13, 117, 255, 20, 20, 63, 255, 20, 20, 42, 255, 20, 20, 26, 191, 14, 14, 10, 128, 10, 10, 0, 255, 19, 19, 20, 255, 21, 21, 34, 228, 17, 49, 51, 71, 5, 221, 187, 40, 4, 255, 255, 40, 4, 255, 255, 130, 11, 157, 255, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 236, 255, 17, 17, 67, 64, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 60, 26, 0, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 24, 123, 57, 255, 144, 192, 160, 255, 39, 132, 70, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 39, 132, 70, 255, 144, 192, 160, 255, 23, 123, 56, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 185, 225, 245, 255, 255, 255, 255, 255, 152, 211, 240, 255, 136, 204, 238, 255, 136, 204, 238, 255, 138, 205, 238, 255, 226, 243, 251, 255, 250, 253, 254, 255, 173, 220, 243, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 165, 216, 242, 255, 250, 253, 254, 255, 234, 246, 252, 255, 146, 208, 239, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 96, 183, 168, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 119, 193, 181, 255, 118, 193, 180, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 97, 183, 169, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 216, 137, 150, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 216, 137, 150, 255, 204, 102, 119, 255, 204, 102, 119, 255, 216, 137, 150, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 216, 137, 150, 255, 204, 102, 119, 255, 204, 102, 119, 255, 216, 137, 150, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 216, 137, 150, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 0, 0, 0, 0, 114, 114, 114, 0, 237, 237, 237, 144, 246, 246, 246, 209, 242, 242, 242, 41, 120, 120, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 120, 120, 0, 242, 242, 242, 42, 246, 246, 246, 210, 235, 235, 235, 142, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 168, 255, 255, 255, 255, 241, 241, 241, 217, 243, 243, 243, 221, 255, 255, 255, 255, 255, 255, 255, 152, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 96, 128, 0, 64, 191, 255, 31, 66, 191, 255, 71, 65, 192, 255, 61, 47, 144, 191, 11, 32, 96, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 128, 191, 9, 85, 171, 255, 170, 89, 174, 255, 255, 89, 174, 255, 255, 89, 174, 255, 255, 59, 215, 141, 255, 30, 255, 32, 255, 30, 255, 32, 255, 30, 255, 32, 255, 75, 192, 204, 255, 88, 173, 255, 168, 61, 128, 191, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 97, 60, 0, 218, 219, 152, 252, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 239, 242, 181, 255, 217, 218, 151, 255, 212, 212, 143, 254, 194, 190, 115, 87, 48, 48, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 137, 255, 255, 255, 143, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 11, 11, 5, 255, 20, 20, 110, 255, 22, 22, 235, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 255, 93, 8, 197, 255, 40, 4, 255, 255, 40, 4, 255, 255, 157, 13, 127, 255, 255, 22, 22, 254, 255, 19, 19, 166, 191, 15, 15, 29, 64, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 60, 26, 0, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 211, 236, 249, 255, 244, 250, 253, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 181, 223, 244, 255, 255, 255, 255, 255, 178, 222, 244, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 156, 212, 241, 255, 250, 253, 254, 255, 234, 246, 252, 255, 146, 208, 239, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 96, 183, 168, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 119, 193, 181, 255, 118, 193, 180, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 97, 183, 169, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 227, 170, 179, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 227, 170, 179, 255, 204, 102, 119, 255, 204, 102, 119, 255, 227, 170, 179, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 227, 170, 179, 255, 204, 102, 119, 255, 204, 102, 119, 255, 227, 170, 179, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 227, 170, 179, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 61, 61, 61, 0, 245, 245, 245, 106, 245, 245, 245, 207, 183, 183, 183, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, 184, 184, 13, 245, 245, 245, 208, 245, 245, 245, 104, 61, 61, 61, 0, 191, 191, 191, 49, 255, 255, 255, 124, 255, 255, 255, 102, 255, 255, 255, 188, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 225, 225, 225, 101, 165, 165, 165, 26, 165, 165, 165, 26, 126, 126, 126, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 47, 64, 0, 64, 191, 255, 50, 66, 193, 255, 196, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 247, 66, 192, 255, 145, 47, 143, 191, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 101, 191, 1, 87, 172, 255, 171, 86, 179, 243, 255, 63, 209, 158, 255, 63, 209, 159, 255, 86, 178, 244, 255, 53, 222, 121, 255, 30, 255, 32, 255, 30, 255, 32, 255, 30, 254, 34, 255, 65, 206, 167, 255, 89, 174, 255, 255, 85, 171, 255, 169, 49, 100, 191, 1, 0, 0, 0, 0, 0, 0, 0, 0, 98, 97, 60, 0, 218, 219, 152, 252, 240, 243, 187, 255, 231, 235, 187, 255, 231, 235, 187, 255, 231, 235, 187, 255, 231, 235, 187, 255, 231, 235, 187, 255, 231, 235, 187, 255, 239, 243, 187, 255, 243, 247, 187, 255, 230, 231, 168, 255, 229, 230, 167, 255, 201, 199, 128, 179, 97, 96, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 207, 255, 255, 255, 225, 191, 191, 191, 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, 64, 5, 5, 0, 191, 13, 13, 8, 255, 21, 21, 90, 255, 21, 21, 179, 255, 22, 22, 242, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 255, 255, 22, 22, 255, 66, 6, 226, 255, 40, 4, 255, 255, 40, 4, 255, 255, 157, 12, 127, 158, 255, 19, 19, 39, 128, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 60, 26, 0, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 31, 127, 63, 255, 194, 220, 203, 255, 55, 140, 83, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 55, 141, 84, 255, 194, 220, 203, 255, 31, 127, 63, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 159, 214, 241, 255, 160, 214, 241, 255, 160, 214, 241, 255, 160, 214, 241, 255, 163, 216, 242, 255, 193, 228, 246, 255, 253, 254, 255, 255, 205, 234, 248, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 228, 244, 251, 255, 232, 245, 252, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 161, 215, 242, 255, 214, 237, 249, 255, 146, 208, 239, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 96, 183, 168, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 119, 193, 181, 255, 118, 193, 180, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 97, 183, 169, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 216, 137, 150, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 216, 137, 150, 255, 204, 102, 119, 255, 204, 102, 119, 255, 216, 137, 150, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 216, 137, 150, 255, 204, 102, 119, 255, 204, 102, 119, 255, 216, 137, 150, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 216, 137, 150, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 184, 184, 184, 20, 246, 246, 246, 234, 238, 238, 238, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239, 239, 239, 37, 246, 246, 246, 234, 248, 248, 248, 19, 255, 255, 255, 134, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 231, 231, 231, 255, 192, 192, 192, 93, 255, 255, 255, 160, 255, 255, 255, 255, 253, 253, 253, 255, 244, 244, 244, 255, 235, 235, 235, 255, 169, 169, 169, 194, 84, 84, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 48, 64, 0, 63, 189, 255, 63, 67, 193, 255, 246, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 66, 192, 255, 200, 38, 133, 191, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 39, 64, 0, 84, 166, 255, 89, 89, 174, 255, 255, 42, 237, 81, 255, 30, 255, 32, 255, 30, 255, 32, 255, 43, 236, 83, 255, 43, 236, 83, 255, 30, 255, 32, 255, 30, 255, 32, 255, 30, 254, 34, 255, 81, 183, 228, 255, 89, 174, 255, 255, 89, 174, 255, 255, 87, 171, 255, 87, 21, 43, 64, 0, 0, 0, 0, 0, 98, 97, 60, 0, 218, 219, 152, 252, 230, 233, 186, 255, 197, 197, 185, 255, 197, 197, 185, 255, 197, 197, 185, 255, 197, 197, 185, 255, 197, 197, 185, 255, 197, 197, 185, 255, 210, 212, 186, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 204, 203, 133, 178, 97, 96, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 23, 255, 255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 10, 10, 0, 191, 12, 12, 4, 255, 20, 20, 49, 255, 21, 21, 89, 255, 21, 21, 123, 255, 21, 21, 147, 255, 21, 21, 153, 255, 20, 20, 155, 255, 21, 21, 153, 255, 19, 19, 145, 180, 14, 102, 133, 41, 4, 254, 255, 40, 4, 255, 255, 40, 4, 255, 252, 19, 0, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 60, 26, 0, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 57, 142, 85, 255, 248, 251, 249, 255, 98, 165, 120, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 98, 165, 120, 255, 248, 251, 249, 255, 57, 142, 85, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 176, 221, 244, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 218, 239, 250, 255, 142, 207, 239, 255, 136, 204, 238, 255, 136, 204, 238, 255, 138, 205, 238, 255, 254, 254, 255, 255, 197, 230, 247, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 96, 183, 168, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 119, 193, 181, 255, 118, 193, 180, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 97, 183, 169, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 225, 167, 177, 255, 250, 239, 241, 255, 250, 239, 241, 255, 225, 167, 177, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 225, 167, 177, 255, 250, 239, 241, 255, 250, 239, 241, 255, 225, 167, 177, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 225, 167, 177, 255, 250, 239, 241, 255, 250, 239, 241, 255, 225, 167, 177, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 243, 243, 243, 114, 243, 243, 243, 156, 119, 119, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119, 119, 119, 0, 244, 244, 244, 157, 241, 241, 241, 112, 189, 189, 189, 3, 234, 234, 234, 108, 255, 255, 255, 241, 255, 255, 255, 255, 154, 154, 154, 245, 68, 68, 68, 8, 190, 190, 190, 5, 250, 250, 250, 254, 255, 255, 255, 255, 255, 255, 255, 255, 252, 252, 252, 203, 172, 172, 172, 208, 84, 84, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 143, 191, 10, 66, 193, 255, 228, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 50, 176, 255, 140, 16, 80, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 86, 128, 0, 88, 174, 255, 208, 87, 176, 248, 255, 30, 255, 33, 255, 30, 255, 32, 255, 30, 255, 32, 255, 29, 255, 32, 255, 30, 255, 32, 255, 30, 255, 32, 255, 29, 255, 31, 255, 29, 255, 31, 255, 34, 250, 46, 255, 50, 227, 109, 255, 85, 180, 239, 255, 88, 173, 255, 206, 43, 86, 128, 0, 0, 0, 0, 0, 98, 97, 60, 0, 218, 219, 152, 252, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 204, 203, 133, 178, 97, 96, 59, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 255, 255, 255, 91, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 135, 191, 191, 191, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 10, 10, 0, 128, 10, 74, 0, 128, 9, 9, 0, 128, 10, 10, 0, 128, 8, 72, 0, 24, 2, 255, 96, 40, 4, 255, 255, 40, 4, 255, 255, 39, 3, 255, 199, 14, 1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 60, 26, 0, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 57, 142, 85, 255, 248, 251, 249, 255, 98, 165, 120, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 98, 165, 120, 255, 248, 251, 249, 255, 57, 142, 85, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 159, 214, 241, 255, 160, 214, 241, 255, 160, 214, 241, 255, 160, 214, 241, 255, 160, 214, 241, 255, 150, 210, 240, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 151, 210, 240, 255, 255, 255, 255, 255, 182, 224, 245, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 83, 177, 161, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 119, 193, 181, 255, 118, 193, 180, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 255, 255, 255, 84, 177, 162, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 245, 245, 245, 186, 243, 243, 243, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 244, 244, 77, 246, 246, 246, 184, 0, 0, 0, 167, 0, 0, 0, 210, 167, 167, 167, 245, 255, 255, 255, 255, 197, 197, 197, 253, 137, 137, 137, 13, 255, 255, 255, 73, 255, 255, 255, 255, 243, 243, 243, 251, 251, 251, 251, 62, 170, 170, 170, 8, 169, 169, 169, 208, 84, 84, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 41, 120, 255, 94, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 106, 206, 255, 255, 76, 196, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 66, 193, 255, 242, 45, 141, 191, 8, 0, 0, 0, 0, 0, 0, 0, 0, 87, 171, 255, 29, 89, 174, 255, 255, 89, 174, 255, 255, 52, 225, 115, 255, 30, 255, 32, 255, 30, 255, 32, 255, 30, 254, 33, 255, 30, 255, 32, 255, 30, 255, 32, 255, 29, 255, 32, 255, 30, 255, 32, 255, 30, 255, 32, 255, 30, 255, 32, 255, 49, 228, 104, 255, 89, 174, 255, 255, 85, 173, 255, 27, 0, 0, 0, 0, 98, 97, 60, 0, 218, 219, 152, 252, 241, 245, 187, 255, 237, 241, 187, 255, 237, 241, 187, 255, 237, 241, 187, 255, 237, 241, 187, 255, 237, 241, 187, 255, 237, 241, 187, 255, 237, 241, 187, 255, 237, 241, 187, 255, 237, 241, 187, 255, 241, 245, 187, 255, 204, 203, 133, 178, 161, 160, 123, 0, 255, 255, 255, 31, 255, 255, 255, 162, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 220, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 235, 255, 255, 255, 179, 255, 255, 255, 182, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 197, 255, 255, 255, 40, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 191, 14, 19, 1, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 191, 0, 39, 3, 255, 200, 40, 4, 255, 255, 40, 4, 255, 255, 38, 2, 255, 106, 9, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 60, 26, 0, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 56, 141, 85, 255, 248, 251, 249, 255, 97, 165, 120, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 97, 165, 120, 255, 248, 251, 249, 255, 56, 141, 85, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 176, 221, 244, 255, 255, 255, 255, 255, 160, 215, 241, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 184, 223, 216, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 119, 193, 181, 255, 118, 193, 180, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 184, 223, 216, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 246, 246, 246, 219, 244, 244, 244, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 244, 244, 37, 246, 246, 246, 216, 0, 0, 0, 188, 168, 168, 168, 131, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 253, 253, 253, 254, 255, 255, 255, 38, 153, 153, 153, 8, 169, 169, 169, 208, 159, 159, 159, 0, 128, 128, 128, 0, 128, 128, 128, 0, 64, 64, 64, 0, 0, 0, 0, 0, 31, 94, 128, 0, 64, 191, 255, 149, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 160, 224, 255, 255, 255, 255, 255, 255, 231, 247, 255, 255, 69, 194, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 65, 192, 255, 49, 0, 0, 0, 0, 0, 0, 0, 0, 88, 173, 255, 64, 89, 174, 255, 255, 89, 174, 255, 255, 67, 203, 173, 255, 30, 255, 32, 255, 30, 255, 32, 255, 30, 255, 32, 255, 30, 255, 32, 255, 30, 255, 32, 255, 30, 255, 32, 255, 30, 255, 32, 255, 30, 255, 33, 255, 30, 255, 32, 255, 31, 253, 37, 255, 88, 175, 251, 255, 88, 173, 255, 61, 0, 0, 0, 0, 98, 97, 60, 0, 218, 219, 152, 252, 226, 229, 186, 255, 191, 191, 185, 255, 191, 191, 185, 255, 191, 191, 185, 255, 191, 191, 185, 255, 191, 191, 185, 255, 191, 191, 185, 255, 191, 191, 185, 255, 191, 191, 185, 255, 191, 191, 185, 255, 229, 233, 186, 255, 204, 203, 133, 178, 97, 96, 59, 0, 64, 64, 64, 0, 191, 191, 191, 25, 255, 255, 255, 177, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 171, 191, 191, 191, 17, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 191, 7, 39, 3, 255, 189, 40, 3, 255, 93, 0, 0, 0, 0, 9, 0, 64, 0, 38, 2, 255, 97, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 238, 27, 0, 191, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 60, 26, 0, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 24, 123, 57, 255, 144, 192, 160, 255, 39, 132, 70, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 39, 132, 70, 255, 144, 192, 160, 255, 23, 123, 56, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 143, 207, 239, 255, 237, 247, 252, 255, 239, 248, 253, 255, 139, 205, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 69, 170, 154, 255, 136, 201, 190, 255, 236, 246, 244, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 119, 193, 181, 255, 118, 193, 180, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 236, 246, 244, 255, 136, 201, 190, 255, 69, 170, 154, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 246, 246, 246, 224, 245, 245, 245, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 245, 245, 245, 32, 245, 245, 245, 221, 3, 3, 3, 188, 246, 246, 246, 232, 255, 255, 255, 245, 168, 168, 168, 243, 238, 238, 238, 243, 255, 255, 255, 255, 255, 255, 255, 230, 244, 244, 244, 253, 255, 255, 255, 255, 255, 255, 255, 192, 196, 196, 196, 9, 169, 169, 169, 208, 255, 255, 255, 156, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 113, 64, 64, 64, 0, 31, 96, 128, 0, 65, 192, 255, 156, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 210, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 96, 202, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 66, 192, 255, 56, 0, 0, 0, 0, 0, 0, 0, 0, 87, 172, 255, 66, 89, 174, 255, 255, 89, 174, 255, 255, 49, 228, 107, 255, 30, 255, 32, 255, 30, 255, 32, 255, 30, 255, 32, 255, 30, 255, 32, 255, 31, 254, 35, 255, 30, 255, 32, 255, 30, 255, 32, 255, 30, 255, 32, 255, 30, 255, 33, 255, 34, 249, 49, 255, 89, 174, 255, 255, 88, 173, 255, 64, 0, 0, 0, 0, 98, 97, 60, 0, 218, 219, 152, 252, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 204, 203, 133, 178, 97, 96, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 90, 255, 255, 255, 236, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 246, 255, 255, 255, 102, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 191, 2, 37, 3, 255, 170, 40, 4, 255, 255, 36, 2, 255, 130, 24, 0, 191, 4, 38, 2, 255, 106, 40, 4, 255, 250, 40, 4, 255, 255, 40, 4, 255, 255, 38, 2, 255, 116, 9, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 60, 26, 0, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 21, 121, 54, 255, 51, 139, 80, 255, 24, 123, 57, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 24, 123, 57, 255, 51, 139, 80, 255, 21, 121, 54, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 137, 204, 238, 255, 159, 214, 241, 255, 160, 214, 241, 255, 160, 214, 241, 255, 160, 214, 241, 255, 160, 214, 241, 255, 165, 216, 242, 255, 189, 227, 245, 255, 241, 249, 253, 255, 253, 254, 255, 255, 164, 216, 242, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 76, 174, 158, 255, 165, 214, 206, 255, 249, 252, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 119, 193, 181, 255, 118, 193, 180, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 249, 252, 252, 255, 165, 214, 206, 255, 76, 174, 158, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 245, 245, 245, 196, 214, 214, 214, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 64, 245, 245, 245, 194, 0, 0, 0, 188, 108, 108, 108, 64, 170, 170, 170, 14, 0, 0, 0, 215, 197, 197, 197, 219, 255, 255, 255, 255, 240, 240, 240, 126, 90, 90, 90, 218, 215, 215, 215, 234, 255, 255, 255, 141, 183, 183, 183, 8, 169, 169, 169, 208, 255, 255, 255, 221, 255, 255, 255, 26, 255, 255, 255, 50, 255, 255, 255, 188, 128, 128, 128, 0, 14, 46, 64, 0, 61, 188, 255, 115, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 211, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 96, 203, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 252, 50, 187, 255, 19, 0, 0, 0, 0, 0, 0, 0, 0, 87, 171, 255, 34, 89, 174, 255, 255, 89, 174, 255, 255, 54, 221, 125, 255, 30, 255, 32, 255, 30, 255, 32, 255, 30, 254, 33, 255, 30, 254, 34, 255, 72, 197, 191, 255, 66, 205, 168, 255, 30, 255, 33, 255, 30, 255, 32, 255, 30, 255, 32, 255, 63, 209, 158, 255, 89, 174, 255, 255, 86, 171, 255, 32, 0, 0, 0, 0, 98, 97, 60, 0, 218, 219, 152, 252, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 204, 203, 133, 178, 97, 96, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 191, 191, 191, 23, 255, 255, 255, 218, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 245, 255, 255, 255, 44, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 1, 128, 0, 29, 2, 255, 149, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 237, 40, 4, 255, 242, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 255, 39, 3, 255, 191, 24, 0, 191, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 60, 26, 0, 17, 119, 51, 255, 17, 119, 51, 255, 43, 134, 73, 255, 220, 235, 225, 255, 255, 255, 255, 255, 233, 242, 236, 255, 63, 145, 91, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 64, 146, 91, 255, 233, 242, 236, 255, 255, 255, 255, 255, 220, 235, 225, 255, 43, 134, 73, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 177, 222, 244, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 233, 245, 252, 255, 160, 214, 241, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 91, 181, 166, 255, 193, 227, 221, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 119, 193, 181, 255, 118, 193, 180, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 226, 220, 255, 91, 181, 166, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 245, 245, 245, 130, 183, 183, 183, 136, 60, 60, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 92, 92, 0, 215, 215, 215, 138, 224, 224, 224, 128, 0, 0, 0, 188, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 215, 153, 153, 153, 208, 255, 255, 255, 255, 211, 211, 211, 44, 77, 77, 77, 215, 168, 168, 168, 215, 159, 159, 159, 0, 153, 153, 153, 8, 169, 169, 169, 208, 255, 255, 255, 218, 128, 128, 128, 0, 255, 255, 255, 28, 255, 255, 255, 188, 128, 128, 128, 0, 0, 0, 0, 0, 51, 186, 255, 29, 67, 193, 255, 247, 67, 193, 255, 255, 67, 193, 255, 255, 211, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 96, 203, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 65, 191, 255, 177, 28, 93, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 86, 128, 0, 89, 174, 255, 217, 89, 174, 255, 255, 80, 185, 223, 255, 34, 250, 46, 255, 30, 255, 32, 255, 30, 255, 32, 255, 39, 242, 68, 255, 88, 176, 250, 255, 47, 231, 98, 255, 30, 255, 32, 255, 30, 255, 32, 255, 41, 239, 76, 255, 89, 174, 255, 255, 88, 174, 255, 215, 43, 86, 128, 0, 0, 0, 0, 0, 98, 97, 60, 0, 218, 219, 152, 252, 224, 227, 186, 255, 185, 185, 185, 255, 185, 185, 185, 255, 185, 185, 185, 255, 185, 185, 185, 255, 185, 185, 185, 255, 185, 185, 185, 255, 185, 185, 185, 255, 185, 185, 185, 255, 185, 185, 185, 255, 228, 231, 186, 255, 204, 203, 133, 178, 97, 96, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 8, 255, 255, 255, 243, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 1, 64, 0, 39, 3, 255, 125, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 255, 39, 3, 255, 201, 28, 1, 191, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 60, 26, 0, 17, 119, 51, 255, 17, 119, 51, 255, 152, 196, 167, 255, 245, 250, 247, 255, 114, 174, 134, 255, 230, 240, 233, 255, 187, 216, 197, 255, 39, 131, 70, 255, 149, 194, 164, 255, 155, 198, 169, 255, 155, 198, 169, 255, 140, 189, 157, 255, 19, 120, 53, 255, 39, 131, 70, 255, 149, 194, 164, 255, 155, 198, 169, 255, 155, 198, 169, 255, 140, 189, 157, 255, 19, 120, 53, 255, 39, 131, 70, 255, 149, 194, 164, 255, 155, 198, 169, 255, 155, 198, 169, 255, 140, 189, 157, 255, 19, 120, 53, 255, 187, 216, 197, 255, 230, 240, 233, 255, 115, 175, 135, 255, 245, 250, 247, 255, 152, 196, 167, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 137, 204, 238, 255, 159, 214, 241, 255, 160, 214, 241, 255, 160, 214, 241, 255, 160, 214, 241, 255, 160, 214, 241, 255, 160, 214, 241, 255, 146, 208, 239, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 114, 191, 178, 255, 220, 239, 236, 255, 255, 255, 255, 255, 255, 255, 255, 255, 119, 193, 181, 255, 118, 193, 180, 255, 255, 255, 255, 255, 255, 255, 255, 255, 219, 239, 235, 255, 113, 191, 178, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 241, 241, 241, 36, 246, 246, 246, 233, 183, 183, 183, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, 183, 183, 19, 246, 246, 246, 234, 180, 180, 180, 35, 0, 0, 0, 188, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 215, 87, 87, 87, 208, 181, 181, 181, 56, 102, 102, 102, 0, 77, 77, 77, 215, 168, 168, 168, 215, 84, 84, 84, 0, 153, 153, 153, 8, 169, 169, 169, 208, 255, 255, 255, 218, 128, 128, 128, 0, 255, 255, 255, 28, 255, 255, 255, 188, 128, 128, 128, 0, 0, 0, 0, 0, 13, 47, 64, 0, 66, 192, 255, 115, 67, 193, 255, 255, 67, 193, 255, 255, 211, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 96, 203, 255, 255, 67, 193, 255, 255, 67, 193, 255, 237, 32, 180, 255, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 42, 64, 0, 88, 170, 255, 101, 89, 174, 255, 255, 89, 174, 255, 255, 82, 183, 230, 255, 60, 213, 148, 255, 61, 211, 152, 255, 85, 180, 239, 255, 89, 174, 255, 255, 33, 250, 44, 255, 30, 255, 32, 255, 30, 254, 33, 255, 30, 255, 33, 255, 84, 180, 239, 255, 85, 173, 255, 100, 20, 43, 64, 0, 0, 0, 0, 0, 98, 97, 60, 0, 218, 219, 152, 252, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 204, 203, 133, 178, 97, 96, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 79, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 234, 255, 255, 255, 219, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 142, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 64, 0, 37, 3, 255, 102, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 248, 39, 3, 255, 141, 29, 0, 191, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 60, 26, 0, 17, 119, 51, 255, 17, 119, 51, 255, 161, 201, 174, 255, 240, 246, 242, 255, 77, 153, 102, 255, 218, 234, 224, 255, 196, 221, 204, 255, 62, 145, 90, 255, 227, 239, 231, 255, 236, 244, 239, 255, 236, 244, 239, 255, 210, 229, 216, 255, 25, 124, 58, 255, 62, 145, 90, 255, 227, 239, 231, 255, 236, 244, 239, 255, 236, 244, 239, 255, 210, 229, 216, 255, 25, 124, 58, 255, 62, 145, 90, 255, 227, 239, 231, 255, 236, 244, 239, 255, 236, 244, 239, 255, 210, 229, 216, 255, 25, 124, 58, 255, 196, 221, 204, 255, 218, 234, 224, 255, 77, 153, 102, 255, 240, 246, 242, 255, 161, 201, 174, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 70, 171, 154, 255, 141, 203, 193, 255, 239, 248, 246, 255, 119, 193, 181, 255, 118, 193, 180, 255, 239, 248, 246, 255, 141, 203, 193, 255, 70, 171, 154, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 111, 111, 111, 0, 235, 235, 235, 141, 245, 245, 245, 176, 166, 166, 166, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 172, 172, 2, 245, 245, 245, 177, 235, 235, 235, 139, 111, 111, 111, 0, 0, 0, 0, 188, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 215, 77, 77, 77, 208, 68, 68, 68, 8, 39, 39, 39, 0, 77, 77, 77, 215, 168, 168, 168, 215, 84, 84, 84, 0, 153, 153, 153, 8, 169, 169, 169, 208, 255, 255, 255, 218, 128, 128, 128, 0, 255, 255, 255, 28, 255, 255, 255, 188, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 48, 64, 0, 66, 192, 255, 112, 67, 193, 255, 245, 211, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 96, 203, 255, 255, 66, 193, 255, 213, 61, 181, 255, 45, 7, 43, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 123, 191, 4, 88, 173, 255, 187, 89, 174, 255, 255, 89, 174, 255, 255, 89, 174, 255, 255, 89, 174, 255, 255, 89, 174, 255, 255, 89, 174, 255, 255, 48, 230, 101, 255, 30, 255, 32, 255, 30, 255, 32, 255, 36, 245, 58, 255, 86, 174, 252, 186, 63, 128, 191, 3, 0, 0, 0, 0, 0, 0, 0, 0, 98, 97, 60, 0, 218, 219, 152, 252, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 204, 203, 133, 178, 97, 96, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 161, 255, 255, 255, 255, 255, 255, 255, 204, 191, 191, 191, 30, 191, 191, 191, 12, 255, 255, 255, 161, 255, 255, 255, 255, 255, 255, 255, 233, 191, 191, 191, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 191, 3, 29, 2, 255, 145, 40, 4, 255, 243, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 255, 40, 4, 255, 255, 39, 3, 255, 112, 32, 2, 255, 22, 8, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 60, 26, 0, 17, 119, 51, 255, 17, 119, 51, 255, 59, 143, 87, 255, 240, 246, 242, 255, 255, 255, 255, 255, 248, 251, 249, 255, 85, 157, 109, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 85, 157, 109, 255, 248, 251, 249, 255, 255, 255, 255, 255, 239, 246, 242, 255, 59, 143, 87, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 78, 175, 159, 255, 84, 177, 162, 255, 84, 177, 162, 255, 78, 175, 159, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 0, 0, 0, 0, 177, 177, 177, 5, 245, 245, 245, 187, 244, 244, 244, 171, 183, 183, 183, 12, 59, 59, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 60, 60, 0, 183, 183, 183, 13, 245, 245, 245, 172, 244, 244, 244, 186, 176, 176, 176, 5, 0, 0, 0, 0, 0, 0, 0, 188, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 215, 77, 77, 77, 208, 68, 68, 68, 8, 39, 39, 39, 0, 77, 77, 77, 215, 168, 168, 168, 215, 84, 84, 84, 0, 153, 153, 153, 8, 169, 169, 169, 208, 255, 255, 255, 218, 128, 128, 128, 0, 255, 255, 255, 28, 255, 255, 255, 188, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 40, 64, 0, 57, 167, 255, 23, 237, 249, 255, 215, 255, 255, 255, 255, 255, 255, 255, 255, 155, 222, 255, 99, 44, 134, 191, 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, 64, 129, 191, 16, 87, 173, 255, 189, 89, 174, 255, 255, 89, 174, 255, 255, 89, 174, 255, 255, 89, 174, 255, 255, 89, 174, 255, 255, 85, 179, 240, 255, 57, 217, 137, 255, 51, 225, 115, 255, 76, 187, 217, 188, 64, 129, 191, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 97, 60, 0, 218, 219, 152, 252, 224, 227, 186, 255, 185, 185, 185, 255, 185, 185, 185, 255, 185, 185, 185, 255, 185, 185, 185, 255, 185, 185, 185, 255, 185, 185, 185, 255, 185, 185, 185, 255, 185, 185, 185, 255, 185, 185, 185, 255, 228, 231, 186, 255, 204, 203, 133, 178, 97, 96, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 5, 255, 255, 255, 238, 255, 255, 255, 162, 191, 191, 191, 9, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 91, 255, 255, 255, 242, 255, 255, 255, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 1, 128, 0, 29, 0, 191, 15, 38, 2, 255, 113, 39, 4, 255, 222, 40, 4, 255, 255, 40, 4, 255, 255, 38, 3, 255, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 60, 26, 0, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 36, 130, 68, 255, 86, 158, 110, 255, 45, 135, 75, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 45, 135, 75, 255, 86, 158, 110, 255, 36, 130, 68, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 0, 0, 0, 0, 0, 0, 0, 0, 181, 181, 181, 6, 240, 240, 240, 151, 246, 246, 246, 229, 242, 242, 242, 118, 244, 244, 244, 42, 183, 183, 183, 6, 183, 183, 183, 6, 245, 245, 245, 42, 243, 243, 243, 119, 246, 246, 246, 230, 239, 239, 239, 149, 180, 180, 180, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 215, 77, 77, 77, 208, 69, 69, 69, 8, 58, 58, 58, 0, 77, 77, 77, 215, 168, 168, 168, 215, 126, 126, 126, 0, 155, 155, 155, 8, 169, 169, 169, 208, 255, 255, 255, 218, 191, 191, 191, 0, 255, 255, 255, 28, 255, 255, 255, 188, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 195, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 128, 191, 4, 87, 172, 255, 107, 88, 173, 255, 224, 89, 174, 255, 255, 89, 174, 255, 255, 89, 174, 255, 255, 89, 174, 255, 255, 88, 174, 255, 223, 88, 171, 255, 106, 55, 123, 191, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 97, 60, 0, 218, 219, 152, 252, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 243, 247, 187, 255, 204, 203, 133, 178, 97, 96, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 66, 255, 255, 255, 111, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 34, 255, 255, 255, 121, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 64, 0, 20, 0, 191, 3, 39, 3, 255, 79, 39, 3, 255, 189, 34, 3, 255, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 60, 26, 0, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 117, 117, 0, 240, 240, 240, 48, 243, 243, 243, 150, 246, 246, 246, 221, 246, 246, 246, 251, 246, 246, 246, 250, 246, 246, 246, 220, 243, 243, 243, 150, 240, 240, 240, 47, 115, 115, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, 0, 0, 0, 230, 0, 0, 0, 230, 0, 0, 0, 198, 77, 77, 77, 162, 78, 78, 78, 230, 78, 78, 78, 230, 77, 77, 77, 180, 168, 168, 168, 180, 169, 169, 169, 230, 169, 169, 169, 230, 167, 167, 167, 162, 255, 255, 255, 199, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 143, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 195, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 43, 64, 0, 44, 86, 128, 0, 86, 171, 255, 41, 88, 173, 255, 76, 88, 173, 255, 76, 87, 172, 255, 40, 44, 86, 128, 0, 22, 42, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 97, 61, 0, 205, 203, 134, 220, 215, 215, 148, 235, 215, 215, 148, 235, 215, 215, 148, 235, 215, 215, 148, 235, 215, 215, 148, 235, 215, 215, 148, 235, 215, 215, 148, 235, 215, 215, 148, 235, 215, 215, 148, 235, 215, 215, 148, 235, 215, 215, 148, 235, 199, 196, 125, 155, 97, 95, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 7, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 2, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 1, 128, 0, 18, 0, 255, 10, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 60, 26, 0, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 17, 119, 51, 255, 136, 204, 238, 253, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 136, 204, 238, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 68, 170, 153, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 204, 102, 119, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 120, 120, 0, 123, 123, 123, 0, 123, 123, 123, 0, 123, 123, 123, 0, 123, 123, 123, 0, 120, 120, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 38, 38, 0, 39, 39, 39, 0, 39, 39, 39, 0, 38, 38, 38, 0, 83, 83, 83, 0, 84, 84, 84, 0, 84, 84, 84, 0, 83, 83, 83, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 195, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 97, 61, 0, 98, 97, 61, 0, 98, 97, 61, 0, 98, 97, 61, 0, 98, 97, 61, 0, 98, 97, 61, 0, 98, 97, 61, 0, 98, 97, 61, 0, 98, 97, 61, 0, 98, 97, 61, 0, 98, 97, 61, 0, 98, 97, 61, 0, 98, 96, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 55, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 65, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 9, 60, 26, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 68, 102, 119, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 34, 85, 77, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 102, 51, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 195, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 52, 255, 255, 255, 116, 255, 255, 255, 116, 255, 255, 255, 116, 255, 255, 255, 116, 255, 255, 255, 116, 255, 255, 255, 116, 255, 255, 255, 116, 255, 255, 255, 116, 255, 255, 255, 116, 255, 255, 255, 116, 255, 255, 255, 116, 255, 255, 255, 116, 255, 255, 255, 68, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 101, 0, 0, 0, 133, 0, 0, 0, 153, 0, 0, 0, 123, 0, 0, 0, 67, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 195, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 223, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 31, 191, 191, 191, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 138, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 132, 128, 128, 128, 0, 0, 0, 0, 0, 255, 255, 255, 54, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 167, 191, 0, 252, 254, 255, 197, 255, 255, 255, 255, 255, 255, 255, 255, 217, 242, 255, 45, 16, 48, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 88, 255, 255, 255, 145, 255, 255, 255, 83, 255, 255, 255, 83, 255, 255, 255, 83, 255, 255, 255, 83, 255, 255, 255, 83, 255, 255, 255, 83, 255, 255, 255, 83, 255, 255, 255, 83, 255, 255, 255, 83, 255, 255, 255, 83, 255, 255, 255, 138, 255, 255, 255, 111, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 0, 0, 0, 253, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 207, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, 0, 0, 0, 255, 25, 25, 25, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 15, 15, 15, 255, 62, 62, 62, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 57, 57, 57, 255, 20, 20, 20, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 23, 23, 23, 255, 55, 55, 55, 255, 42, 42, 42, 255, 0, 0, 0, 255, 0, 0, 0, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 125, 255, 255, 255, 199, 255, 255, 255, 50, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 173, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 165, 128, 128, 128, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 46, 64, 0, 58, 185, 255, 44, 66, 192, 255, 188, 211, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 96, 202, 255, 243, 66, 192, 255, 137, 49, 142, 191, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 88, 255, 255, 255, 124, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 109, 255, 255, 255, 111, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 0, 0, 0, 255, 50, 50, 50, 255, 169, 169, 169, 255, 209, 209, 209, 255, 230, 230, 230, 255, 195, 195, 195, 255, 111, 111, 111, 255, 2, 2, 2, 255, 0, 0, 0, 213, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0, 255, 207, 207, 207, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 50, 50, 50, 255, 208, 208, 208, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 190, 190, 190, 255, 68, 68, 68, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 75, 75, 75, 255, 183, 183, 183, 255, 247, 247, 247, 255, 17, 17, 17, 255, 0, 0, 0, 255, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 123, 255, 255, 255, 255, 255, 255, 255, 252, 255, 255, 255, 147, 191, 191, 191, 16, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 173, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 165, 128, 128, 128, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 46, 64, 0, 54, 188, 255, 58, 67, 193, 255, 243, 67, 193, 255, 255, 211, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 96, 203, 255, 255, 67, 193, 255, 255, 66, 191, 255, 194, 49, 142, 191, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 88, 255, 255, 255, 124, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 109, 255, 255, 255, 111, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 199, 13, 13, 13, 255, 237, 237, 237, 255, 255, 255, 255, 255, 237, 237, 237, 255, 224, 224, 224, 255, 255, 255, 255, 255, 255, 255, 255, 255, 120, 120, 120, 255, 0, 0, 0, 255, 0, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 255, 238, 238, 238, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 50, 50, 50, 255, 208, 208, 208, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 190, 190, 190, 255, 68, 68, 68, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 75, 75, 75, 255, 183, 183, 183, 255, 255, 255, 255, 255, 40, 40, 40, 255, 0, 0, 0, 255, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 232, 255, 255, 255, 93, 191, 191, 191, 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, 128, 128, 128, 0, 255, 255, 255, 173, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 165, 128, 128, 128, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 141, 191, 9, 67, 193, 255, 226, 67, 193, 255, 255, 67, 193, 255, 255, 211, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 96, 203, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 66, 192, 255, 135, 17, 48, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 88, 255, 255, 255, 124, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 109, 255, 255, 255, 111, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 234, 59, 59, 59, 255, 255, 255, 255, 255, 217, 217, 217, 255, 13, 13, 13, 255, 2, 2, 2, 255, 163, 163, 163, 255, 255, 255, 255, 255, 186, 186, 186, 255, 0, 0, 0, 255, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 255, 238, 238, 238, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 50, 50, 50, 255, 208, 208, 208, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 190, 190, 190, 255, 68, 68, 68, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 75, 75, 75, 255, 183, 183, 183, 255, 255, 255, 255, 255, 40, 40, 40, 255, 0, 0, 0, 255, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 118, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 193, 255, 255, 255, 43, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 173, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 165, 128, 128, 128, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 191, 255, 91, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 211, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 96, 203, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 241, 45, 140, 191, 7, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 88, 255, 255, 255, 124, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 109, 255, 255, 255, 111, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 252, 77, 77, 77, 255, 255, 255, 255, 255, 178, 178, 178, 255, 0, 0, 0, 255, 0, 0, 0, 255, 113, 113, 113, 255, 255, 255, 255, 255, 187, 187, 187, 255, 0, 0, 0, 255, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 255, 166, 166, 166, 255, 179, 179, 179, 255, 179, 179, 179, 255, 179, 179, 179, 255, 179, 179, 179, 255, 179, 179, 179, 255, 43, 43, 43, 255, 147, 147, 147, 255, 179, 179, 179, 255, 179, 179, 179, 255, 179, 179, 179, 255, 179, 179, 179, 255, 179, 179, 179, 255, 179, 179, 179, 255, 138, 138, 138, 255, 62, 62, 62, 255, 179, 179, 179, 255, 179, 179, 179, 255, 179, 179, 179, 255, 179, 179, 179, 255, 179, 179, 179, 255, 179, 179, 179, 255, 179, 179, 179, 255, 67, 67, 67, 255, 134, 134, 134, 255, 179, 179, 179, 255, 28, 28, 28, 255, 0, 0, 0, 255, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 251, 255, 255, 255, 139, 191, 191, 191, 12, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 173, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 165, 128, 128, 128, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 32, 93, 128, 0, 65, 190, 255, 148, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 211, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 96, 203, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 65, 192, 255, 49, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 88, 255, 255, 255, 124, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 109, 255, 255, 255, 111, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 226, 49, 49, 49, 255, 255, 255, 255, 255, 253, 253, 253, 255, 138, 138, 138, 255, 114, 114, 114, 255, 236, 236, 236, 255, 255, 255, 255, 255, 152, 152, 152, 255, 0, 0, 0, 255, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 255, 71, 71, 71, 255, 51, 51, 51, 255, 14, 14, 14, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 17, 17, 17, 255, 49, 49, 49, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 59, 59, 59, 255, 7, 7, 7, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 12, 12, 12, 255, 0, 0, 0, 255, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 113, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 223, 255, 255, 255, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 173, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 165, 128, 128, 128, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 32, 95, 128, 0, 65, 192, 255, 155, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 211, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 96, 203, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 66, 192, 255, 58, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 88, 255, 255, 255, 124, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 109, 255, 255, 255, 111, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, 12, 12, 12, 255, 252, 252, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 90, 90, 90, 255, 0, 0, 0, 254, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 255, 238, 238, 238, 255, 170, 170, 170, 255, 48, 48, 48, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 55, 55, 55, 255, 163, 163, 163, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 198, 198, 198, 255, 23, 23, 23, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 40, 40, 40, 255, 0, 0, 0, 255, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 110, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 181, 255, 255, 255, 40, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 173, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 165, 128, 128, 128, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 16, 48, 64, 0, 65, 192, 255, 117, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 211, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 96, 203, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 253, 61, 181, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 88, 255, 255, 255, 124, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 109, 255, 255, 255, 111, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 26, 0, 0, 0, 26, 0, 0, 0, 148, 0, 0, 0, 255, 196, 196, 196, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 246, 246, 246, 255, 17, 17, 17, 255, 0, 0, 0, 210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 255, 238, 238, 238, 255, 170, 170, 170, 255, 48, 48, 48, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 55, 55, 55, 255, 163, 163, 163, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 198, 198, 198, 255, 23, 23, 23, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 40, 40, 40, 255, 0, 0, 0, 255, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 108, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 214, 255, 255, 255, 72, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 173, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 165, 128, 128, 128, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 189, 255, 31, 67, 193, 255, 249, 67, 193, 255, 255, 67, 193, 255, 255, 211, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 96, 203, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 65, 192, 255, 181, 31, 93, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 88, 255, 255, 255, 124, 191, 191, 191, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 191, 191, 191, 0, 255, 255, 255, 109, 255, 255, 255, 111, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 245, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 120, 120, 120, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 161, 161, 161, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 243, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 255, 238, 238, 238, 255, 170, 170, 170, 255, 48, 48, 48, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 55, 55, 55, 255, 163, 163, 163, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 198, 198, 198, 255, 23, 23, 23, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 40, 40, 40, 255, 0, 0, 0, 255, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 105, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 236, 255, 255, 255, 109, 191, 191, 191, 4, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 173, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 165, 128, 128, 128, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 47, 64, 0, 66, 192, 255, 121, 67, 193, 255, 255, 67, 193, 255, 255, 211, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 96, 203, 255, 255, 67, 193, 255, 255, 67, 193, 255, 240, 58, 172, 255, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 88, 255, 255, 255, 158, 255, 255, 255, 133, 255, 255, 255, 133, 255, 255, 255, 133, 255, 255, 255, 133, 255, 255, 255, 133, 255, 255, 255, 133, 255, 255, 255, 133, 255, 255, 255, 133, 255, 255, 255, 133, 255, 255, 255, 133, 255, 255, 255, 155, 255, 255, 255, 111, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 169, 0, 0, 0, 255, 40, 40, 40, 255, 51, 51, 51, 255, 51, 51, 51, 255, 8, 8, 8, 255, 38, 38, 38, 255, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 56, 56, 56, 255, 2, 2, 2, 255, 25, 25, 25, 255, 26, 26, 26, 255, 23, 23, 23, 255, 0, 0, 0, 255, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 255, 238, 238, 238, 255, 170, 170, 170, 255, 48, 48, 48, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 55, 55, 55, 255, 163, 163, 163, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 198, 198, 198, 255, 23, 23, 23, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 40, 40, 40, 255, 0, 0, 0, 255, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 103, 255, 255, 255, 255, 255, 255, 255, 251, 255, 255, 255, 145, 191, 191, 191, 18, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 173, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 165, 128, 128, 128, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 191, 1, 66, 192, 255, 120, 67, 193, 255, 248, 211, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 96, 203, 255, 255, 67, 193, 255, 219, 37, 180, 255, 50, 13, 42, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 88, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 111, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 234, 2, 2, 2, 255, 237, 237, 237, 255, 255, 255, 255, 255, 255, 255, 255, 255, 113, 113, 113, 255, 0, 0, 0, 255, 190, 190, 190, 255, 255, 255, 255, 255, 255, 255, 255, 255, 183, 183, 183, 255, 0, 0, 0, 255, 101, 101, 101, 255, 255, 255, 255, 255, 255, 255, 255, 255, 250, 250, 250, 255, 9, 9, 9, 255, 0, 0, 0, 245, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 255, 119, 119, 119, 255, 85, 85, 85, 255, 24, 24, 24, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 28, 28, 28, 255, 81, 81, 81, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 99, 99, 99, 255, 11, 11, 11, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 20, 20, 20, 255, 0, 0, 0, 255, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 100, 255, 255, 255, 182, 255, 255, 255, 41, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 138, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 132, 128, 128, 128, 0, 0, 0, 0, 0, 255, 255, 255, 54, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 48, 64, 0, 88, 199, 255, 28, 237, 249, 255, 217, 255, 255, 255, 255, 255, 255, 255, 255, 154, 221, 255, 107, 48, 143, 191, 5, 0, 43, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 88, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 111, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 255, 51, 51, 51, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 214, 214, 214, 255, 1, 1, 1, 255, 90, 90, 90, 255, 255, 255, 255, 255, 254, 254, 254, 255, 53, 53, 53, 255, 7, 7, 7, 255, 225, 225, 225, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 60, 60, 60, 255, 0, 0, 0, 255, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 255, 119, 119, 119, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 15, 15, 15, 255, 95, 95, 95, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 85, 85, 85, 255, 24, 24, 24, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 28, 28, 28, 255, 81, 81, 81, 255, 128, 128, 128, 255, 23, 23, 23, 255, 0, 0, 0, 255, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 11, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 195, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 72, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 166, 255, 255, 255, 95, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 0, 0, 0, 255, 64, 64, 64, 255, 153, 153, 153, 255, 178, 178, 178, 255, 179, 179, 179, 255, 202, 202, 202, 255, 43, 43, 43, 255, 7, 7, 7, 255, 230, 230, 230, 255, 172, 172, 172, 255, 0, 0, 0, 255, 107, 107, 107, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 116, 116, 116, 255, 0, 0, 0, 255, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 255, 238, 238, 238, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 30, 30, 30, 255, 190, 190, 190, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 170, 170, 170, 255, 48, 48, 48, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 55, 55, 55, 255, 163, 163, 163, 255, 255, 255, 255, 255, 40, 40, 40, 255, 0, 0, 0, 255, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 195, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, 0, 0, 0, 255, 118, 118, 118, 255, 151, 151, 151, 255, 128, 128, 128, 255, 127, 127, 127, 255, 102, 102, 102, 255, 81, 81, 81, 255, 0, 0, 0, 255, 109, 109, 109, 255, 32, 32, 32, 255, 6, 6, 6, 255, 38, 38, 38, 255, 78, 78, 78, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 171, 171, 171, 255, 0, 0, 0, 255, 0, 0, 0, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 255, 238, 238, 238, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 30, 30, 30, 255, 190, 190, 190, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 170, 170, 170, 255, 48, 48, 48, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 55, 55, 55, 255, 163, 163, 163, 255, 255, 255, 255, 255, 40, 40, 40, 255, 0, 0, 0, 255, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 195, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 244, 7, 7, 7, 255, 246, 246, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 253, 253, 253, 255, 40, 40, 40, 255, 0, 0, 0, 255, 0, 0, 0, 255, 141, 141, 141, 255, 120, 120, 120, 255, 167, 167, 167, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 228, 228, 228, 255, 0, 0, 0, 255, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 255, 238, 238, 238, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 30, 30, 30, 255, 190, 190, 190, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 170, 170, 170, 255, 48, 48, 48, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 55, 55, 55, 255, 163, 163, 163, 255, 255, 255, 255, 255, 40, 40, 40, 255, 0, 0, 0, 255, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 10, 10, 0, 128, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 195, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 255, 65, 65, 65, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 156, 156, 156, 255, 0, 0, 0, 255, 42, 42, 42, 255, 239, 239, 239, 255, 48, 48, 48, 255, 251, 251, 251, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 29, 29, 29, 255, 0, 0, 0, 255, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 255, 238, 238, 238, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 30, 30, 30, 255, 190, 190, 190, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 170, 170, 170, 255, 48, 48, 48, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 55, 55, 55, 255, 163, 163, 163, 255, 255, 255, 255, 255, 40, 40, 40, 255, 0, 0, 0, 255, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 2, 2, 0, 255, 20, 20, 179, 255, 21, 21, 143, 128, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119, 167, 191, 0, 254, 255, 255, 196, 255, 255, 255, 255, 255, 255, 255, 255, 221, 243, 255, 43, 16, 48, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 0, 0, 0, 255, 132, 132, 132, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 248, 248, 248, 255, 26, 26, 26, 255, 188, 188, 188, 255, 146, 146, 146, 255, 141, 141, 141, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 85, 85, 85, 255, 0, 0, 0, 255, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 255, 95, 95, 95, 255, 102, 102, 102, 255, 102, 102, 102, 255, 102, 102, 102, 255, 102, 102, 102, 255, 102, 102, 102, 255, 12, 12, 12, 255, 76, 76, 76, 255, 102, 102, 102, 255, 102, 102, 102, 255, 102, 102, 102, 255, 102, 102, 102, 255, 102, 102, 102, 255, 102, 102, 102, 255, 68, 68, 68, 255, 19, 19, 19, 255, 102, 102, 102, 255, 102, 102, 102, 255, 102, 102, 102, 255, 102, 102, 102, 255, 102, 102, 102, 255, 102, 102, 102, 255, 102, 102, 102, 255, 22, 22, 22, 255, 65, 65, 65, 255, 102, 102, 102, 255, 16, 16, 16, 255, 0, 0, 0, 255, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 5, 5, 0, 255, 21, 21, 84, 255, 22, 22, 255, 255, 22, 22, 253, 255, 19, 19, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 44, 64, 0, 53, 181, 255, 38, 66, 192, 255, 180, 211, 240, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 96, 202, 255, 238, 65, 192, 255, 128, 49, 142, 191, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 197, 0, 0, 0, 255, 200, 200, 200, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 203, 203, 203, 255, 252, 252, 252, 255, 49, 49, 49, 255, 241, 241, 241, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 141, 141, 141, 255, 0, 0, 0, 255, 0, 0, 0, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 255, 143, 143, 143, 255, 117, 117, 117, 255, 14, 14, 14, 255, 153, 153, 153, 255, 153, 153, 153, 255, 153, 153, 153, 255, 148, 148, 148, 255, 152, 152, 152, 255, 153, 153, 153, 255, 153, 153, 153, 255, 48, 48, 48, 255, 83, 83, 83, 255, 153, 153, 153, 255, 153, 153, 153, 255, 153, 153, 153, 255, 153, 153, 153, 255, 153, 153, 153, 255, 153, 153, 153, 255, 134, 134, 134, 255, 0, 0, 0, 255, 152, 152, 152, 255, 153, 153, 153, 255, 153, 153, 153, 255, 153, 153, 153, 255, 153, 153, 153, 255, 153, 153, 153, 255, 24, 24, 24, 255, 0, 0, 0, 255, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 12, 12, 8, 255, 21, 21, 223, 247, 112, 29, 255, 250, 76, 26, 255, 255, 21, 21, 188, 128, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 48, 64, 0, 61, 189, 255, 53, 67, 193, 255, 240, 67, 193, 255, 255, 211, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 96, 203, 255, 255, 67, 193, 255, 255, 65, 192, 255, 188, 49, 142, 191, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 250, 15, 15, 15, 255, 252, 252, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 228, 228, 228, 255, 57, 57, 57, 255, 94, 94, 94, 255, 208, 208, 208, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 197, 197, 197, 255, 0, 0, 0, 255, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 255, 238, 238, 238, 255, 195, 195, 195, 255, 23, 23, 23, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 80, 80, 80, 255, 138, 138, 138, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 223, 223, 223, 255, 0, 0, 0, 255, 253, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 40, 40, 40, 255, 0, 0, 0, 255, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 2, 2, 0, 255, 20, 20, 123, 254, 35, 23, 255, 242, 167, 33, 255, 242, 163, 33, 255, 255, 23, 22, 255, 255, 12, 12, 76, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 143, 191, 7, 66, 192, 255, 222, 67, 193, 255, 255, 67, 193, 255, 255, 211, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 96, 203, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 65, 192, 255, 130, 16, 48, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 255, 79, 79, 79, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 193, 193, 193, 255, 77, 77, 77, 255, 70, 70, 70, 255, 183, 183, 183, 255, 255, 255, 255, 255, 255, 255, 255, 255, 247, 247, 247, 255, 6, 6, 6, 255, 0, 0, 0, 242, 0, 0, 0, 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, 235, 0, 0, 0, 255, 238, 238, 238, 255, 195, 195, 195, 255, 23, 23, 23, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 80, 80, 80, 255, 138, 138, 138, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 223, 223, 223, 255, 0, 0, 0, 255, 253, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 40, 40, 40, 255, 0, 0, 0, 255, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 9, 9, 27, 255, 22, 22, 243, 244, 148, 32, 255, 250, 85, 28, 255, 247, 121, 31, 255, 248, 104, 28, 255, 255, 21, 21, 215, 191, 12, 12, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 191, 255, 88, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 211, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 96, 203, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 66, 192, 255, 239, 44, 140, 191, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 0, 0, 0, 255, 146, 146, 146, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 248, 248, 248, 255, 230, 230, 230, 255, 230, 230, 230, 255, 230, 230, 230, 255, 191, 191, 191, 255, 83, 83, 83, 255, 51, 51, 51, 255, 150, 150, 150, 255, 225, 225, 225, 255, 46, 46, 46, 255, 0, 0, 0, 255, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 255, 238, 238, 238, 255, 195, 195, 195, 255, 23, 23, 23, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 80, 80, 80, 255, 138, 138, 138, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 223, 223, 223, 255, 0, 0, 0, 255, 253, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 40, 40, 40, 255, 0, 0, 0, 255, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 9, 9, 0, 255, 20, 20, 162, 252, 55, 24, 255, 236, 249, 40, 255, 250, 85, 28, 255, 247, 121, 31, 255, 237, 227, 39, 255, 254, 30, 23, 255, 255, 21, 21, 111, 64, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 95, 128, 0, 66, 191, 255, 146, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 211, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 96, 203, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 64, 191, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 209, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 255, 238, 238, 238, 255, 195, 195, 195, 255, 23, 23, 23, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 80, 80, 80, 255, 138, 138, 138, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 223, 223, 223, 255, 0, 0, 0, 255, 253, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 40, 40, 40, 255, 0, 0, 0, 255, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 19, 19, 56, 255, 22, 22, 254, 241, 184, 35, 255, 235, 255, 41, 255, 250, 85, 28, 255, 247, 121, 31, 255, 235, 255, 41, 255, 245, 138, 31, 255, 255, 22, 22, 239, 191, 13, 13, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 95, 128, 0, 67, 192, 255, 157, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 191, 234, 255, 255, 255, 255, 255, 255, 251, 254, 255, 255, 81, 198, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 66, 192, 255, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 158, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 242, 0, 0, 0, 230, 0, 0, 0, 230, 0, 0, 0, 230, 0, 0, 0, 230, 0, 0, 0, 230, 0, 0, 0, 230, 0, 0, 0, 230, 0, 0, 0, 230, 0, 0, 0, 230, 0, 0, 0, 230, 0, 0, 0, 230, 0, 0, 0, 230, 0, 0, 0, 230, 0, 0, 0, 205, 0, 0, 0, 204, 0, 0, 0, 204, 0, 0, 0, 204, 0, 0, 0, 204, 0, 0, 0, 192, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 255, 48, 48, 48, 255, 39, 39, 39, 255, 5, 5, 5, 255, 51, 51, 51, 255, 51, 51, 51, 255, 51, 51, 51, 255, 51, 51, 51, 255, 51, 51, 51, 255, 51, 51, 51, 255, 51, 51, 51, 255, 16, 16, 16, 255, 28, 28, 28, 255, 51, 51, 51, 255, 51, 51, 51, 255, 51, 51, 51, 255, 51, 51, 51, 255, 51, 51, 51, 255, 51, 51, 51, 255, 45, 45, 45, 255, 0, 0, 0, 255, 51, 51, 51, 255, 51, 51, 51, 255, 51, 51, 51, 255, 51, 51, 51, 255, 51, 51, 51, 255, 51, 51, 51, 255, 8, 8, 8, 255, 0, 0, 0, 255, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 2, 2, 2, 255, 21, 21, 203, 249, 88, 27, 255, 235, 255, 41, 255, 235, 255, 41, 255, 249, 95, 29, 255, 245, 132, 31, 255, 235, 255, 41, 255, 236, 246, 40, 255, 253, 49, 24, 255, 255, 16, 16, 152, 128, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 48, 64, 0, 65, 192, 255, 120, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 94, 202, 255, 255, 181, 230, 255, 255, 132, 214, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 253, 63, 191, 255, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 255, 190, 190, 190, 255, 204, 204, 204, 255, 204, 204, 204, 255, 204, 204, 204, 255, 204, 204, 204, 255, 204, 204, 204, 255, 44, 44, 44, 255, 132, 132, 132, 255, 204, 204, 204, 255, 204, 204, 204, 255, 204, 204, 204, 255, 204, 204, 204, 255, 204, 204, 204, 255, 204, 204, 204, 255, 156, 156, 156, 255, 18, 18, 18, 255, 204, 204, 204, 255, 204, 204, 204, 255, 204, 204, 204, 255, 204, 204, 204, 255, 204, 204, 204, 255, 204, 204, 204, 255, 204, 204, 204, 255, 66, 66, 66, 255, 110, 110, 110, 255, 204, 204, 204, 255, 32, 32, 32, 255, 0, 0, 0, 255, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 4, 4, 0, 255, 19, 19, 100, 255, 27, 22, 255, 238, 218, 38, 255, 235, 255, 41, 255, 235, 255, 41, 255, 237, 234, 39, 255, 236, 247, 40, 255, 235, 255, 41, 255, 235, 255, 41, 255, 242, 174, 34, 255, 255, 22, 22, 252, 255, 19, 19, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 187, 255, 34, 67, 193, 255, 250, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 65, 192, 255, 185, 32, 96, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 255, 238, 238, 238, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 55, 55, 55, 255, 165, 165, 165, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 195, 195, 195, 255, 23, 23, 23, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 83, 83, 83, 255, 138, 138, 138, 255, 255, 255, 255, 255, 40, 40, 40, 255, 0, 0, 0, 255, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 13, 13, 16, 255, 22, 22, 234, 246, 127, 30, 255, 235, 255, 41, 255, 235, 255, 41, 255, 235, 255, 41, 255, 246, 130, 31, 255, 242, 171, 35, 255, 235, 255, 41, 255, 235, 255, 41, 255, 235, 255, 41, 255, 250, 77, 26, 255, 255, 21, 21, 192, 191, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 47, 64, 0, 66, 192, 255, 128, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 242, 64, 191, 255, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 255, 238, 238, 238, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 55, 55, 55, 255, 165, 165, 165, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 195, 195, 195, 255, 23, 23, 23, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 83, 83, 83, 255, 138, 138, 138, 255, 255, 255, 255, 255, 40, 40, 40, 255, 0, 0, 0, 255, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 5, 5, 0, 255, 15, 15, 142, 255, 24, 22, 255, 244, 149, 32, 255, 243, 162, 33, 255, 243, 162, 33, 255, 243, 162, 33, 255, 244, 154, 32, 255, 243, 162, 33, 255, 243, 162, 33, 255, 243, 162, 33, 255, 243, 162, 33, 255, 247, 119, 29, 255, 255, 22, 22, 255, 255, 21, 21, 84, 64, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 128, 191, 2, 66, 192, 255, 128, 67, 193, 255, 251, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 255, 67, 193, 255, 224, 51, 186, 255, 56, 15, 47, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 227, 0, 0, 0, 255, 221, 221, 221, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 55, 55, 55, 255, 165, 165, 165, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 195, 195, 195, 255, 23, 23, 23, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 83, 83, 83, 255, 138, 138, 138, 255, 254, 254, 254, 255, 25, 25, 25, 255, 0, 0, 0, 255, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 10, 10, 0, 255, 20, 20, 158, 255, 22, 22, 230, 255, 22, 22, 230, 255, 22, 22, 230, 255, 22, 22, 230, 255, 22, 22, 230, 255, 22, 22, 230, 255, 22, 22, 230, 255, 22, 22, 230, 255, 22, 22, 230, 255, 22, 22, 230, 255, 22, 22, 230, 255, 22, 22, 230, 255, 15, 15, 114, 128, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 47, 64, 0, 60, 187, 255, 34, 63, 190, 255, 120, 66, 191, 255, 155, 65, 191, 255, 149, 65, 191, 255, 91, 46, 140, 191, 8, 9, 46, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 0, 0, 0, 255, 50, 50, 50, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 28, 28, 28, 255, 83, 83, 83, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 98, 98, 98, 255, 11, 11, 11, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128, 255, 41, 41, 41, 255, 69, 69, 69, 255, 79, 79, 79, 255, 0, 0, 0, 255, 0, 0, 0, 227, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 10, 10, 0, 128, 11, 11, 0, 128, 11, 11, 0, 128, 11, 11, 0, 128, 11, 11, 0, 128, 11, 11, 0, 128, 11, 11, 0, 128, 11, 11, 0, 128, 11, 11, 0, 128, 11, 11, 0, 128, 11, 11, 0, 128, 11, 11, 0, 128, 11, 11, 0, 128, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 46, 64, 0, 33, 95, 128, 0, 31, 94, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 226, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 244, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 99, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 0, 128, 0, 0, 0, 111, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 128, 128, 128, 0, 191, 20, 20, 5, 128, 75, 75, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 77, 77, 0, 191, 17, 17, 5, 128, 128, 128, 0, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 4, 191, 191, 191, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 7, 255, 255, 255, 83, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 173, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 124, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 172, 128, 128, 128, 0, 128, 128, 128, 0, 255, 255, 255, 131, 255, 243, 243, 179, 255, 45, 45, 222, 255, 123, 123, 195, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 133, 133, 192, 255, 38, 38, 225, 255, 240, 240, 179, 255, 255, 255, 138, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 4, 255, 255, 255, 167, 255, 255, 255, 186, 191, 191, 191, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 228, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 95, 255, 255, 255, 255, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 193, 255, 255, 255, 224, 255, 255, 255, 153, 255, 255, 255, 153, 255, 255, 255, 153, 255, 255, 255, 153, 255, 255, 255, 153, 255, 255, 255, 153, 255, 255, 255, 153, 255, 255, 255, 153, 255, 255, 255, 153, 255, 255, 255, 153, 255, 255, 255, 192, 255, 255, 255, 255, 255, 255, 255, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 178, 255, 255, 255, 247, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 233, 255, 255, 255, 245, 128, 128, 128, 0, 128, 128, 128, 0, 255, 244, 244, 188, 255, 62, 62, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 126, 126, 232, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 135, 135, 229, 255, 1, 1, 255, 255, 0, 0, 255, 255, 56, 56, 255, 255, 241, 241, 198, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 3, 255, 255, 255, 166, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 185, 191, 191, 191, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 228, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 149, 255, 255, 255, 164, 191, 191, 191, 1, 64, 64, 64, 0, 128, 128, 128, 0, 191, 191, 191, 10, 255, 255, 255, 126, 255, 255, 255, 255, 255, 255, 255, 24, 128, 128, 128, 0, 64, 64, 64, 0, 0, 0, 0, 0, 191, 191, 191, 19, 255, 255, 255, 160, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 193, 255, 255, 255, 178, 191, 191, 191, 0, 128, 128, 128, 0, 128, 128, 128, 0, 51, 255, 32, 26, 26, 255, 0, 204, 26, 255, 0, 204, 53, 255, 32, 90, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 255, 255, 255, 98, 255, 255, 255, 255, 255, 255, 255, 18, 64, 64, 64, 0, 255, 255, 255, 66, 255, 255, 255, 102, 255, 255, 255, 102, 255, 255, 255, 209, 255, 255, 255, 213, 191, 191, 191, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 191, 191, 191, 0, 255, 255, 255, 145, 255, 255, 255, 245, 128, 128, 128, 0, 191, 22, 22, 9, 255, 53, 53, 224, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 21, 21, 110, 191, 128, 128, 0, 191, 128, 128, 0, 255, 21, 21, 102, 255, 0, 0, 254, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 48, 48, 230, 191, 21, 21, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 3, 255, 255, 255, 166, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 184, 191, 191, 191, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 228, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 93, 255, 255, 255, 255, 255, 255, 255, 122, 255, 255, 255, 100, 255, 255, 255, 207, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 231, 255, 255, 255, 130, 255, 255, 255, 31, 255, 255, 255, 191, 255, 255, 255, 241, 255, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 193, 255, 255, 255, 178, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 255, 0, 33, 26, 255, 0, 255, 26, 255, 0, 255, 24, 255, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 98, 255, 255, 255, 255, 255, 255, 255, 18, 128, 128, 128, 0, 255, 255, 255, 165, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 213, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 145, 255, 255, 255, 245, 128, 128, 128, 0, 191, 29, 29, 3, 255, 80, 80, 215, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 108, 255, 0, 0, 99, 255, 0, 0, 254, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 73, 73, 223, 191, 28, 28, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 3, 255, 255, 255, 164, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 184, 191, 191, 191, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 228, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 163, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 194, 255, 255, 255, 112, 255, 255, 255, 76, 255, 255, 255, 72, 255, 255, 255, 101, 255, 255, 255, 164, 255, 255, 255, 249, 255, 255, 255, 251, 255, 255, 255, 253, 255, 255, 255, 74, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 193, 255, 255, 255, 178, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 255, 0, 33, 26, 255, 0, 255, 26, 255, 0, 255, 24, 255, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 98, 255, 255, 255, 255, 255, 255, 255, 18, 128, 128, 128, 0, 255, 255, 255, 165, 255, 255, 255, 231, 255, 255, 255, 51, 255, 255, 255, 193, 255, 255, 255, 213, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 145, 255, 255, 255, 245, 128, 128, 128, 0, 128, 128, 128, 0, 255, 252, 252, 188, 255, 81, 81, 247, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 254, 255, 0, 0, 253, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 73, 73, 248, 255, 250, 250, 198, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 3, 255, 255, 255, 164, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 183, 191, 191, 191, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 228, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 42, 255, 255, 255, 238, 255, 255, 255, 226, 255, 255, 255, 56, 128, 128, 128, 0, 191, 191, 191, 31, 255, 255, 255, 159, 255, 255, 255, 172, 255, 255, 255, 66, 191, 191, 191, 0, 255, 255, 255, 24, 255, 255, 255, 187, 255, 255, 255, 254, 255, 255, 255, 96, 64, 64, 64, 0, 191, 191, 191, 3, 255, 255, 255, 15, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 6, 191, 191, 191, 10, 128, 128, 128, 0, 255, 255, 255, 193, 255, 255, 255, 178, 53, 255, 32, 52, 25, 255, 0, 77, 25, 255, 0, 77, 24, 255, 0, 99, 26, 255, 0, 255, 26, 255, 0, 255, 25, 255, 0, 155, 25, 255, 0, 77, 25, 255, 0, 77, 25, 255, 0, 76, 226, 255, 223, 98, 255, 255, 255, 255, 255, 255, 255, 18, 128, 128, 128, 0, 255, 255, 255, 165, 255, 255, 255, 225, 255, 255, 255, 0, 255, 255, 255, 178, 255, 255, 255, 213, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 145, 255, 255, 255, 245, 128, 128, 128, 0, 128, 128, 128, 0, 255, 255, 255, 188, 255, 246, 246, 180, 255, 0, 0, 170, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 178, 255, 239, 239, 172, 255, 255, 255, 198, 128, 128, 128, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 112, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 207, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 131, 191, 191, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 228, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 1, 255, 255, 255, 195, 255, 255, 255, 226, 191, 191, 191, 23, 64, 64, 64, 0, 191, 191, 191, 0, 255, 255, 255, 211, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 247, 255, 255, 255, 33, 0, 0, 0, 0, 191, 191, 191, 4, 255, 255, 255, 176, 255, 255, 255, 240, 255, 255, 255, 26, 255, 255, 255, 32, 255, 255, 255, 254, 255, 255, 255, 92, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 26, 255, 255, 255, 230, 255, 255, 255, 111, 128, 128, 128, 0, 255, 255, 255, 193, 255, 255, 255, 178, 26, 255, 0, 173, 26, 255, 0, 255, 26, 255, 0, 255, 26, 255, 0, 255, 26, 255, 0, 255, 26, 255, 0, 255, 26, 255, 0, 255, 26, 255, 0, 255, 26, 255, 0, 255, 26, 255, 0, 253, 198, 255, 191, 98, 255, 255, 255, 255, 255, 255, 255, 18, 128, 128, 128, 0, 255, 255, 255, 165, 255, 255, 255, 225, 255, 255, 255, 0, 255, 255, 255, 178, 255, 255, 255, 213, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 145, 255, 255, 255, 245, 128, 128, 128, 0, 128, 128, 128, 0, 255, 255, 255, 188, 255, 255, 255, 178, 255, 85, 85, 5, 255, 0, 0, 173, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 181, 255, 85, 85, 7, 255, 255, 255, 168, 255, 255, 255, 198, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 191, 191, 191, 0, 255, 255, 255, 245, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 13, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 228, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 45, 255, 255, 255, 255, 255, 255, 255, 111, 128, 128, 128, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 89, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 41, 255, 255, 255, 255, 255, 255, 255, 115, 191, 191, 191, 1, 255, 255, 255, 160, 255, 255, 255, 250, 255, 255, 255, 78, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 15, 255, 255, 255, 198, 255, 255, 255, 229, 191, 191, 191, 24, 128, 128, 128, 0, 255, 255, 255, 193, 255, 255, 255, 178, 26, 255, 0, 173, 26, 255, 0, 255, 26, 255, 0, 255, 26, 255, 0, 255, 26, 255, 0, 255, 26, 255, 0, 255, 26, 255, 0, 255, 26, 255, 0, 255, 26, 255, 0, 255, 26, 255, 0, 253, 198, 255, 191, 98, 255, 255, 255, 255, 255, 255, 255, 18, 128, 128, 128, 0, 255, 255, 255, 165, 255, 255, 255, 225, 255, 255, 255, 0, 255, 255, 255, 178, 255, 255, 255, 213, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 145, 255, 255, 255, 245, 128, 128, 128, 0, 128, 128, 128, 0, 255, 255, 255, 188, 255, 255, 255, 178, 191, 128, 128, 0, 255, 0, 0, 94, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 104, 191, 128, 128, 0, 255, 255, 255, 168, 255, 255, 255, 198, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 245, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 191, 191, 191, 0, 255, 255, 255, 228, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 33, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 5, 255, 255, 255, 209, 255, 255, 255, 215, 191, 191, 191, 13, 0, 0, 0, 0, 191, 191, 191, 1, 255, 255, 255, 222, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 255, 255, 255, 41, 0, 0, 0, 0, 191, 191, 191, 1, 255, 255, 255, 158, 255, 255, 255, 247, 255, 255, 255, 36, 0, 0, 0, 0, 191, 191, 191, 5, 255, 255, 255, 184, 255, 255, 255, 253, 255, 255, 255, 137, 191, 191, 191, 18, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 191, 191, 191, 0, 255, 255, 255, 66, 255, 255, 255, 219, 255, 255, 255, 251, 255, 255, 255, 61, 64, 64, 64, 0, 128, 128, 128, 0, 255, 255, 255, 193, 255, 255, 255, 178, 52, 255, 32, 35, 25, 255, 0, 51, 25, 255, 0, 51, 24, 255, 0, 77, 26, 255, 0, 255, 26, 255, 0, 255, 25, 255, 0, 141, 25, 255, 0, 51, 25, 255, 0, 51, 25, 255, 0, 51, 226, 255, 223, 98, 255, 255, 255, 255, 255, 255, 255, 18, 128, 128, 128, 0, 255, 255, 255, 165, 255, 255, 255, 225, 255, 255, 255, 0, 255, 255, 255, 178, 255, 255, 255, 213, 191, 191, 191, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 191, 191, 191, 0, 255, 255, 255, 145, 255, 255, 255, 245, 128, 128, 128, 0, 128, 128, 128, 0, 255, 255, 255, 188, 255, 255, 255, 178, 255, 21, 21, 86, 255, 0, 0, 252, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 253, 255, 21, 21, 95, 255, 255, 255, 168, 255, 255, 255, 198, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 245, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 95, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 211, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 143, 191, 191, 191, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 55, 255, 255, 255, 247, 255, 255, 255, 211, 255, 255, 255, 35, 191, 191, 191, 0, 255, 255, 255, 45, 255, 255, 255, 183, 255, 255, 255, 197, 255, 255, 255, 87, 128, 128, 128, 0, 191, 191, 191, 11, 255, 255, 255, 165, 255, 255, 255, 255, 255, 255, 255, 116, 64, 64, 64, 0, 0, 0, 0, 0, 191, 191, 191, 10, 255, 255, 255, 205, 255, 255, 255, 237, 255, 255, 255, 252, 255, 255, 255, 249, 255, 255, 255, 186, 255, 255, 255, 152, 255, 255, 255, 142, 255, 255, 255, 168, 255, 255, 255, 220, 255, 255, 255, 255, 255, 255, 255, 222, 255, 255, 255, 252, 255, 255, 255, 149, 128, 128, 128, 0, 128, 128, 128, 0, 255, 255, 255, 193, 255, 255, 255, 178, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 255, 0, 33, 26, 255, 0, 255, 26, 255, 0, 255, 24, 255, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 98, 255, 255, 255, 255, 255, 255, 255, 18, 128, 128, 128, 0, 255, 255, 255, 165, 255, 255, 255, 225, 255, 255, 255, 0, 255, 255, 255, 178, 255, 255, 255, 238, 255, 255, 255, 153, 255, 255, 255, 153, 255, 255, 255, 153, 255, 255, 255, 153, 255, 255, 255, 153, 255, 255, 255, 153, 255, 255, 255, 153, 255, 255, 255, 211, 255, 255, 255, 245, 128, 128, 128, 0, 128, 128, 128, 0, 255, 255, 255, 188, 255, 157, 157, 221, 255, 0, 0, 251, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 253, 255, 145, 145, 220, 255, 255, 255, 198, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 245, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 1, 255, 255, 255, 145, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 194, 191, 191, 191, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 54, 255, 255, 255, 230, 255, 255, 255, 251, 255, 255, 255, 169, 255, 255, 255, 87, 255, 255, 255, 52, 255, 255, 255, 41, 255, 255, 255, 77, 255, 255, 255, 140, 255, 255, 255, 238, 255, 255, 255, 250, 255, 255, 255, 103, 64, 64, 64, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 149, 255, 255, 255, 244, 255, 255, 255, 47, 255, 255, 255, 29, 255, 255, 255, 126, 255, 255, 255, 184, 255, 255, 255, 225, 255, 255, 255, 255, 255, 255, 255, 196, 255, 255, 255, 163, 255, 255, 255, 74, 191, 191, 191, 3, 255, 255, 255, 102, 255, 255, 255, 255, 255, 255, 255, 66, 128, 128, 128, 0, 255, 255, 255, 193, 255, 255, 255, 178, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 255, 0, 33, 26, 255, 0, 255, 26, 255, 0, 255, 24, 255, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 98, 255, 255, 255, 255, 255, 255, 255, 18, 128, 128, 128, 0, 255, 255, 255, 165, 255, 255, 255, 225, 255, 255, 255, 0, 255, 255, 255, 160, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 251, 255, 255, 255, 244, 255, 255, 255, 230, 255, 255, 255, 221, 128, 128, 128, 0, 128, 86, 86, 0, 255, 167, 167, 193, 255, 5, 5, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 189, 255, 0, 0, 182, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 3, 3, 255, 255, 160, 160, 204, 128, 85, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 245, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 1, 255, 255, 255, 146, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 195, 191, 191, 191, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 191, 191, 191, 21, 255, 255, 255, 125, 255, 255, 255, 229, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 246, 255, 255, 255, 155, 255, 255, 255, 44, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 83, 255, 255, 255, 63, 64, 64, 64, 0, 0, 0, 0, 0, 64, 64, 64, 0, 128, 128, 128, 0, 255, 255, 255, 92, 255, 255, 255, 255, 255, 255, 255, 10, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 255, 255, 255, 53, 191, 191, 191, 21, 128, 128, 128, 0, 255, 255, 255, 193, 255, 255, 255, 178, 191, 191, 191, 0, 128, 128, 128, 0, 128, 128, 128, 0, 51, 255, 32, 23, 26, 255, 0, 179, 26, 255, 0, 179, 53, 255, 32, 79, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 255, 255, 255, 98, 255, 255, 255, 255, 255, 255, 255, 18, 128, 128, 128, 0, 255, 255, 255, 165, 255, 255, 255, 225, 191, 191, 191, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 228, 255, 255, 255, 160, 191, 191, 191, 0, 128, 128, 128, 0, 0, 0, 0, 0, 255, 0, 0, 12, 255, 11, 11, 243, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 192, 191, 0, 0, 11, 191, 0, 0, 8, 255, 0, 0, 185, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 10, 10, 248, 255, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 245, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 1, 255, 255, 255, 147, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 196, 191, 191, 191, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 191, 191, 191, 2, 255, 255, 255, 34, 255, 255, 255, 67, 255, 255, 255, 74, 255, 255, 255, 41, 191, 191, 191, 9, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 44, 255, 255, 255, 200, 191, 191, 191, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 193, 255, 255, 255, 232, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 179, 255, 255, 255, 208, 255, 255, 255, 255, 255, 255, 255, 18, 128, 128, 128, 0, 255, 255, 255, 165, 255, 255, 255, 243, 255, 255, 255, 153, 255, 255, 255, 153, 255, 255, 255, 153, 255, 255, 255, 153, 255, 255, 255, 153, 255, 255, 255, 153, 255, 255, 255, 153, 255, 255, 255, 153, 255, 255, 255, 244, 255, 255, 255, 160, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 93, 93, 0, 255, 198, 198, 189, 255, 15, 15, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 53, 53, 239, 255, 149, 149, 114, 255, 255, 255, 102, 255, 255, 255, 102, 255, 149, 149, 111, 255, 58, 58, 236, 255, 0, 0, 255, 255, 0, 0, 255, 255, 12, 12, 255, 255, 190, 190, 200, 128, 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 245, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 1, 255, 255, 255, 148, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 196, 191, 191, 191, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 0, 191, 191, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 154, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 204, 255, 255, 255, 14, 128, 128, 128, 0, 255, 255, 255, 149, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 230, 255, 255, 255, 144, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 188, 255, 199, 199, 255, 255, 14, 14, 255, 255, 58, 58, 255, 255, 242, 242, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 245, 245, 255, 255, 65, 65, 255, 255, 11, 11, 255, 255, 192, 192, 255, 255, 255, 255, 198, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 245, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 1, 255, 255, 255, 148, 255, 255, 255, 197, 191, 191, 191, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 64, 64, 64, 0, 0, 0, 0, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 128, 94, 94, 0, 255, 0, 0, 52, 191, 25, 25, 14, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 191, 27, 27, 11, 255, 0, 0, 55, 128, 93, 93, 0, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 1, 191, 191, 191, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 2, 101, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 2, 2, 2, 92, 3, 3, 3, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 5, 178, 3, 0, 107, 254, 2, 0, 84, 255, 0, 0, 2, 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 188, 151, 151, 151, 254, 37, 37, 37, 225, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 27, 29, 29, 29, 220, 25, 25, 25, 213, 1, 1, 1, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 3, 0, 107, 254, 5, 0, 173, 255, 5, 0, 173, 255, 2, 0, 72, 255, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 176, 251, 251, 251, 255, 207, 207, 207, 254, 9, 9, 9, 180, 0, 0, 0, 24, 27, 27, 27, 215, 220, 220, 220, 255, 185, 185, 185, 255, 2, 2, 2, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 90, 2, 0, 76, 254, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 170, 255, 1, 0, 61, 253, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 223, 223, 223, 255, 255, 255, 255, 255, 152, 152, 152, 255, 23, 23, 23, 236, 216, 216, 216, 255, 255, 255, 255, 255, 124, 124, 124, 254, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 138, 71, 71, 71, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 69, 69, 69, 255, 61, 61, 61, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 77, 77, 77, 255, 3, 3, 3, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 1, 0, 47, 244, 5, 0, 171, 255, 5, 0, 173, 255, 5, 0, 158, 255, 1, 0, 42, 242, 0, 0, 1, 86, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 94, 0, 0, 0, 80, 0, 0, 0, 77, 1, 1, 1, 160, 190, 190, 190, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 252, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 62, 62, 62, 240, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 235, 235, 235, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 213, 213, 213, 255, 62, 62, 62, 239, 4, 4, 4, 177, 0, 0, 0, 165, 39, 39, 39, 227, 176, 176, 176, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 8, 8, 8, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 1, 0, 25, 227, 5, 0, 162, 255, 5, 0, 173, 255, 4, 0, 136, 254, 1, 0, 19, 219, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 71, 105, 105, 105, 254, 157, 157, 157, 255, 153, 153, 153, 255, 149, 149, 149, 250, 238, 238, 238, 255, 252, 252, 252, 255, 190, 190, 190, 255, 196, 196, 196, 255, 254, 254, 254, 255, 255, 255, 255, 255, 22, 22, 22, 236, 0, 0, 0, 161, 0, 0, 0, 136, 6, 6, 6, 114, 0, 0, 0, 16, 0, 0, 0, 155, 235, 235, 235, 255, 255, 255, 255, 255, 255, 255, 255, 255, 217, 217, 217, 255, 10, 10, 10, 196, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 1, 1, 1, 150, 160, 160, 160, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 8, 8, 8, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 18, 18, 18, 224, 28, 27, 46, 255, 4, 1, 130, 255, 3, 0, 106, 254, 0, 0, 5, 180, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 116, 124, 124, 124, 255, 252, 252, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 73, 73, 73, 244, 0, 0, 0, 122, 1, 1, 1, 133, 101, 101, 101, 251, 255, 255, 255, 255, 255, 255, 255, 255, 237, 237, 237, 255, 212, 212, 212, 255, 131, 131, 131, 255, 2, 2, 2, 93, 0, 0, 0, 155, 235, 235, 235, 255, 255, 255, 255, 255, 255, 255, 255, 255, 72, 72, 72, 244, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 19, 19, 19, 204, 244, 244, 244, 255, 255, 255, 255, 255, 255, 255, 255, 255, 8, 8, 8, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7, 7, 7, 198, 148, 148, 148, 255, 177, 177, 177, 255, 8, 7, 18, 254, 0, 0, 0, 130, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 97, 46, 46, 46, 233, 197, 197, 197, 254, 255, 255, 255, 255, 218, 218, 218, 255, 0, 0, 0, 145, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 171, 243, 243, 243, 255, 255, 255, 255, 255, 255, 255, 255, 255, 234, 234, 234, 255, 107, 107, 107, 254, 3, 3, 3, 110, 0, 0, 0, 155, 235, 235, 235, 255, 255, 255, 255, 255, 251, 251, 251, 255, 9, 9, 9, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 123, 198, 198, 198, 255, 255, 255, 255, 255, 255, 255, 255, 255, 8, 8, 8, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 162, 12, 12, 12, 239, 14, 14, 14, 255, 45, 45, 45, 255, 170, 170, 170, 255, 49, 49, 49, 253, 1, 1, 1, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 3, 3, 3, 220, 231, 231, 231, 255, 235, 235, 235, 255, 5, 5, 5, 182, 0, 0, 0, 2, 0, 0, 0, 6, 18, 18, 18, 206, 250, 250, 250, 255, 228, 228, 228, 255, 101, 101, 101, 254, 8, 8, 8, 181, 1, 1, 1, 69, 1, 1, 1, 0, 0, 0, 0, 155, 235, 235, 235, 255, 255, 255, 255, 255, 244, 244, 244, 255, 1, 1, 1, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 105, 179, 179, 179, 255, 255, 255, 255, 255, 255, 255, 255, 255, 8, 8, 8, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 53, 25, 0, 0, 239, 77, 0, 0, 255, 32, 11, 11, 255, 47, 47, 47, 255, 35, 35, 35, 255, 8, 8, 8, 237, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 134, 134, 134, 255, 255, 255, 255, 255, 255, 255, 255, 255, 163, 163, 163, 254, 33, 33, 33, 218, 39, 39, 39, 224, 182, 182, 182, 254, 255, 255, 255, 255, 175, 175, 175, 254, 0, 0, 0, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 235, 235, 235, 255, 255, 255, 255, 255, 255, 255, 255, 255, 37, 37, 37, 221, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, 229, 229, 229, 255, 255, 255, 255, 255, 255, 255, 255, 255, 8, 8, 8, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 20, 0, 0, 207, 235, 0, 0, 255, 255, 0, 0, 255, 239, 0, 0, 255, 50, 4, 4, 255, 44, 44, 44, 255, 0, 0, 0, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 73, 92, 92, 92, 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 75, 75, 75, 247, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 235, 235, 235, 255, 255, 255, 255, 255, 255, 255, 255, 255, 161, 161, 161, 254, 0, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 63, 96, 96, 96, 251, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 8, 8, 8, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 87, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 178, 0, 0, 255, 8, 8, 8, 254, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 164, 208, 208, 208, 255, 221, 221, 221, 255, 127, 127, 127, 254, 42, 42, 42, 245, 201, 201, 201, 255, 255, 255, 255, 255, 252, 252, 252, 255, 119, 119, 119, 254, 213, 213, 213, 255, 255, 255, 255, 255, 226, 226, 226, 255, 14, 14, 14, 193, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 155, 235, 235, 235, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 128, 128, 128, 255, 3, 3, 3, 169, 1, 1, 1, 81, 0, 0, 0, 69, 2, 2, 2, 137, 79, 79, 79, 248, 242, 242, 242, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 8, 8, 8, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 121, 0, 0, 255, 255, 0, 0, 255, 226, 0, 0, 255, 204, 0, 0, 255, 159, 0, 0, 255, 1, 0, 0, 189, 0, 0, 0, 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, 26, 18, 18, 18, 213, 0, 0, 0, 156, 0, 0, 0, 63, 0, 0, 0, 66, 138, 138, 138, 253, 255, 255, 255, 255, 189, 189, 189, 255, 1, 1, 1, 148, 3, 3, 3, 160, 92, 92, 92, 252, 186, 186, 186, 255, 21, 21, 21, 210, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 155, 165, 165, 165, 255, 179, 179, 179, 255, 179, 179, 179, 255, 179, 179, 179, 255, 179, 179, 179, 255, 141, 141, 141, 255, 76, 76, 76, 254, 64, 64, 64, 253, 121, 121, 121, 255, 179, 179, 179, 255, 179, 179, 179, 255, 179, 179, 179, 255, 179, 179, 179, 255, 179, 179, 179, 255, 5, 5, 5, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 128, 0, 0, 255, 84, 0, 0, 254, 0, 0, 0, 178, 0, 0, 0, 128, 1, 0, 0, 115, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 90, 90, 90, 254, 255, 255, 255, 255, 104, 104, 104, 254, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 40, 1, 1, 1, 142, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 49, 11, 11, 11, 107, 11, 11, 11, 107, 11, 11, 11, 107, 11, 11, 11, 107, 11, 11, 11, 107, 11, 11, 11, 107, 11, 11, 11, 107, 11, 11, 11, 107, 11, 11, 11, 107, 11, 11, 11, 107, 11, 11, 11, 107, 11, 11, 11, 107, 11, 11, 11, 107, 11, 11, 11, 107, 5, 5, 5, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 9, 0, 0, 251, 1, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 0, 31, 31, 31, 221, 176, 176, 176, 255, 22, 22, 22, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 81, 1, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 1, 1, 1, 101, 3, 3, 3, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 167, 0, 0, 0, 221, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 0, 0, 0, 225, 0, 0, 0, 174, 0, 0, 27, 70, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 166, 1, 1, 1, 220, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 226, 0, 0, 0, 174, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 165, 0, 0, 0, 218, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 0, 0, 0, 226, 0, 0, 0, 175, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 163, 1, 1, 1, 218, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 228, 0, 0, 0, 176, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 162, 0, 0, 0, 217, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 0, 0, 0, 228, 0, 0, 0, 177, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 160, 1, 1, 1, 216, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 229, 0, 0, 0, 178, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 158, 0, 0, 0, 215, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 0, 0, 0, 230, 0, 0, 0, 179, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 157, 1, 1, 1, 214, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 231, 0, 0, 0, 180, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 2, 2, 2, 248, 52, 52, 52, 253, 85, 85, 85, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 33, 31, 112, 254, 2, 0, 82, 255, 0, 0, 8, 255, 0, 0, 22, 136, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 101, 3, 3, 3, 247, 92, 92, 92, 253, 153, 153, 153, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 128, 127, 166, 253, 19, 15, 160, 255, 7, 4, 132, 255, 5, 4, 26, 252, 0, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 2, 2, 2, 246, 50, 50, 50, 253, 84, 84, 84, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 88, 88, 88, 253, 58, 58, 58, 253, 5, 5, 5, 252, 0, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 3, 3, 3, 246, 89, 89, 89, 253, 151, 151, 151, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 159, 159, 159, 253, 107, 107, 107, 253, 10, 10, 10, 253, 0, 0, 0, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 1, 1, 1, 244, 48, 48, 48, 253, 83, 83, 83, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 88, 88, 88, 253, 60, 60, 60, 253, 6, 6, 6, 253, 0, 0, 0, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 2, 2, 2, 244, 85, 85, 85, 253, 149, 149, 149, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 161, 161, 161, 253, 110, 110, 110, 253, 11, 11, 11, 254, 0, 0, 0, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 1, 1, 1, 242, 46, 46, 46, 253, 82, 82, 82, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 95, 95, 95, 253, 89, 89, 89, 253, 61, 61, 61, 253, 7, 7, 7, 253, 0, 0, 0, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 1, 1, 1, 241, 81, 81, 81, 253, 148, 148, 148, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 173, 173, 173, 253, 162, 162, 162, 253, 112, 112, 112, 253, 14, 14, 14, 254, 0, 0, 0, 152, 0, 0, 0, 0, 0, 0, 0, 48, 2, 2, 2, 248, 89, 89, 89, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 90, 89, 132, 253, 5, 0, 173, 255, 5, 0, 173, 255, 4, 0, 141, 255, 0, 0, 9, 255, 0, 0, 38, 86, 0, 0, 0, 45, 4, 4, 4, 247, 159, 159, 159, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 210, 210, 214, 252, 40, 36, 180, 254, 5, 0, 173, 255, 5, 0, 173, 255, 12, 7, 163, 255, 5, 4, 32, 253, 0, 0, 0, 70, 0, 0, 0, 42, 1, 1, 1, 245, 86, 86, 86, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 99, 99, 99, 252, 7, 7, 7, 253, 0, 0, 0, 74, 0, 0, 0, 39, 2, 2, 2, 244, 152, 152, 152, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 182, 182, 182, 252, 14, 14, 14, 254, 0, 0, 0, 78, 0, 0, 0, 35, 1, 1, 1, 242, 82, 82, 82, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 102, 102, 102, 252, 8, 8, 8, 253, 0, 0, 0, 83, 0, 0, 0, 33, 1, 1, 1, 241, 145, 145, 145, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 186, 186, 186, 252, 17, 17, 17, 254, 0, 0, 0, 87, 0, 0, 0, 30, 0, 0, 0, 239, 78, 78, 78, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 104, 104, 104, 252, 10, 10, 10, 253, 0, 0, 0, 92, 0, 0, 0, 27, 1, 1, 1, 238, 138, 138, 138, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 190, 190, 190, 252, 21, 21, 21, 254, 0, 0, 0, 97, 0, 0, 0, 169, 53, 53, 53, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 115, 115, 121, 252, 21, 17, 165, 254, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 2, 0, 92, 255, 0, 0, 2, 193, 0, 0, 0, 166, 92, 92, 92, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 111, 109, 194, 253, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 22, 20, 110, 254, 1, 1, 1, 197, 0, 0, 0, 161, 49, 49, 49, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 67, 67, 67, 253, 0, 0, 0, 200, 0, 0, 0, 157, 84, 84, 84, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 126, 126, 126, 253, 1, 1, 1, 205, 0, 0, 0, 152, 44, 44, 44, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 72, 72, 72, 253, 0, 0, 0, 209, 0, 0, 0, 147, 77, 77, 77, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 134, 134, 134, 253, 1, 1, 1, 214, 0, 0, 0, 142, 41, 41, 41, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 121, 114, 125, 252, 159, 93, 142, 253, 167, 88, 145, 253, 132, 106, 132, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 76, 76, 76, 253, 0, 0, 0, 219, 0, 0, 0, 137, 69, 69, 69, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 207, 201, 210, 252, 205, 140, 188, 253, 205, 125, 182, 253, 201, 173, 200, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 141, 141, 141, 253, 1, 1, 1, 225, 0, 0, 0, 223, 86, 86, 86, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 58, 56, 147, 254, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 4, 0, 141, 255, 0, 0, 4, 245, 1, 1, 1, 219, 152, 152, 152, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 181, 180, 208, 252, 11, 6, 174, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 40, 37, 163, 254, 1, 1, 1, 244, 0, 0, 0, 214, 82, 82, 82, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 101, 101, 101, 252, 1, 1, 1, 247, 1, 1, 1, 210, 146, 146, 146, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 186, 186, 186, 252, 1, 1, 1, 249, 0, 0, 0, 205, 78, 78, 78, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 115, 115, 115, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 105, 105, 105, 252, 1, 1, 1, 250, 1, 1, 1, 203, 138, 138, 138, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 207, 207, 207, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 194, 194, 194, 252, 1, 1, 1, 252, 0, 0, 0, 200, 74, 74, 74, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 133, 105, 129, 253, 199, 72, 160, 255, 215, 67, 161, 255, 215, 67, 161, 255, 212, 68, 161, 255, 142, 100, 138, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 110, 110, 110, 252, 1, 1, 1, 253, 1, 1, 1, 198, 130, 130, 130, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 204, 178, 201, 253, 204, 77, 165, 255, 215, 67, 161, 255, 215, 67, 161, 255, 212, 68, 161, 255, 198, 154, 194, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 201, 201, 201, 252, 2, 2, 2, 253, 1, 1, 1, 253, 103, 103, 103, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 97, 97, 129, 252, 7, 2, 172, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 164, 255, 0, 0, 1, 254, 1, 1, 1, 249, 183, 183, 183, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 214, 214, 215, 252, 53, 50, 182, 254, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 32, 28, 177, 254, 1, 1, 1, 253, 1, 1, 1, 245, 99, 99, 99, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 118, 118, 118, 252, 1, 1, 1, 253, 1, 1, 1, 242, 175, 175, 175, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 214, 214, 214, 252, 3, 3, 3, 254, 0, 0, 0, 240, 94, 94, 94, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 115, 115, 115, 252, 51, 51, 51, 253, 2, 2, 2, 255, 3, 3, 3, 255, 38, 38, 38, 253, 111, 111, 111, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 4, 4, 4, 253, 1, 1, 1, 237, 166, 166, 166, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 209, 209, 209, 252, 95, 95, 95, 253, 4, 4, 4, 255, 4, 4, 4, 255, 67, 67, 67, 253, 199, 199, 199, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 9, 9, 9, 254, 0, 0, 0, 235, 90, 90, 90, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 151, 97, 138, 253, 213, 67, 161, 255, 214, 66, 160, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 208, 68, 161, 255, 132, 107, 131, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 7, 7, 7, 253, 1, 1, 1, 233, 159, 159, 159, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 204, 153, 192, 253, 213, 67, 161, 255, 214, 66, 160, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 209, 69, 162, 255, 202, 175, 200, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 17, 17, 17, 254, 1, 1, 1, 253, 104, 104, 104, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 117, 117, 119, 252, 28, 24, 162, 254, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 49, 46, 143, 253, 1, 1, 1, 253, 1, 1, 1, 249, 184, 184, 184, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 128, 126, 197, 253, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 20, 15, 176, 255, 169, 168, 201, 253, 1, 1, 1, 253, 1, 1, 1, 245, 99, 99, 99, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 166, 78, 78, 253, 223, 28, 28, 254, 150, 91, 91, 253, 119, 119, 119, 252, 119, 119, 119, 252, 118, 118, 118, 252, 1, 1, 1, 253, 1, 1, 1, 242, 176, 176, 176, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 228, 144, 144, 253, 245, 50, 50, 254, 224, 163, 163, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 3, 3, 3, 254, 0, 0, 0, 241, 95, 95, 95, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 112, 112, 112, 252, 28, 28, 28, 254, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 25, 25, 25, 254, 114, 114, 114, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 4, 4, 4, 253, 1, 1, 1, 238, 167, 167, 167, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 204, 204, 204, 252, 54, 54, 54, 254, 1, 1, 1, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 42, 42, 42, 254, 204, 204, 204, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 10, 10, 10, 254, 0, 0, 0, 235, 91, 91, 91, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 167, 88, 147, 253, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 200, 71, 160, 255, 124, 112, 127, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 8, 8, 8, 253, 1, 1, 1, 234, 161, 161, 161, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 202, 125, 183, 253, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 204, 74, 164, 255, 204, 191, 207, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 18, 18, 18, 254, 1, 1, 1, 253, 104, 104, 104, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 67, 66, 143, 253, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 51, 48, 150, 254, 113, 113, 113, 252, 1, 1, 1, 253, 1, 1, 1, 249, 184, 184, 184, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 192, 191, 210, 252, 17, 12, 175, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 18, 13, 175, 255, 172, 172, 206, 253, 209, 209, 209, 252, 1, 1, 1, 253, 1, 1, 1, 245, 99, 99, 99, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 175, 69, 69, 253, 254, 1, 1, 255, 255, 0, 0, 255, 182, 63, 63, 253, 119, 119, 119, 252, 119, 119, 119, 252, 118, 118, 118, 252, 1, 1, 1, 253, 1, 1, 1, 242, 176, 176, 176, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 231, 129, 129, 253, 255, 2, 2, 255, 255, 0, 0, 255, 234, 110, 110, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 3, 3, 3, 254, 0, 0, 0, 241, 95, 95, 95, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 115, 115, 115, 252, 100, 100, 100, 252, 117, 117, 117, 252, 108, 108, 108, 252, 23, 23, 23, 254, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 51, 51, 51, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 4, 4, 4, 253, 1, 1, 1, 238, 167, 167, 167, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 209, 209, 209, 252, 181, 181, 181, 252, 210, 210, 210, 252, 197, 197, 197, 252, 44, 44, 44, 254, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 88, 88, 88, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 10, 10, 10, 254, 0, 0, 0, 235, 91, 91, 91, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 121, 116, 121, 252, 183, 80, 150, 254, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 214, 66, 160, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 190, 76, 156, 254, 120, 116, 123, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 8, 8, 8, 253, 1, 1, 1, 234, 161, 161, 161, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 212, 209, 213, 252, 206, 105, 174, 254, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 203, 87, 169, 254, 208, 204, 211, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 18, 18, 18, 254, 1, 1, 1, 253, 104, 104, 104, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 104, 103, 126, 252, 10, 5, 171, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 49, 46, 151, 254, 118, 118, 119, 252, 113, 113, 113, 252, 1, 1, 1, 253, 1, 1, 1, 249, 184, 184, 184, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 69, 66, 185, 254, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 16, 12, 175, 255, 170, 169, 205, 253, 215, 215, 215, 252, 209, 209, 209, 252, 1, 1, 1, 253, 1, 1, 1, 245, 99, 99, 99, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 182, 64, 64, 253, 255, 0, 0, 255, 255, 0, 0, 255, 225, 26, 26, 254, 127, 112, 112, 252, 119, 119, 119, 252, 119, 119, 119, 252, 118, 118, 118, 252, 1, 1, 1, 253, 1, 1, 1, 242, 176, 176, 176, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 233, 119, 119, 253, 255, 1, 1, 255, 255, 0, 0, 255, 246, 45, 45, 254, 218, 200, 200, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 3, 3, 3, 254, 0, 0, 0, 241, 95, 95, 95, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 93, 93, 93, 253, 14, 14, 14, 254, 3, 3, 3, 255, 17, 17, 17, 254, 18, 18, 18, 254, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 9, 9, 9, 255, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 4, 4, 4, 253, 1, 1, 1, 238, 167, 167, 167, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 171, 171, 171, 253, 27, 27, 27, 254, 6, 6, 6, 255, 30, 30, 30, 254, 34, 34, 34, 254, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 12, 12, 12, 255, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 10, 10, 10, 254, 0, 0, 0, 235, 91, 91, 91, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 122, 114, 125, 252, 193, 75, 154, 254, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 214, 66, 160, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 175, 82, 152, 254, 119, 118, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 8, 8, 8, 253, 1, 1, 1, 234, 161, 161, 161, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 207, 200, 210, 252, 208, 92, 170, 254, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 214, 66, 160, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 198, 102, 174, 254, 214, 213, 214, 252, 215, 215, 215, 252, 215, 215, 215, 252, 18, 18, 18, 254, 1, 1, 1, 253, 104, 104, 104, 252, 119, 119, 119, 252, 119, 119, 119, 252, 140, 101, 101, 252, 129, 111, 111, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 35, 32, 157, 254, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 46, 44, 152, 254, 118, 118, 119, 252, 119, 119, 119, 252, 113, 113, 113, 252, 1, 1, 1, 253, 1, 1, 1, 249, 184, 184, 184, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 145, 144, 201, 253, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 15, 11, 175, 255, 167, 166, 205, 253, 215, 215, 215, 252, 215, 215, 215, 252, 209, 209, 209, 252, 1, 1, 1, 253, 1, 1, 1, 245, 99, 99, 99, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 188, 58, 58, 253, 255, 0, 0, 255, 255, 0, 0, 255, 220, 30, 30, 254, 125, 113, 113, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 118, 118, 118, 252, 1, 1, 1, 253, 1, 1, 1, 242, 176, 176, 176, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 234, 109, 109, 253, 255, 0, 0, 255, 255, 0, 0, 255, 245, 52, 52, 254, 217, 203, 203, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 3, 3, 3, 254, 0, 0, 0, 241, 95, 95, 95, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 116, 116, 116, 252, 13, 13, 13, 254, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 12, 12, 12, 254, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 4, 4, 4, 253, 1, 1, 1, 238, 167, 167, 167, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 211, 211, 211, 252, 25, 25, 25, 254, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 19, 19, 19, 254, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 10, 10, 10, 254, 0, 0, 0, 235, 91, 91, 91, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 127, 110, 128, 253, 195, 73, 158, 254, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 158, 89, 148, 254, 119, 119, 119, 252, 119, 119, 119, 252, 8, 8, 8, 253, 1, 1, 1, 234, 161, 161, 161, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 204, 188, 206, 253, 204, 84, 168, 254, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 214, 66, 160, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 193, 121, 182, 254, 215, 215, 215, 252, 215, 215, 215, 252, 18, 18, 18, 254, 1, 1, 1, 253, 104, 104, 104, 252, 119, 119, 119, 252, 211, 44, 44, 254, 252, 11, 11, 255, 249, 14, 14, 255, 151, 92, 92, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 141, 141, 153, 253, 114, 112, 181, 255, 17, 13, 174, 255, 5, 0, 173, 255, 5, 0, 173, 255, 44, 42, 153, 254, 118, 118, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 113, 113, 113, 252, 1, 1, 1, 253, 1, 1, 1, 249, 184, 184, 184, 252, 222, 176, 176, 253, 245, 59, 59, 254, 245, 62, 62, 254, 222, 174, 174, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 204, 204, 210, 252, 69, 66, 180, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 14, 9, 175, 255, 164, 163, 204, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 209, 209, 209, 252, 1, 1, 1, 253, 1, 1, 1, 245, 99, 99, 99, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 194, 53, 53, 253, 255, 0, 0, 255, 255, 0, 0, 255, 215, 35, 35, 254, 123, 115, 115, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 118, 118, 118, 252, 1, 1, 1, 253, 1, 1, 1, 242, 176, 176, 176, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 237, 99, 99, 253, 255, 0, 0, 255, 255, 0, 0, 255, 244, 60, 60, 254, 217, 207, 207, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 3, 3, 3, 254, 0, 0, 0, 241, 95, 95, 95, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 101, 101, 101, 252, 3, 3, 3, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 1, 1, 1, 255, 65, 65, 65, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 4, 4, 4, 253, 1, 1, 1, 238, 167, 167, 167, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 187, 187, 187, 252, 6, 6, 6, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 2, 2, 2, 255, 114, 114, 114, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 10, 10, 10, 254, 0, 0, 0, 235, 91, 91, 91, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 99, 114, 134, 253, 65, 98, 176, 255, 199, 70, 163, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 214, 66, 160, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 137, 102, 135, 253, 119, 119, 119, 252, 8, 8, 8, 253, 1, 1, 1, 234, 161, 161, 161, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 174, 188, 207, 253, 72, 106, 185, 255, 197, 70, 163, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 214, 66, 160, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 198, 161, 196, 253, 215, 215, 215, 252, 18, 18, 18, 254, 1, 1, 1, 253, 104, 104, 104, 252, 138, 103, 103, 252, 255, 9, 9, 255, 254, 10, 10, 255, 255, 9, 9, 255, 208, 47, 47, 254, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 127, 127, 132, 252, 184, 184, 187, 255, 188, 188, 188, 255, 129, 128, 182, 255, 5, 0, 173, 255, 43, 40, 154, 254, 117, 117, 120, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 113, 113, 113, 252, 1, 1, 1, 253, 1, 1, 1, 249, 184, 184, 184, 252, 247, 47, 47, 254, 255, 9, 9, 255, 255, 12, 12, 255, 248, 46, 46, 254, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 186, 186, 193, 254, 188, 188, 188, 255, 102, 100, 180, 255, 5, 0, 173, 255, 14, 9, 175, 255, 162, 161, 203, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 209, 209, 209, 252, 1, 1, 1, 253, 1, 1, 1, 245, 99, 99, 99, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 120, 118, 118, 252, 200, 47, 47, 254, 255, 0, 0, 255, 255, 0, 0, 255, 210, 39, 39, 254, 122, 116, 116, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 118, 118, 118, 252, 1, 1, 1, 253, 1, 1, 1, 242, 176, 176, 176, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 214, 214, 252, 238, 89, 89, 254, 255, 0, 0, 255, 255, 0, 0, 255, 242, 68, 68, 254, 216, 210, 210, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 3, 3, 3, 254, 0, 0, 0, 241, 95, 95, 95, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 117, 117, 117, 252, 20, 20, 20, 254, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 1, 1, 1, 255, 50, 50, 50, 253, 118, 118, 118, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 4, 4, 4, 253, 1, 1, 1, 238, 167, 167, 167, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 212, 212, 212, 252, 39, 39, 39, 254, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 2, 2, 2, 255, 87, 87, 87, 253, 214, 214, 214, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 10, 10, 10, 254, 0, 0, 0, 235, 91, 91, 91, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 89, 112, 143, 253, 41, 101, 183, 255, 39, 101, 185, 255, 81, 92, 178, 255, 214, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 214, 66, 160, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 172, 84, 151, 254, 119, 119, 119, 252, 8, 8, 8, 253, 1, 1, 1, 234, 161, 161, 161, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 152, 174, 204, 253, 44, 104, 186, 255, 39, 101, 185, 255, 79, 93, 179, 255, 214, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 214, 66, 160, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 196, 107, 176, 254, 215, 215, 215, 252, 18, 18, 18, 254, 1, 1, 1, 253, 104, 104, 104, 252, 126, 113, 113, 252, 247, 15, 15, 255, 255, 9, 9, 255, 255, 9, 9, 255, 187, 63, 63, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 120, 120, 120, 252, 169, 169, 174, 254, 188, 188, 188, 255, 188, 188, 188, 255, 187, 187, 188, 255, 59, 57, 157, 254, 117, 117, 120, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 113, 113, 113, 252, 1, 1, 1, 253, 1, 1, 1, 249, 184, 184, 184, 252, 249, 36, 36, 254, 255, 9, 9, 255, 255, 9, 9, 255, 250, 34, 34, 254, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 196, 196, 202, 253, 188, 188, 188, 255, 188, 188, 188, 255, 185, 185, 188, 255, 31, 27, 175, 255, 160, 159, 203, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 209, 209, 209, 252, 1, 1, 1, 253, 1, 1, 1, 245, 99, 99, 99, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 121, 117, 117, 252, 206, 42, 42, 254, 255, 0, 0, 255, 255, 0, 0, 255, 204, 44, 44, 254, 121, 117, 117, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 118, 118, 118, 252, 1, 1, 1, 253, 1, 1, 1, 242, 176, 176, 176, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 212, 212, 252, 240, 80, 80, 254, 255, 0, 0, 255, 255, 0, 0, 255, 240, 76, 76, 254, 216, 212, 212, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 3, 3, 3, 254, 0, 0, 0, 241, 95, 95, 95, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 61, 61, 61, 253, 8, 8, 8, 254, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 1, 1, 1, 255, 61, 61, 61, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 4, 4, 4, 253, 1, 1, 1, 238, 167, 167, 167, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 115, 115, 115, 253, 15, 15, 15, 254, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 2, 2, 2, 255, 107, 107, 107, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 10, 10, 10, 254, 0, 0, 0, 235, 91, 91, 91, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 118, 119, 119, 252, 77, 109, 153, 253, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 116, 85, 173, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 166, 88, 146, 253, 119, 119, 119, 252, 8, 8, 8, 253, 1, 1, 1, 234, 161, 161, 161, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 214, 214, 215, 252, 125, 157, 199, 253, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 112, 86, 174, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 202, 122, 181, 253, 215, 215, 215, 252, 18, 18, 18, 254, 1, 1, 1, 253, 104, 104, 104, 252, 119, 119, 119, 252, 148, 95, 95, 253, 206, 48, 48, 254, 185, 64, 64, 253, 123, 116, 116, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 146, 145, 151, 253, 188, 188, 188, 255, 188, 188, 188, 255, 188, 188, 188, 255, 165, 165, 173, 254, 120, 120, 123, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 113, 113, 113, 252, 1, 1, 1, 253, 1, 1, 1, 249, 184, 184, 184, 252, 227, 151, 151, 253, 252, 22, 22, 255, 252, 22, 22, 255, 227, 149, 149, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 207, 207, 211, 252, 184, 184, 188, 255, 188, 188, 188, 255, 188, 188, 188, 255, 186, 186, 188, 255, 184, 183, 203, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 209, 209, 209, 252, 1, 1, 1, 253, 1, 1, 1, 245, 99, 99, 99, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 122, 116, 116, 252, 211, 38, 38, 254, 255, 0, 0, 255, 255, 0, 0, 255, 199, 49, 49, 254, 120, 118, 118, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 118, 118, 118, 252, 1, 1, 1, 253, 1, 1, 1, 242, 176, 176, 176, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 216, 210, 210, 252, 241, 71, 71, 254, 255, 0, 0, 255, 255, 0, 0, 255, 238, 85, 85, 254, 215, 213, 213, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 3, 3, 3, 254, 0, 0, 0, 241, 95, 95, 95, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 68, 68, 68, 253, 81, 81, 81, 253, 94, 94, 94, 253, 6, 6, 6, 254, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 71, 71, 71, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 4, 4, 4, 253, 1, 1, 1, 238, 167, 167, 167, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 125, 125, 125, 253, 143, 143, 143, 253, 173, 173, 173, 253, 14, 14, 14, 254, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 1, 1, 1, 255, 126, 126, 126, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 10, 10, 10, 254, 0, 0, 0, 235, 91, 91, 91, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 116, 118, 121, 252, 65, 106, 163, 254, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 148, 79, 169, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 199, 71, 160, 255, 124, 112, 127, 252, 119, 119, 119, 252, 8, 8, 8, 253, 1, 1, 1, 234, 161, 161, 161, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 209, 211, 214, 252, 99, 140, 195, 254, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 145, 80, 170, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 204, 75, 164, 255, 204, 192, 207, 252, 215, 215, 215, 252, 18, 18, 18, 254, 1, 1, 1, 253, 104, 104, 104, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 106, 106, 106, 253, 79, 79, 79, 254, 60, 60, 60, 255, 59, 59, 59, 255, 115, 115, 116, 255, 186, 186, 187, 255, 188, 188, 188, 255, 166, 166, 174, 254, 120, 120, 123, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 113, 113, 113, 252, 1, 1, 1, 253, 1, 1, 1, 249, 184, 184, 184, 252, 215, 215, 215, 252, 215, 214, 214, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 186, 186, 186, 252, 130, 130, 130, 253, 121, 121, 121, 254, 156, 156, 159, 254, 188, 188, 188, 255, 188, 188, 188, 255, 187, 187, 188, 255, 192, 192, 202, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 209, 209, 209, 252, 1, 1, 1, 253, 1, 1, 1, 245, 99, 99, 99, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 124, 115, 115, 252, 216, 33, 33, 254, 255, 0, 0, 255, 255, 0, 0, 255, 193, 54, 54, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 118, 118, 118, 252, 1, 1, 1, 253, 1, 1, 1, 242, 176, 176, 176, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 216, 208, 208, 252, 243, 63, 63, 254, 255, 0, 0, 255, 255, 0, 0, 255, 237, 95, 95, 253, 215, 214, 214, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 3, 3, 3, 254, 0, 0, 0, 241, 95, 95, 95, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 60, 60, 60, 253, 88, 88, 88, 253, 119, 119, 119, 252, 119, 119, 119, 252, 87, 87, 87, 253, 2, 2, 2, 254, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 1, 1, 1, 255, 81, 81, 81, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 4, 4, 4, 253, 1, 1, 1, 238, 167, 167, 167, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 112, 112, 112, 253, 157, 157, 157, 253, 215, 215, 215, 252, 215, 215, 215, 252, 159, 159, 159, 253, 6, 6, 6, 254, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 2, 2, 2, 255, 143, 143, 143, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 10, 10, 10, 254, 0, 0, 0, 235, 91, 91, 91, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 111, 117, 125, 252, 55, 104, 171, 254, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 40, 101, 185, 255, 171, 75, 166, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 198, 72, 157, 254, 125, 112, 128, 252, 119, 119, 119, 252, 119, 119, 119, 252, 8, 8, 8, 253, 1, 1, 1, 234, 161, 161, 161, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 199, 205, 212, 252, 76, 125, 191, 254, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 100, 184, 255, 169, 75, 167, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 207, 79, 166, 254, 204, 190, 207, 252, 215, 215, 215, 252, 215, 215, 215, 252, 18, 18, 18, 254, 1, 1, 1, 253, 104, 104, 104, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 117, 93, 93, 253, 127, 40, 40, 255, 93, 49, 49, 255, 59, 59, 59, 255, 59, 59, 59, 255, 59, 59, 59, 255, 116, 115, 121, 255, 167, 167, 175, 254, 120, 120, 124, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 113, 113, 113, 252, 1, 1, 1, 253, 1, 1, 1, 249, 184, 184, 184, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 208, 208, 208, 252, 105, 105, 105, 254, 59, 59, 59, 255, 59, 59, 59, 255, 59, 59, 59, 255, 61, 61, 61, 255, 140, 140, 144, 255, 187, 187, 188, 255, 191, 191, 202, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 209, 209, 209, 252, 1, 1, 1, 253, 1, 1, 1, 245, 99, 99, 99, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 126, 113, 113, 252, 221, 29, 29, 254, 255, 0, 0, 255, 255, 0, 0, 255, 186, 60, 60, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 118, 118, 118, 252, 1, 1, 1, 253, 1, 1, 1, 242, 176, 176, 176, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 217, 205, 205, 252, 244, 55, 55, 254, 255, 0, 0, 255, 255, 0, 0, 255, 235, 105, 105, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 3, 3, 3, 254, 0, 0, 0, 241, 95, 95, 95, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 117, 117, 117, 252, 55, 55, 55, 253, 95, 95, 95, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 79, 79, 79, 253, 1, 1, 1, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 63, 63, 63, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 4, 4, 4, 253, 1, 1, 1, 238, 167, 167, 167, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 212, 212, 212, 252, 101, 101, 101, 254, 170, 170, 170, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 146, 146, 146, 253, 2, 2, 2, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 111, 111, 111, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 10, 10, 10, 254, 0, 0, 0, 235, 91, 91, 91, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 104, 115, 130, 253, 48, 103, 177, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 50, 98, 183, 255, 189, 71, 164, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 190, 77, 153, 254, 124, 114, 124, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 8, 8, 8, 253, 1, 1, 1, 234, 161, 161, 161, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 184, 195, 209, 252, 60, 115, 189, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 48, 99, 183, 255, 187, 71, 164, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 209, 94, 170, 254, 209, 197, 209, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 18, 18, 18, 254, 1, 1, 1, 253, 104, 104, 104, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 151, 89, 89, 253, 246, 4, 4, 255, 255, 0, 0, 255, 254, 0, 0, 255, 173, 25, 25, 255, 60, 59, 59, 255, 59, 59, 59, 255, 70, 70, 70, 255, 120, 120, 124, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 113, 113, 113, 252, 1, 1, 1, 253, 1, 1, 1, 249, 184, 184, 184, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 216, 210, 210, 252, 210, 68, 68, 254, 240, 4, 4, 255, 217, 11, 11, 255, 115, 42, 42, 255, 59, 59, 59, 255, 59, 59, 59, 255, 67, 67, 68, 255, 192, 192, 200, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 209, 209, 209, 252, 1, 1, 1, 253, 1, 1, 1, 245, 99, 99, 99, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 128, 111, 111, 252, 226, 25, 25, 254, 255, 0, 0, 255, 255, 0, 0, 255, 180, 66, 66, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 118, 118, 118, 252, 1, 1, 1, 253, 1, 1, 1, 242, 176, 176, 176, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 218, 202, 202, 252, 246, 48, 48, 254, 255, 0, 0, 255, 255, 0, 0, 255, 233, 115, 115, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 3, 3, 3, 254, 0, 0, 0, 241, 95, 95, 95, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 115, 115, 115, 252, 51, 51, 51, 253, 102, 102, 102, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 117, 117, 117, 252, 33, 33, 33, 253, 1, 1, 1, 255, 0, 0, 0, 255, 0, 0, 0, 255, 6, 6, 6, 254, 102, 102, 102, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 4, 4, 4, 253, 1, 1, 1, 238, 167, 167, 167, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 209, 209, 209, 252, 93, 93, 93, 253, 182, 182, 182, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 212, 212, 212, 252, 64, 64, 64, 253, 2, 2, 2, 255, 0, 0, 0, 255, 0, 0, 0, 255, 10, 10, 10, 254, 181, 181, 181, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 10, 10, 10, 254, 0, 0, 0, 235, 91, 91, 91, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 95, 113, 139, 253, 43, 102, 182, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 66, 95, 181, 255, 206, 69, 162, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 179, 83, 149, 254, 119, 117, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 8, 8, 8, 253, 1, 1, 1, 234, 161, 161, 161, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 164, 182, 206, 253, 48, 107, 186, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 64, 96, 181, 255, 204, 69, 162, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 206, 108, 176, 254, 213, 210, 213, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 18, 18, 18, 254, 1, 1, 1, 253, 104, 104, 104, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 235, 17, 17, 254, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 151, 31, 31, 255, 59, 59, 59, 255, 65, 65, 65, 255, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 113, 113, 113, 252, 1, 1, 1, 253, 1, 1, 1, 249, 184, 184, 184, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 235, 103, 103, 254, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 253, 1, 1, 255, 117, 41, 41, 255, 59, 59, 59, 255, 59, 59, 59, 255, 210, 210, 210, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 209, 209, 209, 252, 1, 1, 1, 253, 1, 1, 1, 245, 99, 99, 99, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 131, 108, 108, 252, 230, 21, 21, 254, 255, 0, 0, 255, 254, 1, 1, 255, 173, 71, 71, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 118, 118, 118, 252, 1, 1, 1, 253, 1, 1, 1, 242, 176, 176, 176, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 218, 197, 197, 252, 247, 41, 41, 254, 255, 0, 0, 255, 255, 1, 1, 255, 232, 125, 125, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 3, 3, 3, 254, 0, 0, 0, 241, 95, 95, 95, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 112, 112, 112, 252, 56, 44, 44, 253, 125, 93, 93, 253, 137, 105, 105, 253, 137, 105, 105, 253, 137, 105, 105, 253, 137, 105, 105, 253, 137, 105, 105, 253, 131, 102, 102, 253, 51, 50, 50, 253, 102, 102, 102, 252, 72, 72, 72, 253, 14, 14, 14, 254, 26, 26, 26, 254, 93, 93, 93, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 4, 4, 4, 253, 1, 1, 1, 238, 167, 167, 167, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 203, 203, 203, 252, 89, 77, 77, 253, 190, 159, 159, 253, 214, 182, 182, 253, 214, 182, 182, 253, 214, 182, 182, 253, 214, 182, 182, 253, 214, 182, 182, 253, 207, 177, 177, 253, 92, 92, 92, 253, 183, 183, 183, 252, 133, 133, 133, 253, 27, 27, 27, 254, 46, 46, 46, 254, 167, 167, 167, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 10, 10, 10, 254, 0, 0, 0, 235, 91, 91, 91, 253, 119, 119, 119, 252, 119, 119, 119, 252, 83, 110, 148, 253, 40, 101, 184, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 82, 91, 178, 255, 213, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 161, 90, 144, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 8, 8, 8, 253, 1, 1, 1, 234, 161, 161, 161, 253, 215, 215, 215, 252, 215, 215, 215, 252, 139, 166, 202, 253, 41, 102, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 80, 92, 178, 255, 213, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 215, 67, 161, 255, 201, 129, 184, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 18, 18, 18, 254, 1, 1, 1, 253, 104, 104, 104, 252, 119, 119, 119, 252, 144, 98, 98, 253, 197, 56, 56, 253, 180, 69, 69, 253, 122, 117, 117, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 141, 99, 99, 252, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 245, 3, 3, 255, 71, 55, 55, 255, 72, 72, 72, 254, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 113, 113, 113, 252, 1, 1, 1, 253, 1, 1, 1, 249, 184, 184, 184, 252, 215, 215, 215, 252, 222, 176, 176, 252, 222, 177, 177, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 213, 213, 252, 251, 16, 16, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 239, 5, 5, 255, 67, 57, 57, 255, 64, 64, 64, 255, 213, 213, 213, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 209, 209, 209, 252, 1, 1, 1, 253, 1, 1, 1, 245, 99, 99, 99, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 134, 106, 106, 252, 234, 18, 18, 254, 255, 0, 0, 255, 253, 2, 2, 255, 168, 76, 76, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 118, 118, 118, 252, 1, 1, 1, 253, 1, 1, 1, 242, 176, 176, 176, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 219, 193, 193, 252, 249, 35, 35, 254, 255, 0, 0, 255, 255, 3, 3, 255, 230, 135, 135, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 3, 3, 3, 254, 0, 0, 0, 241, 95, 95, 95, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 107, 107, 107, 252, 70, 34, 34, 254, 198, 50, 50, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 197, 50, 50, 255, 69, 34, 34, 254, 108, 107, 107, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 4, 4, 4, 253, 1, 1, 1, 238, 167, 167, 167, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 195, 195, 195, 252, 88, 53, 53, 254, 197, 49, 49, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 198, 50, 50, 255, 88, 52, 52, 254, 193, 192, 192, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 10, 10, 10, 254, 0, 0, 0, 235, 91, 91, 91, 253, 119, 119, 119, 252, 73, 108, 156, 253, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 96, 89, 176, 255, 214, 67, 161, 255, 205, 69, 161, 255, 143, 101, 134, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 8, 8, 8, 253, 1, 1, 1, 234, 161, 161, 161, 253, 215, 215, 215, 252, 118, 152, 198, 253, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 93, 90, 176, 255, 213, 67, 161, 255, 207, 70, 162, 255, 204, 160, 195, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 18, 18, 18, 254, 1, 1, 1, 253, 104, 104, 104, 252, 125, 114, 114, 252, 245, 17, 17, 255, 252, 10, 10, 255, 255, 9, 9, 255, 185, 65, 65, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 155, 78, 78, 253, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 129, 38, 38, 255, 86, 86, 86, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 113, 113, 113, 252, 1, 1, 1, 253, 1, 1, 1, 249, 184, 184, 184, 252, 235, 111, 111, 253, 255, 9, 9, 255, 254, 13, 13, 255, 235, 110, 110, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 218, 188, 188, 252, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 131, 37, 37, 255, 94, 94, 94, 254, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 209, 209, 209, 252, 1, 1, 1, 253, 1, 1, 1, 245, 99, 99, 99, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 137, 103, 103, 252, 238, 15, 15, 255, 255, 0, 0, 255, 252, 3, 3, 255, 162, 81, 81, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 118, 118, 118, 252, 1, 1, 1, 253, 1, 1, 1, 242, 176, 176, 176, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 220, 188, 188, 252, 249, 29, 29, 255, 255, 0, 0, 255, 254, 5, 5, 255, 228, 143, 143, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 3, 3, 3, 254, 0, 0, 0, 241, 95, 95, 95, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 102, 101, 101, 252, 77, 32, 32, 254, 204, 51, 51, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 189, 47, 47, 255, 66, 37, 37, 254, 112, 112, 112, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 4, 4, 4, 253, 1, 1, 1, 238, 167, 167, 167, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 186, 185, 185, 252, 90, 47, 47, 254, 203, 51, 51, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 191, 48, 48, 255, 88, 58, 58, 254, 201, 201, 201, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 10, 10, 10, 254, 0, 0, 0, 235, 91, 91, 91, 253, 101, 115, 133, 252, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 116, 89, 167, 254, 128, 109, 129, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 8, 8, 8, 253, 1, 1, 1, 234, 161, 161, 161, 253, 180, 192, 209, 252, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 124, 99, 178, 255, 203, 183, 204, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 18, 18, 18, 254, 1, 1, 1, 253, 104, 104, 104, 252, 139, 102, 102, 252, 255, 9, 9, 255, 254, 9, 9, 255, 255, 9, 9, 255, 208, 47, 47, 254, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 174, 65, 65, 253, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 166, 27, 27, 255, 110, 110, 110, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 113, 113, 113, 252, 1, 1, 1, 253, 1, 1, 1, 249, 184, 184, 184, 252, 250, 30, 30, 255, 255, 9, 9, 255, 255, 10, 10, 255, 251, 27, 27, 255, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 211, 150, 150, 253, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 183, 22, 22, 255, 143, 143, 143, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 209, 209, 209, 252, 1, 1, 1, 253, 1, 1, 1, 245, 99, 99, 99, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 141, 100, 100, 252, 241, 12, 12, 255, 255, 0, 0, 255, 250, 4, 4, 255, 157, 86, 86, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 118, 118, 118, 252, 1, 1, 1, 253, 1, 1, 1, 242, 176, 176, 176, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 221, 183, 183, 252, 251, 24, 24, 255, 255, 0, 0, 255, 254, 7, 7, 255, 227, 152, 152, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 3, 3, 3, 254, 0, 0, 0, 241, 95, 95, 95, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 96, 95, 95, 253, 88, 30, 30, 254, 208, 52, 52, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 179, 45, 45, 255, 64, 42, 42, 254, 115, 115, 115, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 4, 4, 4, 253, 1, 1, 1, 238, 167, 167, 167, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 175, 173, 173, 253, 96, 41, 41, 254, 207, 52, 52, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 181, 47, 47, 255, 91, 68, 68, 254, 207, 207, 207, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 10, 10, 10, 254, 0, 0, 0, 235, 91, 91, 91, 253, 91, 112, 141, 253, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 58, 105, 168, 254, 113, 118, 124, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 8, 8, 8, 253, 1, 1, 1, 234, 161, 161, 161, 253, 158, 178, 205, 253, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 79, 127, 191, 254, 200, 206, 212, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 18, 18, 18, 254, 1, 1, 1, 253, 104, 104, 104, 252, 120, 118, 118, 252, 216, 40, 40, 254, 255, 9, 9, 255, 251, 12, 12, 255, 155, 89, 89, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 185, 56, 56, 253, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 179, 55, 55, 254, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 113, 113, 113, 252, 1, 1, 1, 253, 1, 1, 1, 249, 184, 184, 184, 252, 243, 68, 68, 254, 255, 9, 9, 255, 255, 9, 9, 255, 244, 66, 66, 254, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 212, 124, 124, 253, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 209, 32, 32, 255, 207, 207, 207, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 209, 209, 209, 252, 1, 1, 1, 253, 1, 1, 1, 245, 99, 99, 99, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 144, 96, 96, 253, 244, 10, 10, 255, 255, 0, 0, 255, 248, 6, 6, 255, 152, 90, 90, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 118, 118, 118, 252, 1, 1, 1, 253, 1, 1, 1, 242, 176, 176, 176, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 222, 176, 176, 253, 251, 19, 19, 255, 255, 0, 0, 255, 253, 10, 10, 255, 225, 159, 159, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 3, 3, 3, 254, 0, 0, 0, 241, 95, 95, 95, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 89, 88, 88, 253, 102, 30, 30, 254, 210, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 167, 43, 43, 255, 64, 49, 49, 254, 117, 117, 117, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 4, 4, 4, 253, 1, 1, 1, 238, 167, 167, 167, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 162, 161, 161, 253, 106, 36, 36, 254, 210, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 170, 44, 44, 255, 98, 82, 82, 254, 211, 211, 211, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 10, 10, 10, 254, 0, 0, 0, 235, 91, 91, 91, 253, 111, 117, 125, 252, 43, 102, 182, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 68, 107, 159, 254, 117, 118, 121, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 8, 8, 8, 253, 1, 1, 1, 234, 161, 161, 161, 253, 201, 206, 213, 252, 48, 107, 186, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 102, 141, 195, 254, 210, 212, 214, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 18, 18, 18, 254, 1, 1, 1, 253, 104, 104, 104, 252, 119, 119, 119, 252, 121, 118, 118, 252, 146, 96, 96, 252, 132, 108, 108, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 191, 47, 47, 254, 255, 0, 0, 255, 255, 0, 0, 255, 230, 13, 13, 254, 200, 46, 46, 254, 201, 48, 48, 254, 178, 66, 66, 253, 126, 113, 113, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 113, 113, 113, 252, 1, 1, 1, 253, 1, 1, 1, 249, 184, 184, 184, 252, 218, 201, 201, 252, 235, 109, 109, 253, 235, 109, 109, 253, 218, 200, 200, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 218, 115, 115, 253, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 249, 22, 22, 254, 226, 149, 149, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 209, 209, 209, 252, 1, 1, 1, 253, 1, 1, 1, 245, 99, 99, 99, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 148, 93, 93, 253, 246, 8, 8, 255, 255, 0, 0, 255, 246, 8, 8, 255, 147, 93, 93, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 118, 118, 118, 252, 1, 1, 1, 253, 1, 1, 1, 242, 176, 176, 176, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 223, 170, 170, 253, 252, 15, 15, 255, 255, 0, 0, 255, 252, 13, 13, 255, 223, 167, 167, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 3, 3, 3, 254, 0, 0, 0, 241, 95, 95, 95, 253, 119, 119, 119, 252, 119, 119, 119, 252, 99, 97, 97, 252, 106, 30, 30, 254, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 154, 39, 39, 255, 66, 58, 58, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 4, 4, 4, 253, 1, 1, 1, 238, 167, 167, 167, 253, 215, 215, 215, 252, 215, 215, 215, 252, 180, 179, 179, 252, 106, 33, 33, 254, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 158, 41, 41, 255, 108, 99, 99, 253, 214, 214, 214, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 10, 10, 10, 254, 0, 0, 0, 235, 91, 91, 91, 253, 119, 119, 119, 252, 91, 112, 141, 253, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 184, 255, 80, 110, 150, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 8, 8, 8, 253, 1, 1, 1, 234, 161, 161, 161, 253, 215, 215, 215, 252, 157, 177, 205, 253, 40, 102, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 40, 102, 185, 255, 128, 159, 200, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 18, 18, 18, 254, 1, 1, 1, 253, 104, 104, 104, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 197, 38, 38, 254, 255, 0, 0, 255, 174, 56, 56, 253, 119, 118, 118, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 113, 113, 113, 252, 1, 1, 1, 253, 1, 1, 1, 249, 184, 184, 184, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 227, 109, 109, 253, 255, 0, 0, 255, 240, 17, 17, 255, 214, 133, 133, 253, 216, 206, 206, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 209, 209, 209, 252, 1, 1, 1, 253, 1, 1, 1, 245, 99, 99, 99, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 153, 89, 89, 253, 248, 6, 6, 255, 255, 0, 0, 255, 243, 11, 11, 255, 144, 97, 97, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 118, 118, 118, 252, 1, 1, 1, 253, 1, 1, 1, 242, 176, 176, 176, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 224, 163, 163, 253, 253, 12, 12, 255, 255, 0, 0, 255, 252, 17, 17, 255, 222, 173, 173, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 3, 3, 3, 254, 0, 0, 0, 241, 95, 95, 95, 253, 119, 119, 119, 252, 119, 119, 119, 252, 64, 52, 52, 253, 209, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 141, 36, 36, 255, 70, 67, 67, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 4, 4, 4, 253, 1, 1, 1, 238, 167, 167, 167, 253, 215, 215, 215, 252, 215, 215, 215, 252, 104, 95, 95, 253, 208, 52, 52, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 144, 38, 38, 255, 121, 117, 117, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 10, 10, 10, 254, 0, 0, 0, 235, 91, 91, 91, 253, 119, 119, 119, 252, 119, 119, 119, 252, 79, 109, 151, 253, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 42, 102, 182, 255, 93, 113, 140, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 8, 8, 8, 253, 1, 1, 1, 234, 161, 161, 161, 253, 215, 215, 215, 252, 215, 215, 215, 252, 130, 160, 200, 253, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 45, 105, 186, 255, 155, 176, 204, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 18, 18, 18, 254, 1, 1, 1, 253, 104, 104, 104, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 136, 105, 105, 252, 134, 107, 107, 252, 119, 119, 119, 252, 204, 30, 30, 254, 178, 53, 53, 254, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 113, 113, 113, 252, 1, 1, 1, 253, 1, 1, 1, 249, 184, 184, 184, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 230, 97, 97, 254, 240, 18, 18, 255, 210, 180, 180, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 209, 209, 209, 252, 1, 1, 1, 253, 1, 1, 1, 245, 99, 99, 99, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 158, 84, 84, 253, 250, 4, 4, 255, 255, 0, 0, 255, 240, 13, 13, 255, 140, 101, 101, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 118, 118, 118, 252, 1, 1, 1, 253, 1, 1, 1, 242, 176, 176, 176, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 226, 156, 156, 253, 253, 8, 8, 255, 255, 0, 0, 255, 251, 22, 22, 255, 221, 180, 180, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 3, 3, 3, 254, 0, 0, 0, 241, 95, 95, 95, 253, 119, 119, 119, 252, 119, 119, 119, 252, 72, 47, 47, 253, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 127, 33, 33, 255, 78, 76, 76, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 4, 4, 4, 253, 1, 1, 1, 238, 167, 167, 167, 253, 215, 215, 215, 252, 215, 215, 215, 252, 105, 83, 83, 253, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 131, 35, 35, 255, 135, 134, 134, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 10, 10, 10, 254, 0, 0, 0, 235, 91, 91, 91, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 66, 106, 161, 254, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 47, 102, 178, 255, 102, 114, 132, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 8, 8, 8, 253, 1, 1, 1, 234, 161, 161, 161, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 102, 142, 195, 254, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 55, 112, 188, 255, 176, 190, 208, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 18, 18, 18, 254, 1, 1, 1, 253, 104, 104, 104, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 188, 63, 63, 253, 252, 11, 11, 255, 254, 10, 10, 255, 171, 76, 76, 253, 175, 45, 45, 253, 119, 117, 117, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 113, 113, 113, 252, 1, 1, 1, 253, 1, 1, 1, 249, 184, 184, 184, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 219, 194, 194, 252, 243, 71, 71, 254, 246, 54, 54, 254, 227, 151, 151, 253, 223, 79, 79, 253, 211, 160, 160, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 209, 209, 209, 252, 1, 1, 1, 253, 1, 1, 1, 245, 99, 99, 99, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 163, 80, 80, 253, 252, 3, 3, 255, 255, 0, 0, 255, 237, 16, 16, 255, 137, 104, 104, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 118, 118, 118, 252, 1, 1, 1, 253, 1, 1, 1, 242, 176, 176, 176, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 227, 148, 148, 253, 254, 6, 6, 255, 255, 0, 0, 255, 250, 27, 27, 255, 221, 185, 185, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 3, 3, 3, 254, 0, 0, 0, 241, 95, 95, 95, 253, 119, 119, 119, 252, 119, 119, 119, 252, 73, 71, 71, 253, 170, 43, 43, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 111, 31, 31, 254, 85, 83, 83, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 4, 4, 4, 253, 1, 1, 1, 238, 167, 167, 167, 253, 215, 215, 215, 252, 215, 215, 215, 252, 133, 131, 131, 253, 168, 43, 43, 255, 211, 53, 53, 255, 211, 53, 53, 255, 211, 53, 53, 255, 117, 34, 34, 254, 150, 148, 148, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 10, 10, 10, 254, 0, 0, 0, 235, 91, 91, 91, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 116, 118, 121, 252, 56, 104, 170, 254, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 53, 104, 172, 254, 110, 117, 126, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 8, 8, 8, 253, 1, 1, 1, 234, 161, 161, 161, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 210, 212, 214, 252, 79, 126, 191, 254, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 69, 121, 190, 254, 194, 201, 211, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 18, 18, 18, 254, 1, 1, 1, 253, 104, 104, 104, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 249, 13, 13, 255, 253, 10, 10, 255, 255, 9, 9, 255, 232, 27, 27, 254, 126, 107, 107, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 113, 113, 113, 252, 1, 1, 1, 253, 1, 1, 1, 249, 183, 183, 183, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 240, 84, 84, 254, 255, 9, 9, 255, 254, 12, 12, 255, 253, 17, 17, 255, 202, 138, 138, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 209, 209, 209, 252, 1, 1, 1, 253, 1, 1, 1, 245, 99, 99, 99, 252, 119, 119, 119, 252, 119, 119, 119, 252, 149, 93, 93, 253, 253, 2, 2, 255, 255, 0, 0, 255, 233, 19, 19, 254, 133, 107, 107, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 118, 118, 118, 252, 1, 1, 1, 253, 1, 1, 1, 242, 175, 175, 175, 253, 215, 215, 215, 252, 215, 215, 215, 252, 224, 170, 170, 252, 254, 4, 4, 255, 255, 0, 0, 255, 249, 32, 32, 254, 219, 191, 191, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 3, 3, 3, 254, 0, 0, 0, 241, 95, 95, 95, 253, 119, 119, 119, 252, 119, 119, 119, 252, 118, 118, 118, 252, 65, 53, 53, 253, 110, 29, 29, 255, 131, 36, 36, 255, 76, 33, 33, 254, 94, 92, 92, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 4, 4, 4, 253, 1, 1, 1, 238, 167, 167, 167, 253, 215, 215, 215, 252, 215, 215, 215, 252, 213, 213, 213, 252, 106, 95, 95, 253, 111, 30, 30, 255, 134, 39, 39, 255, 92, 47, 47, 254, 165, 164, 164, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 10, 10, 10, 254, 0, 0, 0, 235, 91, 91, 91, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 111, 117, 125, 252, 48, 103, 177, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 62, 106, 164, 254, 115, 118, 122, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 8, 8, 8, 253, 1, 1, 1, 234, 160, 160, 160, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 200, 205, 212, 252, 61, 115, 189, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 90, 134, 193, 254, 206, 209, 213, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 18, 18, 18, 254, 0, 0, 0, 228, 90, 90, 90, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 230, 29, 29, 254, 255, 9, 9, 255, 255, 9, 9, 255, 212, 43, 43, 254, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 99, 99, 99, 252, 0, 0, 0, 246, 1, 1, 1, 225, 158, 158, 158, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 243, 73, 73, 254, 255, 9, 9, 255, 255, 9, 9, 255, 255, 10, 10, 255, 218, 202, 202, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 184, 184, 184, 252, 1, 1, 1, 248, 0, 0, 0, 222, 85, 85, 85, 253, 119, 119, 119, 252, 119, 119, 119, 252, 171, 73, 73, 253, 255, 0, 0, 255, 229, 22, 22, 254, 130, 109, 109, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 104, 104, 104, 252, 1, 1, 1, 250, 1, 1, 1, 218, 150, 150, 150, 253, 215, 215, 215, 252, 215, 215, 215, 252, 230, 135, 135, 253, 255, 0, 0, 255, 248, 38, 38, 254, 219, 196, 196, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 192, 192, 192, 252, 1, 1, 1, 251, 0, 0, 0, 213, 81, 81, 81, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 111, 111, 111, 252, 102, 102, 102, 252, 117, 117, 117, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 109, 109, 109, 252, 1, 1, 1, 252, 1, 1, 1, 210, 143, 143, 143, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 201, 201, 201, 252, 183, 183, 183, 252, 212, 212, 212, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 199, 199, 199, 252, 2, 2, 2, 253, 0, 0, 0, 207, 77, 77, 77, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 103, 115, 130, 253, 43, 102, 181, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 74, 108, 155, 254, 118, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 112, 112, 112, 252, 1, 1, 1, 253, 1, 1, 1, 206, 135, 135, 135, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 184, 195, 209, 252, 50, 108, 187, 255, 39, 101, 185, 255, 39, 101, 185, 255, 39, 101, 185, 255, 114, 149, 197, 254, 213, 214, 214, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 205, 205, 205, 252, 3, 3, 3, 253, 0, 0, 0, 178, 60, 60, 60, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 136, 105, 105, 252, 201, 51, 51, 253, 195, 57, 57, 253, 130, 110, 110, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 69, 69, 69, 253, 0, 0, 0, 199, 0, 0, 0, 173, 105, 105, 105, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 222, 176, 176, 253, 250, 34, 34, 254, 254, 14, 14, 255, 233, 120, 120, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 130, 130, 130, 253, 1, 1, 1, 203, 0, 0, 0, 168, 56, 56, 56, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 146, 95, 95, 253, 122, 116, 116, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 74, 74, 74, 253, 0, 0, 0, 208, 0, 0, 0, 164, 97, 97, 97, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 223, 172, 172, 253, 216, 209, 209, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 137, 137, 137, 253, 1, 1, 1, 213, 0, 0, 0, 160, 51, 51, 51, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 78, 78, 78, 253, 0, 0, 0, 218, 0, 0, 0, 156, 89, 89, 89, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 145, 145, 145, 253, 1, 1, 1, 223, 0, 0, 0, 151, 47, 47, 47, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 106, 116, 129, 252, 69, 107, 159, 254, 65, 106, 163, 254, 96, 114, 137, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 83, 83, 83, 253, 0, 0, 0, 227, 0, 0, 0, 146, 81, 81, 81, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 189, 198, 210, 252, 108, 145, 196, 254, 97, 139, 195, 254, 164, 182, 206, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 153, 153, 153, 253, 1, 1, 1, 231, 0, 0, 0, 65, 5, 5, 5, 252, 99, 99, 99, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 105, 105, 105, 252, 9, 9, 9, 253, 0, 0, 0, 84, 0, 0, 0, 61, 8, 8, 8, 252, 176, 176, 176, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 214, 214, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 192, 192, 192, 252, 18, 18, 18, 254, 0, 0, 0, 89, 0, 0, 0, 57, 4, 4, 4, 251, 96, 96, 96, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 107, 107, 107, 252, 11, 11, 11, 253, 0, 0, 0, 94, 0, 0, 0, 53, 5, 5, 5, 250, 172, 172, 172, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 196, 196, 196, 252, 22, 22, 22, 254, 0, 0, 0, 98, 0, 0, 0, 50, 2, 2, 2, 248, 93, 93, 93, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 109, 109, 109, 252, 13, 13, 13, 253, 0, 0, 0, 103, 0, 0, 0, 47, 4, 4, 4, 248, 166, 166, 166, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 199, 199, 199, 252, 27, 27, 27, 254, 0, 0, 0, 108, 0, 0, 0, 43, 1, 1, 1, 246, 90, 90, 90, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 111, 111, 111, 252, 16, 16, 16, 253, 0, 0, 0, 112, 0, 0, 0, 40, 3, 3, 3, 245, 159, 159, 159, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 202, 202, 202, 252, 31, 31, 31, 254, 0, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 130, 6, 6, 6, 253, 66, 66, 66, 253, 99, 99, 99, 252, 118, 118, 118, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 101, 101, 101, 252, 70, 70, 70, 253, 9, 9, 9, 253, 0, 0, 0, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 10, 10, 10, 253, 118, 118, 118, 253, 177, 177, 177, 252, 213, 213, 213, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 183, 183, 183, 252, 128, 128, 128, 253, 18, 18, 18, 254, 0, 0, 0, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, 5, 5, 5, 252, 64, 64, 64, 253, 98, 98, 98, 252, 117, 117, 117, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 102, 102, 102, 252, 72, 72, 72, 253, 10, 10, 10, 253, 0, 0, 0, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 9, 9, 9, 252, 114, 114, 114, 253, 176, 176, 176, 252, 212, 212, 212, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 184, 184, 184, 252, 132, 132, 132, 253, 20, 20, 20, 254, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 4, 4, 4, 252, 62, 62, 62, 253, 97, 97, 97, 252, 117, 117, 117, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 103, 103, 103, 252, 74, 74, 74, 253, 12, 12, 12, 253, 0, 0, 0, 168, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 110, 7, 7, 7, 252, 110, 110, 110, 253, 174, 174, 174, 252, 211, 211, 211, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 186, 186, 186, 252, 135, 135, 135, 253, 23, 23, 23, 254, 0, 0, 0, 173, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 105, 3, 3, 3, 251, 60, 60, 60, 253, 96, 96, 96, 252, 117, 117, 117, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 103, 103, 103, 252, 75, 75, 75, 253, 14, 14, 14, 253, 0, 0, 0, 177, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 101, 5, 5, 5, 250, 106, 106, 106, 253, 173, 173, 173, 252, 210, 210, 210, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 188, 188, 188, 252, 138, 138, 138, 253, 27, 27, 27, 254, 0, 0, 0, 181, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, 198, 0, 0, 0, 245, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 247, 0, 0, 0, 203, 0, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 1, 1, 1, 197, 1, 1, 1, 245, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 248, 1, 1, 1, 204, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 195, 0, 0, 0, 244, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 248, 0, 0, 0, 205, 0, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 1, 1, 1, 194, 1, 1, 1, 244, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 249, 1, 1, 1, 206, 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 192, 0, 0, 0, 243, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 249, 0, 0, 0, 206, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 191, 1, 1, 1, 243, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 250, 1, 1, 1, 208, 0, 0, 0, 102, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 189, 0, 0, 0, 242, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 250, 0, 0, 0, 208, 0, 0, 0, 105, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 188, 1, 1, 1, 242, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 251, 1, 1, 1, 210, 0, 0, 0, 107, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 119, 0, 0, 0, 177, 0, 0, 0, 212, 0, 0, 0, 212, 0, 0, 0, 212, 0, 0, 0, 212, 0, 0, 0, 212, 0, 0, 0, 212, 0, 0, 0, 212, 0, 0, 0, 212, 0, 0, 0, 212, 0, 0, 0, 212, 0, 0, 0, 212, 0, 0, 0, 212, 0, 0, 0, 212, 0, 0, 0, 212, 0, 0, 0, 212, 0, 0, 0, 212, 0, 0, 0, 212, 0, 0, 0, 212, 0, 0, 0, 212, 0, 0, 0, 212, 0, 0, 0, 212, 0, 0, 0, 212, 0, 0, 0, 196, 0, 0, 0, 146, 0, 0, 7, 58, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 117, 0, 0, 0, 176, 1, 1, 1, 213, 1, 1, 1, 213, 1, 1, 1, 213, 1, 1, 1, 213, 1, 1, 1, 213, 1, 1, 1, 213, 1, 1, 1, 213, 1, 1, 1, 213, 1, 1, 1, 213, 1, 1, 1, 213, 1, 1, 1, 213, 1, 1, 1, 213, 1, 1, 1, 213, 1, 1, 1, 213, 1, 1, 1, 213, 1, 1, 1, 213, 1, 1, 1, 213, 1, 1, 1, 213, 1, 1, 1, 213, 1, 1, 1, 213, 1, 1, 1, 213, 1, 1, 1, 213, 1, 1, 1, 197, 0, 0, 0, 147, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 183, 0, 0, 0, 235, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 0, 0, 0, 229, 0, 0, 0, 176, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 183, 1, 1, 1, 234, 1, 1, 1, 254, 1, 1, 1, 254, 1, 1, 1, 254, 1, 1, 1, 254, 1, 1, 1, 254, 1, 1, 1, 254, 1, 1, 1, 254, 1, 1, 1, 254, 1, 1, 1, 254, 1, 1, 1, 254, 1, 1, 1, 254, 1, 1, 1, 254, 1, 1, 1, 254, 1, 1, 1, 254, 1, 1, 1, 254, 1, 1, 1, 254, 1, 1, 1, 254, 1, 1, 1, 254, 1, 1, 1, 254, 1, 1, 1, 254, 1, 1, 1, 254, 1, 1, 1, 254, 1, 1, 1, 230, 0, 0, 0, 177, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 218, 25, 25, 25, 253, 64, 64, 64, 253, 82, 82, 82, 253, 84, 84, 84, 253, 84, 84, 84, 253, 84, 84, 84, 253, 84, 84, 84, 253, 84, 84, 84, 253, 84, 84, 84, 253, 84, 84, 84, 253, 84, 84, 84, 253, 84, 84, 84, 253, 84, 84, 84, 253, 84, 84, 84, 253, 84, 84, 84, 253, 84, 84, 84, 253, 84, 84, 84, 253, 84, 84, 84, 253, 84, 84, 84, 253, 84, 84, 84, 253, 84, 84, 84, 253, 84, 84, 84, 253, 84, 84, 84, 253, 84, 84, 84, 253, 44, 43, 88, 253, 2, 0, 70, 255, 0, 0, 7, 255, 0, 0, 22, 140, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 217, 44, 44, 44, 254, 114, 114, 114, 253, 148, 148, 148, 253, 151, 151, 151, 253, 151, 151, 151, 253, 151, 151, 151, 253, 151, 151, 151, 253, 151, 151, 151, 253, 151, 151, 151, 253, 151, 151, 151, 253, 151, 151, 151, 253, 151, 151, 151, 253, 151, 151, 151, 253, 151, 151, 151, 253, 151, 151, 151, 253, 151, 151, 151, 253, 151, 151, 151, 253, 151, 151, 151, 253, 151, 151, 151, 253, 151, 151, 151, 253, 151, 151, 151, 253, 151, 151, 151, 253, 151, 151, 151, 253, 139, 139, 148, 253, 22, 19, 135, 254, 4, 1, 112, 255, 4, 3, 27, 251, 0, 0, 0, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 6, 6, 6, 253, 62, 62, 62, 253, 92, 92, 92, 253, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 104, 104, 104, 252, 105, 105, 105, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 88, 88, 88, 253, 55, 55, 55, 253, 2, 2, 2, 249, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 10, 10, 10, 253, 110, 110, 110, 253, 165, 165, 165, 253, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 193, 193, 193, 252, 186, 186, 186, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 161, 161, 161, 253, 101, 101, 101, 253, 5, 5, 5, 250, 0, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 217, 54, 54, 54, 253, 118, 118, 118, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 111, 111, 123, 252, 15, 11, 168, 255, 5, 0, 173, 255, 4, 0, 141, 255, 0, 0, 14, 255, 0, 0, 28, 104, 0, 0, 0, 9, 0, 0, 0, 214, 95, 95, 95, 253, 212, 212, 212, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 92, 89, 190, 254, 5, 0, 173, 255, 5, 0, 173, 255, 11, 7, 164, 255, 6, 5, 38, 254, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 7, 7, 7, 253, 101, 101, 101, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 31, 31, 31, 254, 56, 56, 56, 254, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 90, 90, 90, 253, 2, 2, 2, 248, 0, 0, 0, 48, 0, 0, 0, 72, 12, 12, 12, 253, 180, 180, 180, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 86, 86, 86, 254, 71, 71, 71, 254, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 167, 167, 167, 253, 5, 5, 5, 250, 0, 0, 0, 52, 0, 0, 0, 113, 25, 25, 25, 253, 118, 118, 118, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 48, 45, 152, 254, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 3, 0, 110, 255, 0, 0, 5, 231, 0, 0, 1, 109, 42, 42, 42, 254, 212, 212, 212, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 166, 166, 205, 253, 6, 1, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 25, 21, 137, 254, 1, 1, 1, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 199, 68, 68, 68, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 51, 51, 51, 253, 0, 0, 0, 255, 73, 73, 73, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 52, 52, 52, 253, 0, 0, 0, 167, 1, 1, 1, 195, 119, 119, 119, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 124, 124, 124, 253, 0, 0, 0, 255, 95, 95, 95, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 99, 99, 99, 253, 0, 0, 0, 171, 0, 0, 0, 170, 62, 62, 62, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 89, 88, 133, 253, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 165, 255, 0, 0, 3, 254, 0, 0, 0, 183, 109, 109, 109, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 210, 210, 214, 252, 39, 35, 179, 254, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 28, 24, 175, 254, 5, 5, 5, 253, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 1, 246, 101, 101, 101, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 117, 117, 117, 252, 49, 49, 49, 253, 17, 17, 17, 255, 68, 68, 68, 255, 2, 2, 2, 255, 96, 96, 96, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 85, 85, 85, 253, 0, 0, 0, 218, 1, 1, 1, 243, 177, 177, 177, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 114, 114, 114, 253, 8, 8, 8, 255, 79, 79, 79, 255, 0, 0, 0, 255, 154, 154, 154, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 156, 156, 156, 253, 1, 1, 1, 223, 0, 0, 0, 206, 81, 81, 81, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 115, 115, 121, 252, 20, 16, 165, 254, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 1, 0, 21, 254, 1, 1, 1, 229, 143, 143, 143, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 109, 107, 194, 253, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 27, 27, 36, 254, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 1, 1, 1, 253, 116, 116, 116, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 103, 103, 103, 252, 23, 23, 23, 254, 54, 54, 54, 255, 195, 195, 195, 255, 211, 211, 211, 255, 45, 45, 45, 255, 17, 17, 17, 254, 115, 115, 115, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 100, 100, 100, 252, 1, 1, 1, 249, 1, 1, 1, 253, 206, 206, 206, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 199, 199, 199, 252, 59, 59, 59, 254, 37, 37, 37, 255, 181, 181, 181, 255, 215, 215, 215, 255, 70, 70, 70, 255, 11, 11, 11, 255, 189, 189, 189, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 185, 185, 185, 252, 1, 1, 1, 253, 0, 0, 0, 208, 83, 83, 83, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 57, 54, 147, 254, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 24, 21, 163, 254, 13, 13, 17, 254, 1, 1, 1, 230, 146, 146, 146, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 180, 179, 208, 252, 10, 5, 174, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 122, 120, 196, 253, 33, 33, 33, 254, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 1, 1, 1, 253, 117, 117, 117, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 80, 80, 80, 253, 6, 6, 6, 255, 105, 105, 105, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 191, 191, 191, 255, 15, 15, 15, 255, 37, 37, 37, 254, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 100, 100, 100, 252, 1, 1, 1, 249, 1, 1, 1, 253, 207, 207, 207, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 165, 165, 165, 253, 21, 21, 21, 254, 80, 80, 80, 255, 210, 210, 210, 255, 215, 215, 215, 255, 215, 215, 215, 255, 205, 205, 205, 255, 33, 33, 33, 255, 46, 46, 46, 254, 213, 213, 213, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 186, 186, 186, 252, 1, 1, 1, 253, 0, 0, 0, 208, 83, 83, 83, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 97, 96, 129, 253, 7, 2, 172, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 23, 19, 163, 254, 109, 109, 124, 252, 16, 16, 16, 254, 1, 1, 1, 230, 146, 146, 146, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 213, 213, 215, 252, 52, 48, 182, 254, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 120, 118, 196, 253, 215, 215, 215, 252, 33, 33, 33, 254, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 1, 1, 1, 253, 117, 117, 117, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 117, 117, 117, 252, 47, 47, 47, 254, 18, 18, 18, 255, 161, 161, 161, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 153, 153, 153, 255, 0, 0, 0, 255, 71, 71, 71, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 100, 100, 100, 252, 1, 1, 1, 249, 1, 1, 1, 253, 207, 207, 207, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 112, 112, 112, 253, 8, 8, 8, 255, 140, 140, 140, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 177, 177, 177, 255, 6, 6, 6, 255, 89, 89, 89, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 186, 186, 186, 252, 1, 1, 1, 253, 0, 0, 0, 208, 83, 83, 83, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 117, 117, 120, 252, 27, 23, 162, 254, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 22, 18, 164, 254, 108, 108, 124, 252, 119, 119, 119, 252, 16, 16, 16, 254, 1, 1, 1, 230, 146, 146, 146, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 126, 124, 197, 253, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 115, 113, 195, 253, 215, 215, 215, 252, 215, 215, 215, 252, 33, 33, 33, 254, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 1, 1, 1, 253, 117, 117, 117, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 101, 101, 101, 252, 21, 21, 21, 254, 56, 56, 56, 255, 196, 196, 196, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 104, 104, 104, 255, 1, 1, 1, 255, 94, 94, 94, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 100, 100, 100, 252, 1, 1, 1, 249, 1, 1, 1, 253, 207, 207, 207, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 196, 196, 196, 252, 55, 55, 55, 254, 39, 39, 39, 255, 182, 182, 182, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 136, 136, 136, 255, 0, 0, 0, 255, 147, 147, 147, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 186, 186, 186, 252, 1, 1, 1, 253, 0, 0, 0, 208, 83, 83, 83, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 66, 65, 143, 253, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 21, 17, 165, 255, 107, 107, 125, 252, 119, 119, 119, 252, 119, 119, 119, 252, 16, 16, 16, 254, 1, 1, 1, 230, 146, 146, 146, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 191, 190, 210, 252, 16, 11, 175, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 111, 109, 194, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 33, 33, 33, 254, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 1, 1, 1, 253, 117, 117, 117, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 78, 78, 78, 253, 5, 5, 5, 255, 112, 112, 112, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 213, 213, 213, 255, 52, 52, 52, 255, 15, 15, 15, 254, 113, 113, 113, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 100, 100, 100, 252, 1, 1, 1, 249, 1, 1, 1, 253, 207, 207, 207, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 161, 161, 161, 253, 18, 18, 18, 254, 86, 86, 86, 255, 212, 212, 212, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 79, 79, 79, 255, 9, 9, 9, 255, 185, 185, 185, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 186, 186, 186, 252, 1, 1, 1, 253, 0, 0, 0, 208, 83, 83, 83, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 129, 129, 135, 253, 105, 103, 179, 255, 17, 12, 174, 255, 5, 0, 173, 255, 5, 0, 173, 255, 20, 16, 166, 255, 107, 106, 125, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 16, 16, 16, 254, 1, 1, 1, 230, 146, 146, 146, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 90, 87, 185, 254, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 5, 0, 173, 255, 107, 105, 193, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 33, 33, 33, 254, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 1, 1, 1, 253, 117, 117, 117, 252, 119, 119, 119, 252, 119, 119, 119, 252, 116, 116, 116, 252, 44, 44, 44, 254, 21, 21, 21, 255, 164, 164, 164, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 197, 197, 197, 255, 19, 19, 19, 255, 34, 34, 34, 254, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 100, 100, 100, 252, 1, 1, 1, 249, 1, 1, 1, 253, 207, 207, 207, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 105, 105, 105, 253, 10, 10, 10, 255, 145, 145, 145, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 209, 209, 209, 255, 39, 39, 39, 255, 41, 41, 41, 254, 210, 210, 210, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 186, 186, 186, 252, 1, 1, 1, 253, 0, 0, 0, 208, 83, 83, 83, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 121, 121, 121, 252, 173, 173, 179, 254, 188, 188, 188, 255, 146, 146, 184, 255, 5, 1, 173, 255, 19, 15, 166, 255, 105, 105, 125, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 16, 16, 16, 254, 1, 1, 1, 230, 146, 146, 146, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 191, 191, 200, 253, 188, 188, 188, 255, 111, 109, 181, 255, 5, 0, 173, 255, 5, 0, 173, 255, 103, 101, 192, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 33, 33, 33, 254, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 1, 1, 1, 253, 117, 117, 117, 252, 119, 119, 119, 252, 100, 100, 100, 252, 20, 20, 20, 254, 58, 58, 58, 255, 199, 199, 199, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 161, 161, 161, 255, 1, 1, 1, 255, 66, 66, 66, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 100, 100, 100, 252, 1, 1, 1, 249, 1, 1, 1, 253, 207, 207, 207, 252, 215, 215, 215, 252, 195, 195, 195, 252, 54, 54, 54, 254, 42, 42, 42, 255, 186, 186, 186, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 183, 183, 183, 255, 8, 8, 8, 255, 82, 82, 82, 254, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 186, 186, 186, 252, 1, 1, 1, 253, 0, 0, 0, 208, 83, 83, 83, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 149, 149, 157, 254, 188, 188, 188, 255, 188, 188, 188, 255, 188, 188, 188, 255, 60, 57, 170, 255, 104, 104, 126, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 16, 16, 16, 254, 1, 1, 1, 230, 146, 146, 146, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 204, 204, 209, 252, 184, 184, 188, 255, 188, 188, 188, 255, 188, 188, 188, 255, 43, 40, 176, 255, 99, 96, 192, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 33, 33, 33, 254, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 1, 1, 1, 253, 117, 117, 117, 252, 77, 77, 77, 253, 5, 5, 5, 255, 114, 114, 114, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 113, 113, 113, 255, 1, 1, 1, 255, 90, 90, 90, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 100, 100, 100, 252, 1, 1, 1, 249, 1, 1, 1, 253, 207, 207, 207, 252, 160, 160, 160, 253, 16, 16, 16, 254, 88, 88, 88, 255, 212, 212, 212, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 145, 145, 145, 255, 0, 0, 0, 255, 139, 139, 139, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 186, 186, 186, 252, 1, 1, 1, 253, 0, 0, 0, 208, 83, 83, 83, 253, 167, 83, 83, 253, 235, 31, 31, 254, 220, 43, 43, 254, 145, 99, 99, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 128, 128, 133, 253, 185, 185, 187, 255, 188, 188, 188, 255, 188, 188, 188, 255, 179, 179, 185, 255, 126, 126, 133, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 16, 16, 16, 254, 1, 1, 1, 230, 146, 146, 146, 253, 230, 140, 140, 253, 249, 44, 44, 254, 244, 70, 70, 254, 222, 181, 181, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 187, 187, 192, 254, 188, 188, 188, 255, 188, 188, 188, 255, 188, 188, 188, 255, 159, 158, 193, 254, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 33, 33, 33, 254, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 1, 1, 1, 253, 117, 117, 117, 252, 13, 13, 13, 254, 110, 110, 110, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 58, 58, 58, 255, 12, 12, 12, 255, 110, 110, 110, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 100, 100, 100, 252, 1, 1, 1, 249, 1, 1, 1, 253, 207, 207, 207, 252, 58, 58, 58, 254, 81, 81, 81, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 86, 86, 86, 255, 7, 7, 7, 255, 179, 179, 179, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 186, 186, 186, 252, 1, 1, 1, 253, 0, 0, 0, 208, 89, 78, 78, 253, 247, 23, 23, 255, 255, 17, 17, 255, 255, 17, 17, 255, 216, 46, 46, 254, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 115, 115, 115, 252, 92, 92, 92, 253, 72, 72, 72, 254, 71, 71, 71, 254, 111, 111, 111, 254, 186, 186, 187, 255, 188, 188, 188, 255, 179, 179, 186, 255, 128, 128, 134, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 16, 16, 16, 254, 1, 1, 1, 230, 148, 134, 134, 253, 253, 25, 25, 255, 255, 17, 17, 255, 255, 17, 17, 255, 242, 80, 80, 254, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 209, 209, 209, 252, 162, 162, 162, 253, 152, 152, 152, 253, 163, 163, 169, 253, 188, 188, 188, 255, 188, 188, 188, 255, 188, 188, 188, 255, 181, 181, 193, 254, 214, 214, 214, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 33, 33, 33, 254, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 1, 1, 1, 253, 117, 117, 117, 252, 87, 87, 87, 253, 12, 12, 12, 255, 189, 189, 189, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 202, 202, 202, 255, 23, 23, 23, 255, 30, 30, 30, 254, 118, 118, 118, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 100, 100, 100, 252, 1, 1, 1, 249, 1, 1, 1, 253, 207, 207, 207, 252, 179, 179, 179, 252, 7, 7, 7, 255, 169, 169, 169, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 212, 212, 212, 255, 44, 44, 44, 255, 35, 35, 35, 254, 206, 206, 206, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 186, 186, 186, 252, 1, 1, 1, 253, 0, 0, 0, 208, 114, 59, 59, 253, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 249, 20, 20, 255, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 112, 111, 111, 252, 102, 55, 55, 255, 80, 53, 53, 255, 59, 59, 59, 255, 59, 59, 59, 255, 59, 59, 59, 255, 107, 107, 109, 255, 180, 180, 186, 255, 128, 128, 135, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 16, 16, 16, 254, 1, 1, 1, 230, 156, 93, 93, 253, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 252, 31, 31, 255, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 148, 148, 148, 253, 69, 69, 69, 255, 59, 59, 59, 255, 59, 59, 59, 255, 60, 60, 60, 255, 136, 136, 139, 255, 188, 188, 188, 255, 181, 181, 193, 254, 213, 213, 214, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 33, 33, 33, 254, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 1, 1, 1, 253, 117, 117, 117, 252, 119, 119, 119, 252, 54, 54, 54, 253, 47, 47, 47, 255, 214, 214, 214, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 167, 167, 167, 255, 1, 1, 1, 255, 59, 59, 59, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 100, 100, 100, 252, 1, 1, 1, 249, 1, 1, 1, 253, 207, 207, 207, 252, 215, 215, 215, 252, 134, 134, 134, 253, 26, 26, 26, 255, 203, 203, 203, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 215, 215, 215, 255, 187, 187, 187, 255, 10, 10, 10, 255, 73, 73, 73, 254, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 186, 186, 186, 252, 1, 1, 1, 253, 0, 0, 0, 208, 113, 60, 60, 253, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 251, 20, 20, 255, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 130, 110, 110, 252, 222, 21, 21, 254, 255, 0, 0, 255, 252, 1, 1, 255, 172, 25, 25, 255, 61, 58, 58, 255, 59, 59, 59, 255, 59, 59, 59, 255, 125, 125, 130, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 16, 16, 16, 254, 1, 1, 1, 230, 156, 94, 94, 253, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 252, 29, 29, 255, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 207, 131, 131, 253, 206, 15, 15, 255, 201, 16, 16, 255, 110, 44, 44, 255, 59, 59, 59, 255, 59, 59, 59, 255, 61, 61, 61, 255, 175, 175, 186, 253, 213, 213, 214, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 33, 33, 33, 254, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 1, 1, 1, 253, 117, 117, 117, 252, 119, 119, 119, 252, 119, 119, 119, 252, 27, 27, 27, 254, 40, 49, 122, 255, 65, 84, 237, 255, 65, 84, 237, 255, 57, 78, 238, 255, 43, 65, 240, 255, 43, 65, 240, 255, 43, 65, 240, 255, 43, 65, 240, 255, 43, 65, 240, 255, 43, 65, 240, 255, 43, 65, 240, 255, 43, 65, 240, 255, 43, 65, 240, 255, 43, 65, 240, 255, 43, 65, 240, 255, 43, 65, 240, 255, 43, 65, 240, 255, 43, 65, 240, 255, 43, 65, 236, 255, 17, 22, 66, 255, 1, 1, 1, 255, 87, 87, 87, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 100, 100, 100, 252, 1, 1, 1, 249, 1, 1, 1, 253, 207, 207, 207, 252, 215, 215, 215, 252, 215, 215, 215, 252, 74, 74, 74, 254, 22, 30, 94, 255, 43, 65, 240, 255, 43, 65, 240, 255, 43, 65, 240, 255, 43, 65, 240, 255, 43, 65, 240, 255, 43, 65, 240, 255, 43, 65, 240, 255, 43, 65, 240, 255, 43, 65, 240, 255, 43, 65, 240, 255, 43, 65, 240, 255, 43, 65, 240, 255, 43, 65, 240, 255, 43, 65, 240, 255, 43, 65, 240, 255, 43, 65, 240, 255, 43, 65, 240, 255, 43, 65, 240, 255, 21, 29, 93, 255, 0, 0, 0, 255, 128, 128, 128, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 186, 186, 186, 252, 1, 1, 1, 253, 0, 0, 0, 208, 112, 61, 61, 253, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 252, 19, 19, 255, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 202, 45, 45, 254, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 165, 27, 27, 255, 59, 59, 59, 255, 59, 59, 59, 255, 114, 114, 114, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 16, 16, 16, 254, 1, 1, 1, 230, 155, 96, 96, 253, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 253, 27, 27, 255, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 225, 159, 159, 253, 254, 1, 1, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 128, 38, 38, 255, 59, 59, 59, 255, 59, 59, 59, 255, 182, 182, 182, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 33, 33, 33, 254, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 1, 1, 1, 253, 117, 117, 117, 252, 119, 119, 119, 252, 119, 119, 119, 252, 105, 105, 105, 252, 7, 7, 12, 254, 0, 22, 195, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 25, 220, 255, 0, 6, 57, 255, 33, 33, 33, 254, 44, 44, 44, 254, 55, 55, 55, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 100, 100, 100, 252, 1, 1, 1, 249, 1, 1, 1, 253, 207, 207, 207, 252, 215, 215, 215, 252, 215, 215, 215, 252, 207, 207, 207, 252, 31, 31, 31, 254, 0, 19, 165, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 26, 232, 255, 0, 10, 79, 255, 43, 43, 43, 254, 97, 97, 97, 253, 69, 69, 69, 254, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 186, 186, 186, 252, 1, 1, 1, 253, 0, 0, 0, 208, 110, 62, 62, 253, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 254, 17, 17, 255, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 120, 118, 118, 252, 247, 6, 6, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 253, 1, 1, 255, 86, 51, 51, 255, 61, 61, 61, 255, 118, 118, 118, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 16, 16, 16, 254, 1, 1, 1, 230, 155, 98, 98, 253, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 253, 25, 25, 255, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 243, 62, 62, 254, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 248, 2, 2, 255, 78, 53, 53, 255, 59, 59, 59, 255, 187, 187, 187, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 33, 33, 33, 254, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 1, 1, 1, 253, 117, 117, 117, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 84, 84, 84, 253, 0, 4, 33, 255, 0, 26, 232, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 20, 175, 255, 1, 3, 20, 255, 64, 64, 64, 253, 119, 119, 119, 252, 117, 117, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 100, 100, 100, 252, 1, 1, 1, 249, 1, 1, 1, 253, 207, 207, 207, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 174, 174, 174, 252, 4, 5, 19, 255, 0, 24, 214, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 22, 196, 255, 0, 4, 33, 255, 90, 90, 90, 253, 212, 212, 212, 252, 213, 213, 214, 252, 214, 214, 214, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 186, 186, 186, 252, 1, 1, 1, 253, 0, 0, 0, 208, 103, 68, 68, 253, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 128, 111, 111, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 132, 105, 105, 252, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 156, 30, 30, 255, 73, 73, 73, 254, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 16, 16, 16, 254, 1, 1, 1, 230, 153, 110, 110, 253, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 216, 207, 207, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 246, 12, 12, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 157, 29, 29, 255, 64, 64, 64, 255, 212, 212, 212, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 33, 33, 33, 254, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 1, 1, 1, 253, 117, 117, 117, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 50, 50, 50, 253, 0, 9, 82, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 242, 255, 0, 13, 115, 255, 13, 13, 14, 254, 92, 92, 92, 253, 119, 119, 119, 252, 119, 119, 119, 252, 63, 79, 187, 253, 116, 117, 122, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 100, 100, 100, 252, 1, 1, 1, 249, 1, 1, 1, 253, 207, 207, 207, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 127, 127, 127, 253, 0, 6, 52, 254, 0, 27, 241, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 16, 142, 255, 11, 12, 16, 255, 149, 149, 149, 253, 215, 215, 215, 252, 215, 215, 215, 252, 127, 141, 232, 253, 194, 197, 219, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 186, 186, 186, 252, 1, 1, 1, 253, 0, 0, 0, 208, 88, 79, 79, 253, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 147, 97, 97, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 145, 86, 86, 253, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 198, 17, 17, 255, 95, 95, 95, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 16, 16, 16, 254, 1, 1, 1, 230, 148, 132, 132, 253, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 222, 181, 181, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 216, 204, 204, 252, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 213, 13, 13, 255, 106, 106, 106, 254, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 33, 33, 33, 254, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 1, 1, 1, 253, 117, 117, 117, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 118, 118, 118, 252, 24, 24, 24, 254, 0, 16, 145, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 25, 219, 255, 0, 6, 55, 255, 34, 34, 34, 254, 112, 112, 112, 252, 119, 119, 119, 252, 119, 119, 119, 252, 113, 114, 127, 252, 13, 45, 250, 255, 83, 94, 162, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 100, 100, 100, 252, 1, 1, 1, 249, 1, 1, 1, 253, 207, 207, 207, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 67, 67, 67, 254, 0, 12, 111, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 26, 231, 255, 0, 9, 78, 255, 45, 45, 45, 254, 188, 188, 188, 252, 215, 215, 215, 252, 215, 215, 215, 252, 214, 214, 215, 252, 35, 63, 250, 254, 119, 134, 233, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 186, 186, 186, 252, 1, 1, 1, 253, 0, 0, 0, 208, 83, 83, 83, 253, 238, 29, 29, 254, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 179, 73, 73, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 155, 74, 74, 253, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 206, 28, 28, 254, 118, 118, 118, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 16, 16, 16, 254, 1, 1, 1, 230, 146, 145, 145, 253, 251, 34, 34, 255, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 231, 133, 133, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 207, 167, 167, 252, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 232, 7, 7, 255, 182, 182, 182, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 33, 33, 33, 254, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 1, 1, 1, 253, 117, 117, 117, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 103, 103, 103, 252, 5, 6, 13, 255, 0, 23, 201, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 20, 173, 255, 1, 3, 19, 255, 66, 66, 66, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 77, 89, 170, 253, 9, 42, 255, 255, 42, 65, 213, 254, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 100, 100, 100, 252, 1, 1, 1, 249, 1, 1, 1, 253, 207, 207, 207, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 204, 204, 204, 252, 27, 27, 28, 254, 0, 20, 173, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 22, 195, 255, 0, 4, 32, 255, 93, 93, 93, 253, 213, 213, 213, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 166, 174, 225, 252, 9, 42, 255, 255, 42, 70, 248, 254, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 186, 186, 186, 252, 1, 1, 1, 253, 0, 0, 0, 208, 83, 83, 83, 253, 205, 55, 55, 254, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 230, 35, 35, 254, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 164, 68, 68, 253, 255, 0, 0, 255, 255, 0, 0, 255, 250, 2, 2, 255, 223, 19, 19, 254, 213, 32, 32, 254, 204, 44, 44, 254, 142, 98, 98, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 16, 16, 16, 254, 1, 1, 1, 230, 146, 146, 146, 253, 242, 83, 83, 254, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 246, 59, 59, 254, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 201, 145, 145, 253, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 254, 1, 1, 255, 232, 92, 92, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 33, 33, 33, 254, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 1, 1, 1, 253, 117, 117, 117, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 80, 80, 80, 253, 0, 4, 37, 255, 0, 27, 235, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 242, 255, 0, 13, 113, 255, 14, 14, 14, 254, 93, 93, 93, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 39, 63, 217, 254, 9, 42, 255, 255, 11, 43, 253, 255, 109, 112, 130, 252, 119, 119, 119, 252, 119, 119, 119, 252, 100, 100, 100, 252, 1, 1, 1, 249, 1, 1, 1, 253, 207, 207, 207, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 170, 170, 170, 253, 2, 4, 21, 255, 0, 25, 219, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 16, 139, 255, 12, 13, 17, 255, 151, 151, 151, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 95, 114, 238, 253, 9, 42, 255, 255, 9, 42, 255, 255, 172, 179, 224, 252, 215, 215, 215, 252, 215, 215, 215, 252, 186, 186, 186, 252, 1, 1, 1, 253, 0, 0, 0, 208, 83, 83, 83, 253, 163, 86, 86, 253, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 170, 80, 80, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 175, 64, 64, 253, 255, 0, 0, 255, 214, 27, 27, 254, 128, 103, 103, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 16, 16, 16, 254, 1, 1, 1, 230, 146, 146, 146, 253, 229, 143, 143, 253, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 228, 147, 147, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 204, 134, 134, 253, 255, 0, 0, 255, 252, 1, 1, 255, 223, 84, 84, 253, 211, 156, 156, 253, 221, 185, 185, 252, 218, 201, 201, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 33, 33, 33, 254, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 1, 1, 1, 253, 117, 117, 117, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 47, 47, 47, 254, 0, 10, 89, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 25, 217, 255, 0, 6, 54, 255, 35, 35, 35, 254, 112, 112, 112, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 15, 46, 247, 255, 9, 42, 255, 255, 9, 42, 255, 255, 87, 97, 158, 253, 119, 119, 119, 252, 119, 119, 119, 252, 100, 100, 100, 252, 1, 1, 1, 249, 1, 1, 1, 253, 207, 207, 207, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 119, 119, 120, 253, 0, 6, 57, 255, 0, 28, 242, 255, 0, 28, 246, 255, 0, 28, 246, 255, 0, 26, 230, 255, 0, 9, 76, 255, 47, 47, 47, 254, 189, 189, 189, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 50, 76, 247, 254, 9, 42, 255, 255, 9, 42, 255, 255, 126, 141, 232, 253, 215, 215, 215, 252, 215, 215, 215, 252, 186, 186, 186, 252, 1, 1, 1, 253, 0, 0, 0, 208, 83, 83, 83, 253, 121, 118, 118, 252, 236, 30, 30, 254, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 249, 21, 21, 255, 152, 93, 93, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 185, 59, 59, 253, 217, 24, 24, 254, 122, 114, 114, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 16, 16, 16, 254, 1, 1, 1, 230, 146, 146, 146, 253, 216, 211, 211, 252, 251, 38, 38, 254, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 253, 29, 29, 255, 224, 171, 171, 253, 215, 215, 215, 252, 215, 215, 215, 252, 210, 124, 124, 253, 251, 1, 1, 255, 213, 131, 131, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 33, 33, 33, 254, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 1, 1, 1, 253, 117, 117, 117, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 117, 117, 117, 252, 22, 22, 22, 254, 0, 17, 153, 255, 0, 28, 246, 255, 0, 19, 171, 255, 1, 3, 19, 255, 67, 67, 67, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 12, 44, 251, 255, 9, 42, 255, 255, 9, 42, 255, 255, 85, 95, 161, 253, 119, 119, 119, 252, 119, 119, 119, 252, 100, 100, 100, 252, 1, 1, 1, 249, 1, 1, 1, 253, 207, 207, 207, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 62, 62, 62, 254, 0, 13, 118, 255, 0, 28, 246, 255, 0, 22, 193, 255, 0, 4, 31, 255, 95, 95, 95, 253, 214, 214, 214, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 43, 70, 248, 254, 9, 42, 255, 255, 9, 42, 255, 255, 123, 137, 233, 253, 215, 215, 215, 252, 215, 215, 215, 252, 186, 186, 186, 252, 1, 1, 1, 253, 0, 0, 0, 208, 83, 83, 83, 253, 119, 119, 119, 252, 167, 82, 82, 253, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 251, 20, 20, 255, 175, 76, 76, 253, 120, 118, 118, 252, 119, 119, 119, 252, 180, 54, 54, 253, 130, 103, 103, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 16, 16, 16, 254, 1, 1, 1, 230, 146, 146, 146, 253, 215, 215, 215, 252, 231, 137, 137, 253, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 254, 24, 24, 255, 230, 137, 137, 253, 215, 214, 214, 252, 217, 117, 117, 253, 215, 98, 98, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 33, 33, 33, 254, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 1, 1, 1, 253, 117, 117, 117, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 101, 101, 101, 252, 4, 5, 14, 255, 0, 11, 96, 255, 15, 15, 15, 254, 94, 94, 94, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 57, 75, 195, 253, 11, 44, 252, 255, 31, 57, 227, 254, 113, 115, 126, 252, 119, 119, 119, 252, 119, 119, 119, 252, 100, 100, 100, 252, 1, 1, 1, 249, 1, 1, 1, 253, 207, 207, 207, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 200, 200, 200, 252, 22, 22, 24, 254, 0, 11, 100, 255, 13, 14, 18, 254, 154, 154, 154, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 126, 140, 232, 253, 16, 48, 253, 255, 36, 64, 250, 254, 189, 193, 220, 252, 215, 215, 215, 252, 215, 215, 215, 252, 186, 186, 186, 252, 1, 1, 1, 253, 0, 0, 0, 208, 83, 83, 83, 253, 119, 119, 119, 252, 119, 119, 119, 252, 204, 54, 54, 254, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 229, 36, 36, 254, 144, 100, 100, 253, 128, 99, 99, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 16, 16, 16, 254, 1, 1, 1, 230, 146, 146, 146, 253, 215, 215, 215, 252, 215, 215, 215, 252, 241, 83, 83, 254, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 247, 58, 58, 254, 217, 106, 106, 253, 214, 212, 212, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 33, 33, 33, 254, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 1, 1, 1, 253, 116, 116, 116, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 87, 87, 87, 253, 49, 49, 49, 253, 113, 113, 113, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 118, 118, 121, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 100, 100, 100, 252, 1, 1, 1, 249, 1, 1, 1, 253, 207, 207, 207, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 169, 169, 169, 253, 86, 86, 86, 253, 190, 190, 190, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 212, 213, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 185, 185, 185, 252, 1, 1, 1, 253, 0, 0, 0, 190, 72, 72, 72, 253, 119, 119, 119, 252, 119, 119, 119, 252, 125, 115, 115, 252, 216, 45, 45, 254, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 240, 28, 28, 255, 130, 111, 111, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 118, 118, 118, 252, 7, 7, 7, 253, 1, 1, 1, 210, 127, 127, 127, 253, 215, 215, 215, 252, 215, 215, 215, 252, 217, 205, 205, 252, 244, 67, 67, 254, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 250, 41, 41, 254, 218, 202, 202, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 214, 214, 214, 252, 15, 15, 15, 254, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 1, 1, 1, 247, 102, 102, 102, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 86, 86, 86, 253, 0, 0, 0, 222, 1, 1, 1, 246, 179, 179, 179, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 159, 159, 159, 253, 1, 1, 1, 226, 0, 0, 0, 141, 45, 45, 45, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 121, 117, 117, 252, 201, 57, 57, 254, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 152, 94, 94, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 97, 97, 97, 252, 0, 0, 0, 246, 0, 0, 0, 140, 78, 78, 78, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 216, 210, 210, 252, 240, 89, 89, 254, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 255, 17, 17, 255, 223, 173, 173, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 180, 180, 180, 252, 1, 1, 1, 248, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 202, 71, 71, 71, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 55, 55, 55, 253, 0, 0, 0, 170, 1, 1, 1, 198, 124, 124, 124, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 103, 103, 103, 253, 0, 0, 0, 176, 0, 0, 0, 47, 2, 2, 2, 248, 94, 94, 94, 253, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 158, 89, 89, 253, 235, 32, 32, 254, 255, 17, 17, 255, 255, 17, 17, 255, 242, 26, 26, 255, 130, 110, 110, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 118, 118, 118, 252, 30, 30, 30, 253, 0, 0, 0, 153, 0, 0, 0, 44, 3, 3, 3, 247, 168, 168, 168, 253, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 227, 152, 152, 253, 249, 43, 43, 254, 255, 17, 17, 255, 255, 17, 17, 255, 251, 38, 38, 255, 217, 203, 203, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 214, 214, 214, 252, 59, 59, 59, 254, 0, 0, 0, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 9, 9, 9, 253, 105, 105, 105, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 95, 95, 95, 253, 3, 3, 3, 250, 0, 0, 0, 55, 0, 0, 0, 80, 14, 14, 14, 254, 187, 187, 187, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 174, 174, 174, 253, 7, 7, 7, 251, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 119, 7, 7, 7, 253, 72, 72, 72, 253, 111, 111, 111, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 122, 117, 117, 252, 163, 85, 85, 253, 181, 72, 72, 253, 132, 109, 109, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 119, 119, 119, 252, 117, 117, 117, 252, 95, 95, 95, 252, 30, 30, 30, 253, 0, 0, 0, 216, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 115, 13, 13, 13, 254, 128, 128, 128, 253, 200, 200, 200, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 216, 209, 209, 252, 228, 149, 149, 253, 233, 124, 124, 253, 218, 199, 199, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 215, 215, 215, 252, 213, 213, 213, 252, 173, 173, 173, 252, 57, 57, 57, 254, 1, 1, 1, 219, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, 8, 8, 8, 253, 67, 67, 67, 253, 97, 97, 97, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 107, 107, 107, 252, 94, 94, 94, 252, 60, 60, 60, 253, 4, 4, 4, 251, 0, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, 14, 14, 14, 254, 120, 120, 120, 253, 174, 174, 174, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 194, 194, 194, 252, 170, 170, 170, 252, 111, 111, 111, 253, 9, 9, 9, 252, 0, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 222, 1, 1, 1, 253, 11, 11, 11, 253, 12, 12, 12, 254, 12, 12, 12, 254, 12, 12, 12, 254, 12, 12, 12, 254, 12, 12, 12, 254, 12, 12, 12, 254, 12, 12, 12, 254, 12, 12, 12, 254, 12, 12, 12, 254, 12, 12, 12, 254, 12, 12, 12, 254, 12, 12, 12, 254, 12, 12, 12, 254, 12, 12, 12, 254, 12, 12, 12, 254, 12, 12, 12, 254, 12, 12, 12, 254, 12, 12, 12, 254, 12, 12, 12, 254, 12, 12, 12, 254, 12, 12, 12, 254, 5, 5, 5, 253, 0, 0, 0, 245, 0, 0, 0, 153, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 1, 1, 1, 220, 1, 1, 1, 253, 21, 21, 21, 254, 23, 23, 23, 254, 23, 23, 23, 254, 23, 23, 23, 254, 23, 23, 23, 254, 23, 23, 23, 254, 23, 23, 23, 254, 23, 23, 23, 254, 23, 23, 23, 254, 23, 23, 23, 254, 23, 23, 23, 254, 23, 23, 23, 254, 23, 23, 23, 254, 23, 23, 23, 254, 23, 23, 23, 254, 23, 23, 23, 254, 23, 23, 23, 254, 23, 23, 23, 254, 23, 23, 23, 254, 23, 23, 23, 254, 23, 23, 23, 254, 23, 23, 23, 254, 10, 10, 10, 254, 1, 1, 1, 245, 0, 0, 0, 156, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, 195, 0, 0, 0, 244, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 0, 0, 0, 240, 0, 0, 0, 186, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 1, 1, 1, 195, 1, 1, 1, 243, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 253, 1, 1, 1, 241, 0, 0, 0, 188, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0 ),
+"format": "RGBA8",
+"height": 256,
+"mipmaps": false,
+"width": 256
+}
+
+[sub_resource type="ImageTexture" id=3]
+image = SubResource( 2 )
+size = Vector2( 256, 256 )
+
+[sub_resource type="GDScript" id=1]
+script/source = "tool
+extends ProxyTexture
+
+func _init():
+ if Directory.new().file_exists(\"res://addons/mat_maker_gd/icons/icons.svg\"):
+ var t : ImageTexture = ImageTexture.new()
+ t.load(\"res://addons/mat_maker_gd/icons/icons.svg\")
+ base = t
+"
+
+[resource]
+flags = 7
+base = SubResource( 3 )
+script = SubResource( 1 )
diff --git a/modules/material_maker/mat_maker_gd/icons/link.tres b/modules/material_maker/mat_maker_gd/icons/link.tres
new file mode 100644
index 000000000..0e9510909
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/icons/link.tres
@@ -0,0 +1,8 @@
+[gd_resource type="AtlasTexture" load_steps=2 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/icons/icons.tres" type="Texture" id=1]
+
+[resource]
+flags = 7
+atlas = ExtResource( 1 )
+region = Rect2( 16, 0, 16, 15 )
diff --git a/modules/material_maker/mat_maker_gd/icons/minimize.tres b/modules/material_maker/mat_maker_gd/icons/minimize.tres
new file mode 100644
index 000000000..7d367b4df
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/icons/minimize.tres
@@ -0,0 +1,8 @@
+[gd_resource type="AtlasTexture" load_steps=2 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/icons/icons.tres" type="Texture" id=1]
+
+[resource]
+flags = 7
+atlas = ExtResource( 1 )
+region = Rect2( 48, 96, 16, 16 )
diff --git a/modules/material_maker/mat_maker_gd/icons/output_preview.tres b/modules/material_maker/mat_maker_gd/icons/output_preview.tres
new file mode 100644
index 000000000..c84be544d
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/icons/output_preview.tres
@@ -0,0 +1,8 @@
+[gd_resource type="AtlasTexture" load_steps=2 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/icons/icons.tres" type="Texture" id=1]
+
+[resource]
+flags = 7
+atlas = ExtResource( 1 )
+region = Rect2( 0, 80, 16, 16 )
diff --git a/modules/material_maker/mat_maker_gd/icons/port_group_0.tres b/modules/material_maker/mat_maker_gd/icons/port_group_0.tres
new file mode 100644
index 000000000..ae29b24c1
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/icons/port_group_0.tres
@@ -0,0 +1,8 @@
+[gd_resource type="AtlasTexture" load_steps=2 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/icons/icons.tres" type="Texture" id=1]
+
+[resource]
+flags = 7
+atlas = ExtResource( 1 )
+region = Rect2( 32, 64, 16, 16 )
diff --git a/modules/material_maker/mat_maker_gd/icons/port_group_1.tres b/modules/material_maker/mat_maker_gd/icons/port_group_1.tres
new file mode 100644
index 000000000..56412cca6
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/icons/port_group_1.tres
@@ -0,0 +1,8 @@
+[gd_resource type="AtlasTexture" load_steps=2 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/icons/icons.tres" type="Texture" id=1]
+
+[resource]
+flags = 7
+atlas = ExtResource( 1 )
+region = Rect2( 32, 80, 16, 16 )
diff --git a/modules/material_maker/mat_maker_gd/icons/port_group_2.tres b/modules/material_maker/mat_maker_gd/icons/port_group_2.tres
new file mode 100644
index 000000000..dd0801812
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/icons/port_group_2.tres
@@ -0,0 +1,8 @@
+[gd_resource type="AtlasTexture" load_steps=2 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/icons/icons.tres" type="Texture" id=1]
+
+[resource]
+flags = 4
+atlas = ExtResource( 1 )
+region = Rect2( 32, 96, 16, 16 )
diff --git a/modules/material_maker/mat_maker_gd/icons/port_group_3.tres b/modules/material_maker/mat_maker_gd/icons/port_group_3.tres
new file mode 100644
index 000000000..294300142
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/icons/port_group_3.tres
@@ -0,0 +1,8 @@
+[gd_resource type="AtlasTexture" load_steps=2 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/icons/icons.tres" type="Texture" id=1]
+
+[resource]
+flags = 7
+atlas = ExtResource( 1 )
+region = Rect2( 32, 112, 16, 16 )
diff --git a/modules/material_maker/mat_maker_gd/icons/randomness_locked.tres b/modules/material_maker/mat_maker_gd/icons/randomness_locked.tres
new file mode 100644
index 000000000..48fcc127a
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/icons/randomness_locked.tres
@@ -0,0 +1,8 @@
+[gd_resource type="AtlasTexture" load_steps=2 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/icons/icons.tres" type="Texture" id=1]
+
+[resource]
+flags = 4
+atlas = ExtResource( 1 )
+region = Rect2( 80, 32, 16, 16 )
diff --git a/modules/material_maker/mat_maker_gd/icons/randomness_unlocked.tres b/modules/material_maker/mat_maker_gd/icons/randomness_unlocked.tres
new file mode 100644
index 000000000..9ec871f5d
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/icons/randomness_unlocked.tres
@@ -0,0 +1,8 @@
+[gd_resource type="AtlasTexture" load_steps=2 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/icons/icons.tres" type="Texture" id=1]
+
+[resource]
+flags = 7
+atlas = ExtResource( 1 )
+region = Rect2( 64, 32, 16, 16 )
diff --git a/modules/material_maker/mat_maker_gd/icons/remove.tres b/modules/material_maker/mat_maker_gd/icons/remove.tres
new file mode 100644
index 000000000..b1f1c2f85
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/icons/remove.tres
@@ -0,0 +1,8 @@
+[gd_resource type="AtlasTexture" load_steps=2 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/icons/icons.tres" type="Texture" id=1]
+
+[resource]
+flags = 7
+atlas = ExtResource( 1 )
+region = Rect2( 32, 0, 16, 16 )
diff --git a/modules/material_maker/mat_maker_gd/icons/up.tres b/modules/material_maker/mat_maker_gd/icons/up.tres
new file mode 100644
index 000000000..ab48648fd
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/icons/up.tres
@@ -0,0 +1,8 @@
+[gd_resource type="AtlasTexture" load_steps=2 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/icons/icons.tres" type="Texture" id=1]
+
+[resource]
+flags = 4
+atlas = ExtResource( 1 )
+region = Rect2( 16, 48, 16, 16 )
diff --git a/modules/material_maker/mat_maker_gd/new_resource.tres b/modules/material_maker/mat_maker_gd/new_resource.tres
new file mode 100644
index 000000000..9e96b424e
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/new_resource.tres
@@ -0,0 +1,652 @@
+[gd_resource type="Resource" load_steps=89 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/nodes/mm_material.gd" type="Script" id=1]
+[ext_resource path="res://addons/mat_maker_gd/nodes/filter/adjust_hsv.gd" type="Script" id=2]
+[ext_resource path="res://addons/mat_maker_gd/nodes/noise/voronoi.gd" type="Script" id=3]
+[ext_resource path="res://addons/mat_maker_gd/nodes/filter/invert.gd" type="Script" id=4]
+[ext_resource path="res://addons/mat_maker_gd/nodes/mm_node_universal_property.gd" type="Script" id=5]
+[ext_resource path="res://addons/mat_maker_gd/nodes/filter/combine.gd" type="Script" id=6]
+[ext_resource path="res://addons/mat_maker_gd/nodes/transform/scale.gd" type="Script" id=7]
+[ext_resource path="res://addons/mat_maker_gd/nodes/transform/repeat.gd" type="Script" id=8]
+[ext_resource path="res://addons/mat_maker_gd/nodes/transform/shear.gd" type="Script" id=9]
+[ext_resource path="res://addons/mat_maker_gd/nodes/transform/mirror.gd" type="Script" id=10]
+[ext_resource path="res://addons/mat_maker_gd/nodes/transform/transform.gd" type="Script" id=11]
+[ext_resource path="res://addons/mat_maker_gd/nodes/transform/circle_map.gd" type="Script" id=12]
+[ext_resource path="res://addons/mat_maker_gd/nodes/transform/rotate.gd" type="Script" id=13]
+[ext_resource path="res://addons/mat_maker_gd/nodes/filter/tonality.gd" type="Script" id=14]
+[ext_resource path="res://addons/mat_maker_gd/nodes/filter/fill_to_position.gd" type="Script" id=15]
+[ext_resource path="res://addons/mat_maker_gd/nodes/simple/shape.gd" type="Script" id=16]
+[ext_resource path="res://addons/mat_maker_gd/nodes/filter/fill_to_uv.gd" type="Script" id=17]
+[ext_resource path="res://addons/mat_maker_gd/nodes/filter/fill_to_random_grey.gd" type="Script" id=18]
+[ext_resource path="res://addons/mat_maker_gd/nodes/filter/math.gd" type="Script" id=19]
+[ext_resource path="res://addons/mat_maker_gd/nodes/transform/color_tiler.gd" type="Script" id=20]
+
+[sub_resource type="Resource" id=1]
+script = ExtResource( 5 )
+default_type = 5
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=3]
+script = ExtResource( 5 )
+default_type = 4
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=4]
+script = ExtResource( 2 )
+graph_position = Vector2( 140, 0 )
+image = SubResource( 1 )
+input = SubResource( 3 )
+hue = 0.0
+saturation = 1.0
+value = 1.0
+
+[sub_resource type="Resource" id=5]
+script = ExtResource( 5 )
+default_type = 5
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=6]
+script = ExtResource( 5 )
+default_type = 5
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=7]
+script = ExtResource( 5 )
+default_type = 5
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=2]
+script = ExtResource( 5 )
+default_type = 5
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=8]
+script = ExtResource( 3 )
+graph_position = Vector2( -160, 40 )
+out_nodes = SubResource( 7 )
+out_borders = SubResource( 5 )
+out_random_color = SubResource( 2 )
+out_fill = SubResource( 6 )
+scale = Vector2( 13.6, 18.9 )
+stretch = Vector2( 2.13, 2.13 )
+intensity = 1.07
+randomness = 0.89
+
+[sub_resource type="Resource" id=9]
+script = ExtResource( 5 )
+default_type = 5
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=10]
+script = ExtResource( 5 )
+default_type = 4
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=11]
+script = ExtResource( 4 )
+graph_position = Vector2( 380, 80 )
+image = SubResource( 9 )
+input = SubResource( 10 )
+
+[sub_resource type="Resource" id=12]
+script = ExtResource( 5 )
+default_type = 5
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=13]
+script = ExtResource( 5 )
+default_type = 1
+default_int = 0
+default_float = 1.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=14]
+script = ExtResource( 5 )
+default_type = 1
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+input_property = SubResource( 7 )
+
+[sub_resource type="Resource" id=15]
+script = ExtResource( 5 )
+default_type = 1
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+input_property = SubResource( 2 )
+
+[sub_resource type="Resource" id=16]
+script = ExtResource( 5 )
+default_type = 1
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+input_property = SubResource( 5 )
+
+[sub_resource type="Resource" id=17]
+script = ExtResource( 6 )
+graph_position = Vector2( 380, 380 )
+image = SubResource( 12 )
+input_r = SubResource( 16 )
+input_g = SubResource( 15 )
+input_b = SubResource( 14 )
+input_a = SubResource( 13 )
+
+[sub_resource type="Resource" id=18]
+script = ExtResource( 5 )
+default_type = 5
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=19]
+script = ExtResource( 5 )
+default_type = 4
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+input_property = SubResource( 12 )
+
+[sub_resource type="Resource" id=20]
+script = ExtResource( 7 )
+graph_position = Vector2( 1080, 180 )
+image = SubResource( 18 )
+input = SubResource( 19 )
+center = Vector2( 1, 1 )
+scale = Vector2( 1.3, 1.3 )
+
+[sub_resource type="Resource" id=21]
+script = ExtResource( 5 )
+default_type = 4
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+input_property = SubResource( 12 )
+
+[sub_resource type="Resource" id=22]
+script = ExtResource( 8 )
+graph_position = Vector2( 560, 300 )
+input = SubResource( 21 )
+
+[sub_resource type="Resource" id=23]
+script = ExtResource( 5 )
+default_type = 5
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=24]
+script = ExtResource( 5 )
+default_type = 4
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+input_property = SubResource( 21 )
+
+[sub_resource type="Resource" id=25]
+script = ExtResource( 9 )
+graph_position = Vector2( 860, 200 )
+image = SubResource( 23 )
+input = SubResource( 24 )
+direction = 0
+amount = 1.06
+center = 0.0
+
+[sub_resource type="Resource" id=26]
+script = ExtResource( 5 )
+default_type = 5
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=27]
+script = ExtResource( 5 )
+default_type = 4
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+input_property = SubResource( 21 )
+
+[sub_resource type="Resource" id=28]
+script = ExtResource( 10 )
+graph_position = Vector2( 620, 460 )
+image = SubResource( 26 )
+input = SubResource( 27 )
+direction = 0
+offset = 0.32
+
+[sub_resource type="Resource" id=32]
+script = ExtResource( 5 )
+default_type = 5
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=33]
+script = ExtResource( 5 )
+default_type = 4
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+input_property = SubResource( 21 )
+
+[sub_resource type="Resource" id=34]
+script = ExtResource( 12 )
+graph_position = Vector2( 820, 580 )
+image = SubResource( 32 )
+input = SubResource( 33 )
+radius = 1.0
+repeat = 4
+
+[sub_resource type="Resource" id=35]
+script = ExtResource( 5 )
+default_type = 5
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=36]
+script = ExtResource( 5 )
+default_type = 4
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=37]
+script = ExtResource( 13 )
+graph_position = Vector2( 1040, 560 )
+image = SubResource( 35 )
+input = SubResource( 36 )
+center = Vector2( 0.13, 0 )
+rotate = 150.0
+
+[sub_resource type="Resource" id=38]
+script = ExtResource( 5 )
+default_type = 5
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=39]
+script = ExtResource( 5 )
+default_type = 4
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+input_property = SubResource( 21 )
+
+[sub_resource type="Resource" id=40]
+script = ExtResource( 5 )
+default_type = 1
+default_int = 0
+default_float = 14.5
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+input_property = SubResource( 32 )
+
+[sub_resource type="Resource" id=41]
+script = ExtResource( 5 )
+default_type = 1
+default_int = 0
+default_float = 1.6
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=42]
+script = ExtResource( 5 )
+default_type = 1
+default_int = 0
+default_float = 1.1
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=43]
+script = ExtResource( 5 )
+default_type = 1
+default_int = 0
+default_float = 4.1
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=44]
+script = ExtResource( 5 )
+default_type = 1
+default_int = 0
+default_float = 2.2
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=45]
+script = ExtResource( 11 )
+graph_position = Vector2( 1280, 560 )
+image = SubResource( 38 )
+input = SubResource( 39 )
+translate_x = SubResource( 43 )
+translate_y = SubResource( 44 )
+rotate = SubResource( 40 )
+scale_x = SubResource( 41 )
+scale_y = SubResource( 42 )
+mode = 1
+
+[sub_resource type="Resource" id=46]
+script = ExtResource( 5 )
+default_type = 5
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=47]
+script = ExtResource( 5 )
+default_type = 1
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+input_property = SubResource( 23 )
+
+[sub_resource type="Resource" id=48]
+script = ExtResource( 14 )
+graph_position = Vector2( 620, 0 )
+points = [ 0.0, 0.0, 0.0, 1.0, 0.284455, 0.780757, 0.0, 0.0, 0.735577, 0.159306, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0 ]
+image = SubResource( 46 )
+input = SubResource( 47 )
+
+[sub_resource type="Resource" id=49]
+script = ExtResource( 5 )
+default_type = 5
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=50]
+script = ExtResource( 5 )
+default_type = 4
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=51]
+script = ExtResource( 15 )
+graph_position = Vector2( 120, 440 )
+image = SubResource( 49 )
+input = SubResource( 50 )
+axis = 2
+
+[sub_resource type="Resource" id=52]
+script = ExtResource( 5 )
+default_type = 1
+default_int = 0
+default_float = 0.1
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=53]
+script = ExtResource( 5 )
+default_type = 5
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=54]
+script = ExtResource( 5 )
+default_type = 1
+default_int = 0
+default_float = 1.3
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+input_property = SubResource( 2 )
+
+[sub_resource type="Resource" id=55]
+script = ExtResource( 16 )
+graph_position = Vector2( -440, 200 )
+image = SubResource( 53 )
+shape_type = 3
+sides = 7
+radius = SubResource( 54 )
+edge = SubResource( 52 )
+
+[sub_resource type="Resource" id=56]
+script = ExtResource( 5 )
+default_type = 5
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=59]
+script = ExtResource( 5 )
+default_type = 5
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=57]
+script = ExtResource( 5 )
+default_type = 4
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+input_property = SubResource( 59 )
+
+[sub_resource type="Resource" id=58]
+script = ExtResource( 17 )
+graph_position = Vector2( 580, 800 )
+image = SubResource( 56 )
+input = SubResource( 57 )
+mode = 0
+
+[sub_resource type="Resource" id=60]
+script = ExtResource( 5 )
+default_type = 4
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+input_property = SubResource( 12 )
+
+[sub_resource type="Resource" id=61]
+script = ExtResource( 18 )
+graph_position = Vector2( 320, 700 )
+image = SubResource( 59 )
+input = SubResource( 60 )
+edge_color = 0.9
+
+[sub_resource type="Resource" id=63]
+script = ExtResource( 5 )
+default_type = 1
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+input_property = SubResource( 5 )
+
+[sub_resource type="Resource" id=64]
+script = ExtResource( 5 )
+default_type = 1
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+input_property = SubResource( 53 )
+
+[sub_resource type="Resource" id=65]
+script = ExtResource( 5 )
+default_type = 5
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=62]
+script = ExtResource( 5 )
+default_type = 1
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=66]
+script = ExtResource( 19 )
+graph_position = Vector2( -720, 280 )
+image = SubResource( 65 )
+a = SubResource( 63 )
+b = SubResource( 64 )
+output = SubResource( 62 )
+operation = 3
+clamp_result = true
+
+[sub_resource type="Resource" id=67]
+script = ExtResource( 5 )
+default_type = 1
+default_int = 0
+default_float = 1.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=68]
+script = ExtResource( 5 )
+default_type = 4
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=69]
+script = ExtResource( 5 )
+default_type = 5
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=70]
+script = ExtResource( 5 )
+default_type = 5
+default_int = 0
+default_float = 0.0
+default_vector2 = Vector2( 0, 0 )
+default_vector3 = Vector3( 0, 0, 0 )
+default_color = Color( 0, 0, 0, 1 )
+
+[sub_resource type="Resource" id=71]
+script = ExtResource( 20 )
+graph_position = Vector2( -1060, 280 )
+input = SubResource( 68 )
+in_mask = SubResource( 67 )
+output = SubResource( 70 )
+instance_map = SubResource( 69 )
+tile = Vector2( 4, 4 )
+overlap = 1.0
+select_inputs = 0
+scale = Vector2( 0.5, 0.5 )
+fixed_offset = 0.0
+rnd_offset = 0.28
+rnd_rotate = 100.0
+rnd_scale = 0.2
+rnd_opacity = 0.0
+variations = false
+
+[resource]
+script = ExtResource( 1 )
+image_size = Vector2( 128, 128 )
+nodes = [ SubResource( 4 ), SubResource( 8 ), SubResource( 11 ), SubResource( 17 ), SubResource( 20 ), SubResource( 22 ), SubResource( 25 ), SubResource( 28 ), SubResource( 34 ), SubResource( 37 ), SubResource( 45 ), SubResource( 48 ), SubResource( 51 ), SubResource( 55 ), SubResource( 58 ), SubResource( 61 ), SubResource( 66 ), SubResource( 71 ) ]
diff --git a/modules/material_maker/mat_maker_gd/nodes/bases/curve_base.gd b/modules/material_maker/mat_maker_gd/nodes/bases/curve_base.gd
new file mode 100644
index 000000000..76daea54e
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/bases/curve_base.gd
@@ -0,0 +1,118 @@
+tool
+extends MMNode
+
+class Point:
+ var p : Vector2
+ var ls : float
+ var rs : float
+ func _init(x : float, y : float, nls : float, nrs : float) -> void:
+ p = Vector2(x, y)
+ ls = nls
+ rs = nrs
+
+export(PoolRealArray) var points
+
+func init_points_01():
+ if points.size() == 0:
+ points = [ 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0 ]
+
+func init_points_11():
+ if points.size() == 0:
+ points = [ 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0 ]
+
+func to_string() -> String:
+ var rv = PoolStringArray()
+ for p in points:
+ rv.append("("+str(p.x)+","+str(p.y)+","+str(p.ls)+","+str(p.rs)+")")
+
+ return rv.join(",")
+
+func clear() -> void:
+ points.clear()
+ curve_changed()
+
+func add_point(x : float, y : float, ls : float = INF, rs : float = INF) -> void:
+ var indx : int = points.size() / 4
+
+ for i in indx:
+ var ii : int = i * 4
+ if x < points[ii]:
+ if ls == INF:
+ ls == 0
+ if rs == INF:
+ rs == 0
+
+ points.insert(ii, x)
+ points.insert(ii + 1, y)
+ points.insert(ii + 2, ls)
+ points.insert(ii + 3, rs)
+
+ curve_changed()
+ return
+
+ points.append(x)
+ points.append(y)
+ points.append(ls)
+ points.append(rs)
+
+ curve_changed()
+
+func remove_point(i : int) -> bool:
+ var index : int = i * 4
+
+ if index <= 0 or index >= points.size() - 1:
+ return false
+ else:
+ points.remove(index)
+ points.remove(index)
+ points.remove(index)
+ points.remove(index)
+
+ curve_changed()
+ return true
+
+func get_point_count() -> int:
+ return points.size() / 4
+
+func set_point(i : int, v : Point) -> void:
+ var indx : int = i * 4
+
+ points[indx + 0] = v.p.x
+ points[indx + 1] = v.p.y
+ points[indx + 2] = v.ls
+ points[indx + 3] = v.rs
+
+ curve_changed()
+
+func get_point(i : int) -> Point:
+ var indx : int = i * 4
+
+ return Point.new(points[indx + 0], points[indx + 1], points[indx + 2], points[indx + 3])
+
+func get_points() -> Array:
+ var arr : Array = Array()
+
+ var c : int = get_point_count()
+
+ for i in range(c):
+ arr.append(get_point(i))
+
+ return arr
+
+func set_points(arr : Array, notify : bool = true) -> void:
+ points.resize(0)
+
+ for p in arr:
+ points.append(p.p.x)
+ points.append(p.p.y)
+ points.append(p.ls)
+ points.append(p.rs)
+
+ if notify:
+ curve_changed()
+
+func curve_changed() -> void:
+ _curve_changed()
+
+func _curve_changed() -> void:
+ emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/bases/gradient_base.gd b/modules/material_maker/mat_maker_gd/nodes/bases/gradient_base.gd
new file mode 100644
index 000000000..369614f86
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/bases/gradient_base.gd
@@ -0,0 +1,64 @@
+tool
+extends MMNode
+
+#var Gradients = preload("res://addons/mat_maker_gd/nodes/common/gradients.gd")
+
+export(int) var interpolation_type : int = 1 setget set_interpolation_type, get_interpolation_type
+export(PoolRealArray) var points : PoolRealArray = PoolRealArray()
+
+func get_gradient_color(x : float) -> Color:
+# if interpolation_type == 0:
+# return Gradients.gradient_type_1(x, points)
+# elif interpolation_type == 1:
+# return Gradients.gradient_type_2(x, points)
+# elif interpolation_type == 2:
+# return Gradients.gradient_type_3(x, points)
+# elif interpolation_type == 3:
+# return Gradients.gradient_type_4(x, points)
+
+ return Color(1, 1, 1, 1)
+
+func get_interpolation_type() -> int:
+ return interpolation_type
+
+func set_interpolation_type(val : int) -> void:
+ interpolation_type = val
+
+ set_dirty(true)
+
+func get_points() -> PoolRealArray:
+ return points
+
+func set_points(val : PoolRealArray) -> void:
+ points = val
+
+ set_dirty(true)
+
+func get_point_value(index : int) -> float:
+ return points[index * 5]
+
+func get_point_color(index : int) -> Color:
+ var indx : int = index * 5
+
+ return Color(points[indx + 1], points[indx + 2], points[indx + 3], points[indx + 4])
+
+func add_point(val : float, color : Color) -> void:
+ var s : int = points.size()
+ points.resize(s + 5)
+
+ points[s] = val
+
+ points[s + 1] = color.r
+ points[s + 2] = color.g
+ points[s + 3] = color.b
+ points[s + 4] = color.a
+
+ set_dirty(true)
+
+func get_point_count() -> int:
+ return points.size() / 5
+
+func clear() -> void:
+ points.resize(0)
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/bases/polygon_base.gd b/modules/material_maker/mat_maker_gd/nodes/bases/polygon_base.gd
new file mode 100644
index 000000000..a7404555f
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/bases/polygon_base.gd
@@ -0,0 +1,73 @@
+tool
+extends MMNode
+
+export(PoolVector2Array) var points : PoolVector2Array = [Vector2(0.2, 0.2), Vector2(0.7, 0.4), Vector2(0.4, 0.7)]
+
+func clear() -> void:
+ points.resize(0)
+
+ _polygon_changed()
+
+func add_point(x : float, y : float, closed : bool = true) -> void:
+ var p : Vector2 = Vector2(x, y)
+ var points_count = points.size()
+
+ if points_count < 3:
+ points.append(p)
+ _polygon_changed()
+ return
+
+ var min_length : float = (p-Geometry.get_closest_point_to_segment_2d(p, points[0], points[points_count-1])).length()
+ var insert_point = 0
+
+ for i in points_count-1:
+ var length = (p - Geometry.get_closest_point_to_segment_2d(p, points[i], points[i+1])).length()
+ if length < min_length:
+ min_length = length
+ insert_point = i+1
+
+ if !closed and insert_point == 0 and (points[0]-p).length() > (points[points_count-1]-p).length():
+ insert_point = points_count
+
+ points.insert(insert_point, p)
+
+ _polygon_changed()
+
+func remove_point(index : int) -> bool:
+ var s = points.size()
+ if s < 4 or index < 0 or index >= s:
+ return false
+ else:
+ points.remove(index)
+ _polygon_changed()
+
+ return true
+
+func get_point_count() -> int:
+ return points.size()
+
+func get_point(i : int) -> Vector2:
+ return points[i]
+
+func set_point(i : int, v : Vector2) -> void:
+ points[i] = v
+
+ _polygon_changed()
+
+func set_points(v : PoolVector2Array) -> void:
+ points = v
+
+ _polygon_changed()
+
+func polygon_changed() -> void:
+ _polygon_changed()
+
+func _polygon_changed() -> void:
+ emit_changed()
+
+func to_string() -> String:
+ var rv = PoolStringArray()
+ for p in points:
+ rv.append("("+str(p.x)+","+str(p.y)+")")
+
+ return rv.join(",")
diff --git a/modules/material_maker/mat_maker_gd/nodes/common/blur.gd b/modules/material_maker/mat_maker_gd/nodes/common/blur.gd
new file mode 100644
index 000000000..2aa637e11
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/common/blur.gd
@@ -0,0 +1,1172 @@
+tool
+extends Reference
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+
+#----------------------
+#directional_blur.mmg
+
+#{
+# "connections": [
+# {
+# "from": "gen_inputs",
+# "from_port": 0,
+# "to": "buffer",
+# "to_port": 0
+# },
+# {
+# "from": "buffer",
+# "from_port": 0,
+# "to": "edge_detect_3_3_2",
+# "to_port": 0
+# },
+# {
+# "from": "edge_detect_3_3_2",
+# "from_port": 0,
+# "to": "gen_outputs",
+# "to_port": 0
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 1,
+# "to": "edge_detect_3_3_2",
+# "to_port": 1
+# }
+# ],
+# "label": "Directional Blur",
+# "longdesc": "Applies a directional gaussian blur to its input",
+# "name": "directional_blur",
+# "node_position": {
+# "x": 0,
+# "y": 0
+# },
+# "nodes": [
+# {
+# "name": "buffer",
+# "node_position": {
+# "x": -381.25,
+# "y": -270.75
+# },
+# "parameters": {
+# "lod": 0,
+# "size": 9
+# },
+# "type": "buffer"
+# },
+# {
+# "name": "gen_parameters",
+# "node_position": {
+# "x": -436.666626,
+# "y": -413.666656
+# },
+# "parameters": {
+# "param0": 9,
+# "param1": 50,
+# "param2": 45
+# },
+# "type": "remote",
+# "widgets": [
+# {
+# "label": "Grid size:",
+# "linked_widgets": [
+# {
+# "node": "buffer",
+# "widget": "size"
+# },
+# {
+# "node": "edge_detect_3_3_2",
+# "widget": "size"
+# }
+# ],
+# "longdesc": "The resolution of the input",
+# "name": "param0",
+# "shortdesc": "Size",
+# "type": "linked_control"
+# },
+# {
+# "label": "Sigma",
+# "linked_widgets": [
+# {
+# "node": "edge_detect_3_3_2",
+# "widget": "sigma"
+# }
+# ],
+# "longdesc": "The strength of the blur filter",
+# "name": "param1",
+# "shortdesc": "Sigma",
+# "type": "linked_control"
+# },
+# {
+# "label": "Angle",
+# "linked_widgets": [
+# {
+# "node": "edge_detect_3_3_2",
+# "widget": "angle"
+# }
+# ],
+# "longdesc": "The angle of the directional blur effect",
+# "name": "param2",
+# "shortdesc": "Angle",
+# "type": "linked_control"
+# }
+# ]
+# },
+# {
+# "name": "gen_inputs",
+# "node_position": {
+# "x": -779.666626,
+# "y": -247.392853
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "longdesc": "The input image",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "rgba"
+# },
+# {
+# "group_size": 0,
+# "longdesc": "A map that controls the strength of the blur filter",
+# "name": "amount",
+# "shortdesc": "Strength map",
+# "type": "f"
+# }
+# ],
+# "seed_value": 91624,
+# "type": "ios"
+# },
+# {
+# "name": "gen_outputs",
+# "node_position": {
+# "x": -45.452393,
+# "y": -195.392853
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "longdesc": "Shows the generated blurred image",
+# "name": "port0",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "edge_detect_3_3_2",
+# "node_position": {
+# "x": -376.725464,
+# "y": -184.178955
+# },
+# "parameters": {
+# "angle": 45,
+# "sigma": 50,
+# "size": 9
+# },
+# "seed_value": -47470,
+# "shader_model": {
+# "code": "",
+# "global": "",
+# "inputs": [
+# {
+# "default": "vec4(1.0)",
+# "function": true,
+# "label": "",
+# "name": "in",
+# "type": "rgba"
+# },
+# {
+# "default": "1.0",
+# "function": true,
+# "label": "Label",
+# "name": "amount",
+# "type": "f"
+# }
+# ],
+# "instance": "vec4 $(name)_fct(vec2 uv) {\n\tvec2 e = vec2(cos($angle*0.01745329251), -sin($angle*0.01745329251))/$size;\n\tvec4 rv = vec4(0.0);\n\tfloat sum = 0.0;\n\tfloat sigma = $sigma*$amount(uv);\n\tfor (float i = -50.0; i <= 50.0; i += 1.0) {\n\t\tfloat coef = exp(-0.5*(pow(i/sigma, 2.0)))/(6.28318530718*sigma*sigma);\n\t\trv += $in(uv+i*e)*coef;\n\t\tsum += coef;\n\t}\n\treturn rv/sum;\n}",
+# "name": "Directional Blur",
+# "outputs": [
+# {
+# "rgba": "$(name)_fct($uv)",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 9,
+# "first": 4,
+# "label": "Size",
+# "last": 12,
+# "name": "size",
+# "type": "size"
+# },
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "Sigma",
+# "max": 50,
+# "min": 0,
+# "name": "sigma",
+# "step": 0.1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0,
+# "label": "Angle",
+# "max": 180,
+# "min": -180,
+# "name": "angle",
+# "step": 0.1,
+# "type": "float"
+# }
+# ]
+# },
+# "type": "shader"
+# }
+# ],
+# "parameters": {
+# "param0": 9,
+# "param1": 50,
+# "param2": 45
+# },
+# "shortdesc": "Directional blur",
+# "type": "graph"
+#}
+
+#----------------------
+#fast_blur.mmg
+
+#{
+# "connections": [
+# {
+# "from": "buffer_2",
+# "from_port": 0,
+# "to": "fast_blur_shader",
+# "to_port": 0
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 0,
+# "to": "buffer_2",
+# "to_port": 0
+# },
+# {
+# "from": "fast_blur_shader",
+# "from_port": 0,
+# "to": "gen_outputs",
+# "to_port": 0
+# }
+# ],
+# "label": "Fast Blur",
+# "longdesc": "",
+# "name": "fast_blur",
+# "node_position": {
+# "x": 0,
+# "y": 0
+# },
+# "nodes": [
+# {
+# "name": "fast_blur_shader",
+# "node_position": {
+# "x": -168,
+# "y": 120
+# },
+# "parameters": {
+# "quality": 1,
+# "sigma": 100
+# },
+# "type": "fast_blur_shader"
+# },
+# {
+# "name": "buffer_2",
+# "node_position": {
+# "x": -187,
+# "y": 61.5
+# },
+# "parameters": {
+# "size": 11
+# },
+# "type": "buffer",
+# "version": 1
+# },
+# {
+# "name": "gen_inputs",
+# "node_position": {
+# "x": -602,
+# "y": 91.75
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "longdesc": "The input image",
+# "name": "input",
+# "shortdesc": "Input",
+# "type": "rgba"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "gen_outputs",
+# "node_position": {
+# "x": 88,
+# "y": 61.75
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "longdesc": "The generated blurred image",
+# "name": "output",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "gen_parameters",
+# "node_position": {
+# "x": -254.5,
+# "y": -122.5
+# },
+# "parameters": {
+# "param0": 11,
+# "param1": 100,
+# "param2": 1
+# },
+# "type": "remote",
+# "widgets": [
+# {
+# "label": "Resolution",
+# "linked_widgets": [
+# {
+# "node": "buffer_2",
+# "widget": "size"
+# }
+# ],
+# "longdesc": "The resolution used to sample the input image",
+# "name": "param0",
+# "shortdesc": "Resolution",
+# "type": "linked_control"
+# },
+# {
+# "label": "Sigma",
+# "linked_widgets": [
+# {
+# "node": "fast_blur_shader",
+# "widget": "sigma"
+# }
+# ],
+# "longdesc": "The standard deviation of the gaussian distribution",
+# "name": "param1",
+# "shortdesc": "Sigma",
+# "type": "linked_control"
+# },
+# {
+# "label": "Quality",
+# "linked_widgets": [
+# {
+# "node": "fast_blur_shader",
+# "widget": "quality"
+# }
+# ],
+# "longdesc": "The quality of the effect (increasing quality increases compute time)",
+# "name": "param2",
+# "shortdesc": "Quality",
+# "type": "linked_control"
+# }
+# ]
+# }
+# ],
+# "parameters": {
+# "param0": 11,
+# "param1": 100,
+# "param2": 1
+# },
+# "shortdesc": "",
+# "type": "graph"
+#}
+
+#----------------------
+#fast_blur_shader.mmg
+
+#{
+# "name": "fast_blur_shader",
+# "node_position": {
+# "x": 0,
+# "y": 0
+# },
+# "parameters": {
+# "quality": 1,
+# "sigma": 100
+# },
+# "shader_model": {
+# "code": "",
+# "global": "",
+# "inputs": [
+# {
+# "default": "vec4(1.0)",
+# "function": true,
+# "label": "",
+# "name": "in",
+# "type": "rgba"
+# }
+# ],
+# "instance": "vec4 $(name)_blur(vec2 uv, vec2 scale, float sigma, int quality) {\n vec4 O = vec4(0.0);\n\tfloat samples = sigma * 4.0; \n\tint LOD = max(0, int(log2(float(samples)))-quality-2);\n\tint sLOD = 1 << LOD;\n int s = max(1, int(samples/float(sLOD)));\n\tfloat sum = 0.0;\n for (int i = 0; i < s*s; i++) {\n vec2 d = vec2(float(i%s), float(i/s))*float(sLOD) - 0.5*float(samples);\n\t\tvec2 dd = d / sigma;\n\t\tfloat g = exp(-.5*dot(dd,dd))/(6.28*sigma*sigma);\n O += g * textureLod($in.texture, uv + scale * d, float(LOD));\n\t\tsum += g;\n }\n \n return O / sum;\n}\n",
+# "name": "Fast Blur",
+# "outputs": [
+# {
+# "rgba": "$(name)_blur($uv, vec2(1.0)/$in.size, max(1.0, floor($sigma*$in.size/2048.0)), int($quality))",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 1,
+# "label": "",
+# "max": 256,
+# "min": 1,
+# "name": "sigma",
+# "step": 1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 1,
+# "label": "",
+# "max": 3,
+# "min": 0,
+# "name": "quality",
+# "step": 1,
+# "type": "float"
+# }
+# ]
+# },
+# "type": "shader"
+#}
+
+#----------------------
+#gaussian_blur.mmg
+
+#{
+# "connections": [
+# {
+# "from": "switch",
+# "from_port": 0,
+# "to": "buffer_2",
+# "to_port": 0
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 0,
+# "to": "buffer",
+# "to_port": 0
+# },
+# {
+# "from": "switch",
+# "from_port": 0,
+# "to": "switch_2",
+# "to_port": 1
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 0,
+# "to": "switch",
+# "to_port": 1
+# },
+# {
+# "from": "buffer",
+# "from_port": 0,
+# "to": "gaussian_blur_x",
+# "to_port": 0
+# },
+# {
+# "from": "gaussian_blur_x",
+# "from_port": 0,
+# "to": "switch",
+# "to_port": 0
+# },
+# {
+# "from": "gaussian_blur_y",
+# "from_port": 0,
+# "to": "switch_2",
+# "to_port": 0
+# },
+# {
+# "from": "buffer_2",
+# "from_port": 0,
+# "to": "gaussian_blur_y",
+# "to_port": 0
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 1,
+# "to": "gaussian_blur_x",
+# "to_port": 1
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 1,
+# "to": "gaussian_blur_y",
+# "to_port": 1
+# },
+# {
+# "from": "buffer_3",
+# "from_port": 0,
+# "to": "gen_outputs",
+# "to_port": 0
+# },
+# {
+# "from": "switch_2",
+# "from_port": 0,
+# "to": "buffer_3",
+# "to_port": 0
+# }
+# ],
+# "label": "Gaussian Blur",
+# "longdesc": "Applys a gaussian blur on its input",
+# "name": "gaussian_blur",
+# "node_position": {
+# "x": 0,
+# "y": 0
+# },
+# "nodes": [
+# {
+# "name": "buffer_2",
+# "node_position": {
+# "x": -399.875,
+# "y": -43.625
+# },
+# "parameters": {
+# "lod": 0,
+# "size": 9
+# },
+# "type": "buffer"
+# },
+# {
+# "name": "switch",
+# "node_position": {
+# "x": -496.452393,
+# "y": -130.166656
+# },
+# "parameters": {
+# "choices": 2,
+# "outputs": 1,
+# "source": 0
+# },
+# "type": "switch"
+# },
+# {
+# "name": "switch_2",
+# "node_position": {
+# "x": -240.452393,
+# "y": -133.666656
+# },
+# "parameters": {
+# "choices": 2,
+# "outputs": 1,
+# "source": 0
+# },
+# "type": "switch"
+# },
+# {
+# "name": "buffer",
+# "node_position": {
+# "x": -402.25,
+# "y": -315.75
+# },
+# "parameters": {
+# "lod": 0,
+# "size": 9
+# },
+# "type": "buffer"
+# },
+# {
+# "name": "gen_parameters",
+# "node_position": {
+# "x": -439.666626,
+# "y": -456.666656
+# },
+# "parameters": {
+# "param0": 9,
+# "param1": 50,
+# "param2": 0
+# },
+# "type": "remote",
+# "widgets": [
+# {
+# "label": "Grid size:",
+# "linked_widgets": [
+# {
+# "node": "buffer",
+# "widget": "size"
+# },
+# {
+# "node": "buffer_2",
+# "widget": "size"
+# },
+# {
+# "node": "gaussian_blur_x",
+# "widget": "size"
+# },
+# {
+# "node": "gaussian_blur_y",
+# "widget": "size"
+# },
+# {
+# "node": "buffer_3",
+# "widget": "size"
+# }
+# ],
+# "longdesc": "The resolution of the input image",
+# "name": "param0",
+# "shortdesc": "Size",
+# "type": "linked_control"
+# },
+# {
+# "label": "Sigma:",
+# "linked_widgets": [
+# {
+# "node": "gaussian_blur_x",
+# "widget": "sigma"
+# },
+# {
+# "node": "gaussian_blur_y",
+# "widget": "sigma"
+# }
+# ],
+# "longdesc": "The strength of the blur filter",
+# "name": "param1",
+# "shortdesc": "Sigma",
+# "type": "linked_control"
+# },
+# {
+# "configurations": {
+# "Both": [
+# {
+# "node": "switch",
+# "value": 0,
+# "widget": "source"
+# },
+# {
+# "node": "switch_2",
+# "value": 0,
+# "widget": "source"
+# }
+# ],
+# "X": [
+# {
+# "node": "switch",
+# "value": 0,
+# "widget": "source"
+# },
+# {
+# "node": "switch_2",
+# "value": 1,
+# "widget": "source"
+# }
+# ],
+# "Y": [
+# {
+# "node": "switch",
+# "value": 1,
+# "widget": "source"
+# },
+# {
+# "node": "switch_2",
+# "value": 0,
+# "widget": "source"
+# }
+# ]
+# },
+# "label": "Direction:",
+# "linked_widgets": [
+# {
+# "node": "switch",
+# "widget": "source"
+# },
+# {
+# "node": "switch_2",
+# "widget": "source"
+# }
+# ],
+# "longdesc": "Apply the blur filter horizontally, vertically of in both directions",
+# "name": "param2",
+# "shortdesc": "Direction",
+# "type": "config_control"
+# }
+# ]
+# },
+# {
+# "name": "gen_inputs",
+# "node_position": {
+# "x": -928.666626,
+# "y": -188.392853
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "longdesc": "The input image",
+# "name": "input",
+# "shortdesc": "Input",
+# "type": "rgba"
+# },
+# {
+# "group_size": 0,
+# "longdesc": "A map that controls the strength of the blur filter",
+# "name": "amount",
+# "shortdesc": "Strength map",
+# "type": "f"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "gen_outputs",
+# "node_position": {
+# "x": 193.547607,
+# "y": -135.392853
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "longdesc": "Shows the generated blurred image",
+# "name": "port0",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+# "seed_value": 77778,
+# "type": "ios"
+# },
+# {
+# "name": "gaussian_blur_x",
+# "node_position": {
+# "x": -412.993408,
+# "y": -221.281738
+# },
+# "parameters": {
+# "sigma": 50,
+# "size": 9
+# },
+# "type": "gaussian_blur_x"
+# },
+# {
+# "name": "gaussian_blur_y",
+# "node_position": {
+# "x": -405.993408,
+# "y": 38.718262
+# },
+# "parameters": {
+# "sigma": 50,
+# "size": 9
+# },
+# "seed_value": 12279,
+# "type": "gaussian_blur_y"
+# },
+# {
+# "name": "buffer_3",
+# "node_position": {
+# "x": -50.246796,
+# "y": -133.96936
+# },
+# "parameters": {
+# "lod": 0,
+# "size": 9
+# },
+# "type": "buffer"
+# }
+# ],
+# "parameters": {
+# "param0": 9,
+# "param1": 50,
+# "param2": 0
+# },
+# "shortdesc": "Gaussian blur",
+# "type": "graph"
+#}
+
+#----------------------
+#gaussian_blur_x.mmg
+
+#{
+# "name": "gaussian_blur_x",
+# "node_position": {
+# "x": 0,
+# "y": 0
+# },
+# "parameters": {
+# "sigma": 35.700001,
+# "size": 9
+# },
+# "shader_model": {
+# "code": "",
+# "global": "",
+# "inputs": [
+# {
+# "default": "vec4(1.0)",
+# "function": true,
+# "label": "",
+# "name": "in",
+# "type": "rgba"
+# },
+# {
+# "default": "1.0",
+# "function": true,
+# "label": "",
+# "name": "amount",
+# "type": "f"
+# }
+# ],
+# "instance": "vec4 $(name)_fct(vec2 uv) {\n\tfloat e = 1.0/$size;\n\tvec4 rv = vec4(0.0);\n\tfloat sum = 0.0;\n\tfloat sigma = max(0.000001, $sigma*$amount(uv));\n\tfor (float i = -50.0; i <= 50.0; i += 1.0) {\n\t\tfloat coef = exp(-0.5*(pow(i/sigma, 2.0)))/(6.28318530718*sigma*sigma);\n\t\trv += $in(uv+vec2(i*e, 0.0))*coef;\n\t\tsum += coef;\n\t}\n\treturn rv/sum;\n}",
+# "name": "Gaussian blur X",
+# "outputs": [
+# {
+# "rgba": "$(name)_fct($uv)",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 9,
+# "first": 4,
+# "label": "Size",
+# "last": 12,
+# "name": "size",
+# "type": "size"
+# },
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "Sigma",
+# "max": 50,
+# "min": 0,
+# "name": "sigma",
+# "step": 0.1,
+# "type": "float"
+# }
+# ]
+# },
+# "type": "shader"
+#}
+
+#----------------------
+#gaussian_blur_y.mmg
+
+#{
+# "name": "gaussian_blur_y",
+# "node_position": {
+# "x": 0,
+# "y": 0
+# },
+# "parameters": {
+# "sigma": 35.700001,
+# "size": 9
+# },
+# "shader_model": {
+# "code": "",
+# "global": "",
+# "inputs": [
+# {
+# "default": "vec4(1.0)",
+# "function": true,
+# "label": "",
+# "name": "in",
+# "type": "rgba"
+# },
+# {
+# "default": "1.0",
+# "function": true,
+# "label": "",
+# "name": "amount",
+# "type": "f"
+# }
+# ],
+# "instance": "vec4 $(name)_fct(vec2 uv) {\n\tfloat e = 1.0/$size;\n\tvec4 rv = vec4(0.0);\n\tfloat sum = 0.0;\n\tfloat sigma = max(0.000001, $sigma*$amount(uv));\n\tfor (float i = -50.0; i <= 50.0; i += 1.0) {\n\t\tfloat coef = exp(-0.5*(pow(i/sigma, 2.0)))/(6.28318530718*sigma*sigma);\n\t\trv += $in(uv+vec2(0.0, i*e))*coef;\n\t\tsum += coef;\n\t}\n\treturn rv/sum;\n}",
+# "name": "Gaussian blur Y",
+# "outputs": [
+# {
+# "rgba": "$(name)_fct($uv)",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 9,
+# "first": 4,
+# "label": "Size",
+# "last": 12,
+# "name": "size",
+# "type": "size"
+# },
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "Sigma",
+# "max": 50,
+# "min": 0,
+# "name": "sigma",
+# "step": 0.1,
+# "type": "float"
+# }
+# ]
+# },
+# "type": "shader"
+#}
+
+
+#----------------------
+#slope_blur.mmg
+
+#{
+# "connections": [
+# {
+# "from": "gen_inputs",
+# "from_port": 0,
+# "to": "buffer",
+# "to_port": 0
+# },
+# {
+# "from": "buffer",
+# "from_port": 0,
+# "to": "edge_detect_3_3_2",
+# "to_port": 0
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 1,
+# "to": "edge_detect_3_3_2",
+# "to_port": 1
+# },
+# {
+# "from": "edge_detect_3_3_2",
+# "from_port": 0,
+# "to": "buffer_2",
+# "to_port": 0
+# },
+# {
+# "from": "buffer_2",
+# "from_port": 0,
+# "to": "gen_outputs",
+# "to_port": 0
+# }
+# ],
+# "label": "Slope Blur",
+# "longdesc": "Applys a blur effect on its input, following slopes of an input height map",
+# "name": "slope_blur",
+# "node_position": {
+# "x": 0,
+# "y": 0
+# },
+# "nodes": [
+# {
+# "name": "buffer",
+# "node_position": {
+# "x": -395.25,
+# "y": -274.75
+# },
+# "parameters": {
+# "lod": 0,
+# "size": 10
+# },
+# "type": "buffer"
+# },
+# {
+# "name": "gen_parameters",
+# "node_position": {
+# "x": -462.666626,
+# "y": -397.666656
+# },
+# "parameters": {
+# "param0": 10,
+# "param1": 30
+# },
+# "type": "remote",
+# "widgets": [
+# {
+# "label": "Grid size:",
+# "linked_widgets": [
+# {
+# "node": "buffer",
+# "widget": "size"
+# },
+# {
+# "node": "edge_detect_3_3_2",
+# "widget": "size"
+# },
+# {
+# "node": "buffer_2",
+# "widget": "size"
+# }
+# ],
+# "longdesc": "The resolution of the input image",
+# "name": "param0",
+# "shortdesc": "Size",
+# "type": "linked_control"
+# },
+# {
+# "label": "Sigma",
+# "linked_widgets": [
+# {
+# "node": "edge_detect_3_3_2",
+# "widget": "sigma"
+# }
+# ],
+# "longdesc": "The strength of the blur filter",
+# "name": "param1",
+# "shortdesc": "Sigma",
+# "type": "linked_control"
+# }
+# ]
+# },
+# {
+# "name": "gen_inputs",
+# "node_position": {
+# "x": -872.666626,
+# "y": -243.392853
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "longdesc": "The input image",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "rgba"
+# },
+# {
+# "group_size": 0,
+# "longdesc": "A height map whose slopes control the strength and direction of the blur filter",
+# "name": "heightmap",
+# "shortdesc": "Height map",
+# "type": "f"
+# }
+# ],
+# "seed_value": 91624,
+# "type": "ios"
+# },
+# {
+# "name": "gen_outputs",
+# "node_position": {
+# "x": -45.452393,
+# "y": -195.392853
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "longdesc": "Shows the generated blurred image",
+# "name": "port0",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "edge_detect_3_3_2",
+# "node_position": {
+# "x": -401.725464,
+# "y": -199.178955
+# },
+# "parameters": {
+# "sigma": 30,
+# "size": 10
+# },
+# "seed_value": -47470,
+# "shader_model": {
+# "code": "",
+# "global": "",
+# "inputs": [
+# {
+# "default": "vec4(1.0)",
+# "function": true,
+# "label": "",
+# "name": "in",
+# "type": "rgba"
+# },
+# {
+# "default": "1.0",
+# "function": true,
+# "label": "",
+# "name": "heightmap",
+# "type": "f"
+# }
+# ],
+# "instance": "vec4 $(name)_fct(vec2 uv) {\n\tfloat dx = 1.0/$size;\n float v = $heightmap(uv);\n\tvec2 slope = vec2($heightmap(uv+vec2(dx, 0.0))-v, $heightmap(uv+vec2(0.0, dx))-v);\n\tfloat slope_strength = length(slope)*$size;\n vec2 norm_slope = (slope_strength == 0.0) ? vec2(0.0, 1.0) : normalize(slope);\n vec2 e = dx*norm_slope;\n\tvec4 rv = vec4(0.0);\n\tfloat sum = 0.0;\n\tfloat sigma = max($sigma*slope_strength, 0.0001);\n\tfor (float i = 0.0; i <= 50.0; i += 1.0) {\n\t\tfloat coef = exp(-0.5*(pow(i/sigma, 2.0)))/(6.28318530718*sigma*sigma);\n\t\trv += $in(uv+i*e)*coef;\n\t\tsum += coef;\n\t}\n\treturn rv/sum;\n}",
+# "name": "Slope Blur",
+# "outputs": [
+# {
+# "rgba": "$(name)_fct($uv)",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 9,
+# "first": 4,
+# "label": "Size",
+# "last": 12,
+# "name": "size",
+# "type": "size"
+# },
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "Sigma",
+# "max": 50,
+# "min": 0,
+# "name": "sigma",
+# "step": 0.1,
+# "type": "float"
+# }
+# ]
+# },
+# "type": "shader"
+# },
+# {
+# "name": "buffer_2",
+# "node_position": {
+# "x": -392.952209,
+# "y": -115.576294
+# },
+# "parameters": {
+# "lod": 0,
+# "size": 10
+# },
+# "type": "buffer"
+# }
+# ],
+# "parameters": {
+# "param0": 10,
+# "param1": 30
+# },
+# "shortdesc": "Slope blur",
+# "type": "graph"
+#}
+
diff --git a/modules/material_maker/mat_maker_gd/nodes/common/commons.gd b/modules/material_maker/mat_maker_gd/nodes/common/commons.gd
new file mode 100644
index 000000000..d6f6cf11a
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/common/commons.gd
@@ -0,0 +1,393 @@
+tool
+extends Reference
+
+#pattern.mmg
+
+#----------------------
+#hlsl_defs.tmpl
+
+##define hlsl_atan(x,y) atan2(x, y)
+##define mod(x,y) ((x)-(y)*floor((x)/(y)))
+#inline float4 textureLod(sampler2D tex, float2 uv, float lod) {
+# return tex2D(tex, uv);
+#}
+#inline float2 tofloat2(float x) {
+# return float2(x, x);
+#}
+#inline float2 tofloat2(float x, float y) {
+# return float2(x, y);
+#}
+#inline float3 tofloat3(float x) {
+# return float3(x, x, x);
+#}
+#inline float3 tofloat3(float x, float y, float z) {
+# return float3(x, y, z);
+#}
+#inline float3 tofloat3(float2 xy, float z) {
+# return float3(xy.x, xy.y, z);
+#}
+#inline float3 tofloat3(float x, float2 yz) {
+# return float3(x, yz.x, yz.y);
+#}
+#inline float4 tofloat4(float x, float y, float z, float w) {
+# return float4(x, y, z, w);
+#}
+#inline float4 tofloat4(float x) {
+# return float4(x, x, x, x);
+#}
+#inline float4 tofloat4(float x, float3 yzw) {
+# return float4(x, yzw.x, yzw.y, yzw.z);
+#}
+#inline float4 tofloat4(float2 xy, float2 zw) {
+# return float4(xy.x, xy.y, zw.x, zw.y);
+#}
+#inline float4 tofloat4(float3 xyz, float w) {
+# return float4(xyz.x, xyz.y, xyz.z, w);
+#}
+#inline float2x2 tofloat2x2(float2 v1, float2 v2) {
+# return float2x2(v1.x, v1.y, v2.x, v2.y);
+#}
+
+#----------------------
+#glsl_defs.tmpl
+
+#float rand(vec2 x) {
+# return fract(cos(mod(dot(x, vec2(13.9898, 8.141)), 3.14)) * 43758.5453);
+#}
+
+#vec2 rand2(vec2 x) {
+# return fract(cos(mod(vec2(dot(x, vec2(13.9898, 8.141)),
+# dot(x, vec2(3.4562, 17.398))), vec2(3.14))) * 43758.5453);
+#}
+
+#vec3 rand3(vec2 x) {
+# return fract(cos(mod(vec3(dot(x, vec2(13.9898, 8.141)),
+# dot(x, vec2(3.4562, 17.398)),
+# dot(x, vec2(13.254, 5.867))), vec3(3.14))) * 43758.5453);
+#}
+
+#float param_rnd(float minimum, float maximum, float seed) {
+# return minimum+(maximum-minimum)*rand(vec2(seed));
+#}
+
+#vec3 rgb2hsv(vec3 c) {
+# vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
+# vec4 p = c.g < c.b ? vec4(c.bg, K.wz) : vec4(c.gb, K.xy);
+# vec4 q = c.r < p.x ? vec4(p.xyw, c.r) : vec4(c.r, p.yzx);
+#
+# float d = q.x - min(q.w, q.y);
+# float e = 1.0e-10;
+# return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
+#}
+
+#vec3 hsv2rgb(vec3 c) {
+# vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
+# vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
+# return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
+#}
+
+#----------------------
+
+static func clampv3(v : Vector3, mi : Vector3, ma : Vector3) -> Vector3:
+ v.x = clamp(v.x, mi.x, ma.x)
+ v.y = clamp(v.y, mi.y, ma.y)
+ v.z = clamp(v.z, mi.z, ma.z)
+
+ return v
+
+static func floorc(a : Color) -> Color:
+ var v : Color = Color()
+
+ v.r = floor(a.r)
+ v.g = floor(a.g)
+ v.b = floor(a.b)
+ v.a = floor(a.a)
+
+ return v
+
+static func floorv2(a : Vector2) -> Vector2:
+ var v : Vector2 = Vector2()
+
+ v.x = floor(a.x)
+ v.y = floor(a.y)
+
+ return v
+
+static func floorv3(a : Vector3) -> Vector3:
+ var v : Vector3 = Vector3()
+
+ v.x = floor(a.x)
+ v.y = floor(a.y)
+ v.z = floor(a.z)
+
+ return v
+
+static func smoothstepv2(a : float, b : float, c : Vector2) -> Vector2:
+ var v : Vector2 = Vector2()
+
+ v.x = smoothstep(a, b, c.x)
+ v.y = smoothstep(a, b, c.y)
+
+ return v
+
+static func maxv2(a : Vector2, b : Vector2) -> Vector2:
+ var v : Vector2 = Vector2()
+
+ v.x = max(a.x, b.x)
+ v.y = max(a.y, b.y)
+
+ return v
+
+static func maxv3(a : Vector3, b : Vector3) -> Vector3:
+ var v : Vector3 = Vector3()
+
+ v.x = max(a.x, b.x)
+ v.y = max(a.y, b.y)
+ v.z = max(a.z, b.z)
+
+ return v
+
+static func absv2(v : Vector2) -> Vector2:
+ v.x = abs(v.x)
+ v.y = abs(v.y)
+
+ return v
+
+static func absv3(v : Vector3) -> Vector3:
+ v.x = abs(v.x)
+ v.y = abs(v.y)
+ v.z = abs(v.z)
+
+ return v
+
+static func cosv2(v : Vector2) -> Vector2:
+ v.x = cos(v.x)
+ v.y = cos(v.y)
+
+ return v
+
+static func cosv3(v : Vector3) -> Vector3:
+ v.x = cos(v.x)
+ v.y = cos(v.y)
+ v.z = cos(v.z)
+
+ return v
+
+static func powv2(x : Vector2, y : Vector2) -> Vector2:
+ x.x = pow(x.x, y.x)
+ x.y = pow(x.y, y.y)
+
+ return x
+
+static func modv3(a : Vector3, b : Vector3) -> Vector3:
+ var v : Vector3 = Vector3()
+
+ v.x = modf(a.x, b.x)
+ v.y = modf(a.y, b.y)
+ v.z = modf(a.z, b.z)
+
+ return v
+
+
+static func modv2(a : Vector2, b : Vector2) -> Vector2:
+ var v : Vector2 = Vector2()
+
+ v.x = modf(a.x, b.x)
+ v.y = modf(a.y, b.y)
+
+ return v
+
+static func modf(x : float, y : float) -> float:
+ return x - y * floor(x / y)
+
+static func fractv2(v : Vector2) -> Vector2:
+ v.x = v.x - floor(v.x)
+ v.y = v.y - floor(v.y)
+
+ return v
+
+static func fractv3(v : Vector3) -> Vector3:
+ v.x = v.x - floor(v.x)
+ v.y = v.y - floor(v.y)
+ v.z = v.z - floor(v.z)
+
+ return v
+
+static func fract(f : float) -> float:
+ return f - floor(f)
+
+static func clampv2(v : Vector2, pmin : Vector2, pmax : Vector2) -> Vector2:
+ v.x = clamp(v.x, pmin.x, pmax.x)
+ v.y = clamp(v.y, pmin.y, pmax.y)
+
+ return v
+
+static func minv2(v1 : Vector2, v2 : Vector2) -> Vector2:
+ v1.x = min(v1.x, v2.x)
+ v1.y = min(v1.y, v2.y)
+
+ return v1
+
+static func minv3(v1 : Vector3, v2 : Vector3) -> Vector3:
+ v1.x = min(v1.x, v2.x)
+ v1.y = min(v1.y, v2.y)
+ v1.z = min(v1.z, v2.z)
+
+ return v1
+
+static func rand(x : Vector2) -> float:
+ return fract(cos(x.dot(Vector2(13.9898, 8.141))) * 43758.5453);
+
+static func rand2(x : Vector2) -> Vector2:
+ return fractv2(cosv2(Vector2(x.dot(Vector2(13.9898, 8.141)),
+ x.dot(Vector2(3.4562, 17.398)))) * 43758.5453);
+
+static func rand3(x : Vector2) -> Vector3:
+ return fractv3(cosv3(Vector3(x.dot(Vector2(13.9898, 8.141)),
+ x.dot(Vector2(3.4562, 17.398)),
+ x.dot(Vector2(13.254, 5.867)))) * 43758.5453);
+
+static func step(edge : float, x : float) -> float:
+ if x < edge:
+ return 0.0
+ else:
+ return 1.0
+
+static func stepv2(edge : Vector2, x : Vector2) -> Vector2:
+ edge.x = step(edge.x, x.x)
+ edge.y = step(edge.y, x.y)
+
+ return edge
+
+static func signv2(x : Vector2) -> Vector2:
+ x.x = sign(x.x)
+ x.y = sign(x.y)
+
+ return x
+
+static func transform(uv : Vector2, translate : Vector2, rotate : float, scale : Vector2, repeat : bool) -> Vector2:
+ var rv : Vector2 = Vector2();
+ uv -= translate;
+ uv -= Vector2(0.5, 0.5);
+ rv.x = cos(rotate)*uv.x + sin(rotate)*uv.y;
+ rv.y = -sin(rotate)*uv.x + cos(rotate)*uv.y;
+ rv /= scale;
+ rv += Vector2(0.5, 0.5);
+
+ if (repeat):
+ return fractv2(rv);
+ else:
+ return clampv2(rv, Vector2(0, 0), Vector2(1, 1));
+
+static func fractf(x : float) -> float:
+ return x - floor(x)
+
+#float mix_mul(float x, float y) {
+# return x*y;
+#}
+
+static func mix_mul(x : float, y : float) -> float:
+ return x*y;
+
+#float mix_add(float x, float y) {
+# return min(x+y, 1.0);
+#}
+
+static func mix_add(x : float, y : float) -> float:
+ return min(x+y, 1.0);
+
+#float mix_max(float x, float y) {
+# return max(x, y);
+#}
+
+static func mix_max(x : float, y : float) -> float:
+ return max(x, y);
+
+#float mix_min(float x, float y) {
+# return min(x, y);
+#}
+
+static func mix_min(x : float, y : float) -> float:
+ return min(x, y);
+
+#float mix_xor(float x, float y) {
+# return min(x+y, 2.0-x-y);
+#}
+
+static func mix_xor(x : float, y : float) -> float:
+ return min(x+y, 2.0-x-y);
+
+#float mix_pow(float x, float y) {
+# return pow(x, y);
+#}
+
+static func mix_pow(x : float, y : float) -> float:
+ return pow(x, y);
+
+
+#float wave_constant(float x) {
+# return 1.0;
+#}
+
+static func wave_constant(x : float) -> float:
+ return 1.0;
+
+#float wave_sine(float x) {
+# return 0.5-0.5*cos(3.14159265359*2.0*x);
+#}
+
+static func wave_sine(x : float) -> float:
+ return 0.5-0.5*cos(3.14159265359*2.0*x);
+
+#float wave_triangle(float x) {
+# x = fract(x);
+# return min(2.0*x, 2.0-2.0*x);
+#}
+
+static func wave_triangle(x : float) -> float:
+ x = fractf(x);
+ return min(2.0*x, 2.0-2.0*x);
+
+#float wave_sawtooth(float x) {
+# return fract(x);
+#}
+
+static func wave_sawtooth(x : float) -> float:
+ return fractf(x);
+
+#float wave_square(float x) {
+# return (fract(x) < 0.5) ? 0.0 : 1.0;
+#}
+
+static func wave_square(x : float) -> float:
+ if (fractf(x) < 0.5):
+ return 0.0
+ else:
+ return 1.0
+
+#float wave_bounce(float x) {
+# x = 2.0*(fract(x)-0.5);
+# return sqrt(1.0-x*x);
+#}
+
+static func wave_bounce(x : float) -> float:
+ x = 2.0*(fractf(x)-0.5);
+ return sqrt(1.0-x*x);
+
+static func sinewave(uv : Vector2, amplitude : float, frequency : float, phase : float) -> Color:
+ var f : float = 1.0- abs(2.0 * (uv.y-0.5) - amplitude * sin((frequency* uv.x + phase) * 6.28318530718));
+
+ return Color(f, f, f, 1)
+
+#from runes.mmg (old)
+
+static func ThickLine(uv : Vector2, posA : Vector2, posB : Vector2, radiusInv : float) -> float:
+ var dir : Vector2 = posA - posB;
+ var dirLen : float = dir.length()
+ var dirN : Vector2 = dir.normalized()
+ var dotTemp : float = clamp((uv - posB).dot(dirN), 0.0, dirLen);
+ var proj : Vector2 = dotTemp * dirN + posB;
+ var d1 : float = (uv - proj).length()
+ var finalGray : float = clamp(1.0 - d1 * radiusInv, 0.0, 1.0);
+
+ return finalGray;
diff --git a/modules/material_maker/mat_maker_gd/nodes/common/curves.gd b/modules/material_maker/mat_maker_gd/nodes/common/curves.gd
new file mode 100644
index 000000000..71fdfca6b
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/common/curves.gd
@@ -0,0 +1,85 @@
+tool
+extends Reference
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+
+#Based on MaterialMaker's curve.gd
+
+#Curve PoolRealArray: p.x, p.y, ls, rs, p.x, p.y ....
+
+#class Point:
+# var p : Vector2
+# var ls : float
+# var rs : float
+
+#func get_shader(name) -> String:
+# var shader
+# shader = "float "+name+"_curve_fct(float x) {\n"
+# for i in range(points.size()-1):
+# if i < points.size()-2:
+# shader += "if (x <= p_"+name+"_"+str(i+1)+"_x) "
+#
+# shader += "{\n"
+# shader += "float dx = x - p_"+name+"_"+str(i)+"_x;\n"
+# shader += "float d = p_"+name+"_"+str(i+1)+"_x - p_"+name+"_"+str(i)+"_x;\n"
+# shader += "float t = dx/d;\n"
+# shader += "float omt = (1.0 - t);\n"
+# shader += "float omt2 = omt * omt;\n"
+# shader += "float omt3 = omt2 * omt;\n"
+# shader += "float t2 = t * t;\n"
+# shader += "float t3 = t2 * t;\n"
+# shader += "d /= 3.0;\n"
+# shader += "float y1 = p_"+name+"_"+str(i)+"_y;\n"
+# shader += "float yac = p_"+name+"_"+str(i)+"_y + d*p_"+name+"_"+str(i)+"_rs;\n"
+# shader += "float ybc = p_"+name+"_"+str(i+1)+"_y - d*p_"+name+"_"+str(i+1)+"_ls;\n"
+# shader += "float y2 = p_"+name+"_"+str(i+1)+"_y;\n"
+# shader += "return y1*omt3 + yac*omt2*t*3.0 + ybc*omt*t2*3.0 + y2*t3;\n"
+# shader += "}\n"
+#
+# shader += "}\n"
+# return shader
+
+static func curve(x : float, points : PoolRealArray) -> float:
+ if points.size() % 4 != 0 || points.size() < 8:
+ return 0.0
+
+ var ps : int = points.size() / 4
+
+ for i in range(ps - 1):
+ var pi : int = i * 4
+ var pip1 : int = (i + 1) * 4
+
+ if i < ps - 2:
+ # if (x <= p_"+name+"_"+str(i+1)+"_x)
+ if x > points[pip1]:
+ continue
+
+ #float dx = x - p_"+name+"_"+str(i)+"_x;
+ var dx : float = x - points[pi];
+
+ #var d : float = p_"+name+"_"+str(i+1)+"_x - p_"+name+"_"+str(i)+"_x;
+ var d : float = points[pip1] - points[pi];
+
+ var t : float = dx / d
+ var omt : float = (1.0 - t)
+ var omt2 : float = omt * omt
+ var omt3 : float = omt2 * omt
+ var t2 : float = t * t
+ var t3 : float = t2 * t
+ d /= 3.0
+
+# var y1 : float = p_"+name+"_"+str(i)+"_y
+ var y1 : float = points[pi + 1]
+
+# var yac : float = p_"+name+"_"+str(i)+"_y + d*p_"+name+"_"+str(i)+"_rs
+ var yac : float = points[pi + 1] + d * points[pi + 3]
+
+# var ybc : float = p_"+name+"_"+str(i+1)+"_y - d*p_"+name+"_"+str(i+1)+"_ls
+ var ybc : float = points[pip1 + 1] - d * points[pip1 + 2]
+
+# var y2 : float = p_"+name+"_"+str(i+1)+"_y
+ var y2 : float = points[pip1 + 1]
+
+ return y1 * omt3 + yac * omt2 * t * 3.0 + ybc * omt * t2 * 3.0 + y2 * t3;
+
+ return 0.0
diff --git a/modules/material_maker/mat_maker_gd/nodes/common/dilate.gd b/modules/material_maker/mat_maker_gd/nodes/common/dilate.gd
new file mode 100644
index 000000000..9bbe8e88c
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/common/dilate.gd
@@ -0,0 +1,521 @@
+tool
+extends Reference
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+
+#----------------------
+#dilate.mmg
+
+#{
+# "connections": [
+# {
+# "from": "gen_inputs",
+# "from_port": 0,
+# "to": "buffer",
+# "to_port": 0
+# },
+# {
+# "from": "buffer",
+# "from_port": 0,
+# "to": "dilate_pass_1",
+# "to_port": 0
+# },
+# {
+# "from": "dilate_pass_1",
+# "from_port": 0,
+# "to": "buffer_2",
+# "to_port": 0
+# },
+# {
+# "from": "buffer_2",
+# "from_port": 0,
+# "to": "dilate_pass_4",
+# "to_port": 0
+# },
+# {
+# "from": "dilate_pass_3",
+# "from_port": 0,
+# "to": "buffer_2_3",
+# "to_port": 0
+# },
+# {
+# "from": "buffer_2_3",
+# "from_port": 0,
+# "to": "gen_outputs",
+# "to_port": 0
+# },
+# {
+# "from": "buffer_2_2",
+# "from_port": 0,
+# "to": "dilate_pass_3",
+# "to_port": 1
+# },
+# {
+# "from": "dilate_pass_4",
+# "from_port": 0,
+# "to": "dilate_pass_3",
+# "to_port": 0
+# },
+# {
+# "from": "default_color",
+# "from_port": 0,
+# "to": "buffer_2_2",
+# "to_port": 0
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 1,
+# "to": "default_color",
+# "to_port": 0
+# }
+# ],
+# "label": "Dilate",
+# "longdesc": "Dilates the white areas of a mask, using the colors of an optional input",
+# "name": "dilate",
+# "node_position": {
+# "x": 0,
+# "y": 0
+# },
+# "nodes": [
+# {
+# "name": "buffer",
+# "node_position": {
+# "x": -473.691315,
+# "y": -200.988342
+# },
+# "parameters": {
+# "lod": 0,
+# "size": 9
+# },
+# "type": "buffer"
+# },
+# {
+# "name": "buffer_2",
+# "node_position": {
+# "x": -255.691315,
+# "y": -123.988342
+# },
+# "parameters": {
+# "lod": 0,
+# "size": 9
+# },
+# "type": "buffer"
+# },
+# {
+# "name": "gen_parameters",
+# "node_position": {
+# "x": -140.306458,
+# "y": -377.953613
+# },
+# "parameters": {
+# "param0": 9,
+# "param1": 0.1,
+# "param2": 0,
+# "param3": 0
+# },
+# "type": "remote",
+# "widgets": [
+# {
+# "label": "",
+# "linked_widgets": [
+# {
+# "node": "buffer",
+# "widget": "size"
+# },
+# {
+# "node": "buffer_2",
+# "widget": "size"
+# },
+# {
+# "node": "buffer_2_2",
+# "widget": "size"
+# },
+# {
+# "node": "dilate_pass_1",
+# "widget": "s"
+# },
+# {
+# "node": "dilate_pass_4",
+# "widget": "s"
+# },
+# {
+# "node": "buffer_2_3",
+# "widget": "size"
+# }
+# ],
+# "longdesc": "The resolution of the input images",
+# "name": "param0",
+# "shortdesc": "Size",
+# "type": "linked_control"
+# },
+# {
+# "label": "",
+# "linked_widgets": [
+# {
+# "node": "dilate_pass_1",
+# "widget": "d"
+# },
+# {
+# "node": "dilate_pass_4",
+# "widget": "d"
+# }
+# ],
+# "longdesc": "The length of the dilate effect",
+# "name": "param1",
+# "shortdesc": "Length",
+# "type": "linked_control"
+# },
+# {
+# "label": "",
+# "linked_widgets": [
+# {
+# "node": "dilate_pass_3",
+# "widget": "amount"
+# }
+# ],
+# "longdesc": "0 to generate a gradient to black while dilating, 1 to fill with input color",
+# "name": "param2",
+# "shortdesc": "Fill",
+# "type": "linked_control"
+# },
+# {
+# "label": "",
+# "linked_widgets": [
+# {
+# "node": "dilate_pass_4",
+# "widget": "distance"
+# }
+# ],
+# "name": "param3",
+# "shortdesc": "Distance function",
+# "type": "linked_control"
+# }
+# ]
+# },
+# {
+# "name": "gen_inputs",
+# "node_position": {
+# "x": -872.306458,
+# "y": -171.4814
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "longdesc": "The input mask whose white areas will be dilated",
+# "name": "mask",
+# "shortdesc": "Mask",
+# "type": "f"
+# },
+# {
+# "group_size": 0,
+# "longdesc": "The optional source for colors",
+# "name": "source",
+# "shortdesc": "Source",
+# "type": "rgb"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "gen_outputs",
+# "node_position": {
+# "x": 254.21106,
+# "y": -64.4814
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "longdesc": "Shows the dilated image",
+# "name": "out",
+# "shortdesc": "Output",
+# "type": "rgb"
+# }
+# ],
+# "seed_value": -14401,
+# "type": "ios"
+# },
+# {
+# "name": "buffer_2_2",
+# "node_position": {
+# "x": -255.323547,
+# "y": -44.695679
+# },
+# "parameters": {
+# "lod": 0,
+# "size": 9
+# },
+# "type": "buffer"
+# },
+# {
+# "name": "dilate_pass_1",
+# "node_position": {
+# "x": -252.698792,
+# "y": -201.368988
+# },
+# "parameters": {
+# "d": 0.1,
+# "s": 9
+# },
+# "seed_value": 71939,
+# "type": "dilate_pass_1"
+# },
+# {
+# "name": "dilate_pass_3",
+# "node_position": {
+# "x": -31.698792,
+# "y": -72.368988
+# },
+# "parameters": {
+# "amount": 0
+# },
+# "type": "dilate_pass_3"
+# },
+# {
+# "name": "dilate_pass_4",
+# "node_position": {
+# "x": -31.689392,
+# "y": -186.577301
+# },
+# "parameters": {
+# "d": 0.1,
+# "distance": 0,
+# "s": 9
+# },
+# "type": "dilate_pass_2"
+# },
+# {
+# "name": "buffer_2_3",
+# "node_position": {
+# "x": -46.966125,
+# "y": -0.711548
+# },
+# "parameters": {
+# "lod": 0,
+# "size": 9
+# },
+# "type": "buffer"
+# },
+# {
+# "name": "default_color",
+# "node_position": {
+# "x": -469.868713,
+# "y": -98.02066
+# },
+# "parameters": {
+# "default": {
+# "a": 1,
+# "b": 1,
+# "g": 1,
+# "r": 1,
+# "type": "Color"
+# }
+# },
+# "type": "default_color"
+# }
+# ],
+# "parameters": {
+# "param0": 9,
+# "param1": 0.1,
+# "param2": 0,
+# "param3": 0
+# },
+# "shortdesc": "Dilate",
+# "type": "graph"
+#}
+
+#----------------------
+#dilate_pass_1.mmg
+
+#{
+# "name": "distance_pass_1",
+# "node_position": {
+# "x": 0,
+# "y": 0
+# },
+# "parameters": {
+# "d": 0.1,
+# "s": 9
+# },
+# "seed_value": 8258,
+# "shader_model": {
+# "code": "",
+# "global": "",
+# "inputs": [
+# {
+# "default": "0.0",
+# "function": true,
+# "label": "",
+# "name": "in",
+# "type": "f"
+# }
+# ],
+# "instance": "vec3 $(name)_distance_h(vec2 uv) {\n\tvec2 e = vec2(1.0/$s, 0.0);\n\tint steps = int($s*$d);\n\tfloat rv = 0.0;\n\tvec2 source_uv;\n\tfor (int i = 0; i < steps; ++i) {\n\t\tsource_uv = uv+float(i)*e;\n\t\tif ($in(source_uv) > 0.5) {\n\t\t\trv = 1.0-float(i)*e.x/$d;\n\t\t\tbreak;\n\t\t}\n\t\tsource_uv = uv-float(i)*e;\n\t\tif ($in(source_uv) > 0.5) {\n\t\t\trv = 1.0-float(i)*e.x/$d;\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn vec3(rv, source_uv);\n}\n",
+# "name": "Distance pass 1",
+# "outputs": [
+# {
+# "rgb": "$(name)_distance_h($uv)",
+# "type": "rgb"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 9,
+# "first": 6,
+# "label": "",
+# "last": 12,
+# "name": "s",
+# "type": "size"
+# },
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "",
+# "max": 1,
+# "min": 0,
+# "name": "d",
+# "step": 0.01,
+# "type": "float"
+# }
+# ]
+# },
+# "type": "shader"
+#}
+
+#----------------------
+#dilate_pass_2.mmg
+
+#{
+# "name": "dilate_pass_2",
+# "node_position": {
+# "x": 0,
+# "y": 0
+# },
+# "parameters": {
+# "d": 0.25,
+# "distance": 0,
+# "s": 9
+# },
+# "seed_value": 44978,
+# "shader_model": {
+# "code": "",
+# "global": "float dilate_distance_euclidian(float x, float y, float d) {\n\treturn 1.0-sqrt((1.0-x)*(1.0-x)+y*y/d/d);\n}\n\nfloat dilate_distance_manhattan(float x, float y, float d) {\n\treturn 1.0-(abs(1.0-x)+abs(y)/d);\n}\n\nfloat dilate_distance_chebyshev(float x, float y, float d) {\n\treturn 1.0-max(abs(1.0-x), abs(y)/d);\n}\n\n",
+# "inputs": [
+# {
+# "default": "vec3(0.0)",
+# "function": true,
+# "label": "",
+# "name": "in",
+# "type": "rgb"
+# }
+# ],
+# "instance": "vec3 $(name)_distance_v(vec2 uv) {\n\tvec2 e = vec2(0.0, 1.0/$s);\n\tint steps = int($s*$d);\n\tvec3 p = $in(uv);\n\tfor (int i = 0; i < steps; ++i) {\n\t\tvec2 dx = float(i)*e;\n\t\tvec3 p2 = $in(uv+dx);\n\t\tif (p2.x > p.x) {\n\t\t\tp2.x = dilate_distance_$distance(p2.x, dx.y, $d);\n\t\t\tp = mix(p, p2, step(p.x, p2.x));\n\t\t}\n\t\tp2 = $in(uv-dx);\n\t\tif (p2.x > p.x) {\n\t\t\tp2.x = dilate_distance_$distance(p2.x, dx.y, $d);\n\t\t\tp = mix(p, p2, step(p.x, p2.x));\n\t\t}\n\t}\n\treturn p;\n}\n",
+# "name": "Distance pass 2",
+# "outputs": [
+# {
+# "rgb": "$(name)_distance_v($uv)",
+# "type": "rgb"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 9,
+# "first": 6,
+# "label": "",
+# "last": 12,
+# "name": "s",
+# "type": "size"
+# },
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "",
+# "max": 1,
+# "min": 0,
+# "name": "d",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "default": 2,
+# "label": "",
+# "name": "distance",
+# "type": "enum",
+# "values": [
+# {
+# "name": "Euclidian",
+# "value": "euclidian"
+# },
+# {
+# "name": "Manhattan",
+# "value": "manhattan"
+# },
+# {
+# "name": "Chebyshev",
+# "value": "chebyshev"
+# }
+# ]
+# }
+# ]
+# },
+# "type": "shader"
+#}
+
+#----------------------
+#dilate_pass_3.mmg
+
+#{
+# "name": "distance_pass_3",
+# "node_position": {
+# "x": 0,
+# "y": 0
+# },
+# "parameters": {
+# "amount": 0
+# },
+# "shader_model": {
+# "code": "",
+# "global": "",
+# "inputs": [
+# {
+# "default": "vec3(0.0)",
+# "label": "",
+# "name": "distance",
+# "type": "rgb"
+# },
+# {
+# "default": "vec3(1.0)",
+# "label": "",
+# "name": "source",
+# "type": "rgb"
+# }
+# ],
+# "instance": "",
+# "name": "Distance pass 3",
+# "outputs": [
+# {
+# "rgb": "$source($distance($uv).yz)*mix($distance($uv).x, 1.0, $amount)",
+# "type": "rgb"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 0,
+# "label": "",
+# "max": 1,
+# "min": 0,
+# "name": "amount",
+# "step": 0.01,
+# "type": "float"
+# }
+# ]
+# },
+# "type": "shader"
+#}
+
diff --git a/modules/material_maker/mat_maker_gd/nodes/common/edge_detect.gd b/modules/material_maker/mat_maker_gd/nodes/common/edge_detect.gd
new file mode 100644
index 000000000..a4fc75479
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/common/edge_detect.gd
@@ -0,0 +1,223 @@
+tool
+extends Reference
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+
+#----------------------
+#edge_detect.mmg
+#An edge detect filter that detects edges along all directions and draws them in white on a black background
+
+# "inputs": [
+# {
+# "default": "vec3(0.0)",
+# "function": true,
+# "label": "",
+# "longdesc": "The input image",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "rgb"
+# }
+# ],
+# "instance": "float $(name)_fct(vec2 uv) {\n\tvec3 e_base = vec3(1.0/$size, -1.0/$size, 0);\n\tvec3 ref = $in(uv);\n\tvec3 e = vec3(0);\n\tfloat rv = 0.0;\n\tfor (int i = 0; i < int($width); ++i) {\n\t\te += e_base;\n\t\trv += length($in(uv+e.xy)-ref);\n\t\trv += length($in(uv-e.xy)-ref);\n\t\trv += length($in(uv+e.xx)-ref);\n\t\trv += length($in(uv-e.xx)-ref);\n\t\trv += length($in(uv+e.xz)-ref);\n\t\trv += length($in(uv-e.xz)-ref);\n\t\trv += length($in(uv+e.zx)-ref);\n\t\trv += length($in(uv-e.zx)-ref);\n\t\trv *= 2.0;\n\t}\n\treturn rv*pow(2.0, -$width);\n}",
+# "outputs": [
+# {
+# "f": "clamp(100.0*($(name)_fct($uv)-$threshold), 0.0, 1.0)",
+# "longdesc": "Shows the generated outlines",
+# "shortdesc": "Output",
+# "type": "f"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 9,
+# "first": 4,
+# "label": "Size",
+# "last": 12,
+# "longdesc": "The resolution of the input image",
+# "name": "size",
+# "shortdesc": "Size",
+# "type": "size"
+# },
+# {
+# "control": "None",
+# "default": 1,
+# "label": "Width",
+# "max": 5,
+# "min": 1,
+# "name": "width",
+# "step": 1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "Threshold",
+# "max": 1,
+# "min": 0,
+# "name": "threshold",
+# "step": 0.01,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#edge_detect_1.mmg
+#An edge detect filter that detects edges along all directions and draws them in white on a black background
+
+# "inputs": [
+# {
+# "default": "vec3(0.0)",
+# "function": true,
+# "label": "",
+# "longdesc": "The input image",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "rgb"
+# }
+# ],
+# "instance": "float $(name)_fct(vec2 uv) {\n\tvec3 e = vec3(1.0/$size, -1.0/$size, 0);\n\tvec3 rv = 8.0*$in(uv);\n\trv -= $in(uv+e.xy);\n\trv -= $in(uv-e.xy);\n\trv -= $in(uv+e.xx);\n\trv -= $in(uv-e.xx);\n\trv -= $in(uv+e.xz);\n\trv -= $in(uv-e.xz);\n\trv -= $in(uv+e.zx);\n\trv -= $in(uv-e.zx);\n\trv = abs(rv);\n\treturn max(rv.x, max(rv.y ,rv.z))*$size;\n}",
+# "outputs": [
+# {
+# "f": "clamp($(name)_fct($uv), 0.0, 1.0)",
+# "longdesc": "Shows the generated outlines",
+# "shortdesc": "Output",
+# "type": "f"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 9,
+# "first": 4,
+# "label": "Size",
+# "last": 12,
+# "longdesc": "The resolution of the input image",
+# "name": "size",
+# "shortdesc": "Size",
+# "type": "size"
+# }
+# ],
+
+#----------------------
+#edge_detect_2.mmg
+#An edge detect filter that detects edges horizontally and vertically and draws them in white on a black background
+
+# "inputs": [
+# {
+# "default": "vec3(0.0)",
+# "function": true,
+# "label": "",
+# "longdesc": "The input image",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "rgb"
+# }
+# ],
+# "instance": "float $(name)_fct(vec2 uv) {\n\tvec2 e = vec2(1.0/$size, 0.0);\n\tvec3 rv = 4.0*$in(uv);\n\trv -= $in(uv+e.xy);\n\trv -= $in(uv-e.xy);\n\trv -= $in(uv+e.yx);\n\trv -= $in(uv-e.yx);\n\trv = abs(rv);\n\treturn max(rv.x, max(rv.y ,rv.z))*$size;\n}",
+# "outputs": [
+# {
+# "f": "clamp($(name)_fct($uv), 0.0, 1.0)",
+# "longdesc": "Shows the generated outlines",
+# "shortdesc": "Output",
+# "type": "f"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 9,
+# "first": 4,
+# "label": "Size",
+# "last": 12,
+# "longdesc": "The resolution of the input image",
+# "name": "size",
+# "shortdesc": "Size",
+# "type": "size"
+# }
+# ],
+
+#----------------------
+#edge_detect_3.mmg
+#An edge detect filter that detects edges along diagonals and draws them in white on a black background
+
+# "inputs": [
+# {
+# "default": "vec3(0.0)",
+# "function": true,
+# "label": "",
+# "longdesc": "The input image",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "rgb"
+# }
+# ],
+# "instance": "float $(name)_fct(vec2 uv) {\n\tvec2 e = vec2(1.0/$size, -1.0/$size);\n\tvec3 rv = 4.0*$in(uv);\n\trv -= $in(uv+e.xy);\n\trv -= $in(uv-e.xy);\n\trv -= $in(uv+e.xx);\n\trv -= $in(uv-e.xx);\n\trv = abs(rv);\n\treturn max(rv.x, max(rv.y ,rv.z))*$size;\n}",
+# "outputs": [
+# {
+# "f": "clamp($(name)_fct($uv), 0.0, 1.0)",
+# "longdesc": "Shows the generated outlines",
+# "shortdesc": "Output",
+# "type": "f"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 9,
+# "first": 4,
+# "label": "Size",
+# "last": 12,
+# "longdesc": "The resolution of the input image",
+# "name": "size",
+# "shortdesc": "Size",
+# "type": "size"
+# }
+# ],
+
+#----------------------
+#mul_detect.mmg
+
+# "code": "float $(name_uv)_d = ($in($uv)-$v)/$t;",
+# "global": "",
+# "inputs": [
+# {
+# "default": "1.0",
+# "label": "",
+# "name": "mul",
+# "type": "f"
+# },
+# {
+# "default": "0.0",
+# "label": "",
+# "name": "in",
+# "type": "f"
+# }
+# ],
+# "instance": "",
+# "name": "MulDetect",
+# "outputs": [
+# {
+# "f": "$mul($uv)*clamp(1.0-$(name_uv)_d*$(name_uv)_d, 0.0, 1.0)",
+# "type": "f"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "Value",
+# "max": 1,
+# "min": 0,
+# "name": "v",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0.1,
+# "label": "Tolerance",
+# "max": 1,
+# "min": 0.01,
+# "name": "t",
+# "step": 0.001,
+# "type": "float"
+# }
+# ]
+
diff --git a/modules/material_maker/mat_maker_gd/nodes/common/fills.gd b/modules/material_maker/mat_maker_gd/nodes/common/fills.gd
new file mode 100644
index 000000000..d6362083a
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/common/fills.gd
@@ -0,0 +1,559 @@
+tool
+extends Reference
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+
+#----------------------
+#fill.mmg
+#Fills areas defined by white outlines of its input
+
+#{
+# "connections": [
+# {
+# "from": "iterate_buffer",
+# "from_port": 0,
+# "to": "gen_outputs",
+# "to_port": 0
+# },
+# {
+# "from": "iterate_buffer",
+# "from_port": 1,
+# "to": "fill_iterate",
+# "to_port": 0
+# },
+# {
+# "from": "fill_iterate",
+# "from_port": 0,
+# "to": "iterate_buffer",
+# "to_port": 1
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 0,
+# "to": "fill_preprocess",
+# "to_port": 0
+# },
+# {
+# "from": "fill_preprocess",
+# "from_port": 0,
+# "to": "iterate_buffer",
+# "to_port": 0
+# }
+# ],
+# "nodes": [
+# {
+# "name": "iterate_buffer",
+# "node_position": {
+# "x": -129.307083,
+# "y": -370.480591
+# },
+# "parameters": {
+# "iterations": 10,
+# "size": 8
+# },
+# "seed_value": 29168,
+# "type": "iterate_buffer"
+# },
+# {
+# "name": "gen_inputs",
+# "node_position": {
+# "x": -542.307068,
+# "y": -370.662445
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "longdesc": "The input image whose white outlines must be filled",
+# "name": "port0",
+# "shortdesc": "Input",
+# "type": "f"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "gen_outputs",
+# "node_position": {
+# "x": 198.267258,
+# "y": -362.662445
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "longdesc": "Generates fill data, to be connected to a fill companion node",
+# "name": "port0",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "gen_parameters",
+# "node_position": {
+# "x": -171.110138,
+# "y": -541.509705
+# },
+# "parameters": {
+# "param0": 8,
+# "param1": 10
+# },
+# "type": "remote",
+# "widgets": [
+# {
+# "label": "",
+# "linked_widgets": [
+# {
+# "node": "iterate_buffer",
+# "widget": "size"
+# },
+# {
+# "node": "fill_preprocess",
+# "widget": "s"
+# },
+# {
+# "node": "fill_iterate",
+# "widget": "s"
+# }
+# ],
+# "longdesc": "The resolution of the inptu image",
+# "name": "param0",
+# "shortdesc": "Size",
+# "type": "linked_control"
+# },
+# {
+# "label": "",
+# "linked_widgets": [
+# {
+# "node": "iterate_buffer",
+# "widget": "iterations"
+# }
+# ],
+# "longdesc": "The number of iterations of the algorithm. The optimal value depends a lot on the input image.",
+# "name": "param1",
+# "shortdesc": "Iterations",
+# "type": "linked_control"
+# }
+# ]
+# },
+# {
+# "name": "fill_iterate",
+# "node_position": {
+# "x": -92.913391,
+# "y": -290.886963
+# },
+# "parameters": {
+# "s": 8
+# },
+# "type": "fill_iterate"
+# },
+# {
+# "name": "fill_preprocess",
+# "node_position": {
+# "x": -110.443481,
+# "y": -427.202026
+# },
+# "parameters": {
+# "s": 8
+# },
+# "type": "fill_preprocess"
+# }
+# ],
+# "parameters": {
+# "param0": 8,
+# "param1": 10
+# },
+# "shortdesc": "Fill",
+# "type": "graph"
+#}
+
+#----------------------
+#fill_iterate.mmg
+
+# "inputs": [
+# {
+# "default": "0.0",
+# "function": true,
+# "label": "",
+# "name": "in",
+# "type": "rgba"
+# }
+# ],
+# "instance": "vec4 $(name)_fill(vec2 uv) {\n\tfloat size = $s;\n\tint iterations = min(int(size), 256);\n\tvec4 color = $in(fract(uv));\n\tif (color.z+color.w < 1.0/size) {\n\t\treturn vec4(0.0);\n\t}\n\tvec2 offsets[8] = { vec2(1.0, 0.0), vec2(-1.0, 0.0), vec2(0.0, 1.0), vec2(0.0, -1.0), vec2(1.0, 1.0), vec2(-1.0, 1.0), vec2(-1.0, 1.0), vec2(-1.0, -1.0) };\n\tfor (int o = 0; o < 8; ++o) {\n\t\tvec2 uv2 = uv;\n\t\tvec2 offset = offsets[o]/size;\n\t\tfor (int i = 1; i < iterations; i += 1) {\n\t\t\tuv2 += offset;\n\t\t\tvec4 color2 = $in(fract(uv2));\n\t\t\tif (color2.z+color2.w == 0.0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tvec2 p1 = color.xy+floor(uv-color.xy);\n\t\t\tvec2 p2 = color2.xy+floor(uv2-color2.xy);\n\t\t\tvec2 p = min(p1, p2);\n\t\t\tvec2 s = max(p1+color.zw, p2+color2.zw)-p;\n\t\t\tcolor = mix(vec4(0.0, 0.0, 1.0, 1.0), vec4(fract(p), s), step(s.xyxy, vec4(1.0)));\n\t\t}\n\t}\n\treturn floor(color*size)/size;\n}\n",
+# "outputs": [
+# {
+# "rgba": "$(name)_fill($uv)",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 9,
+# "first": 6,
+# "label": "",
+# "last": 12,
+# "name": "s",
+# "type": "size"
+# }
+# ]
+
+#----------------------
+#fill_preprocess.mmg
+
+# "inputs": [
+# {
+# "default": "0.0",
+# "function": true,
+# "label": "",
+# "name": "in",
+# "type": "f"
+# }
+# ],
+# "outputs": [
+# {
+# "rgba": "flood_fill_preprocess($uv, $in($uv), $s)",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 10,
+# "first": 0,
+# "label": "",
+# "last": 12,
+# "name": "s",
+# "type": "size"
+# }
+# ]
+
+
+
+
+#----------------------
+#fill_to_color.mmg
+#A fill companion node that fills each area with a color taken from a color map image
+
+# "code": "vec4 $(name_uv)_bb = $in($uv);",
+# "inputs": [
+# {
+# "default": "vec4(0.0)",
+# "label": "",
+# "longdesc": "The input fill data, to be connected to the output of a Fill node",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "rgba"
+# },
+# {
+# "default": "vec4(1.0)",
+# "label": "",
+# "longdesc": "The image from which colors are taken",
+# "name": "map",
+# "shortdesc": "Color map",
+# "type": "rgba"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "The generated output image",
+# "rgba": "mix($edgecolor, $map(fract($(name_uv)_bb.xy+0.5*$(name_uv)_bb.zw)), step(0.0000001, dot($(name_uv)_bb.zw, vec2(1.0))))",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "default": {
+# "a": 1,
+# "b": 1,
+# "g": 1,
+# "r": 1
+# },
+# "label": "Edge Color",
+# "longdesc": "The color used to draw outlines",
+# "name": "edgecolor",
+# "shortdesc": "Outline color",
+# "type": "color"
+# }
+# ],
+
+#----------------------
+#fill_to_position.mmg
+#A fill companion node that fills each area with a greyscale value that depends on its position
+
+# "code": "vec2 $(name_uv)_c = fract($in($uv).xy+0.5*$in($uv).zw);",
+# "inputs": [
+# {
+# "default": "vec4(0.0)",
+# "label": "",
+# "longdesc": "The input fill data, to be connected to the output of a Fill node",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "rgba"
+# }
+# ],
+# "outputs": [
+# {
+# "f": "$axis",
+# "longdesc": "The generated output image",
+# "shortdesc": "Output",
+# "type": "f"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 2,
+# "label": "",
+# "longdesc": "The position value to be used:\n- X for horizontal axis\n- Y for vertical axis\n- Radial for distance to center",
+# "name": "axis",
+# "shortdesc": "Position",
+# "type": "enum",
+# "values": [
+# {
+# "name": "X",
+# "value": "$(name_uv)_c.x"
+# },
+# {
+# "name": "Y",
+# "value": "$(name_uv)_c.y"
+# },
+# {
+# "name": "Radial",
+# "value": "length($(name_uv)_c-vec2(0.5))"
+# }
+# ]
+# }
+# ],
+
+#----------------------
+#fill_to_random_color.mmg
+#A fill companion node that fills each area with a random color
+
+# "code": "vec4 $(name_uv)_bb = $in($uv);",
+# "inputs": [
+# {
+# "default": "vec4(0.0)",
+# "label": "",
+# "longdesc": "The input fill data, to be connected to the output of a Fill node",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "rgba"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "The generated output image",
+# "rgb": "mix($edgecolor.rgb, rand3(vec2(float($seed), rand(vec2(rand($(name_uv)_bb.xy), rand($(name_uv)_bb.zw))))), step(0.0000001, dot($(name_uv)_bb.zw, vec2(1.0))))",
+# "shortdesc": "Output",
+# "type": "rgb"
+# }
+# ],
+# "parameters": [
+# {
+# "default": {
+# "a": 1,
+# "b": 1,
+# "g": 1,
+# "r": 1
+# },
+# "label": "Edge Color",
+# "longdesc": "The color used for outlines",
+# "name": "edgecolor",
+# "shortdesc": "Outline color",
+# "type": "color"
+# }
+# ],
+
+#----------------------
+#fill_to_random_grey.mmg
+#A fill companion node that fills each area with a random greyscale value
+
+# "code": "vec4 $(name_uv)_bb = $in($uv);",
+# "inputs": [
+# {
+# "default": "vec4(0.0)",
+# "label": "",
+# "longdesc": "The input fill data, to be connected to the output of a Fill node",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "rgba"
+# }
+# ],
+# "outputs": [
+# {
+# "f": "mix($edgecolor, rand(vec2(float($seed), rand(vec2(rand($(name_uv)_bb.xy), rand($(name_uv)_bb.zw))))), step(0.0000001, dot($(name_uv)_bb.zw, vec2(1.0))))",
+# "longdesc": "The generated output image",
+# "shortdesc": "Output",
+# "type": "f"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 1,
+# "label": "Edge color",
+# "longdesc": "The value used for the outlines",
+# "max": 1,
+# "min": 0,
+# "name": "edgecolor",
+# "shortdesc": "Outline color",
+# "step": 0.01,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#fill_to_size.mmg
+#A fill companion node that fills each area with a greyscale value that depends on its size
+
+# "code": "vec4 $(name_uv)_bb = $in($uv);",
+# "inputs": [
+# {
+# "default": "vec4(0.0)",
+# "label": "",
+# "longdesc": "The input fill data, to be connected to the output of a Fill node",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "rgba"
+# }
+# ],
+# "outputs": [
+# {
+# "f": "$formula",
+# "longdesc": "The generated output image",
+# "shortdesc": "Output",
+# "type": "f"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 0,
+# "label": "",
+# "longdesc": "The size value to be used (area, width, height or maximum between width and height)",
+# "name": "formula",
+# "shortdesc": "Size",
+# "type": "enum",
+# "values": [
+# {
+# "name": "Area",
+# "value": "sqrt($(name_uv)_bb.z*$(name_uv)_bb.w)"
+# },
+# {
+# "name": "Width",
+# "value": "$(name_uv)_bb.z"
+# },
+# {
+# "name": "Height",
+# "value": "$(name_uv)_bb.w"
+# },
+# {
+# "name": "max(W, H)",
+# "value": "max($(name_uv)_bb.z, $(name_uv)_bb.w)"
+# }
+# ]
+# }
+# ],
+
+#----------------------
+#fill_to_uv.mmg
+#A fill companion node that generated an UV map that follows each filled area
+
+# "code": "vec4 $(name_uv)_bb = $in($uv);",
+# "inputs": [
+# {
+# "default": "vec4(0.0)",
+# "label": "",
+# "longdesc": "The input fill data, to be connected to the output of a Fill node",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "rgba"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "The generated output UV map, to be connected to a Custom UV node",
+# "rgb": "fill_to_uv_$mode($uv, $(name_uv)_bb, float($seed))",
+# "shortdesc": "Output",
+# "type": "rgb"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 0,
+# "label": "",
+# "longdesc": "The mode decides how the UVs are layed out on each bounding box:\n- Stretch mode where the UV layout is stretched to the bounding box. \n- Square mode where the UV layout is even and centerered based on the longest axis of the bounding box.",
+# "name": "mode",
+# "shortdesc": "Mode",
+# "type": "enum",
+# "values": [
+# {
+# "name": "Stretch",
+# "value": "stretch"
+# },
+# {
+# "name": "Square",
+# "value": "square"
+# }
+# ]
+# }
+# ],
+
+#vec4 flood_fill_preprocess(vec2 uv, float c, float s) {
+# if (c > 0.5) {
+# return vec4(0.0);
+# } else {
+# return vec4(floor(uv*s)/s, vec2(1.0/s));
+# }
+#}
+
+static func flood_fill_preprocess(uv : Vector2, c : float, s : float) -> Color:
+ if (c > 0.5):
+ return Color(0, 0, 0, 0)
+ else:
+ uv = Commons.floorv2(uv * s) / s
+ var f : float = 1.0 / s
+ return Color(uv.x, uv.y, f, f)
+
+#vec3 fill_to_uv_stretch(vec2 coord, vec4 bb, float seed) {
+# vec2 uv_islands = fract(coord-bb.xy)/bb.zw;
+# float random_value = rand(vec2(seed)+bb.xy+bb.zw);
+# return vec3(uv_islands, random_value);
+#}
+
+static func fill_to_uv_stretch(coord : Vector2, bb : Color, pseed : float) -> Vector3:
+ var uv_islands : Vector2 = Commons.fractv2(coord - Vector2(bb.r, bb.g)) / Vector2(bb.b, bb.a)
+ var random_value : float = Commons.rand(Vector2(pseed, pseed) + Vector2(bb.r, bb.g) + Vector2(bb.b, bb.a))
+ return Vector3(uv_islands.x, uv_islands.y, random_value)
+
+#vec3 fill_to_uv_square(vec2 coord, vec4 bb, float seed) {
+# vec2 uv_islands;
+#
+# if (bb.z > bb.w) {
+# vec2 adjusted_coord = coord + vec2(0.0, (bb.z - bb.w) / 2.0);
+# uv_islands = fract(adjusted_coord-bb.xy)/bb.zz;
+# } else {
+# vec2 adjusted_coord = coord + vec2((bb.w - bb.z) / 2.0, 0.0);
+# uv_islands = fract(adjusted_coord-bb.xy)/bb.ww;
+# }
+#
+# float random_value = rand(vec2(seed)+bb.xy+bb.zw);
+# return vec3(uv_islands, random_value);
+#}
+
+static func fill_to_uv_square(coord : Vector2, bb : Color, pseed : float) -> Vector3:
+ var uv_islands : Vector2 = Vector2()
+
+ if (bb.b > bb.a):
+ var adjusted_coord : Vector2 = coord + Vector2(0.0, (bb.b - bb.a) / 2.0);
+ uv_islands = Commons.fractv2(adjusted_coord - Vector2(bb.r, bb.g)) / Vector2(bb.b, bb.b)
+ else:
+ var adjusted_coord : Vector2 = coord + Vector2((bb.a - bb.b) / 2.0, 0.0);
+ uv_islands = Commons.fractv2(adjusted_coord - Vector2(bb.r, bb.g)) / Vector2(bb.a, bb.a)
+
+ var random_value : float = Commons.rand(Vector2(pseed, pseed) + Vector2(bb.r, bb.g) + Vector2(bb.b, bb.a))
+ return Vector3(uv_islands.x, uv_islands.y, random_value)
diff --git a/modules/material_maker/mat_maker_gd/nodes/common/filter.gd b/modules/material_maker/mat_maker_gd/nodes/common/filter.gd
new file mode 100644
index 000000000..59b8055e5
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/common/filter.gd
@@ -0,0 +1,4442 @@
+tool
+extends Reference
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+
+#adjust_hsv.mmg
+#brightness_contrast.mmg
+#greyscale.mmg
+
+#main node methods: adjust_hsv, brightness_contrast
+
+#----------------------
+#colorize.mmg
+#Remaps a greyscale image to a custom gradient
+
+#Inputs:
+#input, float, $uv.x - The input greyscale image - (Image input)
+
+#Outputs:
+#output (rgba) $gradient($input($uv)) - Image output
+
+#Parameters:
+#gradient, Gradient
+
+#----------------------
+#default_color.mmg
+
+# "inputs": [
+# {
+# "default": "$default",
+# "label": "",
+# "name": "in",
+# "type": "rgba"
+# }
+# ],
+# "outputs": [
+# {
+# "rgba": "$in($uv)",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "default": {
+# "a": 1,
+# "b": 1,
+# "g": 1,
+# "r": 1
+# },
+# "label": "",
+# "name": "default",
+# "type": "color"
+# }
+# ]
+
+#----------------------
+#decompose.mmg
+#Decomposes an RGBA input into 4 greyscale images
+
+# "inputs": [
+# {
+# "default": "vec4(1.0)",
+# "label": "",
+# "longdesc": "The RGBA input image",
+# "name": "i",
+# "shortdesc": "Input",
+# "type": "rgba"
+# }
+# ],
+# "outputs": [
+# {
+# "f": "$i($uv).r",
+# "longdesc": "Shows the Red channel of the input",
+# "shortdesc": "Red",
+# "type": "f"
+# },
+# {
+# "f": "$i($uv).g",
+# "longdesc": "Shows the Green channel of the input",
+# "shortdesc": "Green",
+# "type": "f"
+# },
+# {
+# "f": "$i($uv).b",
+# "longdesc": "Shows the Blue channel of the input",
+# "shortdesc": "Blue",
+# "type": "f"
+# },
+# {
+# "f": "$i($uv).a",
+# "longdesc": "Shows the Alpha channel of the input",
+# "shortdesc": "Alpha",
+# "type": "f"
+# }
+# ],
+
+#----------------------
+#auto_tones.mmg
+
+#{
+# "connections": [
+# {
+# "from": "graph",
+# "from_port": 0,
+# "to": "tones_map",
+# "to_port": 1
+# },
+# {
+# "from": "graph",
+# "from_port": 1,
+# "to": "tones_map",
+# "to_port": 2
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 0,
+# "to": "graph",
+# "to_port": 0
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 0,
+# "to": "tones_map",
+# "to_port": 0
+# },
+# {
+# "from": "tones_map",
+# "from_port": 0,
+# "to": "gen_outputs",
+# "to_port": 0
+# }
+# ],
+# "label": "Auto Tones",
+# "longdesc": "Finds the minimum and maximum values in the input texture and tone maps it to the full 0.0 - 1.0 range.",
+# "name": "auto_tones",
+# "node_position": {
+# "x": 0,
+# "y": 0
+# },
+# "nodes": [
+# {
+# "connections": [
+# {
+# "from": "combine",
+# "from_port": 0,
+# "to": "iterate_buffer",
+# "to_port": 0
+# },
+# {
+# "from": "decompose",
+# "from_port": 0,
+# "to": "gen_outputs",
+# "to_port": 0
+# },
+# {
+# "from": "decompose",
+# "from_port": 1,
+# "to": "gen_outputs",
+# "to_port": 1
+# },
+# {
+# "from": "iterate_buffer",
+# "from_port": 0,
+# "to": "decompose",
+# "to_port": 0
+# },
+# {
+# "from": "iterate_buffer",
+# "from_port": 1,
+# "to": "14423",
+# "to_port": 0
+# },
+# {
+# "from": "14423",
+# "from_port": 0,
+# "to": "iterate_buffer",
+# "to_port": 1
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 0,
+# "to": "combine",
+# "to_port": 0
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 0,
+# "to": "combine",
+# "to_port": 1
+# }
+# ],
+# "label": "Find Min Max",
+# "longdesc": "",
+# "name": "graph",
+# "node_position": {
+# "x": 1105.399902,
+# "y": -179.398849
+# },
+# "nodes": [
+# {
+# "name": "14423",
+# "node_position": {
+# "x": 344,
+# "y": 217
+# },
+# "parameters": {
+# "size": 10
+# },
+# "shader_model": {
+# "code": "",
+# "global": "",
+# "inputs": [
+# {
+# "default": "vec3(0.0)",
+# "function": true,
+# "label": "",
+# "name": "in",
+# "type": "rgb"
+# }
+# ],
+# "instance": "vec3 $(name)_compare(vec2 uv, float size) {\n\tfloat iter = $in(uv).b;\n\tsize = size / pow(2.0, (iter * 100.0) );\n\titer += 0.01;\n\tfloat pixel_offset = 1.0 / size;\n\tvec2 half_res_uv = floor(uv * size / 2.0) / size * 2.0 + pixel_offset / 2.0;\n\tvec3 values[4];\n\tvalues[0] = $in(half_res_uv);\n\tvalues[1] = $in(half_res_uv + vec2(pixel_offset, 0.0));\n\tvalues[2] = $in(half_res_uv + vec2(0.0, pixel_offset));\n\tvalues[3] = $in(half_res_uv + vec2(pixel_offset, pixel_offset));\n\t\n\tfloat lowest = 1.0;\n\tfloat highest = 0.0;\n\t\n\tfor (int i = 0; i < 4; i++) {\n\t\tlowest = values[i].r < lowest ? values[i].r : lowest;\n\t\thighest = values[i].g > highest ? values[i].g : highest;\n\t}\n\t\n\treturn vec3( lowest, highest , iter);\n}",
+# "name": "Compare Neighbor",
+# "outputs": [
+# {
+# "rgb": "$(name)_compare($uv, $size)",
+# "type": "rgb"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 10,
+# "first": 1,
+# "label": "",
+# "last": 13,
+# "name": "size",
+# "type": "size"
+# }
+# ]
+# },
+# "type": "shader"
+# },
+# {
+# "name": "iterate_buffer",
+# "node_position": {
+# "x": 328,
+# "y": 63
+# },
+# "parameters": {
+# "filter": false,
+# "iterations": 13,
+# "mipmap": false,
+# "size": 10
+# },
+# "seed_value": 29168,
+# "type": "iterate_buffer"
+# },
+# {
+# "name": "combine",
+# "node_position": {
+# "x": 376,
+# "y": -75
+# },
+# "parameters": {
+#
+# },
+# "type": "combine"
+# },
+# {
+# "name": "decompose",
+# "node_position": {
+# "x": 605,
+# "y": 64
+# },
+# "parameters": {
+#
+# },
+# "type": "decompose"
+# },
+# {
+# "name": "gen_inputs",
+# "node_position": {
+# "x": -199,
+# "y": 23
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "longdesc": "",
+# "name": "in",
+# "shortdesc": "In",
+# "type": "f"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "gen_outputs",
+# "node_position": {
+# "x": 831,
+# "y": 42
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "longdesc": "",
+# "name": "min",
+# "shortdesc": "Min",
+# "type": "f"
+# },
+# {
+# "group_size": 0,
+# "longdesc": "",
+# "name": "max",
+# "shortdesc": "Max",
+# "type": "f"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "gen_parameters",
+# "node_position": {
+# "x": 248.399994,
+# "y": -292
+# },
+# "parameters": {
+# "param0": 10
+# },
+# "type": "remote",
+# "widgets": [
+# {
+# "label": "Size",
+# "linked_widgets": [
+# {
+# "node": "iterate_buffer",
+# "widget": "size"
+# },
+# {
+# "node": "14423",
+# "widget": "size"
+# }
+# ],
+# "name": "param0",
+# "type": "linked_control"
+# }
+# ]
+# }
+# ],
+# "parameters": {
+# "param0": 10
+# },
+# "shortdesc": "",
+# "type": "graph"
+# },
+# {
+# "name": "tones_map",
+# "node_position": {
+# "x": 1142.528442,
+# "y": -88.26989
+# },
+# "parameters": {
+#
+# },
+# "shader_model": {
+# "code": "",
+# "global": "",
+# "inputs": [
+# {
+# "default": "vec4(0.5 ,0.5, 0.5, 1.0)",
+# "label": "",
+# "longdesc": "The input image",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "f"
+# },
+# {
+# "default": "0.0",
+# "label": "",
+# "name": "in_min",
+# "type": "f"
+# },
+# {
+# "default": "1.0",
+# "label": "",
+# "name": "in_max",
+# "type": "f"
+# }
+# ],
+# "instance": "",
+# "longdesc": "Maps linearly an input tones interval to an output tones interval.",
+# "name": "Mapping",
+# "outputs": [
+# {
+# "f": "($in($uv)-$in_min($uv))/($in_max($uv)-$in_min($uv))",
+# "longdesc": "Shows the generated remapped image",
+# "shortdesc": "Output",
+# "type": "f"
+# }
+# ],
+# "parameters": [
+#
+# ],
+# "shortdesc": "Tones map"
+# },
+# "type": "shader"
+# },
+# {
+# "name": "gen_inputs",
+# "node_position": {
+# "x": 665.528564,
+# "y": -136.535721
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "longdesc": "The input image",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "f"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "gen_outputs",
+# "node_position": {
+# "x": 1425.400024,
+# "y": -135.535721
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "longdesc": "Shows the generated remapped image",
+# "name": "out",
+# "shortdesc": "Output",
+# "type": "f"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "gen_parameters",
+# "node_position": {
+# "x": 1024.664307,
+# "y": -298.400757
+# },
+# "parameters": {
+# "param0": 10
+# },
+# "type": "remote",
+# "widgets": [
+# {
+# "label": "",
+# "linked_widgets": [
+# {
+# "node": "graph",
+# "widget": "param0"
+# }
+# ],
+# "longdesc": "Buffers are used to find the mininum and maximum values for the input image. If the input has small details a higher resolution buffer might be needed to capture precise min and max values.\n\nNote: The output itself will not be buffered.",
+# "name": "param0",
+# "shortdesc": "Size",
+# "type": "linked_control"
+# }
+# ]
+# }
+# ],
+# "parameters": {
+# "param0": 10
+# },
+# "shortdesc": "Auto Tones",
+# "type": "graph"
+#}
+
+#----------------------
+#blend.mmg
+#Blends its input, using an optional mask
+
+#Outputs:
+
+#Output - (color)
+#vec4 $(name_uv)_s1 = $s1($uv);
+#vec4 $(name_uv)_s2 = $s2($uv);
+#float $(name_uv)_a = $amount*$a($uv);
+#vec4(blend_$blend_type($uv, $(name_uv)_s1.rgb, $(name_uv)_s2.rgb, $(name_uv)_a*$(name_uv)_s1.a), min(1.0, $(name_uv)_s2.a+$(name_uv)_a*$(name_uv)_s1.a))
+
+#Inputs:
+#in1, color, default vec4($uv.x, 1.0, 1.0, 1.0)
+#in2, color, default vec4($uv.x, 1.0, 1.0, 1.0)
+#blend_type, enum, default: 0, Normal,Dissolve,Multiply,Screen,Overlay,Hard Light,Soft Light,Burn,Dodge,Lighten,Darken,Difference
+#opactiy, float, min: 0, max: 1, default: 0.5, step: 0.01 (input float)
+
+#----------------------
+#combine.mmg
+#Combines 4 greyscale inputs into an RGBA image
+
+# "inputs": [
+# {
+# "default": "0.0",
+# "label": "R",
+# "longdesc": "The greyscale input for the red channel",
+# "name": "r",
+# "shortdesc": "Red",
+# "type": "f"
+# },
+# {
+# "default": "0.0",
+# "label": "G",
+# "longdesc": "The greyscale input for the green channel",
+# "name": "g",
+# "shortdesc": "Green",
+# "type": "f"
+# },
+# {
+# "default": "0.0",
+# "label": "B",
+# "longdesc": "The greyscale input for the blue channel",
+# "name": "b",
+# "shortdesc": "Blue",
+# "type": "f"
+# },
+# {
+# "default": "1.0",
+# "label": "A",
+# "longdesc": "The greyscale input for the alpha channel",
+# "name": "a",
+# "shortdesc": "Alpha",
+# "type": "f"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "Shows the combined RGBA image",
+# "rgba": "vec4($r($uv), $g($uv), $b($uv), $a($uv))",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+
+#----------------------
+#emboss.mmg
+#Creates highlights and shadows from an input heightmap
+
+#float $(name)_fct(vec2 uv) {
+# float pixels = max(1.0, $width);
+# float e = 1.0/$size;
+# float rv = 0.0;
+#
+# for (float dx = -pixels; dx <= pixels; dx += 1.0) {
+# for (float dy = -pixels; dy <= pixels; dy += 1.0) {
+# if (abs(dx) > 0.5 || abs(dy) > 0.5) {
+# rv += $in(uv+e*vec2(dx, dy))*cos(atan(dy, dx)-$angle*3.14159265359/180.0)/length(vec2(dx, dy));
+# }
+# }
+# }
+#
+# return $amount*rv/pixels+0.5;
+#}
+
+#Outputs:
+
+#Output - (float)
+#$(name)_fct($uv)
+
+#Inputs:
+#input, float, default 0
+#size, int (image size)
+#angle, float, min: -180, max: 180, default: 0, step: 0.1
+#amount, float, min: 0, max: 10, default: 1, step: 0.1
+#width, float, min: 1, max: 5, default: 1, step: 1
+
+#----------------------
+#invert.mmg
+#A filter that inverts the R, G, and B channels of its input while keeping the A channel unchanged
+
+#Outputs:
+
+#Output - (rgba)
+#vec4(vec3(1.0)-$in($uv).rgb, $in($uv).a)
+
+#Inputs:
+#input, rgba, default vec4(1.0, 1.0, 1.0, 1.0)
+
+#----------------------
+#normal_map.mmg
+
+#{
+# "connections": [
+# {
+# "from": "gen_inputs",
+# "from_port": 0,
+# "to": "buffer",
+# "to_port": 0
+# },
+# {
+# "from": "buffer",
+# "from_port": 0,
+# "to": "switch",
+# "to_port": 1
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 0,
+# "to": "switch",
+# "to_port": 0
+# },
+# {
+# "from": "edge_detect_1",
+# "from_port": 0,
+# "to": "gen_outputs",
+# "to_port": 0
+# },
+# {
+# "from": "switch",
+# "from_port": 0,
+# "to": "edge_detect_1",
+# "to_port": 0
+# }
+# ],
+# "label": "Normal Map",
+# "longdesc": "Generates a normal map from a height map",
+# "name": "normal_map",
+# "node_position": {
+# "x": 0,
+# "y": 0
+# },
+# "nodes": [
+# {
+# "name": "buffer",
+# "node_position": {
+# "x": -695.663818,
+# "y": 34.60614
+# },
+# "parameters": {
+# "lod": 0,
+# "size": 10
+# },
+# "type": "buffer"
+# },
+# {
+# "name": "gen_parameters",
+# "node_position": {
+# "x": -731.910156,
+# "y": -131.916687
+# },
+# "parameters": {
+# "param0": 10,
+# "param1": 1,
+# "param2": 0,
+# "param4": 1
+# },
+# "type": "remote",
+# "widgets": [
+# {
+# "label": "",
+# "linked_widgets": [
+# {
+# "node": "edge_detect_1",
+# "widget": "format"
+# }
+# ],
+# "longdesc": "The format of the generated normal map\nIn most cases this should be set to default",
+# "name": "param2",
+# "shortdesc": "Format",
+# "type": "linked_control"
+# },
+# {
+# "label": "",
+# "linked_widgets": [
+# {
+# "node": "buffer",
+# "widget": "size"
+# },
+# {
+# "node": "edge_detect_1",
+# "widget": "size"
+# }
+# ],
+# "longdesc": "The resolution of the generated normal map",
+# "name": "param0",
+# "shortdesc": "Resolution",
+# "type": "linked_control"
+# },
+# {
+# "label": "",
+# "linked_widgets": [
+# {
+# "node": "edge_detect_1",
+# "widget": "amount"
+# }
+# ],
+# "longdesc": "The strength of the normal map filter",
+# "name": "param1",
+# "shortdesc": "Strength",
+# "type": "linked_control"
+# },
+# {
+# "configurations": {
+# "False": [
+# {
+# "node": "switch",
+# "value": 0,
+# "widget": "source"
+# }
+# ],
+# "True": [
+# {
+# "node": "switch",
+# "value": 1,
+# "widget": "source"
+# }
+# ]
+# },
+# "label": "Buffer",
+# "linked_widgets": [
+# {
+# "node": "switch",
+# "widget": "source"
+# }
+# ],
+# "longdesc": "When set, a buffer is used to sample the input before the normal map filter",
+# "name": "param4",
+# "shortdesc": "Buffer",
+# "type": "config_control"
+# }
+# ]
+# },
+# {
+# "name": "gen_outputs",
+# "node_position": {
+# "x": -445.663818,
+# "y": 75.047363
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "longdesc": "Shows the generated normal map",
+# "name": "Normal",
+# "shortdesc": "Output",
+# "type": "rgb"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "gen_inputs",
+# "node_position": {
+# "x": -1094.910156,
+# "y": 74.047363
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "longdesc": "The input height map",
+# "name": "Bump",
+# "shortdesc": "Input",
+# "type": "f"
+# }
+# ],
+# "seed_value": 12483,
+# "type": "ios"
+# },
+# {
+# "name": "switch",
+# "node_position": {
+# "x": -673.5,
+# "y": 113.297363
+# },
+# "parameters": {
+# "choices": 2,
+# "outputs": 1,
+# "source": 1
+# },
+# "type": "switch"
+# },
+# {
+# "name": "edge_detect_1",
+# "node_position": {
+# "x": -676.092529,
+# "y": 193.868774
+# },
+# "parameters": {
+# "amount": 1,
+# "format": 0,
+# "size": 10
+# },
+# "shader_model": {
+# "code": "",
+# "global": "vec3 process_normal_default(vec3 v, float multiplier) {\n\treturn 0.5*normalize(v.xyz*multiplier+vec3(0.0, 0.0, -1.0))+vec3(0.5);\n}\n\nvec3 process_normal_opengl(vec3 v, float multiplier) {\n\treturn 0.5*normalize(v.xyz*multiplier+vec3(0.0, 0.0, 1.0))+vec3(0.5);\n}\n\nvec3 process_normal_directx(vec3 v, float multiplier) {\n\treturn 0.5*normalize(v.xyz*vec3(1.0, -1.0, 1.0)*multiplier+vec3(0.0, 0.0, 1.0))+vec3(0.5);\n}\n",
+# "inputs": [
+# {
+# "default": "0.0",
+# "function": true,
+# "label": "",
+# "name": "in",
+# "type": "f"
+# }
+# ],
+# "instance": "vec3 $(name)_fct(vec2 uv) {\n\tvec3 e = vec3(1.0/$size, -1.0/$size, 0);\n\tvec2 rv = vec2(1.0, -1.0)*$in(uv+e.xy);\n\trv += vec2(-1.0, 1.0)*$in(uv-e.xy);\n\trv += vec2(1.0, 1.0)*$in(uv+e.xx);\n\trv += vec2(-1.0, -1.0)*$in(uv-e.xx);\n\trv += vec2(2.0, 0.0)*$in(uv+e.xz);\n\trv += vec2(-2.0, 0.0)*$in(uv-e.xz);\n\trv += vec2(0.0, 2.0)*$in(uv+e.zx);\n\trv += vec2(0.0, -2.0)*$in(uv-e.zx);\n\treturn vec3(rv, 0.0);\n}",
+# "name": "Normal map",
+# "outputs": [
+# {
+# "rgb": "process_normal_$format($(name)_fct($uv), $amount*$size/128.0)",
+# "type": "rgb"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 0,
+# "label": "",
+# "name": "format",
+# "type": "enum",
+# "values": [
+# {
+# "name": "Default",
+# "value": "default"
+# },
+# {
+# "name": "OpenGL",
+# "value": "opengl"
+# },
+# {
+# "name": "DirectX",
+# "value": "directx"
+# }
+# ]
+# },
+# {
+# "default": 9,
+# "first": 4,
+# "label": "",
+# "last": 12,
+# "name": "size",
+# "type": "size"
+# },
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "",
+# "max": 2,
+# "min": 0,
+# "name": "amount",
+# "step": 0.01,
+# "type": "float"
+# }
+# ]
+# },
+# "type": "shader"
+# }
+# ],
+# "parameters": {
+# "param0": 10,
+# "param1": 1,
+# "param2": 0,
+# "param4": 1
+# },
+# "shortdesc": "Normal map",
+# "type": "graph"
+#}
+
+#----------------------
+#sharpen.mmg
+#Sharpens it input image
+
+# "inputs": [
+# {
+# "default": "vec3(0.0)",
+# "function": true,
+# "label": "",
+# "longdesc": "The input image",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "rgb"
+# }
+# ],
+# "instance": "vec3 $(name)_fct(vec2 uv) {\n\tvec2 e = vec2(1.0/$size, 0.0);\n\tvec3 rv = 5.0*$in(uv);\n\trv -= $in(uv+e.xy);\n\trv -= $in(uv-e.xy);\n\trv -= $in(uv+e.yx);\n\trv -= $in(uv-e.yx);\n\treturn rv;\n}",
+# "outputs": [
+# {
+# "longdesc": "Shows the generated sharpened image",
+# "rgb": "$(name)_fct($uv)",
+# "shortdesc": "Output",
+# "type": "rgb"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 9,
+# "first": 4,
+# "label": "Size",
+# "last": 12,
+# "longdesc": "The resolution of the input image",
+# "name": "size",
+# "shortdesc": "Size",
+# "type": "size"
+# }
+# ],
+
+#----------------------
+#tones.mmg
+
+# "inputs": [
+# {
+# "default": "vec4(1.0)",
+# "label": "",
+# "name": "input",
+# "type": "rgba"
+# }
+# ],
+# "outputs": [
+# {
+# "rgba": "adjust_levels($input($uv), $in_min, $in_mid, $in_max, $out_min, $out_max)",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "default": {
+# "a": 0,
+# "b": 0,
+# "g": 0,
+# "r": 0
+# },
+# "label": "",
+# "name": "in_min",
+# "type": "color"
+# },
+# {
+# "default": {
+# "a": 0.498039,
+# "b": 0.498039,
+# "g": 0.498039,
+# "r": 0.498039
+# },
+# "label": "",
+# "name": "in_mid",
+# "type": "color"
+# },
+# {
+# "default": {
+# "a": 1,
+# "b": 1,
+# "g": 1,
+# "r": 1
+# },
+# "label": "",
+# "name": "in_max",
+# "type": "color"
+# },
+# {
+# "default": {
+# "a": 1,
+# "b": 0,
+# "g": 0,
+# "r": 0
+# },
+# "label": "",
+# "name": "out_min",
+# "type": "color"
+# },
+# {
+# "default": {
+# "a": 1,
+# "b": 1,
+# "g": 1,
+# "r": 1
+# },
+# "label": "",
+# "name": "out_max",
+# "type": "color"
+# }
+# ]
+# },
+
+#----------------------
+#tones_map.mmg
+#Maps linearly an input tones interval to an output tones interval.
+
+# "inputs": [
+# {
+# "default": "vec4(0.5 ,0.5, 0.5, 1.0)",
+# "label": "",
+# "longdesc": "The input image",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "rgba"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "Shows the generated remapped image",
+# "rgba": "vec4(vec3($out_min)+($in($uv).rgb-vec3($in_min))*vec3(($out_max-$out_min)/($in_max-$in_min)), $in($uv).a)",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "Input min",
+# "longdesc": "The minimum value of the input interval",
+# "max": 1,
+# "min": 0,
+# "name": "in_min",
+# "shortdesc": "InputMin",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "Input max",
+# "longdesc": "The maximum value of the input interval",
+# "max": 1,
+# "min": 0,
+# "name": "in_max",
+# "shortdesc": "InputMax",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 1,
+# "label": "Output min",
+# "longdesc": "The minimum value of the output interval",
+# "max": 1,
+# "min": 0,
+# "name": "out_min",
+# "shortdesc": "OutputMin",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "Output max",
+# "longdesc": "The maximum value of the output interval",
+# "max": 1,
+# "min": 0,
+# "name": "out_max",
+# "shortdesc": "OutputMax",
+# "step": 0.01,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#make_tileable.mmg
+#Creates a tileable version of its input image by moving different parts around to hide seams.
+
+#vec4 make_tileable_$(name)(vec2 uv, float w) {
+# vec4 a = $in(uv);
+# vec4 b = $in(fract(uv+vec2(0.5)));
+# float coef_ab = sin(1.57079632679*clamp((length(uv-vec2(0.5))-0.5+w)/w, 0.0, 1.0));
+# vec4 c = $in(fract(uv+vec2(0.25)));
+# float coef_abc = sin(1.57079632679*clamp((min(min(length(uv-vec2(0.0, 0.5)), length(uv-vec2(0.5, 0.0))), min(length(uv-vec2(1.0, 0.5)), length(uv-vec2(0.5, 1.0))))-w)/w, 0.0, 1.0));
+# return mix(c, mix(a, b, coef_ab), coef_abc);
+#}
+
+#Inputs:
+#input, rgba, default: vec4(1.0)
+#width, float, min:0, max: 1: default: 0.1, step: 0.01
+
+#Outputs:
+#output (rgba)
+#make_tileable_$(name)($uv, 0.5*$w)
+
+#----------------------
+#occlusion.mmg
+
+#{
+# "connections": [
+# {
+# "from": "gen_inputs",
+# "from_port": 0,
+# "to": "buffer",
+# "to_port": 0
+# },
+# {
+# "from": "blend",
+# "from_port": 0,
+# "to": "colorize",
+# "to_port": 0
+# },
+# {
+# "from": "buffer",
+# "from_port": 0,
+# "to": "blend",
+# "to_port": 0
+# },
+# {
+# "from": "colorize",
+# "from_port": 0,
+# "to": "_2",
+# "to_port": 0
+# },
+# {
+# "from": "_2",
+# "from_port": 0,
+# "to": "gen_outputs",
+# "to_port": 0
+# },
+# {
+# "from": "buffer",
+# "from_port": 0,
+# "to": "gaussian_blur_x",
+# "to_port": 0
+# },
+# {
+# "from": "gaussian_blur_x",
+# "from_port": 0,
+# "to": "buffer_2",
+# "to_port": 0
+# },
+# {
+# "from": "buffer_2",
+# "from_port": 0,
+# "to": "gaussian_blur_y",
+# "to_port": 0
+# },
+# {
+# "from": "gaussian_blur_y",
+# "from_port": 0,
+# "to": "blend",
+# "to_port": 1
+# }
+# ],
+# "label": "Occlusion",
+# "longdesc": "Generates an ambient occlusion map from a height map",
+# "name": "occlusion",
+# "node_position": {
+# "x": 0,
+# "y": 0
+# },
+# "nodes": [
+# {
+# "name": "buffer_2",
+# "node_position": {
+# "x": -409.875,
+# "y": -112.625
+# },
+# "parameters": {
+# "lod": 0,
+# "size": 8
+# },
+# "seed_value": 61344,
+# "type": "buffer"
+# },
+# {
+# "name": "buffer",
+# "node_position": {
+# "x": -408.25,
+# "y": -265.75
+# },
+# "parameters": {
+# "lod": 0,
+# "size": 8
+# },
+# "seed_value": 53030,
+# "type": "buffer"
+# },
+# {
+# "name": "gen_parameters",
+# "node_position": {
+# "x": -463.666626,
+# "y": -384.666656
+# },
+# "parameters": {
+# "param0": 8,
+# "param2": 1.5
+# },
+# "type": "remote",
+# "widgets": [
+# {
+# "label": "Grid size:",
+# "linked_widgets": [
+# {
+# "node": "buffer",
+# "widget": "size"
+# },
+# {
+# "node": "buffer_2",
+# "widget": "size"
+# },
+# {
+# "node": "gaussian_blur_x",
+# "widget": "size"
+# },
+# {
+# "node": "gaussian_blur_y",
+# "widget": "size"
+# }
+# ],
+# "longdesc": "The resolution of the input height map",
+# "name": "param0",
+# "shortdesc": "Size",
+# "type": "linked_control"
+# },
+# {
+# "label": "Strength",
+# "linked_widgets": [
+# {
+# "node": "_2",
+# "widget": "g"
+# }
+# ],
+# "longdesc": "The strength of the occlusion map effect",
+# "name": "param2",
+# "shortdesc": "Strength",
+# "type": "linked_control"
+# }
+# ]
+# },
+# {
+# "name": "gen_inputs",
+# "node_position": {
+# "x": -824.666626,
+# "y": -116.392853
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "longdesc": "The input heightmap",
+# "name": "port0",
+# "shortdesc": "Input",
+# "type": "f"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "gen_outputs",
+# "node_position": {
+# "x": 33.547607,
+# "y": -132.392853
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "longdesc": "The generated occlusion map",
+# "name": "port0",
+# "shortdesc": "Output",
+# "type": "f"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "blend",
+# "node_position": {
+# "x": -422.79895,
+# "y": 63.16272
+# },
+# "parameters": {
+# "amount": 1,
+# "blend_type": 11
+# },
+# "type": "blend"
+# },
+# {
+# "name": "colorize",
+# "node_position": {
+# "x": -167.79895,
+# "y": -178.83728
+# },
+# "parameters": {
+# "gradient": {
+# "interpolation": 1,
+# "points": [
+# {
+# "a": 1,
+# "b": 1,
+# "g": 1,
+# "pos": 0,
+# "r": 1
+# },
+# {
+# "a": 1,
+# "b": 0,
+# "g": 0,
+# "pos": 1,
+# "r": 0
+# }
+# ],
+# "type": "Gradient"
+# }
+# },
+# "seed_value": 33856,
+# "type": "colorize"
+# },
+# {
+# "name": "_2",
+# "node_position": {
+# "x": -145.403687,
+# "y": -112.29187
+# },
+# "parameters": {
+# "g": 1.5
+# },
+# "shader_model": {
+# "code": "",
+# "global": "",
+# "inputs": [
+# {
+# "default": "0.0",
+# "label": "",
+# "name": "in",
+# "type": "f"
+# }
+# ],
+# "instance": "",
+# "name": "",
+# "outputs": [
+# {
+# "f": "pow($in($uv), $g)",
+# "type": "f"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 1,
+# "label": "",
+# "max": 2,
+# "min": 0,
+# "name": "g",
+# "step": 0.1,
+# "type": "float"
+# }
+# ]
+# },
+# "type": "shader"
+# },
+# {
+# "name": "gaussian_blur_x",
+# "node_position": {
+# "x": -413.053711,
+# "y": -189.016876
+# },
+# "parameters": {
+# "sigma": 50,
+# "size": 8
+# },
+# "type": "gaussian_blur_x"
+# },
+# {
+# "name": "gaussian_blur_y",
+# "node_position": {
+# "x": -405.053711,
+# "y": -21.016876
+# },
+# "parameters": {
+# "sigma": 50,
+# "size": 8
+# },
+# "type": "gaussian_blur_y"
+# }
+# ],
+# "parameters": {
+# "param0": 8,
+# "param2": 1.5
+# },
+# "shortdesc": "Occlusion",
+# "type": "graph"
+#}
+
+#----------------------
+#occlusion2.mmg
+
+#{
+# "connections": [
+# {
+# "from": "colorize",
+# "from_port": 0,
+# "to": "_2",
+# "to_port": 0
+# },
+# {
+# "from": "_2",
+# "from_port": 0,
+# "to": "gen_outputs",
+# "to_port": 0
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 0,
+# "to": "fast_blur",
+# "to_port": 0
+# },
+# {
+# "from": "fast_blur",
+# "from_port": 0,
+# "to": "blend",
+# "to_port": 1
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 0,
+# "to": "blend",
+# "to_port": 0
+# },
+# {
+# "from": "blend",
+# "from_port": 0,
+# "to": "colorize",
+# "to_port": 0
+# }
+# ],
+# "label": "Occlusion",
+# "longdesc": "Generates an ambient occlusion map from a height map",
+# "name": "occlusion2",
+# "node_position": {
+# "x": 0,
+# "y": 0
+# },
+# "nodes": [
+# {
+# "name": "gen_parameters",
+# "node_position": {
+# "x": -522.866638,
+# "y": -383.867035
+# },
+# "parameters": {
+# "param0": 11,
+# "param1": 20,
+# "param2": 1.5,
+# "param3": 1
+# },
+# "type": "remote",
+# "widgets": [
+# {
+# "label": "Resolution",
+# "linked_widgets": [
+# {
+# "node": "fast_blur",
+# "widget": "param0"
+# }
+# ],
+# "longdesc": "The resolution of the input height map",
+# "name": "param0",
+# "shortdesc": "Resolution",
+# "type": "linked_control"
+# },
+# {
+# "label": "Strength",
+# "linked_widgets": [
+# {
+# "node": "_2",
+# "widget": "g"
+# }
+# ],
+# "longdesc": "The strength of the occlusion map effect",
+# "name": "param2",
+# "shortdesc": "Strength",
+# "type": "linked_control"
+# },
+# {
+# "label": "Radius",
+# "linked_widgets": [
+# {
+# "node": "fast_blur",
+# "widget": "param1"
+# }
+# ],
+# "longdesc": "The radius of the blur used for the occlusion effect",
+# "name": "param1",
+# "shortdesc": "Radius",
+# "type": "linked_control"
+# },
+# {
+# "label": "Quality",
+# "linked_widgets": [
+# {
+# "node": "fast_blur",
+# "widget": "param2"
+# }
+# ],
+# "longdesc": "The quality of the blur operation used for the occlusion effect",
+# "name": "param3",
+# "shortdesc": "Quality",
+# "type": "linked_control"
+# }
+# ]
+# },
+# {
+# "name": "gen_inputs",
+# "node_position": {
+# "x": -842.266602,
+# "y": -108.396729
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "longdesc": "The input heightmap",
+# "name": "port0",
+# "shortdesc": "Input",
+# "type": "f"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "gen_outputs",
+# "node_position": {
+# "x": 77.5476,
+# "y": -86.015305
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "longdesc": "The generated occlusion map",
+# "name": "port0",
+# "shortdesc": "Output",
+# "type": "f"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "blend",
+# "node_position": {
+# "x": -422.79895,
+# "y": 11.18788
+# },
+# "parameters": {
+# "amount": 1,
+# "blend_type": 11
+# },
+# "type": "blend"
+# },
+# {
+# "name": "colorize",
+# "node_position": {
+# "x": -124.598953,
+# "y": -131.660126
+# },
+# "parameters": {
+# "gradient": {
+# "interpolation": 1,
+# "points": [
+# {
+# "a": 1,
+# "b": 1,
+# "g": 1,
+# "pos": 0,
+# "r": 1
+# },
+# {
+# "a": 1,
+# "b": 0,
+# "g": 0,
+# "pos": 1,
+# "r": 0
+# }
+# ],
+# "type": "Gradient"
+# }
+# },
+# "seed_value": 33856,
+# "type": "colorize"
+# },
+# {
+# "name": "_2",
+# "node_position": {
+# "x": -104.603699,
+# "y": -57.918201
+# },
+# "parameters": {
+# "g": 1.5
+# },
+# "shader_model": {
+# "code": "",
+# "global": "",
+# "inputs": [
+# {
+# "default": "0.0",
+# "label": "",
+# "name": "in",
+# "type": "f"
+# }
+# ],
+# "instance": "",
+# "name": "",
+# "outputs": [
+# {
+# "f": "pow($in(fract($uv)), $g)",
+# "type": "f"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 1,
+# "label": "",
+# "max": 2,
+# "min": 0,
+# "name": "g",
+# "step": 0.1,
+# "type": "float"
+# }
+# ]
+# },
+# "type": "shader"
+# },
+# {
+# "connections": [
+# {
+# "from": "buffer_2",
+# "from_port": 0,
+# "to": "fast_blur_shader",
+# "to_port": 0
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 0,
+# "to": "buffer_2",
+# "to_port": 0
+# },
+# {
+# "from": "fast_blur_shader",
+# "from_port": 0,
+# "to": "gen_outputs",
+# "to_port": 0
+# }
+# ],
+# "label": "Fast Blur",
+# "longdesc": "",
+# "name": "fast_blur",
+# "node_position": {
+# "x": -435.552002,
+# "y": -135.436234
+# },
+# "nodes": [
+# {
+# "name": "fast_blur_shader",
+# "node_position": {
+# "x": -161.600006,
+# "y": 143.188766
+# },
+# "parameters": {
+# "quality": 1,
+# "sigma": 20
+# },
+# "shader_model": {
+# "code": "",
+# "global": "",
+# "inputs": [
+# {
+# "default": "vec4(1.0)",
+# "function": true,
+# "label": "",
+# "name": "in",
+# "type": "rgba"
+# }
+# ],
+# "instance": "vec4 $(name)_blur(vec2 uv, vec2 scale, float sigma, int quality) {\n vec4 O = vec4(0.0);\n\tfloat samples = sigma * 4.0; \n\tint LOD = max(0, int(log2(float(samples)))-quality-2);\n\tint sLOD = 1 << LOD;\n int s = max(1, int(samples/float(sLOD)));\n\tfloat sum = 0.0;\n for (int i = 0; i < s*s; i++) {\n vec2 d = vec2(float(i%s), float(i/s))*float(sLOD) - 0.5*float(samples);\n\t\tvec2 dd = d / sigma;\n\t\tfloat g = exp(-.5*dot(dd,dd))/(6.28*sigma*sigma);\n O += g * textureLod($in.texture, uv + scale * d, float(LOD));\n\t\tsum += g;\n }\n \n return O / sum;\n}\n",
+# "name": "Fast Blur",
+# "outputs": [
+# {
+# "rgba": "$(name)_blur($uv, vec2(1.0)/$in.size, max(1.0, floor($sigma*$in.size/2048.0)), int($quality))",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 1,
+# "label": "",
+# "max": 256,
+# "min": 1,
+# "name": "sigma",
+# "step": 1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 1,
+# "label": "",
+# "max": 3,
+# "min": 0,
+# "name": "quality",
+# "step": 1,
+# "type": "float"
+# }
+# ]
+# },
+# "type": "shader"
+# },
+# {
+# "name": "buffer_2",
+# "node_position": {
+# "x": -187,
+# "y": 61.5
+# },
+# "parameters": {
+# "size": 11
+# },
+# "type": "buffer",
+# "version": 1
+# },
+# {
+# "name": "gen_inputs",
+# "node_position": {
+# "x": -602,
+# "y": 91.75
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "name": "port0",
+# "type": "f"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "gen_outputs",
+# "node_position": {
+# "x": 88,
+# "y": 61.75
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "name": "port0",
+# "type": "rgba"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "gen_parameters",
+# "node_position": {
+# "x": -254.5,
+# "y": -122.5
+# },
+# "parameters": {
+# "param0": 11,
+# "param1": 20,
+# "param2": 1
+# },
+# "type": "remote",
+# "widgets": [
+# {
+# "label": "Resolution",
+# "linked_widgets": [
+# {
+# "node": "buffer_2",
+# "widget": "size"
+# }
+# ],
+# "name": "param0",
+# "type": "linked_control"
+# },
+# {
+# "label": "Sigma",
+# "linked_widgets": [
+# {
+# "node": "fast_blur_shader",
+# "widget": "sigma"
+# }
+# ],
+# "name": "param1",
+# "type": "linked_control"
+# },
+# {
+# "label": "Quality",
+# "linked_widgets": [
+# {
+# "node": "fast_blur_shader",
+# "widget": "quality"
+# }
+# ],
+# "name": "param2",
+# "type": "linked_control"
+# }
+# ]
+# }
+# ],
+# "parameters": {
+# "param0": 11,
+# "param1": 20,
+# "param2": 1
+# },
+# "shortdesc": "",
+# "type": "graph"
+# }
+# ],
+# "parameters": {
+# "param0": 11,
+# "param1": 20,
+# "param2": 1.5,
+# "param3": 1
+# },
+# "shortdesc": "Occlusion",
+# "type": "graph"
+#}
+
+#----------------------
+#pixelize.mmg
+#Creates a pixelated image from its input, and also quantifies the colors with optional dithering.
+
+# "code": "vec2 $(name_uv)_uv = floor(($uv*vec2($x, $y)))+vec2(0.5);\nvec3 $(name_uv)_dither = fract(vec3(dot(vec2(171.0, 231.0), $(name_uv)_uv))/vec3(103.0, 71.0, 97.0));\n",
+# "inputs": [
+# {
+# "default": "vec3(1.0)",
+# "label": "",
+# "longdesc": "The image to be pixelated",
+# "name": "i",
+# "shortdesc": "Input",
+# "type": "rgb"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "A pixelated version of the input image",
+# "rgb": "floor($i($(name_uv)_uv/vec2($x, $y))*$c+$d*($(name_uv)_dither-vec3(0.5)))/$c",
+# "shortdesc": "Output",
+# "type": "rgb"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 4,
+# "label": "Columns:",
+# "longdesc": "Number of pixel columns of the output",
+# "max": 256,
+# "min": 1,
+# "name": "x",
+# "shortdesc": "Columns",
+# "step": 1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 4,
+# "label": "Rows:",
+# "longdesc": "Number of pixel rows of the output",
+# "max": 256,
+# "min": 1,
+# "name": "y",
+# "shortdesc": "Rows",
+# "step": 1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 4,
+# "label": "Levels:",
+# "longdesc": "Number of color levels for each channel",
+# "max": 32,
+# "min": 2,
+# "name": "c",
+# "shortdesc": "Levels",
+# "step": 1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "Dither:",
+# "longdesc": "Amount of dithering in the output image",
+# "max": 1,
+# "min": 0,
+# "name": "d",
+# "shortdesc": "Dithering",
+# "step": 0.01,
+# "type": "float"
+# }
+# ]
+
+#----------------------
+#quantize.mmg
+#Quantizes the red, green and blue channels of its input
+
+# "inputs": [
+# {
+# "default": "vec4(2.0*vec3(length($uv-vec2(0.5))), 1.0)",
+# "label": "",
+# "longdesc": "The input image",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "rgba"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "The quantized image",
+# "rgba": "vec4(floor($in($uv).rgb*$steps)/$steps, $in($uv).a)",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 4,
+# "label": "",
+# "longdesc": "The number of quantization steps",
+# "max": 32,
+# "min": 2,
+# "name": "steps",
+# "shortdesc": "Steps",
+# "step": 1,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#skew.mmg
+
+# "global": "vec2 uvskew_h(vec2 uv, float amount) {\n\treturn vec2(uv.x+amount*(uv.y-0.5), uv.y);\n}\nvec2 uvskew_v(vec2 uv, float amount) {\n\treturn vec2(uv.x, uv.y+amount*(uv.x-0.5));\n}",
+# "inputs": [
+# {
+# "default": "vec4($uv, 0, 1)",
+# "label": "",
+# "name": "i",
+# "type": "rgba"
+# }
+# ],
+# "outputs": [
+# {
+# "rgba": "$i(uvskew_$direction($uv, $amount))",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 0,
+# "label": "",
+# "name": "direction",
+# "type": "enum",
+# "values": [
+# {
+# "name": "Horizontal",
+# "value": "h"
+# },
+# {
+# "name": "Vertical",
+# "value": "v"
+# }
+# ]
+# },
+# {
+# "default": 0,
+# "label": "",
+# "max": 3,
+# "min": -3,
+# "name": "amount",
+# "step": 0.005,
+# "type": "float",
+# "widget": "spinbox"
+# }
+# ]
+
+#----------------------
+#tonality.mmg
+#Remaps a greyscale image tonality using a curve
+
+# "inputs": [
+# {
+# "default": "$uv.x",
+# "label": "",
+# "longdesc": "The input greyscale image",
+# "name": "input",
+# "shortdesc": "Input",
+# "type": "f"
+# }
+# ],
+# "outputs": [
+# {
+# "f": "$curve($input($uv))",
+# "longdesc": "The remapped greyscale image",
+# "shortdesc": "Output",
+# "type": "f"
+# }
+# ],
+# "parameters": [
+# {
+# "default": {
+# "points": [
+# {
+# "ls": 0,
+# "rs": 1,
+# "x": 0,
+# "y": 0
+# },
+# {
+# "ls": 1,
+# "rs": 0,
+# "x": 1,
+# "y": 1
+# }
+# ],
+# "type": "Curve"
+# },
+# "label": "",
+# "longdesc": "The tonality curve to which the input is remapped",
+# "name": "curve",
+# "shortdesc": "Curve",
+# "type": "curve"
+# }
+# ],
+
+#----------------------
+#tones_range.mmg
+#Outputs the tone range around a specified value
+
+# "code": "float $(name_uv)_step = clamp(($in($uv) - ($value))/max(0.0001, $width)+0.5, 0.0, 1.0);\nfloat $(name_uv)_false = clamp((min($(name_uv)_step, 1.0-$(name_uv)_step) * 2.0) / (1.0 - $contrast), 0.0, 1.0);\nfloat $(name_uv)_true = 1.0-$(name_uv)_false;",
+# "inputs": [
+# {
+# "default": "($uv.x + $uv.y) / 2.0",
+# "label": "",
+# "longdesc": "The input image",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "f"
+# }
+# ],
+# "outputs": [
+# {
+# "f": "$(name_uv)_$invert",
+# "longdesc": "Shows the generated high contrast image",
+# "shortdesc": "Output",
+# "type": "f"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "Value",
+# "longdesc": "The center value of the selection",
+# "max": 1,
+# "min": 0,
+# "name": "value",
+# "shortdesc": "Value",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0.25,
+# "label": "Width",
+# "longdesc": "The width (in tones space) of the selection area",
+# "max": 1,
+# "min": 0,
+# "name": "width",
+# "shortdesc": "Width",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "Contrast",
+# "longdesc": "Adjusts the falloff of the output",
+# "max": 1,
+# "min": 0,
+# "name": "contrast",
+# "shortdesc": "Contrast",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "default": false,
+# "label": "Invert",
+# "longdesc": "Invert the generated image if set",
+# "name": "invert",
+# "shortdesc": "Invert",
+# "type": "boolean"
+# }
+# ],
+
+#----------------------
+#tones_step.mmg
+#Emphasizes dark and light tones around a specified value
+
+# "code": "vec3 $(name_uv)_false = clamp(($in($uv).rgb-vec3($value))/max(0.0001, $width)+vec3(0.5), vec3(0.0), vec3(1.0));\nvec3 $(name_uv)_true = vec3(1.0)-$(name_uv)_false;",
+# "inputs": [
+# {
+# "default": "vec4(0.5 ,0.5, 0.5, 1.0)",
+# "label": "",
+# "longdesc": "The input image",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "rgba"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "Shows the generated high contrast image",
+# "rgba": "vec4($(name_uv)_$invert, $in($uv).a)",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "Value",
+# "longdesc": "The value of the input that separate dark and light zones of the result",
+# "max": 1,
+# "min": 0,
+# "name": "value",
+# "shortdesc": "Value",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 1,
+# "label": "Width",
+# "longdesc": "The width (in tones space) of the transition area",
+# "max": 1,
+# "min": 0,
+# "name": "width",
+# "shortdesc": "width",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "default": false,
+# "label": "Invert",
+# "longdesc": "Invert the generated image if set",
+# "name": "invert",
+# "shortdesc": "Invert",
+# "type": "boolean"
+# }
+# ],
+
+#----------------------
+#math.mmg
+#Performs a math operation using its inputs or parameter values
+
+# "code": "float $(name_uv)_clamp_false = $op;\nfloat $(name_uv)_clamp_true = clamp($(name_uv)_clamp_false, 0.0, 1.0);\n",
+# "inputs": [
+# {
+# "default": "$default_in1",
+# "label": "2:A",
+# "longdesc": "The A operand",
+# "name": "in1",
+# "shortdesc": "A",
+# "type": "f"
+# },
+# {
+# "default": "$default_in2",
+# "label": "B",
+# "longdesc": "The B operand",
+# "name": "in2",
+# "shortdesc": "B",
+# "type": "f"
+# }
+# ],
+# "outputs": [
+# {
+# "f": "$(name_uv)_clamp_$clamp",
+# "longdesc": "Shows a greyscale image of the result",
+# "shortdesc": "Output",
+# "type": "f"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 19,
+# "label": "",
+# "longdesc": "The operation to be performed",
+# "name": "op",
+# "shortdesc": "Operation",
+# "type": "enum",
+# "values": [
+# {
+# "name": "A+B",
+# "value": "$in1($uv)+$in2($uv)"
+# },
+# {
+# "name": "A-B",
+# "value": "$in1($uv)-$in2($uv)"
+# },
+# {
+# "name": "A*B",
+# "value": "$in1($uv)*$in2($uv)"
+# },
+# {
+# "name": "A/B",
+# "value": "$in1($uv)/$in2($uv)"
+# },
+# {
+# "name": "log(A)",
+# "value": "log($in1($uv))"
+# },
+# {
+# "name": "log2(A)",
+# "value": "log2($in1($uv))"
+# },
+# {
+# "name": "pow(A, B)",
+# "value": "pow($in1($uv),$in2($uv))"
+# },
+# {
+# "name": "abs(A)",
+# "value": "abs($in1($uv))"
+# },
+# {
+# "name": "round(A)",
+# "value": "round($in1($uv))"
+# },
+# {
+# "name": "floor(A)",
+# "value": "floor($in1($uv))"
+# },
+# {
+# "name": "ceil(A)",
+# "value": "ceil($in1($uv))"
+# },
+# {
+# "name": "trunc(A)",
+# "value": "trunc($in1($uv))"
+# },
+# {
+# "name": "fract(A)",
+# "value": "fract($in1($uv))"
+# },
+# {
+# "name": "min(A, B)",
+# "value": "min($in1($uv),$in2($uv))"
+# },
+# {
+# "name": "max(A, B)",
+# "value": "max($in1($uv),$in2($uv))"
+# },
+# {
+# "name": "A 0.5 || abs(dy) > 0.5) {\n\t\t\t\trv += $in(uv+e*vec2(dx, dy)).xy*cos(vec2(atan(dy, dx))-vec2(0.0, 0.5)*3.14159265359)/length(vec2(dx, dy));\n\t\t\t}\n\t\t}\n\t}\n\treturn $amount*rv/pixels+0.5;\n}",
+# "name": "Curvature",
+# "outputs": [
+# {
+# "f": "0.5*($(name_uv)_emboss.x+$(name_uv)_emboss.y)",
+# "type": "f"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 9,
+# "first": 6,
+# "label": "Size",
+# "last": 12,
+# "name": "size",
+# "type": "size"
+# },
+# {
+# "control": "None",
+# "default": 1,
+# "label": "Amount",
+# "max": 10,
+# "min": 0,
+# "name": "amount",
+# "step": 0.1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 1,
+# "label": "Width",
+# "max": 5,
+# "min": 1,
+# "name": "width",
+# "step": 1,
+# "type": "float"
+# }
+# ]
+# },
+# "type": "shader"
+# },
+# {
+# "name": "598_2",
+# "node_position": {
+# "x": -100.207932,
+# "y": 638.757874
+# },
+# "parameters": {
+# "amount": 1,
+# "size": 11,
+# "width": 2
+# },
+# "shader_model": {
+# "code": "vec2 $(name_uv)_emboss = $(name)_fct($uv);",
+# "global": "",
+# "inputs": [
+# {
+# "default": "vec3(0.0)",
+# "function": true,
+# "label": "",
+# "name": "in",
+# "type": "rgb"
+# }
+# ],
+# "instance": "vec2 $(name)_fct(vec2 uv) {\n\tfloat pixels = max(1.0, $width);\n\tfloat e = 1.0/$size;\n\tvec2 rv = vec2(0.0);\n\tfor (float dx = -pixels; dx <= pixels; dx += 1.0) {\n\t\tfor (float dy = -pixels; dy <= pixels; dy += 1.0) {\n\t\t\tif (abs(dx) > 0.5 || abs(dy) > 0.5) {\n\t\t\t\trv += $in(uv+e*vec2(dx, dy)).xy*cos(vec2(atan(dy, dx))-vec2(0.0, 0.5)*3.14159265359)/length(vec2(dx, dy));\n\t\t\t}\n\t\t}\n\t}\n\treturn $amount*rv/pixels+0.5;\n}",
+# "name": "Curvature",
+# "outputs": [
+# {
+# "f": "0.5*($(name_uv)_emboss.x+$(name_uv)_emboss.y)",
+# "type": "f"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 9,
+# "first": 6,
+# "label": "Size",
+# "last": 12,
+# "name": "size",
+# "type": "size"
+# },
+# {
+# "control": "None",
+# "default": 1,
+# "label": "Amount",
+# "max": 10,
+# "min": 0,
+# "name": "amount",
+# "step": 0.1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 1,
+# "label": "Width",
+# "max": 5,
+# "min": 1,
+# "name": "width",
+# "step": 1,
+# "type": "float"
+# }
+# ]
+# },
+# "type": "shader"
+# },
+# {
+# "name": "598_4",
+# "node_position": {
+# "x": -97.532082,
+# "y": 755.803345
+# },
+# "parameters": {
+# "amount": 1,
+# "size": 11,
+# "width": 4
+# },
+# "shader_model": {
+# "code": "vec2 $(name_uv)_emboss = $(name)_fct($uv);",
+# "global": "",
+# "inputs": [
+# {
+# "default": "vec3(0.0)",
+# "function": true,
+# "label": "",
+# "name": "in",
+# "type": "rgb"
+# }
+# ],
+# "instance": "vec2 $(name)_fct(vec2 uv) {\n\tfloat pixels = max(1.0, $width);\n\tfloat e = 1.0/$size;\n\tvec2 rv = vec2(0.0);\n\tfor (float dx = -pixels; dx <= pixels; dx += 1.0) {\n\t\tfor (float dy = -pixels; dy <= pixels; dy += 1.0) {\n\t\t\tif (abs(dx) > 0.5 || abs(dy) > 0.5) {\n\t\t\t\trv += $in(uv+e*vec2(dx, dy)).xy*cos(vec2(atan(dy, dx))-vec2(0.0, 0.5)*3.14159265359)/length(vec2(dx, dy));\n\t\t\t}\n\t\t}\n\t}\n\treturn $amount*rv/pixels+0.5;\n}",
+# "name": "Curvature",
+# "outputs": [
+# {
+# "f": "0.5*($(name_uv)_emboss.x+$(name_uv)_emboss.y)",
+# "type": "f"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 9,
+# "first": 6,
+# "label": "Size",
+# "last": 12,
+# "name": "size",
+# "type": "size"
+# },
+# {
+# "control": "None",
+# "default": 1,
+# "label": "Amount",
+# "max": 10,
+# "min": 0,
+# "name": "amount",
+# "step": 0.1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 1,
+# "label": "Width",
+# "max": 5,
+# "min": 1,
+# "name": "width",
+# "step": 1,
+# "type": "float"
+# }
+# ]
+# },
+# "type": "shader"
+# },
+# {
+# "name": "598_5",
+# "node_position": {
+# "x": -95.713867,
+# "y": 877.621521
+# },
+# "parameters": {
+# "amount": 1,
+# "size": 11,
+# "width": 8
+# },
+# "shader_model": {
+# "code": "vec2 $(name_uv)_emboss = $(name)_fct($uv);",
+# "global": "",
+# "inputs": [
+# {
+# "default": "vec3(0.0)",
+# "function": true,
+# "label": "",
+# "name": "in",
+# "type": "rgb"
+# }
+# ],
+# "instance": "vec2 $(name)_fct(vec2 uv) {\n\tfloat pixels = max(1.0, $width);\n\tfloat e = 1.0/$size;\n\tvec2 rv = vec2(0.0);\n\tfor (float dx = -pixels; dx <= pixels; dx += 1.0) {\n\t\tfor (float dy = -pixels; dy <= pixels; dy += 1.0) {\n\t\t\tif (abs(dx) > 0.5 || abs(dy) > 0.5) {\n\t\t\t\trv += $in(uv+e*vec2(dx, dy)).xy*cos(vec2(atan(dy, dx))-vec2(0.0, 0.5)*3.14159265359)/length(vec2(dx, dy));\n\t\t\t}\n\t\t}\n\t}\n\treturn $amount*rv/pixels+0.5;\n}",
+# "name": "Curvature",
+# "outputs": [
+# {
+# "f": "0.5*($(name_uv)_emboss.x+$(name_uv)_emboss.y)",
+# "type": "f"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 9,
+# "first": 6,
+# "label": "Size",
+# "last": 12,
+# "name": "size",
+# "type": "size"
+# },
+# {
+# "control": "None",
+# "default": 1,
+# "label": "Amount",
+# "max": 10,
+# "min": 0,
+# "name": "amount",
+# "step": 0.1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 1,
+# "label": "Width",
+# "max": 5,
+# "min": 1,
+# "name": "width",
+# "step": 1,
+# "type": "float"
+# }
+# ]
+# },
+# "type": "shader"
+# },
+# {
+# "name": "598_6",
+# "node_position": {
+# "x": -92.077492,
+# "y": 992.848633
+# },
+# "parameters": {
+# "amount": 1,
+# "size": 11,
+# "width": 16
+# },
+# "shader_model": {
+# "code": "vec2 $(name_uv)_emboss = $(name)_fct($uv);",
+# "global": "",
+# "inputs": [
+# {
+# "default": "vec3(0.0)",
+# "function": true,
+# "label": "",
+# "name": "in",
+# "type": "rgb"
+# }
+# ],
+# "instance": "vec2 $(name)_fct(vec2 uv) {\n\tfloat pixels = max(1.0, $width);\n\tfloat e = 1.0/$size;\n\tvec2 rv = vec2(0.0);\n\tfor (float dx = -pixels; dx <= pixels; dx += 1.0) {\n\t\tfor (float dy = -pixels; dy <= pixels; dy += 1.0) {\n\t\t\tif (abs(dx) > 0.5 || abs(dy) > 0.5) {\n\t\t\t\trv += $in(uv+e*vec2(dx, dy)).xy*cos(vec2(atan(dy, dx))-vec2(0.0, 0.5)*3.14159265359)/length(vec2(dx, dy));\n\t\t\t}\n\t\t}\n\t}\n\treturn $amount*rv/pixels+0.5;\n}",
+# "name": "Curvature",
+# "outputs": [
+# {
+# "f": "0.5*($(name_uv)_emboss.x+$(name_uv)_emboss.y)",
+# "type": "f"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 9,
+# "first": 6,
+# "label": "Size",
+# "last": 12,
+# "name": "size",
+# "type": "size"
+# },
+# {
+# "control": "None",
+# "default": 1,
+# "label": "Amount",
+# "max": 10,
+# "min": 0,
+# "name": "amount",
+# "step": 0.1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 1,
+# "label": "Width",
+# "max": 5,
+# "min": 1,
+# "name": "width",
+# "step": 1,
+# "type": "float"
+# }
+# ]
+# },
+# "type": "shader"
+# },
+# {
+# "connections": [
+# {
+# "from": "buffer_2",
+# "from_port": 0,
+# "to": "fast_blur_shader",
+# "to_port": 0
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 0,
+# "to": "buffer_2",
+# "to_port": 0
+# },
+# {
+# "from": "fast_blur_shader",
+# "from_port": 0,
+# "to": "gen_outputs",
+# "to_port": 0
+# }
+# ],
+# "label": "Fast Blur",
+# "longdesc": "",
+# "name": "fast_blur",
+# "node_position": {
+# "x": 167.483093,
+# "y": 509.757843
+# },
+# "nodes": [
+# {
+# "name": "fast_blur_shader",
+# "node_position": {
+# "x": -168,
+# "y": 120
+# },
+# "parameters": {
+# "quality": 1,
+# "sigma": 2
+# },
+# "type": "fast_blur_shader"
+# },
+# {
+# "name": "buffer_2",
+# "node_position": {
+# "x": -187,
+# "y": 61.5
+# },
+# "parameters": {
+# "size": 11
+# },
+# "type": "buffer",
+# "version": 1
+# },
+# {
+# "name": "gen_inputs",
+# "node_position": {
+# "x": -602,
+# "y": 91.75
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "name": "port0",
+# "type": "f"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "gen_outputs",
+# "node_position": {
+# "x": 88,
+# "y": 61.75
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "name": "port0",
+# "type": "rgba"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "gen_parameters",
+# "node_position": {
+# "x": -254.5,
+# "y": -122.5
+# },
+# "parameters": {
+# "param0": 11,
+# "param1": 2,
+# "param2": 1
+# },
+# "type": "remote",
+# "widgets": [
+# {
+# "label": "Resolution",
+# "linked_widgets": [
+# {
+# "node": "buffer_2",
+# "widget": "size"
+# }
+# ],
+# "name": "param0",
+# "type": "linked_control"
+# },
+# {
+# "label": "Sigma",
+# "linked_widgets": [
+# {
+# "node": "fast_blur_shader",
+# "widget": "sigma"
+# }
+# ],
+# "name": "param1",
+# "type": "linked_control"
+# },
+# {
+# "label": "Quality",
+# "linked_widgets": [
+# {
+# "node": "fast_blur_shader",
+# "widget": "quality"
+# }
+# ],
+# "name": "param2",
+# "type": "linked_control"
+# }
+# ]
+# }
+# ],
+# "parameters": {
+# "param0": 11,
+# "param1": 2,
+# "param2": 1
+# },
+# "shortdesc": "",
+# "type": "graph"
+# },
+# {
+# "name": "fast_blur_2",
+# "node_position": {
+# "x": 167.156082,
+# "y": 638.560974
+# },
+# "parameters": {
+# "param0": 11,
+# "param1": 5,
+# "param2": 1
+# },
+# "type": "fast_blur"
+# },
+# {
+# "name": "fast_blur_3",
+# "node_position": {
+# "x": 171.701691,
+# "y": 756.742798
+# },
+# "parameters": {
+# "param0": 11,
+# "param1": 8,
+# "param2": 1
+# },
+# "type": "fast_blur"
+# },
+# {
+# "name": "fast_blur_4",
+# "node_position": {
+# "x": 167.377045,
+# "y": 877.651917
+# },
+# "parameters": {
+# "param0": 11,
+# "param1": 16,
+# "param2": 1
+# },
+# "type": "fast_blur"
+# },
+# {
+# "name": "fast_blur_5",
+# "node_position": {
+# "x": 170.104279,
+# "y": 992.197327
+# },
+# "parameters": {
+# "param0": 11,
+# "param1": 34,
+# "param2": 1
+# },
+# "type": "fast_blur"
+# },
+# {
+# "name": "buffer_2",
+# "node_position": {
+# "x": -426.44928,
+# "y": 678.75
+# },
+# "parameters": {
+# "filter": false,
+# "mipmap": false,
+# "size": 11
+# },
+# "type": "buffer",
+# "version": 2
+# }
+# ],
+# "parameters": {
+# "param0": 11,
+# "param2": 1
+# },
+# "shortdesc": "Smooth Curvature",
+# "type": "graph"
+#}
+
+#----------------------
+#smooth_curvature2.mmg
+
+#{
+# "connections": [
+# {
+# "from": "gen_inputs",
+# "from_port": 0,
+# "to": "buffer",
+# "to_port": 0
+# },
+# {
+# "from": "buffer",
+# "from_port": 0,
+# "to": "switch",
+# "to_port": 1
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 0,
+# "to": "switch",
+# "to_port": 0
+# },
+# {
+# "from": "598",
+# "from_port": 0,
+# "to": "buffer_2",
+# "to_port": 0
+# },
+# {
+# "from": "buffer_2",
+# "from_port": 0,
+# "to": "switch_2",
+# "to_port": 1
+# },
+# {
+# "from": "598",
+# "from_port": 0,
+# "to": "switch_2",
+# "to_port": 0
+# },
+# {
+# "from": "switch_2",
+# "from_port": 0,
+# "to": "gen_outputs",
+# "to_port": 0
+# },
+# {
+# "from": "switch",
+# "from_port": 0,
+# "to": "598",
+# "to_port": 0
+# }
+# ],
+# "label": "Smooth Curvature 2",
+# "longdesc": "",
+# "name": "smooth_curvature2",
+# "node_position": {
+# "x": 0,
+# "y": 0
+# },
+# "nodes": [
+# {
+# "name": "buffer",
+# "node_position": {
+# "x": 300.603302,
+# "y": -549.522034
+# },
+# "parameters": {
+# "lod": 0,
+# "size": 10
+# },
+# "type": "buffer"
+# },
+# {
+# "name": "598",
+# "node_position": {
+# "x": 286.999847,
+# "y": -359.903259
+# },
+# "parameters": {
+# "quality": 4,
+# "radius": 1,
+# "strength": 1
+# },
+# "shader_model": {
+# "code": "",
+# "global": "",
+# "inputs": [
+# {
+# "default": "0.5",
+# "function": true,
+# "label": "",
+# "name": "in",
+# "type": "f"
+# }
+# ],
+# "instance": "float $(name)_curve( vec2 p, vec2 o ){\n\tfloat a = $in(p+o);\n\tfloat b = $in(p-o);\n\tfloat c = $in(p+o*vec2(1.0,-1.0));\n\tfloat d = $in(p-o*vec2(1.0,-1.0));\n\treturn -a - b - c - d;\n}\n\nfloat $(name)_curvature_map(vec2 p, float r, float q){\n\tfloat s = r/q;\n\tfloat H = $in(p)*4.0;\n\tfloat v = 0.0;\n\tvec2 o;\n\tfor( o.x = 0.0; o.x < q; o.x++ ){\n\t\tfor( o.y = 0.0; o.y < q; o.y++ ){\n\t\t\tfloat c = $(name)_curve(p, o*s);\n\t\t\tv += (H + c) * ((r-length(o*s)) / r);\n\t\t}\n\t}\n\treturn v/(q*q);\n}\n\nfloat $(name)_curvature(vec2 uv, float quality, float strength, float radius) {\n\tfloat c = $(name)_curvature_map(uv, 0.050 * radius, quality)*strength / radius;\n\treturn 0.5 + c;\n}",
+# "name": "Smooth Curvature",
+# "outputs": [
+# {
+# "f": "$(name)_curvature($uv, $quality, $strength, $radius)",
+# "type": "f"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 4,
+# "label": "Quality",
+# "longdesc": "How many times the input is sampled to generate the curvature map",
+# "max": 16,
+# "min": 2,
+# "name": "quality",
+# "shortdesc": "Quality",
+# "step": 1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 1,
+# "label": "Strength",
+# "longdesc": "The intensity of the curvature map",
+# "max": 2,
+# "min": 0,
+# "name": "strength",
+# "shortdesc": "Strength",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 1,
+# "label": "Radius",
+# "longdesc": "The radius of the smoothing of the curvature effect",
+# "max": 2,
+# "min": 0,
+# "name": "radius",
+# "shortdesc": "Radius",
+# "step": 0.01,
+# "type": "float"
+# }
+# ],
+# "shortdesc": "Smooth Curvature"
+# },
+# "type": "shader"
+# },
+# {
+# "name": "gen_parameters",
+# "node_position": {
+# "x": 242.146149,
+# "y": -788.088806
+# },
+# "parameters": {
+# "param0": 10,
+# "param1": 4,
+# "param2": 1,
+# "param3": 1,
+# "param4": 1
+# },
+# "type": "remote",
+# "widgets": [
+# {
+# "label": "Size",
+# "linked_widgets": [
+# {
+# "node": "buffer",
+# "widget": "size"
+# },
+# {
+# "node": "buffer_2",
+# "widget": "size"
+# }
+# ],
+# "longdesc": "The resolution of the curvature map if buffer is used",
+# "name": "param0",
+# "shortdesc": "Size",
+# "type": "linked_control"
+# },
+# {
+# "label": "Quality",
+# "linked_widgets": [
+# {
+# "node": "598",
+# "widget": "quality"
+# }
+# ],
+# "longdesc": "How many times the input is sampled to generate the curvature map",
+# "name": "param1",
+# "shortdesc": "Quality",
+# "type": "linked_control"
+# },
+# {
+# "label": "Strength",
+# "linked_widgets": [
+# {
+# "node": "598",
+# "widget": "strength"
+# }
+# ],
+# "longdesc": "The intensity of the curvature map",
+# "name": "param2",
+# "shortdesc": "Strength",
+# "type": "linked_control"
+# },
+# {
+# "label": "Radius",
+# "linked_widgets": [
+# {
+# "node": "598",
+# "widget": "radius"
+# }
+# ],
+# "longdesc": "The radius of the smoothing of the curvature effect",
+# "name": "param3",
+# "shortdesc": "Radius",
+# "type": "linked_control"
+# },
+# {
+# "configurations": {
+# "False": [
+# {
+# "node": "switch",
+# "value": 0,
+# "widget": "source"
+# },
+# {
+# "node": "switch_2",
+# "value": 0,
+# "widget": "source"
+# }
+# ],
+# "True": [
+# {
+# "node": "switch",
+# "value": 1,
+# "widget": "source"
+# },
+# {
+# "node": "switch_2",
+# "value": 1,
+# "widget": "source"
+# }
+# ]
+# },
+# "label": "Buffer",
+# "linked_widgets": [
+# {
+# "node": "switch",
+# "widget": "source"
+# },
+# {
+# "node": "switch_2",
+# "widget": "source"
+# }
+# ],
+# "longdesc": "When set, a buffer is used to sample the input before the normal map filter",
+# "name": "param4",
+# "shortdesc": "Buffer",
+# "type": "config_control"
+# }
+# ]
+# },
+# {
+# "name": "gen_inputs",
+# "node_position": {
+# "x": -135.453888,
+# "y": -518.927429
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "longdesc": "The input height map",
+# "name": "Heightmap",
+# "shortdesc": "Input",
+# "type": "f"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "gen_outputs",
+# "node_position": {
+# "x": 586.203247,
+# "y": -534.919678
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "longdesc": "Shows the generated curvature map",
+# "name": "Curvature",
+# "shortdesc": "Output",
+# "type": "f"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "switch",
+# "node_position": {
+# "x": 310.739746,
+# "y": -451.658417
+# },
+# "parameters": {
+# "choices": 2,
+# "outputs": 1,
+# "source": 1
+# },
+# "type": "switch"
+# },
+# {
+# "name": "buffer_2",
+# "node_position": {
+# "x": 293.839874,
+# "y": -225.201691
+# },
+# "parameters": {
+# "lod": 0,
+# "size": 10
+# },
+# "type": "buffer"
+# },
+# {
+# "name": "switch_2",
+# "node_position": {
+# "x": 312.239838,
+# "y": -129.465912
+# },
+# "parameters": {
+# "choices": 2,
+# "outputs": 1,
+# "source": 1
+# },
+# "type": "switch"
+# },
+# {
+# "name": "blend",
+# "node_position": {
+# "x": 802.064697,
+# "y": -277.727295
+# },
+# "parameters": {
+# "amount": 0.5,
+# "blend_type": 0
+# },
+# "shader_model": {
+# "code": "vec4 $(name_uv)_s1 = $s1($uv);\nvec4 $(name_uv)_s2 = $s2($uv);\nfloat $(name_uv)_a = $amount*$a($uv);\n",
+# "global": "vec3 blend_normal(vec2 uv, vec3 c1, vec3 c2, float opacity) {\n\treturn opacity*c1 + (1.0-opacity)*c2;\n}\n\nvec3 blend_dissolve(vec2 uv, vec3 c1, vec3 c2, float opacity) {\n\tif (rand(uv) < opacity) {\n\t\treturn c1;\n\t} else {\n\t\treturn c2;\n\t}\n}\n\nvec3 blend_multiply(vec2 uv, vec3 c1, vec3 c2, float opacity) {\n\treturn opacity*c1*c2 + (1.0-opacity)*c2;\n}\n\nvec3 blend_screen(vec2 uv, vec3 c1, vec3 c2, float opacity) {\n\treturn opacity*(1.0-(1.0-c1)*(1.0-c2)) + (1.0-opacity)*c2;\n}\n\nfloat blend_overlay_f(float c1, float c2) {\n\treturn (c1 < 0.5) ? (2.0*c1*c2) : (1.0-2.0*(1.0-c1)*(1.0-c2));\n}\n\nvec3 blend_overlay(vec2 uv, vec3 c1, vec3 c2, float opacity) {\n\treturn opacity*vec3(blend_overlay_f(c1.x, c2.x), blend_overlay_f(c1.y, c2.y), blend_overlay_f(c1.z, c2.z)) + (1.0-opacity)*c2;\n}\n\nvec3 blend_hard_light(vec2 uv, vec3 c1, vec3 c2, float opacity) {\n\treturn opacity*0.5*(c1*c2+blend_overlay(uv, c1, c2, 1.0)) + (1.0-opacity)*c2;\n}\n\nfloat blend_soft_light_f(float c1, float c2) {\n\treturn (c2 < 0.5) ? (2.0*c1*c2+c1*c1*(1.0-2.0*c2)) : 2.0*c1*(1.0-c2)+sqrt(c1)*(2.0*c2-1.0);\n}\n\nvec3 blend_soft_light(vec2 uv, vec3 c1, vec3 c2, float opacity) {\n\treturn opacity*vec3(blend_soft_light_f(c1.x, c2.x), blend_soft_light_f(c1.y, c2.y), blend_soft_light_f(c1.z, c2.z)) + (1.0-opacity)*c2;\n}\n\nfloat blend_burn_f(float c1, float c2) {\n\treturn (c1==0.0)?c1:max((1.0-((1.0-c2)/c1)),0.0);\n}\n\nvec3 blend_burn(vec2 uv, vec3 c1, vec3 c2, float opacity) {\n\treturn opacity*vec3(blend_burn_f(c1.x, c2.x), blend_burn_f(c1.y, c2.y), blend_burn_f(c1.z, c2.z)) + (1.0-opacity)*c2;\n}\n\nfloat blend_dodge_f(float c1, float c2) {\n\treturn (c1==1.0)?c1:min(c2/(1.0-c1),1.0);\n}\n\nvec3 blend_dodge(vec2 uv, vec3 c1, vec3 c2, float opacity) {\n\treturn opacity*vec3(blend_dodge_f(c1.x, c2.x), blend_dodge_f(c1.y, c2.y), blend_dodge_f(c1.z, c2.z)) + (1.0-opacity)*c2;\n}\n\nvec3 blend_lighten(vec2 uv, vec3 c1, vec3 c2, float opacity) {\n\treturn opacity*max(c1, c2) + (1.0-opacity)*c2;\n}\n\nvec3 blend_darken(vec2 uv, vec3 c1, vec3 c2, float opacity) {\n\treturn opacity*min(c1, c2) + (1.0-opacity)*c2;\n}\n\nvec3 blend_difference(vec2 uv, vec3 c1, vec3 c2, float opacity) {\n\treturn opacity*clamp(c2-c1, vec3(0.0), vec3(1.0)) + (1.0-opacity)*c2;\n}\n",
+# "inputs": [
+# {
+# "default": "vec4(round($uv.x) , 1.0, 1.0, 1.0)",
+# "label": "Source1",
+# "longdesc": "The foreground input",
+# "name": "s1",
+# "shortdesc": "Foreground",
+# "type": "rgba"
+# },
+# {
+# "default": "vec4(1.0, $uv.y, 1.0, 1.0)",
+# "label": "Source2",
+# "longdesc": "The background input",
+# "name": "s2",
+# "shortdesc": "Background",
+# "type": "rgba"
+# },
+# {
+# "default": "1.0",
+# "label": "Opacity",
+# "longdesc": "The optional opacity mask",
+# "name": "a",
+# "shortdesc": "Mask",
+# "type": "f"
+# }
+# ],
+# "instance": "",
+# "longdesc": "Blends its input, using an optional mask",
+# "name": "Blend",
+# "outputs": [
+# {
+# "longdesc": "Shows the result of the blend operation",
+# "rgba": "vec4(blend_$blend_type($uv, $(name_uv)_s1.rgb, $(name_uv)_s2.rgb, $(name_uv)_a*$(name_uv)_s1.a), min(1.0, $(name_uv)_s2.a+$(name_uv)_a*$(name_uv)_s1.a))",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 0,
+# "label": "",
+# "longdesc": "The algorithm used to blend the inputs",
+# "name": "blend_type",
+# "shortdesc": "Blend mode",
+# "type": "enum",
+# "values": [
+# {
+# "name": "Normal",
+# "value": "normal"
+# },
+# {
+# "name": "Dissolve",
+# "value": "dissolve"
+# },
+# {
+# "name": "Multiply",
+# "value": "multiply"
+# },
+# {
+# "name": "Screen",
+# "value": "screen"
+# },
+# {
+# "name": "Overlay",
+# "value": "overlay"
+# },
+# {
+# "name": "Hard Light",
+# "value": "hard_light"
+# },
+# {
+# "name": "Soft Light",
+# "value": "soft_light"
+# },
+# {
+# "name": "Burn",
+# "value": "burn"
+# },
+# {
+# "name": "Dodge",
+# "value": "dodge"
+# },
+# {
+# "name": "Lighten",
+# "value": "lighten"
+# },
+# {
+# "name": "Darken",
+# "value": "darken"
+# },
+# {
+# "name": "Difference",
+# "value": "difference"
+# }
+# ]
+# },
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "3:",
+# "longdesc": "The opacity of the blend operation",
+# "max": 1,
+# "min": 0,
+# "name": "amount",
+# "shortdesc": "Opacity",
+# "step": 0.01,
+# "type": "float"
+# }
+# ],
+# "shortdesc": "Blend"
+# },
+# "type": "shader"
+# }
+# ],
+# "parameters": {
+# "param0": 10,
+# "param1": 4,
+# "param2": 1,
+# "param3": 1,
+# "param4": 1
+# },
+# "shortdesc": "Smooth Curvature",
+# "type": "graph"
+#}
+
+#----------------------
+#supersample.mmg
+#A filter that samples sub-pixel details to make them visible
+
+# "inputs": [
+# {
+# "default": "vec4(1.0, 1.0, 1.0, 1.0)",
+# "function": true,
+# "label": "",
+# "longdesc": "The input image",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "rgba"
+# }
+# ],
+# "instance": "vec4 supersample_$(name)(vec2 uv, float size, int count, float width) {\n\tvec4 rv = vec4(0.0);\n\tvec2 step_size = vec2(width)/size/float(count);\n\tuv -= vec2(0.5)/size;\n\tfor (int x = 0; x < count; ++x) {\n\t\tfor (int y = 0; y < count; ++y) {\n\t\t\trv += $in(uv+(vec2(float(x), float(y))+vec2(0.5))*step_size);\n\t\t}\n\t}\n\treturn rv/float(count*count);\n}",
+# "outputs": [
+# {
+# "longdesc": "Shows the supersampled image. Due to the performance cost of this node, it is recommended to connect a buffer directly to this output.",
+# "rgba": "supersample_$(name)($uv, $size, int($count), $width)",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 10,
+# "first": 4,
+# "label": "Size",
+# "last": 12,
+# "longdesc": "The resolution of the output",
+# "name": "size",
+# "shortdesc": "Size",
+# "type": "size"
+# },
+# {
+# "control": "None",
+# "default": 2,
+# "label": "Count",
+# "longdesc": "The number of samples on each axis. High values will badly impact performances.",
+# "max": 5,
+# "min": 2,
+# "name": "count",
+# "shortdesc": "Count",
+# "step": 1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 1,
+# "label": "Width",
+# "longdesc": "The width of the sampled area. Setting this value higher than 1 will sample neighbouring pixels and antialias the result.",
+# "max": 2,
+# "min": 1,
+# "name": "width",
+# "shortdesc": "Width",
+# "step": 0.01,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#swap_channels.mmg
+#Swaps the channels of its RGBA input
+
+# "inputs": [
+# {
+# "default": "vec4(1.0)",
+# "label": "",
+# "longdesc": "The input RGBA image",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "rgba"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "The output RGBA image",
+# "rgba": "vec4($out_r,$out_g,$out_b,$out_a)",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 2,
+# "label": "R",
+# "longdesc": "The input channel to be assigned to the Red channel",
+# "name": "out_r",
+# "shortdesc": "Red",
+# "type": "enum",
+# "values": [
+# {
+# "name": "0",
+# "value": "0.0"
+# },
+# {
+# "name": "1",
+# "value": "1.0"
+# },
+# {
+# "name": "R",
+# "value": "$in($uv).r"
+# },
+# {
+# "name": "-R",
+# "value": "1.0-$in($uv).r"
+# },
+# {
+# "name": "G",
+# "value": "$in($uv).g"
+# },
+# {
+# "name": "-G",
+# "value": "1.0-$in($uv).g"
+# },
+# {
+# "name": "B",
+# "value": "$in($uv).b"
+# },
+# {
+# "name": "-B",
+# "value": "1.0-$in($uv).b"
+# },
+# {
+# "name": "A",
+# "value": "$in($uv).a"
+# },
+# {
+# "name": "-A",
+# "value": "1.0-$in($uv).a"
+# }
+# ]
+# },
+# {
+# "default": 4,
+# "label": "G",
+# "longdesc": "The input channel to be assigned to the Green channel",
+# "name": "out_g",
+# "shortdesc": "Green",
+# "type": "enum",
+# "values": [
+# {
+# "name": "0",
+# "value": "0.0"
+# },
+# {
+# "name": "1",
+# "value": "1.0"
+# },
+# {
+# "name": "R",
+# "value": "$in($uv).r"
+# },
+# {
+# "name": "-R",
+# "value": "1.0-$in($uv).r"
+# },
+# {
+# "name": "G",
+# "value": "$in($uv).g"
+# },
+# {
+# "name": "-G",
+# "value": "1.0-$in($uv).g"
+# },
+# {
+# "name": "B",
+# "value": "$in($uv).b"
+# },
+# {
+# "name": "-B",
+# "value": "1.0-$in($uv).b"
+# },
+# {
+# "name": "A",
+# "value": "$in($uv).a"
+# },
+# {
+# "name": "-A",
+# "value": "1.0-$in($uv).a"
+# }
+# ]
+# },
+# {
+# "default": 6,
+# "label": "B",
+# "longdesc": "The input channel to be assigned to the Blue channel",
+# "name": "out_b",
+# "shortdesc": "Blue",
+# "type": "enum",
+# "values": [
+# {
+# "name": "0",
+# "value": "0.0"
+# },
+# {
+# "name": "1",
+# "value": "1.0"
+# },
+# {
+# "name": "R",
+# "value": "$in($uv).r"
+# },
+# {
+# "name": "-R",
+# "value": "1.0-$in($uv).r"
+# },
+# {
+# "name": "G",
+# "value": "$in($uv).g"
+# },
+# {
+# "name": "-G",
+# "value": "1.0-$in($uv).g"
+# },
+# {
+# "name": "B",
+# "value": "$in($uv).b"
+# },
+# {
+# "name": "-B",
+# "value": "1.0-$in($uv).b"
+# },
+# {
+# "name": "A",
+# "value": "$in($uv).a"
+# },
+# {
+# "name": "-A",
+# "value": "1.0-$in($uv).a"
+# }
+# ]
+# },
+# {
+# "default": 8,
+# "label": "A",
+# "longdesc": "The input channel to be assigned to the Alpha channel",
+# "name": "out_a",
+# "shortdesc": "Alpha",
+# "type": "enum",
+# "values": [
+# {
+# "name": "0",
+# "value": "0.0"
+# },
+# {
+# "name": "1",
+# "value": "1.0"
+# },
+# {
+# "name": "R",
+# "value": "$in($uv).r"
+# },
+# {
+# "name": "-R",
+# "value": "1.0-$in($uv).r"
+# },
+# {
+# "name": "G",
+# "value": "$in($uv).g"
+# },
+# {
+# "name": "-G",
+# "value": "1.0-$in($uv).g"
+# },
+# {
+# "name": "B",
+# "value": "$in($uv).b"
+# },
+# {
+# "name": "-B",
+# "value": "1.0-$in($uv).b"
+# },
+# {
+# "name": "A",
+# "value": "$in($uv).a"
+# },
+# {
+# "name": "-A",
+# "value": "1.0-$in($uv).a"
+# }
+# ]
+# }
+# ],
+
+#----------------------
+#math_v3.mmg
+#Performs a math operation using its inputs or parameter values
+
+# "code": "vec3 $(name_uv)_clamp_false = $op;\nvec3 $(name_uv)_clamp_true = clamp($(name_uv)_clamp_false, vec3(0.0), vec3(1.0));\n",
+# "inputs": [
+# {
+# "default": "vec3($d_in1_x, $d_in1_y, $d_in1_z)",
+# "label": "2:A",
+# "longdesc": "The A operand",
+# "name": "in1",
+# "shortdesc": "A",
+# "type": "rgb"
+# },
+# {
+# "default": "vec3($d_in2_x, $d_in2_y, $d_in2_z)",
+# "label": "B",
+# "longdesc": "The B operand",
+# "name": "in2",
+# "shortdesc": "B",
+# "type": "rgb"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "Shows a greyscale image of the result",
+# "rgb": "$(name_uv)_clamp_$clamp",
+# "shortdesc": "Output",
+# "type": "rgb"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 19,
+# "label": "",
+# "longdesc": "The operation to be performed",
+# "name": "op",
+# "shortdesc": "Operation",
+# "type": "enum",
+# "values": [
+# {
+# "name": "A+B",
+# "value": "$in1($uv)+$in2($uv)"
+# },
+# {
+# "name": "A-B",
+# "value": "$in1($uv)-$in2($uv)"
+# },
+# {
+# "name": "A*B",
+# "value": "$in1($uv)*$in2($uv)"
+# },
+# {
+# "name": "A/B",
+# "value": "$in1($uv)/$in2($uv)"
+# },
+# {
+# "name": "log(A)",
+# "value": "log($in1($uv))"
+# },
+# {
+# "name": "log2(A)",
+# "value": "log2($in1($uv))"
+# },
+# {
+# "name": "pow(A, B)",
+# "value": "pow($in1($uv),$in2($uv))"
+# },
+# {
+# "name": "abs(A)",
+# "value": "abs($in1($uv))"
+# },
+# {
+# "name": "round(A)",
+# "value": "round($in1($uv))"
+# },
+# {
+# "name": "floor(A)",
+# "value": "floor($in1($uv))"
+# },
+# {
+# "name": "ceil(A)",
+# "value": "ceil($in1($uv))"
+# },
+# {
+# "name": "trunc(A)",
+# "value": "trunc($in1($uv))"
+# },
+# {
+# "name": "fract(A)",
+# "value": "fract($in1($uv))"
+# },
+# {
+# "name": "min(A, B)",
+# "value": "min($in1($uv),$in2($uv))"
+# },
+# {
+# "name": "max(A, B)",
+# "value": "max($in1($uv),$in2($uv))"
+# },
+# {
+# "name": "A Vector3:
+ var K : Color = Color(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
+
+ var p : Color
+
+ if c.y < c.z:
+ p = Color(c.z, c.y, K.a, K.b)
+ else:
+ p = Color(c.y, c.z, K.r, K.g);
+
+ var q : Color
+
+ if c.x < p.r:
+ q = Color(p.r, p.g, p.a, c.x)
+ else:
+ q = Color(c.x, p.g, p.b, p.r);
+
+ var d : float = q.r - min(q.a, q.g);
+ var e : float = 1.0e-10;
+
+ return Vector3(abs(q.b + (q.a - q.g) / (6.0 * d + e)), d / (q.r + e), q.r);
+
+#vec3 hsv_to_rgb(vec3 c) {
+# vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
+# vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
+# return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
+#}
+
+static func hsv_to_rgb(c : Vector3) -> Vector3:
+ var K : Color = Color(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
+
+ var p : Vector3 = Commons.absv3(Commons.fractv3(Vector3(c.x, c.x, c.x) + Vector3(K.r, K.g, K.b)) * 6.0 - Vector3(K.a, K.a, K.a));
+
+ return c.z * lerp(Vector3(K.r, K.r, K.r), Commons.clampv3(p - Vector3(K.r, K.r, K.r), Vector3(), Vector3(1, 1, 1)), c.y);
+
+#adjust_hsv.mmg
+
+#vec4 $(name_uv)_rbga = $in($(uv));
+#vec3 $(name_uv)_hsv = rgb_to_hsv($(name_uv)_rbga.rgb);
+#$(name_uv)_hsv.x += $(hue);
+#$(name_uv)_hsv.y = clamp($(name_uv)_hsv.y*$(saturation), 0.0, 1.0);
+#$(name_uv)_hsv.z = clamp($(name_uv)_hsv.z*$(value), 0.0, 1.0);
+
+#hue, min: -0.5, max: 0.5, step: 0, default: 0
+#saturation, min: 0, max: 2, step: 0, default: 1
+#value, min: 0, max: 2, step: 0, default: 1
+
+#output: vec4(hsv_to_rgb($(name_uv)_hsv), $(name_uv)_rbga.a)
+
+static func adjust_hsv(color : Color, hue : float, saturation : float, value : float) -> Color:
+ var hsv : Vector3 = rgb_to_hsv(Vector3(color.r, color.g, color.b));
+
+ hsv.x += hue
+ hsv.y = clamp(hsv.y * saturation, 0.0, 1.0)
+ hsv.z = clamp(hsv.z * value, 0.0, 1.0)
+
+ var h : Vector3 = hsv_to_rgb(hsv)
+
+ return Color(h.x, h.y, h.z, color.a);
+
+#brightness, min: -1, max: 1, step: 0.01, default: 0
+#contrast, min: -1, max: 1, step: 0.01, default: 1
+
+#input: default: vec4(0.5 ,0.5, 0.5, 1.0) -> img
+
+#output: vec4(clamp($in($uv).rgb*$contrast+vec3($brightness)+0.5-$contrast*0.5, vec3(0.0), vec3(1.0)), $in($uv).a)
+
+static func brightness_contrast(color : Color, brightness : float, contrast : float) -> Color:
+ #output: vec4(clamp( $in($uv).rgb*$contrast + vec3($brightness) + 0.5 - $contrast*0.5, vec3(0.0), vec3(1.0)), $in($uv).a)
+
+ var cvv : Vector3 = Vector3(color.r, color.g, color.b) * contrast
+
+ var cv : Vector3 = cvv + Vector3(brightness, brightness, brightness) + Vector3(0.5, 0.5, 0.5) - Vector3(contrast, contrast, contrast) * 0.5
+
+ var v : Vector3 = Commons.clampv3(cv, Vector3(), Vector3(1, 1, 1))
+
+ return Color(v.x, v.y, v.z, color.a);
+
+#greyscale
+
+#input: default: vec3(0.0). (Image)
+#output: gs_$mode($in($uv))
+#mode: enum: Lightness, Average, Luminosity, Min, Max. default: 4
+
+#float gs_min(vec3 c) {
+# return min(c.r, min(c.g, c.b));
+#}
+
+static func grayscale_min(c : Vector3) -> float:
+ return min(c.x, min(c.y, c.z));
+
+#float gs_max(vec3 c) {
+# return max(c.r, max(c.g, c.b));
+#}
+
+static func grayscale_max(c : Vector3) -> float:
+ return max(c.x, max(c.y, c.z));
+
+#float gs_lightness(vec3 c) {
+# return 0.5*(max(c.r, max(c.g, c.b)) + min(c.r, min(c.g, c.b)));
+#}
+
+static func grayscale_lightness(c : Vector3) -> float:
+ return 0.5*(max(c.x, max(c.y, c.z)) + min(c.x, min(c.y, c.z)));
+
+#float gs_average(vec3 c) {
+# return 0.333333333333*(c.r + c.g + c.b);
+#}
+
+static func grayscale_average(c : Vector3) -> float:
+ return 0.333333333333*(c.x + c.y + c.z);
+
+#float gs_luminosity(vec3 c) {
+# return 0.21 * c.r + 0.72 * c.g + 0.07 * c.b;
+#}
+
+static func grayscale_luminosity(c : Vector3) -> float:
+ return 0.21 * c.x + 0.72 * c.y + 0.07 * c.z;
+
+static func invert(color : Color) -> Color:
+ return Color(1.0 - color.r, 1.0 - color.g, 1.0 - color.b, color.a);
+
+#vec3 blend_normal(vec2 uv, vec3 c1, vec3 c2, float opacity) {\n\t
+# return opacity*c1 + (1.0-opacity)*c2;\n
+#}
+
+static func blend_normal(uv : Vector2, c1 : Vector3, c2 : Vector3, opacity : float) -> Vector3:
+ return opacity * c1 + (1.0 - opacity) * c2
+
+#vec3 blend_dissolve(vec2 uv, vec3 c1, vec3 c2, float opacity) {\n\t
+# if (rand(uv) < opacity) {\n\t\t
+# return c1;\n\t
+# } else {\n\t\t
+# return c2;\n\t
+# }\n
+#}
+
+static func blend_dissolve(uv : Vector2, c1 : Vector3, c2 : Vector3, opacity : float) -> Vector3:
+ if (Commons.rand2(uv) < Vector2(opacity, opacity)):
+ return c1
+ else:
+ return c2
+
+#vec3 blend_multiply(vec2 uv, vec3 c1, vec3 c2, float opacity) {\n\t
+# return opacity*c1*c2 + (1.0-opacity)*c2;\n
+#}
+
+static func blend_multiply(uv : Vector2, c1 : Vector3, c2 : Vector3, opacity : float) -> Vector3:
+ return opacity * c1 * c2 + (1.0 - opacity) * c2
+
+#vec3 blend_screen(vec2 uv, vec3 c1, vec3 c2, float opacity) {\n\t
+# return opacity*(1.0-(1.0-c1)*(1.0-c2)) + (1.0-opacity)*c2;\n
+#}
+
+static func blend_screen(uv : Vector2, c1 : Vector3, c2 : Vector3, opacity : float) -> Vector3:
+ return opacity * (Vector3(1, 1, 1) - (Vector3(1, 1, 1) - c1) * (Vector3(1, 1, 1) - c2)) + (1.0 - opacity) * c2
+
+#float blend_overlay_f(float c1, float c2) {\n\t
+# return (c1 < 0.5) ? (2.0*c1*c2) : (1.0-2.0*(1.0-c1)*(1.0-c2));\n
+#}
+
+static func blend_overlay_f(c1 : float, c2 : float) -> float:
+ if (c1 < 0.5):
+ return (2.0 * c1 * c2)
+ else:
+ return (1.0 - 2.0 * (1.0 - c1) * (1.0 - c2))
+
+#vec3 blend_overlay(vec2 uv, vec3 c1, vec3 c2, float opacity) {\n\t
+# return opacity*vec3(blend_overlay_f(c1.x, c2.x), blend_overlay_f(c1.y, c2.y), blend_overlay_f(c1.z, c2.z)) + (1.0-opacity)*c2;\n
+#}
+
+static func blend_overlay(uv : Vector2, c1 : Vector3, c2 : Vector3, opacity : float) -> Vector3:
+ return opacity * Vector3(blend_overlay_f(c1.x, c2.x), blend_overlay_f(c1.y, c2.y), blend_overlay_f(c1.z, c2.z)) + (1.0 - opacity) * c2
+
+#vec3 blend_hard_light(vec2 uv, vec3 c1, vec3 c2, float opacity) {\n\t
+# return opacity*0.5*(c1*c2+blend_overlay(uv, c1, c2, 1.0)) + (1.0-opacity)*c2;\n
+#}
+
+static func blend_hard_light(uv : Vector2, c1 : Vector3, c2 : Vector3, opacity : float) -> Vector3:
+ return opacity * 0.5 * (c1 * c2 + blend_overlay(uv, c1, c2, 1.0)) + (1.0 - opacity) * c2
+
+#float blend_soft_light_f(float c1, float c2) {\n\t
+# return (c2 < 0.5) ? (2.0*c1*c2+c1*c1*(1.0-2.0*c2)) : 2.0*c1*(1.0-c2)+sqrt(c1)*(2.0*c2-1.0);\n
+#}
+
+static func blend_soft_light_f(c1 : float, c2 : float) -> float:
+ if (c2 < 0.5):
+ return (2.0 * c1 * c2 + c1 * c1 * (1.0 - 2.0 * c2))
+ else:
+ return 2.0 * c1 * (1.0 - c2) + sqrt(c1) * (2.0 * c2 - 1.0)
+
+#vec3 blend_soft_light(vec2 uv, vec3 c1, vec3 c2, float opacity) {\n\t
+# return opacity*vec3(blend_soft_light_f(c1.x, c2.x), blend_soft_light_f(c1.y, c2.y), blend_soft_light_f(c1.z, c2.z)) + (1.0-opacity)*c2;\n
+#}
+
+static func blend_soft_light(uv : Vector2, c1 : Vector3, c2 : Vector3, opacity : float) -> Vector3:
+ return opacity * Vector3(blend_soft_light_f(c1.x, c2.x), blend_soft_light_f(c1.y, c2.y), blend_soft_light_f(c1.z, c2.z)) + (1.0 - opacity) * c2
+
+#float blend_burn_f(float c1, float c2) {\n\t
+# return (c1==0.0)?c1:max((1.0-((1.0-c2)/c1)),0.0);\n
+#}
+
+static func blend_burn_f(c1 : float, c2 : float) -> float:
+ if (c1 == 0.0):
+ return c1
+ else:
+ return max((1.0 - ((1.0 - c2) / c1)), 0.0)
+
+#vec3 blend_burn(vec2 uv, vec3 c1, vec3 c2, float opacity) {\n\t
+# return opacity*vec3(blend_burn_f(c1.x, c2.x), blend_burn_f(c1.y, c2.y), blend_burn_f(c1.z, c2.z)) + (1.0-opacity)*c2;
+#}
+
+static func blend_burn(uv : Vector2, c1 : Vector3, c2 : Vector3, opacity : float) -> Vector3:
+ return opacity * Vector3(blend_burn_f(c1.x, c2.x), blend_burn_f(c1.y, c2.y), blend_burn_f(c1.z, c2.z)) + (1.0 - opacity) * c2
+
+#float blend_dodge_f(float c1, float c2) {\n\t
+# return (c1==1.0)?c1:min(c2/(1.0-c1),1.0);\n
+#}
+
+static func blend_dodge_f(c1 : float, c2 : float) -> float:
+ if (c1==1.0):
+ return c1
+ else:
+ return min(c2 / (1.0 - c1), 1.0)
+
+#vec3 blend_dodge(vec2 uv, vec3 c1, vec3 c2, float opacity) {\n\t
+# return opacity*vec3(blend_dodge_f(c1.x, c2.x), blend_dodge_f(c1.y, c2.y), blend_dodge_f(c1.z, c2.z)) + (1.0-opacity)*c2;\n
+#}
+
+static func blend_dodge(uv : Vector2, c1 : Vector3, c2 : Vector3, opacity : float) -> Vector3:
+ return opacity * Vector3(blend_dodge_f(c1.x, c2.x), blend_dodge_f(c1.y, c2.y), blend_dodge_f(c1.z, c2.z)) + (1.0 - opacity) * c2
+
+#vec3 blend_lighten(vec2 uv, vec3 c1, vec3 c2, float opacity) {\n\t
+# return opacity*max(c1, c2) + (1.0-opacity)*c2;\n
+#}
+
+static func blend_lighten(uv : Vector2, c1 : Vector3, c2 : Vector3, opacity : float) -> Vector3:
+ return opacity * Commons.maxv3(c1, c2) + (1.0 - opacity) * c2
+
+#vec3 blend_darken(vec2 uv, vec3 c1, vec3 c2, float opacity) {\n\t
+# return opacity*min(c1, c2) + (1.0-opacity)*c2;\n
+#}
+
+static func blend_darken(uv : Vector2, c1 : Vector3, c2 : Vector3, opacity : float) -> Vector3:
+ return opacity * Commons.minv3(c1, c2) + (1.0 - opacity) * c2
+
+#vec3 blend_difference(vec2 uv, vec3 c1, vec3 c2, float opacity) {\n\t
+# return opacity*clamp(c2-c1, vec3(0.0), vec3(1.0)) + (1.0-opacity)*c2;\n
+#}
+
+static func blend_difference(uv : Vector2, c1 : Vector3, c2 : Vector3, opacity : float) -> Vector3:
+ return opacity * Commons.clampv3(c2 - c1, Vector3(), Vector3(1, 1, 1)) + (1.0 - opacity) * c2
+
+#vec4 adjust_levels(vec4 input, vec4 in_min, vec4 in_mid, vec4 in_max, vec4 out_min, vec4 out_max) {\n\t
+# input = clamp((input-in_min)/(in_max-in_min), 0.0, 1.0);\n\t
+# in_mid = (in_mid-in_min)/(in_max-in_min);\n\t
+# vec4 dark = step(in_mid, input);\n\t
+#
+# input = 0.5*mix(input/(in_mid), 1.0+(input-in_mid)/(1.0-in_mid), dark);\n\t
+# return out_min+input*(out_max-out_min);\n
+#}
+
diff --git a/modules/material_maker/mat_maker_gd/nodes/common/gradients.gd b/modules/material_maker/mat_maker_gd/nodes/common/gradients.gd
new file mode 100644
index 000000000..9c40cc6a2
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/common/gradients.gd
@@ -0,0 +1,225 @@
+tool
+extends Reference
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+
+#note: data : PoolRealArray -> pos, r, g, b, a, pos, r, g, b, a ....
+
+#gradient.mmg
+
+#float $(name_uv)_r = 0.5+(cos($rotate*0.01745329251)*($uv.x-0.5)+sin($rotate*0.01745329251)*($uv.y-0.5))/(cos(abs(mod($rotate, 90.0)-45.0)*0.01745329251)*1.41421356237);"
+
+#output: $gradient(fract($(name_uv)_r*$repeat))
+
+#repeat: default: 1, min: 1, max : 32, step: 1
+#rotate: default: 0, min: -180, max: 180, step: 0.1
+
+#default: "interpolation": 1,
+# "points": [{"a": 1,"b": 0,"g": 0,"pos": 0,"r": 0},{"a": 1,"b": 1,"g": 1,"pos": 1,"r": 1} ],
+
+#radial_gradient.mmg
+
+#output: $gradient(fract($repeat*1.41421356237*length(fract($uv)-vec2(0.5, 0.5))))
+
+#repeat: default: 1, min: 1, max : 32, step: 1
+
+#circular_gradient.mmg
+
+#output: gradient(fract($repeat*0.15915494309*atan($uv.y-0.5, $uv.x-0.5)))
+
+#repeat: default: 1, min: 1, max : 32, step: 1
+
+#gradient.gd
+
+static func radial_gradient_type_1(uv : Vector2, repeat : float, data : PoolRealArray) -> Color:
+ return gradient_type_1(Commons.fractf(repeat * 1.41421356237* (Commons.fractv2(uv) - Vector2(0.5, 0.5)).length()), data)
+
+static func radial_gradient_type_2(uv : Vector2, repeat : float, data : PoolRealArray) -> Color:
+ return gradient_type_2(Commons.fractf(repeat * 1.41421356237* (Commons.fractv2(uv) - Vector2(0.5, 0.5)).length()), data)
+
+static func radial_gradient_type_3(uv : Vector2, repeat : float, data : PoolRealArray) -> Color:
+ return gradient_type_3(Commons.fractf(repeat * 1.41421356237* (Commons.fractv2(uv) - Vector2(0.5, 0.5)).length()), data)
+
+static func radial_gradient_type_4(uv : Vector2, repeat : float, data : PoolRealArray) -> Color:
+ return gradient_type_4(Commons.fractf(repeat * 1.41421356237* (Commons.fractv2(uv) - Vector2(0.5, 0.5)).length()), data)
+
+
+
+static func normal_gradient_type_1(uv : Vector2, repeat : float, rotate : float, data : PoolRealArray) -> Color:
+ var rr : float = 0.5+(cos(rotate*0.01745329251)*(uv.x-0.5)+sin(rotate*0.01745329251)*(uv.y-0.5))/(cos(abs(Commons.modf(rotate, 90.0)-45.0)*0.01745329251)*1.41421356237);
+ return gradient_type_1(Commons.fractf(rr * repeat), data)
+
+static func normal_gradient_type_2(uv : Vector2, repeat : float, rotate : float, data : PoolRealArray) -> Color:
+ var rr : float = 0.5+(cos(rotate*0.01745329251)*(uv.x-0.5)+sin(rotate*0.01745329251)*(uv.y-0.5))/(cos(abs(Commons.modf(rotate, 90.0)-45.0)*0.01745329251)*1.41421356237);
+ return gradient_type_2(Commons.fractf(rr * repeat), data)
+
+static func normal_gradient_type_3(uv : Vector2, repeat : float, rotate : float, data : PoolRealArray) -> Color:
+ var rr : float = 0.5+(cos(rotate*0.01745329251)*(uv.x-0.5)+sin(rotate*0.01745329251)*(uv.y-0.5))/(cos(abs(Commons.modf(rotate, 90.0)-45.0)*0.01745329251)*1.41421356237);
+ return gradient_type_3(Commons.fractf(rr * repeat), data)
+
+static func normal_gradient_type_4(uv : Vector2, repeat : float, rotate : float, data : PoolRealArray) -> Color:
+ var rr : float = 0.5+(cos(rotate*0.01745329251)*(uv.x-0.5)+sin(rotate*0.01745329251)*(uv.y-0.5))/(cos(abs(Commons.modf(rotate, 90.0)-45.0)*0.01745329251)*1.41421356237);
+ return gradient_type_4(Commons.fractf(rr * repeat), data)
+
+
+
+static func circular_gradient_type_1(uv : Vector2, repeat : float, data : PoolRealArray) -> Color:
+ return gradient_type_1(Commons.fractf(repeat * 0.15915494309 * atan2((uv.y - 0.5), uv.x - 0.5)), data)
+
+static func circular_gradient_type_2(uv : Vector2, repeat : float, data : PoolRealArray) -> Color:
+ return gradient_type_2(Commons.fractf(repeat * 0.15915494309 * atan2((uv.y - 0.5), uv.x - 0.5)), data)
+
+static func circular_gradient_type_3(uv : Vector2, repeat : float, data : PoolRealArray) -> Color:
+ return gradient_type_3(Commons.fractf(repeat * 0.15915494309 * atan2((uv.y - 0.5), uv.x - 0.5)), data)
+
+static func circular_gradient_type_4(uv : Vector2, repeat : float, data : PoolRealArray) -> Color:
+ return gradient_type_4(Commons.fractf(repeat * 0.15915494309 * atan2((uv.y - 0.5), uv.x - 0.5)), data)
+
+
+static func gradient_type_1(x : float, data : PoolRealArray) -> Color:
+ if data.size() % 5 != 0 || data.size() == 0:
+ return Color()
+
+ for i in range(0, data.size() - 5, 5):
+ if x < 0.5 * (data[i] + data[i + 5]):
+ return Color(data[i + 1], data[i + 2], data[i + 3], data[i + 4])
+
+ var ds = data.size() - 5
+ return Color(data[ds + 1], data[ds + 2], data[ds + 3], data[ds + 4])
+
+static func gradient_type_2(x : float, data : PoolRealArray) -> Color:
+ if data.size() % 5 != 0 || data.size() == 0:
+ return Color()
+
+ for i in range(0, data.size(), 5):
+ if x < data[i]:
+ if i == 0:
+ return Color(data[i + 1], data[i + 2], data[i + 3], data[i + 4])
+
+ var cprev : Color = Color(data[i - 4], data[i - 3], data[i - 2], data[i - 1])
+ var ccurr : Color = Color(data[i + 1], data[i + 2], data[i + 3], data[i + 4])
+ return lerp(cprev, ccurr, (x - data[i - 5]) / (data[i] - data[i - 5]));
+
+ var ds = data.size() - 5
+ return Color(data[ds + 1], data[ds + 2], data[ds + 3], data[ds + 4])
+
+static func gradient_type_3(x : float, data : PoolRealArray) -> Color:
+ if data.size() % 5 != 0 || data.size() == 0:
+ return Color()
+
+ for i in range(0, data.size(), 5):
+ if x < data[i]:
+ if i == 0:
+ return Color(data[i + 1], data[i + 2], data[i + 3], data[i + 4])
+
+ var cprev : Color = Color(data[i - 4], data[i - 3], data[i - 2], data[i - 1])
+ var ccurr : Color = Color(data[i + 1], data[i + 2], data[i + 3], data[i + 4])
+ return lerp(cprev, ccurr, 0.5 - 0.5 * cos(3.14159265359 * ((x - data[i - 5]) / (data[i] - data[i - 5]))))
+
+ var ds = data.size() - 5
+ return Color(data[ds + 1], data[ds + 2], data[ds + 3], data[ds + 4])
+
+static func get_data_color(index : int, data : PoolRealArray) -> Color:
+ var i : int = index * 5
+
+ return Color(data[i + 1], data[i + 2],data[i + 3], data[i + 4])
+
+static func get_data_pos(index : int, data : PoolRealArray) -> float:
+ return data[index * 5]
+
+static func gradient_type_4(x : float, data : PoolRealArray) -> Color:
+ if data.size() % 5 != 0 || data.size() == 0:
+ return Color()
+
+ var ds : int = data.size() / 5
+ var s : int = ds - 1
+
+ for i in range(0, s):
+ if x < get_data_pos(i, data):
+ if i == 0:
+ return get_data_color(i, data)
+
+# var dx : String = "(x-%s)/(%s-%s)" % [ pv(name, i), pv(name, i+1), pv(name, i) ]
+ var dx : float = (x - get_data_pos(i, data))/(get_data_pos(i + 1, data) - get_data_pos(i, data))
+# var b : String = "mix(%s, %s, %s)" % [ pc(name, i), pc(name, i+1), dx ]
+ var b : Color = lerp(get_data_color(i - 1, data), get_data_color(i - 1, data), dx)
+
+ if i == 1:
+# var c : String = "mix(%s, %s, (x-%s)/(%s-%s))" % [ pc(name, i+1), pc(name, i+2), pv(name, i+1), pv(name, i+2), pv(name, i+1) ]
+ var c : Color = lerp(get_data_color(i + 1, data), get_data_color(i + 2, data), (x - get_data_pos(i + 1, data))/(get_data_pos(i + 2, data) - get_data_pos(i + 1, data)))
+# shader += " return mix("+c+", "+b+", 1.0-0.5*"+dx+");\n"
+ return lerp(c, b, 1.0 - 0.5 * dx)
+
+# var a : String = "mix(%s, %s, (x-%s)/(%s-%s))" % [ pc(name, i-1), pc(name, i), pv(name, i-1), pv(name, i), pv(name, i-1) ]
+ var a : Color = lerp(get_data_color(i - 1, data), get_data_color(i, data), (x - get_data_pos(i - 1, data)) / (get_data_pos(i, data) - get_data_pos(i - 1, data)))
+
+# if i < s-1:
+ if i < s - 1:
+# var c : String = "mix(%s, %s, (x-%s)/(%s-%s))" % [ pc(name, i+1), pc(name, i+2), pv(name, i+1), pv(name, i+2), pv(name, i+1) ]
+ var c : Color = lerp(get_data_color(i + 1, data), get_data_color(i + 2, data), (x - get_data_pos(i + 1, data)) / (get_data_pos(i + 2, data) - get_data_pos(i + 1, data)))
+# var ac : String = "mix("+a+", "+c+", 0.5-0.5*cos(3.14159265359*"+dx+"))"
+ var ac : Color = lerp(a, c, 0.5-0.5*cos(3.14159265359 * dx))
+# shader += " return 0.5*("+b+" + "+ac+");\n"
+ var dt : Color = b + ac
+
+ dt.r *= 0.5
+ dt.g *= 0.5
+ dt.b *= 0.5
+ dt.a = clamp(0, 1, dt.a)
+
+ return dt
+# else
+ else:
+# shader += " return mix("+a+", "+b+", 0.5+0.5*"+dx+");\n"
+ return lerp(a, b, 0.5 + 0.5 * dx)
+
+ return get_data_color(ds - 1, data)
+
+#todo make it selectable
+static func gradient_type_5(x : float, data : PoolRealArray) -> Color:
+ if data.size() % 5 != 0 || data.size() == 0:
+ return Color()
+
+ var ds : int = data.size() / 5
+ var s : int = ds - 1
+
+ for i in range(0, s):
+ if x < get_data_pos(i, data):
+ if i == 0:
+ return get_data_color(i, data)
+
+# var dx : String = "(x-%s)/(%s-%s)" % [ pv(name, i), pv(name, i+1), pv(name, i) ]
+ var dx : float = (x - get_data_pos(i, data))/(get_data_pos(i + 1, data) - get_data_pos(i, data))
+# var b : String = "mix(%s, %s, %s)" % [ pc(name, i), pc(name, i+1), dx ]
+ var b : Color = lerp(get_data_color(i - 1, data), get_data_color(i - 1, data), dx)
+
+ if i == 1:
+# var c : String = "mix(%s, %s, (x-%s)/(%s-%s))" % [ pc(name, i+1), pc(name, i+2), pv(name, i+1), pv(name, i+2), pv(name, i+1) ]
+ var c : Color = lerp(get_data_color(i + 1, data), get_data_color(i + 2, data), (x - get_data_pos(i + 1, data))/(get_data_pos(i + 2, data) - get_data_pos(i + 1, data)))
+# shader += " return mix("+c+", "+b+", 1.0-0.5*"+dx+");\n"
+ return lerp(c, b, 1.0 - 0.5 * dx)
+
+# var a : String = "mix(%s, %s, (x-%s)/(%s-%s))" % [ pc(name, i-1), pc(name, i), pv(name, i-1), pv(name, i), pv(name, i-1) ]
+ var a : Color = lerp(get_data_color(i - 1, data), get_data_color(i, data), (x - get_data_pos(i - 1, data)) / (get_data_pos(i, data) - get_data_pos(i - 1, data)))
+
+# if i < s-1:
+ if i < s - 1:
+# var c : String = "mix(%s, %s, (x-%s)/(%s-%s))" % [ pc(name, i+1), pc(name, i+2), pv(name, i+1), pv(name, i+2), pv(name, i+1) ]
+ var c : Color = lerp(get_data_color(i+1, data), get_data_color(i+2, data), (x - get_data_pos(i + 1, data)) / (get_data_pos(i + 2, data) - get_data_pos(i + 1, data)))
+# var ac : String = "mix("+a+", "+c+", 0.5-0.5*cos(3.14159265359*"+dx+"))"
+ var ac : Color = lerp(a, c, 0.5-0.5*cos(3.14159265359 * dx))
+# shader += " return 0.5*("+b+" + "+ac+");\n"
+ var dt : Color = b + ac
+
+ dt.r *= 0.5
+ dt.g *= 0.5
+ dt.b *= 0.5
+ dt.a = clamp(0, 1, dt.a)
+
+ return dt
+# else
+ else:
+# shader += " return mix("+a+", "+b+", 0.5+0.5*"+dx+");\n"
+ return lerp(a, b, 0.5 + 0.5 * dx)
+
+ return get_data_color(ds - 1, data)
diff --git a/modules/material_maker/mat_maker_gd/nodes/common/mwf.gd b/modules/material_maker/mat_maker_gd/nodes/common/mwf.gd
new file mode 100644
index 000000000..7226ea677
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/common/mwf.gd
@@ -0,0 +1,705 @@
+tool
+extends Reference
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+
+#----------------------
+#mwf_create_map.mmg
+#Creates a workflow map using a heightmap and an optional seed map. The workflow map contains height information as well as orientation and a seed for random offset for the material it will be applied to.
+
+# "inputs": [
+# {
+# "default": "1.0",
+# "label": "",
+# "longdesc": "The input height map",
+# "name": "h",
+# "shortdesc": "Height",
+# "type": "f"
+# },
+# {
+# "default": "0.0",
+# "label": "",
+# "longdesc": "The input offset seed map",
+# "name": "o",
+# "shortdesc": "Offset",
+# "type": "f"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "The generated workflow map, to be connected to a MixMap or an ApplyMap node",
+# "rgb": "vec3($height*$h($uv), $angle*0.00277777777+0.5, rand(vec2(float($seed)+$o($uv))))",
+# "shortdesc": "Output",
+# "type": "rgb"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 1,
+# "label": "Height",
+# "longdesc": "The maximum height of the workflow map, used as multiplier for the input height map",
+# "max": 1,
+# "min": 0,
+# "name": "height",
+# "shortdesc": "Height",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0,
+# "label": "Angle",
+# "longdesc": "The angle stored in the workflow map",
+# "max": 180,
+# "min": -180,
+# "name": "angle",
+# "shortdesc": "Angle",
+# "step": 0.1,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#mwf_mix_maps.mmg
+#Mixes up to 4 workflow maps, to be used with the same base material
+
+# "inputs": [
+# {
+# "default": "vec3(0.0)",
+# "label": "",
+# "longdesc": "The first workflow map",
+# "name": "in1",
+# "shortdesc": "Input1",
+# "type": "rgb"
+# },
+# {
+# "default": "vec3(0.0)",
+# "label": "",
+# "longdesc": "The second workflow map",
+# "name": "in2",
+# "shortdesc": "Input2",
+# "type": "rgb"
+# },
+# {
+# "default": "vec3(0.0)",
+# "label": "",
+# "longdesc": "The third input map",
+# "name": "in3",
+# "shortdesc": "Input3",
+# "type": "rgb"
+# },
+# {
+# "default": "vec3(0.0)",
+# "label": "",
+# "longdesc": "The fourth input map",
+# "name": "in4",
+# "shortdesc": "Input4",
+# "type": "rgb"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "Generates a merged workflow map",
+# "rgb": "matmap_mix(matmap_mix($in1($uv), $in2($uv)), matmap_mix($in3($uv), $in4($uv)))",
+# "shortdesc": "Output",
+# "type": "rgb"
+# }
+# ],
+
+#----------------------
+#mwf_map.mmg
+#"Applies a workflow map to a base material, and generates height information as well as PBR channels for the result.\nThe height input must be connected to a Create Map or Mix Maps node. The other inputs must be connected to a base material.\nThe outputs must be connected to the Mix or the Output node, or a workflow filter node.
+
+# "code": "float $(name_uv)_angle = 6.28318530718*($map($uv).y-0.5);\nvec2 $(name_uv)_uv = matmap_uv($uv, $(name_uv)_angle, $map($uv).z);\n",
+# "inputs": [
+# {
+# "default": "vec3(1.0, 0.5, 0.0)",
+# "label": "Map",
+# "longdesc": "The input workflow map",
+# "name": "map",
+# "shortdesc": "Map",
+# "type": "rgb"
+# },
+# {
+# "default": "vec3(0.0)",
+# "group_size": 4,
+# "label": "Albedo",
+# "longdesc": "The Albedo channel of the input base material",
+# "name": "mat1",
+# "shortdesc": "Albedo",
+# "type": "rgb"
+# },
+# {
+# "default": "vec3(0.0)",
+# "label": "ORM",
+# "longdesc": "The ambient occlusion, roughness and metallic channels of the input material",
+# "name": "mat2",
+# "shortdesc": "ORM",
+# "type": "rgb"
+# },
+# {
+# "default": "vec3(0.0)",
+# "label": "Emission",
+# "longdesc": "The emission channel of the input material",
+# "name": "mat3",
+# "shortdesc": "Emission",
+# "type": "rgb"
+# },
+# {
+# "default": "vec3(0.5, 0.5, 1.0)",
+# "label": "Normal",
+# "longdesc": "The normal map of the input material",
+# "name": "mat4",
+# "shortdesc": "Normal",
+# "type": "rgb"
+# }
+# ],
+# "outputs": [
+# {
+# "f": "$map($uv).x",
+# "group_size": 5,
+# "longdesc": "The height map of the result",
+# "shortdesc": "Height",
+# "type": "f"
+# },
+# {
+# "longdesc": "The albedo channel of the result",
+# "rgb": "$mat1($(name_uv)_uv)",
+# "shortdesc": "Albedo",
+# "type": "rgb"
+# },
+# {
+# "longdesc": "The ambient occlusion, roughness and metallic channels of the result",
+# "rgb": "$mat2($(name_uv)_uv)",
+# "shortdesc": "ORM",
+# "type": "rgb"
+# },
+# {
+# "longdesc": "The emission channel of the result",
+# "rgb": "$mat3($(name_uv)_uv)",
+# "shortdesc": "Emission",
+# "type": "rgb"
+# },
+# {
+# "longdesc": "The normal map of the result",
+# "rgb": "matmap_rotate_nm($mat4($(name_uv)_uv), -$(name_uv)_angle)",
+# "shortdesc": "Normal",
+# "type": "rgb"
+# }
+# ],
+
+#----------------------
+#mwf_mix.mmg
+#Combines the outputs of 2 mapped base materials (keeping the \"highest\" material).
+
+# "code": "float $(name_uv)_a1 = step($h1($uv), $h2($uv));",
+# "inputs": [
+# {
+# "default": "0.0",
+# "group_size": 5,
+# "label": "Height 1",
+# "longdesc": "The height map of the first input",
+# "name": "h1",
+# "shortdesc": "Height1",
+# "type": "f"
+# },
+# {
+# "default": "vec3(0.0)",
+# "label": "Albedo 1",
+# "longdesc": "The albedo channel of the first input",
+# "name": "c1",
+# "shortdesc": "Albedo1",
+# "type": "rgb"
+# },
+# {
+# "default": "vec3(0.0)",
+# "label": "ORM 1",
+# "longdesc": "The ambient occlusion, roughness and metallic channels of the first input",
+# "name": "orm1",
+# "shortdesc": "ORM1",
+# "type": "rgb"
+# },
+# {
+# "default": "vec3(0.0)",
+# "label": "Emission 1",
+# "longdesc": "The emission channel of the first input",
+# "name": "em1",
+# "shortdesc": "Emission1",
+# "type": "rgb"
+# },
+# {
+# "default": "vec3(0.5, 0.5, 1.0)",
+# "label": "Normal 1",
+# "longdesc": "The normal map of the first input",
+# "name": "nm1",
+# "shortdesc": "Normal1",
+# "type": "rgb"
+# },
+# {
+# "default": "0.0",
+# "group_size": 5,
+# "label": "Height 2",
+# "longdesc": "The height map of the second input",
+# "name": "h2",
+# "shortdesc": "Height2",
+# "type": "f"
+# },
+# {
+# "default": "vec3(0.0)",
+# "label": "Albedo 2",
+# "longdesc": "The albedo channel of the second input",
+# "name": "c2",
+# "shortdesc": "Albedo2",
+# "type": "rgb"
+# },
+# {
+# "default": "vec3(0.0)",
+# "label": "ORM 2",
+# "longdesc": "The ambient occlusion, roughness and metallic channels of the second input",
+# "name": "orm2",
+# "shortdesc": "ORM2",
+# "type": "rgb"
+# },
+# {
+# "default": "vec3(0.0)",
+# "label": "Emission 2",
+# "longdesc": "The emission channel of the second input",
+# "name": "em2",
+# "shortdesc": "Emission2",
+# "type": "rgb"
+# },
+# {
+# "default": "vec3(0.5, 0.5, 1.0)",
+# "label": "Normal 2",
+# "longdesc": "The normal map of the second input",
+# "name": "nm2",
+# "shortdesc": "Normal2",
+# "type": "rgb"
+# }
+# ],
+# "outputs": [
+# {
+# "f": "max($h1($uv), $h2($uv))",
+# "group_size": 5,
+# "longdesc": "Generates the height of the result",
+# "shortdesc": "Height",
+# "type": "f"
+# },
+# {
+# "longdesc": "Shows the output albedo channel",
+# "rgb": "mix($c1($uv), $c2($uv), $(name_uv)_a1)",
+# "shortdesc": "Albedo",
+# "type": "rgb"
+# },
+# {
+# "longdesc": "Shows the output ambient occlusion, roughness and metallic channels",
+# "rgb": "mix($orm1($uv), $orm2($uv), $(name_uv)_a1)",
+# "shortdesc": "ORM",
+# "type": "rgb"
+# },
+# {
+# "longdesc": "Shows the output emission channel",
+# "rgb": "mix($em1($uv), $em2($uv), $(name_uv)_a1)",
+# "shortdesc": "Emission",
+# "type": "rgb"
+# },
+# {
+# "longdesc": "Shows the output normal map",
+# "rgb": "mix($nm1($uv), $nm2($uv), $(name_uv)_a1)",
+# "shortdesc": "Normal",
+# "type": "rgb"
+# }
+# ],
+
+
+#----------------------
+#mwf_output.mmg
+
+#{
+# "connections": [
+# {
+# "from": "colorize_3",
+# "from_port": 0,
+# "to": "gen_outputs",
+# "to_port": 6
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 0,
+# "to": "colorize_3",
+# "to_port": 0
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 0,
+# "to": "occlusion",
+# "to_port": 0
+# },
+# {
+# "from": "occlusion",
+# "from_port": 0,
+# "to": "gen_outputs",
+# "to_port": 5
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 2,
+# "to": "decompose",
+# "to_port": 0
+# },
+# {
+# "from": "decompose",
+# "from_port": 1,
+# "to": "gen_outputs",
+# "to_port": 2
+# },
+# {
+# "from": "decompose",
+# "from_port": 2,
+# "to": "gen_outputs",
+# "to_port": 1
+# },
+# {
+# "from": "blend_2",
+# "from_port": 0,
+# "to": "gen_outputs",
+# "to_port": 4
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 1,
+# "to": "gen_outputs",
+# "to_port": 0
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 3,
+# "to": "gen_outputs",
+# "to_port": 3
+# },
+# {
+# "from": "brightness_contrast",
+# "from_port": 0,
+# "to": "blend_2",
+# "to_port": 0
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 4,
+# "to": "brightness_contrast",
+# "to_port": 0
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 0,
+# "to": "normal_map_2",
+# "to_port": 0
+# },
+# {
+# "from": "normal_map_2",
+# "from_port": 0,
+# "to": "blend_2",
+# "to_port": 1
+# }
+# ],
+# "label": "Output",
+# "longdesc": "Converts a workflow mapped material (from an Apply Map or a Mix node) for a Material node",
+# "name": "mwf_output",
+# "node_position": {
+# "x": 0,
+# "y": 0
+# },
+# "nodes": [
+# {
+# "name": "colorize_3",
+# "node_position": {
+# "x": -939.637451,
+# "y": 871.842407
+# },
+# "parameters": {
+# "gradient": {
+# "interpolation": 1,
+# "points": [
+# {
+# "a": 1,
+# "b": 1,
+# "g": 1,
+# "pos": 0,
+# "r": 1
+# },
+# {
+# "a": 1,
+# "b": 0,
+# "g": 0,
+# "pos": 1,
+# "r": 0
+# }
+# ],
+# "type": "Gradient"
+# }
+# },
+# "type": "colorize"
+# },
+# {
+# "name": "occlusion",
+# "node_position": {
+# "x": -994.845825,
+# "y": 786.968262
+# },
+# "parameters": {
+# "param0": 10,
+# "param2": 1
+# },
+# "type": "occlusion"
+# },
+# {
+# "name": "decompose",
+# "node_position": {
+# "x": -924.371338,
+# "y": 570.25
+# },
+# "parameters": {
+#
+# },
+# "type": "decompose"
+# },
+# {
+# "name": "blend_2",
+# "node_position": {
+# "x": -931.305542,
+# "y": 677.328491
+# },
+# "parameters": {
+# "amount": 1,
+# "blend_type": 4
+# },
+# "type": "blend"
+# },
+# {
+# "name": "gen_inputs",
+# "node_position": {
+# "x": -1626.805542,
+# "y": 608.758606
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 5,
+# "name": "Height",
+# "type": "f"
+# },
+# {
+# "group_size": 0,
+# "name": "Albedo",
+# "type": "rgb"
+# },
+# {
+# "group_size": 0,
+# "name": "ORM",
+# "type": "rgb"
+# },
+# {
+# "group_size": 0,
+# "name": "Emission",
+# "type": "rgb"
+# },
+# {
+# "group_size": 0,
+# "name": "Normal",
+# "type": "rgb"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "gen_outputs",
+# "node_position": {
+# "x": -635.305542,
+# "y": 597.758606
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 7,
+# "longdesc": "",
+# "name": "Albedo",
+# "shortdesc": "Albedo",
+# "type": "rgb"
+# },
+# {
+# "group_size": 0,
+# "longdesc": "",
+# "name": "Metallic",
+# "shortdesc": "Metallic",
+# "type": "f"
+# },
+# {
+# "group_size": 0,
+# "longdesc": "",
+# "name": "Roughness",
+# "shortdesc": "Roughness",
+# "type": "f"
+# },
+# {
+# "group_size": 0,
+# "longdesc": "",
+# "name": "Emission",
+# "shortdesc": "Emission",
+# "type": "rgb"
+# },
+# {
+# "group_size": 0,
+# "longdesc": "",
+# "name": "Normal",
+# "shortdesc": "Normal",
+# "type": "rgb"
+# },
+# {
+# "group_size": 0,
+# "longdesc": "",
+# "name": "Occlusion",
+# "shortdesc": "Occlusion",
+# "type": "f"
+# },
+# {
+# "group_size": 0,
+# "longdesc": "",
+# "name": "Depth",
+# "shortdesc": "Depth",
+# "type": "f"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "gen_parameters",
+# "node_position": {
+# "x": -1104.881836,
+# "y": 425.25
+# },
+# "parameters": {
+# "param0": 1,
+# "param2": 1
+# },
+# "type": "remote",
+# "widgets": [
+# {
+# "label": "Occlusion",
+# "linked_widgets": [
+# {
+# "node": "occlusion",
+# "widget": "param2"
+# }
+# ],
+# "longdesc": "The strength of the calculated occlusion effect",
+# "name": "param2",
+# "shortdesc": "Occlusion",
+# "type": "linked_control"
+# },
+# {
+# "label": "Mat Normal",
+# "linked_widgets": [
+# {
+# "node": "blend_2",
+# "widget": "amount"
+# }
+# ],
+# "longdesc": "The strength of normals from the base materials (compared to the normal generated from height information))",
+# "name": "param0",
+# "shortdesc": "MatNormal",
+# "type": "linked_control"
+# }
+# ]
+# },
+# {
+# "name": "brightness_contrast",
+# "node_position": {
+# "x": -1177.223877,
+# "y": 677.062317
+# },
+# "parameters": {
+# "brightness": 0,
+# "contrast": 1
+# },
+# "type": "brightness_contrast"
+# },
+# {
+# "name": "normal_map_2",
+# "node_position": {
+# "x": -1152.5,
+# "y": 544.75
+# },
+# "parameters": {
+# "param0": 10,
+# "param1": 1.02,
+# "param2": 0,
+# "param4": 1
+# },
+# "type": "normal_map"
+# }
+# ],
+# "parameters": {
+# "param0": 1,
+# "param2": 1
+# },
+# "shortdesc": "Output",
+# "type": "graph"
+#}
+
+#----------------------
+#edge_detect.mmg
+
+#----------------------
+#edge_detect.mmg
+
+#----------------------
+#edge_detect.mmg
+
+#----------------------
+#edge_detect.mmg
+
+#----------------------
+#edge_detect.mmg
+
+#----------------------
+#edge_detect.mmg
+
+#----------------------
+#edge_detect.mmg
+
+#----------------------
+#edge_detect.mmg
+
+#----------------------
+#edge_detect.mmg
+
+#----------------------
+#edge_detect.mmg
+
+
+#vec3 matmap_mix(vec3 in1, vec3 in2) {\n\t
+# float is_in1 = step(in2.x, in1.x);\n\t
+# //return vec3(max(in1.x, in2.x), in1.yz*is_in1+in2.yz*(1.0-is_in1));\n\t
+# return vec3(max(in1.x, in2.x), mix(in2.yz, in1.yz, is_in1));\n
+#}
+
+#vec2 matmap_uv(vec2 uv, float angle, float seed) {\n\t
+# uv -= vec2(0.5);\n\tvec2 rv;\n\t
+# rv.x = uv.x*cos(angle)+uv.y*sin(angle);\n\t
+# rv.y = -uv.x*sin(angle)+uv.y*cos(angle);\n\t
+# return fract(rv + rand2(vec2(seed)));\n
+#}
+
+#vec3 matmap_rotate_nm(vec3 input, float angle) {\n\t
+# vec2 uv = input.xy - vec2(0.5);\n\t
+# vec2 rv;\n\t
+# rv.x = uv.x*cos(angle)+uv.y*sin(angle);\n\t
+# rv.y = -uv.x*sin(angle)+uv.y*cos(angle);\n\t
+# return vec3(rv + vec2(0.5), input.z);\n
+#}
+
diff --git a/modules/material_maker/mat_maker_gd/nodes/common/noise_fbm.gd b/modules/material_maker/mat_maker_gd/nodes/common/noise_fbm.gd
new file mode 100644
index 000000000..8fb6f2598
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/common/noise_fbm.gd
@@ -0,0 +1,691 @@
+tool
+extends Reference
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+
+#fbm2.mmg (and fbm.mmg)
+
+#Output:
+#$(name)_fbm($(uv), vec2($(scale_x), $(scale_y)), int($(folds)), int($(iterations)), $(persistence), float($(seed)))
+
+#Instance:
+#float $(name)_fbm(vec2 coord, vec2 size, int folds, int octaves, float persistence, float seed) {
+# float normalize_factor = 0.0;
+# float value = 0.0;
+# float scale = 1.0;
+#
+# for (int i = 0; i < octaves; i++) {
+# float noise = fbm_$noise(coord*size, size, seed);
+#
+# for (int f = 0; f < folds; ++f) {
+# noise = abs(2.0*noise-1.0);
+# }
+#
+# value += noise * scale;
+# normalize_factor += scale;
+# size *= 2.0;
+# scale *= persistence;
+# }
+#
+# return value / normalize_factor;
+#}
+
+#Inputs:
+#noise, enum, default: 2, values: Value, Perlin, Simplex, Cellular, Cellular2, Cellular3, Cellular4, Cellular5, Cellular6
+#scale, vector2, default: 4, min: 1, max: 32, step: 1
+#folds, float, default: 0, min: 0, max: 5, step: 1
+#iterations (octaves), float, default: 3, min: 1, max: 10, step: 1
+#persistence, float, default: 0.5, min: 0, max: 1, step: 0.01
+
+static func fbmval(uv : Vector2, size : Vector2, folds : int, octaves : int, persistence : float, pseed : float) -> Color:
+ var f : float = fbmf(uv, size, folds, octaves, persistence, pseed)
+
+ return Color(f, f, f, 1)
+
+static func perlin(uv : Vector2, size : Vector2, folds : int, octaves : int, persistence : float, pseed : float) -> Color:
+ var f : float = perlinf(uv, size, folds, octaves, persistence, pseed)
+
+ return Color(f, f, f, 1)
+
+static func perlinabs(uv : Vector2, size : Vector2, folds : int, octaves : int, persistence : float, pseed : float) -> Color:
+ var f : float = perlinf(uv, size, folds, octaves, persistence, pseed)
+
+ return Color(f, f, f, 1)
+
+static func simplex(uv : Vector2, size : Vector2, folds : int, octaves : int, persistence : float, pseed : float) -> Color:
+ var f : float = fbm_simplexf(uv, size, folds, octaves, persistence, pseed)
+
+ return Color(f, f, f, 1)
+
+static func cellular(uv : Vector2, size : Vector2, folds : int, octaves : int, persistence : float, pseed : float) -> Color:
+ var f : float = cellularf(uv, size, folds, octaves, persistence, pseed)
+
+ return Color(f, f, f, 1)
+
+static func cellular2(uv : Vector2, size : Vector2, folds : int, octaves : int, persistence : float, pseed : float) -> Color:
+ var f : float = cellular2f(uv, size, folds, octaves, persistence, pseed)
+
+ return Color(f, f, f, 1)
+
+static func cellular3(uv : Vector2, size : Vector2, folds : int, octaves : int, persistence : float, pseed : float) -> Color:
+ var f : float = cellular3f(uv, size, folds, octaves, persistence, pseed)
+
+ return Color(f, f, f, 1)
+
+static func cellular4(uv : Vector2, size : Vector2, folds : int, octaves : int, persistence : float, pseed : float) -> Color:
+ var f : float = cellular4f(uv, size, folds, octaves, persistence, pseed)
+
+ return Color(f, f, f, 1)
+
+static func cellular5(uv : Vector2, size : Vector2, folds : int, octaves : int, persistence : float, pseed : float) -> Color:
+ var f : float = cellular5f(uv, size, folds, octaves, persistence, pseed)
+
+ return Color(f, f, f, 1)
+
+static func cellular6(uv : Vector2, size : Vector2, folds : int, octaves : int, persistence : float, pseed : float) -> Color:
+ var f : float = cellular6f(uv, size, folds, octaves, persistence, pseed)
+
+ return Color(f, f, f, 1)
+
+
+static func fbmf(coord : Vector2, size : Vector2, folds : int, octaves : int, persistence : float, pseed : float) -> float:
+ var normalize_factor : float = 0.0;
+ var value : float = 0.0;
+ var scale : float = 1.0;
+
+ for i in range(octaves):# (int i = 0; i < octaves; i++) {
+ var noise : float = fbm_value(coord*size, size, pseed)
+
+ for j in range(folds):# (int f = 0; f < folds; ++f) {
+ noise = abs(2.0*noise-1.0);
+
+ value += noise * scale
+ normalize_factor += scale;
+ size *= 2.0;
+ scale *= persistence;
+
+ return value / normalize_factor;
+
+static func perlinf(coord : Vector2, size : Vector2, folds : int, octaves : int, persistence : float, pseed : float) -> float:
+ var normalize_factor : float = 0.0;
+ var value : float = 0.0;
+ var scale : float = 1.0;
+
+ for i in range(octaves):# (int i = 0; i < octaves; i++) {
+ var noise : float = fbm_perlin(coord*size, size, pseed)
+
+ for j in range(folds):# (int f = 0; f < folds; ++f) {
+ noise = abs(2.0*noise-1.0);
+
+ value += noise * scale
+ normalize_factor += scale;
+ size *= 2.0;
+ scale *= persistence;
+
+ return value / normalize_factor;
+
+static func perlinabsf(coord : Vector2, size : Vector2, folds : int, octaves : int, persistence : float, pseed : float) -> float:
+ var normalize_factor : float = 0.0;
+ var value : float = 0.0;
+ var scale : float = 1.0;
+
+ for i in range(octaves):# (int i = 0; i < octaves; i++) {
+ var noise : float = fbm_perlinabs(coord*size, size, pseed)
+
+ for j in range(folds):# (int f = 0; f < folds; ++f) {
+ noise = abs(2.0*noise-1.0);
+
+ value += noise * scale
+ normalize_factor += scale;
+ size *= 2.0;
+ scale *= persistence;
+
+ return value / normalize_factor;
+
+static func fbm_simplexf(coord : Vector2, size : Vector2, folds : int, octaves : int, persistence : float, pseed : float) -> float:
+ var normalize_factor : float = 0.0;
+ var value : float = 0.0;
+ var scale : float = 1.0;
+
+ for i in range(octaves):# (int i = 0; i < octaves; i++) {
+ var noise : float = fbm_simplex(coord*size, size, pseed)
+
+ for j in range(folds):# (int f = 0; f < folds; ++f) {
+ noise = abs(2.0*noise-1.0);
+
+ value += noise * scale
+ normalize_factor += scale;
+ size *= 2.0;
+ scale *= persistence;
+
+ return value / normalize_factor;
+
+static func cellularf(coord : Vector2, size : Vector2, folds : int, octaves : int, persistence : float, pseed : float) -> float:
+ var normalize_factor : float = 0.0;
+ var value : float = 0.0;
+ var scale : float = 1.0;
+
+ for i in range(octaves):# (int i = 0; i < octaves; i++) {
+ var noise : float = fbm_cellular(coord*size, size, pseed)
+
+ for j in range(folds):# (int f = 0; f < folds; ++f) {
+ noise = abs(2.0*noise-1.0);
+
+ value += noise * scale
+ normalize_factor += scale;
+ size *= 2.0;
+ scale *= persistence;
+
+ return value / normalize_factor;
+
+static func cellular2f(coord : Vector2, size : Vector2, folds : int, octaves : int, persistence : float, pseed : float) -> float:
+ var normalize_factor : float = 0.0;
+ var value : float = 0.0;
+ var scale : float = 1.0;
+
+ for i in range(octaves):# (int i = 0; i < octaves; i++) {
+ var noise : float = fbm_cellular2(coord*size, size, pseed)
+
+ for j in range(folds):# (int f = 0; f < folds; ++f) {
+ noise = abs(2.0*noise-1.0);
+
+ value += noise * scale
+ normalize_factor += scale;
+ size *= 2.0;
+ scale *= persistence;
+
+ return value / normalize_factor;
+
+static func cellular3f(coord : Vector2, size : Vector2, folds : int, octaves : int, persistence : float, pseed : float) -> float:
+ var normalize_factor : float = 0.0;
+ var value : float = 0.0;
+ var scale : float = 1.0;
+
+ for i in range(octaves):# (int i = 0; i < octaves; i++) {
+ var noise : float = fbm_cellular3(coord*size, size, pseed)
+
+ for j in range(folds):# (int f = 0; f < folds; ++f) {
+ noise = abs(2.0*noise-1.0);
+
+ value += noise * scale
+ normalize_factor += scale;
+ size *= 2.0;
+ scale *= persistence;
+
+ return value / normalize_factor;
+
+static func cellular4f(coord : Vector2, size : Vector2, folds : int, octaves : int, persistence : float, pseed : float) -> float:
+ var normalize_factor : float = 0.0;
+ var value : float = 0.0;
+ var scale : float = 1.0;
+
+ for i in range(octaves):# (int i = 0; i < octaves; i++) {
+ var noise : float = fbm_cellular4(coord*size, size, pseed)
+
+ for j in range(folds):# (int f = 0; f < folds; ++f) {
+ noise = abs(2.0*noise-1.0);
+
+ value += noise * scale
+ normalize_factor += scale;
+ size *= 2.0;
+ scale *= persistence;
+
+ return value / normalize_factor;
+
+static func cellular5f(coord : Vector2, size : Vector2, folds : int, octaves : int, persistence : float, pseed : float) -> float:
+ var normalize_factor : float = 0.0;
+ var value : float = 0.0;
+ var scale : float = 1.0;
+
+ for i in range(octaves):# (int i = 0; i < octaves; i++) {
+ var noise : float = fbm_cellular5(coord*size, size, pseed)
+
+ for j in range(folds):# (int f = 0; f < folds; ++f) {
+ noise = abs(2.0*noise-1.0);
+
+ value += noise * scale
+ normalize_factor += scale;
+ size *= 2.0;
+ scale *= persistence;
+
+ return value / normalize_factor;
+
+static func cellular6f(coord : Vector2, size : Vector2, folds : int, octaves : int, persistence : float, pseed : float) -> float:
+ var normalize_factor : float = 0.0;
+ var value : float = 0.0;
+ var scale : float = 1.0;
+
+ for i in range(octaves):# (int i = 0; i < octaves; i++) {
+ var noise : float = fbm_cellular6(coord*size, size, pseed)
+
+ for j in range(folds):# (int f = 0; f < folds; ++f) {
+ noise = abs(2.0*noise-1.0);
+
+ value += noise * scale
+ normalize_factor += scale;
+ size *= 2.0;
+ scale *= persistence;
+
+ return value / normalize_factor;
+
+
+#float fbm_value(vec2 coord, vec2 size, float seed) {
+# vec2 o = floor(coord)+rand2(vec2(seed, 1.0-seed))+size;
+# vec2 f = fract(coord);
+#
+# float p00 = rand(mod(o, size));
+# float p01 = rand(mod(o + vec2(0.0, 1.0), size));
+# float p10 = rand(mod(o + vec2(1.0, 0.0), size));
+# float p11 = rand(mod(o + vec2(1.0, 1.0), size));
+#
+# vec2 t = f * f * (3.0 - 2.0 * f);
+#
+# return mix(mix(p00, p10, t.x), mix(p01, p11, t.x), t.y);
+#}
+
+static func fbm_value(coord : Vector2, size : Vector2, pseed : float) -> float:
+ var o : Vector2 = Commons.floorv2(coord) + Commons.rand2(Vector2(float(pseed), 1.0 - float(pseed))) + size;
+ var f : Vector2 = Commons.fractv2(coord);
+ var p00 : float = Commons.rand(Commons.modv2(o, size));
+ var p01 : float = Commons.rand(Commons.modv2(o + Vector2(0.0, 1.0), size));
+ var p10 : float = Commons.rand(Commons.modv2(o + Vector2(1.0, 0.0), size));
+ var p11 : float = Commons.rand(Commons.modv2(o + Vector2(1.0, 1.0), size));
+
+ var t : Vector2 = f * f * (Vector2(3, 3) - 2.0 * f);
+ return lerp(lerp(p00, p10, t.x), lerp(p01, p11, t.x), t.y);
+
+
+#float fbm_perlin(vec2 coord, vec2 size, float seed) {
+# tvec2 o = floor(coord)+rand2(vec2(seed, 1.0-seed))+size;
+# vec2 f = fract(coord);
+#
+# float a00 = rand(mod(o, size)) * 6.28318530718;
+# float a01 = rand(mod(o + vec2(0.0, 1.0), size)) * 6.28318530718;
+# float a10 = rand(mod(o + vec2(1.0, 0.0), size)) * 6.28318530718;
+# float a11 = rand(mod(o + vec2(1.0, 1.0), size)) * 6.28318530718;
+#
+# vec2 v00 = vec2(cos(a00), sin(a00));
+# vec2 v01 = vec2(cos(a01), sin(a01));
+# vec2 v10 = vec2(cos(a10), sin(a10));
+# vec2 v11 = vec2(cos(a11), sin(a11));
+#
+# float p00 = dot(v00, f);
+# float p01 = dot(v01, f - vec2(0.0, 1.0));
+# float p10 = dot(v10, f - vec2(1.0, 0.0));
+# float p11 = dot(v11, f - vec2(1.0, 1.0));
+#
+# vec2 t = f * f * (3.0 - 2.0 * f);
+#
+# return 0.5 + mix(mix(p00, p10, t.x), mix(p01, p11, t.x), t.y);
+#}
+
+static func fbm_perlin(coord : Vector2, size : Vector2, pseed : float) -> float:
+ var o : Vector2 = Commons.floorv2(coord) + Commons.rand2(Vector2(float(pseed), 1.0 - float(pseed))) + size;
+ var f : Vector2 = Commons.fractv2(coord);
+ var a00 : float = Commons.rand(Commons.modv2(o, size)) * 6.28318530718;
+ var a01 : float = Commons.rand(Commons.modv2(o + Vector2(0.0, 1.0), size)) * 6.28318530718;
+ var a10 : float = Commons.rand(Commons.modv2(o + Vector2(1.0, 0.0), size)) * 6.28318530718;
+ var a11 : float = Commons.rand(Commons.modv2(o + Vector2(1.0, 1.0), size)) * 6.28318530718;
+ var v00 : Vector2 = Vector2(cos(a00), sin(a00));
+ var v01 : Vector2 = Vector2(cos(a01), sin(a01));
+ var v10 : Vector2 = Vector2(cos(a10), sin(a10));
+ var v11 : Vector2 = Vector2(cos(a11), sin(a11));
+ var p00 : float = v00.dot(f);
+ var p01 : float = v01.dot(f - Vector2(0.0, 1.0));
+ var p10 : float = v10.dot(f - Vector2(1.0, 0.0));
+ var p11 : float = v11.dot(f - Vector2(1.0, 1.0));
+
+ var t : Vector2 = f * f * (Vector2(3, 3) - 2.0 * f);
+
+ return 0.5 + lerp(lerp(p00, p10, t.x), lerp(p01, p11, t.x), t.y);
+
+#float fbm_perlinabs(vec2 coord, vec2 size, float seed) {
+# return abs(2.0*fbm_perlin(coord, size, seed)-1.0);
+#}
+
+static func fbm_perlinabs(coord : Vector2, size : Vector2, pseed : float) -> float:
+ return abs(2.0*fbm_perlin(coord, size, pseed)-1.0)
+
+#vec2 rgrad2(vec2 p, float rot, float seed) {
+# float u = rand(p + vec2(seed, 1.0-seed));
+# u = fract(u) * 6.28318530718; // 2*pi
+# return vec2(cos(u), sin(u));
+#}
+
+static func rgrad2(p : Vector2, rot : float, pseed : float) -> Vector2:
+ var u : float = Commons.rand(p + Vector2(pseed, 1.0-pseed));
+ u = Commons.fract(u) * 6.28318530718; # 2*pi
+ return Vector2(cos(u), sin(u))
+
+#float fbm_simplex(vec2 coord, vec2 size, float seed) {
+# coord *= 2.0; // needed for it to tile
+# coord += rand2(vec2(seed, 1.0-seed)) + size;
+# size *= 2.0; // needed for it to tile
+# coord.y += 0.001;
+#
+# vec2 uv = vec2(coord.x + coord.y*0.5, coord.y);
+# vec2 i0 = floor(uv); vec2 f0 = fract(uv);
+# vec2 i1 = (f0.x > f0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0);
+# vec2 p0 = vec2(i0.x - i0.y * 0.5, i0.y);
+# vec2 p1 = vec2(p0.x + i1.x - i1.y * 0.5, p0.y + i1.y);
+# vec2 p2 = vec2(p0.x + 0.5, p0.y + 1.0);
+#
+# i1 = i0 + i1;
+#
+# vec2 i2 = i0 + vec2(1.0, 1.0);
+# vec2 d0 = coord - p0;
+# vec2 d1 = coord - p1;
+# vec2 d2 = coord - p2;
+#
+# vec3 xw = mod(vec3(p0.x, p1.x, p2.x), size.x);
+# vec3 yw = mod(vec3(p0.y, p1.y, p2.y), size.y);
+#
+# vec3 iuw = xw + 0.5 * yw;
+# vec3 ivw = yw;
+#
+# vec2 g0 = rgrad2(vec2(iuw.x, ivw.x), 0.0, seed);
+# vec2 g1 = rgrad2(vec2(iuw.y, ivw.y), 0.0, seed);
+# vec2 g2 = rgrad2(vec2(iuw.z, ivw.z), 0.0, seed);
+#
+# vec3 w = vec3(dot(g0, d0), dot(g1, d1), dot(g2, d2));
+# vec3 t = 0.8 - vec3(dot(d0, d0), dot(d1, d1), dot(d2, d2));
+#
+# t = max(t, vec3(0.0));
+# vec3 t2 = t * t;
+# vec3 t4 = t2 * t2;
+# float n = dot(t4, w);
+#
+# return 0.5 + 5.5 * n;
+#}
+
+static func fbm_simplex(coord : Vector2, size : Vector2, pseed : float) -> float:
+ coord *= 2.0; # needed for it to tile
+ coord += Commons.rand2(Vector2(pseed, 1.0-pseed)) + size;
+ size *= 2.0; # needed for it to tile
+ coord.y += 0.001;
+
+ var uv : Vector2 = Vector2(coord.x + coord.y*0.5, coord.y);
+ var i0 : Vector2 = Commons.floorv2(uv);
+ var f0 : Vector2 = Commons.fractv2(uv);
+ var i1 : Vector2
+
+ if (f0.x > f0.y):
+ i1 = Vector2(1.0, 0.0)
+ else:
+ i1 = Vector2(0.0, 1.0);
+
+ var p0 : Vector2 = Vector2(i0.x - i0.y * 0.5, i0.y);
+ var p1 : Vector2 = Vector2(p0.x + i1.x - i1.y * 0.5, p0.y + i1.y);
+ var p2 : Vector2 = Vector2(p0.x + 0.5, p0.y + 1.0);
+
+ i1 = i0 + i1;
+
+ var i2 : Vector2 = i0 + Vector2(1.0, 1.0);
+ var d0 : Vector2 = coord - p0;
+ var d1 : Vector2 = coord - p1;
+ var d2 : Vector2 = coord - p2;
+
+ var xw : Vector3 = Commons.modv3(Vector3(p0.x, p1.x, p2.x), Vector3(size.x, size.x, size.x));
+ var yw : Vector3 = Commons.modv3(Vector3(p0.y, p1.y, p2.y), Vector3(size.y, size.y, size.y));
+
+ var iuw : Vector3 = xw + 0.5 * yw;
+ var ivw : Vector3 = yw;
+
+ var g0 : Vector2 = rgrad2(Vector2(iuw.x, ivw.x), 0.0, pseed);
+ var g1 : Vector2 = rgrad2(Vector2(iuw.y, ivw.y), 0.0, pseed);
+ var g2 : Vector2 = rgrad2(Vector2(iuw.z, ivw.z), 0.0, pseed);
+
+ var w : Vector3 = Vector3(g0.dot(d0), g1.dot(d1), g2.dot(d2));
+ var t : Vector3 = Vector3(0.8, 0.8, 0.8) - Vector3(d0.dot(d0), d1.dot(d1), d2.dot(d2));
+
+ t = Commons.maxv3(t, Vector3());
+ var t2 : Vector3 = t * t;
+ var t4 : Vector3 = t2 * t2;
+ var n : float = t4.dot(w);
+
+ return 0.5 + 5.5 * n;
+
+#float fbm_cellular(vec2 coord, vec2 size, float seed) {
+# vec2 o = floor(coord)+rand2(vec2(seed, 1.0-seed))+size;
+# vec2 f = fract(coord);
+# float min_dist = 2.0;
+#
+# for(float x = -1.0; x <= 1.0; x++) {
+# for(float y = -1.0; y <= 1.0; y++) {
+# vec2 node = rand2(mod(o + vec2(x, y), size)) + vec2(x, y);
+# float dist = sqrt((f - node).x * (f - node).x + (f - node).y * (f - node).y);
+# min_dist = min(min_dist, dist);
+# }
+# }
+#
+# return min_dist;
+#}
+
+static func fbm_cellular(coord : Vector2, size : Vector2, pseed : float) -> float:
+ var o : Vector2 = Commons.floorv2(coord) + Commons.rand2(Vector2(float(pseed), 1.0 - float(pseed))) + size;
+ var f : Vector2 = Commons.fractv2(coord);
+ var min_dist : float = 2.0;
+
+ for xx in range(-1, 2): #(float x = -1.0; x <= 1.0; x++) {
+ var x : float = xx
+
+ for yy in range(-1, 2):#(float y = -1.0; y <= 1.0; y++) {
+ var y : float = yy
+
+ var node : Vector2 = Commons.rand2(Commons.modv2(o + Vector2(x, y), size)) + Vector2(x, y);
+ var dist : float = sqrt((f - node).x * (f - node).x + (f - node).y * (f - node).y);
+ min_dist = min(min_dist, dist);
+
+ return min_dist;
+
+#float fbm_cellular2(vec2 coord, vec2 size, float seed) {
+# vec2 o = floor(coord)+rand2(vec2(seed, 1.0-seed))+size;
+# vec2 f = fract(coord);
+# float min_dist1 = 2.0;
+# float min_dist2 = 2.0;
+#
+# for(float x = -1.0; x <= 1.0; x++) {
+# for(float y = -1.0; y <= 1.0; y++) {
+# vec2 node = rand2(mod(o + vec2(x, y), size)) + vec2(x, y);
+# float dist = sqrt((f - node).x * (f - node).x + (f - node).y * (f - node).y);
+# if (min_dist1 > dist) {
+# min_dist2 = min_dist1;
+# min_dist1 = dist;
+# } else if (min_dist2 > dist) {
+# min_dist2 = dist;
+# }
+# }
+# }
+#
+# return min_dist2-min_dist1;
+#}
+
+static func fbm_cellular2(coord : Vector2, size : Vector2, pseed : float) -> float:
+ var o : Vector2 = Commons.floorv2(coord) + Commons.rand2(Vector2(float(pseed), 1.0 - float(pseed))) + size;
+ var f : Vector2 = Commons.fractv2(coord);
+
+ var min_dist1 : float = 2.0;
+ var min_dist2 : float = 2.0;
+
+ for xx in range(-1, 2): #(float x = -1.0; x <= 1.0; x++) {
+ var x : float = xx
+
+ for yy in range(-1, 2):#(float y = -1.0; y <= 1.0; y++) {
+ var y : float = yy
+
+ var node : Vector2 = Commons.rand2(Commons.modv2(o + Vector2(x, y), size)) + Vector2(x, y);
+
+ var dist : float = sqrt((f - node).x * (f - node).x + (f - node).y * (f - node).y);
+
+ if (min_dist1 > dist):
+ min_dist2 = min_dist1;
+ min_dist1 = dist;
+ elif (min_dist2 > dist):
+ min_dist2 = dist;
+
+ return min_dist2-min_dist1;
+
+#float fbm_cellular3(vec2 coord, vec2 size, float seed) {
+# vec2 o = floor(coord)+rand2(vec2(seed, 1.0-seed))+size;
+# vec2 f = fract(coord);
+# float min_dist = 2.0;
+#
+# for(float x = -1.0; x <= 1.0; x++) {
+# for(float y = -1.0; y <= 1.0; y++) {
+# vec2 node = rand2(mod(o + vec2(x, y), size))*0.5 + vec2(x, y);
+# float dist = abs((f - node).x) + abs((f - node).y);
+# min_dist = min(min_dist, dist);
+# }
+# }
+#
+# return min_dist;
+#}
+
+static func fbm_cellular3(coord : Vector2, size : Vector2, pseed : float) -> float:
+ var o : Vector2 = Commons.floorv2(coord) + Commons.rand2(Vector2(float(pseed), 1.0 - float(pseed))) + size;
+ var f : Vector2 = Commons.fractv2(coord);
+
+ var min_dist : float = 2.0;
+
+ for xx in range(-1, 2): #(float x = -1.0; x <= 1.0; x++) {
+ var x : float = xx
+
+ for yy in range(-1, 2):#(float y = -1.0; y <= 1.0; y++) {
+ var y : float = yy
+
+ var node : Vector2 = Commons.rand2(Commons.modv2(o + Vector2(x, y), size))*0.5 + Vector2(x, y);
+
+ var dist : float = abs((f - node).x) + abs((f - node).y);
+
+ min_dist = min(min_dist, dist);
+
+ return min_dist;
+
+#float fbm_cellular4(vec2 coord, vec2 size, float seed) {
+# vec2 o = floor(coord)+rand2(vec2(seed, 1.0-seed))+size;
+# vec2 f = fract(coord);
+# float min_dist1 = 2.0;
+# float min_dist2 = 2.0;
+#
+# for(float x = -1.0; x <= 1.0; x++) {
+# for(float y = -1.0; y <= 1.0; y++) {
+# vec2 node = rand2(mod(o + vec2(x, y), size))*0.5 + vec2(x, y);
+# float dist = abs((f - node).x) + abs((f - node).y);
+#
+# if (min_dist1 > dist) {
+# min_dist2 = min_dist1;
+# min_dist1 = dist;
+# } else if (min_dist2 > dist) {
+# min_dist2 = dist;
+# }
+# }
+# }
+#
+# return min_dist2-min_dist1;
+#}
+
+static func fbm_cellular4(coord : Vector2, size : Vector2, pseed : float) -> float:
+ var o : Vector2 = Commons.floorv2(coord) + Commons.rand2(Vector2(float(pseed), 1.0 - float(pseed))) + size;
+ var f : Vector2 = Commons.fractv2(coord);
+
+ var min_dist1 : float = 2.0;
+ var min_dist2 : float = 2.0;
+
+ for xx in range(-1, 2): #(float x = -1.0; x <= 1.0; x++) {
+ var x : float = xx
+
+ for yy in range(-1, 2):#(float y = -1.0; y <= 1.0; y++) {
+ var y : float = yy
+
+ var node : Vector2 = Commons.rand2(Commons.modv2(o + Vector2(x, y), size))*0.5 + Vector2(x, y);
+
+ var dist : float = abs((f - node).x) + abs((f - node).y);
+
+ if (min_dist1 > dist):
+ min_dist2 = min_dist1;
+ min_dist1 = dist;
+ elif (min_dist2 > dist):
+ min_dist2 = dist;
+
+ return min_dist2 - min_dist1;
+
+#float fbm_cellular5(vec2 coord, vec2 size, float seed) {
+# vec2 o = floor(coord)+rand2(vec2(seed, 1.0-seed))+size;
+# vec2 f = fract(coord);
+# float min_dist = 2.0;
+#
+# for(float x = -1.0; x <= 1.0; x++) {
+# for(float y = -1.0; y <= 1.0; y++) {
+# vec2 node = rand2(mod(o + vec2(x, y), size)) + vec2(x, y);
+# float dist = max(abs((f - node).x), abs((f - node).y));
+# min_dist = min(min_dist, dist);
+# }
+# }
+#
+# return min_dist;
+#}
+
+static func fbm_cellular5(coord : Vector2, size : Vector2, pseed : float) -> float:
+ var o : Vector2 = Commons.floorv2(coord) + Commons.rand2(Vector2(float(pseed), 1.0 - float(pseed))) + size;
+ var f : Vector2 = Commons.fractv2(coord);
+
+ var min_dist : float = 2.0;
+
+ for xx in range(-1, 2): #(float x = -1.0; x <= 1.0; x++) {
+ var x : float = xx
+
+ for yy in range(-1, 2):#(float y = -1.0; y <= 1.0; y++) {
+ var y : float = yy
+
+ var node : Vector2 = Commons.rand2(Commons.modv2(o + Vector2(x, y), size)) + Vector2(x, y);
+ var dist : float = max(abs((f - node).x), abs((f - node).y));
+ min_dist = min(min_dist, dist);
+
+ return min_dist;
+
+#float fbm_cellular6(vec2 coord, vec2 size, float seed) {
+# vec2 o = floor(coord)+rand2(vec2(seed, 1.0-seed))+size;
+# vec2 f = fract(coord);
+# float min_dist1 = 2.0;
+# float min_dist2 = 2.0;
+#
+# for(float x = -1.0; x <= 1.0; x++) {
+# for(float y = -1.0; y <= 1.0; y++) {
+# vec2 node = rand2(mod(o + vec2(x, y), size)) + vec2(x, y);
+# float dist = max(abs((f - node).x), abs((f - node).y));
+#
+# if (min_dist1 > dist) {
+# min_dist2 = min_dist1;
+# min_dist1 = dist;
+# } else if (min_dist2 > dist) {
+# min_dist2 = dist;
+# }
+# }
+# }
+#
+# return min_dist2-min_dist1;
+#}
+
+static func fbm_cellular6(coord : Vector2, size : Vector2, pseed : float) -> float:
+ var o : Vector2 = Commons.floorv2(coord) + Commons.rand2(Vector2(float(pseed), 1.0 - float(pseed))) + size;
+ var f : Vector2 = Commons.fractv2(coord);
+
+ var min_dist1 : float = 2.0;
+ var min_dist2 : float = 2.0;
+
+ for xx in range(-1, 2): #(float x = -1.0; x <= 1.0; x++) {
+ var x : float = xx
+
+ for yy in range(-1, 2):#(float y = -1.0; y <= 1.0; y++) {
+ var y : float = yy
+
+ var node : Vector2 = Commons.rand2(Commons.modv2(o + Vector2(x, y), size)) + Vector2(x, y);
+ var dist : float = max(abs((f - node).x), abs((f - node).y));
+
+ if (min_dist1 > dist):
+ min_dist2 = min_dist1;
+ min_dist1 = dist;
+ elif (min_dist2 > dist):
+ min_dist2 = dist;
+
+ return min_dist2 - min_dist1;
diff --git a/modules/material_maker/mat_maker_gd/nodes/common/noise_perlin.gd b/modules/material_maker/mat_maker_gd/nodes/common/noise_perlin.gd
new file mode 100644
index 000000000..aece6c1e9
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/common/noise_perlin.gd
@@ -0,0 +1,157 @@
+tool
+extends Reference
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+
+#----------------------
+#perlin.mmg
+
+#Outputs:
+
+#Output - (float) - Shows a greyscale value noise
+#perlin($(uv), vec2($(scale_x), $(scale_y)), int($(iterations)), $(persistence), $(seed))
+
+#Inputs:
+#scale, vector2, default: 4, min: 1, max: 32, step: 1
+#iterations, float, min: 0, max: 10, default: 3, step:1
+#persistence, float, min: 0, max: 1, default: 0.5, step:0.05
+
+#----------------------
+#perlin_color.mmg
+
+#Outputs:
+
+#Output - (rgb) - Shows a color value noise
+#perlin_color($(uv), vec2($(scale_x), $(scale_y)), int($(iterations)), $(persistence), $(seed))
+
+#Inputs:
+#scale, vector2, default: 4, min: 1, max: 32, step: 1
+#iterations, float, min: 0, max: 10, default: 3, step:1
+#persistence, float, min: 0, max: 1, default: 0.5, step:0.05
+
+static func perlinc(uv : Vector2, size : Vector2, iterations : int, persistence : float, pseed : int) -> Color:
+ var f : float = perlin(uv, size, iterations, persistence, pseed)
+
+ return Color(f, f, f, 1)
+
+
+#float perlin(vec2 uv, vec2 size, int iterations, float persistence, float seed) {
+# vec2 seed2 = rand2(vec2(seed, 1.0-seed));
+# float rv = 0.0;
+# float coef = 1.0;
+# float acc = 0.0;
+#
+# for (int i = 0; i < iterations; ++i) {
+# vec2 step = vec2(1.0)/size;
+# vec2 xy = floor(uv*size);
+#
+# float f0 = rand(seed2+mod(xy, size));
+# float f1 = rand(seed2+mod(xy+vec2(1.0, 0.0), size));
+# float f2 = rand(seed2+mod(xy+vec2(0.0, 1.0), size));
+# float f3 = rand(seed2+mod(xy+vec2(1.0, 1.0), size));
+#
+# vec2 mixval = smoothstep(0.0, 1.0, fract(uv*size));
+# rv += coef * mix(mix(f0, f1, mixval.x), mix(f2, f3, mixval.x), mixval.y);
+# acc += coef;
+# size *= 2.0;
+# coef *= persistence;
+# }
+#
+# return rv / acc;
+#}
+
+static func perlin(uv : Vector2, size : Vector2, iterations : int, persistence : float, pseed : int) -> float:
+ var seed2 : Vector2 = Commons.rand2(Vector2(float(pseed), 1.0-float(pseed)));
+ var rv : float = 0.0;
+ var coef : float = 1.0;
+ var acc : float = 0.0;
+
+ for i in range(iterations):
+ var step : Vector2 = Vector2(1, 1) / size;
+ var xy : Vector2 = Commons.floorv2(uv * size);
+ var f0 : float = Commons.rand(seed2 + Commons.modv2(xy, size));
+ var f1 : float = Commons.rand(seed2 + Commons.modv2(xy + Vector2(1.0, 0.0), size));
+ var f2 : float = Commons.rand(seed2 + Commons.modv2(xy + Vector2(0.0, 1.0), size));
+ var f3 : float = Commons.rand(seed2 + Commons.modv2(xy + Vector2(1.0, 1.0), size));
+
+ var mixval : Vector2 = Commons.smoothstepv2(0.0, 1.0, Commons.fractv2(uv * size));
+
+ rv += coef * lerp(lerp(f0, f1, mixval.x), lerp(f2, f3, mixval.x), mixval.y);
+ acc += coef;
+ size *= 2.0;
+ coef *= persistence;
+
+ return rv / acc;
+
+#vec3 perlin_color(vec2 uv, vec2 size, int iterations, float persistence, float seed) {
+# vec2 seed2 = rand2(vec2(seed, 1.0-seed));
+# vec3 rv = vec3(0.0);
+# float coef = 1.0;
+# float acc = 0.0;
+#
+# for (int i = 0; i < iterations; ++i) {
+# vec2 step = vec2(1.0)/size;
+# vec2 xy = floor(uv*size);
+# vec3 f0 = rand3(seed2+mod(xy, size));
+# vec3 f1 = rand3(seed2+mod(xy+vec2(1.0, 0.0), size));
+# vec3 f2 = rand3(seed2+mod(xy+vec2(0.0, 1.0), size));
+# vec3 f3 = rand3(seed2+mod(xy+vec2(1.0, 1.0), size));
+# vec2 mixval = smoothstep(0.0, 1.0, fract(uv*size));
+#
+# rv += coef * mix(mix(f0, f1, mixval.x), mix(f2, f3, mixval.x), mixval.y);
+# acc += coef;
+# size *= 2.0;
+# coef *= persistence;
+# }
+#
+# return rv / acc;
+#}
+
+static func perlin_color(uv : Vector2, size : Vector2, iterations : int, persistence : float, pseed : int) -> Vector3:
+ var seed2 : Vector2 = Commons.rand2(Vector2(float(pseed), 1.0-float(pseed)));
+ var rv : Vector3 = Vector3();
+ var coef : float = 1.0;
+ var acc : float = 0.0;
+
+ for i in range(iterations):
+ var step : Vector2 = Vector2(1, 1) / size;
+ var xy : Vector2 = Commons.floorv2(uv * size);
+ var f0 : Vector3 = Commons.rand3(seed2 + Commons.modv2(xy, size));
+ var f1 : Vector3 = Commons.rand3(seed2 + Commons.modv2(xy + Vector2(1.0, 0.0), size));
+ var f2 : Vector3 = Commons.rand3(seed2 + Commons.modv2(xy + Vector2(0.0, 1.0), size));
+ var f3 : Vector3 = Commons.rand3(seed2 + Commons.modv2(xy + Vector2(1.0, 1.0), size));
+
+ var mixval : Vector2 = Commons.smoothstepv2(0.0, 1.0, Commons.fractv2(uv * size));
+
+ rv += coef * lerp(lerp(f0, f1, mixval.x), lerp(f2, f3, mixval.x), mixval.y)
+ acc += coef;
+ size *= 2.0;
+ coef *= persistence;
+
+ return rv / acc;
+
+static func perlin_colorc(uv : Vector2, size : Vector2, iterations : int, persistence : float, pseed : int) -> Color:
+ var f : Vector3 = perlin_color(uv, size, iterations, persistence, pseed)
+
+ return Color(f.x, f.y, f.z, 1)
+
+static func perlin_warp_1(uv : Vector2, size : Vector2, iterations : int, persistence : float, pseed : int, translate : Vector2, rotate : float, size2 : Vector2) -> Color:
+ var f : float = perlin(uv, size2, iterations, persistence, pseed)
+ var vt : Vector2 = Commons.transform(uv, Vector2(translate.x*(2.0*f-1.0), translate.y*(2.0*f-1.0)), rotate*0.01745329251*(2.0*1.0-1.0), Vector2(size.x*(2.0*1.0-1.0), size.y*(2.0*1.0-1.0)), true)
+ var ff : float = perlin(vt, size2, iterations, persistence, pseed)
+
+ return Color(ff, ff, ff, 1)
+
+static func perlin_warp_2(uv : Vector2, size : Vector2, iterations : int, persistence : float, pseed : int, translate : Vector2, rotate : float, size2 : Vector2) -> Color:
+ var f = perlin(uv, size2, iterations, persistence, pseed)
+ var vt : Vector2 = Commons.transform(uv, Vector2(translate.x*(2.0*f-1.0), translate.y*(2.0*f-1.0)), rotate*0.01745329251*(2.0*1.0-1.0), Vector2(size.x*(2.0*1.0-1.0), size.y*(2.0*1.0-1.0)), true)
+ var ff : float = perlin(vt, size2, iterations, persistence, pseed)
+
+ var rgba : Vector3 = Vector3(ff, ff, ff)
+
+ var tf : Vector2 = Commons.transform(uv, Vector2(translate.x * (2.0 * (rgba.dot(Vector3(1, 1, 1) / 3.0) - 1.0)), translate.y*(2.0*(rgba.dot(Vector3(1, 1, 1) /3.0)-1.0))), rotate*0.01745329251*(2.0*1.0-1.0), Vector2(size.x*(2.0*1.0-1.0), size.y*(2.0*1.0-1.0)), true)
+
+ var fff : float = perlin(tf, size2, iterations, persistence, pseed);
+
+ return Color(fff, fff, fff, 1)
+
diff --git a/modules/material_maker/mat_maker_gd/nodes/common/noise_voronoi.gd b/modules/material_maker/mat_maker_gd/nodes/common/noise_voronoi.gd
new file mode 100644
index 000000000..9952e0a68
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/common/noise_voronoi.gd
@@ -0,0 +1,141 @@
+tool
+extends Reference
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+
+#voronoi.mmg
+
+#voronoi_1, 2, 3, 4 -> different outputs
+
+#Outputs:
+
+#vec4 $(name_uv)_xyzw = voronoi($uv, vec2($scale_x, $scale_y), vec2($stretch_y, $stretch_x), $intensity, $randomness, $seed);
+
+#Nodes - float - A greyscale pattern based on the distance to cell centers
+#$(name_uv)_xyzw.z
+
+#Borders - float - A greyscale pattern based on the distance to borders
+#$(name_uv)_xyzw.w
+
+#Random color - rgb - A color pattern that assigns a random color to each cell
+#rand3(fract(floor($(name_uv)_xyzw.xy)/vec2($scale_x, $scale_y)))
+
+#Fill - rgba - An output that should be plugged into a Fill companion node
+#vec4(fract(($(name_uv)_xyzw.xy-1.0)/vec2($scale_x, $scale_y)), vec2(2.0)/vec2($scale_x, $scale_y))
+
+#Inputs:
+
+#scale, min: 1, max: 32, step: 1, default: 4
+#stretch, min: 0.01, max: 1, step: 0.01, default: 1
+#intensity, min: 0, max: 1, step: 0.01, default: 0.75
+#randomness, min: 0, max: 1, step: 0.01, default: 1
+
+#vec4 $(name_uv)_xyzw = voronoi($uv, vec2($scale_x, $scale_y), vec2($stretch_y, $stretch_x), $intensity, $randomness, $seed);
+
+#note this is newer than what I have TODO
+
+#// Based on https://www.shadertoy.com/view/ldl3W8
+#// The MIT License
+#// Copyright © 2013 Inigo Quilez
+#vec3 iq_voronoi(vec2 x, vec2 size, vec2 stretch, float randomness, vec2 seed) {
+# vec2 n = floor(x);
+# vec2 f = fract(x);
+# vec2 mg, mr, mc;
+# float md = 8.0;
+#
+# for (int j=-1; j<=1; j++)
+# for (int i=-1; i<=1; i++) {
+# vec2 g = vec2(float(i),float(j));
+# vec2 o = randomness*rand2(seed + mod(n + g + size, size));
+# vec2 c = g + o;
+# vec2 r = c - f;
+# vec2 rr = r*stretch;
+# float d = dot(rr,rr);
+# if (d0.00001)
+# md = min(md, dot(0.5*(mr+r)*stretch, normalize((r-mr)*stretch)));
+# }
+#
+# return vec3(md, mc+n);
+#}
+#
+#vec4 voronoi(vec2 uv, vec2 size, vec2 stretch, float intensity, float randomness, float seed) {
+# uv *= size;
+# vec3 v = iq_voronoi(uv, size, stretch, randomness, rand2(vec2(seed, 1.0-seed)));
+# return vec4(v.yz, intensity*length((uv-v.yz)*stretch), v.x);
+#}
+
+static func voronoi(uv : Vector2, size : Vector2, stretch : Vector2, intensity : float, randomness : float, pseed : int) -> Color:
+ var seed2 : Vector2 = Commons.rand2(Vector2(float(pseed), 1.0-float(pseed)));
+ uv *= size;
+ var best_distance0 : float = 1.0;
+ var best_distance1 : float = 1.0;
+ var point0 : Vector2;
+ var point1 : Vector2;
+ var p0 : Vector2 = Commons.floorv2(uv);
+
+ for dx in range(-1, 2):# (int dx = -1; dx < 2; ++dx) {
+ for dy in range(-1, 2):# (int dy = -1; dy < 2; ++dy) {
+ var d : Vector2 = Vector2(float(dx), float(dy));
+ var p : Vector2 = p0+d;
+
+ p += randomness * Commons.rand2(seed2 + Commons.modv2(p, size));
+ var distance : float = (stretch * (uv - p) / size).length();
+
+ if (best_distance0 > distance):
+ best_distance1 = best_distance0;
+ best_distance0 = distance;
+ point1 = point0;
+ point0 = p;
+ elif (best_distance1 > distance):
+ best_distance1 = distance;
+ point1 = p;
+
+ var edge_distance : float = (uv - 0.5*(point0+point1)).dot((point0-point1).normalized());
+
+ return Color(point0.x, point0.y, best_distance0 * (size).length() * intensity, edge_distance);
+
+#$(name_uv)_xyzw.z
+
+static func voronoi_1(uv : Vector2, size : Vector2, stretch : Vector2, intensity : float, randomness : float, pseed : int) -> Color:
+ var c : Color = voronoi(uv, size, stretch, intensity, randomness, pseed);
+
+ return Color(c.b, c.b, c.b, 1)
+
+#$(name_uv)_xyzw.w
+
+static func voronoi_2(uv : Vector2, size : Vector2, stretch : Vector2, intensity : float, randomness : float, pseed : int) -> Color:
+ var c : Color = voronoi(uv, size, stretch, intensity, randomness, pseed);
+
+ return Color(c.a, c.a, c.a, 1)
+
+#rand3(fract(floor($(name_uv)_xyzw.xy)/vec2($scale_x, $scale_y)))
+
+static func voronoi_3(uv : Vector2, size : Vector2, stretch : Vector2, intensity : float, randomness : float, pseed : int) -> Color:
+ var c : Color = voronoi(uv, size, stretch, intensity, randomness, pseed);
+
+ var vv : Vector2 = Vector2(c.r, c.g)
+
+ var v : Vector3 = Commons.rand3(Commons.fractv2(vv));
+
+ return Color(v.x, v.y, v.z, 1)
+
+#vec4(fract(($(name_uv)_xyzw.xy-1.0)/vec2($scale_x, $scale_y)), vec2(2.0)/vec2($scale_x, $scale_y))
+
+#voronoi_4 todo
diff --git a/modules/material_maker/mat_maker_gd/nodes/common/noises.gd b/modules/material_maker/mat_maker_gd/nodes/common/noises.gd
new file mode 100644
index 000000000..7e2c85473
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/common/noises.gd
@@ -0,0 +1,122 @@
+tool
+extends Reference
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+
+#----------------------
+#color_noise.mmg
+
+#Outputs:
+
+#Output - (rgb) - Shows the noise pattern
+#color_dots($(uv), 1.0/$(size), $(seed))
+
+#Inputs:
+#size, float, default: 8, min: 2, max: 12, step: 1
+
+#----------------------
+#noise.mmg
+
+#Outputs:
+
+#float $(name)_f(vec2 uv) {
+# return dots(uv, 1.0/$(size), $(density), $(seed));
+#}
+
+#Output - (float) - Shows the noise pattern
+#$(name)_f($(uv))
+
+#Inputs:
+#grid_size, float, default: 4, min: 2, max: 12, step: 1
+#density, float, default: 0.5, min: 0, max: 1, step: 0.01
+
+#----------------------
+#noise_anisotropic.mmg
+#Generates x-axis interpolated value noise
+
+#Output:
+#Output (float) - Shows a greyscale value noise
+#anisotropic($(uv), vec2($(scale_x), $(scale_y)), $(seed), $(smoothness), $(interpolation))
+
+#Input:
+#scale, Vector2, min: 1, 1, max: 32, 1024, step: 1, 1, default 4, 256
+#smoothness, float, min: 0, max: 1, step: 0,01, default: 1
+#Interpolation, float, min: 0, max: 1, step: 0,01, default: 1
+
+#float dots(vec2 uv, float size, float density, float seed) {
+# vec2 seed2 = rand2(vec2(seed, 1.0-seed));
+# uv /= size;
+# vec2 point_pos = floor(uv)+vec2(0.5);
+# float color = step(rand(seed2+point_pos), density);
+# return color;
+#}
+
+static func dots(uv : Vector2, size : float, density : float, pseed : float) -> float:
+ var seed2 : Vector2 = Commons.rand2(Vector2(pseed, 1.0 - pseed))
+ uv /= size
+ var point_pos : Vector2 = Commons.floorv2(uv) + Vector2(0.5, 0.5)
+ var color : float = Commons.step(Commons.rand2(seed2 + point_pos).x, density);
+ return color
+
+static func anisotropicc(uv : Vector2, size : Vector2, pseed : float, smoothness : float, interpolation : float) -> Color:
+ var v : float = anisotropic(uv, size, pseed, smoothness, interpolation)
+
+ return Color(v, v, v, 1)
+
+#float anisotropic(vec2 uv, vec2 size, float seed, float smoothness, float interpolation) {
+# vec2 seed2 = rand2(vec2(seed, 1.0-seed));
+# vec2 xy = floor(uv*size);
+# vec2 offset = vec2(rand(seed2 + xy.y), 0.0);
+# vec2 xy_offset = floor(uv * size + offset );
+#
+# float f0 = rand(seed2+mod(xy_offset, size));
+# float f1 = rand(seed2+mod(xy_offset+vec2(1.0, 0.0), size));
+# float mixer = clamp( (fract(uv.x*size.x+offset.x) -.5) / smoothness + 0.5, 0.0, 1.0 );
+# float smooth_mix = smoothstep(0.0, 1.0, mixer);
+# float linear = mix(f0, f1, mixer);
+# float smoothed = mix(f0, f1, smooth_mix);
+#
+# return mix(linear, smoothed, interpolation);
+#}
+
+static func anisotropic(uv : Vector2, size : Vector2, pseed : float, smoothness : float, interpolation : float) -> float:
+ var seed2 : Vector2 = Commons.rand2(Vector2(pseed, 1.0 - pseed))
+
+ var xy : Vector2 = Commons.floorv2(uv * size)
+ var s2xy : Vector2 = seed2
+ s2xy.x += xy.y
+ s2xy.y += xy.y
+
+ var offset : Vector2 = Vector2(Commons.rand(s2xy), 0.0)
+ var xy_offset : Vector2 = Commons.floorv2(uv * size + offset)
+
+ var f0 : float = Commons.rand(seed2 + Commons.modv2(xy_offset, size));
+ var f1 : float = Commons.rand(seed2 + Commons.modv2(xy_offset + Vector2(1.0, 0.0), size))
+ var mixer : float = clamp((Commons.fract(uv.x * size.x + offset.x) - 0.5) / smoothness + 0.5, 0.0, 1.0)
+ var smooth_mix : float = smoothstep(0.0, 1.0, mixer)
+ var linear : float = lerp(f0, f1, mixer)
+ var smoothed : float = lerp(f0, f1, smooth_mix)
+
+ return lerp(linear, smoothed, interpolation)
+
+#vec3 color_dots(vec2 uv, float size, float seed) {
+# vec2 seed2 = rand2(vec2(seed, 1.0-seed));
+# uv /= size;
+# vec2 point_pos = floor(uv)+vec2(0.5);
+# return rand3(seed2+point_pos);
+#}
+
+static func color_dots(uv : Vector2, size : float, pseed : float) -> Vector3:
+ var seed2 : Vector2 = Commons.rand2(Vector2(pseed, 1.0 - pseed))
+
+ uv /= size
+
+ var point_pos : Vector2 = Commons.floorv2(uv) + Vector2(0.5, 0.5)
+
+ return Commons.rand3(seed2 + point_pos)
+
+static func noise_color(uv : Vector2, size : float, pseed : float) -> Color:
+ var v : Vector3 = color_dots(uv, 1.0 / size, pseed)
+
+ return Color(v.x, v.y, v.z, 1)
+
diff --git a/modules/material_maker/mat_maker_gd/nodes/common/patterns.gd b/modules/material_maker/mat_maker_gd/nodes/common/patterns.gd
new file mode 100644
index 000000000..cbbd80e3d
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/common/patterns.gd
@@ -0,0 +1,1170 @@
+tool
+extends Reference
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+
+#----------------------
+#beehive.mmg
+#Outputs: (beehive_1c, beehive_2c, beehive_3c TODO make common code parameters)
+#Common
+#vec2 $(name_uv)_uv = $uv*vec2($sx, $sy*1.73205080757);
+#vec4 $(name_uv)_center = beehive_center($(name_uv)_uv);
+
+#Output (float) - Shows the greyscale pattern
+#1.0-2.0*beehive_dist($(name_uv)_center.xy)
+
+#Random color (rgb) - Shows a random color for each hexagonal tile
+#rand3(fract($(name_uv)_center.zw/vec2($sx, $sy))+vec2(float($seed)))
+
+#UV map (rgb) - Shows an UV map to be connected to the UV map port of the Custom UV node
+#vec3(vec2(0.5)+$(name_uv)_center.xy, rand(fract($(name_uv)_center.zw/vec2($sx, $sy))+vec2(float($seed))))
+
+#Inputs:
+#size, vector2, default: 2, min: 1, max: 64, step: 1
+
+#----------------------
+#pattern.mmg
+#Outputs: $(name)_fct($(uv))
+
+#Combiner, enum, default: 0, values (CombinerType): Multiply, Add, Max, Min, Xor, Pow
+#Pattern_x_type, enum, default: 5, values (CombinerAxisType): Sine, Triangle, Square, Sawtooth, Constant, Bounce
+#Pattern_y_type, enum, default: 5, values (CombinerAxisType): Sine, Triangle, Square, Sawtooth, Constant, Bounce
+#Pattern_Repeat, vector2, min: 0, max: 32, default:4, step: 1
+
+#----------------------
+#bricks.mmg
+
+#Outputs:
+
+#Common
+#vec4 $(name_uv)_rect = bricks_$pattern($uv, vec2($columns, $rows), $repeat, $row_offset);
+#vec4 $(name_uv) = brick($uv, $(name_uv)_rect.xy, $(name_uv)_rect.zw, $mortar*$mortar_map($uv), $round*$round_map($uv), max(0.001, $bevel*$bevel_map($uv)));
+
+#Bricks pattern (float) - A greyscale image that shows the bricks pattern
+#$(name_uv).x
+
+#Random color (rgb) - A random color for each brick
+#brick_random_color($(name_uv)_rect.xy, $(name_uv)_rect.zw, float($seed))
+
+#Position.x (float) - The position of each brick along the X axis",
+#$(name_uv).y
+
+#Position.y (float) - The position of each brick along the Y axis
+#$(name_uv).z
+
+#Brick UV (rgb) - An UV map output for each brick, to be connected to the Map input of a CustomUV node
+#brick_uv($uv, $(name_uv)_rect.xy, $(name_uv)_rect.zw, float($seed))
+
+#Corner UV (rgb) - An UV map output for each brick corner, to be connected to the Map input of a CustomUV node
+#brick_corner_uv($uv, $(name_uv)_rect.xy, $(name_uv)_rect.zw, $mortar*$mortar_map($uv), $corner, float($seed))
+
+#Direction (float) - The direction of each brick (white: horizontal, black: vertical)
+#0.5*(sign($(name_uv)_rect.z-$(name_uv)_rect.x-$(name_uv)_rect.w+$(name_uv)_rect.y)+1.0)
+
+#Inputs:
+#type / Pattern, enum, default: 0, values: Running Bond,Running Bond (2),HerringBone,Basket Weave,Spanish Bond
+#repeat, int, min: 1, max: 8, default: 1, step:1
+#rows, int, min: 1, max: 64, default: 6, step:1
+#columns, int, min: 1, max: 64, default: 6, step:1
+#offset, float, min: 0, max: 1, default: 0.5, step:0.01
+#mortar, float, min: 0, max: 0.5, default: 0.1, step:0.01 (universal input)
+#bevel, float, min: 0, max: 0.5, default: 0.1, step:0.01 (universal input)
+#round, float, min: 0, max: 0.5, default: 0.1, step:0.01 (universal input)
+#corner, float, min: 0, max: 0.5, default: 0.1, step:0.01
+
+#----------------------
+#bricks_uneven.mmg
+
+#Outputs:
+
+#Common
+#vec4 $(name_uv)_rect = bricks_uneven($uv, int($iterations), $min_size, $randomness, float($seed));
+#vec4 $(name_uv) = brick2($uv, $(name_uv)_rect.xy, $(name_uv)_rect.zw, $mortar*$mortar_map($uv), $round*$round_map($uv), max(0.00001, $bevel*$bevel_map($uv)));
+
+#Bricks pattern (float) - A greyscale image that shows the bricks pattern
+#$(name_uv).x
+
+#Random color (rgb) - A random color for each brick
+#rand3(fract($(name_uv)_rect.xy)+rand2(vec2(float($seed))))
+
+#Position.x (float) - The position of each brick along the X axis",
+#$(name_uv).y
+
+#Position.y (float) - The position of each brick along the Y axis
+#$(name_uv).z
+
+#Brick UV (rgb) - An UV map output for each brick, to be connected to the Map input of a CustomUV node
+#brick_uv($uv, $(name_uv)_rect.xy, $(name_uv)_rect.zw, float($seed))
+
+#Corner UV (rgb) - An UV map output for each brick corner, to be connected to the Map input of a CustomUV node
+#brick_corner_uv($uv, $(name_uv)_rect.xy, $(name_uv)_rect.zw, $mortar*$mortar_map($uv), $corner, float($seed))
+
+#Direction (float) - The direction of each brick (white: horizontal, black: vertical)
+#0.5*(sign($(name_uv)_rect.z-$(name_uv)_rect.x-$(name_uv)_rect.w+$(name_uv)_rect.y)+1.0)
+
+#Inputs:
+#iterations, int, min: 1, max: 16, default:8, step:1
+#min_size, float, min: 0, max: 0.5, default: 0.3, step:0.01
+#randomness, float, min: 0, max: 1, default: 0.5, step:0.01
+#mortar, float, min: 0, max: 0.5, default: 0.1, step:0.01 (universal input)
+#bevel, float, min: 0, max: 0.5, default: 0.1, step:0.01 (universal input)
+#round, float, min: 0, max: 0.5, default: 0.1, step:0.01 (universal input)
+#corner, float, min: 0, max: 0.5, default: 0.1, step:0.01
+
+#----------------------
+#runes.mmg (includes sdline.mmg)
+#Generates a grid filled with random runes
+
+#Outputs:
+
+#Output (float) - A greyscale image showing random runes.
+#Rune(vec2($columns, $rows)*$uv, float($seed))
+
+#Inputs:
+#size, vector2, default: 4, min: 2, max: 32, step: 1
+
+#----------------------
+#scratches.mmg
+#Draws white scratches on a black background
+
+#Outputs:
+
+#Output (float) - Shows white scratches on a black background
+#scratches($uv, int($layers), vec2($length, $width), $waviness, $angle, $randomness, vec2(float($seed), 0.0))
+
+#Inputs:
+
+#scratch_size (l, w), vector2, min: 0.1, max: 1, default: (0.25, 0.5), step:0.01
+#layers, float, min: 1, max: 10, default: 4, step:1
+#waviness, float, min: 0, max: 1, default: 0.5, step:0.01
+#angle, float, min: -180, max: 180, default: 0, step:1
+#randomness, float, min: 0, max: 1, default: 0.5, step:0.01
+
+#----------------------
+#iching.mmg
+#This node generates a grid of random I Ching hexagrams.
+
+#Outputs:
+
+#Output (float) - A greyscale image showing random I Ching hexagrams.
+#IChing(vec2($columns, $rows)*$uv, float($seed))
+
+#Inputs:
+#size, vector2, default: 2, min: 2, max: 32, step: 1
+
+#----------------------
+#weave.mmg
+
+#Outputs:
+
+#Output (float) - Shows the generated greyscale weave pattern.
+#weave($uv, vec2($columns, $rows), $width*$width_map($uv))
+
+#Inputs:
+#size, vector2, default: 4, min: 2, max: 32, step: 1
+#width, float, min: 0, max: 1, default: 0.8, step:0.05 (universal input)
+
+#----------------------
+#weave2.mmg
+
+#code
+#vec3 $(name_uv) = weave2($uv, vec2($columns, $rows), $stitch, $width_x*$width_map($uv), $width_y*$width_map($uv));
+
+#Outputs:
+
+#Output (float) - Shows the generated greyscale weave pattern.
+#$(name_uv).x
+
+#Horizontal mask (float) - Horizontal mask
+#$(name_uv).y
+
+#Vertical mask (float) - Mask for vertical stripes
+#$(name_uv).z
+
+#Inputs:
+#size, vector2, default: 4, min: 2, max: 32, step: 1
+#width, vector2, default: 0.8, min: 0, max: 1, step: 0.05
+#stitch, float, min: 0, max: 10, default: 1, step:1
+#width_map, float, default: 1, (does not need input val (label)) (universal input)
+
+#----------------------
+#truchet.mmg
+
+#Outputs:
+
+#line: $shape = 1
+#circle: $shape = 2
+
+#Output (float) - Shows a greyscale image of the truchet pattern.
+#truchet$shape($uv*$size, vec2(float($seed)))
+
+#Inputs:
+#shape, enum, default: 0, values: line, circle
+#size, float, default: 4, min: 2, max: 64, step: 1
+
+#----------------------
+#truchet_generic.mmg
+
+#Outputs:
+
+#Output (color)
+#$in(truchet_generic_uv($uv*$size, vec2(float($seed))))
+
+#Inputs:
+#in, color, default: color(1.0)
+#size, float, default: 4, min: 2, max: 64, step: 1
+
+#----------------------
+#arc_pavement.mmg
+#Draws a white shape on a black background
+
+# "code": "vec2 $(name_uv)_uv = fract($uv)*vec2($repeat, -1.0);\nvec2 $(name_uv)_seed;\nvec4 $(name_uv)_ap = arc_pavement($(name_uv)_uv, $rows, $bricks, $(name_uv)_seed);\n",
+# "outputs": [
+# {
+# "f": "pavement($(name_uv)_ap.zw, $bevel, 2.0*$mortar)",
+# "longdesc": "A greyscale image that shows the bricks pattern",
+# "shortdesc": "Bricks pattern",
+# "type": "f"
+# },
+# {
+# "longdesc": "A random color for each brick",
+# "rgb": "rand3($(name_uv)_seed)",
+# "shortdesc": "Random color",
+# "type": "rgb"
+# },
+# {
+# "longdesc": "An UV map output for each brick, to be connected to the Map input of a CustomUV node",
+# "rgb": "vec3($(name_uv)_ap.zw, 0.0)",
+# "shortdesc": "Brick UV",
+# "type": "rgb"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 2,
+# "label": "Repeat:",
+# "longdesc": "The number of repetitions of the whole pattern",
+# "max": 4,
+# "min": 1,
+# "name": "repeat",
+# "shortdesc": "Repeat",
+# "step": 1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 8,
+# "label": "Rows:",
+# "longdesc": "The number of rows",
+# "max": 16,
+# "min": 4,
+# "name": "rows",
+# "shortdesc": "Rows",
+# "step": 1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 8,
+# "label": "Bricks:",
+# "longdesc": "The number of bricks per row",
+# "max": 16,
+# "min": 4,
+# "name": "bricks",
+# "shortdesc": "Bricks",
+# "step": 1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0.1,
+# "label": "Mortar:",
+# "longdesc": "The width of the space between bricks",
+# "max": 0.5,
+# "min": 0,
+# "name": "mortar",
+# "shortdesc": "Mortar",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0.1,
+# "label": "Bevel:",
+# "longdesc": "The width of the edge of each brick",
+# "max": 0.5,
+# "min": 0,
+# "name": "bevel",
+# "shortdesc": "Bevel",
+# "step": 0.01,
+# "type": "float"
+# }
+# ]
+
+#----------------------
+#sine_wave.mmg
+#Draws a greyscale sine wave pattern
+
+#Outputs:
+#Output, float, Shows a greyscale image of a sine wave
+#1.0-abs(2.0*($uv.y-0.5)-$amplitude*sin(($frequency*$uv.x+$phase)*6.28318530718))
+
+#Inputs:
+#amplitude, float, min: 0, max: 1, step: 0.01, default: 0.5
+#frequency, float, min: 0, max: 16, default: 1
+#phase, float, min: 0, max: 1, step: 0.01, default: 0.5
+
+enum CombinerAxisType {
+ SINE,
+ TRIANGLE,
+ SQUARE,
+ SAWTOOTH,
+ CONSTANT,
+ BOUNCE
+}
+
+enum CombinerType {
+ MULTIPLY,
+ ADD,
+ MAX,
+ MIN,
+ XOR,
+ POW
+}
+
+#"Sine,Triangle,Square,Sawtooth,Constant,Bounce"
+#"Multiply,Add,Max,Min,Xor,Pow"
+
+#float $(name)_fct(vec2 uv) {
+# return mix_$(mix)(wave_$(x_wave)($(x_scale)*uv.x), wave_$(y_wave)($(y_scale)*uv.y));
+#}
+
+static func pattern(uv : Vector2, x_scale : float, y_scale : float, ct : int, catx : int, caty : int) -> float:
+ var x : float = 0
+ var y : float = 0
+
+ if catx == CombinerAxisType.SINE:
+ x = Commons.wave_sine(x_scale * uv.x)
+ elif catx == CombinerAxisType.TRIANGLE:
+ x = Commons.wave_triangle(x_scale * uv.x)
+ elif catx == CombinerAxisType.SQUARE:
+ x = Commons.wave_square(x_scale * uv.x)
+ elif catx == CombinerAxisType.SAWTOOTH:
+ x = Commons.wave_sawtooth(x_scale * uv.x)
+ elif catx == CombinerAxisType.CONSTANT:
+ x = Commons.wave_constant(x_scale * uv.x)
+ elif catx == CombinerAxisType.BOUNCE:
+ x = Commons.wave_bounce(x_scale * uv.x)
+
+ if caty == CombinerAxisType.SINE:
+ y = Commons.wave_sine(y_scale * uv.y)
+ elif caty == CombinerAxisType.TRIANGLE:
+ y = Commons.wave_triangle(y_scale * uv.y)
+ elif caty == CombinerAxisType.SQUARE:
+ y = Commons.wave_square(y_scale * uv.y)
+ elif caty == CombinerAxisType.SAWTOOTH:
+ y = Commons.wave_sawtooth(y_scale * uv.y)
+ elif caty == CombinerAxisType.CONSTANT:
+ y = Commons.wave_constant(y_scale * uv.y)
+ elif caty == CombinerAxisType.BOUNCE:
+ y = Commons.wave_bounce(y_scale * uv.y)
+
+ if ct == CombinerType.MULTIPLY:
+ return Commons.mix_mul(x, y)
+ elif ct == CombinerType.ADD:
+ return Commons.mix_add(x, y);
+ elif ct == CombinerType.MAX:
+ return Commons.mix_max(x, y);
+ elif ct == CombinerType.MIN:
+ return Commons.mix_min(x, y);
+ elif ct == CombinerType.XOR:
+ return Commons.mix_xor(x, y);
+ elif ct == CombinerType.POW:
+ return Commons.mix_pow(x, y);
+
+ return 0.0
+
+
+#"Line,Circle"
+
+static func truchet1c(uv : Vector2, size : float, pseed : float) -> Color:
+ var f : float = truchet1(uv * size, Vector2(pseed, pseed))
+ return Color(f, f, f, 1);
+
+#float truchet1(vec2 uv, vec2 seed) {
+# vec2 i = floor(uv);
+# vec2 f = fract(uv)-vec2(0.5);
+#
+# return 1.0-abs(abs((2.0*step(rand(i+seed), 0.5)-1.0)*f.x+f.y)-0.5);
+#}
+
+static func truchet1(uv : Vector2, pseed : Vector2) -> float:
+ var i : Vector2 = Commons.floorv2(uv);
+ var f : Vector2 = Commons.fractv2(uv) - Vector2(0.5, 0.5);
+
+ return 1.0 - abs(abs((2.0 * Commons.step(Commons.rand(i + pseed), 0.5) - 1.0) * f.x + f.y) - 0.5);
+
+static func truchet2c(uv : Vector2, size : float, pseed : float) -> Color:
+ var f : float = truchet2(uv * size, Vector2(pseed, pseed))
+ return Color(f, f, f, 1);
+
+#float truchet2(vec2 uv, vec2 seed) {
+# vec2 i = floor(uv);
+# vec2 f = fract(uv);
+# float random = step(rand(i+seed), 0.5);
+#
+# f.x *= 2.0*random-1.0;
+# f.x += 1.0-random;
+#
+# return 1.0-min(abs(length(f)-0.5), abs(length(1.0-f)-0.5));
+#}
+
+static func truchet2(uv : Vector2, pseed : Vector2) -> float:
+ var i : Vector2 = Commons.floorv2(uv);
+ var f : Vector2 = Commons.fractv2(uv);
+ var random : float = Commons.step(Commons.rand(i + pseed), 0.5);
+
+ f.x *= 2.0 * random - 1.0;
+ f.x += 1.0 - random;
+
+ return 1.0 - min(abs(f.length() - 0.5), abs((Vector2(1, 1) - f).length() - 0.5));
+
+static func weavec(uv : Vector2, count : Vector2, width : float) -> Color:
+ var f : float = weave(uv, count, width);
+
+ return Color(f, f, f, 1)
+
+#float weave(vec2 uv, vec2 count, float width) {
+# uv *= count;
+# float c = (sin(3.1415926*(uv.x+floor(uv.y)))*0.5+0.5)*step(abs(fract(uv.y)-0.5), width*0.5);
+# c = max(c, (sin(3.1415926*(1.0+uv.y+floor(uv.x)))*0.5+0.5)*step(abs(fract(uv.x)-0.5), width*0.5));
+# return c;
+#}
+
+static func weave(uv : Vector2, count : Vector2, width : float) -> float:
+ uv *= count;
+ var c : float = (sin(3.1415926* (uv.x + floor(uv.y)))*0.5+0.5)*Commons.step(abs(Commons.fract(uv.y)-0.5), width*0.5);
+ c = max(c, (sin(3.1415926*(1.0+uv.y+floor(uv.x)))*0.5+0.5)*Commons.step(abs(Commons.fract(uv.x)-0.5), width*0.5));
+ return c;
+
+#vec3 weave2(vec2 uv, vec2 count, float stitch, float width_x, float width_y) {
+# uv *= stitch;
+# uv *= count;
+# float c1 = (sin(3.1415926 / stitch * (uv.x + floor(uv.y) - (stitch - 1.0))) * 0.25 + 0.75 ) *step(abs(fract(uv.y)-0.5), width_x*0.5);
+# float c2 = (sin(3.1415926 / stitch * (1.0+uv.y+floor(uv.x) ))* 0.25 + 0.75 )*step(abs(fract(uv.x)-0.5), width_y*0.5);
+# return vec3(max(c1, c2), 1.0-step(c1, c2), 1.0-step(c2, c1));
+#}
+
+static func weave2(uv : Vector2, count : Vector2, stitch : float, width_x : float, width_y : float) -> Vector3:
+ uv.x *= stitch
+ uv.y *= stitch
+ uv *= count
+
+ var c1 : float = (sin(3.1415926 / stitch * (uv.x + floor(uv.y) - (stitch - 1.0))) * 0.25 + 0.75 ) * Commons.step(abs(Commons.fract(uv.y) - 0.5), width_x * 0.5);
+ var c2 : float = (sin(3.1415926 / stitch * (1.0 + uv.y + floor(uv.x) ))* 0.25 + 0.75 ) * Commons.step(abs(Commons.fract(uv.x)-0.5), width_y * 0.5);
+
+ return Vector3(max(c1, c2), 1.0 - Commons.step(c1, c2), 1.0 - Commons.step(c2, c1));
+
+static func sinewavec(uv : Vector2, amplitude : float, frequency : float, phase : float) -> Color:
+ var f : float = 1.0- abs(2.0 * (uv.y-0.5) - amplitude * sin((frequency* uv.x + phase) * 6.28318530718));
+
+ return Color(f, f, f, 1)
+
+static func sinewavef(uv : Vector2, amplitude : float, frequency : float, phase : float) -> float:
+ return 1.0- abs(2.0 * (uv.y-0.5) - amplitude * sin((frequency* uv.x + phase) * 6.28318530718));
+
+#float scratch(vec2 uv, vec2 size, float waviness, float angle, float randomness, vec2 seed) {
+# float subdivide = floor(1.0/size.x);
+# float cut = size.x*subdivide;
+#
+# uv *= subdivide;
+#
+# vec2 r1 = rand2(floor(uv)+seed);
+# vec2 r2 = rand2(r1);
+#
+# uv = fract(uv);
+# vec2 border = 10.0*min(fract(uv), 1.0-fract(uv));
+# uv = 2.0*uv-vec2(1.0);
+#
+# float a = 6.28318530718*(angle+(r1.x-0.5)*randomness);
+# float c = cos(a);
+# float s = sin(a);
+#
+# uv = vec2(c*uv.x+s*uv.y, s*uv.x-c*uv.y);
+# uv.y += 2.0*r1.y-1.0;
+# uv.y += 0.5*waviness*cos(2.0*uv.x+6.28318530718*r2.y);
+# uv.x /= cut;
+# uv.y /= subdivide*size.y;
+#
+# return min(border.x, border.y)*(1.0-uv.x*uv.x)*max(0.0, 1.0-1000.0*uv.y*uv.y);
+#}
+
+static func scratch(uv : Vector2, size : Vector2, waviness : float, angle : float, randomness : float, pseed : Vector2) -> float:
+ var subdivide : float = floor(1.0/size.x);
+ var cut : float = size.x*subdivide;
+ uv *= subdivide;
+ var r1 : Vector2 = Commons.rand2(Commons.floorv2(uv) + pseed);
+ var r2 : Vector2 = Commons.rand2(r1);
+ uv = Commons.fractv2(uv);
+ uv = 2.0 * uv - Vector2(1, 1);
+
+ var a : float = 6.28*(angle+(r1.x-0.5)*randomness);
+ var c : float = cos(a);
+ var s : float = sin(a);
+
+ uv = Vector2(c*uv.x+s*uv.y, s*uv.x-c*uv.y);
+ uv.y += 2.0*r1.y-1.0;
+ uv.y += 0.5*waviness*cos(2.0*uv.x+6.28*r2.y);
+ uv.x /= cut;
+ uv.y /= subdivide*size.y;
+
+ return (1.0-uv.x*uv.x)*max(0.0, 1.0-1000.0*uv.y*uv.y);
+
+#float scratches(vec2 uv, int layers, vec2 size, float waviness, float angle, float randomness, vec2 seed) {
+# float v = 0.0;
+#
+# for (int i = 0; i < layers; ++i) {
+# seed = rand2(seed);
+# v = max(v, scratch(fract(uv+seed), size, waviness, angle/360.0, randomness, seed));
+# }
+#
+# return v;
+#}
+
+static func scratches(uv : Vector2, layers : int, size : Vector2, waviness : float, angle : float, randomness : float, pseed : Vector2) -> float:
+ var v : float = 0.0;
+
+ for i in range(layers):# (int i = 0; i < layers; ++i) {
+ pseed = Commons.rand2(pseed);
+ v = max(v, scratch(Commons.fractv2(uv + pseed), size, waviness, angle/360.0, randomness, pseed));
+
+ return v;
+
+static func scratchesc(uv : Vector2, layers : int, size : Vector2, waviness : float, angle : float, randomness : float, pseed : Vector2) -> Color:
+ var f : float = scratches(uv, layers, size, waviness, angle, randomness, pseed)
+
+ return Color(f, f, f, 1)
+
+static func runesc(uv : Vector2, col_row : Vector2, pseed : float) -> Color:
+ var f : float = rune(col_row * uv, pseed);
+
+ return Color(f, f, f, 1)
+
+static func runesf(uv : Vector2, col_row : Vector2, pseed : float) -> float:
+ return rune(col_row * uv, pseed);
+
+#sdline.mmg
+#vec2 sdLine(vec2 p, vec2 a, vec2 b) {
+# vec2 pa = p-a, ba = b-a;
+# float h = clamp(dot(pa,ba)/dot(ba,ba), 0.0, 1.0);
+#
+# return vec2(length(pa-ba*h), h);
+#}
+
+#float ThickLine(vec2 uv, vec2 posA, vec2 posB, float radiusInv){
+# return clamp(1.1-20.0*sdLine(uv, posA, posB).x, 0.0, 1.0);
+#}
+
+#// makes a rune in the 0..1 uv space. Seed is which rune to draw.
+#// passes back gray in x and derivates for lighting in yz
+#float Rune(vec2 uv, float s) {
+# float finalLine = 0.0;
+# vec2 seed = floor(uv)-rand2(vec2(s));
+# uv = fract(uv);
+#
+# for (int i = 0; i < 4; i++) // number of strokes
+# {
+# vec2 posA = rand2(floor(seed+0.5));
+# vec2 posB = rand2(floor(seed+1.5));
+# seed += 2.0;
+# // expand the range and mod it to get a nicely distributed random number - hopefully. :)
+# posA = fract(posA * 128.0);
+# posB = fract(posB * 128.0);
+# // each rune touches the edge of its box on all 4 sides
+#
+# if (i == 0) posA.y = 0.0;
+# if (i == 1) posA.x = 0.999;
+# if (i == 2) posA.x = 0.0;
+# if (i == 3) posA.y = 0.999;
+#
+# // snap the random line endpoints to a grid 2x3
+# vec2 snaps = vec2(2.0, 3.0);
+# posA = (floor(posA * snaps) + 0.5) / snaps; // + 0.5 to center it in a grid cell
+# posB = (floor(posB * snaps) + 0.5) / snaps;
+#
+# //if (distance(posA, posB) < 0.0001) continue;
+# // eliminate dots.
+# // Dots (degenerate lines) are not cross-GPU safe without adding 0.001 - divide by 0 error.
+# finalLine = max(finalLine, ThickLine(uv, posA, posB + 0.001, 20.0));
+# }
+#
+# return finalLine;
+#}
+
+# makes a rune in the 0..1 uv space. Seed is which rune to draw.
+# passes back gray in x and derivates for lighting in yz
+static func rune(uv : Vector2, pseed : float) -> float:
+ var finalLine : float = 0.0;
+ var sseed : Vector2 = Commons.floorv2(uv) - Vector2(pseed, pseed);
+
+ uv = Commons.fractv2(uv);
+
+ for i in range(4):# (int i = 0; i < 4; i++): # // number of strokes
+ var posA : Vector2 = Commons.rand2(Commons.floorv2(sseed + Vector2(0.5, 0.5)));
+ var posB : Vector2 = Commons.rand2(Commons.floorv2(sseed + Vector2(1.5, 1.5)));
+ sseed.x += 2.0;
+ sseed.y += 2.0;
+
+ # expand the range and mod it to get a nicely distributed random number - hopefully. :)
+
+ posA = Commons.fractv2(posA * 128.0);
+ posB = Commons.fractv2(posB * 128.0);
+
+ # each rune touches the edge of its box on all 4 sides
+ if (i == 0):
+ posA.y = 0.0;
+
+ if (i == 1):
+ posA.x = 0.999;
+
+ if (i == 2):
+ posA.x = 0.0;
+
+ if (i == 3):
+ posA.y = 0.999;
+
+ # snap the random line endpoints to a grid 2x3
+
+ var snaps : Vector2 = Vector2(2.0, 3.0);
+
+ posA = (Commons.floorv2(posA * snaps) + Vector2(0.5, 0.5)) / snaps; # + 0.5 to center it in a grid cell
+ posB = (Commons.floorv2(posB * snaps) + Vector2(0.5, 0.5)) / snaps;
+
+ #if (distance(posA, posB) < 0.0001) continue; // eliminate dots.
+ # Dots (degenerate lines) are not cross-GPU safe without adding 0.001 - divide by 0 error.
+
+ finalLine = max(finalLine, Commons.ThickLine(uv, posA, posB + Vector2(0.001, 0.001), 20.0));
+
+ return finalLine;
+
+static func IChingc(uv : Vector2, row_col : Vector2, pseed : int) -> Color:
+ var f : float = IChing(row_col * uv, float(pseed));
+
+ return Color(f, f, f, 1)
+
+#float IChing(vec2 uv, float seed) {
+# int value = int(32.0*rand(floor(uv)+vec2(seed)));
+# float base = step(0.5, fract(fract(uv.y)*6.5))*step(0.04, fract(uv.y+0.02))*step(0.2, fract(uv.x+0.1));
+# int bit = int(fract(uv.y)*6.5);
+#
+# return base*step(0.1*step(float(bit & value), 0.5), fract(uv.x+0.55));
+#}
+
+static func IChing(uv : Vector2, pseed : float) -> float:
+ var value : int = int(32.0 * Commons.rand(Commons.floorv2(uv) + Vector2(pseed, pseed)));
+ var base : float = Commons.step(0.5, Commons.fract(Commons.fract(uv.y)*6.5))*Commons.step(0.04, Commons.fract(uv.y+0.02)) * Commons.step(0.2, Commons.fract(uv.x+0.1));
+ var bit : int = int(Commons.fract(uv.y)*6.5);
+
+ return base * Commons.step(0.1*Commons.step(float(bit & value), 0.5), Commons.fract(uv.x+0.55));
+
+#Beehive output 1
+#Shows the greyscale pattern
+#vec2 $(name_uv)_uv = $uv*vec2($sx, $sy*1.73205080757);
+#vec4 $(name_uv)_center = beehive_center($(name_uv)_uv);
+#1.0-2.0*beehive_dist($(name_uv)_center.xy)
+
+static func beehive_1c(uv : Vector2, size : Vector2, pseed : int) -> Color:
+ var o80035_0_uv : Vector2 = uv * Vector2(size.x, size.y * 1.73205080757);
+ var center : Color = beehive_center(o80035_0_uv);
+
+ var f : float = 1.0 - 2.0 * beehive_dist(Vector2(center.r, center.g));
+
+ return Color(f, f, f, 1)
+
+#Beehive output 2
+#Shows a random color for each hexagonal tile
+#vec2 $(name_uv)_uv = $uv*vec2($sx, $sy*1.73205080757);
+#vec4 $(name_uv)_center = beehive_center($(name_uv)_uv);
+#rand3(fract($(name_uv)_center.zw/vec2($sx, $sy))+vec2(float($seed)))
+
+static func beehive_2c(uv : Vector2, size : Vector2, pseed : int) -> Color:
+ var o80035_0_uv : Vector2 = uv * Vector2(size.x, size.y * 1.73205080757);
+ var center : Color = beehive_center(o80035_0_uv);
+
+ var f : float = 1.0 - 2.0 * beehive_dist(Vector2(center.r, center.g));
+
+ var v : Vector3 = Commons.rand3(Commons.fractv2(Vector2(center.b, center.a) / Vector2(size.x, size.y)) + Vector2(float(pseed),float(pseed)));
+
+ return Color(v.x, v.y, v.z, 1)
+
+#Beehive output 3
+#Shows an UV map to be connected to the UV map port of the Custom UV node
+#vec3(vec2(0.5)+$(name_uv)_center.xy, rand(fract($(name_uv)_center.zw/vec2($sx, $sy))+vec2(float($seed))))
+#vec2 $(name_uv)_uv = $uv*vec2($sx, $sy*1.73205080757);
+#vec4 $(name_uv)_center = beehive_center($(name_uv)_uv);
+
+static func beehive_3c(uv : Vector2, size : Vector2, pseed : int) -> Color:
+ var o80035_0_uv : Vector2 = uv * Vector2(size.x, size.y * 1.73205080757);
+ var center : Color = beehive_center(o80035_0_uv);
+
+ #var f : float = 1.0 - 2.0 * beehive_dist(Vector2(center.r, center.g));
+
+ var v1 : Vector2 = Vector2(0.5, 0.5) + Vector2(center.r, center.g)
+ var ff : float = Commons.rand(Commons.fractv2(Vector2(center.b, center.a) / Vector2(size.x, size.y)) + Vector2(float(pseed), float(pseed)))
+
+ var c : Color = Color(v1.x, v1.y, ff, ff);
+
+ return c
+
+#float beehive_dist(vec2 p){
+# ec2 s = vec2(1.0, 1.73205080757);
+# p = abs(p);
+# return max(dot(p, s*.5), p.x);
+#}
+
+static func beehive_dist(p : Vector2) -> float:
+ var s : Vector2 = Vector2(1.0, 1.73205080757);
+
+ p = Commons.absv2(p);
+
+ return max(p.dot(s*.5), p.x);
+
+#vec4 beehive_center(vec2 p) {
+# vec2 s = vec2(1.0, 1.73205080757);
+# vec4 hC = floor(vec4(p, p - vec2(.5, 1)) / vec4(s,s)) + .5;
+# vec4 h = vec4(p - hC.xy*s, p - (hC.zw + .5)*s);
+# return dot(h.xy, h.xy) Color:
+ var s : Vector2 = Vector2(1.0, 1.73205080757);
+
+ var hC : Color = Color(p.x, p.y, p.x - 0.5, p.y - 1) / Color(s.x, s.y, s.x, s.y);
+
+ hC = Commons.floorc(Color(p.x, p.y, p.x - 0.5, p.y - 1) / Color(s.x, s.y, s.x, s.y)) + Color(0.5, 0.5, 0.5, 0.5);
+
+ var v1 : Vector2 = Vector2(p.x - hC.r * s.x, p.y - hC.g * s.y)
+ var v2 : Vector2 = Vector2(p.x - (hC.b + 0.5) * s.x, p.y - (hC.a + 0.5) * s.y)
+
+ var h : Color = Color(v1.x, v1.y, v2.x, v2.y);
+
+ if Vector2(h.r, h.g).dot(Vector2(h.r, h.g)) < Vector2(h.b, h.a).dot(Vector2(h.b, h.a)):
+ return Color(h.r, h.g, hC.r, hC.g)
+ else:
+ return Color(h.b, h.a, hC.b + 9.73, hC.a + 9.73)
+
+ #return dot(h.xy, h.xy) < dot(h.zw, h.zw) ? Color(h.xy, hC.xy) : Color(h.zw, hC.zw + 9.73);
+
+#vec3 brick_corner_uv(vec2 uv, vec2 bmin, vec2 bmax, float mortar, float corner, float seed) {
+# vec2 center = 0.5*(bmin + bmax);
+# vec2 size = bmax - bmin;
+#
+# float max_size = max(size.x, size.y);
+# float min_size = min(size.x, size.y);
+#
+# mortar *= min_size;
+# corner *= min_size;
+#
+# return vec3(clamp((0.5*size-vec2(mortar)-abs(uv-center))/corner, vec2(0.0), vec2(1.0)), rand(fract(center)+vec2(seed)+ceil(vec2(uv-center))));
+#}
+
+static func brick_corner_uv(uv : Vector2, bmin : Vector2, bmax : Vector2, mortar : float, corner : float, pseed : float) -> Vector3:
+ var center : Vector2 = 0.5 * (bmin + bmax)
+ var size : Vector2 = bmax - bmin
+ var max_size : float = max(size.x, size.y)
+ var min_size : float = min(size.x, size.y)
+ mortar *= min_size
+ corner *= min_size
+
+ var r : Vector3 = Vector3()
+
+ r.x = clamp(((0.5 * size.x - mortar) - abs(uv.x - center.x)) / corner, 0, 1)
+ r.y = clamp(((0.5 * size.y - mortar) - abs(uv.y - center.y)) / corner, 0, 1)
+ r.z = Commons.rand(Commons.fractv2(center) + Vector2(pseed, pseed))
+
+ return r
+
+# return vec3(clamp((0.5*size-vec2(mortar)-abs(uv-center))/corner, vec2(0.0), vec2(1.0)), rand(fract(center)+vec2(seed)));
+
+#vec4 brick(vec2 uv, vec2 bmin, vec2 bmax, float mortar, float round, float bevel) {
+# float color;
+# vec2 size = bmax - bmin;
+# float min_size = min(size.x, size.y);
+#
+# mortar *= min_size;
+# bevel *= min_size;
+# round *= min_size;
+# vec2 center = 0.5*(bmin+bmax);
+# vec2 d = abs(uv-center)-0.5*(size)+vec2(round+mortar);
+#
+# color = length(max(d,vec2(0))) + min(max(d.x,d.y),0.0)-round;
+# color = clamp(-color/bevel, 0.0, 1.0);
+# vec2 tiled_brick_pos = mod(bmin, vec2(1.0, 1.0));
+#
+# return vec4(color, center, tiled_brick_pos.x+7.0*tiled_brick_pos.y);
+#}
+
+static func brick(uv : Vector2, bmin : Vector2, bmax : Vector2, mortar : float, pround : float, bevel : float) -> Color:
+ var color : float
+ var size : Vector2 = bmax - bmin
+
+ var min_size : float = min(size.x, size.y)
+ mortar *= min_size
+ bevel *= min_size
+ pround *= min_size
+
+ var center : Vector2 = 0.5 * (bmin + bmax)
+ var d : Vector2 = Vector2()
+
+ d.x = abs(uv.x - center.x) - 0.5 * (size.x) + (pround + mortar)
+ d.y = abs(uv.y - center.y) - 0.5 * (size.y) + (pround + mortar)
+
+ color = Vector2(max(d.x, 0), max(d.y, 0)).length() + min(max(d.x, d.y), 0.0) - pround
+
+ color = clamp(-color / bevel, 0.0, 1.0)
+
+# var tiled_brick_pos : Vector2 = Vector2(bmin.x - 1.0 * floor(bmin.x / 1.0), bmin.y - 1.0 * floor(bmin.y / 1.0))
+
+ var tiled_brick_pos_x : float = bmin.x - 1.0 * floor(bmin.x / 1.0)
+ var tiled_brick_pos_y : float = bmin.y - 1.0 * floor(bmin.y / 1.0)
+
+ #vec2 tiled_brick_pos = mod(bmin, vec2(1.0, 1.0));
+
+ return Color(color, center.x, center.y, tiled_brick_pos_x + 7.0 * tiled_brick_pos_y)
+
+#vec3 brick_random_color(vec2 bmin, vec2 bmax, float seed) {
+# vec2 center = 0.5*(bmin + bmax);
+# return rand3(fract(center + vec2(seed)));
+#}
+
+static func brick_random_color(bmin : Vector2, bmax : Vector2, pseed : float) -> Vector3:
+ var center : Vector2 = (bmin + bmax)
+ center.x *= 0.5
+ center.y *= 0.5
+
+ return Commons.rand3(Commons.fractv2(center + Vector2(pseed, pseed)));
+
+#vec3 brick_uv(vec2 uv, vec2 bmin, vec2 bmax, float seed) {
+# vec2 center = 0.5*(bmin + bmax);
+# vec2 size = bmax - bmin;
+#
+# float max_size = max(size.x, size.y);
+#
+# return vec3(0.5+(uv-center)/max_size, rand(fract(center)+vec2(seed)));
+#}
+
+static func brick_uv(uv : Vector2, bmin : Vector2, bmax : Vector2, pseed : float) -> Vector3:
+ var center : Vector2 = 0.5 * (bmin + bmax)
+ var size : Vector2 = bmax - bmin
+ var max_size : float = max(size.x, size.y)
+
+ var x : float = 0.5+ (uv.x - center.x) / max_size
+ var y : float = 0.5+ (uv.y - center.y) /max_size
+
+ return Vector3(x, y, Commons.rand(Commons.fractv2(center) + Vector2(pseed, pseed)))
+
+#vec4 bricks_rb(vec2 uv, vec2 count, float repeat, float offset) {
+# count *= repeat;float x_offset = offset*step(0.5, fract(uv.y*count.y*0.5));
+#
+# vec2 bmin = floor(vec2(uv.x*count.x-x_offset, uv.y*count.y));
+#
+# bmin.x += x_offset;
+# bmin /= count;
+#
+# return vec4(bmin, bmin+vec2(1.0)/count);
+#}
+
+static func bricks_rb(uv : Vector2, count : Vector2, repeat : float, offset : float) -> Color:
+ count *= repeat
+
+ var x_offset : float = offset * Commons.step(0.5, Commons.fractf(uv.y * count.y * 0.5))
+
+ var bmin : Vector2
+ bmin.x = floor(uv.x * count.x - x_offset)
+ bmin.y = floor(uv.y * count.y)
+
+ bmin.x += x_offset;
+ bmin /= count
+ var bmc : Vector2 = bmin + Vector2(1.0, 1.0) / count
+
+ return Color(bmin.x, bmin.y, bmc.x, bmc.y)
+
+#vec4 bricks_rb2(vec2 uv, vec2 count, float repeat, float offset) {
+# count *= repeat;
+#
+# float x_offset = offset*step(0.5, fract(uv.y*count.y*0.5));
+# count.x = count.x*(1.0+step(0.5, fract(uv.y*count.y*0.5)));
+#
+# vec2 bmin = floor(vec2(uv.x*count.x-x_offset, uv.y*count.y));
+#
+# bmin.x += x_offset;
+# bmin /= count;
+#
+# return vec4(bmin, bmin+vec2(1.0)/count);
+#}
+
+static func bricks_rb2(uv : Vector2, count : Vector2, repeat : float, offset : float) -> Color:
+ count *= repeat
+
+ var x_offset : float = offset * Commons.step(0.5, Commons.fractf(uv.y * count.y * 0.5))
+ count.x = count.x * (1.0+Commons.step(0.5, Commons.fractf(uv.y * count.y * 0.5)))
+ var bmin : Vector2 = Vector2()
+
+ bmin.x = floor(uv.x * count.x - x_offset)
+ bmin.y = floor(uv.y * count.y)
+
+ bmin.x += x_offset
+ bmin /= count
+
+ var b : Vector2 = bmin + Vector2(1, 1) / count
+
+ return Color(bmin.x, bmin.y, b.x, b.y)
+
+#vec4 bricks_hb(vec2 uv, vec2 count, float repeat, float offset) {
+# float pc = count.x+count.y;
+# float c = pc*repeat;
+# vec2 corner = floor(uv*c);
+# float cdiff = mod(corner.x-corner.y, pc);
+#
+# if (cdiff < count.x) {
+# return vec4((corner-vec2(cdiff, 0.0))/c, (corner-vec2(cdiff, 0.0)+vec2(count.x, 1.0))/c);
+# } else {
+# return vec4((corner-vec2(0.0, pc-cdiff-1.0))/c, (corner-vec2(0.0, pc-cdiff-1.0)+vec2(1.0, count.y))/c);
+# }
+#}
+
+static func bricks_hb(uv : Vector2, count : Vector2, repeat : float, offset : float) -> Color:
+ var pc : float = count.x + count.y
+ var c : float = pc * repeat
+
+ var corner : Vector2 = Vector2(floor(uv.x * c), floor(uv.y * c))
+ var cdiff : float = Commons.modf(corner.x - corner.y, pc)
+
+ if (cdiff < count.x):
+ var col : Color = Color()
+
+ col.r = (corner.x - cdiff) / c
+ col.g = corner.y / c
+
+ col.b = (corner.x - cdiff + count.x) / c
+ col.a = (corner.y + 1.0) / c
+
+ return col
+ else:
+ var col : Color = Color()
+
+ col.r = corner.x / c
+ col.g = (corner.y - (pc - cdiff - 1.0)) / c
+
+ col.b = (corner.x + 1.0) / c
+ col.a = (corner.y - (pc - cdiff - 1.0) + count.y) / c
+
+ return col
+
+#vec4 bricks_bw(vec2 uv, vec2 count, float repeat, float offset) {
+# vec2 c = 2.0*count*repeat;
+# float mc = max(c.x, c.y);
+# vec2 corner1 = floor(uv*c);
+# vec2 corner2 = count*floor(repeat*2.0*uv);
+# float cdiff = mod(dot(floor(repeat*2.0*uv), vec2(1.0)), 2.0);
+# vec2 corner;
+# vec2 size;
+#
+# if (cdiff == 0.0) {
+# orner = vec2(corner1.x, corner2.y);
+# size = vec2(1.0, count.y);
+# } else {
+# corner = vec2(corner2.x, corner1.y);
+# size = vec2(count.x, 1.0);
+# }
+#
+# return vec4(corner/c, (corner+size)/c);
+#}
+
+static func bricks_bw(uv : Vector2, count : Vector2, repeat : float, offset : float) -> Color:
+ var c : Vector2 = 2.0 * count * repeat
+ var mc : float = max(c.x, c.y)
+ var corner1 : Vector2 = Vector2(floor(uv.x * c.x), floor(uv.y * c.y))
+ var corner2 : Vector2 = Vector2(count.x * floor(repeat* 2.0 * uv.x), count.y * floor(repeat * 2.0 * uv.y))
+
+ var tmp : Vector2 = Vector2(floor(repeat * 2.0 * uv.x), floor(repeat * 2.0 * uv.y))
+ var cdiff : float = Commons.modf(tmp.dot(Vector2(1, 1)), 2.0)
+
+ var corner : Vector2
+ var size : Vector2
+
+ if cdiff == 0:
+ corner = Vector2(corner1.x, corner2.y)
+ size = Vector2(1.0, count.y)
+ else:
+ corner = Vector2(corner2.x, corner1.y)
+ size = Vector2(count.x, 1.0)
+
+ return Color(corner.x / c.x, corner.y / c.y, (corner.x + size.x) / c.x, (corner.y + size.y) / c.y)
+
+#vec4 bricks_sb(vec2 uv, vec2 count, float repeat, float offset) {
+# vec2 c = (count+vec2(1.0))*repeat;
+# float mc = max(c.x, c.y);
+# vec2 corner1 = floor(uv*c);
+# vec2 corner2 = (count+vec2(1.0))*floor(repeat*uv);
+# vec2 rcorner = corner1 - corner2;
+# vec2 corner;
+# vec2 size;
+#
+# if (rcorner.x == 0.0 && rcorner.y < count.y) {
+# corner = corner2;
+# size = vec2(1.0, count.y);
+# } else if (rcorner.y == 0.0) {
+# corner = corner2+vec2(1.0, 0.0);
+# size = vec2(count.x, 1.0);
+# } else if (rcorner.x == count.x) {
+# corner = corner2+vec2(count.x, 1.0);
+# size = vec2(1.0, count.y);
+# } else if (rcorner.y == count.y) {
+# corner = corner2+vec2(0.0, count.y);
+# size = vec2(count.x, 1.0);
+# } else {
+# corner = corner2+vec2(1.0);
+# size = vec2(count.x-1.0, count.y-1.0);
+# }
+#
+# return vec4(corner/c, (corner+size)/c);
+#}
+
+static func bricks_sb(uv : Vector2, count : Vector2, repeat : float, offset : float) -> Color:
+ var c : Vector2 = (count + Vector2(1, 1)) * repeat
+ var mc : float = max(c.x, c.y)
+ var corner1 : Vector2 = Vector2(floor(uv.x * c.x), floor(uv.y * c.y))
+ var corner2 : Vector2 = (count + Vector2(1, 1)) * Vector2(floor(repeat * uv.x), floor(repeat * uv.y))
+ var rcorner : Vector2 = corner1 - corner2
+
+ var corner : Vector2
+ var size : Vector2
+
+ if (rcorner.x == 0.0 && rcorner.y < count.y):
+ corner = corner2
+ size = Vector2(1.0, count.y)
+ elif (rcorner.y == 0.0):
+ corner = corner2 + Vector2(1.0, 0.0)
+ size = Vector2(count.x, 1.0)
+ elif (rcorner.x == count.x):
+ corner = corner2 + Vector2(count.x, 1.0)
+ size = Vector2(1.0, count.y)
+ elif (rcorner.y == count.y):
+ corner = corner2 + Vector2(0.0, count.y)
+ size = Vector2(count.x, 1.0)
+ else:
+ corner = corner2 + Vector2(1, 1)
+ size = Vector2(count.x-1.0, count.y-1.0)
+
+ return Color(corner.x / c.x, corner.y / c.y, (corner.x + size.x) / c.x, (corner.y + size.y) / c.y)
+
+#vec4 brick2(vec2 uv, vec2 bmin, vec2 bmax, float mortar, float round, float bevel) {
+# float color;
+# vec2 size = bmax - bmin;
+# vec2 center = 0.5*(bmin+bmax);
+# vec2 d = abs(uv-center)-0.5*(size)+vec2(round+mortar);
+#
+# color = length(max(d,vec2(0))) + min(max(d.x,d.y),0.0)-round;
+# color = clamp(-color/bevel, 0.0, 1.0);
+#
+# vec2 tiled_brick_pos = mod(bmin, vec2(1.0, 1.0));
+#
+# return vec4(color, center, tiled_brick_pos.x+7.0*tiled_brick_pos.y);
+#}
+
+static func brick2(uv : Vector2, bmin : Vector2, bmax : Vector2, mortar : float, pround : float, bevel : float) -> Color:
+ return Color()
+
+#vec4 bricks_uneven(vec2 uv, int iterations, float min_size, float randomness, float seed) {
+# vec2 a = vec2(0.0);
+# vec2 b = vec2(1.0);
+# for (int i = 0; i < iterations; ++i) {
+# vec2 size = b-a;
+# if (max(size.x, size.y) < min_size) {
+# break;
+# }
+#
+# float x = rand(rand2(vec2(rand(a+b), seed)))*randomness+(1.0-randomness)*0.5;
+#
+# if (size.x > size.y) {
+# x *= size.x;
+#
+# if (uv.x > a.x+x) {
+# a.x += x;
+# } else {
+# b.x = a.x + x;
+# }
+# } else {
+# x *= size.y;
+#
+# if (uv.y > a.y+x) {
+# a.y += x;
+# } else {
+# b.y = a.y + x;
+# }
+# }
+# }
+#
+# return vec4(a, b);
+#}
+
+static func bricks_uneven(uv : Vector2, iterations : int, min_size : float, randomness : float, pseed : float) -> Color:
+ return Color()
+
+
+#vec2 truchet_generic_uv(vec2 uv, vec2 seed) {
+# vec2 i = floor(uv);
+# vec2 f = fract(uv);
+# vec2 invert = step(rand2(seed+i), vec2(0.5));
+#
+# return f*(vec2(1.0)-invert)+(vec2(1.0)-f)*invert;
+#}
+
+static func truchet_generic_uv(uv : Vector2, pseed : float) -> Vector2:
+ return Vector2()
+
+
+#float pavement(vec2 uv, float bevel, float mortar) {\n\t
+# uv = abs(uv-vec2(0.5));\n\t
+#
+# return clamp((0.5*(1.0-mortar)-max(uv.x, uv.y))/max(0.0001, bevel), 0.0, 1.0);
+#}
+
+#vec4 arc_pavement(vec2 uv, float acount, float lcount, out vec2 seed) {\n\t
+# float PI = 3.141592654;\n\t
+# float radius = (0.5/sqrt(2.0));\n
+# float uvx = uv.x;\n
+# uv.x = 0.5*fract(uv.x+0.5)+0.25;\n
+# float center = (uv.x-0.5)/radius;\n
+# center *= center;\n
+# center = floor(acount*(uv.y-radius*sqrt(1.0-center))+0.5)/acount;\n
+#
+# vec2 v = uv-vec2(0.5, center);\n
+# float cornerangle = 0.85/acount+0.25*PI;\n
+# float acountangle = (PI-2.0*cornerangle)/(lcount+floor(mod(center*acount, 2.0)));\n
+# float angle = mod(atan(v.y, v.x), 2.0*PI);\n\t
+#
+# float base_angle;\n\t
+# float local_uvy = 0.5+acount*(length(v)-radius)*(1.54-0.71*cos(1.44*(angle-PI*0.5)));\n\t
+# vec2 local_uv;\n
+#
+# if (angle < cornerangle) {\n
+# base_angle = 0.25*PI;\n\t\t
+# local_uv = vec2((angle-0.25*PI)/cornerangle*0.38*acount+0.5, 1.0-local_uvy);\n\t\t
+# seed = vec2(fract(center), 0.0);\n
+# } else if (angle > PI-cornerangle) {\n
+# base_angle = 0.75*PI;\n\t\t
+# local_uv = vec2(local_uvy, 0.5-(0.75*PI-angle)/cornerangle*0.38*acount);\n\t\t
+# seed = vec2(fract(center), 0.0);\n
+# } else {\n
+# base_angle = cornerangle+(floor((angle-cornerangle)/acountangle)+0.5)*acountangle;\n\t\t
+# local_uv = vec2((angle-base_angle)/acountangle+0.5, 1.0-local_uvy);\n\t\t
+# seed = vec2(fract(center), base_angle);\n
+# }\n
+#
+# vec2 brick_center = vec2(0.5, center)+radius*vec2(cos(base_angle), sin(base_angle));\n
+#
+# return vec4(brick_center.x+uvx-uv.x, brick_center.y, local_uv);\n
+#}
diff --git a/modules/material_maker/mat_maker_gd/nodes/common/sdf2d.gd b/modules/material_maker/mat_maker_gd/nodes/common/sdf2d.gd
new file mode 100644
index 000000000..cf6dd2f78
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/common/sdf2d.gd
@@ -0,0 +1,2451 @@
+tool
+extends Reference
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+
+#----------------------
+#sdarc.mmg
+#An arc as a signed distance function
+
+#"outputs": [
+#{
+# "longdesc": "The arc as a signed distance function",
+# "sdf2d": "sdArc($uv-vec2(0.5), mod($a1, 360.0)*0.01745329251, mod($a2, 360.0)*0.01745329251, $r1, $r2)",
+# "shortdesc": "Output",
+# "type": "sdf2d"
+#}
+#],
+#"parameters": [
+#{
+# "control": "Angle1.a",
+# "default": 0,
+# "label": "Angle 1",
+# "longdesc": "The first angle of the arc",
+# "max": 180,
+# "min": -180,
+# "name": "a1",
+# "shortdesc": "Angle1",
+# "step": 1,
+# "type": "float"
+#},
+#{
+# "control": "Angle2.a",
+# "default": 0,
+# "label": "Angle 2",
+# "longdesc": "The second angle of the arc",
+# "max": 180,
+# "min": -180,
+# "name": "a2",
+# "shortdesc": "Angle2",
+# "step": 1,
+# "type": "float"
+#},
+#{
+# "control": "Radius1.r",
+# "default": 0.5,
+# "label": "Radius",
+# "longdesc": "The radius of the arc",
+# "max": 1,
+# "min": 0,
+# "name": "r1",
+# "shortdesc": "Radius",
+# "step": 0.01,
+# "type": "float"
+#},
+#{
+# "control": "Radius11.r",
+# "default": 0.1,
+# "label": "Width",
+# "longdesc": "The width of the shape around the arc",
+# "max": 1,
+# "min": 0,
+# "name": "r2",
+# "shortdesc": "Width",
+# "step": 0.01,
+# "type": "float"
+#}
+#]
+
+#----------------------
+#sdboolean.mmg
+#Performs a boolean operation (union, intersection or difference) between two shapes
+
+#"inputs": [
+#{
+# "default": "0.0",
+# "label": "",
+# "longdesc": "The first shape, defined as a signed distance function",
+# "name": "in1",
+# "shortdesc": "Input1",
+# "type": "sdf2d"
+#},
+#{
+# "default": "0.0",
+# "label": "",
+# "longdesc": "The second shape, defined as a signed distance function",
+# "name": "in2",
+# "shortdesc": "Input2",
+# "type": "sdf2d"
+#}
+#],
+#"outputs": [
+#{
+# "longdesc": "The shape generated by the boolean operation",
+# "sdf2d": "$op $in1($uv), $in2($uv))",
+# "shortdesc": "Output",
+# "type": "sdf2d"
+#}
+#],
+#"parameters": [
+#{
+# "default": 2,
+# "label": "",
+# "longdesc": "The operation performed by this node",
+# "name": "op",
+# "shortdesc": "Operation",
+# "type": "enum",
+# "values": [
+# {
+# "name": "Union",
+# "value": "min("
+# },
+# {
+# "name": "Subtraction",
+# "value": "max(-"
+# },
+# {
+# "name": "Intersection",
+# "value": "max("
+# }
+# ]
+#}
+#],
+
+#----------------------
+#sdbox.mmg
+#A rectangle described as a signed distance function
+
+# "code": "vec2 $(name_uv)_d = abs($uv-vec2($cx+0.5, $cy+0.5))-vec2($w, $h);",
+# "outputs": [
+# {
+# "longdesc": "The generated signed distance function",
+# "sdf2d": "length(max($(name_uv)_d,vec2(0)))+min(max($(name_uv)_d.x,$(name_uv)_d.y),0.0)",
+# "shortdesc": "Output",
+# "type": "sdf2d"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "Rect1.x",
+# "default": 0.5,
+# "label": "Width",
+# "longdesc": "The width of the box",
+# "max": 1,
+# "min": 0,
+# "name": "w",
+# "shortdesc": "Width",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "Rect1.y",
+# "default": 1,
+# "label": "Height",
+# "longdesc": "The height of the box",
+# "max": 1,
+# "min": 0,
+# "name": "h",
+# "shortdesc": "Height",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "P1.x",
+# "default": 0,
+# "label": "Center X",
+# "longdesc": "The position of the center of the box on the X axis",
+# "max": 1,
+# "min": -1,
+# "name": "cx",
+# "shortdesc": "Center.x",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "P1.y",
+# "default": 0,
+# "label": "Center Y",
+# "longdesc": "The position of the center of the box on the Y axis",
+# "max": 1,
+# "min": -1,
+# "name": "cy",
+# "shortdesc": "Center.y",
+# "step": 0.01,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#sdcircle.mmg
+#A circle described as a signed distance function
+
+# "outputs": [
+# {
+# "longdesc": "The generated signed distance function",
+# "sdf2d": "length($uv-vec2($cx+0.5, $cy+0.5))-$r",
+# "shortdesc": "Output",
+# "type": "sdf2d"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "Radius1.r",
+# "default": 0.5,
+# "label": "Radius",
+# "longdesc": "The radius of the circle",
+# "max": 1,
+# "min": 0,
+# "name": "r",
+# "shortdesc": "Radius",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "P1.x",
+# "default": 0,
+# "label": "Center X",
+# "longdesc": "The position of the center on the X axis",
+# "max": 1,
+# "min": -1,
+# "name": "cx",
+# "shortdesc": "Center.x",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "P1.y",
+# "default": 0,
+# "label": "Center Y",
+# "longdesc": "The position of the center on the Y axis",
+# "max": 1,
+# "min": -1,
+# "name": "cy",
+# "shortdesc": "Center.y",
+# "step": 0.01,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#sdcirclerepeat.mmg
+#Repeats its input shape around a circle
+
+#Output:
+#Out, sdf2d (float) (property)
+#$in(circle_repeat_transform_2d($uv-vec2(0.5), $c)+vec2(0.5))
+
+#Input:
+#in, float (sdf2d), default : 0
+#count, int, min: 1, max: 32, default: 6
+
+#----------------------
+#sdelongation.mmg
+
+# "inputs": [
+# {
+# "default": "0.0",
+# "label": "",
+# "name": "in",
+# "type": "sdf2d"
+# }
+# ],
+# "outputs": [
+# {
+# "sdf2d": "$in($uv-clamp($uv-vec2(0.5), -vec2($x, $y), vec2($x, $y)))",
+# "type": "sdf2d"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "Rect1.x",
+# "default": 0,
+# "label": "X",
+# "max": 1,
+# "min": 0,
+# "name": "x",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "Rect1.y",
+# "default": 0,
+# "label": "Y",
+# "max": 1,
+# "min": 0,
+# "name": "y",
+# "step": 0.01,
+# "type": "float"
+# }
+# ]
+
+#----------------------
+#sdline.mmg
+#A line or a capsule shape described as a signed distance function
+
+#vec2 $(name_uv)_sdl = sdLine($uv, vec2($ax+0.5, $ay+0.5), vec2($bx+0.5, $by+0.5));
+
+#Outputs
+#output, sdf2d (float), (output property)
+#$(name_uv)_sdl.x-$r*$profile($(name_uv)_sdl.y)
+
+#Inputs
+#A, Vector2, min: -1, max: 1, step: 0.01, default: (-0.3, -0.3)
+#B, Vector2, min: -1, max: 1, step: 0.01, default: (0.3, 0.3)
+#width, float, min: 0, max: 1, step: 0.01, default: 0.1
+#points (curve), default: 0, 0, 0, 1, 0, 0, 1, 1
+
+#----------------------
+#sdmorph.mmg
+#Morphs between 2 input shapes
+
+# "inputs": [
+# {
+# "default": "0.0",
+# "label": "",
+# "longdesc": "The first shape, defined as a signed distance function",
+# "name": "in1",
+# "shortdesc": "Input1",
+# "type": "sdf2d"
+# },
+# {
+# "default": "0.0",
+# "label": "",
+# "longdesc": "The second shape, defined as a signed distance function",
+# "name": "in2",
+# "shortdesc": "Input2",
+# "type": "sdf2d"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "The generated hybrid shape",
+# "sdf2d": "mix($in1($uv), $in2($uv), $amount)",
+# "shortdesc": "Output",
+# "type": "sdf2d"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "",
+# "longdesc": "The amount of the second input in the result",
+# "max": 1,
+# "min": 0,
+# "name": "amount",
+# "shortdesc": "Amount",
+# "step": 0.01,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#sdngon.mmg (inc sdrotate.mmg, sdcirclerepeat.mmg)
+#An n-gon described as a signed distance function
+
+# "outputs": [
+# {
+# "longdesc": "The n-gon as a signed distance function",
+# "sdf2d": "sdNgon(sdf2d_rotate($uv-vec2($cx, $cy), $rot*0.01745329251-1.57079632679)-vec2(0.5), $r, $n)",
+# "shortdesc": "Output",
+# "type": "sdf2d"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 3,
+# "label": "N",
+# "longdesc": "The number of sides of the n-gon",
+# "max": 12,
+# "min": 3,
+# "name": "n",
+# "shortdesc": "N",
+# "step": 1,
+# "type": "float"
+# },
+# {
+# "control": "Radius1.r",
+# "default": 0.5,
+# "label": "Radius",
+# "longdesc": "The radius of the n-gon",
+# "max": 1,
+# "min": 0,
+# "name": "r",
+# "shortdesc": "Radius",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "Radius1.a",
+# "default": 0,
+# "label": "Rotation",
+# "longdesc": "The rotation of the n-gon",
+# "max": 180,
+# "min": -180,
+# "name": "rot",
+# "shortdesc": "Rotation",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "P1.x",
+# "default": 0,
+# "label": "Center X",
+# "longdesc": "The position of the center on the X axis",
+# "max": 0.5,
+# "min": -0.5,
+# "name": "cx",
+# "shortdesc": "Center.x",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "P1.y",
+# "default": 0,
+# "label": "Center Y",
+# "longdesc": "The position of the center on the Y axis",
+# "max": 0.5,
+# "min": -0.5,
+# "name": "cy",
+# "shortdesc": "Center.y",
+# "step": 0.01,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#sdpolygon.mmg
+#A polygon as a signed distance function
+
+#Output:
+#Out, sdf2d (float) (property)
+#sdPolygon_$(name)($uv)
+
+#Input:
+#polygon points, default: 0.2, 0.2, 0.4, 0.7, 0.7, 0.4
+
+#----------------------
+#sdrepeat.mmg
+#Repeats its input shape on a grid.This node does not support overlapping between instances.
+
+#Output:
+#Out, sdf2d (float) (property)
+#$in(repeat_2d($uv, vec2(1.0/$rx, 1.0/$ry), float($seed), $r))
+
+#Input:
+#in, float (sdf2d), default : 0
+#x, int, min: 1, max: 32, default: 4
+#y, int, min: 1, max: 32, default: 4
+#random_rotation, min: 0, max: 1, step:0.01, default: 0.5
+
+#----------------------
+#sdrhombus.mmg
+#A rhombus described as a signed distance function
+
+# "outputs": [
+# {
+# "longdesc": "The rhombus as a signed distance function",
+# "sdf2d": "sdRhombus($uv-vec2($cx+0.5, $cy+0.5), vec2($w, $h))",
+# "shortdesc": "Output",
+# "type": "sdf2d"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "Rect1.x",
+# "default": 0.5,
+# "label": "Width",
+# "longdesc": "The width of the rhombus",
+# "max": 1,
+# "min": 0,
+# "name": "w",
+# "shortdesc": "Width",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "Rect1.y",
+# "default": 1,
+# "label": "Height",
+# "longdesc": "The height of the rhombus",
+# "max": 1,
+# "min": 0,
+# "name": "h",
+# "shortdesc": "Height",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "P1.x",
+# "default": 0,
+# "label": "Center X",
+# "longdesc": "The position of the center on the X axis",
+# "max": 1,
+# "min": -1,
+# "name": "cx",
+# "shortdesc": "Center.x",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "P1.y",
+# "default": 0,
+# "label": "Center Y",
+# "longdesc": "The position of the center on the Y axis",
+# "max": 1,
+# "min": -1,
+# "name": "cy",
+# "shortdesc": "Center.y",
+# "step": 0.01,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#sdrotate.mmg
+#Rotates its input shape described as a signed distance function
+
+# "inputs": [
+# {
+# "default": "0.0",
+# "label": "",
+# "longdesc": "The input shape, defined as a signed distance function",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "sdf2d"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "The rotated shape",
+# "sdf2d": "$in(sdf2d_rotate($uv, $a*0.01745329251))",
+# "shortdesc": "Output",
+# "type": "sdf2d"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "Radius1.a",
+# "default": 0,
+# "label": "",
+# "longdesc": "The rotation angle",
+# "max": 180,
+# "min": -180,
+# "name": "a",
+# "shortdesc": "Angle",
+# "step": 1,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#sdroundedshape.mmg
+#Dilates an input shape into a rounded shape
+
+#Output:
+#Out, sdf2d (float) (property)
+#$in($uv)-$r
+
+#Input:
+#in, float (sdf2d), default : 0
+#radius, min: 0, max: 1, step:0.01, default: 0
+
+#----------------------
+#sdscale.mmg
+#Scales its input shape described as a signed distance function
+
+# "inputs": [
+# {
+# "default": "0.0",
+# "label": "",
+# "longdesc": "The input shape, defined as a signed distance function",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "sdf2d"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "The generated scaled shape",
+# "sdf2d": "$in(($uv-vec2(0.5))/$s+vec2(0.5))*$s",
+# "shortdesc": "Output",
+# "type": "sdf2d"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "Scale1.x",
+# "default": 1,
+# "label": "",
+# "longdesc": "The scale of the transform",
+# "max": 5,
+# "min": 0,
+# "name": "s",
+# "shortdesc": "Scale",
+# "step": 0.01,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#sdshow.mmg
+#Creates a greyscale image from a shape described as a 2D Signed Distance Function
+
+#Output
+
+#Output float (color) - Shows the shape as a greyscale image
+#clamp($base-$in($uv)/max($bevel, 0.00001), 0.0, 1.0)
+
+#Input:
+#Input (sdf - shape), default: 0 - sdf2d - universal input
+#bevel, float, min 0, max 1, step 0.01, default 0
+#base, float, min 0, max 1, step 0.01, default 0
+
+#----------------------
+#sdsmoothboolean.mmg
+#Performs a smooth boolean operation (union, intersection or difference) between two shapes
+
+# "inputs": [
+# {
+# "default": "0.0",
+# "label": "",
+# "longdesc": "The first shape, defined as a signed distance function",
+# "name": "in1",
+# "shortdesc": "Input1",
+# "type": "sdf2d"
+# },
+# {
+# "default": "0.0",
+# "label": "",
+# "longdesc": "The second shape, defined as a signed distance function",
+# "name": "in2",
+# "shortdesc": "Input2",
+# "type": "sdf2d"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "The shape generated by the boolean operation",
+# "sdf2d": "sdSmooth$op($in1($uv), $in2($uv), $k)",
+# "shortdesc": "Output",
+# "type": "sdf2d"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 0,
+# "label": "",
+# "longdesc": "The operation performed by this node",
+# "name": "op",
+# "shortdesc": "Operation",
+# "type": "enum",
+# "values": [
+# {
+# "name": "Union",
+# "value": "Union"
+# },
+# {
+# "name": "Subtraction",
+# "value": "Subtraction"
+# },
+# {
+# "name": "Intersection",
+# "value": "Intersection"
+# }
+# ]
+# },
+# {
+# "control": "None",
+# "default": 0,
+# "label": "",
+# "longdesc": "The smoothness of the boolean operation",
+# "max": 1,
+# "min": 0,
+# "name": "k",
+# "shortdesc": "Smoothness",
+# "step": 0.01,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#sdtranslate.mmg
+#Translates its input shape described as signed distance function
+
+# "inputs": [
+# {
+# "default": "0.0",
+# "label": "",
+# "longdesc": "The input shape, defined as a signed distance function",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "sdf2d"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "The translated shape",
+# "sdf2d": "$in($uv-vec2($x, $y))",
+# "shortdesc": "Output",
+# "type": "sdf2d"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "P1.x",
+# "default": 0,
+# "label": "X",
+# "longdesc": "The translation along the X axis",
+# "max": 1,
+# "min": -1,
+# "name": "x",
+# "shortdesc": "Translate.x",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "P1.y",
+# "default": 0,
+# "label": "Y",
+# "longdesc": "The translation along the Y axis",
+# "max": 1,
+# "min": -1,
+# "name": "y",
+# "shortdesc": "Translate.y",
+# "step": 0.01,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#curve.mmg
+
+# "code": "vec2 $(name_uv)_bezier = sdBezier($uv, vec2($ax+0.5, $ay+0.5), vec2($bx+0.5, $by+0.5), vec2($cx+0.5, $cy+0.5));\nvec2 $(name_uv)_uv = vec2($(name_uv)_bezier.x, $(name_uv)_bezier.y/$width+0.5);\nvec2 $(name_uv)_uvtest = step(vec2(0.5), abs($(name_uv)_uv-vec2(0.5)));\n$(name_uv)_uv = mix(vec2(fract($repeat*$(name_uv)_uv.x), $(name_uv)_uv.y), vec2(0.0), max($(name_uv)_uvtest.x, $(name_uv)_uvtest.y));\n",
+# "inputs": [
+# {
+# "default": "vec4(vec3(step(abs($uv.y-0.5), 0.4999)), 1.0)",
+# "label": "",
+# "longdesc": "Input pattern to be drawn along the curve",
+# "name": "in",
+# "shortdesc": "Pattern",
+# "type": "rgba"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "An image showing the specified curve",
+# "rgba": "$in($(name_uv)_uv)",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "P1.x",
+# "default": -0.3,
+# "label": "AX",
+# "longdesc": "Position on X axis of the first control point",
+# "max": 0.5,
+# "min": -0.5,
+# "name": "ax",
+# "shortdesc": "A.x",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "P1.y",
+# "default": -0.1,
+# "label": "AY",
+# "longdesc": "Position on Y axis of the first control point",
+# "max": 0.5,
+# "min": -0.5,
+# "name": "ay",
+# "shortdesc": "A.y",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "P3.x",
+# "default": -0,
+# "label": "BX",
+# "longdesc": "Position on X axis of the second control point",
+# "max": 0.5,
+# "min": -0.5,
+# "name": "bx",
+# "shortdesc": "B.x",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "P3.y",
+# "default": 0.2,
+# "label": "BY",
+# "longdesc": "Position on Y axis of the second control point",
+# "max": 0.5,
+# "min": -0.5,
+# "name": "by",
+# "shortdesc": "B.y",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "P2.x",
+# "default": 0.3,
+# "label": "CX",
+# "longdesc": "Position on X axis of the third control point",
+# "max": 0.5,
+# "min": -0.5,
+# "name": "cx",
+# "shortdesc": "C.x",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "P2.y",
+# "default": -0.1,
+# "label": "CY",
+# "longdesc": "Position on Y axis of the third control point",
+# "max": 0.5,
+# "min": -0.5,
+# "name": "cy",
+# "shortdesc": "C.y",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0.1,
+# "label": "Width",
+# "longdesc": "Width of the curve pattern",
+# "max": 0.5,
+# "min": 0,
+# "name": "width",
+# "shortdesc": "Width",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 1,
+# "label": "Repeat",
+# "longdesc": "Number of repetitions of the input pattern",
+# "max": 16,
+# "min": 1,
+# "name": "repeat",
+# "shortdesc": "Repeat",
+# "step": 1,
+# "type": "float"
+# }
+# ]
+
+#----------------------
+#sdannularshape.mmg
+#Creates an annular shape from a shape described as a signed distance function
+
+#Output
+
+#Output float (color) - Shows the shape as a greyscale image
+#sdRipples($in($uv), $r, int($ripples))
+
+#Input:
+#Input (sdf - shape), default: 0 - sdf2d - universal input
+#width, float, min 0, max 1, step 0.01, default 0
+#rippples, int, min 1, max 16, default 1
+
+#----------------------
+#sd_mask_to_sdf.mmg
+
+#{
+# "connections": [
+# {
+# "from": "6520",
+# "from_port": 0,
+# "to": "gen_outputs",
+# "to_port": 0
+# },
+# {
+# "from": "edge_detect",
+# "from_port": 0,
+# "to": "1823",
+# "to_port": 0
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 0,
+# "to": "buffer_2",
+# "to_port": 0
+# },
+# {
+# "from": "buffer_2",
+# "from_port": 0,
+# "to": "6520",
+# "to_port": 1
+# },
+# {
+# "from": "buffer_2",
+# "from_port": 0,
+# "to": "tones_step",
+# "to_port": 0
+# },
+# {
+# "from": "tones_step",
+# "from_port": 0,
+# "to": "edge_detect",
+# "to_port": 0
+# },
+# {
+# "from": "1823",
+# "from_port": 0,
+# "to": "iterate_buffer",
+# "to_port": 0
+# },
+# {
+# "from": "2434_8",
+# "from_port": 0,
+# "to": "iterate_buffer",
+# "to_port": 1
+# },
+# {
+# "from": "iterate_buffer",
+# "from_port": 0,
+# "to": "6520",
+# "to_port": 0
+# },
+# {
+# "from": "24282_2",
+# "from_port": 0,
+# "to": "2434_8",
+# "to_port": 0
+# },
+# {
+# "from": "iterate_buffer",
+# "from_port": 1,
+# "to": "24282_2",
+# "to_port": 0
+# }
+# ],
+# "label": "Mask to SDF",
+# "longdesc": "",
+# "name": "sd_mask_to_sdf",
+# "node_position": {
+# "x": 0,
+# "y": 0
+# },
+# "nodes": [
+# {
+# "name": "iterate_buffer",
+# "node_position": {
+# "x": 76.700005,
+# "y": -249.817047
+# },
+# "parameters": {
+# "filter": false,
+# "iterations": 30,
+# "mipmap": false,
+# "size": 10
+# },
+# "seed_value": 29168,
+# "type": "iterate_buffer"
+# },
+# {
+# "name": "2434_8",
+# "node_position": {
+# "x": 91.099991,
+# "y": -9.031479
+# },
+# "parameters": {
+# "distance": 0,
+# "size": 10
+# },
+# "shader_model": {
+# "code": "",
+# "global": "",
+# "inputs": [
+# {
+# "default": "vec3(-1.0)",
+# "function": true,
+# "label": "",
+# "name": "in",
+# "type": "rgb"
+# }
+# ],
+# "instance": "vec3 $(name)_jump_flood(vec2 uv, float size) {\n\tivec2 int_uv = ivec2(uv * size);\n\tfloat best_distance = 9999.9;\n\tvec2 best_coord;\n\tfloat iter = $in(uv).b;\n\titer += 0.01;\n\tfloat step_width = size / 4.0 / (iter * 100.0);\n\t\n\tfor (int x = -1; x <= 1; x++) {\n\t\tfor (int y = -1; y <= 1; y++) {\n\t\t\tivec2 offsetUV = int_uv + ivec2(x, y) * int(step_width);\n\t\t\tvec2 float_uv = vec2(offsetUV) / size;\n\t\t\tvec2 offset_pos = $in(float_uv).rg;\n\t\t\t\n\t\t\tif (offset_pos.x != 0.0 && offset_pos.y != 0.0) {\n\t\t\t\tvec2 diff = offset_pos - uv;\n\t\t\t\t//float dist = dot(diff, diff);\n\t\t\t\t$distance\n\t\t\t\tif (dist < best_distance) {\n\t\t\t\t\tbest_distance = dist;\n\t\t\t\t\tbest_coord = offset_pos;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn vec3(best_coord, iter);\n}",
+# "name": "Jump Flood",
+# "outputs": [
+# {
+# "rgb": "$(name)_jump_flood($uv, $size)",
+# "type": "rgb"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 10,
+# "first": 0,
+# "label": "",
+# "last": 13,
+# "name": "size",
+# "type": "size"
+# },
+# {
+# "default": 0,
+# "label": "",
+# "name": "distance",
+# "type": "enum",
+# "values": [
+# {
+# "name": "Euclidean",
+# "value": "float dist = dot(diff, diff);"
+# },
+# {
+# "name": "Manhattan",
+# "value": "float dist = abs(diff.x) + abs(diff.y);"
+# },
+# {
+# "name": "Chebyshev",
+# "value": "float dist = abs(diff.x) > abs(diff.y) ? abs(diff.x) : abs(diff.y);"
+# }
+# ]
+# }
+# ]
+# },
+# "type": "shader"
+# },
+# {
+# "name": "1823",
+# "node_position": {
+# "x": -269.899872,
+# "y": -18.741766
+# },
+# "parameters": {
+#
+# },
+# "shader_model": {
+# "code": "",
+# "global": "",
+# "inputs": [
+# {
+# "default": "1.0",
+# "label": "",
+# "name": "in",
+# "type": "f"
+# }
+# ],
+# "instance": "",
+# "name": "Mask to UV Mask",
+# "outputs": [
+# {
+# "rgb": "$in($uv) < .5 ? vec3(0.0) : vec3($uv, 0.0)",
+# "type": "rgb"
+# }
+# ],
+# "parameters": [
+#
+# ]
+# },
+# "type": "shader"
+# },
+# {
+# "name": "edge_detect",
+# "node_position": {
+# "x": -286.951447,
+# "y": -137.078964
+# },
+# "parameters": {
+# "size": 10,
+# "threshold": 0.4,
+# "width": 1
+# },
+# "type": "edge_detect"
+# },
+# {
+# "name": "6520",
+# "node_position": {
+# "x": 364.156525,
+# "y": -261.873169
+# },
+# "parameters": {
+# "distance": 0,
+# "tiled": false
+# },
+# "shader_model": {
+# "code": "",
+# "global": "",
+# "inputs": [
+# {
+# "default": "vec3(0.0)",
+# "function": true,
+# "label": "",
+# "name": "in",
+# "type": "rgb"
+# },
+# {
+# "default": "0.0",
+# "function": true,
+# "label": "",
+# "name": "mask",
+# "type": "f"
+# }
+# ],
+# "instance": "float $(name)_distance(vec2 uv, bool tiled) {\n\tif (tiled) {\n\t\tuv = fract(uv);\n\t}\n\tvec2 custom_uv = $in(uv).xy;\n\tvec2 diff = custom_uv != vec2(0.0) ? custom_uv - uv : vec2(1.0);\n\t$distance\n\tif (!tiled) {\n\t\tuv = clamp(uv, 0.0, 1.0);\n\t}\n\treturn $mask(uv) < 0.5 ? distance : -distance;\n}",
+# "name": "Calculate Distance",
+# "outputs": [
+# {
+# "sdf2d": "$(name)_distance($uv, $tiled)",
+# "type": "sdf2d"
+# }
+# ],
+# "parameters": [
+# {
+# "default": false,
+# "label": "Tiled",
+# "name": "tiled",
+# "type": "boolean"
+# },
+# {
+# "default": 0,
+# "label": "",
+# "name": "distance",
+# "type": "enum",
+# "values": [
+# {
+# "name": "Euclidean",
+# "value": "float distance = length(diff);"
+# },
+# {
+# "name": "Manhattan",
+# "value": "float distance = abs(diff.x) + abs(diff.y);"
+# },
+# {
+# "name": "Chebyshev",
+# "value": "float distance = abs(diff.x) > abs(diff.y) ? abs(diff.x) : abs(diff.y);"
+# }
+# ]
+# }
+# ]
+# },
+# "type": "shader"
+# },
+# {
+# "name": "gen_inputs",
+# "node_position": {
+# "x": -735.85144,
+# "y": -352.006775
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "longdesc": "The greyscale mask to be converted",
+# "name": "mask",
+# "shortdesc": "Mask",
+# "type": "f"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "gen_outputs",
+# "node_position": {
+# "x": 646.256348,
+# "y": -263.285461
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "longdesc": "The genrated distance field",
+# "name": "sdf",
+# "shortdesc": "Output",
+# "type": "sdf2d"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "gen_parameters",
+# "node_position": {
+# "x": -47.67952,
+# "y": -541.979187
+# },
+# "parameters": {
+# "param0": 10,
+# "param1": 30,
+# "param2": false,
+# "param3": 0
+# },
+# "type": "remote",
+# "widgets": [
+# {
+# "label": "Size",
+# "linked_widgets": [
+# {
+# "node": "iterate_buffer",
+# "widget": "size"
+# },
+# {
+# "node": "2434_8",
+# "widget": "size"
+# },
+# {
+# "node": "buffer_2",
+# "widget": "size"
+# },
+# {
+# "node": "edge_detect",
+# "widget": "size"
+# }
+# ],
+# "longdesc": "The resolution used for the operation",
+# "name": "param0",
+# "shortdesc": "Size",
+# "type": "linked_control"
+# },
+# {
+# "label": "Iterations",
+# "linked_widgets": [
+# {
+# "node": "iterate_buffer",
+# "widget": "iterations"
+# }
+# ],
+# "longdesc": "The number of iterations the jump flood algorithm performs to calculate the distances",
+# "name": "param1",
+# "shortdesc": "Iterations",
+# "type": "linked_control"
+# },
+# {
+# "label": "Tiled",
+# "linked_widgets": [
+# {
+# "node": "24282_2",
+# "widget": "tiled"
+# },
+# {
+# "node": "6520",
+# "widget": "tiled"
+# }
+# ],
+# "longdesc": "Controls whether the resulting ditance field will be tiled. Useful for patterns that extend over the texture bounds",
+# "name": "param2",
+# "shortdesc": "Tiled",
+# "type": "linked_control"
+# },
+# {
+# "label": "Distance",
+# "linked_widgets": [
+# {
+# "node": "2434_8",
+# "widget": "distance"
+# },
+# {
+# "node": "6520",
+# "widget": "distance"
+# }
+# ],
+# "name": "param3",
+# "shortdesc": "Distance function",
+# "type": "linked_control"
+# }
+# ]
+# },
+# {
+# "name": "buffer_2",
+# "node_position": {
+# "x": -297.702789,
+# "y": -348.41391
+# },
+# "parameters": {
+# "size": 10
+# },
+# "type": "buffer",
+# "version": 1
+# },
+# {
+# "name": "tones_step",
+# "node_position": {
+# "x": -294.947968,
+# "y": -258.84549
+# },
+# "parameters": {
+# "invert": false,
+# "value": 0.5,
+# "width": 0
+# },
+# "type": "tones_step"
+# },
+# {
+# "name": "24282_2",
+# "node_position": {
+# "x": 114.391708,
+# "y": -90.765732
+# },
+# "parameters": {
+# "tiled": false
+# },
+# "shader_model": {
+# "code": "vec3 $(name_uv)_in = $in(fract($uv));\nvec3 $(name_uv)_tiled = $(name_uv)_in.xy != vec2(0.0) ? $(name_uv)_in + vec3(floor($uv), 0.0) : $(name_uv)_in;",
+# "global": "",
+# "inputs": [
+# {
+# "default": "vec3(1.0)",
+# "function": true,
+# "label": "",
+# "name": "in",
+# "type": "rgb"
+# }
+# ],
+# "instance": "",
+# "name": "Tiling",
+# "outputs": [
+# {
+# "rgb": "$tiled ? $(name_uv)_tiled : $(name_uv)_in",
+# "type": "rgb"
+# }
+# ],
+# "parameters": [
+# {
+# "default": false,
+# "label": "Tiled",
+# "name": "tiled",
+# "type": "boolean"
+# }
+# ]
+# },
+# "type": "shader"
+# },
+# {
+# "connections": [
+# {
+# "from": "edge_detect",
+# "from_port": 0,
+# "to": "1823",
+# "to_port": 0
+# },
+# {
+# "from": "tones_step",
+# "from_port": 0,
+# "to": "edge_detect",
+# "to_port": 0
+# },
+# {
+# "from": "1823",
+# "from_port": 0,
+# "to": "iterate_buffer",
+# "to_port": 0
+# },
+# {
+# "from": "2434_8",
+# "from_port": 0,
+# "to": "iterate_buffer",
+# "to_port": 1
+# },
+# {
+# "from": "iterate_buffer",
+# "from_port": 0,
+# "to": "6520",
+# "to_port": 0
+# },
+# {
+# "from": "24282_2",
+# "from_port": 0,
+# "to": "2434_8",
+# "to_port": 0
+# },
+# {
+# "from": "iterate_buffer",
+# "from_port": 1,
+# "to": "24282_2",
+# "to_port": 0
+# },
+# {
+# "from": "iterate_buffer",
+# "from_port": 0,
+# "to": "2153",
+# "to_port": 1
+# },
+# {
+# "from": "buffer_2",
+# "from_port": 0,
+# "to": "tones_step",
+# "to_port": 0
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 1,
+# "to": "2153",
+# "to_port": 0
+# },
+# {
+# "from": "2153",
+# "from_port": 0,
+# "to": "11582",
+# "to_port": 1
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 1,
+# "to": "11582",
+# "to_port": 2
+# },
+# {
+# "from": "11582",
+# "from_port": 0,
+# "to": "gen_outputs",
+# "to_port": 0
+# },
+# {
+# "from": "8064",
+# "from_port": 0,
+# "to": "2153",
+# "to_port": 2
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 0,
+# "to": "8064",
+# "to_port": 0
+# },
+# {
+# "from": "8064",
+# "from_port": 0,
+# "to": "buffer_2",
+# "to_port": 0
+# },
+# {
+# "from": "buffer_2",
+# "from_port": 0,
+# "to": "6520",
+# "to_port": 1
+# },
+# {
+# "from": "6520",
+# "from_port": 0,
+# "to": "11582",
+# "to_port": 0
+# }
+# ],
+# "label": "Dilate 2",
+# "longdesc": "",
+# "name": "graph_3",
+# "node_position": {
+# "x": 515.555786,
+# "y": -545.049744
+# },
+# "nodes": [
+# {
+# "name": "iterate_buffer",
+# "node_position": {
+# "x": 64.900002,
+# "y": -259.215881
+# },
+# "parameters": {
+# "filter": false,
+# "iterations": 30,
+# "mipmap": false,
+# "size": 9
+# },
+# "seed_value": 29168,
+# "type": "iterate_buffer"
+# },
+# {
+# "name": "2434_8",
+# "node_position": {
+# "x": 102.099998,
+# "y": 15.367363
+# },
+# "parameters": {
+# "distance": 0,
+# "size": 9
+# },
+# "shader_model": {
+# "code": "",
+# "global": "",
+# "inputs": [
+# {
+# "default": "vec3(-1.0)",
+# "function": true,
+# "label": "",
+# "name": "in",
+# "type": "rgb"
+# }
+# ],
+# "instance": "vec3 $(name)_jump_flood(vec2 uv, float size) {\n\tivec2 int_uv = ivec2(uv * size);\n\tfloat best_distance = 9999.9;\n\tvec2 best_coord;\n\tfloat iter = $in(uv).b;\n\titer += 0.01;\n\tfloat step_width = size / 4.0 / (iter * 100.0);\n\t\n\tfor (int x = -1; x <= 1; x++) {\n\t\tfor (int y = -1; y <= 1; y++) {\n\t\t\tivec2 offsetUV = int_uv + ivec2(x, y) * int(step_width);\n\t\t\tvec2 float_uv = vec2(offsetUV) / size;\n\t\t\tvec2 offset_pos = $in(float_uv).rg;\n\t\t\t\n\t\t\tif (offset_pos.x != 0.0 && offset_pos.y != 0.0) {\n\t\t\t\tvec2 diff = offset_pos - uv;\n\t\t\t\t//float dist = dot(diff, diff);\n\t\t\t\t//float dist = abs(diff.x) + abs(diff.y);\n\t\t\t\t//float dist = abs(diff.x) > abs(diff.y) ? abs(diff.x) : abs(diff.y);\n\t\t\t\t$distance\n\t\t\t\tif (dist < best_distance) {\n\t\t\t\t\tbest_distance = dist;\n\t\t\t\t\tbest_coord = offset_pos;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn vec3(best_coord, iter);\n}",
+# "name": "Jump Flood",
+# "outputs": [
+# {
+# "rgb": "$(name)_jump_flood($uv, $size)",
+# "type": "rgb"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 10,
+# "first": 0,
+# "label": "",
+# "last": 13,
+# "name": "size",
+# "type": "size"
+# },
+# {
+# "default": 2,
+# "label": "",
+# "name": "distance",
+# "type": "enum",
+# "values": [
+# {
+# "name": "Euclidean",
+# "value": "float dist = dot(diff, diff);"
+# },
+# {
+# "name": "Manhattan",
+# "value": "float dist = abs(diff.x) + abs(diff.y);"
+# },
+# {
+# "name": "Chebyshev",
+# "value": "float dist = abs(diff.x) > abs(diff.y) ? abs(diff.x) : abs(diff.y);"
+# }
+# ]
+# }
+# ]
+# },
+# "type": "shader"
+# },
+# {
+# "name": "1823",
+# "node_position": {
+# "x": -269.899872,
+# "y": -17.741766
+# },
+# "parameters": {
+#
+# },
+# "shader_model": {
+# "code": "",
+# "global": "",
+# "inputs": [
+# {
+# "default": "1.0",
+# "label": "",
+# "name": "in",
+# "type": "f"
+# }
+# ],
+# "instance": "",
+# "name": "Mask to UV Mask",
+# "outputs": [
+# {
+# "rgb": "$in($uv) < .5 ? vec3(0.0) : vec3($uv, 0.0)",
+# "type": "rgb"
+# }
+# ],
+# "parameters": [
+#
+# ]
+# },
+# "type": "shader"
+# },
+# {
+# "name": "edge_detect",
+# "node_position": {
+# "x": -286.951447,
+# "y": -137.078964
+# },
+# "parameters": {
+# "size": 9,
+# "threshold": 0.4,
+# "width": 1
+# },
+# "type": "edge_detect"
+# },
+# {
+# "name": "6520",
+# "node_position": {
+# "x": 347.356567,
+# "y": -346.449127
+# },
+# "parameters": {
+# "distance": 0,
+# "length": 0.1
+# },
+# "shader_model": {
+# "code": "",
+# "global": "",
+# "inputs": [
+# {
+# "default": "vec3(0.0)",
+# "function": true,
+# "label": "",
+# "name": "in",
+# "type": "rgb"
+# },
+# {
+# "default": "0.0",
+# "function": true,
+# "label": "",
+# "name": "mask",
+# "type": "f"
+# }
+# ],
+# "instance": "float $(name)_distance(vec2 uv, float length) {\n\tvec2 custom_uv = $in(fract(uv)).xy;\n\tvec2 diff = custom_uv != vec2(0.0) ? custom_uv - fract(uv) : vec2(1.0);\n\t//float distance = length(diff);\n\t//float distance = abs(diff.x) + abs(diff.y);\n\t//float distance = abs(diff.x) > abs(diff.y) ? abs(diff.x) : abs(diff.y);\n\t$distance\n\tif (length >= 0.0) {\n\t\treturn $mask(uv) < 0.5 ? clamp(1.0 - (distance / length), 0.0, 1.0) : 1.0;\n\t} else {\n\t\treturn $mask(uv) > 0.5 ? clamp((distance / -length), 0.0, 1.0) : 0.0;\n\t}\n}",
+# "name": "Calculate Distance",
+# "outputs": [
+# {
+# "f": "$(name)_distance($uv, $length)",
+# "type": "f"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 0.1,
+# "label": "Length",
+# "max": 1,
+# "min": -1,
+# "name": "length",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "default": 2,
+# "label": "",
+# "name": "distance",
+# "type": "enum",
+# "values": [
+# {
+# "name": "Euclidean",
+# "value": "float distance = length(diff);"
+# },
+# {
+# "name": "Manhattan",
+# "value": "float distance = abs(diff.x) + abs(diff.y);"
+# },
+# {
+# "name": "Chebyshev",
+# "value": "float distance = abs(diff.x) > abs(diff.y) ? abs(diff.x) : abs(diff.y);"
+# }
+# ]
+# }
+# ]
+# },
+# "type": "shader"
+# },
+# {
+# "name": "gen_inputs",
+# "node_position": {
+# "x": -793.451477,
+# "y": -236.812195
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "longdesc": "The greyscale mask to be converted",
+# "name": "mask",
+# "shortdesc": "Mask",
+# "type": "f"
+# },
+# {
+# "group_size": 0,
+# "longdesc": "",
+# "name": "source",
+# "shortdesc": "Source",
+# "type": "rgb"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "gen_outputs",
+# "node_position": {
+# "x": 885.056335,
+# "y": -247.896317
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "longdesc": "Shows the dilated image",
+# "name": "out",
+# "shortdesc": "Output",
+# "type": "rgb"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "gen_parameters",
+# "node_position": {
+# "x": 61.520477,
+# "y": -639.339172
+# },
+# "parameters": {
+# "param0": 9,
+# "param1": 0.1,
+# "param2": 0,
+# "param3": 0,
+# "param4": 30
+# },
+# "type": "remote",
+# "widgets": [
+# {
+# "label": "",
+# "linked_widgets": [
+# {
+# "node": "iterate_buffer",
+# "widget": "size"
+# },
+# {
+# "node": "2434_8",
+# "widget": "size"
+# },
+# {
+# "node": "buffer_2",
+# "widget": "size"
+# },
+# {
+# "node": "edge_detect",
+# "widget": "size"
+# }
+# ],
+# "longdesc": "The resolution of the input images",
+# "name": "param0",
+# "shortdesc": "Size",
+# "type": "linked_control"
+# },
+# {
+# "label": "",
+# "linked_widgets": [
+# {
+# "node": "6520",
+# "widget": "length"
+# }
+# ],
+# "longdesc": "The length of the dilate effect",
+# "name": "param1",
+# "shortdesc": "Length",
+# "type": "linked_control"
+# },
+# {
+# "label": "",
+# "linked_widgets": [
+# {
+# "node": "11582",
+# "widget": "fill"
+# }
+# ],
+# "longdesc": "0 to generate a gradient to black while dilating, 1 to fill with input color",
+# "name": "param2",
+# "shortdesc": "Fill",
+# "type": "linked_control"
+# },
+# {
+# "label": "",
+# "linked_widgets": [
+# {
+# "node": "2434_8",
+# "widget": "distance"
+# },
+# {
+# "node": "6520",
+# "widget": "distance"
+# }
+# ],
+# "name": "param3",
+# "shortdesc": "Distance Function",
+# "type": "linked_control"
+# },
+# {
+# "label": "",
+# "linked_widgets": [
+# {
+# "node": "iterate_buffer",
+# "widget": "iterations"
+# }
+# ],
+# "longdesc": "The number of iterations the jump flood algorithm performs to calculate the distances",
+# "name": "param4",
+# "shortdesc": "Iterations",
+# "type": "linked_control"
+# }
+# ]
+# },
+# {
+# "name": "buffer_2",
+# "node_position": {
+# "x": -294.502808,
+# "y": -340.816589
+# },
+# "parameters": {
+# "size": 9
+# },
+# "type": "buffer",
+# "version": 1
+# },
+# {
+# "name": "tones_step",
+# "node_position": {
+# "x": -285.347992,
+# "y": -253.248215
+# },
+# "parameters": {
+# "invert": false,
+# "value": 0.5,
+# "width": 0
+# },
+# "type": "tones_step"
+# },
+# {
+# "name": "24282_2",
+# "node_position": {
+# "x": 109.591705,
+# "y": -88.567284
+# },
+# "parameters": {
+# "tiled": true
+# },
+# "shader_model": {
+# "code": "vec3 $(name_uv)_in = $in(fract($uv));\nvec3 $(name_uv)_tiled = $(name_uv)_in.xy != vec2(0.0) ? $(name_uv)_in + vec3(floor($uv), 0.0) : $(name_uv)_in;",
+# "global": "",
+# "inputs": [
+# {
+# "default": "vec3(1.0)",
+# "function": true,
+# "label": "",
+# "name": "in",
+# "type": "rgb"
+# }
+# ],
+# "instance": "",
+# "name": "Tiling",
+# "outputs": [
+# {
+# "rgb": "$tiled ? $(name_uv)_tiled : $(name_uv)_in",
+# "type": "rgb"
+# }
+# ],
+# "parameters": [
+# {
+# "default": false,
+# "label": "Tiled",
+# "name": "tiled",
+# "type": "boolean"
+# }
+# ]
+# },
+# "type": "shader"
+# },
+# {
+# "name": "2153",
+# "node_position": {
+# "x": 368.85202,
+# "y": -157.100906
+# },
+# "parameters": {
+#
+# },
+# "shader_model": {
+# "code": "",
+# "global": "",
+# "inputs": [
+# {
+# "default": "vec3(1.0)",
+# "label": "Source",
+# "name": "source",
+# "type": "rgb"
+# },
+# {
+# "default": "$uv",
+# "label": "Custom UV",
+# "name": "custom_uv",
+# "type": "rgb"
+# },
+# {
+# "default": "0.0",
+# "label": "Mask",
+# "name": "mask",
+# "type": "f"
+# }
+# ],
+# "instance": "",
+# "name": "Dilate UV",
+# "outputs": [
+# {
+# "rgb": "$mask($uv) < 0.5 ? $source($custom_uv($uv).xy) : $source($uv)",
+# "type": "rgb"
+# }
+# ],
+# "parameters": [
+#
+# ]
+# },
+# "type": "shader"
+# },
+# {
+# "name": "11582",
+# "node_position": {
+# "x": 609.343445,
+# "y": -239.746399
+# },
+# "parameters": {
+# "fill": 0
+# },
+# "shader_model": {
+# "code": "float $(name_uv)_dist = $distance($uv);\nvec3 $(name_uv)_color = mix($source(fract($uv)), $fill_raw(fract($uv)), float( $(name_uv)_dist != 0.0 ) );\nvec3 $(name_uv)_mix = mix($(name_uv)_color * $(name_uv)_dist, $(name_uv)_color, $fill);",
+# "global": "",
+# "inputs": [
+# {
+# "default": "0.0",
+# "function": true,
+# "label": "Distance",
+# "name": "distance",
+# "type": "f"
+# },
+# {
+# "default": "vec3(1.0)",
+# "function": true,
+# "label": "Fill Raw",
+# "name": "fill_raw",
+# "type": "rgb"
+# },
+# {
+# "default": "vec3(1.0)",
+# "function": true,
+# "label": "Source",
+# "name": "source",
+# "type": "rgb"
+# }
+# ],
+# "instance": "",
+# "name": "Dilate Combine",
+# "outputs": [
+# {
+# "rgb": "$(name_uv)_mix",
+# "type": "rgb"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 0,
+# "label": "Fill",
+# "max": 1,
+# "min": 0,
+# "name": "fill",
+# "step": 0.01,
+# "type": "float"
+# }
+# ]
+# },
+# "type": "shader"
+# },
+# {
+# "name": "8064",
+# "node_position": {
+# "x": -282.533325,
+# "y": -433.011169
+# },
+# "parameters": {
+#
+# },
+# "shader_model": {
+# "code": "",
+# "global": "",
+# "inputs": [
+# {
+# "default": "vec3(0.0)",
+# "label": "",
+# "name": "in",
+# "type": "rgb"
+# }
+# ],
+# "instance": "",
+# "name": "Default Value",
+# "outputs": [
+# {
+# "rgb": "$in($uv)",
+# "type": "rgb"
+# }
+# ],
+# "parameters": [
+#
+# ]
+# },
+# "type": "shader"
+# }
+# ],
+# "parameters": {
+# "param0": 9,
+# "param1": 0.1,
+# "param2": 0,
+# "param3": 0,
+# "param4": 30
+# },
+# "shortdesc": "",
+# "type": "graph"
+# }
+# ],
+# "parameters": {
+# "param0": 10,
+# "param1": 30,
+# "param2": false,
+# "param3": 0
+# },
+# "shortdesc": "",
+# "type": "graph"
+#}
+
+static func sdf_show(val : float, bevel : float) -> Color:
+ var f : float = clamp(-val / max(bevel, 0.00001), 0.0, 1.0);
+
+ return Color(f, f, f, 1)
+
+static func sdf_circle(uv : Vector2, c : Vector2, r : float) -> float:
+ c.x += 0.5
+ c.y += 0.5
+
+ return (uv - c).length() - r;
+
+static func sdf_box(uv : Vector2, c : Vector2, wh : Vector2) -> float:
+ c.x += 0.5
+ c.y += 0.5
+
+ var d : Vector2 = Commons.absv2(uv - c) - wh
+
+ return Commons.maxv2(d, Vector2(0, 0)).length() + min(max(d.x, d.y), 0.0)
+
+#vec2 $(name_uv)_sdl = sdLine($uv, vec2($ax+0.5, $ay+0.5), vec2($bx+0.5, $by+0.5));
+
+static func sdf_line(uv : Vector2, a : Vector2, b : Vector2, r : float) -> Vector2:
+ a.x += 0.5
+ a.y += 0.5
+
+ b.x += 0.5
+ b.y += 0.5
+
+ return sdLine(uv, a, b)
+
+
+static func sdf_rhombus(uv : Vector2, c : Vector2, wh : Vector2) -> float:
+ c.x += 0.5
+ c.y += 0.5
+
+ return sdRhombus(uv - c, wh);
+
+
+static func sdf_arc(uv : Vector2, a : Vector2, r : Vector2) -> float:
+ return sdArc(uv - Vector2(0.5, 0.5), Commons.modf(a.x, 360.0) * 0.01745329251, Commons.modf(a.y, 360.0)*0.01745329251, r.x, r.y)
+
+#float sdr_ndot(vec2 a, vec2 b) {
+# return a.x*b.x - a.y*b.y;
+#}
+
+static func sdr_ndot(a : Vector2, b : Vector2) -> float:
+ return a.x * b.x - a.y * b.y;
+
+#float sdRhombus(in vec2 p, in vec2 b) {
+# vec2 q = abs(p);
+# float h = clamp((-2.0*sdr_ndot(q,b)+sdr_ndot(b,b))/dot(b,b),-1.0,1.0);
+# float d = length( q - 0.5*b*vec2(1.0-h,1.0+h) );
+# return d * sign( q.x*b.y + q.y*b.x - b.x*b.y );
+#}
+
+static func sdRhombus(p : Vector2, b : Vector2) -> float:
+ var q : Vector2 = Commons.absv2(p);
+ var h : float = clamp((-2.0 * sdr_ndot(q,b) + sdr_ndot(b,b)) / b.dot(b), -1.0, 1.0);
+ var d : float = ( q - 0.5*b * Vector2(1.0-h, 1.0+h)).length()
+ return d * sign(q.x*b.y + q.y*b.x - b.x*b.y)
+
+#float sdArc(vec2 p, float a1, float a2, float ra, float rb) {
+# float amid = 0.5*(a1+a2)+1.6+3.14*step(a1, a2);
+# float alength = 0.5*(a1-a2)-1.6+3.14*step(a1, a2);
+#
+# vec2 sca = vec2(cos(amid), sin(amid));
+# vec2 scb = vec2(cos(alength), sin(alength));
+# p *= mat2(vec2(sca.x,sca.y),vec2(-sca.y,sca.x));
+# p.x = abs(p.x);
+#
+# float k = (scb.y*p.x>scb.x*p.y) ? dot(p.xy,scb) : length(p.xy);
+# return sqrt( dot(p,p) + ra*ra - 2.0*ra*k ) - rb;
+#}
+
+static func sdArc(p : Vector2, a1 : float, a2 : float, ra : float, rb : float) -> float:
+ var amid : float = 0.5*(a1+a2)+1.6+3.14 * Commons.step(a1, a2);
+ var alength : float = 0.5*(a1-a2)-1.6+3.14 * Commons.step(a1, a2);
+ var sca : Vector2 = Vector2(cos(amid), sin(amid));
+ var scb : Vector2 = Vector2(cos(alength), sin(alength));
+
+ #p *= Matrix(Vector2(sca.x , sca.y), Vector2(-sca.y, sca.x));
+
+ var pt : Vector2 = p
+
+ p.x = pt.x * sca.x + pt.y * sca.y
+ p.y = pt.x * -sca.y + pt.y * sca.x
+
+ p.x = abs(p.x);
+
+ var k : float
+
+ if (scb.y * p.x > scb.x * p.y):
+ k = p.dot(scb)
+ else:
+ k = p.length();
+
+ return sqrt( p.dot(p) + ra * ra - 2.0 * ra * k ) - rb;
+
+
+static func sdf_boolean_union(a : float, b : float) -> float:
+ return min(a, b)
+
+static func sdf_boolean_substraction(a : float, b : float) -> float:
+ return max(-a, b)
+
+static func sdf_boolean_intersection(a : float, b : float) -> float:
+ return max(a, b)
+
+static func sdf_smooth_boolean_union(d1 : float, d2 : float, k : float) -> float:
+ var h : float = clamp( 0.5 + 0.5 * (d2 - d1) / k, 0.0, 1.0)
+ return lerp(d2, d1, h) - k * h * (1.0 - h)
+
+static func sdf_smooth_boolean_substraction(d1 : float, d2 : float, k : float) -> float:
+ var h : float = clamp( 0.5 - 0.5 * (d2 + d1) / k, 0.0, 1.0)
+ return lerp(d2, -d1, h) + k * h * (1.0 - h)
+
+static func sdf_smooth_boolean_intersection(d1 : float, d2 : float, k : float) -> float:
+ var h : float = clamp( 0.5 - 0.5 * (d2 - d1) / k, 0.0, 1.0)
+ return lerp(d2, d1, h) + k * h * (1.0 - h)
+
+static func sdf_rounded_shape(a : float, r : float) -> float:
+ return a - r
+
+static func sdf_annular_shape(a : float, r : float) -> float:
+ return abs(a) - r
+
+static func sdf_morph(a : float, b : float, amount : float) -> float:
+ return lerp(a, b, amount)
+
+#vec2 sdLine(vec2 p, vec2 a, vec2 b) {
+# vec2 pa = p-a, ba = b-a;
+# float h = clamp(dot(pa,ba)/dot(ba,ba), 0.0, 1.0);
+# return vec2(length(pa-ba*h), h);
+#}
+
+static func sdLine(p : Vector2, a : Vector2, b : Vector2) -> Vector2:
+ var pa : Vector2 = p - a
+ var ba : Vector2 = b - a
+
+ var h : float = clamp(pa.dot(ba) / ba.dot(ba), 0.0, 1.0);
+
+ return Vector2((pa - (ba * h)).length(), h)
+
+
+#Needs thought
+#func sdf_translate(a : float, x : float, y : float) -> float:
+# return lerp(a, b, amount)
+
+#vec2 sdf2d_rotate(vec2 uv, float a) {
+# vec2 rv;
+# float c = cos(a);
+# float s = sin(a);
+# uv -= vec2(0.5);
+# rv.x = uv.x*c+uv.y*s;
+# rv.y = -uv.x*s+uv.y*c;
+# return rv+vec2(0.5);
+#}
+
+static func sdf2d_rotate(uv : Vector2, a : float) -> Vector2:
+ var rv : Vector2;
+ var c : float = cos(a);
+ var s : float = sin(a);
+ uv -= Vector2(0.5, 0.5);
+ rv.x = uv.x*c+uv.y*s;
+ rv.y = -uv.x*s+uv.y*c;
+ return rv+Vector2(0.5, 0.5);
+
+#float cross2( in vec2 a, in vec2 b ) {
+# return a.x*b.y - a.y*b.x;
+#}
+
+#// signed distance to a quadratic bezier\n
+#vec2 sdBezier( in vec2 pos, in vec2 A, in vec2 B, in vec2 C ) { \n
+# vec2 a = B - A;\n
+# vec2 b = A - 2.0*B + C;\n
+# vec2 c = a * 2.0;\n
+# vec2 d = A - pos;\n\n
+# float kk = 1.0/dot(b,b);\n
+# float kx = kk * dot(a,b);\n
+# float ky = kk * (2.0*dot(a,a)+dot(d,b))/3.0;\n
+# float kz = kk * dot(d,a); \n\n
+# float res = 0.0;\n
+# float sgn = 0.0;\n\n
+# float p = ky - kx*kx;\n
+# float p3 = p*p*p;\n
+# float q = kx*(2.0*kx*kx - 3.0*ky) + kz;\n
+# float h = q*q + 4.0*p3;\n\t
+# float rvx;\n\n
+#
+# if( h>=0.0 ) {
+# // 1 root\n
+# h = sqrt(h);\n
+# vec2 x = (vec2(h,-h)-q)/2.0;\n
+# vec2 uv = sign(x)*pow(abs(x), vec2(1.0/3.0));
+# rvx = uv.x+uv.y-kx;\n
+# float t = clamp(rvx, 0.0, 1.0);\n
+# vec2 q2 = d+(c+b*t)*t;\n
+# res = dot(q2, q2);\n \t
+# sgn = cross2(c+2.0*b*t, q2);\n
+# } else {
+# // 3 roots\n
+# float z = sqrt(-p);\n
+# float v = acos(q/(p*z*2.0))/3.0;\n
+# float m = cos(v);\n
+# float n = sin(v)*1.732050808;\n
+# vec3 t = clamp(vec3(m+m,-n-m,n-m)*z-kx, 0.0, 1.0);\n
+# vec2 qx=d+(c+b*t.x)*t.x;
+# float dx=dot(qx, qx), sx = cross2(c+2.0*b*t.x,qx);\n
+# vec2 qy=d+(c+b*t.y)*t.y;
+# float dy=dot(qy, qy), sy = cross2(c+2.0*b*t.y,qy);\n
+#
+# if( dx Vector2:
+ var a : Vector2 = B - A;
+ var b : Vector2 = A - 2.0 * B + C;
+ var c : Vector2 = a * 2.0;
+ var d : Vector2 = A - pos;
+
+ var kk : float = 1.0 / b.dot(b);
+ var kx : float = kk * a.dot(b);
+ var ky : float = kk * (2.0* a.dot(a) + d.dot(b)) / 3.0;
+ var kz : float = kk * d.dot(a);
+
+ var res : float = 0.0;
+ var sgn : float = 0.0;
+
+ var p : float = ky - kx * kx;
+ var p3 : float = p * p * p;
+ var q : float = kx * (2.0 * kx * kx - 3.0 * ky) + kz;
+ var h : float = q * q + 4.0 * p3;
+ var rvx : float = 0
+
+ if(h >= 0.0):
+ # // 1 root
+ h = sqrt(h);
+
+ var x : Vector2 = (Vector2(h,-h) - Vector2(q, q)) / 2.0
+
+ var uv : Vector2 = Commons.signv2(x) * Commons.powv2(Commons.absv2(x), Vector2(1.0/3.0, 1.0/3.0));
+
+ rvx = uv.x + uv.y - kx;
+ var t : float = clamp(rvx, 0.0, 1.0);
+ var q2 : Vector2 = d + (c + b * t) * t;
+ res = q2.dot(q2);
+
+ sgn = (c + Vector2(2, 2) * b * t).cross(q2)
+
+ else: # // 3 roots
+ var z : float = sqrt(-p);
+ var v : float = acos(q / (p * z * 2.0)) / 3.0;
+ var m : float = cos(v);
+ var n : float = sin(v) * 1.732050808;
+
+ var t : Vector3 = Commons.clampv3(Vector3(m+m, -n-m, n-m) * z - Vector3(kx, kx, kx), Vector3(), Vector3(1, 1, 1));
+
+ var qx : Vector2 = d + (c + b * t.x) * t.x;
+ var dx : float = qx.dot(qx)
+ var sx : float = (c + Vector2(2, 2) * b * t.x).cross(qx)
+ var qy : Vector2 = d + (c + b * t.y) * t.y
+ var dy : float = qy.dot(qy)
+ var sy : float = (c + Vector2(2, 2) * b * t.y).cross(qy)
+
+ if dx Vector2:
+ var r : float = 6.28 / count
+ var pa : float = atan2(p.x, p.y)
+ var a : float = Commons.modf(pa + 0.5 * r, r)-0.5*r
+
+ var rv : Vector2 = Vector2()
+
+ var c : float = cos(a - pa);
+ var s : float = sin(a - pa);
+
+ rv.x = p.x * c + p.y * s
+ rv.y = -p.x * s + p.y * c
+
+ return rv;
+
+#float sdNgon(vec2 p, float r, float n) {
+# float PI = 3.1415926535;
+# p = circle_repeat_transform_2d(p, n);
+# vec2 d = abs(p)-vec2(r*tan(3.14159265359/n), r);
+# return p.y < r ? p.y-r : length(max(d,vec2(0)))+min(max(d.x,d.y),0.0);
+#}
+
+static func sdNgon(pos : Vector2, r : float, n : float) -> Vector2:
+ return Vector2()
+
+
+#vec2 repeat_2d(vec2 p, vec2 r, float seed, float randomness) {
+# p -= vec2(0.5);
+# float a = (rand(floor(mod((p.xy+0.5*r.xy)/r.xy, 1.0/r.xy)+vec2(seed)))-0.5)*6.28*randomness;
+# p = mod(p+0.5*r,r)-0.5*r;
+# vec2 rv;
+# float c = cos(a);
+# float s = sin(a);
+# rv.x = p.x*c+p.y*s;
+# rv.y = -p.x*s+p.y*c;
+# return rv+vec2(0.5);
+#}
+
+static func repeat_2d(p : Vector2, r : Vector2, pseed : float, randomness : float) -> Vector2:
+ p -= Vector2(0.5, 0.5);
+ var v : Vector2 = Vector2(p.x, p.y) + Vector2(0.5, 0.5) + Vector2(r.x, r.y)
+ var a : float = ((Commons.rand2(Commons.floorv2(Commons.modv2(v / Vector2(r.x, r.y), Vector2(1.0, 1.0) / Vector2(r.x, r.y)) + Vector2(pseed, pseed))) - Vector2(0.5, 0.5)) * 6.28 * randomness).x
+ p = Commons.modv2(p + Vector2(0.5, 0.5) * r,r)- Vector2(0.5, 0.5) * r
+ var rv : Vector2 = Vector2()
+ var c : float = cos(a)
+ var s : float = sin(a)
+ rv.x = p.x * c + p.y * s
+ rv.y = -p.x * s + p.y * c
+ return rv + Vector2(0.5, 0.5);
+
+#float sdSmoothUnion( float d1, float d2, float k ) {
+# float h = clamp( 0.5 + 0.5*(d2-d1)/k, 0.0, 1.0 );
+# return mix( d2, d1, h ) - k*h*(1.0-h);
+#}
+
+static func sdSmoothUnion(d1 : float, d2 : float, k : float) -> float:
+ return 0.0
+
+#float sdSmoothSubtraction( float d1, float d2, float k ) {
+# float h = clamp( 0.5 - 0.5*(d2+d1)/k, 0.0, 1.0 );
+# return mix( d2, -d1, h ) + k*h*(1.0-h);
+#}
+
+static func sdSmoothSubtraction(d1 : float, d2 : float, k : float) -> float:
+ return 0.0
+
+#float sdSmoothIntersection( float d1, float d2, float k ) {
+# float h = clamp( 0.5 - 0.5*(d2-d1)/k, 0.0, 1.0 );
+# return mix( d2, d1, h ) + k*h*(1.0-h);
+#}
+
+static func sdSmoothIntersection(d1 : float, d2 : float, k : float) -> float:
+ return 0.0
+
+
+#float sdRipples(float d, float w, int r) {\n
+# for (int i = 0; i < r; ++i) {
+# d = abs(d)-w;
+# }
+#
+# return d;
+#}
+
+static func sdRipples(d : float, w : float, r : int) -> float:
+ for i in range(r):
+ d = abs(d)-w;
+
+ return d
+
+#$polygon = { p1(vec2), p2(vec2), p3(vec2) ... }
+#float sdPolygon_$(name)(vec2 p) {
+# vec2 v[] = $polygon;
+# int l = v.length();
+# float d = dot(p-v[0],p-v[0]);
+# float s = 1.0;
+# int j = l-1;
+#
+# for(int i=0; i=v[i].y,p.ye.y*w.x);
+#
+# if(all(c) || all(not(c))) {
+# s *= -1.0;
+# }
+#
+# j = i;
+# }
+#
+# return s*sqrt(d);
+#}
+
+static func sdPolygon(p : Vector2, v : PoolVector2Array) -> float:
+ var l : int = v.size()
+ var pmv0 : Vector2 = p - v[0]
+ var d : float = pmv0.dot(pmv0)
+ var s : float = 1.0
+ var j : int = l - 1
+
+ for i in range(l): #for(int i=0; i= v[i].y
+ var b2 : bool = p.y < v[j].y
+ var b3 : bool = e.x * w.y > e.y * w.x
+
+ if((b1 && b2 && b3) || (!b1 && !b2 && !b3)):
+ s *= -1.0
+
+ j = i
+
+ return s * sqrt(d)
diff --git a/modules/material_maker/mat_maker_gd/nodes/common/sdf3d.gd b/modules/material_maker/mat_maker_gd/nodes/common/sdf3d.gd
new file mode 100644
index 000000000..932094dc8
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/common/sdf3d.gd
@@ -0,0 +1,789 @@
+tool
+extends Reference
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+
+#----------------------
+#sdf3d_box.mmg
+#Generates a rounded box as a signed distance function
+
+#Outputs:
+
+#Common
+#vec3 $(name_uv)_q = abs($uv) - vec3($sx, $sy, $sz);
+
+#Output - (sdf3d) - Shows the rounded box
+#length(max($(name_uv)_q,0.0))+min(max($(name_uv)_q.x,max($(name_uv)_q.y,$(name_uv)_q.z)),0.0)-$r
+
+#Inputs:
+#size, vector3, min: 0, max: 1, default:0.5, step:0.01
+#size, float, min: 0, max: 1, default:0.5, step:0.01
+
+#----------------------
+#sdf3d_sphere.mmg
+#Generates a sphere as a signed distance function
+
+#Outputs:
+
+#Output - (sdf3d) - Shows the sphere
+#length($uv)-$r
+
+#Inputs:
+#radius, vector3, min: 0, max: 1, default:0.5, step:0.01
+
+#----------------------
+#sdf3d_capsule.mmg
+#Generates a capsule as a signed distance function
+
+#Outputs:
+
+#Common
+#vec3 $(name_uv)_p = $uv;
+#$(name_uv)_p.$axis -= clamp($(name_uv)_p.$axis, -$l, $l);
+
+#Output - (sdf3d) - Shows the capsule
+#length($(name_uv)_p)-$r*$profile(clamp(0.5+0.5*($uv).$axis/$l, 0.0, 1.0))
+
+#Inputs:
+#axis, enum, default: 1, values: x, y, z
+#length, float, min: 0, max: 1, default:0.25, step:0.01
+#radius, float, min: 0, max: 1, default:0.2, step:0.01
+#profile, curve, default: (ls, rs, x, z) 0, 0, 0, 1, 0, 0, 1, 1
+
+#----------------------
+#sdf3d_cone.mmg
+
+#Outputs:
+
+#+X: $axis = length($uv.yz),-$uv.x
+#-X: $axis = length($uv.yz),$uv.x
+#+Y: $axis = length($uv.xz),$uv.y
+#-Y: $axis = length($uv.xz),-$uv.y
+#+Z: $axis = length($uv.xy),-$uv.z
+#-Z: $axis = length($uv.xy),$uv.z
+
+#Output - (sdf3d)
+#dot(vec2(cos($a*0.01745329251),sin($a*0.01745329251)),vec2($axis))
+
+#Inputs:
+#axis, enum, default:5, values: +X, -X, +Y, -Y, +Z, -Z
+#angle, float, min: 0, max: 90, default:30, step:1
+
+#----------------------
+#sdf3d_repeat.mmg
+
+#Outputs:
+
+#Output (sdf3d)
+#Output - (sdf3dc) - The shape generated by the repeat operation
+#$in(repeat($uv, vec3(1.0/$rx, 1.0/$ry, 0.0), float($seed), $r))
+
+#Inputs:
+#in, vec2, default:vec2(100, 0.0), (sdf3d input)
+
+#X, int, min: 1, max: 32, default:4, step:1
+#Y, int, min: 1, max: 32, default:4, step:1
+#R, float, min: 0, max: 1, default:0.5, step:0.01
+
+#----------------------
+#sdf3d_rotate.mmg
+
+#Outputs:
+
+#Output - (sdf3dc) - The rotated object
+#$in(rotate3d($uv, -vec3($ax, $ay, $az)*0.01745329251))
+
+#Inputs:
+#in, vec2, default:vec2(100, 0.0), (sdf3d input)
+#rotation, vector3, min: -180, max: 180, default:0, step:1
+
+#----------------------
+#sdf3d_cylinder.mmg
+
+#Outputs:
+
+#Output - (sdf3dc) - Shows the cylinder
+#min(max($(name_uv)_d.x,$(name_uv)_d.y),0.0) + length(max($(name_uv)_d,0.0))
+
+#Inputs:
+#axis, enum, default: 1, values: X, Y, Z
+#length, float, min: 0, max: 1, default:0.5, step:0.01
+#radius, float, min: 0, max: 1, default:0.2, step:0.01
+
+#----------------------
+#sdf3d_plane.mmg
+#Generates a plane that can be used to cut other shapes
+
+#Outputs:
+
+#X: $axis = x
+#Y: $axis = y
+#Z: $axis = z
+
+#Output - (sdf3dc) - Shows the plane
+#$uv.$axis
+
+#Inputs:
+#axis, enum, default: 1, values: X, Y, Z
+
+#----------------------
+#sdf3d_torus.mmg
+#Generates a torus as a signed distance function
+
+#Outputs:
+
+#X: $axis = length($uv.yz)-$R,$uv.x
+#Y: $axis = length($uv.zx)-$R,$uv.y
+#Z: $axis = length($uv.xy)-$R,$uv.z
+#vec2 $(name_uv)_q = vec2($axis);
+
+#Output - (sdf3dc) - Shows the torus
+#length($(name_uv)_q)-$r
+
+#Inputs:
+#axis, enum, default: 1, values: X, Y, Z
+#R, float, min: 0, max: 1, default:0.5, step:0.01
+#r, float, min: 0, max: 1, default:0.1, step:0.01
+
+#----------------------
+#sdf3d_boolean.mmg
+
+#Outputs:
+
+#Union: $op = sdf3dc_union
+#Subtraction $op = sdf3dc_sub
+#Intersection $op = sdf3dc_inter
+
+#Output - (sdf3dc) - The shape generated by the boolean operation
+#$op($in1($uv), $in2($uv))
+
+#Inputs:
+#axis, enum, default: 2, values: Union, Subtraction, Intersection
+#in1, vec2, default:vec2(100, 0.0), (sdf3d input)
+#in2, vec2, default:vec2(100, 0.0), (sdf3d input)
+
+#----------------------
+#sdf3d_circle_repeat.mmg
+
+#Outputs:
+
+#Output (sdf3dc) - The shape generated by the boolean operation
+#$in(circle_repeat_transform($uv, $c))
+
+#Inputs:
+#count, float, min: 1, max: 32, default:5, step:1
+
+#----------------------
+#sdf3d_angle.mmg (includes sdf3d_rotate.mmg)
+
+#Outputs:
+
+#Shows the angleThe shape generated by the boolean operation
+#$(name_uv)_d
+
+#X: $axis = xyz
+#Y: $axis = yzx
+#Z: $axis = zxy
+
+#vec3 $(name_uv)_uv = $uv.$axis;
+#float $(name_uv)_rotated = rotate3d($(name_uv)_uv, vec3(($angle-180.0)*0.01745329251, 0.0, 0.0)).y;
+#float $(name_uv)_d1 = max($(name_uv)_uv.y, $(name_uv)_rotated);
+#float $(name_uv)_d2 = min($(name_uv)_uv.y, $(name_uv)_rotated);
+#float $(name_uv)_d = (mod($angle, 360.0) < 180.0) ? $(name_uv)_d1 : $(name_uv)_d2;
+
+#Inputs:
+#axis, enum, default: 0, values: X, Y, Z
+#angle, float, min: 0, max: 360, default:180, step:0.1
+
+#----------------------
+#sdf3d_color.mmg
+
+#Outputs:
+
+#Output - sdf3dc - The colored 3D object
+#vec2($in($uv), $c)
+
+#Inputs:
+#color_index, float, min: 0, max: 1, default:0, step:0.01
+#in, vec2, default:vec2(100, 0.0), (sdf3d input)
+
+#----------------------
+#sdf3d_translate.mmg
+
+#Outputs:
+
+#Output - sdf3dc
+#$in($uv-vec3($x, $y, $z))
+
+#Inputs:
+#translation, vector3, min: -1, max: 1, default:0, step:0.01
+#in, vec2, default:vec2(100, 0.0), (sdf3dc input)
+
+#----------------------
+#sdf3d_scale.mmg
+
+#Outputs:
+
+#vec2 $(name_uv)_in = $in(($uv)/$s);
+
+#Output - sdf3dc
+#vec2($(name_uv)_in.x*$s, $(name_uv)_in.y)
+
+#Inputs:
+#scale_factor, float, min: 0, max: 5, default:1, step:0.01
+#in, vec2, default:vec2(100, 0.0), (sdf3dc input)
+
+#----------------------
+#sdf3d_rounded.mmg
+
+#Outputs:
+
+#vec2 $(name_uv)_v = $in($uv);
+
+#Output - sdf3dc
+#vec2($(name_uv)_v.x-$r, $(name_uv)_v.y)
+
+#Inputs:
+#radius, float, min: 0, max: 1, default:0, step:0.01
+#in, vec2, default:vec2(100, 0.0), (sdf3dc input)
+
+#----------------------
+#sdf3d_revolution.mmg
+
+#Outputs:
+
+#vec2 $(name_uv)_q = vec2(length($uv.xy)-$d+0.5, $uv.z+0.5);
+
+#Output - sdf3dc
+#$in($(name_uv)_q)
+
+#Inputs:
+#d, float, min: 0, max: 1, default:0.25, step:0.01
+#input, float, default:10.0, (sdf2d input)
+
+#----------------------
+#sdf3d_smoothboolean.mmg
+#Performs a smooth boolean operation (union, intersection or difference) between two shapes
+
+#Outputs:
+
+#Union: $op = union
+#Subtraction: $op = subtraction
+#Intersection: $op = intersection
+
+#Output - sdf3dc
+#sdf3d_smooth_$op($in1($uv), $in2($uv), $k)
+
+#Inputs:
+#in1, vec2, default:vec2(100, 0.0), (sdf3d input)
+#in2, vec2, default:vec2(100, 0.0), (sdf3d input)
+#operation, enum, default: 1, values: Union, Subtraction, Intersection
+#smoothness, float, min: 0, max: 1, default:0, step:0.01
+
+#----------------------
+#sdf3d_elongation.mmg
+
+#Outputs:
+
+#Output - sdf3dc
+#$in($uv-clamp($uv, -abs(vec3($x, $y, $z)), abs(vec3($x, $y, $z))))
+
+#Inputs:
+#in, vec2, default:vec2(100, 0.0), (sdf3dc input)
+#elongation, vector3, min: 0, max: 1, default:0, step:0.01
+
+#----------------------
+#sdf3d_extrusion.mmg
+
+#Outputs:
+
+#vec2 $(name_uv)_w = vec2($in($uv.xz+vec2(0.5)),abs($uv.y)-$d);
+
+#Output - sdf3dc
+#min(max($(name_uv)_w.x,$(name_uv)_w.y),0.0)+length(max($(name_uv)_w,0.0))
+
+#Inputs:
+#in, sdf2d, default:100, (input)
+#length, float, min: 0, max: 1, default:0.25, step:0.01
+
+#----------------------
+#sdf3d_morph.mmg
+
+#Outputs:
+
+#Output - sdf3d
+#mix($in1($uv), $in2($uv), $amount)
+
+#Inputs:
+#in1, vec2, default:vec2(100, 0.0), (sdf3d input)
+#in2, vec2, default:vec2(100, 0.0), (sdf3d input)
+#amount, float, min: 0, max: 1, default:0.5, step:0.01
+
+#----------------------
+#raymarching.mmg (raymarching_preview.mmg)
+#Raymarches a 3D object (described as signed distance function with optional color index)
+#to render a heightmap, a normal map and a color index map.
+
+#raymarch_$name = sdf3d_raymarch
+#vec2 $(name_uv)_d = raymarch_$name($uv);
+
+#Outputs:
+
+#HeightMap - float - The generated height map
+#1.0-$(name_uv)_d.x
+
+#NormalMap - rgb - The generated normal map
+#vec3(0.5)+0.5*normal_$name(vec3($uv-vec2(0.5), 1.0-$(name_uv)_d.x))
+
+#ColorMap - float - The generated color index map
+#$(name_uv)_d.y
+
+#Inputs:
+#input, vec2, default:vec2(100, 0.0), (sdf3dc input)
+
+#----------------------
+#raymarching_preview.mmg
+
+#Outputs:
+
+#Output (rgb)
+#render_$name($uv-vec2(0.5))
+
+#Inputs:
+#input, vec2, default:vec2(100, 0.0), (sdf3dc input)
+
+static func raymarch(uv : Vector2) -> Color:
+ var d : Vector2 = sdf3d_raymarch(uv);
+
+ var f : float = 1.0 - d.x;
+
+ return Color(f, f, f, 1)
+
+static func raymarch2(uv : Vector2) -> Color:
+ var d : Vector2 = sdf3d_raymarch(uv);
+
+ var v : Vector3 = Vector3(0.5, 0.5, 0.5) + 0.5 * sdf3d_normal(Vector3(uv.x - 0.5, uv.y - 0.5, 1.0 - d.x));
+
+ return Color(v.x, v.y, v.z, 1)
+
+static func raymarch3(uv : Vector2) -> Color:
+ var v : Vector2 = sdf3d_raymarch(uv);
+
+ return Color(v.y, v.y, v.y, 1)
+
+#length($uv)-$r
+
+static func sdf3d_sphere(p : Vector3, r : float) -> Vector2:
+ var s : float = p.length() - r;
+
+ return Vector2(s, 0.0);
+
+#vec3 $(name_uv)_q = abs($uv) - vec3($sx, $sy, $sz);
+#length(max($(name_uv)_q,0.0))+min(max($(name_uv)_q.x,max($(name_uv)_q.y,$(name_uv)_q.z)),0.0)-$r
+
+static func sdf3d_box(p : Vector3, sx : float, sy : float, sz : float, r : float) -> Vector2:
+ var v : Vector3 = Commons.absv3((p)) - Vector3(sx, sy, sz);
+ var f : float = (Commons.maxv3(v,Vector3())).length() + min(max(v.x,max(v.y, v.z)),0.0) - r;
+
+ return Vector2(f, 0.0);
+
+#Y: $axis = length($uv.xz),$uv.y
+#vec2 $(name_uv)_d = abs(vec2($axis)) - vec2($r,$l);
+
+static func sdf3d_cylinder_y(p : Vector3, r : float, l : float) -> Vector2:
+ var v : Vector2 = Commons.absv2(Vector2(Vector2(p.x, p.z).length(),(p).y)) - Vector2(r,l);
+ var f : float = min(max(v.x, v.y),0.0) + Commons.maxv2(v, Vector2()).length();
+
+ return Vector2(f, 0.0);
+
+#X: $axis = length($uv.yz),$uv.x
+#vec2 $(name_uv)_d = abs(vec2($axis)) - vec2($r,$l);
+
+static func sdf3d_cylinder_x(p : Vector3, r : float, l : float) -> Vector2:
+ var v : Vector2 = Commons.absv2(Vector2(Vector2(p.y, p.z).length(),(p).x)) - Vector2(r, l);
+ var f : float = min(max(v.x, v.y),0.0) + Commons.maxv2(v, Vector2()).length();
+
+ return Vector2(f, 0.0);
+
+#Z: $axis = length($uv.xy),$uv.z
+#vec2 $(name_uv)_d = abs(vec2($axis)) - vec2($r,$l);
+
+static func sdf3d_cylinder_z(p : Vector3, r : float, l : float) -> Vector2:
+ var v : Vector2 = Commons.absv2(Vector2(Vector2(p.x, p.y).length(),(p).z)) - Vector2(r, l);
+ var f : float = min(max(v.x, v.y),0.0) + Commons.maxv2(v, Vector2()).length();
+
+ return Vector2(f, 0.0);
+
+#vec3 $(name_uv)_p = $uv;
+#$(name_uv)_p.$axis -= clamp($(name_uv)_p.$axis, -$l, $l);
+#return length($(name_uv)_p)-$r*$profile(clamp(0.5+0.5*($uv).$axis/$l, 0.0, 1.0))
+
+static func sdf3d_capsule_y(p : Vector3, r : float, l : float) -> Vector2:
+ var v : Vector3 = p;
+ v.y -= clamp(v.y, -l, l);
+ var f : float = v.length() - r;
+
+ return Vector2(f, 0.0);
+
+static func sdf3d_capsule_x(p : Vector3, r : float, l : float) -> Vector2:
+ var v : Vector3 = p;
+ v.x -= clamp(v.x, -l, l);
+ var f : float = v.length() - r;
+
+ return Vector2(f, 0.0);
+
+static func sdf3d_capsule_z(p : Vector3, r : float, l : float) -> Vector2:
+ var v : Vector3 = p;
+ v.z -= clamp(v.z, -l, l);
+ var f : float = v.length() - r;
+
+ return Vector2(f, 0.0);
+
+#+X: $axis = length($uv.yz),-$uv.x
+#dot(vec2(cos($a*0.01745329251),sin($a*0.01745329251)),vec2($axis))
+
+static func sdf3d_cone_px(p : Vector3, a : float) -> Vector2:
+ var f : float = Vector2(cos(a*0.01745329251),sin(a*0.01745329251)).dot(Vector2(Vector2(p.y, p.z).length(), - (p).x));
+
+ return Vector2(f, 0.0);
+
+#-X: $axis = length($uv.yz),$uv.x
+#dot(vec2(cos($a*0.01745329251),sin($a*0.01745329251)),vec2($axis))
+
+static func sdf3d_cone_nx(p : Vector3, a : float) -> Vector2:
+ var f : float = Vector2(cos(a*0.01745329251),sin(a*0.01745329251)).dot(Vector2(Vector2(p.y, p.z).length(),(p).x));
+
+ return Vector2(f, 0.0);
+
+#+Y: $axis = length($uv.xz),$uv.y
+#dot(vec2(cos($a*0.01745329251),sin($a*0.01745329251)),vec2($axis))
+
+static func sdf3d_cone_py(p : Vector3, a : float) -> Vector2:
+ var f : float = Vector2(cos(a*0.01745329251),sin(a*0.01745329251)).dot(Vector2(Vector2(p.x, p.z).length(),(p).y));
+
+ return Vector2(f, 0.0);
+
+#-Y: $axis = length($uv.xz),-$uv.y
+#dot(vec2(cos($a*0.01745329251),sin($a*0.01745329251)),vec2($axis))
+
+static func sdf3d_cone_ny(p : Vector3, a : float) -> Vector2:
+ var f : float = Vector2(cos(a*0.01745329251),sin(a*0.01745329251)).dot(Vector2(Vector2(p.x, p.z).length(),-(p).y));
+
+ return Vector2(f, 0.0);
+
+#+Z: $axis = length($uv.xy),-$uv.z
+#dot(vec2(cos($a*0.01745329251),sin($a*0.01745329251)),vec2($axis))
+
+static func sdf3d_cone_pz(p : Vector3, a : float) -> Vector2:
+ var f : float = Vector2(cos(a*0.01745329251),sin(a*0.01745329251)).dot(Vector2(Vector2(p.x, p.y).length(),-(p).z));
+
+ return Vector2(f, 0.0);
+
+
+#-Z: $axis = length($uv.xy),$uv.z
+#dot(vec2(cos($a*0.01745329251),sin($a*0.01745329251)),vec2($axis))
+
+static func sdf3d_cone_nz(p : Vector3, a : float) -> Vector2:
+ var f : float = Vector2(cos(a*0.01745329251),sin(a*0.01745329251)).dot(Vector2(Vector2(p.x, p.y).length(),(p).z));
+
+ return Vector2(f, 0.0);
+
+static func sdf3d_torus_x(p : Vector3, R : float, r : float) -> Vector2:
+ var q : Vector2 = Vector2(Vector2(p.y, p.z).length() - R,(p).x);
+ var f : float = q.length() - r;
+
+ return Vector2(f, 0.0);
+
+static func sdf3d_torus_y(p : Vector3, R : float, r : float) -> Vector2:
+ var q : Vector2 = Vector2(Vector2(p.z, p.x).length() - R,(p).y);
+ var f : float = q.length() - r;
+
+ return Vector2(f, 0.0);
+
+static func sdf3d_torus_z(p : Vector3, R : float, r : float) -> Vector2:
+ var q : Vector2 = Vector2(Vector2(p.x, p.y).length() - R,(p).z);
+ var f : float = q.length() - r;
+
+ return Vector2(f, 0.0);
+
+
+#vec2 raymarch_$name(vec2 uv) {
+# vec3 ro = vec3(uv-vec2(0.5), 1.0);
+# vec3 rd = vec3(0.0, 0.0, -1.0);
+# float dO = 0.0;
+# float c = 0.0;
+#
+# for (int i=0; i < 100; i++) {
+# vec3 p = ro + rd*dO;
+# vec2 dS = $sdf(p);
+# dO += dS.x;
+#
+# if (dO >= 1.0) {
+# break;
+# } else if (dS.x < 0.0001) {
+# c = dS.y;
+# break;
+# }
+# }
+#
+# return vec2(dO, c);
+#}
+
+static func sdf3d_raymarch(uv : Vector2) -> Vector2:
+ var ro : Vector3 = Vector3(uv.x - 0.5, uv.y - 0.5, 1.0);
+ var rd : Vector3 = Vector3(0.0, 0.0, -1.0);
+ var dO : float = 0.0;
+ var c : float = 0.0;
+
+ for i in range(100):
+ var p : Vector3 = ro + rd * dO;
+ var dS : Vector2 = sdf3d_input(p);
+
+ dO += dS.x;
+
+ if (dO >= 1.0):
+ break;
+ elif (dS.x < 0.0001):
+ c = dS.y;
+ break;
+
+ return Vector2(dO, c);
+
+#vec3 normal_$name(vec3 p) {
+# if (p.z <= 0.0) {
+# return vec3(0.0, 0.0, 1.0);
+# }
+#
+# float d = $sdf(p).x;
+# float e = .001;
+# vec3 n = d - vec3(
+# $sdf(p-vec3(e, 0.0, 0.0)).x,
+# $sdf(p-vec3(0.0, e, 0.0)).x,
+# $sdf(p-vec3(0.0, 0.0, e)).x);
+#
+# return vec3(-1.0, -1.0, -1.0)*normalize(n);
+#}
+
+static func sdf3d_normal(p : Vector3) -> Vector3:
+ if (p.z <= 0.0):
+ return Vector3(0.0, 0.0, 1.0);
+
+ var d : float = sdf3d_input(p).x;
+ var e : float = .001;
+
+ var n : Vector3 = Vector3(
+ d - sdf3d_input(p - Vector3(e, 0.0, 0.0)).x,
+ d - sdf3d_input(p - Vector3(0.0, e, 0.0)).x,
+ d - sdf3d_input(p - Vector3(0.0, 0.0, e)).x);
+
+ return Vector3(-1.0, -1.0, -1.0) * n.normalized();
+
+#vec2 sdf3dc_union(vec2 a, vec2 b) {
+# return vec2(min(a.x, b.x), mix(b.y, a.y, step(a.x, b.x)));
+#}
+
+static func sdf3dc_union(a : Vector2, b : Vector2) -> Vector2:
+ return Vector2(min(a.x, b.x), lerp(b.y, a.y, Commons.step(a.x, b.x)));
+
+#vec2 sdf3dc_sub(vec2 a, vec2 b) {
+# return vec2(max(-a.x, b.x), a.y);
+#}
+
+static func sdf3dc_sub(a : Vector2, b : Vector2) -> Vector2:
+ return Vector2(max(-a.x, b.x), a.y);
+
+#vec2 sdf3dc_inter(vec2 a, vec2 b) {
+# return vec2(max(a.x, b.x), mix(a.y, b.y, step(a.x, b.x)));
+#}
+
+static func sdf3dc_inter(a : Vector2, b : Vector2) -> Vector2:
+ return Vector2(max(a.x, b.x), lerp(a.y, b.y, Commons.step(a.x, b.x)));
+
+#vec2 sdf3d_smooth_union(vec2 d1, vec2 d2, float k) {
+# float h = clamp(0.5+0.5*(d2.x-d1.x)/k, 0.0, 1.0);
+# return vec2(mix(d2.x, d1.x, h)-k*h*(1.0-h), mix(d2.y, d1.y, step(d1.x, d2.x)));
+#}
+
+static func sdf3d_smooth_union(d1 : Vector2, d2 : Vector2, k : float) -> Vector2:
+ var h : float = clamp(0.5 + 0.5 * (d2.x - d1.x) / k, 0.0, 1.0);
+ return Vector2(lerp(d2.x, d1.x, h)-k*h*(1.0 - h), lerp(d2.y, d1.y, Commons.step(d1.x, d2.x)));
+
+#vec2 sdf3d_smooth_subtraction(vec2 d1, vec2 d2, float k ) {
+# float h = clamp(0.5-0.5*(d2.x+d1.x)/k, 0.0, 1.0);
+# return vec2(mix(d2.x, -d1.x, h )+k*h*(1.0-h), d2.y);
+#}
+
+static func sdf3d_smooth_subtraction(d1 : Vector2, d2 : Vector2, k : float) -> Vector2:
+ var h : float = clamp(0.5 - 0.5 * (d2.x + d1.x) / k, 0.0, 1.0);
+ return Vector2(lerp(d2.x, -d1.x, h )+k*h*(1.0-h), d2.y);
+
+#vec2 sdf3d_smooth_intersection(vec2 d1, vec2 d2, float k ) {
+# float h = clamp(0.5-0.5*(d2.x-d1.x)/k, 0.0, 1.0);
+# return vec2(mix(d2.x, d1.x, h)+k*h*(1.0-h), mix(d1.y, d2.y, step(d1.x, d2.x)));
+#}
+
+static func sdf3d_smooth_intersection(d1 : Vector2, d2 : Vector2, k : float) -> Vector2:
+ var h : float = clamp(0.5 - 0.5 * (d2.x - d1.x) / k, 0.0, 1.0);
+ return Vector2(lerp(d2.x, d1.x, h)+k*h*(1.0-h), lerp(d1.y, d2.y, Commons.step(d1.x, d2.x)));
+
+static func sdf3d_rounded(v : Vector2, r : float) -> Vector2:
+ return Vector2(v.x - r, v.y);
+
+static func sdf3d_elongation(p : Vector3, v : Vector3) -> Vector3:
+ return ((p) - Commons.clampv3((p), - Commons.absv3(v), Commons.absv3(v)))
+
+static func sdf3d_repeat(p : Vector3, r : Vector2, randomness : float, pseed : int) -> Vector3:
+ #$in(repeat($uv, vec3(1.0/$rx, 1.0/$ry, 0.0), float($seed), $r))
+ return repeat(p, Vector3(1.0 / r.x, 1.0 / r.y, 0.00001), float(pseed), randomness)
+
+#vec3 repeat(vec3 p, vec3 r, float seed, float randomness) {
+# vec3 a = (rand3(floor(mod((p.xy+0.5*r.xy)/r.xy, 1.0/r.xy)+vec2(seed)))-0.5)*6.28*randomness;
+# p = mod(p+0.5*r,r)-0.5*r;
+#
+# vec3 rv;
+# float c;
+# float s;
+#
+# c = cos(a.x);
+# s = sin(a.x);
+#
+# rv.x = p.x;
+# rv.y = p.y*c+p.z*s;rv.z = -p.y*s+p.z*c;
+#
+# c = cos(a.y);
+# s = sin(a.y);
+#
+# p.x = rv.x*c+rv.z*s;
+# p.y = rv.y;
+# p.z = -rv.x*s+rv.z*c;
+#
+# c = cos(a.z);
+# s = sin(a.z);
+#
+# rv.x = p.x*c+p.y*s;
+# rv.y = -p.x*s+p.y*c;
+# rv.z = p.z;
+#
+# return rv;
+#}
+
+static func repeat(p : Vector3, r : Vector3, pseed : float, randomness : float) -> Vector3:
+ var a : Vector3 = (Commons.rand3(Commons.floorv2(Commons.modv2((Vector2(p.x, p.y) + Vector2(0.5, 0.5) * Vector2(r.x, r.y)) / Vector2(r.x, r.y), Vector2(1, 1) / Vector2(r.x, r.y)) + Vector2(pseed, pseed))) - Vector3(0.5, 0.5, 0.5)) * 6.28 * randomness
+ p = Commons.modv3(p + Vector3(0.5, 0.5, 0.5) * r, r) - Vector3(0.5, 0.5, 0.5) * r;
+
+ var rv : Vector3 = Vector3()
+ var c : float = 0
+ var s : float = 0
+
+ c = cos(a.x);
+ s = sin(a.x);
+
+ rv.x = p.x;
+ rv.y = p.y* c + p.z * s;
+ rv.z = -p.y * s + p.z * c;
+
+ c = cos(a.y);
+ s = sin(a.y);
+
+ p.x = rv.x*c+rv.z*s;
+ p.y = rv.y;
+ p.z = -rv.x*s+rv.z*c;
+
+ c = cos(a.z);
+ s = sin(a.z);
+
+ rv.x = p.x * c + p.y * s;
+ rv.y = -p.x * s + p.y * c;
+ rv.z = p.z;
+
+ return rv;
+
+#vec3 rotate3d(vec3 p, vec3 a) {
+# vec3 rv;
+# float c;
+# float s;
+# c = cos(a.x);
+# s = sin(a.x);
+# rv.x = p.x;
+# rv.y = p.y*c+p.z*s;
+# rv.z = -p.y*s+p.z*c;
+# c = cos(a.y);
+# s = sin(a.y);
+# p.x = rv.x*c+rv.z*s;
+# p.y = rv.y;
+# p.z = -rv.x*s+rv.z*c;
+# c = cos(a.z);
+# s = sin(a.z);
+# rv.x = p.x*c+p.y*s;
+# rv.y = -p.x*s+p.y*c;
+# rv.z = p.z;
+# return rv;
+#}
+
+static func rotate3d(p : Vector3, a : Vector3) -> Vector3:
+ var rv : Vector3 = Vector3()
+ var c : float = 0
+ var s : float = 0
+ c = cos(a.x)
+ s = sin(a.x)
+ rv.x = p.x
+ rv.y = p.y * c + p.z * s
+ rv.z = -p.y * s + p.z * c
+ c = cos(a.y)
+ s = sin(a.y)
+ p.x = rv.x * c + rv.z * s
+ p.y = rv.y
+ p.z = -rv.x * s + rv.z * c
+ c = cos(a.z)
+ s = sin(a.z)
+ rv.x = p.x * c + p.y * s
+ rv.y = -p.x * s + p.y * c
+ rv.z = p.z
+
+ return rv
+
+#vec3 circle_repeat_transform(vec3 p, float count) {
+# float r = 6.28/count;
+# float pa = atan(p.x, p.y);
+# float a = mod(pa+0.5*r, r)-0.5*r;
+# vec3 rv;
+# float c = cos(a-pa);
+# float s = sin(a-pa);
+# rv.x = p.x*c+p.y*s;
+# rv.y = -p.x*s+p.y*c;
+# rv.z = p.z;
+# return rv;
+#}
+
+static func circle_repeat_transform(p : Vector3, count : float) -> Vector3:
+ var r : float = 6.28 / count
+ var pa : float = atan2(p.x, p.y)
+ var a : float = Commons.modf(pa + 0.5 * r, r) - 0.5 * r
+ var rv : Vector3 = Vector3()
+ var c : float = cos(a-pa)
+ var s : float = sin(a-pa)
+ rv.x = p.x * c + p.y * s
+ rv.y = -p.x * s + p.y * c
+ rv.z = p.z
+ return rv
+
+#todo this needs to be solved
+static func sdf3d_input(p : Vector3) -> Vector2:
+ return sdf3d_sphere(p, 0.5)
+
+#raymarching_preview.mmg
+#vec3 render_$name(vec2 uv) {
+# vec3 p = vec3(uv, 2.0-raymarch_$name(vec3(uv, 2.0), vec3(0.0, 0.0, -1.0)));
+# vec3 n = normal_$name(p);
+# vec3 l = vec3(5.0, 5.0, 10.0);
+# vec3 ld = normalize(l-p);
+#
+# float o = step(p.z, 0.001);
+# float shadow = 1.0-0.75*step(raymarch_$name(l, -ld), length(l-p)-0.01);
+# float light = 0.3+0.7*dot(n, ld)*shadow;
+#
+# return vec3(0.8+0.2*o, 0.8+0.2*o, 1.0)*light;
+#}
+
+#static func sdf3d_render(p : Vector2) -> Vector3:
+# return Vector3()
diff --git a/modules/material_maker/mat_maker_gd/nodes/common/shapes.gd b/modules/material_maker/mat_maker_gd/nodes/common/shapes.gd
new file mode 100644
index 000000000..3a3501e1e
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/common/shapes.gd
@@ -0,0 +1,292 @@
+tool
+extends Reference
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+
+#----------------------
+#sphere.mmg
+
+#Outputs:
+
+#Output - (float) - A heightmap of the specified sphere
+#sphere($uv, vec2($cx, $cy), $r)
+
+#Inputs:
+#center, vector2, default: 0.5, min: 0, max: 1, step: 0.01
+#radius, float, min: 0, max: 1, default: 0.5, step:0.01
+
+#----------------------
+#shape.mmg
+
+#Outputs:
+
+#Output - (float) - Shows a white shape on a black background
+#shape_$(shape)($(uv), $(sides), $(radius)*$radius_map($uv), $(edge)*$edge_map($uv))
+
+#Inputs:
+#shape, enum, default: 0, values: circle, ploygon, star, curved_star, rays
+#sides, int, min: 2, max: 32, default: 3, step:1
+#radius, float, min: 0, max: 1, default: 1, step:0.01 (universal input)
+#edge, float, min: 0, max: 1, default: 0.2, step:0.01 (universal input)
+
+#----------------------
+#box.mmg
+#A heightmap of the specified box
+
+# "outputs": [
+# {
+# "f": "1.0-box($uv, vec3($cx, $cy, $cz), vec3($sx, $sy, $sz), 0.01745329251*vec3($rx, $ry, $rz))",
+# "longdesc": "A heightmap of the specified box",
+# "shortdesc": "Output",
+# "type": "f"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "Center X",
+# "longdesc": "X coordinate of the center of the box",
+# "max": 1,
+# "min": 0,
+# "name": "cx",
+# "shortdesc": "Center.x",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "Center Y",
+# "longdesc": "Y coordinate of the center of the box",
+# "max": 1,
+# "min": 0,
+# "name": "cy",
+# "shortdesc": "Center.y",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0,
+# "label": "Center Z",
+# "longdesc": "Z coordinate of the center of the box",
+# "max": 0.5,
+# "min": -0.5,
+# "name": "cz",
+# "shortdesc": "Center.z",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "Size X",
+# "longdesc": "Size along X axis",
+# "max": 1,
+# "min": 0,
+# "name": "sx",
+# "shortdesc": "Size.x",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "Size Y",
+# "longdesc": "Size along Y axis",
+# "max": 1,
+# "min": 0,
+# "name": "sy",
+# "shortdesc": "Size.y",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "Size Z",
+# "longdesc": "Size along Z axis",
+# "max": 1,
+# "min": 0,
+# "name": "sz",
+# "shortdesc": "Size.z",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0,
+# "label": "Rot X",
+# "longdesc": "Rotation angle around X axis",
+# "max": 180,
+# "min": -180,
+# "name": "rx",
+# "shortdesc": "Rot.x",
+# "step": 0.1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0,
+# "label": "Rot Y",
+# "longdesc": "Rotation angle around Y axis",
+# "max": 180,
+# "min": -180,
+# "name": "ry",
+# "shortdesc": "Rot.y",
+# "step": 0.1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0,
+# "label": "Rot Z",
+# "longdesc": "Rotation angle around Y axis",
+# "max": 180,
+# "min": -180,
+# "name": "rz",
+# "shortdesc": "Rot.z",
+# "step": 0.1,
+# "type": "float"
+# }
+# ]
+
+#float sphere(vec2 uv, vec2 c, float r) {
+# uv -= c;
+# uv /= r;
+# return 2.0*r*sqrt(max(0.0, 1.0-dot(uv, uv)));
+#}
+
+static func sphere(uv : Vector2, c : Vector2, r : float) -> float:
+ return 0.0
+
+#float shape_circle(vec2 uv, float sides, float size, float edge) {
+# uv = 2.0*uv-1.0;
+# edge = max(edge, 1.0e-8);
+# float distance = length(uv);
+# return clamp((1.0-distance/size)/edge, 0.0, 1.0);
+#}
+
+static func shape_circle(uv : Vector2, sides : float, size : float, edge : float) -> float:
+ uv.x = 2.0 * uv.x - 1.0
+ uv.y = 2.0 * uv.y - 1.0
+
+ edge = max(edge, 1.0e-8)
+
+ var distance : float = uv.length()
+
+ return clamp((1.0 - distance / size) / edge, 0.0, 1.0)
+
+#float shape_polygon(vec2 uv, float sides, float size, float edge) {
+# uv = 2.0*uv-1.0;
+# edge = max(edge, 1.0e-8);
+# float angle = atan(uv.x, uv.y)+3.14159265359;
+# float slice = 6.28318530718/sides;
+# return clamp((1.0-(cos(floor(0.5+angle/slice)*slice-angle)*length(uv))/size)/edge, 0.0, 1.0);
+#}
+
+static func shape_polygon(uv : Vector2, sides : float, size : float, edge : float) -> float:
+ uv.x = 2.0 * uv.x - 1.0
+ uv.y = 2.0 * uv.y - 1.0
+
+ edge = max(edge, 1.0e-8)
+
+ #simple no branch for division by zero
+ uv.x += 0.0000001
+
+ var angle : float = atan(uv.y / uv.x) + 3.14159265359
+ var slice : float = 6.28318530718 / sides
+
+ return clamp((size - cos(floor(0.5 + angle / slice) * slice - angle) * uv.length()) / (edge * size), 0.0, 1.0)
+
+#float shape_star(vec2 uv, float sides, float size, float edge) {
+# uv = 2.0*uv-1.0;
+# edge = max(edge, 1.0e-8);
+# float angle = atan(uv.x, uv.y);
+# float slice = 6.28318530718/sides;
+# return clamp((1.0-(cos(floor(angle*sides/6.28318530718-0.5+2.0*step(fract(angle*sides/6.28318530718), 0.5))*slice-angle)*length(uv))/size)/edge, 0.0, 1.0);
+#}
+
+static func shape_star(uv : Vector2, sides : float, size : float, edge : float) -> float:
+ uv.x = 2.0 * uv.x - 1.0
+ uv.y = 2.0 * uv.y - 1.0
+
+ edge = max(edge, 1.0e-8);
+
+ #simple no branch for division by zero
+ uv.x += 0.0000001
+
+ var angle : float = atan(uv.y / uv.x)
+ var slice : float = 6.28318530718 / sides
+
+ return clamp((size - cos(floor(1.5 + angle / slice - 2.0 * Commons.step(0.5 * slice, Commons.modf(angle, slice))) * slice - angle) * uv.length()) / (edge * size), 0.0, 1.0);
+
+#float shape_curved_star(vec2 uv, float sides, float size, float edge) {
+# uv = 2.0*uv-1.0;
+# edge = max(edge, 1.0e-8);
+# float angle = 2.0*(atan(uv.x, uv.y)+3.14159265359);
+# float slice = 6.28318530718/sides;
+# return clamp((1.0-cos(floor(0.5+0.5*angle/slice)*2.0*slice-angle)*length(uv)/size)/edge, 0.0, 1.0);
+#}
+
+static func shape_curved_star(uv : Vector2, sides : float, size : float, edge : float) -> float:
+ uv.x = 2.0 * uv.x - 1.0
+ uv.y = 2.0 * uv.y - 1.0
+
+ edge = max(edge, 1.0e-8);
+
+ #simple no branch for division by zero
+ uv.x += 0.0000001
+
+ var angle : float = 2.0*(atan(uv.y / uv.x) + 3.14159265359)
+ var slice : float = 6.28318530718 / sides
+
+ return clamp((size - cos(floor(0.5 + 0.5 * angle / slice) * 2.0 * slice - angle) * uv.length())/(edge * size), 0.0, 1.0);
+
+#float shape_rays(vec2 uv, float sides, float size, float edge) {
+# uv = 2.0*uv-1.0;
+# edge = 0.5*max(edge, 1.0e-8)*size;
+# float slice = 6.28318530718/sides;
+# float angle = mod(atan(uv.x, uv.y)+3.14159265359, slice)/slice;
+# return clamp(min((size-angle)/edge, angle/edge), 0.0, 1.0);
+#}
+
+static func shape_rays(uv : Vector2, sides : float, size : float, edge : float) -> float:
+
+ uv.x = 2.0 * uv.x - 1.0
+ uv.y = 2.0 * uv.y - 1.0
+
+ edge = 0.5 * max(edge, 1.0e-8) * size
+
+ #simple no branch for division by zero
+ uv.x += 0.0000001
+
+ var slice : float = 6.28318530718 / sides
+ var angle : float = Commons.modf(atan(uv.y / uv.x) + 3.14159265359, slice) / slice
+
+ return clamp(min((size - angle) / edge, angle / edge), 0.0, 1.0);
+
+#float box(vec2 uv, vec3 center, vec3 rad, vec3 rot) {\n\t
+# vec3 ro = vec3(uv, 1.0)-center;\n\t
+# vec3 rd = vec3(0.0000001, 0.0000001, -1.0);\n\t
+# mat3 r = mat3(vec3(1, 0, 0), vec3(0, cos(rot.x), -sin(rot.x)), vec3(0, sin(rot.x), cos(rot.x)));\n\t
+#
+# r *= mat3(vec3(cos(rot.y), 0, -sin(rot.y)), vec3(0, 1, 0), vec3(sin(rot.y), 0, cos(rot.y)));\n\t
+# r *= mat3(vec3(cos(rot.z), -sin(rot.z), 0), vec3(sin(rot.z), cos(rot.z), 0), vec3(0, 0, 1));\n\t
+# ro = r * ro;\n\t
+# rd = r * rd;\n
+# vec3 m = 1.0/rd;\n
+# vec3 n = m*ro;\n
+# vec3 k = abs(m)*rad;\n
+# vec3 t1 = -n - k;\n
+# vec3 t2 = -n + k;\n\n
+#
+# float tN = max(max(t1.x, t1.y), t1.z);\n
+# float tF = min(min(t2.x, t2.y), t2.z);\n
+#
+# if(tN>tF || tF<0.0) return 1.0;\n
+#
+# return tN;\n
+#}
+
diff --git a/modules/material_maker/mat_maker_gd/nodes/common/simple.gd b/modules/material_maker/mat_maker_gd/nodes/common/simple.gd
new file mode 100644
index 000000000..50bfa0cef
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/common/simple.gd
@@ -0,0 +1,147 @@
+tool
+extends Reference
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+
+#----------------------
+#profile.mmg
+
+# "inputs": [
+# {
+# "default": "dot($gradient($uv.x).xyz, vec3(1.0/3.0))",
+# "label": "2:",
+# "name": "in",
+# "type": "f"
+# }
+# ],
+# "outputs": [
+# {
+# "f": "draw_profile_$style($uv, $in($uv), (dot($gradient($uv.x+0.001).xyz, vec3(1.0/3.0))-dot($gradient($uv.x-0.001).xyz, vec3(1.0/3.0)))/0.002, max(0.0001, $width))",
+# "longdesc": "An image showing the profile defined by the gradient",
+# "shortdesc": "Output",
+# "type": "f"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 0,
+# "label": "",
+# "longdesc": "Style of the output image (fill or curve)",
+# "name": "style",
+# "shortdesc": "Style",
+# "type": "enum",
+# "values": [
+# {
+# "name": "Curve",
+# "value": "curve"
+# },
+# {
+# "name": "Fill",
+# "value": "fill"
+# }
+# ]
+# },
+# {
+# "default": {
+# "interpolation": 1,
+# "points": [
+# {
+# "a": 1,
+# "b": 0,
+# "g": 0,
+# "pos": 0,
+# "r": 0
+# },
+# {
+# "a": 1,
+# "b": 1,
+# "g": 1,
+# "pos": 1,
+# "r": 1
+# }
+# ],
+# "type": "Gradient"
+# },
+# "label": "",
+# "longdesc": "Gradient that defines the profile to be shown",
+# "name": "gradient",
+# "shortdesc": "Gradient",
+# "type": "gradient"
+# },
+# {
+# "control": "None",
+# "default": 0.05,
+# "label": "",
+# "longdesc": "Width of the curve",
+# "max": 1,
+# "min": 0,
+# "name": "width",
+# "shortdesc": "Width",
+# "step": 0.01,
+# "type": "float"
+# }
+# ]
+
+#----------------------
+#uniform.mmg
+#Draws a uniform image
+
+# "outputs": [
+# {
+# "longdesc": "A uniform image of the selected color",
+# "rgba": "$(color)",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "default": {
+# "a": 1,
+# "b": 1,
+# "g": 1,
+# "r": 1
+# },
+# "label": "",
+# "longdesc": "Color of the uniform image",
+# "name": "color",
+# "shortdesc": "Color",
+# "type": "color"
+# }
+# ]
+
+#----------------------
+#uniform_greyscale.mmg
+#Draws a uniform greyscale image
+
+# "outputs": [
+# {
+# "f": "$(color)",
+# "longdesc": "A uniform image of the selected value",
+# "shortdesc": "Output",
+# "type": "f"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "",
+# "longdesc": "The value of the uniform greyscale image",
+# "max": 1,
+# "min": 0,
+# "name": "color",
+# "shortdesc": "Value",
+# "step": 0.01,
+# "type": "float"
+# }
+# ]
+
+#float draw_profile_fill(vec2 uv, float y, float dy, float w) {\n\t
+# return 1.0-clamp(sin(1.57079632679-atan(dy))*(1.0-uv.y-y)/w, 0.0, 1.0);\n
+#}
+
+#float draw_profile_curve(vec2 uv, float y, float dy, float w) {\n\t
+# return 1.0-clamp(sin(1.57079632679-atan(dy))*abs(1.0-uv.y-y)/w, 0.0, 1.0);\n
+#}
+
diff --git a/modules/material_maker/mat_maker_gd/nodes/common/tex3d.gd b/modules/material_maker/mat_maker_gd/nodes/common/tex3d.gd
new file mode 100644
index 000000000..1ef03b6f4
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/common/tex3d.gd
@@ -0,0 +1,979 @@
+tool
+extends Reference
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+
+#----------------------
+#tex3d_apply.mmg
+#Applies 3D textures to a rendered 3D signed distance function scene.
+
+# "inputs": [
+# {
+# "default": "0.0",
+# "label": "Height",
+# "longdesc": "The height map generated by the Render node",
+# "name": "z",
+# "shortdesc": "HeightMap",
+# "type": "f"
+# },
+# {
+# "default": "0.0",
+# "label": "Color",
+# "longdesc": "The color map generated by the Render node",
+# "name": "c",
+# "shortdesc": "ColorMap",
+# "type": "f"
+# },
+# {
+# "default": "vec3(1.0)",
+# "label": "Texture",
+# "longdesc": "The 3D texture",
+# "name": "t",
+# "shortdesc": "Tex3D",
+# "type": "tex3d"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "The textured 3D scene",
+# "rgb": "$t(vec4($uv, $z($uv), $c($uv)))",
+# "shortdesc": "Output",
+# "type": "rgb"
+# }
+# ],
+
+#----------------------
+#tex3d_apply_invuvmap.mmg
+#This node applies a 3D texture to an object using its inverse UV map.
+
+# "inputs": [
+# {
+# "default": "vec3(1.0)",
+# "label": "Texture",
+# "longdesc": "The input 3D texture",
+# "name": "t",
+# "shortdesc": "Texture",
+# "type": "tex3d"
+# },
+# {
+# "default": "vec3(0.0)",
+# "label": "Inv. UV Map",
+# "longdesc": "The inverse UV map of the object",
+# "name": "map",
+# "shortdesc": "InvUVMap",
+# "type": "rgb"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "The generated texture",
+# "rgb": "$t(vec4($map($uv), 0.0))",
+# "shortdesc": "Output",
+# "type": "rgb"
+# }
+# ],
+
+#----------------------
+#tex3d_blend.mmg
+#Blends its 3D texture inputs, using an optional mask
+
+# "inputs": [
+# {
+# "default": "vec3($uv.x, 1.0, 1.0)",
+# "label": "Source1",
+# "longdesc": "The foreground input",
+# "name": "s1",
+# "shortdesc": "Foreground",
+# "type": "tex3d"
+# },
+# {
+# "default": "vec3(1.0, $uv.y, 1.0)",
+# "label": "Source2",
+# "longdesc": "The background input",
+# "name": "s2",
+# "shortdesc": "Background",
+# "type": "tex3d"
+# },
+# {
+# "default": "vec3(1.0)",
+# "label": "Opacity",
+# "longdesc": "The optional opacity mask",
+# "name": "a",
+# "shortdesc": "Mask",
+# "type": "tex3d"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "The 3D texture generated by the blend operation",
+# "shortdesc": "Output",
+# "tex3d": "blend3d_$blend_type($s1($uv).rgb, $s2($uv).rgb, $amount*dot($a($uv), vec3(1.0))/3.0)",
+# "type": "tex3d"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 0,
+# "label": "",
+# "longdesc": "The algorithm used to blend the inputs",
+# "name": "blend_type",
+# "shortdesc": "Blend mode",
+# "type": "enum",
+# "values": [
+# {
+# "name": "Normal",
+# "value": "normal"
+# },
+# {
+# "name": "Multiply",
+# "value": "multiply"
+# },
+# {
+# "name": "Screen",
+# "value": "screen"
+# },
+# {
+# "name": "Overlay",
+# "value": "overlay"
+# },
+# {
+# "name": "Hard Light",
+# "value": "hard_light"
+# },
+# {
+# "name": "Soft Light",
+# "value": "soft_light"
+# },
+# {
+# "name": "Burn",
+# "value": "burn"
+# },
+# {
+# "name": "Dodge",
+# "value": "dodge"
+# },
+# {
+# "name": "Lighten",
+# "value": "lighten"
+# },
+# {
+# "name": "Darken",
+# "value": "darken"
+# },
+# {
+# "name": "Difference",
+# "value": "difference"
+# }
+# ]
+# },
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "3:",
+# "longdesc": "The opacity of the blend operation",
+# "max": 1,
+# "min": 0,
+# "name": "amount",
+# "shortdesc": "Opacity",
+# "step": 0,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#tex3d_colorize.mmg
+#Remaps a greyscale 3D texture to a custom gradient
+
+# "inputs": [
+# {
+# "default": "vec3($uv.x+0.5)",
+# "label": "",
+# "longdesc": "The input greyscale 3D texture",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "tex3d"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "The remapped color 3D texture ",
+# "shortdesc": "Output",
+# "tex3d": "$g(dot($in($uv), vec3(1.0))/3.0).rgb",
+# "type": "tex3d"
+# }
+# ],
+# "parameters": [
+# {
+# "default": {
+# "interpolation": 1,
+# "points": [
+# {
+# "a": 1,
+# "b": 0,
+# "g": 0,
+# "pos": 0,
+# "r": 0
+# },
+# {
+# "a": 1,
+# "b": 1,
+# "g": 1,
+# "pos": 1,
+# "r": 1
+# }
+# ],
+# "type": "Gradient"
+# },
+# "label": "",
+# "longdesc": "The gradient to which the input is remapped",
+# "name": "g",
+# "shortdesc": "Gradient",
+# "type": "gradient"
+# }
+# ],
+
+#----------------------
+#tex3d_distort.mmg
+#Distorts its input 3D texture using another 3D texture
+
+# "inputs": [
+# {
+# "default": "vec3(1.0)",
+# "label": "",
+# "longdesc": "The 3D texture to be distorted",
+# "name": "in1",
+# "shortdesc": "Input1",
+# "type": "tex3d"
+# },
+# {
+# "default": "vec3(0.0)",
+# "label": "",
+# "longdesc": "The 3D texture used to distort Input1",
+# "name": "in2",
+# "shortdesc": "Input2",
+# "type": "tex3d"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "The distorted 3D texture",
+# "shortdesc": "Output",
+# "tex3d": "$in1(vec4($uv.xyz+($in2($uv)*$Distort*0.5-0.5), 0.0))",
+# "type": "tex3d"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "Distort",
+# "longdesc": "The strength of the distort effect",
+# "max": 1,
+# "min": 0,
+# "name": "Distort",
+# "shortdesc": "Strength",
+# "step": 0.01,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#tex3d_fbm.mmg
+#Generates a 3D noise made of several octaves of a simple noise
+
+# "instance": "float $(name)_fbm(vec3 coord, vec3 size, int octaves, float persistence, float seed) {\n\tfloat normalize_factor = 0.0;\n\tfloat value = 0.0;\n\tfloat scale = 1.0;\n\tfor (int i = 0; i < octaves; i++) {\n\t\tvalue += tex3d_fbm_$noise(coord*size, size, seed) * scale;\n\t\tnormalize_factor += scale;\n\t\tsize *= 2.0;\n\t\tscale *= persistence;\n\t}\n\treturn value / normalize_factor;\n}\n",
+# "outputs": [
+# {
+# "longdesc": "Shows a greyscale 3D texture of the generated noise",
+# "shortdesc": "Output",
+# "tex3d": "vec3($(name)_fbm($(uv).xyz, vec3($(scale_x), $(scale_y), $(scale_z)), int($(iterations)), $(persistence), float($(seed))))",
+# "type": "tex3d"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 2,
+# "label": "Noise",
+# "longdesc": "The simple noise type",
+# "name": "noise",
+# "shortdesc": "Noise type",
+# "type": "enum",
+# "values": [
+# {
+# "name": "Value",
+# "value": "value"
+# },
+# {
+# "name": "Perlin",
+# "value": "perlin"
+# },
+# {
+# "name": "Cellular",
+# "value": "cellular"
+# }
+# ]
+# },
+# {
+# "control": "None",
+# "default": 4,
+# "label": "Scale X",
+# "longdesc": "The scale of the first octave along the X axis",
+# "max": 32,
+# "min": 1,
+# "name": "scale_x",
+# "shortdesc": "Scale.x",
+# "step": 1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 4,
+# "label": "Scale Y",
+# "longdesc": "The scale of the first octave along the Y axis",
+# "max": 32,
+# "min": 1,
+# "name": "scale_y",
+# "shortdesc": "Scale.y",
+# "step": 1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 4,
+# "label": "Scale Z",
+# "longdesc": "The scale of the first octave along the Z axis",
+# "max": 32,
+# "min": 1,
+# "name": "scale_z",
+# "shortdesc": "Scale.z",
+# "step": 1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 3,
+# "label": "Iterations",
+# "longdesc": "The number of noise octaves",
+# "max": 10,
+# "min": 1,
+# "name": "iterations",
+# "shortdesc": "Octaves",
+# "step": 1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "Persistence",
+# "longdesc": "The persistence between two consecutive octaves",
+# "max": 1,
+# "min": 0,
+# "name": "persistence",
+# "shortdesc": "Persistence",
+# "step": 0.05,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#tex3d_from2d.mmg
+#Creates a 3D texture from a 2D texture
+
+# "inputs": [
+# {
+# "default": "vec3(0.5)",
+# "label": "",
+# "longdesc": "The input 2D texture",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "rgb"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "The generated 3D texture",
+# "shortdesc": "Output",
+# "tex3d": "$in($uv.xy+vec2(0.5))",
+# "type": "tex3d"
+# }
+# ],
+
+#----------------------
+#tex3d_pattern.mmg
+#A greyscale 3D texture that combines patterns along all 3 axes
+
+# "instance": "float $(name)_fct(vec3 uv) {\n\treturn mix3d_$(mix)(wave3d_$(x_wave)($(x_scale)*uv.x), wave3d_$(y_wave)($(y_scale)*uv.y), wave3d_$(z_wave)($(z_scale)*uv.z));\n}",
+# "outputs": [
+# {
+# "longdesc": "The generated 3D texture",
+# "shortdesc": "Output",
+# "tex3d": "vec3($(name)_fct($(uv).xyz))",
+# "type": "tex3d"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 0,
+# "label": "Combiner",
+# "longdesc": "The operation used to combine the X, Y and Z patterns",
+# "name": "mix",
+# "shortdesc": "Combine",
+# "type": "enum",
+# "values": [
+# {
+# "name": "Multiply",
+# "value": "mul"
+# },
+# {
+# "name": "Add",
+# "value": "add"
+# },
+# {
+# "name": "Max",
+# "value": "max"
+# },
+# {
+# "name": "Min",
+# "value": "min"
+# },
+# {
+# "name": "Xor",
+# "value": "xor"
+# },
+# {
+# "name": "Pow",
+# "value": "pow"
+# }
+# ]
+# },
+# {
+# "default": 0,
+# "label": "X",
+# "longdesc": "Pattern generated along the X axis",
+# "name": "x_wave",
+# "shortdesc": "Pattern.x",
+# "type": "enum",
+# "values": [
+# {
+# "name": "Sine",
+# "value": "sine"
+# },
+# {
+# "name": "Triangle",
+# "value": "triangle"
+# },
+# {
+# "name": "Square",
+# "value": "square"
+# },
+# {
+# "name": "Sawtooth",
+# "value": "sawtooth"
+# },
+# {
+# "name": "Constant",
+# "value": "constant"
+# },
+# {
+# "name": "Bounce",
+# "value": "bounce"
+# }
+# ]
+# },
+# {
+# "control": "None",
+# "default": 4,
+# "label": "2:",
+# "longdesc": "Repetitions of the pattern along X axis",
+# "max": 32,
+# "min": 0,
+# "name": "x_scale",
+# "shortdesc": "Repeat.x",
+# "step": 1,
+# "type": "float"
+# },
+# {
+# "default": 0,
+# "label": "Y",
+# "longdesc": "Pattern generated along the Y axis",
+# "name": "y_wave",
+# "shortdesc": "Pattern.y",
+# "type": "enum",
+# "values": [
+# {
+# "name": "Sine",
+# "value": "sine"
+# },
+# {
+# "name": "Triangle",
+# "value": "triangle"
+# },
+# {
+# "name": "Square",
+# "value": "square"
+# },
+# {
+# "name": "Sawtooth",
+# "value": "sawtooth"
+# },
+# {
+# "name": "Constant",
+# "value": "constant"
+# },
+# {
+# "name": "Bounce",
+# "value": "bounce"
+# }
+# ]
+# },
+# {
+# "control": "None",
+# "default": 4,
+# "label": "3:",
+# "longdesc": "Repetitions of the pattern along Y axis",
+# "max": 32,
+# "min": 0,
+# "name": "y_scale",
+# "shortdesc": "Repeat.y",
+# "step": 1,
+# "type": "float"
+# },
+# {
+# "default": 0,
+# "label": "Z",
+# "longdesc": "Pattern generated along the Z axis",
+# "name": "z_wave",
+# "shortdesc": "Pattern.z",
+# "type": "enum",
+# "values": [
+# {
+# "name": "Sine",
+# "value": "sine"
+# },
+# {
+# "name": "Triangle",
+# "value": "triangle"
+# },
+# {
+# "name": "Square",
+# "value": "square"
+# },
+# {
+# "name": "Sawtooth",
+# "value": "sawtooth"
+# },
+# {
+# "name": "Constant",
+# "value": "constant"
+# },
+# {
+# "name": "Bounce",
+# "value": "bounce"
+# }
+# ]
+# },
+# {
+# "control": "None",
+# "default": 4,
+# "label": "4:",
+# "longdesc": "Repetitions of the pattern along Z axis",
+# "max": 32,
+# "min": 0,
+# "name": "z_scale",
+# "shortdesc": "Repeat.z",
+# "step": 1,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#tex3d_rotate.mmg
+#Rotates a 3D texture
+
+# "inputs": [
+# {
+# "default": "vec3(1.0)",
+# "label": "",
+# "longdesc": "The input 3D texture",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "tex3d"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "The rotated 3D texture",
+# "shortdesc": "Output",
+# "tex3d": "$in(vec4(tex3d_rotate($uv.xyz, -vec3($ax, $ay, $az)*0.01745329251), $uv.w))",
+# "type": "tex3d"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 0,
+# "label": "X",
+# "longdesc": "The rotation around the X axis",
+# "max": 180,
+# "min": -180,
+# "name": "ax",
+# "shortdesc": "Rotate.x",
+# "step": 1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0,
+# "label": "Y",
+# "longdesc": "The rotation around the Y axis",
+# "max": 180,
+# "min": -180,
+# "name": "ay",
+# "shortdesc": "Rotate.y",
+# "step": 1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0,
+# "label": "Z",
+# "longdesc": "The rotation around the Z axis",
+# "max": 180,
+# "min": -180,
+# "name": "az",
+# "shortdesc": "Rotate.z",
+# "step": 1,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#tex3d_select.mmg
+#Selects a 3D texture for a given color index. This can be used to map several textures into a single 3D scene.
+
+# "code": "float $(name_uv)_d = ($uv.w-$v)/$t;",
+# "inputs": [
+# {
+# "default": "vec3(0.5)",
+# "label": "",
+# "longdesc": "The 3D texture associated to the specified color index",
+# "name": "in1",
+# "shortdesc": "Input1",
+# "type": "tex3d"
+# },
+# {
+# "default": "vec3(0.5)",
+# "label": "",
+# "longdesc": "The 3D texture(s) associated to other color indices",
+# "name": "in2",
+# "shortdesc": "Input2",
+# "type": "tex3d"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "The merged 3D texture",
+# "shortdesc": "Output",
+# "tex3d": "mix($in1($uv), $in2($uv), clamp(1.0-$(name_uv)_d*$(name_uv)_d, 0.0, 1.0))",
+# "type": "tex3d"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "Value",
+# "longdesc": "The value of the selected color index",
+# "max": 1,
+# "min": 0,
+# "name": "v",
+# "shortdesc": "Value",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0.1,
+# "label": "Tolerance",
+# "longdesc": "The tolerance used when comparing color indices",
+# "max": 1,
+# "min": 0.01,
+# "name": "t",
+# "shortdesc": "Tolerance",
+# "step": 0.001,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#tex3d_select_shape.mmg
+#Selects a 3D texture inside, and another outside a shape. This can be used to map several textures into a single 3D scene.
+
+# "inputs": [
+# {
+# "default": "vec3(0.5)",
+# "label": "",
+# "longdesc": "The 3D texture associated to the specified color index",
+# "name": "in1",
+# "shortdesc": "Input1",
+# "type": "tex3d"
+# },
+# {
+# "default": "vec3(0.5)",
+# "label": "",
+# "longdesc": "The 3D texture(s) associated to other color indices",
+# "name": "in2",
+# "shortdesc": "Input2",
+# "type": "tex3d"
+# },
+# {
+# "default": "0.0",
+# "label": "",
+# "longdesc": "The shape in which input1 is applied",
+# "name": "shape",
+# "shortdesc": "Shape",
+# "type": "sdf3d"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "The merged 3D texture",
+# "shortdesc": "Output",
+# "tex3d": "mix($in1($uv), $in2($uv), clamp($shape($uv.xyz)/max($d, 0.0001), 0.0, 1.0))",
+# "type": "tex3d"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "Smoothness",
+# "longdesc": "The width of the transition area between both textures",
+# "max": 1,
+# "min": 0,
+# "name": "d",
+# "shortdesc": "Smoothness",
+# "step": 0.01,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#tex3d_apply.mmg
+
+#----------------------
+#tex3d_apply.mmg
+
+#----------------------
+#tex3d_apply.mmg
+
+#----------------------
+#tex3d_apply.mmg
+
+#vec3 blend3d_normal(vec3 c1, vec3 c2, float opacity) {\n\t
+# return opacity*c1 + (1.0-opacity)*c2;\n
+#}
+
+#vec3 blend3d_multiply(vec3 c1, vec3 c2, float opacity) {\n\t
+# return opacity*c1*c2 + (1.0-opacity)*c2;\n
+#}
+
+#vec3 blend3d_screen(vec3 c1, vec3 c2, float opacity) {\n\t
+# return opacity*(1.0-(1.0-c1)*(1.0-c2)) + (1.0-opacity)*c2;\n
+#}
+
+#float blend3d_overlay_f(float c1, float c2) {\n\t
+# return (c1 < 0.5) ? (2.0*c1*c2) : (1.0-2.0*(1.0-c1)*(1.0-c2));\n
+#}
+
+#vec3 blend3d_overlay(vec3 c1, vec3 c2, float opacity) {\n\t
+# return opacity*vec3(blend3d_overlay_f(c1.x, c2.x), blend3d_overlay_f(c1.y, c2.y), blend3d_overlay_f(c1.z, c2.z)) + (1.0-opacity)*c2;\n
+#}
+
+#vec3 blend3d_hard_light(vec3 c1, vec3 c2, float opacity) {\n\t
+# return opacity*0.5*(c1*c2+blend3d_overlay(c1, c2, 1.0)) + (1.0-opacity)*c2;\n
+#}
+
+#float blend3d_soft_light_f(float c1, float c2) {\n\t
+# return (c2 < 0.5) ? (2.0*c1*c2+c1*c1*(1.0-2.0*c2)) : 2.0*c1*(1.0-c2)+sqrt(c1)*(2.0*c2-1.0);\n
+#}
+
+#vec3 blend3d_soft_light(vec3 c1, vec3 c2, float opacity) {\n\t
+# return opacity*vec3(blend3d_soft_light_f(c1.x, c2.x), blend3d_soft_light_f(c1.y, c2.y), blend3d_soft_light_f(c1.z, c2.z)) + (1.0-opacity)*c2;\n
+#}
+
+#float blend3d_burn_f(float c1, float c2) {\n\t
+# return (c1==0.0)?c1:max((1.0-((1.0-c2)/c1)),0.0);\n
+#}
+
+#vec3 blend3d_burn(vec3 c1, vec3 c2, float opacity) {\n\t
+# return opacity*vec3(blend3d_burn_f(c1.x, c2.x), blend3d_burn_f(c1.y, c2.y), blend3d_burn_f(c1.z, c2.z)) + (1.0-opacity)*c2;\n
+#}
+
+#float blend3d_dodge_f(float c1, float c2) {\n\t
+# return (c1==1.0)?c1:min(c2/(1.0-c1),1.0);\n
+#}
+
+#vec3 blend3d_dodge(vec3 c1, vec3 c2, float opacity) {\n\t
+# return opacity*vec3(blend3d_dodge_f(c1.x, c2.x), blend3d_dodge_f(c1.y, c2.y), blend3d_dodge_f(c1.z, c2.z)) + (1.0-opacity)*c2;\n
+#}
+
+#vec3 blend3d_lighten(vec3 c1, vec3 c2, float opacity) {\n\t
+# return opacity*max(c1, c2) + (1.0-opacity)*c2;\n
+#}
+
+#vec3 blend3d_darken(vec3 c1, vec3 c2, float opacity) {\n\t
+# return opacity*min(c1, c2) + (1.0-opacity)*c2;
+#}
+
+#vec3 blend3d_difference(vec3 c1, vec3 c2, float opacity) {\n\t
+# return opacity*clamp(c2-c1, vec3(0.0), vec3(1.0)) + (1.0-opacity)*c2;\n
+#}
+
+#float rand31(vec3 p) {\n\t
+# return fract(sin(dot(p,vec3(127.1,311.7, 74.7)))*43758.5453123);\n
+#}
+
+#vec3 rand33(vec3 p) {\n\t
+# p = vec3( dot(p,vec3(127.1,311.7, 74.7)),
+# dot(p,vec3(269.5,183.3,246.1)),\n\t\t\t
+# dot(p,vec3(113.5,271.9,124.6)));\n\n\t
+#
+# return -1.0 + 2.0*fract(sin(p)*43758.5453123);
+#}
+
+#float tex3d_fbm_value(vec3 coord, vec3 size, float seed) {\n\t
+# vec3 o = floor(coord)+rand3(vec2(seed, 1.0-seed))+size;\n\t
+# vec3 f = fract(coord);\n\t
+# float p000 = rand31(mod(o, size));\n\t
+# float p001 = rand31(mod(o + vec3(0.0, 0.0, 1.0), size));\n\t
+# float p010 = rand31(mod(o + vec3(0.0, 1.0, 0.0), size));\n\t
+# float p011 = rand31(mod(o + vec3(0.0, 1.0, 1.0), size));\n\t
+# float p100 = rand31(mod(o + vec3(1.0, 0.0, 0.0), size));\n\t
+# float p101 = rand31(mod(o + vec3(1.0, 0.0, 1.0), size));\n\t
+# float p110 = rand31(mod(o + vec3(1.0, 1.0, 0.0), size));\n\t
+# float p111 = rand31(mod(o + vec3(1.0, 1.0, 1.0), size));\n\t
+#
+# vec3 t = f * f * (3.0 - 2.0 * f);\n\t
+#
+# return mix(mix(mix(p000, p100, t.x), mix(p010, p110, t.x), t.y), mix(mix(p001, p101, t.x), mix(p011, p111, t.x), t.y), t.z);\n
+#}
+
+#float tex3d_fbm_perlin(vec3 coord, vec3 size, float seed) {\n\t
+# vec3 o = floor(coord)+rand3(vec2(seed, 1.0-seed))+size;\n\t
+# vec3 f = fract(coord);\n\t
+# vec3 v000 = normalize(rand33(mod(o, size))-vec3(0.5));\n\t
+# vec3 v001 = normalize(rand33(mod(o + vec3(0.0, 0.0, 1.0), size))-vec3(0.5));\n\t
+# vec3 v010 = normalize(rand33(mod(o + vec3(0.0, 1.0, 0.0), size))-vec3(0.5));\n\t
+# vec3 v011 = normalize(rand33(mod(o + vec3(0.0, 1.0, 1.0), size))-vec3(0.5));\n\t
+# vec3 v100 = normalize(rand33(mod(o + vec3(1.0, 0.0, 0.0), size))-vec3(0.5));\n\t
+# vec3 v101 = normalize(rand33(mod(o + vec3(1.0, 0.0, 1.0), size))-vec3(0.5));\n\t
+# vec3 v110 = normalize(rand33(mod(o + vec3(1.0, 1.0, 0.0), size))-vec3(0.5));\n\t
+# vec3 v111 = normalize(rand33(mod(o + vec3(1.0, 1.0, 1.0), size))-vec3(0.5));\n\t
+#
+# float p000 = dot(v000, f);\n\tfloat p001 = dot(v001, f - vec3(0.0, 0.0, 1.0));\n\t
+# float p010 = dot(v010, f - vec3(0.0, 1.0, 0.0));\n\t
+# float p011 = dot(v011, f - vec3(0.0, 1.0, 1.0));\n\t
+# float p100 = dot(v100, f - vec3(1.0, 0.0, 0.0));\n\t
+# float p101 = dot(v101, f - vec3(1.0, 0.0, 1.0));\n\t
+# float p110 = dot(v110, f - vec3(1.0, 1.0, 0.0));\n\t
+# float p111 = dot(v111, f - vec3(1.0, 1.0, 1.0));\n\t
+#
+# vec3 t = f * f * (3.0 - 2.0 * f);\n\t
+#
+# return 0.5 + mix(mix(mix(p000, p100, t.x), mix(p010, p110, t.x), t.y), mix(mix(p001, p101, t.x), mix(p011, p111, t.x), t.y), t.z);
+#}
+
+#float tex3d_fbm_cellular(vec3 coord, vec3 size, float seed) {\n\t
+# vec3 o = floor(coord)+rand3(vec2(seed, 1.0-seed))+size;\n\t
+# vec3 f = fract(coord);\n\tfloat min_dist = 3.0;\n\t
+#
+# for (float x = -1.0; x <= 1.0; x++) {\n\t\t
+# for (float y = -1.0; y <= 1.0; y++) {\n\t\t\t
+# for (float z = -1.0; z <= 1.0; z++) {\n\t\t\t\t
+# vec3 node = 0.4*rand33(mod(o + vec3(x, y, z), size)) + vec3(x, y, z);\n\t\t\t\t
+# float dist = sqrt((f - node).x * (f - node).x + (f - node).y * (f - node).y + (f - node).z * (f - node).z);\n\t\t\t\t
+# min_dist = min(min_dist, dist);\n\t\t\t
+# }\n\t\t
+#
+# }\n\t
+#
+# }\n\t
+#
+# return min_dist;
+#}
+
+
+#float wave3d_constant(float x) {\n\t
+# return 1.0;\n
+#}
+
+#float wave3d_sine(float x) {\n\t
+# return 0.5-0.5*cos(3.14159265359*2.0*x);\n
+#}
+
+#float wave3d_triangle(float x) {\n\t
+# x = fract(x);\n\t
+# return min(2.0*x, 2.0-2.0*x);\n
+#}
+
+#float wave3d_sawtooth(float x) {\n\t
+# return fract(x);\n
+#}
+
+#float wave3d_square(float x) {\n\t
+# return (fract(x) < 0.5) ? 0.0 : 1.0;\n
+#}
+
+#float wave3d_bounce(float x) {\n\t
+# x = 2.0*(fract(x)-0.5);\n\t
+# return sqrt(1.0-x*x);\n
+#}
+
+#float mix3d_mul(float x, float y, float z) {\n\t
+# return x*y*z;\n
+#}
+
+#float mix3d_add(float x, float y, float z) {\n\t
+# return min(x+y+z, 1.0);\n
+#}
+
+#float mix3d_max(float x, float y, float z) {\n\t
+# return max(max(x, y), z);\n
+#}
+
+#float mix3d_min(float x, float y, float z) {\n\t
+# return min(min(x, y), z);\n
+#}
+
+#float mix3d_xor(float x, float y, float z) {\n\t
+# float xy = min(x+y, 2.0-x-y);\n\t
+# return min(xy+z, 2.0-xy-z);\n
+#}
+
+#float mix3d_pow(float x, float y, float z) {\n\t
+# return pow(pow(x, y), z);\n
+#}
+
+#vec3 tex3d_rotate(vec3 p, vec3 a) {\n\t
+# vec3 rv;\n\t
+# float c;\n\t
+# float s;\n\t
+# c = cos(a.x);\n\t
+# s = sin(a.x);\n\t
+# rv.x = p.x;\n\t
+# rv.y = p.y*c+p.z*s;\n\t
+# rv.z = -p.y*s+p.z*c;\n\t
+# c = cos(a.y);\n\t
+# s = sin(a.y);\n\t
+# p.x = rv.x*c+rv.z*s;\n\t
+# p.y = rv.y;\n\t
+# p.z = -rv.x*s+rv.z*c;\n\t
+# c = cos(a.z);\n\t
+# s = sin(a.z);\n\t
+# rv.x = p.x*c+p.y*s;\n\t
+# rv.y = -p.x*s+p.y*c;\n\t
+# rv.z = p.z;\n\t
+# return rv;\n
+#}
+
diff --git a/modules/material_maker/mat_maker_gd/nodes/common/tile.gd b/modules/material_maker/mat_maker_gd/nodes/common/tile.gd
new file mode 100644
index 000000000..25fb5e19f
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/common/tile.gd
@@ -0,0 +1,707 @@
+tool
+extends Reference
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+
+#----------------------
+#tile2x2.mmg
+#Places 4 input images into a single output to create an atlas of 4 images.
+#Chaining Tile2x2 nodes can be useful to create 16 images atlases.
+#Atlases are used by remapping nodes such as CustomUV, Tiler and Splatter.
+
+# "inputs": [
+# {
+# "default": "vec4(0.0)",
+# "label": "",
+# "longdesc": "The first input",
+# "name": "in1",
+# "shortdesc": "Input1",
+# "type": "rgba"
+# },
+# {
+# "default": "vec4(0.0)",
+# "label": "",
+# "longdesc": "The second input",
+# "name": "in2",
+# "shortdesc": "Input2",
+# "type": "rgba"
+# },
+# {
+# "default": "vec4(0.0)",
+# "label": "",
+# "longdesc": "The third input",
+# "name": "in3",
+# "shortdesc": "Input3",
+# "type": "rgba"
+# },
+# {
+# "default": "vec4(0.0)",
+# "label": "",
+# "longdesc": "The fourth input",
+# "name": "in4",
+# "shortdesc": "Input4",
+# "type": "rgba"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "Shows the generated atlas",
+# "rgba": "($uv.y < 0.5) ? (($uv.x < 0.5) ? ($in1(2.0*$uv)) : ($in2(2.0*$uv-vec2(1.0, 0.0)))) : (($uv.x < 0.5) ? ($in3(2.0*$uv-vec2(0.0, 1.0))) : ($in4(2.0*$uv-vec2(1.0, 1.0))))",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+
+#----------------------
+#tile2x2_variations.mmg
+#Places 4 input images into a single output to create an atlas of 4 images.
+#Chaining Tile2x2 nodes can be useful to create 16 images atlases.
+#Atlases are used by remapping nodes such as CustomUV, Tiler and Splatter.
+
+# "inputs": [
+# {
+# "default": "vec4(0.0)",
+# "function": true,
+# "label": "",
+# "longdesc": "The first input",
+# "name": "in",
+# "shortdesc": "Input1",
+# "type": "rgba"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "Shows the generated atlas",
+# "rgba": "($uv.y < 0.5) ? (($uv.x < 0.5) ? ($in.variation(2.0*$uv, $seed)) : ($in.variation(2.0*$uv-vec2(1.0, 0.0), $seed+0.1))) : (($uv.x < 0.5) ? ($in.variation(2.0*$uv-vec2(0.0, 1.0), $seed+0.2)) : ($in.variation(2.0*$uv-vec2(1.0, 1.0), $seed+0.3)))",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+
+#----------------------
+#tiler.mmg
+#Tiles several occurences of an input image while adding randomness.
+
+#vec4 $(name_uv)_rch = tiler_$(name)($uv, vec2($tx, $ty), int($overlap), vec2(float($seed)));
+
+#instance
+#vec4 tiler_$(name)(vec2 uv, vec2 tile, int overlap, vec2 _seed) {\n\t
+# float c = 0.0;\n\t
+# vec3 rc = vec3(0.0);\n\t
+# vec3 rc1;\n\t
+# for (int dx = -overlap; dx <= overlap; ++dx) {\n\t\t
+# for (int dy = -overlap; dy <= overlap; ++dy) {\n\t\t\t
+# vec2 pos = fract((floor(uv*tile)+vec2(float(dx), float(dy))+vec2(0.5))/tile-vec2(0.5));\n\t\t\t
+# vec2 seed = rand2(pos+_seed);\n\t\t\t
+# rc1 = rand3(seed);\n\t\t\t
+# pos = fract(pos+vec2($fixed_offset/tile.x, 0.0)*floor(mod(pos.y*tile.y, 2.0))+$offset*seed/tile);\n\t\t\t
+# float mask = $mask(fract(pos+vec2(0.5)));\n\t\t\t
+#
+# if (mask > 0.01) {\n\t\t\t\t
+# vec2 pv = fract(uv - pos)-vec2(0.5);\n\t\t\t\t
+# seed = rand2(seed);\n\t\t\t\t
+# float angle = (seed.x * 2.0 - 1.0) * $rotate * 0.01745329251;\n\t\t\t\t
+# float ca = cos(angle);\n\t\t\t\t
+# float sa = sin(angle);\n\t\t\t\t
+# pv = vec2(ca*pv.x+sa*pv.y, -sa*pv.x+ca*pv.y);\n\t\t\t\t
+# pv *= (seed.y-0.5)*2.0*$scale+1.0;\n\t\t\t\t
+# pv /= vec2($scale_x, $scale_y);\n\t\t\t\t
+# pv += vec2(0.5);\n\t\t\t\t
+# seed = rand2(seed);\n\t\t\t\t
+# vec2 clamped_pv = clamp(pv, vec2(0.0), vec2(1.0));\n\t\t\t\t
+# if (pv.x != clamped_pv.x || pv.y != clamped_pv.y) {\n\t\t\t\t\t
+# continue;\n\t\t\t\t
+# }\n\t\t\t\t
+#
+# $select_inputs\n\t\t\t\t
+#
+# float c1 = $in.variation(pv, $variations ? seed.x : 0.0)*mask*(1.0-$value*seed.x);\n\t\t\t\t
+# c = max(c, c1);\n\t\t\t\t
+# rc = mix(rc, rc1, step(c, c1));\n\t\t\t
+# }\n\t\t
+# }\n\t
+# }\n\t
+#
+# return vec4(rc, c);\n
+#}
+
+#Inputs:
+
+#in, float, default: 0, - The input image or atlas of 4 or 16 input images
+#Mask, float, default: 1, - The mask applied to the pattern
+
+#Outputs:
+#Output, float, Shows the generated pattern
+#$(name_uv)_rch.a
+
+#Instance map, rgb, Shows a random color for each instance of the input image
+#$(name_uv)_rch.rgb
+
+#select_inputs enum
+#1, " "
+#4, "pv = clamp(0.5*(pv+floor(rand2(seed)*2.0)), vec2(0.0), vec2(1.0));"
+#16, "pv = clamp(0.25*(pv+floor(rand2(seed)*4.0)), vec2(0.0), vec2(1.0));"
+
+#Parameters:
+#tile, Vector2, default 4, min:1, max:64, step:1 - The number of columns of the tiles pattern
+#overlap, float, default 1, min 0, max 5, step 1 - The number of neighbour tiles an instance of the input image can overlap. Set this parameter to the lowest value that generates the expected result (where all instances are fully visible) to improve performance.
+#select_inputs (Inputs), enum, default 0, values 1, 4, 16
+#scale, Vector2, default 1, min:0, max:2, step:0.01 - "The scale of input images on the X axis
+#fixed_offset, float, default 0.5, min 0, max 1, step 0.01 - The relative offset of odd rows
+#offset (rnd_offset), float, default 0.5, min 0, max 1, step 0.01
+#rotate (rnd_rotate), float, default 0, min 0, max 180, step 0.1
+#scale (rnd_scale), float, default 0.5, min 0, max 1, step 0.01 - The random scale applied to each image instance
+#value (rnd_value), float, default 0.5, min 0, max 1, step 0.01 - The random greyscale value applied to each image instance
+#variations, bool, default false, (disabled) - Check to tile variations of the input
+
+#----------------------
+#tiler_advanced.mmg
+#Tiles several occurences of an input image while adding randomness.
+
+# "code": "vec4 $(name_uv)_rch = tiler_$(name)($uv, vec2($tx, $ty), int($overlap), float($seed));",
+# "inputs": [
+# {
+# "default": "0.0",
+# "function": true,
+# "label": "",
+# "longdesc": "The input image or atlas of 4 or 16 input images",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "f"
+# },
+# {
+# "default": "1.0",
+# "function": true,
+# "label": "",
+# "longdesc": "The mask applied to the pattern",
+# "name": "mask",
+# "shortdesc": "Mask",
+# "type": "f"
+# },
+# {
+# "default": "vec4(rand2($uv+vec2(float($seed))), rand2($uv-vec2(float($seed))))",
+# "label": "",
+# "longdesc": "An input color map used to generate the Instance map 1 output",
+# "name": "color1",
+# "shortdesc": "Color map 1",
+# "type": "rgba"
+# },
+# {
+# "default": "vec4(rand2(-$uv+vec2(float($seed))), rand2(-$uv-vec2(float($seed))))",
+# "label": "",
+# "longdesc": "An input color map used to generate the Instance map 2 output",
+# "name": "color2",
+# "shortdesc": "Color map 2",
+# "type": "rgba"
+# },
+# {
+# "default": "1.0",
+# "function": true,
+# "label": "5:",
+# "longdesc": "A map for translation along the X axis",
+# "name": "tr_x",
+# "shortdesc": "Translate map X",
+# "type": "f"
+# },
+# {
+# "default": "1.0",
+# "function": true,
+# "label": "",
+# "longdesc": "A map for translation along the Y axis",
+# "name": "tr_y",
+# "shortdesc": "Translate map Y",
+# "type": "f"
+# },
+# {
+# "default": "1.0",
+# "function": true,
+# "label": "",
+# "longdesc": "A map for rotation",
+# "name": "r",
+# "shortdesc": "Rotate map",
+# "type": "f"
+# },
+# {
+# "default": "1.0",
+# "function": true,
+# "label": "",
+# "longdesc": "A map for scale along the X axis",
+# "name": "sc_x",
+# "shortdesc": "Scale map X",
+# "type": "f"
+# },
+# {
+# "default": "1.0",
+# "function": true,
+# "label": "",
+# "longdesc": "A map for scale along the Y axis",
+# "name": "sc_y",
+# "shortdesc": "Scale map Y",
+# "type": "f"
+# }
+# ],
+# "instance": "vec4 tiler_$(name)(vec2 uv, vec2 tile, int overlap, float _seed) {\n\tfloat c = 0.0;\n\tvec2 map_uv = vec2(0.0);\n\tfor (int dx = -overlap; dx <= overlap; ++dx) {\n\t\tfor (int dy = -overlap; dy <= overlap; ++dy) {\n\t\t\tvec2 pos = fract((floor(uv*tile)+vec2(float(dx), float(dy))+vec2(0.5))/tile-vec2(0.5));\n\t\t\tfloat mask = $mask(fract(pos+vec2(0.5)));\n\t\t\tif (mask > 0.01) {\n\t\t\t\tvec2 pv = fract(uv - pos)-vec2(0.5);\n\t\t\t\tpos = fract(pos+vec2(0.5));\n\t\t\t\tpv -= vec2($translate_x*$tr_x(pos), $translate_y*$tr_y(pos))/tile;\n\t\t\t\tfloat angle = $r(pos) * $rotate * 0.01745329251;\n\t\t\t\tfloat ca = cos(angle);\n\t\t\t\tfloat sa = sin(angle);\n\t\t\t\tpv = vec2(ca*pv.x+sa*pv.y, -sa*pv.x+ca*pv.y);\n\t\t\t\tpv /= vec2($scale_x*$sc_x(pos), $scale_y*$sc_y(pos));\n\t\t\t\tpv += vec2(0.5);\n\t\t\t\tif (pv != clamp(pv, vec2(0.0), vec2(1.0))) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tvec2 seed = rand2(vec2(_seed)+pos);\n\t\t\t\t$select_inputs\n\t\t\t\tfloat c1 = $in.variation(pv, $variations ? seed.x : 0.0)*mask;\n\t\t\t\tc = max(c, c1);\n\t\t\t\tmap_uv = mix(map_uv, pos, step(c, c1));\n\t\t\t}\n\t\t}\n\t}\n\treturn vec4(map_uv, 0.0, c);\n}",
+# "outputs": [
+# {
+# "f": "$(name_uv)_rch.a",
+# "longdesc": "Shows the generated pattern",
+# "shortdesc": "Output",
+# "type": "f"
+# },
+# {
+# "longdesc": "Shows a color for each instance of the input image",
+# "rgba": "$color1($(name_uv)_rch.rg)",
+# "shortdesc": "Instance map 1",
+# "type": "rgba"
+# },
+# {
+# "longdesc": "Shows a color for each instance of the input image",
+# "rgba": "$color2($(name_uv)_rch.rg)",
+# "shortdesc": "Instance map 2",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 4,
+# "label": "Tile X",
+# "longdesc": "The number of columns of the tiles pattern",
+# "max": 64,
+# "min": 1,
+# "name": "tx",
+# "shortdesc": "Tile.x",
+# "step": 1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 4,
+# "label": "Tile Y",
+# "longdesc": "The number of rows of the tiles pattern",
+# "max": 64,
+# "min": 1,
+# "name": "ty",
+# "shortdesc": "Tile.y",
+# "step": 1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 1,
+# "label": "Overlap",
+# "longdesc": "The number of neighbour tiles an instance of the input image can overlap. Set this parameter to the lowest value that generates the expected result (where all instances are fully visible) to improve performance.",
+# "max": 5,
+# "min": 0,
+# "name": "overlap",
+# "shortdesc": "Overlap",
+# "step": 1,
+# "type": "float"
+# },
+# {
+# "default": 0,
+# "label": "Inputs",
+# "longdesc": "The input type of the node:\n- 1: single image\n- 4: atlas of 4 images\n- 16: atlas of 16 images\nAtlases can be created using the Tile2x2 node.",
+# "name": "select_inputs",
+# "shortdesc": "Input",
+# "type": "enum",
+# "values": [
+# {
+# "name": "1",
+# "value": " "
+# },
+# {
+# "name": "4",
+# "value": "pv = clamp(0.5*(pv+floor(rand2(seed)*2.0)), vec2(0.0), vec2(1.0));"
+# },
+# {
+# "name": "16",
+# "value": "pv = clamp(0.25*(pv+floor(rand2(seed)*4.0)), vec2(0.0), vec2(1.0));"
+# }
+# ]
+# },
+# {
+# "control": "None",
+# "default": 0,
+# "label": "Translate X",
+# "longdesc": "The translation along the X axis applied to the instances",
+# "max": 1,
+# "min": 0,
+# "name": "translate_x",
+# "shortdesc": "Translate.x",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0,
+# "label": "Translate Y",
+# "longdesc": "The translation along the Y axis applied to the instances",
+# "max": 1,
+# "min": 0,
+# "name": "translate_y",
+# "shortdesc": "Translate.y",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0,
+# "label": "Rotate",
+# "longdesc": "The angle of instances of the input",
+# "max": 180,
+# "min": 0,
+# "name": "rotate",
+# "shortdesc": "Rotate",
+# "step": 0.1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 1,
+# "label": "Scale X",
+# "longdesc": "The scale of input images on the X axis",
+# "max": 2,
+# "min": 0,
+# "name": "scale_x",
+# "shortdesc": "Scale.x",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 1,
+# "label": "Scale Y",
+# "longdesc": "The scale of input images on the Y axis",
+# "max": 2,
+# "min": 0,
+# "name": "scale_y",
+# "shortdesc": "Scale.y",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "default": false,
+# "label": "Variations",
+# "longdesc": "Check to tile variations of the input",
+# "name": "variations",
+# "shortdesc": "Variations",
+# "type": "boolean"
+# }
+# ],
+
+#----------------------
+#tiler_advanced_color.mmg
+#Tiles several occurences of an input image while adding randomness.
+
+# "code": "vec2 $(name_uv)_mapuv;\nvec4 $(name_uv)_rch = tiler_$(name)($uv, vec2($tx, $ty), int($overlap), float($seed), $(name_uv)_mapuv);",
+# "inputs": [
+# {
+# "default": "vec4(1.0)",
+# "function": true,
+# "label": "",
+# "longdesc": "The input image or atlas of 4 or 16 input images",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "rgba"
+# },
+# {
+# "default": "1.0",
+# "function": true,
+# "label": "",
+# "longdesc": "The mask applied to the pattern",
+# "name": "mask",
+# "shortdesc": "Mask",
+# "type": "f"
+# },
+# {
+# "default": "vec4(rand2($uv+vec2(float($seed))), rand2($uv-vec2(float($seed))))",
+# "label": "",
+# "longdesc": "An input color map used to generate the Instance map 1 output",
+# "name": "color1",
+# "shortdesc": "Color map 1",
+# "type": "rgba"
+# },
+# {
+# "default": "vec4(rand2(-$uv+vec2(float($seed))), rand2(-$uv-vec2(float($seed))))",
+# "label": "",
+# "longdesc": "An input color map used to generate the Instance map 2 output",
+# "name": "color2",
+# "shortdesc": "Color map 2",
+# "type": "rgba"
+# },
+# {
+# "default": "1.0",
+# "function": true,
+# "label": "5:",
+# "longdesc": "A map for translation along the X axis",
+# "name": "tr_x",
+# "shortdesc": "Translate map X",
+# "type": "f"
+# },
+# {
+# "default": "1.0",
+# "function": true,
+# "label": "",
+# "longdesc": "A map for translation along the Y axis",
+# "name": "tr_y",
+# "shortdesc": "Translate map Y",
+# "type": "f"
+# },
+# {
+# "default": "1.0",
+# "function": true,
+# "label": "",
+# "longdesc": "A map for rotation",
+# "name": "r",
+# "shortdesc": "Rotate map",
+# "type": "f"
+# },
+# {
+# "default": "1.0",
+# "function": true,
+# "label": "",
+# "longdesc": "A map for scale along the X axis",
+# "name": "sc_x",
+# "shortdesc": "Scale map X",
+# "type": "f"
+# },
+# {
+# "default": "1.0",
+# "function": true,
+# "label": "",
+# "longdesc": "A map for scale along the Y axis",
+# "name": "sc_y",
+# "shortdesc": "Scale map Y",
+# "type": "f"
+# }
+# ],
+# "instance": "vec4 tiler_$(name)(vec2 uv, vec2 tile, int overlap, float _seed, out vec2 outmapuv) {\n\t// $seed\n\tvec4 c = vec4(0.0);\n\toutmapuv = vec2(0.0);\n\tfor (int dx = -overlap; dx <= overlap; ++dx) {\n\t\tfor (int dy = -overlap; dy <= overlap; ++dy) {\n\t\t\tvec2 pos = fract((floor(uv*tile)+vec2(float(dx), float(dy))+vec2(0.5))/tile-vec2(0.5));\n\t\t\tfloat mask = $mask(fract(pos+vec2(0.5)));\n\t\t\tif (mask > 0.01) {\n\t\t\t\tvec2 pv = fract(uv - pos)-vec2(0.5);\n\t\t\t\tpos = fract(pos+vec2(0.5));\n\t\t\t\tpv -= vec2($translate_x*$tr_x(pos), $translate_y*$tr_y(pos))/tile;\n\t\t\t\tfloat angle = $r(pos) * $rotate * 0.01745329251;\n\t\t\t\tfloat ca = cos(angle);\n\t\t\t\tfloat sa = sin(angle);\n\t\t\t\tpv = vec2(ca*pv.x+sa*pv.y, -sa*pv.x+ca*pv.y);\n\t\t\t\tpv /= vec2($scale_x*$sc_x(pos), $scale_y*$sc_y(pos));\n\t\t\t\tpv += vec2(0.5);\n\t\t\t\tif (pv != clamp(pv, vec2(0.0), vec2(1.0))) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tvec2 seed = rand2(vec2(_seed)+pos);\n\t\t\t\t$select_inputs\n\t\t\t\tvec4 n = $in.variation(pv, $variations ? seed.x : 0.0);\n\t\t\t\tfloat na = n.a*mask;\n\t\t\t\toutmapuv = mix(outmapuv, pos, step(c.a, na));\n\t\t\t\tc = mix(c, n, na);\n\t\t\t}\n\t\t}\n\t}\n\treturn c;\n}\n",
+# "outputs": [
+# {
+# "longdesc": "Shows the generated pattern",
+# "rgba": "$(name_uv)_rch",
+# "shortdesc": "Output",
+# "type": "rgba"
+# },
+# {
+# "longdesc": "Shows a color for each instance of the input image",
+# "rgba": "$color1($(name_uv)_mapuv)",
+# "shortdesc": "Instance map 1",
+# "type": "rgba"
+# },
+# {
+# "longdesc": "Shows a color for each instance of the input image",
+# "rgba": "$color2($(name_uv)_mapuv)",
+# "shortdesc": "Instance map 2",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 4,
+# "label": "Tile X",
+# "longdesc": "The number of columns of the tiles pattern",
+# "max": 64,
+# "min": 1,
+# "name": "tx",
+# "shortdesc": "Tile.x",
+# "step": 1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 4,
+# "label": "Tile Y",
+# "longdesc": "The number of rows of the tiles pattern",
+# "max": 64,
+# "min": 1,
+# "name": "ty",
+# "shortdesc": "Tile.y",
+# "step": 1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 1,
+# "label": "Overlap",
+# "longdesc": "The number of neighbour tiles an instance of the input image can overlap. Set this parameter to the lowest value that generates the expected result (where all instances are fully visible) to improve performance.",
+# "max": 5,
+# "min": 0,
+# "name": "overlap",
+# "shortdesc": "Overlap",
+# "step": 1,
+# "type": "float"
+# },
+# {
+# "default": 0,
+# "label": "Inputs",
+# "longdesc": "The input type of the node:\n- 1: single image\n- 4: atlas of 4 images\n- 16: atlas of 16 images\nAtlases can be created using the Tile2x2 node.",
+# "name": "select_inputs",
+# "shortdesc": "Input",
+# "type": "enum",
+# "values": [
+# {
+# "name": "1",
+# "value": " "
+# },
+# {
+# "name": "4",
+# "value": "pv = clamp(0.5*(pv+floor(rand2(seed)*2.0)), vec2(0.0), vec2(1.0));"
+# },
+# {
+# "name": "16",
+# "value": "pv = clamp(0.25*(pv+floor(rand2(seed)*4.0)), vec2(0.0), vec2(1.0));"
+# }
+# ]
+# },
+# {
+# "control": "None",
+# "default": 0,
+# "label": "Translate X",
+# "longdesc": "The translation along the X axis applied to the instances",
+# "max": 1,
+# "min": 0,
+# "name": "translate_x",
+# "shortdesc": "Translate.x",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0,
+# "label": "Translate Y",
+# "longdesc": "The translation along the Y axis applied to the instances",
+# "max": 1,
+# "min": 0,
+# "name": "translate_y",
+# "shortdesc": "Translate.y",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0,
+# "label": "Rotate",
+# "longdesc": "The angle of instances of the input",
+# "max": 180,
+# "min": 0,
+# "name": "rotate",
+# "shortdesc": "Rotate",
+# "step": 0.1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 1,
+# "label": "Scale X",
+# "longdesc": "The scale of input images on the X axis",
+# "max": 2,
+# "min": 0,
+# "name": "scale_x",
+# "shortdesc": "Scale.x",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 1,
+# "label": "Scale Y",
+# "longdesc": "The scale of input images on the Y axis",
+# "max": 2,
+# "min": 0,
+# "name": "scale_y",
+# "shortdesc": "Scale.y",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "default": false,
+# "label": "Variations",
+# "longdesc": "Check to tile variations of the input",
+# "name": "variations",
+# "shortdesc": "Variations",
+# "type": "boolean"
+# }
+# ],
+
+#----------------------
+#tiler_color.mmg
+#Tiles several occurences of an input image while adding randomness.
+
+#vec3 $(name_uv)_random_color;\n
+#vec4 $(name_uv)_tiled_output = tiler_$(name)($uv, vec2($tx, $ty), int($overlap), vec2(float($seed)), $(name_uv)_random_color);
+
+#vec4 tiler_$(name)(vec2 uv, vec2 tile, int overlap, vec2 _seed, out vec3 random_color) {\n\t
+# vec4 c = vec4(0.0);\n\t
+# vec3 rc = vec3(0.0);\n\t
+# vec3 rc1;\n\t
+#
+# for (int dx = -overlap; dx <= overlap; ++dx) {\n\t\t
+# for (int dy = -overlap; dy <= overlap; ++dy) {\n\t\t\t
+# vec2 pos = fract((floor(uv*tile)+vec2(float(dx), float(dy))+vec2(0.5))/tile-vec2(0.5));\n\t\t\t
+# vec2 seed = rand2(pos+_seed);\n\t\t\t
+# rc1 = rand3(seed);\n\t\t\t
+# pos = fract(pos+vec2($fixed_offset/tile.x, 0.0)*floor(mod(pos.y*tile.y, 2.0))+$offset*seed/tile);\n\t\t\t
+# float mask = $mask(fract(pos+vec2(0.5)));\n\t\t\t
+# if (mask > 0.01) {\n\t\t\t\t
+# vec2 pv = fract(uv - pos)-vec2(0.5);\n\t\t\t\t
+# seed = rand2(seed);\n\t\t\t\t
+# float angle = (seed.x * 2.0 - 1.0) * $rotate * 0.01745329251;\n\t\t\t\t
+# float ca = cos(angle);\n\t\t\t\t
+# float sa = sin(angle);\n\t\t\t\t
+# pv = vec2(ca*pv.x+sa*pv.y, -sa*pv.x+ca*pv.y);\n\t\t\t\t
+# pv *= (seed.y-0.5)*2.0*$scale+1.0;\n\t\t\t\t
+# pv /= vec2($scale_x, $scale_y);\n\t\t\t\t
+# pv += vec2(0.5);\n\t\t\t\t
+# pv = clamp(pv, vec2(0.0), vec2(1.0));\n\t\t\t\t
+#
+# $select_inputs\n\t\t\t\t
+#
+# vec4 n = $in.variation(pv, $variations ? seed.x : 0.0);\n\t\t\t\t
+#
+# seed = rand2(seed);\n\t\t\t\t
+# float na = n.a*mask*(1.0-$opacity*seed.x);\n\t\t\t\t
+# float a = (1.0-c.a)*(1.0*na);\n\t\t\t\t
+#
+# c = mix(c, n, na);\n\t\t\t\t
+# rc = mix(rc, rc1, n.a);\n\t\t\t
+# }\n\t\t
+# }\n\t
+# }\n\t
+#
+# random_color = rc;\n\t
+# return c;\n
+#}
+
+
+#Inputs:
+
+#in, rgba, default: 0, - The input image or atlas of 4 or 16 input images
+#Mask, float, default: 1, - The mask applied to the pattern
+
+#Outputs:
+#Output, float, Shows the generated pattern
+#$(name_uv)_tiled_output
+
+#Instance map, rgb, Shows a random color for each instance of the input image
+#$(name_uv)_random_color
+
+#select_inputs enum
+#1, " "
+#4, "pv = clamp(0.5*(pv+floor(rand2(seed)*2.0)), vec2(0.0), vec2(1.0));"
+#16, "pv = clamp(0.25*(pv+floor(rand2(seed)*4.0)), vec2(0.0), vec2(1.0));"
+
+#Parameters:
+#tile, Vector2, default 4, min:1, max:64, step:1 - The number of columns of the tiles pattern
+#overlap, float, default 1, min 0, max 5, step 1 - The number of neighbour tiles an instance of the input image can overlap. Set this parameter to the lowest value that generates the expected result (where all instances are fully visible) to improve performance.
+#select_inputs (Inputs), enum, default 0, values 1, 4, 16
+#scale, Vector2, default 1, min:0, max:2, step:0.01 - "The scale of input images on the X axis
+#fixed_offset, float, default 0.5, min 0, max 1, step 0.01 - The relative offset of odd rows
+#offset (rnd_offset), float, default 0.5, min 0, max 1, step 0.01
+#rotate (rnd_rotate), float, default 0, min 0, max 180, step 0.1
+#scale (rnd_scale), float, default 0.5, min 0, max 1, step 0.01 - The random scale applied to each image instance
+#opacity (rnd_opacity), float, default 0, min 0, max 1, step 0.01 - The random greyscale value applied to each image instance
+#variations, bool, default false, (disabled) - Check to tile variations of the input
+
diff --git a/modules/material_maker/mat_maker_gd/nodes/common/transforms.gd b/modules/material_maker/mat_maker_gd/nodes/common/transforms.gd
new file mode 100644
index 000000000..0037140e3
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/common/transforms.gd
@@ -0,0 +1,1765 @@
+tool
+extends Reference
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+
+#----------------------
+#transform.mmg
+#Translates, rotates and scales its input
+
+# "inputs": [
+# {
+# "default": "vec4($uv, 0.0, 1.0)",
+# "label": "",
+# "longdesc": "The input image to be transformed",
+# "name": "i",
+# "shortdesc": "Input",
+# "type": "rgba"
+# },
+# {
+# "default": "1.0",
+# "label": "",
+# "longdesc": "An optional map for translation along the X axis",
+# "name": "tx",
+# "shortdesc": "TranslateMap.x",
+# "type": "f"
+# },
+# {
+# "default": "1.0",
+# "label": "",
+# "longdesc": "An optional map for translation along the Y axis",
+# "name": "ty",
+# "shortdesc": "TranslateMap.y",
+# "type": "f"
+# },
+# {
+# "default": "1.0",
+# "label": "",
+# "longdesc": "An optional map for rotation",
+# "name": "r",
+# "shortdesc": "RotateMap",
+# "type": "f"
+# },
+# {
+# "default": "1.0",
+# "label": "",
+# "longdesc": "An optional map for scaling along the X axis",
+# "name": "sx",
+# "shortdesc": "ScaleMap.x",
+# "type": "f"
+# },
+# {
+# "default": "1.0",
+# "label": "",
+# "longdesc": "An optional map for scaling along the Y axis",
+# "name": "sy",
+# "shortdesc": "ScaleMap.y",
+# "type": "f"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "Shows the transformed image",
+# "rgba": "$i(transform($uv, vec2($translate_x*(2.0*$tx($uv)-1.0), $translate_y*(2.0*$ty($uv)-1.0)), $rotate*0.01745329251*(2.0*$r($uv)-1.0), vec2($scale_x*(2.0*$sx($uv)-1.0), $scale_y*(2.0*$sy($uv)-1.0)), $repeat))",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "P1.x",
+# "default": 0,
+# "label": "2:Translate X:",
+# "longdesc": "The translation along the X axis",
+# "max": 1,
+# "min": -1,
+# "name": "translate_x",
+# "shortdesc": "Translate.x",
+# "step": 0.005,
+# "type": "float"
+# },
+# {
+# "control": "P1.y",
+# "default": 0,
+# "label": "Translate Y:",
+# "longdesc": "The translation along the Y axis",
+# "max": 1,
+# "min": -1,
+# "name": "translate_y",
+# "shortdesc": "Translate.y",
+# "step": 0.005,
+# "type": "float"
+# },
+# {
+# "control": "Radius1.a",
+# "default": 0,
+# "label": "Rotate:",
+# "longdesc": "The rotation angle",
+# "max": 720,
+# "min": -720,
+# "name": "rotate",
+# "shortdesc": "Rotate",
+# "step": 0.005,
+# "type": "float"
+# },
+# {
+# "control": "Scale1.x",
+# "default": 1,
+# "label": "Scale X:",
+# "longdesc": "The scaling factor along the X axis",
+# "max": 50,
+# "min": 0,
+# "name": "scale_x",
+# "shortdesc": "Scale.x",
+# "step": 0.005,
+# "type": "float"
+# },
+# {
+# "control": "Scale1.y",
+# "default": 1,
+# "label": "Scale Y:",
+# "longdesc": "The scaling factor along the Y axis",
+# "max": 50,
+# "min": 0,
+# "name": "scale_y",
+# "shortdesc": "Scale.y",
+# "step": 0.005,
+# "type": "float"
+# },
+# {
+# "default": false,
+# "label": "Repeat:",
+# "longdesc": "Repeat the input if checked, clamps otherwise",
+# "name": "repeat",
+# "shortdesc": "Repeat",
+# "type": "boolean"
+# }
+# ]
+
+#----------------------
+#transform2.mmg
+#Translates, rotates and scales its input
+
+
+# "inputs": [
+# {
+# "default": "vec4($uv, 0.0, 1.0)",
+# "label": "",
+# "longdesc": "The input image to be transformed",
+# "name": "i",
+# "shortdesc": "Input",
+# "type": "rgba"
+# },
+# {
+# "default": "1.0",
+# "label": "",
+# "longdesc": "An optional map for translation along the X axis",
+# "name": "tx",
+# "shortdesc": "TranslateMap.x",
+# "type": "f"
+# },
+# {
+# "default": "1.0",
+# "label": "",
+# "longdesc": "An optional map for translation along the Y axis",
+# "name": "ty",
+# "shortdesc": "TranslateMap.y",
+# "type": "f"
+# },
+# {
+# "default": "1.0",
+# "label": "",
+# "longdesc": "An optional map for rotation",
+# "name": "r",
+# "shortdesc": "RotateMap",
+# "type": "f"
+# },
+# {
+# "default": "1.0",
+# "label": "",
+# "longdesc": "An optional map for scaling along the X axis",
+# "name": "sx",
+# "shortdesc": "ScaleMap.x",
+# "type": "f"
+# },
+# {
+# "default": "1.0",
+# "label": "",
+# "longdesc": "An optional map for scaling along the Y axis",
+# "name": "sy",
+# "shortdesc": "ScaleMap.y",
+# "type": "f"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "Shows the transformed image",
+# "rgba": "$i($mode(transform2($uv, vec2($translate_x*(2.0*$tx($uv)-1.0), $translate_y*(2.0*$ty($uv)-1.0)), $rotate*0.01745329251*(2.0*$r($uv)-1.0), vec2($scale_x*(2.0*$sx($uv)-1.0), $scale_y*(2.0*$sy($uv)-1.0)))))",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "P1.x",
+# "default": 0,
+# "label": "2:Translate X:",
+# "longdesc": "The translation along the X axis",
+# "max": 1,
+# "min": -1,
+# "name": "translate_x",
+# "shortdesc": "Translate.x",
+# "step": 0.005,
+# "type": "float"
+# },
+# {
+# "control": "P1.y",
+# "default": 0,
+# "label": "Translate Y:",
+# "longdesc": "The translation along the Y axis",
+# "max": 1,
+# "min": -1,
+# "name": "translate_y",
+# "shortdesc": "Translate.y",
+# "step": 0.005,
+# "type": "float"
+# },
+# {
+# "control": "Radius1.a",
+# "default": 0,
+# "label": "Rotate:",
+# "longdesc": "The rotation angle",
+# "max": 720,
+# "min": -720,
+# "name": "rotate",
+# "shortdesc": "Rotate",
+# "step": 0.005,
+# "type": "float"
+# },
+# {
+# "control": "Scale1.x",
+# "default": 1,
+# "label": "Scale X:",
+# "longdesc": "The scaling factor along the X axis",
+# "max": 50,
+# "min": 0,
+# "name": "scale_x",
+# "shortdesc": "Scale.x",
+# "step": 0.005,
+# "type": "float"
+# },
+# {
+# "control": "Scale1.y",
+# "default": 1,
+# "label": "Scale Y:",
+# "longdesc": "The scaling factor along the Y axis",
+# "max": 50,
+# "min": 0,
+# "name": "scale_y",
+# "shortdesc": "Scale.y",
+# "step": 0.005,
+# "type": "float"
+# },
+# {
+# "default": 0,
+# "label": "Mode",
+# "longdesc": "Defines the behavior beyond the limits or the input image:\n- Clamp stretches the edges\n- Repeat tiles the input\n- Extend shows parts of the input that are beyond the edges",
+# "name": "mode",
+# "shortdesc": "Mode",
+# "type": "enum",
+# "values": [
+# {
+# "name": "Clamp",
+# "value": "transform2_clamp"
+# },
+# {
+# "name": "Repeat",
+# "value": "fract"
+# },
+# {
+# "name": "Extend",
+# "value": ""
+# }
+# ]
+# }
+# ]
+
+#----------------------
+#translate.mmg
+#Translates its input
+
+# "inputs": [
+# {
+# "default": "vec4($uv, 0.0, 1.0)",
+# "label": "",
+# "longdesc": "The input image",
+# "name": "i",
+# "shortdesc": "Input",
+# "type": "rgba"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "Shows the translated image",
+# "rgba": "$i($uv-vec2($translate_x, $translate_y))",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "P1.x",
+# "default": 0,
+# "label": "Translate X:",
+# "longdesc": "The translation along the X axis",
+# "max": 1,
+# "min": -1,
+# "name": "translate_x",
+# "shortdesc": "Translate.x",
+# "step": 0.005,
+# "type": "float"
+# },
+# {
+# "control": "P1.y",
+# "default": 0,
+# "label": "Translate Y:",
+# "longdesc": "The translation along the Y axis",
+# "max": 1,
+# "min": -1,
+# "name": "translate_y",
+# "shortdesc": "Translate.y",
+# "step": 0.005,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#rotate.mmg
+#Rotates its input
+
+# "inputs": [
+# {
+# "default": "vec4($uv, 0.0, 1.0)",
+# "label": "",
+# "longdesc": "The input image",
+# "name": "i",
+# "shortdesc": "Input",
+# "type": "rgba"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "Shows the rotated image",
+# "rgba": "$i(rotate($uv, vec2(0.5+$cx, 0.5+$cy), $rotate*0.01745329251))",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "P1.x",
+# "default": 0,
+# "label": "Center X:",
+# "longdesc": "The position of the rotation center",
+# "max": 1,
+# "min": -1,
+# "name": "cx",
+# "shortdesc": "Center.x",
+# "step": 0.005,
+# "type": "float"
+# },
+# {
+# "control": "P1.y",
+# "default": 0,
+# "label": "Center Y:",
+# "longdesc": "The position of the rotation center",
+# "max": 1,
+# "min": -1,
+# "name": "cy",
+# "shortdesc": "Center.y",
+# "step": 0.005,
+# "type": "float"
+# },
+# {
+# "control": "Radius1.a",
+# "default": 0,
+# "label": "Rotate:",
+# "longdesc": "The angle of the rotation",
+# "max": 720,
+# "min": -720,
+# "name": "rotate",
+# "shortdesc": "Angle",
+# "step": 0.005,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#scale.mmg
+#Scales its input
+
+# "inputs": [
+# {
+# "default": "vec4($uv, 0.0, 1.0)",
+# "label": "",
+# "longdesc": "The input image",
+# "name": "i",
+# "shortdesc": "Input",
+# "type": "rgba"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "Shows the scaled image",
+# "rgba": "$i(scale($uv, vec2(0.5+$cx, 0.5+$cy), vec2($scale_x, $scale_y)))",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "P1.x",
+# "default": 0,
+# "label": "Center X:",
+# "longdesc": "The position of the scale center",
+# "max": 1,
+# "min": -1,
+# "name": "cx",
+# "shortdesc": "Center.x",
+# "step": 0.005,
+# "type": "float"
+# },
+# {
+# "control": "P1.y",
+# "default": 0,
+# "label": "Center Y:",
+# "longdesc": "The poisition of the scale center",
+# "max": 1,
+# "min": -1,
+# "name": "cy",
+# "shortdesc": "Center.y",
+# "step": 0.005,
+# "type": "float"
+# },
+# {
+# "control": "Scale1.x",
+# "default": 1,
+# "label": "Scale X:",
+# "longdesc": "The scale amount along the X axis",
+# "max": 50,
+# "min": 0,
+# "name": "scale_x",
+# "shortdesc": "Scale.x",
+# "step": 0.005,
+# "type": "float"
+# },
+# {
+# "control": "Scale1.y",
+# "default": 1,
+# "label": "Scale Y:",
+# "longdesc": "The scale amount along the Y axis",
+# "max": 50,
+# "min": 0,
+# "name": "scale_y",
+# "shortdesc": "Scale.y",
+# "step": 0.005,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#shear.mmg
+#Performs a shear stress transform on its input
+
+# "inputs": [
+# {
+# "default": "vec4(1.0)",
+# "label": "",
+# "longdesc": "The input image",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "rgba"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "Shows the transformed image",
+# "rgba": "$in($uv+$amount*($uv.yx-vec2($center))*vec2($direction))",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 1,
+# "label": "",
+# "longdesc": "The direction of the shear transform (horizontal or vertical)",
+# "name": "direction",
+# "shortdesc": "Direction",
+# "type": "enum",
+# "values": [
+# {
+# "name": "Horizontal",
+# "value": "1.0, 0.0"
+# },
+# {
+# "name": "Vertical",
+# "value": "0.0, 1.0"
+# }
+# ]
+# },
+# {
+# "control": "None",
+# "default": 0,
+# "label": "",
+# "longdesc": "The amount of the transform",
+# "max": 1,
+# "min": -1,
+# "name": "amount",
+# "shortdesc": "Amount",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0,
+# "label": "",
+# "longdesc": "The position of the shear center",
+# "max": 1,
+# "min": 0,
+# "name": "center",
+# "shortdesc": "Center",
+# "step": 0.01,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#mirror.mmg
+#Mirrors its input while applying an offset from the center
+
+# "inputs": [
+# {
+# "default": "vec4($uv, 0, 1)",
+# "label": "",
+# "longdesc": "The input image",
+# "name": "i",
+# "shortdesc": "Input",
+# "type": "rgba"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "Shows the mirrored image",
+# "rgba": "$i(uvmirror_$direction($uv, $offset))",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 0,
+# "label": "",
+# "longdesc": "The mirror direction (horizontal or vertical)",
+# "name": "direction",
+# "shortdesc": "Direction",
+# "type": "enum",
+# "values": [
+# {
+# "name": "Horizontal",
+# "value": "h"
+# },
+# {
+# "name": "Vertical",
+# "value": "v"
+# }
+# ]
+# },
+# {
+# "control": "None",
+# "default": 0,
+# "label": "",
+# "longdesc": "The offset from the center",
+# "max": 1,
+# "min": 0,
+# "name": "offset",
+# "shortdesc": "Offset",
+# "step": 0.005,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#kaleidoscope.mmg
+#Replicated an angle of the input image several times around the center.
+
+# "inputs": [
+# {
+# "default": "vec4($uv, 0, 1)",
+# "label": "",
+# "longdesc": "The input image",
+# "name": "i",
+# "shortdesc": "Input",
+# "type": "rgba"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "Shows the transformed image",
+# "rgba": "$i(kal_rotate($uv, $count, $offset))",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 0,
+# "label": "",
+# "longdesc": "The number of replications of an angle of the input",
+# "max": 10,
+# "min": 2,
+# "name": "count",
+# "shortdesc": "Count",
+# "step": 1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0,
+# "label": "",
+# "longdesc": "The angular offset of the replicated angle of the input",
+# "max": 180,
+# "min": -180,
+# "name": "offset",
+# "shortdesc": "Offset",
+# "step": 0.1,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#warp.mmg
+#Warps its input according to a heightmap
+
+# "code": "vec2 $(name_uv)_slope = $(name)_slope($uv, $eps);\nvec2 $(name_uv)_warp = $mode;",
+# "global": "",
+# "inputs": [
+# {
+# "default": "vec4(sin($uv.x*20.0)*0.5+0.5, sin($uv.y*20.0)*0.5+0.5, 0, 1)",
+# "label": "",
+# "longdesc": "The input image to be warped",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "rgba"
+# },
+# {
+# "default": "0.0",
+# "function": true,
+# "label": "",
+# "longdesc": "The height map whose slopes are used to deform the input",
+# "name": "d",
+# "shortdesc": "Height map",
+# "type": "f"
+# }
+# ],
+# "instance": "vec2 $(name)_slope(vec2 uv, float epsilon) {\n\treturn vec2($d(fract(uv+vec2(epsilon, 0.0)))-$d(fract(uv-vec2(epsilon, 0.0))), $d(fract(uv+vec2(0.0, epsilon)))-$d(fract(uv-vec2(0.0, epsilon))));\n}",
+# "outputs": [
+# {
+# "longdesc": "Shows the warped image",
+# "rgba": "$in($uv+$amount*$(name_uv)_warp)",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 0,
+# "label": "",
+# "longdesc": "Both warp modes extract their direction from the height map slopes:\n- Slope warp intensity only depends on the slope\n- Distance to top warp intensity depends on the slope and the distance to the top, and can be used to create mosaic-like patterns\n\nA Transform node with translate maps can produce effects similar to Slope Warp and is generally faster.",
+# "name": "mode",
+# "shortdesc": "Mode",
+# "type": "enum",
+# "values": [
+# {
+# "name": "Slope",
+# "value": "$(name_uv)_slope"
+# },
+# {
+# "name": "Distance to top",
+# "value": "$(name_uv)_slope*(1.0-$d($uv))"
+# }
+# ]
+# },
+# {
+# "control": "None",
+# "default": 0,
+# "label": "",
+# "longdesc": "The strength of the warp effect",
+# "max": 1,
+# "min": 0,
+# "name": "amount",
+# "shortdesc": "Strength",
+# "step": 0.005,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0,
+# "label": "",
+# "longdesc": "The offset used to measure slopes",
+# "max": 0.2,
+# "min": 0.005,
+# "name": "eps",
+# "shortdesc": "Epsilon",
+# "step": 0.005,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#warp2.mmg
+#Warps its input according to a heightmap
+
+# "code": "vec2 $(name_uv)_slope = $(name)_slope($uv);\nvec2 $(name_uv)_warp = $mode;",
+# "inputs": [
+# {
+# "default": "vec4(sin($uv.x*20.0)*0.5+0.5, sin($uv.y*20.0)*0.5+0.5, 0, 1)",
+# "label": "",
+# "longdesc": "The input image to be warped",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "rgba"
+# },
+# {
+# "default": "0.0",
+# "function": true,
+# "label": "",
+# "longdesc": "The height map whose slopes are used to deform the input",
+# "name": "d",
+# "shortdesc": "Height map",
+# "type": "f"
+# }
+# ],
+# "instance": "vec2 $(name)_slope(vec2 uv) {\n vec2 e = vec2(0.001, 0.0);\n return 0.5*vec2($d(uv+e)-$d(uv-e), $d(uv+e.yx)-$d(uv-e.yx))/e.x;\n}",
+# "outputs": [
+# {
+# "longdesc": "Shows the warped image",
+# "rgba": "$in($uv+$amount*$(name_uv)_warp)",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 0,
+# "label": "",
+# "longdesc": "Both warp modes extract their direction from the height map slopes:\n- Slope warp intensity only depends on the slope\n- Distance to top warp intensity depends on the slope and the distance to the top, and can be used to create mosaic-like patterns\n\nA Transform node with translate maps can produce effects similar to Slope Warp and is generally faster.",
+# "name": "mode",
+# "shortdesc": "Mode",
+# "type": "enum",
+# "values": [
+# {
+# "name": "Slope",
+# "value": "$(name_uv)_slope"
+# },
+# {
+# "name": "Distance to top",
+# "value": "$(name_uv)_slope*(1.0-$d($uv))"
+# }
+# ]
+# },
+# {
+# "control": "None",
+# "default": 0,
+# "label": "",
+# "longdesc": "The strength of the warp effect",
+# "max": 1,
+# "min": 0,
+# "name": "amount",
+# "shortdesc": "Strength",
+# "step": 0.005,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#circle_map.mmg
+#Maps its input into a circle
+
+# "inputs": [
+# {
+# "default": "vec4($uv, 0.0, 1.0)",
+# "label": "",
+# "longdesc": "The input image to be remapped",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "rgba"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "Shows the remapped image",
+# "rgba": "$in(vec2(fract($repeat*atan($uv.y-0.5, $uv.x-0.5)*0.15915494309), min(0.99999, 2.0/$radius*length($uv-vec2(0.5)))))",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 1,
+# "label": "Radius",
+# "longdesc": "The radius of the circle where the input is mapped",
+# "max": 1.5,
+# "min": 0,
+# "name": "radius",
+# "shortdesc": "Radius",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 1,
+# "label": "Repeat",
+# "longdesc": "The number of repetitions of the input image around the circle",
+# "max": 16,
+# "min": 0,
+# "name": "repeat",
+# "shortdesc": "Repeat",
+# "step": 1,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#custom_uv.mmg
+#Remaps an Input image using a custom UV map.
+
+# "code": "vec3 $(name_uv)_map = $map($uv);\nfloat $(name_uv)_rnd = float($seed)+$(name_uv)_map.z;\n",
+# "inputs": [
+# {
+# "default": "vec4(1.0)",
+# "label": "Input",
+# "longdesc": "The image or atlas of images to be remapped.",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "rgba"
+# },
+# {
+# "default": "vec3(1.0)",
+# "label": "UV",
+# "longdesc": "The custom UV map to be used for remapping.",
+# "name": "map",
+# "shortdesc": "Map",
+# "type": "rgb"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "Shows the remapped image",
+# "rgba": "$in(get_from_tileset($inputs, $(name_uv)_rnd, custom_uv_transform($(name_uv)_map.xy, vec2($sx, $sy), $rotate*0.01745329251, $scale, vec2($(name_uv)_map.z, float($seed)))))",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 0,
+# "label": "Inputs",
+# "longdesc": "The input type of the node:\n- 1: single image\n- 4: atlas of 4 images\n- 16: atlas of 16 images\nAtlases can be created using the Tile2x2 node.",
+# "name": "inputs",
+# "shortdesc": "Inputs",
+# "type": "enum",
+# "values": [
+# {
+# "name": "1",
+# "value": "1.0"
+# },
+# {
+# "name": "4",
+# "value": "2.0"
+# },
+# {
+# "name": "16",
+# "value": "4.0"
+# }
+# ]
+# },
+# {
+# "control": "None",
+# "default": 1,
+# "label": "Scale X",
+# "longdesc": "The scale of the input image along the X axis.",
+# "max": 5,
+# "min": 0,
+# "name": "sx",
+# "shortdesc": "Scale.x",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 1,
+# "label": "Scale Y",
+# "longdesc": "The scale of the input image along the Y axis.",
+# "max": 5,
+# "min": 0,
+# "name": "sy",
+# "shortdesc": "Scale.y",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0,
+# "label": "Rnd Rotate",
+# "longdesc": "The random rotation applied to each remapped instance.",
+# "max": 180,
+# "min": 0,
+# "name": "rotate",
+# "shortdesc": "RndRotate",
+# "step": 0.1,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0.5,
+# "label": "Rnd Scale",
+# "longdesc": "The random scale applied to each remapped instance.",
+# "max": 1,
+# "min": 0,
+# "name": "scale",
+# "shortdesc": "RndScale",
+# "step": 0.01,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#splatter.mmg
+#Spreads several occurences of an input image randomly.
+
+#vec4 $(name_uv)_rch = splatter_$(name)($uv, int($count), vec2(float($seed)));
+
+#vec4 splatter_$(name)(vec2 uv, int count, vec2 seed) {\n\t
+# float c = 0.0;\n\t
+# vec3 rc = vec3(0.0);\n\t
+# vec3 rc1;\n\t
+#
+# for (int i = 0; i < count; ++i) {\n\t\t
+# seed = rand2(seed);\n\t\t
+# rc1 = rand3(seed);\n\t\t
+# float mask = $mask(fract(seed+vec2(0.5)));\n\t\t
+#
+# if (mask > 0.01) {\n\t\t\t
+# vec2 pv = fract(uv - seed)-vec2(0.5);\n\t\t\t
+# seed = rand2(seed);\n\t\t\t
+# float angle = (seed.x * 2.0 - 1.0) * $rotate * 0.01745329251;\n\t\t\t
+# float ca = cos(angle);\n\t\t\t
+# float sa = sin(angle);\n\t\t\t
+# pv = vec2(ca*pv.x+sa*pv.y, -sa*pv.x+ca*pv.y);\n\t\t\t
+# pv *= (seed.y-0.5)*2.0*$scale+1.0;\n\t\t\t
+# pv /= vec2($scale_x, $scale_y);\n\t\t\t
+# pv += vec2(0.5);\n\t\t\t
+# seed = rand2(seed);\n\t\t\t
+# vec2 clamped_pv = clamp(pv, vec2(0.0), vec2(1.0));\n\t\t\t
+#
+# if (pv.x != clamped_pv.x || pv.y != clamped_pv.y) {\n\t\t\t\t
+# continue;\n\t\t\t
+# }\n\t\t\t
+#
+# $select_inputs\n\t\t\t
+#
+# float c1 = $in.variation(pv, $variations ? seed.x : 0.0)*mask*(1.0-$value*seed.x);\n\t\t\t
+# c = max(c, c1);\n\t\t\t
+# rc = mix(rc, rc1, step(c, c1));\n\t\t
+# }\n\t
+# }\n\t
+#
+# return vec4(rc, c);\n
+#}
+
+#Inputs:
+
+#in, float, default: 0, - The input image or atlas of 4 or 16 input images
+#Mask, float, default: 1, - The mask applied to the pattern
+
+#Outputs:
+#Output, float, Shows the generated pattern
+#$(name_uv)_rch.a
+
+#Instance map, rgb, Shows a random color for each instance of the input image
+#$(name_uv)_rch.rgb
+
+#select_inputs enum
+#1, " "
+#4, "pv = clamp(0.5*(pv+floor(rand2(seed)*2.0)), vec2(0.0), vec2(1.0));"
+#16, "pv = clamp(0.25*(pv+floor(rand2(seed)*4.0)), vec2(0.0), vec2(1.0));"
+
+#Parameters:
+#count, int, default 25, min 1, max 100, - The number of occurences of the input image
+#select_inputs (Inputs), enum, default 0, values 1, 4, 16
+#tile, Vector2, default 4, min:1, max:64, step:1 - The number of columns of the tiles pattern
+#overlap, float, default 1, min 0, max 5, step 1 - The number of neighbour tiles an instance of the input image can overlap. Set this parameter to the lowest value that generates the expected result (where all instances are fully visible) to improve performance.
+#scale, Vector2, default 1, min:0, max:2, step:0.01 - "The scale of input images on the X axis
+#rotate (rnd_rotate), float, default 0, min 0, max 180, step 0.1
+#scale (rnd_scale), float, default 0, min 0, max 1, step 0.01 - The random scale applied to each image instance
+#value (rnd_value), float, default 0, min 0, max 1, step 0.01
+
+#----------------------
+#splatter_color.mmg
+#preads several occurences of an input image randomly.
+
+#vec4 splatter_$(name)(vec2 uv, int count, vec2 seed) {\n\t
+# vec4 c = vec4(0.0);\n\t
+#
+# for (int i = 0; i < count; ++i) {\n\t\t
+# seed = rand2(seed);\n\t\t
+# float mask = $mask(fract(seed+vec2(0.5)));\n\t\t
+#
+# if (mask > 0.01) {\n\t\t\t
+# vec2 pv = fract(uv - seed)-vec2(0.5);\n\t\t\t
+# seed = rand2(seed);\n\t\t\t
+# float angle = (seed.x * 2.0 - 1.0) * $rotate * 0.01745329251;\n\t\t\t
+# float ca = cos(angle);\n\t\t\t
+# float sa = sin(angle);\n\t\t\t
+# pv = vec2(ca*pv.x+sa*pv.y, -sa*pv.x+ca*pv.y);\n\t\t\t
+# pv *= (seed.y-0.5)*2.0*$scale+1.0;\n\t\t\t
+# pv /= vec2($scale_x, $scale_y);\n\t\t\tpv += vec2(0.5);\n\t\t\t
+# seed = rand2(seed);\n\t\t\t
+#
+# if (pv != clamp(pv, vec2(0.0), vec2(1.0))) {\n\t\t\t\t
+# continue;\n\t\t\t
+# }\n\t\t\t
+#
+# $select_inputs\n\t\t\t
+#
+# vec4 n = $in.variation(pv, $variations ? seed.x : 0.0);\n\t\t\t
+#
+# float na = n.a*mask*(1.0-$opacity*seed.x);\n\t\t\t
+# float a = (1.0-c.a)*(1.0*na);\n\t\t\t
+# c = mix(c, n, na);\n\t\t
+# }\n\t
+# }\n\t
+#
+# return c;\n
+#}
+
+#Inputs:
+
+#in, rgba, default: 0, - The input image or atlas of 4 or 16 input images
+#Mask, float, default: 1, - The mask applied to the pattern
+
+#Outputs:
+#Output, rgba, Shows the generated pattern
+#splatter_$(name)($uv, int($count), vec2(float($seed)))
+
+#select_inputs enum
+#1, " "
+#4, "pv = clamp(0.5*(pv+floor(rand2(seed)*2.0)), vec2(0.0), vec2(1.0));"
+#16, "pv = clamp(0.25*(pv+floor(rand2(seed)*4.0)), vec2(0.0), vec2(1.0));"
+
+#Parameters:
+#count, int, default 25, min 1, max 100, - The number of occurences of the input image
+#select_inputs (Inputs), enum, default 0, values 1, 4, 16
+#tile, Vector2, default 4, min:1, max:64, step:1 - The number of columns of the tiles pattern
+#overlap, float, default 1, min 0, max 5, step 1 - The number of neighbour tiles an instance of the input image can overlap. Set this parameter to the lowest value that generates the expected result (where all instances are fully visible) to improve performance.
+#scale, Vector2, default 1, min:0, max:2, step:0.01 - "The scale of input images on the X axis
+#rotate (rnd_rotate), float, default 0, min 0, max 180, step 0.1
+#scale (rnd_scale), float, default 0, min 0, max 1, step 0.01 - The random scale applied to each image instance
+#value (rnd_value), float, default 0, min 0, max 1, step 0.01
+#variations bool
+
+#----------------------
+#circle_splatter.mmg
+#Spreads several occurences of an input image in a circle or spiral pattern.
+
+#vec4 $(name_uv)_rch = splatter_$(name)($uv, int($count), int($rings), vec2(float($seed)));
+
+#vec4 splatter_$(name)(vec2 uv, int count, int rings, vec2 seed) {\n\t
+# float c = 0.0;\n\t
+# vec3 rc = vec3(0.0);\n\t
+# vec3 rc1;\n\t
+# seed = rand2(seed);\n\t
+#
+# for (int i = 0; i < count; ++i) {\n\t\t
+# float a = -1.57079632679+6.28318530718*float(i)*$rings/float(count);\n\t\t
+# float rings_distance = ceil(float(i+1)*float(rings)/float(count))/float(rings);\n\t\t
+# float spiral_distance = float(i+1)/float(count);\n\t\t
+# vec2 pos = $radius*mix(rings_distance, spiral_distance, $spiral)*vec2(cos(a), sin(a));\n\t\t
+# float mask = $mask(fract(pos-vec2(0.5)));\n\t\t
+#
+# if (mask > 0.01) {\n\t\t\t
+# vec2 pv = uv-0.5-pos;\n\t\t\t
+# rc1 = rand3(seed);\n\t\t\tseed = rand2(seed);\n\t\t\t
+# float angle = (seed.x * 2.0 - 1.0) * $rotate * 0.01745329251 + (a+1.57079632679) * $i_rotate;\n\t\t\t
+# float ca = cos(angle);\n\t\t\t
+# float sa = sin(angle);\n\t\t\t
+# pv = vec2(ca*pv.x+sa*pv.y, -sa*pv.x+ca*pv.y);\n\t\t\t
+# pv /= mix(1.0, float(i+1)/float(count+1), $i_scale);\n\t\t\t
+# pv /= vec2($scale_x, $scale_y);\n\t\t\t
+# pv *= (seed.y-0.5)*2.0*$scale+1.0;\n\t\t\t
+# pv += vec2(0.5);\n\t\t\tseed = rand2(seed);\n\t\t\t
+#
+# if (pv != clamp(pv, vec2(0.0), vec2(1.0))) {\n\t\t\t\t
+# continue;\n\t\t\t
+# }\n\t\t\t
+#
+# $select_inputs\n\t\t\t
+#
+# float c1 = $in(pv)*mask*(1.0-$value*seed.x);\n\t\t\t
+#
+# c = max(c, c1);\n\t\t\trc = mix(rc, rc1, step(c, c1));\n\t\t
+# }\n\t
+# }\n\t
+#
+# return vec4(rc, c);\n
+#}
+
+
+#Inputs:
+
+#in, float, default: 0, - The input image or atlas of 4 or 16 input images
+#Mask, float, default: 1, - The mask applied to the pattern
+
+#Outputs:
+#Output, float, Shows the generated pattern
+#$(name_uv)_rch.rgb
+
+#select_inputs enum
+#1, " "
+#4, "pv = clamp(0.5*(pv+floor(rand2(seed)*2.0)), vec2(0.0), vec2(1.0));"
+#16, "pv = clamp(0.25*(pv+floor(rand2(seed)*4.0)), vec2(0.0), vec2(1.0));"
+
+#Parameters:
+#count, int, default 10, min 1, max 256, - The number of occurences of the input image
+#rings, int, default 1, min 1, max 16, - The number of occurences of the input image
+#select_inputs (Inputs), enum, default 0, values 1, 4, 16
+#scale, Vector2, default 1, min:0, max:2, step:0.01 - "The scale of input images on the X axis
+#radius, float, default 0.4, min 0, max 0.5, step 0.01
+#spiral, float, default 0, min 0, max 1, step 0.01
+#i_rotate (inc_rotate), float, default 0, min 0, max 180, step 0.1
+#i_scale (inc_scale), float, default 0, min 0, max 1, step 0.01
+#rotate (rnd_rotate), float, default 0, min 0, max 180, step 0.1
+#scale (rnd_scale), float, default 0, min 0, max 1, step 0.01 - The random scale applied to each image instance
+#value (rnd_value), float, default 0, min 0, max 1, step 0.01
+
+#----------------------
+#warp_dilation.mmg
+
+#{
+# "connections": [
+# {
+# "from": "warp_dilation",
+# "from_port": 0,
+# "to": "buffer_5",
+# "to_port": 0
+# },
+# {
+# "from": "buffer_5",
+# "from_port": 0,
+# "to": "gen_outputs",
+# "to_port": 0
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 1,
+# "to": "buffer_6",
+# "to_port": 0
+# },
+# {
+# "from": "buffer_6",
+# "from_port": 0,
+# "to": "warp_dilation",
+# "to_port": 1
+# },
+# {
+# "from": "gen_inputs",
+# "from_port": 0,
+# "to": "buffer_7",
+# "to_port": 0
+# },
+# {
+# "from": "buffer_7",
+# "from_port": 0,
+# "to": "warp_dilation",
+# "to_port": 0
+# }
+# ],
+# "label": "Warp Dilation",
+# "longdesc": "",
+# "name": "warp_dilation",
+# "node_position": {
+# "x": 0,
+# "y": 0
+# },
+# "nodes": [
+# {
+# "name": "buffer_5",
+# "node_position": {
+# "x": -387.923584,
+# "y": -38
+# },
+# "parameters": {
+# "lod": 0,
+# "size": 9
+# },
+# "type": "buffer"
+# },
+# {
+# "name": "buffer_6",
+# "node_position": {
+# "x": -636.189514,
+# "y": -90.757477
+# },
+# "parameters": {
+# "lod": 0,
+# "size": 9
+# },
+# "type": "buffer"
+# },
+# {
+# "name": "buffer_7",
+# "node_position": {
+# "x": -635.189514,
+# "y": -199.757477
+# },
+# "parameters": {
+# "lod": 0,
+# "size": 9
+# },
+# "type": "buffer"
+# },
+# {
+# "name": "warp_dilation",
+# "node_position": {
+# "x": -404.125,
+# "y": -172.25
+# },
+# "parameters": {
+# "a": 0,
+# "d": 0.5,
+# "mode": 0,
+# "s": 9
+# },
+# "type": "warp_dilation_nobuf"
+# },
+# {
+# "name": "gen_inputs",
+# "node_position": {
+# "x": -1127.189453,
+# "y": -144.691238
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "name": "port1",
+# "type": "f"
+# },
+# {
+# "group_size": 0,
+# "name": "port0",
+# "type": "f"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "gen_outputs",
+# "node_position": {
+# "x": -70.923584,
+# "y": -122.691238
+# },
+# "parameters": {
+#
+# },
+# "ports": [
+# {
+# "group_size": 0,
+# "name": "port0",
+# "type": "f"
+# }
+# ],
+# "type": "ios"
+# },
+# {
+# "name": "gen_parameters",
+# "node_position": {
+# "x": -463.856934,
+# "y": -398.757477
+# },
+# "parameters": {
+# "a": 0,
+# "d": 0.5,
+# "mode": 0,
+# "s": 9
+# },
+# "type": "remote",
+# "widgets": [
+# {
+# "label": "Mode",
+# "linked_widgets": [
+# {
+# "node": "warp_dilation",
+# "widget": "mode"
+# }
+# ],
+# "name": "mode",
+# "type": "linked_control"
+# },
+# {
+# "label": "Resolution",
+# "linked_widgets": [
+# {
+# "node": "warp_dilation",
+# "widget": "s"
+# },
+# {
+# "node": "buffer_7",
+# "widget": "size"
+# },
+# {
+# "node": "buffer_6",
+# "widget": "size"
+# },
+# {
+# "node": "buffer_5",
+# "widget": "size"
+# }
+# ],
+# "name": "s",
+# "type": "linked_control"
+# },
+# {
+# "label": "Distance",
+# "linked_widgets": [
+# {
+# "node": "warp_dilation",
+# "widget": "d"
+# }
+# ],
+# "name": "d",
+# "type": "linked_control"
+# },
+# {
+# "label": "Attenuation",
+# "linked_widgets": [
+# {
+# "node": "warp_dilation",
+# "widget": "a"
+# }
+# ],
+# "name": "a",
+# "type": "linked_control"
+# }
+# ]
+# }
+# ],
+# "parameters": {
+# "a": 0,
+# "d": 0.5,
+# "mode": 0,
+# "s": 9
+# },
+# "shortdesc": "",
+# "type": "graph"
+#}
+
+#----------------------
+#warp_dilation_nobuf.mmg
+
+#{
+# "name": "warp_dilation",
+# "node_position": {
+# "x": 0,
+# "y": 0
+# },
+# "parameters": {
+# "a": 0,
+# "d": 0.5,
+# "mode": 0,
+# "s": 9
+# },
+# "shader_model": {
+# "code": "",
+# "global": "",
+# "inputs": [
+# {
+# "default": "0.0",
+# "function": true,
+# "label": "",
+# "longdesc": "The input image",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "f"
+# },
+# {
+# "default": "0.0",
+# "function": true,
+# "label": "",
+# "longdesc": "The height map whose contours or slopes are followed",
+# "name": "hm",
+# "shortdesc": "Height map",
+# "type": "f"
+# }
+# ],
+# "instance": "vec2 $(name)_slope(vec2 uv, float epsilon) {\n\tfloat dx = $hm(fract(uv+vec2(epsilon, 0.0)))-$hm(fract(uv-vec2(epsilon, 0.0)));\n\tfloat dy = $hm(fract(uv+vec2(0.0, epsilon)))-$hm(fract(uv-vec2(0.0, epsilon)));\n\treturn vec2($mode);\n}\n\nfloat $(name)_dilate(vec2 uv, vec2 slope) {\n\tfloat e = 1.0/$s;\n\tfloat v = 0.0;\n\tfor (float x = 0.0; x <= $d; x += e) {\n\t\tv = max(v, $in(fract(uv))*(1.0-x/$d*$a));\n\t\tuv += e*normalize($(name)_slope(uv, 0.0001));\n\t}\n\treturn v;\n}",
+# "longdesc": "Dilates its input following the contours or slope of an input heightmap",
+# "name": "Warp Dilation",
+# "outputs": [
+# {
+# "f": "$(name)_dilate($uv, normalize($(name)_slope($uv, 0.001)))",
+# "longdesc": "The dilated image",
+# "shortdesc": "Output",
+# "type": "f"
+# }
+# ],
+# "parameters": [
+# {
+# "default": 0,
+# "label": "Mode",
+# "longdesc": "The dilate mode (clockwise contour, counter clockwise contour or slope)",
+# "name": "mode",
+# "shortdesc": "Mode",
+# "type": "enum",
+# "values": [
+# {
+# "name": "Contour (cw)",
+# "value": "-dy,dx"
+# },
+# {
+# "name": "Contour (ccw)",
+# "value": "dy, -dx"
+# },
+# {
+# "name": "Slope",
+# "value": "dx,dy"
+# }
+# ]
+# },
+# {
+# "default": 9,
+# "first": 6,
+# "label": "Resolution",
+# "last": 12,
+# "longdesc": "The resolution at which the contours or slopes are followed (higher values will be more precise but rendering time will be higher)",
+# "name": "s",
+# "shortdesc": "Resolution",
+# "type": "size"
+# },
+# {
+# "control": "None",
+# "default": 0.1,
+# "label": "Distance",
+# "longdesc": "The distance along which the contours or slopes are followed",
+# "max": 0.5,
+# "min": 0,
+# "name": "d",
+# "shortdesc": "Distance",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0,
+# "label": "Attenuation",
+# "longdesc": "The attenuation applied along the path",
+# "max": 1,
+# "min": 0,
+# "name": "a",
+# "shortdesc": "Attenuation",
+# "step": 0.01,
+# "type": "float"
+# }
+# ],
+# "shortdesc": "Warp Dilation"
+# },
+# "type": "shader"
+#}
+
+#----------------------
+#repeat.mmg
+#Translates, rotates and scales its input
+
+# "inputs": [
+# {
+# "default": "vec4($uv, 0.0, 1.0)",
+# "label": "",
+# "longdesc": "The input image to be transformed",
+# "name": "i",
+# "shortdesc": "Input",
+# "type": "rgba"
+# }
+# ],
+# "outputs": [
+# {
+# "longdesc": "Shows the transformed image",
+# "rgba": "$i(fract($uv))",
+# "shortdesc": "Output",
+# "type": "rgba"
+# }
+# ],
+
+#----------------------
+#remap.mmg
+#The remapped image map
+
+# "code": "float $(name_uv)_x = $in($uv)*($max-$min);",
+# "inputs": [
+# {
+# "default": "0.0",
+# "label": "",
+# "longdesc": "The greyscale input map",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "f"
+# }
+# ],
+# "outputs": [
+# {
+# "f": "$min+$(name_uv)_x-mod($(name_uv)_x, max($step, 0.00000001))",
+# "longdesc": "The remapped image map",
+# "shortdesc": "Output",
+# "type": "f"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 0,
+# "label": "Min",
+# "longdesc": "The value generated for black areas of the input",
+# "max": 10,
+# "min": -10,
+# "name": "min",
+# "shortdesc": "Min",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0,
+# "label": "Max",
+# "longdesc": "The value generated for white areas of the input",
+# "max": 10,
+# "min": -10,
+# "name": "max",
+# "shortdesc": "Max",
+# "step": 0.01,
+# "type": "float"
+# },
+# {
+# "control": "None",
+# "default": 0,
+# "label": "Step",
+# "longdesc": "The step between generated values",
+# "max": 1,
+# "min": 0,
+# "name": "step",
+# "shortdesc": "Step",
+# "step": 0.01,
+# "type": "float"
+# }
+# ],
+
+#----------------------
+#height_to_angle.mmg
+#Generates an angle map to be used by Advances Tiler nodes from a heightmap
+
+# "inputs": [
+# {
+# "default": "0.0",
+# "function": true,
+# "label": "",
+# "longdesc": "The input heightmap",
+# "name": "in",
+# "shortdesc": "Input",
+# "type": "f"
+# }
+# ],
+# "instance": "float $(name)_fct(vec2 uv, float epsilon) {\n\tvec3 e = vec3(epsilon, -epsilon, 0);\n\tvec2 rv = vec2(1.0, -1.0)*$in(uv+e.xy);\n\trv += vec2(-1.0, 1.0)*$in(uv-e.xy);\n\trv += vec2(1.0, 1.0)*$in(uv+e.xx);\n\trv += vec2(-1.0, -1.0)*$in(uv-e.xx);\n\trv += vec2(2.0, 0.0)*$in(uv+e.xz);\n\trv += vec2(-2.0, 0.0)*$in(uv-e.xz);\n\trv += vec2(0.0, 2.0)*$in(uv+e.zx);\n\trv += vec2(0.0, -2.0)*$in(uv-e.zx);\n\treturn atan(rv.y, rv.x)/3.141592;\n}",
+# "outputs": [
+# {
+# "f": "$(name)_fct($uv, 0.0001)+$angle/180.0",
+# "longdesc": "The generated angle map. Values are between -1 and 1 and the corresponding Advanced Tiler parameter (Rotate) must be set to 180.",
+# "shortdesc": "Output",
+# "type": "f"
+# }
+# ],
+# "parameters": [
+# {
+# "control": "None",
+# "default": 0,
+# "label": "",
+# "longdesc": "The offset angle applied to the generated map",
+# "max": 180,
+# "min": -180,
+# "name": "angle",
+# "shortdesc": "Angle",
+# "step": 0.01,
+# "type": "float"
+# }
+# ],
+
+#vec2 transform(vec2 uv, vec2 translate, float rotate, vec2 scale, bool repeat) {\n \t
+# vec2 rv;\n\t
+# uv -= translate;\n\t
+# uv -= vec2(0.5);\n\t
+# rv.x = cos(rotate)*uv.x + sin(rotate)*uv.y;\n\t
+# rv.y = -sin(rotate)*uv.x + cos(rotate)*uv.y;\n\t
+# rv /= scale;\n\t
+# rv += vec2(0.5);\n
+#
+# if (repeat) {\n\t\t
+# return fract(rv);\n\t
+# } else {\n\t\t
+# return clamp(rv, vec2(0.0), vec2(1.0));\n\t
+# }\t\n
+#}
+
+static func transform(uv : Vector2, translate : Vector2, rotate : float, scale : Vector2, repeat : bool) -> Vector2:
+ var rv : Vector2 = Vector2()
+ uv -= translate
+ uv -= Vector2(0.5, 0.5)
+ rv.x = cos(rotate)*uv.x + sin(rotate)*uv.y
+ rv.y = -sin(rotate)*uv.x + cos(rotate)*uv.y
+ rv /= scale
+ rv += Vector2(0.5, 0.5)
+
+ if (repeat):
+ return Commons.fractv2(rv)
+ else:
+ return Commons.clampv2(rv, Vector2(0, 0), Vector2(1, 1))
+
+#vec2 transform2_clamp(vec2 uv) {\n\t
+# return clamp(uv, vec2(0.0), vec2(1.0));\n
+#}
+
+static func transform2_clamp(uv : Vector2) -> Vector2:
+ return Commons.clampv2(uv, Vector2(0, 0), Vector2(1, 1))
+
+#vec2 transform2(vec2 uv, vec2 translate, float rotate, vec2 scale) {\n \t
+# vec2 rv;\n\t
+# uv -= translate;\n\t
+# uv -= vec2(0.5);\n\t
+# rv.x = cos(rotate)*uv.x + sin(rotate)*uv.y;\n\t
+# rv.y = -sin(rotate)*uv.x + cos(rotate)*uv.y;\n\t
+# rv /= scale;\n\t
+# rv += vec2(0.5);\n\t
+# return rv;\t\n
+#}
+
+static func transform2(uv : Vector2, translate : Vector2, rotate : float, scale : Vector2) -> Vector2:
+ var rv : Vector2 = Vector2()
+ uv -= translate
+ uv -= Vector2(0.5, 0.5)
+ rv.x = cos(rotate)*uv.x + sin(rotate)*uv.y
+ rv.y = -sin(rotate)*uv.x + cos(rotate)*uv.y
+ rv /= scale
+ rv += Vector2(0.5, 0.5)
+ return rv
+
+#vec2 rotate(vec2 uv, vec2 center, float rotate) {\n \t
+# vec2 rv;\n\t
+# uv -= center;\n\t
+# rv.x = cos(rotate)*uv.x + sin(rotate)*uv.y;\n\t
+# rv.y = -sin(rotate)*uv.x + cos(rotate)*uv.y;\n\t
+# rv += center;\n
+# return rv;\t\n
+#}
+
+static func rotate(uv : Vector2, center : Vector2, rotate : float) -> Vector2:
+ var rv : Vector2 = Vector2()
+ uv -= center
+ rv.x = cos(rotate)*uv.x + sin(rotate)*uv.y
+ rv.y = -sin(rotate)*uv.x + cos(rotate)*uv.y
+ rv += center
+ return rv
+
+#vec2 scale(vec2 uv, vec2 center, vec2 scale) {\n\t
+# uv -= center;\n\t
+# uv /= scale;\n\t
+# uv += center;\n
+# return uv;\n
+#}
+
+static func scale(uv : Vector2, center : Vector2, scale : Vector2) -> Vector2:
+ uv -= center
+ uv /= scale
+ uv += center
+ return uv
+
+#vec2 uvmirror_h(vec2 uv, float offset) {\n\t
+# return vec2(max(0, abs(uv.x-0.5)-0.5*offset)+0.5, uv.y);
+#}
+
+static func uvmirror_h(uv : Vector2, offset : float) -> Vector2:
+ return Vector2(max(0, abs(uv.x - 0.5) - 0.5 * offset)+0.5, uv.y)
+
+#vec2 uvmirror_v(vec2 uv, float offset) {\n\t
+# return vec2(uv.x, max(0, abs(uv.y-0.5)-0.5*offset)+0.5);\n
+#}
+
+static func uvmirror_v(uv : Vector2, offset : float) -> Vector2:
+ return Vector2(uv.x, max(0, abs(uv.y - 0.5) - 0.5 * offset) + 0.5)
+
+#vec2 kal_rotate(vec2 uv, float count, float offset) {\n\t
+# float pi = 3.14159265359;\n\t
+# offset *= pi/180.0;\n\t
+# offset += pi*(1.0/count+0.5);\n\t
+# uv -= vec2(0.5);\n\t
+#
+# float l = length(uv);\n\t
+# float a = mod(atan(uv.y, uv.x)+offset, 2.0*pi/count)-offset;\n\t
+#
+# return vec2(0.5)+l*vec2(cos(a), sin(a));\n
+#}
+
+static func kal_rotate(uv : Vector2, count : float, offset : float) -> Vector2:
+ var pi : float = 3.14159265359
+ offset *= pi / 180.0
+ offset += pi * (1.0/ count + 0.5)
+ uv -= Vector2(0.5, 0.5)
+
+ var l : float = uv.length()
+ var a : float = Commons.modf(atan2(uv.y, uv.x) + offset, 2.0 * pi / count) - offset
+
+ return Vector2(0.5, 0.5) + l * Vector2(cos(a), sin(a))
+
+#vec2 get_from_tileset(float count, float seed, vec2 uv) {\n\t
+# return clamp((uv+floor(rand2(vec2(seed))*count))/count, vec2(0.0), vec2(1.0));\n
+#}
+
+static func get_from_tileset(count : float, pseed : float, uv : Vector2) -> Vector2:
+ return Commons.clampv2((uv + Commons.floorv2(Commons.rand2(Vector2(pseed, pseed))*count))/count, Vector2(0, 0), Vector2(1, 1))
+
+#vec2 custom_uv_transform(vec2 uv, vec2 cst_scale, float rnd_rotate, float rnd_scale, vec2 seed) {\n\t
+# seed = rand2(seed);\n\t
+# uv -= vec2(0.5);\n\t
+# float angle = (seed.x * 2.0 - 1.0) * rnd_rotate;\n\t
+# float ca = cos(angle);\n\t
+# float sa = sin(angle);\n\t
+# uv = vec2(ca*uv.x+sa*uv.y, -sa*uv.x+ca*uv.y);\n\t
+# uv *= (seed.y-0.5)*2.0*rnd_scale+1.0;\n\t
+# uv /= cst_scale;\n\t
+# uv += vec2(0.5);\n\t
+#
+# return uv;\n
+#}
+
+static func custom_uv_transform(uv : Vector2, cst_scale : Vector2, rnd_rotate : float, rnd_scale : float, pseed : Vector2) -> Vector2:
+ pseed = Commons.rand2(pseed)
+ uv -= Vector2(0.5, 0.5)
+ var angle : float = (pseed.x * 2.0 - 1.0) * rnd_rotate
+ var ca : float = cos(angle)
+ var sa : float = sin(angle)
+ uv = Vector2(ca * uv.x + sa * uv.y, -sa * uv.x + ca * uv.y)
+ uv *= (pseed.y-0.5)*2.0*rnd_scale+1.0
+ uv /= cst_scale
+ uv += Vector2(0.5, 0.5)
+
+ return uv
diff --git a/modules/material_maker/mat_maker_gd/nodes/filter/adjust_hsv.gd b/modules/material_maker/mat_maker_gd/nodes/filter/adjust_hsv.gd
new file mode 100644
index 000000000..664ff95a4
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/filter/adjust_hsv.gd
@@ -0,0 +1,75 @@
+tool
+extends MMNode
+
+var Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var Filter = preload("res://addons/mat_maker_gd/nodes/common/filter.gd")
+
+export(Resource) var image : Resource
+export(Resource) var input : Resource
+export(float) var hue : float = 0
+export(float) var saturation : float = 1
+export(float) var value : float = 1
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ input.set_default_value(Color(0, 0, 0, 1))
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input1 "
+
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ #image.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+ #image.force_override = true
+
+ register_input_property(input)
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_float("get_hue", "set_hue", "Hue", 0.01)
+ mm_graph_node.add_slot_float("get_saturation", "set_saturation", "Saturation", 0.01)
+ mm_graph_node.add_slot_float("get_value", "set_value", "Value", 0.01)
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ var c : Color = input.get_value(uv)
+
+ return Filter.adjust_hsv(c, hue, saturation, value)
+
+#hue
+func get_hue() -> float:
+ return hue
+
+func set_hue(val : float) -> void:
+ hue = val
+
+ set_dirty(true)
+
+#saturation
+func get_saturation() -> float:
+ return saturation
+
+func set_saturation(val : float) -> void:
+ saturation = val
+
+ set_dirty(true)
+
+#value
+func get_value() -> float:
+ return value
+
+func set_value(val : float) -> void:
+ value = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/filter/blend.gd b/modules/material_maker/mat_maker_gd/nodes/filter/blend.gd
new file mode 100644
index 000000000..ffeed8ae8
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/filter/blend.gd
@@ -0,0 +1,125 @@
+tool
+extends MMNode
+
+var Filter = preload("res://addons/mat_maker_gd/nodes/common/filter.gd")
+
+enum BlendType {
+ NORMAL = 0,
+ DISSOLVE,
+ MULTIPLY,
+ SCREEN,
+ OVERLAY,
+ HARD_LIGHT,
+ SOFT_LIGHT,
+ BURN,
+ DODGE,
+ LIGHTEN,
+ DARKEN,
+ DIFFRENCE
+}
+
+export(Resource) var image : Resource
+export(Resource) var input1 : Resource
+export(Resource) var input2 : Resource
+export(int, "Normal,Dissolve,Multiply,Screen,Overlay,Hard Light,Soft Light,Burn,Dodge,Lighten,Darken,Difference") var blend_type : int = 0
+export(Resource) var opacity : Resource
+
+func _init_properties():
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !input1:
+ input1 = MMNodeUniversalProperty.new()
+ input1.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ input1.set_default_value(Color(1, 1, 1, 1))
+
+ input1.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input1.slot_name = ">>> Input1 "
+
+ if !input2:
+ input2 = MMNodeUniversalProperty.new()
+ input2.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ input2.set_default_value(Color(1, 1, 1, 1))
+
+ input2.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input2.slot_name = ">>> Input2 "
+
+ if !opacity:
+ opacity = MMNodeUniversalProperty.new()
+ opacity.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+ opacity.set_default_value(0.5)
+ opacity.value_range = Vector2(0, 1)
+ opacity.value_step = 0.01
+
+ opacity.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ opacity.slot_name = "opacity"
+
+ register_input_property(input1)
+ register_input_property(input2)
+
+ register_output_property(image)
+ register_input_property(opacity)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_enum("get_blend_type", "set_blend_type", "blend_type", [ "Normal", "Dissolve", "Multiply", "Screen", "Overlay", "Hard Light", "Soft Light", "Burn", "Dodge", "Lighten", "Darken", "Difference" ])
+
+ mm_graph_node.add_slot_label_universal(input1)
+ mm_graph_node.add_slot_label_universal(input2)
+ mm_graph_node.add_slot_float_universal(opacity)
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ var b : Vector3 = Vector3()
+
+ #vec4 $(name_uv)_s1 = $s1($uv);
+ var s1 : Color = input1.get_value(uv)
+ #vec4 $(name_uv)_s2 = $s2($uv);
+ var s2 : Color = input2.get_value(uv)
+ #float $(name_uv)_a = $amount*$a($uv);
+ var a : float = opacity.get_value(uv)
+
+ #vec4(blend_$blend_type($uv, $(name_uv)_s1.rgb, $(name_uv)_s2.rgb, $(name_uv)_a*$(name_uv)_s1.a), min(1.0, $(name_uv)_s2.a+$(name_uv)_a*$(name_uv)_s1.a))
+
+ #"Normal,Dissolve,Multiply,Screen,Overlay,Hard Light,Soft Light,Burn,Dodge,Lighten,Darken,Difference"
+ if blend_type == BlendType.NORMAL:
+ b = Filter.blend_normal(uv, Vector3(s1.r, s1.g, s1.b), Vector3(s2.r, s2.g, s2.b), a * s1.a)
+ elif blend_type == BlendType.DISSOLVE:
+ b = Filter.blend_dissolve(uv, Vector3(s1.r, s1.g, s1.b), Vector3(s2.r, s2.g, s2.b), a * s1.a)
+ elif blend_type == BlendType.MULTIPLY:
+ b = Filter.blend_multiply(uv, Vector3(s1.r, s1.g, s1.b), Vector3(s2.r, s2.g, s2.b), a * s1.a)
+ elif blend_type == BlendType.SCREEN:
+ b = Filter.blend_screen(uv, Vector3(s1.r, s1.g, s1.b), Vector3(s2.r, s2.g, s2.b), a * s1.a)
+ elif blend_type == BlendType.OVERLAY:
+ b = Filter.blend_overlay(uv, Vector3(s1.r, s1.g, s1.b), Vector3(s2.r, s2.g, s2.b), a * s1.a)
+ elif blend_type == BlendType.HARD_LIGHT:
+ b = Filter.blend_hard_light(uv, Vector3(s1.r, s1.g, s1.b), Vector3(s2.r, s2.g, s2.b), a * s1.a)
+ elif blend_type == BlendType.SOFT_LIGHT:
+ b = Filter.blend_soft_light(uv, Vector3(s1.r, s1.g, s1.b), Vector3(s2.r, s2.g, s2.b), a * s1.a)
+ elif blend_type == BlendType.BURN:
+ b = Filter.blend_burn(uv, Vector3(s1.r, s1.g, s1.b), Vector3(s2.r, s2.g, s2.b), a * s1.a)
+ elif blend_type == BlendType.DODGE:
+ b = Filter.blend_dodge(uv, Vector3(s1.r, s1.g, s1.b), Vector3(s2.r, s2.g, s2.b), a * s1.a)
+ elif blend_type == BlendType.LIGHTEN:
+ b = Filter.blend_lighten(uv, Vector3(s1.r, s1.g, s1.b), Vector3(s2.r, s2.g, s2.b), a * s1.a)
+ elif blend_type == BlendType.DARKEN:
+ b = Filter.blend_darken(uv, Vector3(s1.r, s1.g, s1.b), Vector3(s2.r, s2.g, s2.b), a * s1.a)
+ elif blend_type == BlendType.DIFFRENCE:
+ b = Filter.blend_difference(uv, Vector3(s1.r, s1.g, s1.b), Vector3(s2.r, s2.g, s2.b), a * s1.a)
+
+ return Color(b.x, b.y, b.z, min(1, s2.a + a * s1.a))
+
+func get_blend_type() -> int:
+ return blend_type
+
+func set_blend_type(val : int) -> void:
+ blend_type = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/filter/blur_gaussian.gd b/modules/material_maker/mat_maker_gd/nodes/filter/blur_gaussian.gd
new file mode 100644
index 000000000..afcfcb239
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/filter/blur_gaussian.gd
@@ -0,0 +1,220 @@
+tool
+extends MMNode
+
+var Filter = preload("res://addons/mat_maker_gd/nodes/common/filter.gd")
+
+export(Resource) var image : Resource
+export(Resource) var input : Resource
+export(Resource) var sigma : Resource
+export(int, "Both,X,Y") var direction : int = 0
+
+var size : int = 0
+
+func _init_properties():
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ input.set_default_value(Color())
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input1 "
+
+ if !sigma:
+ sigma = MMNodeUniversalProperty.new()
+ sigma.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+ sigma.set_default_value(50)
+
+ sigma.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ sigma.slot_name = "Sigma"
+
+ register_input_property(input)
+ register_output_property(image)
+ register_input_property(sigma)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_int_universal(sigma)
+
+ mm_graph_node.add_slot_enum("get_direction", "set_direction", "Direction", [ "Both", "X", "Y" ])
+
+
+func _render(material) -> void:
+ size = max(material.image_size.x, material.image_size.y)
+
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func render_image(material) -> Image:
+ var img : Image = Image.new()
+ img.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+
+ img.lock()
+
+ var w : float = img.get_width()
+ var h : float = img.get_width()
+
+ var pseed : float = randf() + randi()
+
+ if direction == 0:
+ for x in range(img.get_width()):
+ for y in range(img.get_height()):
+ var v : Vector2 = Vector2(x / w, y / h)
+ var col : Color = get_value_x(v, pseed)
+ img.set_pixel(x, y, col)
+
+ img.unlock()
+ image.set_value(img)
+
+ var image2 : Image = Image.new()
+ image2.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+ image2.lock()
+
+ for x in range(img.get_width()):
+ for y in range(img.get_height()):
+ var v : Vector2 = Vector2(x / w, y / h)
+ var col : Color = get_value_y_img(v, pseed)
+ image2.set_pixel(x, y, col)
+
+ image2.unlock()
+
+ return image2
+
+ if direction == 1:
+ for x in range(img.get_width()):
+ for y in range(img.get_height()):
+ var v : Vector2 = Vector2(x / w, y / h)
+ var col : Color = get_value_x(v, pseed)
+ img.set_pixel(x, y, col)
+
+ if direction == 2:
+ for x in range(img.get_width()):
+ for y in range(img.get_height()):
+ var v : Vector2 = Vector2(x / w, y / h)
+ var col : Color = get_value_y(v, pseed)
+ img.set_pixel(x, y, col)
+
+ img.unlock()
+
+ return img
+
+func get_value_x(uv : Vector2, pseed : int) -> Color:
+ var sig_def : float = sigma.get_default_value(uv)
+ var sig : float = sigma.get_value(uv)
+
+ return gaussian_blur_x(uv, size, sig_def, sig)
+
+func get_value_y(uv : Vector2, pseed : int) -> Color:
+ var sig_def : float = sigma.get_default_value(uv)
+ var sig : float = sigma.get_value(uv)
+
+ return gaussian_blur_y(uv, size, sig_def, sig)
+
+func get_value_y_img(uv : Vector2, pseed : int) -> Color:
+ var sig_def : float = sigma.get_default_value(uv)
+ var sig : float = sigma.get_value(uv)
+
+ return gaussian_blur_y_img(uv, size, sig_def, sig)
+
+func get_direction() -> int:
+ return direction
+
+func set_direction(val : int) -> void:
+ direction = val
+
+ set_dirty(true)
+
+#----------------------
+#gaussian_blur_x.mmg
+
+#vec4 $(name)_fct(vec2 uv) {
+# float e = 1.0 / $size;
+# vec4 rv = vec4(0.0);
+# float sum = 0.0;
+# float sigma = max(0.000001, $sigma * $amount(uv));
+#
+# for (float i = -50.0; i <= 50.0; i += 1.0) {
+# float coef = exp(-0.5 * (pow(i / sigma, 2.0))) / (6.28318530718 * sigma * sigma);
+# rv += $in(uv+vec2(i*e, 0.0))*coef;
+# sum += coef;
+# }
+#
+# return rv/sum;
+#}
+
+func gaussian_blur_x(uv : Vector2, psize : float, psigma : float, pamount : float) -> Color:
+ var e : float = 1.0 / psize
+ var rv : Color = Color()
+ var sum : float = 0.0
+ var sigma : float = max(0.000001, psigma * pamount)#pamount(uv))
+
+ var i : float = -50
+
+ while i <= 50: #for (float i = -50.0; i <= 50.0; i += 1.0) {
+ var coef : float = exp(-0.5 * (pow(i / sigma, 2.0))) / (6.28318530718 * sigma * sigma)
+ rv += input.get_value(uv + Vector2(i*e, 0.0)) * coef
+ sum += coef
+
+ i += 1
+
+ return rv / sum;
+
+
+#----------------------
+#gaussian_blur_y.mmg
+
+#vec4 $(name)_fct(vec2 uv) {
+# float e = 1.0/$size;
+# vec4 rv = vec4(0.0);
+# float sum = 0.0;
+# float sigma = max(0.000001, $sigma*$amount(uv));
+# for (float i = -50.0; i <= 50.0; i += 1.0) {
+# float coef = exp(-0.5 * (pow(i / sigma, 2.0))) / (6.28318530718*sigma*sigma);
+# rv += $in(uv+vec2(0.0, i*e))*coef;
+# sum += coef;
+# }
+#
+# return rv/sum;
+#}
+
+func gaussian_blur_y(uv : Vector2, psize : float, psigma : float, pamount : float) -> Color:
+ var e : float = 1.0 / psize
+ var rv : Color = Color()
+ var sum : float = 0.0
+ var sigma : float = max(0.000001, psigma * pamount)#pamount(uv))
+
+ var i : float = -50
+
+ while i <= 50: #for (float i = -50.0; i <= 50.0; i += 1.0) {
+ var coef : float = exp(-0.5 * (pow(i / sigma, 2.0))) / (6.28318530718 * sigma * sigma)
+ rv += input.get_value(uv + Vector2(0.0, i * e)) * coef
+ sum += coef
+
+ i += 1
+
+ return rv / sum;
+
+
+func gaussian_blur_y_img(uv : Vector2, psize : float, psigma : float, pamount : float) -> Color:
+ var e : float = 1.0 / psize
+ var rv : Color = Color()
+ var sum : float = 0.0
+ var sigma : float = max(0.000001, psigma * pamount)#pamount(uv))
+
+ var i : float = -50
+
+ while i <= 50: #for (float i = -50.0; i <= 50.0; i += 1.0) {
+ var coef : float = exp(-0.5 * (pow(i / sigma, 2.0))) / (6.28318530718 * sigma * sigma)
+ rv += image.get_value(uv + Vector2(0.0, i * e)) * coef
+ sum += coef
+
+ i += 1
+
+ return rv / sum;
diff --git a/modules/material_maker/mat_maker_gd/nodes/filter/brightness_contrast.gd b/modules/material_maker/mat_maker_gd/nodes/filter/brightness_contrast.gd
new file mode 100644
index 000000000..b22db913d
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/filter/brightness_contrast.gd
@@ -0,0 +1,64 @@
+tool
+extends MMNode
+
+var Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var Filter = preload("res://addons/mat_maker_gd/nodes/common/filter.gd")
+
+export(Resource) var image : Resource
+export(Resource) var input : Resource
+export(float) var brightness : float = 0
+export(float) var contrast : float = 1
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ input.set_default_value(Color(0, 0, 0, 1))
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input1 "
+
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ #image.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+ #image.force_override = true
+
+ register_input_property(input)
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_float("get_brightness", "set_brightness", "Brightness", 0.01)
+ mm_graph_node.add_slot_float("get_contrast", "set_contrast", "Contrast", 0.01)
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ var c : Color = input.get_value(uv)
+
+ return Filter.brightness_contrast(c, brightness, contrast)
+
+#brightness
+func get_brightness() -> float:
+ return brightness
+
+func set_brightness(val : float) -> void:
+ brightness = val
+
+ set_dirty(true)
+
+#contrast
+func get_contrast() -> float:
+ return contrast
+
+func set_contrast(val : float) -> void:
+ contrast = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/filter/colorize.gd b/modules/material_maker/mat_maker_gd/nodes/filter/colorize.gd
new file mode 100644
index 000000000..52fdb811f
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/filter/colorize.gd
@@ -0,0 +1,55 @@
+tool
+extends "res://addons/mat_maker_gd/nodes/bases/gradient_base.gd"
+
+var Gradients = preload("res://addons/mat_maker_gd/nodes/common/gradients.gd")
+
+export(Resource) var image : Resource
+export(Resource) var input : Resource
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+ input.set_default_value(1)
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input1 "
+
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ #image.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+ #image.force_override = true
+
+ register_input_property(input)
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_gradient()
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ var f : float = input.get_value(uv)
+
+ return get_gradient_color(f)
+# return Color(0.5, 0.5, 0.5, 1)
+
+func get_gradient_color(x : float) -> Color:
+ if interpolation_type == 0:
+ return Gradients.gradient_type_1(x, points)
+ elif interpolation_type == 1:
+ return Gradients.gradient_type_2(x, points)
+ elif interpolation_type == 2:
+ return Gradients.gradient_type_3(x, points)
+ elif interpolation_type == 3:
+ return Gradients.gradient_type_4(x, points)
+
+ return Color(1, 1, 1, 1)
diff --git a/modules/material_maker/mat_maker_gd/nodes/filter/combine.gd b/modules/material_maker/mat_maker_gd/nodes/filter/combine.gd
new file mode 100644
index 000000000..326ea3732
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/filter/combine.gd
@@ -0,0 +1,78 @@
+tool
+extends MMNode
+
+var Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var Filter = preload("res://addons/mat_maker_gd/nodes/common/filter.gd")
+
+export(Resource) var image : Resource
+export(Resource) var input_r : Resource
+export(Resource) var input_g : Resource
+export(Resource) var input_b : Resource
+export(Resource) var input_a : Resource
+
+func _init_properties():
+ if !input_r:
+ input_r = MMNodeUniversalProperty.new()
+ input_r.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+ input_r.set_default_value(0)
+
+ input_r.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input_r.slot_name = ">>> R "
+
+ if !input_g:
+ input_g = MMNodeUniversalProperty.new()
+ input_g.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+ input_g.set_default_value(0)
+
+ input_g.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input_g.slot_name = ">>> G "
+
+ if !input_b:
+ input_b = MMNodeUniversalProperty.new()
+ input_b.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+ input_b.set_default_value(0)
+
+ input_b.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input_b.slot_name = ">>> B "
+
+ if !input_a:
+ input_a = MMNodeUniversalProperty.new()
+ input_a.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+ input_a.set_default_value(1)
+
+ input_a.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input_a.slot_name = ">>> A "
+
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ #image.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+ #image.force_override = true
+
+ register_input_property(input_r)
+ register_input_property(input_g)
+ register_input_property(input_b)
+ register_input_property(input_a)
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input_r)
+ mm_graph_node.add_slot_label_universal(input_g)
+ mm_graph_node.add_slot_label_universal(input_b)
+ mm_graph_node.add_slot_label_universal(input_a)
+ mm_graph_node.add_slot_texture_universal(image)
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ var r : float = input_r.get_value(uv)
+ var g : float = input_g.get_value(uv)
+ var b : float = input_b.get_value(uv)
+ var a : float = input_a.get_value(uv)
+
+ return Color(r, g, b, a)
diff --git a/modules/material_maker/mat_maker_gd/nodes/filter/decompose.gd b/modules/material_maker/mat_maker_gd/nodes/filter/decompose.gd
new file mode 100644
index 000000000..5dd5be90c
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/filter/decompose.gd
@@ -0,0 +1,104 @@
+tool
+extends MMNode
+
+var Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var NoiseVoronoi = preload("res://addons/mat_maker_gd/nodes/common/noise_voronoi.gd")
+
+export(Resource) var input : Resource
+export(Resource) var out_r : Resource
+export(Resource) var out_g : Resource
+export(Resource) var out_b : Resource
+export(Resource) var out_a : Resource
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ input.set_default_value(Color(0, 0, 0, 1))
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input "
+
+ if !out_r:
+ out_r = MMNodeUniversalProperty.new()
+ out_r.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ out_r.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !out_g:
+ out_g = MMNodeUniversalProperty.new()
+ out_g.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ out_g.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !out_b:
+ out_b = MMNodeUniversalProperty.new()
+ out_b.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ out_b.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !out_a:
+ out_a = MMNodeUniversalProperty.new()
+ out_a.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ out_a.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ register_input_property(input)
+ register_output_property(out_r)
+ register_output_property(out_g)
+ register_output_property(out_b)
+ register_output_property(out_a)
+
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_texture_universal(out_r)
+ mm_graph_node.add_slot_texture_universal(out_g)
+ mm_graph_node.add_slot_texture_universal(out_b)
+ mm_graph_node.add_slot_texture_universal(out_a)
+
+
+func _render(material) -> void:
+ var img_r : Image = Image.new()
+ var img_g : Image = Image.new()
+ var img_b : Image = Image.new()
+ var img_a : Image = Image.new()
+
+ img_r.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+ img_g.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+ img_b.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+ img_a.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+
+ img_r.lock()
+ img_g.lock()
+ img_b.lock()
+ img_a.lock()
+
+ var w : float = material.image_size.x
+ var h : float = material.image_size.y
+
+ var pseed : float = randf() + randi()
+
+ for x in range(material.image_size.x):
+ for y in range(material.image_size.y):
+ var uv : Vector2 = Vector2(x / w, y / h)
+
+ var c : Color = input.get_value(uv)
+
+ img_r.set_pixel(x, y, Color(c.r, c.r, c.r, 1))
+ img_g.set_pixel(x, y, Color(c.g, c.g, c.g, 1))
+ img_b.set_pixel(x, y, Color(c.b, c.b, c.b, 1))
+ img_a.set_pixel(x, y, Color(c.a, c.a, c.a, c.a))
+
+ img_r.unlock()
+ img_g.unlock()
+ img_b.unlock()
+ img_a.unlock()
+
+ out_r.set_value(img_r)
+ out_g.set_value(img_g)
+ out_b.set_value(img_b)
+ out_a.set_value(img_a)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ return Color()
diff --git a/modules/material_maker/mat_maker_gd/nodes/filter/emboss.gd b/modules/material_maker/mat_maker_gd/nodes/filter/emboss.gd
new file mode 100644
index 000000000..12693713e
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/filter/emboss.gd
@@ -0,0 +1,112 @@
+tool
+extends MMNode
+
+var Filter = preload("res://addons/mat_maker_gd/nodes/common/filter.gd")
+
+export(Resource) var image : Resource
+export(Resource) var input : Resource
+export(float) var angle : float = 0
+export(float) var amount : float = 5
+export(float) var width : float = 1
+
+var size : int = 0
+
+func _init_properties():
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+ input.set_default_value(1)
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input1 "
+
+ register_input_property(input)
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_label_universal(input)
+
+ mm_graph_node.add_slot_float("get_angle", "set_angle", "Angle", 0.1)
+ mm_graph_node.add_slot_float("get_amount", "set_amount", "Amount", 0.1)
+ mm_graph_node.add_slot_float("get_width", "set_width", "Width", 1)
+
+
+func _render(material) -> void:
+ size = max(material.image_size.x, material.image_size.y)
+
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ var f : float = 0
+
+ f = emboss(uv, size, angle, amount, width)
+
+ return Color(f, f, f, 1)
+
+func get_angle() -> float:
+ return angle
+
+func set_angle(val : float) -> void:
+ angle = val
+
+ set_dirty(true)
+
+func get_amount() -> float:
+ return amount
+
+func set_amount(val : float) -> void:
+ amount = val
+
+ set_dirty(true)
+
+func get_width() -> float:
+ return width
+
+func set_width(val : float) -> void:
+ width = val
+
+ set_dirty(true)
+
+#float $(name)_fct(vec2 uv) {
+# float pixels = max(1.0, $width);
+# float e = 1.0/$size;
+# float rv = 0.0;
+#
+# for (float dx = -pixels; dx <= pixels; dx += 1.0) {
+# for (float dy = -pixels; dy <= pixels; dy += 1.0) {
+# if (abs(dx) > 0.5 || abs(dy) > 0.5) {
+# rv += $in(uv+e*vec2(dx, dy))*cos(atan(dy, dx)-$angle*3.14159265359/180.0)/length(vec2(dx, dy));
+# }
+# }
+# }
+#
+# return $amount*rv/pixels+0.5;
+#}
+
+func emboss(uv : Vector2, psize : float, pangle : float, pamount : float, pwidth : float) -> float:
+ var pixels : float = max(1.0, pwidth)
+ var e : float = 1.0 / psize
+ var rv : float = 0.0
+
+ var dx : float = -pixels
+ var dy : float = -pixels
+
+ while dx <= pixels: #for (float dx = -pixels; dx <= pixels; dx += 1.0) {
+ while dy <= pixels: #for (float dy = -pixels; dy <= pixels; dy += 1.0) {
+ if (abs(dx) > 0.5 || abs(dy) > 0.5):
+ rv += input.get_value(uv + e * Vector2(dx, dy)) * cos(atan2(dy, dx) - pangle * 3.14159265359 / 180.0) / Vector2(dx, dy).length()
+
+ dx += 1
+ dy += 1
+
+ return pamount * rv / pixels + 0.5
+
diff --git a/modules/material_maker/mat_maker_gd/nodes/filter/fill_channel.gd b/modules/material_maker/mat_maker_gd/nodes/filter/fill_channel.gd
new file mode 100644
index 000000000..53a516907
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/filter/fill_channel.gd
@@ -0,0 +1,72 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var Filter = preload("res://addons/mat_maker_gd/nodes/common/filter.gd")
+
+export(Resource) var image : Resource
+export(Resource) var input : Resource
+export(Resource) var value : Resource
+export(int, "R,G,B,A") var channel : int = 3
+
+func _init_properties():
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ input.set_default_value(Color())
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input1 "
+
+ if !value:
+ value = MMNodeUniversalProperty.new()
+ value.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+ value.set_default_value(1)
+
+ value.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ value.value_step = 0.01
+ value.value_range = Vector2(0, 1)
+
+ register_input_property(input)
+ register_output_property(image)
+ register_input_property(value)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_float_universal(value)
+ mm_graph_node.add_slot_enum("get_channel", "set_channel", "Channel", [ "R", "G", "B", "A" ])
+
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ var col : Color = input.get_value(uv)
+
+ if channel == 0:
+ col.r = value.get_value(uv)
+ if channel == 1:
+ col.g = value.get_value(uv)
+ if channel == 2:
+ col.b = value.get_value(uv)
+ if channel == 3:
+ col.a = value.get_value(uv)
+
+ return col
+
+func get_channel() -> int:
+ return channel
+
+func set_channel(val : int) -> void:
+ channel = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/filter/fill_to_color.gd b/modules/material_maker/mat_maker_gd/nodes/filter/fill_to_color.gd
new file mode 100644
index 000000000..3f660f286
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/filter/fill_to_color.gd
@@ -0,0 +1,70 @@
+tool
+extends MMNode
+
+var Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var Fills = preload("res://addons/mat_maker_gd/nodes/common/fills.gd")
+
+export(Resource) var image : Resource
+export(Resource) var input : Resource
+export(Resource) var color_map : Resource
+export(Color) var edge_color : Color = Color(1, 1, 1, 1)
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ input.set_default_value(Color(0, 0, 0, 1))
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input "
+
+ if !color_map:
+ color_map = MMNodeUniversalProperty.new()
+ color_map.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ color_map.set_default_value(Color(1, 1, 1, 1))
+
+ color_map.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ color_map.slot_name = ">>> Color Map "
+
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ #image.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+ #image.force_override = true
+
+ register_input_property(input)
+ register_input_property(color_map)
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_label_universal(color_map)
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_color("get_edge_color", "set_edge_color")
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ #vec4 $(name_uv)_bb = $in($uv);
+ var c : Color = input.get_value(uv)
+
+ #mix($edgecolor, $map(fract($(name_uv)_bb.xy+0.5*$(name_uv)_bb.zw)), step(0.0000001, dot($(name_uv)_bb.zw, vec2(1.0))))
+
+ var rc : Color = color_map.get_value(Commons.fractv2(Vector2(c.r, c.g) + 0.5 * Vector2(c.b, c.a)))
+ var s : float = Commons.step(0.0000001, Vector2(c.b, c.a).dot(Vector2(1, 1)))
+
+ return lerp(edge_color, rc, s)
+
+#edge_color
+func get_edge_color() -> Color:
+ return edge_color
+
+func set_edge_color(val : Color) -> void:
+ edge_color = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/filter/fill_to_position.gd b/modules/material_maker/mat_maker_gd/nodes/filter/fill_to_position.gd
new file mode 100644
index 000000000..69eded485
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/filter/fill_to_position.gd
@@ -0,0 +1,68 @@
+tool
+extends MMNode
+
+var Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var Transforms = preload("res://addons/mat_maker_gd/nodes/common/transforms.gd")
+
+export(Resource) var image : Resource
+export(Resource) var input : Resource
+export(int, "X,Y,Radial") var axis : int = 2
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ input.set_default_value(Color(0, 0, 0, 1))
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input "
+
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ #image.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+ #image.force_override = true
+
+ register_input_property(input)
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_enum("get_axis", "set_axis", "Axis", [ "X", "Y", "Radial" ])
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ var c : Color = input.get_value(uv)
+ #vec2 $(name_uv)_c = fract($in($uv).xy+0.5*$in($uv).zw);
+ var cnv : Vector2 = Commons.fractv2(Vector2(c.r, c.g) + 0.5 * Vector2(c.b, c.a))
+
+ #X, $(name_uv)_c.x
+ #Y, $(name_uv)_c.y
+ #Radial, length($(name_uv)_c-vec2(0.5))
+
+ if axis == 0:
+ return Color(cnv.x, cnv.x, cnv.x, 1)
+ elif axis == 1:
+ return Color(cnv.y, cnv.y, cnv.y, 1)
+ elif axis == 2:
+ var f : float = (cnv - Vector2(0.5, 0.5)).length()
+
+ return Color(f, f, f, 1)
+
+ return Color(0, 0, 0, 1)
+
+#axis
+func get_axis() -> int:
+ return axis
+
+func set_axis(val : int) -> void:
+ axis = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/filter/fill_to_random_color.gd b/modules/material_maker/mat_maker_gd/nodes/filter/fill_to_random_color.gd
new file mode 100644
index 000000000..3360a29e5
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/filter/fill_to_random_color.gd
@@ -0,0 +1,61 @@
+tool
+extends MMNode
+
+var Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var Fills = preload("res://addons/mat_maker_gd/nodes/common/fills.gd")
+
+export(Resource) var image : Resource
+export(Resource) var input : Resource
+export(Color) var edge_color : Color = Color(1, 1, 1, 1)
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ input.set_default_value(Color(0, 0, 0, 1))
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input "
+
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ #image.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+ #image.force_override = true
+
+ register_input_property(input)
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_color("get_edge_color", "set_edge_color")
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ #vec4 $(name_uv)_bb = $in($uv);
+ var c : Color = input.get_value(uv)
+
+ #mix($edgecolor.rgb, rand3(vec2(float($seed), rand(vec2(rand($(name_uv)_bb.xy), rand($(name_uv)_bb.zw))))), step(0.0000001, dot($(name_uv)_bb.zw, vec2(1.0))))
+
+ var r1 : float = Commons.rand(Vector2(c.r, c.g))
+ var r2 : float = Commons.rand(Vector2(c.b, c.a))
+ var s : float = Commons.step(0.0000001, Vector2(c.b, c.a).dot(Vector2(1, 1)))
+
+ var f : Vector3 = lerp(Vector3(edge_color.r, edge_color.g, edge_color.b), Commons.rand3(Vector2(1.0 / float(pseed), Commons.rand(Vector2(r1, r2)))), s)
+ return Color(f.x, f.y, f.z, 1)
+
+#edge_color
+func get_edge_color() -> Color:
+ return edge_color
+
+func set_edge_color(val : Color) -> void:
+ edge_color = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/filter/fill_to_random_grey.gd b/modules/material_maker/mat_maker_gd/nodes/filter/fill_to_random_grey.gd
new file mode 100644
index 000000000..53e7c4da3
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/filter/fill_to_random_grey.gd
@@ -0,0 +1,60 @@
+tool
+extends MMNode
+
+var Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var Fills = preload("res://addons/mat_maker_gd/nodes/common/fills.gd")
+
+export(Resource) var image : Resource
+export(Resource) var input : Resource
+export(float) var edge_color : float = 1
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ input.set_default_value(Color(0, 0, 0, 1))
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input "
+
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ #image.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+ #image.force_override = true
+
+ register_input_property(input)
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_float("get_edge_color", "set_edge_color", "Edge color", 0.01)
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ #vec4 $(name_uv)_bb = $in($uv);
+ var c : Color = input.get_value(uv)
+
+ #mix($edgecolor, rand(vec2(float($seed), rand(vec2(rand($(name_uv)_bb.xy), rand($(name_uv)_bb.zw))))), step(0.0000001, dot($(name_uv)_bb.zw, vec2(1.0))))
+ var r1 : float = Commons.rand(Vector2(c.r, c.g))
+ var r2 : float = Commons.rand(Vector2(c.b, c.a))
+ var s : float = Commons.step(0.0000001, Vector2(c.b, c.a).dot(Vector2(1, 1)))
+
+ var f : float = lerp(edge_color, Commons.rand(Vector2(1.0 / float(pseed), Commons.rand(Vector2(r1, r2)))), s)
+ return Color(f, f, f, 1)
+
+#edge_color
+func get_edge_color() -> float:
+ return edge_color
+
+func set_edge_color(val : float) -> void:
+ edge_color = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/filter/fill_to_size.gd b/modules/material_maker/mat_maker_gd/nodes/filter/fill_to_size.gd
new file mode 100644
index 000000000..edfe95d33
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/filter/fill_to_size.gd
@@ -0,0 +1,70 @@
+tool
+extends MMNode
+
+var Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var Fills = preload("res://addons/mat_maker_gd/nodes/common/fills.gd")
+
+export(Resource) var image : Resource
+export(Resource) var input : Resource
+export(int, "Area,Width,Height,Max(W,H)") var formula : int = 0
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ input.set_default_value(Color(0, 0, 0, 1))
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input "
+
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ #image.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+ #image.force_override = true
+
+ register_input_property(input)
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_enum("get_formula", "set_formula", "Formula", [ "Area", "Width", "Height", "Max(W,H)" ])
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ #vec4 $(name_uv)_bb = $in($uv);
+ var c : Color = input.get_value(uv)
+
+ var f : float = 0
+
+ #"Area" sqrt($(name_uv)_bb.z*$(name_uv)_bb.w)
+ #"Width" $(name_uv)_bb.z
+ #"Height" $(name_uv)_bb.w
+ #"max(W, H)" max($(name_uv)_bb.z, $(name_uv)_bb.w)
+
+ if formula == 0:
+ f = sqrt(c.b * c.a)
+ elif formula == 1:
+ f = c.b
+ elif formula == 2:
+ f = c.a
+ elif formula == 3:
+ f = max(c.b, c.a)
+
+ return Color(f, f, f, 1)
+
+#formula
+func get_formula() -> int:
+ return formula
+
+func set_formula(val : int) -> void:
+ formula = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/filter/fill_to_uv.gd b/modules/material_maker/mat_maker_gd/nodes/filter/fill_to_uv.gd
new file mode 100644
index 000000000..63db51978
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/filter/fill_to_uv.gd
@@ -0,0 +1,62 @@
+tool
+extends MMNode
+
+var Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var Fills = preload("res://addons/mat_maker_gd/nodes/common/fills.gd")
+
+export(Resource) var image : Resource
+export(Resource) var input : Resource
+export(int, "Stretch,Square") var mode : int = 0
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ input.set_default_value(Color(0, 0, 0, 1))
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input "
+
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ #image.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+ #image.force_override = true
+
+ register_input_property(input)
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_enum("get_mode", "set_mode", "Mode", [ "Stretch", "Square" ])
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ #vec4 $(name_uv)_bb = $in($uv);
+ var c : Color = input.get_value(uv)
+
+ #fill_to_uv_$mode($uv, $(name_uv)_bb, float($seed))
+ var r : Vector3 = Vector3()
+
+ if mode == 0:
+ r = Fills.fill_to_uv_stretch(uv, c, float(pseed))
+ elif mode == 1:
+ r = Fills.fill_to_uv_square(uv, c, float(pseed))
+
+ return Color(r.x, r.y, r.z, 1)
+
+#mode
+func get_mode() -> int:
+ return mode
+
+func set_mode(val : int) -> void:
+ mode = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/filter/greyscale.gd b/modules/material_maker/mat_maker_gd/nodes/filter/greyscale.gd
new file mode 100644
index 000000000..cc95b1e77
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/filter/greyscale.gd
@@ -0,0 +1,66 @@
+tool
+extends MMNode
+
+var Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var Filter = preload("res://addons/mat_maker_gd/nodes/common/filter.gd")
+
+export(Resource) var image : Resource
+export(Resource) var input : Resource
+export(int, "Lightness,Average,Luminosity,Min,Max") var type : int = 2
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ input.set_default_value(Color(0, 0, 0, 1))
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input1 "
+
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ #image.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+ #image.force_override = true
+
+ register_input_property(input)
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_enum("get_type", "set_type", "Type", [ "Lightness", "Average", "Luminosity", "Min", "Max" ])
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ var c : Color = input.get_value(uv)
+
+ var f : float = 0
+
+ if type == 0:
+ f = Filter.grayscale_lightness(Vector3(c.r, c.g, c.b))
+ elif type == 1:
+ f = Filter.grayscale_average(Vector3(c.r, c.g, c.b))
+ elif type == 2:
+ f = Filter.grayscale_luminosity(Vector3(c.r, c.g, c.b))
+ elif type == 3:
+ f = Filter.grayscale_min(Vector3(c.r, c.g, c.b))
+ elif type == 4:
+ f = Filter.grayscale_max(Vector3(c.r, c.g, c.b))
+
+ return Color(f, f, f, c.a)
+
+#type
+func get_type() -> int:
+ return type
+
+func set_type(val : int) -> void:
+ type = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/filter/invert.gd b/modules/material_maker/mat_maker_gd/nodes/filter/invert.gd
new file mode 100644
index 000000000..994c7b768
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/filter/invert.gd
@@ -0,0 +1,42 @@
+tool
+extends MMNode
+
+var Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var Filter = preload("res://addons/mat_maker_gd/nodes/common/filter.gd")
+
+export(Resource) var image : Resource
+export(Resource) var input : Resource
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ input.set_default_value(Color(0, 0, 0, 1))
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input1 "
+
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ #image.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+ #image.force_override = true
+
+ register_input_property(input)
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_texture_universal(image)
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ var c : Color = input.get_value(uv)
+
+ return Filter.invert(c)
diff --git a/modules/material_maker/mat_maker_gd/nodes/filter/make_tileable.gd b/modules/material_maker/mat_maker_gd/nodes/filter/make_tileable.gd
new file mode 100644
index 000000000..1abeff8e6
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/filter/make_tileable.gd
@@ -0,0 +1,78 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var Filter = preload("res://addons/mat_maker_gd/nodes/common/filter.gd")
+
+export(Resource) var image : Resource
+export(Resource) var input : Resource
+export(float) var width : float = 0.1
+
+var size : int = 0
+
+func _init_properties():
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ input.set_default_value(Color())
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input1 "
+
+ register_input_property(input)
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_label_universal(input)
+
+ mm_graph_node.add_slot_float("get_width", "set_width", "Width", 0.01)
+
+
+func _render(material) -> void:
+ size = max(material.image_size.x, material.image_size.y)
+
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ #make_tileable_$(name)($uv, 0.5*$w)
+ return make_tileable(uv, 0.5 * width)
+
+func get_width() -> float:
+ return width
+
+func set_width(val : float) -> void:
+ width = val
+
+ set_dirty(true)
+
+
+#----------------------
+#make_tileable.mmg
+
+#vec4 make_tileable_$(name)(vec2 uv, float w) {
+# vec4 a = $in(uv);
+# vec4 b = $in(fract(uv+vec2(0.5)));
+# float coef_ab = sin(1.57079632679*clamp((length(uv-vec2(0.5))-0.5+w)/w, 0.0, 1.0));
+# vec4 c = $in(fract(uv+vec2(0.25)));
+# float coef_abc = sin(1.57079632679*clamp((min(min(length(uv-vec2(0.0, 0.5)), length(uv-vec2(0.5, 0.0))), min(length(uv-vec2(1.0, 0.5)), length(uv-vec2(0.5, 1.0))))-w)/w, 0.0, 1.0));
+# return mix(c, mix(a, b, coef_ab), coef_abc);
+#}
+
+func make_tileable(uv : Vector2, w : float) -> Color:
+ var a: Color = input.get_value(uv);
+ var b : Color = input.get_value(Commons.fractv2(uv + Vector2(0.5, 0.5)));
+ var coef_ab : float = sin(1.57079632679 * clamp(((uv - Vector2(0.5, 0.5)).length() - 0.5 + w) / w, 0.0, 1.0));
+ var c: Color = input.get_value(Commons.fractv2(uv + Vector2(0.25, 0.25)));
+ var coef_abc : float = sin(1.57079632679 * clamp((min(min((uv - Vector2(0.0, 0.5)).length(), (uv - Vector2(0.5, 0.0)).length()), min((uv- Vector2(1.0, 0.5)).length(), (uv - Vector2(0.5, 1.0)).length())) - w) / w, 0.0, 1.0));
+
+ return lerp(c, lerp(a, b, coef_ab), coef_abc)
+
diff --git a/modules/material_maker/mat_maker_gd/nodes/filter/math.gd b/modules/material_maker/mat_maker_gd/nodes/filter/math.gd
new file mode 100644
index 000000000..56defca95
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/filter/math.gd
@@ -0,0 +1,151 @@
+tool
+extends MMNode
+
+var Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var Fills = preload("res://addons/mat_maker_gd/nodes/common/fills.gd")
+
+export(Resource) var image : Resource
+export(Resource) var a : Resource
+export(Resource) var b : Resource
+export(Resource) var output : Resource
+
+export(int, "A+B,A-B,A*B,A/B,log(A),log2(A),pow(A; B),abs(A),round(A),floor(A),ceil(A),trunc(A),fract(A),min(A; B),max(A; B),A void:
+ mm_graph_node.add_slot_label_universal(a)
+ mm_graph_node.add_slot_label_universal(b)
+ mm_graph_node.add_slot_label_universal(output)
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_enum("get_operation", "set_operation", "Operation", [ "A+B", "A-B", "A*B", "A/B", "log(A)", "log2(A)", "pow(A, B)", "abs(A)", "round(A)", "floor(A)", "ceil(A)", "trunc(A)", "fract(A)", "min(A, B)", "max(A, B)", "A float:
+ var af : float = a.get_value(uv)
+ var bf : float = b.get_value(uv)
+
+ var f : float = 0
+
+ if operation == 0:#"A+B",
+ f = af + bf
+ elif operation == 1:#"A-B",
+ f = af - bf
+ elif operation == 2:#"A*B",
+ f = af * bf
+ elif operation == 3:#"A/B",
+ if bf == 0:
+ bf = 0.000001
+ f = af / bf
+ elif operation == 4:#"log(A)",
+ #todo needs to be implemented
+ f = log(af)
+ elif operation == 5:#"log2(A)",
+ #todo needs to be implemented
+ f = log(af)
+ elif operation == 6:#"pow(A, B)",
+ f = pow(af, bf)
+ elif operation == 7:#"abs(A)",
+ f = abs(af)
+ elif operation == 8:#"round(A)",
+ f = round(af)
+ elif operation == 9:#"floor(A)",
+ f = floor(af)
+ elif operation == 10:#"ceil(A)",
+ f = ceil(af)
+ elif operation == 11:#"trunc(A)",
+ f = int(af)
+ elif operation == 12:#"fract(A)",
+ f = Commons.fractf(af)
+ elif operation == 13:#"min(A, B)",
+ f = min(af, bf)
+ elif operation == 14:#"max(A, B)",
+ f = max(af, bf)
+ elif operation == 15:#"A void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ var f : float = get_property_value(uv)
+
+ return Color(f, f, f, 1)
+
+#operation
+func get_operation() -> int:
+ return operation
+
+func set_operation(val : int) -> void:
+ operation = val
+
+ set_dirty(true)
+ output.emit_changed()
+
+#clamp_result
+func get_clamp_result() -> bool:
+ return clamp_result
+
+func set_clamp_result(val : bool) -> void:
+ clamp_result = val
+
+ set_dirty(true)
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/filter/quantize.gd b/modules/material_maker/mat_maker_gd/nodes/filter/quantize.gd
new file mode 100644
index 000000000..a86b4c5f6
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/filter/quantize.gd
@@ -0,0 +1,56 @@
+tool
+extends MMNode
+
+var Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var Filter = preload("res://addons/mat_maker_gd/nodes/common/filter.gd")
+
+export(Resource) var image : Resource
+export(Resource) var input : Resource
+export(int) var steps : int = 4
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ input.set_default_value(Color(0, 0, 0, 1))
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input "
+
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ #image.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+ #image.force_override = true
+
+ register_input_property(input)
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_int("get_steps", "set_steps", "Steps")
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ var c : Color = input.get_value(uv)
+
+ #vec4(floor($in($uv).rgb*$steps)/$steps, $in($uv).a)
+ var v : Vector3 = Commons.floorv3(Vector3(c.r, c.g, c.b) * steps) / float(steps)
+
+ return Color(v.x, v.y, v.z, c.a)
+
+#steps
+func get_steps() -> int:
+ return steps
+
+func set_steps(val : int) -> void:
+ steps = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/filter/swap_channels.gd b/modules/material_maker/mat_maker_gd/nodes/filter/swap_channels.gd
new file mode 100644
index 000000000..eca84d12e
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/filter/swap_channels.gd
@@ -0,0 +1,111 @@
+tool
+extends MMNode
+
+var Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var Filter = preload("res://addons/mat_maker_gd/nodes/common/filter.gd")
+
+export(Resource) var image : Resource
+export(Resource) var input : Resource
+export(int, "0,1,R,-R,G,-G,B,-B,A,-A") var op_r : int = 2
+export(int, "0,1,R,-R,G,-G,B,-B,A,-A") var op_g : int = 4
+export(int, "0,1,R,-R,G,-G,B,-B,A,-A") var op_b : int = 6
+export(int, "0,1,R,-R,G,-G,B,-B,A,-A") var op_a : int = 8
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ input.set_default_value(Color(0, 0, 0, 1))
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input "
+
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ #image.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+ #image.force_override = true
+
+ register_input_property(input)
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_texture_universal(image)
+
+ mm_graph_node.add_slot_enum("get_op_r", "set_op_r", "R", [ "0", "1", "R", "-R", "G", "-G", "B", "-B", "A","-A" ])
+ mm_graph_node.add_slot_enum("get_op_g", "set_op_g", "G", [ "0", "1", "R", "-R", "G", "-G", "B", "-B", "A","-A" ])
+ mm_graph_node.add_slot_enum("get_op_b", "set_op_b", "B", [ "0", "1", "R", "-R", "G", "-G", "B", "-B", "A","-A" ])
+ mm_graph_node.add_slot_enum("get_op_a", "set_op_a", "A", [ "0", "1", "R", "-R", "G", "-G", "B", "-B", "A","-A" ])
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func apply(op : int, val : Color) -> float:
+ if op == 0:
+ return 0.0
+ elif op == 1:
+ return 1.0
+ elif op == 2:
+ return val.r
+ elif op == 3:
+ return 1.0 - val.r
+ elif op == 4:
+ return val.g
+ elif op == 5:
+ return 1.0 - val.g
+ elif op == 6:
+ return val.b
+ elif op == 7:
+ return 1.0 - val.b
+ elif op == 8:
+ return val.a
+ elif op == 9:
+ return 1.0 - val.a
+
+ return 0.0
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ var c : Color = input.get_value(uv)
+
+ return Color(apply(op_r, c), apply(op_g, c), apply(op_b, c), apply(op_a, c))
+
+#op_r
+func get_op_r() -> int:
+ return op_r
+
+func set_op_r(val : int) -> void:
+ op_r = val
+
+ set_dirty(true)
+
+#op_g
+func get_op_g() -> int:
+ return op_g
+
+func set_op_g(val : int) -> void:
+ op_g = val
+
+ set_dirty(true)
+
+#op_b
+func get_op_b() -> int:
+ return op_b
+
+func set_op_b(val : int) -> void:
+ op_b = val
+
+ set_dirty(true)
+
+#op_a
+func get_op_a() -> int:
+ return op_a
+
+func set_op_a(val : int) -> void:
+ op_a = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/filter/tonality.gd b/modules/material_maker/mat_maker_gd/nodes/filter/tonality.gd
new file mode 100644
index 000000000..66f1aba23
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/filter/tonality.gd
@@ -0,0 +1,50 @@
+tool
+extends "res://addons/mat_maker_gd/nodes/bases/curve_base.gd"
+
+var Curves = preload("res://addons/mat_maker_gd/nodes/common/curves.gd")
+
+export(Resource) var image : Resource
+export(Resource) var input : Resource
+
+func _init():
+ init_points_01()
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+ input.set_default_value(0)
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input "
+
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ #image.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+ #image.force_override = true
+
+ register_input_property(input)
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_curve()
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ var f : float = input.get_value(uv)
+
+ var cf : float = Curves.curve(f, points)
+
+ return Color(cf, cf, cf, 1)
+
+func _curve_changed() -> void:
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/gradient/circular_gradient.gd b/modules/material_maker/mat_maker_gd/nodes/gradient/circular_gradient.gd
new file mode 100644
index 000000000..1fc45b791
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/gradient/circular_gradient.gd
@@ -0,0 +1,60 @@
+tool
+extends "res://addons/mat_maker_gd/nodes/bases/gradient_base.gd"
+
+var Gradients = preload("res://addons/mat_maker_gd/nodes/common/gradients.gd")
+
+export(Resource) var image : Resource
+export(float) var repeat : float = 1
+
+func _init_properties():
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_float("get_repeat", "set_repeat", "repeat")
+ mm_graph_node.add_slot_gradient()
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ if interpolation_type == 0:
+ return Gradients.circular_gradient_type_1(uv, repeat, points)
+ elif interpolation_type == 1:
+ return Gradients.circular_gradient_type_2(uv, repeat, points)
+ elif interpolation_type == 2:
+ return Gradients.circular_gradient_type_3(uv, repeat, points)
+ elif interpolation_type == 3:
+ return Gradients.circular_gradient_type_4(uv, repeat, points)
+
+ return Color(1, 1, 1, 1)
+
+
+func get_gradient_color(x : float) -> Color:
+ if interpolation_type == 0:
+ return Gradients.gradient_type_1(x, points)
+ elif interpolation_type == 1:
+ return Gradients.gradient_type_2(x, points)
+ elif interpolation_type == 2:
+ return Gradients.gradient_type_3(x, points)
+ elif interpolation_type == 3:
+ return Gradients.gradient_type_4(x, points)
+
+ return Color(1, 1, 1, 1)
+
+func get_repeat() -> float:
+ return repeat
+
+func set_repeat(val : float) -> void:
+ repeat = val
+
+ set_dirty(true)
+
diff --git a/modules/material_maker/mat_maker_gd/nodes/gradient/gradient.gd b/modules/material_maker/mat_maker_gd/nodes/gradient/gradient.gd
new file mode 100644
index 000000000..6db5aff13
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/gradient/gradient.gd
@@ -0,0 +1,68 @@
+tool
+extends "res://addons/mat_maker_gd/nodes/bases/gradient_base.gd"
+
+var Gradients = preload("res://addons/mat_maker_gd/nodes/common/gradients.gd")
+
+export(Resource) var image : Resource
+export(float) var repeat : float = 1
+export(float) var rotate : float = 0
+
+func _init_properties():
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_float("get_repeat", "set_repeat", "repeat")
+ mm_graph_node.add_slot_float("get_rotate", "set_rotate", "rotate")
+ mm_graph_node.add_slot_gradient()
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ if interpolation_type == 0:
+ return Gradients.normal_gradient_type_1(uv, repeat, rotate, points)
+ elif interpolation_type == 1:
+ return Gradients.normal_gradient_type_2(uv, repeat, rotate, points)
+ elif interpolation_type == 2:
+ return Gradients.normal_gradient_type_3(uv, repeat, rotate, points)
+ elif interpolation_type == 3:
+ return Gradients.normal_gradient_type_4(uv, repeat, rotate, points)
+
+ return Color(1, 1, 1, 1)
+
+func get_gradient_color(x : float) -> Color:
+ if interpolation_type == 0:
+ return Gradients.gradient_type_1(x, points)
+ elif interpolation_type == 1:
+ return Gradients.gradient_type_2(x, points)
+ elif interpolation_type == 2:
+ return Gradients.gradient_type_3(x, points)
+ elif interpolation_type == 3:
+ return Gradients.gradient_type_4(x, points)
+
+ return Color(1, 1, 1, 1)
+
+func get_repeat() -> float:
+ return repeat
+
+func set_repeat(val : float) -> void:
+ repeat = val
+
+ set_dirty(true)
+
+func get_rotate() -> float:
+ return rotate
+
+func set_rotate(val : float) -> void:
+ rotate = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/gradient/radial_gradient.gd b/modules/material_maker/mat_maker_gd/nodes/gradient/radial_gradient.gd
new file mode 100644
index 000000000..76e84c562
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/gradient/radial_gradient.gd
@@ -0,0 +1,60 @@
+tool
+extends "res://addons/mat_maker_gd/nodes/bases/gradient_base.gd"
+
+var Gradients = preload("res://addons/mat_maker_gd/nodes/common/gradients.gd")
+
+export(Resource) var image : Resource
+export(float) var repeat : float = 1
+
+func _init_properties():
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_float("get_repeat", "set_repeat", "repeat")
+ mm_graph_node.add_slot_gradient()
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ if interpolation_type == 0:
+ return Gradients.radial_gradient_type_1(uv, repeat, points)
+ elif interpolation_type == 1:
+ return Gradients.radial_gradient_type_2(uv, repeat, points)
+ elif interpolation_type == 2:
+ return Gradients.radial_gradient_type_3(uv, repeat, points)
+ elif interpolation_type == 3:
+ return Gradients.radial_gradient_type_4(uv, repeat, points)
+
+ return Color(1, 1, 1, 1)
+
+
+func get_gradient_color(x : float) -> Color:
+ if interpolation_type == 0:
+ return Gradients.gradient_type_1(x, points)
+ elif interpolation_type == 1:
+ return Gradients.gradient_type_2(x, points)
+ elif interpolation_type == 2:
+ return Gradients.gradient_type_3(x, points)
+ elif interpolation_type == 3:
+ return Gradients.gradient_type_4(x, points)
+
+ return Color(1, 1, 1, 1)
+
+func get_repeat() -> float:
+ return repeat
+
+func set_repeat(val : float) -> void:
+ repeat = val
+
+ set_dirty(true)
+
diff --git a/modules/material_maker/mat_maker_gd/nodes/mm_material.gd b/modules/material_maker/mat_maker_gd/nodes/mm_material.gd
new file mode 100644
index 000000000..dd6a5d49a
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/mm_material.gd
@@ -0,0 +1,117 @@
+tool
+class_name MMMateial
+extends Resource
+
+#threads are implemented using my thread pool engine module.
+#if you want to use this without that module in your engine set this to false,
+#and comment out the lines that give errors
+const USE_THREADS = true
+
+export(Vector2) var image_size : Vector2 = Vector2(128, 128)
+export(Array) var nodes : Array
+
+var initialized : bool = false
+var rendering : bool = false
+var queued_render : bool = false
+var job : ThreadPoolExecuteJob = ThreadPoolExecuteJob.new()
+
+func initialize():
+ if !initialized:
+ initialized = true
+
+ job.setup(self, "_thread_func")
+
+ for n in nodes:
+ n.init_properties()
+ n.connect("changed", self, "on_node_changed")
+
+func add_node(node : MMNode) -> void:
+ nodes.append(node)
+
+ node.connect("changed", self, "on_node_changed")
+
+ emit_changed()
+
+func remove_node(node : MMNode) -> void:
+ if !node:
+ return
+
+ for op in node.output_properties:
+ for n in nodes:
+ if n:
+ for ip in n.input_properties:
+ if ip.input_property == op:
+ ip.set_input_property(null)
+
+ nodes.erase(node)
+
+ node.disconnect("changed", self, "on_node_changed")
+
+ emit_changed()
+
+func render() -> void:
+ initialize()
+
+ if rendering:
+ queued_render = true
+ return
+
+ if USE_THREADS:
+ render_threaded()
+ else:
+ render_non_threaded()
+
+func render_non_threaded() -> void:
+ var did_render : bool = true
+
+ while did_render:
+ did_render = false
+
+ for n in nodes:
+ if n && n.render(self):
+ did_render = true
+
+func render_threaded() -> void:
+ job.cancelled = false
+
+ if !ThreadPool.has_job(job):
+ ThreadPool.add_job(job)
+
+func _thread_func() -> void:
+ if job.cancelled:
+ rendering = false
+ return
+
+ rendering = true
+ job.cancelled = false
+
+ var did_render : bool = true
+
+ while did_render:
+ did_render = false
+
+ for n in nodes:
+ if n && n.render(self):
+ did_render = true
+
+ if job.cancelled:
+ rendering = false
+ return
+
+ rendering = false
+
+ if queued_render:
+ queued_render = false
+ _thread_func()
+
+func cancel_render_and_wait() -> void:
+ if rendering:
+ ThreadPool.cancel_job_wait(job)
+
+ job.cancelled = false
+
+ pass
+
+func on_node_changed() -> void:
+ emit_changed()
+ call_deferred("render")
diff --git a/modules/material_maker/mat_maker_gd/nodes/mm_node.gd b/modules/material_maker/mat_maker_gd/nodes/mm_node.gd
new file mode 100644
index 000000000..3c6a102a9
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/mm_node.gd
@@ -0,0 +1,121 @@
+tool
+class_name MMNode
+extends Resource
+
+export(Vector2) var graph_position : Vector2 = Vector2()
+
+var input_properties : Array
+var output_properties : Array
+
+var properties_initialized : bool = false
+
+var dirty : bool = true
+
+#MMMateial
+func render(material) -> bool:
+ if !dirty:
+ return false
+
+ for p in input_properties:
+ if p.input_property && p.input_property.owner.dirty:
+ return false
+
+ _render(material)
+
+ dirty = false
+
+ return true
+
+#MMMateial
+func _render(material) -> void:
+ pass
+
+func render_image(material) -> Image:
+ var image : Image = Image.new()
+ image.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+
+ image.lock()
+
+ var w : float = image.get_width()
+ var h : float = image.get_height()
+
+ var pseed : float = randf() + randi()
+
+ for x in range(image.get_width()):
+ for y in range(image.get_height()):
+ var v : Vector2 = Vector2(x / w, y / h)
+
+ var col : Color = get_value_for(v, pseed)
+
+ image.set_pixel(x, y, col)
+
+ image.unlock()
+
+ return image
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ return Color()
+
+func init_properties() -> void:
+ if !properties_initialized:
+ properties_initialized = true
+
+ _init_properties()
+
+func _init_properties() -> void:
+ pass
+
+func register_methods(mm_graph_node) -> void:
+ init_properties()
+ _register_methods(mm_graph_node)
+
+func _register_methods(mm_graph_node) -> void:
+ pass
+
+func get_graph_position() -> Vector2:
+ return graph_position
+
+func set_graph_position(pos : Vector2) -> void:
+ graph_position = pos
+
+ emit_changed()
+
+func register_input_property(prop : MMNodeUniversalProperty) -> void:
+ prop.owner = self
+
+ if !prop.is_connected("changed", self, "on_input_property_changed"):
+ prop.connect("changed", self, "on_input_property_changed")
+
+ input_properties.append(prop)
+
+func unregister_input_property(prop : MMNodeUniversalProperty) -> void:
+ if prop.owner == self:
+ prop.owner = null
+
+ if prop.is_connected("changed", self, "on_input_property_changed"):
+ prop.disconnect("changed", self, "on_input_property_changed")
+
+ input_properties.erase(prop)
+
+func register_output_property(prop : MMNodeUniversalProperty) -> void:
+ prop.owner = self
+
+ output_properties.append(prop)
+
+func unregister_output_property(prop : MMNodeUniversalProperty) -> void:
+ if prop.owner == self:
+ prop.owner = null
+
+ output_properties.erase(prop)
+
+func set_dirty(val : bool) -> void:
+ var changed : bool = val != dirty
+
+ dirty = val
+
+ if changed:
+ emit_changed()
+
+func on_input_property_changed() -> void:
+ set_dirty(true)
+ emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/mm_node_universal_property.gd b/modules/material_maker/mat_maker_gd/nodes/mm_node_universal_property.gd
new file mode 100644
index 000000000..68a7a7103
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/mm_node_universal_property.gd
@@ -0,0 +1,321 @@
+tool
+class_name MMNodeUniversalProperty
+extends Resource
+
+enum SlotTypes {
+ SLOT_TYPE_NONE = -1,
+ SLOT_TYPE_IMAGE = 0,
+ SLOT_TYPE_INT = 1,
+ SLOT_TYPE_FLOAT = 2,
+ SLOT_TYPE_VECTOR2 = 3,
+ SLOT_TYPE_VECTOR3 = 4,
+ SLOT_TYPE_COLOR = 5,
+ SLOT_TYPE_UNIVERSAL = 6,
+}
+
+enum MMNodeUniversalPropertyDefaultType {
+ DEFAULT_TYPE_INT = 0,
+ DEFAULT_TYPE_FLOAT = 1,
+ DEFAULT_TYPE_VECTOR2 = 2,
+ DEFAULT_TYPE_VECTOR3 = 3,
+ DEFAULT_TYPE_COLOR = 4,
+ DEFAULT_TYPE_IMAGE = 5,
+}
+
+export(int, "Int,Float,Vector2,Vector3,Color,Image") var default_type : int
+
+export(int) var default_int : int
+export(float) var default_float : float
+export(Vector2) var default_vector2 : Vector2
+export(Vector3) var default_vector3 : Vector3
+export(Color) var default_color : Color
+export(Image) var default_image : Image
+
+var get_value_from_owner : bool = false
+var force_override : bool = false
+#This is not exported on purpose!
+var override_image : Image
+
+#Should be a MMNodeUniversalProperty, but can't set it up like that
+export(Resource) var input_property : Resource
+
+var input_slot_type : int = SlotTypes.SLOT_TYPE_NONE
+var output_slot_type : int = SlotTypes.SLOT_TYPE_NONE
+var slot_name : String
+var value_step : float = 0.1
+var value_range : Vector2 = Vector2(-1000, 1000)
+
+#MMNode
+var owner
+
+func _init():
+ if input_property:
+ input_property.connect("changed", self, "on_input_property_changed")
+
+func get_value(uv : Vector2, skip_owner_val : bool = false):
+ if get_value_from_owner && !skip_owner_val:
+ return get_owner_value(uv)
+
+ if !input_property:
+ return get_default_value(uv)
+
+ if default_type == input_property.default_type:
+ return input_property.get_value(uv)
+
+ if default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_INT:
+ return to_int(input_property.get_value(uv))
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT:
+ return to_float(input_property.get_value(uv))
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2:
+ return to_vector2(input_property.get_value(uv))
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR3:
+ return to_vector3(input_property.get_value(uv))
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR:
+ return to_color(input_property.get_value(uv))
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE:
+ return to_color(input_property.get_value(uv))
+
+ return input_property.get_value(uv)
+
+func get_owner_value(uv : Vector2):
+ if default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_INT:
+ return to_int(owner.get_property_value(uv))
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT:
+ return to_float(owner.get_property_value(uv))
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2:
+ return to_vector2(owner.get_property_value(uv))
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR3:
+ return to_vector3(owner.get_property_value(uv))
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR:
+ return to_color(owner.get_property_value(uv))
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE:
+ return to_color(owner.get_property_value(uv))
+
+func get_value_or_zero(uv : Vector2, skip_owner_val : bool = false):
+ if get_value_from_owner && !skip_owner_val:
+ return get_owner_value(uv)
+
+ if !input_property:
+ return get_zero_value()
+
+ if default_type == input_property.default_type:
+ return input_property.get_value(uv)
+
+ if default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_INT:
+ return to_int(input_property.get_value(uv))
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT:
+ return to_float(input_property.get_value(uv))
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2:
+ return to_vector2(input_property.get_value(uv))
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR3:
+ return to_vector3(input_property.get_value(uv))
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR:
+ return to_color(input_property.get_value(uv))
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE:
+ return to_color(input_property.get_value(uv))
+
+ return input_property.get_value(uv)
+
+func get_value_sdf3d(uv3 : Vector3, skip_owner_val : bool = false) -> Vector2:
+ if get_value_from_owner && !skip_owner_val:
+ return owner.get_property_value_sdf3d(uv3)
+
+ if !input_property:
+ return default_vector2
+
+ return input_property.get_value_sdf3d(uv3)
+
+func to_int(val) -> int:
+ if val is int:
+ return val
+
+ if val is float:
+ return int(val)
+
+ if val is Vector2:
+ return int(val.x)
+
+ if val is Vector3:
+ return int(val.x)
+
+ if val is Color:
+ return int(val.r)
+
+ return 0
+
+func to_float(val) -> float:
+ if val is float:
+ return val
+
+ if val is int:
+ return float(val)
+
+ if val is Vector2:
+ return float(val.x)
+
+ if val is Vector3:
+ return float(val.x)
+
+ if val is Color:
+ return float(val.r)
+
+ return 0.0
+
+func to_vector2(val) -> Vector2:
+ if val is Vector2:
+ return val
+
+ if val is int:
+ return Vector2(val, val)
+
+ if val is float:
+ return Vector2(val, val)
+
+ if val is Vector3:
+ return Vector2(val.x, val.y)
+
+ if val is Color:
+ return Vector2(val.r, val.g)
+
+ return Vector2()
+
+func to_vector3(val) -> Vector3:
+ if val is Vector3:
+ return val
+
+ if val is int:
+ return Vector3(val, val, val)
+
+ if val is float:
+ return Vector3(val, val, val)
+
+ if val is Vector2:
+ return Vector3(val.x, val.y, 0)
+
+ if val is Color:
+ return Vector3(val.r, val.g, val.b)
+
+ return Vector3()
+
+func to_color(val) -> Color:
+ if val is Color:
+ return val
+
+ if val is int:
+ return Color(val, val, val, 1)
+
+ if val is float:
+ return Color(val, val, val, 1)
+
+ if val is Vector2:
+ return Color(val.x, val.y, 0, 1)
+
+ if val is Vector3:
+ return Color(val.x, val.y, val.z, 1)
+
+ return Color()
+
+func set_value(val):
+ if default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE:
+ override_image = val
+ emit_changed()
+ return
+
+ set_default_value(val)
+
+func get_zero_value():
+ if default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_INT:
+ return 0
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT:
+ return 0.0
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2:
+ return Vector2()
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR3:
+ return Vector3()
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR:
+ return Color()
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE:
+ return Color()
+
+ return null
+
+func get_default_value(uv : Vector2 = Vector2()):
+ if default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_INT:
+ return default_int
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT:
+ return default_float
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2:
+ return default_vector2
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR3:
+ return default_vector3
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR:
+ return default_color
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE:
+ var image : Image = default_image
+
+ if override_image:
+ image = override_image
+
+ if !image:
+ return default_color
+
+ image.lock()
+ var x : int = uv.x * image.get_width()
+ var y : int = uv.y * image.get_height()
+
+ x = clamp(x, 0, image.get_width() - 1)
+ y = clamp(y, 0, image.get_width() - 1)
+
+ var c : Color = image.get_pixel(x, y)
+ image.unlock()
+
+ return c
+
+ return null
+
+func set_default_value(val):
+ if default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_INT:
+ default_int = val
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT:
+ default_float = val
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2:
+ default_vector2 = val
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR3:
+ default_vector3 = val
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR:
+ default_color = val
+ elif default_type == MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE:
+ default_image = val
+
+ emit_changed()
+
+func get_active_image() -> Image:
+ if !force_override && input_property:
+ return input_property.get_active_image()
+
+ if override_image:
+ return override_image
+
+ return default_image
+
+func set_input_property(val : MMNodeUniversalProperty) -> void:
+ if input_property == val:
+ return
+
+ if input_property:
+ input_property.disconnect("changed", self, "on_input_property_changed")
+
+ input_property = val
+
+ if input_property:
+ input_property.connect("changed", self, "on_input_property_changed")
+
+ emit_changed()
+
+# Because in UndiRedo if you pass null as the only argument it will look
+# for a method with no arguments
+func unset_input_property() -> void:
+ set_input_property(null)
+
+func on_input_property_changed() -> void:
+ emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/noise/anisotropic_noise.gd b/modules/material_maker/mat_maker_gd/nodes/noise/anisotropic_noise.gd
new file mode 100644
index 000000000..2b278498f
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/noise/anisotropic_noise.gd
@@ -0,0 +1,60 @@
+tool
+extends MMNode
+
+var Noises = preload("res://addons/mat_maker_gd/nodes/common/noises.gd")
+
+export(Resource) var image : Resource
+
+export(Vector2) var scale : Vector2 = Vector2(4, 256)
+export(float) var smoothness : float = 1
+export(float) var interpolation : float = 1
+
+func _init_properties():
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_vector2("get_scale", "set_scale", "Scale", 1)#, Vector2(1, 10))
+ mm_graph_node.add_slot_float("get_smoothness", "set_smoothness", "Smoothness", 0.01)#, Vector2(0, 1))
+ mm_graph_node.add_slot_float("get_interpolation", "set_interpolation", "Interpolation", 0.01)#, Vector2(0, 1))
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ var ps : float = 1.0 / float(pseed)
+
+ #anisotropic($(uv), vec2($(scale_x), $(scale_y)), $(seed), $(smoothness), $(interpolation))
+ return Noises.anisotropicc(uv, scale, ps, smoothness, interpolation)
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_scale() -> Vector2:
+ return scale
+
+func set_scale(val : Vector2) -> void:
+ scale = val
+
+ set_dirty(true)
+
+func get_smoothness() -> float:
+ return smoothness
+
+func set_smoothness(val : float) -> void:
+ smoothness = val
+
+ set_dirty(true)
+
+func get_interpolation() -> float:
+ return interpolation
+
+func set_interpolation(val : float) -> void:
+ interpolation = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/noise/color_noise.gd b/modules/material_maker/mat_maker_gd/nodes/noise/color_noise.gd
new file mode 100644
index 000000000..d5dbdee39
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/noise/color_noise.gd
@@ -0,0 +1,52 @@
+tool
+extends MMNode
+
+var Noises = preload("res://addons/mat_maker_gd/nodes/common/noises.gd")
+
+export(Resource) var image : Resource
+
+export(int) var size : int = 8
+
+#----------------------
+#color_noise.mmg
+
+#Outputs:
+
+#Output - (rgb) - Shows the noise pattern
+#color_dots($(uv), 1.0/$(size), $(seed))
+
+#Inputs:
+#size, float, default: 8, min: 2, max: 12, step: 1
+
+
+func _init_properties():
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_int("get_size", "set_size", "Size")#, Vector2(1, 10))
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ var ps : float = 1.0 / float(pseed)
+
+ #color_dots($(uv), 1.0/$(size), $(seed))
+ return Noises.noise_color(uv, float(size), ps)
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_size() -> int:
+ return size
+
+func set_size(val : int) -> void:
+ size = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/noise/color_value.gd b/modules/material_maker/mat_maker_gd/nodes/noise/color_value.gd
new file mode 100644
index 000000000..97fff5417
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/noise/color_value.gd
@@ -0,0 +1,60 @@
+tool
+extends MMNode
+
+var NoisePerlin = preload("res://addons/mat_maker_gd/nodes/common/noise_perlin.gd")
+
+export(Resource) var image : Resource
+
+export(Vector2) var scale : Vector2 = Vector2(4, 4)
+export(int) var iterations : int = 3
+export(float) var persistence : float = 0.5
+
+func _init_properties():
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_vector2("get_scale", "set_scale", "Scale")#, Vector2(1, 10))
+ mm_graph_node.add_slot_int("get_iterations", "set_iterations", "Iterations")#, Vector2(0, 1))
+ mm_graph_node.add_slot_float("get_persistence", "set_persistence", "Persistence", 0.01)#, Vector2(0, 1))
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ var ps : float = 1.0 / float(pseed)
+
+ #perlin_color($(uv), vec2($(scale_x), $(scale_y)), int($(iterations)), $(persistence), $(seed))
+ return NoisePerlin.perlin_colorc(uv, scale, iterations, persistence, ps)
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_scale() -> Vector2:
+ return scale
+
+func set_scale(val : Vector2) -> void:
+ scale = val
+
+ set_dirty(true)
+
+func get_iterations() -> int:
+ return iterations
+
+func set_iterations(val : int) -> void:
+ iterations = val
+
+ set_dirty(true)
+
+func get_persistence() -> float:
+ return persistence
+
+func set_persistence(val : float) -> void:
+ persistence = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/noise/fbm_noise.gd b/modules/material_maker/mat_maker_gd/nodes/noise/fbm_noise.gd
new file mode 100644
index 000000000..036b9cb1f
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/noise/fbm_noise.gd
@@ -0,0 +1,99 @@
+tool
+extends MMNode
+
+var NoiseFBM = preload("res://addons/mat_maker_gd/nodes/common/noise_fbm.gd")
+
+export(Resource) var image : Resource
+
+export(int, "Value,Perlin,Simplex,Cellular1,Cellular2,Cellular3,Cellular4,Cellular5,Cellular6") var type : int = 0
+export(Vector2) var scale : Vector2 = Vector2(2, 2)
+export(int) var folds : int = 0
+export(int) var iterations : int = 5
+export(float) var persistence : float = 0.5
+
+func _init_properties():
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_enum("get_type", "set_type", "Type", [ "Value", "Perlin", "Simplex", "Cellular1", "Cellular2", "Cellular3", "Cellular4", "Cellular5", "Cellular6" ])#, Vector2(0, 1))
+ mm_graph_node.add_slot_vector2("get_scale", "set_scale", "Scale")#, Vector2(1, 10))
+ mm_graph_node.add_slot_int("get_folds", "set_folds", "folds")#, Vector2(0, 1))
+ mm_graph_node.add_slot_int("get_iterations", "set_iterations", "Iterations")#, Vector2(0, 1))
+ mm_graph_node.add_slot_float("get_persistence", "set_persistence", "Persistence", 0.01)#, Vector2(0, 1))
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ var ps : float = 1.0 / float(pseed)
+
+ #"Value,Perlin,Simplex,Cellular1,Cellular2,Cellular3,Cellular4,Cellular5,Cellular6"
+ if type == 0:
+ return NoiseFBM.fbmval(uv, scale, folds, iterations, persistence, ps)
+ elif type == 1:
+ return NoiseFBM.perlin(uv, scale, folds, iterations, persistence, ps)
+ elif type == 2:
+ return NoiseFBM.simplex(uv, scale, folds, iterations, persistence, ps)
+ elif type == 3:
+ return NoiseFBM.cellular(uv, scale, folds, iterations, persistence, ps)
+ elif type == 4:
+ return NoiseFBM.cellular2(uv, scale, folds, iterations, persistence, ps)
+ elif type == 5:
+ return NoiseFBM.cellular3(uv, scale, folds, iterations, persistence, ps)
+ elif type == 6:
+ return NoiseFBM.cellular4(uv, scale, folds, iterations, persistence, ps)
+ elif type == 7:
+ return NoiseFBM.cellular5(uv, scale, folds, iterations, persistence, ps)
+ elif type == 8:
+ return NoiseFBM.cellular6(uv, scale, folds, iterations, persistence, ps)
+
+ return Color()
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_type() -> int:
+ return type
+
+func set_type(val : int) -> void:
+ type = val
+
+ set_dirty(true)
+
+func get_scale() -> Vector2:
+ return scale
+
+func set_scale(val : Vector2) -> void:
+ scale = val
+
+ set_dirty(true)
+
+func get_folds() -> int:
+ return folds
+
+func set_folds(val : int) -> void:
+ folds = val
+
+ set_dirty(true)
+
+func get_iterations() -> int:
+ return iterations
+
+func set_iterations(val : int) -> void:
+ iterations = val
+
+ set_dirty(true)
+
+func get_persistence() -> float:
+ return persistence
+
+func set_persistence(val : float) -> void:
+ persistence = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/noise/noise.gd b/modules/material_maker/mat_maker_gd/nodes/noise/noise.gd
new file mode 100644
index 000000000..30e23eef2
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/noise/noise.gd
@@ -0,0 +1,52 @@
+tool
+extends MMNode
+
+var Noises = preload("res://addons/mat_maker_gd/nodes/common/noises.gd")
+
+export(Resource) var image : Resource
+
+export(int) var grid_size : int = 16
+export(float) var density : float = 0.5
+
+func _init_properties():
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_int("get_grid_size", "set_grid_size", "Grid Size")#, Vector2(1, 10))
+ mm_graph_node.add_slot_float("get_density", "set_density", "Density", 0.01)#, Vector2(0, 1))
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ var ps : float = 1.0 / float(pseed)
+
+ #return dots(uv, 1.0/$(size), $(density), $(seed));
+ var f : float = Noises.dots(uv, 1.0 / float(grid_size), density, ps)
+
+ return Color(f, f, f, 1)
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_grid_size() -> int:
+ return grid_size
+
+func set_grid_size(val : int) -> void:
+ grid_size = val
+
+ set_dirty(true)
+
+func get_density() -> float:
+ return density
+
+func set_density(val : float) -> void:
+ density = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/noise/voronoi.gd b/modules/material_maker/mat_maker_gd/nodes/noise/voronoi.gd
new file mode 100644
index 000000000..0c452391b
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/noise/voronoi.gd
@@ -0,0 +1,163 @@
+tool
+extends MMNode
+
+var Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var NoiseVoronoi = preload("res://addons/mat_maker_gd/nodes/common/noise_voronoi.gd")
+
+export(Resource) var out_nodes : Resource
+export(Resource) var out_borders : Resource
+export(Resource) var out_random_color : Resource
+export(Resource) var out_fill : Resource
+
+export(Vector2) var scale : Vector2 = Vector2(4, 4)
+export(Vector2) var stretch : Vector2 = Vector2(1, 1)
+export(float) var intensity : float = 1
+export(float) var randomness : float = 0.85
+
+func _init_properties():
+ if !out_nodes:
+ out_nodes = MMNodeUniversalProperty.new()
+ out_nodes.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ out_nodes.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !out_borders:
+ out_borders = MMNodeUniversalProperty.new()
+ out_borders.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ out_borders.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !out_random_color:
+ out_random_color = MMNodeUniversalProperty.new()
+ out_random_color.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ out_random_color.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !out_fill:
+ out_fill = MMNodeUniversalProperty.new()
+ out_fill.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ out_fill.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ register_output_property(out_nodes)
+ register_output_property(out_borders)
+ register_output_property(out_random_color)
+ register_output_property(out_fill)
+
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_texture_universal(out_nodes)
+ mm_graph_node.add_slot_texture_universal(out_borders)
+ mm_graph_node.add_slot_texture_universal(out_random_color)
+ mm_graph_node.add_slot_texture_universal(out_fill)
+
+ mm_graph_node.add_slot_vector2("get_scale", "set_scale", "Scale", 0.1)#, Vector2(1, 32))#, Vector2(0, 32))
+ mm_graph_node.add_slot_vector2("get_stretch", "set_stretch", "stretch", 0.01)#, Vector2(1, 32))#, Vector2(0, 32))
+ mm_graph_node.add_slot_float("get_intensity", "set_intensity", "Intensity", 0.01)#, Vector2(1, 32))#, Vector2(0, 32))
+ mm_graph_node.add_slot_float("get_randomness", "set_randomness", "Randomness", 0.01)#, Vector2(1, 32))#, Vector2(0, 32))
+
+
+
+
+func _render(material) -> void:
+ var nodes : Image = Image.new()
+ var borders : Image = Image.new()
+ var random_color : Image = Image.new()
+ var fill : Image = Image.new()
+
+ nodes.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+ borders.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+ random_color.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+ fill.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+
+ nodes.lock()
+ borders.lock()
+ random_color.lock()
+ fill.lock()
+
+ var w : float = material.image_size.x
+ var h : float = material.image_size.y
+
+ var pseed : float = randf() + randi()
+
+ for x in range(material.image_size.x):
+ for y in range(material.image_size.y):
+ var uv : Vector2 = Vector2(x / w, y / h)
+
+ var ps : float = 1.0 / float(pseed)
+
+ #vec4 $(name_uv)_xyzw = voronoi($uv, vec2($scale_x, $scale_y), vec2($stretch_y, $stretch_x), $intensity, $randomness, $seed);
+ var voronoi : Color = NoiseVoronoi.voronoi(uv, scale, stretch, intensity, randomness, ps)
+
+ #Nodes - float - A greyscale pattern based on the distance to cell centers
+ #$(name_uv)_xyzw.z
+ var nodes_col : Color = Color(voronoi.b, voronoi.b, voronoi.b, 1)
+
+ #Borders - float - A greyscale pattern based on the distance to borders
+ #$(name_uv)_xyzw.w
+ var borders_col : Color = Color(voronoi.a, voronoi.a, voronoi.a, 1)
+
+ #Random color - rgb - A color pattern that assigns a random color to each cell
+ #rand3(fract(floor($(name_uv)_xyzw.xy)/vec2($scale_x, $scale_y)))
+ var rv3 : Vector3 = Commons.rand3(Commons.fractv2(Vector2(voronoi.r, voronoi.g) / scale))
+ var random_color_col : Color = Color(rv3.x, rv3.y, rv3.z, 1)
+
+ #Fill - rgba - An output that should be plugged into a Fill companion node
+ #vec4(fract(($(name_uv)_xyzw.xy-1.0)/vec2($scale_x, $scale_y)), vec2(2.0)/vec2($scale_x, $scale_y))
+ var fv21 : Vector2 = Commons.fractv2((Vector2(voronoi.r, voronoi.g) - Vector2(1, 1)) / scale)
+ var fv22 : Vector2 = Vector2(2, 2) / scale
+ var fill_col : Color = Color(fv21.x, fv21.y, fv22.x, fv22.y)
+
+ nodes.set_pixel(x, y, nodes_col)
+ borders.set_pixel(x, y, borders_col)
+ random_color.set_pixel(x, y, random_color_col)
+ fill.set_pixel(x, y, fill_col)
+
+ nodes.unlock()
+ borders.unlock()
+ random_color.unlock()
+ fill.unlock()
+
+ out_nodes.set_value(nodes)
+ out_borders.set_value(borders)
+ out_random_color.set_value(random_color)
+ out_fill.set_value(fill)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ return Color()
+
+#scale
+func get_scale() -> Vector2:
+ return scale
+
+func set_scale(val : Vector2) -> void:
+ scale = val
+
+ set_dirty(true)
+
+#stretch
+func get_stretch() -> Vector2:
+ return stretch
+
+func set_stretch(val : Vector2) -> void:
+ stretch = val
+
+ set_dirty(true)
+
+#intensity
+func get_intensity() -> float:
+ return intensity
+
+func set_intensity(val : float) -> void:
+ intensity = val
+
+ set_dirty(true)
+
+#randomness
+func get_randomness() -> float:
+ return randomness
+
+func set_randomness(val : float) -> void:
+ randomness = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/other/output_image.gd b/modules/material_maker/mat_maker_gd/nodes/other/output_image.gd
new file mode 100644
index 000000000..84a77fbd9
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/other/output_image.gd
@@ -0,0 +1,45 @@
+tool
+extends MMNode
+
+export(Resource) var image : Resource
+
+export(String) var postfix : String = ""
+
+func _init_properties():
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+ image.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ image.slot_name = "image"
+
+ register_input_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_line_edit("get_postfix", "set_postfix", "postfix")
+
+func _render(material) -> void:
+ if !image:
+ return
+
+ var img : Image = image.get_active_image()
+
+ if !img:
+ return
+
+ var matpath : String = material.get_path()
+
+ if matpath == "":
+ return
+
+ var matbn : String = matpath.get_basename()
+ var final_file_name : String = matbn + postfix + ".png"
+
+ img.save_png(final_file_name)
+
+func get_postfix() -> String:
+ return postfix
+
+func set_postfix(pf : String) -> void:
+ postfix = pf
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/pattern/beehive.gd b/modules/material_maker/mat_maker_gd/nodes/pattern/beehive.gd
new file mode 100644
index 000000000..b439ae38f
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/pattern/beehive.gd
@@ -0,0 +1,113 @@
+tool
+extends MMNode
+
+var Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var Patterns = preload("res://addons/mat_maker_gd/nodes/common/patterns.gd")
+
+export(Resource) var out_main : Resource
+export(Resource) var out_random_color : Resource
+export(Resource) var out_uv_map : Resource
+
+export(Vector2) var size : Vector2 = Vector2(4, 4)
+
+func _init_properties():
+ if !out_main:
+ out_main = MMNodeUniversalProperty.new()
+ out_main.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ out_main.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !out_random_color:
+ out_random_color = MMNodeUniversalProperty.new()
+ out_random_color.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ out_random_color.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !out_uv_map:
+ out_uv_map = MMNodeUniversalProperty.new()
+ out_uv_map.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ out_uv_map.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ register_output_property(out_main)
+ register_output_property(out_random_color)
+ register_output_property(out_uv_map)
+
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_texture_universal(out_main)
+ mm_graph_node.add_slot_texture_universal(out_random_color)
+ mm_graph_node.add_slot_texture_universal(out_uv_map)
+
+ mm_graph_node.add_slot_vector2("get_size", "set_size", "Size")#, Vector2(1, 32))#, Vector2(0, 32))
+
+
+func _render(material) -> void:
+ var main_pattern : Image = Image.new()
+ var random_color : Image = Image.new()
+ var uv_map : Image = Image.new()
+
+ main_pattern.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+ random_color.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+ uv_map.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+
+ main_pattern.lock()
+ random_color.lock()
+ uv_map.lock()
+
+ var w : float = material.image_size.x
+ var h : float = material.image_size.y
+
+ var pseed : float = randf() + randi()
+
+ for x in range(material.image_size.x):
+ for y in range(material.image_size.y):
+ var uv : Vector2 = Vector2(x / w, y / h)
+
+ var ps : float = 1.0 / float(pseed)
+
+ #vec2 $(name_uv)_uv = $uv*vec2($sx, $sy*1.73205080757);
+ #vec4 $(name_uv)_center = beehive_center($(name_uv)_uv);
+ var beehive_uv : Vector2 = uv * size;
+ var beehive_uv_center : Color = Patterns.beehive_center(beehive_uv);
+
+ #Output (float) - Shows the greyscale pattern
+ #1.0-2.0*beehive_dist($(name_uv)_center.xy)
+ var f : float = 1.0 - 2.0 * Patterns.beehive_dist(Vector2(beehive_uv_center.r, beehive_uv_center.g))
+ var main_pattern_col : Color = Color(f, f, f, 1)
+
+ #Random color (rgb) - Shows a random color for each hexagonal tile
+ #rand3(fract($(name_uv)_center.zw/vec2($sx, $sy))+vec2(float($seed)))
+ var rcv3 : Vector3 = Commons.rand3(Commons.fractv2(Vector2(beehive_uv_center.b, beehive_uv_center.a) / size) + Vector2(ps, ps))
+ var random_color_col : Color = Color(rcv3.x, rcv3.y, rcv3.z, 1)
+
+ #UV map (rgb) - Shows an UV map to be connected to the UV map port of the Custom UV node
+ #vec3(vec2(0.5)+$(name_uv)_center.xy, rand(fract($(name_uv)_center.zw/vec2($sx, $sy))+vec2(float($seed))))
+ var uvm1 : Vector2 = Vector2(0.5, 0.5) + Vector2(beehive_uv_center.r, beehive_uv_center.g)
+ var uvm2 : Vector2 = Commons.rand2(Commons.fractv2(Vector2(beehive_uv_center.b, beehive_uv_center.a) / size) + Vector2(ps, ps))
+
+ var uv_map_col : Color = Color(uvm1.x, uvm1.y, uvm2.x, 1)
+
+ main_pattern.set_pixel(x, y, main_pattern_col)
+ random_color.set_pixel(x, y, random_color_col)
+ uv_map.set_pixel(x, y, uv_map_col)
+
+ main_pattern.unlock()
+ random_color.unlock()
+ uv_map.unlock()
+
+ out_main.set_value(main_pattern)
+ out_random_color.set_value(random_color)
+ out_uv_map.set_value(uv_map)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ return Color()
+
+#size
+func get_size() -> Vector2:
+ return size
+
+func set_size(val : Vector2) -> void:
+ size = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/pattern/bricks.gd b/modules/material_maker/mat_maker_gd/nodes/pattern/bricks.gd
new file mode 100644
index 000000000..498460f0f
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/pattern/bricks.gd
@@ -0,0 +1,288 @@
+tool
+extends MMNode
+
+var Patterns = preload("res://addons/mat_maker_gd/nodes/common/patterns.gd")
+
+export(Resource) var out_bricks_pattern : Resource
+export(Resource) var out_random_color : Resource
+export(Resource) var out_position_x : Resource
+export(Resource) var out_position_y : Resource
+export(Resource) var out_brick_uv : Resource
+export(Resource) var out_corner_uv : Resource
+export(Resource) var out_direction : Resource
+
+export(int, "Running Bond,Running Bond (2),HerringBone,Basket Weave,Spanish Bond") var type : int = 0
+export(int) var repeat : int = 1
+export(Vector2) var col_row : Vector2 = Vector2(4, 4)
+export(float) var offset : float = 0.5
+export(Resource) var mortar : Resource
+export(Resource) var bevel : Resource
+export(Resource) var roundness : Resource
+export(float) var corner : float = 0.3
+
+func _init_properties():
+ if !out_bricks_pattern:
+ out_bricks_pattern = MMNodeUniversalProperty.new()
+ out_bricks_pattern.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ out_bricks_pattern.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !out_random_color:
+ out_random_color = MMNodeUniversalProperty.new()
+ out_random_color.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ out_random_color.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !out_position_x:
+ out_position_x = MMNodeUniversalProperty.new()
+ out_position_x.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ out_position_x.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !out_position_y:
+ out_position_y = MMNodeUniversalProperty.new()
+ out_position_y.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ out_position_y.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !out_brick_uv:
+ out_brick_uv = MMNodeUniversalProperty.new()
+ out_brick_uv.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ out_brick_uv.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !out_corner_uv:
+ out_corner_uv = MMNodeUniversalProperty.new()
+ out_corner_uv.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ out_corner_uv.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !out_direction:
+ out_direction = MMNodeUniversalProperty.new()
+ out_direction.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ out_direction.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !mortar:
+ mortar = MMNodeUniversalProperty.new()
+ mortar.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+ mortar.set_default_value(0.1)
+
+ mortar.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ mortar.slot_name = "Mortar"
+ mortar.value_step = 0.01
+ mortar.value_range = Vector2(0, 0.5)
+
+ if !bevel:
+ bevel = MMNodeUniversalProperty.new()
+ bevel.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+ bevel.set_default_value(0.1)
+
+ bevel.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ bevel.slot_name = "Bevel"
+ bevel.value_step = 0.01
+ bevel.value_range = Vector2(0, 0.5)
+
+ if !roundness:
+ roundness = MMNodeUniversalProperty.new()
+ roundness.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+ roundness.set_default_value(0.1)
+
+ roundness.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ roundness.slot_name = "Roundness"
+ roundness.value_step = 0.01
+ roundness.value_range = Vector2(0, 0.5)
+
+ register_output_property(out_bricks_pattern)
+ register_output_property(out_random_color)
+ register_output_property(out_position_x)
+ register_output_property(out_position_y)
+ register_output_property(out_brick_uv)
+ register_output_property(out_corner_uv)
+ register_output_property(out_direction)
+
+ register_input_property(mortar)
+ register_input_property(bevel)
+ register_input_property(roundness)
+
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_texture_universal(out_bricks_pattern)
+ mm_graph_node.add_slot_texture_universal(out_random_color)
+ mm_graph_node.add_slot_texture_universal(out_position_x)
+ mm_graph_node.add_slot_texture_universal(out_position_y)
+ mm_graph_node.add_slot_texture_universal(out_brick_uv)
+ mm_graph_node.add_slot_texture_universal(out_corner_uv)
+ mm_graph_node.add_slot_texture_universal(out_direction)
+
+ mm_graph_node.add_slot_enum("get_type", "set_type", "Type", [ "Running Bond", "Running Bond (2)", "HerringBone", "Basket Weave", "Spanish Bond" ])
+ mm_graph_node.add_slot_int("get_repeat", "set_repeat", "Repeat")
+
+ mm_graph_node.add_slot_vector2("get_col_row", "set_col_row", "Col, Row")#, Vector2(1, 32))#, Vector2(0, 32))
+ mm_graph_node.add_slot_float("get_offset", "set_offset", "Offset")
+
+ mm_graph_node.add_slot_float_universal(mortar)
+ mm_graph_node.add_slot_float_universal(bevel)
+ mm_graph_node.add_slot_float_universal(roundness)
+
+ mm_graph_node.add_slot_float("get_corner", "set_corner", "Corner")
+
+func _render(material) -> void:
+ var bricks_pattern : Image = Image.new()
+ var random_color : Image = Image.new()
+ var position_x : Image = Image.new()
+ var position_y : Image = Image.new()
+ var brick_uv : Image = Image.new()
+ var corner_uv : Image = Image.new()
+ var direction : Image = Image.new()
+
+ bricks_pattern.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+ random_color.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+ position_x.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+ position_y.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+ brick_uv.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+ corner_uv.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+ direction.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+
+ bricks_pattern.lock()
+ random_color.lock()
+ position_x.lock()
+ position_y.lock()
+ brick_uv.lock()
+ corner_uv.lock()
+ direction.lock()
+
+ var w : float = material.image_size.x
+ var h : float = material.image_size.y
+
+ var pseed : float = randf() + randi()
+
+ for x in range(material.image_size.x):
+ for y in range(material.image_size.y):
+ var uv : Vector2 = Vector2(x / w, y / h)
+
+ #vec4 $(name_uv)_rect = bricks_$pattern($uv, vec2($columns, $rows), $repeat, $row_offset);
+ var brick_rect : Color = Color()
+
+ #"Running Bond,Running Bond (2),HerringBone,Basket Weave,Spanish Bond"
+
+ if type == 0:
+ brick_rect = Patterns.bricks_rb(uv, col_row, repeat, offset)
+ elif type == 1:
+ brick_rect = Patterns.bricks_rb2(uv, col_row, repeat, offset)
+ elif type == 2:
+ brick_rect = Patterns.bricks_hb(uv, col_row, repeat, offset)
+ elif type == 3:
+ brick_rect = Patterns.bricks_bw(uv, col_row, repeat, offset)
+ elif type == 4:
+ brick_rect = Patterns.bricks_sb(uv, col_row, repeat, offset)
+
+
+ #vec4 $(name_uv) = brick($uv, $(name_uv)_rect.xy, $(name_uv)_rect.zw, $mortar*$mortar_map($uv), $round*$round_map($uv), max(0.001, $bevel*$bevel_map($uv)));
+ var brick : Color = Patterns.brick(uv, Vector2(brick_rect.r, brick_rect.g), Vector2(brick_rect.b, brick_rect.a), mortar.get_value(uv), roundness.get_value(uv), max(0.001, bevel.get_value(uv)))
+
+ #Bricks pattern (float) - A greyscale image that shows the bricks pattern
+ #$(name_uv).x
+ var bricks_pattern_col : Color = Color(brick.r, brick.r, brick.r, 1)
+
+ #Random color (rgb) - A random color for each brick
+ #brick_random_color($(name_uv)_rect.xy, $(name_uv)_rect.zw, float($seed))
+ var brc : Vector3 = Patterns.brick_random_color(Vector2(brick_rect.r, brick_rect.g), Vector2(brick_rect.b, brick_rect.a), 1 / float(pseed))
+ var random_color_col : Color = Color(brc.x, brc.y, brc.z, 1)
+
+ #Position.x (float) - The position of each brick along the X axis",
+ #$(name_uv).y
+ var position_x_col : Color = Color(brick.g, brick.g, brick.g, 1)
+
+ #Position.y (float) - The position of each brick along the Y axis
+ #$(name_uv).z
+ var position_y_col : Color = Color(brick.b, brick.b, brick.b, 1)
+
+ #Brick UV (rgb) - An UV map output for each brick, to be connected to the Map input of a CustomUV node
+ #brick_uv($uv, $(name_uv)_rect.xy, $(name_uv)_rect.zw, float($seed))
+ var buv : Vector3 = Patterns.brick_uv(uv, Vector2(brick_rect.r, brick_rect.g), Vector2(brick_rect.b, brick_rect.a), pseed)
+ var brick_uv_col : Color = Color(buv.x, buv.y, buv.z, 1)
+
+ #Corner UV (rgb) - An UV map output for each brick corner, to be connected to the Map input of a CustomUV node
+ #brick_corner_uv($uv, $(name_uv)_rect.xy, $(name_uv)_rect.zw, $mortar*$mortar_map($uv), $corner, float($seed))
+ var bcuv : Vector3 = Patterns.brick_corner_uv(uv, Vector2(brick_rect.r, brick_rect.g), Vector2(brick_rect.b, brick_rect.a), mortar.get_value(uv), corner, pseed)
+ var corner_uv_col : Color = Color(bcuv.x, bcuv.y, bcuv.z, 1)
+
+ #Direction (float) - The direction of each brick (white: horizontal, black: vertical)
+ #0.5*(sign($(name_uv)_rect.z-$(name_uv)_rect.x-$(name_uv)_rect.w+$(name_uv)_rect.y)+1.0)
+ var d : float = 0.5 * (sign(brick_rect.b - brick_rect.r - brick_rect.a + brick_rect.g) + 1.0)
+ var direction_col : Color = Color(d, d, d, 1)
+
+ bricks_pattern.set_pixel(x, y, bricks_pattern_col)
+ random_color.set_pixel(x, y, random_color_col)
+ position_x.set_pixel(x, y, position_x_col)
+ position_y.set_pixel(x, y, position_y_col)
+ brick_uv.set_pixel(x, y, brick_uv_col)
+ corner_uv.set_pixel(x, y, corner_uv_col)
+ direction.set_pixel(x, y, direction_col)
+
+ bricks_pattern.unlock()
+ random_color.unlock()
+ position_x.unlock()
+ position_y.unlock()
+ brick_uv.unlock()
+ corner_uv.unlock()
+ direction.unlock()
+
+ out_bricks_pattern.set_value(bricks_pattern)
+ out_random_color.set_value(random_color)
+ out_position_x.set_value(position_x)
+ out_position_y.set_value(position_y)
+ out_brick_uv.set_value(brick_uv)
+ out_corner_uv.set_value(corner_uv)
+ out_direction.set_value(direction)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ return Color()
+
+#type
+func get_type() -> int:
+ return type
+
+func set_type(val : int) -> void:
+ type = val
+
+ set_dirty(true)
+
+#repeat
+func get_repeat() -> int:
+ return repeat
+
+func set_repeat(val : int) -> void:
+ repeat = val
+
+ set_dirty(true)
+
+#col_row
+func get_col_row() -> Vector2:
+ return col_row
+
+func set_col_row(val : Vector2) -> void:
+ col_row = val
+
+ set_dirty(true)
+
+#offset
+func get_offset() -> float:
+ return offset
+
+func set_offset(val : float) -> void:
+ offset = val
+
+ set_dirty(true)
+
+#corner
+func get_corner() -> float:
+ return corner
+
+func set_corner(val : float) -> void:
+ corner = val
+
+ set_dirty(true)
+
+
diff --git a/modules/material_maker/mat_maker_gd/nodes/pattern/iching.gd b/modules/material_maker/mat_maker_gd/nodes/pattern/iching.gd
new file mode 100644
index 000000000..5daceba0b
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/pattern/iching.gd
@@ -0,0 +1,40 @@
+tool
+extends MMNode
+
+var Patterns = preload("res://addons/mat_maker_gd/nodes/common/patterns.gd")
+
+export(Resource) var image : Resource
+export(Vector2) var size : Vector2 = Vector2(4, 4)
+
+func _init_properties():
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_vector2("get_size", "set_size", "Size", 1)
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ var ps : float = 1.0 / float(pseed)
+
+ #IChing(vec2($columns, $rows)*$uv, float($seed))
+ return Patterns.IChingc(uv, size, ps)
+
+#size
+func get_size() -> Vector2:
+ return size
+
+func set_size(val : Vector2) -> void:
+ size = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/pattern/pattern.gd b/modules/material_maker/mat_maker_gd/nodes/pattern/pattern.gd
new file mode 100644
index 000000000..1bc9ac1c3
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/pattern/pattern.gd
@@ -0,0 +1,72 @@
+tool
+extends MMNode
+
+var Patterns = preload("res://addons/mat_maker_gd/nodes/common/patterns.gd")
+
+export(Resource) var image : Resource
+export(int, "Multiply,Add,Max,Min,Xor,Pow") var combiner_type : int = 0
+export(int, "Sine,Triangle,Square,Sawtooth,Constant,Bounce") var combiner_axis_type_x : int = 0
+export(int, "Sine,Triangle,Square,Sawtooth,Constant,Bounce") var combiner_axis_type_y : int = 0
+export(Vector2) var repeat : Vector2 = Vector2(4, 4)
+
+func _init_properties():
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_enum("get_combiner_type", "set_combiner_type", "Combiner Type", [ "Multiply", "Add" , "Max", "Min", "Xor", "Pow" ])
+ mm_graph_node.add_slot_enum("get_combiner_axis_type_x", "set_combiner_axis_type_x", "Combiner Axis type", [ "Sine", "Triangle", "Square", "Sawtooth", "Constant", "Bounce" ])
+ mm_graph_node.add_slot_enum("get_combiner_axis_type_y", "set_combiner_axis_type_y", "", [ "Sine", "Triangle", "Square", "Sawtooth", "Constant", "Bounce" ])
+ mm_graph_node.add_slot_vector2("get_repeat", "set_repeat", "Repeat", 1)#, Vector2(0, 32))
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ var f : float = Patterns.pattern(uv, repeat.x, repeat.y, combiner_type, combiner_axis_type_x, combiner_axis_type_y)
+
+ return Color(f, f, f, 1)
+
+#combiner_type
+func get_combiner_type() -> int:
+ return combiner_type
+
+func set_combiner_type(val : int) -> void:
+ combiner_type = val
+
+ set_dirty(true)
+
+#combiner_axis_type_x
+func get_combiner_axis_type_x() -> int:
+ return combiner_axis_type_x
+
+func set_combiner_axis_type_x(val : int) -> void:
+ combiner_axis_type_x = val
+
+ set_dirty(true)
+
+#combiner_axis_type_y
+func get_combiner_axis_type_y() -> int:
+ return combiner_axis_type_y
+
+func set_combiner_axis_type_y(val : int) -> void:
+ combiner_axis_type_y = val
+
+ set_dirty(true)
+
+#repeat
+func get_repeat() -> Vector2:
+ return repeat
+
+func set_repeat(val : Vector2) -> void:
+ repeat = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/pattern/runes.gd b/modules/material_maker/mat_maker_gd/nodes/pattern/runes.gd
new file mode 100644
index 000000000..fd7a9658b
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/pattern/runes.gd
@@ -0,0 +1,40 @@
+tool
+extends MMNode
+
+var Patterns = preload("res://addons/mat_maker_gd/nodes/common/patterns.gd")
+
+export(Resource) var image : Resource
+export(Vector2) var size : Vector2 = Vector2(4, 4)
+
+func _init_properties():
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_vector2("get_size", "set_size", "Size", 1)
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ var ps : float = 1.0 / float(pseed)
+
+ #Rune(vec2($columns, $rows)*$uv, float($seed))
+ return Patterns.runesc(uv, size, ps)
+
+#size
+func get_size() -> Vector2:
+ return size
+
+func set_size(val : Vector2) -> void:
+ size = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/pattern/scratches.gd b/modules/material_maker/mat_maker_gd/nodes/pattern/scratches.gd
new file mode 100644
index 000000000..f333b2d3b
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/pattern/scratches.gd
@@ -0,0 +1,82 @@
+tool
+extends MMNode
+
+var Patterns = preload("res://addons/mat_maker_gd/nodes/common/patterns.gd")
+
+export(Resource) var image : Resource
+export(Vector2) var size : Vector2 = Vector2(0.25, 0.4)
+export(int) var layers : int = 4
+export(float) var waviness : float = 0.51
+export(int) var angle : int = 0
+export(float) var randomness : float = 0.44
+
+func _init_properties():
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_vector2("get_size", "set_size", "Size", 0.01)
+ mm_graph_node.add_slot_int("get_layers", "set_layers", "Layers")
+ mm_graph_node.add_slot_float("get_waviness", "set_waviness", "Waviness", 0.01)
+ mm_graph_node.add_slot_int("get_angle", "set_angle", "Angle")
+ mm_graph_node.add_slot_float("get_randomness", "set_randomness", "Randomness", 0.01)
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ #scratches($uv, int($layers), vec2($length, $width), $waviness, $angle, $randomness, vec2(float($seed), 0.0))
+ return Patterns.scratchesc(uv, layers, size, waviness, angle, randomness, Vector2(pseed, 0.0))
+
+#size
+func get_size() -> Vector2:
+ return size
+
+func set_size(val : Vector2) -> void:
+ size = val
+
+ set_dirty(true)
+
+#layers
+func get_layers() -> int:
+ return layers
+
+func set_layers(val : int) -> void:
+ layers = val
+
+ set_dirty(true)
+
+#waviness
+func get_waviness() -> float:
+ return waviness
+
+func set_waviness(val : float) -> void:
+ waviness = val
+
+ set_dirty(true)
+
+#angle
+func get_angle() -> int:
+ return angle
+
+func set_angle(val : int) -> void:
+ angle = val
+
+ set_dirty(true)
+
+#randomness
+func get_randomness() -> float:
+ return randomness
+
+func set_randomness(val : float) -> void:
+ randomness = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/pattern/sine_wave.gd b/modules/material_maker/mat_maker_gd/nodes/pattern/sine_wave.gd
new file mode 100644
index 000000000..d343bfcac
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/pattern/sine_wave.gd
@@ -0,0 +1,61 @@
+tool
+extends MMNode
+
+var Patterns = preload("res://addons/mat_maker_gd/nodes/common/patterns.gd")
+
+export(Resource) var image : Resource
+export(float) var amplitude : float = 0.5
+export(float) var frequency : float = 2
+export(float) var phase : float = 0
+
+func _init_properties():
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_float("get_amplitude", "set_amplitude", "Amplitude", 0.01)
+ mm_graph_node.add_slot_float("get_frequency", "set_frequency", "Frequency", 0.1)
+ mm_graph_node.add_slot_float("get_phase", "set_phase", "Phase", 0.01)
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ var f : float = 1.0 - abs(2.0 * (uv.y - 0.5) - amplitude *sin((frequency * uv.x + phase)*6.28318530718))
+
+ return Color(f, f, f, 1)
+
+#amplitude
+func get_amplitude() -> float:
+ return amplitude
+
+func set_amplitude(val : float) -> void:
+ amplitude = val
+
+ set_dirty(true)
+
+#frequency
+func get_frequency() -> float:
+ return frequency
+
+func set_frequency(val : float) -> void:
+ frequency = val
+
+ set_dirty(true)
+
+#phase
+func get_phase() -> float:
+ return phase
+
+func set_phase(val : float) -> void:
+ phase = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/pattern/truchet.gd b/modules/material_maker/mat_maker_gd/nodes/pattern/truchet.gd
new file mode 100644
index 000000000..b07ec9635
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/pattern/truchet.gd
@@ -0,0 +1,53 @@
+tool
+extends MMNode
+
+var Patterns = preload("res://addons/mat_maker_gd/nodes/common/patterns.gd")
+
+export(Resource) var image : Resource
+export(int, "Line,Circle") var shape : int = 0
+export(float) var size : float = 4
+
+func _init_properties():
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_enum("get_shape", "set_shape", "Shape", [ "Line", "Circle" ])
+ mm_graph_node.add_slot_float("get_size", "set_size", "Size", 1)
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ if shape == 0:
+ return Patterns.truchet1c(uv, size, pseed)
+ elif shape == 1:
+ return Patterns.truchet2c(uv, size, pseed)
+
+ return Color()
+
+#shape
+func get_shape() -> int:
+ return shape
+
+func set_shape(val : int) -> void:
+ shape = val
+
+ set_dirty(true)
+
+#size
+func get_size() -> float:
+ return size
+
+func set_size(val : float) -> void:
+ size = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/pattern/weave.gd b/modules/material_maker/mat_maker_gd/nodes/pattern/weave.gd
new file mode 100644
index 000000000..f846549e2
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/pattern/weave.gd
@@ -0,0 +1,134 @@
+tool
+extends MMNode
+
+var Patterns = preload("res://addons/mat_maker_gd/nodes/common/patterns.gd")
+
+export(Resource) var out_main : Resource
+export(Resource) var out_horizontal_map : Resource
+export(Resource) var out_vertical_map : Resource
+
+export(Vector2) var size : Vector2 = Vector2(4, 4)
+export(Resource) var width : Resource
+export(int) var stitch : int = 1
+
+func _init_properties():
+ if !out_main:
+ out_main = MMNodeUniversalProperty.new()
+ out_main.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ out_main.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !out_horizontal_map:
+ out_horizontal_map = MMNodeUniversalProperty.new()
+ out_horizontal_map.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ out_horizontal_map.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !out_vertical_map:
+ out_vertical_map = MMNodeUniversalProperty.new()
+ out_vertical_map.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ out_vertical_map.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !width:
+ width = MMNodeUniversalProperty.new()
+ width.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+ width.set_default_value(Vector2(0.9, 0.9))
+
+ width.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ width.slot_name = "Width"
+ width.value_step = 0.01
+ width.value_range = Vector2(0, 1)
+
+ register_output_property(out_main)
+ register_output_property(out_horizontal_map)
+ register_output_property(out_vertical_map)
+
+ register_input_property(width)
+
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_texture_universal(out_main)
+ mm_graph_node.add_slot_texture_universal(out_horizontal_map)
+ mm_graph_node.add_slot_texture_universal(out_vertical_map)
+
+ mm_graph_node.add_slot_vector2("get_size", "set_size", "Size")#, Vector2(1, 32))#, Vector2(0, 32))
+ mm_graph_node.add_slot_vector2_universal(width)
+
+ mm_graph_node.add_slot_int("get_stitch", "set_stitch", "Stitch")
+
+
+func _render(material) -> void:
+ var main_pattern : Image = Image.new()
+ var horizontal_map : Image = Image.new()
+ var vertical_map : Image = Image.new()
+
+ main_pattern.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+ horizontal_map.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+ vertical_map.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+
+ main_pattern.lock()
+ horizontal_map.lock()
+ vertical_map.lock()
+
+ var w : float = material.image_size.x
+ var h : float = material.image_size.y
+
+ var pseed : float = randf() + randi()
+
+ for x in range(material.image_size.x):
+ for y in range(material.image_size.y):
+ var uv : Vector2 = Vector2(x / w, y / h)
+
+ var width_val : Vector2 = width.get_value(uv)
+
+ #vec3 $(name_uv) = weave2($uv, vec2($columns, $rows), $stitch, $width_x*$width_map($uv), $width_y*$width_map($uv));
+ var weave : Vector3 = Patterns.weave2(uv, size, stitch, width_val.x, width_val.y);
+
+ #Outputs:
+
+ #Output (float) - Shows the generated greyscale weave pattern.
+ #$(name_uv).x
+ var main_pattern_col : Color = Color(weave.x, weave.x, weave.x, 1)
+
+ #Horizontal mask (float) - Horizontal mask
+ #$(name_uv).y
+ var horizontal_map_col : Color = Color(weave.y, weave.y, weave.y, 1)
+
+ #Vertical mask (float) - Mask for vertical stripes
+ #$(name_uv).z
+ var vertical_map_col : Color = Color(weave.z, weave.z, weave.z, 1)
+
+ main_pattern.set_pixel(x, y, main_pattern_col)
+ horizontal_map.set_pixel(x, y, horizontal_map_col)
+ vertical_map.set_pixel(x, y, vertical_map_col)
+
+ main_pattern.unlock()
+ horizontal_map.unlock()
+ vertical_map.unlock()
+
+ out_main.set_value(main_pattern)
+ out_horizontal_map.set_value(horizontal_map)
+ out_vertical_map.set_value(vertical_map)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ return Color()
+
+#size
+func get_size() -> Vector2:
+ return size
+
+func set_size(val : Vector2) -> void:
+ size = val
+
+ set_dirty(true)
+
+#stitch
+func get_stitch() -> int:
+ return stitch
+
+func set_stitch(val : int) -> void:
+ stitch = val
+
+ set_dirty(true)
+
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_op_annular_shape.gd b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_op_annular_shape.gd
new file mode 100644
index 000000000..c7e8829f6
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_op_annular_shape.gd
@@ -0,0 +1,53 @@
+tool
+extends MMNode
+
+var SDF2D = preload("res://addons/mat_maker_gd/nodes/common/sdf2d.gd")
+
+export(Resource) var output : Resource
+export(float) var width : float = 0.1
+export(int) var ripples : int = 1
+
+func _init_properties():
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+
+ output.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ #output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Apply >>>"
+ output.get_value_from_owner = true
+
+ register_input_property(output)
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_float("get_width", "set_width", "Width", 0.01)
+ mm_graph_node.add_slot_int("get_ripples", "set_ripples", "Ripples")
+
+func get_property_value(uv : Vector2):
+ var val : float = output.get_value(uv, true)
+
+ return SDF2D.sdRipples(val, width, ripples)
+
+#width
+func get_width() -> float:
+ return width
+
+func set_width(val : float) -> void:
+ width = val
+
+ emit_changed()
+ output.emit_changed()
+
+#ripples
+func get_ripples() -> int:
+ return ripples
+
+func set_ripples(val : int) -> void:
+ ripples = val
+
+ emit_changed()
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_op_bool.gd b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_op_bool.gd
new file mode 100644
index 000000000..69ee787d5
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_op_bool.gd
@@ -0,0 +1,76 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF2D = preload("res://addons/mat_maker_gd/nodes/common/sdf2d.gd")
+
+export(Resource) var input1 : Resource
+export(Resource) var input2 : Resource
+export(Resource) var output : Resource
+export(int, "Union,Substraction,Intersection") var operation : int = 0
+
+func _init_properties():
+ if !input1:
+ input1 = MMNodeUniversalProperty.new()
+ input1.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+
+ input1.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+# input1.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ input1.slot_name = ">>> Input 1 "
+ if !input1.is_connected("changed", self, "on_input_changed"):
+ input1.connect("changed", self, "on_input_changed")
+
+ if !input2:
+ input2 = MMNodeUniversalProperty.new()
+ input2.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+
+ input2.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+# input2.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ input2.slot_name = ">>> Input 2 "
+
+ if !input2.is_connected("changed", self, "on_input_changed"):
+ input2.connect("changed", self, "on_input_changed")
+
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+# output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = " Output >>>"
+ output.get_value_from_owner = true
+
+ register_input_property(input1)
+ register_input_property(input2)
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input1)
+ mm_graph_node.add_slot_label_universal(input2)
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_enum("get_operation", "set_operation", "Operation", [ "Union", "Substraction", "Intersection" ])
+
+func get_property_value(uv : Vector2) -> float:
+ if operation == 0:
+ return SDF2D.sdf_boolean_union(input1.get_value(uv), input2.get_value(uv))
+ elif operation == 1:
+ return SDF2D.sdf_boolean_substraction(input1.get_value(uv), input2.get_value(uv))
+ elif operation == 2:
+ return SDF2D.sdf_boolean_intersection(input1.get_value(uv), input2.get_value(uv))
+
+ return 0.0
+
+#operation
+func get_operation() -> int:
+ return operation
+
+func set_operation(val : int) -> void:
+ operation = val
+
+ emit_changed()
+ output.emit_changed()
+
+func on_input_changed() -> void:
+ emit_changed()
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_op_circle_repeat.gd b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_op_circle_repeat.gd
new file mode 100644
index 000000000..f61f6dc23
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_op_circle_repeat.gd
@@ -0,0 +1,43 @@
+tool
+extends MMNode
+
+var SDF2D = preload("res://addons/mat_maker_gd/nodes/common/sdf2d.gd")
+
+export(Resource) var output : Resource
+export(int) var count : int = 6
+
+func _init_properties():
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+
+ output.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ #output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Apply >>>"
+ output.get_value_from_owner = true
+
+ register_input_property(output)
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_int("get_count", "set_count", "Count")
+
+func get_property_value(uv : Vector2):
+ #$in(circle_repeat_transform_2d($uv-vec2(0.5), $c)+vec2(0.5))
+ var new_uv : Vector2 = SDF2D.circle_repeat_transform_2d(uv - Vector2(0.5, 0.5), count) + Vector2(0.5, 0.5)
+
+ return output.get_value(new_uv, true)
+
+#count
+func get_count() -> int:
+ return count
+
+func set_count(val : int) -> void:
+ count = val
+
+ emit_changed()
+ output.emit_changed()
+
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_op_morph.gd b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_op_morph.gd
new file mode 100644
index 000000000..e5aee5bbd
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_op_morph.gd
@@ -0,0 +1,69 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF2D = preload("res://addons/mat_maker_gd/nodes/common/sdf2d.gd")
+
+export(Resource) var input1 : Resource
+export(Resource) var input2 : Resource
+export(Resource) var output : Resource
+export(float) var amount : float = 0.5
+
+func _init_properties():
+ if !input1:
+ input1 = MMNodeUniversalProperty.new()
+ input1.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+
+ input1.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+# input1.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ input1.slot_name = ">>> Input 1 "
+ if !input1.is_connected("changed", self, "on_input_changed"):
+ input1.connect("changed", self, "on_input_changed")
+
+ if !input2:
+ input2 = MMNodeUniversalProperty.new()
+ input2.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+
+ input2.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+# input2.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ input2.slot_name = ">>> Input 2 "
+
+ if !input2.is_connected("changed", self, "on_input_changed"):
+ input2.connect("changed", self, "on_input_changed")
+
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+# output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = " Output >>>"
+ output.get_value_from_owner = true
+
+ register_input_property(input1)
+ register_input_property(input2)
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input1)
+ mm_graph_node.add_slot_label_universal(input2)
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_float("get_amount", "set_amount", "Amount", 0.01)
+
+func get_property_value(uv : Vector2) -> float:
+ return SDF2D.sdf_morph(input1.get_value(uv), input2.get_value(uv), amount)
+
+#amount
+func get_amount() -> float:
+ return amount
+
+func set_amount(val : float) -> void:
+ amount = val
+
+ emit_changed()
+ output.emit_changed()
+
+func on_input_changed() -> void:
+ emit_changed()
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_op_repeat.gd b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_op_repeat.gd
new file mode 100644
index 000000000..f36ca996f
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_op_repeat.gd
@@ -0,0 +1,68 @@
+tool
+extends MMNode
+
+var SDF2D = preload("res://addons/mat_maker_gd/nodes/common/sdf2d.gd")
+
+export(Resource) var output : Resource
+export(int) var x : int = 3
+export(int) var y : int = 3
+export(float) var random_rotation : float = 0.5
+
+func _init_properties():
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+
+ output.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ #output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Apply >>>"
+ output.get_value_from_owner = true
+
+ register_input_property(output)
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_int("get_x", "set_x", "X")
+ mm_graph_node.add_slot_int("get_y", "set_y", "Y")
+ mm_graph_node.add_slot_float("get_random_rotation", "set_random_rotation", "Random rotation", 0.01)
+
+func get_property_value(uv : Vector2):
+ #todo add this as a parameter
+ var pseed : int = 123123
+
+ #$in(repeat_2d($uv, vec2(1.0/$rx, 1.0/$ry), float($seed), $r))
+ var new_uv : Vector2 = SDF2D.repeat_2d(uv, Vector2(1.0 / float(x), 1.0/ float(y)), 1.0/float(pseed), random_rotation)
+
+ return output.get_value(new_uv, true)
+#x
+func get_x() -> int:
+ return x
+
+func set_x(val : int) -> void:
+ x = val
+
+ emit_changed()
+ output.emit_changed()
+
+#y
+func get_y() -> int:
+ return y
+
+func set_y(val : int) -> void:
+ y = val
+
+ emit_changed()
+ output.emit_changed()
+
+#random_rotation
+func get_random_rotation() -> float:
+ return random_rotation
+
+func set_random_rotation(val : float) -> void:
+ random_rotation = val
+
+ emit_changed()
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_op_rounded_shape.gd b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_op_rounded_shape.gd
new file mode 100644
index 000000000..ac71fd5b0
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_op_rounded_shape.gd
@@ -0,0 +1,42 @@
+tool
+extends MMNode
+
+var SDF2D = preload("res://addons/mat_maker_gd/nodes/common/sdf2d.gd")
+
+export(Resource) var output : Resource
+export(float) var radius : float = 0
+
+func _init_properties():
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+
+ output.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ #output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Apply >>>"
+ output.get_value_from_owner = true
+
+ register_input_property(output)
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_float("get_radius", "set_radius", "Radius", 0.01)
+
+func get_property_value(uv : Vector2):
+ var val : float = output.get_value(uv, true)
+
+ return SDF2D.sdf_rounded_shape(val, radius)
+
+#radius
+func get_radius() -> float:
+ return radius
+
+func set_radius(val : float) -> void:
+ radius = val
+
+ emit_changed()
+ output.emit_changed()
+
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_op_smooth_bool.gd b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_op_smooth_bool.gd
new file mode 100644
index 000000000..3b7a76812
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_op_smooth_bool.gd
@@ -0,0 +1,88 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF2D = preload("res://addons/mat_maker_gd/nodes/common/sdf2d.gd")
+
+export(Resource) var input1 : Resource
+export(Resource) var input2 : Resource
+export(Resource) var output : Resource
+export(int, "Union,Substraction,Intersection") var operation : int = 0
+export(float) var smoothness : float = 0.15
+
+func _init_properties():
+ if !input1:
+ input1 = MMNodeUniversalProperty.new()
+ input1.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+
+ input1.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+# input1.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ input1.slot_name = ">>> Input 1 "
+ if !input1.is_connected("changed", self, "on_input_changed"):
+ input1.connect("changed", self, "on_input_changed")
+
+ if !input2:
+ input2 = MMNodeUniversalProperty.new()
+ input2.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+
+ input2.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+# input2.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ input2.slot_name = ">>> Input 2 "
+
+ if !input2.is_connected("changed", self, "on_input_changed"):
+ input2.connect("changed", self, "on_input_changed")
+
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+# output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = " Output >>>"
+ output.get_value_from_owner = true
+
+ register_input_property(input1)
+ register_input_property(input2)
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input1)
+ mm_graph_node.add_slot_label_universal(input2)
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_enum("get_operation", "set_operation", "Operation", [ "Union", "Substraction", "Intersection" ])
+ mm_graph_node.add_slot_float("get_smoothness", "set_smoothness", "Smoothness", 0.01)
+
+func get_property_value(uv : Vector2) -> float:
+ if operation == 0:
+ return SDF2D.sdf_smooth_boolean_union(input1.get_value(uv), input2.get_value(uv), smoothness)
+ elif operation == 1:
+ return SDF2D.sdf_smooth_boolean_substraction(input1.get_value(uv), input2.get_value(uv), smoothness)
+ elif operation == 2:
+ return SDF2D.sdf_smooth_boolean_intersection(input1.get_value(uv), input2.get_value(uv), smoothness)
+
+ return 0.0
+
+#operation
+func get_operation() -> int:
+ return operation
+
+func set_operation(val : int) -> void:
+ operation = val
+
+ emit_changed()
+ output.emit_changed()
+
+#smoothness
+func get_smoothness() -> float:
+ return smoothness
+
+func set_smoothness(val : float) -> void:
+ smoothness = val
+
+ emit_changed()
+ output.emit_changed()
+
+func on_input_changed() -> void:
+ emit_changed()
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_shape_arc.gd b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_shape_arc.gd
new file mode 100644
index 000000000..b54360412
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_shape_arc.gd
@@ -0,0 +1,61 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF2D = preload("res://addons/mat_maker_gd/nodes/common/sdf2d.gd")
+
+export(Resource) var output : Resource
+export(Vector2) var angle : Vector2 = Vector2(30, 150)
+export(float) var radius : float = 0.3
+export(float) var width : float = 0.1
+
+func _init_properties():
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Output >>>"
+ output.get_value_from_owner = true
+
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_vector2("get_angle", "set_angle", "Angle", 1)
+ mm_graph_node.add_slot_float("get_radius", "set_radius", "Radius", 0.01)
+ mm_graph_node.add_slot_float("get_width", "set_width", "Width", 0.01)
+
+func get_property_value(uv : Vector2) -> float:
+ return SDF2D.sdf_arc(uv, angle, Vector2(radius, width))
+
+#angle
+func get_angle() -> Vector2:
+ return angle
+
+func set_angle(val : Vector2) -> void:
+ angle = val
+
+ emit_changed()
+ output.emit_changed()
+
+#radius
+func get_radius() -> float:
+ return radius
+
+func set_radius(val : float) -> void:
+ radius = val
+
+ emit_changed()
+ output.emit_changed()
+
+#width
+func get_width() -> float:
+ return width
+
+func set_width(val : float) -> void:
+ width = val
+
+ emit_changed()
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_shape_box.gd b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_shape_box.gd
new file mode 100644
index 000000000..35c866eec
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_shape_box.gd
@@ -0,0 +1,49 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF2D = preload("res://addons/mat_maker_gd/nodes/common/sdf2d.gd")
+
+export(Resource) var output : Resource
+export(Vector2) var center : Vector2 = Vector2(0, 0)
+export(Vector2) var size : Vector2 = Vector2(0.3, 0.2)
+
+func _init_properties():
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Output >>>"
+ output.get_value_from_owner = true
+
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_vector2("get_center", "set_center", "Center", 0.01)
+ mm_graph_node.add_slot_vector2("get_size", "set_size", "Size", 0.01)
+
+func get_property_value(uv : Vector2) -> float:
+ return SDF2D.sdf_box(uv, center, size)
+
+#center
+func get_center() -> Vector2:
+ return center
+
+func set_center(val : Vector2) -> void:
+ center = val
+
+ emit_changed()
+ output.emit_changed()
+
+#size
+func get_size() -> Vector2:
+ return size
+
+func set_size(val : Vector2) -> void:
+ size = val
+
+ emit_changed()
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_shape_circle.gd b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_shape_circle.gd
new file mode 100644
index 000000000..bc8488a47
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_shape_circle.gd
@@ -0,0 +1,49 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF2D = preload("res://addons/mat_maker_gd/nodes/common/sdf2d.gd")
+
+export(Resource) var output : Resource
+export(Vector2) var center : Vector2 = Vector2(0, 0)
+export(float) var radius : float = 0.4
+
+func _init_properties():
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Output >>>"
+ output.get_value_from_owner = true
+
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_vector2("get_center", "set_center", "Center", 0.01)
+ mm_graph_node.add_slot_float("get_radius", "set_radius", "Radius", 0.01)
+
+func get_property_value(uv : Vector2) -> float:
+ return SDF2D.sdf_circle(uv, center, radius)
+
+#center
+func get_center() -> Vector2:
+ return center
+
+func set_center(val : Vector2) -> void:
+ center = val
+
+ emit_changed()
+ output.emit_changed()
+
+#radius
+func get_radius() -> float:
+ return radius
+
+func set_radius(val : float) -> void:
+ radius = val
+
+ emit_changed()
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_shape_line.gd b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_shape_line.gd
new file mode 100644
index 000000000..fa3a5e4a5
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_shape_line.gd
@@ -0,0 +1,74 @@
+tool
+extends "res://addons/mat_maker_gd/nodes/bases/curve_base.gd"
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF2D = preload("res://addons/mat_maker_gd/nodes/common/sdf2d.gd")
+var Curves = preload("res://addons/mat_maker_gd/nodes/common/curves.gd")
+
+export(Resource) var output : Resource
+export(Vector2) var A : Vector2 = Vector2(-0.3, -0.3)
+export(Vector2) var B : Vector2 = Vector2(0.3, 0.3)
+export(float) var width : float = 0.1
+
+func _init():
+ init_points_11()
+
+func _init_properties():
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Output >>>"
+ output.get_value_from_owner = true
+
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_vector2("get_a", "set_a", "A", 0.01)
+ mm_graph_node.add_slot_vector2("get_b", "set_b", "B", 0.01)
+ mm_graph_node.add_slot_float("get_width", "set_width", "Width", 0.01)
+ mm_graph_node.add_slot_curve()
+
+func get_property_value(uv : Vector2) -> float:
+ var line : Vector2 = SDF2D.sdf_line(uv, A, B, width)
+
+ #$(name_uv)_sdl.x - $r * $profile($(name_uv)_sdl.y)
+
+ return line.x - width * Curves.curve(line.y, points)
+
+#a
+func get_a() -> Vector2:
+ return A
+
+func set_a(val : Vector2) -> void:
+ A = val
+
+ emit_changed()
+ output.emit_changed()
+
+#b
+func get_b() -> Vector2:
+ return B
+
+func set_b(val : Vector2) -> void:
+ B = val
+
+ emit_changed()
+ output.emit_changed()
+
+#width
+func get_width() -> float:
+ return width
+
+func set_width(val : float) -> void:
+ width = val
+
+ emit_changed()
+ output.emit_changed()
+
+func _curve_changed() -> void:
+ emit_changed()
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_shape_polygon.gd b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_shape_polygon.gd
new file mode 100644
index 000000000..daecf362e
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_shape_polygon.gd
@@ -0,0 +1,29 @@
+tool
+extends "res://addons/mat_maker_gd/nodes/bases/polygon_base.gd"
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF2D = preload("res://addons/mat_maker_gd/nodes/common/sdf2d.gd")
+
+export(Resource) var output : Resource
+
+func _init_properties():
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Output >>>"
+ output.get_value_from_owner = true
+
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(output)
+ mm_graph_node.add_slot_polygon()
+
+func get_property_value(uv : Vector2) -> float:
+ return SDF2D.sdPolygon(uv, points)
+
+func _polygon_changed() -> void:
+ emit_changed()
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_shape_rhombus.gd b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_shape_rhombus.gd
new file mode 100644
index 000000000..07b5ed48c
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_shape_rhombus.gd
@@ -0,0 +1,49 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF2D = preload("res://addons/mat_maker_gd/nodes/common/sdf2d.gd")
+
+export(Resource) var output : Resource
+export(Vector2) var center : Vector2 = Vector2(0, 0)
+export(Vector2) var size : Vector2 = Vector2(0.3, 0.2)
+
+func _init_properties():
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Output >>>"
+ output.get_value_from_owner = true
+
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_vector2("get_center", "set_center", "Center", 0.01)
+ mm_graph_node.add_slot_vector2("get_size", "set_size", "Size", 0.01)
+
+func get_property_value(uv : Vector2) -> float:
+ return SDF2D.sdf_rhombus(uv, center, size)
+
+#center
+func get_center() -> Vector2:
+ return center
+
+func set_center(val : Vector2) -> void:
+ center = val
+
+ emit_changed()
+ output.emit_changed()
+
+#size
+func get_size() -> Vector2:
+ return size
+
+func set_size(val : Vector2) -> void:
+ size = val
+
+ emit_changed()
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_show.gd b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_show.gd
new file mode 100644
index 000000000..65697a74c
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_show.gd
@@ -0,0 +1,67 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF2D = preload("res://addons/mat_maker_gd/nodes/common/sdf2d.gd")
+
+export(Resource) var image : Resource
+export(Resource) var input : Resource
+export(float) var bevel : float = 0
+export(float) var base : float = 0
+
+func _init_properties():
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+
+ #for some reason this doesn't work, todo check
+# input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = "Input"
+
+ register_output_property(image)
+ register_input_property(input)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_label_universal(input)
+
+ mm_graph_node.add_slot_float("get_bevel", "set_bevel", "Bevel", 0.01)
+ mm_graph_node.add_slot_float("get_base", "set_base", "Base", 0.01)
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ var f : float = input.get_value(uv)
+
+ #clamp($base-$in($uv)/max($bevel, 0.00001), 0.0, 1.0)
+ var cf : float = clamp(base - f / max(bevel, 0.00001), 0.0, 1.0)
+
+ return Color(cf, cf, cf, 1)
+
+#bevel
+func get_bevel() -> float:
+ return bevel
+
+func set_bevel(val : float) -> void:
+ bevel = val
+
+ set_dirty(true)
+
+#base
+func get_base() -> float:
+ return base
+
+func set_base(val : float) -> void:
+ base = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_tf_rotate.gd b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_tf_rotate.gd
new file mode 100644
index 000000000..9ec52f7e0
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_tf_rotate.gd
@@ -0,0 +1,41 @@
+tool
+extends MMNode
+
+var SDF2D = preload("res://addons/mat_maker_gd/nodes/common/sdf2d.gd")
+
+export(Resource) var output : Resource
+export(float) var angle : float = 0
+
+func _init_properties():
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+
+ output.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ #output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Apply >>>"
+ output.get_value_from_owner = true
+
+ register_input_property(output)
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_float("get_angle", "set_angle", "Angle", 1)
+
+func get_property_value(uv : Vector2):
+ #$in(sdf2d_rotate($uv, $a*0.01745329251))",
+ return output.get_value(SDF2D.sdf2d_rotate(uv, angle * 0.01745329251), true)
+
+#angle
+func get_angle() -> float:
+ return angle
+
+func set_angle(val : float) -> void:
+ angle = val
+
+ emit_changed()
+ output.emit_changed()
+
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_tf_scale.gd b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_tf_scale.gd
new file mode 100644
index 000000000..f6302fa28
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_tf_scale.gd
@@ -0,0 +1,41 @@
+tool
+extends MMNode
+
+var SDF2D = preload("res://addons/mat_maker_gd/nodes/common/sdf2d.gd")
+
+export(Resource) var output : Resource
+export(float) var scale : float = 1
+
+func _init_properties():
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+
+ output.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ #output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Apply >>>"
+ output.get_value_from_owner = true
+
+ register_input_property(output)
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_float("get_scale", "set_scale", "Scale", 0.01)
+
+func get_property_value(uv : Vector2):
+ #$in(($uv-vec2(0.5))/$s+vec2(0.5))*$s
+ return output.get_value(((uv - Vector2(0.5, 0.5)) / scale + Vector2(0.5, 0.5)), true)
+
+#scale
+func get_scale() -> float:
+ return scale
+
+func set_scale(val : float) -> void:
+ scale = val
+
+ emit_changed()
+ output.emit_changed()
+
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_tf_translate.gd b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_tf_translate.gd
new file mode 100644
index 000000000..c3099e0bb
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf2d/sd_tf_translate.gd
@@ -0,0 +1,38 @@
+tool
+extends MMNode
+
+export(Resource) var output : Resource
+export(Vector2) var translation : Vector2 = Vector2(0, 0)
+
+func _init_properties():
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+
+ output.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ #output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Apply >>>"
+ output.get_value_from_owner = true
+
+ register_input_property(output)
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_vector2("get_translation", "set_translation", "Translation", 0.01)
+
+func get_property_value(uv : Vector2):
+ return output.get_value(uv - translation, true)
+
+#a
+func get_translation() -> Vector2:
+ return translation
+
+func set_translation(val : Vector2) -> void:
+ translation = val
+
+ emit_changed()
+ output.emit_changed()
+
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_color.gd b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_color.gd
new file mode 100644
index 000000000..4c26ee4ec
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_color.gd
@@ -0,0 +1,59 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF3D = preload("res://addons/mat_maker_gd/nodes/common/sdf3d.gd")
+
+export(Resource) var input : Resource
+export(Resource) var output : Resource
+export(float) var color : float = 0.5
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+# input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_VECTOR2
+ input.slot_name = ">>> Input "
+ if !input.is_connected("changed", self, "on_input_changed"):
+ input.connect("changed", self, "on_input_changed")
+
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Output >>>"
+ output.get_value_from_owner = true
+
+ register_input_property(input)
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_float("get_color", "set_color", "Color", 0.01)
+
+func get_property_value_sdf3d(uv3 : Vector3) -> Vector2:
+ var v : Vector2 = input.get_value_sdf3d(uv3)
+
+ v.y = color
+
+ return v
+
+
+#color
+func get_color() -> float:
+ return color
+
+func set_color(val : float) -> void:
+ color = val
+
+ emit_changed()
+ output.emit_changed()
+
+func on_input_changed() -> void:
+ emit_changed()
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_op_bool.gd b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_op_bool.gd
new file mode 100644
index 000000000..bff35381c
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_op_bool.gd
@@ -0,0 +1,79 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF3D = preload("res://addons/mat_maker_gd/nodes/common/sdf3d.gd")
+
+export(Resource) var input1 : Resource
+export(Resource) var input2 : Resource
+export(Resource) var output : Resource
+export(int, "Union,Substraction,Intersection") var operation : int = 0
+
+func _init_properties():
+ if !input1:
+ input1 = MMNodeUniversalProperty.new()
+ input1.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ input1.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+# input1.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_VECTOR2
+ input1.slot_name = ">>> Input 1 "
+
+ if !input1.is_connected("changed", self, "on_input_changed"):
+ input1.connect("changed", self, "on_input_changed")
+
+ if !input2:
+ input2 = MMNodeUniversalProperty.new()
+ input2.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ input2.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+# input2.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_VECTOR2
+ input2.slot_name = ">>> Input 2 "
+
+ if !input2.is_connected("changed", self, "on_input_changed"):
+ input2.connect("changed", self, "on_input_changed")
+
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Output >>>"
+ output.get_value_from_owner = true
+
+ register_input_property(input1)
+ register_input_property(input2)
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input1)
+ mm_graph_node.add_slot_label_universal(input2)
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_enum("get_operation", "set_operation", "Operation", [ "Union", "Substraction", "Intersection" ])
+
+func get_property_value_sdf3d(uv3 : Vector3) -> Vector2:
+ var s1 : Vector2 = input1.get_value_sdf3d(uv3)
+ var s2 : Vector2 = input2.get_value_sdf3d(uv3)
+
+ if operation == 0:
+ return SDF3D.sdf3dc_union(s1, s2)
+ elif operation == 1:
+ return SDF3D.sdf3dc_sub(s1, s2)
+ elif operation == 2:
+ return SDF3D.sdf3dc_inter(s1, s2)
+
+ return Vector2()
+
+#operation
+func get_operation() -> int:
+ return operation
+
+func set_operation(val : int) -> void:
+ operation = val
+
+ emit_changed()
+ output.emit_changed()
+
+func on_input_changed() -> void:
+ emit_changed()
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_op_circle_repeat.gd b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_op_circle_repeat.gd
new file mode 100644
index 000000000..9186c89fb
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_op_circle_repeat.gd
@@ -0,0 +1,59 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF3D = preload("res://addons/mat_maker_gd/nodes/common/sdf3d.gd")
+
+export(Resource) var input : Resource
+export(Resource) var output : Resource
+export(int) var count : int = 5
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+# input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_VECTOR2
+ input.slot_name = ">>> Input "
+
+ if !input.is_connected("changed", self, "on_input_changed"):
+ input.connect("changed", self, "on_input_changed")
+
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Output >>>"
+ output.get_value_from_owner = true
+
+ register_input_property(input)
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_int("get_count", "set_count", "Count")
+
+func get_property_value_sdf3d(uv3 : Vector3) -> Vector2:
+ #todo make seed a class variable probably into MMNode
+
+ var new_uv : Vector3 = SDF3D.circle_repeat_transform(uv3, count)
+
+ return input.get_value_sdf3d(new_uv)
+
+#count
+func get_count() -> int:
+ return count
+
+func set_count(val : int) -> void:
+ count = val
+
+ emit_changed()
+ output.emit_changed()
+
+func on_input_changed() -> void:
+ emit_changed()
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_op_elongation.gd b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_op_elongation.gd
new file mode 100644
index 000000000..b0b52d29f
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_op_elongation.gd
@@ -0,0 +1,59 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF3D = preload("res://addons/mat_maker_gd/nodes/common/sdf3d.gd")
+
+export(Resource) var input : Resource
+export(Resource) var output : Resource
+export(Vector3) var length : Vector3 = Vector3(0.2, 0, 0)
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+# input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_VECTOR2
+ input.slot_name = ">>> Input "
+ if !input.is_connected("changed", self, "on_input_changed"):
+ input.connect("changed", self, "on_input_changed")
+
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Output >>>"
+ output.get_value_from_owner = true
+
+ register_input_property(input)
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_vector3("get_length", "set_length", "Length", 0.01)
+
+func get_property_value_sdf3d(uv3 : Vector3) -> Vector2:
+ #$in($uv - clamp($uv, -abs(vec3($x, $y, $z)), abs(vec3($x, $y, $z))))
+
+ var new_uv : Vector3 = uv3 - Commons.clampv3(uv3, -Commons.absv3(length), Commons.absv3(length))
+
+ return input.get_value_sdf3d(new_uv)
+
+
+#length
+func get_length() -> Vector3:
+ return length
+
+func set_length(val : Vector3) -> void:
+ length = val
+
+ emit_changed()
+ output.emit_changed()
+
+func on_input_changed() -> void:
+ emit_changed()
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_op_extrusion.gd b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_op_extrusion.gd
new file mode 100644
index 000000000..7f7613a46
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_op_extrusion.gd
@@ -0,0 +1,63 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF3D = preload("res://addons/mat_maker_gd/nodes/common/sdf3d.gd")
+
+export(Resource) var input : Resource
+export(Resource) var output : Resource
+export(float) var length : float = 0.25
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+# input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ input.slot_name = ">>> Input "
+
+ if !input.is_connected("changed", self, "on_input_changed"):
+ input.connect("changed", self, "on_input_changed")
+
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Output >>>"
+ output.get_value_from_owner = true
+
+ register_input_property(input)
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_float("get_length", "set_length", "Length", 0.01)
+
+func get_property_value_sdf3d(uv3 : Vector3) -> Vector2:
+ #vec2 $(name_uv)_w = vec2($in($uv.xz+vec2(0.5)),abs($uv.y)-$d);
+ #ret min(max($(name_uv)_w.x,$(name_uv)_w.y),0.0)+length(max($(name_uv)_w,0.0))
+
+ var f : float = input.get_value(Vector2(uv3.x, uv3.z) + Vector2(0.5, 0.5))
+ var w : Vector2 = Vector2(f, abs(uv3.y) - length)
+
+ var ff : float = min(max(w.x,w.y),0.0) + Commons.maxv2(w, Vector2()).length()
+
+ return Vector2(ff, 0)
+
+#length
+func get_length() -> float:
+ return length
+
+func set_length(val : float) -> void:
+ length = val
+
+ emit_changed()
+ output.emit_changed()
+
+func on_input_changed() -> void:
+ emit_changed()
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_op_morph.gd b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_op_morph.gd
new file mode 100644
index 000000000..67f70a613
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_op_morph.gd
@@ -0,0 +1,74 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF3D = preload("res://addons/mat_maker_gd/nodes/common/sdf3d.gd")
+
+export(Resource) var input1 : Resource
+export(Resource) var input2 : Resource
+export(Resource) var output : Resource
+export(float) var amount : float = 0.5
+
+func _init_properties():
+ if !input1:
+ input1 = MMNodeUniversalProperty.new()
+ input1.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ input1.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+# input1.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_VECTOR2
+ input1.slot_name = ">>> Input 1 "
+
+ if !input1.is_connected("changed", self, "on_input_changed"):
+ input1.connect("changed", self, "on_input_changed")
+
+ if !input2:
+ input2 = MMNodeUniversalProperty.new()
+ input2.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ input2.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+# input2.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_VECTOR2
+ input2.slot_name = ">>> Input 2 "
+
+ if !input2.is_connected("changed", self, "on_input_changed"):
+ input2.connect("changed", self, "on_input_changed")
+
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Output >>>"
+ output.get_value_from_owner = true
+
+ register_input_property(input1)
+ register_input_property(input2)
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input1)
+ mm_graph_node.add_slot_label_universal(input2)
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_float("get_amount", "set_amount", "Amount", 0.01)
+
+func get_property_value_sdf3d(uv3 : Vector3) -> Vector2:
+ var s1 : Vector2 = input1.get_value_sdf3d(uv3)
+ var s2 : Vector2 = input2.get_value_sdf3d(uv3)
+
+ #mix($in1($uv), $in2($uv), $amount)
+
+ return lerp(s1, s2, amount)
+
+#amount
+func get_amount() -> float:
+ return amount
+
+func set_amount(val : float) -> void:
+ amount = val
+
+ emit_changed()
+ output.emit_changed()
+
+func on_input_changed() -> void:
+ emit_changed()
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_op_repeat.gd b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_op_repeat.gd
new file mode 100644
index 000000000..f428e96a4
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_op_repeat.gd
@@ -0,0 +1,71 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF3D = preload("res://addons/mat_maker_gd/nodes/common/sdf3d.gd")
+
+export(Resource) var input : Resource
+export(Resource) var output : Resource
+export(Vector2) var col_row : Vector2 = Vector2(3, 3)
+export(float) var rotation : float = 0.3
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+# input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_VECTOR2
+ input.slot_name = ">>> Input "
+
+ if !input.is_connected("changed", self, "on_input_changed"):
+ input.connect("changed", self, "on_input_changed")
+
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Output >>>"
+ output.get_value_from_owner = true
+
+ register_input_property(input)
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_vector2("get_col_row", "set_col_row", "Col,Row", 1)
+ mm_graph_node.add_slot_float("get_rotation", "set_rotation", "Rotation", 0.01)
+
+func get_property_value_sdf3d(uv3 : Vector3) -> Vector2:
+ #todo make seed a class variable probably into MMNode
+
+ var new_uv : Vector3 = SDF3D.sdf3d_repeat(uv3, col_row, rotation, 1)
+
+ return input.get_value_sdf3d(new_uv)
+
+#col_row
+func get_col_row() -> Vector2:
+ return col_row
+
+func set_col_row(val : Vector2) -> void:
+ col_row = val
+
+ emit_changed()
+ output.emit_changed()
+
+#rotation
+func get_rotation() -> float:
+ return rotation
+
+func set_rotation(val : float) -> void:
+ rotation = val
+
+ emit_changed()
+ output.emit_changed()
+
+func on_input_changed() -> void:
+ emit_changed()
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_op_revolution.gd b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_op_revolution.gd
new file mode 100644
index 000000000..98df2ab58
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_op_revolution.gd
@@ -0,0 +1,60 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF3D = preload("res://addons/mat_maker_gd/nodes/common/sdf3d.gd")
+
+export(Resource) var input : Resource
+export(Resource) var output : Resource
+export(float) var offset : float = 0.25
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+# input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ input.slot_name = ">>> Input "
+
+ if !input.is_connected("changed", self, "on_input_changed"):
+ input.connect("changed", self, "on_input_changed")
+
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Output >>>"
+ output.get_value_from_owner = true
+
+ register_input_property(input)
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_float("get_offset", "set_offset", "Offset", 0.01)
+
+func get_property_value_sdf3d(uv3 : Vector3) -> Vector2:
+ #vec2 $(name_uv)_q = vec2(length($uv.xy) - $d + 0.5, $uv.z + 0.5);
+
+ var uv : Vector2 = Vector2(Vector2(uv3.x, uv3.y).length() - offset + 0.5, uv3.z + 0.5)
+ var f : float = input.get_value(uv)
+
+ return Vector2(f, 0)
+
+#offset
+func get_offset() -> float:
+ return offset
+
+func set_offset(val : float) -> void:
+ offset = val
+
+ emit_changed()
+ output.emit_changed()
+
+func on_input_changed() -> void:
+ emit_changed()
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_op_rounded.gd b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_op_rounded.gd
new file mode 100644
index 000000000..338c510c6
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_op_rounded.gd
@@ -0,0 +1,61 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF3D = preload("res://addons/mat_maker_gd/nodes/common/sdf3d.gd")
+
+export(Resource) var input : Resource
+export(Resource) var output : Resource
+export(float) var radius : float = 0.15
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+# input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_VECTOR2
+ input.slot_name = ">>> Input "
+ if !input.is_connected("changed", self, "on_input_changed"):
+ input.connect("changed", self, "on_input_changed")
+
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Output >>>"
+ output.get_value_from_owner = true
+
+ register_input_property(input)
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_float("get_radius", "set_radius", "Radius", 0.01)
+
+func get_property_value_sdf3d(uv3 : Vector3) -> Vector2:
+ var v : Vector2 = input.get_value_sdf3d(uv3)
+
+ #vec2($(name_uv)_v.x-$r, $(name_uv)_v.y)
+
+ v.x -= radius
+
+ return v
+
+
+#radius
+func get_radius() -> float:
+ return radius
+
+func set_radius(val : float) -> void:
+ radius = val
+
+ emit_changed()
+ output.emit_changed()
+
+func on_input_changed() -> void:
+ emit_changed()
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_op_smooth_bool.gd b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_op_smooth_bool.gd
new file mode 100644
index 000000000..01e03fec3
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_op_smooth_bool.gd
@@ -0,0 +1,91 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF3D = preload("res://addons/mat_maker_gd/nodes/common/sdf3d.gd")
+
+export(Resource) var input1 : Resource
+export(Resource) var input2 : Resource
+export(Resource) var output : Resource
+export(int, "Union,Substraction,Intersection") var operation : int = 0
+export(float) var smoothness : float = 0.15
+
+func _init_properties():
+ if !input1:
+ input1 = MMNodeUniversalProperty.new()
+ input1.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ input1.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+# input1.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_VECTOR2
+ input1.slot_name = ">>> Input 1 "
+
+ if !input1.is_connected("changed", self, "on_input_changed"):
+ input1.connect("changed", self, "on_input_changed")
+
+ if !input2:
+ input2 = MMNodeUniversalProperty.new()
+ input2.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ input2.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+# input2.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_VECTOR2
+ input2.slot_name = ">>> Input 2 "
+
+ if !input2.is_connected("changed", self, "on_input_changed"):
+ input2.connect("changed", self, "on_input_changed")
+
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Output >>>"
+ output.get_value_from_owner = true
+
+ register_input_property(input1)
+ register_input_property(input2)
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input1)
+ mm_graph_node.add_slot_label_universal(input2)
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_enum("get_operation", "set_operation", "Operation", [ "Union", "Substraction", "Intersection" ])
+ mm_graph_node.add_slot_float("get_smoothness", "set_smoothness", "Smoothness", 0.01)
+
+func get_property_value_sdf3d(uv3 : Vector3) -> Vector2:
+ var s1 : Vector2 = input1.get_value_sdf3d(uv3)
+ var s2 : Vector2 = input2.get_value_sdf3d(uv3)
+
+ if operation == 0:
+ return SDF3D.sdf3d_smooth_union(s1, s2, smoothness)
+ elif operation == 1:
+ return SDF3D.sdf3d_smooth_subtraction(s1, s2, smoothness)
+ elif operation == 2:
+ return SDF3D.sdf3d_smooth_intersection(s1, s2, smoothness)
+
+ return Vector2()
+
+#operation
+func get_operation() -> int:
+ return operation
+
+func set_operation(val : int) -> void:
+ operation = val
+
+ emit_changed()
+ output.emit_changed()
+
+#smoothness
+func get_smoothness() -> float:
+ return smoothness
+
+func set_smoothness(val : float) -> void:
+ smoothness = val
+
+ emit_changed()
+ output.emit_changed()
+
+func on_input_changed() -> void:
+ emit_changed()
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_render.gd b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_render.gd
new file mode 100644
index 000000000..4bd29188d
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_render.gd
@@ -0,0 +1,179 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF2D = preload("res://addons/mat_maker_gd/nodes/common/sdf3d.gd")
+
+export(Resource) var input : Resource
+
+export(Resource) var out_height_map : Resource
+export(Resource) var out_normal_map : Resource
+export(Resource) var out_color_map : Resource
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ #for some reason this doesn't work, todo check
+# input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = "Input"
+
+ if !out_height_map:
+ out_height_map = MMNodeUniversalProperty.new()
+ out_height_map.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ out_height_map.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !out_normal_map:
+ out_normal_map = MMNodeUniversalProperty.new()
+ out_normal_map.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ out_normal_map.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !out_color_map:
+ out_color_map = MMNodeUniversalProperty.new()
+ out_color_map.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ out_color_map.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ register_output_property(out_height_map)
+ register_output_property(out_normal_map)
+ register_output_property(out_color_map)
+ register_input_property(input)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_texture_universal(out_height_map)
+ mm_graph_node.add_slot_texture_universal(out_normal_map)
+ mm_graph_node.add_slot_texture_universal(out_color_map)
+
+
+func _render(material) -> void:
+ var height_map : Image = Image.new()
+ var normal_map : Image = Image.new()
+ var color_map : Image = Image.new()
+
+ height_map.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+ normal_map.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+ color_map.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+
+ height_map.lock()
+ normal_map.lock()
+ color_map.lock()
+
+ var w : float = material.image_size.x
+ var h : float = material.image_size.y
+
+ var pseed : float = randf() + randi()
+
+ for x in range(material.image_size.x):
+ for y in range(material.image_size.y):
+ var uv : Vector2 = Vector2(x / w, y / h)
+
+ var raymarch : Vector2 = sdf3d_raymarch(uv)
+
+ #HeightMap - float - The generated height map
+ #1.0-$(name_uv)_d.x
+ var hmf : float = 1.0 - raymarch.x
+ var height_map_col : Color = Color(hmf, hmf, hmf, 1)
+
+ #NormalMap - rgb - The generated normal map
+ #vec3(0.5) + 0.5* normal_$name(vec3($uv-vec2(0.5), 1.0-$(name_uv)_d.x))
+ var nuv : Vector2 = uv - Vector2(0.5, 0.5)
+ var n : Vector3 = sdf3d_normal(Vector3(nuv.x, nuv.y, 1.0 - raymarch.x))
+ var nn : Vector3 = Vector3(0.5, 0.5, 0.5) + 0.5 * n
+
+ var normal_map_col : Color = Color(nn.x, nn.y, nn.z, 1)
+
+ #ColorMap - float - The generated color index map
+ #$(name_uv)_d.y
+ var color_map_col : Color = Color(raymarch.y, raymarch.y, raymarch.y, 1)
+
+ height_map.set_pixel(x, y, height_map_col)
+ normal_map.set_pixel(x, y, normal_map_col)
+ color_map.set_pixel(x, y, color_map_col)
+
+ height_map.unlock()
+ normal_map.unlock()
+ color_map.unlock()
+
+ out_height_map.set_value(height_map)
+ out_normal_map.set_value(normal_map)
+ out_color_map.set_value(color_map)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ return Color()
+
+#vec2 raymarch_$name(vec2 uv) {
+# vec3 ro = vec3(uv-vec2(0.5), 1.0);
+# vec3 rd = vec3(0.0, 0.0, -1.0);
+# float dO = 0.0;
+# float c = 0.0;
+#
+# for (int i=0; i < 100; i++) {
+# vec3 p = ro + rd*dO;
+# vec2 dS = $sdf(p);
+# dO += dS.x;
+#
+# if (dO >= 1.0) {
+# break;
+# } else if (dS.x < 0.0001) {
+# c = dS.y;
+# break;
+# }
+# }
+#
+# return vec2(dO, c);
+#}
+
+func sdf3d_raymarch(uv : Vector2) -> Vector2:
+ var ro : Vector3 = Vector3(uv.x - 0.5, uv.y - 0.5, 1.0);
+ var rd : Vector3 = Vector3(0.0, 0.0, -1.0);
+ var dO : float = 0.0;
+ var c : float = 0.0;
+
+ for i in range(100):
+ var p : Vector3 = ro + rd * dO;
+ var dS : Vector2 = input.get_value_sdf3d(p)
+
+ dO += dS.x;
+
+ if (dO >= 1.0):
+ break;
+ elif (dS.x < 0.0001):
+ c = dS.y;
+ break;
+
+ return Vector2(dO, c);
+
+#vec3 normal_$name(vec3 p) {
+# if (p.z <= 0.0) {
+# return vec3(0.0, 0.0, 1.0);
+# }
+#
+# float d = $sdf(p).x;
+# float e = .001;
+# vec3 n = d - vec3(
+# $sdf(p-vec3(e, 0.0, 0.0)).x,
+# $sdf(p-vec3(0.0, e, 0.0)).x,
+# $sdf(p-vec3(0.0, 0.0, e)).x);
+#
+# return vec3(-1.0, -1.0, -1.0)*normalize(n);
+#}
+
+func sdf3d_normal(p : Vector3) -> Vector3:
+ if (p.z <= 0.0):
+ return Vector3(0.0, 0.0, 1.0);
+
+ var d : float = input.get_value_sdf3d(p).x
+ var e : float = .001;
+
+ var n : Vector3 = Vector3(
+ d - input.get_value_sdf3d(p - Vector3(e, 0.0, 0.0)).x,
+ d - input.get_value_sdf3d(p - Vector3(0.0, e, 0.0)).x,
+ d - input.get_value_sdf3d(p - Vector3(0.0, 0.0, e)).x)
+
+ return Vector3(-1.0, -1.0, -1.0) * n.normalized()
+
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_shape_box.gd b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_shape_box.gd
new file mode 100644
index 000000000..3711c3c9d
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_shape_box.gd
@@ -0,0 +1,49 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF3D = preload("res://addons/mat_maker_gd/nodes/common/sdf3d.gd")
+
+export(Resource) var output : Resource
+export(Vector3) var size : Vector3 = Vector3(0.3, 0.25, 0.25)
+export(float) var radius : float = 0.01
+
+func _init_properties():
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Output >>>"
+ output.get_value_from_owner = true
+
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_vector3("get_size", "set_size", "Size", 0.01)
+ mm_graph_node.add_slot_float("get_radius", "set_radius", "Radius", 0.01)
+
+func get_property_value_sdf3d(uv3 : Vector3) -> Vector2:
+ return SDF3D.sdf3d_box(uv3, size.x, size.y, size.z, radius)
+
+#size
+func get_size() -> Vector3:
+ return size
+
+func set_size(val : Vector3) -> void:
+ size = val
+
+ emit_changed()
+ output.emit_changed()
+
+#radius
+func get_radius() -> float:
+ return radius
+
+func set_radius(val : float) -> void:
+ radius = val
+
+ emit_changed()
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_shape_capsule.gd b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_shape_capsule.gd
new file mode 100644
index 000000000..138f88181
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_shape_capsule.gd
@@ -0,0 +1,111 @@
+tool
+extends "res://addons/mat_maker_gd/nodes/bases/curve_base.gd"
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF3D = preload("res://addons/mat_maker_gd/nodes/common/sdf3d.gd")
+var Curves = preload("res://addons/mat_maker_gd/nodes/common/curves.gd")
+
+export(Resource) var output : Resource
+export(int, "X,Y,Z") var axis : int = 1
+export(float) var length : float = 0.3
+export(float) var radius : float = 0.2
+
+func _init():
+ init_points_11()
+
+func _init_properties():
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Output >>>"
+ output.get_value_from_owner = true
+
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_enum("get_axis", "set_axis", "Axis", [ "X", "Y", "Z" ])
+ mm_graph_node.add_slot_float("get_length", "set_length", "Length", 0.01)
+ mm_graph_node.add_slot_float("get_radius", "set_radius", "Radius", 0.01)
+ mm_graph_node.add_slot_curve()
+
+func get_property_value_sdf3d(uv3 : Vector3) -> Vector2:
+ if axis == 0:
+ return sdf3d_capsule_x(uv3, radius, length)
+ elif axis == 1:
+ return sdf3d_capsule_y(uv3, radius, length)
+ elif axis == 2:
+ return sdf3d_capsule_z(uv3, radius, length)
+
+ return Vector2()
+
+#vec3 $(name_uv)_p = $uv;
+#$(name_uv)_p.$axis -= clamp($(name_uv)_p.$axis, -$l, $l);
+#return length($(name_uv)_p) - $r * $profile(clamp(0.5+0.5*($uv).$axis/$l, 0.0, 1.0))
+
+func sdf3d_capsule_y(p : Vector3, r : float, l : float) -> Vector2:
+ var v : Vector3 = p;
+ v.y -= clamp(v.y, -l, l);
+
+ var cx : float = clamp(0.5 + 0.5 * p.y / l, 0.0, 1.0)
+ var cp : float = Curves.curve(cx, points)
+ var f : float = v.length() - r * cp
+
+ return Vector2(f, 0.0);
+
+func sdf3d_capsule_x(p : Vector3, r : float, l : float) -> Vector2:
+ var v : Vector3 = p;
+ v.x -= clamp(v.x, -l, l);
+
+ var cx : float = clamp(0.5 + 0.5 * p.x / l, 0.0, 1.0)
+ var cp : float = Curves.curve(cx, points)
+ var f : float = v.length() - r * cp
+
+ return Vector2(f, 0.0);
+
+func sdf3d_capsule_z(p : Vector3, r : float, l : float) -> Vector2:
+ var v : Vector3 = p;
+ v.z -= clamp(v.z, -l, l);
+
+ var cx : float = clamp(0.5 + 0.5 * p.z / l, 0.0, 1.0)
+ var cp : float = Curves.curve(cx, points)
+ var f : float = v.length() - r * cp
+
+ return Vector2(f, 0.0);
+
+#axis
+func get_axis() -> int:
+ return axis
+
+func set_axis(val : int) -> void:
+ axis = val
+
+ emit_changed()
+ output.emit_changed()
+
+#length
+func get_length() -> float:
+ return length
+
+func set_length(val : float) -> void:
+ length = val
+
+ emit_changed()
+ output.emit_changed()
+
+#radius
+func get_radius() -> float:
+ return radius
+
+func set_radius(val : float) -> void:
+ radius = val
+
+ emit_changed()
+ output.emit_changed()
+
+func _curve_changed() -> void:
+ emit_changed()
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_shape_cone.gd b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_shape_cone.gd
new file mode 100644
index 000000000..9151b46cc
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_shape_cone.gd
@@ -0,0 +1,63 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF3D = preload("res://addons/mat_maker_gd/nodes/common/sdf3d.gd")
+
+export(Resource) var output : Resource
+export(int, "+X,-X,+Y,-Y,+Z,-Z") var axis : int = 2
+export(float) var angle : float = 30
+
+func _init_properties():
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Output >>>"
+ output.get_value_from_owner = true
+
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_enum("get_axis", "set_axis", "Axis", [ "+X", "-X", "+Y", "-Y", "+Z", "-Z" ])
+ mm_graph_node.add_slot_float("get_angle", "set_angle", "Angle", 1)
+
+func get_property_value_sdf3d(uv3 : Vector3) -> Vector2:
+ if axis == 0:
+ return SDF3D.sdf3d_cone_px(uv3, angle)
+ elif axis == 1:
+ return SDF3D.sdf3d_cone_nx(uv3, angle)
+ elif axis == 2:
+ return SDF3D.sdf3d_cone_py(uv3, angle)
+ elif axis == 3:
+ return SDF3D.sdf3d_cone_ny(uv3, angle)
+ elif axis == 4:
+ return SDF3D.sdf3d_cone_pz(uv3, angle)
+ elif axis == 5:
+ return SDF3D.sdf3d_cone_nz(uv3, angle)
+
+ return Vector2()
+
+#axis
+func get_axis() -> int:
+ return axis
+
+func set_axis(val : int) -> void:
+ axis = val
+
+ emit_changed()
+ output.emit_changed()
+
+#angle
+func get_angle() -> float:
+ return angle
+
+func set_angle(val : float) -> void:
+ angle = val
+
+ emit_changed()
+ output.emit_changed()
+
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_shape_cylinder.gd b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_shape_cylinder.gd
new file mode 100644
index 000000000..f13c3c2fd
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_shape_cylinder.gd
@@ -0,0 +1,68 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF3D = preload("res://addons/mat_maker_gd/nodes/common/sdf3d.gd")
+
+export(Resource) var output : Resource
+export(int, "X,Y,Z") var axis : int = 1
+export(float) var length : float = 0.25
+export(float) var radius : float = 0.25
+
+func _init_properties():
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Output >>>"
+ output.get_value_from_owner = true
+
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_enum("get_axis", "set_axis", "Axis", [ "X", "Y", "Z" ])
+ mm_graph_node.add_slot_float("get_length", "set_length", "Length", 0.01)
+ mm_graph_node.add_slot_float("get_radius", "set_radius", "Radius", 0.01)
+
+func get_property_value_sdf3d(uv3 : Vector3) -> Vector2:
+ if axis == 0:
+ return SDF3D.sdf3d_cylinder_x(uv3, radius, length)
+ elif axis == 1:
+ return SDF3D.sdf3d_cylinder_y(uv3, radius, length)
+ elif axis == 2:
+ return SDF3D.sdf3d_cylinder_z(uv3, radius, length)
+
+ return Vector2()
+
+#axis
+func get_axis() -> int:
+ return axis
+
+func set_axis(val : int) -> void:
+ axis = val
+
+ emit_changed()
+ output.emit_changed()
+
+#length
+func get_length() -> float:
+ return length
+
+func set_length(val : float) -> void:
+ length = val
+
+ emit_changed()
+ output.emit_changed()
+
+#radius
+func get_radius() -> float:
+ return radius
+
+func set_radius(val : float) -> void:
+ radius = val
+
+ emit_changed()
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_shape_sphere.gd b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_shape_sphere.gd
new file mode 100644
index 000000000..145206bcc
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_shape_sphere.gd
@@ -0,0 +1,37 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF3D = preload("res://addons/mat_maker_gd/nodes/common/sdf3d.gd")
+
+export(Resource) var output : Resource
+export(float) var radius : float = 0.5
+
+func _init_properties():
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Output >>>"
+ output.get_value_from_owner = true
+
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_float("get_radius", "set_radius", "Radius", 0.01)
+
+func get_property_value_sdf3d(uv3 : Vector3) -> Vector2:
+ return SDF3D.sdf3d_sphere(uv3, radius)
+
+#radius
+func get_radius() -> float:
+ return radius
+
+func set_radius(val : float) -> void:
+ radius = val
+
+ emit_changed()
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_shape_torus.gd b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_shape_torus.gd
new file mode 100644
index 000000000..682bba52d
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_shape_torus.gd
@@ -0,0 +1,68 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF3D = preload("res://addons/mat_maker_gd/nodes/common/sdf3d.gd")
+
+export(Resource) var output : Resource
+export(int, "X,Y,Z") var axis : int = 2
+export(float) var major_radius : float = 0.3
+export(float) var minor_radius : float = 0.15
+
+func _init_properties():
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Output >>>"
+ output.get_value_from_owner = true
+
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_enum("get_axis", "set_axis", "Axis", [ "X", "Y", "Z" ])
+ mm_graph_node.add_slot_float("get_major_radius", "set_major_radius", "Major_radius", 0.01)
+ mm_graph_node.add_slot_float("get_minor_radius", "set_minor_radius", "Minor_radius", 0.01)
+
+func get_property_value_sdf3d(uv3 : Vector3) -> Vector2:
+ if axis == 0:
+ return SDF3D.sdf3d_torus_x(uv3, major_radius, minor_radius)
+ elif axis == 1:
+ return SDF3D.sdf3d_torus_y(uv3, major_radius, minor_radius)
+ elif axis == 2:
+ return SDF3D.sdf3d_torus_z(uv3, major_radius, minor_radius)
+
+ return Vector2()
+
+#axis
+func get_axis() -> int:
+ return axis
+
+func set_axis(val : int) -> void:
+ axis = val
+
+ emit_changed()
+ output.emit_changed()
+
+#major_radius
+func get_major_radius() -> float:
+ return major_radius
+
+func set_major_radius(val : float) -> void:
+ major_radius = val
+
+ emit_changed()
+ output.emit_changed()
+
+#minor_radius
+func get_minor_radius() -> float:
+ return minor_radius
+
+func set_minor_radius(val : float) -> void:
+ minor_radius = val
+
+ emit_changed()
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_tf_rotate.gd b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_tf_rotate.gd
new file mode 100644
index 000000000..114056c4e
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_tf_rotate.gd
@@ -0,0 +1,57 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF3D = preload("res://addons/mat_maker_gd/nodes/common/sdf3d.gd")
+
+export(Resource) var input : Resource
+export(Resource) var output : Resource
+export(Vector3) var rotation : Vector3 = Vector3()
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+# input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_VECTOR2
+ input.slot_name = ">>> Input "
+
+ if !input.is_connected("changed", self, "on_input_changed"):
+ input.connect("changed", self, "on_input_changed")
+
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Output >>>"
+ output.get_value_from_owner = true
+
+ register_input_property(input)
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_vector3("get_rotation", "set_rotation", "Rotation", 0.01)
+
+func get_property_value_sdf3d(uv3 : Vector3) -> Vector2:
+ #$in(rotate3d($uv, -vec3($ax, $ay, $az)*0.01745329251))
+
+ return input.get_value_sdf3d(SDF3D.rotate3d(uv3, -rotation * 0.01745329251))
+
+#rotation
+func get_rotation() -> Vector3:
+ return rotation
+
+func set_rotation(val : Vector3) -> void:
+ rotation = val
+
+ emit_changed()
+ output.emit_changed()
+
+func on_input_changed() -> void:
+ emit_changed()
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_tf_scale.gd b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_tf_scale.gd
new file mode 100644
index 000000000..e29b633a7
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_tf_scale.gd
@@ -0,0 +1,56 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF3D = preload("res://addons/mat_maker_gd/nodes/common/sdf3d.gd")
+
+export(Resource) var input : Resource
+export(Resource) var output : Resource
+export(float) var scale : float = 1
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+# input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_VECTOR2
+ input.slot_name = ">>> Input "
+
+ if !input.is_connected("changed", self, "on_input_changed"):
+ input.connect("changed", self, "on_input_changed")
+
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Output >>>"
+ output.get_value_from_owner = true
+
+ register_input_property(input)
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_float("get_scale", "set_scale", "Scale", 0.01)
+
+func get_property_value_sdf3d(uv3 : Vector3) -> Vector2:
+ #vec2 $(name_uv)_in = $in(($uv)/$s);
+ return input.get_value_sdf3d(uv3 / scale)
+
+#scale
+func get_scale() -> float:
+ return scale
+
+func set_scale(val : float) -> void:
+ scale = val
+
+ emit_changed()
+ output.emit_changed()
+
+func on_input_changed() -> void:
+ emit_changed()
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_tf_translate.gd b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_tf_translate.gd
new file mode 100644
index 000000000..b166af95b
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/sdf3d/sdf3d_tf_translate.gd
@@ -0,0 +1,56 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF3D = preload("res://addons/mat_maker_gd/nodes/common/sdf3d.gd")
+
+export(Resource) var input : Resource
+export(Resource) var output : Resource
+export(Vector3) var translation : Vector3 = Vector3()
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+# input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_VECTOR2
+ input.slot_name = ">>> Input "
+
+ if !input.is_connected("changed", self, "on_input_changed"):
+ input.connect("changed", self, "on_input_changed")
+
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_VECTOR2
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ output.slot_name = ">>> Output >>>"
+ output.get_value_from_owner = true
+
+ register_input_property(input)
+ register_output_property(output)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_label_universal(output)
+
+ mm_graph_node.add_slot_vector3("get_translation", "set_translation", "Translation", 0.01)
+
+func get_property_value_sdf3d(uv3 : Vector3) -> Vector2:
+ #$in($uv-vec3($x, $y, $z))
+ return input.get_value_sdf3d(uv3 - translation)
+
+#translation
+func get_translation() -> Vector3:
+ return translation
+
+func set_translation(val : Vector3) -> void:
+ translation = val
+
+ emit_changed()
+ output.emit_changed()
+
+func on_input_changed() -> void:
+ emit_changed()
+ output.emit_changed()
diff --git a/modules/material_maker/mat_maker_gd/nodes/simple/curve.gd b/modules/material_maker/mat_maker_gd/nodes/simple/curve.gd
new file mode 100644
index 000000000..c6ed8004f
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/simple/curve.gd
@@ -0,0 +1,118 @@
+tool
+extends MMNode
+
+var Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var SDF2D = preload("res://addons/mat_maker_gd/nodes/common/sdf2d.gd")
+
+export(Resource) var image : Resource
+
+export(Resource) var input : Resource
+export(Vector2) var a : Vector2 = Vector2(-0.35, -0.2)
+export(Vector2) var b : Vector2 = Vector2(0, 0.5)
+export(Vector2) var c : Vector2 = Vector2(0.35, -0.2)
+export(float) var width : float = 0.05
+export(int) var repeat : int = 1
+
+func _init_properties():
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+ input.set_default_value(1.0)
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input "
+
+ register_input_property(input)
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_label_universal(input)
+
+ mm_graph_node.add_slot_vector2("get_a", "set_a", "A", 0.01)
+ mm_graph_node.add_slot_vector2("get_b", "set_b", "B", 0.01)
+ mm_graph_node.add_slot_vector2("get_c", "set_c", "C", 0.01)
+ mm_graph_node.add_slot_float("get_width", "set_width", "Width", 0.01)
+ mm_graph_node.add_slot_int("get_repeat", "set_repeat", "Repeat")
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ var nuv : Vector2 = transform_uv(uv)
+
+ var f : float = 0
+
+ if nuv.x != 0 && nuv.y != 0:
+ f = input.get_value(nuv)
+
+ return Color(f, f, f, 1)
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func transform_uv(uv : Vector2) -> Vector2:
+ #vec2 $(name_uv)_bezier = sdBezier($uv, vec2($ax+0.5, $ay+0.5), vec2($bx+0.5, $by+0.5), vec2($cx+0.5, $cy+0.5));
+ var bezier : Vector2 = SDF2D.sdBezier(uv, Vector2(a.x + 0.5, a.y + 0.5), Vector2(b.x + 0.5, b.y + 0.5), Vector2(c.x + 0.5, c.y + 0.5))
+
+ #vec2 $(name_uv)_uv = vec2($(name_uv)_bezier.x, $(name_uv)_bezier.y / $width+0.5);
+ var new_uv : Vector2 = Vector2(bezier.x, bezier.y / width + 0.5)
+
+ #vec2 $(name_uv)_uvtest = step(vec2(0.5), abs($(name_uv)_uv-vec2(0.5)));
+ var uv_test : Vector2 = Commons.stepv2(Vector2(0.5, 0.5), Commons.absv2(new_uv - Vector2(0.5, 0.5)))
+
+ #$(name_uv)_uv = mix(vec2(fract($repeat*$(name_uv)_uv.x), $(name_uv)_uv.y), vec2(0.0), max($(name_uv)_uvtest.x, $(name_uv)_uvtest.y));
+ var final_uv : Vector2 = lerp(Vector2(Commons.fract(repeat * new_uv.x), new_uv.y), Vector2(), max(uv_test.x, uv_test.y))
+
+ return final_uv
+
+#b
+func get_a() -> Vector2:
+ return a
+
+func set_a(val : Vector2) -> void:
+ a = val
+
+ set_dirty(true)
+
+#b
+func get_b() -> Vector2:
+ return b
+
+func set_b(val : Vector2) -> void:
+ b = val
+
+ set_dirty(true)
+
+#c
+func get_c() -> Vector2:
+ return c
+
+func set_c(val : Vector2) -> void:
+ c = val
+
+ set_dirty(true)
+
+#width
+func get_width() -> float:
+ return width
+
+func set_width(val : float) -> void:
+ width = val
+
+ set_dirty(true)
+
+#repeat
+func get_repeat() -> int:
+ return repeat
+
+func set_repeat(val : int) -> void:
+ repeat = val
+
+ set_dirty(true)
+
diff --git a/modules/material_maker/mat_maker_gd/nodes/simple/image.gd b/modules/material_maker/mat_maker_gd/nodes/simple/image.gd
new file mode 100644
index 000000000..033a9ebdf
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/simple/image.gd
@@ -0,0 +1,41 @@
+tool
+extends MMNode
+
+export(Resource) var image : Resource
+export(String) var image_path : String
+
+func _init_properties():
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_image_path_universal(image, "get_image_path", "set_image_path")
+
+#func _render(material) -> void:
+# var img : Image = render_image(material)
+#
+# image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ return image.get_value(uv)
+
+func get_image_path() -> String:
+ return image_path
+
+func set_image_path(val : String) -> void:
+ image_path = val
+
+ var img : Image = Image.new()
+
+ if image_path && image_path != "":
+ img.load(image_path)
+
+ image.set_value(img)
+
+ set_dirty(true)
+
diff --git a/modules/material_maker/mat_maker_gd/nodes/simple/shape.gd b/modules/material_maker/mat_maker_gd/nodes/simple/shape.gd
new file mode 100644
index 000000000..0104274cc
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/simple/shape.gd
@@ -0,0 +1,101 @@
+tool
+extends MMNode
+
+var Shapes = preload("res://addons/mat_maker_gd/nodes/common/shapes.gd")
+
+enum ShapeType {
+ SHAPE_TYPE_CIRCLE = 0,
+ SHAPE_TYPE_POLYGON = 1,
+ SHAPE_TYPE_STAR = 2,
+ SHAPE_TYPE_CURVED_STAR = 3,
+ SHAPE_TYPE_RAYS = 4,
+}
+
+export(Resource) var image : Resource
+export(int, "Circle,Polygon,Star,Curved Star,Rays") var shape_type : int = 0
+export(int) var sides : int = 6
+export(Resource) var radius : Resource
+export(Resource) var edge : Resource
+
+func _init_properties():
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !radius:
+ radius = MMNodeUniversalProperty.new()
+ radius.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+ radius.set_default_value(0.34375)
+
+ radius.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ radius.slot_name = "radius"
+ radius.value_step = 0.05
+
+ if !edge:
+ edge = MMNodeUniversalProperty.new()
+ edge.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+ edge.set_default_value(0.2)
+
+ edge.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ edge.slot_name = "edge"
+ edge.value_step = 0.05
+
+ register_input_property(radius)
+ register_input_property(edge)
+
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_enum("get_shape_typoe", "set_shape_typoe", "shape_type", [ "Circle", "Polygon", "Star", "Curved Star", "Rays" ])
+ mm_graph_node.add_slot_int("get_sides", "set_sides", "sides")#, Vector2(1, 10))
+ mm_graph_node.add_slot_float_universal(radius)
+ mm_graph_node.add_slot_float_universal(edge)
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ var c : float = 0
+
+ var rad : float = radius.get_value(uv)
+ var edg : float = edge.get_value(uv)
+
+ if rad == 0:
+ rad = 0.0000001
+
+ if edg == 0:
+ edg = 0.0000001
+
+ if shape_type == ShapeType.SHAPE_TYPE_CIRCLE:
+ c = Shapes.shape_circle(uv, sides, rad, edg)
+ elif shape_type == ShapeType.SHAPE_TYPE_POLYGON:
+ c = Shapes.shape_polygon(uv, sides, rad, edg)
+ elif shape_type == ShapeType.SHAPE_TYPE_STAR:
+ c = Shapes.shape_star(uv, sides, rad, edg)
+ elif shape_type == ShapeType.SHAPE_TYPE_CURVED_STAR:
+ c = Shapes.shape_curved_star(uv, sides, rad, edg)
+ elif shape_type == ShapeType.SHAPE_TYPE_RAYS:
+ c = Shapes.shape_rays(uv, sides, rad, edg)
+
+ return Color(c, c, c, 1)
+
+func get_shape_typoe() -> int:
+ return shape_type
+
+func set_shape_typoe(val : int) -> void:
+ shape_type = val
+
+ set_dirty(true)
+
+func get_sides() -> int:
+ return sides
+
+func set_sides(val : int) -> void:
+ sides = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/transform/circle_map.gd b/modules/material_maker/mat_maker_gd/nodes/transform/circle_map.gd
new file mode 100644
index 000000000..fb8e7103b
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/transform/circle_map.gd
@@ -0,0 +1,70 @@
+tool
+extends MMNode
+
+var Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var Transforms = preload("res://addons/mat_maker_gd/nodes/common/transforms.gd")
+
+export(Resource) var image : Resource
+export(Resource) var input : Resource
+
+export(float) var radius : float = 1
+export(int) var repeat : int = 1
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ input.set_default_value(Color(0, 0, 0, 1))
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input "
+
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ #image.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+ #image.force_override = true
+
+ register_input_property(input)
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_float("get_radius", "set_radius", "Radius", 0.01)
+ mm_graph_node.add_slot_int("get_repeat", "set_repeat", "Repeat")
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ #$in(vec2(fract($repeat*atan($uv.y-0.5, $uv.x-0.5)*0.15915494309), min(0.99999, 2.0/$radius*length($uv-vec2(0.5)))))",
+
+ var nuv : Vector2 = Vector2(Commons.fractf(repeat*atan2(uv.y - 0.5, uv.x - 0.5) * 0.15915494309), min(0.99999, 2.0 / radius * (uv - Vector2(0.5, 0.5)).length()))
+
+ return input.get_value(nuv)
+
+#radius
+func get_radius() -> float:
+ return radius
+
+func set_radius(val : float) -> void:
+ radius = val
+
+ if radius == 0:
+ radius = 0.000000001
+
+ set_dirty(true)
+
+#repeat
+func get_repeat() -> int:
+ return repeat
+
+func set_repeat(val : int) -> void:
+ repeat = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/transform/color_tiler.gd b/modules/material_maker/mat_maker_gd/nodes/transform/color_tiler.gd
new file mode 100644
index 000000000..79e4765a9
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/transform/color_tiler.gd
@@ -0,0 +1,305 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+
+export(Resource) var input : Resource
+export(Resource) var in_mask : Resource
+
+export(Resource) var output : Resource
+export(Resource) var instance_map : Resource
+
+export(Vector2) var tile : Vector2 = Vector2(4, 4)
+export(float) var overlap : float = 1
+export(int, "1,4,16") var select_inputs : int = 0
+export(Vector2) var scale : Vector2 = Vector2(0.5, 0.5)
+export(float) var fixed_offset : float = 0
+export(float) var rnd_offset : float = 0.25
+export(float) var rnd_rotate : float = 45
+export(float) var rnd_scale : float = 0.2
+export(float) var rnd_opacity : float = 0
+export(bool) var variations : bool = false
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ input.set_default_value(Color(0, 0, 0, 1))
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input "
+
+ if !in_mask:
+ in_mask = MMNodeUniversalProperty.new()
+ in_mask.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+ in_mask.set_default_value(1)
+
+ in_mask.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ in_mask.slot_name = ">>> Mask "
+
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !instance_map:
+ instance_map = MMNodeUniversalProperty.new()
+ instance_map.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ instance_map.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ register_input_property(input)
+ register_input_property(in_mask)
+ register_output_property(output)
+ register_output_property(instance_map)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_label_universal(in_mask)
+ mm_graph_node.add_slot_texture_universal(output)
+ mm_graph_node.add_slot_texture_universal(instance_map)
+
+ mm_graph_node.add_slot_vector2("get_tile", "set_tile", "Tile", 1)
+ mm_graph_node.add_slot_float("get_overlap", "set_overlap", "Overlap", 1)
+ mm_graph_node.add_slot_enum("get_select_inputs", "set_select_inputs", "Select inputs", [ "1", "4", "16" ])
+ mm_graph_node.add_slot_vector2("get_scale", "set_scale", "Scale", 0.01)
+ mm_graph_node.add_slot_float("get_fixed_offset", "set_fixed_offset", "Fixed Offset", 0.01)
+ mm_graph_node.add_slot_float("get_rnd_offset", "set_rnd_offset", "Rnd Offset", 0.01)
+ mm_graph_node.add_slot_float("get_rnd_rotate", "set_rnd_rotate", "Rnd Rotate", 0.1)
+ mm_graph_node.add_slot_float("get_rnd_scale", "set_rnd_scale", "Rnd Scale", 0.01)
+ mm_graph_node.add_slot_float("get_rnd_opacity", "set_rnd_opacity", "Rnd Opacity", 0.01)
+ #mm_graph_node.add_slot_bool("get_variations", "set_variations", "Variations")
+
+func _render(material) -> void:
+ var output_img : Image = Image.new()
+ var instance_map_img : Image = Image.new()
+
+ output_img.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+ instance_map_img.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+
+ output_img.lock()
+ instance_map_img.lock()
+
+ var w : float = material.image_size.x
+ var h : float = material.image_size.y
+
+ var pseed : float = randf() + randi()
+
+ var ps : float = 1.0 / float(pseed)
+
+ var ix : int = int(material.image_size.x)
+ var iy : int = int(material.image_size.y)
+
+ for x in range(ix):
+ for y in range(iy):
+ var uv : Vector2 = Vector2(x / w, y / h)
+
+ #vec3 $(name_uv)_random_color;
+ #vec4 $(name_uv)_tiled_output = tiler_$(name)($uv, vec2($tx, $ty), int($overlap), vec2(float($seed)), $(name_uv)_random_color);
+ var rch : PoolColorArray = tiler_calc(uv, tile, overlap, Vector2(ps, ps))
+
+ output_img.set_pixel(x, y, rch[1])
+ instance_map_img.set_pixel(x, y, rch[0])
+
+ output_img.unlock()
+ instance_map_img.unlock()
+
+ output.set_value(output_img)
+ instance_map.set_value(instance_map_img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ return Color()
+
+#tile
+func get_tile() -> Vector2:
+ return tile
+
+func set_tile(val : Vector2) -> void:
+ tile = val
+
+ set_dirty(true)
+
+#overlap
+func get_overlap() -> float:
+ return overlap
+
+func set_overlap(val : float) -> void:
+ overlap = val
+
+ set_dirty(true)
+
+#select_inputs
+func get_select_inputs() -> int:
+ return select_inputs
+
+func set_select_inputs(val : int) -> void:
+ select_inputs = val
+
+ set_dirty(true)
+
+#scale
+func get_scale() -> Vector2:
+ return scale
+
+func set_scale(val : Vector2) -> void:
+ scale = val
+
+ set_dirty(true)
+
+#fixed_offset
+func get_fixed_offset() -> float:
+ return fixed_offset
+
+func set_fixed_offset(val : float) -> void:
+ fixed_offset = val
+
+ set_dirty(true)
+
+#rnd_offset
+func get_rnd_offset() -> float:
+ return rnd_offset
+
+func set_rnd_offset(val : float) -> void:
+ rnd_offset = val
+
+ set_dirty(true)
+
+
+#rnd_rotate
+func get_rnd_rotate() -> float:
+ return rnd_rotate
+
+func set_rnd_rotate(val : float) -> void:
+ rnd_rotate = val
+
+ set_dirty(true)
+
+#rnd_scale
+func get_rnd_scale() -> float:
+ return rnd_scale
+
+func set_rnd_scale(val : float) -> void:
+ rnd_scale = val
+
+ set_dirty(true)
+
+#rnd_opacity
+func get_rnd_opacity() -> float:
+ return rnd_opacity
+
+func set_rnd_opacity(val : float) -> void:
+ rnd_opacity = val
+
+ set_dirty(true)
+
+#variations
+func get_variations() -> bool:
+ return variations
+
+func set_variations(val : bool) -> void:
+ variations = val
+
+ set_dirty(true)
+
+#----------------------
+#color_tiler.mmg
+#Tiles several occurences of an input image while adding randomness.
+
+#vec4 tiler_$(name)(vec2 uv, vec2 tile, int overlap, vec2 _seed, out vec3 random_color) {
+# vec4 c = vec4(0.0);
+# vec3 rc = vec3(0.0);
+# vec3 rc1;
+#
+# for (int dx = -overlap; dx <= overlap; ++dx) {
+# for (int dy = -overlap; dy <= overlap; ++dy) {
+# vec2 pos = fract((floor(uv*tile)+vec2(float(dx), float(dy))+vec2(0.5))/tile-vec2(0.5));
+# vec2 seed = rand2(pos+_seed);
+# rc1 = rand3(seed);
+# pos = fract(pos+vec2($fixed_offset/tile.x, 0.0)*floor(mod(pos.y*tile.y, 2.0))+$offset*seed/tile);
+# float mask = $mask(fract(pos+vec2(0.5)));
+# if (mask > 0.01) {
+# vec2 pv = fract(uv - pos)-vec2(0.5);
+# seed = rand2(seed);
+# float angle = (seed.x * 2.0 - 1.0) * $rotate * 0.01745329251;
+# float ca = cos(angle);
+# float sa = sin(angle);
+# pv = vec2(ca*pv.x+sa*pv.y, -sa*pv.x+ca*pv.y);
+# pv *= (seed.y-0.5)*2.0*$scale+1.0;
+# pv /= vec2($scale_x, $scale_y);
+# pv += vec2(0.5);
+# pv = clamp(pv, vec2(0.0), vec2(1.0));
+#
+# $select_inputs
+#
+# vec4 n = $in.variation(pv, $variations ? seed.x : 0.0);
+#
+# seed = rand2(seed);
+# float na = n.a*mask*(1.0-$opacity*seed.x);
+# float a = (1.0-c.a)*(1.0*na);
+#
+# c = mix(c, n, na);
+# rc = mix(rc, rc1, n.a);
+# }
+# }
+# }
+#
+# random_color = rc;
+# return c;
+#}
+
+
+#select_inputs enum
+#1, " "
+#4, "pv = clamp(0.5*(pv+floor(rand2(seed)*2.0)), vec2(0.0), vec2(1.0));"
+#16, "pv = clamp(0.25*(pv+floor(rand2(seed)*4.0)), vec2(0.0), vec2(1.0));"
+
+func tiler_calc(uv : Vector2, tile : Vector2, overlap : int, _seed : Vector2) -> PoolColorArray:
+ var c : Color = Color()
+ var rc : Vector3 = Vector3()
+ var rc1 : Vector3 = Vector3()
+
+ for dx in range(-overlap, overlap): #for (int dx = -overlap; dx <= overlap; ++dx) {
+ for dy in range(-overlap, overlap): #for (int dy = -overlap; dy <= overlap; ++dy) {
+ var pos : Vector2 = Commons.fractv2((Commons.floorv2(uv * tile) + Vector2(dx, dy) + Vector2(0.5, 0.5)) / tile - Vector2(0.5, 0.5))
+ var vseed : Vector2 = Commons.rand2(pos + _seed)
+ rc1 = Commons.rand3(vseed)
+ pos = Commons.fractv2(pos + Vector2(fixed_offset / tile.x, 0.0) * floor(Commons.modf(pos.y * tile.y, 2.0)) + rnd_offset * vseed / tile)
+ var mask : float = in_mask.get_value(Commons.fractv2(pos + Vector2(0.5, 0.5)))
+
+ if (mask > 0.01):
+ var pv : Vector2 = Commons.fractv2(uv - pos) - Vector2(0.5, 0.5)
+ vseed = Commons.rand2(vseed)
+ var angle : float = (vseed.x * 2.0 - 1.0) * rnd_rotate * 0.01745329251
+ var ca : float = cos(angle)
+ var sa : float = sin(angle)
+ pv = Vector2(ca * pv.x + sa * pv.y, -sa * pv.x + ca * pv.y)
+ pv *= (vseed.y-0.5) * 2.0 * rnd_scale + 1.0
+ pv /= scale
+ pv += Vector2(0.5, 0.5)
+ pv = Commons.clampv2(pv, Vector2(), Vector2(1, 1))
+
+ #1, " "
+ #4, "pv = clamp(0.5*(pv+floor(rand2(seed)*2.0)), vec2(0.0), vec2(1.0));"
+ #16, "pv = clamp(0.25*(pv+floor(rand2(seed)*4.0)), vec2(0.0), vec2(1.0));"
+
+ if select_inputs == 1:
+ pv = Commons.clampv2(0.5*(pv + Commons.floorv2(Commons.rand2(vseed)*2.0)), Vector2(), Vector2(1, 1));
+ elif select_inputs == 2:
+ pv = Commons.clampv2(0.25*(pv + Commons.floorv2(Commons.rand2(vseed)*4.0)), Vector2(), Vector2(1, 1));
+
+# vec4 n = $in.variation(pv, $variations ? seed.x : 0.0);
+ var n : Color = input.get_value(pv) * mask * (1.0 - rnd_opacity * vseed.x)
+
+ vseed = Commons.rand2(vseed)
+ var na : float = n.a * mask * (1.0 - rnd_opacity * vseed.x)
+ var a : float = (1.0 - c.a) * (1.0 * na)
+
+ c = lerp(c, n, na);
+ rc = lerp(rc, rc1, n.a);
+
+ var pc : PoolColorArray = PoolColorArray()
+ pc.append(Color(rc.x, rc.y, rc.z, 1))
+ pc.append(c)
+
+ return pc
diff --git a/modules/material_maker/mat_maker_gd/nodes/transform/kaleidoscope.gd b/modules/material_maker/mat_maker_gd/nodes/transform/kaleidoscope.gd
new file mode 100644
index 000000000..a784f9b70
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/transform/kaleidoscope.gd
@@ -0,0 +1,63 @@
+tool
+extends MMNode
+
+var Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var Transforms = preload("res://addons/mat_maker_gd/nodes/common/transforms.gd")
+
+export(Resource) var image : Resource
+export(Resource) var input : Resource
+export(int) var count : int = 5
+export(float) var offset : float = 0
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ input.set_default_value(Color(0, 0, 0, 1))
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input "
+
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ #image.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+ #image.force_override = true
+
+ register_input_property(input)
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_int("get_count", "set_count", "Count")
+ mm_graph_node.add_slot_float("get_offset", "set_offset", "Offset", 0.5)
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ #$i(kal_rotate($uv, $count, $offset))
+ return input.get_value(Transforms.kal_rotate(uv, count, offset))
+
+#count
+func get_count() -> int:
+ return count
+
+func set_count(val : int) -> void:
+ count = val
+
+ set_dirty(true)
+
+#offset
+func get_offset() -> float:
+ return offset
+
+func set_offset(val : float) -> void:
+ offset = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/transform/mirror.gd b/modules/material_maker/mat_maker_gd/nodes/transform/mirror.gd
new file mode 100644
index 000000000..a0413e4f3
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/transform/mirror.gd
@@ -0,0 +1,69 @@
+tool
+extends MMNode
+
+var Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var Transforms = preload("res://addons/mat_maker_gd/nodes/common/transforms.gd")
+
+export(Resource) var image : Resource
+export(Resource) var input : Resource
+export(int, "Horizontal,Vertical") var direction : int = 0
+export(float) var offset : float = 0
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ input.set_default_value(Color(0, 0, 0, 1))
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input "
+
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ #image.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+ #image.force_override = true
+
+ register_input_property(input)
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_enum("get_direction", "set_direction", "Direction", [ "Horizontal", "Vertical" ])
+ mm_graph_node.add_slot_float("get_offset", "set_offset", "offset", 0.01)
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ #$i(uvmirror_$direction($uv, $offset))
+
+ if direction == 0:
+ return input.get_value(Transforms.uvmirror_h(uv, offset))
+ elif direction == 1:
+ return input.get_value(Transforms.uvmirror_v(uv, offset))
+
+ return Color(0, 0, 0, 1)
+
+#direction
+func get_direction() -> int:
+ return direction
+
+func set_direction(val : int) -> void:
+ direction = val
+
+ set_dirty(true)
+
+#offset
+func get_offset() -> float:
+ return offset
+
+func set_offset(val : float) -> void:
+ offset = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/transform/repeat.gd b/modules/material_maker/mat_maker_gd/nodes/transform/repeat.gd
new file mode 100644
index 000000000..5f0e3878e
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/transform/repeat.gd
@@ -0,0 +1,27 @@
+tool
+extends MMNode
+
+var Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+
+export(Resource) var input : Resource
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ input.set_default_value(Color(0, 0, 0, 1))
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Apply >>>"
+ #input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_COLOR
+ input.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.get_value_from_owner = true
+
+ register_input_property(input)
+ register_output_property(input)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+
+func get_property_value(uv : Vector2):
+ return input.get_value(Commons.fractv2(uv), true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/transform/rotate.gd b/modules/material_maker/mat_maker_gd/nodes/transform/rotate.gd
new file mode 100644
index 000000000..a2416a447
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/transform/rotate.gd
@@ -0,0 +1,63 @@
+tool
+extends MMNode
+
+var Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var Transforms = preload("res://addons/mat_maker_gd/nodes/common/transforms.gd")
+
+export(Resource) var image : Resource
+export(Resource) var input : Resource
+export(Vector2) var center : Vector2 = Vector2()
+export(float) var rotate : float = 0
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ input.set_default_value(Color(0, 0, 0, 1))
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input1 "
+
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ #image.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+ #image.force_override = true
+
+ register_input_property(input)
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_vector2("get_center", "set_center", "Center", 0.01)
+ mm_graph_node.add_slot_float("get_rotate", "set_rotate", "Rotate", 0.1)
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ #$i(rotate($uv, vec2(0.5+$cx, 0.5+$cy), $rotate*0.01745329251))
+ return input.get_value(Transforms.rotate(uv, center + Vector2(0.5, 0.5), rotate*0.01745329251))
+
+#center
+func get_center() -> Vector2:
+ return center
+
+func set_center(val : Vector2) -> void:
+ center = val
+
+ set_dirty(true)
+
+#rotate
+func get_rotate() -> float:
+ return rotate
+
+func set_rotate(val : float) -> void:
+ rotate = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/transform/scale.gd b/modules/material_maker/mat_maker_gd/nodes/transform/scale.gd
new file mode 100644
index 000000000..8f8d1e4b7
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/transform/scale.gd
@@ -0,0 +1,63 @@
+tool
+extends MMNode
+
+var Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var Transforms = preload("res://addons/mat_maker_gd/nodes/common/transforms.gd")
+
+export(Resource) var image : Resource
+export(Resource) var input : Resource
+export(Vector2) var center : Vector2 = Vector2()
+export(Vector2) var scale : Vector2 = Vector2(1, 1)
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ input.set_default_value(Color(0, 0, 0, 1))
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input1 "
+
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ #image.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+ #image.force_override = true
+
+ register_input_property(input)
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_vector2("get_center", "set_center", "Center", 0.01)
+ mm_graph_node.add_slot_vector2("get_scale", "set_scale", "Scale", 0.01)
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ #$i(scale($uv, vec2(0.5+$cx, 0.5+$cy), vec2($scale_x, $scale_y)))
+ return input.get_value(Transforms.scale(uv, center + Vector2(0.5, 0.5), scale))
+
+#center
+func get_center() -> Vector2:
+ return center
+
+func set_center(val : Vector2) -> void:
+ center = val
+
+ set_dirty(true)
+
+#scale
+func get_scale() -> Vector2:
+ return scale
+
+func set_scale(val : Vector2) -> void:
+ scale = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/transform/shear.gd b/modules/material_maker/mat_maker_gd/nodes/transform/shear.gd
new file mode 100644
index 000000000..98236eda2
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/transform/shear.gd
@@ -0,0 +1,79 @@
+tool
+extends MMNode
+
+var Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+
+export(Resource) var image : Resource
+export(Resource) var input : Resource
+export(int, "Horizontal,Vertical") var direction : int = 0
+export(float) var amount : float = 1
+export(float) var center : float = 0
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ input.set_default_value(Color(0, 0, 0, 1))
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input "
+
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ #image.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+ #image.force_override = true
+
+ register_input_property(input)
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_enum("get_direction", "set_direction", "Direction", [ "Horizontal", "Vertical" ])
+ mm_graph_node.add_slot_float("get_amount", "set_amount", "Amount", 0.01)
+ mm_graph_node.add_slot_float("get_center", "set_center", "Center", 0.01)
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ #$in($uv+$amount*($uv.yx-vec2($center))*vec2($direction))
+
+ if direction == 0:
+ return input.get_value(uv + amount * (Vector2(uv.y, uv.x) - Vector2(center, center)) * Vector2(1, 0))
+ elif direction == 1:
+ return input.get_value(uv + amount * (Vector2(uv.y, uv.x) - Vector2(center, center)) * Vector2(0, 1))
+
+ return Color(0, 0, 0, 1)
+
+#direction
+func get_direction() -> int:
+ return direction
+
+func set_direction(val : int) -> void:
+ direction = val
+
+ set_dirty(true)
+
+#amount
+func get_amount() -> float:
+ return amount
+
+func set_amount(val : float) -> void:
+ amount = val
+
+ set_dirty(true)
+
+#center
+func get_center() -> float:
+ return center
+
+func set_center(val : float) -> void:
+ center = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/transform/tiler.gd b/modules/material_maker/mat_maker_gd/nodes/transform/tiler.gd
new file mode 100644
index 000000000..d6d75f3e0
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/transform/tiler.gd
@@ -0,0 +1,306 @@
+tool
+extends MMNode
+
+const Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+
+export(Resource) var input : Resource
+export(Resource) var in_mask : Resource
+
+export(Resource) var output : Resource
+export(Resource) var instance_map : Resource
+
+export(Vector2) var tile : Vector2 = Vector2(4, 4)
+export(float) var overlap : float = 1
+export(int, "1,4,16") var select_inputs : int = 0
+export(Vector2) var scale : Vector2 = Vector2(0.5, 0.5)
+export(float) var fixed_offset : float = 0
+export(float) var rnd_offset : float = 0.25
+export(float) var rnd_rotate : float = 45
+export(float) var rnd_scale : float = 0.2
+export(float) var rnd_value : float = 2
+export(bool) var variations : bool = false
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+ input.set_default_value(0)
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input "
+
+ if !in_mask:
+ in_mask = MMNodeUniversalProperty.new()
+ in_mask.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+ in_mask.set_default_value(1)
+
+ in_mask.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ in_mask.slot_name = ">>> Mask "
+
+ if !output:
+ output = MMNodeUniversalProperty.new()
+ output.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ output.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ if !instance_map:
+ instance_map = MMNodeUniversalProperty.new()
+ instance_map.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ instance_map.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+
+ register_input_property(input)
+ register_input_property(in_mask)
+ register_output_property(output)
+ register_output_property(instance_map)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_label_universal(in_mask)
+ mm_graph_node.add_slot_texture_universal(output)
+ mm_graph_node.add_slot_texture_universal(instance_map)
+
+ mm_graph_node.add_slot_vector2("get_tile", "set_tile", "Tile", 1)
+ mm_graph_node.add_slot_float("get_overlap", "set_overlap", "Overlap", 1)
+ mm_graph_node.add_slot_enum("get_select_inputs", "set_select_inputs", "Select inputs", [ "1", "4", "16" ])
+ mm_graph_node.add_slot_vector2("get_scale", "set_scale", "Scale", 0.01)
+ mm_graph_node.add_slot_float("get_fixed_offset", "set_fixed_offset", "Fixed Offset", 0.01)
+ mm_graph_node.add_slot_float("get_rnd_offset", "set_rnd_offset", "Rnd Offset", 0.01)
+ mm_graph_node.add_slot_float("get_rnd_rotate", "set_rnd_rotate", "Rnd Rotate", 0.1)
+ mm_graph_node.add_slot_float("get_rnd_scale", "set_rnd_scale", "Rnd Scale", 0.01)
+ mm_graph_node.add_slot_float("get_rnd_value", "set_rnd_value", "Rnd Value", 0.01)
+ #mm_graph_node.add_slot_bool("get_variations", "set_variations", "Variations")
+
+func _render(material) -> void:
+ var output_img : Image = Image.new()
+ var instance_map_img : Image = Image.new()
+
+ output_img.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+ instance_map_img.create(material.image_size.x, material.image_size.y, false, Image.FORMAT_RGBA8)
+
+ output_img.lock()
+ instance_map_img.lock()
+
+ var w : float = material.image_size.x
+ var h : float = material.image_size.y
+
+ var pseed : float = randf() + randi()
+
+ var ps : float = 1.0 / float(pseed)
+
+ var ix : int = int(material.image_size.x)
+ var iy : int = int(material.image_size.y)
+
+ for x in range(ix):
+ for y in range(iy):
+ var uv : Vector2 = Vector2(x / w, y / h)
+
+ #vec4 $(name_uv)_rch = tiler_$(name)($uv, vec2($tx, $ty), int($overlap), vec2(float($seed)))
+ var rch : Color = tiler_calc(uv, tile, overlap, Vector2(ps, ps))
+
+ #Output, float, Shows the generated pattern
+ #$(name_uv)_rch.a
+ var output_img_col : Color = Color(rch.a, rch.a, rch.a, 1)
+
+ #Instance map, rgb, Shows a random color for each instance of the input image
+ #$(name_uv)_rch.rgb
+ var instance_map_img_col : Color = Color(rch.r, rch.g, rch.b, 1)
+
+ output_img.set_pixel(x, y, output_img_col)
+ instance_map_img.set_pixel(x, y, instance_map_img_col)
+
+ output_img.unlock()
+ instance_map_img.unlock()
+
+ output.set_value(output_img)
+ instance_map.set_value(instance_map_img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ return Color()
+
+#tile
+func get_tile() -> Vector2:
+ return tile
+
+func set_tile(val : Vector2) -> void:
+ tile = val
+
+ set_dirty(true)
+
+#overlap
+func get_overlap() -> float:
+ return overlap
+
+func set_overlap(val : float) -> void:
+ overlap = val
+
+ set_dirty(true)
+
+#select_inputs
+func get_select_inputs() -> int:
+ return select_inputs
+
+func set_select_inputs(val : int) -> void:
+ select_inputs = val
+
+ set_dirty(true)
+
+#scale
+func get_scale() -> Vector2:
+ return scale
+
+func set_scale(val : Vector2) -> void:
+ scale = val
+
+ set_dirty(true)
+
+#fixed_offset
+func get_fixed_offset() -> float:
+ return fixed_offset
+
+func set_fixed_offset(val : float) -> void:
+ fixed_offset = val
+
+ set_dirty(true)
+
+#rnd_offset
+func get_rnd_offset() -> float:
+ return rnd_offset
+
+func set_rnd_offset(val : float) -> void:
+ rnd_offset = val
+
+ set_dirty(true)
+
+
+#rnd_rotate
+func get_rnd_rotate() -> float:
+ return rnd_rotate
+
+func set_rnd_rotate(val : float) -> void:
+ rnd_rotate = val
+
+ set_dirty(true)
+
+#rnd_scale
+func get_rnd_scale() -> float:
+ return rnd_scale
+
+func set_rnd_scale(val : float) -> void:
+ rnd_scale = val
+
+ set_dirty(true)
+
+#rnd_value
+func get_rnd_value() -> float:
+ return rnd_value
+
+func set_rnd_value(val : float) -> void:
+ rnd_value = val
+
+ set_dirty(true)
+
+#variations
+func get_variations() -> bool:
+ return variations
+
+func set_variations(val : bool) -> void:
+ variations = val
+
+ set_dirty(true)
+
+#----------------------
+#tiler.mmg
+#Tiles several occurences of an input image while adding randomness.
+
+#instance
+#vec4 tiler_$(name)(vec2 uv, vec2 tile, int overlap, vec2 _seed) {
+# float c = 0.0;
+# vec3 rc = vec3(0.0);
+# vec3 rc1;
+# for (int dx = -overlap; dx <= overlap; ++dx) {
+# for (int dy = -overlap; dy <= overlap; ++dy) {
+# vec2 pos = fract((floor(uv*tile)+vec2(float(dx), float(dy))+vec2(0.5))/tile-vec2(0.5));
+# vec2 seed = rand2(pos+_seed);
+# rc1 = rand3(seed);
+# pos = fract(pos+vec2($fixed_offset/tile.x, 0.0)*floor(mod(pos.y*tile.y, 2.0))+$offset*seed/tile);
+# float mask = $mask(fract(pos+vec2(0.5)));
+#
+# if (mask > 0.01) {
+# vec2 pv = fract(uv - pos)-vec2(0.5);
+# seed = rand2(seed);
+# float angle = (seed.x * 2.0 - 1.0) * $rotate * 0.01745329251;
+# float ca = cos(angle);
+# float sa = sin(angle);
+# pv = vec2(ca*pv.x+sa*pv.y, -sa*pv.x+ca*pv.y);
+# pv *= (seed.y-0.5)*2.0*$scale+1.0;
+# pv /= vec2($scale_x, $scale_y);
+# pv += vec2(0.5);
+# seed = rand2(seed);
+# vec2 clamped_pv = clamp(pv, vec2(0.0), vec2(1.0));
+# if (pv.x != clamped_pv.x || pv.y != clamped_pv.y) {
+# continue;
+# }
+#
+# $select_inputs
+#
+# float c1 = $in.variation(pv, $variations ? seed.x : 0.0)*mask*(1.0-$value*seed.x);
+# c = max(c, c1);
+# rc = mix(rc, rc1, step(c, c1));
+# }
+# }
+# }
+#
+# return vec4(rc, c);
+#}
+
+#select_inputs enum
+#1, " "
+#4, "pv = clamp(0.5*(pv+floor(rand2(seed)*2.0)), vec2(0.0), vec2(1.0));"
+#16, "pv = clamp(0.25*(pv+floor(rand2(seed)*4.0)), vec2(0.0), vec2(1.0));"
+
+func tiler_calc(uv : Vector2, tile : Vector2, overlap : int, _seed : Vector2) -> Color:
+ var c : float = 0.0
+ var rc : Vector3 = Vector3()
+ var rc1 : Vector3 = Vector3()
+
+ for dx in range(-overlap, overlap): #for (int dx = -overlap; dx <= overlap; ++dx) {
+ for dy in range(-overlap, overlap): #for (int dy = -overlap; dy <= overlap; ++dy) {
+ var pos : Vector2 = Commons.fractv2((Commons.floorv2(uv * tile) + Vector2(dx, dy) + Vector2(0.5, 0.5)) / tile - Vector2(0.5, 0.5))
+ var vseed : Vector2 = Commons.rand2(pos+_seed)
+ rc1 = Commons.rand3(vseed)
+ pos = Commons.fractv2(pos + Vector2(fixed_offset / tile.x, 0.0) * floor(Commons.modf(pos.y * tile.y, 2.0)) + rnd_offset * vseed / tile)
+ var mask : float = in_mask.get_value(Commons.fractv2(pos + Vector2(0.5, 0.5)))
+
+ if (mask > 0.01):
+ var pv : Vector2 = Commons.fractv2(uv - pos) - Vector2(0.5, 0.5)
+ vseed = Commons.rand2(vseed)
+ var angle : float = (vseed.x * 2.0 - 1.0) * rnd_rotate * 0.01745329251
+ var ca : float = cos(angle)
+ var sa : float = sin(angle)
+ pv = Vector2(ca * pv.x + sa * pv.y, -sa * pv.x + ca * pv.y)
+ pv *= (vseed.y-0.5) * 2.0 * rnd_scale + 1.0
+ pv /= scale
+ pv += Vector2(0.5, 0.5)
+ vseed = Commons.rand2(vseed)
+ var clamped_pv : Vector2 = Commons.clampv2(pv, Vector2(), Vector2(1, 1))
+
+ if (pv.x != clamped_pv.x || pv.y != clamped_pv.y):
+ continue
+
+ #1, " "
+ #4, "pv = clamp(0.5*(pv+floor(rand2(seed)*2.0)), vec2(0.0), vec2(1.0));"
+ #16, "pv = clamp(0.25*(pv+floor(rand2(seed)*4.0)), vec2(0.0), vec2(1.0));"
+
+ if select_inputs == 1:
+ pv = Commons.clampv2(0.5*(pv + Commons.floorv2(Commons.rand2(vseed)*2.0)), Vector2(), Vector2(1, 1));
+ elif select_inputs == 2:
+ pv = Commons.clampv2(0.25*(pv + Commons.floorv2(Commons.rand2(vseed)*4.0)), Vector2(), Vector2(1, 1));
+
+ #float c1 = $in.variation(pv, $variations ? vseed.x : 0.0) * mask * (1.0-$value*vseed.x)
+ var c1 : float = input.get_value(pv) * mask * (1.0 - rnd_value * vseed.x)
+ c = max(c, c1)
+ rc = lerp(rc, rc1, Commons.step(c, c1))
+
+ return Color(rc.x, rc.y, rc.z, c)
+
diff --git a/modules/material_maker/mat_maker_gd/nodes/transform/transform.gd b/modules/material_maker/mat_maker_gd/nodes/transform/transform.gd
new file mode 100644
index 000000000..94aab525f
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/transform/transform.gd
@@ -0,0 +1,132 @@
+tool
+extends MMNode
+
+var Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+var Transforms = preload("res://addons/mat_maker_gd/nodes/common/transforms.gd")
+
+export(Resource) var image : Resource
+export(Resource) var input : Resource
+
+export(Resource) var translate_x : Resource
+export(Resource) var translate_y : Resource
+export(Resource) var rotate : Resource
+export(Resource) var scale_x : Resource
+export(Resource) var scale_y : Resource
+export(int, "Clamp,Repeat,Extend") var mode : int = 0
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ input.set_default_value(Color(0, 0, 0, 1))
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input "
+
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ #image.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+ #image.force_override = true
+
+ if !translate_x:
+ translate_x = MMNodeUniversalProperty.new()
+ translate_x.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+ translate_x.set_default_value(0)
+ translate_x.value_step = 0.01
+
+ translate_x.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ translate_x.slot_name = "Translate X"
+
+ if !translate_y:
+ translate_y = MMNodeUniversalProperty.new()
+ translate_y.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+ translate_y.set_default_value(0)
+ translate_y.value_step = 0.01
+
+ translate_y.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ translate_y.slot_name = "Translate Y"
+
+ if !rotate:
+ rotate = MMNodeUniversalProperty.new()
+ rotate.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+ rotate.set_default_value(0)
+ rotate.value_step = 0.01
+
+ rotate.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ rotate.slot_name = "Rotate"
+
+ if !scale_x:
+ scale_x = MMNodeUniversalProperty.new()
+ scale_x.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+ scale_x.set_default_value(1)
+ scale_x.value_step = 0.01
+
+ scale_x.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ scale_x.slot_name = "Scale X"
+
+ if !scale_y:
+ scale_y = MMNodeUniversalProperty.new()
+ scale_y.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+ scale_y.set_default_value(1)
+ scale_y.value_step = 0.01
+
+ scale_y.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ scale_y.slot_name = "Scale Y"
+
+ register_input_property(input)
+ register_output_property(image)
+ register_input_property(translate_x)
+ register_input_property(translate_y)
+ register_input_property(rotate)
+ register_input_property(scale_x)
+ register_input_property(scale_y)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_texture_universal(image)
+
+ mm_graph_node.add_slot_float_universal(translate_x)
+ mm_graph_node.add_slot_float_universal(translate_y)
+ mm_graph_node.add_slot_float_universal(rotate)
+ mm_graph_node.add_slot_float_universal(scale_x)
+ mm_graph_node.add_slot_float_universal(scale_y)
+
+ mm_graph_node.add_slot_enum("get_mode", "set_mode", "Mode", [ "Clamp", "Repeat", "Extend" ])
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ #$i($mode(transform2($uv, vec2($translate_x*(2.0*$tx($uv)-1.0), $translate_y*(2.0*$ty($uv)-1.0)), $rotate*0.01745329251*(2.0*$r($uv)-1.0), vec2($scale_x*(2.0*$sx($uv)-1.0), $scale_y*(2.0*$sy($uv)-1.0)))))",
+
+ #Mode:
+ #Clamp -> transform2_clamp
+ #Repeat -> fract
+ #Extend -> ""
+
+ var tr : Vector2 = Vector2(translate_x.get_default_value() * (2.0 * translate_x.get_value_or_zero(uv) - 1.0), translate_y.get_default_value() *(2.0 * translate_y.get_value_or_zero(uv) - 1.0))
+ var rot : float = rotate.get_default_value() * 0.01745329251*(2.0 * rotate.get_value_or_zero(uv) - 1.0)
+ var sc : Vector2 = Vector2(scale_x.get_default_value() *(2.0 * scale_x.get_value_or_zero(uv) - 1.0), scale_y.get_default_value() *(2.0 * scale_y.get_value_or_zero(uv) - 1.0))
+
+ var nuv : Vector2 = Transforms.transform2(uv, tr, rot, sc)
+
+ if mode == 0:
+ nuv = Transforms.transform2_clamp(nuv)
+ elif mode == 1:
+ nuv = Commons.fractv2(nuv)
+
+ return input.get_value(nuv)
+
+#mode
+func get_mode() -> int:
+ return mode
+
+func set_mode(val : int) -> void:
+ mode = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/transform/translate.gd b/modules/material_maker/mat_maker_gd/nodes/transform/translate.gd
new file mode 100644
index 000000000..8c03d04fb
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/transform/translate.gd
@@ -0,0 +1,51 @@
+tool
+extends MMNode
+
+var Commons = preload("res://addons/mat_maker_gd/nodes/common/commons.gd")
+
+export(Resource) var image : Resource
+export(Resource) var input : Resource
+export(Vector2) var translation : Vector2 = Vector2()
+
+func _init_properties():
+ if !input:
+ input = MMNodeUniversalProperty.new()
+ input.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ input.set_default_value(Color(0, 0, 0, 1))
+
+ input.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_UNIVERSAL
+ input.slot_name = ">>> Input1 "
+
+ if !image:
+ image = MMNodeUniversalProperty.new()
+ image.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_IMAGE
+
+ #image.input_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_FLOAT
+ image.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_IMAGE
+ #image.force_override = true
+
+ register_input_property(input)
+ register_output_property(image)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_label_universal(input)
+ mm_graph_node.add_slot_texture_universal(image)
+ mm_graph_node.add_slot_vector2("get_translation", "set_translation", "Translation", 0.01)
+
+func _render(material) -> void:
+ var img : Image = render_image(material)
+
+ image.set_value(img)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ #$i($uv-vec2($translate_x, $translate_y))
+ return input.get_value(uv - translation)
+
+#translation
+func get_translation() -> Vector2:
+ return translation
+
+func set_translation(val : Vector2) -> void:
+ translation = val
+
+ set_dirty(true)
diff --git a/modules/material_maker/mat_maker_gd/nodes/uniform/greyscale_uniform.gd b/modules/material_maker/mat_maker_gd/nodes/uniform/greyscale_uniform.gd
new file mode 100644
index 000000000..c3bf2d61b
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/uniform/greyscale_uniform.gd
@@ -0,0 +1,25 @@
+tool
+extends MMNode
+
+export(Resource) var uniform : Resource
+
+func _init_properties():
+ if !uniform:
+ uniform = MMNodeUniversalProperty.new()
+ uniform.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_FLOAT
+ uniform.set_default_value(0.5)
+ uniform.slot_name = "Value (Color)"
+ uniform.value_step = 0.01
+ uniform.value_range = Vector2(0, 1)
+
+ uniform.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_COLOR
+
+ register_output_property(uniform)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_float_universal(uniform)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ var f : float = uniform.get_value(uv)
+
+ return Color(f, f, f, 1)
diff --git a/modules/material_maker/mat_maker_gd/nodes/uniform/uniform.gd b/modules/material_maker/mat_maker_gd/nodes/uniform/uniform.gd
new file mode 100644
index 000000000..dbd409a47
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/nodes/uniform/uniform.gd
@@ -0,0 +1,20 @@
+tool
+extends MMNode
+
+export(Resource) var uniform : Resource
+
+func _init_properties():
+ if !uniform:
+ uniform = MMNodeUniversalProperty.new()
+ uniform.default_type = MMNodeUniversalProperty.MMNodeUniversalPropertyDefaultType.DEFAULT_TYPE_COLOR
+ uniform.set_default_value(Color(1, 1, 1, 1))
+
+ uniform.output_slot_type = MMNodeUniversalProperty.SlotTypes.SLOT_TYPE_COLOR
+
+ register_output_property(uniform)
+
+func _register_methods(mm_graph_node) -> void:
+ mm_graph_node.add_slot_color_universal(uniform)
+
+func get_value_for(uv : Vector2, pseed : int) -> Color:
+ return uniform.get_value(uv)
diff --git a/modules/material_maker/mat_maker_gd/plugin.cfg b/modules/material_maker/mat_maker_gd/plugin.cfg
new file mode 100644
index 000000000..0431311e6
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/plugin.cfg
@@ -0,0 +1,7 @@
+[plugin]
+
+name="mat_maker_gd"
+description=""
+author="Relintai"
+version=""
+script="plugin.gd"
diff --git a/modules/material_maker/mat_maker_gd/plugin.gd b/modules/material_maker/mat_maker_gd/plugin.gd
new file mode 100644
index 000000000..4cabcdfd9
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/plugin.gd
@@ -0,0 +1,67 @@
+tool
+extends EditorPlugin
+
+var MMNode = preload("res://addons/mat_maker_gd/nodes/mm_node.gd")
+var MMMaterial = preload("res://addons/mat_maker_gd/nodes/mm_material.gd")
+var MMNodeUniversalProperty = preload("res://addons/mat_maker_gd/nodes/mm_node_universal_property.gd")
+
+var editor_packed_scene = preload("res://addons/mat_maker_gd/editor/MatMakerGDEditor.tscn")
+var editor_scene = null
+
+var tool_button : ToolButton = null
+
+func _enter_tree():
+ add_custom_type("MMNode", "Resource", MMNode, null)
+ add_custom_type("MMMaterial", "Resource", MMMaterial, null)
+ add_custom_type("MMNodeUniversalProperty", "Resource", MMNodeUniversalProperty, null)
+
+ editor_scene = editor_packed_scene.instance()
+ editor_scene.set_plugin(self)
+
+ tool_button = add_control_to_bottom_panel(editor_scene, "MMGD")
+ tool_button.hide()
+
+func _exit_tree():
+ remove_custom_type("MMNode")
+ remove_custom_type("MMMaterial")
+ remove_custom_type("MMNodeUniversalProperty")
+
+ remove_control_from_bottom_panel(editor_scene)
+
+ if editor_scene:
+ editor_scene.queue_free()
+
+ editor_scene = null
+ tool_button = null
+
+func handles(object):
+ return object is MMMateial
+
+func edit(object):
+ #if editor_scene:
+ # make_bottom_panel_item_visible(editor_scene)
+
+ if object is MMMateial:
+ editor_scene.set_mmmaterial(object as MMMateial)
+
+func make_visible(visible):
+ if tool_button:
+ if visible:
+ tool_button.show()
+ else:
+ #if tool_button.pressed:
+ # tool_button.pressed = false
+
+ if !tool_button.pressed:
+ tool_button.hide()
+
+func get_plugin_icon():
+ return null
+
+func get_plugin_name():
+ return "MatMakerGD"
+
+func has_main_screen():
+ return false
+
+
diff --git a/modules/material_maker/mat_maker_gd/widgets/color_picker_button/color_picker_button.gd b/modules/material_maker/mat_maker_gd/widgets/color_picker_button/color_picker_button.gd
new file mode 100644
index 000000000..cf0e819c4
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/color_picker_button/color_picker_button.gd
@@ -0,0 +1,16 @@
+tool
+extends ColorPickerButton
+
+func get_drag_data(_position):
+ var preview = ColorRect.new()
+ preview.color = color
+ preview.rect_min_size = Vector2(32, 32)
+ set_drag_preview(preview)
+ return color
+
+func can_drop_data(_position, data) -> bool:
+ return typeof(data) == TYPE_COLOR
+
+func drop_data(_position, data) -> void:
+ color = data
+ emit_signal("color_changed", color)
diff --git a/modules/material_maker/mat_maker_gd/widgets/color_picker_popup/color_picker_popup.tscn b/modules/material_maker/mat_maker_gd/widgets/color_picker_popup/color_picker_popup.tscn
new file mode 100644
index 000000000..c4003f3d2
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/color_picker_popup/color_picker_popup.tscn
@@ -0,0 +1,14 @@
+[gd_scene format=2]
+
+[node name="ColorPickerPopup" type="PopupPanel"]
+margin_right = 316.0
+margin_bottom = 470.0
+
+[node name="ColorPicker" type="ColorPicker" parent="."]
+margin_left = 4.0
+margin_top = 4.0
+margin_right = 312.0
+margin_bottom = 466.0
+__meta__ = {
+"_edit_use_anchors_": false
+}
diff --git a/modules/material_maker/mat_maker_gd/widgets/curve_edit/control_point.gd b/modules/material_maker/mat_maker_gd/widgets/curve_edit/control_point.gd
new file mode 100644
index 000000000..5fd5e484f
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/curve_edit/control_point.gd
@@ -0,0 +1,70 @@
+tool
+extends Control
+
+var MMCurve = preload("res://addons/mat_maker_gd/nodes/bases/curve_base.gd")
+
+var moving : bool = false
+
+var min_x : float
+var max_x : float
+var min_y : float
+var max_y : float
+
+const OFFSET : Vector2 = Vector2(3, 3)
+
+signal moved(index)
+signal removed(index)
+
+func _ready():
+ pass # Replace with function body.
+
+func _draw():
+# var current_theme : Theme = get_node("/root/MainWindow").theme
+# var color : Color = current_theme.get_color("font_color", "Label")
+
+ var color : Color = Color(1, 1, 1, 1)
+ for c in get_children():
+ if c.visible:
+ draw_line(OFFSET, c.rect_position+OFFSET, color)
+
+ draw_rect(Rect2(0, 0, 7, 7), color)
+
+#p : MMCurve.Point
+func initialize(p) -> void:
+ rect_position = get_parent().transform_point(p.p)-OFFSET
+ if p.ls != INF:
+ $LeftSlope.rect_position = $LeftSlope.distance*(get_parent().rect_size*Vector2(1.0, -p.ls)).normalized()
+ if p.rs != INF:
+ $RightSlope.rect_position = $RightSlope.distance*(get_parent().rect_size*Vector2(1.0, -p.rs)).normalized()
+
+func set_constraint(x : float, X : float, y : float, Y : float) -> void:
+ min_x = x
+ max_x = X
+ min_y = y
+ max_y = Y
+
+func _on_ControlPoint_gui_input(event):
+ if event is InputEventMouseButton:
+ if event.button_index == BUTTON_LEFT:
+ if event.pressed:
+ moving = true
+ else:
+ moving = false
+ get_parent().update_controls()
+ elif event.button_index == BUTTON_RIGHT and event.pressed:
+ emit_signal("removed", get_index())
+ elif moving and event is InputEventMouseMotion:
+ rect_position += event.relative
+ if rect_position.x < min_x:
+ rect_position.x = min_x
+ elif rect_position.x > max_x:
+ rect_position.x = max_x
+ if rect_position.y < min_y:
+ rect_position.y = min_y
+ elif rect_position.y > max_y:
+ rect_position.y = max_y
+ emit_signal("moved", get_index())
+
+func update_tangents() -> void:
+ update()
+ emit_signal("moved", get_index())
diff --git a/modules/material_maker/mat_maker_gd/widgets/curve_edit/control_point.tscn b/modules/material_maker/mat_maker_gd/widgets/curve_edit/control_point.tscn
new file mode 100644
index 000000000..03bfd28da
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/curve_edit/control_point.tscn
@@ -0,0 +1,39 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/widgets/curve_edit/slope_point.gd" type="Script" id=1]
+[ext_resource path="res://addons/mat_maker_gd/widgets/curve_edit/control_point.gd" type="Script" id=2]
+
+[node name="ControlPoint" type="Control"]
+margin_left = 56.9864
+margin_top = 33.8615
+margin_right = 63.9864
+margin_bottom = 40.8615
+rect_min_size = Vector2( 7, 7 )
+script = ExtResource( 2 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LeftSlope" type="Control" parent="."]
+margin_left = -18.5235
+margin_right = -11.5235
+margin_bottom = 7.0
+rect_min_size = Vector2( 7, 7 )
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+distance = -30.0
+
+[node name="RightSlope" type="Control" parent="."]
+margin_left = 15.6919
+margin_right = 22.6919
+margin_bottom = 7.0
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+distance = 30.0
+[connection signal="gui_input" from="." to="." method="_on_ControlPoint_gui_input"]
+[connection signal="gui_input" from="LeftSlope" to="LeftSlope" method="_on_ControlPoint_gui_input"]
+[connection signal="gui_input" from="RightSlope" to="RightSlope" method="_on_ControlPoint_gui_input"]
diff --git a/modules/material_maker/mat_maker_gd/widgets/curve_edit/curve_dialog.gd b/modules/material_maker/mat_maker_gd/widgets/curve_edit/curve_dialog.gd
new file mode 100644
index 000000000..df8f79ad7
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/curve_edit/curve_dialog.gd
@@ -0,0 +1,37 @@
+tool
+extends WindowDialog
+
+var MMCurve = preload("res://addons/mat_maker_gd/nodes/bases/curve_base.gd")
+
+var previous_points : Array
+var curve
+
+signal curve_changed(curve)
+
+# Called when the node enters the scene tree for the first time.
+func _ready():
+ pass # Replace with function body.
+
+func _on_CurveDialog_popup_hide():
+ queue_free()
+
+func _on_OK_pressed():
+ emit_signal("curve_changed", curve)
+ curve.curve_changed()
+
+ queue_free()
+
+func _on_Cancel_pressed():
+ curve.set_points(previous_points)
+ emit_signal("curve_changed", curve)
+
+ queue_free()
+
+func edit_curve(c) -> void:
+ curve = c
+ previous_points = curve.get_points()
+ $VBoxContainer/EditorContainer/CurveEditor.set_curve(curve)
+ popup_centered()
+
+func _on_CurveEditor_value_changed(value):
+ emit_signal("curve_changed", value)
diff --git a/modules/material_maker/mat_maker_gd/widgets/curve_edit/curve_dialog.tscn b/modules/material_maker/mat_maker_gd/widgets/curve_edit/curve_dialog.tscn
new file mode 100644
index 000000000..4898a89de
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/curve_edit/curve_dialog.tscn
@@ -0,0 +1,81 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/widgets/curve_edit/curve_editor.tscn" type="PackedScene" id=1]
+[ext_resource path="res://addons/mat_maker_gd/widgets/curve_edit/curve_dialog.gd" type="Script" id=2]
+
+[node name="CurveDialog" type="WindowDialog"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = 307.0
+margin_top = 151.0
+margin_right = -347.0
+margin_bottom = -174.0
+window_title = "Edit curve"
+script = ExtResource( 2 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="VBoxContainer" type="VBoxContainer" parent="."]
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = 5.0
+margin_top = 5.0
+margin_right = -5.0
+margin_bottom = -5.0
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="EditorContainer" type="MarginContainer" parent="VBoxContainer"]
+margin_right = 616.0
+margin_bottom = 353.0
+rect_clip_content = true
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_constants/margin_right = 4
+custom_constants/margin_top = 4
+custom_constants/margin_left = 4
+custom_constants/margin_bottom = 4
+
+[node name="CurveEditor" parent="VBoxContainer/EditorContainer" instance=ExtResource( 1 )]
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 4.0
+margin_top = 4.0
+margin_right = 612.0
+margin_bottom = 349.0
+size_flags_vertical = 3
+
+[node name="HSeparator" type="HSeparator" parent="VBoxContainer"]
+margin_top = 357.0
+margin_right = 616.0
+margin_bottom = 361.0
+
+[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"]
+margin_top = 365.0
+margin_right = 616.0
+margin_bottom = 385.0
+
+[node name="Control" type="Control" parent="VBoxContainer/HBoxContainer"]
+margin_right = 488.0
+margin_bottom = 20.0
+size_flags_horizontal = 3
+
+[node name="OK" type="Button" parent="VBoxContainer/HBoxContainer"]
+margin_left = 492.0
+margin_right = 552.0
+margin_bottom = 20.0
+rect_min_size = Vector2( 60, 0 )
+text = "OK"
+
+[node name="Cancel" type="Button" parent="VBoxContainer/HBoxContainer"]
+margin_left = 556.0
+margin_right = 616.0
+margin_bottom = 20.0
+rect_min_size = Vector2( 60, 0 )
+text = "Cancel"
+[connection signal="popup_hide" from="." to="." method="_on_CurveDialog_popup_hide"]
+[connection signal="value_changed" from="VBoxContainer/EditorContainer/CurveEditor" to="." method="_on_CurveEditor_value_changed"]
+[connection signal="pressed" from="VBoxContainer/HBoxContainer/OK" to="." method="_on_OK_pressed"]
+[connection signal="pressed" from="VBoxContainer/HBoxContainer/Cancel" to="." method="_on_Cancel_pressed"]
diff --git a/modules/material_maker/mat_maker_gd/widgets/curve_edit/curve_edit.gd b/modules/material_maker/mat_maker_gd/widgets/curve_edit/curve_edit.gd
new file mode 100644
index 000000000..885adbcb2
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/curve_edit/curve_edit.gd
@@ -0,0 +1,24 @@
+tool
+extends Control
+
+var MMCurve = preload("res://addons/mat_maker_gd/nodes/bases/curve_base.gd")
+
+var value = null setget set_value
+
+signal updated(curve)
+
+func set_value(v) -> void:
+ value = v
+ $CurveView.set_curve(value)
+ $CurveView.update()
+
+func _on_CurveEdit_pressed():
+ var dialog = preload("res://addons/mat_maker_gd/widgets/curve_edit/curve_dialog.tscn").instance()
+ add_child(dialog)
+ dialog.connect("curve_changed", self, "on_value_changed")
+ dialog.edit_curve(value)
+
+func on_value_changed(v) -> void:
+ #set_value(v)
+ emit_signal("updated", v)
+ $CurveView.update()
diff --git a/modules/material_maker/mat_maker_gd/widgets/curve_edit/curve_edit.tscn b/modules/material_maker/mat_maker_gd/widgets/curve_edit/curve_edit.tscn
new file mode 100644
index 000000000..9c018b506
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/curve_edit/curve_edit.tscn
@@ -0,0 +1,22 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/widgets/curve_edit/curve_edit.gd" type="Script" id=1]
+[ext_resource path="res://addons/mat_maker_gd/widgets/curve_edit/curve_view.tscn" type="PackedScene" id=2]
+
+[node name="CurveEdit" type="Button"]
+anchor_left = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = -1280.0
+margin_right = -1220.0
+margin_bottom = -700.0
+rect_min_size = Vector2( 60, 20 )
+focus_mode = 1
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="CurveView" parent="." instance=ExtResource( 2 )]
+
+[connection signal="pressed" from="." to="." method="_on_CurveEdit_pressed"]
diff --git a/modules/material_maker/mat_maker_gd/widgets/curve_edit/curve_editor.gd b/modules/material_maker/mat_maker_gd/widgets/curve_edit/curve_editor.gd
new file mode 100644
index 000000000..abbe57f6e
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/curve_edit/curve_editor.gd
@@ -0,0 +1,80 @@
+tool
+extends "res://addons/mat_maker_gd/widgets/curve_edit/curve_view.gd"
+
+signal value_changed(value)
+
+func _ready():
+ update_controls()
+
+func set_curve(c) -> void:
+ curve = c
+ update()
+ update_controls()
+
+func update_controls() -> void:
+ if !curve:
+ return
+
+ for c in get_children():
+ c.queue_free()
+
+ var points = curve.get_points()
+
+ for i in points.size():
+ var p = points[i]
+ var control_point = preload("res://addons/mat_maker_gd/widgets/curve_edit/control_point.tscn").instance()
+ add_child(control_point)
+ control_point.initialize(p)
+ control_point.rect_position = transform_point(p.p)-control_point.OFFSET
+
+ if i == 0 or i == points.size()-1:
+ control_point.set_constraint(control_point.rect_position.x, control_point.rect_position.x, -control_point.OFFSET.y, rect_size.y-control_point.OFFSET.y)
+ if i == 0:
+ control_point.get_child(0).visible = false
+ else:
+ control_point.get_child(1).visible = false
+ else:
+ var min_x = transform_point(points[i-1].p).x+1
+ var max_x = transform_point(points[i+1].p).x-1
+ control_point.set_constraint(min_x, max_x, -control_point.OFFSET.y, rect_size.y-control_point.OFFSET.y)
+
+ control_point.connect("moved", self, "_on_ControlPoint_moved")
+ control_point.connect("removed", self, "_on_ControlPoint_removed")
+
+ emit_signal("value_changed", curve)
+
+func _on_ControlPoint_moved(index):
+ var points : Array = curve.get_points()
+
+ var control_point = get_child(index)
+ points[index].p = reverse_transform_point(control_point.rect_position+control_point.OFFSET)
+
+ if control_point.has_node("LeftSlope"):
+ var slope_vector = control_point.get_node("LeftSlope").rect_position/rect_size
+ if slope_vector.x != 0:
+ points[index].ls = -slope_vector.y / slope_vector.x
+
+ if control_point.has_node("RightSlope"):
+ var slope_vector = control_point.get_node("RightSlope").rect_position/rect_size
+ if slope_vector.x != 0:
+ points[index].rs = -slope_vector.y / slope_vector.x
+
+ curve.set_points(points, false)
+ update()
+ emit_signal("value_changed", curve)
+
+func _on_ControlPoint_removed(index):
+ if curve.remove_point(index):
+ update()
+ update_controls()
+
+func _on_CurveEditor_gui_input(event):
+ if event is InputEventMouseButton:
+ if event.button_index == BUTTON_LEFT and event.doubleclick:
+ var new_point_position = reverse_transform_point(get_local_mouse_position())
+ curve.add_point(new_point_position.x, new_point_position.y, 0.0, 0.0)
+ update_controls()
+
+func _on_resize() -> void:
+ ._on_resize()
+ update_controls()
diff --git a/modules/material_maker/mat_maker_gd/widgets/curve_edit/curve_editor.tscn b/modules/material_maker/mat_maker_gd/widgets/curve_edit/curve_editor.tscn
new file mode 100644
index 000000000..60d5c386e
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/curve_edit/curve_editor.tscn
@@ -0,0 +1,13 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/widgets/curve_edit/curve_view.tscn" type="PackedScene" id=1]
+[ext_resource path="res://addons/mat_maker_gd/widgets/curve_edit/curve_editor.gd" type="Script" id=2]
+
+[node name="CurveEditor" instance=ExtResource( 1 )]
+margin_left = 10.0
+margin_top = 10.0
+margin_right = -10.0
+margin_bottom = -10.0
+mouse_filter = 0
+script = ExtResource( 2 )
+[connection signal="gui_input" from="." to="." method="_on_CurveEditor_gui_input"]
diff --git a/modules/material_maker/mat_maker_gd/widgets/curve_edit/curve_view.gd b/modules/material_maker/mat_maker_gd/widgets/curve_edit/curve_view.gd
new file mode 100644
index 000000000..b6ea14463
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/curve_edit/curve_view.gd
@@ -0,0 +1,70 @@
+tool
+extends Control
+
+var MMCurve = preload("res://addons/mat_maker_gd/nodes/bases/curve_base.gd")
+
+export var show_axes : bool = false
+
+var curve #: MMCurve
+
+func _ready() -> void:
+# curve = MMCurve.new()
+ connect("resized", self, "_on_resize")
+ update()
+
+func set_curve(val) -> void:
+ curve = val
+ update()
+
+func transform_point(p : Vector2) -> Vector2:
+ return (Vector2(0.0, 1.0)+Vector2(1.0, -1.0)*p)*rect_size
+
+func reverse_transform_point(p : Vector2) -> Vector2:
+ return Vector2(0.0, 1.0)+Vector2(1.0, -1.0)*p/rect_size
+
+func _draw():
+ if !curve:
+ return
+
+# var current_theme : Theme = get_node("/root/MainWindow").theme
+#
+# var bg = current_theme.get_stylebox("panel", "Panel").bg_color
+# var fg = current_theme.get_color("font_color", "Label")
+#
+# var axes_color : Color = bg.linear_interpolate(fg, 0.25)
+# var curve_color : Color = bg.linear_interpolate(fg, 0.75)
+
+ var axes_color : Color = Color(0.9, 0.9, 0.9, 1)
+ var curve_color : Color = Color(1, 1, 1, 1)
+
+ if show_axes:
+ for i in range(5):
+ var p = transform_point(0.25*Vector2(i, i))
+ draw_line(Vector2(p.x, 0), Vector2(p.x, rect_size.y-1), axes_color)
+ draw_line(Vector2(0, p.y), Vector2(rect_size.x-1, p.y), axes_color)
+
+ var points = curve.get_points()
+
+ for i in range(points.size() - 1):
+ var p1 = points[i].p
+ var p2 = points[i+1].p
+ var d = (p2.x-p1.x)/3.0
+ var yac = p1.y+d*points[i].rs
+ var ybc = p2.y-d*points[i+1].ls
+ var p = transform_point(p1)
+ var count : int = max(1, int((transform_point(p2).x-p.x/5.0)))
+
+ for tt in range(count):
+ var t = (tt+1.0)/count
+ var omt = (1.0 - t)
+ var omt2 = omt * omt
+ var omt3 = omt2 * omt
+ var t2 = t * t
+ var t3 = t2 * t
+ var x = p1.x+(p2.x-p1.x)*t
+ var np = transform_point(Vector2(x, p1.y*omt3 + yac*omt2*t*3.0 + ybc*omt*t2*3.0 + p2.y*t3))
+ draw_line(p, np, curve_color)
+ p = np
+
+func _on_resize() -> void:
+ update()
diff --git a/modules/material_maker/mat_maker_gd/widgets/curve_edit/curve_view.tscn b/modules/material_maker/mat_maker_gd/widgets/curve_edit/curve_view.tscn
new file mode 100644
index 000000000..ffae7ac81
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/curve_edit/curve_view.tscn
@@ -0,0 +1,16 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/widgets/curve_edit/curve_view.gd" type="Script" id=1]
+
+[node name="CurveView" type="Control"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = 4.0
+margin_top = 4.0
+margin_right = -4.0
+margin_bottom = -4.0
+mouse_filter = 2
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
diff --git a/modules/material_maker/mat_maker_gd/widgets/curve_edit/slope_point.gd b/modules/material_maker/mat_maker_gd/widgets/curve_edit/slope_point.gd
new file mode 100644
index 000000000..bcbaa4e45
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/curve_edit/slope_point.gd
@@ -0,0 +1,49 @@
+tool
+extends Control
+
+export var distance : float
+
+var moving = false
+
+const OFFSET = -Vector2(0, 0)
+
+func _ready():
+ pass # Replace with function body.
+
+func _draw():
+# var current_theme : Theme = get_node("/root/MainWindow").theme
+# var color : Color = current_theme.get_color("font_color", "Label")
+
+ var color : Color = Color(1, 1, 1, 1)
+
+ draw_circle(Vector2(3.0, 3.0), 3.0, color)
+
+func _on_ControlPoint_gui_input(event):
+ if event is InputEventMouseButton:
+ if event.button_index == BUTTON_LEFT:
+ if event.pressed:
+ if event.doubleclick:
+ var parent = get_parent()
+ var vector : Vector2
+ if get_index() == 0:
+ vector = parent.rect_position-parent.get_parent().get_child(parent.get_index()-1).rect_position
+ else:
+ vector = parent.get_parent().get_child(parent.get_index()+1).rect_position-parent.rect_position
+ vector = distance*vector.normalized()
+ rect_position = vector-OFFSET
+ if event.control:
+ get_parent().get_child(1-get_index()).rect_position = -vector-OFFSET
+ get_parent().update_tangents()
+ else:
+ moving = true
+ else:
+ moving = false
+ elif moving and event is InputEventMouseMotion:
+ var vector = get_global_mouse_position()-get_parent().get_global_rect().position+OFFSET
+ vector *= sign(vector.x)
+ vector = distance*vector.normalized()
+ rect_position = vector-OFFSET
+ if event.control:
+ get_parent().get_child(1-get_index()).rect_position = -vector-OFFSET
+
+ get_parent().update_tangents()
diff --git a/modules/material_maker/mat_maker_gd/widgets/float_edit/float_edit.gd b/modules/material_maker/mat_maker_gd/widgets/float_edit/float_edit.gd
new file mode 100644
index 000000000..cdb73e571
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/float_edit/float_edit.gd
@@ -0,0 +1,139 @@
+tool
+extends LineEdit
+
+export var value : float = 0.5 setget set_value
+export var min_value : float = 0.0 setget set_min_value
+export var max_value : float = 1.0 setget set_max_value
+export var step : float = 0.0 setget set_step
+export var float_only : bool = false
+
+var sliding : bool = false
+var start_position : float
+var last_position : float
+var start_value : float
+var modifiers : int
+var from_lower_bound : bool = false
+var from_upper_bound : bool = false
+
+onready var slider = $Slider
+onready var cursor = $Slider/Cursor
+
+signal value_changed(value)
+
+func _ready() -> void:
+ do_update()
+
+func set_value(v) -> void:
+ if v is float:
+ value = v
+ do_update()
+ $Slider.visible = true
+ elif v is String and !float_only:
+ text = v
+ $Slider.visible = false
+
+func set_min_value(v : float) -> void:
+ min_value = v
+ do_update()
+
+func set_max_value(v : float) -> void:
+ max_value = v
+ do_update()
+
+func set_step(v : float) -> void:
+ step = v
+ do_update()
+
+func do_update(update_text : bool = true) -> void:
+ if update_text and $Slider.visible:
+ text = str(value)
+ if cursor != null:
+ if max_value != min_value:
+ cursor.rect_position.x = (clamp(value, min_value, max_value)-min_value)*(slider.rect_size.x-cursor.rect_size.x)/(max_value-min_value)
+ else:
+ cursor.rect_position.x = 0
+
+func get_modifiers(event):
+ var new_modifiers = 0
+ if event.shift:
+ new_modifiers |= 1
+ if event.control:
+ new_modifiers |= 2
+ if event.alt:
+ new_modifiers |= 4
+ return new_modifiers
+
+func _on_LineEdit_gui_input(event : InputEvent) -> void:
+ if !$Slider.visible or !editable:
+ return
+ if event is InputEventMouseButton and event.button_index == BUTTON_LEFT:
+ if event.is_pressed():
+ last_position = event.position.x
+ start_position = last_position
+ start_value = value
+ sliding = true
+ from_lower_bound = value <= min_value
+ from_upper_bound = value >= max_value
+ modifiers = get_modifiers(event)
+ else:
+ sliding = false
+ elif sliding and event is InputEventMouseMotion and event.button_mask == BUTTON_MASK_LEFT:
+ var new_modifiers = get_modifiers(event)
+ if new_modifiers != modifiers:
+ start_position = last_position
+ start_value = value
+ modifiers = new_modifiers
+ else:
+ last_position = event.position.x
+ var delta : float = last_position-start_position
+ var current_step = step
+ if event.control:
+ delta *= 0.2
+ elif event.shift:
+ delta *= 5.0
+ if event.alt:
+ current_step *= 0.01
+ var v : float = start_value+sign(delta)*pow(abs(delta)*0.005, 2)*abs(max_value - min_value)
+ if current_step != 0:
+ v = min_value+floor((v - min_value)/current_step)*current_step
+ if !from_lower_bound and v < min_value:
+ v = min_value
+ if !from_upper_bound and v > max_value:
+ v = max_value
+ set_value(v)
+ select(0, 0)
+ emit_signal("value_changed", value)
+ release_focus()
+ elif event is InputEventKey and !event.echo:
+ match event.scancode:
+ KEY_SHIFT, KEY_CONTROL, KEY_ALT:
+ start_position = last_position
+ start_value = value
+ modifiers = get_modifiers(event)
+
+func _on_LineEdit_text_changed(new_text : String) -> void:
+ if new_text.is_valid_float():
+ value = new_text.to_float()
+ do_update(false)
+
+func _on_LineEdit_text_entered(new_text : String, release = true) -> void:
+ if new_text.is_valid_float():
+ value = new_text.to_float()
+ do_update()
+ emit_signal("value_changed", value)
+ $Slider.visible = true
+ elif float_only:
+ do_update()
+ emit_signal("value_changed", value)
+ $Slider.visible = true
+ else:
+ emit_signal("value_changed", new_text)
+ $Slider.visible = false
+ if release:
+ release_focus()
+
+func _on_FloatEdit_focus_entered():
+ select_all()
+
+func _on_LineEdit_focus_exited() -> void:
+ _on_LineEdit_text_entered(text, false)
diff --git a/modules/material_maker/mat_maker_gd/widgets/float_edit/float_edit.tscn b/modules/material_maker/mat_maker_gd/widgets/float_edit/float_edit.tscn
new file mode 100644
index 000000000..7f13ead7c
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/float_edit/float_edit.tscn
@@ -0,0 +1,46 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/widgets/float_edit/float_edit.gd" type="Script" id=1]
+
+[node name="FloatEdit" type="LineEdit"]
+anchor_left = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = -1280.0
+margin_right = -1222.0
+margin_bottom = -696.0
+focus_mode = 1
+text = "0.5"
+max_length = 100
+context_menu_enabled = false
+caret_blink = true
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Slider" type="ColorRect" parent="."]
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = 2.0
+margin_top = -3.0
+margin_right = -2.0
+margin_bottom = -3.0
+rect_min_size = Vector2( 0, 2 )
+mouse_filter = 2
+color = Color( 0.501961, 0.501961, 0.501961, 1 )
+
+[node name="Cursor" type="ColorRect" parent="Slider"]
+margin_right = 3.0
+margin_bottom = 1.0
+rect_min_size = Vector2( 3, 2 )
+mouse_filter = 2
+
+[connection signal="focus_entered" from="." to="." method="_on_FloatEdit_focus_entered"]
+[connection signal="focus_exited" from="." to="." method="_on_LineEdit_focus_exited"]
+[connection signal="gui_input" from="." to="." method="_on_LineEdit_gui_input"]
+[connection signal="resized" from="." to="." method="do_update"]
+[connection signal="text_changed" from="." to="." method="_on_LineEdit_text_changed"]
+[connection signal="text_entered" from="." to="." method="_on_LineEdit_text_entered"]
+[connection signal="resized" from="Slider" to="." method="do_update"]
diff --git a/modules/material_maker/mat_maker_gd/widgets/gradient_editor/gradient_editor.gd b/modules/material_maker/mat_maker_gd/widgets/gradient_editor/gradient_editor.gd
new file mode 100644
index 000000000..f1c2625d8
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/gradient_editor/gradient_editor.gd
@@ -0,0 +1,288 @@
+tool
+extends Control
+
+class GradientCursor:
+ extends Control
+
+ var color : Color
+ var sliding : bool = false
+
+ onready var label : Label = get_parent().get_node("Value")
+
+ const WIDTH : int = 10
+
+ func _ready() -> void:
+ rect_position = Vector2(0, 15)
+ rect_size = Vector2(WIDTH, 15)
+
+ func _draw() -> void:
+# warning-ignore:integer_division
+ var polygon : PoolVector2Array = PoolVector2Array([Vector2(0, 5), Vector2(WIDTH/2, 0), Vector2(WIDTH, 5), Vector2(WIDTH, 15), Vector2(0, 15), Vector2(0, 5)])
+ var c = color
+ c.a = 1.0
+ draw_colored_polygon(polygon, c)
+ draw_polyline(polygon, Color(0.0, 0.0, 0.0) if color.v > 0.5 else Color(1.0, 1.0, 1.0))
+
+ func _gui_input(ev) -> void:
+ if ev is InputEventMouseButton:
+ if ev.button_index == BUTTON_LEFT:
+ if ev.doubleclick:
+ get_parent().save_color_state()
+ get_parent().select_color(self, ev.global_position)
+ elif ev.pressed:
+ get_parent().save_color_state()
+ sliding = true
+ label.visible = true
+ label.text = "%.03f" % get_cursor_position()
+ else:
+ if sliding:
+ get_parent().undo_redo_save_color_state()
+
+ sliding = false
+ label.visible = false
+ elif ev.button_index == BUTTON_RIGHT and get_parent().get_sorted_cursors().size() > 2:
+ var parent = get_parent()
+ parent.save_color_state()
+ parent.remove_child(self)
+ parent.update_value()
+ parent.undo_redo_save_color_state()
+ queue_free()
+ elif ev is InputEventMouseMotion and (ev.button_mask & BUTTON_MASK_LEFT) != 0 and sliding:
+ rect_position.x += get_local_mouse_position().x
+ if ev.control:
+ rect_position.x = round(get_cursor_position()*20.0)*0.05*(get_parent().rect_size.x - WIDTH)
+ rect_position.x = min(max(0, rect_position.x), get_parent().rect_size.x-rect_size.x)
+ get_parent().update_value()
+ label.text = "%.03f" % get_cursor_position()
+
+ func get_cursor_position() -> float:
+ return rect_position.x / (get_parent().rect_size.x - WIDTH)
+
+ func set_color(c) -> void:
+ color = c
+ get_parent().update_value()
+ update()
+
+ static func sort(a, b) -> bool:
+ return a.get_position() < b.get_position()
+
+ func can_drop_data(_position, data) -> bool:
+ return typeof(data) == TYPE_COLOR
+
+ func drop_data(_position, data) -> void:
+ set_color(data)
+
+var graph_node = null
+var value = null setget set_value
+export var embedded : bool = true
+var _undo_redo : UndoRedo = null
+
+signal updated(value)
+
+var _saved_points : PoolRealArray = PoolRealArray()
+
+func _init():
+ connect("resized", self, "on_resized")
+
+func ignore_changes(val):
+ graph_node.ignore_changes(val)
+
+func save_color_state():
+ var p : PoolRealArray = value.points
+ _saved_points.resize(0)
+
+ for v in p:
+ _saved_points.push_back(v)
+
+ ignore_changes(true)
+
+func undo_redo_save_color_state():
+ var op : PoolRealArray
+ var np : PoolRealArray
+
+ for v in _saved_points:
+ op.push_back(v)
+
+ for v in value.get_points():
+ np.push_back(v)
+
+ _undo_redo.create_action("MMGD: gradient colors changed")
+ _undo_redo.add_do_method(value, "set_points", np)
+ _undo_redo.add_undo_method(value, "set_points", op)
+ _undo_redo.commit_action()
+
+ ignore_changes(false)
+
+func set_undo_redo(ur : UndoRedo) -> void:
+ _undo_redo = ur
+
+#func get_gradient_from_data(data):
+# if typeof(data) == TYPE_ARRAY:
+# return data
+# elif typeof(data) == TYPE_DICTIONARY:
+# if data.has("parameters") and data.parameters.has("gradient"):
+# return data.parameters.gradient
+# if data.has("type") and data.type == "Gradient":
+# return data
+# return null
+
+#func get_drag_data(_position : Vector2):
+# var data = 0#MMType.serialize_value(value)
+# var preview = ColorRect.new()
+# preview.rect_size = Vector2(64, 24)
+# preview.material = $Gradient.material
+# set_drag_preview(preview)
+# return data
+#
+#func can_drop_data(_position : Vector2, data) -> bool:
+# return get_gradient_from_data(data) != null
+#
+#func drop_data(_position : Vector2, data) -> void:
+# var gradient = get_gradient_from_data(data)
+# #if gradient != null:
+# #set_value(MMType.deserialize_value(gradient))
+
+func set_value(v) -> void:
+ value = v
+
+ update_preview()
+ call_deferred("update_cursors")
+
+func update_cursors() -> void:
+ for c in get_children():
+ if c is GradientCursor:
+ remove_child(c)
+ c.free()
+
+ var vs : int = value.get_point_count()
+
+ for i in range(vs):
+ add_cursor(value.get_point_value(i) * (rect_size.x-GradientCursor.WIDTH), value.get_point_color(i))
+
+ $Interpolation.selected = value.interpolation_type
+
+func update_value() -> void:
+ value.clear()
+
+ var sc : Array = get_sorted_cursors()
+
+ var points : PoolRealArray = PoolRealArray()
+
+ for c in sc:
+
+ points.push_back(c.rect_position.x/(rect_size.x-GradientCursor.WIDTH))
+
+ var color : Color = c.color
+
+ points.push_back(color.r)
+ points.push_back(color.g)
+ points.push_back(color.b)
+ points.push_back(color.a)
+
+ value.set_points(points)
+
+ update_preview()
+
+func add_cursor(x, color) -> void:
+ var cursor = GradientCursor.new()
+ add_child(cursor)
+ cursor.rect_position.x = x
+ cursor.color = color
+
+func _gui_input(ev) -> void:
+ if ev is InputEventMouseButton and ev.button_index == 1 and ev.doubleclick:
+ if ev.position.y > 15:
+ var p = clamp(ev.position.x, 0, rect_size.x-GradientCursor.WIDTH)
+ save_color_state()
+ add_cursor(p, get_gradient_color(p))
+ update_value()
+ undo_redo_save_color_state()
+ elif embedded:
+ var popup = load("res://addons/mat_maker_gd/widgets/gradient_editor/gradient_popup.tscn").instance()
+ add_child(popup)
+ var popup_size = popup.rect_size
+ popup.popup(Rect2(ev.global_position, Vector2(0, 0)))
+ popup.set_global_position(ev.global_position-Vector2(popup_size.x / 2, popup_size.y))
+ popup.init(value, graph_node, _undo_redo)
+ popup.connect("updated", self, "set_value")
+ popup.connect("popup_hide", popup, "queue_free")
+
+# Showing a color picker popup to change a cursor's color
+
+var active_cursor
+
+func select_color(cursor, position) -> void:
+ active_cursor = cursor
+ var color_picker_popup = preload("res://addons/mat_maker_gd/widgets/color_picker_popup/color_picker_popup.tscn").instance()
+ add_child(color_picker_popup)
+ var color_picker = color_picker_popup.get_node("ColorPicker")
+ color_picker.color = cursor.color
+ color_picker.connect("color_changed", cursor, "set_color")
+ color_picker_popup.rect_position = position
+ color_picker_popup.connect("popup_hide", self, "undo_redo_save_color_state")
+ color_picker_popup.connect("popup_hide", color_picker_popup, "queue_free")
+ color_picker_popup.popup()
+
+# Calculating a color from the gradient and generating the shader
+
+func get_sorted_cursors() -> Array:
+ var array = []
+ for c in get_children():
+ if c is GradientCursor:
+ array.append(c)
+ array.sort_custom(GradientCursor, "sort")
+ return array
+
+func generate_preview_image() -> void:
+ var tex : ImageTexture = $Gradient.texture
+
+ if !tex:
+ tex = ImageTexture.new()
+ $Gradient.texture = tex
+
+ var img : Image = tex.get_data()
+
+ var w : float = $Gradient.rect_size.x
+ var h : float = $Gradient.rect_size.y
+
+ if !img:
+ img = Image.new()
+
+ if img.get_size().x != w || img.get_size().y != h:
+ img.create(w, h, false, Image.FORMAT_RGBA8)
+
+ img.lock()
+
+ for i in range(w):
+ var x : float = float(i) / float(w)
+ var col : Color = value.get_gradient_color(x)
+
+ for j in range(h):
+ img.set_pixel(i, j, col)
+
+ img.unlock()
+
+ tex.create_from_image(img, 0)
+
+func get_gradient_color(x) -> Color:
+ return value.get_gradient_color(x / (rect_size.x - GradientCursor.WIDTH))
+
+func update_preview() -> void:
+ call_deferred("generate_preview_image")
+
+func _on_Interpolation_item_selected(ID) -> void:
+ ignore_changes(true)
+
+ _undo_redo.create_action("MMGD: gradient interpolation_type changed")
+ _undo_redo.add_do_method(value, "set_interpolation_type", ID)
+ _undo_redo.add_undo_method(value, "set_interpolation_type", value.interpolation_type)
+ _undo_redo.commit_action()
+
+ ignore_changes(false)
+
+ update_preview()
+
+func on_resized() -> void:
+ if value:
+ update_preview()
+ call_deferred("update_cursors")
diff --git a/modules/material_maker/mat_maker_gd/widgets/gradient_editor/gradient_editor.tscn b/modules/material_maker/mat_maker_gd/widgets/gradient_editor/gradient_editor.tscn
new file mode 100644
index 000000000..7293cc5b5
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/gradient_editor/gradient_editor.tscn
@@ -0,0 +1,93 @@
+[gd_scene load_steps=10 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/widgets/gradient_editor/gradient_editor.gd" type="Script" id=1]
+[ext_resource path="res://addons/mat_maker_gd/icons/icons.tres" type="Texture" id=2]
+
+[sub_resource type="Shader" id=1]
+code = "shader_type canvas_item;
+
+void fragment() {
+ COLOR = vec4(vec3(2.0*fract(0.5*(floor(0.12*FRAGCOORD.x)+floor(0.125*FRAGCOORD.y)))), 1.0);
+}"
+
+[sub_resource type="ShaderMaterial" id=2]
+shader = SubResource( 1 )
+
+[sub_resource type="Theme" id=5]
+
+[sub_resource type="AtlasTexture" id=6]
+flags = 7
+atlas = ExtResource( 2 )
+region = Rect2( 96, 0, 32, 16 )
+
+[sub_resource type="AtlasTexture" id=7]
+flags = 7
+atlas = ExtResource( 2 )
+region = Rect2( 64, 0, 32, 16 )
+
+[sub_resource type="AtlasTexture" id=8]
+flags = 7
+atlas = ExtResource( 2 )
+region = Rect2( 64, 16, 32, 16 )
+
+[sub_resource type="AtlasTexture" id=9]
+flags = 7
+atlas = ExtResource( 2 )
+region = Rect2( 96, 16, 32, 16 )
+
+[node name="Control" type="Control"]
+margin_right = 120.0
+margin_bottom = 30.0
+rect_min_size = Vector2( 120, 32 )
+focus_mode = 1
+script = ExtResource( 1 )
+
+[node name="Background" type="ColorRect" parent="."]
+material = SubResource( 2 )
+anchor_right = 1.0
+margin_left = 4.0
+margin_right = -4.0
+margin_bottom = 15.0
+rect_min_size = Vector2( 112, 17 )
+mouse_filter = 2
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Gradient" type="TextureRect" parent="."]
+anchor_right = 1.0
+margin_left = 4.0
+margin_right = -4.0
+margin_bottom = 15.0
+rect_min_size = Vector2( 112, 17 )
+mouse_filter = 2
+theme = SubResource( 5 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Interpolation" type="OptionButton" parent="."]
+margin_left = 0.418457
+margin_top = -2.90374
+margin_right = 73.4185
+margin_bottom = 19.0963
+rect_scale = Vector2( 0.5, 0.5 )
+icon = SubResource( 6 )
+items = [ "", SubResource( 7 ), false, 0, null, "", SubResource( 6 ), false, 1, null, "", SubResource( 8 ), false, 2, null, "", SubResource( 9 ), false, 3, null ]
+selected = 1
+
+[node name="Value" type="Label" parent="."]
+anchor_right = 1.0
+margin_top = -1.0
+margin_bottom = 14.0
+custom_colors/font_color = Color( 1, 1, 1, 1 )
+custom_colors/font_color_shadow = Color( 0, 0, 0, 1 )
+custom_constants/shadow_offset_x = 1
+custom_constants/shadow_offset_y = 1
+custom_constants/shadow_as_outline = 1
+align = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[connection signal="item_selected" from="Interpolation" to="." method="_on_Interpolation_item_selected"]
diff --git a/modules/material_maker/mat_maker_gd/widgets/gradient_editor/gradient_popup.gd b/modules/material_maker/mat_maker_gd/widgets/gradient_editor/gradient_popup.gd
new file mode 100644
index 000000000..466c12cc7
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/gradient_editor/gradient_popup.gd
@@ -0,0 +1,15 @@
+tool
+extends Popup
+
+signal updated(value)
+
+func init(value, graph_node, undo_redo) -> void:
+ $Panel/Control.set_undo_redo(undo_redo)
+ $Panel/Control.graph_node = graph_node
+ $Panel/Control.set_value(value)
+
+func _on_Control_updated(value) -> void:
+ emit_signal("updated", value)
+
+func _on_GradientPopup_popup_hide() -> void:
+ queue_free()
diff --git a/modules/material_maker/mat_maker_gd/widgets/gradient_editor/gradient_popup.tscn b/modules/material_maker/mat_maker_gd/widgets/gradient_editor/gradient_popup.tscn
new file mode 100644
index 000000000..1b9c5b152
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/gradient_editor/gradient_popup.tscn
@@ -0,0 +1,31 @@
+[gd_scene load_steps=4 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/widgets/gradient_editor/gradient_popup.gd" type="Script" id=1]
+[ext_resource path="res://addons/mat_maker_gd/widgets/gradient_editor/gradient_editor.tscn" type="PackedScene" id=2]
+
+[sub_resource type="StyleBoxFlat" id=1]
+bg_color = Color( 0, 0, 0.25098, 0.752941 )
+
+[node name="GradientPopup" type="Popup"]
+margin_right = 632.0
+margin_bottom = 49.0
+size_flags_horizontal = 0
+size_flags_vertical = 0
+script = ExtResource( 1 )
+
+[node name="Panel" type="Panel" parent="."]
+margin_right = 632.0
+margin_bottom = 49.0
+custom_styles/panel = SubResource( 1 )
+
+[node name="Control" parent="Panel" instance=ExtResource( 2 )]
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = 10.0
+margin_top = 10.0
+margin_right = -10.0
+margin_bottom = -10.0
+embedded = false
+
+[connection signal="popup_hide" from="." to="." method="_on_GradientPopup_popup_hide"]
+[connection signal="updated" from="Panel/Control" to="." method="_on_Control_updated"]
diff --git a/modules/material_maker/mat_maker_gd/widgets/image_picker_button/image_picker_button.gd b/modules/material_maker/mat_maker_gd/widgets/image_picker_button/image_picker_button.gd
new file mode 100644
index 000000000..73072e17e
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/image_picker_button/image_picker_button.gd
@@ -0,0 +1,46 @@
+tool
+extends TextureButton
+
+
+var image_path = ""
+
+
+signal on_file_selected(f)
+
+
+func _ready():
+ texture_normal = ImageTexture.new()
+
+func do_set_image_path(path) -> void:
+ if path == null:
+ return
+ image_path = path
+
+ texture_normal.load(image_path)
+
+func set_image_path(path) -> void:
+ do_set_image_path(path)
+ emit_signal("on_file_selected", path)
+
+func _on_ImagePicker_pressed():
+ var dialog = preload("res://addons/mat_maker_gd/windows/file_dialog/file_dialog.tscn").instance()
+ add_child(dialog)
+ dialog.rect_min_size = Vector2(500, 500)
+ dialog.access = FileDialog.ACCESS_FILESYSTEM
+ dialog.mode = FileDialog.MODE_OPEN_FILE
+ dialog.add_filter("*.bmp;BMP Image")
+ dialog.add_filter("*.exr;EXR Image")
+ dialog.add_filter("*.hdr;Radiance HDR Image")
+ dialog.add_filter("*.jpg,*.jpeg;JPEG Image")
+ dialog.add_filter("*.png;PNG Image")
+ dialog.add_filter("*.svg;SVG Image")
+ dialog.add_filter("*.tga;TGA Image")
+ dialog.add_filter("*.webp;WebP Image")
+ var files = dialog.select_files()
+ while files is GDScriptFunctionState:
+ files = yield(files, "completed")
+ if files.size() > 0:
+ set_image_path(files[0])
+
+func on_drop_image_file(file_name : String) -> void:
+ set_image_path(file_name)
diff --git a/modules/material_maker/mat_maker_gd/widgets/image_picker_button/image_picker_button.tscn b/modules/material_maker/mat_maker_gd/widgets/image_picker_button/image_picker_button.tscn
new file mode 100644
index 000000000..e374a08db
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/image_picker_button/image_picker_button.tscn
@@ -0,0 +1,20 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/widgets/image_picker_button/image_picker_button.gd" type="Script" id=2]
+
+[sub_resource type="ImageTexture" id=1]
+
+[node name="ImagePicker" type="TextureButton"]
+margin_right = 64.0
+margin_bottom = 64.0
+rect_min_size = Vector2( 64, 64 )
+rect_clip_content = true
+texture_normal = SubResource( 1 )
+expand = true
+stretch_mode = 5
+script = ExtResource( 2 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[connection signal="pressed" from="." to="." method="_on_ImagePicker_pressed"]
diff --git a/modules/material_maker/mat_maker_gd/widgets/polygon_edit/control_point.gd b/modules/material_maker/mat_maker_gd/widgets/polygon_edit/control_point.gd
new file mode 100644
index 000000000..156957fac
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/polygon_edit/control_point.gd
@@ -0,0 +1,33 @@
+tool
+extends Control
+
+var moving : bool = false
+
+const OFFSET : Vector2 = Vector2(3, 3)
+
+signal moved(index)
+signal removed(index)
+
+func _draw():
+# var current_theme : Theme = get_node("/root/MainWindow").theme
+# var color : Color = current_theme.get_color("font_color", "Label")
+
+ var color : Color = Color(1, 1, 1, 1)
+ draw_rect(Rect2(0, 0, 7, 7), color)
+
+func initialize(p : Vector2) -> void:
+ rect_position = get_parent().transform_point(p) - OFFSET
+
+func _on_ControlPoint_gui_input(event):
+ if event is InputEventMouseButton:
+ if event.button_index == BUTTON_LEFT:
+ if event.pressed:
+ moving = true
+ else:
+ moving = false
+ get_parent().update_controls()
+ elif event.button_index == BUTTON_RIGHT and event.pressed:
+ emit_signal("removed", get_index())
+ elif moving and event is InputEventMouseMotion:
+ rect_position += event.relative
+ emit_signal("moved", get_index())
diff --git a/modules/material_maker/mat_maker_gd/widgets/polygon_edit/control_point.tscn b/modules/material_maker/mat_maker_gd/widgets/polygon_edit/control_point.tscn
new file mode 100644
index 000000000..2d445f356
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/polygon_edit/control_point.tscn
@@ -0,0 +1,15 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/widgets/polygon_edit/control_point.gd" type="Script" id=1]
+
+[node name="ControlPoint" type="Control"]
+margin_left = 56.9864
+margin_top = 33.8615
+margin_right = 63.9864
+margin_bottom = 40.8615
+rect_min_size = Vector2( 7, 7 )
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+[connection signal="gui_input" from="." to="." method="_on_ControlPoint_gui_input"]
diff --git a/modules/material_maker/mat_maker_gd/widgets/polygon_edit/polygon_dialog.gd b/modules/material_maker/mat_maker_gd/widgets/polygon_edit/polygon_dialog.gd
new file mode 100644
index 000000000..da96c7a52
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/polygon_edit/polygon_dialog.gd
@@ -0,0 +1,46 @@
+tool
+extends WindowDialog
+
+export var closed : bool = true setget set_closed
+var previous_points : PoolVector2Array
+var polygon
+
+signal polygon_changed(polygon)
+
+func set_closed(c : bool = true):
+ closed = c
+ window_title = "Edit polygon" if closed else "Edit polyline"
+ $VBoxContainer/EditorContainer/PolygonEditor.set_closed(closed)
+
+func _on_CurveDialog_popup_hide():
+# emit_signal("return_polygon", null)
+ queue_free()
+ pass
+
+func _on_OK_pressed():
+ emit_signal("polygon_changed", polygon)
+ polygon.polygon_changed()
+
+ queue_free()
+
+func _on_Cancel_pressed():
+ polygon.set_points(previous_points)
+ emit_signal("polygon_changed", polygon)
+
+ queue_free()
+
+func edit_polygon(poly):
+ polygon = poly
+ previous_points = polygon.points
+
+ $VBoxContainer/EditorContainer/PolygonEditor.set_polygon(polygon)
+ popup_centered()
+
+ #var result = yield(self, "return_polygon")
+
+ #queue_free()
+
+ #return result
+
+func _on_PolygonEditor_value_changed(value):
+ emit_signal("polygon_changed", value)
diff --git a/modules/material_maker/mat_maker_gd/widgets/polygon_edit/polygon_dialog.tscn b/modules/material_maker/mat_maker_gd/widgets/polygon_edit/polygon_dialog.tscn
new file mode 100644
index 000000000..1bf6da5f4
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/polygon_edit/polygon_dialog.tscn
@@ -0,0 +1,81 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/widgets/polygon_edit/polygon_editor.tscn" type="PackedScene" id=1]
+[ext_resource path="res://addons/mat_maker_gd/widgets/polygon_edit/polygon_dialog.gd" type="Script" id=2]
+
+[node name="PolygonDialog" type="WindowDialog"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = 307.0
+margin_top = 151.0
+margin_right = -508.0
+margin_bottom = -70.0
+window_title = "Edit polygon"
+script = ExtResource( 2 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="VBoxContainer" type="VBoxContainer" parent="."]
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = 5.0
+margin_top = 5.0
+margin_right = -5.0
+margin_bottom = -5.0
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="EditorContainer" type="MarginContainer" parent="VBoxContainer"]
+margin_right = 455.0
+margin_bottom = 457.0
+rect_clip_content = true
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_constants/margin_right = 4
+custom_constants/margin_top = 4
+custom_constants/margin_left = 4
+custom_constants/margin_bottom = 4
+
+[node name="PolygonEditor" parent="VBoxContainer/EditorContainer" instance=ExtResource( 1 )]
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 4.0
+margin_top = 4.0
+margin_right = 451.0
+margin_bottom = 453.0
+
+[node name="HSeparator" type="HSeparator" parent="VBoxContainer"]
+margin_top = 461.0
+margin_right = 455.0
+margin_bottom = 465.0
+
+[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"]
+margin_top = 469.0
+margin_right = 455.0
+margin_bottom = 489.0
+
+[node name="Control" type="Control" parent="VBoxContainer/HBoxContainer"]
+margin_right = 327.0
+margin_bottom = 20.0
+size_flags_horizontal = 3
+
+[node name="OK" type="Button" parent="VBoxContainer/HBoxContainer"]
+margin_left = 331.0
+margin_right = 391.0
+margin_bottom = 20.0
+rect_min_size = Vector2( 60, 0 )
+text = "OK"
+
+[node name="Cancel" type="Button" parent="VBoxContainer/HBoxContainer"]
+margin_left = 395.0
+margin_right = 455.0
+margin_bottom = 20.0
+rect_min_size = Vector2( 60, 0 )
+text = "Cancel"
+
+[connection signal="popup_hide" from="." to="." method="_on_CurveDialog_popup_hide"]
+[connection signal="value_changed" from="VBoxContainer/EditorContainer/PolygonEditor" to="." method="_on_PolygonEditor_value_changed"]
+[connection signal="pressed" from="VBoxContainer/HBoxContainer/OK" to="." method="_on_OK_pressed"]
+[connection signal="pressed" from="VBoxContainer/HBoxContainer/Cancel" to="." method="_on_Cancel_pressed"]
diff --git a/modules/material_maker/mat_maker_gd/widgets/polygon_edit/polygon_edit.gd b/modules/material_maker/mat_maker_gd/widgets/polygon_edit/polygon_edit.gd
new file mode 100644
index 000000000..e8febfd79
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/polygon_edit/polygon_edit.gd
@@ -0,0 +1,34 @@
+tool
+extends Control
+
+var MMPolygon = preload("res://addons/mat_maker_gd/nodes/bases/polygon_base.gd")
+
+export var closed : bool = true setget set_closed
+var value = null setget set_value
+
+signal updated(polygon)
+
+func set_closed(c : bool = true):
+ closed = c
+ $PolygonView.set_closed(c)
+
+func set_value(v) -> void:
+ value = v
+ $PolygonView.set_polygon(value)
+ $PolygonView.update()
+
+func _on_PolygonEdit_pressed():
+ var dialog = preload("res://addons/mat_maker_gd/widgets/polygon_edit/polygon_dialog.tscn").instance()
+ dialog.set_closed(closed)
+ add_child(dialog)
+
+ dialog.connect("polygon_changed", self, "on_value_changed")
+
+ dialog.edit_polygon(value)
+
+
+
+func on_value_changed(v) -> void:
+ #set_value(v)
+ emit_signal("updated", v)
+ $PolygonView.update()
diff --git a/modules/material_maker/mat_maker_gd/widgets/polygon_edit/polygon_edit.tscn b/modules/material_maker/mat_maker_gd/widgets/polygon_edit/polygon_edit.tscn
new file mode 100644
index 000000000..ccea5f950
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/polygon_edit/polygon_edit.tscn
@@ -0,0 +1,26 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/widgets/polygon_edit/polygon_edit.gd" type="Script" id=1]
+[ext_resource path="res://addons/mat_maker_gd/widgets/polygon_edit/polygon_view.tscn" type="PackedScene" id=2]
+
+[node name="PolygonEdit" type="Button"]
+anchor_left = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = -1280.0
+margin_right = -1248.0
+margin_bottom = -688.0
+rect_min_size = Vector2( 32, 32 )
+focus_mode = 1
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="PolygonView" parent="." instance=ExtResource( 2 )]
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_right = 0.0
+margin_bottom = 0.0
+
+[connection signal="pressed" from="." to="." method="_on_PolygonEdit_pressed"]
diff --git a/modules/material_maker/mat_maker_gd/widgets/polygon_edit/polygon_editor.gd b/modules/material_maker/mat_maker_gd/widgets/polygon_edit/polygon_editor.gd
new file mode 100644
index 000000000..90c9d017c
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/polygon_edit/polygon_editor.gd
@@ -0,0 +1,57 @@
+tool
+extends "res://addons/mat_maker_gd/widgets/polygon_edit/polygon_view.gd"
+
+signal value_changed(value)
+
+func _ready():
+ update_controls()
+
+func set_polygon(p) -> void:
+ polygon = p
+ update()
+ update_controls()
+
+func update_controls() -> void:
+ for c in get_children():
+ c.queue_free()
+
+ if !polygon:
+ return
+
+ for i in polygon.points.size():
+ var p = polygon.points[i]
+ var control_point = preload("res://addons/mat_maker_gd/widgets/polygon_edit/control_point.tscn").instance()
+ add_child(control_point)
+ control_point.initialize(p)
+ control_point.rect_position = transform_point(p)-control_point.OFFSET
+ control_point.connect("moved", self, "_on_ControlPoint_moved")
+ control_point.connect("removed", self, "_on_ControlPoint_removed")
+
+ emit_signal("value_changed", polygon)
+
+func _on_ControlPoint_moved(index):
+ var control_point = get_child(index)
+ polygon.points[index] = reverse_transform_point(control_point.rect_position+control_point.OFFSET)
+
+ update()
+
+ emit_signal("value_changed", polygon)
+
+func _on_ControlPoint_removed(index):
+ if polygon.remove_point(index):
+ update()
+ update_controls()
+
+func _on_PolygonEditor_gui_input(event):
+ if !polygon:
+ return
+
+ if event is InputEventMouseButton:
+ if event.button_index == BUTTON_LEFT and event.doubleclick:
+ var new_point_position = reverse_transform_point(get_local_mouse_position())
+ polygon.add_point(new_point_position.x, new_point_position.y, closed)
+ update_controls()
+
+func _on_resize() -> void:
+ ._on_resize()
+ update_controls()
diff --git a/modules/material_maker/mat_maker_gd/widgets/polygon_edit/polygon_editor.tscn b/modules/material_maker/mat_maker_gd/widgets/polygon_edit/polygon_editor.tscn
new file mode 100644
index 000000000..166b925a5
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/polygon_edit/polygon_editor.tscn
@@ -0,0 +1,14 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/widgets/curve_edit/curve_view.tscn" type="PackedScene" id=1]
+[ext_resource path="res://addons/mat_maker_gd/widgets/polygon_edit/polygon_editor.gd" type="Script" id=2]
+
+[node name="PolygonEditor" instance=ExtResource( 1 )]
+margin_left = 10.0
+margin_top = 10.0
+margin_right = -10.0
+margin_bottom = -10.0
+mouse_filter = 0
+script = ExtResource( 2 )
+
+[connection signal="gui_input" from="." to="." method="_on_PolygonEditor_gui_input"]
diff --git a/modules/material_maker/mat_maker_gd/widgets/polygon_edit/polygon_view.gd b/modules/material_maker/mat_maker_gd/widgets/polygon_edit/polygon_view.gd
new file mode 100644
index 000000000..cf64af90c
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/polygon_edit/polygon_view.gd
@@ -0,0 +1,58 @@
+tool
+extends Control
+
+var MMPolygon = preload("res://addons/mat_maker_gd/nodes/bases/polygon_base.gd")
+
+#: MMPolygon
+var polygon
+
+var draw_size : Vector2 = Vector2(1, 1)
+var draw_offset : Vector2 = Vector2(0, 0)
+var closed : bool = true
+
+func set_closed(c : bool = true):
+ closed = c
+ update()
+
+func _ready() -> void:
+# polygon = MMPolygon.new()
+ connect("resized", self, "_on_resize")
+ _on_resize()
+
+func transform_point(p : Vector2) -> Vector2:
+ return draw_offset+p*draw_size
+
+func reverse_transform_point(p : Vector2) -> Vector2:
+ return (p-draw_offset)/draw_size
+
+func set_polygon(val):
+ polygon = val
+
+ update()
+
+func _draw():
+ if !polygon:
+ return
+
+# var current_theme : Theme = get_node("/root/MainWindow").theme
+# var bg = current_theme.get_stylebox("panel", "Panel").bg_color
+# var fg = current_theme.get_color("font_color", "Label")
+# var axes_color : Color = bg.linear_interpolate(fg, 0.25)
+# var curve_color : Color = bg.linear_interpolate(fg, 0.75)
+
+ var axes_color : Color = Color(0.9, 0.9, 0.9, 1)
+ var curve_color : Color = Color(1, 1, 1, 1)
+
+ draw_rect(Rect2(draw_offset, draw_size), axes_color, false)
+ var tp : Vector2 = transform_point(polygon.points[polygon.points.size()-1 if closed else 0])
+
+ for p in polygon.points:
+ var tnp = transform_point(p)
+ draw_line(tp, tnp, curve_color)
+ tp = tnp
+
+func _on_resize() -> void:
+ var ds : float = min(rect_size.x, rect_size.y)
+ draw_size = Vector2(ds, ds)
+ draw_offset = 0.5*(rect_size-draw_size)
+ update()
diff --git a/modules/material_maker/mat_maker_gd/widgets/polygon_edit/polygon_view.tscn b/modules/material_maker/mat_maker_gd/widgets/polygon_edit/polygon_view.tscn
new file mode 100644
index 000000000..0b9f2eea5
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/widgets/polygon_edit/polygon_view.tscn
@@ -0,0 +1,12 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/widgets/polygon_edit/polygon_view.gd" type="Script" id=1]
+
+[node name="PolygonView" type="Control"]
+margin_right = 64.0
+margin_bottom = 64.0
+mouse_filter = 2
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
diff --git a/modules/material_maker/mat_maker_gd/windows/file_dialog/fav_button.tscn b/modules/material_maker/mat_maker_gd/windows/file_dialog/fav_button.tscn
new file mode 100644
index 000000000..95d056cf8
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/windows/file_dialog/fav_button.tscn
@@ -0,0 +1,17 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/icons/icons.svg" type="Texture" id=1]
+
+[sub_resource type="AtlasTexture" id=1]
+flags = 4
+atlas = ExtResource( 1 )
+region = Rect2( 80, 80, 16, 16 )
+
+[node name="FavButton" type="Button"]
+margin_right = 12.0
+margin_bottom = 20.0
+icon = SubResource( 1 )
+flat = true
+__meta__ = {
+"_edit_use_anchors_": false
+}
diff --git a/modules/material_maker/mat_maker_gd/windows/file_dialog/file_dialog.gd b/modules/material_maker/mat_maker_gd/windows/file_dialog/file_dialog.gd
new file mode 100644
index 000000000..f384b9516
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/windows/file_dialog/file_dialog.gd
@@ -0,0 +1,57 @@
+tool
+extends FileDialog
+
+
+var left_panel = null
+var volume_option = null
+
+
+signal return_paths(path_list)
+
+func _ready() -> void:
+ var vbox = get_child(3)
+ var hbox = HSplitContainer.new()
+ add_child(hbox)
+ remove_child(vbox)
+ left_panel = preload("res://addons/mat_maker_gd/windows/file_dialog/left_panel.tscn").instance()
+ hbox.add_child(left_panel)
+ left_panel.connect("open_directory", self, "set_current_dir")
+ hbox.add_child(vbox)
+ vbox.size_flags_horizontal = SIZE_EXPAND_FILL
+ var fav_button = preload("res://addons/mat_maker_gd/windows/file_dialog/fav_button.tscn").instance()
+ vbox.get_child(0).add_child(fav_button)
+ fav_button.connect("pressed", self, "add_favorite")
+ if OS.get_name() == "Windows":
+ volume_option = vbox.get_child(0).get_child(3)
+ if ! volume_option is OptionButton:
+ volume_option = null
+
+
+func get_full_current_dir() -> String:
+ var prefix = ""
+ if volume_option != null and volume_option.visible:
+ prefix = volume_option.get_item_text(volume_option.selected)
+ return prefix+get_current_dir()
+
+func _on_FileDialog_file_selected(path) -> void:
+ left_panel.add_recent(get_full_current_dir())
+ emit_signal("return_paths", [ path ])
+
+func _on_FileDialog_files_selected(paths) -> void:
+ left_panel.add_recent(get_full_current_dir())
+ emit_signal("return_paths", paths)
+
+func _on_FileDialog_dir_selected(dir) -> void:
+ emit_signal("return_paths", [ dir ])
+
+func _on_FileDialog_popup_hide() -> void:
+ emit_signal("return_paths", [ ])
+
+func select_files() -> Array:
+ popup_centered()
+ var result = yield(self, "return_paths")
+ queue_free()
+ return result
+
+func add_favorite():
+ left_panel.add_favorite(get_full_current_dir())
diff --git a/modules/material_maker/mat_maker_gd/windows/file_dialog/file_dialog.tscn b/modules/material_maker/mat_maker_gd/windows/file_dialog/file_dialog.tscn
new file mode 100644
index 000000000..a95bb7800
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/windows/file_dialog/file_dialog.tscn
@@ -0,0 +1,15 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/windows/file_dialog/file_dialog.gd" type="Script" id=1]
+
+[node name="FileDialog" type="FileDialog"]
+margin_right = 360.0
+margin_bottom = 130.0
+window_title = "Enregistrer un fichier"
+resizable = true
+script = ExtResource( 1 )
+
+[connection signal="dir_selected" from="." to="." method="_on_FileDialog_dir_selected"]
+[connection signal="file_selected" from="." to="." method="_on_FileDialog_file_selected"]
+[connection signal="files_selected" from="." to="." method="_on_FileDialog_files_selected"]
+[connection signal="popup_hide" from="." to="." method="_on_FileDialog_popup_hide"]
diff --git a/modules/material_maker/mat_maker_gd/windows/file_dialog/left_panel.gd b/modules/material_maker/mat_maker_gd/windows/file_dialog/left_panel.gd
new file mode 100644
index 000000000..5673e7057
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/windows/file_dialog/left_panel.gd
@@ -0,0 +1,71 @@
+tool
+extends VBoxContainer
+
+var recents : Array = []
+var favorites : Array = []
+
+signal open_directory(dirpath)
+
+#func _ready():
+# if get_node("/root/MainWindow") != null:
+# var config_cache = get_node("/root/MainWindow").config_cache
+# if config_cache.has_section_key("file_dialog", "recents"):
+# var parse_result = JSON.parse(config_cache.get_value("file_dialog", "recents"))
+# if parse_result != null:
+# recents = parse_result.result
+# if config_cache.has_section_key("file_dialog", "favorites"):
+# var parse_result = JSON.parse(config_cache.get_value("file_dialog", "favorites"))
+# if parse_result != null:
+# favorites = parse_result.result
+# update_lists()
+
+#func _exit_tree():
+# if get_node("/root/MainWindow") != null:
+# var config_cache = get_node("/root/MainWindow").config_cache
+# config_cache.set_value("file_dialog", "recents", JSON.print(recents))
+# config_cache.set_value("file_dialog", "favorites", JSON.print(favorites))
+
+func add_recent(file_path : String):
+ if recents.find(file_path) != -1:
+ recents.erase(file_path)
+ recents.push_front(file_path)
+ update_lists()
+
+func add_favorite(file_path : String):
+ if favorites.find(file_path) == -1:
+ favorites.push_back(file_path)
+ update_lists()
+
+func my_basename(s : String) -> String:
+ var slash_pos : int = s.find_last("/")
+ if slash_pos == -1 or slash_pos+1 == s.length():
+ return s
+ return s.right(slash_pos+1)
+
+func update_lists():
+ $FavList.clear()
+ for d in favorites:
+ $FavList.add_item(my_basename(d))
+ $FavList.set_item_tooltip($FavList.get_item_count()-1, d)
+ $RecentList.clear()
+ for d in recents:
+ $RecentList.add_item(my_basename(d))
+ $RecentList.set_item_tooltip($RecentList.get_item_count()-1, d)
+
+func _on_FavList_item_activated(index):
+ emit_signal("open_directory", $FavList.get_item_tooltip(index))
+
+func _on_RecentList_item_activated(index):
+ emit_signal("open_directory", $RecentList.get_item_tooltip(index))
+
+func _on_FavList_gui_input(event):
+ if event is InputEventKey and event.pressed and event.scancode == KEY_DELETE:
+ if ! $FavList.get_selected_items().empty():
+ favorites.remove($FavList.get_selected_items()[0])
+ update_lists()
+
+func _on_RecentList_gui_input(event):
+ if event is InputEventKey and event.pressed and event.scancode == KEY_DELETE:
+ if ! $RecentList.get_selected_items().empty():
+ recents.remove($RecentList.get_selected_items()[0])
+ update_lists()
diff --git a/modules/material_maker/mat_maker_gd/windows/file_dialog/left_panel.tscn b/modules/material_maker/mat_maker_gd/windows/file_dialog/left_panel.tscn
new file mode 100644
index 000000000..a5ad9b0ba
--- /dev/null
+++ b/modules/material_maker/mat_maker_gd/windows/file_dialog/left_panel.tscn
@@ -0,0 +1,48 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://addons/mat_maker_gd/windows/file_dialog/left_panel.gd" type="Script" id=1]
+
+[node name="LeftPanel" type="VBoxContainer"]
+margin_right = 40.0
+margin_bottom = 40.0
+size_flags_vertical = 3
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="RecentLabel" type="Label" parent="."]
+margin_right = 100.0
+margin_bottom = 14.0
+text = "Recent"
+
+[node name="RecentList" type="ItemList" parent="."]
+margin_top = 18.0
+margin_right = 100.0
+margin_bottom = 18.0
+rect_min_size = Vector2( 100, 0 )
+size_flags_vertical = 3
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="FavLabel" type="Label" parent="."]
+margin_top = 22.0
+margin_right = 100.0
+margin_bottom = 36.0
+text = "Favorite"
+
+[node name="FavList" type="ItemList" parent="."]
+margin_top = 40.0
+margin_right = 100.0
+margin_bottom = 40.0
+rect_min_size = Vector2( 100, 0 )
+size_flags_vertical = 3
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[connection signal="gui_input" from="RecentList" to="." method="_on_RecentList_gui_input"]
+[connection signal="item_activated" from="RecentList" to="." method="_on_RecentList_item_activated"]
+[connection signal="gui_input" from="FavList" to="." method="_on_FavList_gui_input"]
+[connection signal="item_activated" from="FavList" to="." method="_on_FavList_item_activated"]
diff --git a/modules/mesh_data_resource/editor/addon/MDIEd.gd b/modules/mesh_data_resource/editor/addon/MDIEd.gd
new file mode 100644
index 000000000..60d8b2e28
--- /dev/null
+++ b/modules/mesh_data_resource/editor/addon/MDIEd.gd
@@ -0,0 +1,255 @@
+tool
+extends Control
+
+var _plugin : EditorPlugin
+
+export var uv_preview_path : NodePath
+export var uv_editor_path : NodePath
+
+var uv_preview : Node
+var uv_editor : Node
+
+func _enter_tree():
+ uv_preview = get_node(uv_preview_path)
+ uv_editor = get_node(uv_editor_path)
+
+ if _plugin && uv_editor:
+ uv_editor.set_plugin(_plugin)
+
+func set_plugin(plugin : EditorPlugin) -> void:
+ _plugin = plugin
+
+ if uv_editor:
+ uv_editor.set_plugin(plugin)
+
+func set_mesh_data_resource(a : MeshDataResource) -> void:
+ if uv_preview:
+ uv_preview.set_mesh_data_resource(a)
+
+ if uv_editor:
+ uv_editor.set_mesh_data_resource(a)
+
+func set_mesh_data_instance(a : MeshDataInstance) -> void:
+ if uv_preview:
+ uv_preview.set_mesh_data_instance(a)
+
+ if uv_editor:
+ uv_editor.set_mesh_data_instance(a)
+
+func _unhandled_key_input(event : InputEventKey) -> void:
+ if event.echo:
+ return
+
+ if event.alt || event.shift || event.control || event.meta || event.command:
+ return
+
+ if event.scancode == KEY_G:
+ set_edit_mode_translate()
+ elif event.scancode == KEY_H:
+ set_edit_mode_rotate()
+ elif event.scancode == KEY_J:
+ set_edit_mode_scale()
+
+ elif event.scancode == KEY_V:
+ set_axis_x(!get_axis_x())
+ elif event.scancode == KEY_B:
+ set_axis_y(!get_axis_y())
+ elif event.scancode == KEY_N:
+ set_axis_z(!get_axis_z())
+
+ elif event.scancode == KEY_K:
+ set_selection_mode_vertex()
+ elif event.scancode == KEY_L:
+ set_selection_mode_edge()
+ elif event.scancode == KEY_SEMICOLON:
+ set_selection_mode_face()
+
+#Edit modes
+func set_edit_mode_translate() -> void:
+ $VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer/Translate.pressed = true
+
+func set_edit_mode_rotate() -> void:
+ $VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer/Rotate.pressed = true
+
+func set_edit_mode_scale() -> void:
+ $VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer/Scale.pressed = true
+
+func on_edit_mode_translate_toggled(on : bool) -> void:
+ if on:
+ if _plugin:
+ _plugin.set_translate()
+
+func on_edit_mode_rotate_toggled(on : bool) -> void:
+ if on:
+ if _plugin:
+ _plugin.set_rotate()
+
+func on_edit_mode_scale_toggled(on : bool) -> void:
+ if on:
+ if _plugin:
+ _plugin.set_scale()
+
+#axis locks
+func get_axis_x() -> bool:
+ return $VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2/AxisX.pressed
+
+func get_axis_y() -> bool:
+ return $VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2/AxisY.pressed
+
+func get_axis_z() -> bool:
+ return $VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2/AxisZ.pressed
+
+func set_axis_x(on : bool) -> void:
+ $VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2/AxisX.pressed = on
+
+func set_axis_y(on : bool) -> void:
+ $VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2/AxisY.pressed = on
+
+func set_axis_z(on : bool) -> void:
+ $VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2/AxisZ.pressed = on
+
+func on_axis_x_toggled(on : bool) -> void:
+ if _plugin:
+ _plugin.set_axis_x(on)
+
+func on_axis_y_toggled(on : bool) -> void:
+ if _plugin:
+ _plugin.set_axis_y(on)
+
+func on_axis_z_toggled(on : bool) -> void:
+ if _plugin:
+ _plugin.set_axis_z(on)
+
+#selection modes
+func on_selection_mode_vertex_toggled(on : bool) -> void:
+ if on:
+ if _plugin:
+ _plugin.set_selection_mode_vertex()
+
+func on_selection_mode_edge_toggled(on : bool) -> void:
+ if on:
+ if _plugin:
+ _plugin.set_selection_mode_edge()
+
+func on_selection_mode_face_toggled(on : bool) -> void:
+ if on:
+ if _plugin:
+ _plugin.set_selection_mode_face()
+
+func set_selection_mode_vertex() -> void:
+ $VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer3/Vertex.pressed = true
+
+func set_selection_mode_edge() -> void:
+ $VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer3/Edge.pressed = true
+
+func set_selection_mode_face() -> void:
+ $VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer3/Face.pressed = true
+
+
+func _on_Extrude_pressed():
+ _plugin.extrude()
+
+func _on_AddBox_pressed():
+ _plugin.add_box()
+
+func _on_UnwrapButton_pressed():
+ _plugin.uv_unwrap()
+
+func _on_add_triangle_pressed():
+ _plugin.add_triangle()
+
+func _on_add_quad_pressed():
+ _plugin.add_quad()
+
+func _on_split_pressed():
+ _plugin.split()
+
+func _on_connect_to_first_selected_pressed():
+ _plugin.connect_to_first_selected()
+
+func _on_connect_to_avg_pressed():
+ _plugin.connect_to_avg()
+
+func _on_connect_to_last_selected_pressed():
+ _plugin.connect_to_last_selected()
+
+func _on_disconnect_pressed():
+ _plugin.disconnect_action()
+
+func _on_add_triangle_at_pressed():
+ _plugin.add_triangle_at()
+
+func _on_add_auad_at_pressed():
+ _plugin.add_quad_at()
+
+func _oncreate_face_pressed():
+ _plugin.create_face()
+
+func _on_delete_pressed():
+ _plugin.delete_selected()
+
+func _on_GenNormals_pressed():
+ _plugin.generate_normals()
+
+func _on_RemDoubles_pressed():
+ _plugin.remove_doubles()
+
+func _on_MergeOptimize_pressed():
+ _plugin.merge_optimize()
+
+func _on_GenTangents_pressed():
+ _plugin.generate_tangents()
+
+func _on_mark_seam_pressed():
+ _plugin.mark_seam()
+
+func _on_unmark_seam_pressed():
+ _plugin.unmark_seam()
+
+func _on_apply_seams_pressed():
+ _plugin.apply_seam()
+
+func _on_uv_edit_pressed():
+ $Popups/UVEditorPopup.popup_centered()
+
+func on_pivot_average_toggled(on : bool):
+ if on:
+ _plugin.set_pivot_averaged()
+
+func on_pivot_mdi_origin_toggled(on : bool):
+ if on:
+ _plugin.set_pivot_mdi_origin()
+
+func on_pivot_world_origin_toggled(on : bool):
+ if on:
+ _plugin.set_pivot_world_origin()
+
+func on_visual_indicator_outline_toggled(on : bool):
+ _plugin.visual_indicator_outline_set(on)
+
+func on_visual_indicator_seam_toggled(on : bool):
+ _plugin.visual_indicator_seam_set(on)
+
+func on_visual_indicator_handle_toggled(on : bool):
+ _plugin.visual_indicator_handle_set(on)
+
+func _on_select_all_pressed():
+ _plugin.select_all()
+
+func onhandle_selection_type_front_toggled(on : bool):
+ if on:
+ _plugin.handle_selection_type_front()
+
+func onhandle_selection_type_back_toggled(on : bool):
+ if on:
+ _plugin.handle_selection_type_back()
+
+func onhandle_selection_type_all_toggled(on : bool):
+ if on:
+ _plugin.handle_selection_type_all()
+
+func _on_clean_mesh_pressed():
+ _plugin.clean_mesh()
+
+func _on_flip_face_pressed():
+ _plugin.flip_selected_faces()
diff --git a/modules/mesh_data_resource/editor/addon/MDIEd.tscn b/modules/mesh_data_resource/editor/addon/MDIEd.tscn
new file mode 100644
index 000000000..ad31b92aa
--- /dev/null
+++ b/modules/mesh_data_resource/editor/addon/MDIEd.tscn
@@ -0,0 +1,769 @@
+[gd_scene load_steps=9 format=2]
+
+[ext_resource path="res://addons/mesh_data_resource_editor/MDIEd.gd" type="Script" id=1]
+[ext_resource path="res://addons/mesh_data_resource_editor/button_groups/vertex_position_operation_bg.tres" type="ButtonGroup" id=2]
+[ext_resource path="res://addons/mesh_data_resource_editor/UVEditor.gd" type="Script" id=3]
+[ext_resource path="res://addons/mesh_data_resource_editor/uv_editor/UVEditor.tscn" type="PackedScene" id=4]
+[ext_resource path="res://addons/mesh_data_resource_editor/button_groups/edit_mode_button_group.tres" type="ButtonGroup" id=5]
+[ext_resource path="res://addons/mesh_data_resource_editor/uv_editor/UVEditorPopup.gd" type="Script" id=6]
+[ext_resource path="res://addons/mesh_data_resource_editor/button_groups/pivot_button_group.tres" type="ButtonGroup" id=7]
+[ext_resource path="res://addons/mesh_data_resource_editor/button_groups/handle_selection_typen_group.tres" type="ButtonGroup" id=8]
+
+[node name="MDIEd" type="PanelContainer"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+uv_preview_path = NodePath("VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations/UVDisplay")
+uv_editor_path = NodePath("Popups/UVEditorPopup/UVEditor")
+
+[node name="VBoxContainer" type="VBoxContainer" parent="."]
+margin_left = 7.0
+margin_top = 7.0
+margin_right = 1017.0
+margin_bottom = 593.0
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Actions" type="VBoxContainer" parent="VBoxContainer"]
+margin_right = 1010.0
+margin_bottom = 68.0
+
+[node name="Actions" type="HBoxContainer" parent="VBoxContainer/Actions"]
+margin_right = 1010.0
+margin_bottom = 68.0
+alignment = 1
+
+[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/Actions/Actions"]
+margin_left = 457.0
+margin_right = 466.0
+margin_bottom = 68.0
+
+[node name="Label" type="Label" parent="VBoxContainer/Actions/Actions/VBoxContainer"]
+margin_right = 9.0
+margin_bottom = 20.0
+hint_tooltip = "Edit Mode"
+mouse_filter = 0
+size_flags_vertical = 7
+text = "E"
+align = 1
+valign = 1
+
+[node name="Label2" type="Label" parent="VBoxContainer/Actions/Actions/VBoxContainer"]
+margin_top = 24.0
+margin_right = 9.0
+margin_bottom = 44.0
+hint_tooltip = "Active Axis"
+mouse_filter = 0
+size_flags_vertical = 7
+text = "A"
+align = 1
+valign = 1
+
+[node name="Label3" type="Label" parent="VBoxContainer/Actions/Actions/VBoxContainer"]
+margin_top = 48.0
+margin_right = 9.0
+margin_bottom = 68.0
+hint_tooltip = "Selection Mode"
+mouse_filter = 0
+size_flags_vertical = 7
+text = "S"
+align = 1
+valign = 1
+
+[node name="VBoxContainer2" type="VBoxContainer" parent="VBoxContainer/Actions/Actions"]
+margin_left = 470.0
+margin_right = 553.0
+margin_bottom = 68.0
+
+[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/Actions/Actions/VBoxContainer2"]
+margin_right = 83.0
+margin_bottom = 20.0
+
+[node name="Translate" type="Button" parent="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer"]
+margin_right = 25.0
+margin_bottom = 20.0
+rect_min_size = Vector2( 25, 20 )
+hint_tooltip = "Translate"
+size_flags_horizontal = 3
+toggle_mode = true
+pressed = true
+group = ExtResource( 2 )
+text = "T"
+
+[node name="Rotate" type="Button" parent="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer"]
+margin_left = 29.0
+margin_right = 54.0
+margin_bottom = 20.0
+rect_min_size = Vector2( 25, 20 )
+hint_tooltip = "Rotate"
+size_flags_horizontal = 3
+toggle_mode = true
+group = ExtResource( 2 )
+text = "R"
+
+[node name="Scale" type="Button" parent="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer"]
+margin_left = 58.0
+margin_right = 83.0
+margin_bottom = 20.0
+rect_min_size = Vector2( 25, 20 )
+hint_tooltip = "Scale"
+size_flags_horizontal = 3
+toggle_mode = true
+group = ExtResource( 2 )
+text = "S"
+
+[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/Actions/Actions/VBoxContainer2"]
+margin_top = 24.0
+margin_right = 83.0
+margin_bottom = 44.0
+
+[node name="AxisX" type="Button" parent="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2"]
+margin_right = 25.0
+margin_bottom = 20.0
+rect_min_size = Vector2( 25, 20 )
+size_flags_horizontal = 3
+toggle_mode = true
+pressed = true
+text = "X"
+
+[node name="AxisY" type="Button" parent="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2"]
+margin_left = 29.0
+margin_right = 54.0
+margin_bottom = 20.0
+rect_min_size = Vector2( 25, 20 )
+size_flags_horizontal = 3
+toggle_mode = true
+pressed = true
+text = "Y"
+
+[node name="AxisZ" type="Button" parent="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2"]
+margin_left = 58.0
+margin_right = 83.0
+margin_bottom = 20.0
+rect_min_size = Vector2( 25, 20 )
+size_flags_horizontal = 3
+toggle_mode = true
+pressed = true
+text = "Z"
+
+[node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer/Actions/Actions/VBoxContainer2"]
+margin_top = 48.0
+margin_right = 83.0
+margin_bottom = 68.0
+
+[node name="Vertex" type="Button" parent="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer3"]
+margin_right = 25.0
+margin_bottom = 20.0
+rect_min_size = Vector2( 25, 20 )
+hint_tooltip = "Vertex"
+size_flags_horizontal = 3
+toggle_mode = true
+pressed = true
+group = ExtResource( 5 )
+text = "V"
+
+[node name="Edge" type="Button" parent="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer3"]
+margin_left = 29.0
+margin_right = 54.0
+margin_bottom = 20.0
+rect_min_size = Vector2( 25, 20 )
+hint_tooltip = "Edge"
+size_flags_horizontal = 3
+toggle_mode = true
+group = ExtResource( 5 )
+text = "E"
+
+[node name="Face" type="Button" parent="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer3"]
+margin_left = 58.0
+margin_right = 83.0
+margin_bottom = 20.0
+rect_min_size = Vector2( 25, 20 )
+hint_tooltip = "Face"
+size_flags_horizontal = 3
+toggle_mode = true
+group = ExtResource( 5 )
+text = "F"
+
+[node name="HSeparator" type="HSeparator" parent="VBoxContainer"]
+margin_top = 72.0
+margin_right = 1010.0
+margin_bottom = 76.0
+
+[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer"]
+margin_top = 80.0
+margin_right = 1010.0
+margin_bottom = 586.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+scroll_horizontal_enabled = false
+
+[node name="VBoxContainer2" type="VBoxContainer" parent="VBoxContainer/ScrollContainer"]
+margin_right = 998.0
+margin_bottom = 674.0
+size_flags_horizontal = 3
+
+[node name="HBoxContainer6" type="HBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2"]
+margin_right = 998.0
+margin_bottom = 20.0
+
+[node name="Label4" type="Label" parent="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer6"]
+margin_right = 10.0
+margin_bottom = 20.0
+hint_tooltip = "Handle Selection type."
+mouse_filter = 0
+size_flags_vertical = 7
+text = "H"
+align = 1
+valign = 1
+
+[node name="Front" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer6"]
+margin_left = 14.0
+margin_right = 339.0
+margin_bottom = 20.0
+rect_min_size = Vector2( 25, 20 )
+hint_tooltip = "
+"
+size_flags_horizontal = 3
+toggle_mode = true
+pressed = true
+group = ExtResource( 8 )
+text = "F"
+
+[node name="Back" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer6"]
+margin_left = 343.0
+margin_right = 668.0
+margin_bottom = 20.0
+rect_min_size = Vector2( 25, 20 )
+hint_tooltip = "Only select handles that face away
+the camera."
+size_flags_horizontal = 3
+toggle_mode = true
+group = ExtResource( 8 )
+text = "B"
+
+[node name="All" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer6"]
+margin_left = 672.0
+margin_right = 998.0
+margin_bottom = 20.0
+rect_min_size = Vector2( 25, 20 )
+hint_tooltip = "Ignore camera facing when selecting handles.
+"
+size_flags_horizontal = 3
+toggle_mode = true
+group = ExtResource( 8 )
+text = "A"
+
+[node name="HBoxContainer4" type="HBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2"]
+margin_top = 24.0
+margin_right = 998.0
+margin_bottom = 44.0
+
+[node name="Label4" type="Label" parent="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer4"]
+margin_right = 8.0
+margin_bottom = 20.0
+hint_tooltip = "Pivot"
+mouse_filter = 0
+size_flags_vertical = 7
+text = "P"
+align = 1
+valign = 1
+
+[node name="Average" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer4"]
+margin_left = 12.0
+margin_right = 338.0
+margin_bottom = 20.0
+rect_min_size = Vector2( 25, 20 )
+hint_tooltip = "Average"
+size_flags_horizontal = 3
+toggle_mode = true
+pressed = true
+group = ExtResource( 7 )
+text = "A"
+
+[node name="MDIOrigin" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer4"]
+margin_left = 342.0
+margin_right = 668.0
+margin_bottom = 20.0
+rect_min_size = Vector2( 25, 20 )
+hint_tooltip = "Mesh Data Instance Origin"
+size_flags_horizontal = 3
+toggle_mode = true
+group = ExtResource( 7 )
+text = "M"
+
+[node name="WorldOrigin" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer4"]
+margin_left = 672.0
+margin_right = 998.0
+margin_bottom = 20.0
+rect_min_size = Vector2( 25, 20 )
+hint_tooltip = "World Origin"
+size_flags_horizontal = 3
+toggle_mode = true
+group = ExtResource( 7 )
+text = "w"
+
+[node name="HBoxContainer5" type="HBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2"]
+margin_top = 48.0
+margin_right = 998.0
+margin_bottom = 68.0
+
+[node name="Label4" type="Label" parent="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer5"]
+margin_right = 8.0
+margin_bottom = 20.0
+hint_tooltip = "Visual indicators"
+mouse_filter = 0
+size_flags_vertical = 7
+text = "V"
+align = 1
+valign = 1
+
+[node name="Outline" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer5"]
+margin_left = 12.0
+margin_right = 338.0
+margin_bottom = 20.0
+rect_min_size = Vector2( 25, 20 )
+hint_tooltip = "Outline"
+size_flags_horizontal = 3
+toggle_mode = true
+pressed = true
+text = "O"
+
+[node name="Seam" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer5"]
+margin_left = 342.0
+margin_right = 668.0
+margin_bottom = 20.0
+rect_min_size = Vector2( 25, 20 )
+hint_tooltip = "Seam"
+size_flags_horizontal = 3
+toggle_mode = true
+pressed = true
+text = "S"
+
+[node name="Handle" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer5"]
+margin_left = 672.0
+margin_right = 998.0
+margin_bottom = 20.0
+rect_min_size = Vector2( 25, 20 )
+hint_tooltip = "Handle"
+size_flags_horizontal = 3
+toggle_mode = true
+pressed = true
+text = "H"
+
+[node name="HSeparator" type="HSeparator" parent="VBoxContainer/ScrollContainer/VBoxContainer2"]
+margin_top = 72.0
+margin_right = 998.0
+margin_bottom = 76.0
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Select All" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2"]
+margin_top = 80.0
+margin_right = 998.0
+margin_bottom = 100.0
+text = "Select All"
+
+[node name="HSeparator5" type="HSeparator" parent="VBoxContainer/ScrollContainer/VBoxContainer2"]
+margin_top = 104.0
+margin_right = 998.0
+margin_bottom = 108.0
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="VertexOps" type="VBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2"]
+margin_top = 112.0
+margin_right = 998.0
+margin_bottom = 192.0
+
+[node name="OperationsLabel" type="Label" parent="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps"]
+margin_right = 998.0
+margin_bottom = 14.0
+text = "= Vertex ="
+align = 1
+valign = 1
+
+[node name="Operations" type="VBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps"]
+margin_top = 18.0
+margin_right = 998.0
+margin_bottom = 80.0
+
+[node name="AddFace" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps/Operations"]
+margin_right = 998.0
+margin_bottom = 20.0
+text = "Create Face"
+
+[node name="Split" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps/Operations"]
+visible = false
+margin_top = 24.0
+margin_right = 998.0
+margin_bottom = 44.0
+text = "Split"
+
+[node name="Label" type="Label" parent="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps/Operations"]
+margin_top = 24.0
+margin_right = 998.0
+margin_bottom = 38.0
+text = "Connect"
+align = 1
+valign = 1
+
+[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps/Operations"]
+margin_top = 42.0
+margin_right = 998.0
+margin_bottom = 62.0
+size_flags_horizontal = 3
+
+[node name="ConnectToFirst" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps/Operations/HBoxContainer"]
+margin_right = 330.0
+margin_bottom = 20.0
+hint_tooltip = "Move all vertices to the first one that was selected."
+size_flags_horizontal = 3
+text = "x<"
+
+[node name="ConnectMed" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps/Operations/HBoxContainer"]
+margin_left = 334.0
+margin_right = 664.0
+margin_bottom = 20.0
+hint_tooltip = "Move all selected vertices to their average."
+size_flags_horizontal = 3
+text = ">x<"
+
+[node name="ConnectToLast" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps/Operations/HBoxContainer"]
+margin_left = 668.0
+margin_right = 998.0
+margin_bottom = 20.0
+hint_tooltip = "Move all selected vertices to the last that was selected."
+size_flags_horizontal = 3
+text = ">x"
+
+[node name="EdgeOps" type="VBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2"]
+visible = false
+margin_top = 108.0
+margin_right = 998.0
+margin_bottom = 206.0
+
+[node name="OperationsLabel" type="Label" parent="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps"]
+margin_right = 998.0
+margin_bottom = 14.0
+text = "= Edge ="
+align = 1
+valign = 1
+
+[node name="Operations" type="VBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps"]
+margin_top = 18.0
+margin_right = 998.0
+margin_bottom = 98.0
+
+[node name="Extrude" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps/Operations"]
+margin_right = 1010.0
+margin_bottom = 20.0
+text = "Extrude"
+
+[node name="Label" type="Label" parent="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps/Operations"]
+margin_right = 998.0
+margin_bottom = 14.0
+text = "Append"
+align = 1
+valign = 1
+
+[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps/Operations"]
+margin_top = 18.0
+margin_right = 998.0
+margin_bottom = 38.0
+
+[node name="TriAt" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps/Operations/HBoxContainer2"]
+margin_right = 497.0
+margin_bottom = 20.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+text = "Tri"
+
+[node name="QuadAt" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps/Operations/HBoxContainer2"]
+margin_left = 501.0
+margin_right = 998.0
+margin_bottom = 20.0
+size_flags_horizontal = 3
+text = "Quad"
+
+[node name="SeamLabel" type="Label" parent="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps/Operations"]
+margin_top = 42.0
+margin_right = 998.0
+margin_bottom = 56.0
+text = "Seam"
+align = 1
+valign = 1
+
+[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps/Operations"]
+margin_top = 60.0
+margin_right = 998.0
+margin_bottom = 80.0
+size_flags_horizontal = 3
+
+[node name="Mark" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps/Operations/HBoxContainer"]
+margin_right = 497.0
+margin_bottom = 20.0
+size_flags_horizontal = 3
+text = "Mark"
+
+[node name="Unmark" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps/Operations/HBoxContainer"]
+margin_left = 501.0
+margin_right = 998.0
+margin_bottom = 20.0
+size_flags_horizontal = 3
+text = "Unmark"
+
+[node name="FaceOps" type="VBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2"]
+visible = false
+margin_right = 55.0
+margin_bottom = 38.0
+
+[node name="OperationsLabel" type="Label" parent="VBoxContainer/ScrollContainer/VBoxContainer2/FaceOps"]
+margin_right = 1010.0
+margin_bottom = 14.0
+text = "= Face ="
+align = 1
+valign = 1
+
+[node name="Operations" type="VBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2/FaceOps"]
+margin_top = 18.0
+margin_right = 1010.0
+margin_bottom = 110.0
+
+[node name="Delete" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/FaceOps/Operations"]
+margin_right = 1010.0
+margin_bottom = 20.0
+text = "Delete"
+
+[node name="Flip" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/FaceOps/Operations"]
+margin_right = 1010.0
+margin_bottom = 20.0
+text = "Flip"
+
+[node name="HSeparator4" type="HSeparator" parent="VBoxContainer/ScrollContainer/VBoxContainer2"]
+margin_top = 196.0
+margin_right = 998.0
+margin_bottom = 200.0
+
+[node name="Operations" type="VBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2"]
+margin_top = 204.0
+margin_right = 998.0
+margin_bottom = 568.0
+
+[node name="OperationsLabel" type="Label" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Operations"]
+margin_right = 998.0
+margin_bottom = 14.0
+text = "= Operations ="
+align = 1
+valign = 1
+
+[node name="Operations" type="VBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Operations"]
+margin_top = 18.0
+margin_right = 998.0
+margin_bottom = 364.0
+
+[node name="Label2" type="Label" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations"]
+margin_right = 998.0
+margin_bottom = 14.0
+text = "Generate"
+align = 1
+valign = 1
+
+[node name="GenNormals" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations"]
+margin_top = 18.0
+margin_right = 998.0
+margin_bottom = 38.0
+text = "Normals"
+
+[node name="GenTangents" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations"]
+margin_top = 42.0
+margin_right = 998.0
+margin_bottom = 62.0
+text = "Tangents"
+
+[node name="Label" type="Label" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations"]
+margin_top = 66.0
+margin_right = 998.0
+margin_bottom = 80.0
+text = "Optimizations"
+align = 1
+valign = 1
+
+[node name="RemDoubles" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations"]
+margin_top = 84.0
+margin_right = 998.0
+margin_bottom = 104.0
+text = "Rem Doubles"
+
+[node name="MergeOptimize" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations"]
+margin_top = 108.0
+margin_right = 998.0
+margin_bottom = 128.0
+text = "Full Merge"
+
+[node name="Clean" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations"]
+margin_top = 132.0
+margin_right = 998.0
+margin_bottom = 152.0
+hint_tooltip = "Clean mesh for example for unused verts."
+text = "Clean"
+
+[node name="Label3" type="Label" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations"]
+margin_top = 156.0
+margin_right = 998.0
+margin_bottom = 170.0
+text = "UV"
+align = 1
+valign = 1
+
+[node name="UVDisplay" type="Control" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations"]
+margin_top = 174.0
+margin_right = 998.0
+margin_bottom = 274.0
+rect_min_size = Vector2( 100, 100 )
+script = ExtResource( 3 )
+
+[node name="UVEditButton" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations"]
+margin_top = 278.0
+margin_right = 998.0
+margin_bottom = 298.0
+text = "Edit"
+
+[node name="ApplySeams" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations"]
+margin_top = 302.0
+margin_right = 998.0
+margin_bottom = 322.0
+text = "Apply seams"
+
+[node name="UnwrapButton2" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations"]
+margin_top = 326.0
+margin_right = 998.0
+margin_bottom = 346.0
+text = "Unwrap"
+
+[node name="HSeparator3" type="HSeparator" parent="VBoxContainer/ScrollContainer/VBoxContainer2"]
+margin_top = 572.0
+margin_right = 998.0
+margin_bottom = 576.0
+
+[node name="Add" type="VBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2"]
+margin_top = 580.0
+margin_right = 998.0
+margin_bottom = 666.0
+
+[node name="AddLabel" type="Label" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Add"]
+margin_right = 998.0
+margin_bottom = 14.0
+text = "= Add ="
+align = 1
+valign = 1
+
+[node name="Add" type="VBoxContainer" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Add"]
+margin_top = 18.0
+margin_right = 998.0
+margin_bottom = 86.0
+
+[node name="AddBox" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Add/Add"]
+margin_right = 998.0
+margin_bottom = 20.0
+text = "Box"
+
+[node name="AddTriangle" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Add/Add"]
+margin_top = 24.0
+margin_right = 998.0
+margin_bottom = 44.0
+size_flags_horizontal = 3
+text = "Tri"
+
+[node name="AddQuad" type="Button" parent="VBoxContainer/ScrollContainer/VBoxContainer2/Add/Add"]
+margin_top = 48.0
+margin_right = 998.0
+margin_bottom = 68.0
+size_flags_horizontal = 3
+text = "Quad"
+
+[node name="HSeparator2" type="HSeparator" parent="VBoxContainer/ScrollContainer/VBoxContainer2"]
+margin_top = 670.0
+margin_right = 998.0
+margin_bottom = 674.0
+
+[node name="Popups" type="Control" parent="."]
+margin_left = 7.0
+margin_top = 7.0
+margin_right = 1017.0
+margin_bottom = 593.0
+mouse_filter = 2
+__meta__ = {
+"_edit_lock_": true
+}
+
+[node name="UVEditorPopup" type="ConfirmationDialog" parent="Popups"]
+margin_left = 149.0
+margin_top = 35.0
+margin_right = 901.0
+margin_bottom = 803.0
+window_title = "UV Editor"
+resizable = true
+script = ExtResource( 6 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="UVEditor" parent="Popups/UVEditorPopup" instance=ExtResource( 4 )]
+margin_left = 8.0
+margin_top = 8.0
+margin_right = -8.0
+margin_bottom = -36.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[connection signal="toggled" from="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer/Translate" to="." method="on_edit_mode_translate_toggled"]
+[connection signal="toggled" from="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer/Rotate" to="." method="on_edit_mode_rotate_toggled"]
+[connection signal="toggled" from="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer/Scale" to="." method="on_edit_mode_scale_toggled"]
+[connection signal="toggled" from="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2/AxisX" to="." method="on_axis_x_toggled"]
+[connection signal="toggled" from="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2/AxisY" to="." method="on_axis_y_toggled"]
+[connection signal="toggled" from="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer2/AxisZ" to="." method="on_axis_z_toggled"]
+[connection signal="toggled" from="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer3/Vertex" to="." method="on_selection_mode_vertex_toggled"]
+[connection signal="toggled" from="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer3/Vertex" to="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps" method="set_visible"]
+[connection signal="toggled" from="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer3/Edge" to="." method="on_selection_mode_edge_toggled"]
+[connection signal="toggled" from="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer3/Edge" to="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps" method="set_visible"]
+[connection signal="toggled" from="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer3/Face" to="." method="on_selection_mode_face_toggled"]
+[connection signal="toggled" from="VBoxContainer/Actions/Actions/VBoxContainer2/HBoxContainer3/Face" to="VBoxContainer/ScrollContainer/VBoxContainer2/FaceOps" method="set_visible"]
+[connection signal="toggled" from="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer6/Front" to="." method="onhandle_selection_type_front_toggled"]
+[connection signal="toggled" from="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer6/Back" to="." method="onhandle_selection_type_back_toggled"]
+[connection signal="toggled" from="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer6/All" to="." method="onhandle_selection_type_all_toggled"]
+[connection signal="toggled" from="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer4/Average" to="." method="on_pivot_average_toggled"]
+[connection signal="toggled" from="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer4/MDIOrigin" to="." method="on_pivot_mdi_origin_toggled"]
+[connection signal="toggled" from="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer4/WorldOrigin" to="." method="on_pivot_world_origin_toggled"]
+[connection signal="toggled" from="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer5/Outline" to="." method="on_visual_indicator_outline_toggled"]
+[connection signal="toggled" from="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer5/Seam" to="." method="on_visual_indicator_seam_toggled"]
+[connection signal="toggled" from="VBoxContainer/ScrollContainer/VBoxContainer2/HBoxContainer5/Handle" to="." method="on_visual_indicator_handle_toggled"]
+[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/Select All" to="." method="_on_select_all_pressed"]
+[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps/Operations/AddFace" to="." method="_oncreate_face_pressed"]
+[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps/Operations/Split" to="." method="_on_split_pressed"]
+[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps/Operations/HBoxContainer/ConnectToFirst" to="." method="_on_connect_to_first_selected_pressed"]
+[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps/Operations/HBoxContainer/ConnectMed" to="." method="_on_connect_to_avg_pressed"]
+[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/VertexOps/Operations/HBoxContainer/ConnectToLast" to="." method="_on_connect_to_last_selected_pressed"]
+[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps/Operations/Extrude" to="." method="_on_Extrude_pressed"]
+[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps/Operations/HBoxContainer2/TriAt" to="." method="_on_add_triangle_at_pressed"]
+[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps/Operations/HBoxContainer2/QuadAt" to="." method="_on_add_auad_at_pressed"]
+[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps/Operations/HBoxContainer/Mark" to="." method="_on_mark_seam_pressed"]
+[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/EdgeOps/Operations/HBoxContainer/Unmark" to="." method="_on_unmark_seam_pressed"]
+[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/FaceOps/Operations/Delete" to="." method="_on_delete_pressed"]
+[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/FaceOps/Operations/Flip" to="." method="_on_flip_face_pressed"]
+[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations/GenNormals" to="." method="_on_GenNormals_pressed"]
+[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations/GenTangents" to="." method="_on_GenTangents_pressed"]
+[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations/RemDoubles" to="." method="_on_RemDoubles_pressed"]
+[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations/MergeOptimize" to="." method="_on_MergeOptimize_pressed"]
+[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations/Clean" to="." method="_on_clean_mesh_pressed"]
+[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations/UVEditButton" to="." method="_on_uv_edit_pressed"]
+[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations/ApplySeams" to="." method="_on_apply_seams_pressed"]
+[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/Operations/Operations/UnwrapButton2" to="." method="_on_UnwrapButton_pressed"]
+[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/Add/Add/AddBox" to="." method="_on_AddBox_pressed"]
+[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/Add/Add/AddTriangle" to="." method="_on_add_triangle_pressed"]
+[connection signal="pressed" from="VBoxContainer/ScrollContainer/VBoxContainer2/Add/Add/AddQuad" to="." method="_on_add_quad_pressed"]
diff --git a/modules/mesh_data_resource/editor/addon/MDIGizmoPlugin.gd b/modules/mesh_data_resource/editor/addon/MDIGizmoPlugin.gd
new file mode 100644
index 000000000..771e22dbd
--- /dev/null
+++ b/modules/mesh_data_resource/editor/addon/MDIGizmoPlugin.gd
@@ -0,0 +1,33 @@
+tool
+extends EditorSpatialGizmoPlugin
+
+const MDIGizmo = preload("res://addons/mesh_data_resource_editor/MIDGizmo.gd")
+
+var plugin
+
+func _init():
+ create_material("main", Color(0.7, 0.7, 0.7))
+ create_material("seam", Color(1, 0, 0), false, true)
+ create_handle_material("handles")
+
+func get_name():
+ return "MDIGizmo"
+
+func get_priority():
+ return 100
+
+func create_gizmo(spatial):
+ if spatial is MeshDataInstance:
+ var gizmo = MDIGizmo.new()
+
+ gizmo.set_editor_plugin(plugin)
+ gizmo.set_spatial_node(spatial)
+ gizmo.setup()
+ plugin.register_gizmo(gizmo)
+
+ return gizmo
+ else:
+ return null
+
+func is_handle_highlighted(gizmo, index):
+ pass
diff --git a/modules/mesh_data_resource/editor/addon/MIDGizmo.gd b/modules/mesh_data_resource/editor/addon/MIDGizmo.gd
new file mode 100644
index 000000000..ac229ef9d
--- /dev/null
+++ b/modules/mesh_data_resource/editor/addon/MIDGizmo.gd
@@ -0,0 +1,1816 @@
+tool
+extends EditorSpatialGizmo
+
+var MeshOutline = preload("res://addons/mesh_data_resource_editor/utilities/mesh_outline.gd")
+var MeshDecompose = preload("res://addons/mesh_data_resource_editor/utilities/mesh_decompose.gd")
+var MDRMeshUtils = preload("res://addons/mesh_data_resource_editor/utilities/mdred_mesh_utils.gd")
+
+enum EditMode {
+ EDIT_MODE_NONE = 0,
+ EDIT_MODE_TRANSLATE = 1,
+ EDIT_MODE_SCALE = 2,
+ EDIT_MODE_ROTATE = 3
+}
+
+enum AxisConstraint {
+ X = 1 << 0,
+ Y = 1 << 1,
+ Z = 1 << 2,
+}
+
+enum SelectionMode {
+ SELECTION_MODE_VERTEX = 0,
+ SELECTION_MODE_EDGE = 1,
+ SELECTION_MODE_FACE = 2,
+}
+
+enum PivotTypes {
+ PIVOT_TYPE_AVERAGED = 0,
+ PIVOT_TYPE_MDI_ORIGIN = 1,
+ PIVOT_TYPE_WORLD_ORIGIN = 2,
+}
+
+enum HandleSelectionType {
+ HANDLE_SELECTION_TYPE_FRONT = 0,
+ HANDLE_SELECTION_TYPE_BACK = 1,
+ HANDLE_SELECTION_TYPE_ALL = 2,
+}
+
+var gizmo_size = 3.0
+
+var edit_mode : int = EditMode.EDIT_MODE_TRANSLATE
+var pivot_type : int = PivotTypes.PIVOT_TYPE_AVERAGED
+var axis_constraint : int = AxisConstraint.X | AxisConstraint.Y | AxisConstraint.Z
+var selection_mode : int = SelectionMode.SELECTION_MODE_VERTEX
+var handle_selection_type : int = HandleSelectionType.HANDLE_SELECTION_TYPE_FRONT
+var visual_indicator_outline : bool = true
+var visual_indicator_seam : bool= true
+var visual_indicator_handle : bool = true
+
+var previous_point : Vector2
+var _last_known_camera_facing : Vector3 = Vector3(0, 0, -1)
+
+var _rect_drag : bool = false
+var _rect_drag_start_point : Vector2 = Vector2()
+var _rect_drag_min_ofset : float = 10
+
+var _mdr : MeshDataResource = null
+
+var _vertices : PoolVector3Array
+var _indices : PoolIntArray
+var _handle_points : PoolVector3Array
+var _handle_to_vertex_map : Array
+var _selected_points : PoolIntArray
+
+var _mesh_outline_generator
+
+var _handle_drag_op : bool = false
+var _drag_op_orig_verices : PoolVector3Array = PoolVector3Array()
+var _drag_op_indices : PoolIntArray = PoolIntArray()
+var _drag_op_accumulator : Vector3 = Vector3()
+var _drag_op_accumulator_quat : Quat = Quat()
+var _drag_op_pivot : Vector3 = Vector3()
+
+var _editor_plugin : EditorPlugin = null
+var _undo_redo : UndoRedo = null
+
+func _init():
+ _mesh_outline_generator = MeshOutline.new()
+
+func setup() -> void:
+ get_spatial_node().connect("mesh_data_resource_changed", self, "on_mesh_data_resource_changed")
+ on_mesh_data_resource_changed(get_spatial_node().mesh_data)
+
+func set_editor_plugin(editor_plugin : EditorPlugin) -> void:
+ _editor_plugin = editor_plugin
+
+ _undo_redo = _editor_plugin.get_undo_redo()
+
+func set_handle(index: int, camera: Camera, point: Vector2):
+ var relative : Vector2 = point - previous_point
+
+ if !_handle_drag_op:
+ relative = Vector2()
+ _handle_drag_op = true
+
+ if edit_mode == EditMode.EDIT_MODE_SCALE:
+ _drag_op_accumulator = Vector3(1, 1, 1)
+ else:
+ _drag_op_accumulator = Vector3()
+
+ _drag_op_accumulator_quat = Quat()
+
+ _drag_op_orig_verices = copy_mdr_verts_array()
+ setup_op_drag_indices()
+ _drag_op_pivot = get_drag_op_pivot()
+
+ if edit_mode == EditMode.EDIT_MODE_NONE:
+ return
+ elif edit_mode == EditMode.EDIT_MODE_TRANSLATE:
+ var ofs : Vector3 = Vector3()
+
+ ofs = camera.get_global_transform().basis.x
+
+ if (axis_constraint & AxisConstraint.X) != 0:
+ ofs.x *= relative.x * 0.01
+ else:
+ ofs.x = 0
+
+ if (axis_constraint & AxisConstraint.Y) != 0:
+ ofs.y = relative.y * -0.01
+ else:
+ ofs.y = 0
+
+ if (axis_constraint & AxisConstraint.Z) != 0:
+ ofs.z *= relative.x * 0.01
+ else:
+ ofs.z = 0
+
+ _drag_op_accumulator += ofs
+
+ add_to_all_selected(_drag_op_accumulator)
+
+ apply()
+ redraw()
+ elif edit_mode == EditMode.EDIT_MODE_SCALE:
+ var r : float = ((relative.x + relative.y) * 0.05)
+
+ var vs : Vector3 = Vector3()
+
+ if (axis_constraint & AxisConstraint.X) != 0:
+ vs.x = r
+
+ if (axis_constraint & AxisConstraint.Y) != 0:
+ vs.y = r
+
+ if (axis_constraint & AxisConstraint.Z) != 0:
+ vs.z = r
+
+ _drag_op_accumulator += vs
+
+ var b : Basis = Basis().scaled(_drag_op_accumulator)
+ var t : Transform = Transform(Basis(), _drag_op_pivot)
+ t *= Transform(b, Vector3())
+ t *= Transform(Basis(), _drag_op_pivot).inverse()
+
+ mul_all_selected_with_transform(t)
+
+ apply()
+ redraw()
+ elif edit_mode == EditMode.EDIT_MODE_ROTATE:
+ var yrot : Quat = Quat(Vector3(0, 1, 0), relative.x * 0.01)
+ var xrot : Quat = Quat(camera.get_global_transform().basis.x, relative.y * 0.01)
+
+ _drag_op_accumulator_quat *= yrot
+ _drag_op_accumulator_quat *= xrot
+ _drag_op_accumulator_quat = _drag_op_accumulator_quat.normalized()
+
+ var b : Basis = Basis(_drag_op_accumulator_quat)
+ var t : Transform = Transform(Basis(), _drag_op_pivot)
+ t *= Transform(b, Vector3())
+ t *= Transform(Basis(), _drag_op_pivot).inverse()
+
+ mul_all_selected_with_transform(t)
+
+ apply()
+ redraw()
+
+ previous_point = point
+
+#func commit_handle(index: int, restore, cancel: bool = false) -> void:
+# previous_point = Vector2()
+#
+# print("MDR Editor: commit_handle test")
+
+func redraw():
+ clear()
+
+ if !_mdr:
+ return
+
+ if _mdr.array.size() != ArrayMesh.ARRAY_MAX:
+ return
+
+ if !get_plugin():
+ return
+
+ var handles_material : SpatialMaterial = get_plugin().get_material("handles", self)
+ var material = get_plugin().get_material("main", self)
+ var seam_material = get_plugin().get_material("seam", self)
+
+ _mesh_outline_generator.setup(_mdr)
+
+ if selection_mode == SelectionMode.SELECTION_MODE_EDGE:
+ _mesh_outline_generator.generate_mark_edges(visual_indicator_outline, visual_indicator_handle)
+ elif selection_mode == SelectionMode.SELECTION_MODE_FACE:
+ _mesh_outline_generator.generate_mark_faces(visual_indicator_outline, visual_indicator_handle)
+ else:
+ _mesh_outline_generator.generate(visual_indicator_outline, visual_indicator_handle)
+
+ if visual_indicator_outline || visual_indicator_handle:
+ add_lines(_mesh_outline_generator.lines, material, false)
+
+ if visual_indicator_seam:
+ add_lines(_mesh_outline_generator.seam_lines, seam_material, false)
+
+ if _selected_points.size() > 0:
+ var vs : PoolVector3Array = PoolVector3Array()
+
+ for i in _selected_points:
+ vs.append(_handle_points[i])
+
+ add_handles(vs, handles_material)
+
+func apply() -> void:
+ if !_mdr:
+ return
+
+ disable_change_event()
+
+ var arrs : Array = _mdr.array
+ arrs[ArrayMesh.ARRAY_VERTEX] = _vertices
+ arrs[ArrayMesh.ARRAY_INDEX] = _indices
+ _mdr.array = arrs
+
+ enable_change_event()
+
+func select_all() -> void:
+ if _selected_points.size() == _handle_points.size():
+ return
+
+ _selected_points.resize(_handle_points.size())
+
+ for i in range(_selected_points.size()):
+ _selected_points[i] = i
+
+ redraw()
+
+
+func selection_click(index, camera, event) -> bool:
+ if handle_selection_type == HandleSelectionType.HANDLE_SELECTION_TYPE_FRONT:
+ return selection_click_select_front_or_back(index, camera, event)
+ elif handle_selection_type == HandleSelectionType.HANDLE_SELECTION_TYPE_BACK:
+ return selection_click_select_front_or_back(index, camera, event)
+ else:
+ return selection_click_select_through(index, camera, event)
+
+ return false
+
+func is_point_visible(point_orig : Vector3, camera_pos : Vector3, gt : Transform) -> bool:
+ var point : Vector3 = gt.xform(point_orig)
+
+ # go from the given point to the origin (camera_pos -> camera)
+ var dir : Vector3 = camera_pos - point
+ dir = dir.normalized()
+ # Might need to reduce z fighting
+ #point += dir * 0.5
+
+ for i in range(0, _indices.size(), 3):
+ var i0 : int = _indices[i]
+ var i1 : int = _indices[i + 1]
+ var i2 : int = _indices[i + 2]
+
+ var v0 : Vector3 = _vertices[i0]
+ var v1 : Vector3 = _vertices[i1]
+ var v2 : Vector3 = _vertices[i2]
+
+ v0 = gt.xform(v0)
+ v1 = gt.xform(v1)
+ v2 = gt.xform(v2)
+
+ var res = Geometry.ray_intersects_triangle(point, dir, v0, v1, v2)
+
+ if res is Vector3:
+ return false
+
+ return true
+
+
+func selection_click_select_front_or_back(index, camera, event):
+ var gt : Transform = get_spatial_node().global_transform
+ var ray_from : Vector3 = camera.global_transform.origin
+ var gpoint : Vector2 = event.get_position()
+ var grab_threshold : float = 8
+
+ # select vertex
+ var closest_idx : int = -1
+ var closest_dist : float = 1e10
+
+ for i in range(_handle_points.size()):
+ var vert_pos_3d : Vector3 = gt.xform(_handle_points[i])
+ var vert_pos_2d : Vector2 = camera.unproject_position(vert_pos_3d)
+ var dist_3d : float = ray_from.distance_to(vert_pos_3d)
+ var dist_2d : float = gpoint.distance_to(vert_pos_2d)
+
+ if (dist_2d < grab_threshold && dist_3d < closest_dist):
+ var point_visible : bool = is_point_visible(_handle_points[i], ray_from, gt)
+
+ if handle_selection_type == HandleSelectionType.HANDLE_SELECTION_TYPE_FRONT:
+ if !point_visible:
+ continue
+ elif handle_selection_type == HandleSelectionType.HANDLE_SELECTION_TYPE_BACK:
+ if point_visible:
+ continue
+
+ closest_dist = dist_3d
+ closest_idx = i
+
+ if (closest_idx >= 0):
+ for si in range(_selected_points.size()):
+ if _selected_points[si] == closest_idx:
+ if event.alt || event.control:
+ _selected_points.remove(si)
+ return true
+
+ return false
+
+ if event.alt || event.control:
+ return false
+
+ if event.shift:
+ _selected_points.append(closest_idx)
+ else:
+ # Select new point only
+ _selected_points.resize(0)
+ _selected_points.append(closest_idx)
+
+ apply()
+ redraw()
+ else:
+ # Don't unselect all if either control or shift is held down
+ if event.shift || event.control || event.alt:
+ return false
+
+ if _selected_points.size() == 0:
+ return false
+
+ #Unselect all
+ _selected_points.resize(0)
+
+ redraw()
+
+func selection_click_select_through(index, camera, event):
+ var gt : Transform = get_spatial_node().global_transform
+ var ray_from : Vector3 = camera.global_transform.origin
+ var gpoint : Vector2 = event.get_position()
+ var grab_threshold : float = 8
+
+ # select vertex
+ var closest_idx : int = -1
+ var closest_dist : float = 1e10
+
+ for i in range(_handle_points.size()):
+ var vert_pos_3d : Vector3 = gt.xform(_handle_points[i])
+ var vert_pos_2d : Vector2 = camera.unproject_position(vert_pos_3d)
+ var dist_3d : float = ray_from.distance_to(vert_pos_3d)
+ var dist_2d : float = gpoint.distance_to(vert_pos_2d)
+
+ if (dist_2d < grab_threshold && dist_3d < closest_dist):
+ closest_dist = dist_3d
+ closest_idx = i
+
+ if (closest_idx >= 0):
+ for si in range(_selected_points.size()):
+
+ if _selected_points[si] == closest_idx:
+ if event.alt || event.control:
+ _selected_points.remove(si)
+ return true
+
+ return false
+
+ if event.alt || event.control:
+ return false
+
+ if event.shift:
+ _selected_points.append(closest_idx)
+ else:
+ # Select new point only
+ _selected_points.resize(0)
+ _selected_points.append(closest_idx)
+
+ apply()
+ redraw()
+ else:
+ # Don't unselect all if either control or shift is held down
+ if event.shift || event.control || event.alt:
+ return false
+
+ if _selected_points.size() == 0:
+ return false
+
+ #Unselect all
+ _selected_points.resize(0)
+
+ redraw()
+
+func selection_drag(index, camera, event) -> void:
+ if handle_selection_type == HandleSelectionType.HANDLE_SELECTION_TYPE_FRONT:
+ selection_drag_rect_select_front_back(index, camera, event)
+ elif handle_selection_type == HandleSelectionType.HANDLE_SELECTION_TYPE_BACK:
+ selection_drag_rect_select_front_back(index, camera, event)
+ else:
+ selection_drag_rect_select_through(index, camera, event)
+
+func selection_drag_rect_select_front_back(index, camera, event):
+ var gt : Transform = get_spatial_node().global_transform
+ var ray_from : Vector3 = camera.global_transform.origin
+
+ var mouse_pos : Vector2 = event.get_position()
+ var rect_size : Vector2 = _rect_drag_start_point - mouse_pos
+ rect_size.x = abs(rect_size.x)
+ rect_size.y = abs(rect_size.y)
+
+ var rect : Rect2 = Rect2(_rect_drag_start_point, rect_size)
+
+ # This is needed so selection works even when you drag from bottom to top, and from right to left
+ var rect_ofs : Vector2 = _rect_drag_start_point - mouse_pos
+
+ if rect_ofs.x > 0:
+ rect.position.x -= rect_ofs.x
+
+ if rect_ofs.y > 0:
+ rect.position.y -= rect_ofs.y
+
+ var selected : PoolIntArray = PoolIntArray()
+
+ for i in range(_handle_points.size()):
+ var vert_pos_3d : Vector3 = gt.xform(_handle_points[i])
+ var vert_pos_2d : Vector2 = camera.unproject_position(vert_pos_3d)
+
+ if rect.has_point(vert_pos_2d):
+ var point_visible : bool = is_point_visible(_handle_points[i], ray_from, gt)
+
+ if handle_selection_type == HandleSelectionType.HANDLE_SELECTION_TYPE_FRONT:
+ if !point_visible:
+ continue
+ elif handle_selection_type == HandleSelectionType.HANDLE_SELECTION_TYPE_BACK:
+ if point_visible:
+ continue
+
+ selected.push_back(i)
+
+ if event.alt || event.control:
+ for isel in selected:
+ for i in range(_selected_points.size()):
+ if _selected_points[i] == isel:
+ _selected_points.remove(i)
+ break
+ redraw()
+
+ return
+
+ if event.shift:
+ for isel in selected:
+ if !pool_int_arr_contains(_selected_points, isel):
+ _selected_points.push_back(isel)
+
+ redraw()
+ return
+
+ _selected_points.resize(0)
+ _selected_points.append_array(selected)
+
+ redraw()
+
+func selection_drag_rect_select_through(index, camera, event):
+ var gt : Transform = get_spatial_node().global_transform
+
+ var mouse_pos : Vector2 = event.get_position()
+ var rect_size : Vector2 = _rect_drag_start_point - mouse_pos
+ rect_size.x = abs(rect_size.x)
+ rect_size.y = abs(rect_size.y)
+
+ var rect : Rect2 = Rect2(_rect_drag_start_point, rect_size)
+
+ # This is needed so selection works even when you drag from bottom to top, and from right to left
+ var rect_ofs : Vector2 = _rect_drag_start_point - mouse_pos
+
+ if rect_ofs.x > 0:
+ rect.position.x -= rect_ofs.x
+
+ if rect_ofs.y > 0:
+ rect.position.y -= rect_ofs.y
+
+ var selected : PoolIntArray = PoolIntArray()
+
+ for i in range(_handle_points.size()):
+ var vert_pos_3d : Vector3 = gt.xform(_handle_points[i])
+ var vert_pos_2d : Vector2 = camera.unproject_position(vert_pos_3d)
+
+ if rect.has_point(vert_pos_2d):
+ selected.push_back(i)
+
+ if event.alt || event.control:
+ for isel in selected:
+ for i in range(_selected_points.size()):
+ if _selected_points[i] == isel:
+ _selected_points.remove(i)
+ break
+ redraw()
+
+ return
+
+ if event.shift:
+ for isel in selected:
+ if !pool_int_arr_contains(_selected_points, isel):
+ _selected_points.push_back(isel)
+
+ redraw()
+ return
+
+ _selected_points.resize(0)
+ _selected_points.append_array(selected)
+
+ redraw()
+
+func forward_spatial_gui_input(index, camera, event):
+ _last_known_camera_facing = camera.transform.basis.xform(Vector3(0, 0, -1))
+
+ if event is InputEventMouseButton:
+ if event.get_button_index() == BUTTON_LEFT:
+ if _handle_drag_op:
+ if !event.is_pressed():
+ _handle_drag_op = false
+
+ # If a handle was being dragged only run these
+ if _mdr && _mdr.array.size() == ArrayMesh.ARRAY_MAX && _mdr.array[ArrayMesh.ARRAY_VERTEX] != null && _mdr.array[ArrayMesh.ARRAY_VERTEX].size() == _drag_op_orig_verices.size():
+ _undo_redo.create_action("Drag")
+ _undo_redo.add_do_method(self, "apply_vertex_array", _mdr, _mdr.array[ArrayMesh.ARRAY_VERTEX])
+ _undo_redo.add_undo_method(self, "apply_vertex_array", _mdr, _drag_op_orig_verices)
+ _undo_redo.commit_action()
+
+ # Dont consume the event here, because the handles will get stuck
+ # to the mouse pointer if we return true
+ return false
+
+ if !event.is_pressed():
+ # See whether we should check for a click or a selection box
+ var mouse_pos : Vector2 = event.get_position()
+ var rect_size : Vector2 = _rect_drag_start_point - mouse_pos
+ rect_size.x = abs(rect_size.x)
+ rect_size.y = abs(rect_size.y)
+ var had_rect_drag : bool = false
+
+ if rect_size.x > _rect_drag_min_ofset || rect_size.y > _rect_drag_min_ofset:
+ had_rect_drag = true
+
+ if !had_rect_drag:
+ return selection_click(index, camera, event)
+ else:
+ selection_drag(index, camera, event)
+ # Always return false here, so the drag rect thing disappears in the editor
+ return false
+ else:
+ # event is pressed
+ _rect_drag = true
+ _rect_drag_start_point = event.get_position()
+
+ return false
+
+func add_to_all_selected(ofs : Vector3) -> void:
+ for i in _selected_points:
+ var v : Vector3 = _handle_points[i]
+ v += ofs
+ _handle_points.set(i, v)
+
+ for indx in _drag_op_indices:
+ var v : Vector3 = _drag_op_orig_verices[indx]
+ v += ofs
+ _vertices.set(indx, v)
+
+func mul_all_selected_with_basis(b : Basis) -> void:
+ for i in _selected_points:
+ var v : Vector3 = _handle_points[i]
+ v = b * v
+ _handle_points.set(i, v)
+
+ for indx in _drag_op_indices:
+ var v : Vector3 = _drag_op_orig_verices[indx]
+ v = b * v
+ _vertices.set(indx, v)
+
+func mul_all_selected_with_transform(t : Transform) -> void:
+ for i in _selected_points:
+ var v : Vector3 = _handle_points[i]
+ v = t * v
+ _handle_points.set(i, v)
+
+ for indx in _drag_op_indices:
+ var v : Vector3 = _drag_op_orig_verices[indx]
+ v = t * v
+ _vertices.set(indx, v)
+
+func mul_all_selected_with_transform_acc(t : Transform) -> void:
+ for i in _selected_points:
+ var v : Vector3 = _handle_points[i]
+ v = t * v
+ _handle_points.set(i, v)
+
+ for indx in _drag_op_indices:
+ var v : Vector3 = _vertices[indx]
+ v = t * v
+ _vertices.set(indx, v)
+
+func set_translate() -> void:
+ edit_mode = EditMode.EDIT_MODE_TRANSLATE
+
+func set_scale() -> void:
+ edit_mode = EditMode.EDIT_MODE_SCALE
+
+func set_rotate() -> void:
+ edit_mode = EditMode.EDIT_MODE_ROTATE
+
+func set_edit_mode(em : int) -> void:
+ edit_mode = em
+
+func set_axis_x(on : bool) -> void:
+ if on:
+ axis_constraint |= AxisConstraint.X
+ else:
+ if (axis_constraint & AxisConstraint.X) != 0:
+ axis_constraint ^= AxisConstraint.X
+
+func set_axis_y(on : bool) -> void:
+ if on:
+ axis_constraint |= AxisConstraint.Y
+ else:
+ if (axis_constraint & AxisConstraint.Y) != 0:
+ axis_constraint ^= AxisConstraint.Y
+
+func set_axis_z(on : bool) -> void:
+ if on:
+ axis_constraint |= AxisConstraint.Z
+ else:
+ if (axis_constraint & AxisConstraint.Z) != 0:
+ axis_constraint ^= AxisConstraint.Z
+
+func set_selection_mode_vertex() -> void:
+ if selection_mode == SelectionMode.SELECTION_MODE_VERTEX:
+ return
+
+ selection_mode = SelectionMode.SELECTION_MODE_VERTEX
+ _selected_points.resize(0)
+ recalculate_handle_points()
+ redraw()
+
+func set_selection_mode_edge() -> void:
+ if selection_mode == SelectionMode.SELECTION_MODE_EDGE:
+ return
+
+ selection_mode = SelectionMode.SELECTION_MODE_EDGE
+ _selected_points.resize(0)
+ recalculate_handle_points()
+ redraw()
+
+func set_selection_mode_face() -> void:
+ if selection_mode == SelectionMode.SELECTION_MODE_FACE:
+ return
+
+ selection_mode = SelectionMode.SELECTION_MODE_FACE
+ _selected_points.resize(0)
+ recalculate_handle_points()
+ redraw()
+
+func _notification(what):
+ if what == NOTIFICATION_PREDELETE:
+ if self != null && get_plugin():
+ get_plugin().unregister_gizmo(self)
+
+func recalculate_handle_points() -> void:
+ if !_mdr:
+ _handle_points.resize(0)
+ _handle_to_vertex_map.resize(0)
+ return
+
+ var mdr_arr : Array = _mdr.array
+
+ if mdr_arr.size() != ArrayMesh.ARRAY_MAX || mdr_arr[ArrayMesh.ARRAY_VERTEX] == null || mdr_arr[ArrayMesh.ARRAY_VERTEX].size() == 0:
+ _handle_points.resize(0)
+ _handle_to_vertex_map.resize(0)
+ return
+
+ var arr : Array = Array()
+ arr.resize(ArrayMesh.ARRAY_MAX)
+ arr[ArrayMesh.ARRAY_VERTEX] = mdr_arr[ArrayMesh.ARRAY_VERTEX]
+ arr[ArrayMesh.ARRAY_INDEX] = mdr_arr[ArrayMesh.ARRAY_INDEX]
+
+ if selection_mode == SelectionMode.SELECTION_MODE_VERTEX:
+ var merged_arrays : Array = MeshUtils.merge_mesh_array(arr)
+ _handle_points = merged_arrays[ArrayMesh.ARRAY_VERTEX]
+ _handle_to_vertex_map = MeshDecompose.get_handle_vertex_to_vertex_map(mdr_arr, _handle_points)
+ elif selection_mode == SelectionMode.SELECTION_MODE_EDGE:
+ var result : Array = MeshDecompose.get_handle_edge_to_vertex_map(arr)
+
+ _handle_points = result[0]
+ _handle_to_vertex_map = result[1]
+ elif selection_mode == SelectionMode.SELECTION_MODE_FACE:
+ var result : Array = MeshDecompose.get_handle_face_to_vertex_map(arr)
+
+ _handle_points = result[0]
+ _handle_to_vertex_map = result[1]
+
+func on_mesh_data_resource_changed(mdr : MeshDataResource) -> void:
+ if _mdr:
+ _mdr.disconnect("changed", self, "on_mdr_changed")
+
+ _mdr = mdr
+
+ if _mdr && _mdr.array.size() == ArrayMesh.ARRAY_MAX && _mdr.array[ArrayMesh.ARRAY_VERTEX] != null:
+ _vertices = _mdr.array[ArrayMesh.ARRAY_VERTEX]
+ _indices = _mdr.array[ArrayMesh.ARRAY_INDEX]
+ else:
+ _vertices.resize(0)
+ _indices.resize(0)
+
+ if _mdr:
+ _mdr.connect("changed", self, "on_mdr_changed")
+
+ recalculate_handle_points()
+ redraw()
+
+func on_mdr_changed() -> void:
+ if _mdr && _mdr.array.size() == ArrayMesh.ARRAY_MAX && _mdr.array[ArrayMesh.ARRAY_VERTEX] != null:
+ _vertices = _mdr.array[ArrayMesh.ARRAY_VERTEX]
+ _indices = _mdr.array[ArrayMesh.ARRAY_INDEX]
+ else:
+ _vertices.resize(0)
+ _indices.resize(0)
+
+ recalculate_handle_points()
+ redraw()
+
+func disable_change_event() -> void:
+ _mdr.disconnect("changed", self, "on_mdr_changed")
+
+func enable_change_event(update : bool = true) -> void:
+ _mdr.connect("changed", self, "on_mdr_changed")
+
+ if update:
+ on_mdr_changed()
+
+func add_triangle() -> void:
+ if _mdr:
+ var orig_arr = copy_arrays(_mdr.array)
+ MDRMeshUtils.add_triangle(_mdr)
+ add_mesh_change_undo_redo(orig_arr, _mdr.array, "Add Triangle")
+
+func add_quad() -> void:
+ if _mdr:
+ var orig_arr = copy_arrays(_mdr.array)
+ MDRMeshUtils.add_quad(_mdr)
+ add_mesh_change_undo_redo(orig_arr, _mdr.array, "Add Quad")
+
+func is_verts_equal(v0 : Vector3, v1 : Vector3) -> bool:
+ return is_equal_approx(v0.x, v1.x) && is_equal_approx(v0.y, v1.y) && is_equal_approx(v0.z, v1.z)
+
+func find_other_vertex_for_edge(edge : int, v0 : Vector3) -> Vector3:
+ var ps : PoolIntArray = _handle_to_vertex_map[edge]
+
+ var vert : Vector3 = Vector3()
+
+ for i in range(ps.size()):
+ vert = _vertices[ps[i]]
+
+ if !is_verts_equal(v0, vert):
+ return vert
+
+ return v0
+
+func split_edge_indices(edge : int) -> Array:
+ var ps : PoolIntArray = _handle_to_vertex_map[edge]
+
+ if ps.size() == 0:
+ return [ ]
+
+ var v0 : Vector3 = _vertices[ps[0]]
+
+ var v0ei : PoolIntArray = PoolIntArray()
+ v0ei.append(ps[0])
+ var v1ei : PoolIntArray = PoolIntArray()
+
+ for i in range(1, ps.size()):
+ var vert : Vector3 = _vertices[ps[i]]
+
+ if is_verts_equal(v0, vert):
+ v0ei.append(ps[i])
+ else:
+ v1ei.append(ps[i])
+
+ return [ v0ei, v1ei ]
+
+func pool_int_arr_contains(arr : PoolIntArray, val : int) -> bool:
+ for a in arr:
+ if a == val:
+ return true
+
+ return false
+
+
+func find_triangles_for_edge(edge : int) -> PoolIntArray:
+ var eisarr : Array = split_edge_indices(edge)
+
+ if eisarr.size() == 0:
+ return PoolIntArray()
+
+ # these should have the same size
+ var v0ei : PoolIntArray = eisarr[0]
+ var v1ei : PoolIntArray = eisarr[1]
+
+ var res : PoolIntArray = PoolIntArray()
+
+ for i in range(0, _indices.size(), 3):
+ var i0 : int = _indices[i]
+ var i1 : int = _indices[i + 1]
+ var i2 : int = _indices[i + 2]
+
+ if pool_int_arr_contains(v0ei, i0) || pool_int_arr_contains(v0ei, i1) || pool_int_arr_contains(v0ei, i2):
+ if pool_int_arr_contains(v1ei, i0) || pool_int_arr_contains(v1ei, i1) || pool_int_arr_contains(v1ei, i2):
+ res.append(i / 3)
+
+ return res
+
+func find_first_triangle_for_edge(edge : int) -> int:
+ var eisarr : Array = split_edge_indices(edge)
+
+ if eisarr.size() == 0:
+ return -1
+
+ # these should have the same size
+ var v0ei : PoolIntArray = eisarr[0]
+ var v1ei : PoolIntArray = eisarr[1]
+
+ var res : PoolIntArray = PoolIntArray()
+
+ for i in range(0, _indices.size(), 3):
+ var i0 : int = _indices[i]
+ var i1 : int = _indices[i + 1]
+ var i2 : int = _indices[i + 2]
+
+ if pool_int_arr_contains(v0ei, i0) || pool_int_arr_contains(v0ei, i1) || pool_int_arr_contains(v0ei, i2):
+ if pool_int_arr_contains(v1ei, i0) || pool_int_arr_contains(v1ei, i1) || pool_int_arr_contains(v1ei, i2):
+ return i / 3
+
+ return -1
+
+func add_triangle_to_edge(edge : int) -> void:
+ var triangle_index : int = find_first_triangle_for_edge(edge)
+
+ var inds : int = triangle_index * 3
+
+ var ti0 : int = _indices[inds]
+ var ti1 : int = _indices[inds + 1]
+ var ti2 : int = _indices[inds + 2]
+
+ var ps : PoolIntArray = _handle_to_vertex_map[edge]
+
+ if ps.size() == 0:
+ return
+
+ var ei0 : int = 0
+ var ei1 : int = 0
+ var erefind : int = 0
+
+ if !pool_int_arr_contains(ps, ti0):
+ ei0 = ti1
+ ei1 = ti2
+ erefind = ti0
+ elif !pool_int_arr_contains(ps, ti1):
+ ei0 = ti0
+ ei1 = ti2
+ erefind = ti1
+ elif !pool_int_arr_contains(ps, ti2):
+ ei0 = ti0
+ ei1 = ti1
+ erefind = ti2
+
+ var fo : Vector3 = MDRMeshUtils.get_face_normal(_vertices[ti0], _vertices[ti1], _vertices[ti2])
+ var fn : Vector3 = MDRMeshUtils.get_face_normal(_vertices[ei0], _vertices[ei1], _vertices[erefind])
+
+ if fo.dot(fn) < 0:
+ var t : int = ei0
+ ei0 = ei1
+ ei1 = t
+
+ MDRMeshUtils.append_triangle_to_tri_edge(_mdr, _vertices[ei0], _vertices[ei1], _vertices[erefind])
+
+func add_quad_to_edge(edge : int) -> void:
+ var triangle_index : int = find_first_triangle_for_edge(edge)
+
+ var inds : int = triangle_index * 3
+
+ var ti0 : int = _indices[inds]
+ var ti1 : int = _indices[inds + 1]
+ var ti2 : int = _indices[inds + 2]
+
+ var ps : PoolIntArray = _handle_to_vertex_map[edge]
+
+ if ps.size() == 0:
+ return
+
+ var ei0 : int = 0
+ var ei1 : int = 0
+ var erefind : int = 0
+
+ if !pool_int_arr_contains(ps, ti0):
+ ei0 = ti1
+ ei1 = ti2
+ erefind = ti0
+ elif !pool_int_arr_contains(ps, ti1):
+ ei0 = ti0
+ ei1 = ti2
+ erefind = ti1
+ elif !pool_int_arr_contains(ps, ti2):
+ ei0 = ti0
+ ei1 = ti1
+ erefind = ti2
+
+ var fo : Vector3 = MDRMeshUtils.get_face_normal(_vertices[ti0], _vertices[ti1], _vertices[ti2])
+ var fn : Vector3 = MDRMeshUtils.get_face_normal(_vertices[ei0], _vertices[ei1], _vertices[erefind])
+
+ if fo.dot(fn) < 0:
+ var t : int = ei0
+ ei0 = ei1
+ ei1 = t
+
+ MDRMeshUtils.append_quad_to_tri_edge(_mdr, _vertices[ei0], _vertices[ei1], _vertices[erefind])
+
+func add_triangle_at() -> void:
+ if !_mdr:
+ return
+
+ if selection_mode == SelectionMode.SELECTION_MODE_VERTEX:
+ #todo
+ pass
+ elif selection_mode == SelectionMode.SELECTION_MODE_EDGE:
+ disable_change_event()
+ var orig_arr = copy_arrays(_mdr.array)
+
+ for sp in _selected_points:
+ add_triangle_to_edge(sp)
+
+ _selected_points.resize(0)
+ add_mesh_change_undo_redo(orig_arr, _mdr.array, "Add Triangle At")
+ enable_change_event()
+ else:
+ add_triangle()
+
+func add_quad_at() -> void:
+ if !_mdr:
+ return
+
+ if selection_mode == SelectionMode.SELECTION_MODE_VERTEX:
+ #todo
+ pass
+ elif selection_mode == SelectionMode.SELECTION_MODE_EDGE:
+ disable_change_event()
+ var orig_arr = copy_arrays(_mdr.array)
+
+ for sp in _selected_points:
+ add_quad_to_edge(sp)
+
+ _selected_points.resize(0)
+ add_mesh_change_undo_redo(orig_arr, _mdr.array, "Add Quad At")
+ enable_change_event()
+ else:
+ add_quad()
+
+func extrude() -> void:
+ if !_mdr:
+ return
+
+ if _mdr.array.size() != ArrayMesh.ARRAY_MAX || _mdr.array[ArrayMesh.ARRAY_VERTEX] == null:
+ return
+
+ if selection_mode == SelectionMode.SELECTION_MODE_VERTEX:
+ pass
+ elif selection_mode == SelectionMode.SELECTION_MODE_EDGE:
+ disable_change_event()
+ var orig_arr = copy_arrays(_mdr.array)
+ var original_size : int = orig_arr[ArrayMesh.ARRAY_VERTEX].size()
+
+ for sp in _selected_points:
+ add_quad_to_edge(sp)
+
+ var arr : Array = _mdr.array
+
+ # Note: This algorithm depends heavily depends on the inner workings of add_quad_to_edge!
+ var new_verts : PoolVector3Array = arr[ArrayMesh.ARRAY_VERTEX]
+
+ # every 4 vertex is a quad
+ # 1 ---- 2
+ # | |
+ # | |
+ # 0 ---- 3
+ # vertex 1, and 2 are the created new ones, 0, and 3 are duplicated from the original edge
+
+ # Don't reallocate it every time
+ var found_verts : PoolIntArray = PoolIntArray()
+
+ # Go through every new created 0th vertex
+ for i in range(original_size, new_verts.size(), 4):
+ var v0 : Vector3 = new_verts[i]
+
+ found_verts.resize(0)
+
+ # Find a pair for it (has to be the 3th).
+ for j in range(original_size, new_verts.size(), 4):
+ if i == j:
+ continue
+
+ # +3 offset to 3rd vert
+ var v3 : Vector3 = new_verts[j + 3]
+
+ if is_verts_equal(v0, v3):
+ # +2 offset to 2rd vert
+ found_verts.append(j + 2)
+
+ if found_verts.size() == 0:
+ continue
+
+ # Also append the first vertex index to simplify logic
+ found_verts.append(i + 1)
+
+ # Calculate avg
+ var vavg : Vector3 = Vector3()
+ for ind in found_verts:
+ vavg += new_verts[ind]
+
+ vavg /= found_verts.size()
+
+ # set back
+ for ind in found_verts:
+ new_verts[ind] = vavg
+
+ arr[ArrayMesh.ARRAY_VERTEX] = new_verts
+ _mdr.array = arr
+
+ _selected_points.resize(0)
+ add_mesh_change_undo_redo(orig_arr, _mdr.array, "Extrude")
+ enable_change_event()
+
+ # The selection alo will take care of the duplicates
+ var new_handle_points : PoolVector3Array = PoolVector3Array()
+ for i in range(original_size, new_verts.size(), 4):
+ var vavg : Vector3 = new_verts[i + 1]
+ vavg += new_verts[i + 2]
+ vavg /= 2
+
+ new_handle_points.append(vavg)
+
+ select_handle_points(new_handle_points)
+ else:
+ add_quad()
+
+func add_box() -> void:
+ if _mdr:
+ var orig_arr = copy_arrays(_mdr.array)
+ MDRMeshUtils.add_box(_mdr)
+ add_mesh_change_undo_redo(orig_arr, _mdr.array, "Add Box")
+
+func split():
+ pass
+
+func disconnect_action():
+ pass
+
+func get_first_triangle_index_for_vertex(indx : int) -> int:
+ for i in range(_indices.size()):
+ if _indices[i] == indx:
+ return i / 3
+
+ return -1
+
+func create_face():
+ if !_mdr:
+ return
+
+ if _selected_points.size() <= 2:
+ return
+
+ if selection_mode == SelectionMode.SELECTION_MODE_VERTEX:
+ disable_change_event()
+
+ var orig_arr = copy_arrays(_mdr.array)
+
+ var points : PoolVector3Array = PoolVector3Array()
+
+ for sp in _selected_points:
+ points.push_back(_handle_points[sp])
+
+ if points.size() == 3:
+ var i0 : int = _handle_to_vertex_map[_selected_points[0]][0]
+ var i1 : int = _handle_to_vertex_map[_selected_points[1]][0]
+ var i2 : int = _handle_to_vertex_map[_selected_points[2]][0]
+
+ var v0 : Vector3 = points[0]
+ var v1 : Vector3 = points[1]
+ var v2 : Vector3 = points[2]
+
+ var tfn : Vector3 = Vector3()
+
+ if orig_arr[ArrayMesh.ARRAY_NORMAL] != null && orig_arr[ArrayMesh.ARRAY_NORMAL].size() == orig_arr[ArrayMesh.ARRAY_VERTEX].size():
+ var normals : PoolVector3Array = orig_arr[ArrayMesh.ARRAY_NORMAL]
+
+ tfn += normals[i0]
+ tfn += normals[i1]
+ tfn += normals[i2]
+ tfn /= 3
+ tfn = tfn.normalized()
+ else:
+ tfn = MDRMeshUtils.get_face_normal(_vertices[i0], _vertices[i1], _vertices[i2])
+
+ var flip : bool = !MDRMeshUtils.should_triangle_flip(v0, v1, v2, tfn)
+
+ MDRMeshUtils.add_triangle_at(_mdr, v0, v1, v2, flip)
+ add_mesh_change_undo_redo(orig_arr, _mdr.array, "Create Face")
+ enable_change_event()
+ return
+
+ if !MDRMeshUtils.add_triangulated_mesh_from_points_delaunay(_mdr, points, _last_known_camera_facing):
+ enable_change_event()
+ return
+
+ add_mesh_change_undo_redo(orig_arr, _mdr.array, "Create Face")
+
+ #_selected_points.resize(0)
+ enable_change_event()
+ elif selection_mode == SelectionMode.SELECTION_MODE_EDGE:
+ pass
+ elif selection_mode == SelectionMode.SELECTION_MODE_FACE:
+ pass
+
+func split_face_indices(face : int) -> Array:
+ var ps : PoolIntArray = _handle_to_vertex_map[face]
+
+ if ps.size() == 0:
+ return [ ]
+
+ var v0 : Vector3 = _vertices[ps[0]]
+ var v1 : Vector3 = Vector3()
+ var v1found : bool = false
+
+ var v0ei : PoolIntArray = PoolIntArray()
+ v0ei.append(ps[0])
+ var v1ei : PoolIntArray = PoolIntArray()
+ var v2ei : PoolIntArray = PoolIntArray()
+
+ for i in range(1, ps.size()):
+ var vert : Vector3 = _vertices[ps[i]]
+
+ if is_verts_equal(v0, vert):
+ v0ei.append(ps[i])
+ else:
+ if v1found:
+ if is_verts_equal(v1, vert):
+ v1ei.append(ps[i])
+ else:
+ v2ei.append(ps[i])
+ else:
+ v1found = true
+ v1 = _vertices[ps[i]]
+ v1ei.append(ps[i])
+
+ return [ v0ei, v1ei, v2ei ]
+
+func find_first_triangle_index_for_face(face : int) -> int:
+ var split_indices_arr : Array = split_face_indices(face)
+
+ if split_indices_arr.size() == 0:
+ return -1
+
+ var v0ei : PoolIntArray = split_indices_arr[0]
+ var v1ei : PoolIntArray = split_indices_arr[1]
+ var v2ei : PoolIntArray = split_indices_arr[2]
+ var tri_index : int = -1
+
+ for i in range(0, _indices.size(), 3):
+ var i0 : int = _indices[i]
+ var i1 : int = _indices[i + 1]
+ var i2 : int = _indices[i + 2]
+
+ if pool_int_arr_contains(v0ei, i0) || pool_int_arr_contains(v0ei, i1) || pool_int_arr_contains(v0ei, i2):
+ if pool_int_arr_contains(v1ei, i0) || pool_int_arr_contains(v1ei, i1) || pool_int_arr_contains(v1ei, i2):
+ if pool_int_arr_contains(v2ei, i0) || pool_int_arr_contains(v2ei, i1) || pool_int_arr_contains(v2ei, i2):
+ return i / 3
+
+ return -1
+
+func delete_selected() -> void:
+ if !_mdr:
+ return
+
+ if _selected_points.size() == 0:
+ return
+
+ if selection_mode == SelectionMode.SELECTION_MODE_VERTEX:
+ #todo
+ pass
+ elif selection_mode == SelectionMode.SELECTION_MODE_EDGE:
+ #todo
+ pass
+ elif selection_mode == SelectionMode.SELECTION_MODE_FACE:
+ disable_change_event()
+
+ var orig_arr = copy_arrays(_mdr.array)
+
+ var triangle_indexes : Array = Array()
+ for sp in _selected_points:
+ var triangle_index : int = find_first_triangle_index_for_face(sp)
+ triangle_indexes.append(triangle_index)
+
+ #delete in reverse triangle index order
+ triangle_indexes.sort()
+
+ for i in range(triangle_indexes.size() - 1, -1, -1):
+ var triangle_index : int = triangle_indexes[i]
+ MDRMeshUtils.remove_triangle(_mdr, triangle_index)
+
+ add_mesh_change_undo_redo(orig_arr, _mdr.array, "Delete")
+
+ _selected_points.resize(0)
+ enable_change_event()
+
+func generate_normals():
+ if !_mdr:
+ return
+
+ var mdr_arr : Array = _mdr.array
+
+ if mdr_arr.size() != ArrayMesh.ARRAY_MAX || mdr_arr[ArrayMesh.ARRAY_VERTEX] == null || mdr_arr[ArrayMesh.ARRAY_VERTEX].size() == 0:
+ return
+
+ disable_change_event()
+ var orig_arr = copy_arrays(_mdr.array)
+ var orig_seams = copy_pool_int_array(_mdr.seams)
+
+ var seam_points : PoolVector3Array = MDRMeshUtils.seams_to_points(_mdr)
+ MDRMeshUtils.generate_normals_mdr(_mdr)
+ MDRMeshUtils.points_to_seams(_mdr, seam_points)
+
+ add_mesh_seam_change_undo_redo(orig_arr, orig_seams, _mdr.array, _mdr.seams, "Generate Normals")
+ enable_change_event()
+
+func generate_tangents():
+ if !_mdr:
+ return
+
+ var mdr_arr : Array = _mdr.array
+
+ if mdr_arr.size() != ArrayMesh.ARRAY_MAX || mdr_arr[ArrayMesh.ARRAY_VERTEX] == null || mdr_arr[ArrayMesh.ARRAY_VERTEX].size() == 0:
+ return
+
+ disable_change_event()
+ var orig_arr = copy_arrays(_mdr.array)
+ var orig_seams = copy_pool_int_array(_mdr.seams)
+
+ var seam_points : PoolVector3Array = MDRMeshUtils.seams_to_points(_mdr)
+ MDRMeshUtils.generate_tangents(_mdr)
+ MDRMeshUtils.points_to_seams(_mdr, seam_points)
+
+ add_mesh_seam_change_undo_redo(orig_arr, orig_seams, _mdr.array, _mdr.seams, "Generate Tangents")
+ enable_change_event()
+
+func remove_doubles():
+ if !_mdr:
+ return
+
+ var mdr_arr : Array = _mdr.array
+
+ if mdr_arr.size() != ArrayMesh.ARRAY_MAX || mdr_arr[ArrayMesh.ARRAY_VERTEX] == null || mdr_arr[ArrayMesh.ARRAY_VERTEX].size() == 0:
+ return
+
+ disable_change_event()
+ var orig_arr = copy_arrays(_mdr.array)
+ var orig_seams = copy_pool_int_array(_mdr.seams)
+
+ var seam_points : PoolVector3Array = MDRMeshUtils.seams_to_points(_mdr)
+
+ var merged_arrays : Array = MeshUtils.remove_doubles(mdr_arr)
+ _mdr.array = merged_arrays
+ MDRMeshUtils.points_to_seams(_mdr, seam_points)
+
+ add_mesh_seam_change_undo_redo(orig_arr, orig_seams, _mdr.array, _mdr.seams, "Remove Doubles")
+ enable_change_event()
+
+func merge_optimize():
+ if !_mdr:
+ return
+
+ var mdr_arr : Array = _mdr.array
+
+ if mdr_arr.size() != ArrayMesh.ARRAY_MAX || mdr_arr[ArrayMesh.ARRAY_VERTEX] == null || mdr_arr[ArrayMesh.ARRAY_VERTEX].size() == 0:
+ return
+
+ disable_change_event()
+ var orig_arr = copy_arrays(_mdr.array)
+ var orig_seams = copy_pool_int_array(_mdr.seams)
+
+ var seam_points : PoolVector3Array = MDRMeshUtils.seams_to_points(_mdr)
+
+ var merged_arrays : Array = MeshUtils.merge_mesh_array(mdr_arr)
+ _mdr.array = merged_arrays
+ MDRMeshUtils.points_to_seams(_mdr, seam_points)
+
+ add_mesh_seam_change_undo_redo(orig_arr, orig_seams, _mdr.array, _mdr.seams, "Merge Optimize")
+ enable_change_event()
+
+func connect_to_first_selected():
+ if !_mdr:
+ return
+
+ if _selected_points.size() < 2:
+ return
+
+ var mdr_arr : Array = _mdr.array
+
+ if mdr_arr.size() != ArrayMesh.ARRAY_MAX || mdr_arr[ArrayMesh.ARRAY_VERTEX] == null || mdr_arr[ArrayMesh.ARRAY_VERTEX].size() == 0:
+ return
+
+ disable_change_event()
+
+ var orig_arr = copy_arrays(_mdr.array)
+
+ var vertices : PoolVector3Array = mdr_arr[ArrayMesh.ARRAY_VERTEX]
+
+ if selection_mode == SelectionMode.SELECTION_MODE_VERTEX:
+ var mpos : Vector3 = _handle_points[_selected_points[0]]
+
+ for i in range(1, _selected_points.size()):
+ var ps : PoolIntArray = _handle_to_vertex_map[_selected_points[i]]
+
+ for indx in ps:
+ vertices[indx] = mpos
+
+ _selected_points.resize(0)
+
+ mdr_arr[ArrayMesh.ARRAY_VERTEX] = vertices
+ _mdr.array = mdr_arr
+
+ add_mesh_change_undo_redo(orig_arr, _mdr.array, "Connect to first selected")
+ enable_change_event()
+ elif selection_mode == SelectionMode.SELECTION_MODE_EDGE:
+ pass
+ elif selection_mode == SelectionMode.SELECTION_MODE_FACE:
+ pass
+
+func connect_to_avg():
+ if !_mdr:
+ return
+
+ if _selected_points.size() < 2:
+ return
+
+ var mdr_arr : Array = _mdr.array
+
+ if mdr_arr.size() != ArrayMesh.ARRAY_MAX || mdr_arr[ArrayMesh.ARRAY_VERTEX] == null || mdr_arr[ArrayMesh.ARRAY_VERTEX].size() == 0:
+ return
+
+ disable_change_event()
+ var orig_arr = copy_arrays(_mdr.array)
+
+ var vertices : PoolVector3Array = mdr_arr[ArrayMesh.ARRAY_VERTEX]
+
+ if selection_mode == SelectionMode.SELECTION_MODE_VERTEX:
+ var mpos : Vector3 = Vector3()
+
+ for sp in _selected_points:
+ mpos += _handle_points[sp]
+
+ mpos /= _selected_points.size()
+
+ for i in range(_selected_points.size()):
+ var ps : PoolIntArray = _handle_to_vertex_map[_selected_points[i]]
+
+ for indx in ps:
+ vertices[indx] = mpos
+
+ _selected_points.resize(0)
+
+ mdr_arr[ArrayMesh.ARRAY_VERTEX] = vertices
+ _mdr.array = mdr_arr
+
+ add_mesh_change_undo_redo(orig_arr, _mdr.array, "Connect to average")
+ enable_change_event()
+
+ elif selection_mode == SelectionMode.SELECTION_MODE_EDGE:
+ pass
+ elif selection_mode == SelectionMode.SELECTION_MODE_FACE:
+ pass
+
+func connect_to_last_selected():
+ if !_mdr:
+ return
+
+ if _selected_points.size() < 2:
+ return
+
+ var orig_arr = copy_arrays(_mdr.array)
+
+ var mdr_arr : Array = _mdr.array
+
+ if mdr_arr.size() != ArrayMesh.ARRAY_MAX || mdr_arr[ArrayMesh.ARRAY_VERTEX] == null || mdr_arr[ArrayMesh.ARRAY_VERTEX].size() == 0:
+ return
+
+ disable_change_event()
+
+ var vertices : PoolVector3Array = mdr_arr[ArrayMesh.ARRAY_VERTEX]
+
+ if selection_mode == SelectionMode.SELECTION_MODE_VERTEX:
+ var mpos : Vector3 = _handle_points[_selected_points[_selected_points.size() - 1]]
+
+ for i in range(0, _selected_points.size() - 1):
+ var ps : PoolIntArray = _handle_to_vertex_map[_selected_points[i]]
+
+ for indx in ps:
+ vertices[indx] = mpos
+
+ _selected_points.resize(0)
+
+ mdr_arr[ArrayMesh.ARRAY_VERTEX] = vertices
+ _mdr.array = mdr_arr
+
+ add_mesh_change_undo_redo(orig_arr, _mdr.array, "Connect to last selected")
+ enable_change_event()
+ elif selection_mode == SelectionMode.SELECTION_MODE_EDGE:
+ pass
+ elif selection_mode == SelectionMode.SELECTION_MODE_FACE:
+ pass
+
+func get_first_index_pair_for_edge(edge : int) -> PoolIntArray:
+ var ret : PoolIntArray = PoolIntArray()
+
+ var eisarr : Array = split_edge_indices(edge)
+
+ if eisarr.size() == 0:
+ return ret
+
+ # these should have the same size
+ var v0ei : PoolIntArray = eisarr[0]
+ var v1ei : PoolIntArray = eisarr[1]
+
+ var res : PoolIntArray = PoolIntArray()
+
+ for i in range(0, _indices.size(), 3):
+ var i0 : int = _indices[i]
+ var i1 : int = _indices[i + 1]
+ var i2 : int = _indices[i + 2]
+
+ if pool_int_arr_contains(v0ei, i0) || pool_int_arr_contains(v0ei, i1) || pool_int_arr_contains(v0ei, i2):
+ if pool_int_arr_contains(v1ei, i0) || pool_int_arr_contains(v1ei, i1) || pool_int_arr_contains(v1ei, i2):
+
+ if pool_int_arr_contains(v0ei, i0):
+ ret.push_back(i0)
+ elif pool_int_arr_contains(v0ei, i1):
+ ret.push_back(i1)
+ elif pool_int_arr_contains(v0ei, i2):
+ ret.push_back(i2)
+
+ if pool_int_arr_contains(v1ei, i0):
+ ret.push_back(i0)
+ elif pool_int_arr_contains(v1ei, i1):
+ ret.push_back(i1)
+ elif pool_int_arr_contains(v1ei, i2):
+ ret.push_back(i2)
+
+ return ret
+
+ return ret
+
+func get_all_index_pairs_for_edge(edge : int) -> PoolIntArray:
+ var ret : PoolIntArray = PoolIntArray()
+
+ var eisarr : Array = split_edge_indices(edge)
+
+ if eisarr.size() == 0:
+ return ret
+
+ # these should have the same size
+ var v0ei : PoolIntArray = eisarr[0]
+ var v1ei : PoolIntArray = eisarr[1]
+
+ var res : PoolIntArray = PoolIntArray()
+
+ for i in range(0, _indices.size(), 3):
+ var i0 : int = _indices[i]
+ var i1 : int = _indices[i + 1]
+ var i2 : int = _indices[i + 2]
+
+ if pool_int_arr_contains(v0ei, i0) || pool_int_arr_contains(v0ei, i1) || pool_int_arr_contains(v0ei, i2):
+ if pool_int_arr_contains(v1ei, i0) || pool_int_arr_contains(v1ei, i1) || pool_int_arr_contains(v1ei, i2):
+
+ if pool_int_arr_contains(v0ei, i0):
+ ret.push_back(i0)
+ elif pool_int_arr_contains(v0ei, i1):
+ ret.push_back(i1)
+ elif pool_int_arr_contains(v0ei, i2):
+ ret.push_back(i2)
+
+ if pool_int_arr_contains(v1ei, i0):
+ ret.push_back(i0)
+ elif pool_int_arr_contains(v1ei, i1):
+ ret.push_back(i1)
+ elif pool_int_arr_contains(v1ei, i2):
+ ret.push_back(i2)
+
+ return ret
+
+
+func mark_seam():
+ if !_mdr:
+ return
+
+ if _selected_points.size() == 0:
+ return
+
+ if selection_mode == SelectionMode.SELECTION_MODE_VERTEX:
+ pass
+ elif selection_mode == SelectionMode.SELECTION_MODE_EDGE:
+ disable_change_event()
+
+ var prev_seams : PoolIntArray = copy_pool_int_array(_mdr.seams)
+
+ for se in _selected_points:
+ var eis : PoolIntArray = MDRMeshUtils.order_seam_indices(get_first_index_pair_for_edge(se))
+
+ if eis.size() == 0:
+ continue
+
+ MDRMeshUtils.add_seam(_mdr, eis[0], eis[1])
+
+ _undo_redo.create_action("mark_seam")
+ _undo_redo.add_do_method(self, "set_seam", _mdr, copy_pool_int_array(_mdr.seams))
+ _undo_redo.add_undo_method(self, "set_seam", _mdr, prev_seams)
+ _undo_redo.commit_action()
+
+ enable_change_event()
+ elif selection_mode == SelectionMode.SELECTION_MODE_FACE:
+ pass
+
+func unmark_seam():
+ if !_mdr:
+ return
+
+ if _selected_points.size() == 0:
+ return
+
+ if selection_mode == SelectionMode.SELECTION_MODE_VERTEX:
+ pass
+ elif selection_mode == SelectionMode.SELECTION_MODE_EDGE:
+ disable_change_event()
+
+ var prev_seams : PoolIntArray = copy_pool_int_array(_mdr.seams)
+
+ for se in _selected_points:
+ var eis : PoolIntArray = MDRMeshUtils.order_seam_indices(get_all_index_pairs_for_edge(se))
+
+ if eis.size() == 0:
+ continue
+
+ MDRMeshUtils.remove_seam(_mdr, eis[0], eis[1])
+
+ _undo_redo.create_action("unmark_seam")
+ _undo_redo.add_do_method(self, "set_seam", _mdr, copy_pool_int_array(_mdr.seams))
+ _undo_redo.add_undo_method(self, "set_seam", _mdr, prev_seams)
+ _undo_redo.commit_action()
+
+ enable_change_event()
+ elif selection_mode == SelectionMode.SELECTION_MODE_FACE:
+ pass
+
+func set_seam(mdr : MeshDataResource, arr : PoolIntArray) -> void:
+ mdr.seams = arr
+
+func apply_seam():
+ if !_mdr:
+ return
+
+ disable_change_event()
+
+ var orig_arr : Array = copy_arrays(_mdr.array)
+ MDRMeshUtils.apply_seam(_mdr)
+ add_mesh_change_undo_redo(orig_arr, _mdr.array, "apply_seam")
+
+ enable_change_event()
+
+func clean_mesh():
+ if !_mdr:
+ return
+
+ var arrays : Array = _mdr.array
+
+ if arrays.size() != ArrayMesh.ARRAY_MAX:
+ return arrays
+
+ if arrays[ArrayMesh.ARRAY_VERTEX] == null || arrays[ArrayMesh.ARRAY_INDEX] == null:
+ return arrays
+
+ var old_vert_size : int = arrays[ArrayMesh.ARRAY_VERTEX].size()
+
+ disable_change_event()
+
+ var orig_arr : Array = copy_arrays(arrays)
+ arrays = MDRMeshUtils.remove_used_vertices(arrays)
+ var new_vert_size : int = arrays[ArrayMesh.ARRAY_VERTEX].size()
+ add_mesh_change_undo_redo(orig_arr, arrays, "clean_mesh")
+
+ enable_change_event()
+
+ var d : int = old_vert_size - new_vert_size
+
+ print("MDRED: Removed " + str(d) + " unused vertices.")
+
+func uv_unwrap() -> void:
+ if !_mdr:
+ return
+
+ var mdr_arr : Array = _mdr.array
+
+ if mdr_arr.size() != ArrayMesh.ARRAY_MAX || mdr_arr[ArrayMesh.ARRAY_VERTEX] == null || mdr_arr[ArrayMesh.ARRAY_VERTEX].size() == 0:
+ return
+
+ disable_change_event()
+
+ var uvs : PoolVector2Array = MeshUtils.uv_unwrap(mdr_arr)
+
+ if uvs.size() != mdr_arr[ArrayMesh.ARRAY_VERTEX].size():
+ print("Error: Could not unwrap mesh!")
+ enable_change_event(false)
+ return
+
+ var orig_arr : Array = copy_arrays(mdr_arr)
+
+ mdr_arr[ArrayMesh.ARRAY_TEX_UV] = uvs
+
+ add_mesh_change_undo_redo(orig_arr, mdr_arr, "uv_unwrap")
+ enable_change_event()
+
+func flip_selected_faces() -> void:
+ if !_mdr:
+ return
+
+ if _selected_points.size() == 0:
+ return
+
+ if selection_mode == SelectionMode.SELECTION_MODE_VERTEX:
+ pass
+ elif selection_mode == SelectionMode.SELECTION_MODE_EDGE:
+ pass
+ elif selection_mode == SelectionMode.SELECTION_MODE_FACE:
+ disable_change_event()
+
+ var orig_arr = copy_arrays(_mdr.array)
+
+ for sp in _selected_points:
+ var triangle_index : int = find_first_triangle_index_for_face(sp)
+
+ MDRMeshUtils.flip_triangle_ti(_mdr, triangle_index)
+
+ add_mesh_change_undo_redo(orig_arr, _mdr.array, "Flip Faces")
+
+ enable_change_event()
+
+func add_mesh_change_undo_redo(orig_arr : Array, new_arr : Array, action_name : String) -> void:
+ _undo_redo.create_action(action_name)
+ var nac : Array = copy_arrays(new_arr)
+ _undo_redo.add_do_method(self, "apply_mesh_change", _mdr, nac)
+ _undo_redo.add_undo_method(self, "apply_mesh_change", _mdr, orig_arr)
+ _undo_redo.commit_action()
+
+func add_mesh_seam_change_undo_redo(orig_arr : Array, orig_seams : PoolIntArray, new_arr : Array, new_seams : PoolIntArray, action_name : String) -> void:
+ _undo_redo.create_action(action_name)
+ var nac : Array = copy_arrays(new_arr)
+
+ _undo_redo.add_do_method(self, "apply_mesh_change", _mdr, nac)
+ _undo_redo.add_undo_method(self, "apply_mesh_change", _mdr, orig_arr)
+
+ _undo_redo.add_do_method(self, "set_seam", _mdr, copy_pool_int_array(new_seams))
+ _undo_redo.add_undo_method(self, "set_seam", _mdr, orig_seams)
+
+ _undo_redo.commit_action()
+
+func apply_mesh_change(mdr : MeshDataResource, arr : Array) -> void:
+ if !mdr:
+ return
+
+ mdr.array = copy_arrays(arr)
+
+func apply_vertex_array(mdr : MeshDataResource, verts : PoolVector3Array) -> void:
+ if !mdr:
+ return
+
+ var mdr_arr : Array = mdr.array
+
+ if mdr_arr.size() != ArrayMesh.ARRAY_MAX:
+ return
+
+ mdr_arr[ArrayMesh.ARRAY_VERTEX] = verts
+ mdr.array = mdr_arr
+
+func copy_arrays(arr : Array) -> Array:
+ return arr.duplicate(true)
+
+func copy_pool_int_array(pia : PoolIntArray) -> PoolIntArray:
+ var ret : PoolIntArray = PoolIntArray()
+ ret.resize(pia.size())
+
+ for i in range(pia.size()):
+ ret[i] = pia[i]
+
+ return ret
+
+func copy_mdr_verts_array() -> PoolVector3Array:
+ var ret : PoolVector3Array = PoolVector3Array()
+
+ if !_mdr:
+ return ret
+
+ var mdr_arr : Array = _mdr.array
+
+ if mdr_arr.size() != ArrayMesh.ARRAY_MAX || mdr_arr[ArrayMesh.ARRAY_VERTEX] == null || mdr_arr[ArrayMesh.ARRAY_VERTEX].size() == 0:
+ return ret
+
+ var vertices : PoolVector3Array = mdr_arr[ArrayMesh.ARRAY_VERTEX]
+ ret.append_array(vertices)
+
+ return ret
+
+func setup_op_drag_indices() -> void:
+ _drag_op_indices.resize(0)
+
+ for sp in _selected_points:
+ var pi : PoolIntArray = _handle_to_vertex_map[sp]
+
+ for indx in pi:
+ if !pool_int_arr_contains(_drag_op_indices, indx):
+ _drag_op_indices.append(indx)
+
+func get_drag_op_pivot() -> Vector3:
+ if pivot_type == PivotTypes.PIVOT_TYPE_AVERAGED:
+ var avg : Vector3 = Vector3()
+
+ for indx in _drag_op_indices:
+ avg += _vertices[indx]
+
+ avg /= _drag_op_indices.size()
+
+ return avg
+ elif pivot_type == PivotTypes.PIVOT_TYPE_MDI_ORIGIN:
+ return Vector3()
+ elif pivot_type == PivotTypes.PIVOT_TYPE_WORLD_ORIGIN:
+ return get_spatial_node().to_local(Vector3())
+
+ return Vector3()
+
+func select_handle_points(points : PoolVector3Array) -> void:
+ _selected_points.resize(0)
+
+ for p in points:
+ for i in range(_handle_points.size()):
+ if is_verts_equal(p, _handle_points[i]):
+ if !pool_int_arr_contains(_selected_points, i):
+ _selected_points.push_back(i)
+
+ redraw()
+
+func set_pivot_averaged():
+ pivot_type = PivotTypes.PIVOT_TYPE_AVERAGED
+
+func set_pivot_mdi_origin():
+ pivot_type = PivotTypes.PIVOT_TYPE_MDI_ORIGIN
+
+func set_pivot_world_origin():
+ pivot_type = PivotTypes.PIVOT_TYPE_WORLD_ORIGIN
+
+func transfer_state_from(other) -> void:
+ edit_mode = other.edit_mode
+ pivot_type = other.pivot_type
+ axis_constraint = other.axis_constraint
+ selection_mode = other.selection_mode
+ handle_selection_type = other.handle_selection_type
+
+ visual_indicator_outline = other.visual_indicator_outline
+ visual_indicator_seam = other.visual_indicator_seam
+ visual_indicator_handle = other.visual_indicator_handle
+
+func visual_indicator_outline_set(on : bool):
+ visual_indicator_outline = on
+ redraw()
+
+func visual_indicator_seam_set(on : bool):
+ visual_indicator_seam = on
+ redraw()
+
+func visual_indicator_handle_set(on : bool):
+ visual_indicator_handle = on
+ redraw()
+
+func handle_selection_type_front():
+ handle_selection_type = HandleSelectionType.HANDLE_SELECTION_TYPE_FRONT
+
+func handle_selection_type_back():
+ handle_selection_type = HandleSelectionType.HANDLE_SELECTION_TYPE_BACK
+
+func handle_selection_type_all():
+ handle_selection_type = HandleSelectionType.HANDLE_SELECTION_TYPE_ALL
+
diff --git a/modules/mesh_data_resource/editor/addon/UVEditor.gd b/modules/mesh_data_resource/editor/addon/UVEditor.gd
new file mode 100644
index 000000000..b04cef430
--- /dev/null
+++ b/modules/mesh_data_resource/editor/addon/UVEditor.gd
@@ -0,0 +1,63 @@
+tool
+extends Control
+
+var mesh_data_resource : MeshDataResource = null setget set_mesh_data_resource
+var background_texture : Texture = null
+
+func set_mesh_data_resource(a : MeshDataResource):
+ if mesh_data_resource:
+ mesh_data_resource.disconnect("changed", self, "on_mdr_changed")
+
+ mesh_data_resource = a
+
+ if mesh_data_resource:
+ mesh_data_resource.connect("changed", self, "on_mdr_changed")
+
+ update()
+
+func set_mesh_data_instance(a : MeshDataInstance):
+ if !a:
+ background_texture = null
+
+ background_texture = a.texture
+
+func on_mdr_changed():
+ update()
+
+func _draw():
+ if background_texture:
+ draw_texture_rect_region(background_texture, Rect2(Vector2(), get_size()), Rect2(Vector2(), background_texture.get_size()))
+
+ if !mesh_data_resource:
+ return
+
+ if mesh_data_resource.array.size() != ArrayMesh.ARRAY_MAX:
+ return
+
+ var uvs : PoolVector2Array = mesh_data_resource.array[ArrayMesh.ARRAY_TEX_UV]
+ var indices : PoolIntArray = mesh_data_resource.array[ArrayMesh.ARRAY_INDEX]
+
+ if indices.size() % 3 == 0:
+ for i in range(0, len(indices), 3):
+ var c : Color = Color(1, 1, 1, 1)
+
+ if uvs[indices[i]].is_equal_approx(Vector2()) || uvs[indices[i + 1]].is_equal_approx(Vector2()):
+ c = Color(1, 0, 0, 1)
+ else:
+ c = Color(1, 1, 1, 1)
+
+ draw_line(uvs[indices[i]] * get_size(), uvs[indices[i + 1]] * get_size(), c, 1, false)
+
+ if uvs[indices[i + 1]].is_equal_approx(Vector2()) || uvs[indices[i + 2]].is_equal_approx(Vector2()):
+ c = Color(1, 0, 0, 1)
+ else:
+ c = Color(1, 1, 1, 1)
+
+ draw_line(uvs[indices[i + 1]] * get_size(), uvs[indices[i + 2]] * get_size(), c, 1, false)
+
+ if uvs[indices[i + 2]].is_equal_approx(Vector2()) || uvs[indices[i]].is_equal_approx(Vector2()):
+ c = Color(1, 0, 0, 1)
+ else:
+ c = Color(1, 1, 1, 1)
+
+ draw_line(uvs[indices[i + 2]] * get_size(), uvs[indices[i]] * get_size(), c, 1, false)
diff --git a/modules/mesh_data_resource/editor/addon/button_groups/edit_mode_button_group.tres b/modules/mesh_data_resource/editor/addon/button_groups/edit_mode_button_group.tres
new file mode 100644
index 000000000..0e55d7402
--- /dev/null
+++ b/modules/mesh_data_resource/editor/addon/button_groups/edit_mode_button_group.tres
@@ -0,0 +1,3 @@
+[gd_resource type="ButtonGroup" format=2]
+
+[resource]
diff --git a/modules/mesh_data_resource/editor/addon/button_groups/handle_selection_typen_group.tres b/modules/mesh_data_resource/editor/addon/button_groups/handle_selection_typen_group.tres
new file mode 100644
index 000000000..0e55d7402
--- /dev/null
+++ b/modules/mesh_data_resource/editor/addon/button_groups/handle_selection_typen_group.tres
@@ -0,0 +1,3 @@
+[gd_resource type="ButtonGroup" format=2]
+
+[resource]
diff --git a/modules/mesh_data_resource/editor/addon/button_groups/pivot_button_group.tres b/modules/mesh_data_resource/editor/addon/button_groups/pivot_button_group.tres
new file mode 100644
index 000000000..0e55d7402
--- /dev/null
+++ b/modules/mesh_data_resource/editor/addon/button_groups/pivot_button_group.tres
@@ -0,0 +1,3 @@
+[gd_resource type="ButtonGroup" format=2]
+
+[resource]
diff --git a/modules/mesh_data_resource/editor/addon/button_groups/vertex_position_operation_bg.tres b/modules/mesh_data_resource/editor/addon/button_groups/vertex_position_operation_bg.tres
new file mode 100644
index 000000000..0e55d7402
--- /dev/null
+++ b/modules/mesh_data_resource/editor/addon/button_groups/vertex_position_operation_bg.tres
@@ -0,0 +1,3 @@
+[gd_resource type="ButtonGroup" format=2]
+
+[resource]
diff --git a/modules/mesh_data_resource/editor/addon/icons/icon_h_mirror.png b/modules/mesh_data_resource/editor/addon/icons/icon_h_mirror.png
new file mode 100644
index 000000000..0b2cc352d
Binary files /dev/null and b/modules/mesh_data_resource/editor/addon/icons/icon_h_mirror.png differ
diff --git a/modules/mesh_data_resource/editor/addon/icons/icon_h_mirror.png.import b/modules/mesh_data_resource/editor/addon/icons/icon_h_mirror.png.import
new file mode 100644
index 000000000..5b8d9e12d
--- /dev/null
+++ b/modules/mesh_data_resource/editor/addon/icons/icon_h_mirror.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/icon_h_mirror.png-c9b5d56c2156f7acd5e386f16839fcf5.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/mesh_data_resource_editor/icons/icon_h_mirror.png"
+dest_files=[ "res://.import/icon_h_mirror.png-c9b5d56c2156f7acd5e386f16839fcf5.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=1
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=false
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/modules/mesh_data_resource/editor/addon/icons/icon_rot_left.png b/modules/mesh_data_resource/editor/addon/icons/icon_rot_left.png
new file mode 100644
index 000000000..b14e665b6
Binary files /dev/null and b/modules/mesh_data_resource/editor/addon/icons/icon_rot_left.png differ
diff --git a/modules/mesh_data_resource/editor/addon/icons/icon_rot_left.png.import b/modules/mesh_data_resource/editor/addon/icons/icon_rot_left.png.import
new file mode 100644
index 000000000..0f72a9de9
--- /dev/null
+++ b/modules/mesh_data_resource/editor/addon/icons/icon_rot_left.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/icon_rot_left.png-2ed07f01ee122a21258a76ad461d5351.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/mesh_data_resource_editor/icons/icon_rot_left.png"
+dest_files=[ "res://.import/icon_rot_left.png-2ed07f01ee122a21258a76ad461d5351.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=1
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=false
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/modules/mesh_data_resource/editor/addon/icons/icon_rot_right.png b/modules/mesh_data_resource/editor/addon/icons/icon_rot_right.png
new file mode 100644
index 000000000..00bbcba6a
Binary files /dev/null and b/modules/mesh_data_resource/editor/addon/icons/icon_rot_right.png differ
diff --git a/modules/mesh_data_resource/editor/addon/icons/icon_rot_right.png.import b/modules/mesh_data_resource/editor/addon/icons/icon_rot_right.png.import
new file mode 100644
index 000000000..2a717c2f5
--- /dev/null
+++ b/modules/mesh_data_resource/editor/addon/icons/icon_rot_right.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/icon_rot_right.png-3a55515ef21d5e1831970e70a893782c.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/mesh_data_resource_editor/icons/icon_rot_right.png"
+dest_files=[ "res://.import/icon_rot_right.png-3a55515ef21d5e1831970e70a893782c.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=1
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=false
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/modules/mesh_data_resource/editor/addon/icons/icon_v_mirror.png b/modules/mesh_data_resource/editor/addon/icons/icon_v_mirror.png
new file mode 100644
index 000000000..5814c26cc
Binary files /dev/null and b/modules/mesh_data_resource/editor/addon/icons/icon_v_mirror.png differ
diff --git a/modules/mesh_data_resource/editor/addon/icons/icon_v_mirror.png.import b/modules/mesh_data_resource/editor/addon/icons/icon_v_mirror.png.import
new file mode 100644
index 000000000..d1151aa58
--- /dev/null
+++ b/modules/mesh_data_resource/editor/addon/icons/icon_v_mirror.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/icon_v_mirror.png-e41ddad69d06b4e32f9d50b970311be7.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/mesh_data_resource_editor/icons/icon_v_mirror.png"
+dest_files=[ "res://.import/icon_v_mirror.png-e41ddad69d06b4e32f9d50b970311be7.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=1
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=false
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/modules/mesh_data_resource/editor/addon/plugin.cfg b/modules/mesh_data_resource/editor/addon/plugin.cfg
new file mode 100644
index 000000000..8522bd0f5
--- /dev/null
+++ b/modules/mesh_data_resource/editor/addon/plugin.cfg
@@ -0,0 +1,7 @@
+[plugin]
+
+name="mesh_data_resource_editor"
+description=""
+author="Relintai"
+version="1.0"
+script="plugin.gd"
diff --git a/modules/mesh_data_resource/editor/addon/plugin.gd b/modules/mesh_data_resource/editor/addon/plugin.gd
new file mode 100644
index 000000000..ebfa3ac1d
--- /dev/null
+++ b/modules/mesh_data_resource/editor/addon/plugin.gd
@@ -0,0 +1,289 @@
+tool
+extends EditorPlugin
+
+const MDRMeshUtils = preload("res://addons/mesh_data_resource_editor/utilities/mdred_mesh_utils.gd")
+
+const MdiGizmoPlugin = preload("res://addons/mesh_data_resource_editor/MDIGizmoPlugin.gd")
+const MDIEdGui = preload("res://addons/mesh_data_resource_editor/MDIEd.tscn")
+
+var gizmo_plugin = MdiGizmoPlugin.new()
+var mdi_ed_gui : Control
+
+var active_gizmos : Array
+
+var current_mesh_data_instance : MeshDataInstance = null
+
+func _enter_tree():
+ gizmo_plugin = MdiGizmoPlugin.new()
+ mdi_ed_gui = MDIEdGui.instance()
+ mdi_ed_gui.set_plugin(self)
+ active_gizmos = []
+
+ gizmo_plugin.plugin = self
+
+ add_control_to_container(EditorPlugin.CONTAINER_SPATIAL_EDITOR_SIDE_RIGHT, mdi_ed_gui)
+ mdi_ed_gui.hide()
+
+ add_spatial_gizmo_plugin(gizmo_plugin)
+
+ set_input_event_forwarding_always_enabled()
+
+func _exit_tree():
+ #print("_exit_tree")
+
+ remove_spatial_gizmo_plugin(gizmo_plugin)
+ #remove_control_from_container(EditorPlugin.CONTAINER_SPATIAL_EDITOR_SIDE_RIGHT, mdi_ed_gui)
+ mdi_ed_gui.queue_free()
+ pass
+
+#func enable_plugin():
+# print("enable_plugin")
+# pass
+#
+#func disable_plugin():
+# print("disable_plugin")
+# remove_spatial_gizmo_plugin(gizmo_plugin)
+# remove_control_from_container(EditorPlugin.CONTAINER_SPATIAL_EDITOR_SIDE_RIGHT, mdi_ed_gui)
+# mdi_ed_gui.queue_free()
+
+func handles(object):
+ #print("disable_plugin")
+
+ if object is MeshDataInstance:
+ return true
+
+ return false
+
+func edit(object):
+ var mdi : MeshDataInstance = object as MeshDataInstance
+
+ if mdi:
+ if current_mesh_data_instance && mdi.gizmo && current_mesh_data_instance.gizmo:
+ mdi.gizmo.transfer_state_from(current_mesh_data_instance.gizmo)
+
+ mdi_ed_gui.set_mesh_data_resource(mdi.mesh_data)
+ mdi_ed_gui.set_mesh_data_instance(mdi)
+
+ current_mesh_data_instance = mdi
+
+func make_visible(visible):
+ #print("make_visible")
+
+ if visible:
+ mdi_ed_gui.show()
+ else:
+ #mdi_ed_gui.hide()
+ #figure out how to hide it when something else gets selected, don't hide on unselect
+ pass
+
+func get_plugin_name():
+ return "mesh_data_resource_editor"
+
+
+#func forward_spatial_gui_input(camera, event):
+# return forward_spatial_gui_input(0, camera, event)
+
+func register_gizmo(gizmo):
+ active_gizmos.append(gizmo)
+
+func unregister_gizmo(gizmo):
+ for i in range(active_gizmos.size()):
+ if active_gizmos[i] == gizmo:
+ active_gizmos.remove(i)
+ return
+
+func set_translate() -> void:
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.set_translate()
+
+func set_scale() -> void:
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.set_scale()
+
+func set_rotate() -> void:
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.set_rotate()
+
+func set_axis_x(on : bool) -> void:
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.set_axis_x(on)
+
+func set_axis_y(on : bool) -> void:
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.set_axis_y(on)
+
+func set_axis_z(on : bool) -> void:
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.set_axis_z(on)
+
+func set_selection_mode_vertex() -> void:
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.set_selection_mode_vertex()
+
+func set_selection_mode_edge() -> void:
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.set_selection_mode_edge()
+
+func set_selection_mode_face() -> void:
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.set_selection_mode_face()
+
+func get_mdr() -> MeshDataResource:
+ if current_mesh_data_instance:
+ return current_mesh_data_instance.mesh_data
+
+ return null
+
+
+#func forward_spatial_gui_input(camera, event):
+# for g in active_gizmos:
+# if g.forward_spatial_gui_input(0, camera, event):
+# return true
+#
+# return false
+
+func forward_spatial_gui_input(index, camera, event):
+ if (!is_instance_valid(current_mesh_data_instance)):
+ current_mesh_data_instance = null
+
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ if current_mesh_data_instance.gizmo.forward_spatial_gui_input(index, camera, event):
+ return true
+
+ return false
+
+func add_box() -> void:
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.add_box()
+
+func add_triangle() -> void:
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.add_triangle()
+
+func add_quad() -> void:
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.add_quad()
+
+func add_triangle_at() -> void:
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.add_triangle_at()
+
+func add_quad_at() -> void:
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.add_quad_at()
+
+func split():
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.split()
+
+func connect_action():
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.connect_action()
+
+func disconnect_action():
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.disconnect_action()
+
+func create_face():
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.create_face()
+
+func delete_selected():
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.delete_selected()
+
+func generate_normals():
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.generate_normals()
+
+func remove_doubles():
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.remove_doubles()
+
+func merge_optimize():
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.merge_optimize()
+
+func generate_tangents():
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.generate_tangents()
+
+func connect_to_first_selected():
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.connect_to_first_selected()
+
+func connect_to_avg():
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.connect_to_avg()
+
+func connect_to_last_selected():
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.connect_to_last_selected()
+
+func mark_seam():
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.mark_seam()
+
+func unmark_seam():
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.unmark_seam()
+
+func apply_seam():
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.apply_seam()
+
+func uv_unwrap() -> void:
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.uv_unwrap()
+
+func set_pivot_averaged():
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.set_pivot_averaged()
+
+func set_pivot_mdi_origin():
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.set_pivot_mdi_origin()
+
+func set_pivot_world_origin():
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.set_pivot_world_origin()
+
+func visual_indicator_outline_set(on : bool):
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.visual_indicator_outline_set(on)
+
+func visual_indicator_seam_set(on : bool):
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.visual_indicator_seam_set(on)
+
+func visual_indicator_handle_set(on : bool):
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.visual_indicator_handle_set(on)
+
+func select_all():
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.select_all()
+
+func handle_selection_type_front():
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.handle_selection_type_front()
+
+func handle_selection_type_back():
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.handle_selection_type_back()
+
+func handle_selection_type_all():
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.handle_selection_type_all()
+
+func extrude():
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.extrude()
+
+func clean_mesh():
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.clean_mesh()
+
+func flip_selected_faces():
+ if current_mesh_data_instance && current_mesh_data_instance.gizmo:
+ current_mesh_data_instance.gizmo.flip_selected_faces()
diff --git a/modules/mesh_data_resource/editor/addon/utilities/mdred_mesh_utils.gd b/modules/mesh_data_resource/editor/addon/utilities/mdred_mesh_utils.gd
new file mode 100644
index 000000000..bd2fcd0f6
--- /dev/null
+++ b/modules/mesh_data_resource/editor/addon/utilities/mdred_mesh_utils.gd
@@ -0,0 +1,1643 @@
+tool
+extends Object
+
+static func remove_triangle(mdr : MeshDataResource, triangle_index : int) -> void:
+ if triangle_index < 0:
+ return
+
+ var arrays : Array = mdr.get_array()
+
+ if arrays.size() != ArrayMesh.ARRAY_MAX:
+ arrays.resize(ArrayMesh.ARRAY_MAX)
+
+ if arrays[ArrayMesh.ARRAY_INDEX] == null:
+ return
+
+ var indices : PoolIntArray = arrays[ArrayMesh.ARRAY_INDEX]
+
+ # Just remove that triangle
+ var i : int = triangle_index * 3
+
+ var i0 : int = indices[i]
+ var i1 : int = indices[i + 1]
+ var i2 : int = indices[i + 2]
+
+ remove_seam_not_ordered(mdr, i0, i1)
+ remove_seam_not_ordered(mdr, i1, i2)
+ remove_seam_not_ordered(mdr, i2, i0)
+
+ indices.remove(i)
+ indices.remove(i)
+ indices.remove(i)
+
+ arrays[ArrayMesh.ARRAY_INDEX] = indices
+
+ mdr.set_array(arrays)
+
+static func add_triangulated_mesh_from_points_delaunay(mdr : MeshDataResource, selected_points : PoolVector3Array, last_known_camera_facing : Vector3) -> bool:
+ if selected_points.size() < 3:
+ return false
+
+ var tetrahedrons : PoolIntArray = MeshUtils.delaunay3d_tetrahedralize(selected_points)
+
+ if tetrahedrons.size() == 0:
+ # try randomly displacing the points a bit, it can help
+ var rnd_selected_points : PoolVector3Array = PoolVector3Array()
+ rnd_selected_points.append_array(selected_points)
+
+ for i in range(rnd_selected_points.size()):
+ rnd_selected_points[i] = rnd_selected_points[i] + (Vector3(randf(),randf(), randf()) * 0.1)
+
+ tetrahedrons = MeshUtils.delaunay3d_tetrahedralize(rnd_selected_points)
+
+ if tetrahedrons.size() == 0:
+ print("add_triangulated_mesh_from_points_delaunay: tetrahedrons.size() == 0!")
+ return false
+
+ var st : SurfaceTool = SurfaceTool.new()
+
+ st.begin(Mesh.PRIMITIVE_TRIANGLES)
+
+ for i in range(0, tetrahedrons.size(), 4):
+ var i0 : int = tetrahedrons[i]
+ var i1 : int = tetrahedrons[i + 1]
+ var i2 : int = tetrahedrons[i + 2]
+ var i3 : int = tetrahedrons[i + 3]
+
+ var v0 : Vector3 = selected_points[i0]
+ var v1 : Vector3 = selected_points[i1]
+ var v2 : Vector3 = selected_points[i2]
+ var v3 : Vector3 = selected_points[i3]
+
+ var flip : bool = is_normal_similar(v0, v1, v2, last_known_camera_facing)
+
+ var normal : Vector3 = get_face_normal(v0, v1, v2, flip)
+
+ st.add_uv(Vector2(0, 1))
+ st.add_normal(normal)
+ st.add_vertex(v0)
+ st.add_uv(Vector2(0.5, 0))
+ st.add_normal(normal)
+ st.add_vertex(v1)
+ st.add_uv(Vector2(1, 1))
+ st.add_normal(normal)
+ st.add_vertex(v2)
+ st.add_uv(Vector2(1, 1))
+ st.add_normal(normal)
+ st.add_vertex(v3)
+
+ var im3 : int = i
+
+ if !flip:
+ st.add_index(im3 + 0)
+ st.add_index(im3 + 1)
+ st.add_index(im3 + 2)
+
+ st.add_index(im3 + 0)
+ st.add_index(im3 + 2)
+ st.add_index(im3 + 3)
+ else:
+ st.add_index(im3 + 3)
+ st.add_index(im3 + 2)
+ st.add_index(im3 + 0)
+
+ st.add_index(im3 + 2)
+ st.add_index(im3 + 1)
+ st.add_index(im3 + 0)
+
+ merge_in_surface_tool(mdr, st)
+
+ return true
+
+static func add_triangulated_mesh_from_points(mdr : MeshDataResource, selected_points : PoolVector3Array, last_known_camera_facing : Vector3) -> void:
+ if selected_points.size() < 3:
+ return
+
+ var st : SurfaceTool = SurfaceTool.new()
+
+ st.begin(Mesh.PRIMITIVE_TRIANGLES)
+
+ var v0 : Vector3 = selected_points[0]
+ var v1 : Vector3 = selected_points[1]
+
+ for i in range(2, selected_points.size()):
+ var v2 : Vector3 = selected_points[i]
+
+ var flip : bool = is_normal_similar(v0, v1, v2, last_known_camera_facing)
+
+ var normal : Vector3 = get_face_normal(v0, v1, v2, flip)
+
+ st.add_uv(Vector2(0, 1))
+ st.add_normal(normal)
+ st.add_vertex(v0)
+ st.add_uv(Vector2(0.5, 0))
+ st.add_normal(normal)
+ st.add_vertex(v1)
+ st.add_uv(Vector2(1, 1))
+ st.add_normal(normal)
+ st.add_vertex(v2)
+
+ var im3 : int = (i - 2) * 3
+
+ if !flip:
+ st.add_index(im3)
+ st.add_index(im3 + 1)
+ st.add_index(im3 + 2)
+ else:
+ st.add_index(im3 + 2)
+ st.add_index(im3 + 1)
+ st.add_index(im3)
+
+ merge_in_surface_tool(mdr, st)
+
+# Appends a triangle to the mesh. It's created from miroring v2 to the ev0, and ev1 edge
+static func append_triangle_to_tri_edge(mdr : MeshDataResource, ev0 : Vector3, ev1 : Vector3, v2 : Vector3) -> void:
+ var vref : Vector3 = reflect_vertex(ev0, ev1, v2)
+
+ add_triangle_at(mdr, ev1, ev0, vref, false)
+
+static func add_triangle_at(mdr : MeshDataResource, v0 : Vector3, v1 : Vector3, v2 : Vector3, flip : bool = false) -> void:
+ var st : SurfaceTool = SurfaceTool.new()
+
+ st.begin(Mesh.PRIMITIVE_TRIANGLES)
+
+ var normal : Vector3 = get_face_normal(v0, v1, v2, flip)
+
+ st.add_uv(Vector2(0, 1))
+ st.add_normal(normal)
+ st.add_vertex(v0)
+ st.add_uv(Vector2(0.5, 0))
+ st.add_normal(normal)
+ st.add_vertex(v1)
+ st.add_uv(Vector2(1, 1))
+ st.add_normal(normal)
+ st.add_vertex(v2)
+
+ if !flip:
+ st.add_index(0)
+ st.add_index(1)
+ st.add_index(2)
+ else:
+ st.add_index(2)
+ st.add_index(1)
+ st.add_index(0)
+
+ merge_in_surface_tool(mdr, st)
+
+static func add_triangle(mdr : MeshDataResource) -> void:
+ var st : SurfaceTool = SurfaceTool.new()
+
+ st.begin(Mesh.PRIMITIVE_TRIANGLES)
+
+ var normal : Vector3 = get_face_normal(Vector3(-0.5, -0.5, 0), Vector3(0, 0.5, 0), Vector3(0.5, -0.5, 0))
+
+ st.add_uv(Vector2(0, 1))
+ st.add_normal(normal)
+ st.add_vertex(Vector3(-0.5, -0.5, 0))
+ st.add_uv(Vector2(0.5, 0))
+ st.add_normal(normal)
+ st.add_vertex(Vector3(0, 0.5, 0))
+ st.add_uv(Vector2(1, 1))
+ st.add_normal(normal)
+ st.add_vertex(Vector3(0.5, -0.5, 0))
+
+ st.add_index(0)
+ st.add_index(1)
+ st.add_index(2)
+
+ merge_in_surface_tool(mdr, st)
+
+# Appends a quad to the mesh. It's created to the opposite side of v2 to the ev0, and ev1 edge
+static func append_quad_to_tri_edge(mdr : MeshDataResource, ev0 : Vector3, ev1 : Vector3, v2 : Vector3) -> void:
+ var vref : Vector3 = reflect_vertex(ev0, ev1, v2)
+ var vproj : Vector3 = (vref - ev0).project(ev1 - ev0)
+ var eoffs : Vector3 = (vref - ev0) - vproj
+
+ var qv0 : Vector3 = ev0
+ var qv1 : Vector3 = ev0 + eoffs
+ var qv2 : Vector3 = ev1 + eoffs
+ var qv3 : Vector3 = ev1
+
+ add_quad_at(mdr, qv0, qv1, qv2, qv3, false)
+
+static func add_quad_at(mdr : MeshDataResource, v0 : Vector3, v1 : Vector3, v2 : Vector3, v3 : Vector3, flip : bool = false) -> void:
+ var st : SurfaceTool = SurfaceTool.new()
+
+ st.begin(Mesh.PRIMITIVE_TRIANGLES)
+
+ var normal : Vector3 = get_face_normal(v0, v1, v2, flip)
+
+ st.add_uv(Vector2(0, 1))
+ st.add_normal(normal)
+ st.add_vertex(v0)
+ st.add_uv(Vector2(0, 0))
+ st.add_normal(normal)
+ st.add_vertex(v1)
+ st.add_uv(Vector2(1, 0))
+ st.add_normal(normal)
+ st.add_vertex(v2)
+ st.add_uv(Vector2(1, 1))
+ st.add_normal(normal)
+ st.add_vertex(v3)
+
+
+ if !flip:
+ st.add_index(0)
+ st.add_index(1)
+ st.add_index(2)
+
+ st.add_index(0)
+ st.add_index(2)
+ st.add_index(3)
+ else:
+ st.add_index(2)
+ st.add_index(1)
+ st.add_index(0)
+
+ st.add_index(3)
+ st.add_index(2)
+ st.add_index(0)
+
+ merge_in_surface_tool(mdr, st)
+
+static func add_quad(mdr : MeshDataResource) -> void:
+ var st : SurfaceTool = SurfaceTool.new()
+
+ var normal : Vector3 = get_face_normal(Vector3(-0.5, -0.5, 0), Vector3(-0.5, 0.5, 0), Vector3(0.5, 0.5, 0))
+
+ st.begin(Mesh.PRIMITIVE_TRIANGLES)
+
+ st.add_uv(Vector2(0, 1))
+ st.add_normal(normal)
+ st.add_vertex(Vector3(-0.5, -0.5, 0))
+ st.add_uv(Vector2(0, 0))
+ st.add_normal(normal)
+ st.add_vertex(Vector3(-0.5, 0.5, 0))
+ st.add_uv(Vector2(1, 0))
+ st.add_normal(normal)
+ st.add_vertex(Vector3(0.5, 0.5, 0))
+ st.add_uv(Vector2(1, 1))
+ st.add_normal(normal)
+ st.add_vertex(Vector3(0.5, -0.5, 0))
+
+ st.add_index(0)
+ st.add_index(1)
+ st.add_index(2)
+ st.add_index(2)
+ st.add_index(3)
+ st.add_index(0)
+
+ merge_in_surface_tool(mdr, st)
+
+static func add_box(mdr : MeshDataResource) -> void:
+ var st : SurfaceTool = SurfaceTool.new()
+
+ var normal : Vector3 = Vector3()
+
+ st.begin(Mesh.PRIMITIVE_TRIANGLES)
+
+ var sgn : float = 1
+
+ #z
+ for i in range(2):
+ normal = get_face_normal(Vector3(-0.5, -0.5, sgn * 0.5), Vector3(-0.5, 0.5, sgn * 0.5), Vector3(0.5, 0.5, sgn * 0.5), sgn < 0)
+
+ st.add_uv(Vector2(0, 1))
+ st.add_normal(normal)
+ st.add_vertex(Vector3(-0.5, -0.5, sgn * 0.5))
+ st.add_uv(Vector2(0, 0))
+ st.add_normal(normal)
+ st.add_vertex(Vector3(-0.5, 0.5, sgn * 0.5))
+ st.add_uv(Vector2(1, 0))
+ st.add_normal(normal)
+ st.add_vertex(Vector3(0.5, 0.5, sgn * 0.5))
+ st.add_uv(Vector2(1, 1))
+ st.add_normal(normal)
+ st.add_vertex(Vector3(0.5, -0.5, sgn * 0.5))
+
+ sgn *= -1
+
+ #x
+ for i in range(2):
+ normal = get_face_normal(Vector3(sgn * 0.5, -0.5, 0.5), Vector3(sgn * 0.5, 0.5, 0.5), Vector3(sgn * 0.5, 0.5, -0.5), sgn < 0)
+
+ st.add_uv(Vector2(0, 1))
+ st.add_normal(normal)
+ st.add_vertex(Vector3(sgn * 0.5, -0.5, 0.5))
+ st.add_uv(Vector2(0, 0))
+ st.add_normal(normal)
+ st.add_vertex(Vector3(sgn * 0.5, 0.5, 0.5))
+ st.add_uv(Vector2(1, 0))
+ st.add_normal(normal)
+ st.add_vertex(Vector3(sgn * 0.5, 0.5, -0.5))
+ st.add_uv(Vector2(1, 1))
+ st.add_normal(normal)
+ st.add_vertex(Vector3(sgn * 0.5, -0.5, -0.5))
+
+ sgn *= -1
+
+ #y
+ for i in range(2):
+ normal = get_face_normal(Vector3(-0.5, sgn * 0.5, 0.5), Vector3(-0.5, sgn * 0.5, -0.5), Vector3(0.5, sgn * 0.5, -0.5), sgn < 0)
+
+ st.add_uv(Vector2(0, 1))
+ st.add_normal(normal)
+ st.add_vertex(Vector3(-0.5, sgn * 0.5, 0.5))
+ st.add_uv(Vector2(0, 0))
+ st.add_normal(normal)
+ st.add_vertex(Vector3(-0.5, sgn * 0.5, -0.5))
+ st.add_uv(Vector2(1, 0))
+ st.add_normal(normal)
+ st.add_vertex(Vector3(0.5, sgn * 0.5, -0.5))
+ st.add_uv(Vector2(1, 1))
+ st.add_normal(normal)
+ st.add_vertex(Vector3(0.5, sgn * 0.5, 0.5))
+
+
+ sgn *= -1
+
+ var ind : int = 0
+
+ for i in range(3):
+ st.add_index(ind + 0)
+ st.add_index(ind + 1)
+ st.add_index(ind + 2)
+ st.add_index(ind + 2)
+ st.add_index(ind + 3)
+ st.add_index(ind + 0)
+
+ ind += 4
+
+ st.add_index(ind + 0)
+ st.add_index(ind + 2)
+ st.add_index(ind + 1)
+ st.add_index(ind + 0)
+ st.add_index(ind + 3)
+ st.add_index(ind + 2)
+
+ ind += 4
+
+ merge_in_surface_tool(mdr, st)
+
+static func merge_in_surface_tool(mdr : MeshDataResource, st : SurfaceTool, generate_normals_if_needed : bool = true, generate_tangents_if_needed : bool = true) -> void:
+ var arrays : Array = get_arrays_prepared(mdr)
+
+ if arrays.size() != ArrayMesh.ARRAY_MAX:
+ arrays.resize(ArrayMesh.ARRAY_MAX)
+
+ if generate_normals_if_needed && arrays[ArrayMesh.ARRAY_NORMAL] == null:
+ #st.generate_normals()
+ generate_normals_mdr(mdr)
+
+ if generate_tangents_if_needed && arrays[ArrayMesh.ARRAY_TANGENT] == null:
+ st.generate_tangents()
+
+ merge_in_arrays(mdr, st.commit_to_arrays())
+
+static func merge_in_arrays(mdr : MeshDataResource, merge : Array) -> void:
+ var arrays : Array = mdr.get_array()
+
+ if arrays.size() != ArrayMesh.ARRAY_MAX:
+ arrays.resize(ArrayMesh.ARRAY_MAX)
+
+ var vertices : PoolVector3Array
+ var normals : PoolVector3Array
+ var tangents : PoolRealArray
+ var colors : PoolColorArray
+ var uv : PoolVector2Array
+ var uv2 : PoolVector2Array
+ var bones : PoolRealArray
+ var weights : PoolRealArray
+ var indices : PoolIntArray
+
+ if arrays[ArrayMesh.ARRAY_VERTEX] != null:
+ vertices = arrays[ArrayMesh.ARRAY_VERTEX]
+
+ if arrays[ArrayMesh.ARRAY_NORMAL] != null:
+ normals = arrays[ArrayMesh.ARRAY_NORMAL]
+
+ if arrays[ArrayMesh.ARRAY_TANGENT] != null:
+ tangents = arrays[ArrayMesh.ARRAY_TANGENT]
+
+ if arrays[ArrayMesh.ARRAY_COLOR] != null:
+ colors = arrays[ArrayMesh.ARRAY_COLOR]
+
+ if arrays[ArrayMesh.ARRAY_TEX_UV] != null:
+ uv = arrays[ArrayMesh.ARRAY_TEX_UV]
+
+ if arrays[ArrayMesh.ARRAY_TEX_UV2] != null:
+ uv2 = arrays[ArrayMesh.ARRAY_TEX_UV2]
+
+ if arrays[ArrayMesh.ARRAY_BONES] != null:
+ bones = arrays[ArrayMesh.ARRAY_BONES]
+
+ if arrays[ArrayMesh.ARRAY_WEIGHTS] != null:
+ weights = arrays[ArrayMesh.ARRAY_WEIGHTS]
+
+ if arrays[ArrayMesh.ARRAY_INDEX] != null:
+ indices = arrays[ArrayMesh.ARRAY_INDEX]
+
+ var merge_vertices : PoolVector3Array
+ var merge_normals : PoolVector3Array
+ var merge_tangents : PoolRealArray
+ var merge_colors : PoolColorArray
+ var merge_uv : PoolVector2Array
+ var merge_uv2 : PoolVector2Array
+ var merge_bones : PoolRealArray
+ var merge_weights : PoolRealArray
+ var merge_indices : PoolIntArray
+
+ if merge[ArrayMesh.ARRAY_VERTEX] != null:
+ merge_vertices = merge[ArrayMesh.ARRAY_VERTEX]
+
+ if merge[ArrayMesh.ARRAY_NORMAL] != null:
+ merge_normals = merge[ArrayMesh.ARRAY_NORMAL]
+
+ if merge[ArrayMesh.ARRAY_TANGENT] != null:
+ merge_tangents = merge[ArrayMesh.ARRAY_TANGENT]
+
+ if merge[ArrayMesh.ARRAY_COLOR] != null:
+ merge_colors = merge[ArrayMesh.ARRAY_COLOR]
+
+ if merge[ArrayMesh.ARRAY_TEX_UV] != null:
+ merge_uv = merge[ArrayMesh.ARRAY_TEX_UV]
+
+ if merge[ArrayMesh.ARRAY_TEX_UV2] != null:
+ merge_uv2 = merge[ArrayMesh.ARRAY_TEX_UV2]
+
+ if merge[ArrayMesh.ARRAY_BONES] != null:
+ merge_bones = merge[ArrayMesh.ARRAY_BONES]
+
+ if merge[ArrayMesh.ARRAY_WEIGHTS] != null:
+ merge_weights = merge[ArrayMesh.ARRAY_WEIGHTS]
+
+ if merge[ArrayMesh.ARRAY_INDEX] != null:
+ merge_indices = merge[ArrayMesh.ARRAY_INDEX]
+
+ #merge
+ var ovc : int = vertices.size()
+ vertices.append_array(merge_vertices)
+
+ if arrays[ArrayMesh.ARRAY_NORMAL] != null:
+ if merge_vertices.size() != merge_normals.size():
+ for i in range(merge_vertices.size()):
+ normals.append(Vector3())
+ else:
+ normals.append_array(merge_normals)
+
+ if arrays[ArrayMesh.ARRAY_TANGENT] != null:
+ if merge_vertices.size() != merge_tangents.size() * 4:
+ for i in range(merge_vertices.size()):
+ merge_tangents.append(0)
+ merge_tangents.append(0)
+ merge_tangents.append(0)
+ merge_tangents.append(0)
+ else:
+ tangents.append_array(merge_tangents)
+
+ if arrays[ArrayMesh.ARRAY_COLOR] != null:
+ if merge_vertices.size() != merge_colors.size():
+ for i in range(merge_vertices.size()):
+ colors.append(Color())
+ else:
+ colors.append_array(merge_colors)
+
+ if arrays[ArrayMesh.ARRAY_TEX_UV] != null:
+ if merge_vertices.size() != merge_uv.size():
+ for i in range(merge_vertices.size()):
+ uv.append(Vector2())
+ else:
+ uv.append_array(merge_uv)
+
+ if arrays[ArrayMesh.ARRAY_TEX_UV2] != null:
+ if merge_vertices.size() != merge_uv2.size():
+ for i in range(merge_vertices.size()):
+ uv2.append(Vector2())
+ else:
+ uv2.append_array(merge_uv2)
+
+ if arrays[ArrayMesh.ARRAY_BONES] != null:
+ if merge_vertices.size() != merge_bones.size() * 4:
+ for i in range(merge_vertices.size()):
+ bones.append(0)
+ bones.append(0)
+ bones.append(0)
+ bones.append(0)
+ else:
+ bones.append_array(merge_bones)
+
+ if arrays[ArrayMesh.ARRAY_WEIGHTS] != null:
+ if merge_vertices.size() != merge_weights.size() * 4:
+ for i in range(merge_vertices.size()):
+ weights.append(0)
+ weights.append(0)
+ weights.append(0)
+ weights.append(0)
+ else:
+ weights.append_array(merge_weights)
+
+ for i in range(merge_indices.size()):
+ merge_indices[i] += ovc
+
+ indices.append_array(merge_indices)
+
+ #write back
+
+ arrays[ArrayMesh.ARRAY_VERTEX] = vertices
+
+ if arrays[ArrayMesh.ARRAY_NORMAL] != null:
+ arrays[ArrayMesh.ARRAY_NORMAL] = normals
+
+ if arrays[ArrayMesh.ARRAY_TANGENT] != null:
+ arrays[ArrayMesh.ARRAY_TANGENT] = tangents
+
+ if arrays[ArrayMesh.ARRAY_COLOR] != null:
+ arrays[ArrayMesh.ARRAY_COLOR] = colors
+
+ if arrays[ArrayMesh.ARRAY_TEX_UV] != null:
+ arrays[ArrayMesh.ARRAY_TEX_UV] = uv
+
+ if arrays[ArrayMesh.ARRAY_TEX_UV2] != null:
+ arrays[ArrayMesh.ARRAY_TEX_UV2] = uv2
+
+ if arrays[ArrayMesh.ARRAY_BONES] != null:
+ arrays[ArrayMesh.ARRAY_BONES] = bones
+
+ if arrays[ArrayMesh.ARRAY_WEIGHTS] != null:
+ arrays[ArrayMesh.ARRAY_WEIGHTS] = weights
+
+ arrays[ArrayMesh.ARRAY_INDEX] = indices
+
+ mdr.set_array(arrays)
+
+static func get_arrays_prepared(mdr : MeshDataResource) -> Array:
+ var arrays : Array = mdr.get_array()
+
+ if arrays.size() != ArrayMesh.ARRAY_MAX:
+ arrays.resize(ArrayMesh.ARRAY_MAX)
+
+ arrays[ArrayMesh.ARRAY_VERTEX] = PoolVector3Array()
+ arrays[ArrayMesh.ARRAY_NORMAL] = PoolVector3Array()
+ arrays[ArrayMesh.ARRAY_TEX_UV] = PoolVector2Array()
+ arrays[ArrayMesh.ARRAY_INDEX] = PoolIntArray()
+
+ return arrays
+
+# There are probably better ways to do this
+static func should_flip_reflected_triangle(v0 : Vector3, v1 : Vector3, v2 : Vector3) -> bool:
+ var reflected : Vector3 = reflect_vertex(v0, v1, v2)
+ var nn : Vector3 = get_face_normal(v0, v1, v2)
+
+ return should_triangle_flip(v0, v1, reflected, nn)
+
+static func reflect_vertex(v0 : Vector3, v1 : Vector3, v2 : Vector3) -> Vector3:
+ return (v2 - v0).reflect((v1 - v0).normalized()) + v0
+
+static func get_face_normal_arr_ti(verts : PoolVector3Array, indices : PoolIntArray, triangle_index : int, flipped : bool = false) -> Vector3:
+ return get_face_normal_arr(verts, indices, triangle_index * 3, flipped)
+
+static func get_face_normal_arr(verts : PoolVector3Array, indices : PoolIntArray, index : int, flipped : bool = false) -> Vector3:
+ var v0 : Vector3 = verts[indices[index]]
+ var v1 : Vector3 = verts[indices[index + 1]]
+ var v2 : Vector3 = verts[indices[index + 2]]
+
+ return get_face_normal(v0, v1, v2, flipped)
+
+static func get_face_normal(v0 : Vector3, v1 : Vector3, v2 : Vector3, flipped : bool = false) -> Vector3:
+ if !flipped:
+ return Plane(v0, v1, v2).normal
+ else:
+ return Plane(v2, v1, v0).normal
+
+static func should_triangle_flip(v0 : Vector3, v1 : Vector3, v2 : Vector3, similar_dir_normal : Vector3) -> bool:
+ var normal : Vector3 = get_face_normal(v0, v1, v2)
+
+ var ndns : float = normal.dot(similar_dir_normal)
+
+ return ndns < 0
+
+static func is_normal_similar(v0 : Vector3, v1 : Vector3, v2 : Vector3, similar_dir_normal : Vector3) -> bool:
+ var normal : Vector3 = get_face_normal(v0, v1, v2)
+
+ var ndns : float = normal.dot(similar_dir_normal)
+
+ return ndns >= 0
+
+static func is_direction_similar(d0 : Vector3, d1 : Vector3) -> bool:
+ var ndns : float = d0.dot(d1)
+ return ndns >= 0
+
+static func flip_triangle_ti(mdr : MeshDataResource, triangle_index : int) -> void:
+ flip_triangle(mdr, triangle_index * 3)
+
+static func flip_triangle(mdr : MeshDataResource, index : int) -> void:
+ var arrays : Array = mdr.get_array()
+
+ if arrays.size() != ArrayMesh.ARRAY_MAX:
+ arrays.resize(ArrayMesh.ARRAY_MAX)
+
+ if arrays[ArrayMesh.ARRAY_INDEX] == null:
+ return
+
+ var indices : PoolIntArray = arrays[ArrayMesh.ARRAY_INDEX]
+
+ var i0 : int = indices[index]
+ var i2 : int = indices[index + 2]
+
+ indices[index] = i2
+ indices[index + 2] = i0
+
+ arrays[ArrayMesh.ARRAY_INDEX] = indices
+
+ mdr.set_array(arrays)
+
+static func add_into_surface_tool(mdr : MeshDataResource, st : SurfaceTool) -> void:
+ var arrays : Array = mdr.get_array()
+
+ if arrays.size() != ArrayMesh.ARRAY_MAX:
+ arrays.resize(ArrayMesh.ARRAY_MAX)
+
+ var vertices : PoolVector3Array
+ var normals : PoolVector3Array
+ var tangents : PoolRealArray
+ var colors : PoolColorArray
+ var uv : PoolVector2Array
+ var uv2 : PoolVector2Array
+ var bones : PoolRealArray
+ var weights : PoolRealArray
+ var indices : PoolIntArray
+
+ if arrays[ArrayMesh.ARRAY_VERTEX] != null:
+ vertices = arrays[ArrayMesh.ARRAY_VERTEX]
+
+ if arrays[ArrayMesh.ARRAY_NORMAL] != null:
+ normals = arrays[ArrayMesh.ARRAY_NORMAL]
+
+ if arrays[ArrayMesh.ARRAY_TANGENT] != null:
+ tangents = arrays[ArrayMesh.ARRAY_TANGENT]
+
+ if arrays[ArrayMesh.ARRAY_COLOR] != null:
+ colors = arrays[ArrayMesh.ARRAY_COLOR]
+
+ if arrays[ArrayMesh.ARRAY_TEX_UV] != null:
+ uv = arrays[ArrayMesh.ARRAY_TEX_UV]
+
+ if arrays[ArrayMesh.ARRAY_TEX_UV2] != null:
+ uv2 = arrays[ArrayMesh.ARRAY_TEX_UV2]
+
+ if arrays[ArrayMesh.ARRAY_BONES] != null:
+ bones = arrays[ArrayMesh.ARRAY_BONES]
+
+ if arrays[ArrayMesh.ARRAY_WEIGHTS] != null:
+ weights = arrays[ArrayMesh.ARRAY_WEIGHTS]
+
+ if arrays[ArrayMesh.ARRAY_INDEX] != null:
+ indices = arrays[ArrayMesh.ARRAY_INDEX]
+
+ for i in range(vertices.size()):
+ if normals.size() > 0:
+ st.add_normal(normals[i])
+
+ if tangents.size() > 0:
+ var ti : int = i * 4
+ st.add_tangent(Plane(tangents[ti], tangents[ti + 1], tangents[ti + 2], tangents[ti + 3]))
+
+ if colors.size() > 0:
+ st.add_color(colors[i])
+
+ if uv.size() > 0:
+ st.add_uv(uv[i])
+
+ if uv2.size() > 0:
+ st.add_uv2(uv2[i])
+
+ if bones.size() > 0:
+ var bi : int = i * 4
+
+ var pia : PoolIntArray = PoolIntArray()
+
+ pia.append(bones[bi])
+ pia.append(bones[bi + 1])
+ pia.append(bones[bi + 1])
+ pia.append(bones[bi + 1])
+
+ st.add_bones(pia)
+
+ if weights.size() > 0:
+ var bi : int = i * 4
+
+ var pia : PoolIntArray = PoolIntArray()
+
+ pia.append(bones[bi])
+ pia.append(bones[bi + 1])
+ pia.append(bones[bi + 2])
+ pia.append(bones[bi + 3])
+
+ st.add_weight(pia)
+
+ st.add_vertex(vertices[i])
+
+ for ind in indices:
+ st.add_index(ind)
+
+static func generate_normals_arrs(arrays : Array) -> Array:
+ if arrays.size() != ArrayMesh.ARRAY_MAX:
+ arrays.resize(ArrayMesh.ARRAY_MAX)
+
+ if arrays[ArrayMesh.ARRAY_INDEX] == null:
+ return arrays
+
+
+ if arrays.size() != ArrayMesh.ARRAY_MAX:
+ arrays.resize(ArrayMesh.ARRAY_MAX)
+
+ var vertices : PoolVector3Array = arrays[ArrayMesh.ARRAY_VERTEX]
+ var indices : PoolIntArray = arrays[ArrayMesh.ARRAY_INDEX]
+ var normals : PoolVector3Array = PoolVector3Array()
+ normals.resize(vertices.size())
+ var nc : PoolIntArray = PoolIntArray()
+ nc.resize(vertices.size())
+
+ for i in range(vertices.size()):
+ nc[i] = 0
+
+ for i in range(0, indices.size(), 3):
+ var i0 : int = indices[i]
+ var i1 : int = indices[i + 1]
+ var i2 : int = indices[i + 2]
+
+ var v0 : Vector3 = vertices[i0]
+ var v1 : Vector3 = vertices[i1]
+ var v2 : Vector3 = vertices[i2]
+
+ var n = Plane(v0, v1, v2).normal
+
+ if n.is_equal_approx(Vector3()):
+ print("Warning face's normal is zero! " + str(Vector3(i0, i1, i2)))
+ n = Vector3(0, 0, 1)
+
+ if nc[i0] == 0:
+ nc[i0] = 1
+ normals[i0] = n
+ else:
+ normals[i0] = lerp(normals[i0], n, 0.5).normalized()
+
+ if nc[i1] == 0:
+ nc[i1] = 1
+ normals[i1] = n
+ else:
+ normals[i1] = lerp(normals[i1], n, 0.5).normalized()
+
+ if nc[i2] == 0:
+ nc[i2] = 1
+ normals[i2] = n
+ else:
+ normals[i2] = lerp(normals[i2], n, 0.5).normalized()
+
+ arrays[ArrayMesh.ARRAY_NORMAL] = normals
+
+ return arrays
+
+
+static func generate_normals_mdr(mdr : MeshDataResource) -> void:
+ var arrays : Array = mdr.get_array()
+
+ if arrays.size() != ArrayMesh.ARRAY_MAX:
+ arrays.resize(ArrayMesh.ARRAY_MAX)
+
+ if arrays[ArrayMesh.ARRAY_INDEX] == null:
+ return
+
+ if arrays.size() != ArrayMesh.ARRAY_MAX:
+ arrays.resize(ArrayMesh.ARRAY_MAX)
+
+ var vertices : PoolVector3Array = arrays[ArrayMesh.ARRAY_VERTEX]
+ var indices : PoolIntArray = arrays[ArrayMesh.ARRAY_INDEX]
+ var normals : PoolVector3Array = PoolVector3Array()
+ normals.resize(vertices.size())
+ var nc : PoolIntArray = PoolIntArray()
+ nc.resize(vertices.size())
+
+ for i in range(vertices.size()):
+ nc[i] = 0
+
+ for i in range(0, indices.size(), 3):
+ var i0 : int = indices[i]
+ var i1 : int = indices[i + 1]
+ var i2 : int = indices[i + 2]
+
+ var v0 : Vector3 = vertices[i0]
+ var v1 : Vector3 = vertices[i1]
+ var v2 : Vector3 = vertices[i2]
+
+ var n = Plane(v0, v1, v2).normal
+
+ if n.is_equal_approx(Vector3()):
+ print("Warning face's normal is zero! " + str(Vector3(i0, i1, i2)))
+ n = Vector3(0, 0, 1)
+
+ if nc[i0] == 0:
+ nc[i0] = 1
+ normals[i0] = n
+ else:
+ normals[i0] = lerp(normals[i0], n, 0.5).normalized()
+
+ if nc[i1] == 0:
+ nc[i1] = 1
+ normals[i1] = n
+ else:
+ normals[i1] = lerp(normals[i1], n, 0.5).normalized()
+
+ if nc[i2] == 0:
+ nc[i2] = 1
+ normals[i2] = n
+ else:
+ normals[i2] = lerp(normals[i2], n, 0.5).normalized()
+
+ arrays[ArrayMesh.ARRAY_NORMAL] = normals
+ mdr.array = arrays
+
+# Apparently surfacetool adds more verts during normal generation
+# Keeping this here for now
+static func generate_normals_surface_tool(mdr : MeshDataResource) -> void:
+ var arrays : Array = mdr.get_array()
+
+ if arrays.size() != ArrayMesh.ARRAY_MAX:
+ arrays.resize(ArrayMesh.ARRAY_MAX)
+
+ if arrays[ArrayMesh.ARRAY_INDEX] == null:
+ return
+
+ var st : SurfaceTool = SurfaceTool.new()
+ st.begin(Mesh.PRIMITIVE_TRIANGLES)
+
+ add_into_surface_tool(mdr, st)
+
+ st.generate_normals()
+
+ mdr.array = st.commit_to_arrays()
+
+static func generate_tangents(mdr : MeshDataResource) -> void:
+ var arrays : Array = mdr.get_array()
+
+ if arrays.size() != ArrayMesh.ARRAY_MAX:
+ arrays.resize(ArrayMesh.ARRAY_MAX)
+
+ if arrays[ArrayMesh.ARRAY_INDEX] == null:
+ return
+
+ var st : SurfaceTool = SurfaceTool.new()
+ st.begin(Mesh.PRIMITIVE_TRIANGLES)
+
+ add_into_surface_tool(mdr, st)
+
+ st.generate_tangents()
+
+ mdr.array = st.commit_to_arrays()
+
+static func remove_used_vertices(arrays : Array) -> Array:
+ if arrays.size() != ArrayMesh.ARRAY_MAX:
+ return arrays
+
+ if arrays[ArrayMesh.ARRAY_VERTEX] == null || arrays[ArrayMesh.ARRAY_INDEX] == null:
+ return arrays
+
+ var vert_size : int = arrays[ArrayMesh.ARRAY_VERTEX].size()
+ var indices : PoolIntArray = arrays[ArrayMesh.ARRAY_INDEX]
+ var unused_indices : PoolIntArray = PoolIntArray()
+
+ for i in range(vert_size):
+ if !pool_int_arr_contains(indices, i):
+ unused_indices.append(i)
+
+ remove_vertices(arrays, unused_indices)
+
+ return arrays
+
+
+static func remove_vertices(arrays : Array, indices : PoolIntArray) -> Array:
+ if indices.size() == 0:
+ return arrays
+
+ var vertices : PoolVector3Array = arrays[ArrayMesh.ARRAY_VERTEX]
+
+ var normals : PoolVector3Array
+ var tangents : PoolRealArray
+ var colors : PoolColorArray
+ var uv : PoolVector2Array
+ var uv2 : PoolVector2Array
+ var bones : PoolRealArray
+ var weights : PoolRealArray
+
+ if arrays[ArrayMesh.ARRAY_NORMAL] != null:
+ normals = arrays[ArrayMesh.ARRAY_NORMAL]
+
+ if arrays[ArrayMesh.ARRAY_TANGENT] != null:
+ tangents = arrays[ArrayMesh.ARRAY_TANGENT]
+
+ if arrays[ArrayMesh.ARRAY_COLOR] != null:
+ colors = arrays[ArrayMesh.ARRAY_COLOR]
+
+ if arrays[ArrayMesh.ARRAY_TEX_UV] != null:
+ uv = arrays[ArrayMesh.ARRAY_TEX_UV]
+
+ if arrays[ArrayMesh.ARRAY_TEX_UV2] != null:
+ uv2 = arrays[ArrayMesh.ARRAY_TEX_UV2]
+
+ if arrays[ArrayMesh.ARRAY_BONES] != null:
+ bones = arrays[ArrayMesh.ARRAY_BONES]
+
+ if arrays[ArrayMesh.ARRAY_WEIGHTS] != null:
+ weights = arrays[ArrayMesh.ARRAY_WEIGHTS]
+
+ for index in indices:
+ vertices.remove(index)
+
+ if arrays[ArrayMesh.ARRAY_NORMAL] != null:
+ normals.remove(index)
+
+ if arrays[ArrayMesh.ARRAY_TANGENT] != null:
+ var tindex : int = index * 4
+
+ tangents.remove(tindex)
+ tangents.remove(tindex)
+ tangents.remove(tindex)
+ tangents.remove(tindex)
+
+ if arrays[ArrayMesh.ARRAY_COLOR] != null:
+ colors.remove(index)
+
+ if arrays[ArrayMesh.ARRAY_TEX_UV] != null:
+ uv.remove(index)
+
+ if arrays[ArrayMesh.ARRAY_TEX_UV2] != null:
+ uv2.remove(index)
+
+ if arrays[ArrayMesh.ARRAY_BONES] != null:
+ bones.remove(index)
+ bones.remove(index)
+ bones.remove(index)
+ bones.remove(index)
+
+ if arrays[ArrayMesh.ARRAY_WEIGHTS] != null:
+ weights.remove(index)
+ weights.remove(index)
+ weights.remove(index)
+ weights.remove(index)
+
+ #write back
+ arrays[ArrayMesh.ARRAY_VERTEX] = vertices
+
+ if arrays[ArrayMesh.ARRAY_NORMAL] != null:
+ arrays[ArrayMesh.ARRAY_NORMAL] = normals
+
+ if arrays[ArrayMesh.ARRAY_TANGENT] != null:
+ arrays[ArrayMesh.ARRAY_TANGENT] = tangents
+
+ if arrays[ArrayMesh.ARRAY_COLOR] != null:
+ arrays[ArrayMesh.ARRAY_COLOR] = colors
+
+ if arrays[ArrayMesh.ARRAY_TEX_UV] != null:
+ arrays[ArrayMesh.ARRAY_TEX_UV] = uv
+
+ if arrays[ArrayMesh.ARRAY_TEX_UV2] != null:
+ arrays[ArrayMesh.ARRAY_TEX_UV2] = uv2
+
+ if arrays[ArrayMesh.ARRAY_BONES] != null:
+ arrays[ArrayMesh.ARRAY_BONES] = bones
+
+ if arrays[ArrayMesh.ARRAY_WEIGHTS] != null:
+ arrays[ArrayMesh.ARRAY_WEIGHTS] = weights
+
+ if arrays[ArrayMesh.ARRAY_INDEX] == null:
+ return arrays
+
+ #udpate indices
+ var arr_indices : PoolIntArray = arrays[ArrayMesh.ARRAY_INDEX]
+
+ var max_index : int = find_max(indices)
+
+ for k in range(indices.size()):
+ for i in range(arr_indices.size()):
+ var ai : int = arr_indices[i]
+
+ if ai >= max_index:
+ arr_indices[i] = ai - 1
+
+ max_index = find_max_capped(indices, max_index)
+
+ arrays[ArrayMesh.ARRAY_INDEX] = arr_indices
+
+ return arrays
+
+static func find_max(arr : PoolIntArray) -> int:
+ var m : int = arr[0]
+
+ for v in arr:
+ if v > m:
+ m = v
+
+ return m
+
+static func find_max_capped(arr : PoolIntArray, last : int) -> int:
+ var m : int = 0
+
+ for v in arr:
+ if v < last:
+ m = v
+ break
+
+ for v in arr:
+ if v > m && v < last:
+ m = v
+
+ return m
+
+static func order_seam_indices(arr : PoolIntArray) -> PoolIntArray:
+ var ret : PoolIntArray = PoolIntArray()
+
+ if arr.size() == 0:
+ return ret
+
+ for i in range(0, arr.size(), 2):
+ var index0 : int = arr[i]
+ var index1 : int = arr[i + 1]
+
+ if index0 > index1:
+ var t : int = index1
+ index1 = index0
+ index0 = t
+
+ ret.push_back(index0)
+ ret.push_back(index1)
+
+ return ret
+
+static func add_seam_not_ordered(mdr : MeshDataResource, index0 : int, index1 : int) -> void:
+ if index0 > index1:
+ add_seam(mdr, index1, index0)
+ else:
+ add_seam(mdr, index0, index1)
+
+static func remove_seam_not_ordered(mdr : MeshDataResource, index0 : int, index1 : int) -> void:
+ if index0 > index1:
+ remove_seam(mdr, index1, index0)
+ else:
+ remove_seam(mdr, index0, index1)
+
+static func has_seam(mdr : MeshDataResource, index0 : int, index1 : int) -> bool:
+ var seams : PoolIntArray = mdr.seams
+
+ for i in range(0, seams.size(), 2):
+ if seams[i] == index0 && seams[i + 1] == index1:
+ return true
+
+ return false
+
+static func add_seam(mdr : MeshDataResource, index0 : int, index1 : int) -> void:
+ if has_seam(mdr, index0, index1):
+ return
+
+ var seams : PoolIntArray = mdr.seams
+ seams.push_back(index0)
+ seams.push_back(index1)
+ mdr.seams = seams
+
+static func remove_seam(mdr : MeshDataResource, index0 : int, index1 : int) -> void:
+ if !has_seam(mdr, index0, index1):
+ return
+
+ var seams : PoolIntArray = mdr.seams
+
+ for i in range(0, seams.size(), 2):
+ if seams[i] == index0 && seams[i + 1] == index1:
+ seams.remove(i)
+ seams.remove(i)
+ mdr.seams = seams
+ return
+
+static func is_verts_equal(v0 : Vector3, v1 : Vector3) -> bool:
+ return is_equal_approx(v0.x, v1.x) && is_equal_approx(v0.y, v1.y) && is_equal_approx(v0.z, v1.z)
+
+
+static func points_to_seams(mdr : MeshDataResource, points : PoolVector3Array) -> void:
+ var arrays : Array = mdr.get_array()
+
+ if arrays.size() != ArrayMesh.ARRAY_MAX:
+ return
+
+ if arrays[ArrayMesh.ARRAY_VERTEX] == null:
+ return
+
+ var vertices : PoolVector3Array = arrays[ArrayMesh.ARRAY_VERTEX]
+ var indices : PoolIntArray = arrays[ArrayMesh.ARRAY_INDEX]
+ var seams : PoolIntArray = PoolIntArray()
+
+ for i in range(0, points.size(), 2):
+ var p0 : Vector3 = points[i]
+ var p1 : Vector3 = points[i + 1]
+
+ for j in range(0, indices.size(), 3):
+ var v0 : Vector3 = vertices[indices[j]]
+ var v1 : Vector3 = vertices[indices[j + 1]]
+ var v2 : Vector3 = vertices[indices[j + 2]]
+
+ var p0_index : int = -1
+
+ if is_verts_equal(p0, v0):
+ p0_index = indices[j]
+ elif is_verts_equal(p0, v1):
+ p0_index = indices[j + 1]
+ elif is_verts_equal(p0, v2):
+ p0_index = indices[j + 2]
+
+ if p0_index == -1:
+ continue
+
+ var p1_index : int = -1
+
+ if is_verts_equal(p1, v0):
+ p1_index = indices[j]
+ elif is_verts_equal(p1, v1):
+ p1_index = indices[j + 1]
+ elif is_verts_equal(p1, v2):
+ p1_index = indices[j + 2]
+
+ if p1_index == -1:
+ continue
+
+ if p0_index == p1_index:
+ continue
+
+ if p0_index > p1_index:
+ var t : int = p0_index
+ p0_index = p1_index
+ p1_index = t
+
+ seams.push_back(p0_index)
+ seams.push_back(p1_index)
+ break
+
+ mdr.seams = seams
+
+static func seams_to_points(mdr : MeshDataResource) -> PoolVector3Array:
+ var points : PoolVector3Array = PoolVector3Array()
+
+ var arrays : Array = mdr.get_array()
+
+ if arrays.size() != ArrayMesh.ARRAY_MAX:
+ return points
+
+ if arrays[ArrayMesh.ARRAY_VERTEX] == null:
+ return points
+
+ var vertices : PoolVector3Array = arrays[ArrayMesh.ARRAY_VERTEX]
+ var seams : PoolIntArray = mdr.seams
+
+ for s in seams:
+ points.push_back(vertices[s])
+
+ return points
+
+static func is_matching_seam(i0 : int, i1: int, si0 : int, si1: int) -> bool:
+ if i0 > i1:
+ var t : int = i0
+ i0 = i1
+ i1 = t
+
+ return (i0 == si0) && (i1 == si1)
+
+static func pool_int_arr_contains(arr : PoolIntArray, val : int) -> bool:
+ for a in arr:
+ if a == val:
+ return true
+
+ return false
+
+
+class SeamTriangleHelper:
+ var i0 : int = 0
+ var i1 : int = 0
+ var i2 : int = 0
+ var orig_index : int = 0
+ var index_index : int = 0
+
+ var side_index_1 : int = 0
+ var side_index_2 : int = 0
+ var side_index_1_cut : bool = false
+ var side_index_2_cut : bool = false
+
+ var processed : bool = false
+
+ func get_other_side_index(index : int) -> int:
+ if side_index_1 == index:
+ return side_index_2
+ else:
+ return side_index_1
+
+ func get_side_index(i : int) -> int:
+ if i == 1:
+ return side_index_1
+ else:
+ return side_index_2
+
+ func get_side_index_cut() -> int:
+ if side_index_1_cut && side_index_2_cut:
+ return 3
+ elif side_index_1_cut:
+ return 1
+ elif side_index_2_cut:
+ return 2
+ else:
+ return 0
+
+ func get_opposite_side_index_cut() -> int:
+ if side_index_1_cut && side_index_2_cut:
+ return 3
+ elif side_index_1_cut:
+ return 2
+ elif side_index_2_cut:
+ return 1
+ else:
+ return 0
+
+ func is_side_index_cut(i : int) -> bool:
+ if i == 1:
+ return side_index_1_cut
+ else:
+ return side_index_2_cut
+
+ func is_the_same(h : SeamTriangleHelper) -> bool:
+ return is_triangle(h.i0, h.i1, h.i2)
+
+ func is_triangle(pi0 : int, pi1 : int, pi2 : int) -> bool:
+ if pi0 == i0 || pi0 == i1 || pi0 == i2:
+ if pi1 == i0 || pi1 == i1 || pi1 == i2:
+ if pi2 == i0 || pi2 == i1 || pi2 == i2:
+ return true
+
+ return false
+
+ func is_neighbour_to(index : int) -> bool:
+ return (side_index_1 == index) || (side_index_2 == index)
+
+ func needs_to_be_cut_near(index : int) -> bool:
+ if (side_index_1 == index):
+ return side_index_1_cut
+
+ if (side_index_2 == index):
+ return side_index_2_cut
+
+ return false
+
+ func has_cut() -> bool:
+ return side_index_1_cut || side_index_2_cut
+
+ func both_sides_need_cut() -> bool:
+ return side_index_1_cut && side_index_2_cut
+
+ func setup(pi0 : int, pi1 : int, pi2 : int, porig_ind : int, pindex_index : int, seams : PoolIntArray) -> void:
+ processed = false
+ i0 = pi0
+ i1 = pi1
+ i2 = pi2
+ orig_index = porig_ind
+ index_index = pindex_index
+
+ if porig_ind == pi0:
+ side_index_1 = pi1
+ side_index_2 = pi2
+ elif porig_ind == pi1:
+ side_index_1 = pi0
+ side_index_2 = pi2
+ elif porig_ind == pi2:
+ side_index_1 = pi1
+ side_index_2 = pi0
+
+ determine_cuts(seams)
+
+ func determine_cuts(seams : PoolIntArray) -> void:
+ if orig_index < side_index_1:
+ side_index_1_cut = check_cut(orig_index, side_index_1, seams)
+ else:
+ side_index_1_cut = check_cut(side_index_1, orig_index, seams)
+
+ if orig_index < side_index_2:
+ side_index_2_cut = check_cut(orig_index, side_index_2, seams)
+ else:
+ side_index_2_cut = check_cut(side_index_2, orig_index, seams)
+
+ func check_cut(ind0 : int, ind1 : int, seams : PoolIntArray) -> bool:
+ for stind in range(0, seams.size(), 2):
+ var si0 : int = seams[stind]
+ var si1 : int = seams[stind + 1]
+
+ if (si0 == ind0) && (si1 == ind1):
+ return true
+
+ return false
+
+ func _to_string():
+ return "[ TRI: " + str(i0) + ", " + str(i1) + ", " + str(i2) + " ]"
+
+static func apply_seam(mdr : MeshDataResource) -> void:
+ var points : PoolVector3Array = PoolVector3Array()
+
+ var arrays : Array = mdr.get_array()
+
+ if arrays.size() != ArrayMesh.ARRAY_MAX:
+ return
+
+ if arrays[ArrayMesh.ARRAY_VERTEX] == null:
+ return
+
+ var vertices : PoolVector3Array = arrays[ArrayMesh.ARRAY_VERTEX]
+ var indices : PoolIntArray = arrays[ArrayMesh.ARRAY_INDEX]
+ var new_indices : PoolIntArray = PoolIntArray()
+ new_indices.append_array(indices)
+
+ var seams : PoolIntArray = mdr.seams
+
+ # Duplication happens later, as it requires lots of logic
+ var duplicate_verts_indices : PoolIntArray = PoolIntArray()
+ var new_vert_size : int = vertices.size()
+
+ for i in range(vertices.size()):
+ # first check if vertex is a part of at least 2 edge seams
+ var test_seam_count : int = 0
+ for s in seams:
+ if s == i:
+ test_seam_count += 1
+
+ if test_seam_count >= 2:
+ break
+
+ if test_seam_count < 2:
+ continue
+
+ # Collect all triangles that use this vertex as SeamTriangleHelpers
+ var triangles : Array = Array()
+ for j in range(indices.size()):
+ var i0 : int = indices[j]
+
+ if i0 != i:
+ continue
+
+ var tri_j_offset : int = j % 3
+ var tri_start_index : int = j - tri_j_offset
+
+ var i1 : int = indices[tri_start_index + ((tri_j_offset + 1) % 3)]
+ var i2 : int = indices[tri_start_index + ((tri_j_offset + 2) % 3)]
+
+ var s : SeamTriangleHelper = SeamTriangleHelper.new()
+ s.setup(i0, i1, i2, i0, j, seams)
+ triangles.push_back(s)
+
+ var triangle_arrays : Array = Array()
+ while true:
+ # First find a triangle that needs to be cut
+ var tri : SeamTriangleHelper = null
+ var tri_index : int = -1
+ for it in range(triangles.size()):
+ tri = triangles[it]
+
+ if tri.has_cut() && !tri.processed:
+ tri_index = it
+ break
+
+ if tri_index == -1:
+ #done
+ break
+
+ tri.processed = true
+
+ if tri.both_sides_need_cut():
+ triangle_arrays.push_back([ tri ])
+ continue
+
+ var collected_triangles : Array = Array()
+ collected_triangles.push_back(tri)
+
+ # Find all neighbours and set them to processed + update the index for them
+ #var side_index : int = tri.get_side_index_cut()
+ var neighbour_tri : SeamTriangleHelper = tri
+ var find_neighbour_for_edge_index : int = tri.get_opposite_side_index_cut()
+ var find_neighbour_for_edge : int = neighbour_tri.get_side_index(find_neighbour_for_edge_index)
+ var tri_found : bool = true
+ while tri_found:
+ tri_found = false
+
+ for ntri in triangles:
+ if ntri.processed:
+ continue
+
+ if ntri.is_the_same(neighbour_tri):
+ continue
+
+ if ntri.is_neighbour_to(find_neighbour_for_edge):
+ neighbour_tri = ntri
+ find_neighbour_for_edge = neighbour_tri.get_other_side_index(find_neighbour_for_edge)
+
+ neighbour_tri.processed = true
+ tri_found = true
+ collected_triangles.push_back(neighbour_tri)
+
+ if neighbour_tri.has_cut():
+ # Done with this "strip"
+ tri_found = false
+
+ break
+
+ triangle_arrays.push_back(collected_triangles)
+
+ # triangle_arrays is guaranteed to have at least 2 entries
+ # Skip processing the first strip, so we don't create unused verts
+ for tind in range(1, triangle_arrays.size()):
+ var tris : Array = triangle_arrays[tind]
+
+ duplicate_verts_indices.push_back(tris[0].orig_index)
+
+ for tri in tris:
+ new_indices[tri.index_index] = new_vert_size
+
+ new_vert_size += 1
+
+ arrays[ArrayMesh.ARRAY_INDEX] = new_indices
+
+ mdr.array = seam_apply_duplicate_vertices(arrays, duplicate_verts_indices)
+
+
+static func apply_seam_old(mdr : MeshDataResource) -> void:
+ var points : PoolVector3Array = PoolVector3Array()
+
+ var arrays : Array = mdr.get_array()
+
+ if arrays.size() != ArrayMesh.ARRAY_MAX:
+ return
+
+ if arrays[ArrayMesh.ARRAY_VERTEX] == null:
+ return
+
+ var vertices : PoolVector3Array = arrays[ArrayMesh.ARRAY_VERTEX]
+ var indices : PoolIntArray = arrays[ArrayMesh.ARRAY_INDEX]
+
+ var seams : PoolIntArray = mdr.seams
+
+ # Duplication happens later, as it requires lots of logic
+ var duplicate_verts_indices : PoolIntArray = PoolIntArray()
+ var new_vert_size : int = vertices.size()
+
+ for i in range(0, seams.size(), 2):
+ var si0 : int = seams[i]
+ var si1 : int = seams[i + 1]
+
+ var first : bool = true
+ for j in range(0, indices.size(), 3):
+ var i0 : int = indices[j]
+ var i1 : int = indices[j + 1]
+ var i2 : int = indices[j + 2]
+
+ var edge_int_tri_index : int = -1
+
+ if is_matching_seam(i0, i1, si0, si1):
+ edge_int_tri_index = 0
+ elif is_matching_seam(i1, i2, si0, si1):
+ edge_int_tri_index = 1
+ elif is_matching_seam(i2, i0, si0, si1):
+ edge_int_tri_index = 2
+
+ if edge_int_tri_index == -1:
+ continue
+
+ if first:
+ # Only split away the subsequent tris
+ first = false
+ continue
+
+ if edge_int_tri_index == 0:
+ duplicate_verts_indices.push_back(i0)
+ duplicate_verts_indices.push_back(i1)
+
+ indices.push_back(new_vert_size)
+ indices.push_back(new_vert_size + 1)
+ indices.push_back(i2)
+ elif edge_int_tri_index == 1:
+ duplicate_verts_indices.push_back(i1)
+ duplicate_verts_indices.push_back(i2)
+
+ indices.push_back(i0)
+ indices.push_back(new_vert_size)
+ indices.push_back(new_vert_size + 1)
+ elif edge_int_tri_index == 2:
+ duplicate_verts_indices.push_back(i0)
+ duplicate_verts_indices.push_back(i2)
+
+ indices.push_back(new_vert_size)
+ indices.push_back(i1)
+ indices.push_back(new_vert_size + 1)
+
+ indices.remove(j)
+ indices.remove(j)
+ indices.remove(j)
+ j -= 3
+
+ new_vert_size += 2
+
+ arrays[ArrayMesh.ARRAY_INDEX] = indices
+ #mdr.array = arrays
+
+ mdr.array = seam_apply_duplicate_vertices(arrays, duplicate_verts_indices)
+
+# This will not touch the indices!
+static func seam_apply_duplicate_vertices(arrays : Array, duplicate_verts_indices : PoolIntArray) -> Array:
+ var vertices : PoolVector3Array = arrays[ArrayMesh.ARRAY_VERTEX]
+
+ var normals : PoolVector3Array
+ var tangents : PoolRealArray
+ var colors : PoolColorArray
+ var uv : PoolVector2Array
+ var uv2 : PoolVector2Array
+ var bones : PoolRealArray
+ var weights : PoolRealArray
+
+ if arrays[ArrayMesh.ARRAY_NORMAL] != null:
+ normals = arrays[ArrayMesh.ARRAY_NORMAL]
+
+ if arrays[ArrayMesh.ARRAY_TANGENT] != null:
+ tangents = arrays[ArrayMesh.ARRAY_TANGENT]
+
+ if arrays[ArrayMesh.ARRAY_COLOR] != null:
+ colors = arrays[ArrayMesh.ARRAY_COLOR]
+
+ if arrays[ArrayMesh.ARRAY_TEX_UV] != null:
+ uv = arrays[ArrayMesh.ARRAY_TEX_UV]
+
+ if arrays[ArrayMesh.ARRAY_TEX_UV2] != null:
+ uv2 = arrays[ArrayMesh.ARRAY_TEX_UV2]
+
+ if arrays[ArrayMesh.ARRAY_BONES] != null:
+ bones = arrays[ArrayMesh.ARRAY_BONES]
+
+ if arrays[ArrayMesh.ARRAY_WEIGHTS] != null:
+ weights = arrays[ArrayMesh.ARRAY_WEIGHTS]
+
+
+ for index in duplicate_verts_indices:
+ vertices.push_back(vertices[index])
+
+ if arrays[ArrayMesh.ARRAY_NORMAL] != null:
+ normals.push_back(normals[index])
+
+ if arrays[ArrayMesh.ARRAY_TANGENT] != null:
+ tangents.push_back(tangents[index])
+ tangents.push_back(tangents[index + 1])
+ tangents.push_back(tangents[index + 2])
+ tangents.push_back(tangents[index + 3])
+
+ if arrays[ArrayMesh.ARRAY_COLOR] != null:
+ colors.push_back(colors[index])
+
+ if arrays[ArrayMesh.ARRAY_TEX_UV] != null:
+ uv.push_back(uv[index])
+
+ if arrays[ArrayMesh.ARRAY_TEX_UV2] != null:
+ uv2.push_back(uv2[index])
+
+ if arrays[ArrayMesh.ARRAY_BONES] != null:
+ bones.push_back(bones[index])
+ bones.push_back(bones[index + 1])
+ bones.push_back(bones[index + 2])
+ bones.push_back(bones[index + 3])
+
+ if arrays[ArrayMesh.ARRAY_WEIGHTS] != null:
+ weights.push_back(weights[index])
+ weights.push_back(weights[index + 1])
+ weights.push_back(weights[index + 2])
+ weights.push_back(weights[index + 3])
+
+ #write back
+
+ arrays[ArrayMesh.ARRAY_VERTEX] = vertices
+
+ if arrays[ArrayMesh.ARRAY_NORMAL] != null:
+ arrays[ArrayMesh.ARRAY_NORMAL] = normals
+
+ if arrays[ArrayMesh.ARRAY_TANGENT] != null:
+ arrays[ArrayMesh.ARRAY_TANGENT] = tangents
+
+ if arrays[ArrayMesh.ARRAY_COLOR] != null:
+ arrays[ArrayMesh.ARRAY_COLOR] = colors
+
+ if arrays[ArrayMesh.ARRAY_TEX_UV] != null:
+ arrays[ArrayMesh.ARRAY_TEX_UV] = uv
+
+ if arrays[ArrayMesh.ARRAY_TEX_UV2] != null:
+ arrays[ArrayMesh.ARRAY_TEX_UV2] = uv2
+
+ if arrays[ArrayMesh.ARRAY_BONES] != null:
+ arrays[ArrayMesh.ARRAY_BONES] = bones
+
+ if arrays[ArrayMesh.ARRAY_WEIGHTS] != null:
+ arrays[ArrayMesh.ARRAY_WEIGHTS] = weights
+
+ return arrays
diff --git a/modules/mesh_data_resource/editor/addon/utilities/mesh_decompose.gd b/modules/mesh_data_resource/editor/addon/utilities/mesh_decompose.gd
new file mode 100644
index 000000000..f7d08c665
--- /dev/null
+++ b/modules/mesh_data_resource/editor/addon/utilities/mesh_decompose.gd
@@ -0,0 +1,263 @@
+tool
+extends Object
+
+#you can use MeshUtils.merge_mesh_array(arr) to get optimalized handle points. Just get the vertices from it.
+
+static func get_handle_vertex_to_vertex_map(arrays : Array, handle_points : PoolVector3Array) -> Array:
+ var handle_to_vertex_map : Array
+ handle_to_vertex_map.resize(handle_points.size())
+
+ if handle_points.size() == 0:
+ return handle_to_vertex_map
+
+ if arrays.size() != ArrayMesh.ARRAY_MAX || arrays[ArrayMesh.ARRAY_INDEX] == null:
+ return handle_to_vertex_map
+
+ var vertices : PoolVector3Array = arrays[ArrayMesh.ARRAY_VERTEX]
+
+ if vertices.size() == 0:
+ return handle_to_vertex_map
+
+ for i in range(handle_points.size()):
+ var hv : Vector3 = handle_points[i]
+ var iarr : PoolIntArray = PoolIntArray()
+
+ #find all verts that have the same position as the handle
+ for j in range(vertices.size()):
+ var vn : Vector3 = vertices[j]
+
+ if is_equal_approx(hv.x, vn.x) && is_equal_approx(hv.y, vn.y) && is_equal_approx(hv.z, vn.z):
+ iarr.append(j)
+
+ handle_to_vertex_map[i] = iarr
+
+ return handle_to_vertex_map
+
+#returns an array:
+#index 0 is the handle_points
+#index 1 is the handle_to_vertex_map
+static func get_handle_edge_to_vertex_map(arrays : Array) -> Array:
+ var handle_to_vertex_map : Array
+ var handle_points : PoolVector3Array
+
+ if arrays.size() != ArrayMesh.ARRAY_MAX || arrays[ArrayMesh.ARRAY_INDEX] == null:
+ return [ handle_points, handle_to_vertex_map ]
+
+ var vertices : PoolVector3Array = arrays[ArrayMesh.ARRAY_VERTEX]
+
+ if vertices.size() == 0:
+ return [ handle_points, handle_to_vertex_map ]
+
+ var arr : Array = Array()
+ arr.resize(ArrayMesh.ARRAY_MAX)
+ arr[ArrayMesh.ARRAY_VERTEX] = arrays[ArrayMesh.ARRAY_VERTEX]
+ arr[ArrayMesh.ARRAY_INDEX] = arrays[ArrayMesh.ARRAY_INDEX]
+
+ var optimized_arrays : Array = MeshUtils.merge_mesh_array(arr)
+ var optimized_verts : PoolVector3Array = optimized_arrays[ArrayMesh.ARRAY_VERTEX]
+ var optimized_indices : PoolIntArray = optimized_arrays[ArrayMesh.ARRAY_INDEX]
+
+ var vert_to_optimized_vert_map : Array = get_handle_vertex_to_vertex_map(arrays, optimized_verts)
+
+ var edge_map : Dictionary = Dictionary()
+
+ for i in range(0, optimized_indices.size(), 3):
+ for j in range(3):
+ var i0 : int = optimized_indices[i + j]
+ var i1 : int = optimized_indices[i + ((j + 1) % 3)]
+
+ var ei0 : int = min(i0, i1)
+ var ei1 : int = max(i0, i1)
+
+ if !edge_map.has(ei0):
+ edge_map[ei0] = PoolIntArray()
+
+ var etm : PoolIntArray = edge_map[ei0]
+
+ var found : bool = false
+ for e in etm:
+ if e == ei1:
+ found = true
+ break
+
+ if !found:
+ etm.append(ei1)
+ edge_map[ei0] = etm
+
+ for key in edge_map.keys():
+ var indices : PoolIntArray = edge_map[key]
+
+ for indx in indices:
+ var ei0 : int = key
+ var ei1 : int = indx
+
+ var v0 : Vector3 = optimized_verts[ei0]
+ var v1 : Vector3 = optimized_verts[ei1]
+
+ var emid : Vector3 = lerp(v0, v1, 0.5)
+ handle_points.append(emid)
+ var hindx : int = handle_points.size() - 1
+
+ var vm0 : PoolIntArray = vert_to_optimized_vert_map[ei0]
+ var vm1 : PoolIntArray = vert_to_optimized_vert_map[ei1]
+
+ var vm : PoolIntArray = PoolIntArray()
+ vm.append_array(vm0)
+
+ for vi in vm1:
+ var found : bool = false
+ for vit in vm:
+ if vi == vit:
+ found = true
+ break
+
+ if !found:
+ vm.append(vi)
+
+ handle_to_vertex_map.append(vm)
+
+ return [ handle_points, handle_to_vertex_map ]
+
+#returns an array:
+#index 0 is the handle_points
+#index 1 is the handle_to_vertex_map
+static func get_handle_face_to_vertex_map(arrays : Array) -> Array:
+ var handle_to_vertex_map : Array
+ var handle_points : PoolVector3Array
+
+ if arrays.size() != ArrayMesh.ARRAY_MAX || arrays[ArrayMesh.ARRAY_INDEX] == null:
+ return [ handle_points, handle_to_vertex_map ]
+
+ var vertices : PoolVector3Array = arrays[ArrayMesh.ARRAY_VERTEX]
+
+ if vertices.size() == 0:
+ return [ handle_points, handle_to_vertex_map ]
+
+ var arr : Array = Array()
+ arr.resize(ArrayMesh.ARRAY_MAX)
+ arr[ArrayMesh.ARRAY_VERTEX] = arrays[ArrayMesh.ARRAY_VERTEX]
+ arr[ArrayMesh.ARRAY_INDEX] = arrays[ArrayMesh.ARRAY_INDEX]
+
+ var optimized_arrays : Array = MeshUtils.merge_mesh_array(arr)
+ var optimized_verts : PoolVector3Array = optimized_arrays[ArrayMesh.ARRAY_VERTEX]
+ var optimized_indices : PoolIntArray = optimized_arrays[ArrayMesh.ARRAY_INDEX]
+
+ var vert_to_optimized_vert_map : Array = get_handle_vertex_to_vertex_map(arrays, optimized_verts)
+
+ for i in range(0, optimized_indices.size(), 3):
+ var i0 : int = optimized_indices[i + 0]
+ var i1 : int = optimized_indices[i + 1]
+ var i2 : int = optimized_indices[i + 2]
+
+ var v0 : Vector3 = optimized_verts[i0]
+ var v1 : Vector3 = optimized_verts[i1]
+ var v2 : Vector3 = optimized_verts[i2]
+
+ var pmid : Vector3 = v0 + v1 + v2
+ pmid /= 3
+ handle_points.append(pmid)
+
+ var vm0 : PoolIntArray = vert_to_optimized_vert_map[i0]
+ var vm1 : PoolIntArray = vert_to_optimized_vert_map[i1]
+ var vm2 : PoolIntArray = vert_to_optimized_vert_map[i2]
+
+ var vm : PoolIntArray = PoolIntArray()
+ vm.append_array(vm0)
+
+ for vi in vm1:
+ var found : bool = false
+ for vit in vm:
+ if vi == vit:
+ found = true
+ break
+
+ if !found:
+ vm.append(vi)
+
+ for vi in vm2:
+ var found : bool = false
+ for vit in vm:
+ if vi == vit:
+ found = true
+ break
+
+ if !found:
+ vm.append(vi)
+
+ handle_to_vertex_map.append(vm)
+
+ return [ handle_points, handle_to_vertex_map ]
+
+static func calculate_map_midpoints(mesh : Array, vertex_map : Array) -> PoolVector3Array:
+ return PoolVector3Array()
+
+static func pool_int_arr_contains(arr : PoolIntArray, val : int) -> bool:
+ for a in arr:
+ if a == val:
+ return true
+
+ return false
+
+static func partition_mesh(mdr : MeshDataResource) -> Array:
+ var partitions : Array = Array()
+
+ var arrays : Array = mdr.get_array()
+
+ if arrays.size() != ArrayMesh.ARRAY_MAX:
+ return partitions
+
+ if arrays[ArrayMesh.ARRAY_INDEX] == null:
+ return partitions
+
+ var indices : PoolIntArray = arrays[ArrayMesh.ARRAY_INDEX]
+
+ var triangle_count : int = indices.size() / 3
+ var processed_triangles : PoolIntArray = PoolIntArray()
+
+ while triangle_count != processed_triangles.size():
+ var partition : PoolIntArray = PoolIntArray()
+
+ var first : bool = true
+ var triangle_added : bool = true
+ while triangle_added:
+ triangle_added = false
+ for i in range(indices.size()):
+ var triangle_index : int = i / 3
+
+ if pool_int_arr_contains(processed_triangles, triangle_index):
+ continue
+
+ if first:
+ first = false
+
+ # We have to be at the 0th index of a triangle
+ partition.append(indices[i])
+ partition.append(indices[i + 1])
+ partition.append(indices[i + 2])
+
+ triangle_added = true
+ break
+
+ var index : int = indices[i]
+
+ if pool_int_arr_contains(partition, index):
+ processed_triangles.append(triangle_index)
+
+ var tri_start_index : int = i - (i % 3)
+
+ var i0 : int = indices[tri_start_index]
+ var i1 : int = indices[tri_start_index + 1]
+ var i2 : int = indices[tri_start_index + 2]
+
+ partition.append(i0)
+ partition.append(i1)
+ partition.append(i2)
+
+ triangle_added = true
+ break
+
+
+ partitions.append(partition)
+
+
+ return partitions
diff --git a/modules/mesh_data_resource/editor/addon/utilities/mesh_outline.gd b/modules/mesh_data_resource/editor/addon/utilities/mesh_outline.gd
new file mode 100644
index 000000000..a32ddf795
--- /dev/null
+++ b/modules/mesh_data_resource/editor/addon/utilities/mesh_outline.gd
@@ -0,0 +1,167 @@
+tool
+extends Reference
+
+var marker_size : float = 0.05
+
+var _mdr : MeshDataResource
+
+var lines : PoolVector3Array
+var seam_lines : PoolVector3Array
+
+var _vertices : PoolVector3Array = PoolVector3Array()
+var _normals : PoolVector3Array = PoolVector3Array()
+var _indices : PoolIntArray = PoolIntArray()
+
+func setup(mdr : MeshDataResource) -> void:
+ _mdr = mdr
+
+func reset() -> void:
+ lines.resize(0)
+ seam_lines.resize(0)
+ _normals.resize(0)
+ _vertices.resize(0)
+ _indices.resize(0)
+
+func initialize() -> bool:
+ if !_mdr:
+ return false
+
+ if _mdr.array.size() != ArrayMesh.ARRAY_MAX:
+ return false
+
+ if _mdr.array[ArrayMesh.ARRAY_VERTEX] == null || _mdr.array[ArrayMesh.ARRAY_INDEX] == null:
+ return false
+
+ var arr : Array = _mdr.array
+
+ _vertices = arr[ArrayMesh.ARRAY_VERTEX]
+
+ if _mdr.array[ArrayMesh.ARRAY_NORMAL] != null:
+ _normals = arr[ArrayMesh.ARRAY_NORMAL]
+
+ _indices = arr[ArrayMesh.ARRAY_INDEX]
+
+ if _vertices.size() == 0:
+ return false
+
+ return true
+
+func get_vertex(index : int) -> Vector3:
+ if index > _vertices.size():
+ return Vector3()
+
+ var v : Vector3 = _vertices[index]
+
+ # This should reduce z fighting
+ if _normals.size() > 0:
+ var n : Vector3 = _normals[index]
+
+ v += n * 0.001
+
+ return v
+
+func generate(mark_outline : bool, mark_handles : bool):
+ reset()
+
+ if !initialize():
+ return
+
+ if mark_outline:
+ for i in range(0, _indices.size(), 3):
+ for j in range(3):
+ lines.append(get_vertex(_indices[i + j]))
+ lines.append(get_vertex(_indices[i + ((j + 1) % 3)]))
+
+ if mark_handles:
+ for i in range(_vertices.size()):
+ var v : Vector3 = get_vertex(i)
+
+ var l : float = marker_size
+
+ lines.append(v + Vector3(l, 0, 0))
+ lines.append(v + Vector3(-l, 0, 0))
+ lines.append(v + Vector3(0, 0, l))
+ lines.append(v + Vector3(0, 0, -l))
+ lines.append(v + Vector3(0, l, 0))
+ lines.append(v + Vector3(0, -l, 0))
+
+ var seams : PoolIntArray = _mdr.seams
+
+ for i in range(0, seams.size(), 2):
+ seam_lines.append(get_vertex(seams[i]))
+ seam_lines.append(get_vertex(seams[i + 1]))
+
+func generate_mark_edges(mark_outline : bool, mark_handles : bool):
+ reset()
+
+ if !initialize():
+ return
+
+ for i in range(0, _indices.size(), 3):
+ for j in range(3):
+ var i0 : int = _indices[i + j]
+ var i1 : int = _indices[i + ((j + 1) % 3)]
+
+ var v0 : Vector3 = get_vertex(i0)
+ var v1 : Vector3 = get_vertex(i1)
+
+ if mark_outline:
+ lines.append(v0)
+ lines.append(v1)
+
+ if mark_handles:
+ var pmid : Vector3 = lerp(v0, v1, 0.5)
+ var l : float = marker_size
+
+ lines.append(pmid + Vector3(l, 0, 0))
+ lines.append(pmid + Vector3(-l, 0, 0))
+ lines.append(pmid + Vector3(0, 0, l))
+ lines.append(pmid + Vector3(0, 0, -l))
+ lines.append(pmid + Vector3(0, l, 0))
+ lines.append(pmid + Vector3(0, -l, 0))
+
+
+ var seams : PoolIntArray = _mdr.seams
+
+ for i in range(0, seams.size(), 2):
+ seam_lines.append(get_vertex(seams[i]))
+ seam_lines.append(get_vertex(seams[i + 1]))
+
+func generate_mark_faces(mark_outline : bool, mark_handles : bool):
+ reset()
+
+ if !initialize():
+ return
+
+ if mark_outline:
+ for i in range(0, _indices.size(), 3):
+ for j in range(3):
+ lines.append(get_vertex(_indices[i + j]))
+ lines.append(get_vertex(_indices[i + ((j + 1) % 3)]))
+
+ if mark_handles:
+ for i in range(0, _indices.size(), 3):
+ var i0 : int = _indices[i + 0]
+ var i1 : int = _indices[i + 1]
+ var i2 : int = _indices[i + 2]
+
+ var v0 : Vector3 = get_vertex(i0)
+ var v1 : Vector3 = get_vertex(i1)
+ var v2 : Vector3 = get_vertex(i2)
+
+ var pmid : Vector3 = v0 + v1 + v2
+ pmid /= 3
+ var l : float = marker_size
+
+ lines.append(pmid + Vector3(l, 0, 0))
+ lines.append(pmid + Vector3(-l, 0, 0))
+ lines.append(pmid + Vector3(0, 0, l))
+ lines.append(pmid + Vector3(0, 0, -l))
+ lines.append(pmid + Vector3(0, l, 0))
+ lines.append(pmid + Vector3(0, -l, 0))
+
+ var seams : PoolIntArray = _mdr.seams
+
+ for i in range(0, seams.size(), 2):
+ seam_lines.append(get_vertex(seams[i]))
+ seam_lines.append(get_vertex(seams[i + 1]))
diff --git a/modules/mesh_data_resource/editor/addon/uv_editor/RectEditor.gd b/modules/mesh_data_resource/editor/addon/uv_editor/RectEditor.gd
new file mode 100644
index 000000000..b48f31f05
--- /dev/null
+++ b/modules/mesh_data_resource/editor/addon/uv_editor/RectEditor.gd
@@ -0,0 +1,18 @@
+tool
+extends PanelContainer
+
+func set_plugin(plugin : EditorPlugin) -> void:
+ $ScrollContainer/MarginContainer/RectView.set_plugin(plugin)
+
+func set_mesh_data_resource(a : MeshDataResource) -> void:
+ $ScrollContainer/MarginContainer/RectView.set_mesh_data_resource(a)
+
+func set_mesh_data_instance(a : MeshDataInstance) -> void:
+ $ScrollContainer/MarginContainer/RectView.set_mesh_data_instance(a)
+
+func ok_pressed() -> void:
+ $ScrollContainer/MarginContainer/RectView.ok_pressed()
+
+func cancel_pressed() -> void:
+ $ScrollContainer/MarginContainer/RectView.cancel_pressed()
+
diff --git a/modules/mesh_data_resource/editor/addon/uv_editor/RectView.gd b/modules/mesh_data_resource/editor/addon/uv_editor/RectView.gd
new file mode 100644
index 000000000..a4877ee2b
--- /dev/null
+++ b/modules/mesh_data_resource/editor/addon/uv_editor/RectView.gd
@@ -0,0 +1,250 @@
+tool
+extends Control
+
+var MeshDecompose = preload("res://addons/mesh_data_resource_editor/utilities/mesh_decompose.gd")
+
+var rect_editor_node_scene : PackedScene = preload("res://addons/mesh_data_resource_editor/uv_editor/RectViewNode.tscn")
+
+export(NodePath) var zoom_widget_path : NodePath = ""
+
+export(NodePath) var mirror_horizontal_button_path : NodePath = ""
+export(NodePath) var mirror_vertical_button_path : NodePath = ""
+
+export(NodePath) var rotate_left_button_path : NodePath = ""
+export(NodePath) var rotate_amount_spinbox_path : NodePath = ""
+export(NodePath) var rotate_right_button_path : NodePath = ""
+
+var _rect_scale : float = 1
+
+var _mdr : MeshDataResource = null
+var _background_texture : Texture = null
+
+var base_rect : Rect2 = Rect2(0, 0, 600, 600)
+var edited_resource_current_size : Vector2 = Vector2()
+
+var _stored_uvs : PoolVector2Array = PoolVector2Array()
+
+var _plugin : EditorPlugin = null
+var _undo_redo : UndoRedo = null
+
+var selected_rect : Control = null
+
+var rotation_amount : float = 45
+
+func _enter_tree():
+ var zoom_widget : Node = get_node_or_null(zoom_widget_path)
+
+ if zoom_widget && !zoom_widget.is_connected("zoom_changed", self, "on_zoom_changed"):
+ zoom_widget.connect("zoom_changed", self, "on_zoom_changed")
+
+ var mirror_horizontal_button : Button = get_node_or_null(mirror_horizontal_button_path)
+ if mirror_horizontal_button && !mirror_horizontal_button.is_connected("pressed", self, "on_mirror_horizontal_button_pressed"):
+ mirror_horizontal_button.connect("pressed", self, "on_mirror_horizontal_button_pressed")
+
+ var mirror_vertical_button : Button = get_node_or_null(mirror_vertical_button_path)
+ if mirror_vertical_button && !mirror_vertical_button.is_connected("pressed", self, "on_mirror_vertical_button_pressed"):
+ mirror_vertical_button.connect("pressed", self, "on_mirror_vertical_button_pressed")
+
+ var rotate_left_button : Button = get_node_or_null(rotate_left_button_path)
+ if rotate_left_button && !rotate_left_button.is_connected("pressed", self, "on_rotate_left_button_button_pressed"):
+ rotate_left_button.connect("pressed", self, "on_rotate_left_button_button_pressed")
+
+ var rotate_amount_spinbox : SpinBox = get_node_or_null(rotate_amount_spinbox_path)
+ if rotate_amount_spinbox:
+ rotation_amount = rotate_amount_spinbox.value
+ if !rotate_amount_spinbox.is_connected("value_changed", self, "on_rotate_amount_spinbox_changed"):
+ rotate_amount_spinbox.connect("value_changed", self, "on_rotate_amount_spinbox_changed")
+
+ var rotate_right_button : Button = get_node_or_null(rotate_right_button_path)
+ if rotate_right_button && !rotate_right_button.is_connected("pressed", self, "on_rotate_right_button_button_pressed"):
+ rotate_right_button.connect("pressed", self, "on_rotate_right_button_button_pressed")
+
+ if !is_connected("visibility_changed", self, "on_visibility_changed"):
+ connect("visibility_changed", self, "on_visibility_changed")
+
+func on_mirror_horizontal_button_pressed() -> void:
+ if selected_rect && is_instance_valid(selected_rect):
+ selected_rect.mirror_horizontal()
+
+func on_mirror_vertical_button_pressed() -> void:
+ if selected_rect && is_instance_valid(selected_rect):
+ selected_rect.mirror_vertical()
+
+func on_rotate_left_button_button_pressed() -> void:
+ if selected_rect && is_instance_valid(selected_rect):
+ selected_rect.rotate_uvs(-rotation_amount)
+
+func on_rotate_amount_spinbox_changed(val : float) -> void:
+ rotation_amount = val
+
+func on_rotate_right_button_button_pressed() -> void:
+ if selected_rect && is_instance_valid(selected_rect):
+ selected_rect.rotate_uvs(rotation_amount)
+
+func set_plugin(plugin : EditorPlugin) -> void:
+ _plugin = plugin
+
+ _undo_redo = _plugin.get_undo_redo()
+
+func on_visibility_changed() -> void:
+ if is_visible_in_tree():
+ store_uvs()
+ call_deferred("refresh")
+
+func apply_zoom() -> void:
+ var rect : Rect2 = base_rect
+ edited_resource_current_size = rect.size
+ rect.position = rect.position * _rect_scale
+ rect.size = rect.size * _rect_scale
+ set_custom_minimum_size(rect.size)
+
+ var p : MarginContainer = get_parent() as MarginContainer
+
+ p.add_constant_override("margin_left", min(rect.size.x / 4.0, 50 * _rect_scale))
+ p.add_constant_override("margin_right", min(rect.size.x / 4.0, 50 * _rect_scale))
+ p.add_constant_override("margin_top", min(rect.size.y / 4.0, 50 * _rect_scale))
+ p.add_constant_override("margin_bottom", min(rect.size.y / 4.0, 50 * _rect_scale))
+
+ for c in get_children():
+ c.set_editor_rect_scale(_rect_scale)
+
+func on_zoom_changed(zoom : float) -> void:
+ _rect_scale = zoom
+ apply_zoom()
+
+func _draw():
+ draw_rect(Rect2(Vector2(), get_size()), Color(0.2, 0.2, 0.2, 1))
+
+ if _background_texture:
+ draw_texture_rect_region(_background_texture, Rect2(Vector2(), get_size()), Rect2(Vector2(), _background_texture.get_size()))
+
+func refresh() -> void:
+ clear()
+
+ var rect : Rect2 = base_rect
+ edited_resource_current_size = rect.size
+ rect.position = rect.position * _rect_scale
+ rect.size = rect.size * _rect_scale
+ set_custom_minimum_size(rect.size)
+
+ apply_zoom()
+
+ refresh_rects()
+
+func clear() -> void:
+ pass
+
+func refresh_rects() -> void:
+ clear_rects()
+
+ if !_mdr:
+ return
+
+ var partitions : Array = MeshDecompose.partition_mesh(_mdr)
+
+ for p in partitions:
+ var s : Node = rect_editor_node_scene.instance()
+
+ add_child(s)
+ s.set_editor_rect_scale(_rect_scale)
+ s.edited_resource_parent_size = edited_resource_current_size
+ s.set_edited_resource(_mdr, p)
+
+func clear_rects():
+ for c in get_children():
+ c.queue_free()
+ remove_child(c)
+
+func set_mesh_data_resource(a : MeshDataResource) -> void:
+ _mdr = a
+
+func set_mesh_data_instance(a : MeshDataInstance) -> void:
+ _background_texture = null
+
+ if a:
+ _background_texture = a.texture
+
+func on_edited_resource_changed() -> void:
+ call_deferred("refresh")
+
+func get_uvs(mdr : MeshDataResource) -> PoolVector2Array:
+ if !_mdr:
+ return PoolVector2Array()
+
+ var arrays : Array = _mdr.get_array()
+
+ if arrays.size() != ArrayMesh.ARRAY_MAX:
+ return PoolVector2Array()
+
+ if arrays[ArrayMesh.ARRAY_TEX_UV] == null:
+ return PoolVector2Array()
+
+ return arrays[ArrayMesh.ARRAY_TEX_UV]
+
+func store_uvs() -> void:
+ _stored_uvs.resize(0)
+
+ if !_mdr:
+ return
+
+ var arrays : Array = _mdr.get_array()
+
+ if arrays.size() != ArrayMesh.ARRAY_MAX:
+ return
+
+ if arrays[ArrayMesh.ARRAY_TEX_UV] == null:
+ return
+
+ # Make sure it gets copied
+ _stored_uvs.append_array(arrays[ArrayMesh.ARRAY_TEX_UV])
+
+func apply_uvs(mdr : MeshDataResource, stored_uvs : PoolVector2Array) -> void:
+ if !_mdr:
+ return
+
+ var arrays : Array = _mdr.get_array()
+
+ if arrays.size() != ArrayMesh.ARRAY_MAX:
+ return
+
+ if arrays[ArrayMesh.ARRAY_TEX_UV] == null:
+ return
+
+ arrays[ArrayMesh.ARRAY_TEX_UV] = stored_uvs
+
+ _mdr.array = arrays
+
+func ok_pressed() -> void:
+ _undo_redo.create_action("UV Editor Accept")
+ _undo_redo.add_do_method(self, "apply_uvs", _mdr, get_uvs(_mdr))
+ _undo_redo.add_undo_method(self, "apply_uvs", _mdr, _stored_uvs)
+ _undo_redo.commit_action()
+
+func cancel_pressed() -> void:
+ if !_mdr:
+ return
+
+ var arrays : Array = _mdr.get_array()
+
+ if arrays.size() != ArrayMesh.ARRAY_MAX:
+ return
+
+ # Make sure it gets copied
+ var uvs : PoolVector2Array = PoolVector2Array()
+ uvs.append_array(_stored_uvs)
+
+ _undo_redo.create_action("UV Editor Cancel")
+ _undo_redo.add_do_method(self, "apply_uvs", _mdr, uvs)
+ _undo_redo.add_undo_method(self, "apply_uvs", _mdr, get_uvs(_mdr))
+ _undo_redo.commit_action()
+
+ _stored_uvs.resize(0)
+
+func set_selected(node : Control) -> void:
+ if selected_rect && is_instance_valid(selected_rect):
+ selected_rect.set_selected(false)
+
+ selected_rect = node
+
+ if selected_rect:
+ selected_rect.set_selected(true)
diff --git a/modules/mesh_data_resource/editor/addon/uv_editor/RectViewNode.gd b/modules/mesh_data_resource/editor/addon/uv_editor/RectViewNode.gd
new file mode 100644
index 000000000..fa5eb106b
--- /dev/null
+++ b/modules/mesh_data_resource/editor/addon/uv_editor/RectViewNode.gd
@@ -0,0 +1,418 @@
+tool
+extends MarginContainer
+
+enum DragType {
+ DRAG_NONE = 0,
+ DRAG_MOVE = 1,
+ DRAG_RESIZE_TOP = 1 << 1,
+ DRAG_RESIZE_RIGHT = 1 << 2,
+ DRAG_RESIZE_BOTTOM = 1 << 3,
+ DRAG_RESIZE_LEFT = 1 << 4
+};
+
+var selected : bool = false
+
+var _mdr : MeshDataResource = null
+var _indices : PoolIntArray = PoolIntArray()
+var _uvs : PoolVector2Array = PoolVector2Array()
+var _base_rect : Rect2 = Rect2(0, 0, 100, 100)
+var _uv_min : Vector2 = Vector2()
+var _uv_max : Vector2 = Vector2()
+
+var edited_resource_parent_size : Vector2 = Vector2()
+
+var _edited_resource_rect_border_color : Color = Color(0.8, 0.8, 0.8, 0.5)
+var _edited_resource_rect_color : Color = Color(0.5, 0.5, 0.5, 0.2)
+var _edited_resource_rect_selected_border_color : Color = Color(0.9, 0.9, 0.9, 0.8)
+var _edited_resource_rect_selected_color : Color = Color(0.5, 0.5, 0.5, 0.4)
+var _edited_resource_uv_mesh_color : Color = Color(1, 1, 1, 1)
+var _editor_rect_border_size : int = 2
+var _edited_resource_font_color : Color = Color(0, 0, 0, 1)
+var _editor_additional_text : String = ""
+
+var drag_type : int
+var drag_offset : Vector2
+var drag_offset_far : Vector2
+
+var _rect_scale : float = 1
+
+func _draw():
+ if selected:
+ draw_rect(Rect2(Vector2(), get_size()), _edited_resource_rect_selected_color)
+ draw_rect(Rect2(Vector2(), get_size()), _edited_resource_rect_selected_border_color, false, _editor_rect_border_size)
+ else:
+ draw_rect(Rect2(Vector2(), get_size()), _edited_resource_rect_color)
+ draw_rect(Rect2(Vector2(), get_size()), _edited_resource_rect_border_color, false, _editor_rect_border_size)
+
+ if _mdr && _uvs.size() > 0:
+ var c : Color = _edited_resource_uv_mesh_color
+
+ for i in range(0, len(_indices), 3):
+ draw_line(_uvs[_indices[i]] * get_size(), _uvs[_indices[i + 1]] * get_size(), c, 1, false)
+ draw_line(_uvs[_indices[i + 1]] * get_size(), _uvs[_indices[i + 2]] * get_size(), c, 1, false)
+ draw_line(_uvs[_indices[i + 2]] * get_size(), _uvs[_indices[i]] * get_size(), c, 1, false)
+
+func mirror_horizontal() -> void:
+ var pia : PoolIntArray = PoolIntArray()
+ for index in _indices:
+ var found : bool = false
+
+ for i in pia:
+ if i == index:
+ found = true
+ break
+
+ if found:
+ continue
+
+ pia.append(index)
+
+ var uv : Vector2 = _uvs[index]
+ uv.x = 1.0 - uv.x
+ _uvs.set(index, uv)
+
+ apply_uv()
+ update()
+
+func mirror_vertical() -> void:
+ var pia : PoolIntArray = PoolIntArray()
+ for index in _indices:
+ var found : bool = false
+
+ for i in pia:
+ if i == index:
+ found = true
+ break
+
+ if found:
+ continue
+
+ pia.append(index)
+
+ var uv : Vector2 = _uvs[index]
+ uv.y = 1.0 - uv.y
+ _uvs.set(index, uv)
+
+ apply_uv()
+ update()
+
+func rotate_uvs(amount : float) -> void:
+ var t : Transform2D = Transform2D(deg2rad(amount), Vector2())
+
+ var pia : PoolIntArray = PoolIntArray()
+ for index in _indices:
+ var found : bool = false
+
+ for i in pia:
+ if i == index:
+ found = true
+ break
+
+ if found:
+ continue
+
+ pia.append(index)
+
+ var uv : Vector2 = _uvs[index]
+ uv = t.xform(uv)
+ _uvs.set(index, uv)
+
+
+ re_normalize_uvs()
+ apply_uv()
+ update()
+
+func refresh() -> void:
+ if !_mdr:
+ return
+
+ var rect : Rect2 = _base_rect
+ rect.position *= _rect_scale
+ rect.size *= _rect_scale
+
+ rect_position = rect.position
+ rect_size = rect.size
+
+ update()
+
+func set_editor_rect_scale(rect_scale) -> void:
+ _rect_scale = rect_scale
+
+ refresh()
+
+func set_edited_resource(mdr : MeshDataResource, indices : PoolIntArray):
+ _mdr = mdr
+ _indices = indices
+ _uvs.resize(0)
+
+ var arrays : Array = _mdr.get_array()
+
+ if arrays.size() != ArrayMesh.ARRAY_MAX:
+ return
+
+ if arrays[ArrayMesh.ARRAY_TEX_UV] == null:
+ return
+
+ # Make sure it gets copied
+ _uvs.append_array(arrays[ArrayMesh.ARRAY_TEX_UV])
+
+ set_up_base_rect()
+
+ refresh()
+
+func set_up_base_rect() -> void:
+ _base_rect = Rect2()
+
+ if !_mdr:
+ return
+
+ if _uvs.size() == 0:
+ return
+
+ var vmin : Vector2 = _uvs[_indices[0]]
+ var vmax : Vector2 = vmin
+ for i in range(1, _indices.size()):
+ var uv : Vector2 = _uvs[_indices[i]]
+
+ if uv.x < vmin.x:
+ vmin.x = uv.x
+
+ if uv.x > vmax.x:
+ vmax.x = uv.x
+
+ if uv.y < vmin.y:
+ vmin.y = uv.y
+
+ if uv.y > vmax.y:
+ vmax.y = uv.y
+
+ _base_rect = Rect2(vmin.x, vmin.y, vmax.x - vmin.x, vmax.y - vmin.y)
+ _base_rect.position *= edited_resource_parent_size
+ _base_rect.size *= edited_resource_parent_size
+
+ _uv_min = vmin
+ _uv_max = vmax
+
+ normalize_uvs()
+
+func re_normalize_uvs() -> void:
+ if _uvs.size() == 0:
+ return
+
+ var vmin : Vector2 = _uvs[_indices[0]]
+ var vmax : Vector2 = vmin
+ for i in range(1, _indices.size()):
+ var uv : Vector2 = _uvs[_indices[i]]
+
+ if uv.x < vmin.x:
+ vmin.x = uv.x
+
+ if uv.x > vmax.x:
+ vmax.x = uv.x
+
+ if uv.y < vmin.y:
+ vmin.y = uv.y
+
+ if uv.y > vmax.y:
+ vmax.y = uv.y
+
+ var xmm : float = vmax.x - vmin.x
+ var ymm : float = vmax.y - vmin.y
+
+ if xmm == 0:
+ xmm = 0.0000001
+
+ if ymm == 0:
+ ymm = 0.0000001
+
+ for i in range(_uvs.size()):
+ var uv : Vector2 = _uvs[i]
+
+ uv.x -= vmin.x
+ uv.x /= xmm
+
+ uv.y -= vmin.y
+ uv.y /= ymm
+
+ _uvs[i] = uv
+
+func normalize_uvs() -> void:
+ var xmm : float = _uv_max.x - _uv_min.x
+ var ymm : float = _uv_max.y - _uv_min.y
+
+ if xmm == 0:
+ xmm = 0.0000001
+
+ if ymm == 0:
+ ymm = 0.0000001
+
+ for i in range(_uvs.size()):
+ var uv : Vector2 = _uvs[i]
+
+ uv.x -= _uv_min.x
+ uv.x /= xmm
+
+ uv.y -= _uv_min.y
+ uv.y /= ymm
+
+ _uvs[i] = uv
+
+func apply_uv() -> void:
+ if !_mdr:
+ return
+
+ var rect : Rect2 = get_rect()
+
+ #rect needs to be converted back
+ rect.position /= _rect_scale
+ rect.size /= _rect_scale
+ rect.position /= edited_resource_parent_size
+ rect.size /= edited_resource_parent_size
+
+ var arrays : Array = _mdr.get_array()
+
+ if arrays.size() != ArrayMesh.ARRAY_MAX:
+ return
+
+ if arrays[ArrayMesh.ARRAY_TEX_UV] == null:
+ return
+
+ var uvs : PoolVector2Array = arrays[ArrayMesh.ARRAY_TEX_UV]
+
+ for index in _indices:
+ var uv : Vector2 = _uvs[index]
+
+ uv = uv * rect.size + rect.position
+
+ uvs[index] = uv
+
+ _uv_min = rect.position
+ _uv_max = rect.position + rect.size
+
+ _base_rect = get_rect()
+
+ arrays[ArrayMesh.ARRAY_TEX_UV] = uvs
+ _mdr.array = arrays
+
+
+#based on / ported from engine/scene/gui/dialogs.h and .cpp
+func _notification(p_what : int) -> void:
+ if (p_what == NOTIFICATION_MOUSE_EXIT):
+ # Reset the mouse cursor when leaving the resizable window border.
+ if (_mdr && !drag_type):
+ if (get_default_cursor_shape() != CURSOR_ARROW):
+ set_default_cursor_shape(CURSOR_ARROW)
+
+#based on / ported from engine/scene/gui/dialogs.h and .cpp
+func _gui_input(p_event : InputEvent) -> void:
+ if (p_event is InputEventMouseButton) && (p_event.get_button_index() == BUTTON_LEFT):
+ var mb : InputEventMouseButton = p_event as InputEventMouseButton
+
+ if (mb.is_pressed()):
+ get_parent().set_selected(self)
+
+ # Begin a possible dragging operation.
+ drag_type = _drag_hit_test(Vector2(mb.get_position().x, mb.get_position().y))
+
+ if (drag_type != DragType.DRAG_NONE):
+ drag_offset = get_global_mouse_position() - get_position()
+
+ drag_offset_far = get_position() + get_size() - get_global_mouse_position()
+
+ elif (drag_type != DragType.DRAG_NONE && !mb.is_pressed()):
+ # End a dragging operation.
+
+ apply_uv()
+
+ drag_type = DragType.DRAG_NONE
+
+ if p_event is InputEventMouseMotion:
+ var mm : InputEventMouseMotion = p_event as InputEventMouseMotion
+
+ if (drag_type == DragType.DRAG_NONE):
+ # Update the cursor while moving along the borders.
+ var cursor = CURSOR_ARROW
+
+ var preview_drag_type : int = _drag_hit_test(Vector2(mm.get_position().x, mm.get_position().y))
+
+ var top_left : int = DragType.DRAG_RESIZE_TOP + DragType.DRAG_RESIZE_LEFT
+ var bottom_right : int = DragType.DRAG_RESIZE_BOTTOM + DragType.DRAG_RESIZE_RIGHT
+ var top_right : int = DragType.DRAG_RESIZE_TOP + DragType.DRAG_RESIZE_RIGHT
+ var bottom_left : int = DragType.DRAG_RESIZE_BOTTOM + DragType.DRAG_RESIZE_LEFT
+
+ match (preview_drag_type):
+ DragType.DRAG_RESIZE_TOP:
+ cursor = CURSOR_VSIZE
+ DragType.DRAG_RESIZE_BOTTOM:
+ cursor = CURSOR_VSIZE
+ DragType.DRAG_RESIZE_LEFT:
+ cursor = CURSOR_HSIZE
+ DragType.DRAG_RESIZE_RIGHT:
+ cursor = CURSOR_HSIZE
+ top_left:
+ cursor = CURSOR_FDIAGSIZE
+ bottom_right:
+ cursor = CURSOR_FDIAGSIZE
+ top_right:
+ cursor = CURSOR_BDIAGSIZE
+ bottom_left:
+ cursor = CURSOR_BDIAGSIZE
+
+ if (get_cursor_shape() != cursor):
+ set_default_cursor_shape(cursor);
+
+ else:
+ # Update while in a dragging operation.
+ var global_pos : Vector2 = get_global_mouse_position()
+
+ var rect : Rect2 = get_rect()
+ var min_size : Vector2 = get_combined_minimum_size()
+
+ if (drag_type == DragType.DRAG_MOVE):
+ rect.position = global_pos - drag_offset
+ else:
+ if (drag_type & DragType.DRAG_RESIZE_TOP):
+ var bottom : int = rect.position.y + rect.size.y
+ var max_y : int = bottom - min_size.y
+ rect.position.y = min(global_pos.y - drag_offset.y, max_y)
+ rect.size.y = bottom - rect.position.y
+ elif (drag_type & DragType.DRAG_RESIZE_BOTTOM):
+ rect.size.y = global_pos.y - rect.position.y + drag_offset_far.y
+
+ if (drag_type & DragType.DRAG_RESIZE_LEFT):
+ var right : int = rect.position.x + rect.size.x
+ var max_x : int = right - min_size.x
+ rect.position.x = min(global_pos.x - drag_offset.x, max_x)
+ rect.size.x = right - rect.position.x
+ elif (drag_type & DragType.DRAG_RESIZE_RIGHT):
+ rect.size.x = global_pos.x - rect.position.x + drag_offset_far.x
+
+ set_size(rect.size)
+ set_position(rect.position)
+
+#based on / ported from engine/scene/gui/dialogs.h and .cpp
+func _drag_hit_test(pos : Vector2) -> int:
+ var drag_type : int = DragType.DRAG_NONE
+
+ var scaleborder_size : int = 5 #get_constant("scaleborder_size", "WindowDialog")
+
+ var rect : Rect2 = get_rect()
+
+ if (pos.y < (scaleborder_size)):
+ drag_type = DragType.DRAG_RESIZE_TOP
+ elif (pos.y >= (rect.size.y - scaleborder_size)):
+ drag_type = DragType.DRAG_RESIZE_BOTTOM
+
+ if (pos.x < scaleborder_size):
+ drag_type |= DragType.DRAG_RESIZE_LEFT
+ elif (pos.x >= (rect.size.x - scaleborder_size)):
+ drag_type |= DragType.DRAG_RESIZE_RIGHT
+
+ if (drag_type == DragType.DRAG_NONE):
+ drag_type = DragType.DRAG_MOVE
+
+ return drag_type
+
+func set_selected(val : bool) -> void:
+ selected = val
+ update()
diff --git a/modules/mesh_data_resource/editor/addon/uv_editor/RectViewNode.tscn b/modules/mesh_data_resource/editor/addon/uv_editor/RectViewNode.tscn
new file mode 100644
index 000000000..3746ada00
--- /dev/null
+++ b/modules/mesh_data_resource/editor/addon/uv_editor/RectViewNode.tscn
@@ -0,0 +1,11 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://addons/mesh_data_resource_editor/uv_editor/RectViewNode.gd" type="Script" id=1]
+
+[node name="RectViewNode" type="MarginContainer"]
+margin_right = 1024.0
+margin_bottom = 600.0
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
diff --git a/modules/mesh_data_resource/editor/addon/uv_editor/UVEditor.tscn b/modules/mesh_data_resource/editor/addon/uv_editor/UVEditor.tscn
new file mode 100644
index 000000000..2603514e7
--- /dev/null
+++ b/modules/mesh_data_resource/editor/addon/uv_editor/UVEditor.tscn
@@ -0,0 +1,121 @@
+[gd_scene load_steps=8 format=2]
+
+[ext_resource path="res://addons/mesh_data_resource_editor/uv_editor/RectEditor.gd" type="Script" id=1]
+[ext_resource path="res://addons/mesh_data_resource_editor/widgets/EditorZoomWidget.tscn" type="PackedScene" id=2]
+[ext_resource path="res://addons/mesh_data_resource_editor/uv_editor/RectView.gd" type="Script" id=3]
+[ext_resource path="res://addons/mesh_data_resource_editor/icons/icon_v_mirror.png" type="Texture" id=4]
+[ext_resource path="res://addons/mesh_data_resource_editor/icons/icon_h_mirror.png" type="Texture" id=5]
+[ext_resource path="res://addons/mesh_data_resource_editor/icons/icon_rot_right.png" type="Texture" id=6]
+[ext_resource path="res://addons/mesh_data_resource_editor/icons/icon_rot_left.png" type="Texture" id=7]
+
+[node name="UVEditor" type="PanelContainer"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="ScrollContainer" type="ScrollContainer" parent="."]
+margin_left = 7.0
+margin_top = 7.0
+margin_right = 1017.0
+margin_bottom = 593.0
+
+[node name="MarginContainer" type="MarginContainer" parent="ScrollContainer"]
+margin_right = 700.0
+margin_bottom = 700.0
+custom_constants/margin_right = 50
+custom_constants/margin_top = 50
+custom_constants/margin_left = 50
+custom_constants/margin_bottom = 50
+
+[node name="RectView" type="Control" parent="ScrollContainer/MarginContainer"]
+margin_left = 50.0
+margin_top = 50.0
+margin_right = 650.0
+margin_bottom = 650.0
+rect_min_size = Vector2( 600, 600 )
+script = ExtResource( 3 )
+zoom_widget_path = NodePath("../../../Control/HBoxContainer/EditorZoomWidget")
+mirror_horizontal_button_path = NodePath("../../../Control/HBoxContainer/HorizontalMirror")
+mirror_vertical_button_path = NodePath("../../../Control/HBoxContainer/VerticalMirror")
+rotate_left_button_path = NodePath("../../../Control/HBoxContainer/RotLeft")
+rotate_amount_spinbox_path = NodePath("../../../Control/HBoxContainer/SpinBox")
+rotate_right_button_path = NodePath("../../../Control/HBoxContainer/RotRight")
+
+[node name="Control" type="VBoxContainer" parent="."]
+margin_left = 7.0
+margin_top = 7.0
+margin_right = 1017.0
+margin_bottom = 593.0
+mouse_filter = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="HBoxContainer" type="HBoxContainer" parent="Control"]
+margin_right = 1010.0
+margin_bottom = 24.0
+mouse_filter = 2
+size_flags_horizontal = 3
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="EditorZoomWidget" parent="Control/HBoxContainer" instance=ExtResource( 2 )]
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 115.0
+margin_bottom = 24.0
+custom_constants/separation = -8
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="VSeparator2" type="VSeparator" parent="Control/HBoxContainer"]
+margin_left = 119.0
+margin_right = 123.0
+margin_bottom = 24.0
+
+[node name="HorizontalMirror" type="Button" parent="Control/HBoxContainer"]
+margin_left = 127.0
+margin_right = 155.0
+margin_bottom = 24.0
+hint_tooltip = "Mirror the selected island horizontally.."
+icon = ExtResource( 5 )
+
+[node name="VerticalMirror" type="Button" parent="Control/HBoxContainer"]
+margin_left = 159.0
+margin_right = 187.0
+margin_bottom = 24.0
+hint_tooltip = "Mirror the selected island vertically."
+icon = ExtResource( 4 )
+
+[node name="VSeparator" type="VSeparator" parent="Control/HBoxContainer"]
+margin_left = 191.0
+margin_right = 195.0
+margin_bottom = 24.0
+
+[node name="RotLeft" type="Button" parent="Control/HBoxContainer"]
+margin_left = 199.0
+margin_right = 227.0
+margin_bottom = 24.0
+hint_tooltip = "Rotate left."
+icon = ExtResource( 7 )
+
+[node name="SpinBox" type="SpinBox" parent="Control/HBoxContainer"]
+margin_left = 231.0
+margin_right = 305.0
+margin_bottom = 24.0
+hint_tooltip = "Rotate amount in degrees."
+max_value = 360.0
+value = 45.0
+allow_greater = true
+allow_lesser = true
+
+[node name="RotRight" type="Button" parent="Control/HBoxContainer"]
+margin_left = 309.0
+margin_right = 337.0
+margin_bottom = 24.0
+hint_tooltip = "Rotate right."
+icon = ExtResource( 6 )
diff --git a/modules/mesh_data_resource/editor/addon/uv_editor/UVEditorPopup.gd b/modules/mesh_data_resource/editor/addon/uv_editor/UVEditorPopup.gd
new file mode 100644
index 000000000..32a9795a8
--- /dev/null
+++ b/modules/mesh_data_resource/editor/addon/uv_editor/UVEditorPopup.gd
@@ -0,0 +1,15 @@
+tool
+extends ConfirmationDialog
+
+func _enter_tree():
+ if !is_connected("confirmed", self, "on_ok_pressed"):
+ connect("confirmed", self, "on_ok_pressed")
+
+ if !get_cancel().is_connected("pressed", self, "on_cancel_pressed"):
+ get_cancel().connect("pressed", self, "on_cancel_pressed")
+
+func on_ok_pressed() -> void:
+ $UVEditor.ok_pressed()
+
+func on_cancel_pressed() -> void:
+ $UVEditor.cancel_pressed()
diff --git a/modules/mesh_data_resource/editor/addon/widgets/EditorZoomWidget.gd b/modules/mesh_data_resource/editor/addon/widgets/EditorZoomWidget.gd
new file mode 100644
index 000000000..c0579b6c0
--- /dev/null
+++ b/modules/mesh_data_resource/editor/addon/widgets/EditorZoomWidget.gd
@@ -0,0 +1,218 @@
+tool
+extends HBoxContainer
+
+#This is a port of godot 4.0's EditorZoomWidget
+
+#/*************************************************************************/
+#/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
+#/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
+#/* */
+#/* Permission is hereby granted, free of charge, to any person obtaining */
+#/* a copy of this software and associated documentation files (the */
+#/* "Software"), to deal in the Software without restriction, including */
+#/* without limitation the rights to use, copy, modify, merge, publish, */
+#/* distribute, sublicense, and/or sell copies of the Software, and to */
+#/* permit persons to whom the Software is furnished to do so, subject to */
+#/* the following conditions: */
+#/* */
+#/* The above copyright notice and this permission notice shall be */
+#/* included in all copies or substantial portions of the Software. */
+#/* */
+#/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+#/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+#/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+#/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+#/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+#/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+#/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+#/*************************************************************************/
+
+var zoom_minus : Button
+var zoom_reset : Button
+var zoom_plus : Button
+
+var EDSCALE : float = 1
+
+export(float) var zoom : float = 1.0 setget set_zoom, get_zoom
+
+signal zoom_changed(zoom)
+
+func _init() -> void:
+ # Zoom buttons
+ zoom_minus = Button.new()
+ zoom_minus.set_flat(true)
+ add_child(zoom_minus)
+ zoom_minus.connect("pressed", self, "_button_zoom_minus")
+ zoom_minus.set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_minus", tr("Zoom Out"), KEY_MASK_CMD | KEY_MINUS))
+ zoom_minus.set_focus_mode(FOCUS_NONE)
+
+ zoom_reset = Button.new()
+ zoom_reset.set_flat(true)
+ add_child(zoom_reset)
+ zoom_reset.add_constant_override("outline_size", 1)
+ zoom_reset.add_color_override("font_outline_color", Color(0, 0, 0))
+ zoom_reset.add_color_override("font_color", Color(1, 1, 1))
+ zoom_reset.connect("pressed", self, "_button_zoom_reset")
+ zoom_reset.set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_reset", tr("Zoom Reset"), KEY_MASK_CMD | KEY_0))
+ zoom_reset.set_focus_mode(FOCUS_NONE)
+ #Prevent the button's size from changing when the text size changes
+ zoom_reset.set_custom_minimum_size(Vector2(75, 0))
+
+ zoom_plus = Button.new()
+ zoom_plus.set_flat(true)
+ add_child(zoom_plus)
+ zoom_plus.connect("pressed", self, "_button_zoom_plus")
+ zoom_plus.set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_plus", tr("Zoom In"), KEY_MASK_CMD | KEY_EQUAL)) # Usually direct access key for PLUS
+ zoom_plus.set_focus_mode(FOCUS_NONE)
+
+ _update_zoom_label()
+
+ add_constant_override("separation", round(-8))
+
+func get_zoom() -> float:
+ return zoom
+
+func set_zoom(p_zoom : float) -> void:
+ if (p_zoom > 0 && p_zoom != zoom):
+ zoom = p_zoom;
+ _update_zoom_label();
+
+func set_zoom_by_increments(p_increment_count : int, p_integer_only : bool) -> void:
+ # Remove editor scale from the index computation.
+ var zoom_noscale : float = zoom / max(1, EDSCALE)
+ var CMP_EPSILON : float = 0.00001
+
+ if (p_integer_only):
+ # Only visit integer scaling factors above 100%, and fractions with an integer denominator below 100%
+ # (1/2 = 50%, 1/3 = 33.33%, 1/4 = 25%, …).
+ # This is useful when working on pixel art projects to avoid distortion.
+ # This algorithm is designed to handle fractional start zoom values correctly
+ # (e.g. 190% will zoom up to 200% and down to 100%).
+ if (zoom_noscale + p_increment_count * 0.001 >= 1.0 - CMP_EPSILON):
+ # New zoom is certain to be above 100%.
+ if (p_increment_count >= 1):
+ # Zooming.
+ set_zoom(floor(zoom_noscale + p_increment_count) * max(1, EDSCALE))
+ else:
+ # Dezooming.
+ set_zoom(ceil(zoom_noscale + p_increment_count) * max(1, EDSCALE))
+ else:
+ if (p_increment_count >= 1):
+ # Zooming. Convert the current zoom into a denominator.
+ var new_zoom : float = 1.0 / ceil(1.0 / zoom_noscale - p_increment_count)
+ if (is_equal_approx(zoom_noscale, new_zoom)):
+ # New zoom is identical to the old zoom, so try again.
+ # This can happen due to floating-point precision issues.
+ new_zoom = 1.0 / ceil(1.0 / zoom_noscale - p_increment_count - 1)
+
+ set_zoom(new_zoom * max(1, EDSCALE));
+ else:
+ # Dezooming. Convert the current zoom into a denominator.
+ var new_zoom : float = 1.0 / floor(1.0 / zoom_noscale - p_increment_count)
+ if (is_equal_approx(zoom_noscale, new_zoom)):
+ # New zoom is identical to the old zoom, so try again.
+ # This can happen due to floating-point precision issues.
+ new_zoom = 1.0 / floor(1.0 / zoom_noscale - p_increment_count + 1)
+
+ set_zoom(new_zoom * max(1, EDSCALE))
+ else:
+ # Base increment factor defined as the twelveth root of two.
+ # This allow a smooth geometric evolution of the zoom, with the advantage of
+ # visiting all integer power of two scale factors.
+ # note: this is analogous to the 'semitones' interval in the music world
+ # In order to avoid numerical imprecisions, we compute and edit a zoom index
+ # with the following relation: zoom = 2 ^ (index / 12)
+
+ if (zoom < CMP_EPSILON || p_increment_count == 0):
+ return
+
+ # zoom = 2**(index/12) => log2(zoom) = index/12
+ var closest_zoom_index : float = round(log(zoom_noscale) * 12.0 / log(2.0))
+
+ var new_zoom_index : float = closest_zoom_index + p_increment_count
+ var new_zoom : float = pow(2.0, new_zoom_index / 12.0)
+
+ # Restore Editor scale transformation
+ new_zoom *= max(1, EDSCALE)
+
+ set_zoom(new_zoom)
+
+
+func _update_zoom_label() -> void:
+ var zoom_text : String = ""
+
+ # The zoom level displayed is relative to the editor scale
+ # (like in most image editors). Its lower bound is clamped to 1 as some people
+ # lower the editor scale to increase the available real estate,
+ # even if their display doesn't have a particularly low DPI.
+
+ if (zoom >= 10):
+ # Don't show a decimal when the zoom level is higher than 1000 %.
+ #zoom_text = (rtos(round((zoom / max(1, EDSCALE)) * 100))) + " %"
+ zoom_text = (String(round((zoom / max(1, EDSCALE)) * 100))) + " %"
+ else:
+ var v : float = (zoom / max(1, EDSCALE)) * 100
+ var val : float = floor(v / 0.1 + 0.5) * 0.1
+
+# zoom_text = (rtos(val)) + " %"
+ zoom_text = (String(val)) + " %"
+
+ zoom_reset.set_text(zoom_text)
+
+func _button_zoom_minus() -> void:
+ set_zoom_by_increments(-6, Input.is_key_pressed(KEY_ALT));
+ emit_signal("zoom_changed", zoom);
+
+func _button_zoom_reset() -> void:
+ set_zoom(1.0 * max(1, EDSCALE));
+ emit_signal("zoom_changed", zoom);
+
+func _button_zoom_plus() -> void:
+ set_zoom_by_increments(6, Input.is_key_pressed(KEY_ALT));
+ emit_signal("zoom_changed", zoom);
+
+func _notification(p_what : int) -> void:
+ if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED):
+ zoom_minus.icon = get_icon("ZoomLess", "EditorIcons")
+ zoom_plus.icon = get_icon("ZoomMore", "EditorIcons")
+
+#from godot editor/editor_Settings.cpp
+func ED_SHORTCUT(p_path : String, p_name : String, p_keycode : int, editor_settings : EditorSettings = null) -> ShortCut:
+ if OS.get_name() == "OSX":
+ # Use Cmd+Backspace as a general replacement for Delete shortcuts on macOS
+ if (p_keycode == KEY_DELETE):
+ p_keycode = KEY_MASK_CMD | KEY_BACKSPACE
+
+ var ie : InputEventKey = null
+ if (p_keycode):
+ ie = InputEventKey.new()
+
+ ie.set_unicode(p_keycode & KEY_CODE_MASK)
+ ie.set_scancode(p_keycode & KEY_CODE_MASK)
+ ie.set_shift(bool(p_keycode & KEY_MASK_SHIFT))
+ ie.set_alt(bool(p_keycode & KEY_MASK_ALT))
+ ie.set_control(bool(p_keycode & KEY_MASK_CTRL))
+ ie.set_metakey(bool(p_keycode & KEY_MASK_META))
+
+ if (!editor_settings):
+ var sc : ShortCut
+ sc = ShortCut.new()
+ sc.set_name(p_name)
+ sc.set_shortcut(ie)
+ sc.set_meta("original", ie)
+ return sc
+
+ var sc : ShortCut = editor_settings.get_shortcut(p_path)
+ if (sc.is_valid()):
+ sc.set_name(p_name); #keep name (the ones that come from disk have no name)
+ sc.set_meta("original", ie); #to compare against changes
+ return sc;
+
+ sc = ShortCut.new()
+ sc.set_name(p_name)
+ sc.set_shortcut(ie)
+ sc.set_meta("original", ie) #to compare against changes
+ editor_settings.add_shortcut(p_path, sc)
+
+ return sc
+
diff --git a/modules/mesh_data_resource/editor/addon/widgets/EditorZoomWidget.tscn b/modules/mesh_data_resource/editor/addon/widgets/EditorZoomWidget.tscn
new file mode 100644
index 000000000..5de87a918
--- /dev/null
+++ b/modules/mesh_data_resource/editor/addon/widgets/EditorZoomWidget.tscn
@@ -0,0 +1,8 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://addons/world_generator/widgets/EditorZoomWidget.gd" type="Script" id=1]
+
+[node name="EditorZoomWidget" type="HBoxContainer"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+script = ExtResource( 1 )
diff --git a/modules/mesh_data_resource/editor/addon/widgets/flex_grid_container.gd b/modules/mesh_data_resource/editor/addon/widgets/flex_grid_container.gd
new file mode 100644
index 000000000..df4cb9eaf
--- /dev/null
+++ b/modules/mesh_data_resource/editor/addon/widgets/flex_grid_container.gd
@@ -0,0 +1,207 @@
+tool
+extends Container
+
+#From https://github.com/EricEzaM/godot-color-palette
+
+# MIT License
+#
+# Copyright (c) 2020 Eric M
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+
+var columns: int = 1 setget set_columns
+var _min_x : int = 0
+
+func _notification(p_what):
+ match p_what:
+ NOTIFICATION_SORT_CHILDREN:
+ var col_minw: Dictionary # Max of min_width of all controls in each col (indexed by col).
+ var row_minh: Dictionary # Max of min_height of all controls in each row (indexed by row).
+ var col_expanded: Array # Columns which have the SIZE_EXPAND flag set.
+ var row_expanded: Array # Rows which have the SIZE_EXPAND flag set.
+
+ var hsep = get_constant("hseparation", "GridContainer")
+ var vsep = get_constant("vseparation", "GridContainer")
+
+ var min_columns = 1
+ _min_x = 0
+
+ if get_child_count() > 0:
+ min_columns = int(floor(rect_size.x / (get_child(0).get_combined_minimum_size().x + hsep)))
+
+ self.columns = min_columns
+
+ var max_col = min(get_child_count(), columns)
+ var max_row = ceil(float(get_child_count()) / float(columns))
+
+# Compute the per-column/per-row data.
+ var valid_controls_index = 0
+ for i in range(get_child_count()):
+ var c: Control = get_child(i)
+ if !c or !c.is_visible_in_tree():
+ continue
+
+ var row = valid_controls_index / columns
+ var col = valid_controls_index % columns
+ valid_controls_index += 1
+
+ var ms: Vector2 = c.get_combined_minimum_size()
+
+ if _min_x < ms.x:
+ _min_x = ms.x
+
+ if col_minw.has(col):
+ col_minw[col] = max(col_minw[col], ms.x)
+ else:
+ col_minw[col] = ms.x
+ if row_minh.has(row):
+ row_minh[row] = max(row_minh[row], ms.y)
+ else:
+ row_minh[row] = ms.y
+
+ if c.get_h_size_flags() & SIZE_EXPAND:
+ col_expanded.push_front(col)
+
+ if c.get_v_size_flags() & SIZE_EXPAND:
+ row_expanded.push_front(row)
+
+# Consider all empty columns expanded.
+ for i in range(valid_controls_index, columns):
+ col_expanded.push_front(i)
+
+# Evaluate the remaining space for expanded columns/rows.
+ var remaining_space: Vector2 = get_size()
+
+ for e in col_minw.keys():
+ if !col_expanded.has(e):
+ remaining_space.x -= col_minw.get(e)
+
+ for e in row_minh.keys():
+ if !row_expanded.has(e):
+ remaining_space.y -= row_minh.get(e)
+
+ remaining_space.y -= vsep * max(max_row - 1, 0)
+ remaining_space.x -= hsep * max(max_col - 1, 0)
+
+ var can_fit = false
+ while !can_fit && col_expanded.size() > 0:
+# Check if all minwidth constraints are OK if we use the remaining space.
+ can_fit = true
+ var max_index = col_expanded.front()
+
+ for e in col_expanded:
+ if col_minw.has(e):
+ if col_minw[e] > col_minw[max_index]:
+ max_index = e
+ if can_fit && (remaining_space.x / col_expanded.size()) < col_minw[e]:
+ can_fit = false
+
+# If not, the column with maximum minwidth is not expanded.
+ if (!can_fit):
+ col_expanded.erase(max_index)
+ remaining_space.x -= col_minw[max_index]
+
+ can_fit = false
+ while !can_fit && row_expanded.size() > 0:
+# Check if all minheight constraints are OK if we use the remaining space.
+ can_fit = true
+ var max_index = row_expanded.front()
+
+ for e in row_expanded:
+ if row_minh[e] > row_minh[max_index]:
+ max_index = e
+ if can_fit && (remaining_space.y / row_expanded.size()) < row_minh[e]:
+ can_fit = false
+
+# If not, the row with maximum minheight is not expanded.
+ if (!can_fit):
+ row_expanded.erase(max_index)
+ remaining_space.y -= row_minh[max_index]
+
+# Finally, fit the nodes.
+ var col_expand = remaining_space.x / col_expanded.size() if col_expanded.size() > 0 else 0
+ var row_expand = remaining_space.y / row_expanded.size() if row_expanded.size() > 0 else 0
+
+ var col_ofs = 0
+ var row_ofs = 0
+
+ valid_controls_index = 0
+ for i in range(get_child_count()):
+ var c: Control = get_child(i)
+ if (!c || !c.is_visible_in_tree()):
+ continue
+ var row = valid_controls_index / columns
+ var col = valid_controls_index % columns
+ valid_controls_index += 1
+
+ if (col == 0):
+ col_ofs = 0
+ if (row > 0):
+ row_ofs += (row_expand if row_expanded.has(row - 1) else row_minh[row - 1]) + vsep
+
+ var p = Vector2(col_ofs, row_ofs)
+ var s = Vector2(col_expand if col_expanded.has(col) else col_minw[col], row_expand if row_expanded.has(row) else row_minh[row])
+
+ fit_child_in_rect(c, Rect2(p, s))
+
+ col_ofs += s.x + hsep
+
+ NOTIFICATION_THEME_CHANGED:
+ minimum_size_changed()
+
+func _get_minimum_size():
+# Only worry about max height, not width (since it does width automatically)
+ var row_minh: Dictionary
+
+ var vsep = get_constant("vseparation", "GridContainer")
+
+ var max_row = 0
+
+ var valid_controls_index = 0
+ for i in range(get_child_count()):
+
+ var c: Control = get_child(i)
+ if !c or !c.is_visible():
+ continue
+ var row = valid_controls_index / columns
+ valid_controls_index += 1
+
+ var ms = c.get_combined_minimum_size()
+
+ if row_minh.has(row):
+ row_minh[row] = max(row_minh[row], ms.y)
+ else:
+ row_minh[row] = ms.y
+ max_row = max(row, max_row)
+
+ var ms: Vector2
+ ms.x = _min_x
+
+ for e in row_minh.keys():
+ ms.y += row_minh.get(e)
+
+ ms.y += vsep * max_row
+
+ return ms
+
+
+func set_columns(p_columns: int):
+ columns = p_columns
+ minimum_size_changed()
diff --git a/modules/paint/addon/BrushPrefabs.gd b/modules/paint/addon/BrushPrefabs.gd
new file mode 100644
index 000000000..02884d374
--- /dev/null
+++ b/modules/paint/addon/BrushPrefabs.gd
@@ -0,0 +1,106 @@
+class_name BrushPrefabs
+
+
+const list = [
+ [ Vector2(0, -1),
+ Vector2(-1, 0), Vector2(0, 0), Vector2(1, 0),
+ Vector2(0, 1)
+ ],
+ [Vector2(-1, -1), Vector2(0, -1), Vector2(1, -1),
+ Vector2(-1, 0), Vector2(0, 0), Vector2(1, 0),
+ Vector2(-1, 1), Vector2(0, 1), Vector2(1, 1),
+ ],
+ [
+ Vector2(-1, 0), Vector2(0, 0), Vector2(1, 0),
+ ],
+ [ Vector2(0, -1),
+ Vector2(0, 0),
+ Vector2(0, 1)
+ ]
+]
+
+
+enum Type {
+ V_LINE,
+ H_LINE,
+ RECT,
+ CIRCLE,
+}
+
+static func get_brush(type, size: int):
+ var pixels = []
+ if size < 1:
+ size = 1
+
+ match type:
+ Type.CIRCLE:
+ size += 1
+ var center = Vector2.ZERO
+ var last = center
+ var radius = size / 2.0
+ for x in range(size):
+ for y in range(size):
+ if Vector2(x - radius, y - radius).length() < size / 3.0:
+ pixels.append(Vector2(x, y))
+
+ var avg = Vector2(size / 2, size / 2)
+ avg = Vector2(floor(avg.x), floor(avg.y))
+
+ for i in range(pixels.size()):
+ pixels[i] -= avg
+
+ Type.RECT:
+ var center = Vector2.ZERO
+ var last = center
+ for x in range(size):
+ for y in range(size):
+ pixels.append(Vector2(x, y))
+
+ var avg = Vector2.ZERO
+ for cell in pixels:
+ avg += cell
+
+ avg.x /= pixels.size()
+ avg.y /= pixels.size()
+
+ avg = Vector2(floor(avg.x), floor(avg.y))
+
+ for i in range(pixels.size()):
+ pixels[i] -= avg
+
+ Type.V_LINE:
+ var center = Vector2.ZERO
+ var last = center
+ pixels.append(Vector2.ZERO)
+
+ for i in range(size - 1):
+ var sig = sign(last.y)
+ if sig == 0:
+ sig = 1
+
+ if last.y < 0:
+ center.y = abs(last.y) * -sig
+ else:
+ center.y = abs(last.y+1) * -sig
+ last = center
+ pixels.append(center)
+ Type.H_LINE:
+ var center = Vector2.ZERO
+ var last = center
+ pixels.append(Vector2.ZERO)
+
+ for i in range(size - 1):
+ var sig = sign(last.x)
+ if sig == 0:
+ sig = 1
+
+ if last.x < 0:
+ center.x = abs(last.x) * -sig
+ else:
+ center.x = abs(last.x+1) * -sig
+ last = center
+ pixels.append(center)
+
+ return pixels
+
+
diff --git a/modules/paint/addon/Canvas.gd b/modules/paint/addon/Canvas.gd
new file mode 100644
index 000000000..77afa4e19
--- /dev/null
+++ b/modules/paint/addon/Canvas.gd
@@ -0,0 +1,461 @@
+extends Control
+class_name GECanvas
+tool
+
+export var pixel_size: int = 16 setget set_pixel_size
+export(int, 1, 2500) var canvas_width = 48 setget set_canvas_width # == pixels
+export(int, 1, 2500) var canvas_height = 28 setget set_canvas_height # == pixels
+export var grid_size = 16 setget set_grid_size
+export var big_grid_size = 10 setget set_big_grid_size
+export var can_draw = true
+
+var mouse_in_region
+var mouse_on_top
+
+var layers : Array = [] # Key: layer_name, val: GELayer
+var active_layer: GELayer
+var preview_layer: GELayer
+var tool_layer: GELayer
+var canvas_layers: Control
+
+var canvas
+var grid
+var big_grid
+var selected_pixels = []
+
+var symmetry_x = false
+var symmetry_y = false
+
+
+func _enter_tree():
+ #-------------------------------
+ # Set nodes
+ #-------------------------------
+ canvas = find_node("Canvas")
+ grid = find_node("Grid")
+ big_grid = find_node("BigGrid")
+ canvas_layers = find_node("CanvasLayers")
+
+ #-------------------------------
+ # setup layers and canvas
+ #-------------------------------
+ connect("mouse_entered", self, "_on_mouse_entered")
+ connect("mouse_exited", self, "_on_mouse_exited")
+
+ #-------------------------------
+ # setup layers and canvas
+ #-------------------------------
+ #canvas_size = Vector2(int(rect_size.x / grid_size), int(rect_size.y / grid_size))
+ #pixel_size = canvas_size
+
+ active_layer = add_new_layer("Layer1")
+ preview_layer = add_new_layer("Preview")
+ tool_layer = add_new_layer("Tool")
+
+ set_process(true)
+
+
+func _process(delta):
+ if not is_visible_in_tree():
+ return
+ var mouse_position = get_local_mouse_position()
+ var rect = Rect2(Vector2(0, 0), rect_size)
+ mouse_in_region = rect.has_point(mouse_position)
+
+
+func _draw():
+ for layer in layers:
+ layer.update_texture()
+
+ preview_layer.update_texture()
+ tool_layer.update_texture()
+
+
+func resize(width: int, height: int):
+ if width < 0:
+ width = 1
+ if height < 0:
+ height = 1
+
+ set_canvas_width(width)
+ set_canvas_height(height)
+
+ preview_layer.resize(width, height)
+ tool_layer.resize(width, height)
+ for layer in layers:
+ layer.resize(width, height)
+
+
+#-------------------------------
+# Export
+#-------------------------------
+
+func set_pixel_size(size: int):
+ pixel_size = size
+ set_grid_size(grid_size)
+ set_big_grid_size(big_grid_size)
+ set_canvas_width(canvas_width)
+ set_canvas_height(canvas_height)
+
+
+func set_grid_size(size):
+ grid_size = size
+ if not find_node("Grid"):
+ return
+ find_node("Grid").size = size * pixel_size
+
+
+func set_big_grid_size(size):
+ big_grid_size = size
+ if not find_node("BigGrid"):
+ return
+ find_node("BigGrid").size = size * pixel_size
+
+
+func set_canvas_width(val: int):
+ canvas_width = val
+ rect_size.x = canvas_width * pixel_size
+
+
+func set_canvas_height(val: int):
+ canvas_height = val
+ rect_size.y = canvas_height * pixel_size
+
+
+#-------------------------------
+# Layer
+#-------------------------------
+
+
+
+func toggle_alpha_locked(layer_name: String):
+ var layer = find_layer_by_name(layer_name)
+ layer.toggle_alpha_locked()
+
+
+func is_alpha_locked() -> bool:
+ return active_layer.alpha_locked
+
+
+func get_content_margin() -> Rect2:
+ var rect = Rect2(999999, 999999, -999999, -999999)
+
+ preview_layer.image.get_used_rect()
+ for layer in layers:
+
+ var r = layer.image.get_used_rect()
+
+ if r.position.x < rect.position.x:
+ rect.position.x = r.position.x
+ if r.position.y < rect.position.y:
+ rect.position.y = r.position.y
+ if r.size.x > rect.size.x:
+ rect.size.x = r.size.x
+ if r.size.y > rect.size.y:
+ rect.size.y = r.size.y
+
+ return rect
+
+
+func crop_to_content():
+ var rect = get_content_margin()
+
+ #print(rect)
+
+ for layer in layers:
+ layer.image
+
+# set_canvas_width(rect.size.x)
+# set_canvas_height(rect.size.x)
+
+# preview_layer.resize(width, height)
+# tool_layer.resize(width, height)
+# for layer in layers:
+# layer.resize(width, height)
+
+
+func get_active_layer():
+ return active_layer
+
+
+func get_preview_layer():
+ return preview_layer
+
+
+func clear_active_layer():
+ active_layer.clear()
+
+
+func clear_preview_layer():
+ preview_layer.clear()
+
+
+func clear_layer(layer_name: String):
+ for layer in layers:
+ if layer.name == layer_name:
+ layer.clear()
+ break
+
+
+func remove_layer(layer_name: String):
+ # change current layer if the active layer is removed
+ var del_layer = find_layer_by_name(layer_name)
+ del_layer.clear()
+ if del_layer == active_layer:
+ for layer in layers:
+ if layer == preview_layer or layer == active_layer or layer == tool_layer:
+ continue
+ active_layer = layer
+ break
+ layers.erase(del_layer)
+ return active_layer
+
+
+func add_new_layer(layer_name: String):
+ for layer in layers:
+ if layer.name == layer_name:
+ return
+ var layer = GELayer.new()
+ layer.name = layer_name
+
+ if layer_name == "Preview":
+ layer.create($PreviewLayer, canvas_width, canvas_height)
+ elif layer_name == "Tool":
+ layer.create($ToolPreviewLayer, canvas_width, canvas_height)
+ else:
+ var texture_rect = TextureRect.new()
+ texture_rect.name = layer_name
+ canvas_layers.add_child(texture_rect, true)
+ texture_rect.expand = true
+ texture_rect.anchor_right = 1
+ texture_rect.anchor_bottom = 1
+ texture_rect.margin_right = 0
+ texture_rect.margin_bottom = 0
+ texture_rect.mouse_filter = Control.MOUSE_FILTER_IGNORE
+ layer.create(texture_rect, canvas_width, canvas_height)
+ layers.append(layer)
+
+ return layer
+
+
+func duplicate_layer(layer_name: String, new_layer_name: String):
+ for layer in layers:
+ if layer.name == new_layer_name:
+ return
+
+ var dup_layer :GELayer = find_layer_by_name(layer_name)
+ var layer :GELayer = add_new_layer(new_layer_name)
+ layer.image.copy_from(dup_layer.image)
+ return layer
+
+
+func toggle_layer_visibility(layer_name: String):
+ for layer in layers:
+ if layer.name == layer_name:
+ layer.visible = not layer.visible
+
+
+func find_layer_by_name(layer_name: String):
+ for layer in layers:
+ if layer.name == layer_name:
+ return layer
+ return null
+
+
+func toggle_lock_layer(layer_name: String):
+ find_layer_by_name(layer_name).toggle_lock()
+
+
+func is_active_layer_locked() -> bool:
+ return active_layer.locked
+
+
+func move_layer_forward(layer_name: String):
+ var layer = find_layer_by_name(layer_name).texture_rect_ref
+ var new_idx = max(layer.get_index() - 1, 0)
+ canvas_layers.move_child(layer, new_idx)
+
+
+func move_layer_back(layer_name: String):
+ var layer = find_layer_by_name(layer_name).texture_rect_ref
+ canvas_layers.move_child(layer, layer.get_index() + 1)
+
+
+func select_layer(layer_name: String):
+ active_layer = find_layer_by_name(layer_name)
+
+
+#-------------------------------
+# Check
+#-------------------------------
+
+func _on_mouse_entered():
+ mouse_on_top = true
+
+
+func _on_mouse_exited():
+ mouse_on_top = false
+
+
+func is_inside_canvas(x, y):
+ if x < 0 or y < 0:
+ return false
+ if x >= canvas_width or y >= canvas_height:
+ return false
+ return true
+
+
+
+#-------------------------------
+# Basic pixel-layer options
+#-------------------------------
+
+
+#Note: Arrays are always passed by reference. To get a copy of an array which
+# can be modified independently of the original array, use duplicate.
+# (https://docs.godotengine.org/en/stable/classes/class_array.html)
+func set_pixel_arr(pixels: Array, color: Color):
+ for pixel in pixels:
+ _set_pixel(active_layer, pixel.x, pixel.y, color)
+
+
+func set_pixel_v(pos: Vector2, color: Color):
+ set_pixel(pos.x, pos.y, color)
+
+
+func set_pixel(x: int, y: int, color: Color):
+ _set_pixel(active_layer, x, y, color)
+
+
+func _set_pixel_v(layer: GELayer, v: Vector2, color: Color):
+ _set_pixel(layer, v.x, v.y, color)
+
+
+func _set_pixel(layer: GELayer, x: int, y: int, color: Color):
+ if not is_inside_canvas(x, y):
+ return
+ layer.set_pixel(x, y, color)
+
+
+func get_pixel_v(pos: Vector2):
+ return get_pixel(pos.x, pos.y)
+
+
+func get_pixel(x: int, y: int):
+ if active_layer:
+ return active_layer.get_pixel(x, y)
+ return null
+
+
+func set_preview_pixel_v(pos: Vector2, color: Color):
+ set_preview_pixel(pos.x, pos.y, color)
+
+
+func set_preview_pixel(x:int, y: int, color: Color):
+ if not is_inside_canvas(x, y):
+ return
+ preview_layer.set_pixel(x, y, color)
+
+
+func get_preview_pixel_v(pos: Vector2):
+ return get_preview_pixel(pos.x, pos.y)
+
+
+func get_preview_pixel(x: int, y: int):
+ if not preview_layer:
+ return null
+ return preview_layer.get_pixel(x, y)
+
+
+
+#-------------------------------
+# Grid
+#-------------------------------
+
+
+func toggle_grid():
+ $Grid.visible = not $Grid.visible
+
+
+func show_grid():
+ $Grid.show()
+
+
+func hide_grid():
+ $Grid.hide()
+
+
+#-------------------------------
+# Handy tools
+#-------------------------------
+
+
+func select_color(x, y):
+ print("???")
+ var same_color_pixels = []
+ var color = get_pixel(x, y)
+ for x in range(active_layer.layer_width):
+ for y in range(active_layer.layer_height):
+ var pixel_color = active_layer.get_pixel(x, y)
+ if pixel_color == color:
+ same_color_pixels.append(color)
+ return same_color_pixels
+
+
+func select_same_color(x, y):
+ return get_neighbouring_pixels(x, y)
+
+
+# returns array of Vector2
+# yoinked from
+# https://www.geeksforgeeks.org/flood-fill-algorithm-implement-fill-paint/
+func get_neighbouring_pixels(pos_x: int, pos_y: int) -> Array:
+ var pixels = []
+
+ var to_check_queue = []
+ var checked_queue = []
+
+ to_check_queue.append(GEUtils.to_1D(pos_x, pos_y, canvas_width))
+
+ var color = get_pixel(pos_x, pos_y)
+
+ while not to_check_queue.empty():
+ var idx = to_check_queue.pop_front()
+ var p = GEUtils.to_2D(idx, canvas_width)
+
+ if idx in checked_queue:
+ continue
+
+ checked_queue.append(idx)
+
+ if get_pixel(p.x, p.y) != color:
+ continue
+
+ # add to result
+ pixels.append(p)
+
+ # check neighbours
+ var x = p.x - 1
+ var y = p.y
+ if is_inside_canvas(x, y):
+ idx = GEUtils.to_1D(x, y, canvas_width)
+ to_check_queue.append(idx)
+
+ x = p.x + 1
+ if is_inside_canvas(x, y):
+ idx = GEUtils.to_1D(x, y, canvas_width)
+ to_check_queue.append(idx)
+
+ x = p.x
+ y = p.y - 1
+ if is_inside_canvas(x, y):
+ idx = GEUtils.to_1D(x, y, canvas_width)
+ to_check_queue.append(idx)
+
+ y = p.y + 1
+ if is_inside_canvas(x, y):
+ idx = GEUtils.to_1D(x, y, canvas_width)
+ to_check_queue.append(idx)
+
+ return pixels
+
diff --git a/modules/paint/addon/CanvasOutline.gd b/modules/paint/addon/CanvasOutline.gd
new file mode 100644
index 000000000..8bf94a660
--- /dev/null
+++ b/modules/paint/addon/CanvasOutline.gd
@@ -0,0 +1,31 @@
+tool
+extends Control
+
+export var color = Color()
+
+
+func _ready():
+ pass
+
+
+func _draw():
+ var size = get_parent().rect_size
+ var pos = Vector2.ZERO #get_parent().rect_global_position
+ draw_outline_box(pos, size, color, 1)
+
+
+func draw_outline_box(pos, size, color, width):
+ #Top line
+ draw_line(pos, pos + Vector2(size.x, 0), color, width)
+ #Left line
+ draw_line(pos, pos + Vector2(0, size.y), color, width)
+ #Bottom line
+ draw_line(pos + Vector2(0, size.y), pos + Vector2(size.x, size.y), color, width)
+ #Right line
+ draw_line(pos + Vector2(size.x, 0), pos + Vector2(size.x, size.y), color, width)
+
+
+func _process(delta):
+ if not is_visible_in_tree():
+ return
+ update()
diff --git a/modules/paint/addon/Colors.gd b/modules/paint/addon/Colors.gd
new file mode 100644
index 000000000..c198e59f9
--- /dev/null
+++ b/modules/paint/addon/Colors.gd
@@ -0,0 +1,34 @@
+tool
+extends GridContainer
+
+signal color_change_request
+
+func _enter_tree():
+ for child in get_children():
+ child.set("custom_styles/normal", StyleBoxFlat.new())
+ child.get("custom_styles/normal").set("bg_color", Color(randf(), randf(), randf()))
+ for child in get_children():
+ if child.is_connected("pressed", self, "change_color_to"):
+ return
+ child.connect("pressed", self, "change_color_to", [child.get("custom_styles/normal").bg_color])
+
+
+func change_color_to(color):
+ emit_signal("color_change_request", color)
+
+
+func add_color_prefab(color: Color):
+ var dup = get_child(0).duplicate()
+ add_child(dup)
+ move_child(dup, 0)
+ dup.set("custom_styles/normal", StyleBoxFlat.new())
+ dup.get("custom_styles/normal").set("bg_color", color)
+ for child in get_children():
+ if child.is_connected("pressed", self, "change_color_to"):
+ return
+ child.connect("pressed", self, "change_color_to", [child.get("custom_styles/normal").bg_color])
+
+
+
+
+
diff --git a/modules/paint/addon/DebugTextDisplay.gd b/modules/paint/addon/DebugTextDisplay.gd
new file mode 100644
index 000000000..bdb761666
--- /dev/null
+++ b/modules/paint/addon/DebugTextDisplay.gd
@@ -0,0 +1,9 @@
+extends RichTextLabel
+tool
+
+func _ready():
+ pass
+
+
+func display_text(text):
+ self.text = text
diff --git a/modules/paint/addon/Editor.gd b/modules/paint/addon/Editor.gd
new file mode 100644
index 000000000..b9561b8a1
--- /dev/null
+++ b/modules/paint/addon/Editor.gd
@@ -0,0 +1,834 @@
+tool
+extends Control
+
+enum Tools {
+ PAINT,
+ BRUSH,
+ BUCKET,
+ RAINBOW,
+ LINE,
+ RECT,
+ DARKEN,
+ BRIGHTEN
+ COLORPICKER,
+ CUT,
+ PASTECUT,
+}
+
+# Keyboard shortcuts
+const K_UNDO = KEY_Z
+const K_REDO = KEY_Y
+const K_PENCIL = KEY_Q
+const K_BRUSH = KEY_W
+const K_BUCKET = KEY_F
+const K_RAINBOW = KEY_R
+const K_LINE = KEY_L
+const K_DARK = KEY_D
+const K_BRIGHT = KEY_B
+const K_CUT = KEY_C
+const K_PICK = KEY_P
+
+
+var layer_buttons: Control
+var paint_canvas_container_node
+var paint_canvas: GECanvas
+var canvas_background: TextureRect
+var grids_node
+var colors_grid
+var selected_color = Color(1, 1, 1, 1) setget set_selected_color
+var util = preload("res://addons/Godoxel/Util.gd")
+var textinfo
+var allow_drawing = true
+
+var mouse_in_region = false
+var mouse_on_top = false
+
+
+var _middle_mouse_pressed_pos = null
+var _middle_mouse_pressed_start_pos = null
+var _left_mouse_pressed_start_pos = Vector2()
+var _previous_tool
+var brush_mode
+
+var _layer_button_ref = {}
+
+var _total_added_layers = 1
+
+var selected_brush_prefab = 0
+var _last_drawn_pixel = Vector2.ZERO
+var _last_preview_draw_cell_pos = Vector2.ZERO
+
+var _selection_cells = []
+var _selection_colors = []
+
+var _cut_pos = Vector2.ZERO
+var _cut_size = Vector2.ZERO
+
+var _actions_history = [] # for undo
+var _redo_history = []
+var _current_action
+
+var _last_mouse_pos_canvas_area = Vector2.ZERO
+
+var _picked_color = false
+
+var mouse_position = Vector2()
+var canvas_position = Vector2()
+var canvas_mouse_position = Vector2()
+var cell_mouse_position = Vector2()
+var cell_color = Color()
+
+var last_mouse_position = Vector2()
+var last_canvas_position = Vector2()
+var last_canvas_mouse_position = Vector2()
+var last_cell_mouse_position = Vector2()
+var last_cell_color = Color()
+
+const current_layer_highlight = Color(0.354706, 0.497302, 0.769531)
+const other_layer_highlight = Color(0.180392, 0.176471, 0.176471)
+const locked_layer_highlight = Color(0.098039, 0.094118, 0.094118)
+
+var big_grid_pixels = 4 # 1 grid-box is big_grid_pixels big
+
+
+
+func _ready():
+ #--------------------
+ #Setup nodes
+ #--------------------
+
+ paint_canvas_container_node = find_node("PaintCanvasContainer")
+ textinfo = find_node("DebugTextDisplay")
+ selected_color = find_node("ColorPicker").color
+ colors_grid = find_node("Colors")
+ paint_canvas = paint_canvas_container_node.find_node("Canvas")
+ layer_buttons = find_node("LayerButtons")
+ canvas_background = find_node("CanvasBackground")
+
+ set_process(true)
+
+ #--------------------
+ #connect nodes
+ #--------------------
+ if not colors_grid.is_connected("color_change_request", self, "change_color"):
+ colors_grid.connect("color_change_request", self, "change_color")
+
+ if not is_connected("visibility_changed", self, "_on_Editor_visibility_changed"):
+ connect("visibility_changed", self, "_on_Editor_visibility_changed")
+
+ find_node("CanvasBackground").material.set_shader_param(
+ "pixel_size", 8 * pow(0.5, big_grid_pixels)/paint_canvas.pixel_size)
+
+ # ready
+
+ set_brush(Tools.PAINT)
+ _layer_button_ref[layer_buttons.get_child(0).name] = layer_buttons.get_child(0) #ugly
+ _connect_layer_buttons()
+ highlight_layer(paint_canvas.get_active_layer().name)
+
+ find_node("BrushSizeLabel").text = str(int(find_node("BrushSize").value))
+
+ paint_canvas.update()
+
+
+func _input(event):
+ if is_any_menu_open():
+ return
+ if not is_visible_in_tree():
+ return
+ if paint_canvas_container_node == null or paint_canvas == null:
+ return
+
+ if event is InputEventKey and event.is_pressed() and not event.is_echo():
+ _handle_shortcuts(event.scancode)
+
+ if is_mouse_in_canvas() and paint_canvas.mouse_on_top:
+ _handle_zoom(event)
+
+ if paint_canvas.is_active_layer_locked():
+ return
+
+ if brush_mode == Tools.CUT:
+ if event is InputEventMouseButton:
+ if event.button_index == BUTTON_LEFT:
+ if not event.pressed:
+ commit_action()
+
+ if (paint_canvas.mouse_in_region and paint_canvas.mouse_on_top):
+ if event is InputEventMouseButton:
+ match brush_mode:
+ Tools.BUCKET:
+ if event.button_index == BUTTON_LEFT:
+ if event.pressed:
+ if _current_action == null:
+ _current_action = get_action()
+ do_action([cell_mouse_position, last_cell_mouse_position, selected_color])
+
+ Tools.COLORPICKER:
+ if event.button_index == BUTTON_LEFT:
+ if event.pressed:
+ if paint_canvas.get_pixel(cell_mouse_position.x, cell_mouse_position.y).a == 0:
+ return
+ selected_color = paint_canvas.get_pixel(cell_mouse_position.x, cell_mouse_position.y)
+ _picked_color = true
+ find_node("Colors").add_color_prefab(selected_color)
+ elif _picked_color:
+ set_brush(_previous_tool)
+ elif event.button_index == BUTTON_RIGHT:
+ if event.pressed:
+ set_brush(_previous_tool)
+
+ Tools.PASTECUT:
+ if event.button_index == BUTTON_RIGHT:
+ if event.pressed:
+ commit_action()
+ set_brush(Tools.PAINT)
+
+
+func _process(delta):
+ if not is_visible_in_tree():
+ return
+ if paint_canvas_container_node == null or paint_canvas == null:
+ return
+ if is_any_menu_open():
+ return
+
+ if is_mouse_in_canvas():
+ _handle_scroll()
+
+ #Update commonly used variables
+ var grid_size = paint_canvas.pixel_size
+ mouse_position = get_global_mouse_position() #paint_canvas.get_local_mouse_position()
+ canvas_position = paint_canvas.rect_global_position
+ canvas_mouse_position = Vector2(mouse_position.x - canvas_position.x, mouse_position.y - canvas_position.y)
+
+ if is_mouse_in_canvas() && paint_canvas.mouse_on_top:
+ cell_mouse_position = Vector2(
+ floor(canvas_mouse_position.x / grid_size),
+ floor(canvas_mouse_position.y / grid_size))
+ cell_color = paint_canvas.get_pixel(cell_mouse_position.x, cell_mouse_position.y)
+
+ update_text_info()
+
+# if not is_mouse_in_canvas():
+# paint_canvas.tool_layer.clear()
+# paint_canvas.update()
+# paint_canvas.tool_layer.update_texture()
+# else:
+ if is_mouse_in_canvas() && paint_canvas.mouse_on_top:
+ if not paint_canvas.is_active_layer_locked():
+ if is_position_in_canvas(get_global_mouse_position()) or \
+ is_position_in_canvas(_last_mouse_pos_canvas_area):
+ brush_process()
+ else:
+ print(cell_mouse_position, " not in ", paint_canvas_container_node.rect_size)
+ print("not in canvas")
+
+ _draw_tool_brush()
+
+ #Update last variables with the current variables
+ last_mouse_position = mouse_position
+ last_canvas_position = canvas_position
+ last_canvas_mouse_position = canvas_mouse_position
+ last_cell_mouse_position = cell_mouse_position
+ last_cell_color = cell_color
+ _last_mouse_pos_canvas_area = get_global_mouse_position() #paint_canvas_container_node.get_local_mouse_position()
+
+
+func _handle_shortcuts(scancode):
+ match scancode:
+ K_UNDO:
+ undo_action()
+
+ K_REDO:
+ redo_action()
+
+ K_PENCIL:
+ set_brush(Tools.PAINT)
+
+ K_BRUSH:
+ set_brush(Tools.BRUSH)
+
+ K_BUCKET:
+ set_brush(Tools.BUCKET)
+
+ K_RAINBOW:
+ set_brush(Tools.RAINBOW)
+
+ K_LINE:
+ set_brush(Tools.LINE)
+
+ K_DARK:
+ set_brush(Tools.DARKEN)
+
+ K_BRIGHT:
+ set_brush(Tools.BRIGHTEN)
+
+ K_CUT:
+ set_brush(Tools.CUT)
+
+ K_PICK:
+ set_brush(Tools.COLORPICKER)
+
+
+func _draw_tool_brush():
+ paint_canvas.tool_layer.clear()
+
+ match brush_mode:
+ Tools.PASTECUT:
+ for idx in range(_selection_cells.size()):
+ var pixel = _selection_cells[idx]
+# if pixel.x < 0 or pixel.y < 0:
+# print(pixel)
+ var color = _selection_colors[idx]
+ pixel -= _cut_pos + _cut_size / 2
+ pixel += cell_mouse_position
+ paint_canvas._set_pixel_v(paint_canvas.tool_layer, pixel, color)
+ Tools.BRUSH:
+ var pixels = BrushPrefabs.get_brush(selected_brush_prefab, find_node("BrushSize").value)
+ for pixel in pixels:
+
+ paint_canvas._set_pixel(paint_canvas.tool_layer,
+ cell_mouse_position.x + pixel.x, cell_mouse_position.y + pixel.y, selected_color)
+
+ Tools.RAINBOW:
+ paint_canvas._set_pixel(paint_canvas.tool_layer,
+ cell_mouse_position.x, cell_mouse_position.y, Color(0.46875, 0.446777, 0.446777, 0.196078))
+
+ Tools.COLORPICKER:
+ paint_canvas._set_pixel(paint_canvas.tool_layer,
+ cell_mouse_position.x, cell_mouse_position.y, Color(0.866667, 0.847059, 0.847059, 0.196078))
+ _:
+ paint_canvas._set_pixel(paint_canvas.tool_layer,
+ cell_mouse_position.x, cell_mouse_position.y, selected_color)
+
+ paint_canvas.update()
+ #TODO add here brush prefab drawing
+ paint_canvas.tool_layer.update_texture()
+
+
+func _handle_scroll():
+ if Input.is_mouse_button_pressed(BUTTON_MIDDLE):
+ if _middle_mouse_pressed_start_pos == null:
+ _middle_mouse_pressed_start_pos = paint_canvas.rect_position
+ _middle_mouse_pressed_pos = get_global_mouse_position()
+
+ paint_canvas.rect_position = _middle_mouse_pressed_start_pos
+ paint_canvas.rect_position += get_global_mouse_position() - _middle_mouse_pressed_pos
+
+ elif _middle_mouse_pressed_start_pos != null:
+ _middle_mouse_pressed_start_pos = null
+
+
+const max_zoom_out = 1
+const max_zoom_in = 50
+
+func _handle_zoom(event):
+ if not event is InputEventMouseButton:
+ return
+ if event.is_pressed():
+ if event.button_index == BUTTON_WHEEL_UP:
+ var px = min(paint_canvas.pixel_size * 2, max_zoom_in)
+ if px == paint_canvas.pixel_size:
+ return
+ paint_canvas.set_pixel_size(px)
+ find_node("CanvasBackground").material.set_shader_param(
+ "pixel_size", 8 * pow(0.5, big_grid_pixels)/paint_canvas.pixel_size)
+ paint_canvas.rect_position -= paint_canvas.get_local_mouse_position()
+ paint_canvas.rect_position.x = clamp(paint_canvas.rect_position.x, -paint_canvas.rect_size.x * 0.8, rect_size.x)
+ paint_canvas.rect_position.y = clamp(paint_canvas.rect_position.y, -paint_canvas.rect_size.y * 0.8, rect_size.y)
+ elif event.button_index == BUTTON_WHEEL_DOWN:
+ var px = max(paint_canvas.pixel_size / 2.0, max_zoom_out)
+ if px == paint_canvas.pixel_size:
+ return
+ paint_canvas.set_pixel_size(px)
+ find_node("CanvasBackground").material.set_shader_param(
+ # 4 2 1
+ "pixel_size", 8 * pow(0.5, big_grid_pixels)/paint_canvas.pixel_size)
+ paint_canvas.rect_position += paint_canvas.get_local_mouse_position() / 2
+ paint_canvas.rect_position.x = clamp(paint_canvas.rect_position.x, -paint_canvas.rect_size.x * 0.8, rect_size.x)
+ paint_canvas.rect_position.y = clamp(paint_canvas.rect_position.y, -paint_canvas.rect_size.y * 0.8, rect_size.y)
+
+
+func _handle_cut():
+ if Input.is_mouse_button_pressed(BUTTON_RIGHT):
+ paint_canvas.clear_preview_layer()
+ set_brush(_previous_tool)
+ return
+
+ if Input.is_mouse_button_pressed(BUTTON_LEFT):
+ for pixel_pos in GEUtils.get_pixels_in_line(cell_mouse_position, last_cell_mouse_position):
+ for idx in range(_selection_cells.size()):
+ var pixel = _selection_cells[idx]
+ var color = _selection_colors[idx]
+ pixel -= _cut_pos + _cut_size / 2
+ pixel += pixel_pos
+ paint_canvas.set_pixel_v(pixel, color)
+ else:
+ if _last_preview_draw_cell_pos == cell_mouse_position:
+ return
+ paint_canvas.clear_preview_layer()
+ for idx in range(_selection_cells.size()):
+ var pixel = _selection_cells[idx]
+ var color = _selection_colors[idx]
+ pixel -= _cut_pos + _cut_size / 2
+ pixel += cell_mouse_position
+ paint_canvas.set_preview_pixel_v(pixel, color)
+ _last_preview_draw_cell_pos = cell_mouse_position
+
+
+func brush_process():
+ if Input.is_mouse_button_pressed(BUTTON_LEFT):
+ if _current_action == null:
+ _current_action = get_action()
+ if brush_mode == Tools.COLORPICKER:
+ _current_action = null
+
+ match brush_mode:
+ Tools.PAINT:
+ do_action([cell_mouse_position, last_cell_mouse_position, selected_color])
+ Tools.BRUSH:
+ do_action([cell_mouse_position, last_cell_mouse_position, selected_color,
+ selected_brush_prefab, find_node("BrushSize").value])
+ Tools.LINE:
+ do_action([cell_mouse_position, last_cell_mouse_position, selected_color])
+ Tools.RECT:
+ do_action([cell_mouse_position, last_cell_mouse_position, selected_color])
+ Tools.DARKEN:
+ do_action([cell_mouse_position, last_cell_mouse_position, selected_color])
+ Tools.BRIGHTEN:
+ do_action([cell_mouse_position, last_cell_mouse_position, selected_color])
+ Tools.COLORPICKER:
+ pass
+ Tools.CUT:
+ do_action([cell_mouse_position, last_cell_mouse_position, selected_color])
+ Tools.PASTECUT:
+ do_action([cell_mouse_position, last_cell_mouse_position,
+ _selection_cells, _selection_colors,
+ _cut_pos, _cut_size])
+ Tools.RAINBOW:
+ do_action([cell_mouse_position, last_cell_mouse_position])
+ paint_canvas.update()
+
+ elif Input.is_mouse_button_pressed(BUTTON_RIGHT):
+ paint_canvas.update()
+ if _current_action == null:
+ _current_action = get_action()
+
+ match brush_mode:
+ Tools.PAINT:
+ do_action([cell_mouse_position, last_cell_mouse_position, Color.transparent])
+ Tools.BRUSH:
+ do_action([cell_mouse_position, last_cell_mouse_position, Color.transparent,
+ selected_brush_prefab, find_node("BrushSize").value])
+ else:
+ if _current_action and _current_action.can_commit():
+ commit_action()
+ paint_canvas.update()
+
+
+func update_text_info():
+ var text = ""
+
+ var cell_color_text = cell_color
+ cell_color_text = Color(0, 0, 0, 0)
+
+ text += \
+ str("FPS %s\t" + \
+ "Mouse Position %s\t" + \
+ "Canvas Mouse Position %s \t" + \
+ "Canvas Position %s\t\n" + \
+ "Cell Position %s \t" + \
+ "Cell Color %s\t") % [
+ str(Engine.get_frames_per_second()),
+ str(mouse_position),
+ str(canvas_mouse_position),
+ str(canvas_position),
+ str(cell_mouse_position),
+ str(cell_color_text),
+ ]
+
+ find_node("DebugTextDisplay").display_text(text)
+
+
+func _on_Save_pressed():
+ get_node("SaveFileDialog").show()
+
+
+
+#---------------------------------------
+# Actions
+#---------------------------------------
+
+
+func do_action(data: Array):
+ if _current_action == null:
+ #print("clear redo")
+ _redo_history.clear()
+ _current_action.do_action(paint_canvas, data)
+
+
+func commit_action():
+ if not _current_action:
+ return
+
+ #print("commit action")
+ var commit_data = _current_action.commit_action(paint_canvas)
+ var action = get_action()
+ action.action_data = _current_action.action_data.duplicate(true)
+ _actions_history.push_back(action)
+ _redo_history.clear()
+
+ match brush_mode:
+ Tools.CUT:
+ _cut_pos = _current_action.mouse_start_pos
+ _cut_size = _current_action.mouse_end_pos - _current_action.mouse_start_pos
+ _selection_cells = _current_action.action_data.redo.cells.duplicate()
+ _selection_colors = _current_action.action_data.redo.colors.duplicate()
+ set_brush(Tools.PASTECUT)
+ _:
+ _current_action = null
+
+
+func redo_action():
+ if _redo_history.empty():
+ print("nothing to redo")
+ return
+ var action = _redo_history.pop_back()
+ if not action:
+ return
+ _actions_history.append(action)
+ action.redo_action(paint_canvas)
+ paint_canvas.update()
+ #print("redo action")
+
+
+func undo_action():
+ var action = _actions_history.pop_back()
+ if not action:
+ return
+ _redo_history.append(action)
+ action.undo_action(paint_canvas)
+ update()
+ paint_canvas.update()
+ #print("undo action")
+
+
+func get_action():
+ match brush_mode:
+ Tools.PAINT:
+ return GEPencil.new()
+ Tools.BRUSH:
+ return GEBrush.new()
+ Tools.LINE:
+ return GELine.new()
+ Tools.RAINBOW:
+ return GERainbow.new()
+ Tools.BUCKET:
+ return GEBucket.new()
+ Tools.RECT:
+ return GERect.new()
+ Tools.DARKEN:
+ return GEDarken.new()
+ Tools.BRIGHTEN:
+ return GEBrighten.new()
+ Tools.CUT:
+ return GECut.new()
+ Tools.PASTECUT:
+ return GEPasteCut.new()
+ _:
+ #print("no tool!")
+ return null
+
+
+############################################
+# Brushes
+############################################
+
+
+func set_selected_color(color):
+ selected_color = color
+
+
+func set_brush(new_mode):
+ if brush_mode == new_mode:
+ return
+ _previous_tool = brush_mode
+ brush_mode = new_mode
+
+ _current_action = get_action()
+
+ match _previous_tool:
+ Tools.CUT:
+ paint_canvas.clear_preview_layer()
+ Tools.PASTECUT:
+ _selection_cells.clear()
+ _selection_colors.clear()
+ Tools.BUCKET:
+ _current_action = null
+ #print("Selected: ", Tools.keys()[brush_mode])
+
+
+func change_color(new_color):
+ if new_color.a == 0:
+ return
+ selected_color = new_color
+ find_node("ColorPicker").color = selected_color
+
+
+func _on_ColorPicker_color_changed(color):
+ selected_color = color
+
+
+func _on_PaintTool_pressed():
+ set_brush(Tools.PAINT)
+
+
+func _on_BucketTool_pressed():
+ set_brush(Tools.BUCKET)
+
+
+func _on_RainbowTool_pressed():
+ set_brush(Tools.RAINBOW)
+
+
+func _on_BrushTool_pressed():
+ set_brush(Tools.BRUSH)
+
+
+func _on_LineTool_pressed():
+ set_brush(Tools.LINE)
+
+
+func _on_RectTool_pressed():
+ set_brush(Tools.RECT)
+
+
+func _on_DarkenTool_pressed():
+ set_brush(Tools.DARKEN)
+
+
+func _on_BrightenTool_pressed():
+ set_brush(Tools.BRIGHTEN)
+
+
+func _on_ColorPickerTool_pressed():
+ set_brush(Tools.COLORPICKER)
+
+
+func _on_CutTool_pressed():
+ set_brush(Tools.CUT)
+
+
+func _on_Editor_visibility_changed():
+ pause_mode = not visible
+
+
+
+############################################
+# Layer
+############################################
+
+func highlight_layer(layer_name: String):
+ for button in layer_buttons.get_children():
+ if paint_canvas.find_layer_by_name(button.name).locked:
+ button.get("custom_styles/panel").set("bg_color", locked_layer_highlight)
+ elif button.name == layer_name:
+ button.get("custom_styles/panel").set("bg_color", current_layer_highlight)
+ else:
+ button.get("custom_styles/panel").set("bg_color", other_layer_highlight)
+
+
+func toggle_layer_visibility(button, layer_name: String):
+ #print("toggling: ", layer_name)
+ paint_canvas.toggle_layer_visibility(layer_name)
+
+
+func select_layer(layer_name: String):
+ #print("select layer: ", layer_name)
+ paint_canvas.select_layer(layer_name)
+ highlight_layer(layer_name)
+
+
+func lock_layer(button, layer_name: String):
+ paint_canvas.toggle_lock_layer(layer_name)
+ highlight_layer(paint_canvas.get_active_layer().name)
+
+
+func add_new_layer():
+ var new_layer_button = layer_buttons.get_child(0).duplicate()
+ new_layer_button.set("custom_styles/panel", layer_buttons.get_child(0).get("custom_styles/panel").duplicate())
+ layer_buttons.add_child_below_node(
+ layer_buttons.get_child(layer_buttons.get_child_count() - 1), new_layer_button, true)
+ _total_added_layers += 1
+ new_layer_button.find_node("Select").text = "Layer " + str(_total_added_layers)
+ _layer_button_ref[new_layer_button.name] = new_layer_button
+ _connect_layer_buttons()
+
+ var layer: GELayer = paint_canvas.add_new_layer(new_layer_button.name)
+
+ highlight_layer(paint_canvas.get_active_layer().name)
+ #print("added layer: ", layer.name)
+ return layer
+
+
+func remove_active_layer():
+ if layer_buttons.get_child_count() <= 1:
+ return
+ var layer_name = paint_canvas.active_layer.name
+ paint_canvas.remove_layer(layer_name)
+ layer_buttons.remove_child(_layer_button_ref[layer_name])
+ _layer_button_ref[layer_name].queue_free()
+ _layer_button_ref.erase(layer_name)
+
+ highlight_layer(paint_canvas.get_active_layer().name)
+
+
+func duplicate_active_layer():
+ var new_layer_button = layer_buttons.get_child(0).duplicate()
+ new_layer_button.set("custom_styles/panel", layer_buttons.get_child(0).get("custom_styles/panel").duplicate())
+ layer_buttons.add_child_below_node(
+ layer_buttons.get_child(layer_buttons.get_child_count() - 1), new_layer_button, true)
+
+ _total_added_layers += 1 # for keeping track...
+ new_layer_button.find_node("Select").text = "Layer " + str(_total_added_layers)
+
+ var new_layer = paint_canvas.duplicate_layer(paint_canvas.active_layer.name, new_layer_button.name)
+ new_layer.update_texture()
+ _layer_button_ref[new_layer.name] = new_layer_button
+
+ new_layer_button.find_node("Select").connect("pressed", self, "select_layer", [new_layer_button.name])
+ new_layer_button.find_node("Visible").connect("pressed", self, "toggle_layer_visibility",
+ [new_layer_button.find_node("Visible"), new_layer_button.name])
+ new_layer_button.find_node("Up").connect("pressed", self, "move_down", [new_layer_button])
+ new_layer_button.find_node("Down").connect("pressed", self, "move_up", [new_layer_button])
+ new_layer_button.find_node("Lock").connect("pressed", self, "lock_layer", [new_layer_button, new_layer_button.name])
+
+ # update highlight
+ highlight_layer(paint_canvas.get_active_layer().name)
+ #print("added layer: ", new_layer.name, " (total:", layer_buttons.get_child_count(), ")")
+
+
+func move_up(layer_btn):
+ var new_idx = min(layer_btn.get_index() + 1, layer_buttons.get_child_count())
+ #print("move_up: ", layer_btn.name, " from ", layer_btn.get_index(), " to ", new_idx)
+ layer_buttons.move_child(layer_btn, new_idx)
+ paint_canvas.move_layer_back(layer_btn.name)
+
+
+func move_down(layer_btn):
+ var new_idx = max(layer_btn.get_index() - 1, 0)
+ #print("move_down: ", layer_btn.name, " from ", layer_btn.get_index(), " to ", new_idx)
+ layer_buttons.move_child(layer_btn, new_idx)
+ paint_canvas.move_layer_forward(layer_btn.name)
+
+
+func _connect_layer_buttons():
+ for layer_btn in layer_buttons.get_children():
+ if layer_btn.find_node("Select").is_connected("pressed", self, "select_layer"):
+ continue
+ layer_btn.find_node("Select").connect("pressed", self, "select_layer", [layer_btn.name])
+ layer_btn.find_node("Visible").connect("pressed", self, "toggle_layer_visibility",
+ [layer_btn.find_node("Visible"), layer_btn.name])
+ layer_btn.find_node("Up").connect("pressed", self, "move_down", [layer_btn])
+ layer_btn.find_node("Down").connect("pressed", self, "move_up", [layer_btn])
+ layer_btn.find_node("Lock").connect("pressed", self, "lock_layer",
+ [layer_btn, layer_btn.name])
+
+
+func _on_Button_pressed():
+ add_new_layer()
+
+
+func _on_PaintCanvasContainer_mouse_entered():
+ if mouse_on_top == true:
+ return
+ mouse_on_top = true
+ paint_canvas.tool_layer.clear()
+ paint_canvas.update()
+ paint_canvas.tool_layer.update_texture()
+
+
+func _on_PaintCanvasContainer_mouse_exited():
+ if mouse_on_top == false:
+ return
+ mouse_on_top = false
+ paint_canvas.tool_layer.clear()
+ paint_canvas.update()
+ paint_canvas.tool_layer.update_texture()
+
+
+func _on_ColorPicker_popup_closed():
+ find_node("Colors").add_color_prefab(find_node("ColorPicker").color)
+
+
+############################################
+# MISC
+############################################
+
+func is_position_in_canvas(pos):
+ if Rect2(paint_canvas_container_node.rect_global_position,
+ paint_canvas_container_node.rect_global_position + paint_canvas_container_node.rect_size).has_point(pos):
+ return true
+ return false
+
+
+func is_mouse_in_canvas() -> bool:
+ if is_position_in_canvas(get_global_mouse_position()):
+ return true #mouse_on_top # check if mouse is inside canvas
+ else:
+ return false
+
+
+func is_any_menu_open() -> bool:
+ return $ChangeCanvasSize.visible or \
+ $ChangeGridSizeDialog.visible or \
+ $Settings.visible or \
+ $LoadFileDialog.visible or \
+ $SaveFileDialog.visible or \
+ find_node("Navbar").is_any_menu_open()
+
+
+
+func _on_LockAlpha_pressed():
+ var checked = find_node("LockAlpha").pressed
+ paint_canvas.active_layer.toggle_alpha_locked()
+ for i in range(find_node("Layer").get_popup().get_item_count()):
+ if find_node("Layer").get_popup().get_item_text(i) == "Toggle Alpha Locked":
+ find_node("Layer").get_popup().set_item_checked(i, not find_node("Layer").get_popup().is_item_checked(i))
+
+
+func _on_BrushRect_pressed():
+ if brush_mode != Tools.BRUSH:
+ set_brush(Tools.BRUSH)
+ selected_brush_prefab = BrushPrefabs.Type.RECT
+
+
+func _on_BrushCircle_pressed():
+ if brush_mode != Tools.BRUSH:
+ set_brush(Tools.BRUSH)
+ selected_brush_prefab = BrushPrefabs.Type.CIRCLE
+
+
+func _on_BrushVLine_pressed():
+ if brush_mode != Tools.BRUSH:
+ set_brush(Tools.BRUSH)
+ selected_brush_prefab = BrushPrefabs.Type.V_LINE
+
+
+func _on_BrushHLine_pressed():
+ if brush_mode != Tools.BRUSH:
+ set_brush(Tools.BRUSH)
+ selected_brush_prefab = BrushPrefabs.Type.H_LINE
+
+
+func _on_BrushSize_value_changed(value: float):
+ find_node("BrushSizeLabel").text = str(int(value))
+
+
+func _on_XSymmetry_pressed():
+ paint_canvas.symmetry_x = not paint_canvas.symmetry_x
+
+
+func _on_YSymmetry_pressed():
+ paint_canvas.symmetry_y = not paint_canvas.symmetry_y
diff --git a/modules/paint/addon/Editor.tscn b/modules/paint/addon/Editor.tscn
new file mode 100644
index 000000000..e69e445d9
--- /dev/null
+++ b/modules/paint/addon/Editor.tscn
@@ -0,0 +1,1265 @@
+[gd_scene load_steps=56 format=2]
+
+[ext_resource path="res://addons/Godoxel/Editor.gd" type="Script" id=1]
+[ext_resource path="res://addons/Godoxel/dialogs/LoadFileDialog.gd" type="Script" id=2]
+[ext_resource path="res://addons/Godoxel/Canvas.gd" type="Script" id=3]
+[ext_resource path="res://addons/Godoxel/VisualGrid.tscn" type="PackedScene" id=4]
+[ext_resource path="res://addons/Godoxel/CanvasOutline.gd" type="Script" id=5]
+[ext_resource path="res://addons/Godoxel/Navbar.gd" type="Script" id=6]
+[ext_resource path="res://addons/Godoxel/MenuButtonExtended.gd" type="Script" id=7]
+[ext_resource path="res://addons/Godoxel/Colors.gd" type="Script" id=8]
+[ext_resource path="res://addons/Godoxel/SaveFileDialog.gd" type="Script" id=9]
+[ext_resource path="res://addons/Godoxel/Settings.tscn" type="PackedScene" id=10]
+[ext_resource path="res://addons/Godoxel/DebugTextDisplay.gd" type="Script" id=11]
+[ext_resource path="res://addons/Godoxel/LayerButton.tscn" type="PackedScene" id=12]
+[ext_resource path="res://addons/Godoxel/assets/grid.png" type="Texture" id=13]
+[ext_resource path="res://addons/Godoxel/dialogs/ConfirmationDialog.gd" type="Script" id=14]
+[ext_resource path="res://addons/Godoxel/dialogs/ChangeGridSizeDialog.gd" type="Script" id=15]
+[ext_resource path="res://addons/Godoxel/assets/BrushVLine.png" type="Texture" id=16]
+[ext_resource path="res://addons/Godoxel/assets/BrushRect.png" type="Texture" id=17]
+[ext_resource path="res://addons/Godoxel/assets/BrushCircle.png" type="Texture" id=18]
+[ext_resource path="res://addons/Godoxel/assets/BrushHLine.png" type="Texture" id=19]
+[ext_resource path="res://addons/Godoxel/assets/BrushRect_Hovered.png" type="Texture" id=20]
+[ext_resource path="res://addons/Godoxel/assets/BrushCircle_Hovered.png" type="Texture" id=21]
+[ext_resource path="res://addons/Godoxel/assets/BrushVLine_Hovered.png" type="Texture" id=22]
+[ext_resource path="res://addons/Godoxel/assets/BrushHLine_Hovered.png" type="Texture" id=23]
+
+[sub_resource type="StyleBoxFlat" id=7]
+bg_color = Color( 0.2, 0.2, 0.2, 1 )
+
+[sub_resource type="StyleBoxFlat" id=33]
+bg_color = Color( 0.397716, 0.0538159, 0.114134, 1 )
+
+[sub_resource type="StyleBoxFlat" id=34]
+bg_color = Color( 0.989919, 0.990908, 0.315986, 1 )
+
+[sub_resource type="StyleBoxFlat" id=35]
+bg_color = Color( 0.563746, 0.536825, 0.218219, 1 )
+
+[sub_resource type="StyleBoxFlat" id=36]
+bg_color = Color( 0.336323, 0.0659741, 0.163289, 1 )
+
+[sub_resource type="StyleBoxFlat" id=37]
+bg_color = Color( 0.240192, 0.37346, 0.330661, 1 )
+
+[sub_resource type="StyleBoxFlat" id=38]
+bg_color = Color( 0.369256, 0.97379, 0.216537, 1 )
+
+[sub_resource type="StyleBoxFlat" id=39]
+bg_color = Color( 0.755049, 0.491349, 0.826652, 1 )
+
+[sub_resource type="StyleBoxFlat" id=40]
+bg_color = Color( 0.848742, 0.0115273, 0.122094, 1 )
+
+[sub_resource type="StyleBoxFlat" id=41]
+bg_color = Color( 0.920589, 0.44931, 0.150271, 1 )
+
+[sub_resource type="StyleBoxFlat" id=42]
+bg_color = Color( 0.325517, 0.694568, 0.703849, 1 )
+
+[sub_resource type="StyleBoxFlat" id=43]
+bg_color = Color( 0.926427, 0.334865, 0.471709, 1 )
+
+[sub_resource type="StyleBoxFlat" id=44]
+bg_color = Color( 0.00867083, 0.188914, 0.300704, 1 )
+
+[sub_resource type="StyleBoxFlat" id=45]
+bg_color = Color( 0.501144, 0.687167, 0.52919, 1 )
+
+[sub_resource type="StyleBoxFlat" id=46]
+bg_color = Color( 0.953225, 0.374313, 0.443307, 1 )
+
+[sub_resource type="StyleBoxFlat" id=47]
+bg_color = Color( 0.0121565, 0.599621, 0.868357, 1 )
+
+[sub_resource type="StyleBoxFlat" id=48]
+bg_color = Color( 0.245633, 0.583044, 0.20955, 1 )
+
+[sub_resource type="StyleBoxFlat" id=49]
+bg_color = Color( 0.510868, 0.721501, 0.544154, 1 )
+
+[sub_resource type="StyleBoxFlat" id=50]
+bg_color = Color( 0.786819, 0.162435, 0.309762, 1 )
+
+[sub_resource type="StyleBoxFlat" id=51]
+bg_color = Color( 0.772837, 0.467272, 0.0682784, 1 )
+
+[sub_resource type="StyleBoxFlat" id=52]
+bg_color = Color( 0.753402, 0.362869, 0.343818, 1 )
+
+[sub_resource type="StyleBoxFlat" id=53]
+bg_color = Color( 0.0699588, 0.589297, 0.290648, 1 )
+
+[sub_resource type="StyleBoxFlat" id=54]
+bg_color = Color( 0.443224, 0.249702, 0.838284, 1 )
+
+[sub_resource type="StyleBoxFlat" id=55]
+bg_color = Color( 0.660357, 0.11075, 0.876227, 1 )
+
+[sub_resource type="StyleBoxFlat" id=56]
+bg_color = Color( 0.296861, 0.400053, 0.915836, 1 )
+
+[sub_resource type="Shader" id=1]
+code = "shader_type canvas_item;
+
+uniform float pixel_size : hint_range(0.01, 1.0);
+
+
+void fragment() {
+ vec4 color = texture(TEXTURE, UV);
+
+ float light = 0.8;
+ float dark = 0.4;
+
+ float val = dark;
+
+ if ( int(UV.y * 8.0 * pixel_size) % 2 == 1 ) {
+ if ( int(UV.x * 8.0 * pixel_size) % 2 == 1 ) {
+ val = dark;
+ }
+ else {
+ val = light;
+ }
+ }
+ else {
+ if ( int(UV.x * 8.0 * pixel_size) % 2 == 1 ) {
+ val = light;
+ }
+ else {
+ val = dark;
+ }
+ }
+
+ color.rgb = vec3(val, val, val);
+
+ COLOR = color;
+}"
+
+[sub_resource type="ShaderMaterial" id=2]
+shader = SubResource( 1 )
+shader_param/pixel_size = 0.125
+
+[sub_resource type="Image" id=57]
+data = {
+"data": PoolByteArray( 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0 ),
+"format": "RGBA8",
+"height": 64,
+"mipmaps": false,
+"width": 64
+}
+
+[sub_resource type="ImageTexture" id=58]
+flags = 0
+flags = 0
+image = SubResource( 57 )
+size = Vector2( 64, 64 )
+
+[sub_resource type="Image" id=59]
+data = {
+"data": PoolByteArray( 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0 ),
+"format": "RGBA8",
+"height": 64,
+"mipmaps": false,
+"width": 64
+}
+
+[sub_resource type="ImageTexture" id=60]
+flags = 0
+flags = 0
+image = SubResource( 59 )
+size = Vector2( 64, 64 )
+
+[sub_resource type="StyleBoxFlat" id=32]
+bg_color = Color( 0.156863, 0.156863, 0.156863, 1 )
+border_width_top = 2
+border_color = Color( 0.0901961, 0.0901961, 0.0901961, 1 )
+
+[node name="Editor" type="Control"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+rect_clip_content = true
+size_flags_horizontal = 3
+size_flags_vertical = 3
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Panel" type="Panel" parent="."]
+anchor_right = 1.0
+anchor_bottom = 1.0
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="NoBCViewportsnotworking26181" type="VBoxContainer" parent="Panel"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+__meta__ = {
+"_edit_lock_": true,
+"_editor_description_": "https://github.com/godotengine/godot/issues/26181"
+}
+
+[node name="Navbar" type="HBoxContainer" parent="Panel/NoBCViewportsnotworking26181"]
+margin_right = 1024.0
+margin_bottom = 20.0
+size_flags_horizontal = 3
+script = ExtResource( 6 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Buttons" type="HBoxContainer" parent="Panel/NoBCViewportsnotworking26181/Navbar"]
+margin_right = 430.0
+margin_bottom = 20.0
+custom_constants/separation = 20
+__meta__ = {
+"_edit_use_anchors_": true
+}
+
+[node name="File" type="MenuButton" parent="Panel/NoBCViewportsnotworking26181/Navbar/Buttons"]
+margin_right = 35.0
+margin_bottom = 20.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+text = "File"
+flat = false
+items = [ "New", null, 0, false, false, 0, 0, null, "", false, "Save", null, 0, false, false, 1, 0, null, "", false, "Load", null, 0, false, false, 2, 0, null, "", false ]
+switch_on_hover = true
+script = ExtResource( 7 )
+
+[node name="Edit" type="MenuButton" parent="Panel/NoBCViewportsnotworking26181/Navbar/Buttons"]
+margin_left = 55.0
+margin_right = 91.0
+margin_bottom = 20.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+disabled = true
+text = "Edit"
+flat = false
+items = [ "Undo", null, 0, false, false, 0, 0, null, "", false, "Redo", null, 0, false, false, 1, 0, null, "", false, "Cut", null, 0, false, false, 2, 0, null, "", false, "Copy", null, 0, false, false, 3, 0, null, "", false, "Paste", null, 0, false, false, 4, 0, null, "", false ]
+switch_on_hover = true
+script = ExtResource( 7 )
+
+[node name="Canvas" type="MenuButton" parent="Panel/NoBCViewportsnotworking26181/Navbar/Buttons"]
+margin_left = 111.0
+margin_right = 167.0
+margin_bottom = 20.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+text = "Canvas"
+flat = false
+items = [ "Change Size", null, 0, false, false, 0, 0, null, "", false, "Crop To Content", null, 0, false, true, 1, 0, null, "", false ]
+switch_on_hover = true
+script = ExtResource( 7 )
+
+[node name="Layer" type="MenuButton" parent="Panel/NoBCViewportsnotworking26181/Navbar/Buttons"]
+margin_left = 187.0
+margin_right = 233.0
+margin_bottom = 20.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+text = "Layer"
+flat = false
+items = [ "Add Layer", null, 0, false, false, 0, 0, null, "", false, "Delete Layer", null, 0, false, false, 1, 0, null, "", false, "Duplicate Layer", null, 0, false, false, 2, 0, null, "", false, "Clear Layer", null, 0, false, false, 3, 0, null, "", false, "", null, 0, false, false, 4, 0, null, "", true, "Toggle Alpha Locked", null, 1, false, false, 5, 0, null, "", false ]
+switch_on_hover = true
+script = ExtResource( 7 )
+
+[node name="Grid" type="MenuButton" parent="Panel/NoBCViewportsnotworking26181/Navbar/Buttons"]
+margin_left = 253.0
+margin_right = 292.0
+margin_bottom = 20.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+text = "Grid"
+flat = false
+items = [ "Toggle Grid", null, 0, false, false, 0, 0, null, "", false, "Change Grid Size", null, 0, false, false, 1, 0, null, "", false ]
+switch_on_hover = true
+script = ExtResource( 7 )
+
+[node name="Magic" type="MenuButton" parent="Panel/NoBCViewportsnotworking26181/Navbar/Buttons"]
+margin_left = 312.0
+margin_right = 361.0
+margin_bottom = 20.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+text = "Magic"
+flat = false
+items = [ "ChangeSingleColor", null, 0, false, false, 0, 0, null, "", false, "ChangeColorRange", null, 0, false, false, 1, 0, null, "", false, "HSV Noise", null, 0, false, false, 2, 0, null, "", false, "HSV Color Modulation", null, 0, false, false, 3, 0, null, "", false ]
+switch_on_hover = true
+script = ExtResource( 7 )
+
+[node name="Editor" type="MenuButton" parent="Panel/NoBCViewportsnotworking26181/Navbar/Buttons"]
+margin_left = 381.0
+margin_right = 430.0
+margin_bottom = 20.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+text = "Editor"
+flat = false
+items = [ "Settings", null, 0, false, false, 0, 0, null, "", false ]
+switch_on_hover = true
+script = ExtResource( 7 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Control" type="Control" parent="Panel/NoBCViewportsnotworking26181/Navbar"]
+margin_left = 434.0
+margin_right = 907.0
+margin_bottom = 20.0
+size_flags_horizontal = 3
+
+[node name="Label" type="Label" parent="Panel/NoBCViewportsnotworking26181/Navbar"]
+modulate = Color( 1, 1, 1, 0.184314 )
+margin_left = 911.0
+margin_top = 3.0
+margin_right = 1024.0
+margin_bottom = 17.0
+text = "Undo (Z) Redo (Y)"
+align = 1
+valign = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Control" type="HBoxContainer" parent="Panel/NoBCViewportsnotworking26181"]
+margin_top = 24.0
+margin_right = 1024.0
+margin_bottom = 556.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="LeftPanel" type="PanelContainer" parent="Panel/NoBCViewportsnotworking26181/Control"]
+margin_right = 157.0
+margin_bottom = 532.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_styles/panel = SubResource( 7 )
+__meta__ = {
+"_editor_description_": ""
+}
+
+[node name="MarginContainer" type="MarginContainer" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel"]
+margin_right = 157.0
+margin_bottom = 532.0
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="VBoxContainer" type="VBoxContainer" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer"]
+margin_right = 157.0
+margin_bottom = 532.0
+custom_constants/separation = 12
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="ScrollContainer" type="ScrollContainer" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer"]
+margin_right = 157.0
+margin_bottom = 144.0
+rect_min_size = Vector2( 0, 144 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Colors" type="GridContainer" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer"]
+margin_right = 145.0
+margin_bottom = 170.0
+rect_min_size = Vector2( 0, 144 )
+size_flags_horizontal = 3
+size_flags_vertical = 3
+columns = 4
+script = ExtResource( 8 )
+
+[node name="Button1" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"]
+margin_right = 33.0
+margin_bottom = 25.0
+rect_min_size = Vector2( 25, 25 )
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_styles/normal = SubResource( 33 )
+
+[node name="Button2" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"]
+margin_left = 37.0
+margin_right = 70.0
+margin_bottom = 25.0
+rect_min_size = Vector2( 25, 25 )
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_styles/normal = SubResource( 34 )
+
+[node name="Button3" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"]
+margin_left = 74.0
+margin_right = 107.0
+margin_bottom = 25.0
+rect_min_size = Vector2( 25, 25 )
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_styles/normal = SubResource( 35 )
+
+[node name="Button4" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"]
+margin_left = 111.0
+margin_right = 144.0
+margin_bottom = 25.0
+rect_min_size = Vector2( 25, 25 )
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_styles/normal = SubResource( 36 )
+
+[node name="Button5" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"]
+margin_top = 29.0
+margin_right = 33.0
+margin_bottom = 54.0
+rect_min_size = Vector2( 25, 25 )
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_styles/normal = SubResource( 37 )
+
+[node name="Button6" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"]
+margin_left = 37.0
+margin_top = 29.0
+margin_right = 70.0
+margin_bottom = 54.0
+rect_min_size = Vector2( 25, 25 )
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_styles/normal = SubResource( 38 )
+
+[node name="Button7" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"]
+margin_left = 74.0
+margin_top = 29.0
+margin_right = 107.0
+margin_bottom = 54.0
+rect_min_size = Vector2( 25, 25 )
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_styles/normal = SubResource( 39 )
+
+[node name="Button8" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"]
+margin_left = 111.0
+margin_top = 29.0
+margin_right = 144.0
+margin_bottom = 54.0
+rect_min_size = Vector2( 25, 25 )
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_styles/normal = SubResource( 40 )
+
+[node name="Button9" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"]
+margin_top = 58.0
+margin_right = 33.0
+margin_bottom = 83.0
+rect_min_size = Vector2( 25, 25 )
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_styles/normal = SubResource( 41 )
+
+[node name="Button10" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"]
+margin_left = 37.0
+margin_top = 58.0
+margin_right = 70.0
+margin_bottom = 83.0
+rect_min_size = Vector2( 25, 25 )
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_styles/normal = SubResource( 42 )
+
+[node name="Button11" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"]
+margin_left = 74.0
+margin_top = 58.0
+margin_right = 107.0
+margin_bottom = 83.0
+rect_min_size = Vector2( 25, 25 )
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_styles/normal = SubResource( 43 )
+
+[node name="Button12" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"]
+margin_left = 111.0
+margin_top = 58.0
+margin_right = 144.0
+margin_bottom = 83.0
+rect_min_size = Vector2( 25, 25 )
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_styles/normal = SubResource( 44 )
+
+[node name="Button13" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"]
+margin_top = 87.0
+margin_right = 33.0
+margin_bottom = 112.0
+rect_min_size = Vector2( 25, 25 )
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_styles/normal = SubResource( 45 )
+
+[node name="Button14" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"]
+margin_left = 37.0
+margin_top = 87.0
+margin_right = 70.0
+margin_bottom = 112.0
+rect_min_size = Vector2( 25, 25 )
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_styles/normal = SubResource( 46 )
+
+[node name="Button15" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"]
+margin_left = 74.0
+margin_top = 87.0
+margin_right = 107.0
+margin_bottom = 112.0
+rect_min_size = Vector2( 25, 25 )
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_styles/normal = SubResource( 47 )
+
+[node name="Button16" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"]
+margin_left = 111.0
+margin_top = 87.0
+margin_right = 144.0
+margin_bottom = 112.0
+rect_min_size = Vector2( 25, 25 )
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_styles/normal = SubResource( 48 )
+
+[node name="Button17" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"]
+margin_top = 116.0
+margin_right = 33.0
+margin_bottom = 141.0
+rect_min_size = Vector2( 25, 25 )
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_styles/normal = SubResource( 49 )
+
+[node name="Button18" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"]
+margin_left = 37.0
+margin_top = 116.0
+margin_right = 70.0
+margin_bottom = 141.0
+rect_min_size = Vector2( 25, 25 )
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_styles/normal = SubResource( 50 )
+
+[node name="Button19" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"]
+margin_left = 74.0
+margin_top = 116.0
+margin_right = 107.0
+margin_bottom = 141.0
+rect_min_size = Vector2( 25, 25 )
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_styles/normal = SubResource( 51 )
+
+[node name="Button20" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"]
+margin_left = 111.0
+margin_top = 116.0
+margin_right = 144.0
+margin_bottom = 141.0
+rect_min_size = Vector2( 25, 25 )
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_styles/normal = SubResource( 52 )
+
+[node name="Button21" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"]
+margin_top = 145.0
+margin_right = 33.0
+margin_bottom = 170.0
+rect_min_size = Vector2( 25, 25 )
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_styles/normal = SubResource( 53 )
+
+[node name="Button22" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"]
+margin_left = 37.0
+margin_top = 145.0
+margin_right = 70.0
+margin_bottom = 170.0
+rect_min_size = Vector2( 25, 25 )
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_styles/normal = SubResource( 54 )
+
+[node name="Button23" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"]
+margin_left = 74.0
+margin_top = 145.0
+margin_right = 107.0
+margin_bottom = 170.0
+rect_min_size = Vector2( 25, 25 )
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_styles/normal = SubResource( 55 )
+
+[node name="Button24" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"]
+margin_left = 111.0
+margin_top = 145.0
+margin_right = 144.0
+margin_bottom = 170.0
+rect_min_size = Vector2( 25, 25 )
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_styles/normal = SubResource( 56 )
+
+[node name="VBoxContainer" type="VBoxContainer" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer"]
+margin_top = 156.0
+margin_right = 157.0
+margin_bottom = 196.0
+
+[node name="LockAlpha" type="CheckButton" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/VBoxContainer"]
+margin_right = 157.0
+margin_bottom = 40.0
+text = "Lock Alpha"
+align = 2
+
+[node name="BrushSelection" type="GridContainer" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer"]
+margin_top = 208.0
+margin_right = 157.0
+margin_bottom = 233.0
+columns = 4
+
+[node name="BrushRect" type="TextureButton" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/BrushSelection"]
+margin_right = 25.0
+margin_bottom = 25.0
+rect_min_size = Vector2( 25, 25 )
+texture_normal = ExtResource( 17 )
+texture_hover = ExtResource( 20 )
+
+[node name="BrushCircle" type="TextureButton" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/BrushSelection"]
+margin_left = 29.0
+margin_right = 54.0
+margin_bottom = 25.0
+rect_min_size = Vector2( 25, 25 )
+texture_normal = ExtResource( 18 )
+texture_hover = ExtResource( 21 )
+
+[node name="BrushVLine" type="TextureButton" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/BrushSelection"]
+margin_left = 58.0
+margin_right = 83.0
+margin_bottom = 25.0
+rect_min_size = Vector2( 25, 25 )
+texture_normal = ExtResource( 16 )
+texture_hover = ExtResource( 22 )
+
+[node name="BrushHLine" type="TextureButton" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/BrushSelection"]
+margin_left = 87.0
+margin_right = 112.0
+margin_bottom = 25.0
+rect_min_size = Vector2( 25, 25 )
+texture_normal = ExtResource( 19 )
+texture_hover = ExtResource( 23 )
+
+[node name="VSplitContainer" type="VBoxContainer" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer"]
+margin_top = 245.0
+margin_right = 157.0
+margin_bottom = 279.0
+size_flags_horizontal = 3
+
+[node name="BrushLabel" type="Label" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/VSplitContainer"]
+margin_right = 157.0
+margin_bottom = 14.0
+text = "Brush Size"
+
+[node name="HBoxContainer" type="HBoxContainer" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/VSplitContainer"]
+margin_top = 18.0
+margin_right = 157.0
+margin_bottom = 34.0
+
+[node name="BrushSizeLabel" type="Label" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/VSplitContainer/HBoxContainer"]
+margin_top = 1.0
+margin_right = 30.0
+margin_bottom = 15.0
+rect_min_size = Vector2( 30, 0 )
+text = "1"
+
+[node name="BrushSize" type="HSlider" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/VSplitContainer/HBoxContainer"]
+margin_left = 34.0
+margin_right = 157.0
+margin_bottom = 16.0
+size_flags_horizontal = 3
+size_flags_vertical = 2
+min_value = 1.0
+value = 1.0
+
+[node name="XSymmetry" type="CheckButton" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer"]
+margin_top = 291.0
+margin_right = 157.0
+margin_bottom = 331.0
+text = "X Symmetry"
+
+[node name="YSymmetry" type="CheckButton" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer"]
+margin_top = 343.0
+margin_right = 157.0
+margin_bottom = 383.0
+text = "Y Symmetry"
+
+[node name="PaintCanvasContainer" type="Control" parent="Panel/NoBCViewportsnotworking26181/Control"]
+margin_left = 161.0
+margin_right = 897.0
+margin_bottom = 532.0
+rect_clip_content = true
+focus_mode = 1
+mouse_filter = 1
+size_flags_horizontal = 3
+size_flags_vertical = 3
+size_flags_stretch_ratio = 6.0
+__meta__ = {
+"_edit_use_anchors_": true
+}
+
+[node name="Canvas" type="Control" parent="Panel/NoBCViewportsnotworking26181/Control/PaintCanvasContainer"]
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+margin_left = -124.252
+margin_top = -118.205
+margin_right = 131.748
+margin_bottom = 137.795
+mouse_filter = 1
+size_flags_horizontal = 3
+size_flags_vertical = 3
+script = ExtResource( 3 )
+__meta__ = {
+"_edit_group_": true,
+"_edit_use_anchors_": false
+}
+pixel_size = 4
+canvas_width = 64
+canvas_height = 64
+grid_size = 1
+big_grid_size = 8
+
+[node name="CanvasBackground" type="TextureRect" parent="Panel/NoBCViewportsnotworking26181/Control/PaintCanvasContainer/Canvas"]
+show_behind_parent = true
+material = SubResource( 2 )
+anchor_right = 1.0
+anchor_bottom = 1.0
+texture = ExtResource( 13 )
+expand = true
+stretch_mode = 2
+__meta__ = {
+"_edit_lock_": true
+}
+
+[node name="CanvasLayers" type="Control" parent="Panel/NoBCViewportsnotworking26181/Control/PaintCanvasContainer/Canvas"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+mouse_filter = 2
+__meta__ = {
+"_edit_lock_": true,
+"_edit_use_anchors_": false
+}
+
+[node name="PreviewLayer" type="TextureRect" parent="Panel/NoBCViewportsnotworking26181/Control/PaintCanvasContainer/Canvas"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+mouse_filter = 2
+texture = SubResource( 58 )
+expand = true
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="ToolPreviewLayer" type="TextureRect" parent="Panel/NoBCViewportsnotworking26181/Control/PaintCanvasContainer/Canvas"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+mouse_filter = 2
+texture = SubResource( 60 )
+expand = true
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Grid" parent="Panel/NoBCViewportsnotworking26181/Control/PaintCanvasContainer/Canvas" instance=ExtResource( 4 )]
+mouse_filter = 2
+color = Color( 1, 1, 1, 0.415686 )
+size = 4
+
+[node name="CanvasOutline" type="Control" parent="Panel/NoBCViewportsnotworking26181/Control/PaintCanvasContainer/Canvas"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+mouse_filter = 2
+script = ExtResource( 5 )
+__meta__ = {
+"_edit_lock_": true,
+"_edit_use_anchors_": false
+}
+color = Color( 0, 1, 0, 1 )
+
+[node name="RightPanel" type="PanelContainer" parent="Panel/NoBCViewportsnotworking26181/Control"]
+margin_left = 901.0
+margin_right = 1024.0
+margin_bottom = 532.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_styles/panel = SubResource( 7 )
+
+[node name="ScrollContainer" type="ScrollContainer" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel"]
+margin_right = 123.0
+margin_bottom = 532.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="ToolMenu" type="VBoxContainer" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer"]
+margin_right = 123.0
+margin_bottom = 532.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="Tools" type="VBoxContainer" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu"]
+margin_right = 123.0
+margin_bottom = 236.0
+size_flags_horizontal = 3
+
+[node name="PaintTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"]
+margin_right = 123.0
+margin_bottom = 20.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+text = "Pencil (Q)"
+
+[node name="BrushTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"]
+visible = false
+margin_top = 24.0
+margin_right = 132.0
+margin_bottom = 44.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+text = "Brush"
+
+[node name="MultiTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"]
+visible = false
+margin_top = 24.0
+margin_right = 132.0
+margin_bottom = 44.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+text = "Polygon"
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="BucketTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"]
+margin_top = 24.0
+margin_right = 123.0
+margin_bottom = 44.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+text = "Bucket Fill (F)"
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="RainbowTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"]
+margin_top = 48.0
+margin_right = 123.0
+margin_bottom = 68.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+text = "Rainbow (R)"
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LineTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"]
+margin_top = 72.0
+margin_right = 123.0
+margin_bottom = 92.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+text = "Line (L)"
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="RectTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"]
+margin_top = 96.0
+margin_right = 123.0
+margin_bottom = 116.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+text = "Rectangle"
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="DarkenTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"]
+margin_top = 120.0
+margin_right = 123.0
+margin_bottom = 140.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+text = "Darken (D)"
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="BrightenTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"]
+margin_top = 144.0
+margin_right = 123.0
+margin_bottom = 164.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+text = "Brighten (B)"
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="ColorPickerTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"]
+margin_top = 168.0
+margin_right = 123.0
+margin_bottom = 188.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+text = "Color Picker (P)"
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="CutTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"]
+margin_top = 192.0
+margin_right = 123.0
+margin_bottom = 212.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+text = "Cut Section (C)"
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="ColorPicker" type="ColorPickerButton" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"]
+margin_top = 216.0
+margin_right = 123.0
+margin_bottom = 236.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Control" type="ScrollContainer" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu"]
+margin_top = 240.0
+margin_right = 123.0
+margin_bottom = 532.0
+size_flags_vertical = 3
+
+[node name="VBoxContainer" type="VBoxContainer" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Control"]
+margin_right = 123.0
+margin_bottom = 292.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="LayerButtons" type="VBoxContainer" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Control/VBoxContainer"]
+margin_right = 123.0
+margin_bottom = 263.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Layer1" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Control/VBoxContainer/LayerButtons" instance=ExtResource( 12 )]
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 123.0
+margin_bottom = 32.0
+
+[node name="Button" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Control/VBoxContainer"]
+margin_top = 267.0
+margin_right = 123.0
+margin_bottom = 292.0
+rect_min_size = Vector2( 0, 25 )
+size_flags_horizontal = 3
+text = "+"
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="BottomPanel" type="Panel" parent="Panel/NoBCViewportsnotworking26181"]
+margin_top = 560.0
+margin_right = 1024.0
+margin_bottom = 600.0
+rect_min_size = Vector2( 0, 40 )
+size_flags_horizontal = 3
+custom_styles/panel = SubResource( 32 )
+__meta__ = {
+"_edit_group_": true,
+"_edit_use_anchors_": true
+}
+
+[node name="DebugTextDisplay" type="RichTextLabel" parent="Panel/NoBCViewportsnotworking26181/BottomPanel"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+text = "FPS 58 Mouse Position (1122.090332, 370.304382) Canvas Mouse Position (717.342346, 198.509415) Canvas Position (404.747986, 171.794968)
+Cell Position (0, 0) Cell Color 0,0,0,0 "
+scroll_active = false
+script = ExtResource( 11 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="SaveFileDialog" type="FileDialog" parent="."]
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+margin_left = -340.0
+margin_top = -165.0
+margin_right = 340.0
+margin_bottom = 165.0
+mouse_filter = 1
+filters = PoolStringArray( "*.png ; PNG Images" )
+show_hidden_files = true
+script = ExtResource( 9 )
+
+[node name="LoadFileDialog" type="FileDialog" parent="."]
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+margin_left = -340.0
+margin_top = -165.0
+margin_right = 340.0
+margin_bottom = 165.0
+mouse_filter = 1
+window_title = "Open a File"
+mode = 0
+filters = PoolStringArray( "*.png ; PNG Images" )
+show_hidden_files = true
+script = ExtResource( 2 )
+
+[node name="Settings" parent="." instance=ExtResource( 10 )]
+visible = false
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+margin_left = -150.0
+margin_top = -50.0
+margin_right = 150.0
+margin_bottom = 50.0
+mouse_filter = 1
+
+[node name="ChangeCanvasSize" type="ConfirmationDialog" parent="."]
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+margin_left = -162.0
+margin_top = -69.0
+margin_right = 162.0
+margin_bottom = 69.0
+script = ExtResource( 14 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="VBoxContainer" type="VBoxContainer" parent="ChangeCanvasSize"]
+anchor_left = 0.104938
+anchor_top = 0.108696
+anchor_right = 0.891975
+anchor_bottom = 0.695652
+margin_left = -25.9999
+margin_top = -7.00005
+margin_right = 27.0001
+margin_bottom = 6.00002
+__meta__ = {
+"_edit_use_anchors_": true
+}
+
+[node name="Label" type="Label" parent="ChangeCanvasSize/VBoxContainer"]
+margin_top = 7.0
+margin_right = 308.0
+margin_bottom = 21.0
+size_flags_vertical = 6
+text = "Change canvas size?"
+align = 1
+
+[node name="HBoxContainer" type="HBoxContainer" parent="ChangeCanvasSize/VBoxContainer"]
+margin_top = 32.0
+margin_right = 308.0
+margin_bottom = 61.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="Label" type="Label" parent="ChangeCanvasSize/VBoxContainer/HBoxContainer"]
+margin_top = 7.0
+margin_right = 152.0
+margin_bottom = 21.0
+size_flags_horizontal = 3
+size_flags_vertical = 6
+text = "Width (X)"
+
+[node name="Width" type="SpinBox" parent="ChangeCanvasSize/VBoxContainer/HBoxContainer"]
+margin_left = 156.0
+margin_right = 308.0
+margin_bottom = 29.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+min_value = 1.0
+max_value = 2500.0
+value = 64.0
+align = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="HBoxContainer2" type="HBoxContainer" parent="ChangeCanvasSize/VBoxContainer"]
+margin_top = 65.0
+margin_right = 308.0
+margin_bottom = 94.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="Label" type="Label" parent="ChangeCanvasSize/VBoxContainer/HBoxContainer2"]
+margin_top = 7.0
+margin_right = 152.0
+margin_bottom = 21.0
+size_flags_horizontal = 3
+size_flags_vertical = 6
+text = "Height (Y)"
+
+[node name="Height" type="SpinBox" parent="ChangeCanvasSize/VBoxContainer/HBoxContainer2"]
+margin_left = 156.0
+margin_right = 308.0
+margin_bottom = 29.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+min_value = 1.0
+max_value = 2500.0
+value = 64.0
+align = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="ChangeGridSizeDialog" type="AcceptDialog" parent="."]
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+margin_left = -127.0
+margin_top = -74.0
+margin_right = 128.0
+margin_bottom = 73.0
+window_title = "Change Grid Size"
+resizable = true
+script = ExtResource( 15 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="VBoxContainer" type="VBoxContainer" parent="ChangeGridSizeDialog"]
+anchor_left = 0.0313726
+anchor_top = 0.0816327
+anchor_right = 0.968627
+anchor_bottom = 0.727891
+margin_left = -1.23978e-05
+margin_top = -4.00001
+margin_right = 0.00012207
+margin_bottom = 4.00002
+__meta__ = {
+"_edit_use_anchors_": true
+}
+
+[node name="Label" type="Label" parent="ChangeGridSizeDialog/VBoxContainer"]
+margin_right = 239.0
+margin_bottom = 31.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+text = "Change Grid Size"
+align = 1
+
+[node name="HBoxContainer" type="HBoxContainer" parent="ChangeGridSizeDialog/VBoxContainer"]
+margin_top = 35.0
+margin_right = 239.0
+margin_bottom = 67.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="Label" type="Label" parent="ChangeGridSizeDialog/VBoxContainer/HBoxContainer"]
+margin_top = 9.0
+margin_right = 117.0
+margin_bottom = 23.0
+size_flags_horizontal = 3
+size_flags_vertical = 6
+text = "Grid 1"
+
+[node name="GridValue" type="SpinBox" parent="ChangeGridSizeDialog/VBoxContainer/HBoxContainer"]
+margin_left = 121.0
+margin_top = 4.0
+margin_right = 239.0
+margin_bottom = 28.0
+size_flags_horizontal = 3
+size_flags_vertical = 6
+max_value = 2500.0
+value = 1.0
+
+[node name="HBoxContainer2" type="HBoxContainer" parent="ChangeGridSizeDialog/VBoxContainer"]
+margin_top = 71.0
+margin_right = 239.0
+margin_bottom = 103.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="Label" type="Label" parent="ChangeGridSizeDialog/VBoxContainer/HBoxContainer2"]
+margin_top = 9.0
+margin_right = 117.0
+margin_bottom = 23.0
+size_flags_horizontal = 3
+size_flags_vertical = 6
+text = "Grid 2"
+
+[node name="BigGridValue" type="SpinBox" parent="ChangeGridSizeDialog/VBoxContainer/HBoxContainer2"]
+margin_left = 121.0
+margin_top = 4.0
+margin_right = 239.0
+margin_bottom = 28.0
+size_flags_horizontal = 3
+size_flags_vertical = 6
+max_value = 2500.0
+value = 8.0
+
+[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/VBoxContainer/LockAlpha" to="." method="_on_LockAlpha_pressed"]
+[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/BrushSelection/BrushRect" to="." method="_on_BrushRect_pressed"]
+[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/BrushSelection/BrushCircle" to="." method="_on_BrushCircle_pressed"]
+[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/BrushSelection/BrushVLine" to="." method="_on_BrushVLine_pressed"]
+[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/BrushSelection/BrushHLine" to="." method="_on_BrushHLine_pressed"]
+[connection signal="value_changed" from="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/VSplitContainer/HBoxContainer/BrushSize" to="." method="_on_BrushSize_value_changed"]
+[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/XSymmetry" to="." method="_on_XSymmetry_pressed"]
+[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/YSymmetry" to="." method="_on_YSymmetry_pressed"]
+[connection signal="mouse_entered" from="Panel/NoBCViewportsnotworking26181/Control/PaintCanvasContainer" to="." method="_on_PaintCanvasContainer_mouse_entered"]
+[connection signal="mouse_exited" from="Panel/NoBCViewportsnotworking26181/Control/PaintCanvasContainer" to="." method="_on_PaintCanvasContainer_mouse_exited"]
+[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/PaintTool" to="." method="_on_PaintTool_pressed"]
+[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/BrushTool" to="." method="_on_BrushTool_pressed"]
+[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/MultiTool" to="." method="_on_MultiTool_pressed"]
+[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/BucketTool" to="." method="_on_BucketTool_pressed"]
+[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/RainbowTool" to="." method="_on_RainbowTool_pressed"]
+[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/LineTool" to="." method="_on_LineTool_pressed"]
+[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/RectTool" to="." method="_on_RectTool_pressed"]
+[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/DarkenTool" to="." method="_on_DarkenTool_pressed"]
+[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/BrightenTool" to="." method="_on_BrightenTool_pressed"]
+[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/ColorPickerTool" to="." method="_on_ColorPickerTool_pressed"]
+[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/CutTool" to="." method="_on_CutTool_pressed"]
+[connection signal="color_changed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/ColorPicker" to="." method="_on_ColorPicker_color_changed"]
+[connection signal="popup_closed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/ColorPicker" to="." method="_on_ColorPicker_popup_closed"]
+[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Control/VBoxContainer/Button" to="." method="_on_Button_pressed"]
+[connection signal="about_to_show" from="SaveFileDialog" to="SaveFileDialog" method="_on_SaveFileDialog_about_to_show"]
+[connection signal="confirmed" from="SaveFileDialog" to="SaveFileDialog" method="_on_SaveFileDialog_confirmed"]
+[connection signal="file_selected" from="SaveFileDialog" to="SaveFileDialog" method="_on_SaveFileDialog_file_selected"]
+[connection signal="visibility_changed" from="SaveFileDialog" to="SaveFileDialog" method="_on_SaveFileDialog_visibility_changed"]
+[connection signal="about_to_show" from="LoadFileDialog" to="LoadFileDialog" method="_on_LoadFileDialog_about_to_show"]
+[connection signal="confirmed" from="LoadFileDialog" to="LoadFileDialog" method="_on_LoadFileDialog_confirmed"]
+[connection signal="file_selected" from="LoadFileDialog" to="LoadFileDialog" method="_on_LoadFileDialog_file_selected"]
+[connection signal="visibility_changed" from="LoadFileDialog" to="LoadFileDialog" method="_on_LoadFileDialog_visibility_changed"]
+[connection signal="confirmed" from="ChangeCanvasSize" to="ChangeCanvasSize" method="_on_ConfirmationDialog_confirmed"]
+[connection signal="visibility_changed" from="ChangeCanvasSize" to="ChangeCanvasSize" method="_on_ChangeCanvasSize_visibility_changed"]
+[connection signal="confirmed" from="ChangeGridSizeDialog" to="ChangeGridSizeDialog" method="_on_ChangeGridSizeDialog_confirmed"]
+[connection signal="visibility_changed" from="ChangeGridSizeDialog" to="ChangeGridSizeDialog" method="_on_ChangeGridSizeDialog_visibility_changed"]
+[connection signal="value_changed" from="ChangeGridSizeDialog/VBoxContainer/HBoxContainer/GridValue" to="ChangeGridSizeDialog" method="_on_GridValue_value_changed"]
+[connection signal="value_changed" from="ChangeGridSizeDialog/VBoxContainer/HBoxContainer2/BigGridValue" to="ChangeGridSizeDialog" method="_on_BigGridValue_value_changed"]
diff --git a/modules/paint/addon/LICENSE b/modules/paint/addon/LICENSE
new file mode 100644
index 000000000..f732571ff
--- /dev/null
+++ b/modules/paint/addon/LICENSE
@@ -0,0 +1,22 @@
+MIT License
+
+Copyright (c) 2019 Flairieve
+Copyright (c) 2020 cobrapitz
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/modules/paint/addon/Layer.gd b/modules/paint/addon/Layer.gd
new file mode 100644
index 000000000..1200f3b46
--- /dev/null
+++ b/modules/paint/addon/Layer.gd
@@ -0,0 +1,98 @@
+extends Reference
+class_name GELayer
+
+
+var name
+var layer_width
+var layer_height
+var visible = true setget set_visible
+var locked = false
+var alpha_locked = false
+
+var texture: ImageTexture
+var image: Image
+var texture_rect_ref
+
+
+func _init():
+ texture = ImageTexture.new()
+
+
+func create(texture_rect_ref, width: int, height: int):
+ self.texture_rect_ref = texture_rect_ref
+
+ layer_width = width
+ layer_height = height
+
+ image = Image.new()
+ image.create(width, height, false, Image.FORMAT_RGBA8)
+ image.fill(Color.transparent)
+ update_texture()
+
+
+func resize(width: int, height: int):
+ var pixel_colors = []
+ var prev_width = layer_width
+ var prev_height = layer_height
+
+ image.lock()
+ for y in range(prev_height):
+ for x in range(prev_width):
+ pixel_colors.append(image.get_pixel(x, y))
+ image.unlock()
+
+ layer_width = width
+ layer_height = height
+
+ image.create(width, height, false, Image.FORMAT_RGBA8)
+
+ image.lock()
+ for x in range(prev_width):
+ for y in range(prev_height):
+ if x >= width or y >= height:
+ continue
+ image.set_pixel(x, y, pixel_colors[GEUtils.to_1D(x, y, prev_width)])
+ image.unlock()
+
+ update_texture()
+
+
+func set_pixel(x, y, color):
+ image.lock()
+ image.set_pixel(x, y, color)
+ image.unlock()
+
+
+func get_pixel(x: int, y: int):
+ if x < 0 or y < 0 or x >= image.get_width() or y >= image.get_height():
+ return null
+ image.lock()
+ var pixel = image.get_pixel(x, y)
+ image.unlock()
+ return pixel
+
+
+func clear():
+ image.fill(Color.transparent)
+ update_texture()
+
+
+func update_texture():
+ texture.create_from_image(image, 0)
+ texture_rect_ref.texture = texture
+ texture_rect_ref.margin_right = 0
+ texture_rect_ref.margin_bottom = 0
+
+
+func set_visible(vis: bool):
+ visible = vis
+ texture_rect_ref.visible = visible
+
+
+func toggle_lock():
+ locked = not locked
+
+
+func toggle_alpha_locked():
+ alpha_locked = not alpha_locked
+
diff --git a/modules/paint/addon/LayerButton.tscn b/modules/paint/addon/LayerButton.tscn
new file mode 100644
index 000000000..9252482d6
--- /dev/null
+++ b/modules/paint/addon/LayerButton.tscn
@@ -0,0 +1,110 @@
+[gd_scene load_steps=11 format=2]
+
+[ext_resource path="res://addons/Godoxel/assets/minidotta_invis.png" type="Texture" id=1]
+[ext_resource path="res://addons/Godoxel/assets/minidotta.png" type="Texture" id=2]
+[ext_resource path="res://addons/Godoxel/assets/arrow_down.png" type="Texture" id=3]
+[ext_resource path="res://addons/Godoxel/assets/arrow_up.png" type="Texture" id=4]
+[ext_resource path="res://addons/Godoxel/assets/lock_layer_1.png" type="Texture" id=5]
+[ext_resource path="res://addons/Godoxel/assets/unlock_layer.png" type="Texture" id=6]
+
+
+[sub_resource type="StyleBoxFlat" id=4]
+bg_color = Color( 0.180392, 0.176471, 0.176471, 1 )
+
+[sub_resource type="StyleBoxFlat" id=1]
+bg_color = Color( 0.25098, 0.25098, 0.25098, 0 )
+
+[sub_resource type="StyleBoxFlat" id=2]
+bg_color = Color( 0.6, 0.6, 0.6, 0 )
+
+[sub_resource type="StyleBoxFlat" id=3]
+bg_color = Color( 0.6, 0.6, 0.6, 0 )
+
+[node name="Layer1" type="Panel"]
+show_behind_parent = true
+anchor_right = 0.113281
+anchor_bottom = 0.0416667
+margin_bottom = -1.90735e-06
+rect_min_size = Vector2( 0, 32 )
+mouse_filter = 2
+custom_styles/panel = SubResource( 4 )
+__meta__ = {
+"_edit_use_anchors_": true
+}
+
+[node name="Select" type="Button" parent="." groups=[
+"layer_button",
+]]
+anchor_right = 0.827586
+anchor_bottom = 1.0
+custom_styles/hover = SubResource( 1 )
+custom_styles/pressed = SubResource( 1 )
+custom_styles/focus = SubResource( 1 )
+custom_styles/disabled = SubResource( 1 )
+custom_styles/normal = SubResource( 1 )
+text = "Layer 1"
+align = 2
+__meta__ = {
+"_edit_use_anchors_": true
+}
+
+[node name="Visible" type="CheckButton" parent="."]
+anchor_top = 0.5
+anchor_bottom = 0.5
+margin_left = 3.0
+margin_top = -8.5
+margin_right = 19.0
+margin_bottom = 7.5
+custom_icons/off = ExtResource( 1 )
+custom_icons/on = ExtResource( 2 )
+custom_styles/normal = SubResource( 2 )
+pressed = true
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Lock" type="CheckButton" parent="."]
+anchor_top = 0.5
+anchor_bottom = 0.5
+margin_left = 22.0
+margin_top = -11.0
+margin_right = 46.0
+margin_bottom = 11.0
+custom_icons/off = ExtResource( 6 )
+custom_icons/on = ExtResource( 5 )
+custom_styles/normal = SubResource( 3 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="VBoxContainer" type="VBoxContainer" parent="."]
+anchor_left = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = -20.0
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Up" type="TextureButton" parent="VBoxContainer"]
+margin_right = 20.0
+margin_bottom = 14.0
+rect_min_size = Vector2( 20, 0 )
+size_flags_horizontal = 3
+size_flags_vertical = 3
+texture_normal = ExtResource( 4 )
+texture_pressed = ExtResource( 2 )
+expand = true
+stretch_mode = 3
+
+[node name="Down" type="TextureButton" parent="VBoxContainer"]
+margin_top = 18.0
+margin_right = 20.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 20, 0 )
+size_flags_horizontal = 3
+size_flags_vertical = 3
+texture_normal = ExtResource( 3 )
+texture_pressed = ExtResource( 2 )
+expand = true
+stretch_mode = 3
diff --git a/modules/paint/addon/MenuButtonExtended.gd b/modules/paint/addon/MenuButtonExtended.gd
new file mode 100644
index 000000000..dd442f6e7
--- /dev/null
+++ b/modules/paint/addon/MenuButtonExtended.gd
@@ -0,0 +1,13 @@
+tool
+extends MenuButton
+
+var popup = get_popup()
+signal item_pressed
+
+func _ready():
+ popup.connect("id_pressed", self, "id_pressed")
+
+func id_pressed(id):
+ emit_signal("item_pressed", name, popup.get_item_text(id), id)
+
+
diff --git a/modules/paint/addon/Navbar.gd b/modules/paint/addon/Navbar.gd
new file mode 100644
index 000000000..5752c3f01
--- /dev/null
+++ b/modules/paint/addon/Navbar.gd
@@ -0,0 +1,106 @@
+tool
+extends Control
+
+var editor
+var paint_canvas
+
+func _ready():
+ editor = owner
+ paint_canvas = editor.find_node("PaintCanvas")
+
+ for i in get_node("Buttons").get_children():
+ i.connect("item_pressed", self, "button_pressed")
+
+
+func button_pressed(button_name, button_item, id):
+# print("pressed: ", button_name)
+# print("pressed item is: '%s'" % button_item)
+
+ match button_name:
+ "File":
+ handle_file_menu(button_item, id)
+ "Edit":
+ handle_edit_menu(button_item, id)
+ "Canvas":
+ handle_canvas_menu(button_item, id)
+ "Layer":
+ handle_layer_menu(button_item, id)
+ "Grid":
+ handle_grid_menu(button_item, id)
+ "Magic":
+ handle_magic_menu(button_item, id)
+ "Editor":
+ handle_editor_menu(button_item, id)
+
+
+func handle_file_menu(pressed_item: String, id):
+ match pressed_item:
+ "Save":
+ owner.get_node("SaveFileDialog").show()
+ "Load":
+ owner.get_node("LoadFileDialog").show()
+ "New":
+ owner.get_node("ConfirmationDialog").show()
+
+
+func handle_edit_menu(pressed_item: String, id):
+ match pressed_item:
+ "Add Layer":
+ editor.add_new_layer()
+
+
+func handle_canvas_menu(pressed_item: String, id):
+ match pressed_item:
+ "Change Size":
+ owner.get_node("ChangeCanvasSize").show()
+ "Crop To Content":
+ owner.paint_canvas.crop_to_content()
+
+
+func handle_layer_menu(pressed_item: String, id):
+ match pressed_item:
+ "Add Layer":
+ editor.add_new_layer()
+ "Delete Layer":
+ editor.remove_active_layer()
+ "Duplicate Layer":
+ editor.duplicate_active_layer()
+ "Clear Layer":
+ owner.paint_canvas.clear_active_layer()
+ "Toggle Alpha Locked":
+ owner.paint_canvas.active_layer.toggle_alpha_locked()
+ $Buttons/Layer.get_popup().set_item_checked(id, not $Buttons/Layer.get_popup().is_item_checked(id))
+ owner.find_node("LockAlpha").pressed = $Buttons/Layer.get_popup().is_item_checked(id)
+
+
+func handle_grid_menu(pressed_item: String, id):
+ match pressed_item:
+ "Change Grid Size":
+ owner.get_node("ChangeGridSizeDialog").show()
+ "Toggle Grid":
+ owner.paint_canvas.toggle_grid()
+
+
+func handle_magic_menu(pressed_item: String, id):
+ match pressed_item:
+ "Add Layer":
+ editor.add_new_layer()
+
+
+func handle_editor_menu(pressed_item: String, id):
+ match pressed_item:
+ "Settings":
+ owner.get_node("Settings").show()
+ "Toggle Grid":
+ var grids_node = owner.find_node("Grids")
+ grids_node.visible = !grids_node.visible
+ "Reset Canvas Position":
+ owner.paint_canvas_node.rect_position = Vector2(0, 0)
+
+
+func is_any_menu_open() -> bool:
+ for child in $Buttons.get_children():
+ if child.get_popup().visible:
+ return true
+ return false
+
diff --git a/modules/paint/addon/PaintCanvas.gd b/modules/paint/addon/PaintCanvas.gd
new file mode 100644
index 000000000..934fc34b7
--- /dev/null
+++ b/modules/paint/addon/PaintCanvas.gd
@@ -0,0 +1,489 @@
+tool
+extends Control
+
+var image = Image.new()
+var last_pixel = []
+onready var canvas_image_node = get_node("CanvasImage")
+export var grid_size = 16
+export var canvas_size = Vector2(48, 28)
+export var region_size = 10
+export var can_draw = true
+
+var mouse_in_region
+var mouse_on_top
+
+#terms
+#global cell - a cell that has a global grid position on the canvas
+#local cell - a cell that has a local grid position in a chunk region on the canvas
+#chunk region - a set of cells contained in an even number
+
+#TODO: Maybe each chunk region can hold an image resource so that way the engine wouldn't lag at all when updating the canvas
+
+var layers = {}
+var active_layer
+
+var preview_layer = "preview"
+var preview_enabled = false
+
+
+func _enter_tree():
+ #----------------------
+ # init Layer
+ #----------------------
+ layers[preview_layer] = {
+ "layer": null,
+ "data": [],
+ "chunks": null,
+ }
+
+ canvas_size = Vector2(int(rect_size.x / grid_size), int(rect_size.y / grid_size))
+ #print("canvas_size: ", canvas_size)
+
+
+func _ready():
+ active_layer = add_existing_layer(get_tree().get_nodes_in_group("layer")[0])
+ #print("active Layer: ", active_layer)
+
+
+func get_layer_data(layer_name):
+ return layers[layer_name]
+
+
+func get_active_layer():
+ return layers[active_layer]
+
+
+func get_preview_layer():
+ return layers[preview_layer]
+
+
+func clear_active_layer():
+ for pixel in layers[active_layer].data:
+ set_global_cell_in_chunk(pixel[0], pixel[1], Color(0,0,0,0))
+
+
+func clear_layer(layer_name: String):
+ for pixel in layers[layer_name].data:
+ set_global_cell_in_chunk(pixel[0], pixel[1], Color(0,0,0,0))
+
+
+func clear_preview_layer():
+ for pixel in layers["preview"].data:
+ set_global_cell_in_chunk(pixel[0], pixel[1], Color(0,0,0,0))
+
+
+func remove_layer(layer_name):
+ get_node("ChunkNodes").remove_child(layers[layer_name].chunks)
+ layers[layer_name].chunks.queue_free()
+
+ layers.erase(layer_name)
+
+ if active_layer == layer_name:
+ for layer in layers:
+ if layer == preview_layer:
+ continue
+ active_layer = layer
+ break
+
+ return active_layer
+
+
+
+# only needed for init
+func add_existing_layer(layer):
+ layers[layer.name] = {
+ "layer": layer,
+ "data": [],
+ "chunks": null,
+ }
+ generate_chunks()
+ return layer.name
+
+
+func add_new_layer(layer_name):
+ layers[layer_name] = {
+ "layer": null,
+ "data": [],
+ "chunks": null,
+ }
+
+ generate_chunks()
+
+ return layer_name
+
+
+func duplicate_layer(layer: String, neu_layer_name: String):
+ var _preview = preview_enabled
+ preview_enabled = false
+ var _temp = active_layer
+ active_layer = neu_layer_name
+
+ layers[neu_layer_name] = {
+ "layer": null,
+ "data": layers[layer].data.duplicate(true),
+ "chunks": null,
+ }
+
+ generate_chunks()
+# get_node("ChunkNodes").remove_child(layers[neu_layer_name].chunks)
+# get_node("ChunkNodes").add_child_below_node(layers[layer].chunks, layers[neu_layer_name].chunks, true)
+
+ for pixel in layers[neu_layer_name].data:
+ set_pixel_cell(pixel[0], pixel[1], pixel[2])
+ active_layer = _temp
+
+ preview_enabled = _preview
+ return neu_layer_name
+
+
+func toggle_layer_visibility(layer_name):
+ layers[layer_name].chunks.visible = not layers[layer_name].chunks.visible
+ #print("Layer: ", layer_name, " is now: ", layers[layer_name].chunks.visible)
+
+
+var util = preload("res://addons/Godoxel/Util.gd")
+
+
+func _on_mouse_entered():
+ mouse_on_top = true
+
+
+func _on_mouse_exited():
+ mouse_on_top = false
+
+
+func _process(delta):
+ var mouse_position = get_local_mouse_position()
+ var rect = Rect2(Vector2(0, 0), rect_size)
+ mouse_in_region = rect.has_point(mouse_position)
+ update()
+ #if not Engine.editor_hint:
+ # print(mouse_on_canvas, " | ", has_focus())
+ #draw_canvas_out just updates the image constantly
+ #if can_draw:
+ # draw_canvas_out()
+
+
+func generate_chunks():
+ var maxium_chunk_size = get_maxium_filled_chunks()
+ #TODO: We probably don't need to check for x and y anymore
+ for key in layers:
+ if layers[key].chunks != null:
+ continue
+
+ var chunk_node = Control.new()
+ get_node("ChunkNodes").add_child(chunk_node)
+ chunk_node.owner = self
+
+ layers[key].chunks = chunk_node
+
+ for x in maxium_chunk_size.x:
+ for y in maxium_chunk_size.y:
+ var paint_canvas_chunk = load("res://addons/Godoxel/PaintCanvasChunk.tscn").instance()
+ paint_canvas_chunk.setup(region_size)
+ paint_canvas_chunk.name = "C-%s-%s" % [x, y]
+ paint_canvas_chunk.rect_position = Vector2(x * (grid_size * region_size), y * (grid_size * region_size))
+ layers[key].chunks.add_child(paint_canvas_chunk)
+
+
+func get_maxium_filled_chunks():
+ return Vector2(canvas_size.x / region_size, canvas_size.y / region_size).ceil()
+
+#TODO: Remake these functions with godot's setget features
+#so that we don't have to call these functions
+func resize_grid(grid):
+ #print(grid)
+ if grid <= 0:
+ return
+ grid_size = grid
+ canvas_image_node.rect_scale = Vector2(grid, grid)
+
+func resize_canvas(x, y):
+ image.unlock()
+ image.create(x, y, true, Image.FORMAT_RGBA8)
+ canvas_size = Vector2(x, y)
+ #setup_all_chunks()
+ image.lock()
+
+#func draw_canvas_out(a = ""):
+# if canvas_image_node == null:
+# return
+# var image_texture = ImageTexture.new()
+# image_texture.create_from_image(image)
+# image_texture.set_flags(0)
+# canvas_image_node.texture = image_texture
+
+func get_wrapped_region_cell(x, y):
+ return Vector2(wrapi(x, 0, region_size), wrapi(y, 0, region_size))
+
+func get_region_from_cell(x, y):
+ return Vector2(floor(x / region_size), floor(y / region_size))
+
+
+func set_local_cell_in_chunk(chunk_x, chunk_y, local_cell_x, local_cell_y, color):
+ var chunk_node
+
+ if preview_enabled:
+ chunk_node = layers.preview.chunks.get_node_or_null("C-%s-%s" % [chunk_x, chunk_y])
+ else:
+ chunk_node = layers[active_layer].chunks.get_node_or_null("C-%s-%s" % [chunk_x, chunk_y])
+
+ if chunk_node == null:
+ #print("Can't find chunk node!")
+ return
+ chunk_node.set_cell(local_cell_x, local_cell_y, color)
+
+
+func set_global_cell_in_chunk(cell_x, cell_y, color):
+ var chunk = get_region_from_cell(cell_x, cell_y)
+ var wrapped_cell = get_wrapped_region_cell(cell_x, cell_y)
+ set_local_cell_in_chunk(chunk.x, chunk.y, wrapped_cell.x, wrapped_cell.y, color)
+
+#func update_chunk_region_from_cell(x, y):
+# var region_to_update = get_region_from_cell(x, y)
+# update_chunk_region(region_to_update.x, region_to_update.y)
+
+func get_pixel_cell_color(x, y):
+ if not cell_in_canvas_region(x, y):
+ return null
+ var pixel_cell = get_pixel_cell(x, y)
+ if pixel_cell == null:
+ #We already checked that the cell can't be out of the canvas region so we can assume the pixel cell is completely transparent if it's null
+ return Color(0, 0, 0, 0)
+ else:
+ return util.color_from_array(pixel_cell[2])
+
+func get_pixel_cell_color_v(vec2):
+ return get_pixel_cell_color(vec2.x, vec2.y)
+
+func get_pixel_cell(x, y):
+ if active_layer == null:
+ return
+ if not cell_in_canvas_region(x, y):
+ return null
+
+ for pixel in get_active_layer().data:
+ if pixel[0] == x and pixel[1] == y:
+ return pixel
+
+ return null
+
+func get_pixel_cell_v(vec2):
+ return get_pixel_cell(vec2.x, vec2.y)
+
+#func remove_pixel_cell(x, y):
+# if can_draw == false:
+# return false
+# if not cell_in_canvas_region(x, y):
+# return false
+# var layer_data = get_layer_data("Layer 1")
+# for pixel in range(0, layer_data.size()):
+# if layer_data[pixel][0] == x and layer_data[pixel][1] == y:
+# layer_data.remove(pixel)
+# #update_chunk_region_from_cell(x, y)
+# #TOOD: If pixel exists in temp_pool_pixels then remove it
+# image.set_pixel(x, y, Color(0, 0, 0, 0))
+# return true
+# return false
+
+#func remove_pixel_cell_v(vec2):
+# return remove_pixel_cell(vec2.x, vec2.y)
+
+func set_pixel_cell(x, y, color):
+ if can_draw == false:
+ return false
+
+ if not cell_in_canvas_region(x, y):
+ return false
+
+ var layer
+ if preview_enabled:
+ layer = get_preview_layer()
+ else:
+ layer = get_active_layer()
+
+ var index = 0
+ for pixel in layer.data:
+ #TODO: Make a better way of accessing the array because the more pixels we have, the longer it takes to
+ #set the pixel
+ if pixel[0] == x and pixel[1] == y:
+ #No reason to set the pixel again if the colors are the same
+
+ #If the color we are setting is 0, 0, 0, 0 then there is no reason to keep the information about the pixel
+ #so we remove it from the layer data
+ if color == Color(0, 0, 0, 0):
+ layer.data.remove(index)
+ else:
+ pixel[2] = color
+ #TODO: The new system is going to allow chunks to each have their own TextureRect and Image
+ #nodes so what we are doing in here is that we are setting the local cell in the region of that image
+ set_global_cell_in_chunk(x, y, color)
+ last_pixel = [x, y, color]
+ return true
+ index += 1
+ #don't append any data if the color is 0, 0, 0, 0
+ if color != Color(0, 0, 0, 0):
+ #if the pixel data doesn't exist then we add it in
+ layer.data.append([x, y, color])
+ set_global_cell_in_chunk(x, y, color)
+ last_pixel = [x, y, color]
+ return true
+
+func set_pixel_cell_v(vec2, color):
+ return set_pixel_cell(vec2.x, vec2.y, color)
+
+func set_pixels_from_line(vec2_1, vec2_2, color):
+ var points = get_pixels_from_line(vec2_1, vec2_2)
+ for i in points:
+ set_pixel_cell_v(i, color)
+
+func set_random_pixels_from_line(vec2_1, vec2_2):
+ var points = get_pixels_from_line(vec2_1, vec2_2)
+ for i in points:
+ set_pixel_cell_v(i, util.random_color_alt())
+
+func get_pixels_from_line(vec2_1, vec2_2):
+ var points = PoolVector2Array()
+
+ var dx = abs(vec2_2.x - vec2_1.x)
+ var dy = abs(vec2_2.y - vec2_1.y)
+
+ var x = vec2_1.x
+ var y = vec2_1.y
+
+ var sx = 0
+ if vec2_1.x > vec2_2.x:
+ sx = -1
+ else:
+ sx = 1
+
+ var sy = 0
+ if vec2_1.y > vec2_2.y:
+ sy = -1
+ else:
+ sy = 1
+
+ if dx > dy:
+ var err = dx / 2
+ while(true):
+ if x == vec2_2.x:
+ break
+ points.push_back(Vector2(x, y))
+
+ err -= dy
+ if err < 0:
+ y += sy
+ err += dx
+ x += sx
+ else:
+ var err = dy / 2
+ while (true):
+ if y == vec2_2.y:
+ break
+ points.push_back(Vector2(x, y))
+
+ err -= dx
+ if err < 0:
+ x += sx
+ err += dy
+ y += sy
+ points.push_back(Vector2(x, y))
+ return points
+
+
+#even though the function checks for it, we can't afford adding more functions to the call stack
+#because godot has a limit until it crashes
+var flood_fill_queue = 0
+func flood_fill(x, y, target_color, replacement_color):
+ #yield(get_tree().create_timer(1), "timeout")
+ flood_fill_queue += 1
+ if not cell_in_canvas_region(x, y):
+ flood_fill_queue -= 1
+ return
+ if target_color == replacement_color:
+ flood_fill_queue -= 1
+ return
+ elif not get_pixel_cell_color(x, y) == target_color:
+ flood_fill_queue -= 1
+ return
+ else:
+ set_pixel_cell(x, y, replacement_color)
+ if flood_fill_queue >= 500:
+ #print(flood_fill_queue)
+ yield(get_tree().create_timer(0.01), "timeout")
+ #up
+ if get_pixel_cell_color(x, y - 1) == target_color:
+ flood_fill(x, y - 1, target_color, replacement_color)
+ #down
+ if get_pixel_cell_color(x, y + 1) == target_color:
+ flood_fill(x, y + 1, target_color, replacement_color)
+ #left
+ if get_pixel_cell_color(x - 1, y) == target_color:
+ flood_fill(x - 1, y, target_color, replacement_color)
+ #right
+ if get_pixel_cell_color(x + 1, y) == target_color:
+ flood_fill(x + 1, y, target_color, replacement_color)
+ flood_fill_queue -= 1
+ return
+
+#func flood_fill_erase(x, y, target_color):
+# yield(get_tree().create_timer(0.001), "timeout")
+# if not cell_in_canvas_region(x, y):
+# print("cell not in canvas")
+# return
+# #if target_color == replacement_color:
+# # return
+# elif not get_pixel_cell_color(x, y) == target_color:
+# print("cell doesn't match pixel color")
+# return
+# elif not get_pixel_cell(x, y):
+# print("cell already erased")
+# return
+# else:
+# print("removed pixel")
+# remove_pixel_cell(x, y)
+# print("x: ", x, " y: ", y, " color: ", target_color)
+# #up
+# flood_fill_erase(x, y - 1, target_color)
+# #down
+# flood_fill_erase(x, y + 1, target_color)
+# #left
+# flood_fill_erase(x - 1, y, target_color)
+# #right
+# flood_fill_erase(x + 1, y, target_color)
+# return
+
+func cell_in_canvas_region(x, y):
+ if x > canvas_size.x - 1 or x < 0 or y > canvas_size.y - 1 or y < 0:
+ #out of bounds, return false
+ return false
+ else:
+ return true
+
+#Both of these functions right now just return the starting position of the canvas and the last position of the canvas
+func get_all_used_regions_in_canvas():
+ var first_used_region = get_first_used_region_in_canvas()
+ var last_used_region = get_last_used_region_in_canvas()
+ var chunk_pool = PoolVector2Array()
+ for chunk_x in range(first_used_region.x, last_used_region.x):
+ for chunk_y in range(first_used_region.y, last_used_region.y):
+ chunk_pool.append(Vector2(chunk_x, chunk_y))
+ return chunk_pool
+
+func get_first_used_region_in_canvas():
+ return get_region_from_cell(0, 0)
+
+func get_last_used_region_in_canvas():
+ return get_region_from_cell(canvas_size.x - 1, canvas_size.y - 1)
+
+func get_cells_in_region(x, y):
+ var start_cell = Vector2(x * region_size, y * region_size)
+ var end_cell = Vector2((x * region_size) + region_size, (y * region_size) + region_size)
+ var cell_array = []
+ for cx in range(start_cell.x, end_cell.x):
+ for cy in range(start_cell.y, end_cell.y):
+ var pixel_cell = get_pixel_cell(cx, cy)
+ if pixel_cell == null:
+ pixel_cell = [cx, cy, Color(0, 0, 0, 0)]
+ cell_array.append(pixel_cell)
+ return cell_array
diff --git a/modules/paint/addon/PaintCanvas.tscn b/modules/paint/addon/PaintCanvas.tscn
new file mode 100644
index 000000000..4ce758199
--- /dev/null
+++ b/modules/paint/addon/PaintCanvas.tscn
@@ -0,0 +1,30 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://addons/Godoxel/PaintCanvas.gd" type="Script" id=1]
+
+
+[node name="PaintCanvas" type="Control"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+mouse_filter = 2
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+canvas_size = Vector2( 64, 37 )
+
+[node name="ChunkNodes" type="Control" parent="."]
+anchor_right = 1.0
+anchor_bottom = 1.0
+mouse_filter = 2
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="CanvasImage" type="TextureRect" parent="."]
+visible = false
+anchor_right = 1.0
+anchor_bottom = 1.0
+mouse_filter = 2
+expand = true
+stretch_mode = 3
diff --git a/modules/paint/addon/PaintCanvasChunk.gd b/modules/paint/addon/PaintCanvasChunk.gd
new file mode 100644
index 000000000..3a49c02d5
--- /dev/null
+++ b/modules/paint/addon/PaintCanvasChunk.gd
@@ -0,0 +1,27 @@
+tool
+extends Control
+
+var image = Image.new()
+var image_texture = ImageTexture.new()
+
+func _ready():
+ mouse_filter = Control.MOUSE_FILTER_IGNORE
+
+func setup(region_size):
+ image.create(region_size, region_size, true, Image.FORMAT_RGBA8)
+ image.lock()
+
+func update_chunk():
+ image_texture.create_from_image(image)
+ image_texture.set_flags(0)
+ self.texture = image_texture
+
+func set_cell(x, y, color):
+ image.set_pixel(x, y, color)
+ update_chunk()
+
+func _on_VisibilityNotifier2D_screen_entered():
+ visible = true
+
+func _on_VisibilityNotifier2D_screen_exited():
+ visible = false
diff --git a/modules/paint/addon/PaintCanvasChunk.tscn b/modules/paint/addon/PaintCanvasChunk.tscn
new file mode 100644
index 000000000..1f2f2b0b0
--- /dev/null
+++ b/modules/paint/addon/PaintCanvasChunk.tscn
@@ -0,0 +1,13 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://addons/Godoxel/PaintCanvasChunk.gd" type="Script" id=1]
+
+
+[node name="PaintCanvasChunk" type="TextureRect"]
+margin_right = 10.0
+margin_bottom = 10.0
+rect_scale = Vector2( 16, 16 )
+mouse_filter = 2
+expand = true
+stretch_mode = 1
+script = ExtResource( 1 )
diff --git a/modules/paint/addon/PaintCanvasContainer.gd b/modules/paint/addon/PaintCanvasContainer.gd
new file mode 100644
index 000000000..34ca40012
--- /dev/null
+++ b/modules/paint/addon/PaintCanvasContainer.gd
@@ -0,0 +1,2 @@
+tool
+extends Control
diff --git a/modules/paint/addon/README.md b/modules/paint/addon/README.md
new file mode 100644
index 000000000..e22c2070a
--- /dev/null
+++ b/modules/paint/addon/README.md
@@ -0,0 +1,17 @@
+# Godoxel (image Editor) v0.1
+###### (Godot-Pixel Image Editor)
+
+
+Godoxel is an image editor for Godot, that can be used inside the editor.
+
+
+
+## Features
+
+* Has basic pixel editor functionality
+* Save/Load
+* Multiple layers (can be locked/hidden)
+* Tools: Pencil, lighten/darken, rectangle/line, fill, ...
+
+---
+###### For feature proposals or occuring problems, please write an issue or message me on Discord cobrapitz#2872
diff --git a/modules/paint/addon/SaveFileDialog.gd b/modules/paint/addon/SaveFileDialog.gd
new file mode 100644
index 000000000..7517f21f4
--- /dev/null
+++ b/modules/paint/addon/SaveFileDialog.gd
@@ -0,0 +1,72 @@
+tool
+extends FileDialog
+
+#var canvas
+
+var file_path = ""
+
+
+#func _enter_tree():
+ #canvas = get_parent().find_node("Canvas")
+ #canvas = get_parent().paint_canvas
+
+
+func _ready():
+ # warning-ignore:return_value_discarded
+ get_line_edit().connect("text_entered", self, "_on_LineEdit_text_entered")
+ invalidate()
+ clear_filters()
+ add_filter("*.png ; PNG Images")
+
+
+func _on_SaveFileDialog_file_selected(path):
+ #print("selected file: ", path)
+ file_path = path
+ save_file()
+
+
+# warning-ignore:unused_argument
+func _on_LineEdit_text_entered(text):
+ return
+# print("text entered: ", text)
+
+
+func _on_SaveFileDialog_confirmed():
+ return
+# print("confirmed: ", current_path)
+
+
+func save_file():
+ var image = Image.new()
+ var canvas = get_parent().paint_canvas
+ image.create(canvas.canvas_width, canvas.canvas_height, true, Image.FORMAT_RGBA8)
+ image.lock()
+
+ for layer in canvas.layers:
+ var idx = 0
+ if not layer.visible:
+ continue
+ for x in range(layer.layer_width):
+ for y in range(layer.layer_height):
+ var color = layer.get_pixel(x, y)
+ var image_color = image.get_pixel(x, y)
+
+ if color.a != 0:
+ image.set_pixel(x, y, image_color.blend(color))
+ else:
+ image.set_pixel(x, y, color)
+ image.unlock()
+
+ var dir = Directory.new()
+ if dir.file_exists(file_path):
+ dir.remove(file_path)
+
+ image.save_png(file_path)
+
+
+func _on_SaveFileDialog_about_to_show():
+ invalidate()
+
+
+func _on_SaveFileDialog_visibility_changed():
+ invalidate()
diff --git a/modules/paint/addon/SelectionBox.gd b/modules/paint/addon/SelectionBox.gd
new file mode 100644
index 000000000..7ddfd2abf
--- /dev/null
+++ b/modules/paint/addon/SelectionBox.gd
@@ -0,0 +1,24 @@
+tool
+extends Control
+
+export var outline_size = 3
+
+func _ready():
+ pass
+
+func _process(delta):
+ update()
+
+func _draw():
+ if not rect_size == Vector2():
+ draw_outline_box(rect_size, Color.gray, outline_size)
+
+func draw_outline_box(size, color, width):
+ #Top line
+ draw_line(Vector2(0 + 1, 0), Vector2(size.x, 0), color, width)
+ #Left line
+ draw_line(Vector2(0 + 1, 0), Vector2(0, size.y), color, width)
+ #Bottom line
+ draw_line(Vector2(0 + 1, size.y), Vector2(size.x, size.y), color, width)
+ #Right line
+ draw_line(Vector2(size.x, 0), Vector2(size.x, size.y), color, width)
diff --git a/modules/paint/addon/Settings.gd b/modules/paint/addon/Settings.gd
new file mode 100644
index 000000000..865758579
--- /dev/null
+++ b/modules/paint/addon/Settings.gd
@@ -0,0 +1,24 @@
+tool
+extends Control
+
+var editor
+var canvas_outline
+var start_time
+var end_time
+
+
+func _enter_tree():
+ canvas_outline = get_parent().find_node("CanvasOutline")
+ editor = get_parent()
+
+
+func _on_ColorPickerButton_color_changed(color):
+ canvas_outline.color = color
+
+
+func _on_CheckButton_toggled(button_pressed):
+ canvas_outline.visible = button_pressed
+
+
+func _on_Ok_pressed():
+ hide()
diff --git a/modules/paint/addon/Settings.tscn b/modules/paint/addon/Settings.tscn
new file mode 100644
index 000000000..f2d9c245e
--- /dev/null
+++ b/modules/paint/addon/Settings.tscn
@@ -0,0 +1,64 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://addons/Godoxel/Settings.gd" type="Script" id=1]
+
+
+[node name="Settings" type="WindowDialog"]
+visible = true
+margin_top = 20.0
+margin_right = 300.0
+margin_bottom = 120.0
+window_title = "Settings"
+script = ExtResource( 1 )
+
+[node name="Ok" type="Button" parent="."]
+margin_left = 210.0
+margin_top = 70.0
+margin_right = 290.0
+margin_bottom = 90.0
+text = "Ok"
+
+[node name="CanvasOutlineToggle" type="Control" parent="."]
+margin_left = 10.0
+margin_top = 10.0
+margin_right = 290.0
+margin_bottom = 30.0
+__meta__ = {
+"_edit_group_": true
+}
+
+[node name="Label" type="Label" parent="CanvasOutlineToggle"]
+margin_right = 130.0
+margin_bottom = 20.0
+text = "Canvas Outline:"
+valign = 1
+
+[node name="CheckButton" type="CheckButton" parent="CanvasOutlineToggle"]
+margin_left = 210.0
+margin_top = -10.0
+margin_right = 286.0
+margin_bottom = 30.0
+pressed = true
+
+[node name="CanvasOutlineColor" type="Control" parent="."]
+margin_left = 10.0
+margin_top = 40.0
+margin_right = 290.0
+margin_bottom = 60.0
+__meta__ = {
+"_edit_group_": true
+}
+
+[node name="Label" type="Label" parent="CanvasOutlineColor"]
+margin_right = 130.0
+margin_bottom = 20.0
+text = "Canvas Outline Color:"
+valign = 1
+
+[node name="ColorPickerButton" type="ColorPickerButton" parent="CanvasOutlineColor"]
+margin_left = 170.0
+margin_right = 280.0
+margin_bottom = 20.0
+[connection signal="pressed" from="Ok" to="." method="_on_Ok_pressed"]
+[connection signal="toggled" from="CanvasOutlineToggle/CheckButton" to="." method="_on_CheckButton_toggled"]
+[connection signal="color_changed" from="CanvasOutlineColor/ColorPickerButton" to="." method="_on_ColorPickerButton_color_changed"]
diff --git a/modules/paint/addon/TextInfo.gd b/modules/paint/addon/TextInfo.gd
new file mode 100644
index 000000000..e9368e1f1
--- /dev/null
+++ b/modules/paint/addon/TextInfo.gd
@@ -0,0 +1,39 @@
+tool
+extends Control
+
+var size = 240
+
+#TODO: To make reading the text easier, the text info with the longest text should have it's length applied to all the
+#the other text infos
+
+func add_text_info(text_name, custom_node = null):
+ var last_text_info_child = null
+ var child_count = get_child_count()
+ if not child_count <= 0:
+ last_text_info_child = get_children()[get_children().size() - 1]
+ var label = Label.new()
+ label.name = text_name
+ label.rect_size = Vector2(size, 14)
+ if not last_text_info_child == null:
+ var x = last_text_info_child.rect_position.x
+ var y = last_text_info_child.rect_position.y
+ var temp_size = size
+ if child_count == 4:
+ x = 0
+ y = 20
+ temp_size = 0
+ label.rect_position = Vector2(x + temp_size, y)
+ if not custom_node == null:
+ label.add_child(custom_node)
+ add_child(label)
+
+func update_text_info(text_name, text_value = null, node = null, node_target_value = null, node_value = null):
+ var text_label = self.get_node(text_name)
+ if text_label == null:
+ return
+ if not node == null:
+ get_node(text_name).get_node(node).set(node_target_value, node_value)
+ if text_value == null:
+ text_label.text = "%s: %s" % [text_name, null]
+ else:
+ text_label.text = "%s: %s" % [text_name, String(text_value)]
diff --git a/modules/paint/addon/Util.gd b/modules/paint/addon/Util.gd
new file mode 100644
index 000000000..9840120c9
--- /dev/null
+++ b/modules/paint/addon/Util.gd
@@ -0,0 +1,94 @@
+tool
+extends Node
+class_name GEUtils
+
+
+static func get_pixels_in_line(from: Vector2, to: Vector2):
+ var dx = to[0] - from[0]
+ var dy = to[1] - from[1]
+ var nx = abs(dx)
+ var ny = abs(dy)
+ var signX = sign(dx)
+ var signY = sign(dy)
+ var p = from
+ var points : Array = [p]
+
+ var ix = 0
+ var iy = 0
+
+ while ix < nx || iy < ny:
+ if (1 + (ix << 1)) * ny < (1 + (iy << 1)) * nx:
+ p[0] += signX
+ ix +=1
+ else:
+ p[1] += signY
+ iy += 1
+ points.append(p)
+ return points
+
+
+static func to_1D_v(p, w) -> int:
+ return p.x + p.y * w
+
+
+static func to_1D(x, y, w) -> int:
+ return x + y * w
+
+
+static func to_2D(idx, w) -> Vector2:
+ var p = Vector2()
+ p.x = int(idx) % int(w)
+ p.y = int(idx / w)
+ return p
+
+
+
+static func color_from_array(color_array):
+ var r = color_array[0]
+ var g = color_array[1]
+ var b = color_array[2]
+ var a = color_array[3]
+ return Color(r, g, b, a)
+
+static func random_color():
+ return Color(randf(), randf(), randf())
+
+static func random_color_alt():
+ var rand = randi() % 6
+
+ match rand:
+ #red
+ 0:
+ return Color.red
+ #blue
+ 1:
+ return Color.blue
+ #green
+ 2:
+ return Color.green
+ #orange
+ 3:
+ return Color.orange
+ #yellow
+ 4:
+ return Color.yellow
+ #purple
+ 5:
+ return Color.purple
+
+static func get_line_string(file, number):
+ return file.get_as_text().split("\n")[number - 1].strip_edges()
+
+static func printv(variable):
+ var stack = get_stack()[get_stack().size() - 1]
+ var line = stack.line
+ var source = stack.source
+ var file = File.new()
+ file.open(source, File.READ)
+ var line_string = get_line_string(file, line)
+ file.close()
+ var left_p = line_string.find("(")
+ var left_p_string = line_string.right(left_p + 1)
+ var right_p = left_p_string.find(")")
+ var variable_name = left_p_string.left(right_p)
+ print("%s: %s" % [variable_name, variable])
diff --git a/modules/paint/addon/ViewportContainer.gd b/modules/paint/addon/ViewportContainer.gd
new file mode 100644
index 000000000..5ff1df6e9
--- /dev/null
+++ b/modules/paint/addon/ViewportContainer.gd
@@ -0,0 +1,6 @@
+extends ViewportContainer
+tool
+
+func _ready():
+ get_child(0).size = rect_size
+
diff --git a/modules/paint/addon/VisualGrid.gd b/modules/paint/addon/VisualGrid.gd
new file mode 100644
index 000000000..a935a15dc
--- /dev/null
+++ b/modules/paint/addon/VisualGrid.gd
@@ -0,0 +1,41 @@
+tool
+extends Control
+
+export var color = Color()
+export var size:int = 16
+export var zoom = 0
+export var offset = Vector2(0, 0)
+
+
+func _enter_tree():
+ set_process(true)
+
+
+func _draw():
+ if size == 0:
+ size = 1
+
+ var temp_size = size + zoom
+
+ var wrap_offset = Vector2(wrapf(offset.x, 0, temp_size), wrapf(offset.y, 0, temp_size))
+
+ var ceil_x = ceil(rect_size.x / temp_size)
+ var ceil_y = ceil(rect_size.y / temp_size)
+
+ for i in ceil_y:
+ var start_x = Vector2(0, (i * temp_size) + wrap_offset.y)
+ var end_x = Vector2(rect_size.x, (i * temp_size) + wrap_offset.y)
+# var end_x = Vector2(int(rect_size.x) + size - int(rect_size.x) % size, (i * temp_size) + wrap_offset.y)
+ draw_line(start_x, end_x, color, 1)
+
+ for i in ceil_x:
+ var start_y = Vector2((i * temp_size) + wrap_offset.x, 0)
+ var end_y = Vector2((i * temp_size) + (wrap_offset.x), rect_size.y)
+# var end_y = Vector2((i * temp_size) + (wrap_offset.x), int(rect_size.y) + size - int(rect_size.y) % size)
+ draw_line(start_y, end_y, color, 1)
+
+
+func _process(delta):
+ if not is_visible_in_tree():
+ return
+ update()
diff --git a/modules/paint/addon/VisualGrid.tscn b/modules/paint/addon/VisualGrid.tscn
new file mode 100644
index 000000000..ac8345a84
--- /dev/null
+++ b/modules/paint/addon/VisualGrid.tscn
@@ -0,0 +1,9 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://addons/Godoxel/VisualGrid.gd" type="Script" id=1]
+
+
+[node name="VisualGrid" type="Control"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+script = ExtResource( 1 )
diff --git a/modules/paint/addon/actions/Action.gd b/modules/paint/addon/actions/Action.gd
new file mode 100644
index 000000000..97292c207
--- /dev/null
+++ b/modules/paint/addon/actions/Action.gd
@@ -0,0 +1,123 @@
+extends Node
+class_name GEAction
+
+
+var action_data = {}
+
+
+func _init():
+ action_data["redo"] = {}
+ action_data["undo"] = {}
+ action_data["preview"] = {}
+
+
+func do_action(canvas, data: Array):
+ if not "cells" in action_data.redo:
+ action_data.redo["cells"] = []
+ action_data.redo["colors"] = []
+
+ if not "cells" in action_data.undo:
+ action_data.undo["cells"] = []
+ action_data.undo["colors"] = []
+
+ if not "cells" in action_data.preview:
+ action_data.preview["cells"] = []
+ action_data.preview["colors"] = []
+
+ if not "layer" in action_data:
+ action_data["layer"] = canvas.active_layer
+
+
+func commit_action(canvas):
+ print("NO IMPL commit_action ")
+ return []
+
+
+func undo_action(canvas):
+ print("NO IMPL undo_action ")
+
+
+func redo_action(canvas):
+ print("NO IMPL redo_action ")
+
+
+func can_commit() -> bool:
+ return not action_data.redo.empty()
+
+
+func get_x_sym_points(canvas_width, pixel):
+ var p = int(canvas_width - pixel.x)
+ var all_points = [pixel, Vector2(p-1, pixel.y)]
+
+ var points :Array = []
+ for point in all_points:
+ if point in points:
+ continue
+ points.append(point)
+ return points
+
+
+func get_y_sym_points(canvas_height, pixel):
+ var p = int(canvas_height - pixel.y)
+ var all_points = [pixel, Vector2(pixel.x, p-1)]
+
+ var points :Array = []
+ for point in all_points:
+ if point in points:
+ continue
+ points.append(point)
+ return points
+
+
+func get_xy_sym_points(canvas_width, canvas_height, pixel):
+ var all_points = []
+ var xpoints = get_x_sym_points(canvas_width, pixel)
+
+ all_points += get_y_sym_points(canvas_height, xpoints[0])
+ all_points += get_y_sym_points(canvas_height, xpoints[1])
+
+ var points :Array = []
+ for point in all_points:
+ if point in points:
+ continue
+ points.append(point)
+
+ return points
+
+
+func get_points(canvas, pixel):
+ var points = []
+ if canvas.symmetry_x and canvas.symmetry_y:
+ var sym_points = get_xy_sym_points(canvas.canvas_width, canvas.canvas_height, pixel)
+ for point in sym_points:
+ if point in action_data.undo.cells or canvas.get_pixel_v(point) == null:
+ continue
+ if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent:
+ continue
+ points.append(point)
+ elif canvas.symmetry_y:
+ var sym_points = get_y_sym_points(canvas.canvas_height, pixel)
+ for point in sym_points:
+ if point in action_data.undo.cells or canvas.get_pixel_v(point) == null:
+ continue
+ if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent:
+ continue
+ points.append(point)
+ elif canvas.symmetry_x:
+ var sym_points = get_x_sym_points(canvas.canvas_width, pixel)
+ for point in sym_points:
+ if point in action_data.undo.cells or canvas.get_pixel_v(point) == null:
+ continue
+ if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent:
+ continue
+ points.append(point)
+ else:
+ if pixel in action_data.undo.cells or canvas.get_pixel_v(pixel) == null:
+ return []
+ if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent:
+ return []
+ points.append(pixel)
+
+ return points
+
+
diff --git a/modules/paint/addon/actions/Brighten.gd b/modules/paint/addon/actions/Brighten.gd
new file mode 100644
index 000000000..faf7f8161
--- /dev/null
+++ b/modules/paint/addon/actions/Brighten.gd
@@ -0,0 +1,53 @@
+extends GEAction
+class_name GEBrighten
+
+
+const brighten_color = 0.1
+
+
+func do_action(canvas, data: Array):
+ .do_action(canvas, data)
+
+ var pixels = GEUtils.get_pixels_in_line(data[0], data[1])
+ for pixel in pixels:
+ if canvas.get_pixel_v(pixel) == null:
+ continue
+
+ if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent:
+ continue
+
+ if pixel in action_data.undo.cells:
+ var brightened_color = canvas.get_pixel_v(pixel).lightened(0.1)
+ canvas.set_pixel_v(pixel, brightened_color)
+
+ action_data.redo.cells.append(pixel)
+ action_data.redo.colors.append(brightened_color)
+ continue
+
+ action_data.undo.colors.append(canvas.get_pixel_v(pixel))
+ action_data.undo.cells.append(pixel)
+ var brightened_color = canvas.get_pixel_v(pixel).lightened(0.1)
+ canvas.set_pixel_v(pixel, brightened_color)
+
+ action_data.redo.cells.append(pixel)
+ action_data.redo.colors.append(brightened_color)
+
+
+func commit_action(canvas):
+ var cells = action_data.redo.cells
+ var colors = action_data.redo.colors
+ return []
+
+
+func undo_action(canvas):
+ var cells = action_data.undo.cells
+ var colors = action_data.undo.colors
+ for idx in range(cells.size()):
+ canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx])
+
+
+func redo_action(canvas):
+ var cells = action_data.redo.cells
+ var colors = action_data.redo.colors
+ for idx in range(cells.size()):
+ canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx])
diff --git a/modules/paint/addon/actions/Brush.gd b/modules/paint/addon/actions/Brush.gd
new file mode 100644
index 000000000..edeccaf8e
--- /dev/null
+++ b/modules/paint/addon/actions/Brush.gd
@@ -0,0 +1,47 @@
+extends GEAction
+class_name GEBrush
+
+
+func do_action(canvas: GECanvas, data: Array):
+ .do_action(canvas, data)
+
+ for pixel in GEUtils.get_pixels_in_line(data[0], data[1]):
+ for off in BrushPrefabs.get_brush(data[3], data[4]):
+ var p = pixel + off
+
+ if p in action_data.undo.cells or canvas.get_pixel_v(p) == null:
+ continue
+
+ if canvas.is_alpha_locked() and canvas.get_pixel_v(p) == Color.transparent:
+ continue
+
+ action_data.undo.colors.append(canvas.get_pixel_v(p))
+ action_data.undo.cells.append(p)
+
+ canvas.set_pixel_v(p, data[2])
+
+ action_data.redo.cells.append(p)
+ action_data.redo.colors.append(data[2])
+
+
+func commit_action(canvas):
+ var cells = action_data.redo.cells
+ var colors = action_data.redo.colors
+ return []
+
+
+func undo_action(canvas):
+ var cells = action_data.undo.cells
+ var colors = action_data.undo.colors
+ for idx in range(cells.size()):
+ canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx])
+
+
+func redo_action(canvas):
+ var cells = action_data.redo.cells
+ var colors = action_data.redo.colors
+ for idx in range(cells.size()):
+ canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx])
+
+
+
diff --git a/modules/paint/addon/actions/Bucket.gd b/modules/paint/addon/actions/Bucket.gd
new file mode 100644
index 000000000..8ff2f90ae
--- /dev/null
+++ b/modules/paint/addon/actions/Bucket.gd
@@ -0,0 +1,49 @@
+extends GEAction
+class_name GEBucket
+
+
+
+func do_action(canvas, data: Array):
+ .do_action(canvas, data)
+
+ if canvas.get_pixel_v(data[0]) == data[2]:
+ return
+ var pixels = canvas.select_same_color(data[0].x, data[0].y)
+
+ for pixel in pixels:
+ if pixel in action_data.undo.cells:
+ continue
+
+ if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent:
+ continue
+
+ action_data.undo.colors.append(canvas.get_pixel_v(pixel))
+ action_data.undo.cells.append(pixel)
+
+ canvas.set_pixel_v(pixel, data[2])
+
+ action_data.redo.cells.append(pixel)
+ action_data.redo.colors.append(data[2])
+
+
+func commit_action(canvas):
+ var cells = action_data.preview.cells
+ var colors = action_data.preview.colors
+ return []
+
+
+func undo_action(canvas):
+ var cells = action_data.undo.cells
+ var colors = action_data.undo.colors
+ for idx in range(cells.size()):
+ canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx])
+
+
+func redo_action(canvas):
+ var cells = action_data.redo.cells
+ var colors = action_data.redo.colors
+ for idx in range(cells.size()):
+ canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx])
+
+
+
diff --git a/modules/paint/addon/actions/Cut.gd b/modules/paint/addon/actions/Cut.gd
new file mode 100644
index 000000000..4f608153f
--- /dev/null
+++ b/modules/paint/addon/actions/Cut.gd
@@ -0,0 +1,82 @@
+extends GEAction
+class_name GECut
+
+const selection_color = Color(0.8, 0.8, 0.8, 0.5)
+var mouse_start_pos = null
+var mouse_end_pos = null
+
+
+func can_commit() -> bool:
+ return false #ugly way of handling a cut
+
+
+func do_action(canvas, data: Array):
+ .do_action(canvas, data)
+
+ if mouse_start_pos == null:
+ mouse_start_pos = data[0]
+ mouse_end_pos = data[0]
+
+ action_data.preview.cells.clear()
+ action_data.preview.colors.clear()
+ canvas.clear_preview_layer()
+
+ var p = mouse_start_pos
+ var s = mouse_end_pos - mouse_start_pos
+
+ var pixels = GEUtils.get_pixels_in_line(p, p + Vector2(s.x, 0))
+ pixels += GEUtils.get_pixels_in_line(p, p + Vector2(0, s.y))
+ pixels += GEUtils.get_pixels_in_line(p + s, p + s + Vector2(0, -s.y))
+ pixels += GEUtils.get_pixels_in_line(p + s, p + s + Vector2(-s.x, 0))
+
+ for pixel in pixels:
+ canvas.set_preview_pixel_v(pixel, selection_color)
+ action_data.preview.cells.append(pixel)
+ action_data.preview.colors.append(selection_color)
+
+
+func commit_action(canvas):
+ canvas.clear_preview_layer()
+ var p = mouse_start_pos
+ var s = mouse_end_pos - mouse_start_pos
+
+ for x in range(abs(s.x)+1):
+ for y in range(abs(s.y)+1):
+ var px = x
+ var py = y
+ if s.x < 0:
+ px *= -1
+ if s.y < 0:
+ py *= -1
+
+ var pos = p + Vector2(px, py)
+ var color = canvas.get_pixel(pos.x, pos.y)
+
+ if color == null or color.a == 0.0:
+ continue
+
+ action_data.redo.cells.append(pos)
+ action_data.redo.colors.append(canvas.get_pixel_v(pos))
+
+ canvas.set_pixel_v(pos, Color.transparent)
+
+ action_data.undo.cells.append(pos)
+ action_data.undo.colors.append(Color.transparent)
+ return []
+
+
+func undo_action(canvas):
+ var cells = action_data.undo.cells
+ var colors = action_data.undo.colors
+ for idx in range(cells.size()):
+ canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx])
+
+
+func redo_action(canvas):
+ var cells = action_data.redo.cells
+ var colors = action_data.redo.colors
+ for idx in range(cells.size()):
+ canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx])
+
+
+
diff --git a/modules/paint/addon/actions/Darken.gd b/modules/paint/addon/actions/Darken.gd
new file mode 100644
index 000000000..3832a17d5
--- /dev/null
+++ b/modules/paint/addon/actions/Darken.gd
@@ -0,0 +1,55 @@
+extends GEAction
+class_name GEDarken
+
+const dark_factor = 0.1
+
+
+func do_action(canvas, data: Array):
+ .do_action(canvas, data)
+
+ var pixels = GEUtils.get_pixels_in_line(data[0], data[1])
+ for pixel in pixels:
+ if canvas.get_pixel_v(pixel) == null:
+ continue
+
+ if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent:
+ continue
+
+ if pixel in action_data.undo.cells:
+ var darkened_color = canvas.get_pixel_v(pixel).darkened(dark_factor)
+ canvas.set_pixel_v(pixel, darkened_color)
+
+ action_data.redo.cells.append(pixel)
+ action_data.redo.colors.append(darkened_color)
+ continue
+
+ action_data.undo.colors.append(canvas.get_pixel_v(pixel))
+ action_data.undo.cells.append(pixel)
+ var darkened_color = canvas.get_pixel_v(pixel).darkened(dark_factor)
+ canvas.set_pixel_v(pixel, darkened_color)
+
+ action_data.redo.cells.append(pixel)
+ action_data.redo.colors.append(darkened_color)
+
+
+func commit_action(canvas):
+ var cells = action_data.redo.cells
+ var colors = action_data.redo.colors
+ return []
+
+
+func undo_action(canvas):
+ var cells = action_data.undo.cells
+ var colors = action_data.undo.colors
+ for idx in range(cells.size()):
+ canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx])
+
+
+func redo_action(canvas):
+ var cells = action_data.redo.cells
+ var colors = action_data.redo.colors
+ for idx in range(cells.size()):
+ canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx])
+
+
+
diff --git a/modules/paint/addon/actions/Line.gd b/modules/paint/addon/actions/Line.gd
new file mode 100644
index 000000000..6f17316f8
--- /dev/null
+++ b/modules/paint/addon/actions/Line.gd
@@ -0,0 +1,59 @@
+extends GEAction
+class_name GELine
+
+
+var mouse_start_pos = null
+
+func do_action(canvas, data: Array):
+ .do_action(canvas, data)
+
+ if mouse_start_pos == null:
+ mouse_start_pos = data[0]
+
+ action_data.preview.cells.clear()
+ action_data.preview.colors.clear()
+ canvas.clear_preview_layer()
+
+ var pixels = GEUtils.get_pixels_in_line(data[0], mouse_start_pos)
+ for pixel in pixels:
+ if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent:
+ continue
+
+ canvas.set_preview_pixel_v(pixel, data[2])
+ action_data.preview.cells.append(pixel)
+ action_data.preview.colors.append(data[2])
+
+
+func commit_action(canvas):
+ canvas.clear_preview_layer()
+ var cells = action_data.preview.cells
+ var colors = action_data.preview.colors
+ for idx in range(cells.size()):
+ if canvas.get_pixel_v(cells[idx]) == null:
+ continue
+ action_data.undo.cells.append(cells[idx])
+ action_data.undo.colors.append(canvas.get_pixel_v(cells[idx]))
+
+ canvas.set_pixel_v(cells[idx], colors[idx])
+
+ action_data.redo.cells.append(cells[idx])
+ action_data.redo.colors.append(colors[idx])
+ mouse_start_pos = null
+ return []
+
+
+func undo_action(canvas):
+ var cells = action_data.undo.cells
+ var colors = action_data.undo.colors
+ for idx in range(cells.size()):
+ canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx])
+
+
+func redo_action(canvas):
+ var cells = action_data.redo.cells
+ var colors = action_data.redo.colors
+ for idx in range(cells.size()):
+ canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx])
+
+
+
diff --git a/modules/paint/addon/actions/MultiLine.gd b/modules/paint/addon/actions/MultiLine.gd
new file mode 100644
index 000000000..b3850ffa1
--- /dev/null
+++ b/modules/paint/addon/actions/MultiLine.gd
@@ -0,0 +1,44 @@
+extends GEAction
+class_name GEMultiLine
+
+
+func can_commit() -> bool:
+ return false
+
+
+func update_action(canvas, data: Array):
+ .update_action(canvas, data)
+
+ var pixels = GEUtils.get_pixels_in_line(data[0], data[1])
+ for pixel in pixels:
+ if pixel in action_data.undo.cells or canvas.get_pixel_v(pixel) == null or canvas.is_alpha_locked():
+ continue
+ action_data.undo.colors.append(canvas.get_pixel_v(pixel))
+ action_data.undo.cells.append(pixel)
+ canvas.set_pixel_v(pixel, data[2])
+
+ action_data.redo.cells.append(pixel)
+ action_data.redo.colors.append(data[2])
+
+
+func commit_action(canvas):
+ var cells = action_data.redo.cells
+ var colors = action_data.redo.colors
+ return []
+
+
+func undo_action(canvas):
+ var cells = action_data.undo.cells
+ var colors = action_data.undo.colors
+ for idx in range(cells.size()):
+ canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx])
+
+
+func redo_action(canvas):
+ var cells = action_data.redo.cells
+ var colors = action_data.redo.colors
+ for idx in range(cells.size()):
+ canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx])
+
+
+
diff --git a/modules/paint/addon/actions/PasteCut.gd b/modules/paint/addon/actions/PasteCut.gd
new file mode 100644
index 000000000..5ffaa8eb3
--- /dev/null
+++ b/modules/paint/addon/actions/PasteCut.gd
@@ -0,0 +1,59 @@
+extends GEAction
+class_name GEPasteCut
+
+
+#data[2] = selection_pos
+#data[3] = selection_color
+#data[4] = cut pos
+#data[5] = cut size
+func do_action(canvas, data: Array):
+ .do_action(canvas, data)
+
+ for pixel_pos in GEUtils.get_pixels_in_line(data[0], data[1]):
+ for idx in range(data[2].size()):
+ var pixel = data[2][idx]
+ var color = data[3][idx]
+ pixel -= data[4] + data[5] / 2
+ pixel += pixel_pos
+
+ if canvas.get_pixel_v(pixel) == null:
+ continue
+
+ if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent:
+ continue
+
+ var found = action_data.redo.cells.find(pixel)
+ if found == -1:
+ action_data.redo.cells.append(pixel)
+ action_data.redo.colors.append(color)
+ else:
+ action_data.redo.colors[found] = color
+
+ found = action_data.undo.cells.find(pixel)
+ if found == -1:
+ action_data.undo.colors.append(canvas.get_pixel_v(pixel))
+ action_data.undo.cells.append(pixel)
+
+ canvas.set_pixel_v(pixel, color)
+
+
+func commit_action(canvas):
+ canvas.clear_preview_layer()
+ return []
+
+
+func undo_action(canvas):
+ var cells = action_data.undo.cells
+ var colors = action_data.undo.colors
+ for idx in range(cells.size()):
+ canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx])
+
+
+func redo_action(canvas):
+ var cells = action_data.redo.cells
+ var colors = action_data.redo.colors
+ for idx in range(cells.size()):
+ canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx])
+
+
+
diff --git a/modules/paint/addon/actions/Pencil.gd b/modules/paint/addon/actions/Pencil.gd
new file mode 100644
index 000000000..906236fef
--- /dev/null
+++ b/modules/paint/addon/actions/Pencil.gd
@@ -0,0 +1,43 @@
+extends GEAction
+class_name GEPencil
+
+
+func do_action(canvas, data: Array):
+ .do_action(canvas, data)
+
+ var pixels = GEUtils.get_pixels_in_line(data[0], data[1])
+ for pixel in pixels:
+ for p in get_points(canvas, pixel):
+ _set_pixel(canvas, p, data[2])
+
+
+func _set_pixel(canvas, pixel, color):
+ action_data.undo.colors.append(canvas.get_pixel_v(pixel))
+ action_data.undo.cells.append(pixel)
+ canvas.set_pixel_v(pixel, color)
+
+ action_data.redo.cells.append(pixel)
+ action_data.redo.colors.append(color)
+
+
+func commit_action(canvas):
+ var cells = action_data.redo.cells
+ var colors = action_data.redo.colors
+ return []
+
+
+func undo_action(canvas):
+ var cells = action_data.undo.cells
+ var colors = action_data.undo.colors
+ for idx in range(cells.size()):
+ canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx])
+
+
+func redo_action(canvas):
+ var cells = action_data.redo.cells
+ var colors = action_data.redo.colors
+ for idx in range(cells.size()):
+ canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx])
+
+
+
diff --git a/modules/paint/addon/actions/Rainbow.gd b/modules/paint/addon/actions/Rainbow.gd
new file mode 100644
index 000000000..618bdd17a
--- /dev/null
+++ b/modules/paint/addon/actions/Rainbow.gd
@@ -0,0 +1,58 @@
+extends GEAction
+class_name GERainbow
+
+
+func do_action(canvas, data: Array):
+ .do_action(canvas, data)
+
+ var pixels = GEUtils.get_pixels_in_line(data[0], data[1])
+ for pixel in pixels:
+ if canvas.get_pixel_v(pixel) == null:
+ continue
+
+ if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent:
+ continue
+
+ if pixel in action_data.undo.cells:
+ var color = GEUtils.random_color()
+ canvas.set_pixel_v(pixel, color)
+
+ var idx = action_data.redo.cells.find(pixel)
+ action_data.redo.cells.remove(idx)
+ action_data.redo.colors.remove(idx)
+
+ action_data.redo.cells.append(pixel)
+ action_data.redo.colors.append(color)
+ continue
+
+ action_data.undo.colors.append(canvas.get_pixel_v(pixel))
+ action_data.undo.cells.append(pixel)
+
+ var color = GEUtils.random_color()
+ canvas.set_pixel_v(pixel, color)
+
+ action_data.redo.cells.append(pixel)
+ action_data.redo.colors.append(color)
+
+
+func commit_action(canvas):
+ var cells = action_data.redo.cells
+ var colors = action_data.redo.colors
+ return []
+
+
+func undo_action(canvas):
+ var cells = action_data.undo.cells
+ var colors = action_data.undo.colors
+ for idx in range(cells.size()):
+ canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx])
+
+
+func redo_action(canvas):
+ var cells = action_data.redo.cells
+ var colors = action_data.redo.colors
+ for idx in range(cells.size()):
+ canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx])
+
+
+
diff --git a/modules/paint/addon/actions/Rect.gd b/modules/paint/addon/actions/Rect.gd
new file mode 100644
index 000000000..770e28bc0
--- /dev/null
+++ b/modules/paint/addon/actions/Rect.gd
@@ -0,0 +1,69 @@
+extends GEAction
+class_name GERect
+
+
+var mouse_start_pos = null
+
+func do_action(canvas, data: Array):
+ .do_action(canvas, data)
+
+ if mouse_start_pos == null:
+ mouse_start_pos = data[0]
+ #print("init:", mouse_start_pos)
+
+
+ action_data.undo.cells.clear()
+ action_data.undo.colors.clear()
+ action_data.preview.cells.clear()
+ action_data.preview.colors.clear()
+ canvas.clear_preview_layer()
+
+ var p = mouse_start_pos
+ var s = data[0] - mouse_start_pos
+ var pixels = GEUtils.get_pixels_in_line(p, p + Vector2(s.x, 0))
+ pixels += GEUtils.get_pixels_in_line(p, p + Vector2(0, s.y))
+ pixels += GEUtils.get_pixels_in_line(p + s, p + s + Vector2(0, -s.y))
+ pixels += GEUtils.get_pixels_in_line(p + s, p + s + Vector2(-s.x, 0))
+
+ for pixel in pixels:
+ if canvas.get_pixel_v(pixel) == null:
+ continue
+
+ if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent:
+ continue
+
+ canvas.set_preview_pixel_v(pixel, data[2])
+ action_data.undo.cells.append(pixel)
+ action_data.undo.colors.append(canvas.get_pixel_v(pixel))
+ action_data.preview.cells.append(pixel)
+ action_data.preview.colors.append(data[2])
+
+
+func commit_action(canvas):
+ canvas.clear_preview_layer()
+ var cells = action_data.preview.cells
+ var colors = action_data.preview.colors
+ for idx in range(cells.size()):
+ canvas.set_pixel_v(cells[idx], colors[idx])
+
+ action_data.redo.cells.append(cells[idx])
+ action_data.redo.colors.append(colors[idx])
+ mouse_start_pos = null
+ return []
+
+
+func undo_action(canvas):
+ var cells = action_data.undo.cells
+ var colors = action_data.undo.colors
+ for idx in range(cells.size()):
+ canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx])
+
+
+func redo_action(canvas):
+ var cells = action_data.redo.cells
+ var colors = action_data.redo.colors
+ for idx in range(cells.size()):
+ canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx])
+
+
+
diff --git a/modules/paint/addon/assets/BrushCircle.png b/modules/paint/addon/assets/BrushCircle.png
new file mode 100644
index 000000000..29249806c
Binary files /dev/null and b/modules/paint/addon/assets/BrushCircle.png differ
diff --git a/modules/paint/addon/assets/BrushCircle.png.import b/modules/paint/addon/assets/BrushCircle.png.import
new file mode 100644
index 000000000..6c0c6979f
--- /dev/null
+++ b/modules/paint/addon/assets/BrushCircle.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/BrushCircle.png-dd250909fee7964ffc38f7e4fcfe9c07.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/Godoxel/assets/BrushCircle.png"
+dest_files=[ "res://.import/BrushCircle.png-dd250909fee7964ffc38f7e4fcfe9c07.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/modules/paint/addon/assets/BrushCircle_Hovered.png b/modules/paint/addon/assets/BrushCircle_Hovered.png
new file mode 100644
index 000000000..d955418cd
Binary files /dev/null and b/modules/paint/addon/assets/BrushCircle_Hovered.png differ
diff --git a/modules/paint/addon/assets/BrushCircle_Hovered.png.import b/modules/paint/addon/assets/BrushCircle_Hovered.png.import
new file mode 100644
index 000000000..262712baf
--- /dev/null
+++ b/modules/paint/addon/assets/BrushCircle_Hovered.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/BrushCircle_Hovered.png-ae1a4d835af51e8a293b71d6a241b71c.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/Godoxel/assets/BrushCircle_Hovered.png"
+dest_files=[ "res://.import/BrushCircle_Hovered.png-ae1a4d835af51e8a293b71d6a241b71c.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/modules/paint/addon/assets/BrushHLine.png b/modules/paint/addon/assets/BrushHLine.png
new file mode 100644
index 000000000..ab8b7f518
Binary files /dev/null and b/modules/paint/addon/assets/BrushHLine.png differ
diff --git a/modules/paint/addon/assets/BrushHLine.png.import b/modules/paint/addon/assets/BrushHLine.png.import
new file mode 100644
index 000000000..dc4eaf137
--- /dev/null
+++ b/modules/paint/addon/assets/BrushHLine.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/BrushHLine.png-9182ec8ac804af16d356bf911782e299.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/Godoxel/assets/BrushHLine.png"
+dest_files=[ "res://.import/BrushHLine.png-9182ec8ac804af16d356bf911782e299.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/modules/paint/addon/assets/BrushHLine_Hovered.png b/modules/paint/addon/assets/BrushHLine_Hovered.png
new file mode 100644
index 000000000..c2a523887
Binary files /dev/null and b/modules/paint/addon/assets/BrushHLine_Hovered.png differ
diff --git a/modules/paint/addon/assets/BrushHLine_Hovered.png.import b/modules/paint/addon/assets/BrushHLine_Hovered.png.import
new file mode 100644
index 000000000..a5a460b56
--- /dev/null
+++ b/modules/paint/addon/assets/BrushHLine_Hovered.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/BrushHLine_Hovered.png-e51d5f3c1628c510a225057f3ed60d5a.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/Godoxel/assets/BrushHLine_Hovered.png"
+dest_files=[ "res://.import/BrushHLine_Hovered.png-e51d5f3c1628c510a225057f3ed60d5a.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/modules/paint/addon/assets/BrushRect.png b/modules/paint/addon/assets/BrushRect.png
new file mode 100644
index 000000000..a88cc75a3
Binary files /dev/null and b/modules/paint/addon/assets/BrushRect.png differ
diff --git a/modules/paint/addon/assets/BrushRect.png.import b/modules/paint/addon/assets/BrushRect.png.import
new file mode 100644
index 000000000..73e3317d6
--- /dev/null
+++ b/modules/paint/addon/assets/BrushRect.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/BrushRect.png-2b2d0ae4889c1fbc5c7bee7ae5515663.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/Godoxel/assets/BrushRect.png"
+dest_files=[ "res://.import/BrushRect.png-2b2d0ae4889c1fbc5c7bee7ae5515663.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/modules/paint/addon/assets/BrushRect_Hovered.png b/modules/paint/addon/assets/BrushRect_Hovered.png
new file mode 100644
index 000000000..4df526ae9
Binary files /dev/null and b/modules/paint/addon/assets/BrushRect_Hovered.png differ
diff --git a/modules/paint/addon/assets/BrushRect_Hovered.png.import b/modules/paint/addon/assets/BrushRect_Hovered.png.import
new file mode 100644
index 000000000..df4596ca4
--- /dev/null
+++ b/modules/paint/addon/assets/BrushRect_Hovered.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/BrushRect_Hovered.png-b09066b673d6082ce887a03a19f17977.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/Godoxel/assets/BrushRect_Hovered.png"
+dest_files=[ "res://.import/BrushRect_Hovered.png-b09066b673d6082ce887a03a19f17977.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/modules/paint/addon/assets/BrushVLine.png b/modules/paint/addon/assets/BrushVLine.png
new file mode 100644
index 000000000..dd047f70b
Binary files /dev/null and b/modules/paint/addon/assets/BrushVLine.png differ
diff --git a/modules/paint/addon/assets/BrushVLine.png.import b/modules/paint/addon/assets/BrushVLine.png.import
new file mode 100644
index 000000000..6eaf85a11
--- /dev/null
+++ b/modules/paint/addon/assets/BrushVLine.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/BrushVLine.png-022220d888fe2fe2f8a081bcca62b4b2.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/Godoxel/assets/BrushVLine.png"
+dest_files=[ "res://.import/BrushVLine.png-022220d888fe2fe2f8a081bcca62b4b2.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/modules/paint/addon/assets/BrushVLine_Hovered.png b/modules/paint/addon/assets/BrushVLine_Hovered.png
new file mode 100644
index 000000000..7ad686356
Binary files /dev/null and b/modules/paint/addon/assets/BrushVLine_Hovered.png differ
diff --git a/modules/paint/addon/assets/BrushVLine_Hovered.png.import b/modules/paint/addon/assets/BrushVLine_Hovered.png.import
new file mode 100644
index 000000000..d1ec26166
--- /dev/null
+++ b/modules/paint/addon/assets/BrushVLine_Hovered.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/BrushVLine_Hovered.png-104e29757699756f1b44bd32a622df2c.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/Godoxel/assets/BrushVLine_Hovered.png"
+dest_files=[ "res://.import/BrushVLine_Hovered.png-104e29757699756f1b44bd32a622df2c.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/modules/paint/addon/assets/Godoxel_Preview.png b/modules/paint/addon/assets/Godoxel_Preview.png
new file mode 100644
index 000000000..06bd3c6ef
Binary files /dev/null and b/modules/paint/addon/assets/Godoxel_Preview.png differ
diff --git a/modules/paint/addon/assets/Godoxel_Preview.png.import b/modules/paint/addon/assets/Godoxel_Preview.png.import
new file mode 100644
index 000000000..53fe20819
--- /dev/null
+++ b/modules/paint/addon/assets/Godoxel_Preview.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/Godoxel_Preview.png-e30103581d3fc0ed2a2c92cdf72b5c70.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/Godoxel/assets/Godoxel_Preview.png"
+dest_files=[ "res://.import/Godoxel_Preview.png-e30103581d3fc0ed2a2c92cdf72b5c70.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/modules/paint/addon/assets/arrow_down.png b/modules/paint/addon/assets/arrow_down.png
new file mode 100644
index 000000000..9673c8de2
Binary files /dev/null and b/modules/paint/addon/assets/arrow_down.png differ
diff --git a/modules/paint/addon/assets/arrow_down.png.import b/modules/paint/addon/assets/arrow_down.png.import
new file mode 100644
index 000000000..b9e87b6e6
--- /dev/null
+++ b/modules/paint/addon/assets/arrow_down.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/arrow_down.png-d2bd93428c0bc172a28a43c55aac576e.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/Godoxel/assets/arrow_down.png"
+dest_files=[ "res://.import/arrow_down.png-d2bd93428c0bc172a28a43c55aac576e.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/modules/paint/addon/assets/arrow_up.png b/modules/paint/addon/assets/arrow_up.png
new file mode 100644
index 000000000..b6bec658f
Binary files /dev/null and b/modules/paint/addon/assets/arrow_up.png differ
diff --git a/modules/paint/addon/assets/arrow_up.png.import b/modules/paint/addon/assets/arrow_up.png.import
new file mode 100644
index 000000000..4ea01b43b
--- /dev/null
+++ b/modules/paint/addon/assets/arrow_up.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/arrow_up.png-2598e148d1b795a628ce80a4fd5cf401.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/Godoxel/assets/arrow_up.png"
+dest_files=[ "res://.import/arrow_up.png-2598e148d1b795a628ce80a4fd5cf401.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/modules/paint/addon/assets/bitstream_vera_sans_font_6016/COPYRIGHT.TXT b/modules/paint/addon/assets/bitstream_vera_sans_font_6016/COPYRIGHT.TXT
new file mode 100644
index 000000000..e651be1c4
--- /dev/null
+++ b/modules/paint/addon/assets/bitstream_vera_sans_font_6016/COPYRIGHT.TXT
@@ -0,0 +1,124 @@
+Bitstream Vera Fonts Copyright
+
+The fonts have a generous copyright, allowing derivative works (as
+long as "Bitstream" or "Vera" are not in the names), and full
+redistribution (so long as they are not *sold* by themselves). They
+can be be bundled, redistributed and sold with any software.
+
+The fonts are distributed under the following copyright:
+
+Copyright
+=========
+
+Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream
+Vera is a trademark of Bitstream, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the fonts accompanying this license ("Fonts") and associated
+documentation files (the "Font Software"), to reproduce and distribute
+the Font Software, including without limitation the rights to use,
+copy, merge, publish, distribute, and/or sell copies of the Font
+Software, and to permit persons to whom the Font Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright and trademark notices and this permission notice
+shall be included in all copies of one or more of the Font Software
+typefaces.
+
+The Font Software may be modified, altered, or added to, and in
+particular the designs of glyphs or characters in the Fonts may be
+modified and additional glyphs or characters may be added to the
+Fonts, only if the fonts are renamed to names not containing either
+the words "Bitstream" or the word "Vera".
+
+This License becomes null and void to the extent applicable to Fonts
+or Font Software that has been modified and is distributed under the
+"Bitstream Vera" names.
+
+The Font Software may be sold as part of a larger software package but
+no copy of one or more of the Font Software typefaces may be sold by
+itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL
+BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL,
+OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT
+SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
+
+Except as contained in this notice, the names of Gnome, the Gnome
+Foundation, and Bitstream Inc., shall not be used in advertising or
+otherwise to promote the sale, use or other dealings in this Font
+Software without prior written authorization from the Gnome Foundation
+or Bitstream Inc., respectively. For further information, contact:
+fonts at gnome dot org.
+
+Copyright FAQ
+=============
+
+ 1. I don't understand the resale restriction... What gives?
+
+ Bitstream is giving away these fonts, but wishes to ensure its
+ competitors can't just drop the fonts as is into a font sale system
+ and sell them as is. It seems fair that if Bitstream can't make money
+ from the Bitstream Vera fonts, their competitors should not be able to
+ do so either. You can sell the fonts as part of any software package,
+ however.
+
+ 2. I want to package these fonts separately for distribution and
+ sale as part of a larger software package or system. Can I do so?
+
+ Yes. A RPM or Debian package is a "larger software package" to begin
+ with, and you aren't selling them independently by themselves.
+ See 1. above.
+
+ 3. Are derivative works allowed?
+ Yes!
+
+ 4. Can I change or add to the font(s)?
+ Yes, but you must change the name(s) of the font(s).
+
+ 5. Under what terms are derivative works allowed?
+
+ You must change the name(s) of the fonts. This is to ensure the
+ quality of the fonts, both to protect Bitstream and Gnome. We want to
+ ensure that if an application has opened a font specifically of these
+ names, it gets what it expects (though of course, using fontconfig,
+ substitutions could still could have occurred during font
+ opening). You must include the Bitstream copyright. Additional
+ copyrights can be added, as per copyright law. Happy Font Hacking!
+
+ 6. If I have improvements for Bitstream Vera, is it possible they might get
+ adopted in future versions?
+
+ Yes. The contract between the Gnome Foundation and Bitstream has
+ provisions for working with Bitstream to ensure quality additions to
+ the Bitstream Vera font family. Please contact us if you have such
+ additions. Note, that in general, we will want such additions for the
+ entire family, not just a single font, and that you'll have to keep
+ both Gnome and Jim Lyles, Vera's designer, happy! To make sense to add
+ glyphs to the font, they must be stylistically in keeping with Vera's
+ design. Vera cannot become a "ransom note" font. Jim Lyles will be
+ providing a document describing the design elements used in Vera, as a
+ guide and aid for people interested in contributing to Vera.
+
+ 7. I want to sell a software package that uses these fonts: Can I do so?
+
+ Sure. Bundle the fonts with your software and sell your software
+ with the fonts. That is the intent of the copyright.
+
+ 8. If applications have built the names "Bitstream Vera" into them,
+ can I override this somehow to use fonts of my choosing?
+
+ This depends on exact details of the software. Most open source
+ systems and software (e.g., Gnome, KDE, etc.) are now converting to
+ use fontconfig (see www.fontconfig.org) to handle font configuration,
+ selection and substitution; it has provisions for overriding font
+ names and subsituting alternatives. An example is provided by the
+ supplied local.conf file, which chooses the family Bitstream Vera for
+ "sans", "serif" and "monospace". Other software (e.g., the XFree86
+ core server) has other mechanisms for font substitution.
+
diff --git a/modules/paint/addon/assets/bitstream_vera_sans_font_6016/README.TXT b/modules/paint/addon/assets/bitstream_vera_sans_font_6016/README.TXT
new file mode 100644
index 000000000..0f71795a7
--- /dev/null
+++ b/modules/paint/addon/assets/bitstream_vera_sans_font_6016/README.TXT
@@ -0,0 +1,11 @@
+Contained herin is the Bitstream Vera font family.
+
+The Copyright information is found in the COPYRIGHT.TXT file (along
+with being incoporated into the fonts themselves).
+
+The releases notes are found in the file "RELEASENOTES.TXT".
+
+We hope you enjoy Vera!
+
+ Bitstream, Inc.
+ The Gnome Project
diff --git a/modules/paint/addon/assets/bitstream_vera_sans_font_6016/RELEASENOTES.TXT b/modules/paint/addon/assets/bitstream_vera_sans_font_6016/RELEASENOTES.TXT
new file mode 100644
index 000000000..270bc0d40
--- /dev/null
+++ b/modules/paint/addon/assets/bitstream_vera_sans_font_6016/RELEASENOTES.TXT
@@ -0,0 +1,162 @@
+Bitstream Vera Fonts - April 16, 2003
+=====================================
+
+The version number of these fonts is 1.10 to distinguish them from the
+beta test fonts.
+
+Note that the Vera copyright is incorporated in the fonts themselves.
+The License field in the fonts contains the copyright license as it
+appears below. The TrueType copyright field is not large enough to
+contain the full license, so the license is incorporated (as you might
+think if you thought about it) into the license field, which
+unfortunately can be obscure to find. (In pfaedit, see: Element->Font
+Info->TTFNames->License).
+
+Our apologies for it taking longer to complete the fonts than planned.
+Beta testers requested a tighter line spacing (less leading) and Jim
+Lyles redesigned Vera's accents to bring its line spacing to more
+typical of other fonts. This took additional time and effort. Our
+thanks to Jim for this effort above and beyond the call of duty.
+
+There are four monospace and sans faces (normal, oblique, bold, bold
+oblique) and two serif faces (normal and bold). Fontconfig/Xft2 (see
+www.fontconfig.org) can artificially oblique the serif faces for you:
+this loses hinting and distorts the faces slightly, but is visibly
+different than normal and bold, and reasonably pleasing.
+
+On systems with fontconfig 2.0 or 2.1 installed, making your sans,
+serif and monospace fonts default to these fonts is very easy. Just
+drop the file local.conf into your /etc/fonts directory. This will
+make the Bitstream fonts your default fonts for all applications using
+fontconfig (if sans, serif, or monospace names are used, as they often
+are as default values in many desktops). The XML in local.conf may
+need modification to enable subpixel decimation, if appropriate,
+however, the commented out phrase does so for XFree86 4.3, in the case
+that the server does not have sufficient information to identify the
+use of a flat panel. Fontconfig 2.2 adds Vera to the list of font
+families and will, by default use it as the default sans, serif and
+monospace fonts.
+
+During the testing of the final Vera fonts, we learned that screen
+fonts in general are only typically hinted to work correctly at
+integer pixel sizes. Vera is coded internally for integer sizes only.
+We need to investigate further to see if there are commonly used fonts
+that are hinted to be rounded but are not rounded to integer sizes due
+to oversights in their coding.
+
+Most fonts work best at 8 pixels and below if anti-aliased only, as
+the amount of work required to hint well at smaller and smaller sizes
+becomes astronomical. GASP tables are typically used to control
+whether hinting is used or not, but Freetype/Xft does not currently
+support GASP tables (which are present in Vera).
+
+To mitigate this problem, both for Vera and other fonts, there will be
+(very shortly) a new fontconfig 2.2 release that will, by default not
+apply hints if the size is below 8 pixels. if you should have a font
+that in fact has been hinted more agressively, you can use fontconfig
+to note this exception. We believe this should improve many hinted
+fonts in addition to Vera, though implemeting GASP support is likely
+the right long term solution.
+
+Font rendering in Gnome or KDE is the combination of algorithms in
+Xft2 and Freetype, along with hinting in the fonts themselves. It is
+vital to have sufficient information to disentangle problems that you
+may observe.
+
+Note that having your font rendering system set up correctly is vital
+to proper judgement of problems of the fonts:
+
+ * Freetype may or may not be configured to in ways that may
+ implement execution of possibly patented (in some parts of the world)
+ TrueType hinting algorithms, particularly at small sizes. Best
+ results are obtained while using these algorithms.
+
+ * The freetype autohinter (used when the possibly patented
+ algorithms are not used) continues to improve with each release. If
+ you are using the autohinter, please ensure you are using an up to
+ date version of freetype before reporting problems.
+
+ * Please identify what version of freetype you are using in any
+ bug reports, and how your freetype is configured.
+
+ * Make sure you are not using the freetype version included in
+ XFree86 4.3, as it has bugs that significantly degrade most fonts,
+ including Vera. if you build XFree86 4.3 from source yourself, you may
+ have installed this broken version without intending it (as I
+ did). Vera was verified with the recently released Freetype 2.1.4. On
+ many systems, 'ldd" can be used to see which freetype shared library
+ is actually being used.
+
+ * Xft/X Render does not (yet) implement gamma correction. This
+ causes significant problems rendering white text on a black background
+ (causing partial pixels to be insufficiently shaded) if the gamma of
+ your monitor has not been compensated for, and minor problems with
+ black text on a while background. The program "xgamma" can be used to
+ set a gamma correction value in the X server's color pallette. Most
+ monitors have a gamma near 2.
+
+ * Note that the Vera family uses minimal delta hinting. Your
+ results on other systems when not used anti-aliased may not be
+ entirely satisfying. We are primarily interested in reports of
+ problems on open source systems implementing Xft2/fontconfig/freetype
+ (which implements antialiasing and hinting adjustements, and
+ sophisticated subpixel decimation on flatpanels). Also, the
+ algorithms used by Xft2 adjust the hints to integer widths and the
+ results are crisper on open source systems than on Windows or
+ MacIntosh.
+
+ * Your fontconfig may (probably does) predate the release of
+ fontconfig 2.2, and you may see artifacts not present when the font is
+ used at very small sizes with hinting enabled. "vc-list -V" can be
+ used to see what version you have installed.
+
+We believe and hope that these fonts will resolve the problems
+reported during beta test. The largest change is the reduction of
+leading (interline spacing), which had annoyed a number of people, and
+reduced Vera's utility for some applcations. The Vera monospace font
+should also now make '0' and 'O' and '1' and 'l' more clearly
+distinguishable.
+
+The version of these fonts is version 1.10. Fontconfig should be
+choosing the new version of the fonts if both the released fonts and
+beta test fonts are installed (though please discard them: they have
+names of form tt20[1-12]gn.ttf). Note that older versions of
+fontconfig sometimes did not rebuild their cache correctly when new
+fonts are installed: please upgrade to fontconfig 2.2. "fc-cache -f"
+can be used to force rebuilding fontconfig's cache files.
+
+If you note problems, please send them to fonts at gnome dot org, with
+exactly which face and size and unicode point you observe the problem
+at. The xfd utility from XFree86 CVS may be useful for this (e.g. "xfd
+-fa sans"). A possibly more useful program to examine fonts at a
+variety of sizes is the "waterfall" program found in Keith Packard's
+CVS.
+
+ $ cvs -d :pserver:anoncvs@keithp.com:/local/src/CVS login
+ Logging in to :pserver:anoncvs@keithp.com:2401/local/src/CVS
+ CVS password:
+ $ cvs -d :pserver:anoncvs@keithp.com:/local/src/CVS co waterfall
+ $ cd waterfall
+ $ xmkmf -a
+ $ make
+ # make install
+ # make install.man
+
+Again, please make sure you are running an up-to-date freetype, and
+that you are only examining integer sizes.
+
+Reporting Problems
+==================
+
+Please send problem reports to fonts at gnome org, with the following
+information:
+
+ 1. Version of Freetype, Xft2 and fontconfig
+ 2. Whether TT hinting is being used, or the autohinter
+ 3. Application being used
+ 4. Character/Unicode code point that has problems (if applicable)
+ 5. Version of which operating system
+ 6. Please include a screenshot, when possible.
+
+Please check the fonts list archives before reporting problems to cut
+down on duplication.
diff --git a/modules/paint/addon/assets/bitstream_vera_sans_font_6016/Vera.ttf b/modules/paint/addon/assets/bitstream_vera_sans_font_6016/Vera.ttf
new file mode 100644
index 000000000..58cd6b5e6
Binary files /dev/null and b/modules/paint/addon/assets/bitstream_vera_sans_font_6016/Vera.ttf differ
diff --git a/modules/paint/addon/assets/bitstream_vera_sans_font_6016/VeraBI.ttf b/modules/paint/addon/assets/bitstream_vera_sans_font_6016/VeraBI.ttf
new file mode 100644
index 000000000..b55eee397
Binary files /dev/null and b/modules/paint/addon/assets/bitstream_vera_sans_font_6016/VeraBI.ttf differ
diff --git a/modules/paint/addon/assets/bitstream_vera_sans_font_6016/VeraBd.ttf b/modules/paint/addon/assets/bitstream_vera_sans_font_6016/VeraBd.ttf
new file mode 100644
index 000000000..51d6111d7
Binary files /dev/null and b/modules/paint/addon/assets/bitstream_vera_sans_font_6016/VeraBd.ttf differ
diff --git a/modules/paint/addon/assets/bitstream_vera_sans_font_6016/VeraIt.ttf b/modules/paint/addon/assets/bitstream_vera_sans_font_6016/VeraIt.ttf
new file mode 100644
index 000000000..cc23c9efd
Binary files /dev/null and b/modules/paint/addon/assets/bitstream_vera_sans_font_6016/VeraIt.ttf differ
diff --git a/modules/paint/addon/assets/bitstream_vera_sans_font_6016/all-free-download.com.url b/modules/paint/addon/assets/bitstream_vera_sans_font_6016/all-free-download.com.url
new file mode 100644
index 000000000..be505ef8a
--- /dev/null
+++ b/modules/paint/addon/assets/bitstream_vera_sans_font_6016/all-free-download.com.url
@@ -0,0 +1,8 @@
+[InternetShortcut]
+URL=http://www.all-free-download.com/
+IDList=
+HotKey=0
+IconFile=C:\WINDOWS\system32\SHELL32.dll
+IconIndex=23
+[{000214A0-0000-0000-C000-000000000046}]
+Prop3=19,2
diff --git a/modules/paint/addon/assets/grid.png b/modules/paint/addon/assets/grid.png
new file mode 100644
index 000000000..71a166478
Binary files /dev/null and b/modules/paint/addon/assets/grid.png differ
diff --git a/modules/paint/addon/assets/grid.png.import b/modules/paint/addon/assets/grid.png.import
new file mode 100644
index 000000000..eac50ac3c
--- /dev/null
+++ b/modules/paint/addon/assets/grid.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/grid.png-e3d637acacdb891e09f422df261dbd1e.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/Godoxel/assets/grid.png"
+dest_files=[ "res://.import/grid.png-e3d637acacdb891e09f422df261dbd1e.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/modules/paint/addon/assets/lock_layer.png b/modules/paint/addon/assets/lock_layer.png
new file mode 100644
index 000000000..8bd4802d9
Binary files /dev/null and b/modules/paint/addon/assets/lock_layer.png differ
diff --git a/modules/paint/addon/assets/lock_layer.png.import b/modules/paint/addon/assets/lock_layer.png.import
new file mode 100644
index 000000000..5fd8060be
--- /dev/null
+++ b/modules/paint/addon/assets/lock_layer.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/lock_layer.png-076954b389746de9e13c853ed5d9ba59.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/Godoxel/assets/lock_layer.png"
+dest_files=[ "res://.import/lock_layer.png-076954b389746de9e13c853ed5d9ba59.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/modules/paint/addon/assets/lock_layer_1.png b/modules/paint/addon/assets/lock_layer_1.png
new file mode 100644
index 000000000..317cb3fce
Binary files /dev/null and b/modules/paint/addon/assets/lock_layer_1.png differ
diff --git a/modules/paint/addon/assets/lock_layer_1.png.import b/modules/paint/addon/assets/lock_layer_1.png.import
new file mode 100644
index 000000000..e3cb23a8b
--- /dev/null
+++ b/modules/paint/addon/assets/lock_layer_1.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/lock_layer_1.png-4848d5f2cd0f48c68b880712b6b38776.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/Godoxel/assets/lock_layer_1.png"
+dest_files=[ "res://.import/lock_layer_1.png-4848d5f2cd0f48c68b880712b6b38776.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/modules/paint/addon/assets/minidotta.png b/modules/paint/addon/assets/minidotta.png
new file mode 100644
index 000000000..2f2a7fc7c
Binary files /dev/null and b/modules/paint/addon/assets/minidotta.png differ
diff --git a/modules/paint/addon/assets/minidotta.png.import b/modules/paint/addon/assets/minidotta.png.import
new file mode 100644
index 000000000..462757ffa
--- /dev/null
+++ b/modules/paint/addon/assets/minidotta.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/minidotta.png-adac81df344972ef82e2499656aa288e.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/Godoxel/assets/minidotta.png"
+dest_files=[ "res://.import/minidotta.png-adac81df344972ef82e2499656aa288e.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/modules/paint/addon/assets/minidotta_invis.png b/modules/paint/addon/assets/minidotta_invis.png
new file mode 100644
index 000000000..305092835
Binary files /dev/null and b/modules/paint/addon/assets/minidotta_invis.png differ
diff --git a/modules/paint/addon/assets/minidotta_invis.png.import b/modules/paint/addon/assets/minidotta_invis.png.import
new file mode 100644
index 000000000..607a755cc
--- /dev/null
+++ b/modules/paint/addon/assets/minidotta_invis.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/minidotta_invis.png-5232a113bb226997ae55212b2aa90bd4.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/Godoxel/assets/minidotta_invis.png"
+dest_files=[ "res://.import/minidotta_invis.png-5232a113bb226997ae55212b2aa90bd4.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/modules/paint/addon/assets/unlock_layer.png b/modules/paint/addon/assets/unlock_layer.png
new file mode 100644
index 000000000..36694fdcf
Binary files /dev/null and b/modules/paint/addon/assets/unlock_layer.png differ
diff --git a/modules/paint/addon/assets/unlock_layer.png.import b/modules/paint/addon/assets/unlock_layer.png.import
new file mode 100644
index 000000000..17d2172da
--- /dev/null
+++ b/modules/paint/addon/assets/unlock_layer.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/unlock_layer.png-ae7c97a04fb889522c7c466fdc9dd8f6.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/Godoxel/assets/unlock_layer.png"
+dest_files=[ "res://.import/unlock_layer.png-ae7c97a04fb889522c7c466fdc9dd8f6.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/modules/paint/addon/dialogs/ChangeGridSizeDialog.gd b/modules/paint/addon/dialogs/ChangeGridSizeDialog.gd
new file mode 100644
index 000000000..2aea630e9
--- /dev/null
+++ b/modules/paint/addon/dialogs/ChangeGridSizeDialog.gd
@@ -0,0 +1,28 @@
+extends AcceptDialog
+tool
+
+func _ready():
+ yield(owner, "ready")
+ find_node("GridValue").value = owner.paint_canvas.grid_size
+ find_node("BigGridValue").value = owner.paint_canvas.big_grid_size
+
+
+func _on_ChangeGridSizeDialog_confirmed():
+ var grid_size = find_node("GridValue").value
+ var big_grid_size = find_node("BigGridValue").value
+ owner.paint_canvas.grid_size = grid_size
+ owner.paint_canvas.big_grid_size = big_grid_size
+
+
+func _on_GridValue_value_changed(value):
+ var grid_size = value
+ owner.paint_canvas.grid_size = grid_size
+
+
+func _on_BigGridValue_value_changed(value):
+ var big_grid_size = value
+ owner.paint_canvas.big_grid_size = big_grid_size
+
+
+func _on_ChangeGridSizeDialog_visibility_changed():
+ pass # Replace with function body.
diff --git a/modules/paint/addon/dialogs/ConfirmationDialog.gd b/modules/paint/addon/dialogs/ConfirmationDialog.gd
new file mode 100644
index 000000000..07b15a01d
--- /dev/null
+++ b/modules/paint/addon/dialogs/ConfirmationDialog.gd
@@ -0,0 +1,20 @@
+extends ConfirmationDialog
+tool
+
+func _ready():
+ yield(owner, "ready")
+ find_node("Width").value = owner.paint_canvas.canvas_width
+ find_node("Height").value = owner.paint_canvas.canvas_height
+
+
+func _on_ConfirmationDialog_confirmed():
+ var width = find_node("Width").value
+ var height = find_node("Height").value
+ print("change canvas size: ", width, " ", height)
+ owner.paint_canvas.resize(width, height)
+
+
+func _on_ChangeCanvasSize_visibility_changed():
+ if visible:
+ find_node("Width").value = owner.paint_canvas.canvas_width
+ find_node("Height").value = owner.paint_canvas.canvas_height
diff --git a/modules/paint/addon/dialogs/LoadFileDialog.gd b/modules/paint/addon/dialogs/LoadFileDialog.gd
new file mode 100644
index 000000000..858f2d376
--- /dev/null
+++ b/modules/paint/addon/dialogs/LoadFileDialog.gd
@@ -0,0 +1,70 @@
+tool
+extends FileDialog
+
+
+var canvas: GECanvas
+
+var file_path = ""
+
+
+func _ready():
+ get_line_edit().connect("text_entered", self, "_on_LineEdit_text_entered")
+ invalidate()
+ clear_filters()
+ add_filter("*.png ; PNG Images")
+
+
+func _on_LineEdit_text_entered(_text):
+ return
+# print(_text)
+ #load_img()
+# print("hsadfasd")
+
+
+func _on_LoadFileDialog_file_selected(path):
+ file_path = path
+ #print("1ere")
+ load_img()
+
+
+func _on_LoadFileDialog_confirmed():
+ return
+ #print("ere")
+ #load_img()
+
+
+func load_img():
+ var image = Image.new()
+ if image.load(file_path) != OK:
+ print("couldn't load image!")
+ return
+
+ var image_data = image.get_data()
+ var layer: GELayer = owner.add_new_layer()
+
+ var width = image.get_width()
+ var height = image.get_height()
+
+ if owner.paint_canvas.canvas_width < width:
+ owner.paint_canvas.resize(width, owner.paint_canvas.canvas_height)
+
+ if owner.paint_canvas.canvas_height < height:
+ owner.paint_canvas.resize(owner.paint_canvas.canvas_width, height)
+
+ for i in range(image_data.size() / 4):
+ var color = Color(image_data[i*4] / 255.0, image_data[i*4+1] / 255.0, image_data[i*4+2] / 255.0, image_data[i*4+3] / 255.0)
+ var pos = GEUtils.to_2D(i, image.get_width())
+ if pos.x > layer.layer_width:
+ continue
+
+ layer.set_pixel(pos.x, pos.y, color)
+ layer.update_texture()
+
+
+
+func _on_LoadFileDialog_about_to_show():
+ invalidate()
+
+
+func _on_LoadFileDialog_visibility_changed():
+ invalidate()
diff --git a/modules/paint/addon/dialogs/LoadFileDialog.tscn b/modules/paint/addon/dialogs/LoadFileDialog.tscn
new file mode 100644
index 000000000..0d083c02e
--- /dev/null
+++ b/modules/paint/addon/dialogs/LoadFileDialog.tscn
@@ -0,0 +1,22 @@
+[gd_scene load_steps=2 format=2]
+
+[sub_resource type="GDScript" id=1]
+script/source = "extends ConfirmationDialog
+
+func _ready():
+ get_ok().connect(\"pressed\", self, \"hide\")
+ get_cancel().connect(\"pressed\", self, \"hide\")
+
+
+
+"
+
+[node name="LoadFileDialog" type="FileDialog"]
+margin_right = 604.0
+margin_bottom = 367.0
+window_title = "Open a File"
+mode = 0
+access = 2
+current_dir = "/Projects/BitBucket/GraphicsEditor"
+current_path = "/Projects/BitBucket/GraphicsEditor/"
+script = SubResource( 1 )
diff --git a/modules/paint/addon/plugin.cfg b/modules/paint/addon/plugin.cfg
new file mode 100644
index 000000000..526cfb3b1
--- /dev/null
+++ b/modules/paint/addon/plugin.cfg
@@ -0,0 +1,7 @@
+[plugin]
+
+name="Godoxel - Pixel Image Editor"
+description=""
+author=""
+version=""
+script="plugin.gd"
diff --git a/modules/paint/addon/plugin.gd b/modules/paint/addon/plugin.gd
new file mode 100644
index 000000000..3c0d93d13
--- /dev/null
+++ b/modules/paint/addon/plugin.gd
@@ -0,0 +1,37 @@
+tool
+extends EditorPlugin
+
+var editor_scene = load("res://addons/Godoxel/Editor.tscn").instance()
+
+func _enter_tree():
+ editor_scene.name = "Editor"
+ if get_editor_interface().get_editor_viewport().has_node("Editor"):
+ var n = get_editor_interface().get_editor_viewport().get_node("Editor")
+ n.name = "EditorDel"
+ n.queue_free()
+ get_editor_interface().get_editor_viewport().add_child(editor_scene, true)
+ editor_scene.owner = get_editor_interface().get_editor_viewport()
+ make_visible(false)
+
+
+func _exit_tree():
+ if editor_scene:
+ editor_scene.queue_free()
+
+
+func has_main_screen():
+ return true
+
+
+func make_visible(visible):
+ if editor_scene:
+ editor_scene.visible = visible
+
+
+func get_plugin_name():
+ return "Paint"
+
+
+func get_plugin_icon():
+ # Must return some kind of Texture for the icon.
+ return get_editor_interface().get_base_control().get_icon("CanvasModulate", "EditorIcons")
diff --git a/modules/world_generator/addon/plugin.cfg b/modules/world_generator/addon/plugin.cfg
new file mode 100644
index 000000000..0680fe409
--- /dev/null
+++ b/modules/world_generator/addon/plugin.cfg
@@ -0,0 +1,7 @@
+[plugin]
+
+name="WorldGenerator"
+description=""
+author="Relintai"
+version=""
+script="plugin.gd"
diff --git a/modules/world_generator/addon/plugin.gd b/modules/world_generator/addon/plugin.gd
new file mode 100644
index 000000000..f6a33fa1c
--- /dev/null
+++ b/modules/world_generator/addon/plugin.gd
@@ -0,0 +1,78 @@
+tool
+extends EditorPlugin
+
+var SWorldGeneratorSettings = preload("res://addons/world_generator/resources/world_generator_settings.gd")
+
+var SWorldGenBaseResource = preload("res://addons/world_generator/resources/world_gen_base_resource.gd")
+var SWorldGenWorld = preload("res://addons/world_generator/resources/world_gen_world.gd")
+var SContinent = preload("res://addons/world_generator/resources/continent.gd")
+var SZone = preload("res://addons/world_generator/resources/zone.gd")
+var SSubZone = preload("res://addons/world_generator/resources/subzone.gd")
+
+var editor_packed_scene = preload("res://addons/world_generator/ui/MainScreen.tscn")
+var editor_scene = null
+
+var tool_button : ToolButton = null
+
+func _enter_tree():
+ add_custom_type("WorldGeneratorSettings", "Resource", SWorldGeneratorSettings, null)
+
+ add_custom_type("WorldGenBaseResource", "Resource", SWorldGenBaseResource, null)
+ #Don't change the base to "WorldGenBaseResource" else it will complain about a non-existant class
+ #Also it works perfectly like this
+ add_custom_type("WorldGenWorld", "Resource", SWorldGenWorld, null)
+ add_custom_type("Continent", "Resource", SContinent, null)
+ add_custom_type("Zone", "Resource", SZone, null)
+ add_custom_type("SubZone", "Resource", SSubZone, null)
+
+ editor_scene = editor_packed_scene.instance()
+ editor_scene.set_plugin(self)
+
+ tool_button = add_control_to_bottom_panel(editor_scene, "World Editor")
+ tool_button.hide()
+
+func _exit_tree():
+ remove_custom_type("WorldGeneratorSettings")
+
+ remove_custom_type("WorldGenBaseResource")
+ remove_custom_type("WorldGenWorld")
+ remove_custom_type("Continent")
+ remove_custom_type("Zone")
+ remove_custom_type("SubZone")
+
+ remove_control_from_bottom_panel(editor_scene)
+
+
+func handles(object):
+ return object is WorldGenWorld
+
+func edit(object):
+ #if editor_scene:
+ # make_bottom_panel_item_visible(editor_scene)
+
+ if object is WorldGenWorld:
+ var wgw : WorldGenWorld = object as WorldGenWorld
+ wgw.setup()
+ editor_scene.set_wgworld(wgw)
+
+func make_visible(visible):
+ if tool_button:
+ if visible:
+ tool_button.show()
+ else:
+ #if tool_button.pressed:
+ # tool_button.pressed = false
+
+ if !tool_button.pressed:
+ tool_button.hide()
+
+func get_plugin_icon():
+ return null
+
+func get_plugin_name():
+ return "WorldGeneratorEditor"
+
+func has_main_screen():
+ return false
+
+
diff --git a/modules/world_generator/addon/raycast/world_gen_raycast.gd b/modules/world_generator/addon/raycast/world_gen_raycast.gd
new file mode 100644
index 000000000..2a8037313
--- /dev/null
+++ b/modules/world_generator/addon/raycast/world_gen_raycast.gd
@@ -0,0 +1,32 @@
+tool
+extends Reference
+class_name WorldGenRaycast
+
+var current_index : int = -1
+var base_resources : Array = Array()
+var local_positions : PoolVector2Array = PoolVector2Array()
+var local_uvs : PoolVector2Array = PoolVector2Array()
+
+func get_local_position() -> Vector2:
+ return local_positions[current_index]
+
+func get_local_uv() -> Vector2:
+ return local_uvs[current_index]
+
+# WorldGenBaseResource (can't explicitly add -> cyclic dependency)
+func get_resource():
+ return base_resources[current_index]
+
+func next() -> bool:
+ current_index += 1
+
+ return base_resources.size() > current_index
+
+func size() -> int:
+ return base_resources.size()
+
+# base_resource -> WorldGenBaseResource
+func add_data(base_resource, local_pos : Vector2, local_uv : Vector2) -> void:
+ base_resources.append(base_resource)
+ local_positions.append(local_pos)
+ local_uvs.append(local_uv)
diff --git a/modules/world_generator/addon/resources/continent.gd b/modules/world_generator/addon/resources/continent.gd
new file mode 100644
index 000000000..a1e7438fb
--- /dev/null
+++ b/modules/world_generator/addon/resources/continent.gd
@@ -0,0 +1,39 @@
+tool
+extends "res://addons/world_generator/resources/world_gen_base_resource.gd"
+class_name Continent
+
+export(Array) var zones : Array
+
+func get_content() -> Array:
+ return zones
+
+func set_content(arr : Array) -> void:
+ zones = arr
+
+func create_content(item_name : String = "") -> void:
+ var zone : Zone = Zone.new()
+ zone.resource_name = item_name
+
+ var r : Rect2 = get_rect()
+ r.position = Vector2()
+ r.size.x /= 10.0
+ r.size.y /= 10.0
+
+ zone.set_rect(r)
+
+ add_content(zone)
+
+func add_content(entry : WorldGenBaseResource) -> void:
+ zones.append(entry)
+ entry.set_parent_pos(get_parent_pos() + get_rect().position)
+ emit_changed()
+
+func remove_content_entry(entry : WorldGenBaseResource) -> void:
+ for i in range(zones.size()):
+ if zones[i] == entry:
+ zones.remove(i)
+ emit_changed()
+ return
+
+func setup_property_inspector(inspector) -> void:
+ .setup_property_inspector(inspector)
diff --git a/modules/world_generator/addon/resources/subzone.gd b/modules/world_generator/addon/resources/subzone.gd
new file mode 100644
index 000000000..416682a44
--- /dev/null
+++ b/modules/world_generator/addon/resources/subzone.gd
@@ -0,0 +1,7 @@
+tool
+extends "res://addons/world_generator/resources/world_gen_base_resource.gd"
+class_name SubZone
+
+func setup_property_inspector(inspector) -> void:
+ .setup_property_inspector(inspector)
+
diff --git a/modules/world_generator/addon/resources/world_gen_base_resource.gd b/modules/world_generator/addon/resources/world_gen_base_resource.gd
new file mode 100644
index 000000000..bb856165d
--- /dev/null
+++ b/modules/world_generator/addon/resources/world_gen_base_resource.gd
@@ -0,0 +1,182 @@
+tool
+extends Resource
+class_name WorldGenBaseResource
+
+export(Rect2) var rect : Rect2 = Rect2(0, 0, 100, 100)
+export(bool) var locked : bool = false
+
+var _parent_pos : Vector2 = Vector2()
+
+func setup() -> void:
+ _setup()
+
+ for c in get_content():
+ if c:
+ c.set_parent_pos(_parent_pos + get_rect().position)
+ c.setup()
+
+func _setup() -> void:
+ pass
+
+func get_rect() -> Rect2:
+ return rect
+
+func set_rect(r : Rect2) -> void:
+ rect = r
+ emit_changed()
+
+func get_locked() -> bool:
+ return locked
+
+func set_locked(r : bool) -> void:
+ locked = r
+ emit_changed()
+
+func get_parent_pos() -> Vector2:
+ return _parent_pos
+
+func set_parent_pos(parent_pos : Vector2) -> void:
+ _parent_pos = parent_pos
+
+ for c in get_content():
+ if c:
+ c.set_parent_pos(_parent_pos + get_rect().position)
+
+func get_content() -> Array:
+ return Array()
+
+func set_content(arr : Array) -> void:
+ pass
+
+func add_content(entry : WorldGenBaseResource) -> void:
+ pass
+
+func create_content(item_name : String = "") -> void:
+ pass
+
+func remove_content_entry(entry : WorldGenBaseResource) -> void:
+ pass
+
+func get_content_with_name(name : String) -> WorldGenBaseResource:
+ if resource_name == name:
+ return self
+
+ for c in get_content():
+ if c:
+ var cc = c.get_content_with_name(name)
+ if cc:
+ return cc
+
+ return null
+
+func get_all_contents_with_name(name : String) -> Array:
+ var arr : Array = Array()
+
+ if resource_name == name:
+ arr.append(self)
+
+ for c in get_content():
+ if c:
+ var cc : Array = c.get_all_contents_with_name(name)
+ arr.append_array(cc)
+
+ return arr
+
+func duplicate_content_entry(entry : WorldGenBaseResource, add : bool = true) -> WorldGenBaseResource:
+ var de : WorldGenBaseResource = entry.duplicate(true)
+ de.resource_name += " (Duplicate)"
+
+ if add:
+ add_content(de)
+
+ return de
+
+func setup_terra_library(library : TerrainLibrary, pseed : int) -> void:
+ _setup_terra_library(library, pseed)
+
+ for c in get_content():
+ if c:
+ c.setup_terra_library(library, pseed)
+
+func _setup_terra_library(library : TerrainLibrary, pseed : int) -> void:
+ pass
+
+func generate_terra_chunk(chunk: TerrainChunk, pseed : int, spawn_mobs: bool) -> void:
+ var p : Vector2 = Vector2(chunk.get_position_x(), chunk.get_position_z())
+
+ var raycast : WorldGenRaycast = get_hit_stack(p)
+
+ if raycast.size() == 0:
+ _generate_terra_chunk_fallback(chunk, pseed, spawn_mobs)
+ return
+
+ while raycast.next():
+ raycast.get_resource()._generate_terra_chunk(chunk, pseed, spawn_mobs, raycast)
+
+func _generate_terra_chunk(chunk: TerrainChunk, pseed : int, spawn_mobs: bool, raycast : WorldGenRaycast) -> void:
+ pass
+
+func _generate_terra_chunk_fallback(chunk: TerrainChunk, pseed : int, spawn_mobs: bool) -> void:
+ chunk.channel_ensure_allocated(TerrainChunkDefault.DEFAULT_CHANNEL_TYPE, 1)
+ chunk.channel_ensure_allocated(TerrainChunkDefault.DEFAULT_CHANNEL_ISOLEVEL, 1)
+ chunk.set_voxel(1, 0, 0, TerrainChunkDefault.DEFAULT_CHANNEL_ISOLEVEL)
+
+func generate_map(pseed : int) -> Image:
+ var img : Image = Image.new()
+
+ img.create(get_rect().size.x, get_rect().size.y, false, Image.FORMAT_RGBA8)
+
+ add_to_map(img, pseed)
+
+ return img
+
+func add_to_map(img : Image, pseed : int) -> void:
+ _add_to_map(img, pseed)
+
+ for c in get_content():
+ if c:
+ c.add_to_map(img, pseed)
+
+func _add_to_map(img : Image, pseed : int) -> void:
+ pass
+
+func get_hit_stack(pos : Vector2, raycast : WorldGenRaycast = null) -> WorldGenRaycast:
+ var r : Rect2 = get_rect()
+ var local_pos : Vector2 = pos - rect.position
+ r.position = Vector2()
+
+ if !raycast:
+ raycast = WorldGenRaycast.new()
+
+ if r.has_point(local_pos):
+ var local_uv : Vector2 = local_pos / rect.size
+ raycast.add_data(self, local_pos, local_uv)
+
+ for c in get_content():
+ if c:
+ c.get_hit_stack(local_pos, raycast)
+
+ return raycast
+
+func get_editor_rect_border_color() -> Color:
+ return Color(1, 1, 1, 1)
+
+func get_editor_rect_color() -> Color:
+ return Color(1, 1, 1, 0.9)
+
+func get_editor_rect_border_size() -> int:
+ return 2
+
+func get_editor_font_color() -> Color:
+ return Color(0, 0, 0, 1)
+
+func get_editor_class() -> String:
+ return "WorldGenBaseResource"
+
+func get_editor_additional_text() -> String:
+ return "WorldGenBaseResource"
+
+func setup_property_inspector(inspector) -> void:
+ inspector.add_slot_line_edit("get_name", "set_name", "Name")
+ inspector.add_slot_rect2("get_rect", "set_rect", "Rect", 1)
+ inspector.add_slot_bool("get_locked", "set_locked", "Locked")
diff --git a/modules/world_generator/addon/resources/world_gen_world.gd b/modules/world_generator/addon/resources/world_gen_world.gd
new file mode 100644
index 000000000..1d8eb2221
--- /dev/null
+++ b/modules/world_generator/addon/resources/world_gen_world.gd
@@ -0,0 +1,63 @@
+tool
+extends "res://addons/world_generator/resources/world_gen_base_resource.gd"
+class_name WorldGenWorld
+
+export(Array) var continents : Array
+
+func get_content() -> Array:
+ return continents
+
+func set_content(arr : Array) -> void:
+ continents = arr
+
+func create_content(item_name : String = "") -> void:
+ var continent : Continent = Continent.new()
+ continent.resource_name = item_name
+
+ add_content(continent)
+
+func add_content(entry : WorldGenBaseResource) -> void:
+ var r : Rect2 = get_rect()
+ r.position = Vector2()
+ r.size.x /= 10.0
+ r.size.y /= 10.0
+
+ entry.set_rect(r)
+
+ continents.append(entry)
+ entry.set_parent_pos(get_parent_pos() + get_rect().position)
+ emit_changed()
+
+func remove_content_entry(entry : WorldGenBaseResource) -> void:
+ for i in range(continents.size()):
+ if continents[i] == entry:
+ continents.remove(i)
+ emit_changed()
+ return
+
+func setup_property_inspector(inspector) -> void:
+ .setup_property_inspector(inspector)
+
+func generate_terra_chunk(chunk: TerrainChunk, pseed : int, spawn_mobs: bool) -> void:
+ var p : Vector2 = Vector2(chunk.get_position_x(), chunk.get_position_z())
+
+ var raycast : WorldGenRaycast = get_hit_stack(p)
+
+ if raycast.size() == 0:
+ _generate_terra_chunk_fallback(chunk, pseed, spawn_mobs)
+ return
+
+ _generate_terra_chunk(chunk, pseed, spawn_mobs, raycast)
+
+ while raycast.next():
+ raycast.get_resource()._generate_terra_chunk(chunk, pseed, spawn_mobs, raycast)
+
+
+func _generate_terra_chunk(chunk: TerrainChunk, pseed : int, spawn_mobs: bool, raycast : WorldGenRaycast) -> void:
+ pass
+
+func _generate_terra_chunk_fallback(chunk: TerrainChunk, pseed : int, spawn_mobs: bool) -> void:
+ chunk.channel_ensure_allocated(TerrainChunkDefault.DEFAULT_CHANNEL_TYPE, 1)
+ chunk.channel_ensure_allocated(TerrainChunkDefault.DEFAULT_CHANNEL_ISOLEVEL, 1)
+ chunk.set_voxel(1, 0, 0, TerrainChunkDefault.DEFAULT_CHANNEL_ISOLEVEL)
+
diff --git a/modules/world_generator/addon/resources/world_generator_settings.gd b/modules/world_generator/addon/resources/world_generator_settings.gd
new file mode 100644
index 000000000..91a01aa64
--- /dev/null
+++ b/modules/world_generator/addon/resources/world_generator_settings.gd
@@ -0,0 +1,88 @@
+tool
+extends Resource
+class_name WorldGeneratorSettings
+
+export(PoolStringArray) var continent_class_folders : PoolStringArray
+export(PoolStringArray) var zone_class_folders : PoolStringArray
+export(PoolStringArray) var subzone_class_folders : PoolStringArray
+
+enum WorldGeneratorScriptType {
+ CONTINENT = 0,
+ ZONE = 1,
+ SUBZONE = 2,
+};
+
+func evaluate_scripts(script_type : int, tree : Tree) -> void:
+ if (script_type == WorldGeneratorScriptType.CONTINENT):
+ evaluate_continent_scripts(tree)
+ elif (script_type == WorldGeneratorScriptType.ZONE):
+ evaluate_zone_scripts(tree)
+ elif (script_type == WorldGeneratorScriptType.SUBZONE):
+ evaluate_subzone_scripts(tree)
+
+func evaluate_continent_scripts(tree : Tree) -> void:
+ tree.clear()
+
+ var root : TreeItem = tree.create_item()
+ root.set_text(0, "Continent")
+ root.set_meta("class_name", "Continent")
+
+ for s in continent_class_folders:
+ evaluate_folder(s, tree, root)
+
+ root.select(0)
+
+func evaluate_zone_scripts(tree : Tree) -> void:
+ tree.clear()
+
+ var root : TreeItem = tree.create_item()
+ root.set_text(0, "Zone")
+ root.set_meta("class_name", "Zone")
+
+ for s in zone_class_folders:
+ evaluate_folder(s, tree, root)
+
+ root.select(0)
+
+func evaluate_subzone_scripts(tree : Tree) -> void:
+ tree.clear()
+
+ var root : TreeItem = tree.create_item()
+ root.set_text(0, "SubZone")
+ root.set_meta("class_name", "SubZone")
+
+ for s in subzone_class_folders:
+ evaluate_folder(s, tree, root)
+
+ root.select(0)
+
+func evaluate_folder(folder : String, tree : Tree, root : TreeItem) -> void:
+ var ti : TreeItem = null
+
+ var dir = Directory.new()
+ if dir.open(folder) == OK:
+ dir.list_dir_begin()
+ var file_name = dir.get_next()
+ while file_name != "":
+ if !dir.current_is_dir():
+ #print("Found file: " + file_name)
+
+ if !ti:
+ var n : String = folder.substr(folder.find_last("/") + 1)
+
+ if n != "":
+ ti = tree.create_item(root)
+ ti.set_text(0, n)
+ else:
+ ti = root
+
+ var e : TreeItem = tree.create_item(ti)
+
+ e.set_text(0, file_name.get_file())
+ e.set_meta("file", folder + "/" + file_name)
+
+ file_name = dir.get_next()
+ else:
+ print("An error occurred when trying to access the path.")
+
+
diff --git a/modules/world_generator/addon/resources/zone.gd b/modules/world_generator/addon/resources/zone.gd
new file mode 100644
index 000000000..c0c236880
--- /dev/null
+++ b/modules/world_generator/addon/resources/zone.gd
@@ -0,0 +1,39 @@
+tool
+extends "res://addons/world_generator/resources/world_gen_base_resource.gd"
+class_name Zone
+
+export(Array) var subzones : Array
+
+func get_content() -> Array:
+ return subzones
+
+func set_content(arr : Array) -> void:
+ subzones = arr
+
+func create_content(item_name : String = "") -> void:
+ var subzone : SubZone = SubZone.new()
+ subzone.resource_name = item_name
+
+ var r : Rect2 = get_rect()
+ r.position = Vector2()
+ r.size.x /= 10.0
+ r.size.y /= 10.0
+
+ subzone.set_rect(r)
+
+ add_content(subzone)
+
+func add_content(entry : WorldGenBaseResource) -> void:
+ subzones.append(entry)
+ entry.set_parent_pos(get_parent_pos() + get_rect().position)
+ emit_changed()
+
+func remove_content_entry(entry : WorldGenBaseResource) -> void:
+ for i in range(subzones.size()):
+ if subzones[i] == entry:
+ subzones.remove(i)
+ emit_changed()
+ return
+
+func setup_property_inspector(inspector) -> void:
+ .setup_property_inspector(inspector)
diff --git a/modules/world_generator/addon/test/test_world.tres b/modules/world_generator/addon/test/test_world.tres
new file mode 100644
index 000000000..387c353ed
--- /dev/null
+++ b/modules/world_generator/addon/test/test_world.tres
@@ -0,0 +1,351 @@
+[gd_resource type="Resource" load_steps=40 format=2]
+
+[ext_resource path="res://addons/world_generator/resources/world_gen_world.gd" type="Script" id=1]
+[ext_resource path="res://addons/world_generator/resources/continent.gd" type="Script" id=2]
+[ext_resource path="res://addons/world_generator/resources/zone.gd" type="Script" id=3]
+[ext_resource path="res://addons/world_generator/resources/subzone.gd" type="Script" id=4]
+[ext_resource path="res://scripts/world_generator/continents/test_continent.gd" type="Script" id=5]
+[ext_resource path="res://scripts/world_generator/zones/test_zone.gd" type="Script" id=6]
+[ext_resource path="res://scripts/world_generator/subzones/test_subzone.gd" type="Script" id=7]
+
+[sub_resource type="Resource" id=14]
+resource_name = "qwe"
+script = ExtResource( 4 )
+rect = Rect2( 21, 25, 150, 79 )
+locked = false
+
+[sub_resource type="Resource" id=15]
+resource_name = "we"
+script = ExtResource( 4 )
+rect = Rect2( 7, 9, 54, 34 )
+locked = false
+
+[sub_resource type="Resource" id=34]
+resource_name = "yy"
+script = ExtResource( 7 )
+rect = Rect2( 66, 11, 100, 91 )
+locked = false
+
+[sub_resource type="Resource" id=8]
+resource_name = "asdasr"
+script = ExtResource( 3 )
+rect = Rect2( 35, 21, 191.4, 127.8 )
+locked = false
+subzones = [ SubResource( 14 ), SubResource( 15 ), SubResource( 34 ) ]
+
+[sub_resource type="Resource" id=13]
+resource_name = "qqq"
+script = ExtResource( 3 )
+rect = Rect2( 17, 59, 200.4, 52 )
+locked = false
+subzones = [ ]
+
+[sub_resource type="Resource" id=24]
+resource_name = "trtrtr"
+script = ExtResource( 3 )
+rect = Rect2( 0, 0, 57.1, 45.8 )
+locked = false
+subzones = [ ]
+
+[sub_resource type="GDScript" id=25]
+script/source = "tool
+extends \"res://addons/world_generator/resources/world_gen_base_resource.gd\"
+class_name Zone
+
+export(Array) var subzones : Array
+
+func get_content() -> Array:
+ return subzones
+
+func set_content(arr : Array) -> void:
+ subzones = arr
+
+func create_content(item_name : String = \"\") -> void:
+ var subzone : SubZone = SubZone.new()
+ subzone.resource_name = item_name
+
+ var r : Rect2 = get_rect()
+ r.position = Vector2()
+ r.size.x /= 10.0
+ r.size.y /= 10.0
+
+ subzone.set_rect(r)
+
+ add_content(subzone)
+
+func add_content(entry : WorldGenBaseResource) -> void:
+ subzones.append(entry)
+ emit_changed()
+
+func remove_content_entry(entry : WorldGenBaseResource) -> void:
+ for i in range(subzones.size()):
+ if subzones[i] == entry:
+ subzones.remove(i)
+ emit_changed()
+ return
+
+func setup_property_inspector(inspector) -> void:
+ .setup_property_inspector(inspector)
+"
+
+[sub_resource type="Resource" id=26]
+resource_name = "trtrtr (Duplicate)"
+script = SubResource( 25 )
+rect = Rect2( 64, 6, 158.1, 39.8 )
+locked = false
+subzones = [ ]
+
+[sub_resource type="Resource" id=32]
+resource_name = "tttte"
+script = ExtResource( 3 )
+rect = Rect2( 103, 28, 100, 100 )
+locked = false
+subzones = [ ]
+
+[sub_resource type="Resource" id=35]
+resource_name = "yu"
+script = ExtResource( 6 )
+rect = Rect2( 88, 21, 100, 100 )
+locked = false
+subzones = [ ]
+
+[sub_resource type="Resource" id=1]
+resource_name = "wwww"
+script = ExtResource( 2 )
+rect = Rect2( 163, 35, 241, 158 )
+zones = [ SubResource( 8 ), SubResource( 13 ), SubResource( 24 ), SubResource( 26 ), SubResource( 32 ), SubResource( 35 ) ]
+
+[sub_resource type="Resource" id=2]
+resource_name = "efefef"
+script = ExtResource( 2 )
+rect = Rect2( 107, 271, 100, 49 )
+
+[sub_resource type="Resource" id=3]
+resource_name = "grgrg"
+script = ExtResource( 2 )
+rect = Rect2( 498, 185, 100, 100 )
+
+[sub_resource type="Resource" id=9]
+resource_name = "asd"
+script = ExtResource( 3 )
+rect = Rect2( 528, 34, 0, 0 )
+locked = false
+subzones = [ ]
+
+[sub_resource type="Resource" id=10]
+resource_name = "qqq"
+script = ExtResource( 3 )
+rect = Rect2( 528, 34, 0, 0 )
+locked = false
+subzones = [ ]
+
+[sub_resource type="Resource" id=4]
+resource_name = "qwdasd"
+script = ExtResource( 2 )
+rect = Rect2( 522, 29, 63, 54 )
+zones = [ SubResource( 9 ), SubResource( 10 ) ]
+
+[sub_resource type="Resource" id=11]
+resource_name = "q"
+script = ExtResource( 3 )
+rect = Rect2( 14, 11, 53, 59 )
+locked = false
+subzones = [ ]
+
+[sub_resource type="Resource" id=5]
+resource_name = "qwe"
+script = ExtResource( 2 )
+rect = Rect2( 473, 331, 100, 100 )
+zones = [ SubResource( 11 ) ]
+
+[sub_resource type="GDScript" id=16]
+script/source = "tool
+extends \"res://addons/world_generator/resources/world_gen_base_resource.gd\"
+class_name Continent
+
+export(Array) var zones : Array
+
+func get_content() -> Array:
+ return zones
+
+func set_content(arr : Array) -> void:
+ zones = arr
+
+func create_content(item_name : String = \"\") -> void:
+ var zone : Zone = Zone.new()
+ zone.resource_name = item_name
+
+ var r : Rect2 = get_rect()
+ r.position = Vector2()
+ r.size.x /= 10.0
+ r.size.y /= 10.0
+
+ zone.set_rect(r)
+
+ add_content(zone)
+
+func add_content(entry : WorldGenBaseResource) -> void:
+ zones.append(entry)
+ emit_changed()
+
+func remove_content_entry(entry : WorldGenBaseResource) -> void:
+ for i in range(zones.size()):
+ if zones[i] == entry:
+ zones.remove(i)
+ emit_changed()
+ return
+
+func setup_property_inspector(inspector) -> void:
+ .setup_property_inspector(inspector)
+"
+
+[sub_resource type="Resource" id=17]
+resource_name = "qwetwwqasd"
+script = SubResource( 16 )
+rect = Rect2( 473, 331, 100, 100 )
+locked = false
+zones = [ SubResource( 11 ) ]
+
+[sub_resource type="GDScript" id=18]
+script/source = "tool
+extends \"res://addons/world_generator/resources/world_gen_base_resource.gd\"
+class_name Continent
+
+export(Array) var zones : Array
+
+func get_content() -> Array:
+ return zones
+
+func set_content(arr : Array) -> void:
+ zones = arr
+
+func create_content(item_name : String = \"\") -> void:
+ var zone : Zone = Zone.new()
+ zone.resource_name = item_name
+
+ var r : Rect2 = get_rect()
+ r.position = Vector2()
+ r.size.x /= 10.0
+ r.size.y /= 10.0
+
+ zone.set_rect(r)
+
+ add_content(zone)
+
+func add_content(entry : WorldGenBaseResource) -> void:
+ zones.append(entry)
+ emit_changed()
+
+func remove_content_entry(entry : WorldGenBaseResource) -> void:
+ for i in range(zones.size()):
+ if zones[i] == entry:
+ zones.remove(i)
+ emit_changed()
+ return
+
+func setup_property_inspector(inspector) -> void:
+ .setup_property_inspector(inspector)
+"
+
+[sub_resource type="Resource" id=19]
+resource_name = "qwesat"
+script = SubResource( 18 )
+rect = Rect2( 613, 346, 100, 100 )
+locked = false
+zones = [ SubResource( 11 ) ]
+
+[sub_resource type="Resource" id=20]
+resource_name = "ggg"
+script = ExtResource( 2 )
+rect = Rect2( 26, 51, 100, 100 )
+
+[sub_resource type="GDScript" id=21]
+script/source = "tool
+extends \"res://addons/world_generator/resources/world_gen_base_resource.gd\"
+class_name Continent
+
+export(Array) var zones : Array
+
+func get_content() -> Array:
+ return zones
+
+func set_content(arr : Array) -> void:
+ zones = arr
+
+func create_content(item_name : String = \"\") -> void:
+ var zone : Zone = Zone.new()
+ zone.resource_name = item_name
+
+ var r : Rect2 = get_rect()
+ r.position = Vector2()
+ r.size.x /= 10.0
+ r.size.y /= 10.0
+
+ zone.set_rect(r)
+
+ add_content(zone)
+
+func add_content(entry : WorldGenBaseResource) -> void:
+ zones.append(entry)
+ emit_changed()
+
+func remove_content_entry(entry : WorldGenBaseResource) -> void:
+ for i in range(zones.size()):
+ if zones[i] == entry:
+ zones.remove(i)
+ emit_changed()
+ return
+
+func setup_property_inspector(inspector) -> void:
+ .setup_property_inspector(inspector)
+"
+
+[sub_resource type="Resource" id=22]
+resource_name = "ggg (Duplicate)"
+script = SubResource( 21 )
+rect = Rect2( 33, 181, 100, 100 )
+locked = false
+zones = [ ]
+
+[sub_resource type="Resource" id=23]
+resource_name = "eeqqq"
+script = ExtResource( 2 )
+rect = Rect2( 256, 365, 100, 100 )
+
+[sub_resource type="Resource" id=27]
+resource_name = "asd"
+script = ExtResource( 2 )
+rect = Rect2( 337, 79, 100, 100 )
+
+[sub_resource type="Resource" id=28]
+resource_name = "asd"
+script = ExtResource( 2 )
+rect = Rect2( 244, 234, 100, 100 )
+
+[sub_resource type="Resource" id=29]
+script = ExtResource( 2 )
+rect = Rect2( 377, 69, 284, 238 )
+
+[sub_resource type="Resource" id=30]
+resource_name = "tttttt"
+script = ExtResource( 2 )
+rect = Rect2( 188, 225, 233, 259 )
+
+[sub_resource type="Resource" id=31]
+resource_name = "ttttyuqtttt"
+script = ExtResource( 2 )
+rect = Rect2( 339, 76, 220, 170 )
+
+[sub_resource type="Resource" id=33]
+resource_name = "qttt"
+script = ExtResource( 5 )
+rect = Rect2( 99, 78, 213, 105 )
+locked = false
+zones = [ ]
+
+[resource]
+resource_name = "asdasdsse"
+script = ExtResource( 1 )
+rect = Rect2( 0, 0, 1000, 1000 )
+locked = false
+continents = [ SubResource( 1 ), SubResource( 2 ), SubResource( 3 ), SubResource( 4 ), SubResource( 5 ), SubResource( 17 ), SubResource( 19 ), SubResource( 20 ), SubResource( 22 ), SubResource( 23 ), SubResource( 27 ), SubResource( 28 ), SubResource( 29 ), SubResource( 30 ), SubResource( 31 ), SubResource( 33 ) ]
diff --git a/modules/world_generator/addon/ui/DataList.gd b/modules/world_generator/addon/ui/DataList.gd
new file mode 100644
index 000000000..fa282890d
--- /dev/null
+++ b/modules/world_generator/addon/ui/DataList.gd
@@ -0,0 +1,175 @@
+tool
+extends Tree
+
+export(int, "Continent,Zone,Sub Zone") var class_types : int = 0
+
+var edited_resource : WorldGenBaseResource = null
+var name_edited_resource : WorldGenBaseResource = null
+
+var _ignore_changed_event : bool = false
+
+var _plugin : EditorPlugin = null
+var _undo_redo : UndoRedo = null
+
+func _init():
+ connect("item_activated", self, "on_item_activated")
+
+func set_plugin(plugin : EditorPlugin) -> void:
+ _plugin = plugin
+ _undo_redo = _plugin.get_undo_redo()
+
+func _enter_tree():
+ var dir : Directory = Directory.new()
+
+ if dir.file_exists("res://world_generator_settings.tres"):
+ var wgs : WorldGeneratorSettings = load("res://world_generator_settings.tres") as WorldGeneratorSettings
+
+ if !wgs:
+ return
+
+ wgs.evaluate_scripts(class_types, $NameDialog/VBoxContainer/Tree)
+
+func add_item(item_name : String = "") -> void:
+ if !edited_resource:
+ return
+
+ var ti : TreeItem = $NameDialog/VBoxContainer/Tree.get_selected()
+
+ if !ti:
+ return
+
+ var e : WorldGenBaseResource = null
+
+ if ti.has_meta("class_name"):
+ var cn : String = ti.get_meta("class_name")
+
+ if cn == "Continent":
+ e = Continent.new()
+ elif cn == "Zone":
+ e = Zone.new()
+ elif cn == "SubZone":
+ e = SubZone.new()
+
+ elif ti.has_meta("file"):
+ var cls = load(ti.get_meta("file"))
+
+ if cls:
+ e = cls.new()
+
+ if !e:
+ return
+
+ e.resource_name = item_name
+
+ #edited_resource.add_content(e)
+ #remove_content_entry
+
+ _undo_redo.create_action("WE: Created Entry")
+ _undo_redo.add_do_method(edited_resource, "add_content", e)
+ _undo_redo.add_undo_method(edited_resource, "remove_content_entry", e)
+ _undo_redo.commit_action()
+
+func refresh() -> void:
+ clear()
+
+ if !edited_resource:
+ return
+
+ var root : TreeItem = create_item()
+
+ var data : Array = edited_resource.get_content()
+
+ for d in data:
+ if d:
+ var n : String = d.resource_name
+
+ if n == "":
+ n = ""
+
+ var item : TreeItem = create_item(root)
+
+ item.set_text(0, n)
+ item.set_meta("res", d)
+
+func set_edited_resource(res : WorldGenBaseResource)-> void:
+ if edited_resource:
+ edited_resource.disconnect("changed", self, "on_resource_changed")
+
+ edited_resource = res
+
+ if edited_resource:
+ edited_resource.connect("changed", self, "on_resource_changed")
+
+ refresh()
+
+func add_button_pressed() -> void:
+ $NameDialog/VBoxContainer/LineEdit.text = ""
+ $NameDialog.popup_centered()
+
+func name_dialog_ok_pressed() -> void:
+ add_item($NameDialog/VBoxContainer/LineEdit.text)
+
+func name_edit_dialog_ok_pressed() -> void:
+ if name_edited_resource:
+ name_edited_resource.resource_name = $NameEditDialog/VBoxContainer/LineEdit.text
+ name_edited_resource.emit_changed()
+ name_edited_resource = null
+ on_resource_changed()
+
+func delete_button_pressed() -> void:
+ var item : TreeItem = get_selected()
+
+ if !item:
+ return
+
+ var item_resource = item.get_meta("res")
+
+ if !item_resource:
+ return
+
+ #edited_resource.remove_content_entry(item_resource)
+
+ _undo_redo.create_action("WE: Created Entry")
+ _undo_redo.add_do_method(edited_resource, "remove_content_entry", item_resource)
+ _undo_redo.add_undo_method(edited_resource, "add_content", item_resource)
+ _undo_redo.commit_action()
+
+func duplicate_button_pressed() -> void:
+ var item : TreeItem = get_selected()
+
+ if !item:
+ return
+
+ var item_resource = item.get_meta("res")
+
+ if !item_resource:
+ return
+
+ #edited_resource.duplicate_content_entry(item_resource)
+
+ var de = edited_resource.duplicate_content_entry(item_resource, false)
+
+ _undo_redo.create_action("WE: Created Entry")
+ _undo_redo.add_do_method(edited_resource, "add_content", de)
+ _undo_redo.add_undo_method(edited_resource, "remove_content_entry", de)
+ _undo_redo.commit_action()
+
+func on_resource_changed() -> void:
+ if _ignore_changed_event:
+ return
+
+ call_deferred("refresh")
+
+func on_item_activated() -> void:
+ var item : TreeItem = get_selected()
+
+ if !item:
+ return
+
+ name_edited_resource = item.get_meta("res")
+
+ if !name_edited_resource:
+ return
+
+ $NameEditDialog/VBoxContainer/LineEdit.text = name_edited_resource.resource_name
+ $NameEditDialog.popup_centered()
diff --git a/modules/world_generator/addon/ui/DataList.tscn b/modules/world_generator/addon/ui/DataList.tscn
new file mode 100644
index 000000000..7852c4deb
--- /dev/null
+++ b/modules/world_generator/addon/ui/DataList.tscn
@@ -0,0 +1,84 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://addons/world_generator/ui/DataList.gd" type="Script" id=1]
+
+[node name="DataList" type="Tree"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+hide_root = true
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="NameDialog" type="ConfirmationDialog" parent="."]
+margin_right = 329.0
+margin_bottom = 313.0
+window_title = "Name"
+resizable = true
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="VBoxContainer" type="VBoxContainer" parent="NameDialog"]
+margin_left = 8.0
+margin_top = 8.0
+margin_right = 321.0
+margin_bottom = 277.0
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Label2" type="Label" parent="NameDialog/VBoxContainer"]
+margin_right = 313.0
+margin_bottom = 14.0
+text = "Class"
+
+[node name="Tree" type="Tree" parent="NameDialog/VBoxContainer"]
+margin_top = 18.0
+margin_right = 313.0
+margin_bottom = 223.0
+rect_min_size = Vector2( 0, 200 )
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="Label" type="Label" parent="NameDialog/VBoxContainer"]
+margin_top = 227.0
+margin_right = 313.0
+margin_bottom = 241.0
+text = "Name"
+
+[node name="LineEdit" type="LineEdit" parent="NameDialog/VBoxContainer"]
+margin_top = 245.0
+margin_right = 313.0
+margin_bottom = 269.0
+
+[node name="NameEditDialog" type="ConfirmationDialog" parent="."]
+margin_right = 223.0
+margin_bottom = 82.0
+window_title = "Name"
+resizable = true
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="VBoxContainer" type="VBoxContainer" parent="NameEditDialog"]
+margin_left = 8.0
+margin_top = 8.0
+margin_right = 215.0
+margin_bottom = 50.0
+
+[node name="Label" type="Label" parent="NameEditDialog/VBoxContainer"]
+margin_right = 207.0
+margin_bottom = 14.0
+text = "Name"
+
+[node name="LineEdit" type="LineEdit" parent="NameEditDialog/VBoxContainer"]
+margin_top = 18.0
+margin_right = 207.0
+margin_bottom = 42.0
+
+[connection signal="confirmed" from="NameDialog" to="." method="name_dialog_ok_pressed"]
+[connection signal="confirmed" from="NameEditDialog" to="." method="name_edit_dialog_ok_pressed"]
diff --git a/modules/world_generator/addon/ui/MainScreen.gd b/modules/world_generator/addon/ui/MainScreen.gd
new file mode 100644
index 000000000..a6512c5e8
--- /dev/null
+++ b/modules/world_generator/addon/ui/MainScreen.gd
@@ -0,0 +1,21 @@
+tool
+extends PanelContainer
+
+var edited_world
+
+func set_plugin(plugin : EditorPlugin) -> void:
+ $TabContainer/World.set_plugin(plugin)
+ $TabContainer/Continent.set_plugin(plugin)
+ $TabContainer/Zone.set_plugin(plugin)
+ $TabContainer/SubZone.set_plugin(plugin)
+
+func refresh() -> void:
+ $TabContainer/World.set_wgworld(edited_world)
+ $TabContainer/Continent.set_wgworld(edited_world)
+ $TabContainer/Zone.set_wgworld(edited_world)
+ $TabContainer/SubZone.set_wgworld(edited_world)
+
+func set_wgworld(wgw : WorldGenWorld) -> void:
+ edited_world = wgw
+
+ refresh()
diff --git a/modules/world_generator/addon/ui/MainScreen.tscn b/modules/world_generator/addon/ui/MainScreen.tscn
new file mode 100644
index 000000000..b3a81e734
--- /dev/null
+++ b/modules/world_generator/addon/ui/MainScreen.tscn
@@ -0,0 +1,47 @@
+[gd_scene load_steps=6 format=2]
+
+[ext_resource path="res://addons/world_generator/ui/MainScreen.gd" type="Script" id=1]
+[ext_resource path="res://addons/world_generator/ui/tabs/World.tscn" type="PackedScene" id=2]
+[ext_resource path="res://addons/world_generator/ui/tabs/Continent.tscn" type="PackedScene" id=3]
+[ext_resource path="res://addons/world_generator/ui/tabs/Zone.tscn" type="PackedScene" id=4]
+[ext_resource path="res://addons/world_generator/ui/tabs/SubZone.tscn" type="PackedScene" id=5]
+
+[node name="WorldGenerator" type="PanelContainer"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+rect_min_size = Vector2( 0, 200 )
+size_flags_vertical = 3
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="TabContainer" type="TabContainer" parent="."]
+margin_left = 7.0
+margin_top = 7.0
+margin_right = 1017.0
+margin_bottom = 593.0
+tab_align = 0
+
+[node name="World" parent="TabContainer" instance=ExtResource( 2 )]
+
+[node name="Continent" parent="TabContainer" instance=ExtResource( 3 )]
+visible = false
+margin_left = 4.0
+margin_top = 32.0
+margin_right = -4.0
+margin_bottom = -4.0
+
+[node name="Zone" parent="TabContainer" instance=ExtResource( 4 )]
+visible = false
+margin_left = 4.0
+margin_top = 32.0
+margin_right = -4.0
+margin_bottom = -4.0
+
+[node name="SubZone" parent="TabContainer" instance=ExtResource( 5 )]
+visible = false
+margin_left = 4.0
+margin_top = 32.0
+margin_right = -4.0
+margin_bottom = -4.0
diff --git a/modules/world_generator/addon/ui/RectEditor.gd b/modules/world_generator/addon/ui/RectEditor.gd
new file mode 100644
index 000000000..d86112e3c
--- /dev/null
+++ b/modules/world_generator/addon/ui/RectEditor.gd
@@ -0,0 +1,12 @@
+tool
+extends PanelContainer
+
+func _init():
+# Control/EditorZoomWidget
+ pass
+
+func set_plugin(plugin : EditorPlugin) -> void:
+ $ScrollContainer/MarginContainer/RectView.set_plugin(plugin)
+
+func set_edited_resource(res : WorldGenBaseResource):
+ $ScrollContainer/MarginContainer/RectView.set_edited_resource(res)
diff --git a/modules/world_generator/addon/ui/RectEditor.tscn b/modules/world_generator/addon/ui/RectEditor.tscn
new file mode 100644
index 000000000..ae622a300
--- /dev/null
+++ b/modules/world_generator/addon/ui/RectEditor.tscn
@@ -0,0 +1,54 @@
+[gd_scene load_steps=4 format=2]
+
+[ext_resource path="res://addons/world_generator/ui/RectEditor.gd" type="Script" id=1]
+[ext_resource path="res://addons/world_generator/widgets/EditorZoomWidget.tscn" type="PackedScene" id=2]
+[ext_resource path="res://addons/world_generator/ui/RectView.gd" type="Script" id=3]
+
+[node name="RectEditor" type="PanelContainer"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="ScrollContainer" type="ScrollContainer" parent="."]
+margin_left = 7.0
+margin_top = 7.0
+margin_right = 1017.0
+margin_bottom = 593.0
+
+[node name="MarginContainer" type="MarginContainer" parent="ScrollContainer"]
+margin_right = 400.0
+margin_bottom = 400.0
+custom_constants/margin_right = 200
+custom_constants/margin_top = 200
+custom_constants/margin_left = 200
+custom_constants/margin_bottom = 200
+
+[node name="RectView" type="Control" parent="ScrollContainer/MarginContainer"]
+margin_left = 200.0
+margin_top = 200.0
+margin_right = 200.0
+margin_bottom = 200.0
+script = ExtResource( 3 )
+zoom_widget_path = NodePath("../../../Control/EditorZoomWidget")
+
+[node name="Control" type="Control" parent="."]
+margin_left = 7.0
+margin_top = 7.0
+margin_right = 1017.0
+margin_bottom = 593.0
+mouse_filter = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="EditorZoomWidget" parent="Control" instance=ExtResource( 2 )]
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 115.0
+margin_bottom = 22.0
+custom_constants/separation = -8
+__meta__ = {
+"_edit_use_anchors_": false
+}
diff --git a/modules/world_generator/addon/ui/RectView.gd b/modules/world_generator/addon/ui/RectView.gd
new file mode 100644
index 000000000..61b2b4aad
--- /dev/null
+++ b/modules/world_generator/addon/ui/RectView.gd
@@ -0,0 +1,116 @@
+tool
+extends Control
+
+var rect_editor_node_scene : PackedScene = preload("res://addons/world_generator/ui/RectViewNode.tscn")
+
+export(NodePath) var zoom_widget_path : NodePath = ""
+
+var _rect_scale : float = 1
+
+var edited_resource : WorldGenBaseResource = null
+var edited_resource_current_size : Vector2 = Vector2()
+
+var _plugin : EditorPlugin = null
+var _undo_redo : UndoRedo = null
+
+func _enter_tree():
+ var zoom_widget : Node = get_node_or_null(zoom_widget_path)
+
+ if !zoom_widget:
+ return
+
+ if !zoom_widget.is_connected("zoom_changed", self, "on_zoom_changed"):
+ zoom_widget.connect("zoom_changed", self, "on_zoom_changed")
+
+ if !is_connected("visibility_changed", self, "on_visibility_changed"):
+ connect("visibility_changed", self, "on_visibility_changed")
+
+func set_plugin(plugin : EditorPlugin) -> void:
+ _plugin = plugin
+ _undo_redo = _plugin.get_undo_redo()
+
+func on_visibility_changed() -> void:
+ call_deferred("apply_zoom")
+
+func apply_zoom() -> void:
+ if !edited_resource:
+ return
+
+ var rect : Rect2 = edited_resource.rect
+ edited_resource_current_size = rect.size
+ rect.position = rect.position * _rect_scale
+ rect.size = rect.size * _rect_scale
+ set_custom_minimum_size(rect.size)
+
+ var p : MarginContainer = get_parent() as MarginContainer
+
+ p.add_constant_override("margin_left", min(rect.size.x / 4.0, 50 * _rect_scale))
+ p.add_constant_override("margin_right", min(rect.size.x / 4.0, 50 * _rect_scale))
+ p.add_constant_override("margin_top", min(rect.size.y / 4.0, 50 * _rect_scale))
+ p.add_constant_override("margin_bottom", min(rect.size.y / 4.0, 50 * _rect_scale))
+
+ for c in get_children():
+ c.set_editor_rect_scale(_rect_scale)
+
+func on_zoom_changed(zoom : float) -> void:
+ _rect_scale = zoom
+ apply_zoom()
+
+func _draw():
+ draw_rect(Rect2(Vector2(), get_size()), Color(0.2, 0.2, 0.2, 1))
+
+func refresh() -> void:
+ clear()
+
+ if !edited_resource:
+ return
+
+ var rect : Rect2 = edited_resource.rect
+ edited_resource_current_size = rect.size
+ rect.position = rect.position * _rect_scale
+ rect.size = rect.size * _rect_scale
+ set_custom_minimum_size(rect.size)
+
+ apply_zoom()
+
+ refresh_rects()
+
+func clear() -> void:
+ pass
+
+func refresh_rects() -> void:
+ clear_rects()
+
+ if !edited_resource:
+ return
+
+ var cont : Array = edited_resource.get_content()
+
+ for c in cont:
+ if c:
+ var s : Node = rect_editor_node_scene.instance()
+
+ add_child(s)
+ s.set_plugin(_plugin)
+ s.set_editor_rect_scale(_rect_scale)
+ s.edited_resource_parent_size = edited_resource_current_size
+ s.set_edited_resource(c)
+
+func clear_rects():
+ for c in get_children():
+ c.queue_free()
+ remove_child(c)
+
+func set_edited_resource(res : WorldGenBaseResource):
+ if edited_resource:
+ edited_resource.disconnect("changed", self, "on_edited_resource_changed")
+
+ edited_resource = res
+
+ refresh()
+
+ if edited_resource:
+ edited_resource.connect("changed", self, "on_edited_resource_changed")
+
+func on_edited_resource_changed() -> void:
+ call_deferred("refresh")
diff --git a/modules/world_generator/addon/ui/RectViewNode.gd b/modules/world_generator/addon/ui/RectViewNode.gd
new file mode 100644
index 000000000..2f30e2c2f
--- /dev/null
+++ b/modules/world_generator/addon/ui/RectViewNode.gd
@@ -0,0 +1,227 @@
+tool
+extends MarginContainer
+
+enum DragType {
+ DRAG_NONE = 0,
+ DRAG_MOVE = 1,
+ DRAG_RESIZE_TOP = 1 << 1,
+ DRAG_RESIZE_RIGHT = 1 << 2,
+ DRAG_RESIZE_BOTTOM = 1 << 3,
+ DRAG_RESIZE_LEFT = 1 << 4
+};
+
+var edited_resource : WorldGenBaseResource = null
+var edited_resource_parent_size : Vector2 = Vector2()
+
+var _edited_resource_rect_border_color : Color = Color(1, 1, 1, 1)
+var _edited_resource_rect_color : Color = Color(0.8, 0.8, 0.8, 0.9)
+var _editor_rect_border_size : int = 2
+var _edited_resource_font_color : Color = Color(0, 0, 0, 1)
+var _editor_additional_text : String = ""
+
+var drag_type : int
+var drag_offset : Vector2
+var drag_offset_far : Vector2
+
+var _rect_scale : float = 1
+
+var _edited_resource_event_ignore : bool = false
+
+var _plugin : EditorPlugin = null
+var _undo_redo : UndoRedo = null
+
+func set_plugin(plugin : EditorPlugin) -> void:
+ _plugin = plugin
+ _undo_redo = _plugin.get_undo_redo()
+
+func _draw():
+ draw_rect(Rect2(Vector2(), get_size()), _edited_resource_rect_color)
+ draw_rect(Rect2(Vector2(), get_size()), _edited_resource_rect_border_color, false, _editor_rect_border_size)
+
+ var font : Font = get_font("font")
+
+ var res_name : String = "NULL"
+
+ if edited_resource:
+ res_name = edited_resource.resource_name
+
+ var res_cls : String = ""
+
+ if edited_resource:
+ res_cls = edited_resource.get_editor_class()
+
+ draw_string(font, Vector2(_editor_rect_border_size, font.get_height()), res_name, _edited_resource_font_color)
+ draw_string(font, Vector2(_editor_rect_border_size, font.get_height() * 2), _editor_additional_text, _edited_resource_font_color, get_rect().size.x)
+
+ if res_cls != "":
+ draw_string(font, Vector2(_editor_rect_border_size, font.get_height() * 3), res_cls, _edited_resource_font_color, get_rect().size.x)
+
+func refresh() -> void:
+ if !edited_resource:
+ return
+
+ #anchor is bottom left here
+ var rect : Rect2 = edited_resource.get_rect()
+ rect.position *= _rect_scale
+ rect.size *= _rect_scale
+
+ #anchor needs to be on top left here
+ var rp : Vector2 = rect.position
+ rp.y = edited_resource_parent_size.y * _rect_scale - rect.size.y - rect.position.y
+ rect_position = rp
+ rect_size = rect.size
+
+ update()
+
+func set_editor_rect_scale(rect_scale) -> void:
+ _rect_scale = rect_scale
+
+ refresh()
+
+func set_edited_resource(res : WorldGenBaseResource):
+ edited_resource = res
+
+ if edited_resource:
+ _edited_resource_rect_border_color = edited_resource.get_editor_rect_border_color()
+ _edited_resource_rect_color = edited_resource.get_editor_rect_color()
+ _editor_rect_border_size = edited_resource.get_editor_rect_border_size()
+ _edited_resource_font_color = edited_resource.get_editor_font_color()
+ _editor_additional_text = edited_resource.get_editor_additional_text()
+
+ edited_resource.connect("changed", self, "on_edited_resource_changed")
+
+ refresh()
+
+func on_edited_resource_changed() -> void:
+ if _edited_resource_event_ignore:
+ return
+
+ refresh()
+
+#based on / ported from engine/scene/gui/dialogs.h and .cpp
+func _notification(p_what : int) -> void:
+ if (p_what == NOTIFICATION_MOUSE_EXIT):
+ # Reset the mouse cursor when leaving the resizable window border.
+ if (edited_resource && !edited_resource.locked && !drag_type):
+ if (get_default_cursor_shape() != CURSOR_ARROW):
+ set_default_cursor_shape(CURSOR_ARROW)
+
+#based on / ported from engine/scene/gui/dialogs.h and .cpp
+func _gui_input(p_event : InputEvent) -> void:
+ if (p_event is InputEventMouseButton) && (p_event.get_button_index() == BUTTON_LEFT):
+ var mb : InputEventMouseButton = p_event as InputEventMouseButton
+
+ if (mb.is_pressed()):
+ # Begin a possible dragging operation.
+ drag_type = _drag_hit_test(Vector2(mb.get_position().x, mb.get_position().y))
+
+ if (drag_type != DragType.DRAG_NONE):
+ drag_offset = get_global_mouse_position() - get_position()
+
+ drag_offset_far = get_position() + get_size() - get_global_mouse_position()
+
+ elif (drag_type != DragType.DRAG_NONE && !mb.is_pressed()):
+ # End a dragging operation.
+ drag_type = DragType.DRAG_NONE
+
+ var rect : Rect2 = get_rect()
+ #rect needs to be converted back
+ rect.position.y = edited_resource_parent_size.y * _rect_scale - rect.size.y - rect.position.y
+ rect.position /= _rect_scale
+ rect.size /= _rect_scale
+
+ #edited_resource.set_rect(rect)
+ _edited_resource_event_ignore = true
+ _undo_redo.create_action("WE: Drag End")
+ _undo_redo.add_do_method(edited_resource, "set_rect", rect)
+ _undo_redo.add_undo_method(edited_resource, "set_rect", edited_resource.get_rect())
+ _undo_redo.commit_action()
+ _edited_resource_event_ignore = false
+
+ if p_event is InputEventMouseMotion:
+ var mm : InputEventMouseMotion = p_event as InputEventMouseMotion
+
+ if (drag_type == DragType.DRAG_NONE):
+ # Update the cursor while moving along the borders.
+ var cursor = CURSOR_ARROW
+ if (!edited_resource.locked):
+ var preview_drag_type : int = _drag_hit_test(Vector2(mm.get_position().x, mm.get_position().y))
+
+ var top_left : int = DragType.DRAG_RESIZE_TOP + DragType.DRAG_RESIZE_LEFT
+ var bottom_right : int = DragType.DRAG_RESIZE_BOTTOM + DragType.DRAG_RESIZE_RIGHT
+ var top_right : int = DragType.DRAG_RESIZE_TOP + DragType.DRAG_RESIZE_RIGHT
+ var bottom_left : int = DragType.DRAG_RESIZE_BOTTOM + DragType.DRAG_RESIZE_LEFT
+
+ match (preview_drag_type):
+ DragType.DRAG_RESIZE_TOP:
+ cursor = CURSOR_VSIZE
+ DragType.DRAG_RESIZE_BOTTOM:
+ cursor = CURSOR_VSIZE
+ DragType.DRAG_RESIZE_LEFT:
+ cursor = CURSOR_HSIZE
+ DragType.DRAG_RESIZE_RIGHT:
+ cursor = CURSOR_HSIZE
+ top_left:
+ cursor = CURSOR_FDIAGSIZE
+ bottom_right:
+ cursor = CURSOR_FDIAGSIZE
+ top_right:
+ cursor = CURSOR_BDIAGSIZE
+ bottom_left:
+ cursor = CURSOR_BDIAGSIZE
+
+ if (get_cursor_shape() != cursor):
+ set_default_cursor_shape(cursor);
+
+ else:
+ # Update while in a dragging operation.
+ var global_pos : Vector2 = get_global_mouse_position()
+
+ var rect : Rect2 = get_rect()
+ var min_size : Vector2 = get_combined_minimum_size()
+
+ if (drag_type == DragType.DRAG_MOVE):
+ rect.position = global_pos - drag_offset
+ else:
+ if (drag_type & DragType.DRAG_RESIZE_TOP):
+ var bottom : int = rect.position.y + rect.size.y
+ var max_y : int = bottom - min_size.y
+ rect.position.y = min(global_pos.y - drag_offset.y, max_y)
+ rect.size.y = bottom - rect.position.y
+ elif (drag_type & DragType.DRAG_RESIZE_BOTTOM):
+ rect.size.y = global_pos.y - rect.position.y + drag_offset_far.y
+
+ if (drag_type & DragType.DRAG_RESIZE_LEFT):
+ var right : int = rect.position.x + rect.size.x
+ var max_x : int = right - min_size.x
+ rect.position.x = min(global_pos.x - drag_offset.x, max_x)
+ rect.size.x = right - rect.position.x
+ elif (drag_type & DragType.DRAG_RESIZE_RIGHT):
+ rect.size.x = global_pos.x - rect.position.x + drag_offset_far.x
+
+ set_size(rect.size)
+ set_position(rect.position)
+
+#based on / ported from engine/scene/gui/dialogs.h and .cpp
+func _drag_hit_test(pos : Vector2) -> int:
+ var drag_type : int = DragType.DRAG_NONE
+
+ if (!edited_resource.locked):
+ var scaleborder_size : int = 5 #get_constant("scaleborder_size", "WindowDialog")
+
+ var rect : Rect2 = get_rect()
+
+ if (pos.y < (scaleborder_size)):
+ drag_type = DragType.DRAG_RESIZE_TOP
+ elif (pos.y >= (rect.size.y - scaleborder_size)):
+ drag_type = DragType.DRAG_RESIZE_BOTTOM
+
+ if (pos.x < scaleborder_size):
+ drag_type |= DragType.DRAG_RESIZE_LEFT
+ elif (pos.x >= (rect.size.x - scaleborder_size)):
+ drag_type |= DragType.DRAG_RESIZE_RIGHT
+
+ if (drag_type == DragType.DRAG_NONE):
+ drag_type = DragType.DRAG_MOVE
+
+ return drag_type
diff --git a/modules/world_generator/addon/ui/RectViewNode.tscn b/modules/world_generator/addon/ui/RectViewNode.tscn
new file mode 100644
index 000000000..a1f7886c6
--- /dev/null
+++ b/modules/world_generator/addon/ui/RectViewNode.tscn
@@ -0,0 +1,11 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://addons/world_generator/ui/RectViewNode.gd" type="Script" id=1]
+
+[node name="RectViewNode" type="MarginContainer"]
+margin_right = 1024.0
+margin_bottom = 600.0
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
diff --git a/modules/world_generator/addon/ui/ResourcePropertyList.gd b/modules/world_generator/addon/ui/ResourcePropertyList.gd
new file mode 100644
index 000000000..8d77e3c29
--- /dev/null
+++ b/modules/world_generator/addon/ui/ResourcePropertyList.gd
@@ -0,0 +1,492 @@
+tool
+extends ScrollContainer
+
+var EditorResourceWidget : PackedScene = preload("res://addons/world_generator/widgets/EditorResourceWidget.tscn")
+
+var _edited_resource : WorldGenBaseResource = null
+var properties : Array = Array()
+
+var _ignore_changed_evend : bool = false
+var _refresh_queued : bool = false
+
+var _plugin : EditorPlugin = null
+var _undo_redo : UndoRedo = null
+
+func set_plugin(plugin : EditorPlugin) -> void:
+ _plugin = plugin
+ _undo_redo = _plugin.get_undo_redo()
+
+func add_h_separator() -> int:
+ var hsep : HSeparator = HSeparator.new()
+
+ var content_node = $MainContainer/Content
+
+ content_node.add_child(hsep)
+ var slot_idx : int = content_node.get_child_count() - 1
+
+ return slot_idx
+
+func add_slot_color(getter : String, setter : String) -> int:
+ var cp : ColorPickerButton = ColorPickerButton.new()
+
+ var slot_idx : int = add_slot(getter, setter, cp)
+
+ cp.color = _edited_resource.call(getter)
+
+ cp.connect("color_changed", _edited_resource, setter)
+
+ return slot_idx
+
+func add_slot_label(getter : String, setter : String, slot_name : String) -> int:
+ var l : Label = Label.new()
+
+ l.text = slot_name
+
+ return add_slot(getter, setter, l)
+
+func add_slot_resource(getter : String, setter : String, slot_name : String, resource_type : String = "Resource") -> int:
+ var bc : HBoxContainer = HBoxContainer.new()
+ bc.set_h_size_flags(SIZE_EXPAND_FILL)
+
+ var l : Label = Label.new()
+ l.text = slot_name
+ bc.add_child(l)
+
+ var r : Control = EditorResourceWidget.instance()
+ r.set_plugin(_plugin)
+ r.set_resource_type(resource_type)
+ r.set_resource(_edited_resource.call(getter))
+ r.set_h_size_flags(SIZE_EXPAND_FILL)
+
+ bc.add_child(r)
+
+ var slot_idx : int = add_slot(getter, setter, bc)
+
+ r.connect("on_resource_changed", self, "on_widget_resource_changed", [ slot_idx ])
+
+ return slot_idx
+
+func add_slot_line_edit(getter : String, setter : String, slot_name : String, placeholder : String = "") -> int:
+ var bc : HBoxContainer = HBoxContainer.new()
+ bc.set_h_size_flags(SIZE_EXPAND_FILL)
+
+ var l : Label = Label.new()
+ l.text = slot_name
+ bc.add_child(l)
+
+ var le : LineEdit = LineEdit.new()
+ le.placeholder_text = placeholder
+ le.set_h_size_flags(SIZE_EXPAND_FILL)
+ bc.add_child(le)
+
+ var slot_idx : int = add_slot(getter, setter, bc)
+
+ le.text = _edited_resource.call(getter)
+
+ le.connect("text_entered", self, "on_slot_line_edit_text_entered", [ slot_idx ])
+
+ return slot_idx
+
+func add_slot_enum(getter : String, setter : String, slot_name : String, values : Array) -> int:
+ var bc : VBoxContainer = VBoxContainer.new()
+
+ if slot_name:
+ var l : Label = Label.new()
+ l.text = slot_name
+ bc.add_child(l)
+
+ var mb : OptionButton = OptionButton.new()
+
+ for v in values:
+ mb.add_item(v)
+
+ bc.add_child(mb)
+
+ var slot_idx : int = add_slot(getter, setter, bc)
+
+ mb.selected = _edited_resource.call(getter)
+
+ mb.connect("item_selected", self, "on_slot_enum_item_selected", [ slot_idx ])
+
+ return slot_idx
+
+func add_slot_int(getter : String, setter : String, slot_name : String, prange : Vector2 = Vector2(-1000, 1000)) -> int:
+ var bc : HBoxContainer = HBoxContainer.new()
+
+ var l : Label = Label.new()
+ l.text = slot_name
+ l.size_flags_horizontal = SIZE_EXPAND_FILL
+ bc.add_child(l)
+
+ var sb : SpinBox = SpinBox.new()
+ sb.rounded = true
+ sb.min_value = prange.x
+ sb.max_value = prange.y
+ bc.add_child(sb)
+
+ var slot_idx : int = add_slot(getter, setter, bc)
+
+ sb.value = _edited_resource.call(getter)
+
+ sb.connect("value_changed", self, "on_int_spinbox_value_changed", [ slot_idx ])
+
+ return slot_idx
+
+func add_slot_bool(getter : String, setter : String, slot_name : String) -> int:
+ var cb : CheckBox = CheckBox.new()
+ cb.text = slot_name
+
+ var slot_idx : int = add_slot(getter, setter, cb)
+
+ cb.pressed = _edited_resource.call(getter)
+
+ cb.connect("toggled", self, "on_checkbox_value_changed", [ slot_idx ])
+
+ return slot_idx
+
+func add_slot_float(getter : String, setter : String, slot_name : String, step : float = 0.1, prange : Vector2 = Vector2(-1000, 1000)) -> int:
+ var bc : HBoxContainer = HBoxContainer.new()
+
+ var l : Label = Label.new()
+ l.text = slot_name
+ l.size_flags_horizontal = SIZE_EXPAND_FILL
+ bc.add_child(l)
+
+ var sb : SpinBox = SpinBox.new()
+ bc.add_child(sb)
+
+ var slot_idx : int = add_slot(getter, setter, bc)
+ sb.rounded = false
+ sb.step = step
+ sb.min_value = prange.x
+ sb.max_value = prange.y
+ sb.value = _edited_resource.call(getter)
+
+ sb.connect("value_changed", self, "on_float_spinbox_value_changed", [ slot_idx ])
+
+ return slot_idx
+
+func add_slot_vector2(getter : String, setter : String, slot_name : String, step : float = 0.1, prange : Vector2 = Vector2(-1000, 1000)) -> int:
+ var bc : VBoxContainer = VBoxContainer.new()
+
+ var l : Label = Label.new()
+ l.text = slot_name
+ bc.add_child(l)
+
+ var sbx : SpinBox = SpinBox.new()
+ bc.add_child(sbx)
+
+ var sby : SpinBox = SpinBox.new()
+ bc.add_child(sby)
+
+ var slot_idx : int = add_slot(getter, setter, bc)
+ sbx.rounded = false
+ sby.rounded = false
+ sbx.step = step
+ sby.step = step
+ sbx.min_value = prange.x
+ sbx.max_value = prange.y
+ sby.min_value = prange.x
+ sby.max_value = prange.y
+
+ var val : Vector2 = _edited_resource.call(getter)
+
+ sbx.value = val.x
+ sby.value = val.y
+
+ sbx.connect("value_changed", self, "on_vector2_spinbox_value_changed", [ slot_idx, sbx, sby ])
+ sby.connect("value_changed", self, "on_vector2_spinbox_value_changed", [ slot_idx, sbx, sby ])
+
+ return slot_idx
+
+func add_slot_vector3(getter : String, setter : String, slot_name : String, step : float = 0.1, prange : Vector2 = Vector2(-1000, 1000)) -> int:
+ var bc : VBoxContainer = VBoxContainer.new()
+
+ var l : Label = Label.new()
+ l.text = slot_name
+ bc.add_child(l)
+
+ var sbx : SpinBox = SpinBox.new()
+ bc.add_child(sbx)
+
+ var sby : SpinBox = SpinBox.new()
+ bc.add_child(sby)
+
+ var sbz : SpinBox = SpinBox.new()
+ bc.add_child(sbz)
+
+ var slot_idx : int = add_slot(getter, setter, bc)
+ sbx.rounded = false
+ sby.rounded = false
+ sbz.rounded = false
+ sbx.step = step
+ sby.step = step
+ sbz.step = step
+ sbx.min_value = prange.x
+ sbx.max_value = prange.y
+ sby.min_value = prange.x
+ sby.max_value = prange.y
+ sbz.min_value = prange.x
+ sbz.max_value = prange.y
+
+ var val : Vector3 = _edited_resource.call(getter)
+
+ sbx.value = val.x
+ sby.value = val.y
+ sbz.value = val.z
+
+ sbx.connect("value_changed", self, "on_vector3_spinbox_value_changed", [ slot_idx, sbx, sby, sbz ])
+ sby.connect("value_changed", self, "on_vector3_spinbox_value_changed", [ slot_idx, sbx, sby, sbz ])
+ sbz.connect("value_changed", self, "on_vector3_spinbox_value_changed", [ slot_idx, sbx, sby, sbz ])
+
+ return slot_idx
+
+
+func add_slot_rect2(getter : String, setter : String, slot_name : String, step : float = 0.1, prange : Vector2 = Vector2(-10000, 10000)) -> int:
+ var bc : VBoxContainer = VBoxContainer.new()
+ bc.size_flags_horizontal = SIZE_EXPAND_FILL
+
+ var l : Label = Label.new()
+ l.text = slot_name
+ bc.add_child(l)
+
+ var hc1 : HBoxContainer = HBoxContainer.new()
+ hc1.size_flags_horizontal = SIZE_EXPAND_FILL
+ bc.add_child(hc1)
+
+ var sbx : SpinBox = SpinBox.new()
+ sbx.size_flags_horizontal = SIZE_EXPAND_FILL
+ hc1.add_child(sbx)
+
+ var sby : SpinBox = SpinBox.new()
+ sby.size_flags_horizontal = SIZE_EXPAND_FILL
+ hc1.add_child(sby)
+
+ var hc2 : HBoxContainer = HBoxContainer.new()
+ hc2.size_flags_horizontal = SIZE_EXPAND_FILL
+ bc.add_child(hc2)
+
+ var sbw : SpinBox = SpinBox.new()
+ sbw.size_flags_horizontal = SIZE_EXPAND_FILL
+ hc2.add_child(sbw)
+
+ var sbh : SpinBox = SpinBox.new()
+ sbh.size_flags_horizontal = SIZE_EXPAND_FILL
+ hc2.add_child(sbh)
+
+ var slot_idx : int = add_slot(getter, setter, bc)
+ sbx.rounded = false
+ sby.rounded = false
+ sbw.rounded = false
+ sbh.rounded = false
+ sbx.step = step
+ sby.step = step
+ sbw.step = step
+ sbh.step = step
+ sbx.min_value = prange.x
+ sbx.max_value = prange.y
+ sby.min_value = prange.x
+ sby.max_value = prange.y
+ sbw.min_value = prange.x
+ sbw.max_value = prange.y
+ sbh.min_value = prange.x
+ sbh.max_value = prange.y
+
+ var val : Rect2 = _edited_resource.call(getter)
+
+ sbx.value = val.position.x
+ sby.value = val.position.y
+ sbw.value = val.size.x
+ sbh.value = val.size.y
+
+ sbx.connect("value_changed", self, "on_rect2_spinbox_value_changed", [ slot_idx, [ sbx, sby, sbw, sbh ] ])
+ sby.connect("value_changed", self, "on_rect2_spinbox_value_changed", [ slot_idx, [ sbx, sby, sbw, sbh ] ])
+ sbw.connect("value_changed", self, "on_rect2_spinbox_value_changed", [ slot_idx, [ sbx, sby, sbw, sbh ] ])
+ sbh.connect("value_changed", self, "on_rect2_spinbox_value_changed", [ slot_idx, [ sbx, sby, sbw, sbh ] ])
+
+ return slot_idx
+
+func add_slot(getter : String, setter : String, control : Control) -> int:
+ var content_node = $MainContainer/Content
+
+ content_node.add_child(control)
+ var child_idx : int = content_node.get_child_count() - 1
+
+ var arr : Array = Array()
+
+ arr.append(child_idx)
+ arr.append(getter)
+ arr.append(setter)
+ arr.append(control)
+
+ properties.append(arr)
+
+ var slot_idx : int = properties.size() - 1
+
+ return slot_idx
+
+func get_property_control(slot_idx : int) -> Node:
+ return properties[slot_idx][3]
+
+func on_int_spinbox_value_changed(val : float, slot_idx) -> void:
+ _ignore_changed_evend = true
+
+ #_edited_resource.call(properties[slot_idx][2], int(val))
+
+ _undo_redo.create_action("WE: Set Value")
+ _undo_redo.add_do_method(_edited_resource, properties[slot_idx][2], int(val))
+ _undo_redo.add_undo_method(_edited_resource, properties[slot_idx][2], _edited_resource.call(properties[slot_idx][1]))
+ _undo_redo.commit_action()
+
+ _ignore_changed_evend = false
+
+func on_checkbox_value_changed(val : bool, slot_idx) -> void:
+ _ignore_changed_evend = true
+
+ #_edited_resource.call(properties[slot_idx][2], val)
+
+ _undo_redo.create_action("WE: Set Value")
+ _undo_redo.add_do_method(_edited_resource, properties[slot_idx][2], val)
+ _undo_redo.add_undo_method(_edited_resource, properties[slot_idx][2], _edited_resource.call(properties[slot_idx][1]))
+ _undo_redo.commit_action()
+
+ _ignore_changed_evend = false
+
+func on_float_spinbox_value_changed(val : float, slot_idx) -> void:
+ _ignore_changed_evend = true
+
+ #_edited_resource.call(properties[slot_idx][2], val)
+
+ _undo_redo.create_action("WE: Set Value")
+ _undo_redo.add_do_method(_edited_resource, properties[slot_idx][2], val)
+ _undo_redo.add_undo_method(_edited_resource, properties[slot_idx][2], _edited_resource.call(properties[slot_idx][1]))
+ _undo_redo.commit_action()
+
+ _ignore_changed_evend = false
+
+func on_vector2_spinbox_value_changed(val : float, slot_idx, spinbox_x, spinbox_y) -> void:
+ _ignore_changed_evend = true
+ var vv : Vector2 = Vector2(spinbox_x.value, spinbox_y.value)
+
+ #_edited_resource.call(properties[slot_idx][2], vv)
+
+ _undo_redo.create_action("WE: Set Value")
+ _undo_redo.add_do_method(_edited_resource, properties[slot_idx][2], vv)
+ _undo_redo.add_undo_method(_edited_resource, properties[slot_idx][2], _edited_resource.call(properties[slot_idx][1]))
+ _undo_redo.commit_action()
+
+ _ignore_changed_evend = false
+
+func on_vector3_spinbox_value_changed(val : float, slot_idx, spinbox_x, spinbox_y, spinbox_z) -> void:
+ _ignore_changed_evend = true
+ var vv : Vector3 = Vector3(spinbox_x.value, spinbox_y.value, spinbox_z.value)
+
+ #_edited_resource.call(properties[slot_idx][2], vv)
+
+ _undo_redo.create_action("WE: Set Value")
+ _undo_redo.add_do_method(_edited_resource, properties[slot_idx][2], vv)
+ _undo_redo.add_undo_method(_edited_resource, properties[slot_idx][2], _edited_resource.call(properties[slot_idx][1]))
+ _undo_redo.commit_action()
+
+ _ignore_changed_evend = false
+
+func on_rect2_spinbox_value_changed(val : float, slot_idx, spinboxes) -> void:
+ _ignore_changed_evend = true
+ var vv : Rect2 = Rect2(spinboxes[0].value, spinboxes[1].value, spinboxes[2].value, spinboxes[3].value)
+
+ #_edited_resource.call(properties[slot_idx][2], vv)
+
+ _undo_redo.create_action("WE: Set Value")
+ _undo_redo.add_do_method(_edited_resource, properties[slot_idx][2], vv)
+ _undo_redo.add_undo_method(_edited_resource, properties[slot_idx][2], _edited_resource.call(properties[slot_idx][1]))
+ _undo_redo.commit_action()
+
+ _ignore_changed_evend = false
+
+func on_slot_enum_item_selected(val : int, slot_idx : int) -> void:
+ _ignore_changed_evend = true
+ #_edited_resource.call(properties[slot_idx][2], val)
+
+ _undo_redo.create_action("WE: Set Value")
+ _undo_redo.add_do_method(_edited_resource, properties[slot_idx][2], val)
+ _undo_redo.add_undo_method(_edited_resource, properties[slot_idx][2], _edited_resource.call(properties[slot_idx][1]))
+ _undo_redo.commit_action()
+
+ _ignore_changed_evend = false
+
+func on_slot_line_edit_text_entered(text : String, slot_idx : int) -> void:
+ _ignore_changed_evend = true
+ #_edited_resource.call(properties[slot_idx][2], text)
+
+ _undo_redo.create_action("WE: Set Value")
+ _undo_redo.add_do_method(_edited_resource, properties[slot_idx][2], text)
+ _undo_redo.add_undo_method(_edited_resource, properties[slot_idx][2], _edited_resource.call(properties[slot_idx][1]))
+ _undo_redo.commit_action()
+
+ _ignore_changed_evend = false
+
+func on_widget_resource_changed(res : Resource, slot_idx : int) -> void:
+ _ignore_changed_evend = true
+ #_edited_resource.call(properties[slot_idx][2], res)
+
+ _undo_redo.create_action("WE: Set Value")
+ _undo_redo.add_do_method(_edited_resource, properties[slot_idx][2], res)
+ _undo_redo.add_undo_method(_edited_resource, properties[slot_idx][2], _edited_resource.call(properties[slot_idx][1]))
+ _undo_redo.commit_action()
+
+ _ignore_changed_evend = false
+
+func clear() -> void:
+ properties.clear()
+
+ var content_node = $MainContainer/Content
+
+ if !content_node:
+ return
+
+ for c in content_node.get_children():
+ c.queue_free()
+ content_node.remove_child(c)
+
+func refresh() -> void:
+ clear()
+
+ var cls_str : String = "[none]"
+ var script_str : String = "[none]"
+
+ if _edited_resource:
+ cls_str = _edited_resource.get_class()
+
+ var scr = _edited_resource.get_script()
+
+ if scr:
+ script_str = scr.resource_path
+
+ _edited_resource.setup_property_inspector(self)
+
+ $MainContainer/HBoxContainer/ClassLE.text = cls_str
+ $MainContainer/HBoxContainer2/ScriptLE.text = script_str
+
+ _refresh_queued = false
+
+func edit_resource(wgw) -> void:
+ if _edited_resource:
+ _edited_resource.disconnect("changed", self, "on_edited_resource_changed")
+
+ _edited_resource = wgw
+
+ #if !_edited_resource.is_connected("changed", self, "on_edited_resource_changed"):
+ if _edited_resource:
+ _edited_resource.connect("changed", self, "on_edited_resource_changed")
+
+ refresh()
+
+func on_edited_resource_changed() -> void:
+ if _ignore_changed_evend:
+ return
+
+ if _refresh_queued:
+ return
+
+ _refresh_queued = true
+ call_deferred("refresh")
diff --git a/modules/world_generator/addon/ui/ResourcePropertyList.tscn b/modules/world_generator/addon/ui/ResourcePropertyList.tscn
new file mode 100644
index 000000000..b97e3b595
--- /dev/null
+++ b/modules/world_generator/addon/ui/ResourcePropertyList.tscn
@@ -0,0 +1,81 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://addons/world_generator/ui/ResourcePropertyList.gd" type="Script" id=1]
+
+[node name="ResourcePropertyList" type="ScrollContainer"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+rect_min_size = Vector2( 100, 0 )
+scroll_horizontal_enabled = false
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="MainContainer" type="VBoxContainer" parent="."]
+margin_right = 1024.0
+margin_bottom = 90.0
+size_flags_horizontal = 3
+
+[node name="Label" type="Label" parent="MainContainer"]
+margin_right = 1024.0
+margin_bottom = 14.0
+text = "Properties"
+align = 1
+valign = 1
+
+[node name="HSeparator" type="HSeparator" parent="MainContainer"]
+margin_top = 18.0
+margin_right = 1024.0
+margin_bottom = 22.0
+
+[node name="Content" type="VBoxContainer" parent="MainContainer"]
+margin_top = 26.0
+margin_right = 1024.0
+margin_bottom = 26.0
+size_flags_horizontal = 3
+
+[node name="HSeparator2" type="HSeparator" parent="MainContainer"]
+margin_top = 30.0
+margin_right = 1024.0
+margin_bottom = 34.0
+
+[node name="HBoxContainer" type="HBoxContainer" parent="MainContainer"]
+margin_top = 38.0
+margin_right = 1024.0
+margin_bottom = 62.0
+size_flags_horizontal = 3
+
+[node name="Label" type="Label" parent="MainContainer/HBoxContainer"]
+margin_top = 5.0
+margin_right = 37.0
+margin_bottom = 19.0
+text = "Class "
+valign = 1
+
+[node name="ClassLE" type="LineEdit" parent="MainContainer/HBoxContainer"]
+margin_left = 41.0
+margin_right = 1024.0
+margin_bottom = 24.0
+size_flags_horizontal = 3
+editable = false
+
+[node name="HBoxContainer2" type="HBoxContainer" parent="MainContainer"]
+margin_top = 66.0
+margin_right = 1024.0
+margin_bottom = 90.0
+size_flags_horizontal = 3
+
+[node name="Label" type="Label" parent="MainContainer/HBoxContainer2"]
+margin_top = 5.0
+margin_right = 36.0
+margin_bottom = 19.0
+text = "Script"
+valign = 1
+
+[node name="ScriptLE" type="LineEdit" parent="MainContainer/HBoxContainer2"]
+margin_left = 40.0
+margin_right = 1024.0
+margin_bottom = 24.0
+size_flags_horizontal = 3
+editable = false
diff --git a/modules/world_generator/addon/ui/WorldTab.gd b/modules/world_generator/addon/ui/WorldTab.gd
new file mode 100644
index 000000000..ece221287
--- /dev/null
+++ b/modules/world_generator/addon/ui/WorldTab.gd
@@ -0,0 +1,19 @@
+tool
+extends HBoxContainer
+
+var edited_world
+
+func set_plugin(plugin : EditorPlugin) -> void:
+ $HSplitContainer/ResourcePropertyList.set_plugin(plugin)
+ $HSplitContainer/RectEditor.set_plugin(plugin)
+ $VBoxContainer/DataList.set_plugin(plugin)
+
+func refresh() -> void:
+ $HSplitContainer/ResourcePropertyList.edit_resource(edited_world)
+ $VBoxContainer/DataList.set_edited_resource(edited_world)
+ $HSplitContainer/RectEditor.set_edited_resource(edited_world)
+
+func set_wgworld(wgw : WorldGenWorld) -> void:
+ edited_world = wgw
+
+ refresh()
diff --git a/modules/world_generator/addon/ui/tabs/Continent.gd b/modules/world_generator/addon/ui/tabs/Continent.gd
new file mode 100644
index 000000000..c4ec5b04c
--- /dev/null
+++ b/modules/world_generator/addon/ui/tabs/Continent.gd
@@ -0,0 +1,56 @@
+tool
+extends HBoxContainer
+
+var edited_world : WorldGenWorld = null
+var edited_continent : Continent = null
+
+func _ready():
+ var option_button : OptionButton = $HSplitContainer/VBoxContainer/OptionButton
+ option_button.connect("item_selected", self, "on_item_selected")
+
+func set_plugin(plugin : EditorPlugin) -> void:
+ $HSplitContainer/VBoxContainer/HBoxContainer2/ResourcePropertyList.set_plugin(plugin)
+ $HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/DataList.set_plugin(plugin)
+ $HSplitContainer/RectEditor.set_plugin(plugin)
+
+func refresh_continent() -> void:
+ $HSplitContainer/VBoxContainer/HBoxContainer2/ResourcePropertyList.edit_resource(edited_continent)
+ $HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/DataList.set_edited_resource(edited_continent)
+ $HSplitContainer/RectEditor.set_edited_resource(edited_continent)
+
+# if !edited_continent:
+# return
+
+func refresh() -> void:
+ var option_button : OptionButton = $HSplitContainer/VBoxContainer/OptionButton
+ option_button.clear()
+
+ if !edited_world:
+ return
+
+ var content : Array = edited_world.get_content()
+
+ for c in content:
+ if c:
+ option_button.add_item(c.resource_name)
+ option_button.set_item_metadata(option_button.get_item_count() - 1, c)
+
+ if !edited_continent:
+ edited_continent = c
+
+ refresh_continent()
+
+func set_wgworld(wgw : WorldGenWorld) -> void:
+ edited_world = wgw
+
+ refresh()
+
+func set_continent(continent : Continent) -> void:
+ edited_continent = continent
+
+ refresh_continent()
+
+func on_item_selected(idx : int) -> void:
+ var option_button : OptionButton = $HSplitContainer/VBoxContainer/OptionButton
+
+ set_continent(option_button.get_item_metadata(idx))
diff --git a/modules/world_generator/addon/ui/tabs/Continent.tscn b/modules/world_generator/addon/ui/tabs/Continent.tscn
new file mode 100644
index 000000000..8102c2f6e
--- /dev/null
+++ b/modules/world_generator/addon/ui/tabs/Continent.tscn
@@ -0,0 +1,100 @@
+[gd_scene load_steps=5 format=2]
+
+[ext_resource path="res://addons/world_generator/ui/tabs/Continent.gd" type="Script" id=1]
+[ext_resource path="res://addons/world_generator/ui/ResourcePropertyList.tscn" type="PackedScene" id=2]
+[ext_resource path="res://addons/world_generator/ui/DataList.tscn" type="PackedScene" id=3]
+[ext_resource path="res://addons/world_generator/ui/RectEditor.tscn" type="PackedScene" id=4]
+
+[node name="Continent" type="HBoxContainer"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="HSplitContainer" type="HSplitContainer" parent="."]
+margin_right = 1024.0
+margin_bottom = 600.0
+size_flags_horizontal = 3
+
+[node name="RectEditor" parent="HSplitContainer" instance=ExtResource( 4 )]
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 735.0
+margin_bottom = 600.0
+size_flags_horizontal = 3
+
+[node name="VBoxContainer" type="VBoxContainer" parent="HSplitContainer"]
+margin_left = 747.0
+margin_right = 1024.0
+margin_bottom = 600.0
+
+[node name="OptionButton" type="OptionButton" parent="HSplitContainer/VBoxContainer"]
+margin_right = 277.0
+margin_bottom = 20.0
+
+[node name="HBoxContainer2" type="HBoxContainer" parent="HSplitContainer/VBoxContainer"]
+margin_top = 24.0
+margin_right = 277.0
+margin_bottom = 600.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="ResourcePropertyList" parent="HSplitContainer/VBoxContainer/HBoxContainer2" instance=ExtResource( 2 )]
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 100.0
+margin_bottom = 576.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="VBoxContainer" type="VBoxContainer" parent="HSplitContainer/VBoxContainer/HBoxContainer2"]
+margin_left = 104.0
+margin_right = 277.0
+margin_bottom = 576.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="Label" type="Label" parent="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer"]
+margin_right = 173.0
+margin_bottom = 14.0
+text = "Zones"
+align = 1
+valign = 1
+
+[node name="HBoxContainer" type="HBoxContainer" parent="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer"]
+margin_top = 18.0
+margin_right = 173.0
+margin_bottom = 38.0
+
+[node name="AddButton" type="Button" parent="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/HBoxContainer"]
+margin_right = 37.0
+margin_bottom = 20.0
+text = "Add"
+
+[node name="DeleteButton" type="Button" parent="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/HBoxContainer"]
+margin_left = 41.0
+margin_right = 96.0
+margin_bottom = 20.0
+text = "Delete"
+
+[node name="Duplicate" type="Button" parent="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/HBoxContainer"]
+margin_left = 100.0
+margin_right = 173.0
+margin_bottom = 20.0
+text = "Duplicate"
+
+[node name="DataList" parent="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer" instance=ExtResource( 3 )]
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_top = 42.0
+margin_right = 173.0
+margin_bottom = 576.0
+class_types = 1
+
+[connection signal="pressed" from="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/HBoxContainer/AddButton" to="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/DataList" method="add_button_pressed"]
+[connection signal="pressed" from="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/HBoxContainer/DeleteButton" to="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/DataList" method="delete_button_pressed"]
+[connection signal="pressed" from="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/HBoxContainer/Duplicate" to="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/DataList" method="duplicate_button_pressed"]
diff --git a/modules/world_generator/addon/ui/tabs/SubZone.gd b/modules/world_generator/addon/ui/tabs/SubZone.gd
new file mode 100644
index 000000000..5da25cbe7
--- /dev/null
+++ b/modules/world_generator/addon/ui/tabs/SubZone.gd
@@ -0,0 +1,122 @@
+tool
+extends HBoxContainer
+
+var edited_world : WorldGenWorld = null
+var edited_continent : Continent = null
+var edited_zone : Zone = null
+var edited_sub_zone : SubZone = null
+
+func _ready():
+ var coption_button : OptionButton = $VBoxContainer/ContinentOptionButton
+ coption_button.connect("item_selected", self, "on_continent_item_selected")
+
+ var zoption_button : OptionButton = $VBoxContainer/ZoneOptionButton
+ zoption_button.connect("item_selected", self, "on_zone_item_selected")
+
+ var szoption_button : OptionButton = $VBoxContainer/SubZoneOptionButton
+ szoption_button.connect("item_selected", self, "on_sub_zone_item_selected")
+
+func set_plugin(plugin : EditorPlugin) -> void:
+ $VBoxContainer/HBoxContainer2/ResourcePropertyList.set_plugin(plugin)
+
+func continent_changed() -> void:
+ var option_button : OptionButton = $VBoxContainer/ZoneOptionButton
+ option_button.clear()
+ edited_zone = null
+ edited_sub_zone = null
+
+ if !edited_continent:
+ return
+
+ var content : Array = edited_continent.get_content()
+
+ for c in content:
+ if c:
+ option_button.add_item(c.resource_name)
+ option_button.set_item_metadata(option_button.get_item_count() - 1, c)
+
+ if !edited_zone:
+ edited_zone = c
+
+ zone_changed()
+
+func zone_changed() -> void:
+ var option_button : OptionButton = $VBoxContainer/SubZoneOptionButton
+ option_button.clear()
+ edited_sub_zone = null
+
+ if !edited_zone:
+ return
+
+ var content : Array = edited_zone.get_content()
+
+ for c in content:
+ if c:
+ option_button.add_item(c.resource_name)
+ option_button.set_item_metadata(option_button.get_item_count() - 1, c)
+
+ if !edited_sub_zone:
+ edited_sub_zone = c
+
+ sub_zone_changed()
+
+
+func sub_zone_changed() -> void:
+ $VBoxContainer/HBoxContainer2/ResourcePropertyList.edit_resource(edited_sub_zone)
+
+func refresh() -> void:
+ var option_button : OptionButton = $VBoxContainer/ContinentOptionButton
+ option_button.clear()
+
+ if !edited_world:
+ return
+
+ var content : Array = edited_world.get_content()
+
+ for c in content:
+ if c:
+ option_button.add_item(c.resource_name)
+ option_button.set_item_metadata(option_button.get_item_count() - 1, c)
+
+ if !edited_continent:
+ edited_continent = c
+
+ continent_changed()
+
+func set_wgworld(wgw : WorldGenWorld) -> void:
+ edited_world = wgw
+ edited_continent = null
+ edited_zone = null
+
+ refresh()
+
+func set_continent(continent : Continent) -> void:
+ edited_continent = continent
+ edited_zone = null
+
+ continent_changed()
+
+func set_zone(zone : Zone) -> void:
+ edited_zone = zone
+
+ zone_changed()
+
+func set_sub_zone(sub_zone : SubZone) -> void:
+ edited_sub_zone = sub_zone
+
+ sub_zone_changed()
+
+func on_continent_item_selected(idx : int) -> void:
+ var option_button : OptionButton = $VBoxContainer/ContinentOptionButton
+
+ set_continent(option_button.get_item_metadata(idx))
+
+func on_zone_item_selected(idx : int) -> void:
+ var option_button : OptionButton = $VBoxContainer/ZoneOptionButton
+
+ set_zone(option_button.get_item_metadata(idx))
+
+func on_sub_zone_item_selected(idx : int) -> void:
+ var option_button : OptionButton = $VBoxContainer/SubZoneOptionButton
+
+ set_sub_zone(option_button.get_item_metadata(idx))
diff --git a/modules/world_generator/addon/ui/tabs/SubZone.tscn b/modules/world_generator/addon/ui/tabs/SubZone.tscn
new file mode 100644
index 000000000..45d5eb6b2
--- /dev/null
+++ b/modules/world_generator/addon/ui/tabs/SubZone.tscn
@@ -0,0 +1,49 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://addons/world_generator/ui/tabs/SubZone.gd" type="Script" id=1]
+[ext_resource path="res://addons/world_generator/ui/ResourcePropertyList.tscn" type="PackedScene" id=2]
+
+[node name="SubZone" type="HBoxContainer"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="VBoxContainer" type="VBoxContainer" parent="."]
+margin_right = 1024.0
+margin_bottom = 600.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="ContinentOptionButton" type="OptionButton" parent="VBoxContainer"]
+margin_right = 1024.0
+margin_bottom = 20.0
+
+[node name="ZoneOptionButton" type="OptionButton" parent="VBoxContainer"]
+margin_top = 24.0
+margin_right = 1024.0
+margin_bottom = 44.0
+
+[node name="SubZoneOptionButton" type="OptionButton" parent="VBoxContainer"]
+margin_top = 48.0
+margin_right = 1024.0
+margin_bottom = 68.0
+
+[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer"]
+margin_top = 72.0
+margin_right = 1024.0
+margin_bottom = 600.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="ResourcePropertyList" parent="VBoxContainer/HBoxContainer2" instance=ExtResource( 2 )]
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 1024.0
+margin_bottom = 528.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
diff --git a/modules/world_generator/addon/ui/tabs/World.tscn b/modules/world_generator/addon/ui/tabs/World.tscn
new file mode 100644
index 000000000..25260081b
--- /dev/null
+++ b/modules/world_generator/addon/ui/tabs/World.tscn
@@ -0,0 +1,82 @@
+[gd_scene load_steps=5 format=2]
+
+[ext_resource path="res://addons/world_generator/ui/ResourcePropertyList.tscn" type="PackedScene" id=2]
+[ext_resource path="res://addons/world_generator/ui/WorldTab.gd" type="Script" id=5]
+[ext_resource path="res://addons/world_generator/ui/DataList.tscn" type="PackedScene" id=6]
+[ext_resource path="res://addons/world_generator/ui/RectEditor.tscn" type="PackedScene" id=7]
+
+[node name="World" type="HBoxContainer"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = 4.0
+margin_top = 32.0
+margin_right = -4.0
+margin_bottom = -4.0
+script = ExtResource( 5 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="HSplitContainer" type="HSplitContainer" parent="."]
+margin_right = 839.0
+margin_bottom = 564.0
+size_flags_horizontal = 3
+
+[node name="RectEditor" parent="HSplitContainer" instance=ExtResource( 7 )]
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 727.0
+margin_bottom = 564.0
+size_flags_horizontal = 3
+
+[node name="ResourcePropertyList" parent="HSplitContainer" instance=ExtResource( 2 )]
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 739.0
+margin_right = 839.0
+margin_bottom = 564.0
+
+[node name="VBoxContainer" type="VBoxContainer" parent="."]
+margin_left = 843.0
+margin_right = 1016.0
+margin_bottom = 564.0
+
+[node name="Label" type="Label" parent="VBoxContainer"]
+margin_right = 173.0
+margin_bottom = 14.0
+text = "Continents"
+align = 1
+valign = 1
+
+[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"]
+margin_top = 18.0
+margin_right = 173.0
+margin_bottom = 38.0
+
+[node name="AddButton" type="Button" parent="VBoxContainer/HBoxContainer"]
+margin_right = 37.0
+margin_bottom = 20.0
+text = "Add"
+
+[node name="DeleteButton" type="Button" parent="VBoxContainer/HBoxContainer"]
+margin_left = 41.0
+margin_right = 96.0
+margin_bottom = 20.0
+text = "Delete"
+
+[node name="Duplicate" type="Button" parent="VBoxContainer/HBoxContainer"]
+margin_left = 100.0
+margin_right = 173.0
+margin_bottom = 20.0
+text = "Duplicate"
+
+[node name="DataList" parent="VBoxContainer" instance=ExtResource( 6 )]
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_top = 42.0
+margin_right = 173.0
+margin_bottom = 564.0
+
+[connection signal="pressed" from="VBoxContainer/HBoxContainer/AddButton" to="VBoxContainer/DataList" method="add_button_pressed"]
+[connection signal="pressed" from="VBoxContainer/HBoxContainer/DeleteButton" to="VBoxContainer/DataList" method="delete_button_pressed"]
+[connection signal="pressed" from="VBoxContainer/HBoxContainer/Duplicate" to="VBoxContainer/DataList" method="duplicate_button_pressed"]
diff --git a/modules/world_generator/addon/ui/tabs/Zone.gd b/modules/world_generator/addon/ui/tabs/Zone.gd
new file mode 100644
index 000000000..7ea49b799
--- /dev/null
+++ b/modules/world_generator/addon/ui/tabs/Zone.gd
@@ -0,0 +1,92 @@
+tool
+extends HBoxContainer
+
+var edited_world : WorldGenWorld = null
+var edited_continent : Continent = null
+var edited_zone : Zone = null
+
+func _ready():
+ var coption_button : OptionButton = $HSplitContainer/VBoxContainer/ContinentOptionButton
+ coption_button.connect("item_selected", self, "on_continent_item_selected")
+
+ var zoption_button : OptionButton = $HSplitContainer/VBoxContainer/ZoneOptionButton
+ zoption_button.connect("item_selected", self, "on_zone_item_selected")
+
+func set_plugin(plugin : EditorPlugin) -> void:
+ $HSplitContainer/VBoxContainer/HBoxContainer2/ResourcePropertyList.set_plugin(plugin)
+ $HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/DataList.set_plugin(plugin)
+ $HSplitContainer/RectEditor.set_plugin(plugin)
+
+func refresh() -> void:
+ var option_button : OptionButton = $HSplitContainer/VBoxContainer/ContinentOptionButton
+ option_button.clear()
+ edited_continent = null
+ edited_zone = null
+
+ if !edited_world:
+ return
+
+ var content : Array = edited_world.get_content()
+
+ for c in content:
+ if c:
+ option_button.add_item(c.resource_name)
+ option_button.set_item_metadata(option_button.get_item_count() - 1, c)
+
+ if !edited_continent:
+ edited_continent = c
+
+ continent_changed()
+
+func continent_changed() -> void:
+ var option_button : OptionButton = $HSplitContainer/VBoxContainer/ZoneOptionButton
+ option_button.clear()
+ edited_zone = null
+
+ if !edited_continent:
+ return
+
+ var content : Array = edited_continent.get_content()
+
+ for c in content:
+ if c:
+ option_button.add_item(c.resource_name)
+ option_button.set_item_metadata(option_button.get_item_count() - 1, c)
+
+ if !edited_zone:
+ edited_zone = c
+
+ zone_changed()
+
+func zone_changed() -> void:
+ $HSplitContainer/VBoxContainer/HBoxContainer2/ResourcePropertyList.edit_resource(edited_zone)
+ $HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/DataList.set_edited_resource(edited_zone)
+ $HSplitContainer/RectEditor.set_edited_resource(edited_zone)
+
+func set_continent(continent : Continent) -> void:
+ edited_continent = continent
+ edited_zone = null
+
+ continent_changed()
+
+func set_zone(zone : Zone) -> void:
+ edited_zone = zone
+
+ zone_changed()
+
+func set_wgworld(wgw : WorldGenWorld) -> void:
+ edited_world = wgw
+ edited_continent = null
+ edited_zone = null
+
+ refresh()
+
+func on_continent_item_selected(idx : int) -> void:
+ var option_button : OptionButton = $HSplitContainer/VBoxContainer/ContinentOptionButton
+
+ set_continent(option_button.get_item_metadata(idx))
+
+func on_zone_item_selected(idx : int) -> void:
+ var option_button : OptionButton = $HSplitContainer/VBoxContainer/ZoneOptionButton
+
+ set_zone(option_button.get_item_metadata(idx))
diff --git a/modules/world_generator/addon/ui/tabs/Zone.tscn b/modules/world_generator/addon/ui/tabs/Zone.tscn
new file mode 100644
index 000000000..a113ff044
--- /dev/null
+++ b/modules/world_generator/addon/ui/tabs/Zone.tscn
@@ -0,0 +1,105 @@
+[gd_scene load_steps=5 format=2]
+
+[ext_resource path="res://addons/world_generator/ui/tabs/Zone.gd" type="Script" id=1]
+[ext_resource path="res://addons/world_generator/ui/ResourcePropertyList.tscn" type="PackedScene" id=2]
+[ext_resource path="res://addons/world_generator/ui/DataList.tscn" type="PackedScene" id=3]
+[ext_resource path="res://addons/world_generator/ui/RectEditor.tscn" type="PackedScene" id=4]
+
+[node name="Zone" type="HBoxContainer"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="HSplitContainer" type="HSplitContainer" parent="."]
+margin_right = 1024.0
+margin_bottom = 600.0
+size_flags_horizontal = 3
+
+[node name="RectEditor" parent="HSplitContainer" instance=ExtResource( 4 )]
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 735.0
+margin_bottom = 600.0
+size_flags_horizontal = 3
+
+[node name="VBoxContainer" type="VBoxContainer" parent="HSplitContainer"]
+margin_left = 747.0
+margin_right = 1024.0
+margin_bottom = 600.0
+
+[node name="ContinentOptionButton" type="OptionButton" parent="HSplitContainer/VBoxContainer"]
+margin_right = 277.0
+margin_bottom = 20.0
+
+[node name="ZoneOptionButton" type="OptionButton" parent="HSplitContainer/VBoxContainer"]
+margin_top = 24.0
+margin_right = 277.0
+margin_bottom = 44.0
+
+[node name="HBoxContainer2" type="HBoxContainer" parent="HSplitContainer/VBoxContainer"]
+margin_top = 48.0
+margin_right = 277.0
+margin_bottom = 600.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="ResourcePropertyList" parent="HSplitContainer/VBoxContainer/HBoxContainer2" instance=ExtResource( 2 )]
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_right = 100.0
+margin_bottom = 552.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="VBoxContainer" type="VBoxContainer" parent="HSplitContainer/VBoxContainer/HBoxContainer2"]
+margin_left = 104.0
+margin_right = 277.0
+margin_bottom = 552.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="Label" type="Label" parent="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer"]
+margin_right = 173.0
+margin_bottom = 14.0
+text = "Sub Zones"
+align = 1
+valign = 1
+
+[node name="HBoxContainer" type="HBoxContainer" parent="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer"]
+margin_top = 18.0
+margin_right = 173.0
+margin_bottom = 38.0
+
+[node name="AddButton" type="Button" parent="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/HBoxContainer"]
+margin_right = 37.0
+margin_bottom = 20.0
+text = "Add"
+
+[node name="DeleteButton" type="Button" parent="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/HBoxContainer"]
+margin_left = 41.0
+margin_right = 96.0
+margin_bottom = 20.0
+text = "Delete"
+
+[node name="Duplicate" type="Button" parent="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/HBoxContainer"]
+margin_left = 100.0
+margin_right = 173.0
+margin_bottom = 20.0
+text = "Duplicate"
+
+[node name="DataList" parent="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer" instance=ExtResource( 3 )]
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_top = 42.0
+margin_right = 173.0
+margin_bottom = 552.0
+class_types = 2
+
+[connection signal="pressed" from="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/HBoxContainer/AddButton" to="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/DataList" method="add_button_pressed"]
+[connection signal="pressed" from="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/HBoxContainer/DeleteButton" to="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/DataList" method="delete_button_pressed"]
+[connection signal="pressed" from="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/HBoxContainer/Duplicate" to="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/DataList" method="duplicate_button_pressed"]
diff --git a/modules/world_generator/addon/widgets/EditorResourceWidget.gd b/modules/world_generator/addon/widgets/EditorResourceWidget.gd
new file mode 100644
index 000000000..a73924e97
--- /dev/null
+++ b/modules/world_generator/addon/widgets/EditorResourceWidget.gd
@@ -0,0 +1,80 @@
+tool
+extends HBoxContainer
+
+var _resource_type : String = "Resource"
+var _resource : Resource = null
+var _plugin : EditorPlugin = null
+
+signal on_resource_changed(new_res)
+
+func _enter_tree():
+ $ResourceButton.set_drag_forwarding(self)
+
+func set_resource_type(type : String) -> void:
+ _resource_type = type
+
+func set_resource(res : Resource) -> void:
+ if res && !res.is_class(_resource_type):
+ return
+
+ var emit : bool = res != _resource
+
+ _resource = res
+
+ refresh_ui()
+
+ if emit:
+ emit_signal("on_resource_changed", _resource)
+
+func refresh_ui() -> void:
+ if _resource:
+ var text : String = _resource.resource_name
+
+ if text == "":
+ text = _resource.get_class()
+
+ $ResourceButton.text = text
+ else:
+ $ResourceButton.text = "[null]"
+
+func on_clear_button_pressed() -> void:
+ if _resource:
+ set_resource(null)
+
+func on_resource_button_pressed() -> void:
+ if _resource && _plugin:
+ _plugin.get_editor_interface().inspect_object(_resource)
+
+#examples
+#{files:[res://modules/planets/test_planet/test_world.tres], from:@@4176:[Tree:9070], type:files}
+#{from:Button:[Button:917001], resource:[Resource:26180], type:resource}
+
+func can_drop_data_fw(position, data, from_control):
+ return true
+
+func drop_data_fw(position, data, from_control):
+ if data["type"] == "resource":
+ var res : Resource = data["resource"]
+ set_resource(res)
+ elif data["type"] == "files":
+ var files : Array = data["files"]
+
+ for f in files:
+ var res : Resource = load(f)
+ set_resource(res)
+ return
+
+func get_drag_data_fw(position, from_control):
+ if !_resource:
+ return
+
+ var d : Dictionary = Dictionary()
+
+ d["from"] = self
+ d["resource"] = _resource
+ d["type"] = "resource"
+
+ return d
+
+func set_plugin(plugin : EditorPlugin) -> void:
+ _plugin = plugin
diff --git a/modules/world_generator/addon/widgets/EditorResourceWidget.tscn b/modules/world_generator/addon/widgets/EditorResourceWidget.tscn
new file mode 100644
index 000000000..f5f3bfefd
--- /dev/null
+++ b/modules/world_generator/addon/widgets/EditorResourceWidget.tscn
@@ -0,0 +1,23 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://addons/world_generator/widgets/EditorResourceWidget.gd" type="Script" id=1]
+
+[node name="EditorResourceWidget" type="HBoxContainer"]
+margin_right = 376.0
+margin_bottom = 40.0
+script = ExtResource( 1 )
+
+[node name="ResourceButton" type="Button" parent="."]
+margin_right = 342.0
+margin_bottom = 40.0
+size_flags_horizontal = 3
+
+[node name="Clear" type="Button" parent="."]
+margin_left = 346.0
+margin_right = 376.0
+margin_bottom = 40.0
+rect_min_size = Vector2( 30, 0 )
+text = "X"
+
+[connection signal="pressed" from="ResourceButton" to="." method="on_resource_button_pressed"]
+[connection signal="pressed" from="Clear" to="." method="on_clear_button_pressed"]
diff --git a/modules/world_generator/addon/widgets/EditorZoomWidget.gd b/modules/world_generator/addon/widgets/EditorZoomWidget.gd
new file mode 100644
index 000000000..c0579b6c0
--- /dev/null
+++ b/modules/world_generator/addon/widgets/EditorZoomWidget.gd
@@ -0,0 +1,218 @@
+tool
+extends HBoxContainer
+
+#This is a port of godot 4.0's EditorZoomWidget
+
+#/*************************************************************************/
+#/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
+#/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
+#/* */
+#/* Permission is hereby granted, free of charge, to any person obtaining */
+#/* a copy of this software and associated documentation files (the */
+#/* "Software"), to deal in the Software without restriction, including */
+#/* without limitation the rights to use, copy, modify, merge, publish, */
+#/* distribute, sublicense, and/or sell copies of the Software, and to */
+#/* permit persons to whom the Software is furnished to do so, subject to */
+#/* the following conditions: */
+#/* */
+#/* The above copyright notice and this permission notice shall be */
+#/* included in all copies or substantial portions of the Software. */
+#/* */
+#/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+#/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+#/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+#/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+#/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+#/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+#/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+#/*************************************************************************/
+
+var zoom_minus : Button
+var zoom_reset : Button
+var zoom_plus : Button
+
+var EDSCALE : float = 1
+
+export(float) var zoom : float = 1.0 setget set_zoom, get_zoom
+
+signal zoom_changed(zoom)
+
+func _init() -> void:
+ # Zoom buttons
+ zoom_minus = Button.new()
+ zoom_minus.set_flat(true)
+ add_child(zoom_minus)
+ zoom_minus.connect("pressed", self, "_button_zoom_minus")
+ zoom_minus.set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_minus", tr("Zoom Out"), KEY_MASK_CMD | KEY_MINUS))
+ zoom_minus.set_focus_mode(FOCUS_NONE)
+
+ zoom_reset = Button.new()
+ zoom_reset.set_flat(true)
+ add_child(zoom_reset)
+ zoom_reset.add_constant_override("outline_size", 1)
+ zoom_reset.add_color_override("font_outline_color", Color(0, 0, 0))
+ zoom_reset.add_color_override("font_color", Color(1, 1, 1))
+ zoom_reset.connect("pressed", self, "_button_zoom_reset")
+ zoom_reset.set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_reset", tr("Zoom Reset"), KEY_MASK_CMD | KEY_0))
+ zoom_reset.set_focus_mode(FOCUS_NONE)
+ #Prevent the button's size from changing when the text size changes
+ zoom_reset.set_custom_minimum_size(Vector2(75, 0))
+
+ zoom_plus = Button.new()
+ zoom_plus.set_flat(true)
+ add_child(zoom_plus)
+ zoom_plus.connect("pressed", self, "_button_zoom_plus")
+ zoom_plus.set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_plus", tr("Zoom In"), KEY_MASK_CMD | KEY_EQUAL)) # Usually direct access key for PLUS
+ zoom_plus.set_focus_mode(FOCUS_NONE)
+
+ _update_zoom_label()
+
+ add_constant_override("separation", round(-8))
+
+func get_zoom() -> float:
+ return zoom
+
+func set_zoom(p_zoom : float) -> void:
+ if (p_zoom > 0 && p_zoom != zoom):
+ zoom = p_zoom;
+ _update_zoom_label();
+
+func set_zoom_by_increments(p_increment_count : int, p_integer_only : bool) -> void:
+ # Remove editor scale from the index computation.
+ var zoom_noscale : float = zoom / max(1, EDSCALE)
+ var CMP_EPSILON : float = 0.00001
+
+ if (p_integer_only):
+ # Only visit integer scaling factors above 100%, and fractions with an integer denominator below 100%
+ # (1/2 = 50%, 1/3 = 33.33%, 1/4 = 25%, …).
+ # This is useful when working on pixel art projects to avoid distortion.
+ # This algorithm is designed to handle fractional start zoom values correctly
+ # (e.g. 190% will zoom up to 200% and down to 100%).
+ if (zoom_noscale + p_increment_count * 0.001 >= 1.0 - CMP_EPSILON):
+ # New zoom is certain to be above 100%.
+ if (p_increment_count >= 1):
+ # Zooming.
+ set_zoom(floor(zoom_noscale + p_increment_count) * max(1, EDSCALE))
+ else:
+ # Dezooming.
+ set_zoom(ceil(zoom_noscale + p_increment_count) * max(1, EDSCALE))
+ else:
+ if (p_increment_count >= 1):
+ # Zooming. Convert the current zoom into a denominator.
+ var new_zoom : float = 1.0 / ceil(1.0 / zoom_noscale - p_increment_count)
+ if (is_equal_approx(zoom_noscale, new_zoom)):
+ # New zoom is identical to the old zoom, so try again.
+ # This can happen due to floating-point precision issues.
+ new_zoom = 1.0 / ceil(1.0 / zoom_noscale - p_increment_count - 1)
+
+ set_zoom(new_zoom * max(1, EDSCALE));
+ else:
+ # Dezooming. Convert the current zoom into a denominator.
+ var new_zoom : float = 1.0 / floor(1.0 / zoom_noscale - p_increment_count)
+ if (is_equal_approx(zoom_noscale, new_zoom)):
+ # New zoom is identical to the old zoom, so try again.
+ # This can happen due to floating-point precision issues.
+ new_zoom = 1.0 / floor(1.0 / zoom_noscale - p_increment_count + 1)
+
+ set_zoom(new_zoom * max(1, EDSCALE))
+ else:
+ # Base increment factor defined as the twelveth root of two.
+ # This allow a smooth geometric evolution of the zoom, with the advantage of
+ # visiting all integer power of two scale factors.
+ # note: this is analogous to the 'semitones' interval in the music world
+ # In order to avoid numerical imprecisions, we compute and edit a zoom index
+ # with the following relation: zoom = 2 ^ (index / 12)
+
+ if (zoom < CMP_EPSILON || p_increment_count == 0):
+ return
+
+ # zoom = 2**(index/12) => log2(zoom) = index/12
+ var closest_zoom_index : float = round(log(zoom_noscale) * 12.0 / log(2.0))
+
+ var new_zoom_index : float = closest_zoom_index + p_increment_count
+ var new_zoom : float = pow(2.0, new_zoom_index / 12.0)
+
+ # Restore Editor scale transformation
+ new_zoom *= max(1, EDSCALE)
+
+ set_zoom(new_zoom)
+
+
+func _update_zoom_label() -> void:
+ var zoom_text : String = ""
+
+ # The zoom level displayed is relative to the editor scale
+ # (like in most image editors). Its lower bound is clamped to 1 as some people
+ # lower the editor scale to increase the available real estate,
+ # even if their display doesn't have a particularly low DPI.
+
+ if (zoom >= 10):
+ # Don't show a decimal when the zoom level is higher than 1000 %.
+ #zoom_text = (rtos(round((zoom / max(1, EDSCALE)) * 100))) + " %"
+ zoom_text = (String(round((zoom / max(1, EDSCALE)) * 100))) + " %"
+ else:
+ var v : float = (zoom / max(1, EDSCALE)) * 100
+ var val : float = floor(v / 0.1 + 0.5) * 0.1
+
+# zoom_text = (rtos(val)) + " %"
+ zoom_text = (String(val)) + " %"
+
+ zoom_reset.set_text(zoom_text)
+
+func _button_zoom_minus() -> void:
+ set_zoom_by_increments(-6, Input.is_key_pressed(KEY_ALT));
+ emit_signal("zoom_changed", zoom);
+
+func _button_zoom_reset() -> void:
+ set_zoom(1.0 * max(1, EDSCALE));
+ emit_signal("zoom_changed", zoom);
+
+func _button_zoom_plus() -> void:
+ set_zoom_by_increments(6, Input.is_key_pressed(KEY_ALT));
+ emit_signal("zoom_changed", zoom);
+
+func _notification(p_what : int) -> void:
+ if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED):
+ zoom_minus.icon = get_icon("ZoomLess", "EditorIcons")
+ zoom_plus.icon = get_icon("ZoomMore", "EditorIcons")
+
+#from godot editor/editor_Settings.cpp
+func ED_SHORTCUT(p_path : String, p_name : String, p_keycode : int, editor_settings : EditorSettings = null) -> ShortCut:
+ if OS.get_name() == "OSX":
+ # Use Cmd+Backspace as a general replacement for Delete shortcuts on macOS
+ if (p_keycode == KEY_DELETE):
+ p_keycode = KEY_MASK_CMD | KEY_BACKSPACE
+
+ var ie : InputEventKey = null
+ if (p_keycode):
+ ie = InputEventKey.new()
+
+ ie.set_unicode(p_keycode & KEY_CODE_MASK)
+ ie.set_scancode(p_keycode & KEY_CODE_MASK)
+ ie.set_shift(bool(p_keycode & KEY_MASK_SHIFT))
+ ie.set_alt(bool(p_keycode & KEY_MASK_ALT))
+ ie.set_control(bool(p_keycode & KEY_MASK_CTRL))
+ ie.set_metakey(bool(p_keycode & KEY_MASK_META))
+
+ if (!editor_settings):
+ var sc : ShortCut
+ sc = ShortCut.new()
+ sc.set_name(p_name)
+ sc.set_shortcut(ie)
+ sc.set_meta("original", ie)
+ return sc
+
+ var sc : ShortCut = editor_settings.get_shortcut(p_path)
+ if (sc.is_valid()):
+ sc.set_name(p_name); #keep name (the ones that come from disk have no name)
+ sc.set_meta("original", ie); #to compare against changes
+ return sc;
+
+ sc = ShortCut.new()
+ sc.set_name(p_name)
+ sc.set_shortcut(ie)
+ sc.set_meta("original", ie) #to compare against changes
+ editor_settings.add_shortcut(p_path, sc)
+
+ return sc
+
diff --git a/modules/world_generator/addon/widgets/EditorZoomWidget.tscn b/modules/world_generator/addon/widgets/EditorZoomWidget.tscn
new file mode 100644
index 000000000..5de87a918
--- /dev/null
+++ b/modules/world_generator/addon/widgets/EditorZoomWidget.tscn
@@ -0,0 +1,8 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://addons/world_generator/widgets/EditorZoomWidget.gd" type="Script" id=1]
+
+[node name="EditorZoomWidget" type="HBoxContainer"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+script = ExtResource( 1 )