From e7e2d0439dea0fb3a568378554c81e0a17348a84 Mon Sep 17 00:00:00 2001 From: Daelon Suzuka Date: Wed, 6 Dec 2023 09:53:10 -0500 Subject: [PATCH] Various QoL Improvements (#529) * Updated Godot icons (and removed old ones) * Improve "Debug Pinned Scene" command by making the pinned scene persist between VSCode sessions * Fix scene file highlighting not working * Fix ScenePreview not working in Godot 3 * Add buttons for relevant actions to ScenePreview items * Add internal document links for SubResource() and ExtResource() statements in scene files * Add hover for SubResource() and ExtResource() statements in scene files * Improve ability to right click -> open docs for methods of builtin types (doesn't always work) * Add a file decorator to show the pinned debug file in the filesystem view/editor tabs * Add item decorators to the Scene Preview to show Node attributes more clearly * Updated readme * Overhauled documentation viewer * Added GDScript formatter * Add (disabled) experimental providers for custom completions, semantic tokens, and tasks * Lots of internal refactoring --- .gitignore | 5 - .vscode-test.js | 9 + .vscode/launch.json | 5 +- .vscodeignore | 5 +- CONTRIBUTING.md | 39 + README.md | 159 +- configurations/gdresource-configuration.json | 24 - .../gdresource.language-configuration.json | 24 + configurations/gdscript-configuration.json | 82 - .../gdscript.language-configuration.json | 40 + configurations/gdshader-configuration.json | 25 - .../gdshader.language-configuration.json | 25 + img/hover-extresource.png | Bin 0 -> 9337 bytes img/hover-subresource.png | Bin 0 -> 18073 bytes img/scene-preview.png | Bin 0 -> 146987 bytes media/docs.css | 24 + media/pagemap.js | 349 ++++ media/prism.css | 128 ++ package-lock.json | 1421 ++++++++++++++- package.json | 240 ++- .../dark/icon_GUI_visibility_visible.svg | 3 - resources/dark/icon_a_r_v_r_anchor.svg | 3 - resources/dark/icon_a_r_v_r_camera.svg | 3 - resources/dark/icon_a_r_v_r_controller.svg | 3 - resources/dark/icon_a_r_v_r_origin.svg | 3 - resources/dark/icon_accept_dialog.svg | 3 - resources/dark/icon_animated_sprite.svg | 7 - resources/dark/icon_animated_sprite_3d.svg | 7 - resources/dark/icon_animation_player.svg | 3 - resources/dark/icon_animation_tree.svg | 3 - resources/dark/icon_animation_tree_player.svg | 3 - resources/dark/icon_area.svg | 3 - resources/dark/icon_area_2d.svg | 3 - resources/dark/icon_audio_stream_player.svg | 11 - .../dark/icon_audio_stream_player_2_d.svg | 11 - .../dark/icon_audio_stream_player_3_d.svg | 11 - resources/dark/icon_back_buffer_copy.svg | 3 - resources/dark/icon_baked_lightmap.svg | 3 - resources/dark/icon_bone_2_d.svg | 3 - resources/dark/icon_bone_attachment.svg | 3 - resources/dark/icon_button.svg | 3 - resources/dark/icon_c_p_u_particles.svg | 3 - resources/dark/icon_c_p_u_particles_2_d.svg | 3 - resources/dark/icon_camera.svg | 3 - resources/dark/icon_camera_2d.svg | 3 - resources/dark/icon_canvas_layer.svg | 3 - resources/dark/icon_canvas_modulate.svg | 10 - resources/dark/icon_center_container.svg | 3 - resources/dark/icon_check_box.svg | 3 - resources/dark/icon_check_button.svg | 3 - resources/dark/icon_clipped_camera.svg | 3 - resources/dark/icon_collision_polygon.svg | 3 - resources/dark/icon_collision_polygon_2d.svg | 3 - resources/dark/icon_collision_shape.svg | 3 - resources/dark/icon_collision_shape_2d.svg | 3 - resources/dark/icon_color_picker.svg | 3 - resources/dark/icon_color_picker_button.svg | 3 - resources/dark/icon_color_rect.svg | 10 - resources/dark/icon_cone_twist_joint.svg | 3 - resources/dark/icon_confirmation_dialog.svg | 3 - resources/dark/icon_container.svg | 3 - resources/dark/icon_control.svg | 3 - .../dark/icon_damped_spring_joint_2d.svg | 6 - resources/dark/icon_directional_light.svg | 3 - resources/dark/icon_file_dialog.svg | 3 - resources/dark/icon_g_i_probe.svg | 3 - resources/dark/icon_generic_6_d_o_f_joint.svg | 3 - resources/dark/icon_graph_edit.svg | 6 - resources/dark/icon_graph_node.svg | 6 - resources/dark/icon_grid_container.svg | 3 - resources/dark/icon_groove_joint_2d.svg | 3 - resources/dark/icon_h_box_container.svg | 3 - resources/dark/icon_h_scroll_bar.svg | 3 - resources/dark/icon_h_separator.svg | 3 - resources/dark/icon_h_slider.svg | 3 - resources/dark/icon_h_split_container.svg | 3 - resources/dark/icon_h_t_t_p_request.svg | 3 - resources/dark/icon_hinge_joint.svg | 3 - resources/dark/icon_immediate_geometry.svg | 3 - resources/dark/icon_interpolated_camera.svg | 3 - resources/dark/icon_item_list.svg | 3 - resources/dark/icon_kinematic_body.svg | 3 - resources/dark/icon_kinematic_body_2d.svg | 3 - resources/dark/icon_label.svg | 3 - resources/dark/icon_light_2d.svg | 3 - resources/dark/icon_light_occluder_2d.svg | 3 - resources/dark/icon_line_2d.svg | 3 - resources/dark/icon_line_edit.svg | 3 - resources/dark/icon_link_button.svg | 3 - resources/dark/icon_listener.svg | 3 - resources/dark/icon_margin_container.svg | 6 - resources/dark/icon_menu_button.svg | 3 - resources/dark/icon_mesh_instance.svg | 3 - resources/dark/icon_mesh_instance_2d.svg | 3 - resources/dark/icon_multi_mesh_instance.svg | 3 - .../dark/icon_multi_mesh_instance_2d.svg | 4 - resources/dark/icon_navigation.svg | 3 - resources/dark/icon_navigation_2d.svg | 3 - .../dark/icon_navigation_mesh_instance.svg | 3 - .../dark/icon_navigation_polygon_instance.svg | 6 - resources/dark/icon_nine_patch_rect.svg | 14 - resources/dark/icon_node.svg | 3 - resources/dark/icon_node_2d.svg | 3 - resources/dark/icon_omni_light.svg | 3 - resources/dark/icon_option_button.svg | 6 - resources/dark/icon_panel.svg | 3 - resources/dark/icon_panel_container.svg | 3 - resources/dark/icon_parallax_background.svg | 6 - resources/dark/icon_parallax_layer.svg | 6 - resources/dark/icon_particles.svg | 3 - resources/dark/icon_particles_2d.svg | 3 - resources/dark/icon_path.svg | 3 - resources/dark/icon_path_2d.svg | 3 - resources/dark/icon_path_follow.svg | 3 - resources/dark/icon_path_follow_2d.svg | 3 - resources/dark/icon_physical_bone.svg | 8 - resources/dark/icon_pin_joint.svg | 3 - resources/dark/icon_pin_joint_2d.svg | 3 - resources/dark/icon_polygon_2_d.svg | 3 - resources/dark/icon_popup.svg | 3 - resources/dark/icon_popup_dialog.svg | 3 - resources/dark/icon_popup_menu.svg | 3 - resources/dark/icon_popup_panel.svg | 3 - resources/dark/icon_position_2d.svg | 3 - resources/dark/icon_position_3d.svg | 3 - resources/dark/icon_progress_bar.svg | 3 - resources/dark/icon_ray_cast.svg | 3 - resources/dark/icon_ray_cast_2d.svg | 3 - resources/dark/icon_reference_rect.svg | 3 - resources/dark/icon_reflection_probe.svg | 3 - resources/dark/icon_remote_transform.svg | 3 - resources/dark/icon_remote_transform_2d.svg | 3 - resources/dark/icon_resource_preloader.svg | 3 - resources/dark/icon_rich_text_label.svg | 3 - resources/dark/icon_rigid_body.svg | 3 - resources/dark/icon_rigid_body_2d.svg | 3 - resources/dark/icon_scroll_container.svg | 3 - resources/dark/icon_skeleton.svg | 3 - resources/dark/icon_skeleton_2d.svg | 3 - resources/dark/icon_skeleton_i_k.svg | 3 - resources/dark/icon_slider_joint.svg | 3 - resources/dark/icon_soft_body.svg | 3 - resources/dark/icon_spatial.svg | 3 - resources/dark/icon_spin_box.svg | 3 - resources/dark/icon_spot_light.svg | 3 - resources/dark/icon_spring_arm.svg | 8 - resources/dark/icon_sprite.svg | 3 - resources/dark/icon_sprite_3d.svg | 3 - resources/dark/icon_static_body.svg | 3 - resources/dark/icon_static_body_2d.svg | 6 - resources/dark/icon_tab_container.svg | 3 - resources/dark/icon_tabs.svg | 3 - resources/dark/icon_text_edit.svg | 6 - resources/dark/icon_texture_button.svg | 3 - resources/dark/icon_texture_progress.svg | 8 - resources/dark/icon_texture_rect.svg | 3 - resources/dark/icon_tile_map.svg | 3 - resources/dark/icon_timer.svg | 3 - resources/dark/icon_tool_button.svg | 3 - resources/dark/icon_touch_screen_button.svg | 3 - resources/dark/icon_tree.svg | 3 - resources/dark/icon_tween.svg | 3 - resources/dark/icon_v_box_container.svg | 3 - resources/dark/icon_v_scroll_bar.svg | 3 - resources/dark/icon_v_separator.svg | 3 - resources/dark/icon_v_slider.svg | 3 - resources/dark/icon_v_split_container.svg | 3 - resources/dark/icon_vehicle_body.svg | 3 - resources/dark/icon_vehicle_wheel.svg | 3 - resources/dark/icon_video_player.svg | 3 - resources/dark/icon_viewport.svg | 3 - resources/dark/icon_viewport_container.svg | 3 - resources/dark/icon_visibility_enabler.svg | 3 - resources/dark/icon_visibility_enabler_2d.svg | 3 - resources/dark/icon_visibility_notifier.svg | 3 - .../dark/icon_visibility_notifier_2d.svg | 3 - resources/dark/icon_window_dialog.svg | 3 - resources/dark/icon_world_environment.svg | 6 - resources/dark/icon_y_sort.svg | 3 - resources/godot_icons/dark/AcceptDialog.svg | 2 +- .../godot_icons/dark/AnimatableBody2D.svg | 2 +- .../godot_icons/dark/AnimatableBody3D.svg | 2 +- .../godot_icons/dark/AnimatedSprite2D.svg | 2 +- .../godot_icons/dark/AnimatedSprite3D.svg | 2 +- .../godot_icons/dark/AnimatedTexture.svg | 2 +- resources/godot_icons/dark/Animation.svg | 2 +- .../godot_icons/dark/AnimationLibrary.svg | 2 +- .../godot_icons/dark/AnimationPlayer.svg | 2 +- resources/godot_icons/dark/AnimationTree.svg | 2 +- resources/godot_icons/dark/Area2D.svg | 2 +- resources/godot_icons/dark/Area3D.svg | 2 +- resources/godot_icons/dark/ArrayMesh.svg | 2 +- .../godot_icons/dark/ArrayOccluder3D.svg | 2 +- resources/godot_icons/dark/ArrowDown.svg | 1 + resources/godot_icons/dark/ArrowLeft.svg | 1 + resources/godot_icons/dark/ArrowRight.svg | 1 + resources/godot_icons/dark/ArrowUp.svg | 1 + .../godot_icons/dark/AspectRatioContainer.svg | 2 +- resources/godot_icons/dark/AtlasTexture.svg | 2 +- .../godot_icons/dark/AudioListener2D.svg | 2 +- .../godot_icons/dark/AudioListener3D.svg | 2 +- .../godot_icons/dark/AudioStreamPlayer.svg | 2 +- .../godot_icons/dark/AudioStreamPlayer2D.svg | 2 +- .../godot_icons/dark/AudioStreamPlayer3D.svg | 2 +- .../dark/AudioStreamPolyphonic.svg | 1 + resources/godot_icons/dark/AudioStreamWAV.svg | 2 +- resources/godot_icons/dark/Bone2D.svg | 2 +- .../godot_icons/dark/BoneAttachment3D.svg | 2 +- resources/godot_icons/dark/BoxContainer.svg | 2 +- resources/godot_icons/dark/BoxMesh.svg | 2 +- resources/godot_icons/dark/BoxOccluder3D.svg | 2 +- resources/godot_icons/dark/BoxShape3D.svg | 2 +- resources/godot_icons/dark/Button.svg | 2 +- resources/godot_icons/dark/ButtonGroup.svg | 2 +- resources/godot_icons/dark/CPUParticles2D.svg | 2 +- resources/godot_icons/dark/CPUParticles3D.svg | 2 +- resources/godot_icons/dark/CSGBox3D.svg | 2 +- resources/godot_icons/dark/CSGCombiner3D.svg | 2 +- resources/godot_icons/dark/CSGCylinder3D.svg | 2 +- resources/godot_icons/dark/CSGMesh3D.svg | 2 +- resources/godot_icons/dark/CSGPolygon3D.svg | 2 +- resources/godot_icons/dark/CSGSphere3D.svg | 2 +- resources/godot_icons/dark/CSGTorus3D.svg | 2 +- resources/godot_icons/dark/CSharpScript.svg | 2 +- resources/godot_icons/dark/Camera2D.svg | 2 +- resources/godot_icons/dark/Camera3D.svg | 2 +- .../dark/CameraAttributesPhysical.svg | 1 + .../dark/CameraAttributesPractical.svg | 1 + resources/godot_icons/dark/CameraTexture.svg | 2 +- resources/godot_icons/dark/CanvasGroup.svg | 2 +- .../godot_icons/dark/CanvasItemMaterial.svg | 2 +- resources/godot_icons/dark/CanvasLayer.svg | 2 +- resources/godot_icons/dark/CanvasModulate.svg | 2 +- resources/godot_icons/dark/CanvasTexture.svg | 1 + resources/godot_icons/dark/CapsuleMesh.svg | 2 +- resources/godot_icons/dark/CapsuleShape2D.svg | 2 +- resources/godot_icons/dark/CapsuleShape3D.svg | 2 +- .../godot_icons/dark/CharacterBody2D.svg | 2 +- .../godot_icons/dark/CharacterBody3D.svg | 2 +- resources/godot_icons/dark/CheckBox.svg | 2 +- resources/godot_icons/dark/CircleShape2D.svg | 2 +- resources/godot_icons/dark/CodeEdit.svg | 2 +- .../godot_icons/dark/CodeHighlighter.svg | 1 + .../godot_icons/dark/CollisionPolygon2D.svg | 2 +- .../godot_icons/dark/CollisionPolygon3D.svg | 2 +- .../godot_icons/dark/CollisionShape2D.svg | 2 +- .../godot_icons/dark/CollisionShape3D.svg | 2 +- resources/godot_icons/dark/ColorPicker.svg | 2 +- .../godot_icons/dark/ColorPickerButton.svg | 2 +- resources/godot_icons/dark/ColorRect.svg | 2 +- .../godot_icons/dark/CompressedTexture2D.svg | 2 +- .../godot_icons/dark/CompressedTexture3D.svg | 1 + .../dark/ConcavePolygonShape2D.svg | 2 +- .../dark/ConcavePolygonShape3D.svg | 2 +- .../godot_icons/dark/ConeTwistJoint3D.svg | 2 +- .../godot_icons/dark/ConfirmationDialog.svg | 2 +- resources/godot_icons/dark/Container.svg | 2 +- resources/godot_icons/dark/Control.svg | 2 +- .../godot_icons/dark/ConvexPolygonShape2D.svg | 2 +- .../godot_icons/dark/ConvexPolygonShape3D.svg | 2 +- resources/godot_icons/dark/Curve.svg | 2 +- resources/godot_icons/dark/Curve2D.svg | 2 +- resources/godot_icons/dark/Curve3D.svg | 2 +- resources/godot_icons/dark/CurveTexture.svg | 2 +- .../godot_icons/dark/CurveXYZTexture.svg | 1 + resources/godot_icons/dark/CylinderMesh.svg | 2 +- .../godot_icons/dark/CylinderShape3D.svg | 2 +- .../godot_icons/dark/DampedSpringJoint2D.svg | 2 +- resources/godot_icons/dark/Decal.svg | 2 +- .../godot_icons/dark/DirectionalLight2D.svg | 2 +- .../godot_icons/dark/DirectionalLight3D.svg | 2 +- resources/godot_icons/dark/Edit.svg | 1 + resources/godot_icons/dark/Environment.svg | 2 +- resources/godot_icons/dark/FileDialog.svg | 2 +- resources/godot_icons/dark/FlowContainer.svg | 2 +- resources/godot_icons/dark/FogMaterial.svg | 2 +- resources/godot_icons/dark/FogVolume.svg | 2 +- resources/godot_icons/dark/FontFile.svg | 2 +- resources/godot_icons/dark/FontVariation.svg | 2 +- resources/godot_icons/dark/GDScript.svg | 2 +- resources/godot_icons/dark/GPUParticles2D.svg | 2 +- resources/godot_icons/dark/GPUParticles3D.svg | 2 +- .../dark/GPUParticlesAttractorBox3D.svg | 2 +- .../dark/GPUParticlesAttractorSphere3D.svg | 2 +- .../GPUParticlesAttractorVectorField3D.svg | 2 +- .../dark/GPUParticlesCollisionBox3D.svg | 2 +- .../dark/GPUParticlesCollisionSDF3D.svg | 2 +- .../dark/GPUParticlesCollisionSphere3D.svg | 2 +- .../godot_icons/dark/Generic6DOFJoint3D.svg | 2 +- resources/godot_icons/dark/Gradient.svg | 2 +- .../godot_icons/dark/GradientTexture1D.svg | 2 +- .../godot_icons/dark/GradientTexture2D.svg | 2 +- resources/godot_icons/dark/GraphEdit.svg | 2 +- resources/godot_icons/dark/GraphElement.svg | 1 + resources/godot_icons/dark/GraphNode.svg | 2 +- resources/godot_icons/dark/GridContainer.svg | 2 +- resources/godot_icons/dark/GridMap.svg | 2 +- resources/godot_icons/dark/GrooveJoint2D.svg | 2 +- .../godot_icons/dark/GuiVisibilityHidden.svg | 1 + .../godot_icons/dark/GuiVisibilityVisible.svg | 1 + .../godot_icons/dark/GuiVisibilityXray.svg | 1 + resources/godot_icons/dark/HBoxContainer.svg | 2 +- resources/godot_icons/dark/HFlowContainer.svg | 2 +- resources/godot_icons/dark/HScrollBar.svg | 2 +- resources/godot_icons/dark/HSeparator.svg | 2 +- resources/godot_icons/dark/HSlider.svg | 2 +- .../godot_icons/dark/HSplitContainer.svg | 2 +- .../godot_icons/dark/HeightMapShape3D.svg | 2 +- resources/godot_icons/dark/Help.svg | 1 + resources/godot_icons/dark/HelpSearch.svg | 1 + resources/godot_icons/dark/HingeJoint3D.svg | 2 +- resources/godot_icons/dark/ImageTexture.svg | 2 +- resources/godot_icons/dark/ImageTexture3D.svg | 1 + resources/godot_icons/dark/ImmediateMesh.svg | 2 +- resources/godot_icons/dark/ImportCheck.svg | 1 + resources/godot_icons/dark/ImportFail.svg | 1 + .../dark/ImporterMeshInstance3D.svg | 2 +- resources/godot_icons/dark/Info.svg | 1 + resources/godot_icons/dark/ItemList.svg | 2 +- resources/godot_icons/dark/Label.svg | 2 +- resources/godot_icons/dark/Label3D.svg | 2 +- resources/godot_icons/dark/LabelSettings.svg | 2 +- .../godot_icons/dark/LightOccluder2D.svg | 2 +- resources/godot_icons/dark/LightmapProbe.svg | 2 +- resources/godot_icons/dark/Line2D.svg | 2 +- resources/godot_icons/dark/LineEdit.svg | 2 +- resources/godot_icons/dark/LinkButton.svg | 2 +- resources/godot_icons/dark/Lock.svg | 1 + .../godot_icons/dark/MarginContainer.svg | 2 +- resources/godot_icons/dark/MeshInstance2D.svg | 2 +- resources/godot_icons/dark/MeshInstance3D.svg | 2 +- resources/godot_icons/dark/MeshLibrary.svg | 2 +- resources/godot_icons/dark/MeshTexture.svg | 2 +- resources/godot_icons/dark/MultiMesh.svg | 2 +- .../godot_icons/dark/MultiMeshInstance2D.svg | 2 +- .../godot_icons/dark/MultiMeshInstance3D.svg | 2 +- .../godot_icons/dark/NavigationAgent2D.svg | 2 +- .../godot_icons/dark/NavigationAgent3D.svg | 2 +- .../godot_icons/dark/NavigationLink2D.svg | 5 +- .../godot_icons/dark/NavigationLink3D.svg | 5 +- .../godot_icons/dark/NavigationObstacle2D.svg | 2 +- .../godot_icons/dark/NavigationObstacle3D.svg | 2 +- .../godot_icons/dark/NavigationPolygon.svg | 2 +- .../godot_icons/dark/NavigationRegion2D.svg | 2 +- .../godot_icons/dark/NavigationRegion3D.svg | 2 +- resources/godot_icons/dark/NinePatchRect.svg | 2 +- resources/godot_icons/dark/Node.svg | 2 +- resources/godot_icons/dark/Node2D.svg | 2 +- resources/godot_icons/dark/Node3D.svg | 2 +- resources/godot_icons/dark/NoiseTexture2D.svg | 1 + resources/godot_icons/dark/NoiseTexture3D.svg | 1 + resources/godot_icons/dark/ORMMaterial3D.svg | 2 +- resources/godot_icons/dark/Object.svg | 2 +- .../godot_icons/dark/OccluderInstance3D.svg | 2 +- .../godot_icons/dark/OccluderPolygon2D.svg | 2 +- resources/godot_icons/dark/OmniLight3D.svg | 2 +- resources/godot_icons/dark/OptionButton.svg | 2 +- resources/godot_icons/dark/PackedScene.svg | 2 +- resources/godot_icons/dark/Panel.svg | 2 +- resources/godot_icons/dark/PanelContainer.svg | 2 +- .../godot_icons/dark/PanoramaSkyMaterial.svg | 2 +- .../godot_icons/dark/ParallaxBackground.svg | 2 +- resources/godot_icons/dark/ParallaxLayer.svg | 2 +- .../dark/ParticleProcessMaterial.svg | 2 +- resources/godot_icons/dark/Path2D.svg | 2 +- resources/godot_icons/dark/Path3D.svg | 2 +- resources/godot_icons/dark/PathFollow2D.svg | 2 +- resources/godot_icons/dark/PathFollow3D.svg | 2 +- resources/godot_icons/dark/PhysicalBone2D.svg | 1 + resources/godot_icons/dark/PhysicalBone3D.svg | 2 +- .../godot_icons/dark/PhysicalSkyMaterial.svg | 2 +- resources/godot_icons/dark/PinJoint2D.svg | 2 +- resources/godot_icons/dark/PinJoint3D.svg | 2 +- .../godot_icons/dark/PlaceholderMaterial.svg | 1 + .../godot_icons/dark/PlaceholderMesh.svg | 1 + .../godot_icons/dark/PlaceholderTexture2D.svg | 1 + .../godot_icons/dark/PlaceholderTexture3D.svg | 1 + resources/godot_icons/dark/PlaneMesh.svg | 2 +- resources/godot_icons/dark/Play.svg | 1 + resources/godot_icons/dark/PlayBackwards.svg | 1 + resources/godot_icons/dark/PlayCustom.svg | 1 + resources/godot_icons/dark/PlayRemote.svg | 1 + resources/godot_icons/dark/PlayScene.svg | 1 + resources/godot_icons/dark/PlayStart.svg | 1 + resources/godot_icons/dark/PointLight2D.svg | 2 +- resources/godot_icons/dark/PointMesh.svg | 2 +- resources/godot_icons/dark/Polygon2D.svg | 2 +- .../godot_icons/dark/PolygonOccluder3D.svg | 2 +- .../godot_icons/dark/PolygonPathFinder.svg | 2 +- resources/godot_icons/dark/Popup.svg | 2 +- .../dark/PortableCompressedTexture2D.svg | 1 + resources/godot_icons/dark/PrismMesh.svg | 2 +- .../dark/ProceduralSkyMaterial.svg | 2 +- resources/godot_icons/dark/Progress1.svg | 1 + resources/godot_icons/dark/Progress2.svg | 1 + resources/godot_icons/dark/Progress3.svg | 1 + resources/godot_icons/dark/Progress4.svg | 1 + resources/godot_icons/dark/Progress5.svg | 1 + resources/godot_icons/dark/Progress6.svg | 1 + resources/godot_icons/dark/Progress7.svg | 1 + resources/godot_icons/dark/Progress8.svg | 1 + resources/godot_icons/dark/ProgressBar.svg | 2 +- resources/godot_icons/dark/QuadMesh.svg | 2 +- resources/godot_icons/dark/QuadOccluder3D.svg | 2 +- .../godot_icons/dark/RectangleShape2D.svg | 2 +- .../godot_icons/dark/ReflectionProbe.svg | 2 +- resources/godot_icons/dark/RegEx.svg | 1 + resources/godot_icons/dark/RegExMatch.svg | 1 + resources/godot_icons/dark/Reload.svg | 1 + resources/godot_icons/dark/ReloadSmall.svg | 1 + .../godot_icons/dark/RemoteTransform2D.svg | 2 +- .../godot_icons/dark/RemoteTransform3D.svg | 2 +- .../godot_icons/dark/ResourcePreloader.svg | 2 +- .../godot_icons/dark/RibbonTrailMesh.svg | 2 +- resources/godot_icons/dark/RichTextEffect.svg | 2 +- resources/godot_icons/dark/RigidBody2D.svg | 2 +- resources/godot_icons/dark/RigidBody3D.svg | 2 +- resources/godot_icons/dark/RootMotionView.svg | 2 +- resources/godot_icons/dark/Script.svg | 1 + resources/godot_icons/dark/ScriptCreate.svg | 1 + resources/godot_icons/dark/ScriptRemove.svg | 1 + .../godot_icons/dark/ScrollContainer.svg | 2 +- resources/godot_icons/dark/Search.svg | 1 + resources/godot_icons/dark/SegmentShape2D.svg | 2 +- .../godot_icons/dark/SeparationRayShape2D.svg | 2 +- .../godot_icons/dark/SeparationRayShape3D.svg | 2 +- resources/godot_icons/dark/Shader.svg | 2 +- .../dark/ShaderGlobalsOverride.svg | 2 +- resources/godot_icons/dark/ShaderInclude.svg | 1 + resources/godot_icons/dark/ShaderMaterial.svg | 2 +- resources/godot_icons/dark/ShapeCast2D.svg | 2 +- resources/godot_icons/dark/ShapeCast3D.svg | 2 +- resources/godot_icons/dark/Signals.svg | 1 + .../godot_icons/dark/SignalsAndGroups.svg | 1 + resources/godot_icons/dark/Skeleton2D.svg | 2 +- resources/godot_icons/dark/Skeleton3D.svg | 2 +- resources/godot_icons/dark/SkeletonIK3D.svg | 2 +- resources/godot_icons/dark/Sky.svg | 2 +- resources/godot_icons/dark/SliderJoint3D.svg | 2 +- resources/godot_icons/dark/Slot.svg | 1 + resources/godot_icons/dark/SphereMesh.svg | 2 +- .../godot_icons/dark/SphereOccluder3D.svg | 2 +- resources/godot_icons/dark/SpinBox.svg | 2 +- resources/godot_icons/dark/SplitContainer.svg | 2 +- resources/godot_icons/dark/SpotLight3D.svg | 2 +- resources/godot_icons/dark/Sprite2D.svg | 2 +- resources/godot_icons/dark/Sprite3D.svg | 2 +- resources/godot_icons/dark/SpriteFrames.svg | 2 +- .../godot_icons/dark/StandardMaterial3D.svg | 2 +- resources/godot_icons/dark/StaticBody2D.svg | 2 +- resources/godot_icons/dark/StaticBody3D.svg | 2 +- resources/godot_icons/dark/Stop.svg | 1 + resources/godot_icons/dark/StyleBoxEmpty.svg | 2 +- resources/godot_icons/dark/StyleBoxFlat.svg | 2 +- resources/godot_icons/dark/StyleBoxLine.svg | 2 +- .../godot_icons/dark/StyleBoxTexture.svg | 2 +- resources/godot_icons/dark/SubViewport.svg | 2 +- .../godot_icons/dark/SubViewportContainer.svg | 2 +- .../godot_icons/dark/SyntaxHighlighter.svg | 1 + resources/godot_icons/dark/SystemFont.svg | 2 +- resources/godot_icons/dark/TabBar.svg | 2 +- resources/godot_icons/dark/TabContainer.svg | 2 +- resources/godot_icons/dark/TextEdit.svg | 2 +- resources/godot_icons/dark/TextMesh.svg | 2 +- resources/godot_icons/dark/Texture2DArray.svg | 2 +- resources/godot_icons/dark/TextureButton.svg | 2 +- .../godot_icons/dark/TextureProgressBar.svg | 2 +- resources/godot_icons/dark/Theme.svg | 2 +- resources/godot_icons/dark/TileMap.svg | 2 +- resources/godot_icons/dark/TileSet.svg | 2 +- resources/godot_icons/dark/Timer.svg | 2 +- resources/godot_icons/dark/TorusMesh.svg | 2 +- .../godot_icons/dark/TouchScreenButton.svg | 2 +- resources/godot_icons/dark/Tree.svg | 2 +- resources/godot_icons/dark/TubeTrailMesh.svg | 2 +- resources/godot_icons/dark/Tween.svg | 2 +- resources/godot_icons/dark/Unlock.svg | 1 + resources/godot_icons/dark/VBoxContainer.svg | 2 +- resources/godot_icons/dark/VFlowContainer.svg | 2 +- resources/godot_icons/dark/VScrollBar.svg | 2 +- resources/godot_icons/dark/VSeparator.svg | 2 +- resources/godot_icons/dark/VSlider.svg | 2 +- .../godot_icons/dark/VSplitContainer.svg | 2 +- resources/godot_icons/dark/VehicleBody3D.svg | 2 +- resources/godot_icons/dark/VehicleWheel3D.svg | 2 +- .../godot_icons/dark/VideoStreamPlayer.svg | 2 +- .../godot_icons/dark/ViewportTexture.svg | 2 +- .../dark/VisibleOnScreenEnabler2D.svg | 2 +- .../dark/VisibleOnScreenEnabler3D.svg | 2 +- .../dark/VisibleOnScreenNotifier2D.svg | 2 +- .../dark/VisibleOnScreenNotifier3D.svg | 2 +- resources/godot_icons/dark/VisualShader.svg | 2 +- .../dark/VisualShaderNodeColorConstant.svg | 2 +- .../dark/VisualShaderNodeColorOp.svg | 2 +- .../dark/VisualShaderNodeCubeMap.svg | 2 +- .../dark/VisualShaderNodeCurveTexture.svg | 2 +- .../dark/VisualShaderNodeCurveXYZTexture.svg | 2 +- .../dark/VisualShaderNodeExpression.svg | 2 +- .../dark/VisualShaderNodeFloatFunc.svg | 2 +- .../dark/VisualShaderNodeFloatOp.svg | 2 +- .../dark/VisualShaderNodeGlobalExpression.svg | 2 +- .../dark/VisualShaderNodeIntFunc.svg | 2 +- .../dark/VisualShaderNodeIntOp.svg | 2 +- .../dark/VisualShaderNodeTransformCompose.svg | 2 +- .../VisualShaderNodeTransformDecompose.svg | 2 +- .../dark/VisualShaderNodeTransformVecMult.svg | 2 +- .../dark/VisualShaderNodeVectorCompose.svg | 2 +- .../dark/VisualShaderNodeVectorDecompose.svg | 2 +- .../dark/VisualShaderNodeVectorDistance.svg | 2 +- .../dark/VisualShaderNodeVectorFunc.svg | 2 +- .../dark/VisualShaderNodeVectorLen.svg | 2 +- resources/godot_icons/dark/VoxelGI.svg | 2 +- resources/godot_icons/dark/VoxelGIData.svg | 2 +- resources/godot_icons/dark/World2D.svg | 2 +- resources/godot_icons/dark/World3D.svg | 2 +- .../godot_icons/dark/WorldBoundaryShape2D.svg | 2 +- .../godot_icons/dark/WorldBoundaryShape3D.svg | 2 +- .../godot_icons/dark/WorldEnvironment.svg | 2 +- resources/godot_icons/dark/XRAnchor3D.svg | 2 +- resources/godot_icons/dark/XRCamera3D.svg | 2 +- resources/godot_icons/dark/XRController3D.svg | 2 +- resources/godot_icons/dark/XROrigin3D.svg | 2 +- resources/godot_icons/dark/Zoom.svg | 1 + resources/godot_icons/dark/ZoomLess.svg | 1 + resources/godot_icons/dark/ZoomMore.svg | 1 + resources/godot_icons/dark/ZoomReset.svg | 1 + resources/godot_icons/light/AcceptDialog.svg | 2 +- .../godot_icons/light/AnimatableBody2D.svg | 2 +- .../godot_icons/light/AnimatableBody3D.svg | 2 +- .../godot_icons/light/AnimatedSprite2D.svg | 2 +- .../godot_icons/light/AnimatedSprite3D.svg | 2 +- .../godot_icons/light/AnimatedTexture.svg | 2 +- resources/godot_icons/light/Animation.svg | 2 +- .../godot_icons/light/AnimationLibrary.svg | 2 +- .../godot_icons/light/AnimationPlayer.svg | 2 +- resources/godot_icons/light/AnimationTree.svg | 2 +- resources/godot_icons/light/Area2D.svg | 2 +- resources/godot_icons/light/Area3D.svg | 2 +- resources/godot_icons/light/ArrayMesh.svg | 2 +- .../godot_icons/light/ArrayOccluder3D.svg | 2 +- resources/godot_icons/light/ArrowDown.svg | 1 + resources/godot_icons/light/ArrowLeft.svg | 1 + resources/godot_icons/light/ArrowRight.svg | 1 + resources/godot_icons/light/ArrowUp.svg | 1 + .../light/AspectRatioContainer.svg | 2 +- resources/godot_icons/light/AtlasTexture.svg | 2 +- .../godot_icons/light/AudioListener2D.svg | 2 +- .../godot_icons/light/AudioListener3D.svg | 2 +- .../godot_icons/light/AudioStreamPlayer.svg | 2 +- .../godot_icons/light/AudioStreamPlayer2D.svg | 2 +- .../godot_icons/light/AudioStreamPlayer3D.svg | 2 +- .../light/AudioStreamPolyphonic.svg | 1 + .../godot_icons/light/AudioStreamWAV.svg | 2 +- resources/godot_icons/light/Bone2D.svg | 2 +- .../godot_icons/light/BoneAttachment3D.svg | 2 +- resources/godot_icons/light/BoxContainer.svg | 2 +- resources/godot_icons/light/BoxMesh.svg | 2 +- resources/godot_icons/light/BoxOccluder3D.svg | 2 +- resources/godot_icons/light/BoxShape3D.svg | 2 +- resources/godot_icons/light/Button.svg | 2 +- resources/godot_icons/light/ButtonGroup.svg | 2 +- .../godot_icons/light/CPUParticles2D.svg | 2 +- .../godot_icons/light/CPUParticles3D.svg | 2 +- resources/godot_icons/light/CSGBox3D.svg | 2 +- resources/godot_icons/light/CSGCombiner3D.svg | 2 +- resources/godot_icons/light/CSGCylinder3D.svg | 2 +- resources/godot_icons/light/CSGMesh3D.svg | 2 +- resources/godot_icons/light/CSGPolygon3D.svg | 2 +- resources/godot_icons/light/CSGSphere3D.svg | 2 +- resources/godot_icons/light/CSGTorus3D.svg | 2 +- resources/godot_icons/light/CSharpScript.svg | 2 +- resources/godot_icons/light/Camera2D.svg | 2 +- resources/godot_icons/light/Camera3D.svg | 2 +- .../light/CameraAttributesPhysical.svg | 1 + .../light/CameraAttributesPractical.svg | 1 + resources/godot_icons/light/CameraTexture.svg | 2 +- resources/godot_icons/light/CanvasGroup.svg | 2 +- .../godot_icons/light/CanvasItemMaterial.svg | 2 +- resources/godot_icons/light/CanvasLayer.svg | 2 +- .../godot_icons/light/CanvasModulate.svg | 2 +- resources/godot_icons/light/CanvasTexture.svg | 1 + resources/godot_icons/light/CapsuleMesh.svg | 2 +- .../godot_icons/light/CapsuleShape2D.svg | 2 +- .../godot_icons/light/CapsuleShape3D.svg | 2 +- .../godot_icons/light/CharacterBody2D.svg | 2 +- .../godot_icons/light/CharacterBody3D.svg | 2 +- resources/godot_icons/light/CheckBox.svg | 2 +- resources/godot_icons/light/CircleShape2D.svg | 2 +- resources/godot_icons/light/CodeEdit.svg | 2 +- .../godot_icons/light/CodeHighlighter.svg | 1 + .../godot_icons/light/CollisionPolygon2D.svg | 2 +- .../godot_icons/light/CollisionPolygon3D.svg | 2 +- .../godot_icons/light/CollisionShape2D.svg | 2 +- .../godot_icons/light/CollisionShape3D.svg | 2 +- resources/godot_icons/light/ColorPicker.svg | 2 +- .../godot_icons/light/ColorPickerButton.svg | 2 +- resources/godot_icons/light/ColorRect.svg | 2 +- .../godot_icons/light/CompressedTexture2D.svg | 2 +- .../godot_icons/light/CompressedTexture3D.svg | 1 + .../light/ConcavePolygonShape2D.svg | 2 +- .../light/ConcavePolygonShape3D.svg | 2 +- .../godot_icons/light/ConeTwistJoint3D.svg | 2 +- .../godot_icons/light/ConfirmationDialog.svg | 2 +- resources/godot_icons/light/Container.svg | 2 +- resources/godot_icons/light/Control.svg | 2 +- .../light/ConvexPolygonShape2D.svg | 2 +- .../light/ConvexPolygonShape3D.svg | 2 +- resources/godot_icons/light/Curve.svg | 2 +- resources/godot_icons/light/Curve2D.svg | 2 +- resources/godot_icons/light/Curve3D.svg | 2 +- resources/godot_icons/light/CurveTexture.svg | 2 +- .../godot_icons/light/CurveXYZTexture.svg | 1 + resources/godot_icons/light/CylinderMesh.svg | 2 +- .../godot_icons/light/CylinderShape3D.svg | 2 +- .../godot_icons/light/DampedSpringJoint2D.svg | 2 +- resources/godot_icons/light/Decal.svg | 2 +- .../godot_icons/light/DirectionalLight2D.svg | 2 +- .../godot_icons/light/DirectionalLight3D.svg | 2 +- resources/godot_icons/light/Edit.svg | 1 + resources/godot_icons/light/Environment.svg | 2 +- resources/godot_icons/light/FileDialog.svg | 2 +- resources/godot_icons/light/FlowContainer.svg | 2 +- resources/godot_icons/light/FogMaterial.svg | 2 +- resources/godot_icons/light/FogVolume.svg | 2 +- resources/godot_icons/light/FontFile.svg | 2 +- resources/godot_icons/light/FontVariation.svg | 2 +- resources/godot_icons/light/GDScript.svg | 2 +- .../godot_icons/light/GPUParticles2D.svg | 2 +- .../godot_icons/light/GPUParticles3D.svg | 2 +- .../light/GPUParticlesAttractorBox3D.svg | 2 +- .../light/GPUParticlesAttractorSphere3D.svg | 2 +- .../GPUParticlesAttractorVectorField3D.svg | 2 +- .../light/GPUParticlesCollisionBox3D.svg | 2 +- .../light/GPUParticlesCollisionSDF3D.svg | 2 +- .../light/GPUParticlesCollisionSphere3D.svg | 2 +- .../godot_icons/light/Generic6DOFJoint3D.svg | 2 +- resources/godot_icons/light/Gradient.svg | 2 +- .../godot_icons/light/GradientTexture1D.svg | 2 +- .../godot_icons/light/GradientTexture2D.svg | 2 +- resources/godot_icons/light/GraphEdit.svg | 2 +- resources/godot_icons/light/GraphElement.svg | 1 + resources/godot_icons/light/GraphNode.svg | 2 +- resources/godot_icons/light/GridContainer.svg | 2 +- resources/godot_icons/light/GridMap.svg | 2 +- resources/godot_icons/light/GrooveJoint2D.svg | 2 +- .../godot_icons/light/GuiVisibilityHidden.svg | 1 + .../light/GuiVisibilityVisible.svg | 1 + .../godot_icons/light/GuiVisibilityXray.svg | 1 + resources/godot_icons/light/HBoxContainer.svg | 2 +- .../godot_icons/light/HFlowContainer.svg | 2 +- resources/godot_icons/light/HScrollBar.svg | 2 +- resources/godot_icons/light/HSeparator.svg | 2 +- resources/godot_icons/light/HSlider.svg | 2 +- .../godot_icons/light/HSplitContainer.svg | 2 +- .../godot_icons/light/HeightMapShape3D.svg | 2 +- resources/godot_icons/light/Help.svg | 1 + resources/godot_icons/light/HelpSearch.svg | 1 + resources/godot_icons/light/HingeJoint3D.svg | 2 +- resources/godot_icons/light/ImageTexture.svg | 2 +- .../godot_icons/light/ImageTexture3D.svg | 1 + resources/godot_icons/light/ImmediateMesh.svg | 2 +- resources/godot_icons/light/ImportCheck.svg | 1 + resources/godot_icons/light/ImportFail.svg | 1 + .../light/ImporterMeshInstance3D.svg | 2 +- resources/godot_icons/light/Info.svg | 1 + resources/godot_icons/light/ItemList.svg | 2 +- resources/godot_icons/light/Label.svg | 2 +- resources/godot_icons/light/Label3D.svg | 2 +- resources/godot_icons/light/LabelSettings.svg | 2 +- .../godot_icons/light/LightOccluder2D.svg | 2 +- resources/godot_icons/light/LightmapProbe.svg | 2 +- resources/godot_icons/light/Line2D.svg | 2 +- resources/godot_icons/light/LineEdit.svg | 2 +- resources/godot_icons/light/LinkButton.svg | 2 +- resources/godot_icons/light/Lock.svg | 1 + .../godot_icons/light/MarginContainer.svg | 2 +- .../godot_icons/light/MeshInstance2D.svg | 2 +- .../godot_icons/light/MeshInstance3D.svg | 2 +- resources/godot_icons/light/MeshLibrary.svg | 2 +- resources/godot_icons/light/MeshTexture.svg | 2 +- resources/godot_icons/light/MultiMesh.svg | 2 +- .../godot_icons/light/MultiMeshInstance2D.svg | 2 +- .../godot_icons/light/MultiMeshInstance3D.svg | 2 +- .../godot_icons/light/NavigationAgent2D.svg | 2 +- .../godot_icons/light/NavigationAgent3D.svg | 2 +- .../godot_icons/light/NavigationLink2D.svg | 5 +- .../godot_icons/light/NavigationLink3D.svg | 5 +- .../light/NavigationObstacle2D.svg | 2 +- .../light/NavigationObstacle3D.svg | 2 +- .../godot_icons/light/NavigationPolygon.svg | 2 +- .../godot_icons/light/NavigationRegion2D.svg | 2 +- .../godot_icons/light/NavigationRegion3D.svg | 2 +- resources/godot_icons/light/NinePatchRect.svg | 2 +- resources/godot_icons/light/Node.svg | 2 +- resources/godot_icons/light/Node2D.svg | 2 +- resources/godot_icons/light/Node3D.svg | 2 +- .../godot_icons/light/NoiseTexture2D.svg | 1 + .../godot_icons/light/NoiseTexture3D.svg | 1 + resources/godot_icons/light/ORMMaterial3D.svg | 2 +- resources/godot_icons/light/Object.svg | 2 +- .../godot_icons/light/OccluderInstance3D.svg | 2 +- .../godot_icons/light/OccluderPolygon2D.svg | 2 +- resources/godot_icons/light/OmniLight3D.svg | 2 +- resources/godot_icons/light/OptionButton.svg | 2 +- resources/godot_icons/light/PackedScene.svg | 2 +- resources/godot_icons/light/Panel.svg | 2 +- .../godot_icons/light/PanelContainer.svg | 2 +- .../godot_icons/light/PanoramaSkyMaterial.svg | 2 +- .../godot_icons/light/ParallaxBackground.svg | 2 +- resources/godot_icons/light/ParallaxLayer.svg | 2 +- .../light/ParticleProcessMaterial.svg | 2 +- resources/godot_icons/light/Path2D.svg | 2 +- resources/godot_icons/light/Path3D.svg | 2 +- resources/godot_icons/light/PathFollow2D.svg | 2 +- resources/godot_icons/light/PathFollow3D.svg | 2 +- .../godot_icons/light/PhysicalBone2D.svg | 1 + .../godot_icons/light/PhysicalBone3D.svg | 2 +- .../godot_icons/light/PhysicalSkyMaterial.svg | 2 +- resources/godot_icons/light/PinJoint2D.svg | 2 +- resources/godot_icons/light/PinJoint3D.svg | 2 +- .../godot_icons/light/PlaceholderMaterial.svg | 1 + .../godot_icons/light/PlaceholderMesh.svg | 1 + .../light/PlaceholderTexture2D.svg | 1 + .../light/PlaceholderTexture3D.svg | 1 + resources/godot_icons/light/PlaneMesh.svg | 2 +- resources/godot_icons/light/Play.svg | 1 + resources/godot_icons/light/PlayBackwards.svg | 1 + resources/godot_icons/light/PlayCustom.svg | 1 + resources/godot_icons/light/PlayRemote.svg | 1 + resources/godot_icons/light/PlayScene.svg | 1 + resources/godot_icons/light/PlayStart.svg | 1 + resources/godot_icons/light/PointLight2D.svg | 2 +- resources/godot_icons/light/PointMesh.svg | 2 +- resources/godot_icons/light/Polygon2D.svg | 2 +- .../godot_icons/light/PolygonOccluder3D.svg | 2 +- .../godot_icons/light/PolygonPathFinder.svg | 2 +- resources/godot_icons/light/Popup.svg | 2 +- .../light/PortableCompressedTexture2D.svg | 1 + resources/godot_icons/light/PrismMesh.svg | 2 +- .../light/ProceduralSkyMaterial.svg | 2 +- resources/godot_icons/light/Progress1.svg | 1 + resources/godot_icons/light/Progress2.svg | 1 + resources/godot_icons/light/Progress3.svg | 1 + resources/godot_icons/light/Progress4.svg | 1 + resources/godot_icons/light/Progress5.svg | 1 + resources/godot_icons/light/Progress6.svg | 1 + resources/godot_icons/light/Progress7.svg | 1 + resources/godot_icons/light/Progress8.svg | 1 + resources/godot_icons/light/ProgressBar.svg | 2 +- resources/godot_icons/light/QuadMesh.svg | 2 +- .../godot_icons/light/QuadOccluder3D.svg | 2 +- .../godot_icons/light/RectangleShape2D.svg | 2 +- .../godot_icons/light/ReflectionProbe.svg | 2 +- resources/godot_icons/light/RegEx.svg | 1 + resources/godot_icons/light/RegExMatch.svg | 1 + resources/godot_icons/light/Reload.svg | 1 + resources/godot_icons/light/ReloadSmall.svg | 1 + .../godot_icons/light/RemoteTransform2D.svg | 2 +- .../godot_icons/light/RemoteTransform3D.svg | 2 +- .../godot_icons/light/ResourcePreloader.svg | 2 +- .../godot_icons/light/RibbonTrailMesh.svg | 2 +- .../godot_icons/light/RichTextEffect.svg | 2 +- resources/godot_icons/light/RigidBody2D.svg | 2 +- resources/godot_icons/light/RigidBody3D.svg | 2 +- .../godot_icons/light/RootMotionView.svg | 2 +- resources/godot_icons/light/Script.svg | 1 + resources/godot_icons/light/ScriptCreate.svg | 1 + resources/godot_icons/light/ScriptRemove.svg | 1 + .../godot_icons/light/ScrollContainer.svg | 2 +- resources/godot_icons/light/Search.svg | 1 + .../godot_icons/light/SegmentShape2D.svg | 2 +- .../light/SeparationRayShape2D.svg | 2 +- .../light/SeparationRayShape3D.svg | 2 +- resources/godot_icons/light/Shader.svg | 2 +- .../light/ShaderGlobalsOverride.svg | 2 +- resources/godot_icons/light/ShaderInclude.svg | 1 + .../godot_icons/light/ShaderMaterial.svg | 2 +- resources/godot_icons/light/ShapeCast2D.svg | 2 +- resources/godot_icons/light/ShapeCast3D.svg | 2 +- resources/godot_icons/light/Signals.svg | 1 + .../godot_icons/light/SignalsAndGroups.svg | 1 + resources/godot_icons/light/Skeleton2D.svg | 2 +- resources/godot_icons/light/Skeleton3D.svg | 2 +- resources/godot_icons/light/SkeletonIK3D.svg | 2 +- resources/godot_icons/light/Sky.svg | 2 +- resources/godot_icons/light/SliderJoint3D.svg | 2 +- resources/godot_icons/light/Slot.svg | 1 + resources/godot_icons/light/SphereMesh.svg | 2 +- .../godot_icons/light/SphereOccluder3D.svg | 2 +- resources/godot_icons/light/SpinBox.svg | 2 +- .../godot_icons/light/SplitContainer.svg | 2 +- resources/godot_icons/light/SpotLight3D.svg | 2 +- resources/godot_icons/light/Sprite2D.svg | 2 +- resources/godot_icons/light/Sprite3D.svg | 2 +- resources/godot_icons/light/SpriteFrames.svg | 2 +- .../godot_icons/light/StandardMaterial3D.svg | 2 +- resources/godot_icons/light/StaticBody2D.svg | 2 +- resources/godot_icons/light/StaticBody3D.svg | 2 +- resources/godot_icons/light/Stop.svg | 1 + resources/godot_icons/light/StyleBoxEmpty.svg | 2 +- resources/godot_icons/light/StyleBoxFlat.svg | 2 +- resources/godot_icons/light/StyleBoxLine.svg | 2 +- .../godot_icons/light/StyleBoxTexture.svg | 2 +- resources/godot_icons/light/SubViewport.svg | 2 +- .../light/SubViewportContainer.svg | 2 +- .../godot_icons/light/SyntaxHighlighter.svg | 1 + resources/godot_icons/light/SystemFont.svg | 2 +- resources/godot_icons/light/TabBar.svg | 2 +- resources/godot_icons/light/TabContainer.svg | 2 +- resources/godot_icons/light/TextEdit.svg | 2 +- resources/godot_icons/light/TextMesh.svg | 2 +- .../godot_icons/light/Texture2DArray.svg | 2 +- resources/godot_icons/light/TextureButton.svg | 2 +- .../godot_icons/light/TextureProgressBar.svg | 2 +- resources/godot_icons/light/Theme.svg | 2 +- resources/godot_icons/light/TileMap.svg | 2 +- resources/godot_icons/light/TileSet.svg | 2 +- resources/godot_icons/light/Timer.svg | 2 +- resources/godot_icons/light/TorusMesh.svg | 2 +- .../godot_icons/light/TouchScreenButton.svg | 2 +- resources/godot_icons/light/Tree.svg | 2 +- resources/godot_icons/light/TubeTrailMesh.svg | 2 +- resources/godot_icons/light/Tween.svg | 2 +- resources/godot_icons/light/Unlock.svg | 1 + resources/godot_icons/light/VBoxContainer.svg | 2 +- .../godot_icons/light/VFlowContainer.svg | 2 +- resources/godot_icons/light/VScrollBar.svg | 2 +- resources/godot_icons/light/VSeparator.svg | 2 +- resources/godot_icons/light/VSlider.svg | 2 +- .../godot_icons/light/VSplitContainer.svg | 2 +- resources/godot_icons/light/VehicleBody3D.svg | 2 +- .../godot_icons/light/VehicleWheel3D.svg | 2 +- .../godot_icons/light/VideoStreamPlayer.svg | 2 +- .../godot_icons/light/ViewportTexture.svg | 2 +- .../light/VisibleOnScreenEnabler2D.svg | 2 +- .../light/VisibleOnScreenEnabler3D.svg | 2 +- .../light/VisibleOnScreenNotifier2D.svg | 2 +- .../light/VisibleOnScreenNotifier3D.svg | 2 +- resources/godot_icons/light/VisualShader.svg | 2 +- .../light/VisualShaderNodeColorConstant.svg | 2 +- .../light/VisualShaderNodeColorOp.svg | 2 +- .../light/VisualShaderNodeCubeMap.svg | 2 +- .../light/VisualShaderNodeCurveTexture.svg | 2 +- .../light/VisualShaderNodeCurveXYZTexture.svg | 2 +- .../light/VisualShaderNodeExpression.svg | 2 +- .../light/VisualShaderNodeFloatFunc.svg | 2 +- .../light/VisualShaderNodeFloatOp.svg | 2 +- .../VisualShaderNodeGlobalExpression.svg | 2 +- .../light/VisualShaderNodeIntFunc.svg | 2 +- .../light/VisualShaderNodeIntOp.svg | 2 +- .../VisualShaderNodeTransformCompose.svg | 2 +- .../VisualShaderNodeTransformDecompose.svg | 2 +- .../VisualShaderNodeTransformVecMult.svg | 2 +- .../light/VisualShaderNodeVectorCompose.svg | 2 +- .../light/VisualShaderNodeVectorDecompose.svg | 2 +- .../light/VisualShaderNodeVectorDistance.svg | 2 +- .../light/VisualShaderNodeVectorFunc.svg | 2 +- .../light/VisualShaderNodeVectorLen.svg | 2 +- resources/godot_icons/light/VoxelGI.svg | 2 +- resources/godot_icons/light/VoxelGIData.svg | 2 +- resources/godot_icons/light/World2D.svg | 2 +- resources/godot_icons/light/World3D.svg | 2 +- .../light/WorldBoundaryShape2D.svg | 2 +- .../light/WorldBoundaryShape3D.svg | 2 +- .../godot_icons/light/WorldEnvironment.svg | 2 +- resources/godot_icons/light/XRAnchor3D.svg | 2 +- resources/godot_icons/light/XRCamera3D.svg | 2 +- .../godot_icons/light/XRController3D.svg | 2 +- resources/godot_icons/light/XROrigin3D.svg | 2 +- resources/godot_icons/light/Zoom.svg | 1 + resources/godot_icons/light/ZoomLess.svg | 1 + resources/godot_icons/light/ZoomMore.svg | 1 + resources/godot_icons/light/ZoomReset.svg | 1 + resources/hashes | 161 -- .../light/icon_GUI_visibility_visible.svg | 3 - resources/light/icon_a_r_v_r_anchor.svg | 3 - resources/light/icon_a_r_v_r_camera.svg | 3 - resources/light/icon_a_r_v_r_controller.svg | 3 - resources/light/icon_a_r_v_r_origin.svg | 3 - resources/light/icon_accept_dialog.svg | 3 - resources/light/icon_animated_sprite.svg | 7 - resources/light/icon_animated_sprite_3d.svg | 7 - resources/light/icon_animation_player.svg | 3 - resources/light/icon_animation_tree.svg | 3 - .../light/icon_animation_tree_player.svg | 3 - resources/light/icon_area.svg | 3 - resources/light/icon_area_2d.svg | 3 - resources/light/icon_audio_stream_player.svg | 11 - .../light/icon_audio_stream_player_2_d.svg | 11 - .../light/icon_audio_stream_player_3_d.svg | 11 - resources/light/icon_back_buffer_copy.svg | 3 - resources/light/icon_baked_lightmap.svg | 3 - resources/light/icon_bone_2_d.svg | 3 - resources/light/icon_bone_attachment.svg | 3 - resources/light/icon_button.svg | 3 - resources/light/icon_c_p_u_particles.svg | 3 - resources/light/icon_c_p_u_particles_2_d.svg | 3 - resources/light/icon_camera.svg | 3 - resources/light/icon_camera_2d.svg | 3 - resources/light/icon_canvas_layer.svg | 3 - resources/light/icon_canvas_modulate.svg | 10 - resources/light/icon_center_container.svg | 3 - resources/light/icon_check_box.svg | 3 - resources/light/icon_check_button.svg | 3 - resources/light/icon_clipped_camera.svg | 3 - resources/light/icon_collision_polygon.svg | 3 - resources/light/icon_collision_polygon_2d.svg | 3 - resources/light/icon_collision_shape.svg | 3 - resources/light/icon_collision_shape_2d.svg | 3 - resources/light/icon_color_picker.svg | 3 - resources/light/icon_color_picker_button.svg | 3 - resources/light/icon_color_rect.svg | 10 - resources/light/icon_cone_twist_joint.svg | 3 - resources/light/icon_confirmation_dialog.svg | 3 - resources/light/icon_container.svg | 3 - resources/light/icon_control.svg | 3 - .../light/icon_damped_spring_joint_2d.svg | 6 - resources/light/icon_directional_light.svg | 3 - resources/light/icon_file_dialog.svg | 3 - resources/light/icon_g_i_probe.svg | 3 - .../light/icon_generic_6_d_o_f_joint.svg | 3 - resources/light/icon_graph_edit.svg | 6 - resources/light/icon_graph_node.svg | 6 - resources/light/icon_grid_container.svg | 3 - resources/light/icon_groove_joint_2d.svg | 3 - resources/light/icon_h_box_container.svg | 3 - resources/light/icon_h_scroll_bar.svg | 3 - resources/light/icon_h_separator.svg | 3 - resources/light/icon_h_slider.svg | 3 - resources/light/icon_h_split_container.svg | 3 - resources/light/icon_h_t_t_p_request.svg | 3 - resources/light/icon_hinge_joint.svg | 3 - resources/light/icon_immediate_geometry.svg | 3 - resources/light/icon_interpolated_camera.svg | 3 - resources/light/icon_item_list.svg | 3 - resources/light/icon_kinematic_body.svg | 3 - resources/light/icon_kinematic_body_2d.svg | 3 - resources/light/icon_label.svg | 3 - resources/light/icon_light_2d.svg | 3 - resources/light/icon_light_occluder_2d.svg | 3 - resources/light/icon_line_2d.svg | 3 - resources/light/icon_line_edit.svg | 3 - resources/light/icon_link_button.svg | 3 - resources/light/icon_listener.svg | 3 - resources/light/icon_margin_container.svg | 6 - resources/light/icon_menu_button.svg | 3 - resources/light/icon_mesh_instance.svg | 3 - resources/light/icon_mesh_instance_2d.svg | 3 - resources/light/icon_multi_mesh_instance.svg | 3 - .../light/icon_multi_mesh_instance_2d.svg | 4 - resources/light/icon_navigation.svg | 3 - resources/light/icon_navigation_2d.svg | 3 - .../light/icon_navigation_mesh_instance.svg | 3 - .../icon_navigation_polygon_instance.svg | 6 - resources/light/icon_nine_patch_rect.svg | 14 - resources/light/icon_node.svg | 3 - resources/light/icon_node_2d.svg | 3 - resources/light/icon_omni_light.svg | 3 - resources/light/icon_option_button.svg | 6 - resources/light/icon_panel.svg | 3 - resources/light/icon_panel_container.svg | 3 - resources/light/icon_parallax_background.svg | 6 - resources/light/icon_parallax_layer.svg | 6 - resources/light/icon_particles.svg | 3 - resources/light/icon_particles_2d.svg | 3 - resources/light/icon_path.svg | 3 - resources/light/icon_path_2d.svg | 3 - resources/light/icon_path_follow.svg | 3 - resources/light/icon_path_follow_2d.svg | 3 - resources/light/icon_physical_bone.svg | 8 - resources/light/icon_pin_joint.svg | 3 - resources/light/icon_pin_joint_2d.svg | 3 - resources/light/icon_polygon_2_d.svg | 3 - resources/light/icon_popup.svg | 3 - resources/light/icon_popup_dialog.svg | 3 - resources/light/icon_popup_menu.svg | 3 - resources/light/icon_popup_panel.svg | 3 - resources/light/icon_position_2d.svg | 3 - resources/light/icon_position_3d.svg | 3 - resources/light/icon_progress_bar.svg | 3 - resources/light/icon_ray_cast.svg | 3 - resources/light/icon_ray_cast_2d.svg | 3 - resources/light/icon_reference_rect.svg | 3 - resources/light/icon_reflection_probe.svg | 3 - resources/light/icon_remote_transform.svg | 3 - resources/light/icon_remote_transform_2d.svg | 3 - resources/light/icon_resource_preloader.svg | 3 - resources/light/icon_rich_text_label.svg | 3 - resources/light/icon_rigid_body.svg | 3 - resources/light/icon_rigid_body_2d.svg | 3 - resources/light/icon_scroll_container.svg | 3 - resources/light/icon_skeleton.svg | 3 - resources/light/icon_skeleton_2d.svg | 3 - resources/light/icon_skeleton_i_k.svg | 3 - resources/light/icon_slider_joint.svg | 3 - resources/light/icon_soft_body.svg | 3 - resources/light/icon_spatial.svg | 3 - resources/light/icon_spin_box.svg | 3 - resources/light/icon_spot_light.svg | 3 - resources/light/icon_spring_arm.svg | 8 - resources/light/icon_sprite.svg | 3 - resources/light/icon_sprite_3d.svg | 3 - resources/light/icon_static_body.svg | 3 - resources/light/icon_static_body_2d.svg | 6 - resources/light/icon_tab_container.svg | 3 - resources/light/icon_tabs.svg | 3 - resources/light/icon_text_edit.svg | 6 - resources/light/icon_texture_button.svg | 3 - resources/light/icon_texture_progress.svg | 8 - resources/light/icon_texture_rect.svg | 3 - resources/light/icon_tile_map.svg | 3 - resources/light/icon_timer.svg | 3 - resources/light/icon_tool_button.svg | 3 - resources/light/icon_touch_screen_button.svg | 3 - resources/light/icon_tree.svg | 3 - resources/light/icon_tween.svg | 3 - resources/light/icon_v_box_container.svg | 3 - resources/light/icon_v_scroll_bar.svg | 3 - resources/light/icon_v_separator.svg | 3 - resources/light/icon_v_slider.svg | 3 - resources/light/icon_v_split_container.svg | 3 - resources/light/icon_vehicle_body.svg | 3 - resources/light/icon_vehicle_wheel.svg | 3 - resources/light/icon_video_player.svg | 3 - resources/light/icon_viewport.svg | 3 - resources/light/icon_viewport_container.svg | 3 - resources/light/icon_visibility_enabler.svg | 3 - .../light/icon_visibility_enabler_2d.svg | 3 - resources/light/icon_visibility_notifier.svg | 3 - .../light/icon_visibility_notifier_2d.svg | 3 - resources/light/icon_window_dialog.svg | 3 - resources/light/icon_world_environment.svg | 6 - resources/light/icon_y_sort.svg | 3 - resources/onig.wasm | Bin 0 -> 473151 bytes .../{ => other_icons}/dark/icon_edit.svg | 0 .../{ => other_icons}/dark/icon_refresh.svg | 0 .../{ => other_icons}/light/icon_edit.svg | 10 +- .../{ => other_icons}/light/icon_refresh.svg | 6 +- src/debugger/debug_runtime.ts | 2 +- src/debugger/debugger.ts | 56 +- src/debugger/godot3/debug_session.ts | 2 +- src/debugger/godot3/helpers.ts | 12 +- src/debugger/godot3/server_controller.ts | 15 +- src/debugger/godot4/debug_session.ts | 7 +- src/debugger/godot4/helpers.ts | 19 +- src/debugger/godot4/server_controller.ts | 20 +- src/debugger/index.ts | 1 + src/debugger/scene_tree_provider.ts | 4 +- src/document_link_provider.ts | 39 - src/extension.ts | 70 +- src/formatter/formatter.test.ts | 17 + src/formatter/formatter.ts | 19 + src/formatter/index.ts | 1 + src/formatter/symbols.ts | 73 + src/formatter/tests/test1.in.gd | 5 + src/formatter/tests/test1.out.gd | 4 + src/formatter/textmate.ts | 196 +++ src/lsp/ClientConnectionManager.ts | 48 +- src/lsp/GDScriptLanguageClient.ts | 162 +- src/lsp/MessageIO.ts | 93 +- src/lsp/NativeDocumentManager.ts | 695 -------- src/lsp/gdscript.capabilities.ts | 8 +- src/lsp/index.ts | 1 + src/providers/completions.ts | 41 + src/providers/definition.ts | 69 + src/providers/document_link.ts | 82 + src/providers/documentation.ts | 124 ++ src/providers/documentation_builder.ts | 485 +++++ src/providers/hover.ts | 108 ++ src/providers/index.ts | 8 + src/providers/inlay_hints.ts | 63 + src/providers/semantic_tokens.ts | 59 + src/providers/tasks.ts | 45 + src/scene_preview_provider.ts | 339 ---- src/scene_tools/index.ts | 3 + src/scene_tools/parser.ts | 164 ++ src/scene_tools/preview.ts | 289 +++ src/scene_tools/types.ts | 84 + src/{utils.ts => utils/index.ts} | 47 +- src/{ => utils}/logger.ts | 2 +- src/utils/prompts.ts | 2 +- src/{ => utils}/settings_updater.ts | 22 +- src/utils/subspawn.ts | 2 +- src/utils/vscode_utils.ts | 30 + syntaxes/GDResource.tmLanguage.json | 514 ++---- syntaxes/GDScript.tmLanguage.json | 1561 +++++++---------- syntaxes/GDShader.tmLanguage.json | 664 +++---- syntaxes/examples/gdscript1.gd | 2 +- tools/generate_icons.ts | 172 +- tsconfig.json | 11 +- 1090 files changed, 6483 insertions(+), 5297 deletions(-) create mode 100644 .vscode-test.js create mode 100644 CONTRIBUTING.md delete mode 100644 configurations/gdresource-configuration.json create mode 100644 configurations/gdresource.language-configuration.json delete mode 100644 configurations/gdscript-configuration.json create mode 100644 configurations/gdscript.language-configuration.json delete mode 100644 configurations/gdshader-configuration.json create mode 100644 configurations/gdshader.language-configuration.json create mode 100644 img/hover-extresource.png create mode 100644 img/hover-subresource.png create mode 100644 img/scene-preview.png create mode 100644 media/docs.css create mode 100644 media/pagemap.js create mode 100644 media/prism.css delete mode 100644 resources/dark/icon_GUI_visibility_visible.svg delete mode 100644 resources/dark/icon_a_r_v_r_anchor.svg delete mode 100644 resources/dark/icon_a_r_v_r_camera.svg delete mode 100644 resources/dark/icon_a_r_v_r_controller.svg delete mode 100644 resources/dark/icon_a_r_v_r_origin.svg delete mode 100644 resources/dark/icon_accept_dialog.svg delete mode 100644 resources/dark/icon_animated_sprite.svg delete mode 100644 resources/dark/icon_animated_sprite_3d.svg delete mode 100644 resources/dark/icon_animation_player.svg delete mode 100644 resources/dark/icon_animation_tree.svg delete mode 100644 resources/dark/icon_animation_tree_player.svg delete mode 100644 resources/dark/icon_area.svg delete mode 100644 resources/dark/icon_area_2d.svg delete mode 100644 resources/dark/icon_audio_stream_player.svg delete mode 100644 resources/dark/icon_audio_stream_player_2_d.svg delete mode 100644 resources/dark/icon_audio_stream_player_3_d.svg delete mode 100644 resources/dark/icon_back_buffer_copy.svg delete mode 100644 resources/dark/icon_baked_lightmap.svg delete mode 100644 resources/dark/icon_bone_2_d.svg delete mode 100644 resources/dark/icon_bone_attachment.svg delete mode 100644 resources/dark/icon_button.svg delete mode 100644 resources/dark/icon_c_p_u_particles.svg delete mode 100644 resources/dark/icon_c_p_u_particles_2_d.svg delete mode 100644 resources/dark/icon_camera.svg delete mode 100644 resources/dark/icon_camera_2d.svg delete mode 100644 resources/dark/icon_canvas_layer.svg delete mode 100644 resources/dark/icon_canvas_modulate.svg delete mode 100644 resources/dark/icon_center_container.svg delete mode 100644 resources/dark/icon_check_box.svg delete mode 100644 resources/dark/icon_check_button.svg delete mode 100644 resources/dark/icon_clipped_camera.svg delete mode 100644 resources/dark/icon_collision_polygon.svg delete mode 100644 resources/dark/icon_collision_polygon_2d.svg delete mode 100644 resources/dark/icon_collision_shape.svg delete mode 100644 resources/dark/icon_collision_shape_2d.svg delete mode 100644 resources/dark/icon_color_picker.svg delete mode 100644 resources/dark/icon_color_picker_button.svg delete mode 100644 resources/dark/icon_color_rect.svg delete mode 100644 resources/dark/icon_cone_twist_joint.svg delete mode 100644 resources/dark/icon_confirmation_dialog.svg delete mode 100644 resources/dark/icon_container.svg delete mode 100644 resources/dark/icon_control.svg delete mode 100644 resources/dark/icon_damped_spring_joint_2d.svg delete mode 100644 resources/dark/icon_directional_light.svg delete mode 100644 resources/dark/icon_file_dialog.svg delete mode 100644 resources/dark/icon_g_i_probe.svg delete mode 100644 resources/dark/icon_generic_6_d_o_f_joint.svg delete mode 100644 resources/dark/icon_graph_edit.svg delete mode 100644 resources/dark/icon_graph_node.svg delete mode 100644 resources/dark/icon_grid_container.svg delete mode 100644 resources/dark/icon_groove_joint_2d.svg delete mode 100644 resources/dark/icon_h_box_container.svg delete mode 100644 resources/dark/icon_h_scroll_bar.svg delete mode 100644 resources/dark/icon_h_separator.svg delete mode 100644 resources/dark/icon_h_slider.svg delete mode 100644 resources/dark/icon_h_split_container.svg delete mode 100644 resources/dark/icon_h_t_t_p_request.svg delete mode 100644 resources/dark/icon_hinge_joint.svg delete mode 100644 resources/dark/icon_immediate_geometry.svg delete mode 100644 resources/dark/icon_interpolated_camera.svg delete mode 100644 resources/dark/icon_item_list.svg delete mode 100644 resources/dark/icon_kinematic_body.svg delete mode 100644 resources/dark/icon_kinematic_body_2d.svg delete mode 100644 resources/dark/icon_label.svg delete mode 100644 resources/dark/icon_light_2d.svg delete mode 100644 resources/dark/icon_light_occluder_2d.svg delete mode 100644 resources/dark/icon_line_2d.svg delete mode 100644 resources/dark/icon_line_edit.svg delete mode 100644 resources/dark/icon_link_button.svg delete mode 100644 resources/dark/icon_listener.svg delete mode 100644 resources/dark/icon_margin_container.svg delete mode 100644 resources/dark/icon_menu_button.svg delete mode 100644 resources/dark/icon_mesh_instance.svg delete mode 100644 resources/dark/icon_mesh_instance_2d.svg delete mode 100644 resources/dark/icon_multi_mesh_instance.svg delete mode 100644 resources/dark/icon_multi_mesh_instance_2d.svg delete mode 100644 resources/dark/icon_navigation.svg delete mode 100644 resources/dark/icon_navigation_2d.svg delete mode 100644 resources/dark/icon_navigation_mesh_instance.svg delete mode 100644 resources/dark/icon_navigation_polygon_instance.svg delete mode 100644 resources/dark/icon_nine_patch_rect.svg delete mode 100644 resources/dark/icon_node.svg delete mode 100644 resources/dark/icon_node_2d.svg delete mode 100644 resources/dark/icon_omni_light.svg delete mode 100644 resources/dark/icon_option_button.svg delete mode 100644 resources/dark/icon_panel.svg delete mode 100644 resources/dark/icon_panel_container.svg delete mode 100644 resources/dark/icon_parallax_background.svg delete mode 100644 resources/dark/icon_parallax_layer.svg delete mode 100644 resources/dark/icon_particles.svg delete mode 100644 resources/dark/icon_particles_2d.svg delete mode 100644 resources/dark/icon_path.svg delete mode 100644 resources/dark/icon_path_2d.svg delete mode 100644 resources/dark/icon_path_follow.svg delete mode 100644 resources/dark/icon_path_follow_2d.svg delete mode 100644 resources/dark/icon_physical_bone.svg delete mode 100644 resources/dark/icon_pin_joint.svg delete mode 100644 resources/dark/icon_pin_joint_2d.svg delete mode 100644 resources/dark/icon_polygon_2_d.svg delete mode 100644 resources/dark/icon_popup.svg delete mode 100644 resources/dark/icon_popup_dialog.svg delete mode 100644 resources/dark/icon_popup_menu.svg delete mode 100644 resources/dark/icon_popup_panel.svg delete mode 100644 resources/dark/icon_position_2d.svg delete mode 100644 resources/dark/icon_position_3d.svg delete mode 100644 resources/dark/icon_progress_bar.svg delete mode 100644 resources/dark/icon_ray_cast.svg delete mode 100644 resources/dark/icon_ray_cast_2d.svg delete mode 100644 resources/dark/icon_reference_rect.svg delete mode 100644 resources/dark/icon_reflection_probe.svg delete mode 100644 resources/dark/icon_remote_transform.svg delete mode 100644 resources/dark/icon_remote_transform_2d.svg delete mode 100644 resources/dark/icon_resource_preloader.svg delete mode 100644 resources/dark/icon_rich_text_label.svg delete mode 100644 resources/dark/icon_rigid_body.svg delete mode 100644 resources/dark/icon_rigid_body_2d.svg delete mode 100644 resources/dark/icon_scroll_container.svg delete mode 100644 resources/dark/icon_skeleton.svg delete mode 100644 resources/dark/icon_skeleton_2d.svg delete mode 100644 resources/dark/icon_skeleton_i_k.svg delete mode 100644 resources/dark/icon_slider_joint.svg delete mode 100644 resources/dark/icon_soft_body.svg delete mode 100644 resources/dark/icon_spatial.svg delete mode 100644 resources/dark/icon_spin_box.svg delete mode 100644 resources/dark/icon_spot_light.svg delete mode 100644 resources/dark/icon_spring_arm.svg delete mode 100644 resources/dark/icon_sprite.svg delete mode 100644 resources/dark/icon_sprite_3d.svg delete mode 100644 resources/dark/icon_static_body.svg delete mode 100644 resources/dark/icon_static_body_2d.svg delete mode 100644 resources/dark/icon_tab_container.svg delete mode 100644 resources/dark/icon_tabs.svg delete mode 100644 resources/dark/icon_text_edit.svg delete mode 100644 resources/dark/icon_texture_button.svg delete mode 100644 resources/dark/icon_texture_progress.svg delete mode 100644 resources/dark/icon_texture_rect.svg delete mode 100644 resources/dark/icon_tile_map.svg delete mode 100644 resources/dark/icon_timer.svg delete mode 100644 resources/dark/icon_tool_button.svg delete mode 100644 resources/dark/icon_touch_screen_button.svg delete mode 100644 resources/dark/icon_tree.svg delete mode 100644 resources/dark/icon_tween.svg delete mode 100644 resources/dark/icon_v_box_container.svg delete mode 100644 resources/dark/icon_v_scroll_bar.svg delete mode 100644 resources/dark/icon_v_separator.svg delete mode 100644 resources/dark/icon_v_slider.svg delete mode 100644 resources/dark/icon_v_split_container.svg delete mode 100644 resources/dark/icon_vehicle_body.svg delete mode 100644 resources/dark/icon_vehicle_wheel.svg delete mode 100644 resources/dark/icon_video_player.svg delete mode 100644 resources/dark/icon_viewport.svg delete mode 100644 resources/dark/icon_viewport_container.svg delete mode 100644 resources/dark/icon_visibility_enabler.svg delete mode 100644 resources/dark/icon_visibility_enabler_2d.svg delete mode 100644 resources/dark/icon_visibility_notifier.svg delete mode 100644 resources/dark/icon_visibility_notifier_2d.svg delete mode 100644 resources/dark/icon_window_dialog.svg delete mode 100644 resources/dark/icon_world_environment.svg delete mode 100644 resources/dark/icon_y_sort.svg create mode 100644 resources/godot_icons/dark/ArrowDown.svg create mode 100644 resources/godot_icons/dark/ArrowLeft.svg create mode 100644 resources/godot_icons/dark/ArrowRight.svg create mode 100644 resources/godot_icons/dark/ArrowUp.svg create mode 100644 resources/godot_icons/dark/AudioStreamPolyphonic.svg create mode 100644 resources/godot_icons/dark/CameraAttributesPhysical.svg create mode 100644 resources/godot_icons/dark/CameraAttributesPractical.svg create mode 100644 resources/godot_icons/dark/CanvasTexture.svg create mode 100644 resources/godot_icons/dark/CodeHighlighter.svg create mode 100644 resources/godot_icons/dark/CompressedTexture3D.svg create mode 100644 resources/godot_icons/dark/CurveXYZTexture.svg create mode 100644 resources/godot_icons/dark/Edit.svg create mode 100644 resources/godot_icons/dark/GraphElement.svg create mode 100644 resources/godot_icons/dark/GuiVisibilityHidden.svg create mode 100644 resources/godot_icons/dark/GuiVisibilityVisible.svg create mode 100644 resources/godot_icons/dark/GuiVisibilityXray.svg create mode 100644 resources/godot_icons/dark/Help.svg create mode 100644 resources/godot_icons/dark/HelpSearch.svg create mode 100644 resources/godot_icons/dark/ImageTexture3D.svg create mode 100644 resources/godot_icons/dark/ImportCheck.svg create mode 100644 resources/godot_icons/dark/ImportFail.svg create mode 100644 resources/godot_icons/dark/Info.svg create mode 100644 resources/godot_icons/dark/Lock.svg create mode 100644 resources/godot_icons/dark/NoiseTexture2D.svg create mode 100644 resources/godot_icons/dark/NoiseTexture3D.svg create mode 100644 resources/godot_icons/dark/PhysicalBone2D.svg create mode 100644 resources/godot_icons/dark/PlaceholderMaterial.svg create mode 100644 resources/godot_icons/dark/PlaceholderMesh.svg create mode 100644 resources/godot_icons/dark/PlaceholderTexture2D.svg create mode 100644 resources/godot_icons/dark/PlaceholderTexture3D.svg create mode 100644 resources/godot_icons/dark/Play.svg create mode 100644 resources/godot_icons/dark/PlayBackwards.svg create mode 100644 resources/godot_icons/dark/PlayCustom.svg create mode 100644 resources/godot_icons/dark/PlayRemote.svg create mode 100644 resources/godot_icons/dark/PlayScene.svg create mode 100644 resources/godot_icons/dark/PlayStart.svg create mode 100644 resources/godot_icons/dark/PortableCompressedTexture2D.svg create mode 100644 resources/godot_icons/dark/Progress1.svg create mode 100644 resources/godot_icons/dark/Progress2.svg create mode 100644 resources/godot_icons/dark/Progress3.svg create mode 100644 resources/godot_icons/dark/Progress4.svg create mode 100644 resources/godot_icons/dark/Progress5.svg create mode 100644 resources/godot_icons/dark/Progress6.svg create mode 100644 resources/godot_icons/dark/Progress7.svg create mode 100644 resources/godot_icons/dark/Progress8.svg create mode 100644 resources/godot_icons/dark/RegEx.svg create mode 100644 resources/godot_icons/dark/RegExMatch.svg create mode 100644 resources/godot_icons/dark/Reload.svg create mode 100644 resources/godot_icons/dark/ReloadSmall.svg create mode 100644 resources/godot_icons/dark/Script.svg create mode 100644 resources/godot_icons/dark/ScriptCreate.svg create mode 100644 resources/godot_icons/dark/ScriptRemove.svg create mode 100644 resources/godot_icons/dark/Search.svg create mode 100644 resources/godot_icons/dark/ShaderInclude.svg create mode 100644 resources/godot_icons/dark/Signals.svg create mode 100644 resources/godot_icons/dark/SignalsAndGroups.svg create mode 100644 resources/godot_icons/dark/Slot.svg create mode 100644 resources/godot_icons/dark/Stop.svg create mode 100644 resources/godot_icons/dark/SyntaxHighlighter.svg create mode 100644 resources/godot_icons/dark/Unlock.svg create mode 100644 resources/godot_icons/dark/Zoom.svg create mode 100644 resources/godot_icons/dark/ZoomLess.svg create mode 100644 resources/godot_icons/dark/ZoomMore.svg create mode 100644 resources/godot_icons/dark/ZoomReset.svg create mode 100644 resources/godot_icons/light/ArrowDown.svg create mode 100644 resources/godot_icons/light/ArrowLeft.svg create mode 100644 resources/godot_icons/light/ArrowRight.svg create mode 100644 resources/godot_icons/light/ArrowUp.svg create mode 100644 resources/godot_icons/light/AudioStreamPolyphonic.svg create mode 100644 resources/godot_icons/light/CameraAttributesPhysical.svg create mode 100644 resources/godot_icons/light/CameraAttributesPractical.svg create mode 100644 resources/godot_icons/light/CanvasTexture.svg create mode 100644 resources/godot_icons/light/CodeHighlighter.svg create mode 100644 resources/godot_icons/light/CompressedTexture3D.svg create mode 100644 resources/godot_icons/light/CurveXYZTexture.svg create mode 100644 resources/godot_icons/light/Edit.svg create mode 100644 resources/godot_icons/light/GraphElement.svg create mode 100644 resources/godot_icons/light/GuiVisibilityHidden.svg create mode 100644 resources/godot_icons/light/GuiVisibilityVisible.svg create mode 100644 resources/godot_icons/light/GuiVisibilityXray.svg create mode 100644 resources/godot_icons/light/Help.svg create mode 100644 resources/godot_icons/light/HelpSearch.svg create mode 100644 resources/godot_icons/light/ImageTexture3D.svg create mode 100644 resources/godot_icons/light/ImportCheck.svg create mode 100644 resources/godot_icons/light/ImportFail.svg create mode 100644 resources/godot_icons/light/Info.svg create mode 100644 resources/godot_icons/light/Lock.svg create mode 100644 resources/godot_icons/light/NoiseTexture2D.svg create mode 100644 resources/godot_icons/light/NoiseTexture3D.svg create mode 100644 resources/godot_icons/light/PhysicalBone2D.svg create mode 100644 resources/godot_icons/light/PlaceholderMaterial.svg create mode 100644 resources/godot_icons/light/PlaceholderMesh.svg create mode 100644 resources/godot_icons/light/PlaceholderTexture2D.svg create mode 100644 resources/godot_icons/light/PlaceholderTexture3D.svg create mode 100644 resources/godot_icons/light/Play.svg create mode 100644 resources/godot_icons/light/PlayBackwards.svg create mode 100644 resources/godot_icons/light/PlayCustom.svg create mode 100644 resources/godot_icons/light/PlayRemote.svg create mode 100644 resources/godot_icons/light/PlayScene.svg create mode 100644 resources/godot_icons/light/PlayStart.svg create mode 100644 resources/godot_icons/light/PortableCompressedTexture2D.svg create mode 100644 resources/godot_icons/light/Progress1.svg create mode 100644 resources/godot_icons/light/Progress2.svg create mode 100644 resources/godot_icons/light/Progress3.svg create mode 100644 resources/godot_icons/light/Progress4.svg create mode 100644 resources/godot_icons/light/Progress5.svg create mode 100644 resources/godot_icons/light/Progress6.svg create mode 100644 resources/godot_icons/light/Progress7.svg create mode 100644 resources/godot_icons/light/Progress8.svg create mode 100644 resources/godot_icons/light/RegEx.svg create mode 100644 resources/godot_icons/light/RegExMatch.svg create mode 100644 resources/godot_icons/light/Reload.svg create mode 100644 resources/godot_icons/light/ReloadSmall.svg create mode 100644 resources/godot_icons/light/Script.svg create mode 100644 resources/godot_icons/light/ScriptCreate.svg create mode 100644 resources/godot_icons/light/ScriptRemove.svg create mode 100644 resources/godot_icons/light/Search.svg create mode 100644 resources/godot_icons/light/ShaderInclude.svg create mode 100644 resources/godot_icons/light/Signals.svg create mode 100644 resources/godot_icons/light/SignalsAndGroups.svg create mode 100644 resources/godot_icons/light/Slot.svg create mode 100644 resources/godot_icons/light/Stop.svg create mode 100644 resources/godot_icons/light/SyntaxHighlighter.svg create mode 100644 resources/godot_icons/light/Unlock.svg create mode 100644 resources/godot_icons/light/Zoom.svg create mode 100644 resources/godot_icons/light/ZoomLess.svg create mode 100644 resources/godot_icons/light/ZoomMore.svg create mode 100644 resources/godot_icons/light/ZoomReset.svg delete mode 100644 resources/hashes delete mode 100644 resources/light/icon_GUI_visibility_visible.svg delete mode 100644 resources/light/icon_a_r_v_r_anchor.svg delete mode 100644 resources/light/icon_a_r_v_r_camera.svg delete mode 100644 resources/light/icon_a_r_v_r_controller.svg delete mode 100644 resources/light/icon_a_r_v_r_origin.svg delete mode 100644 resources/light/icon_accept_dialog.svg delete mode 100644 resources/light/icon_animated_sprite.svg delete mode 100644 resources/light/icon_animated_sprite_3d.svg delete mode 100644 resources/light/icon_animation_player.svg delete mode 100644 resources/light/icon_animation_tree.svg delete mode 100644 resources/light/icon_animation_tree_player.svg delete mode 100644 resources/light/icon_area.svg delete mode 100644 resources/light/icon_area_2d.svg delete mode 100644 resources/light/icon_audio_stream_player.svg delete mode 100644 resources/light/icon_audio_stream_player_2_d.svg delete mode 100644 resources/light/icon_audio_stream_player_3_d.svg delete mode 100644 resources/light/icon_back_buffer_copy.svg delete mode 100644 resources/light/icon_baked_lightmap.svg delete mode 100644 resources/light/icon_bone_2_d.svg delete mode 100644 resources/light/icon_bone_attachment.svg delete mode 100644 resources/light/icon_button.svg delete mode 100644 resources/light/icon_c_p_u_particles.svg delete mode 100644 resources/light/icon_c_p_u_particles_2_d.svg delete mode 100644 resources/light/icon_camera.svg delete mode 100644 resources/light/icon_camera_2d.svg delete mode 100644 resources/light/icon_canvas_layer.svg delete mode 100644 resources/light/icon_canvas_modulate.svg delete mode 100644 resources/light/icon_center_container.svg delete mode 100644 resources/light/icon_check_box.svg delete mode 100644 resources/light/icon_check_button.svg delete mode 100644 resources/light/icon_clipped_camera.svg delete mode 100644 resources/light/icon_collision_polygon.svg delete mode 100644 resources/light/icon_collision_polygon_2d.svg delete mode 100644 resources/light/icon_collision_shape.svg delete mode 100644 resources/light/icon_collision_shape_2d.svg delete mode 100644 resources/light/icon_color_picker.svg delete mode 100644 resources/light/icon_color_picker_button.svg delete mode 100644 resources/light/icon_color_rect.svg delete mode 100644 resources/light/icon_cone_twist_joint.svg delete mode 100644 resources/light/icon_confirmation_dialog.svg delete mode 100644 resources/light/icon_container.svg delete mode 100644 resources/light/icon_control.svg delete mode 100644 resources/light/icon_damped_spring_joint_2d.svg delete mode 100644 resources/light/icon_directional_light.svg delete mode 100644 resources/light/icon_file_dialog.svg delete mode 100644 resources/light/icon_g_i_probe.svg delete mode 100644 resources/light/icon_generic_6_d_o_f_joint.svg delete mode 100644 resources/light/icon_graph_edit.svg delete mode 100644 resources/light/icon_graph_node.svg delete mode 100644 resources/light/icon_grid_container.svg delete mode 100644 resources/light/icon_groove_joint_2d.svg delete mode 100644 resources/light/icon_h_box_container.svg delete mode 100644 resources/light/icon_h_scroll_bar.svg delete mode 100644 resources/light/icon_h_separator.svg delete mode 100644 resources/light/icon_h_slider.svg delete mode 100644 resources/light/icon_h_split_container.svg delete mode 100644 resources/light/icon_h_t_t_p_request.svg delete mode 100644 resources/light/icon_hinge_joint.svg delete mode 100644 resources/light/icon_immediate_geometry.svg delete mode 100644 resources/light/icon_interpolated_camera.svg delete mode 100644 resources/light/icon_item_list.svg delete mode 100644 resources/light/icon_kinematic_body.svg delete mode 100644 resources/light/icon_kinematic_body_2d.svg delete mode 100644 resources/light/icon_label.svg delete mode 100644 resources/light/icon_light_2d.svg delete mode 100644 resources/light/icon_light_occluder_2d.svg delete mode 100644 resources/light/icon_line_2d.svg delete mode 100644 resources/light/icon_line_edit.svg delete mode 100644 resources/light/icon_link_button.svg delete mode 100644 resources/light/icon_listener.svg delete mode 100644 resources/light/icon_margin_container.svg delete mode 100644 resources/light/icon_menu_button.svg delete mode 100644 resources/light/icon_mesh_instance.svg delete mode 100644 resources/light/icon_mesh_instance_2d.svg delete mode 100644 resources/light/icon_multi_mesh_instance.svg delete mode 100644 resources/light/icon_multi_mesh_instance_2d.svg delete mode 100644 resources/light/icon_navigation.svg delete mode 100644 resources/light/icon_navigation_2d.svg delete mode 100644 resources/light/icon_navigation_mesh_instance.svg delete mode 100644 resources/light/icon_navigation_polygon_instance.svg delete mode 100644 resources/light/icon_nine_patch_rect.svg delete mode 100644 resources/light/icon_node.svg delete mode 100644 resources/light/icon_node_2d.svg delete mode 100644 resources/light/icon_omni_light.svg delete mode 100644 resources/light/icon_option_button.svg delete mode 100644 resources/light/icon_panel.svg delete mode 100644 resources/light/icon_panel_container.svg delete mode 100644 resources/light/icon_parallax_background.svg delete mode 100644 resources/light/icon_parallax_layer.svg delete mode 100644 resources/light/icon_particles.svg delete mode 100644 resources/light/icon_particles_2d.svg delete mode 100644 resources/light/icon_path.svg delete mode 100644 resources/light/icon_path_2d.svg delete mode 100644 resources/light/icon_path_follow.svg delete mode 100644 resources/light/icon_path_follow_2d.svg delete mode 100644 resources/light/icon_physical_bone.svg delete mode 100644 resources/light/icon_pin_joint.svg delete mode 100644 resources/light/icon_pin_joint_2d.svg delete mode 100644 resources/light/icon_polygon_2_d.svg delete mode 100644 resources/light/icon_popup.svg delete mode 100644 resources/light/icon_popup_dialog.svg delete mode 100644 resources/light/icon_popup_menu.svg delete mode 100644 resources/light/icon_popup_panel.svg delete mode 100644 resources/light/icon_position_2d.svg delete mode 100644 resources/light/icon_position_3d.svg delete mode 100644 resources/light/icon_progress_bar.svg delete mode 100644 resources/light/icon_ray_cast.svg delete mode 100644 resources/light/icon_ray_cast_2d.svg delete mode 100644 resources/light/icon_reference_rect.svg delete mode 100644 resources/light/icon_reflection_probe.svg delete mode 100644 resources/light/icon_remote_transform.svg delete mode 100644 resources/light/icon_remote_transform_2d.svg delete mode 100644 resources/light/icon_resource_preloader.svg delete mode 100644 resources/light/icon_rich_text_label.svg delete mode 100644 resources/light/icon_rigid_body.svg delete mode 100644 resources/light/icon_rigid_body_2d.svg delete mode 100644 resources/light/icon_scroll_container.svg delete mode 100644 resources/light/icon_skeleton.svg delete mode 100644 resources/light/icon_skeleton_2d.svg delete mode 100644 resources/light/icon_skeleton_i_k.svg delete mode 100644 resources/light/icon_slider_joint.svg delete mode 100644 resources/light/icon_soft_body.svg delete mode 100644 resources/light/icon_spatial.svg delete mode 100644 resources/light/icon_spin_box.svg delete mode 100644 resources/light/icon_spot_light.svg delete mode 100644 resources/light/icon_spring_arm.svg delete mode 100644 resources/light/icon_sprite.svg delete mode 100644 resources/light/icon_sprite_3d.svg delete mode 100644 resources/light/icon_static_body.svg delete mode 100644 resources/light/icon_static_body_2d.svg delete mode 100644 resources/light/icon_tab_container.svg delete mode 100644 resources/light/icon_tabs.svg delete mode 100644 resources/light/icon_text_edit.svg delete mode 100644 resources/light/icon_texture_button.svg delete mode 100644 resources/light/icon_texture_progress.svg delete mode 100644 resources/light/icon_texture_rect.svg delete mode 100644 resources/light/icon_tile_map.svg delete mode 100644 resources/light/icon_timer.svg delete mode 100644 resources/light/icon_tool_button.svg delete mode 100644 resources/light/icon_touch_screen_button.svg delete mode 100644 resources/light/icon_tree.svg delete mode 100644 resources/light/icon_tween.svg delete mode 100644 resources/light/icon_v_box_container.svg delete mode 100644 resources/light/icon_v_scroll_bar.svg delete mode 100644 resources/light/icon_v_separator.svg delete mode 100644 resources/light/icon_v_slider.svg delete mode 100644 resources/light/icon_v_split_container.svg delete mode 100644 resources/light/icon_vehicle_body.svg delete mode 100644 resources/light/icon_vehicle_wheel.svg delete mode 100644 resources/light/icon_video_player.svg delete mode 100644 resources/light/icon_viewport.svg delete mode 100644 resources/light/icon_viewport_container.svg delete mode 100644 resources/light/icon_visibility_enabler.svg delete mode 100644 resources/light/icon_visibility_enabler_2d.svg delete mode 100644 resources/light/icon_visibility_notifier.svg delete mode 100644 resources/light/icon_visibility_notifier_2d.svg delete mode 100644 resources/light/icon_window_dialog.svg delete mode 100644 resources/light/icon_world_environment.svg delete mode 100644 resources/light/icon_y_sort.svg create mode 100644 resources/onig.wasm rename resources/{ => other_icons}/dark/icon_edit.svg (100%) rename resources/{ => other_icons}/dark/icon_refresh.svg (100%) rename resources/{ => other_icons}/light/icon_edit.svg (99%) rename resources/{ => other_icons}/light/icon_refresh.svg (99%) create mode 100644 src/debugger/index.ts delete mode 100644 src/document_link_provider.ts create mode 100644 src/formatter/formatter.test.ts create mode 100644 src/formatter/formatter.ts create mode 100644 src/formatter/index.ts create mode 100644 src/formatter/symbols.ts create mode 100644 src/formatter/tests/test1.in.gd create mode 100644 src/formatter/tests/test1.out.gd create mode 100644 src/formatter/textmate.ts delete mode 100644 src/lsp/NativeDocumentManager.ts create mode 100644 src/lsp/index.ts create mode 100644 src/providers/completions.ts create mode 100644 src/providers/definition.ts create mode 100644 src/providers/document_link.ts create mode 100644 src/providers/documentation.ts create mode 100644 src/providers/documentation_builder.ts create mode 100644 src/providers/hover.ts create mode 100644 src/providers/index.ts create mode 100644 src/providers/inlay_hints.ts create mode 100644 src/providers/semantic_tokens.ts create mode 100644 src/providers/tasks.ts delete mode 100644 src/scene_preview_provider.ts create mode 100644 src/scene_tools/index.ts create mode 100644 src/scene_tools/parser.ts create mode 100644 src/scene_tools/preview.ts create mode 100644 src/scene_tools/types.ts rename src/{utils.ts => utils/index.ts} (70%) rename src/{ => utils}/logger.ts (98%) rename src/{ => utils}/settings_updater.ts (73%) create mode 100644 src/utils/vscode_utils.ts diff --git a/.gitignore b/.gitignore index fdac585..4e36fcf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,5 @@ out node_modules -server -publish/*.vsix -test *.vsix -configurations/tmp.txt -configurations/test.py .vscode-test workspace.code-workspace diff --git a/.vscode-test.js b/.vscode-test.js new file mode 100644 index 0000000..a96fa20 --- /dev/null +++ b/.vscode-test.js @@ -0,0 +1,9 @@ +const { defineConfig } = require('@vscode/test-cli'); + +module.exports = defineConfig( + { + // version: '1.84.0', + label: 'unitTests', + files: 'out/**/*.test.js', + } +); diff --git a/.vscode/launch.json b/.vscode/launch.json index 1bc3c49..65b8169 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -27,8 +27,9 @@ "request": "launch", "runtimeExecutable": "${execPath}", "args": [ - "${workspaceFolder}/workspace.code-workspace", - "--extensionDevelopmentPath=${workspaceFolder}" + "--profile=temp", + "--extensionDevelopmentPath=${workspaceFolder}", + "${workspaceFolder}/workspace.code-workspace" ], "outFiles": [ "${workspaceFolder}/out/**/*.js" diff --git a/.vscodeignore b/.vscodeignore index 6303142..318ffbf 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -1,10 +1,11 @@ * */** +**/*.js.map !out/extension.js -!syntaxes/ +!syntaxes/*.tmLanguage.json !resources/ +!media/ !configurations/ -syntaxes/examples !package.json !package.nls.json !README.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..a254b5d --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,39 @@ +# Contributing + +### Building from source + +#### Requirements + +- [npm](https://www.npmjs.com/get-npm) + +#### Process + +1. Open a command prompt/terminal and browse to the location of this repository on your local filesystem. +2. Download dependencies by using the command `npm install` +3. When done, package a VSIX file by using the command `npm run package`. +4. Install it by opening Visual Studio Code, opening the Extensions tab, clicking on the More actions (**...**) button in the top right, and choose **Install from VSIX...** and find the compiled VSIX file. + +When developing for the extension, you can open this project in Visual Studio Code and debug the extension by using the **Run Extension** launch configuration instead of going through steps 3 and 4. It will launch a new instance of Visual Studio Code that has the extension running. You can then open a Godot project folder and debug the extension or GDScript debugger. + +Additionally, if you create a `workspace.code-workspace` file, you can use the **Run Extension with workspace file** launch configuration to quickly change what folder your Extension Host is running in, and quickly change the settings passed to the debug environment + +An example `workspace.code-workspace` file: +```jsonc +{ + "folders": [ + { + // "path": "." + "path": "P:/project1" + // "path": "P:/project2" + // "path": "P:/folder/project3" + } + ], + "settings": { + "godotTools.editorPath.godot3": "godot3.dev.exe", + "godotTools.editorPath.godot4": "godot4.dev.exe", + // "godotTools.editorPath.godot4": "godot4.custom.exe" + // "godotTools.editorPath.godot4": "Godot_v4.1.1-stable_win64.exe", + "godotTools.lsp.headless": false + } +} +``` diff --git a/README.md b/README.md index bc8ad36..96c8fdb 100644 --- a/README.md +++ b/README.md @@ -1,34 +1,64 @@ # Godot Tools -A complete set of tools to code games with -[Godot Engine](http://www.godotengine.org/) in Visual Studio Code. +Game development tools for working with [Godot Engine](http://www.godotengine.org/) in Visual Studio Code. **IMPORTANT NOTE:** Versions 1.0.0 and later of this extension only support Godot 3.2 or later. -## Features +- [Godot Tools](#godot-tools) +- [Features](#features) +- [Download](#download) +- [Commands](#commands) +- [Configuration](#configuration) + - [Godot Editor](#godot-editor) + - [VS Code](#vs-code) +- [GDScript Debugger](#gdscript-debugger) + - [*Configurations*](#configurations) + - [Issues and contributions](#issues-and-contributions) +- [Contributing](#contributing) + - [FAQ](#faq) + - [Why does it fail to connect to the language server?](#why-does-it-fail-to-connect-to-the-language-server) + - [Why isn't IntelliSense displaying script members?](#why-isnt-intellisense-displaying-script-members) -The extension comes with a wealth of features to make your Godot programming -experience as comfortable as possible: -- Syntax highlighting for the GDScript (`.gd`) language -- Syntax highlighting for the `.tscn` and `.tres` scene formats -- Syntax highlighting for the `.gdshader` shader format -- Full typed GDScript support -- Optional "Smart Mode" to improve productivity with dynamically typed scripts -- Function definitions and documentation display on hover (see image below) -- Rich autocompletion -- Switch from a `.gd` file to the related `.tscn` file (default keybind is `alt+o`) -- In-editor Scene Preview -- Display script warnings and errors -- Ctrl + click on a variable or method call to jump to its definition -- Full documentation of the Godot Engine's API supported (select *Godot Tools: List native classes of Godot* in the Command Palette) -- Run a Godot project from VS Code -- Debug your GDScript-based Godot project from VS Code with breakpoints, step-in/out/over, variable watch, call stack, and active scene tree +# Features -![Showing the documentation on hover feature](img/godot-tools.png) +(**bold items** are new in Godot Tools `v2.0.0`) +- **ALL FEATURES FULLY SUPPORT GODOT 4** +- GDScript (`.gd`) language features: + - syntax highlighting + - `ctrl+click` on any symbol to jump to its definition or **open its documentation** + - `ctrl+click` on `res://resource/path` links + - **hover previews on `res://resource/path` links** + - autocompletions + - full typed GDScript support + - optional "Smart Mode" to improve productivity with dynamically typed scripts + - Hover previews show function/variable definitions including doc-comments + - **switch from a `.gd` file to the related `.tscn` file (default keybind is `alt+o`)** + - display script warnings and errors +- GDScript Debugger features: + - **completely rewritten, greatly improved reliability** + - **new, simple configuration** (seriously, just hit F5!) + - **convenient launch targets: current project/current file/pinned file**, + - breakpoints + - exceptions + - step-in/out/over + - variable watch + - call stack + - active scene tree + - inspector +- GDResource (`.tscn` and `.tres`) language features: + - syntax highlighting + - **`ctrl+click` on `res://resource/path` links** + - **`ctrl+click` on symbols to jump to its definition or open its documentation** + - **hover previews show definitions of External and Sub Resources** + - **hover previews on `res://resource/path` links** + - **inlay hints to help visualize External and Sub Resources** + - **in-editor Scene Preview** +- GDShader (`.gdshader`) language features: + - syntax highlighting -## Download +# Download - [Visual Studio Marketplace **(recommended)**](https://marketplace.visualstudio.com/items?itemName=geequlim.godot-tools) - Stable release, with support for automatic updates. @@ -42,32 +72,32 @@ To install from GitHub Releases or a development build, see [Install from a VSIX](https://code.visualstudio.com/docs/editor/extension-marketplace#_install-from-a-vsix) in the Visual Studio Code documentation. -## Available commands +# Commands The extension adds a few entries to the VS Code Command Palette under "Godot Tools": - Open workspace with Godot editor -- Run the workspace as a Godot project -- List Godot's native classes +- List Godot's native classes (and open thier documentation) +- Debug the current `.tscn`/`.gd` file +- Debug the pinned `.tscn`/`.gd` file +- Pin/Unpin the current `.tscn`/`.gd` file for debugging +- Open the pinned file -## Configuration +# Configuration -### Godot +### Godot Editor -If you like this extension, you can set VS Code as your default script editor -for Godot by following these steps: +You can set VS Code as your default script editor for Godot by following these steps: 1. Open the **Editor Settings** 2. Select **Text Editor > External** -3. Make sure the **Use External Editor** box is checked +3. Check **Use External Editor** 4. Fill **Exec Path** with the path to your VS Code executable * On macOS, this executable is typically located at: `/Applications/Visual Studio Code.app/Contents/MacOS/Electron` 5. Fill **Exec Flags** with `{project} --goto {file}:{line}:{col}` ### VS Code -#### Settings - You can use the following settings to configure Godot Tools: - `godotTools.editorPath.godot3` @@ -79,7 +109,7 @@ The path to the Godot editor executable. _Under Mac OS, this is the executable i When using Godot >3.6 or >4.2, Headless LSP mode is available. In Headless mode, the extension will attempt to launch a windowless instance of the Godot editor to use as its Language Server. -#### GDScript Debugger +# GDScript Debugger The debugger is for GDScript projects. To debug C# projects, use [C# Tools for Godot](https://github.com/godotengine/godot-csharp-vscode). @@ -97,22 +127,44 @@ To configure the GDScript debugger: ### *Configurations* -_Required_ - -None: seriously. This is valid debugging configuration: - +Minimal: ```json -{ "name": "Launch", "type": "godot" } +{ + "name": "Launch", + "type": "godot", + "request": "launch" +} ``` -_Optional_ +Everything: +```json +{ + "name": "Launch", + "type": "godot", + "request": "launch", + "project": "${workspaceFolder}", + "address": "127.0.0.1", + "port": 6007, + "scene": "main|current|pinned|", + "editor_path": "", + // engine command line flags + "profiling": false, + "single_threaded_scene": false, + "debug_collisions": false, + "debug_paths": false, + "debug_navigation": false, + "debug_avoidance": false, + "debug_stringnames": false, + "frame_delay": 0, + "time_scale": 1.0, + "disable_vsync": false, + "fixed_fps": 60, + // anything else + "additional_options": "" +} +``` -`project`: Absolute path to a directory with a project.godot file. Defaults to the currently open VSCode workspace with `${workspaceFolder}`. -`port`: The port number for the Godot remote debugger to use. -`address`: The IP address for the Godot remote debugger to use. -`scene_file`: Path to a scene file to run instead of the projects 'main scene'. -`editor_path`: Absolute path to the Godot executable to be used for this debug profile. -`additional_options`: Additional command line arguments. +Godot's command flags are documented here: https://docs.godotengine.org/en/stable/tutorials/editor/command_line_tutorial.html *Usage* @@ -132,29 +184,16 @@ and create pull requests anytime. See the [full changelog](https://github.com/GodotExplorer/godot-tools/blob/master/CHANGELOG.md) for the latest changes. -### Building from source +# Contributing -#### Requirements - -- [npm](https://www.npmjs.com/get-npm) - -#### Process - -1. Open a command prompt/terminal and browse to the location of this repository on your local filesystem. -2. Download dependencies by using the command `npm install` -3. When done, package a VSIX file by using the command `npm run package`. -4. Install it by opening Visual Studio Code, opening the Extensions tab, clicking on the More actions (**...**) button in the top right, and choose **Install from VSIX...** and find the compiled VSIX file. - -When developing for the extension, you can open this project in Visual Studio Code and debug the extension by using the **Run Extension** launch configuration instead of going through steps 3 and 4. It will launch a new instance of Visual Studio Code that has the extension running. You can then open a Godot project folder and debug the extension or GDScript debugger. +see [CONTRIBUTING.md](CONTRIBUTING.md) ## FAQ ### Why does it fail to connect to the language server? - Godot 3.2 or later is required. -- For Godot 4, the [`gdscript_lsp_server_port` setting](#gdscript_lsp_server_port) - must be changed to `6005` to match the Godot editor's new default - language server port number. +- Make sure the Godot editor is running - Make sure to open the project in the Godot editor first. If you opened the editor after opening VS Code, you can click the **Retry** button in the bottom-right corner in VS Code. diff --git a/configurations/gdresource-configuration.json b/configurations/gdresource-configuration.json deleted file mode 100644 index 61fbaad..0000000 --- a/configurations/gdresource-configuration.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "comments": { - "lineComment": ";" - }, - "brackets": [ - ["(", ")"], - ["[", "]"], - ["{", "}"] - ], - "autoClosingPairs": [ - ["'", "'"], - ["\"", "\""], - ["(", ")"], - ["[", "]"], - ["{", "}"] - ], - "surroundingPairs": [ - ["'", "'"], - ["\"", "\""], - ["(", ")"], - ["[", "]"], - ["{", "}"] - ] -} diff --git a/configurations/gdresource.language-configuration.json b/configurations/gdresource.language-configuration.json new file mode 100644 index 0000000..9650818 --- /dev/null +++ b/configurations/gdresource.language-configuration.json @@ -0,0 +1,24 @@ +{ + "comments": { + "lineComment": ";" + }, + "brackets": [ + ["(", ")"], + ["[", "]"], + ["{", "}"] + ], + "autoClosingPairs": [ + ["'", "'"], + ["\"", "\""], + ["(", ")"], + ["[", "]"], + ["{", "}"] + ], + "surroundingPairs": [ + ["'", "'"], + ["\"", "\""], + ["(", ")"], + ["[", "]"], + ["{", "}"] + ] +} diff --git a/configurations/gdscript-configuration.json b/configurations/gdscript-configuration.json deleted file mode 100644 index 44bfed0..0000000 --- a/configurations/gdscript-configuration.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "comments": { - "lineComment": "#", - "blockComment": [ - "\"\"\"", - "\"\"\"" - ] - }, - "brackets": [ - [ - "(", - ")" - ], - [ - "[", - "]" - ], - [ - "{", - "}" - ] - ], - "autoClosingPairs": [ - [ - "'", - "'" - ], - [ - "\"", - "\"" - ], - [ - "(", - ")" - ], - [ - "[", - "]" - ], - [ - "{", - "}" - ] - ], - "surroundingPairs": [ - [ - "'", - "'" - ], - [ - "\"", - "\"" - ], - [ - "(", - ")" - ], - [ - "[", - "]" - ], - [ - "{", - "}" - ] - ], - "folding": { - "offSide": true, - "markers": { - "start": "^\\s*#\\s*region\\b", - "end": "^\\s*#\\s*endregion\\b" - } - }, - "onEnterRules": [ - { - "beforeText": ":\\s*$", - "action": { - "indent": "indent" - } - } - ] -} diff --git a/configurations/gdscript.language-configuration.json b/configurations/gdscript.language-configuration.json new file mode 100644 index 0000000..090d7b1 --- /dev/null +++ b/configurations/gdscript.language-configuration.json @@ -0,0 +1,40 @@ +{ + "comments": { + "lineComment": "#" + }, + "brackets": [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + "autoClosingPairs": [ + { "open": "{", "close": "}" }, + { "open": "[", "close": "]" }, + { "open": "(", "close": ")" }, + { "open": "\"", "close": "\"", "notIn": ["string", "comment"] }, + { "open": "'", "close": "'", "notIn": ["string", "comment"] } + ], + "autoCloseBefore": ";:.,=}])>` \n\t", + "surroundingPairs": [ + ["{", "}"], + ["[", "]"], + ["(", ")"], + ["\"", "\""], + ["'", "'"] + ], + "folding": { + "offSide": true, + "markers": { + "start": "^\\s*#\\s*region\\b", + "end": "^\\s*#\\s*endregion\\b" + } + }, + "onEnterRules": [ + { + "beforeText": ":\\s*$", + "action": { + "indent": "indent" + } + } + ] +} diff --git a/configurations/gdshader-configuration.json b/configurations/gdshader-configuration.json deleted file mode 100644 index e2fb479..0000000 --- a/configurations/gdshader-configuration.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "comments": { - "lineComment": "//", - "blockComment": ["/*", "*/"] - }, - "brackets": [ - ["(", ")"], - ["[", "]"], - ["{", "}"] - ], - "autoClosingPairs": [ - ["'", "'"], - ["\"", "\""], - ["(", ")"], - ["[", "]"], - ["{", "}"] - ], - "surroundingPairs": [ - ["'", "'"], - ["\"", "\""], - ["(", ")"], - ["[", "]"], - ["{", "}"] - ] -} diff --git a/configurations/gdshader.language-configuration.json b/configurations/gdshader.language-configuration.json new file mode 100644 index 0000000..067c08c --- /dev/null +++ b/configurations/gdshader.language-configuration.json @@ -0,0 +1,25 @@ +{ + "comments": { + "lineComment": "//", + "blockComment": ["/*", "*/"] + }, + "brackets": [ + ["(", ")"], + ["[", "]"], + ["{", "}"] + ], + "autoClosingPairs": [ + ["'", "'"], + ["\"", "\""], + ["(", ")"], + ["[", "]"], + ["{", "}"] + ], + "surroundingPairs": [ + ["'", "'"], + ["\"", "\""], + ["(", ")"], + ["[", "]"], + ["{", "}"] + ] +} diff --git a/img/hover-extresource.png b/img/hover-extresource.png new file mode 100644 index 0000000000000000000000000000000000000000..65d56ac439712e48be07883a033995905d3456ce GIT binary patch literal 9337 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 YGa0P{+g-Owe-|Qysq3ksR35(gFIu7-G5`Po literal 0 HcmV?d00001 diff --git a/img/hover-subresource.png b/img/hover-subresource.png new file mode 100644 index 0000000000000000000000000000000000000000..17e96231c71a925966a4acce34f82c69f154497e GIT binary patch literal 18073 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 PaWV{^u6{1-oD!MUjDWjUR9$1`q|pX{@BVR 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�rkS1mX58Bz&T{@sqwpbmzJRPR>w|?HyB6*dq)E(XnoA8Il74g8O<5p#Q#gDX=Of8kBC68xnG8 z>&w<~8543iv15HM8Ch)8F#+mcM3*QWCmC7O$%*%lmew%Hv(DUQvbhC0+?sJ34Lzd7 zl;fVZ^t}|DoEgkMZ17j|^M+&OVcO#0+x|2mq8-`XK|yhI275iN}H- zv-vLcVLM?9mvyOSeATH}eQvioCTiWn-6=8bR&mGj)-Dd3>c4+TT#FvFh&5>J;HEj&o*QRbXSLQ?bUUUo3q3Jo%f^q54Q4o+VFiImlim8; z<=jx@ng{ezsAf>-hV?Q%`Sv2#LhaLJ5(eS7j4RpF+Qo_U9f$2d1oYZhdIiGHMDEDX zdhY;reb2xo1^(u9#&~>FPuz|QUjwL>|9}mWEr()@O}g3Z1#=>g7DWm7RvX*T2Z2w* z=FPtFcO0#JU-r?nLU+|~NS(x%y)n=mNi;4)>XR;9=!W45&or^M?gNC}XIeh^Lo{6W z>p~T^Yqwt42)~oGz1njwPHS8`&H$6Fc5$6?EQ|ZsidD3T+fhA(TN7y$=R-bK3oSl4 zYlLfi9m!*`Xrp4XZfc~d)OyD!(5wGs)n^X5RK(y^qmD3t}T&cyL|{b3B7*^00@1QLnRF( zmwkRL!t7B1zD=(I*mf6qc z+}?ER4<1XCc}9Hf3QEP8)zd;)FEi1)FOAg<43PqY27-y;H&c|5h5BhN&FWuxiJ5LR zo%@Nd@zmRBF8grR&7k{pxviVNJ-5FvyX=)zh}v%`@BUyp<*J=A{qGb9*%!zH_;H@C z+NZ5M$#Z8Q-~}=mQ$g7Lqb$0)*0rwNYL*L=hB*TLU20>ohof!b0 z!G~wXS$+9!m-AA=c9|!x3`WO18k@W zhF|J-DEyr1x=}`#d~>Lb7Xth2JbKTT4c#xomMXxN9EC%rG+f|!-_HpRrAL<_El_}* zlnb)mO2kS((Hfdhin&!4O;WK}xg8nAZWN*#Fip``g{5nOnA zpqv5i^!Ne^<)R#%;*H@lQ>d2aT*XIUaD(lM5=fEuT>PWa^`Yim(cSa&0J-x&3szoq z|Ma~x;c)yLGc6a^U`5b#3jFDTu+9*U?bFvgxwB^dBsE8Q!H}qOs*JMpJ=ZqLO|Nys zx+deWwlr!>@3nwmU5)q$gva=D`itRcs<`YG@3JPPtR~~P##`ikrm<#jr81E%cgd0l z=2Eb{X*zbF#=^Q9JFV}!;Ujl{J8Cy0pme)&cPVCxgXOsPs1{R5P)BzeG zH;7&Zl_`v=X&{L|uv*A{}^QIzHwfh(-iYT#gH8hDVUM(Osb}_+=wq3%BLeGfm8;nbk z?}@jfp&4U`Fc1++mW#G>{z5X<-8@QM^azzSZ)>wacBnP(4;F@s9$)N4T8872llsx~ zpr+=pCgkc8di1Ub5#Gb^C)4=<5|Bfg!7)6DB|VvW`yeHq^5-B?@PQGj|Y-y7?0+Qbg0@^yk6&)?!K?1W9!YAU{78;{WAK z_aaWRtCnracUZXT5XN)#`iu3m^}9ORXC_$LPLnL?t+xH}b)Q2|*F5EY6CjH#nr>$A z&q0bK|4_Z3`upsRK=|}}ZN3TpAUyIwc>N6m<#T<0HvAGqbb45|wm&MO@~BcyZb+Ok zJf#m7m++}Oiz87@S7AB}*_Aa^#xxKX4#&wR7^NpBfvC+D)%mHl%`@KZa4?`lBEM0f zB0)!DfehMzJ4j`-PF~&rbf0}eC6F|qo{0vqEA-kIZ^ZL%_Wd7gnOnjUT4qHyr8eG` zuU}!?;V7;K**!2o7_hUS_@3sglMO4F3&+lQ&jzJJIIP%st4^kF%cBI{#PPAYH z|27sOfm!_&e{(nN1#2kD&olQ{yv;jHK`GV`Q7-Ebjl;WMk$Tp+g-jf*_b#`4Cq z@{RZ4A7fm|STlM~>3@YpK^>qqeJsi2wl?IVWhOFvW6Ty~zfPdTG#FMw zz04+8geBm{657yzUZ#Lt<3_i1a}o2G5^{}!cG_0(l_y$x$-8XPie5J)*f}gaV0|XsRh5VN-cNG|82tmNIPP}ckGtl-y0Hp zbhr+tmH`EPYtbE!ppU-9vFNzgl`EC-X)Cs@f;IHPKxYgr&J}r&U7)RxwR5i{10rwMamH;6;KEGC;DRt;(zTCB)#5Ko#_~dRFysO+ zfBH2eB%Fi)?P~r18*GnO3=6f_O&|{MJL``e0a{ITRB`0f&<;W8S&9Ypnb6-*>Mu`A zvzds=T>Nc$w(7&(H2V$EYMViZlpZ`z>Y3eCp?zw-qdUgW>GPc*O4%wgaX9|{u2Pp7 z9^#Sg5XC0%ufsEDvjZs?Cfl7U@O!(jcdFD(G)ktaW!y~-uJ9s+`{B9`_`oO3N{^@x z)Gu_7lam=N1T4$tI?EIQ>@8Go%>bZ#p>lc}~GZ#}cLjEcr zV5wq=p#)^)ZgDx^bY6oLzdQiht&P~$J3t3DRRnoM%&yf$#_MZ2SWnEi5LpX-bR@Cs z64r;wvYs<#BR1KQa}lnbtr68!i>n zSK5Xg_CG6Bx1{YIi%p1mF-@bQTFz8I$K^-Q`i5ezg4 zuhmqcPkz?M`)wWh@g5Td7G0uctWN2!z(x9z|$7Xx?%1pi2ytWo6)NYPnoEf%T-l%n>mjZDxnu)hKrtF`4> z3~}Eln0Q;J_NO};oFZE}S#Qmvj#_8SC^mj-)@-c3F%m8o;#!@$8SL7~GyUDcG$nd} zB$DLq)5*)}+N{pbTK%(xes>$6j2lb8JnwTgeQ(_S@i0%B4z$wh0@WjvKP3byp|gC+ zd_Jvac0NxLe1*iJ{^4XerP+#(;D%g0>u;upt_^~O@<%dcMKk+|9%~mtM|ZV?ral`Q zk>2#!Hm(2YpWkgIYlA94%WxxZCBW56$k_%p>#%HVu-K!R{T&-PV!$ryi-mUhO}Biv z38gMK1m8(byGd;NAFd=m1;=2o?I9OEnZv=UchQp%B@wk(7}${bvp@goqOwhor1VIL zmX>z^Rf!KPIUrJ!Dy2mk*X@S&zw-tvXWqXwPQwRldizW1+C$G=rjPNdn&P^Pq>hOqL4@)qIkd~l7^eH7+`57Fne$~C*=aZbXS@05xF5k z6yH$cZ!~w7R%r%Y_->6>CmT!dU*21PtGeJBq1&?duUwgGnQEMwsObLYv^M#q=a&cK zi-BCPpbAK-n(Z<@veF~6nyF{$-MLs(tAA*=N$&$%G;Vgoe)#9qg`HZgg zNcdRBvJ2Zv*BJx6%l~9k{O|8YnnAsPe_1uVP(tLVWoxRGRCh-zB77s4gWoe3#piS+ zJLZJ_>Q^?0gLzvJ`qI_@k|0p!+TtC{981dmb#HGC0k=Lb&OhW9va;(lgH9oeGZUtJ z`viVBv3evN8-nX4YSLWS?M}Bs}G)*`%@o$1jd#6(ZP2ydCIcu&GxS#3tmZc z9_AyDCz`#`H|jo&?9X^~65kxJ?>GO`eBg)#3bIgAvgV@g(9mJ=>zro%c{no{+g+XO zzKy^b2#4c1K{!;tFlyfou?ihFETssi@2Uyrop$G?ZQhbwHC_7d>%x98)}u=?VkuJh zgp`~Fs#TD4O%BdmEr8kKfeBU=K-F_+8qWnTE(8Y#fil{hTBkZQ7s>4UnslXUFx+{g z0SiNkUBZo-9~u&!^tqY6O{cs^!2KYEV>)e66 z&6fFJrO5zWFV*)q1DsZ-JTwO10X8RPk9YQLnyMxDym{`<)44!tasS4Yn3qq7F2aOI zg5ORqQ`;Vzf@k*X0nY|tTJk0jk2(${r8~Y%Akf_l3&wox0~Ho4AD7%a@i~Qdf%~ZQ zWc;(Djv^`1%@4ksgRfTBo_g}#&Axm|u?7T){oSL}%--9CMPXK{@7DBC z1M3BTX+(lTr648sj{`H%$*`9qd0;JU^s$=9qJxM z!TS!RI-svb%4Qeww_F~Sq<7+X@9GdrO%@r~C1e%)Ze@FKinR|8#zD*~?TAc3XM_h+ zRJl$@`BmM)s1bOe-ak|uw6pT3IGc7uFK$CQTV$3@>lH=^;s&qgez#Tc5}j`hhr|Bc zwKJI1G_QeQgXhLnOC|!YTy5kfEap3eap2KXb-%{qyTAl!VJEpXAR62U;B`iZ>imkp zafGMj%fMJT@86)i@MRXIhaYQdC13Rj|!cbQei5p;BD+^ecmbl8Kx+WQ{f zVO^F`nRwyW5v!i>d&l-!KCwOW$1m6d)b6@!Tb}LsHXK|ho<{=GR=ql#C=w!4XNJiU9-T_I)NtQ zzS9hetqziE)IB4wzTY({MA(kC)Y0Ild+95j)Q5wJ(4Ff#)E*LqepgXxD#0SoEK!_f z-7FIeZ6=o%#g7^DNkDeLT{z0QzUB{0$CPB!s%kEcKK_Bluha_zMiR}hRSDfBUI?0w z9zUb;%o5i4L@lEykdtX__5!B*Q3MZxkaDSao|8Amj|f=DfdIVj+l?sRW;^r3zy~}E zQWI|oPF=luFey`5(U(5|^xs$USJczf+qqfF!*h06)8gP*<+0n%{*}Kb(E+K1#8QFD z+;4MW@1dVqj3nmu=QHN`PiVHYI&rJw7w=ggvM5m;Wcx**y0LzNuHN*Hjv;u4zIuIA zbeBXB{GmHEUi)Gdf2rPF9&f4L{8^i=btI!W5TgZ}^y>{DW+d^@7QM%|-ZcwJy`wQ` z|1YW%|8+S(E{h%ei4Y~C`kchE-dar|jYz_J<+i<9jjYCp&lrbxQa=6aM!AV0w5!z= zW8a|7S8k9XVqP^OdPf(&4k04apybggz7g~F0Lw-n99q0Dty#W+;A~pYfB^bH2~%Vg zCxd~D`i6!~R}5c7RE%Csvt88AxeEhzDLY07>JL;DcgYeOK@EJQ{ZNo0u*%3*D`RTl zH~XEQVr|}w0p9U}m#2I*(DD_j*wdJyosrl)bAz&iGsgUL)uZ8k%4-=0hX^vbcl|l7 zS)}Kccu8(x_x1S_??PF1|Ko;`_7ymk`{+<|6}&8UPL+k0`o5C@xmg5inF7gn@)h7!F}f|*0xiz59(XKru) z@{%$-i5$stmS*RsA!bb*w?KJOPoF8UHnoY_)}W-M27`ZE&!3=WeQ1r8P5nQUm{XvY};}71t6k932BwgAPflm!tYKIxog8V1*$pEto`vKHk z5<)iEk_5`4xEpE@dq?aGTrSJqO#6*NvrA5Qe&S?TP92%1x0PmNH^`Z)(M_f}aiI%I zhK2PPf7e>C8^}4L4M-yLX>^>bpA|EgmLWky*aGQL-95Z8J9fvAOUcP^8{c>TO9pcn zacnxw5^c2pyw1M^!UYjK4!|*XI4q>h^5|IC3w(y!^kK!U<+j#e2iwn5Muh-v2f)S5 zQzDJs-_rSGvju%?aA}2n`N?}ca4Y8?Na~^;{Gbj#o1zw%tj4| z^M=RytXH(Y%b3gJ`>qggFDZTx5`6K`-qa6-(5+icyUk1_taK;;+F z-3;W>;QG3dKgWus$AGN$PrDj3s!spe-E{;zP#b+qx6I8A^W~q77dR4sYsd=*do#=F zz0@C*D87izlrR4%u#nI5gJZ3bW3RV`GxdJ^nY(ZBPUDXos6VTGd{=z=OOKSUFdEpB zHhz>bXI0RF>Bq%Sn4gH0NGYTPN}A_|*qI|1!9q4XTPTf;Z8Hrn7^|fCW`tV8^rirgo;L?%+@|% zzkB{PrXky7sB-VjRhuGy zb$Dmu_IIUh8ILUC?+Efl)rXtUrlejV$ZKze@m%MOzU>`)p2`;#&-*-F?W|hc;WpIw zZrMJVsCqOjd0Ol%&+ET`4c6nPc(mTZ{&cfY$0YpweurD^-~c}FyMgCVM+P2m&HNyG z{6J{E-rtcjKSf;L;ilC;AZ`$Ju6HRsyTHB$^MzS4)-DafJ+`+!HZBOIZmnh?&pB1i zUg^PQUaCiKs5Czo;3%a)zwUd^=ey0W(Alvcy^XtoOZ>jeeNWUPm8J*~bGn|tZLQzp z?83WgKK&cpC=P~rEMH{Kx82(6I}o1WRlL;+C2Y08oThv7<{jo2ctsHLv02ZrAcnNq z{pHx!*WwQkrA3DPwKQ-@WUE!N`Y4N90)>>|Hzi8|MWVl|m@(L=rTE3kPpd0peQd&) zx~Gy-Cvh%czy5e>+<>A+wD(KqzM3v3SVJVIP_?&On@K&KSiTGneIt=-mOd}={0z4{ zn%ZAqW}%%luy=bPgCLk9%mRN2`kFzg+UkrmJMBbu%)3kTuEwpE6_=$<&g)@Z$hVO~ zs!?da?jk-cC3_(U(zI(k0F0N{;@+VNAKee?fa1493r)c zUo>qxx}K=xU|xR^ZI{U-R#8JLcYY}GAUuNRyh_phT={c^REk|=<622VE)OVwf$~+j zNdM)27@=2+vCUOYFB+0dL`n$B|AI;YmEh`Ma(j^{Kg>_TL7eQsY5De6-IL<$ z*DUW-CE)J_e~OGKE`=@Ad%(aM5ERLH_WH zDD&kcc`1;~Ojc4{WCFZSFs9$@B2J;|OqmbU8*4qJdLoz3J{d({=(2z3lFvrZ^`?H> zS*YI~`+O;oX|ww(s>+Lcef;QWC-<7iqU9b?$Y6y16)lYud;UbIu)kgR5RneHfS9p3f%6n`vyv?4aXnANGWb2GU0 zV0tpa9FnLJRFn$Ubv+tMf(<8up6ucRxNoH*+=x1N>pk4kP857cMBy}s&xh(%8Bik8 zLMy6i<{0wiquK9C{Qpf$PG4G;RkmYl)$n;x$9>F$?1V^V;d*p{)^jW7mXz|UzN&~I*f;x$j zw?Bj>v#?-zpSUNSWyJ9d#}_{q}n$3f!{(3je&O2N%iDsDmX_%dMaC4i`JFrDF|~L<;=}w-?3) z$^D=CNcn!&mn$4Xx&>LaU`rzf@jY~;Yo{2G_5yVil>(bMMi19T&h%!<<2DtJ(p@X% z==T@7q7d4{$-{%ejdt&4;J-%rH6HNeK}yd)ewZZ)E* zRTr=5`>s?1oLVx9CQ()mhhS$W5WGwby0d)Si?RqS*+m{-8z7m<^=Go{< zLVkHl9As(ka2P)4_mrdk9K_CA+(iC6+#?C<>;b}~-7??h=j$2!ay`mcbAlkvMMfl*sVopHftT$E7~WH z@g94U7JVcF33wKLCs}nfa4O#cSJY)bC<}}=g!*avX*sgj%j?Uvd<*Mb2$*;jwf9T_ zA6!lpx%L&Q!NOd|l$&Zz%^0g;dZS<4z*}<%6z}HTj|L(Gnc3(M+l+m_%DXK^&-DqR z-i3Zs`m=+jS@8fhr$AnU>!xJV)P4t4O z*QpVC%uuG%;sOWIMN6UKf9H_=l%r4e<0H-CgU6L_BHXwdk#<~(_vYTsQfD0E zL6xDY!fK@i!0trds-ZiJ6JC0k1DJj%Ra2t@nl#Mg34{#ylIG3M4Hon<%;J=`IxXy_ zo4ba;L^T@(AUG^vqCtj$CN;h>_esJhyt{cE&cTzVcU3W4-!NoWQ27W1oh;MLmxbOf zbvPH3U!YKpEHKR~Vd3-;8H*buK9yYUf?=7oz_>2Pe~~;kV-WxK{0m6m1x5%SkTi<{ zT1_E~W|yv9?DDeuId=-28YoliwMMp#-v!EM=5oB$c&L%|33JMESNuj#<!z@P#2pWta z-U#I}Cm%63znfZo-6oQ9^0wg(me5C>Yir#w)t4p#G!hJuC!?Y4JT~eLf{;kR3;b`r zvZB`?quysjcC2@3O33wTrR_#FwGV{xIaoK<;iD%oJ*Jlqqxtm%S?ys3kEBby-05E2 z+N1T?b#N#H1g+3s9}wQ%0f9jXba|M&*0HVha&Vyl6b-_pcFsbna(cHsu51lm>ITQh z)ewl0CJ-@-fRNPsSXq4*OXf0dOyx1Dw>k|VVb_99m>XBNec*yOU;eNQ6ZqD<%d|V% zor70G2Jf-o9YCF}ofhJ7OMDMbtlpie&l|!-9hvi3l}Ohm5}5F(9gwoD(2tQlRq=nt zaYA+-;aEg*gykjAsUr(xts|vu4YGM5xwtX7RC+V@?Wr$$1qErI42pOzEF^V-4mK4# zKBdEbr9I)^r~JruBxqwn&VKb_SDek*xfQHRw`!l4wl#4=63k~X7J&PpsjVTCldd5e z7Cz8hERoimLOT7UaKQ(%t4EnAvp#gdiZmg$# zj}b$%En`?q1YSz-z(jXlW}HuT_-kNqepft^$!*<3 zvgRePrNu8HwM;j|{=SfJM}2WV^wv_%4TNN0&$A44+iC*~!PUjh-qX6p^;pP_vdcj* zk5INA_~9ciUf0&VZ0|glEad;b@db&#=)g$}LFbmvMrp9QKyNX_Bl_Ut6cgA}*mALCxNm&?oKINS&Y{47`oyfv_AirOE|@_jagS z@MKImlbTQta%T1?IKKB+8`UGhxjFLL+l1Vg9yK|~A&zaS8j?HhGXOB2-w!eut|xD# z>DweVPeWFbw~PXf6yy(h#-R+X5Y6h4I8v=lqhwx)U*}JGVhtQd)l?P*W_q+^ta&0> z?|P(;5ypl>E{gmcRp>0Gn*}}u!pGK&f#I$aOZRfpRqRMbhMb7lpQg^#pBpzOs$4Cp z?wVo-PR>b>0ge$djiP?5aIwkiQcVqn0dAbtSv^arpo%A9X$2D2hTdF_Z8?x%g1{TQ zFsWOSEMFe9oPPh73WbJ@&M{9~AGCSs2XpBy(f^0a&c8-r&M>Qj?cfj{sal7^P!=gw z0+W!ICyWyKd$HEb2+&Mja38kTJaMMx0n$^XX-nLsw{&Y=4O7ABC=(X=NpqAX=UH;p zl2gI4{KBU>l9lB9a4#OcCHDXDSCJUoa+wr8<&f7e2{$*$?{k3O#Z6`DaOsynH;Klg zPA-~wP#9Eg!fAx}MUEp`eDbYa{>h{Pj&(fz_h3`E*avEM%F`4U|p=j?n|zrm!oL#n8F_xXa*TqNs+(z zJfP%N$oJ|MDO=S18)2u^Zc^3Ad}-1eLo9VQ9Es|5kd6x&^|vWF(R(5zIVKtFm4ZX% zndq3Jv9MLq5^38K-UzeDEZmXMi1`W=;0D(Pb+5nOntLF)hXc`WSToedR-3bihG45j zEg(69)vNSKtsN0N20F;8N2KEY zA1X=xrsU`xfMgnpl14;SLokh>5RNI6h{8gg8x6{*eRC0U4TT-%{Vq&`F>wn}v?$HQxB1Ii^^J41Y_yy` zr4eC0V7D~Lo1Mcc7W9TR2G%M$@^sM$Iuj0~q@sF5VdlfX^eOa4+cQs)Jq{RpDSh?@ z%~&m0ptm}IkmIv6|D{kmau^qUQ>sMdIdz=GJl(*Td}P-hJh$)5OuDvHnRf4YGiLu9~5FU^FA@LqvdIaZO8V4t^u+fw1h=BN%`NW zNixhd(wBrcIp1W!_?YHb74NcFFg@NXFWY;2F(SpefY2%S|yLbJdvm zHNdMlSSKz4S@LYXVkgy=CXJENX+_lg@CnEzH<#XDIH4?7pzjMjq$Ke5CY5AHiB5`3Y6VQyb2*uCQq+1~CgvR7NadjPz zXVu^O5=D_IoJwCpnRwQ__lf_sv~+u{;HU9FtI~g-1PL*rHP*{lNS+{LbZ)A+tu#8o z80*y-CuFcW1UAcs7BEYzIcgH}}9ABEEwe#`>rSI#od|lnYuQ+7vEDSw}dtL;aJ)-kFY}XWksH@}1 z9H*pViY~3AKH<8VfDIP#&jC+v@R?DmA$vp*>RX?lbiUcU=V*Fe{Xx8ZfK&-yW2G>p9qQohT7DGeeDr>MqDl=~`gArL8|^5=A)xxrVF7$nN*~|+N%##jrksqfeWHy?0c}A?l0*46izpdK2^C4)8RPvUrfaJtQl`tt@8*AjZ z`1n4X5*{$k6BB&}P7h?M8T>#loaxTMFGyo=Xc4hJQW{ud_^m#a^lq+cAk|rx$vM-Q z`qWiS1FxkigQ9D1&Qc6NZX+rE#(x+Q(#NyGIUyWOx07=@++xQQNTcfMa~JaI^Dq0K zPW7~P-k~LV{Puda7nu1yvEQXxFB=Rmzs_kQn3TuJ`6FnsTWd4$)K zvpU4Y;tev5D_{2&7TG|N@UKt5XN7p^-AR**PjUJEc>({wFJ0=9`y*1KfBo5|zx`Pd z0harc-3oMU`X zaqfhyKGrnOM2J+{#FcbGN9wPJ(C=3dXF&r~TDcl6>c+S3K5U)=TRJ8`&)Jz zaQX9XNk~YnjN4|v919U|X>xV@XBX%9bH5dnO@*whtEKo$_o14LJCihBYW*h709dbq zI;O({r6e&iQJM7EVb3lZX8!1t1xhFIlNKKKd<6{##7zE=J5dXP@In~KL@VTa(3uJ4 zsR;g)nK)BF40s1!zVSL~aSHONSk|wl0AipFk46Ox`Y$XNrKSYM|74o@=hW;hNM&_j zapU5_S!!t<5cBZNX5fQwZ}4JR3l_>eng_k~pE2ABp6s1e-p=Z+Sc1O4?s@&~ z*A<8|BI~{YEzbLNEC$%b_9(}$u+{Mx9H2b>a5Mrshc2aO=ibl8xyyk>3qke-=xSO4hroD$x*kT zEs%&G-7Vnx{Mc)uPG#9PjA8^XQNLna1t?6vTY@qo(IXnPpe0yt8Sdv-mX7~oHEA@! zp3XN0lOT3%nqcT{?qvl1<^3C%GVYh)@CuHK|9D!~tf7Qx#9b(9iwukMf~=v&w*46| zZJ>NuOV%A|8X-kRs7Z3FU3WzCDB~Oy77YNfadWCcMD)I{j3aMsMZa8{L|-yY|Jwy2 zt;~h!!Si=(_wl72S8**-E4w~8QN)p6ZMP4guiZoxn+ik<>?v45%*Nq;>_DpE1Ci2q z%f`WQq4b1Lb)!P2Eg}twrk&!I7&k-{X`G3X&$9FqW0W-0e!I~|4=OrV-_iYj++C;- z&UW@7>&yPIQqj~|9}bIBU*eTMs}k*>xAo5;kf&0c+dN~~$qN`MR!SrFbnCwhoz=&| z3`YuZ?ZRr2!n};b$avXiaFda-^%Lq=9c|Ab!I_@3L>;~<>X?hKos?ZRD7)XZrnlZ4 z^iwNKs_&r7XP!d+Mh{vcrda$BL%!rtb5w#A$qj@#Me-OP3P(jeZFLGZHMnno<@Kr@ z_hvll{XQ$3=(}u*pZtW&!ub+D;b6JZM3Af84X;Wc&{B_i2i-av$9M^jSg3x~d_Coc zXNiC72MU1O(sup9z(%ZT<{^O;#n2P!Od556ndpG|9N#+~lA` z*5WF}nV5_58FfO5DOU&j*$ug_V_nSl76d6IppiBR9XZH{2X3Ct8d}uJxjOh_Qi0T5 z%V5(fBf_Ot%BeNNHJQp7KEU3~@0SeQh9gm;F82J)nMyz*Mzs6_U|31qH*=T~N5-G; ze8Iu|k25|^aA1gG%;6&5`^m&*(!1mZP<0ucNz&(2M}&RPQmU+`KY(4swNBxk)(Uw1#?8C`WKwViRJ zuPIu175mj&EQXq<`43hUg0+NKedm0w87q>Ag*iaDWm)B5Q(qV>_N)g$4{{XwDtG0avB37Iwc_*r>@B~ctxfZx6qbSvgd%X`7yvAs&4R?(FJNh7F!8!_c1!J%(1 z!-?+DO!gS7#>SHv1Bq<07Wy;n#1;2rXbXlA_j@8luIi0 z$U$S5XJ{Hh(Qbmi_6Lo^SK>61+L;!#n?JZr6NISLNV4-&Xy;4>DL|VoJFNR1R>qYk z-;9hI^mwLXeames2`hkJ3bN*4-XF+=xoaR-O^tSzgdN$wfeYGqX7CMh!GW*)AHVNS zoUiHJs0PtR&YerLQU;0fw6in8i+plLD6?~L2#orXS7xe{0Id`xBT+*S*A$uq7 z71-eXDH7ho7gl6G#ay`;YoAqz9J0lc{CH;sfmsaQJK z;cM8e>$GS^3rVLXS>sfDlLHeg?P@%!X=%2GqtWv_*p8)6R`PdKR3lpJbE^+jam-vl zr~Vaof3-+ePa`bvF5j_RNC$5msWE-6DF$4eHPyb$K7N63<|@U^AHBHK#@F{Byun9_Gc_1FN3cZcjmma)-gR#C#vo4CVph zI+61pnGxub5oM`OU4Y~ooe#=B34FLzBL)n_mu9lA(n1)jk3X) zh1i}y8i%-!Q8S%1Cgz3|Vb`T_(c%86O7DuiY4#7BbIwAN zxM7;%Wua(VVqdLrVY-+YxT9hF9HQ>Qe5j0&z5Y63{ws51j;VpKIETO!oV?yhp#6Y* zePPOU%GzWgGT5b{$@nQe&W~($q-0+A*`NzrDF|KU#`|Mb>RC6somqyp$8okZg~3Y) zxsaA5F3zznC(b>oVHCS2q^c%fXQzKt#L49cX7uEHZOpIS*!h=_%~sRBPYpcC6LY1z zo)PD;jJ>z{oO!8m8gGz6Mg!@BPqgbd>w;-?ImF%e;bcXE=05k=!eYhAZYoO2Up4m@ zoHLwISL#l^81i4iztN{~IlV;X{EnhPTz{$Srw#IE=C4%1O04fm;k#5Q%{#Tz(p1yd zgT8+I2~oJ;hRE86IP6VZ+KKVM7u+j!yE;InHfp_022BYq5SRg`>!rwm=x$@6>GOM= z#(YGKW|RXv3?SfE_ChX=1b(TSQ@TFr$Pv}jPV`(k^OOTt|k9X zlWAL%$$euSi0J5FC8W|Ao6_-f7WAsVaSATbHUq8~eH*|Dfz`p_X%#Q*TAHL1F!Qz~ zeX6qZYjI`e1;{V^f%`_tw%VWNL;lwK!_<5YOcng!8S;6VaDbn)Bq*{{*#IbrJ=+8= zI?b_Az%9fg3677CzxhG-4;Tzsh)+dg8oA+Zx8^~O5!?pw=QoOX#&-UQ7Wjt5*SJ+t zQGeOdkG(K>`dN2&cRs}?&vR5j_$)b&PQ@h<)5e=(OC^ zG-ub7@kAVUU1%Y}Txd09Cq=l7wXCJ4y|La9*hO14dEIZwWqpEFrpmq;U6 zvj?y5u5y(P7vjb$u>4#uIMn^|e$5HK#6%Ik0Cb0MnYOw$HDxE(wI1dj*>Nxw(lw>tG+{r)qFFcYr~^r%0-^bdq;{w!$%`H_vW#M+9Ye zu{tJ0)2$x(7V%4)Vj54;v#(4eiMTG~a9UlXN`$&oa$!+}j7K?1fG}`JSeCWm@Mz&` zuhkk|2lnWEn8Mq4T#{>4-qQ=hUzg0>+8U~De7JZ**&AG07S1YDE9VXFKeH5WSVtT+ zgoitke<{1UBW|P;2272f}tdGig zHUaVTdMjuQVrq1MUM;o5yppYm^9WRn*i5=P5d}33R{?2u!ZgRL8_3Y$fK;lWdRC>{ z%&___<`S$T21O>2iEluZfuDxeo}Z$=0?1v~P0Me+QF@PIlgKFJwC$9~o^+#iWda%E zs2d_7uJ_d^ucR_sgsBOLYR`vKk};-2ZM&*@)T(Rc9tC}rDz8wtw$rEth`)i4JL4KN zqBmwWIjB)k&Q2~K9_>lhB8F6s!?$Pq$t7S_2f+M)mT_CqPLGQ!hiL)GiS;691BVJ{ zyB|-N@x}!a1F@vf{r1<9DaB|9s;=uuMdJ25{FDQ@a9nuMb)R;;u~iN=$Zmoo_L9vG zPOFN7Lz)*L5mhp8mI^4bmBlM_-j~DL{3ZQew6#(4(X*9j!*=>SVI8PAoM0Zc2Tbsr z5qIR%env@{bBB!y=S(G$!Kjg`6gtV!C$_rAS#L8WC2BV1E|8Z4%kxO5&PeXyXC#~- zI0?82LPOyP8!48tBwQ@iu$is|6tvHgJ$?Xgca7VzYs}w-TNL&FYsKJMPpXXgUuAJi zq>{pHB!Mmx(D{|Nww>R(NR(*rKFRF0a9N&P;o5;=48sc+yzUi|f)E>vaB1I@5XQt# zMETvFh2SL3qG8*&@tOPHtMc)5%JoRb@?Mkj8k}#gq z=9Y^O7x~N`wVx}D9Px32FluZ|9@XyKU1KX9c}0x)j}t}OPE5&tmsR^%DJE8!cZTZ5 zxm2KgskE&AykYUsl8*^S(=-T*(H=t50FF*;+73Xu;}5FXD#{kY<2-O+{NLYkzjw0}d_Af?mLIKer3NX1im9sRq2W&S z#b`*VxTh(vN;-n&bkUB6X6t#fSzcYhJmcmG69GBi=p|5j0EisS@Ye$s*a*|# zo^^5|XRD@#*}`ju!Yzr0gI%DPci>?;BL<^ra4{G(Ux8lu+2ufw8+sHl_Djp1{TrX! zwti`BKi#~Lez<6Lfr;$vXV(8Y-zcfzt_(#9$R~E5byk~KDok}|DL|03`?8KM$!$I= zTh6l>>9^mQH0Bt80UW|!<`c%a0*kT%L+SyGT1>HDL`=-`6TPsh185@Ei+(y5g}zAb z3P)G2hwoKPr?2(7*gjw0`WXMft;-=QmPaWND(KLYelsc^lvfI=ge9hu!h?Dk_z>H{c*SY z09@a;lo0Gf?hMEWSN*WBUsdPj&S@aTgVCjV^Gl-3M3lLBIN8Pg;gbQKOmD;QvKjg; z8e^KyFM#0(hUossCnq2wMX~tK`Kfhe6y)-+qtUH~I|*enhHUe?t!*Tb=7L*qm)i5z zdDNb48d%1QxZXO6@=nFikq}@)c{|56biU6DTQ2Ag9gH3A*obZ>RIPt~<0UdU>lR9x zvqcq-#LA~=7gM{-TN;nxU_80DQfC&g<2wBWt{rnz38~27Ygxi!dJTbXv`eH@>n55j z#LYZb>+}JRl!Z`HeI0)kD=l^yg!8%&Py70$Ho~Grj2eOc*kxOn+-~5`KD)Ru5}Au1 z9evZJyIN)84W@~A>%9Hd=Rgp>YKQo~A{A6!<3Iu$Bce(M zmf2Ibh77|Zaykaxqw@2TNeu7(k+;ojUR~29HZz1aP-9h?w2$(m(e=w9rpyGmj6-*+ z12`h+Cusr6WBeEr(IBZ(?l1?gPTChnK&80(rXrHN;Z*Iy2M)E+0Eamx=}k^*@(jgA z;OBQZa(`#YTCKfSfYUGvuQdboai+V7x|1TE$f&k=^yA>S8G@$A$vMS@kBV0|61rD- z1yq&)eM!W~982sczMJpD@gShFi!~B>Jv|z-rQazC0M$5(+DZMon84=`MM_3 z5H@WKB(~lqLZ38Y*EP2XR;xj*!c^19Eb#E6L*e?7`DAvwkKy`7?SyvMDgoM@)%ZV4 zUEfl*rEEAPM^6cRX;@NR*P0v8X*ZIPD69mQVET1*4%(whL$Z# zr7VC`Qa5$Y+UPb{JlxYIiyxA&Edv||a2O?41)jxmmQVi&bPt&MJipCb!clZlEgW4` z;h#vuCd%VudJ6Cl}3B98;u=o%Z`+4fO6tk_NruhL1l4OnJxCC~C}^4r&;`8fC# zpYeoI5!D(4lr%IfI6D*_IiI|I|B6_B1$y_1$hshhnva3x42MWkS3YHhoeSnTk4I70 zey429cE5$09uPD>M|~^8i(V1xnO+YB6`8{uLuTs*U!J|46N7b$qE*H!)Ccr;#Mfpe za-8vN0U4cQh%X@w`)R4uXdwIy+1DIgGZ!+a_RY}WhZ4mc)$cGO2PL@h5kfJBWGOBqLLRRcTp zGT#lhH4UnGE+r6xIh|Vn?5(`TL!2K3CIMv%2{{M8`<-SI zp-Z;fdqxKNdLi6LU%L*uU1W}ZJh67n z3gU&#+#cU~@rF9H#9wEz$7_*Gu>Q~!c;ztB|8ZzcgpkAcRn>VHa~}ME5Z|1`AN~nZ z>vDicJqwBbvhjrq(=2?Afjs8;7ikT^&OUrh_IJUC(QLf@380HA)p_mP930wZh_2PS zPAL|>1M_={Deq}VM!?~OR2Y`HbpOZ8(yKWqUt*)J&ce1c6cMO@x5!%TC)Y7|KBlCk zv!_{-83kadmp|Up0JK5XaOx9nVj{Gv^mEPzYZH5kb6DqZEJu{r|7}DPjIspc5QU$8 z{O;8YQh=~S833PTw|91==P)P(kCJ@SMFM3H(j_zB4Yei!0J8^}uRP{WSE(=U7ocJP zEfzW2HZ8wj^iL9RWa zve6i-=D$3>9X+aMo(8bSmRNAFUQGl?yk%oD6e|Y@2U1vKtoKR82bE)9_n0&2H*}@v z9J*5WKV@y{n~bQve6D2)36D1N=punOiy>bnBb~a0wk{}fmB&gwb^H5l=x)h_8W!51Wf!bZAw* zt!mztFRk?v;MqCozxxanXT=Ru*@sxwJq?3A<=_)Cty%newZTfOm}4%)flDdX;U%BV z-8%GjrSoe?0>TgG33Vto53TiEkp?=`dKc1zvao9I@;dz>{E9nKfm0D4x@6)IuIj55 zagi_PCZ$Izp!!hd#I{7m*#fCKNF;<1KM6`n{K{?^Sob}6`0(XYZ|tGlJY;sw2fH_O zp$7$R@2*etugZb;IUy`0K82#!r$(j0X8GECJoz^Q=p5_Q;_$zoVC!KxPdhcE1g0^% z0&Q_bFR!IvN`$JYs9Y<@i$ig8Gy96j&o|wFMKO=605%(PU~4>I@@lYie6VH4|8f>J z(h>kqWHIirkK4Ivd*+~pgVjcf`zj=muX-GJ;L(HY7zkl-+=!(?Z(y2yo)%FOLl>I-8EW;PGnzUo3TEx zH=QTZIyX$V_Cpr#-dOQl2)q8_jm6-&)t;!J48y%I?DVy2a?Y7Ag+rGvb<^kh8-HM( z%n5tHOJY`N@*KZAcWvY%$j{im4B1ysxW%_R`6@4D5PuCb)Nz*GB|QGQZh7FVarHQV z=i~`Xw&$&;g2RPySMS$c19?iGq z62N*QMbK010k}W}8I#W_%XQ1qkzT*p-lAXOo-M_*+j{o{IxsY{r3vV^bkb0jp8)w0 zMU!O=E#=i4^kR;Ub7=~k;7DTena%s1LW95Q*l-&$*iSo}XhN{F1d6o9+qD^au-xj4c}HYWcc;?jg>q#ke67SlXP;~ zyO6H+gnyao#W_j3@Q{;FJuU`oj$f0cG*>a-1R^JmGGZe1fh2@k4QP&&qLLq z6XiaIwBmXzAL<35e!D!=GiO@5CB^fbC_T`$=yRDd0Kz_Zxe zH|^vk)sFNm1{rR~lk=Mjd`+^g2et8hT@D_HlP?r{gE`ktmOB!l%yAJ*pWsouvsN-m zG)D^-&4E9iZPb{5S~*coJ+C**=Q+1KP0JVmdKIAQ%_B$f7P?UskYyp>!(=;nWU_OO z28*$6a0~bN#K0gfEQpy}EL zZQzq#fx|=Nt6)?O-A~?3?QSlgl$`bBRtP$T&WY7#3sO_vl2^$qy&O+GUO|SOBRwju zN*^J>&nubOmk-MmN8cOOz}vdAqP5~v4FqnD4ZUdrKU!X#^UnkK8RefjbQcIGh34TaLP zt0@CSg;K>c2BX=Rb1DD;=r~@lAj@heF6rnx(Y?YtEoB+QH?>(r&FL;%=Fxi1?4plJ z&ijsK`XgE5Z{G-kDvjv8Z_n7;W=ySJ74`!L7g z;l95k&Ym)hiE#Jq;TWGVO}2OZbpTO_4Sv6$BAQd2?yha0jy4anT5im=!~P4! z+Jsc?Xh6sW96(w-gZ6`7Nlh*g@+`(a<6ltOjzabP1WJ(z=;SB82QqN}j=KLpfjDB& zaZ1jrK)D;&4Msc`c!k9`B4p%xTn1i~5MzVy1M-a_$?j)R45wP{rf`qJOc^}}1w!P< z3PfK92%i|_UI9SYo_dcB2Eo zF#el5{5_vc77!K(Mn{=`ir-LISMOp@q2G)cx%?bt;riDTKcPg1>8#4cZVp;%I;Y*m zaiN;JibBLcdp3PT8M&9k!SsCGyd`*LSrfm)K^?_;RXk_HBZ7}`Ns>^Y9oTJZN8Mas z6w5WM)WP~`$4!W{4eW_|)bte{A?lnQwn8wmL6-V<>felMKe<%s>td2PD+16Qs9tYw z(Z2hTH;gFI9j8O_Bb3Mj;6|>GDoVst{wN1xZ{9fO7Z-)j0ViAuoWA5z?Zvpr2IJX4 zdp?c5P5WAO(O|RO+WJ`7->XkHq6L=(JUs1wusEBBRGLR~J8m(TD4Z#|Xl%S?{|~mfj7U$` zvit948>-A|9u?c*a7XWGMM>kSk!@D?8&%KcmZ2kq{eTy2!w0hZgnTRoc8ZQ5X3&WM zC4UYaYUQ16Cl%4{V(sDuf#pqL;ocC>VYLJl#!EMBY{Nsy4tSk?)2JD1(IT_W*twtI z*iYD|3h}Z(44%48*{!>~9?)`C=|MRf4%sD_sC>wyM*VZtye1$0>guBk_ZF+gZ)6V~MNIXP157oeRWrq%@Tk3-pVbLfz6dIY4^OAYFwE^U916Va3b8Ni z=Va)S7xzN?m4|=>@F%0UCnzm07zd}3z%p1Z%pp?;_)TUR9*M0Txe0%IXIRNRiDR*h zy2E*7wmVLWmGPzLyGzJMrR+1oZo40s`&8V8%Dkz-T9M@k|Ljb?uT_%<4b*=w=$WODkqqlW=!_-Xa z*-I~$44TmKL-&$M%>)=2<420(IurbVbP+u??#-W~G6W21<@(oeAv>J_l@eHL7`Kg> z>S_2`-%|%=#<{ctzpA~Lt)!-z zqnEjq(l08G-RBsg9oyl25z6*zmbSuRiZ0SF(=SO{Mux1toT1R~Wu@=t{O65#jKB1W zy1Nvm%=-cjgl2cLt9t1`+PMZW`8Fe)2VSzn^eaWz60@JSDas{V#AIi4*rl(;UB-|h z=gH^9fuwX`rl{UcQxEO>mFNhsSU~tLyFim@i(j%ytB_#nKSP)c%^0}L``2UYN`uW2 zluu;TTJdOaZhy%9dBEp~xXX(5LO8Z&%+_oXxB&z1siRi|CR~`{SXG{E08QWM$iJ}L z6XN<^5l*NWs%oQ-lw96k5O8Pq*t{q#$2C6~=%!W{xz#eRc19yca zYWvPLoBCLJ-@wjhG~rTSs80avE+!N-Vws_)K#H` zhYh|v#WDn3A&wQ!Cp9HHfacaVeemGU)pgy2j!guDSeJFk)lmWf`NFW=A6IK5sEiY$ z*#vr+wHZ1EkwI><^D4A^ZVB6 zno&#G2&K9x`!=?lefVkJf)v5kP9%B)>eql)eD04YxN47vi^X-peVN*f*B-h7WA zzKv8coe)&|JcWVh`o@Fc}QZf&qr z^oue(^WFz5G`E_TIL!F_`%9(Y1kh;3q8=O^>>4O;j031YutZ}G%=#Gt&7J6uKXBJX zDeT~Tjy50itx_R5zw=zR-z>?iR7c;RQf^PKPD9!_v930hv&CpwYdzj7W_jC6_6So z8D5-P4K>GUj?o#OOekgaGWwUAOSc>r$xAbrELtrf9GqAuir#pmR2sy@5Wm zy|}W@q0P!lfH1h%xWw@rvv1e&dd6t@$TWkMyHAGM?_55L^E_)EQ(fmxt<8ER4CKBO zJ^%b7|Ez2}iLqbWgR!M4>7BNwM&)1#0{>65{yzLJD-i{>{L7;&(h(X~6QIqN=62qE zj{Y0u2HKd0QhSmt3M`@$iqSZZ@~8VR2CjrloaGCLlPz0(@-9LKd~7C_b?r-&#We~9h19pwJ17=*r~m@Up;WNbv-Nr}~6b z!p^kSbC)DY?>04aHoYx7Oj{x{?QKETSy$8Vyq1HhVry@M@Tx$v|6|#XKWJtp5~>SC z-Vr}2=;$Kk7qEP6A$Bp;zP%kSV)acB*1x^dK#wa4;4_IRTy=X{o!E|1HB~x%?xy>b ze%!3$4~^jv;gH-KG$F~;e)ltiJ<~r58%ChcZ#Cn(v<9`QWZ_PtD;0o!_osqXIKboM zKKa^LqwO#I%;1=$XXM?@d|0c|)UZQMzM6Z7D@Snxe-EHpNZj8>IPg0cPl>j$(!ai= zg7Q+K#$KM1e#n}9lTPjR*`?Wdp2x|UhCs@20+f<6O_ZY(otSbwDyQrbKCr^Pf`VS@ zdL-*yE_qidyNifvD*2N%p|t|HO}6W=)^d+wx8{N?CeEGF3$JHuz!wC40V2jfOa5Iy zffOAdlF61cIym!Snr6tj^x1dKC^&Vy+$HP7BrW0~#@w=3DF|LQI4RmWy`8&yyvgfA zBqjZim>6HZxb8?7BAZ7k^0j=g_14axgWt&9&9v23C&2yAF*`jNd;ut&6!sk`o`zz8 zhf@IRd5poFa5ZsQ%mYeJj!$o9l@5LJs|+P)D>P#b>`J%K{$Rw?&A$wSb@-Swmx*mPv2 zq_(ShFiwi zTETTD^hRNq;0Oo;Fb$okoW%1^xSlATKus7O-X|KmUO^IiyiZMvk^t2H=?#E6O9~}I z)vp@^a4KTB`KHw4IHq>HcEYVxl3^O4zJk{Xx)_$lfwLGbAel@7M3C4(hgdri9LTG5 z+C6_$@D`}${~MdCS^OLnwsF0epK~!{n$@zW5`OF7xL3%(y^KdG*CxY7^=>1rZ6&6X zV)!p}d_r3n1s&m;_(znApnocw8TcD=G|s+Q7GC)qkVR>&kT=V2$%W4{B|;^IYT zacq08$t(FCeMn8o-PE;lC% zt=fWfVSoOP2MKZS1%yShQmrt56i_c~C#edwx~SFk7C0dB3t%+|G2XE?ORGcje@M&k zU>@CfAH=bkwu_E@UlrVp)JJ0BtrLDTqQrthkH8d*dKhUW=N*X3rd^L5AgoQv^l3q^ zJ#xFvD|%N!B-V^G;-ZfKiG$&hyi*3$0f! zat+Q6cDx5W73qJDS3R4US1A%c*DrJO1wv`OnCx)M8eBi3lr@76c*1_(x4@>fQ*U88{yd83Kijc6^j^~Ay!t}@}40vR+)-V?JbpZ6_#c!z+!4DlAZF%miyN1s25ud zU{*GOYP-213&MMq|8ya`+)GL>mVkD~upw3anC)~&C|rAeg`RL?T$}hORfC_(FlFCf zZOuBj+KF_&HQYMN@p%%t*ZpFv^}P~jIMT3+`a&Bd=tIq1a7X|h4X`3d2Mfb0Gof@P z!WDLg05>6v-x?ue9>g)KbQul{@=naoG!}1{W&^gmvi1vwH#+{?7Wr#Jo9SYy6j8Q{ zT@t@lb259YUMhRc{Qxqb-ut=UZC+2h{m!Ip&(+hbQh%R&R|PM@J^^zI&wpdJI}QLV zKXf^zLFi?`^6ScfLcDBn<#tvx`|l{k?v-){NkEvrLrqDx=iDBDnJ4@>HK3rg`}kz{ zI5i(vxX&u0@~fC?t&AE;y<ATcBiaLQusU6Jrd=ezMdFo^mGATShAZPuM* zX{e^z?s&y@*F=VfT%M+hmr<)s8p)6y|7AP8+9u6-$Hw=;zSTh*1J$ zQ^$b4Arhc?XC5nyuKC7>hpf0iI=bsT8S%?nleo%G6@Dp2N-sHMP%{Q^R|4vDUlTbw zRDBl6VR#_F;Rszn5m7=*fO5?8!}P){Es<0@M|xTaYUVXX%R9PYB&zZ0%5Nl(4rg4) zbqXcKw1v|GWlrPPw01OH-+C>=;)Sa1F)3a&=2R^Er}_a4!UCf9`lV+|R}`@(v2X$> zfH|pF_z+f26GpzVL#hVnWRQvbeS#Cq#MXRlN+4FhY(3c+B=w6Y{A^czaq#ynwGRO= zIhb>6E4KW970$WC$HkW;;T5|lkOb|^y;h}jIj@dDZJrsDN?ql5cFD^B80-U2*hjyR z-RE#n(K$NE8C5ztUHKRgV=|YzkXpBCP>~paT^e_(fE>3t-H9|NU6V6{lF3+Sgqx|t zS&2`?QCaVD)?Y4pjj`?2kDQ|f1)Zj z8m~VxY;srMy5hz7H&t1mj9s}Nsh-1(-J?o{?vD%ley4k{R=ol;-JQp)dtPSjj(PJX zKx1ej(p;Q(*~Z9GQ9!XL7{Q}Ti=aAF?D<2aL5_rwKo|eJCh=)4rD$h7FJ+57DA6A4jL%`enVYalDX5Xv2k2F__ry3-Au`9zb=3M|qHIMZ_hxhuA<=Ay~(_sGOb@QbGe{iog@42|^mo z>z?4Da#-16-=u69p&TbiTXhsqZ&7?HtE|?H)==@l%J*Z39q4*~Ai#rQUR|Py9Khvn zk&Y1OQs&GdT&20tY2h2Bzcv0NIj?DDWNwl3ovCS-{wtvnTIQ1QXZ!lM+h$)$tF*XY zbsSLzJ@TAVyPgZ=%#xH226($to<9wXgknuTc=n}=+jXTKCB#JGIB8$yo^`$`UK=cEx50<@^W*$0dg=6gi*A&8FV}I7T!jM zQIEty-|eft#~0=bY1?Q<-1iUD|L756j-A!gJTQ<*MPIEWQ{<46o-W8@HCgMY4qvxg z6~B7b?kQsuFS2d@LRJ2Ak04tt1UBY_d$rkNOV}vOS9_P_e0~s{9CfQceZ`RdSiJMW z+zhkd6~jz5bdz0O(cASCsK1|mK3)>EiZjTjfmo3FRw~__cT^B9k}{XnWxBh!M`EK@ zBME$tXlZC@t}!ym|L5|V zxM<3Xn5k*?ujd=5pR3|#4h{UDiNr6?A2t0EK+XGi3nc&reNiA7ZCwk zL;ZFJWZr^B*$_~%8>1MN4`+iDW4?|+Tb#28u?enzGp4usp-{OXUy3Zzbi!aQAs3t2 zFj>X}^F)SrTQMMW$gh(2{N8*!fuJ&}7pk$#Kmc49mH?$8IUFBPi@>jtP@WD^AM1Cw zVcklQnIZi(6*VQNsH&+VGT-q(m(9;bv-R@@ZS`KdUs<7wQbXi}yRN6^Pkv*keb_;IqT#(tz*yDV{Q{I%@ zzU#UL$yRxA3qP%ds)A+PwlFEgTq2E%JLQw&T}#j%PctrRYgySulaObM;0YGK0ogf0{4Q+ zhsvth(by+RWbse|eDu@UZBL4L>XYIm3Qqb5cY@aLHaH%;nIYR5hL(yY7(&rQ(*9{X zY)?}i`dUjQW=F-h&*pNU<@a2U_J0IqMiL}ZXG@$^_%o-RTy5}#ok)!4{X>akH)Gp0GgKquw@7T5EwM zGVe};LC4W@!MnLc@9nmX%`1O=Kr^J@?6(ki%-rHpeMO3ygZVM`*~7EUY^Dg`!AlnR zr-KZ-d)epT+v~SjnTjUF@@`-kgI#87Bd;EYK5agmw_)Acjsp?t4{8ZbqLLT5_(`1a z4OpFuGM9Cb>k_datprB|@5pg_#@Zg9E!ljJvn7kO#R#6+5es0&VHLe2P0cy6VxGZ9IDk z1LiDToS^aippja6KEcED34+_5a-tRGt7IWED#QD6g>{Jm^Z(}Q=UX?}O3V)c9P^2o z5%STZHcprxPJF$6^62v<1EQfMhj=XM z5TyRn@AheLf2>h_r^td80-9U@{A|9^QZ7UJb*p$vwPBjE@Xjp;quXUJUSV{tDjruv zYZdw5Mqf^UJ^Mbte@3sa=I%|ih300wbUB}IE(cq8FR-wXmD6~xjHs2CmX_W9!uv8U zwkmDeLn`*+(g5sWWUyA<-Q7LayZ6q&FD749UBXzGE9h4uRkeQ;JWH08gdiU3Wkf6O z6CBF~gZ&EjO`=zcm($Zh7KxayQCC_Fehh0FEY3XSbyIC2)JZeSTfKxx##ynH*ca#(5lUdp>{xI z8OeCT*P%6XLE%m7x^-l#FyrJi2~QJ}K8CS1&W}lDv$MXh`w>~D+%RPiS^1va(JR>J zw-&2c_x#X#Cn}~y(#fG`0crWvBJ~GD-(1U<4pOzD!kQ?>il|u)8YwH%W;&@Vu;_rB zg!jg*-@ti4Qcc-KprX5-pp-XYCAuu0{Z5P-;l#|e zoxG#OiG+I?(zl&@*+9#zh+rT>noG?o1qdBHyd zjy$}7>|AFt^pRD}bv_NPy^LEmDr4upcdiA4>jQVcqlH!%F`#+q##csCk z4W`7-E^K5R=H;|GP0}bF*^>p_7?eL-e#LYhkx^8C>~*)4Lm*$SBH}O7h*>t!Q)zOm zt{X~-bKYq~Q*&@qQS2BNa+UImXP88McAJuVBp6*5*L62`l-#RY0Qa&N~U%t*FX z8fAhVuM#CTaps}up((46Hmc71y~D)dF>@P_=(HvifPQDCs}`>4+wGpRTIFBha9@^o zTJB^BAiE!?1dn<*+jjSKI;DfoQF}?^%MRjJvJ2S59<(hI2*CW0n{@G(r3pYBH$t{_ zpawxSDEXKuXWf5v%#sh22TmbmNT3!ZJ)=SKeNZiBL1&xo9>M~r{f|(^!Sw?f!yCQ@ z4VxFx7&DP(uFTHDXpx@htCJ9Y^2*r{g<(2dV-9MMzgi*UU4B)t!$z>q!^KPgIg?3M zk$j-W2bE4)@Jw@^vS=mNA{OLjwxEiSho% z#vUX~ux5h_W^+&7`s$`Mxa=l)!H^El8^Z3mf3adZGwof2jV!MgNq~?XTU}D+wL-1I zjxpp#_l}L**=s1v2dJIcPJ&ZIP3|`A%HwIo$b~m=8R1bDIj>QcGUJs3mYhuMqge*Y zYAXQ)Xn~Mx++nohRg7FuI?zQuI-Hy_=pvj(=C+&`D%yK1^HpC^xi8BOy}t$7NlaB> z=L$uSDD?mJu7(|Up0E% z-||#E-DdU3;ihwl+@aw?rOlo00CU!5*RiQ}9JzQ#gTaTI2oazphdNz-o0Sq`O`i2R zU~AU%d-v6iZn~s~*9G4k*)l*5wK7RFzGs+Vb*R7=DeOQZykr62RqlSpZ(#l0ypu zBqy)gw9+S5Ic8l_>8Nfa*VDW^!^2&;I|jQibVQ&$k`qod?UE=LCcF~L;XvN#3y?QrgM>czeYE69t9pQH!biyw zvGU{9Gx?)|ypbTMGR}St`-eS+V-t+L5yCSR9-Ic`jdHz>o(Hh3N@?ca1M)_kru{(P zC?V}{d83{)d82@)R2x!(6aP!dx z#ko6CJ9GkNBTC4wf<90-qT4_fbl~lYB~jtt`xtfxp}P}MqdfCI_5D!Wf%h*jK-Z35 zp-I#~k?tzK{kG0iJ{H)+0*~wX0ZZ)X%>xe(1c#&RY!|B~ceCq= z+=W-s4Ayjz8@w>LkVWF(7A921=-%V^BGYY7JHZ(r;LstD{Ta1b69jT`({o8Kbw;mz z)h#MmnvNtRvGM`O>)qJ&9p>xz8m8Z$9+>^u9Zr0aTIMH|omGh^NL@nRNLKx>xt&RY zpKT-_I(8lRU_ed9NeSPF(M7z&=s!~sl?<7m3t7UE*wy$Ei|;q!1F^n(sb$y?9Z_-OvFuY9?j(3IY6?WiUqNS!7bYw}{h zFBlKxnhKn`*eNnqu)Q&IO~Vu!m3+#rBr$Udekbg(aI*6>D2t9A_6C#zv`=}|s z(~P=2RMGJ07Vtt?cUsVFE#QQqHcOVTEdcMDtDf_fDKWBr3sAE)Pit)+WmIG03r2Z2 zn!yZfq$)9e1}Mbh%5l4+^7z#A|93L6< zbL^U}YF=UHe%7IeM@2;f!lG|5tZ$fRf4LxvmbiqciJnAV-P*~JZ|-iL14d@)%iF2= z;v8icVEI80*}1CTMjaS!*t>mqO1R-;V@GvlWQfb_SpYf9!a&aEK4-#Wfy~lljLg!C zjCAH_bUTX-Jiqfn37JY@J zlh_TLg9~&+kVLDr{_9Kx)5tcA>Bkbr^y6wko-8M$L96GtrN@*+C072vW)k<=A3E@s z?p#jk$=5MU(5_o5;WA2=7nY(BkEmO%DOOW7?05fiTqRs_L%HP#{j<%n?kfdA)Ai0@ z$!^Mt9g>vdt2nG)WXeuE@!3@t8kfTvi_f!m$iQk*>k>8t8!4uIx+6dn40en&t zf!du><-l{PrDSP}Ki?N6KjR4CNe)tsV%Lt=bB~XoSF4}zbeOvwcb>9;KChylkBdn$ z|1ADsss_0KDlmbh8qDvXc_{I9k^t91lPwBe1s!KV<2orWHfO?8l=}DBiai!e8_(Sr zm@5Sa=&-K;XNcY_r=IsdMG|(W5fTvtB)*{SA9Mx=cduB)=Y_1`_iUkVFU&#i@pzm_ ziSU<+tnLU~T3QAJOPl+W?(?K8Bk%c#3MQE)UD%BV0W;nHOP)@iaiPJKSe?Qvd~P*1 z5wnne`SBl#W?2{a-il6wXhL%C>?-Nb_XLypi#)y~Nl*=X9mTpwH=jKb?w#@NbR7J@ zc>C(GsMfY$x>Jylh5$&e=-FOAIECzbfRD5M4YA$_=?Md9jUd4(_DK$My z6BQP5XmiZ%8ixdYd-zdwu^fi z-Yt$f{UK#V+v8063?t)AH|NEk)$2{7zI_P##bS`v3k_9_+^_L*GB?YxA9`kXD;-}A zg9g1^l@Qv*z-hk`OGg+|=^Vr3Jn4<0)aH6wjevu(<*IO~Fo(5`4TapWWmVcHJ9bB2 zuodBt58rY!n$@F*p_4MrQqrF_rZ{1*7wjG`Ovo)wRLMv}jlOx(;HyQk05A0&jkMNT z{KM!8_1Wm)ABq|@_Y*iVibd--&-gj4tV$| z0t*i;og;b@pS+o{@5`n+BZFsiOVo(N*RZNQdF*)!mHJj)g(?}8*`-}ft83pfGHaX; zv2Wrwg~N_%qx+CNk&Ww1Otj>1o71A4={|ZiA<40oL>QPngPvjE_AR5W+yW5?FBy1m zj^93|0te%!8IeP|3I$qY%sb1EudK7BUuJ>M*P?%UcN+~3|r*$(FCptoMcW z3iBRgN2BwS$LQ-A39mQ8h1rVBRUzR$89I3^oJs95pK9RUV+XhcrbBtH*20@(cs5hY zB+5jdp9ph>qHj{$h&+55|7Zg*I#Q@-D0U7U!=DF{KnJ3Ju7@kwawvuNSgO{Vy76%B z(uC^^VX@)mkZVI7bK0g*q*n9zE=aB@r3;Ibdk`S`U&Ci2o5LM(-ty!p7q z`?Exq)dzeu`o1v@jfbq=U?myx5iQRs%5a~vQAo4!mA5F@ED9l-I`jCNtkGk+nUBb7wI+>GP%c8RhMHY8==Ls*&LC#?4=lWSO&+2o>UV zvBXjjKRwZ$aP59dX5ANfh&tssSU+!^EV4xMXJ-}`J!jnVXMT@TLO8GG&1D1Y$ZSDE z6Q`2Cnq^%70zIv+NL#BC2%$-+Qr3Ee`b$J|ef4zCLdJrr3qGCP)J%?~UjaA$i-> zahbZtzNKY8A0!bc%FgD?*Or;+UhSiKs-$!?oifNr_p6ogozO7((z&5atPs*uUS_Yg zOAmSyxdq;1;euls3it(bhvv~eY$l)O*;z!E-851-ZLUuL^t#3V%rOpfoP@ZKRqEk7tSkes;(;m+ z0wRv~W8zgo@aapmic5Lsyw>aImbWJ~BJW^eZLFCq2K6W7ecoXy(7>zP+oDRc?28xR zy7I+hH1_VVTKp%RE%s&=E^ncVn<0Vd$-&d&|!r z9R9z+{_xuzEDjCp4LQX__S+S@_iyArFwf@ZI_?`*s@}hAnC|##8@>4Djh4Kzyd{U> z_HS;n^10nx6V-MgVaPQcRVt;WrQy|#(n~za;ujr{gDx8UcjjrGN zXbt!&#w>V=%QUqjU@;DdEEO_(RnbijSo$-w`(F~`LUO+DTd2X6 zHS50QXlg7fT%+>jQMs0Otgq{7Ps?@#VkBQ1+Y^I&ND#4H0NKM%ijn|5=^CsuKNX?< zf;Nkvl0WBv3*(IS88cVku@tRSvjmH>^fP+)SRU?La!^CYx{7 z;y?Wu3nDpysOI)hQB8kiWEc?DtT$4|`mF?`L^Ta%k$4F}RD)YH)A0g~B&Z3V;APwz zBcTOhRQs`(Q<0HR>YAzq_dcybz|pjp|J-VbRR{^r(mF%=Id>O^^ttFEsrL1ol{{{; zncQ5{&Y9maRyGK+Tr&oeEEQCL6lLQdYc?4Qt4B35n=Jxj_?5lGm;zLW!zB9cJzN`m z7HC_t4DJkGxST3M7C%2lK2xH6J}Qw(fae;G$(SO}H7<>m(C1?FjvM6%g)}knp$Dzg zX7bTtkhd&4*&wXC*$oe$w3bwznDchN1=Kkvk;nmp7{wz!zJ{rP}TA&QGHoa z12R^wmuuq}Hd_Px=CN2m=Hbya>Ld98iqe&y7+%;S{s6kT~5ijLaNEpLZKYYl3HJMV1H3fS;miM)VkiaROk@yH(%4IF< zP)?={UdGa0GK1ljV{j4z3w{!$#E4W9R&Mz8?D>2x>6g<&8Cg{UCp3O5!|TfkLtW8t z1b5eQ&IJFkPe1NUyGL2x?G${L@t7rd&NzDLS(05szwg{0`;LnQ6+QX7Brv(HFtw)Q zTp=kopkMYTnf{i>L=BX$6AdvZ(W>#{VvE^4RGu2)wRa=Y;@!jG@}^8dy?cfRS>4`; z`ZbQ5`a(7Q%ym+OB`>08mFFx}qa+`Y-})AwmSI19;CNWX%+;t7CBOnDcRbK>=^!W5 z9E3+=D-|C22n4ext&lYgzqou^`TC)e0!>e8JmPcOfD||CKv}Ra+Knq(S#A$&r&%B@ z*TtQ*=a{8P=G+A~u=Y)vv$58%ZR)Ls$cc|5?0VIRs&OLp?@@N+aK4qp$5u#ytB!TJ zzLxek3+owBEp>F}P}0eG=fqs96r>#N&R~wrF~abY*-Z5=-BAh##oC}BTnm=Zj=sR8 z?vrv!*YtzRI}A1h29}^!zviu2N600`g~7oyFaPr%i?7fqHkCM0D^2*1#5_&8;e!%J z4KR3)wJnv91vJce1n$IBZk>Aj`Q=9CL{5cb$?59|1g$Y?S%-NH;+y>;YJc}cYaXb2yQvNF7~)Np#P-3OlW zJR#d0)a<8TO&z1|U(26bR0YU0BfTP$?$#fQRLjg+Q+iJ+MBI;{3{2iBtwOuZTh!z zgjo~!+t!$0dTxSYd3WURBv6tM&}ZSj#OJ2lt#>+%-a_(>k5 ziAjkF#nuPjK>KyW{^&}}1z2(VtQL&C9S_ays$$Tav&W<)l{37Q17{R&fooV((`69m zLCLXCSnD-0tkB_SW^POO)5(mJlptX;1wGy%iA>tjhrv=x%SiKsBa2vsXIvft?Yx#c zg0A5dK^c9Or@$K(Co z#+dQ}#);-rSj!HtyQA;9C&)`+P3xOMH0hDamDFDcvH~ zvD0h#j0B>TEl5jN3KuZA64FS{0hSorm0w~o{JSkPm~L{i4uNesVQNMGQsB4(DyO8F zucCe{{^#8mPQ=U2%;^mPA&Wq`Y7kIyfY(Egi;YnbUS5p%G=wh@=%(W-!R+0OAO62V zIsYu%{&OKY>H)2&Q1T%K@J733w1~GoD0eiFq}n6*${0~!!(8f5-3U%5w8H&Vbd6~? zDX-7k^lP6aUjz*uo%sJO-LVl|HZrYTVkKJ-ZHSXAs$buOkRABx!=z(qY%i?si-E| z=xS3gd0knX)-31gN2O=`OlCJUqhG(S^1M^MC%C5f@V=zZICsVkbb)EW3a9ZhY)Nru zl+d$s6*rQJwV{G+e`?9xf89+PLio<3?&H{2VGc>Krv$I@FJqnH&21W`rpZ6`)*Nfd| zT=f7InK(*eSb9w|yf|sRb!T-i^mvz`nNR3oWwbEq$dg#I<-w$5Bx676`=VE1;J zw4Bc|!=3H}Y3la_OI`$~Q0CS&g|Y{coC9@=#o{<}>ty#*miFRUdsy$`l}$sq{c;0| zFedQ+QNdb40FaUF?_Z)SX9#AXap)p1LlXP6otDzdh_8`{@N(#qI)R5V=Udt16O1DEfeRU!Au6spFWQ< z`@G`i79zb74>#W)lZYV#j%+%cSG-L7NR``M^Wzt5rI`An*UX!bbi=bpk|`Q4@1Kj3 z(1%i=7q%!7rp_>DgzU^cCg5b&OJsG7)9}gczrXac$_+39?V-`$F^9sOf!OH~Ecd;PzSYA=us+oD@@Awa z(lNUxy2~fG1klm%D=GO)q0VKi_s>@EN*q6f;yu;+ma`5=COA(d2|fPkVd64NvfhQ)Luj1iUX{1oZ)j)dfOnZ?hSMl3cfb^#wO=1C+* zZBWb4=SIf`@PX1;J|<;we_trq(AqB=HKmT8B$BlhiBL$WGVVG)Jsg4FNV1sO`kC;n z7yW?7P*BSs*>qojs}Kg#RDtrbG>sLSP#giY$fwQZ)=f&|ciV#Muok81yInI$%GsA0 z>FBtVDNoZ*jz8hkPY5ensGDW-&V%xRF*{(}vy!oN2j->K6GbM-Vh2t!EaQ0<_305n z=NI;b8Xq(2)y^+mR0$nmG6d?B{=2ba8_8Ac!U7e)O^-FUXecB+5myUU(TFXqZrwR4 z4vn1Zviis#rngkwlc-AYWBP+{uD`9{@U&R_3pA3vo#xn(-i8E9A)II|{6!@q%GiFZ zyAbSrMADv9z4W5@`rtRonr^HWZVM=r^i5kfca~lK;|hn4omH`Ll*A9b{v}H#Mzjc8 z19hJ9V(q9!r~n3-c6KY?p=BlnbDM7i80NVjIWi*cY5v28Y`vUCx#Bg2WJWqq{!wSv zNkl-5JHkqSm=>_zbj7n5Cl$$T6zsr@US&K4djTVvQzCLQ_&l*K3gJ4;qAsuHDCVt<6e%ptAs@>c0tLy{$ z+_h3X)QJ;Lb!SJgX~`^q>uo-e|*G zrOq#DXS>WIMmkkeR5sO~IM+u?H4|&y5W~sHOgC~a-k%l!uuyUUbw9B{Z&^v53tsHM zu48zquC!$#Xif8GIs%`Mj$Q^juhohUG48j7$^~Xh$4wT0&Wt!?n zo21)nI^I=mj4-vFvCeo7-q`IqqRvOmz97zhjIMFQBt=$?d3he$;+rf@`wDr(YH;t2 zDc`L3WZ8%5MeVwtJ6a%^^bR!O03EubG0WcBMYSg7o3T%r#5+mzu+}{TNjkD0`>Dad zE%D2^%&B5|X{xO5JA}CGtQYRt>4x`JOmEeENN4j++x66q(ahWiIo)f33y=QSV`ql8AudTmNo&Dv>M9R;u*!bR+6f&l+@sRf8|DYx z)kC_Uqzg*2x~xIK#@4kLv9(rpvI!&zT|$_N4>a4*y?8h@WScjS>efehzl``Fdtu=s zjl1@I8yDHb5(F#KbjCR+L=8@jKOHZF>$tSaIHcAg8_D!J+M* z@fF_1Et`kN)wC_h8%B&fBWn!-(ThylNE$ue%|kEu&PQTD&;i8p;-{$3*6Rz`jCBgf zEEGA=w8LQ!eJ_*Kv$HX^txlaN=oY{ThWWmkn^23QhRxF9{uthBXK-U>6B3|jabK_9M*|903n5)rZiPoF!7-U8wPxAI)NeTW-?H4{ zc(@V|6suNu!Tpd!@$Z$?XU^VfJt^&#@fe1)dWD}$pSe+1*0hE$3^j#jUEarV4ekC#`v`V)xpXQg$|8n~xF@PKl&YPm7Qk*H7=ZxV6%(94mpXNeH|RYO{{w>UJZ*&xRNyieYnn$h~{OyTBHzk zKJJ?p5Dlnlcv=)>TnV`D~9iO{$*C z1>4&$sK;s#1l*+PD_nSi(UCw1wN|Dy_o1cNDtCyB7NV)#W^SVzqCuJQDwUVq_tm%a$urT+jHqbXQv8d2OjgrcFJ~ zIv5J$TY}>el|soMuC^x-X!JY|tZE|G)zo=?yu2ma?fyncbm*zBy@=6q}K> z@8z52e+74)lWKodo4Po@yBjmih#Cx@Q2gqUsk*eVAP=3#CsbA^SVvmkeP;(1x&Z(l z-S*cTDZxwQe!R;|*WA9>EFqqh3lxp3xcPoZ1TA^HhxrR6#8DUI!H3YRn96I6yd z2@ZRz%TM6~h{SfL+fdzi=~Vu+S&uMvMr3=j{du-qyD^^gCd@&j@>*qPa99C&YKf>8 zO=Q(e*$u>i&VO*`2=zAsEx)L+vLp3KUE(W>cJ$hUJGxjH-e5MJTs6mAdxhX_C)xEx z8UM$|>LWF(DQT|n-v=4vlMlxMl_<;j3i7#}S;Wu{t^kq_;B^?n|JhC{MrIuL*SnI$ zUq&l7!2wfsNgLlP2tClW(k-e43Y%W|!-xma`?pW`0=oV1Z*g#KhkS4VVIAb=su;ed z<5Lpt>6E}J0uskIOgO^)=`G_E<)v&o4FsspCg=CTl2l(xr*sCPhM#mexZE}w|1jg> z(lFxW4na_e=}eC&&K6vMo5Ksu9pr{!yBU~krq_>%G!A@m{jhW?p0WaRjgAc^|Nf=N z|39@d!??Mf`L9Y~wk`663qcL0^Tqgq^VXoFnidtV`eyNvJ#6~=XbWc;{o8}Ic)CXg zx*cP06Z6IILX<8QKWiZ6R*O1xc95MW{s>WGWr4iTV}RxY>cb!SNOc{T)Lw*3)Lv#( z)7ZR{xkk_Eu1@enY;T?@%0oJ*zOP9^5=!1emFV0jb=5n8or0OfB{N5Y;1&CF36Qy< zi7~zg#~19urjbnFtro*m05i>Qeb7oloPPX1v0ZAguc6O)rQ!`oJ;%AR^*Qy5x|bbU zMm3n1%ZNMJ0sA_&!Ikp0JqWe1-4>qz`JT%!mGamhMRn2G<|2th z5-w+|5p)3%rMBeF3yalTqhn7m-Ma%nn`(5nE`^f~Gq0R%j9QK~8|zx0sO)~}N)LL3 z9YV0FM54d`f;#hiMCBSID|I-c@2I4bi{su9faOO(CkGYen7q2#*lnO^_sdF2lNOcHAe;a(Z4JpQ%H zh*jPxWWmi(H3+*LlUPVLfvxRoomsMMOC*OX!5e=m$7rg>!nK9wGH5@8U{jUaYxNap zM*3Z3;Pdon&#n=bS5popvVH(#T_8hkKeD8J`cA#2{IgBlcY3A`>zruKFioSYh)u@t zTMwmEYI2zAq6zSL(o($mX1>BTDhci224ue#Ii$~4mdESZx2 zP}twAaA}zMxKSZ7xW{Ni00Wu;Y$i01r^^^V0x#E1m)e)R#D7_OajFqRH6(KIFozA; zLaW>^P^E;e67d?=eaD%n&%mv{Ejl6xjcODVT5}hP$kdBd;t)mjq}4d;P^O6`n+qUV zMf1c`M%={=Nd09t#3Qc{yXT%bZl>kB5ZiE2+PBQjJr4=^)Xr?b0}1mlu2pt2;v1Fo z`8+`+v-pT)Kye6IEgaRiYV*6j>tHdQ_H|la_bvU;y_Sb^Es6cdFb7u-h7Xs(FrZ`a z2~+tLK!F+TOH zecO5w(oMj1P#bW#7Lt5cC%oNj6HAtM4++R($oPF%$BF2BOpGsPyQqaDdx1aAOx)d4lDB^zMadlyfCFJ0>0UV zw9&w+VHIY^A=EKT#p)zsaC7hlV$Nb^P)5mRlg5Rw(!tDlSwy#Mv%;7Tbj82h(jJO> zjpWX_M8t;ZO!x%(UaEWDYF6zL>}$eQ#>*}E;R^i&gImmW8Q*c( zDT$O4Sq(@BOO6lyE^|oaFCQyAG4lo0lj3e07h*obZ$NZ)5wK&+EH?W;#=zaz7@io> zvr#`pjAS8}vL&;MBao*SS+^@$6*amIEhSgjmN?e11N_%}*F2ku$}$lj?GF#T6WFvq zmH+O_LxB%PiGpqR^4|<94bVwgp5%TFqUe(d@*Al0mi*YfrV(Wfo&P9iR|x^3i8pVU z6`2{DU9Z*lGWwrsFhjoo*$46fDiIl#B_`DeM$axpPV#K%RM87txY2~r^i0OM>PZ1ck3n1jc z!W6bUzI1hO+6*T1{qNU0m(H3>YG0U-KrqO!(LTr-!;UUTJ@XAO8`~8{ysOapn38v4 z{A3RVneA`i2U7x0_rBS4B{V}h!Wv*<>5g2_p%vy>aU~wL`E`DyJKJNrayoeQIlVRE zLrsiuEesD{^tuv$E=4C*nFOrU+l))G{hJH%@S;k_A8F(7mfo$2*@gDj$BehxJr(Dp z&TW<1JND9Ij9%L5m0zRvlLo$_-}-n3`HzkVXeMOwbU6nP?_<3Gy=fM-d}x3!Hf#Zm z$v|N118l(r=LFq(Wsz9OxTKb+N3W)Q)}QBjWY<5>ieZ#F>bBTj|4uWLze-rYuwJx5 zDOKCa!1;2iEc~4wkQ2$~U#JeESi-E7is;?YAxdTd4u$~zMZufbD ze~7%S|5>`6-Q@5PclK zA7>v2s|Dg|#798^B3<1oc6MJiNau(Ao~?wJkFmQ2cJRHCHcYu7T$bXKI2Cb4nn2!s z!l2dU#P-`2L^FIsNZBzmO=n@bS?GXY>-Zb^q-Q^oR{-IJ&{o0Cxo#!%&a20q3#un= z_^K|6PPN59#QduSVzD zf@Npw#4pcYFH;AVptuJd(hCCU;>1M)hbvDVXIOicgzD5yoYg-HbmYIPMuh6?E+0$q zd*!jPn(5Z1lczssP>-^xg0~Ea9vLoNXso0(TJ16SvG_%6(SHbw3FRs37CD>Dw;Ei^ z+MKH{GM|kM$&u|LAXZk7RZEl~2N5~=^Bp^NOT9~Z!h#JG4)c%Zmz8zRdjZ9N{V!)` zLIcz`tQ@wl%@}9R-(2m@bI|AMPKkQNq0mMZ9d#)eRF012pFU_1DBQ9JD&WWy%Sz%e zB@n|0G#S7u6lKKHenWOb*|JuqP zRxehN%1cfdwKy#>YOMv&W97a?zZy@e*#p0tKq+z<@BwSde_#GCNO?(BofI3%!KnC9 zezumeZa7`(08!ey!L?$yED+u1>xvtYuM*hWe^Tg6YndWwbvzf z#JpgSFfIH5EMvr?pfa!XyVtER`v zg*2-Z_{k7-z2yw6zg19rbN8f~^8BWcqNQce8GZnQ+YyFw93Yo+$p(PXkb&x!aXbv5MusKaOsj zrob=)7BclI4{7Z1?JnwvR_+M}X9zvb(J!mlcp2~7`)QnjxCGJ< zdjvL`Xhb)`6$7A=i3_Tb!JKeuGtylCa<@$!EccL~^wK}t1swZ-whMQ3C+waTzX<)6 z=CJ(z)0^-oPo9`d+(#ukfUHh`m)TFB3?{2=le{EB+`@Z>Gmrxzi-=<&9J?Eahr0d`gR;3UYY=`M zGtjfXBwTJD%e;eA#nsQQQ5j;&OCg^F!ct zFHdT2B%noDv~Y7x#b4s^3b<;&w1NNNYgF3YxbN6J9B#L|IkY$@DK?fTCo}e+D4S&T z|1D*+R5~*-Z~U5GR50 zj^1%lA762phSa}zXvHdgYR`gEo8-P@>`f${a(;Rnf(v6=VnyzEhB>fV5i#{v4}a^x z1HB!1{hRto;$)cQ^}vJT#ga@@h^oRcJsChz+C<&GBbt$(gBkGA6!!?<__r!rpB@4# zXg!U8={Xw8JenH%foU)c=@!TaMBBQ%P9CeyS zlIkMdtt=41WJ#xBFHR77rUxsWtOWtY++2;~Hkv7lx`#^z*a|sjhS@hgp7oPc(xmTG z{m)dtQ;6nsZ^WR39o~4@@CEuGk$$Z;V9e>!mYdjDTRzy2?if z4tduZGa;Sp%Ph^DXloOyw*_mTI)AHZT|1nT`kFS*cD5&`CUr2rKq~RKC8-50TuQLB zm}q$o^Rn}ujbECH90_glhkvV}Q=s#u{Ei?n_A+$dMw*AuN|=i(rnO?P^wH)U4h(sY zyjO7Z|4yC;fGKoFRR@3q;Mb^mm|x12sew$}T5||Mt=2$yP$#3}bN*CJe9jNUziIj_#zBMOE5@SxWj<3PV~Ui=es{5||bse>zt?52r_iO#)ckt6+=<8pKogf{l! znVIugrMFj*VbEjgw~yEIglz_fKE1Ia28lv#kK31*uV#w7zd!xj{40lJ$J4=KAUWcg zLDVTQjzNN|_%#8H1^M;HW}~-Mu5?pyS#+NtO3o^6iaE&d?rncg^H2KsKW)HjIcAC! zkT8RmtXd_)ozeZRKmdk9ueHmykkqBWeEG5+%}5=cmrLH>2VWh7;S?n)?JFB!I9Oqq z%0cR8*Xen$?pjb$G-nLK6f9mi;ed5O$lv>biwaEx z1X3d0D+%E({A7L3;xLk3%^yXxyNMrO-*^KbvK#597ax_cc7MZoTK)CFVx+px?%Q^| zJs;!$UJvp61w^UZ!O8S2BJ_-t9+;CTx5-I{(UYx&`QLXu{&!&F|P5fN>WJmPJKRr^hdp$gSU zTMR7DX<(Tk7ItbV10^9B=Qxbl=mD1^VTE@_#!T^>t^v6GqlVz4Hb({6zM-sgvcZyJ7R|%f&|O z(;mJuO$Qza&yb!E=C3x@y5Y_&Rj&|d7f`3hjc9W!xT8P*EGP5h?L#S?x6+0F+n4f#f_R^PWrGdBePiJUd$kc>S#j`r-_`q|<|IS<%97)F z=j&km*3Dm{RZea3Dx-C>M6xRkb(~J|jJTWPX&x9p{P9c9r+pY7rD?vp`Zd-RztgdE zinLM+dgN4N0YOG_B~tcydpdkXY#>{a&SBxCxL+=%oj5TMx{J4_i?lqwSJZoOQ=RFHO-gN^qi(>5D^6x^6mAaCoT^vSCH( z&c&PDd}3qF$cClqqc4KPR~hoW-Z@eM_WxK*= zr5ZCpyUb5H)kOXtP|7SS5<%|a==^R7uEy43Qp7feVI$+9eqG+H-~ z&ath9ssLY~0^fy+wj$re#|pZ|45AaT&QSb)&G`53^i}JH*(&9Db3&y{3(BelCZz*y zw!+D7Y+SoHtcT;JJ?@%wS!GX=WWT;bYX}`qN#5j2pu7#^K%Dx2oH6cr=eIi^aC|Ud z944`@^))Dg0OqUp(FlEO;iPLhHXc6LJUFd6=-d(rzse}l)twZe!g=O`4e9)qx^g8h zz@l%ciL|xH5@o9 zd+}pd<)EX57|*SVo6GaGvEe~Y#*bDkefo!)3qP)_)X5bQYrNn))4rY>Ae*!_Tl+1Q z4`Q)=F6lpVfKpKO)Xf0yJQ}f~i8&r7u^h@K^gUpDErsYNA)7waJXSLYo&2f`#;PQA z7&}vj$(Es3`$T1MSo-6Smxo91KXeW*HH$8^#!H)dOFg@fH;_4QzANsIJo3%onFgpH zlul-}{ESm~cdMmMH^_jsfXhIX;TqDDE$@L)KqSq})15_Gc2zV;P7nhrLnt z0nT*`8@`P*jq2*U4V$$_y<^uY*948YJH_y&%`5%0$@_!N;|&JP>(fC*39TZqYm!H* zJRCKlkj^EbZI=y&C@E>J50GCK1eRq~9NEKA_+cipW+YDPV5B3$`r-aNsJNHV;ya#x zdhfLLnKvOdrUw#j&6xrkiL7oNeR&A~E+rO@ay=vJjMhnM9Ks0Z`?L1Ey zs!yakbw{64ogl!^%Sa9GmSbc|#5(9U+vV_I0 z4EJSHtBE?A15%xUoPIs7kC zsomtCm4x_mbXuw7qntfxXkMP!?yxc;^^A8)qDIVn+7g;8^I>w~YezM-=^m43zw`0@ zC*Pd?bK!IxvV8@2@9(iD!C0zVb1yJ*d6#AnFbr(zaC?EaVY6;}H&wO|%fmJY37ZkC zfKMEG9dq?YWO@u~!vYMgj3$266dGLKpXh(rJ;s^X-i^!75mSD(CvBPhd?%qP+-p$9 zyZD5zo_R3BD=Rt8sVk*fcLSE0;+_H(^voEy4#qlmVfgOs9q0S~2_tE9*Shbz$2a?fV;Npf1Im@28v zCh@Uydxx8owaClt^EXs}`;)Dr_Cgwo@DBcw)!!$~-(m?YVFWdEA^UB6vV`o?;>B$C6p z;lz}ePwt$d`$^emt2CI*y=(VBUTJSybY|s}*Ufbz4Cm(R8%t0$w?tB`CQ@oKo6tkv zu2~G{oVd=>MYA|O=Vz$IV11kNh;AMk@btY~|AjsoT{{*eR^g`Gu;x zgRvzZ;}6E3bM75_47?s)(mVD|3!K9Fj{n&w+>gnt>mAQb5gM8_DO6GJPNR&KRjA+W z`=^wD7#}pn&Js$^x7pp=xUWo)g{{`(W3^kC2p`(>cF>kT+>~5DI^IA&ey#G!kBQ)= zk#6#%BM`Pk2SBfmR!C=I7h@jnz%x-nP10FE?inZdy3F}iy5+IAOa->1{^5*QPVUs1 zD23nB#WTDotF;SKI-1d-!;C25uR!~Q#F}RoW@xKtZ+=rLbDkA z*-SVMPUTWZGBgTr>6s0-X)Zke5xx?b9G+Fy=WT(paAkY)#Pb2O26NHD>U%KX*+L5D zCA0JSHH{7LR-?0txXQ)BN5Sz*(tCvc97dnMS`$???Q@CKm!p8xx_GPO87)$UQwGjk@xmex8!?foXpSh2| z)gZVF_Qzx#x+6;UsP6#@e)#t>#sG=SH1zm6lsq1jmFck1tgQE%D#6Vp)`(^sT}mk? zUt>NHakC;j``vIGVfHqilFyn*`_9)I*thUzQ?03M>6GbvU6#iUcizLVdd-$^2*Yqb zXQ!P8&R)ho{aiSS{dth!$&2tcvu#sa1`jr_s4^(j3{!|pRv2i@A^`Q0V8oP1OGQaK zt;S|L^D)4ayL#O(jf62XH=S)ZFJj$(xPau1uX3wxkVCt+L%nR?#K zW$?OlZnw>M&}W&G^8`^aGj)j=&+>yTQ7_+c>o^2V%Y|FT!!0k+_vAz9lzge zXuJaOi@^IJC#`)jrTa2vpA!&R_@j}$AX7;r{o-u0JD)Yxzy$x+;iVo){Kv<@{En({KP0-Qf$srRsUAPqj6P-XSRX|WsyjI)AAyx8dsWIxyP@M z+-7zBZYG;5(;A6TjrUF^I%L=BvaYMWs z#Xj5+)>V0*zvME)^cJ}7So1#6IQZP9zI8Zlx9bzdjDpW+6=LGMBMA=tR6Zy5`J}V4 zoX*KmT@Gr_JrFu*D*f6tLM!p=Z4;PP9U{}h%|2bv<~!VRDd(%5v;xi1W}gKkE4Rq7 z>l=R)Mchh^+4Tx()Z&s>i+XLll)WXz&RCH7nF{v2g>hDLXJ}^EV2_uv#dXGJWnH17 zXtUNM<~uy%i1BhjO;YLDx63FkD-mJH0Q{lQ5s*~;5!wlW1JQCL>4x_OMbU{Rj6}a` zv|~;#(dhPWoRhmD_}LD_7Ccu;YL~-duU+OBZt5TfqN5N+d$zR>N%gf#C!Z)Ut`9m8 z8GvvSUhoehF=d>uvl%V|ciz6_{MS2ja9zrs^9w8D&Cd0aSxAxaT{LxNibkAEY#2$E z_LDQQqngxkpt$wb*B$Z^lsVDY-ne_=UqCBHS6e?Da@_yCztjGmWXX{l(m8|)GFbf* zDaS|j&M(`je=pGXa_F8Y)deZpTj zTJR1xM`u*DM|yB;tX6BJS`)wApY*CWT6fyh@;>|ueKvFQNh5P5VArAH6E{C9NmPIb z^)9WO+h;Gm4i;fK+~*xhKiHZA<~CdnyqEdk+-&+z5q*$NTneR`*-W3a!$J`gdqbQ6 zOk$Cr5-Mf%NjvOHBZYkn$Xr&PUYyGuw_g4JIH6L5DD{3SWq{Yu{1p2+M6L*0U^V(* zaN39<^{CgSajS<&WgBqS=^DkYJG8t#IbO+}gZ%dH8h!1=zp^WT6&~E5o03WcPa~n5 zU6Nj31dqG)q}6X4`|z6htP#5*vm%xS&z}t^3GWV-fE4w;@|liQ3RZT;&-KFkj92mt zWB7;Oud-^Mz{;K#bbh>RDEVsgIBg%quP_!NFAqFJqjC6apS}y#HP)0k$c87usvq7i zKfl({W~o>nznT65(N#OLfprYIIWXOlR7x@yLCXOuivP;YELYNFpk00B0Ww!@1~PI{ z!P^`h9Kma$!^5}4-B**3di-o`Y-~Z)%ivZZZ|YI%1tr=c=T2kSrncqPy}rYox+ zr88yPo+yj^!)O1y;0|){(9auxkki#}zTL`~*pnCKOOE)>Dd3kxsb}IC*1kJ)v(SpE zCCD%XzwMik;|seV^?&f6?%1uo@pv;AImvK_GxJI@4A}oNzi6N7u~W60pTLuLA~DOqc^_Tb3*M&>=P$gEcL~rt6?eUqEo^IAAJ>Mq z1<5R=dU!L=pRD<`Y04G4kWsb!d$M zlVl)dii>_F2cqizaqJ`R~5G~lZs;f z!e87sS!Y&N8kWUl`fz7$`EvMX z=LO%=Dvrt(IKIlos{DAQqtS1{DcWJeT$uaN|B|wJvXHz)f%VGQ9@~Z!vo2a1HP5OJ z0W|_KDg%~p=li5Be(`xcSR4?VFS66g>E_Lf|1c9j7tcuG{E2b5zHgs95BI510_}MXS$ZGuoZ?As*Jlv#qnZ;%G`>;6GQJ>$%v zNcinEZ{^3_Pod2G(+K4GZzIsa!kkpy3s&z8tRr2{y{*a0O9~}zEGd_gMYmL6YMuXhy;76%`fo&^B0oS$1Y?kksw#HM<`_ zflTqLrL7}Q7$w`@}`Ul)uAn$=RJwTH57n_1jWp+xMY8Rnnyzq@vQTzI)}Z=(xn)UpACBz6E?)W1BEKN~p?uCF(H zo){dm+~~M42h;;$F>S1J!CvH;N*1mLm!WOTTb5GBrLg*}6IU@9uMntz^hY8FH78X~ z@T5}wi>Cmb9e3ZF86?J5#`@@LjNCIJMPbV2C^thykSf9AB>%KJ%vt%}6IyZ44U&fW zRVRs#k2i-(JOZMvHBJ!AbW>9&BBa^(6DiMQ1r-jmKr~h+BU>mrTC+}Mu>HvzBYpf^ zxf%*LMe6ghUVW=f7 z46Mks%21Zy#Am;ZhFLkN;T^|K7SCtSQD+$q`O^naqpN=}^t~MQFH01S8%o~-UU;Y~ z48<<~J-i)7e*La?1B@K;??ljlpr!uX-bi5}`+OyPg!txkykxV>H-i4bL7Pc*v~V!V z;BUd+gmD^8TD>0C!R~fXPU1ES56;(3T^Y1_=wBS9tmm9Gio{xOe||V~veKEkE`~Kl zLY|!wkZ^vuwlNaEycN!L7JBY^bk%RfZj{^el)vARbZqaLf7bZW&_}yNfZw-Br~%N$ zw!wOdVRvVFOPkaE?Cvh1S9Z){C)5NNZTV;J91Vt|d`xUCE&A3w3hgwD^P|^hXHn;i zj^`XN#}R0O^MxQH8WpZ0t#uLxqO*yrro>ApV-7g$w(di>kWBup`s3=%TyB1M_;z(4 zq|Lojs2?hUgJ|5J{J@=?vQfcauBZFaZVOT){vc2Kl;Vn1%D!Vn4WzSTL)mrbR8Yp7 zxrMKt$)jH_%Fl6Rnt!%XLc!hY!!@o@?I9x>@I=fR2Wtltq7(u|!St>*p^=28qv;g7 zrWzNac&kADjEyX`b#{MxZ_y~I;qjc;Jz$@{qsNa+LZ1UlHjYi_A`@~HkM~nMbGy7b z=HK<3#pZ&;80Hu!=t~5I+7rkCy8m_VT_{ds9>OVyG8&iSDzES76677$JGpew+>=+X zcs0bsAQKGZTr}`zP*Wnh@-?28A}m=Z5Nw@!bHxs%W0Nf&X65g)o86(z7}pt%g)gt( zIJNb5hQ7o4U!9$2SX1A&?omLbC>=zqbfgMOlOk2B6h%-hk_%p7zd*`fF-B$@F5Vb zEqJ#cJ^cIlvo=V$rKoK#cbGbF0bW_8_gj4b*!6I6b%z6Ypl}tKq?z3u>Eytb=Tith zTym*@!oM@cq38kRFc~oCi>OrFdi_iRP%W1DKf#g#W{Zd7Z_)qJF!rQ{t>w{O*C#2h zXN(Lp^xl^fJUy$YCC$7jr8VP)@CEaVSG3;QNt!~YY#a_ygAxrl%&<=CNwU{Xg1D5x z#J!L8GG8p`#1loe1tb9wj5g5oRUtFHSI5P8OFwc3)y~Y*T+$`E8gmff$PWsrdrx$; zL+R-v#0>2PneT9K9`=w35@1-93M+UYvVR76=KuKzpDyxMEeljK`tAulsY0BixSsu{ zrHO3$MehgZTo>$`ito08z>Ud zTdt*RN@bJEc)`Ob`}2IL;2B8?_pu)vLzM{%l6y&2t~KKoRy1TcYBmih8MRc{5_e)}Gz&rrc>DEL< zWpHuj3V(a5VETEJ%NHTtv!l6d^dfS8y!^hw;*vUsiGn;ITV7KsJ_+J}oBh^ccWA-8 z1x;lt`YJVa?Sgdd@~9n=oU#Q)4}h`nBE*=DEXVFWb&a)IVz;iY&O|ig*@9=Mqps!Judi(@NDsY>Urb&}(aMbYgm#W}3JU4!cJZiHbI^fJ zG|;LkylOQG-Cgw;m@ms`a$InHaiR|GgSdTcJ-!86geaAObOk)14a!kJle~7>& z*Zs@x2h8+BWwQ@I^%^F;ye2+W0tE9_-j&SUhG_|^J6!%3}oJ3f;WqFnI z-*@)KTLw4oT)KKUE`vtu)cj}a0oRzQC|QYwK6BD3fQxruZaL8IK?;kE83t(-Cm1I9 zMc|bbm3|4(Dv=u1;w1nV3FXtFI$gv0VD_={S-=)V0w))^;B%ds9iKI{OT5T6@M`v& ztJe3fE5#EE@-O+g8Tf$^$il0_*4gOSI$y38!OJL4SM|ajASj-5wyf0o3JA-(&Osn2 z{dSbI4v#Ede`X}gw=#7_x=N;fZ#$dn5Eu8I)KQA6I?!C_AmClXZC>&@TVk)ohw<}D zcbAwuvkOP%8d`+&0lmlga?v+wLK2I03JA_;O*kHa3v`Ik>;j^s$iF((e=UspxKrFa zxL^^yyyWSGx90m{gZ}pb2My5!Z%=uNPeyU(Sh#|q@)wN23{sn^HqZH#(8JJ)Wht6O zS*C5_D89DMw#8kiIALndF^|@9GR$OB`L^dF031Bs8C;@ZcuA>$XVdUf=Z3oI;+fo! zKfmn47C+o#H%y^2@*cD@wfvFn8}WtDNuGNVov~%AfP41&2~}i0vr8WP96%QezU(8X zG_(e&h*2ZwZt$82;7|2C>qc|db|9^{@!6z5oCy=uFoRjCSfGXOsd037GiJ zGY`t3ZJg4Hr&}qVkhgP)5kXM%BjIW>+s`j)XtNB zuD4rnl72@j>XDBnj+37IUK6Ues_*%(dDu$;c#LsGKlfv_5gqMo z;Zb~Wj>&kYahy9TW|AT7Ikvg3Z5G=9pgJ*V!NdyCU^Fd1wv-#lc;yEn<*NTVxO|6H z-w^hRlObs72>kf;Pi6C4-HfRdt;pw0LvNi!Q)n!*+j}3yEQQV8WXvMo+KYtkANAVN zW(Qe*sLyxDF|BQeHs=$4zt0PNOm;XV9@DqVJM zr*|(>1qJ)S^WV*VZo5Cs13#AL%&qNea(b=d&61ytx7f_Ve?9oUcb_oRgwe z?#fi9#f!9Q|EX&-pn6g!62S+WQ3iCBKKk)z97=k%{u zx$AbuAN! z{E4Rxhj@YT{wL5*0w~(9@=RYIjQwyn(F%adQ2e9^eq2goxhbn4_%p_qqUA{Rx9Y0~ zXCQ0?ysrE@{>HiFCtS@*=t#XxNB(f?|8Qf{DHhf%8!bu$)F)o|K6ohozxi3pG&X+H zL1%xOL?`|rcLpySd^|DpzW8SH#e*xEhwHU)o`BOpiqz4DoY@9mCzJ*`Im0b6=(gBZ z1qGd&X>geekuXCF2IIFnSFm$!SLNj&iXM*DG&}dyCQW$RZUEtFK1>%d7XI(QhRLus zJiJ2q#dR7|9$;z>WK6hDT~SfVuAFEHfJ-c>J}W-<6S_>!eYTM=0(hP1X~~tJsfGaV zZm-2I=K8G;?!?zjhb@qGH<0o8wvw%ZN?SI&(v%;o`gWI)eJpuUTE6_J`mPY3I$ysE zQ$QtRg|$&O`u+Y#GfEyt1j8*+{9z?#Gf~ zfYN_*G3{R-B4majQ6j!8+HcP-i~MtDDfj`&RHPcenvsTxf)7zse6}T%z<2(hApC$O zTDY0bCM9g63J|ng7=)J)#|;Q$#C{M0Q|VlL4xqax9a3WfSMQuF&)0s+CG z8%{hv00?BrgKv7=X-5G0(sERUr(~Ub^g{6bfHD8@*?VoiRdK zJsFa{*=)iI`kh<88rQU=&ZmU_zK^)zIwAoo$wrNQ4Qkj^?W|Tipi3t3^iOibHed73 zKxF_2C8!qTnQ^~9fUNDb|6<)gsh?rVt?|O~#kfF#`^oHjJE383lNSj$M)n?08Jtyn z?9)%EGOQaM8pnwTX~2p=jr+_;z_Cq{hkT3%GDDhS$9wAv6W3m>-uz(7EG24Vj=i9E z_k$@HaCd}0cyOXhO&%d`h2QW441V~5FsiUV=gGGc*X{B8`CkFWp$%d8=o(>aw1cvF zZcZZY%U3=oN9nsH7QC$q*-M#)GMSolQ`0K&V1F_#i)m@|WYvb5W3niu@4?TRfY}Ac zRH_s9n>KN~AA|#w##v1FwAw29@jf<% ztQdpjml^2vtK+>ud^)Hq%9EM@M@nmM`Q^tiKpJ6V%_(ZERc+y#D$V}9tew^D-aW@v z0DcktG_Q0z;K*m9Qnse)hMDj#pne%fzFifR=VE@BU70a|e>kKIUI(nrJhA5x#CUfzwHitw9`mUxy)6*rI~Me13am`>k?z*NCfDbHLQXiPFCx02lEsj!xJkA1Ud+se0{iZxv_R2lK~LBNj1sf za{7{{SPh3d>OsvHGOA614Ug|gP~xEbxW~F#n}(6^>OCeOA(ITYTqVz2?OLbjsG8)AvhIDc?h@JKZXyJ4SkP_-Q#=%KK(+E9+8GoZm#t&=pm zagxsH{W2v4jYoOV*-hk05if;}G!MelgXd$#5^QF<9W?ORwn{gY%y_N0(=eKmgk@am z7Av^AUYj)6Y4;rP02E%gxr40S}M;nA~-@`TWC6fq(K)-iiBCD~nE*anComUd(?$ zHvsoyEYRP~`eT(L;`G-R19X%M`pTO%Dl@7d_s&0S*<=|g=`uPcs!$`u>&~x`dEa`x zGZPSt*$kyf@1xfGcs+N;CnD@^Da5oiXy^(<-?Iv1uPo>}Nr6r7zAB7Bu zgy;b88cH4$O_Gbp+&RWD>ek5eHS1|mbIYo>VcaJSdwu@<1Qc6~T0x-G z{``K~8w_POo4|W`YB*vj!V}#6n=xS0`(?#c1ivqD%|ba}!C~Ly1jyjR&fhrTuk2&R z^U(DM2es4bo!RPmx>W7mihJz5MseZNJePhuqAh)2j(tPROY8*m9sEkL5T=XMyJ27e znCRHSP^)lF^2}JJvJC_t0lbXT{m)AT|C(F#EzMe< z#HM;}&8)$t(QasBfa>!%@GW_Koz4&VQp;)|f@8xw3is*q?}NIZa4p>ApOCGKO}Gy@ z_0G^B%g`+SDdn^Z@meCRVZ*5Bfbxj58A~m6tr@>0OEahX?6#H0Ndy>m(y0QiQ1=X<+B{8$$Ci?~b zDWEiFGxYX|28~Q(GqfK@u`<{j#@VP*b?&YDz!;$dj6{?i(R_1(nt|mN96ySh+P0kB zifGmDbTX!Jp)GCb%vN7N(|;|=Lr+_^x}9-P*wvxP>60gW-c|(Z%?89hg_Z*(DCeIP zd@h&(zuV{buDE5iGbk}YQSmm$O|1aC+Et(loVwv#eVdTEz^Ha@CXl7>qcOgVr33qU zXCVzVOu*v;64xBQvmdg#-^bdQTqh$e5{K>lXB`9G9TXJ7Kb{>fALs<)`M0NuV#@Ca zzKXbRT%9NcCMk)OHd$@=vExgU2PJAiL4xk1@7jIPg4=6V_;03XyMT`>5Xhy57qkQ) z?`40|0Ts zLc#){T7sSPm`*|<05%rt-@>%fc7`Iv^r+n| zZEw=LQu(FWr9ihAbv=03Z z_<_P(v>vrF?ew44P6X)~;aMGS5Nx3KNJI~C_RvJ2tJA&zJ?y{-{N?=p_p^|5zAhPzY!0t< zZFot1&IqBFpl~b)`kBOK23ZmKS0@xQ+OY`#o3n1(oBv~Xfb3#YLvi!%ok@;>yb>ZY zc?iB$1&qj`D|sn>O%2z~iuZHPl&AeW*ueTE`=bCNNl=#ikUqSB%-f3pYtYYf5VzkY zi9H|~K|l&N7)D3C*JTH7#Xtdpc&>{;z%X2N*a<4le1;rL1k&P4d-Q%k+$!Ebcz~V0 zxl(>SwXJRV)j47Mh3MrGwe7k}Xm&}=i^KVwF)|KIuYu~3>v?jG*~YMS5`yd3qP3vf zr%inKcisSz0iV7>f~Q%M5&+vzf^)qoA-oiOQpOX}Y7|#p5@{A&k_Eo1q9H#Dqu_GU z(DEd#37wpJY&(lCaj@!Nbp@=Ui^MCw8zk76eDI!p{(J+Jx6=!J=!t606<`Y-P^x;) zoSiDxp8bz~3P{9(jJ{NoV_y#^d0D{c=dYD3&*SSCz5$)>hm3a!Pc{oQ4m~PkQ$!OWJCYT z?xjmAfj@N%eC=SlaJ0IkaII2&3sa2|%;x!MV~Cu)mV=O3FSwVRNj*Qn+r>odj{BgS z4L}DnEd_ZN}x*);&Ja+3Hh4;hcFBp`>gcE(<}4 zpS3WrSt(kx7ufrEzIgu7GJpFh>P+!FeG$XL)!oVbNbFqTByP!fDEorFdrjA5nqUwz z_UZqK9w6njq7MMKmafjPpU=i696k6dV0-ynHUqV-)McYcfF{`7>T+8_f^*dl4!16rkWv==Iy>>^$T-*OIfZzc~M6-p9tpM5mBZnL+kvE7FE{2@a zfQh`wU!RjRdV9@GqP>Eft2#jv5`8wrF&0TvpPJmCdf6p|w)`er!$zlzG3yk zatj?J2<8Ym*rJ@%lkP&4#BR5p59L5ys^GH%cKM9H$y4C8_Ajydxx2vLBVQ{`e7C;zIdgP?bd2pJfrz z+DvKsD=d?p{;F9@+JZutbx+&)RB*|+LZvRB4klcgQjJfiw%mjpCi9L?P3wzBwHC~z zvusQ?|3b8Z9krD~HSP4lYj=@T zZcGhR59RhFTkZl93Rn5&l7q*jwE`{69SYz^IdMe$UvUCAjp>M!9jWs*(Bqm24=sPy z3^sf#*U5fN{^B?Y0UECe$e&brlIqDue)8Smzcu}n9}Ct0C*wnY7pgz#Yq-^5hTxZy z6{@U#O*U&TtK8nZT;ANI9e>l4w(=BV{s=jvUlU9`a^q8qptn z7N;>AP2MwU;RpYbLG7lhOcZqwCcs@*PAsy-se6PPFg6kJrpX8{>S$Mvh zzG`#P&L+v>LhsI>D82iTCBgEa!sqli0y8qKWrn|pU0(**V%zgjs(Rk zZqMR|a6~Ef;~L2we8jFz{ob#eNKn#%zjb_m@KWG7;&(YIfi8B1%pBjk9|pcJaSkgUF*s>Crxz(5iE{J*%K55<+EQvXt=x2?FQ|Q^er4OD{AaZL&^t6=HTka zy+dG6+%fl4JAUBL8)P1ufdho|^J7-PhWUsHTOxQYY*`mGehCTG7%`T2__0J+kn-YO z)H?p!uZ2fR7xr=YII)=aN0Txzj~Q2z%4OjLNY|XutbyR_`lWH~6v%0bMk z`>=6lY<#@^Q2pWX%)7qEuo;C?Q(3s)%!R^Oh4>x!S^fe%<4C&#YZU3DY=i#$=1ipZ z!rV;7;ITKSdv>8UTo=(+$a@Z?Y{&`M^)^p_IJhU$PESgA0IynqT0{6ri)Rha+rdhM zk=~9PIcLzeMe)o8mRng1%sGKebn2wHmGIb4se+ry&iI?g#Ixg|ENUSMjv~!2E21*7 zm4F=94*OWYaGkSQ01Rcce5UV80)YzSXR3Xte7vI1Lob!{*FBDQ>En*|sKHNNPgOk! z9W)q-M~}L!2N56l6c4$%+|@FLK`f@LZnKy@QV%AQT`9NlTgp&z**l3B|M011~|44f@20 zAJ$KzDKROr%dvwKH=YV&OeJ-&)a|kvdiSx=*go#t?VzG_#Ue`LT!pJjYPv|A|L@^- zQ=a10-s--DE7~>cTupMBoUSv`%jXs(#a2eso$uFbHiw}jkR$1id!Zznk3F&sHL=qP z&+YXaKxDdZDs|>I2*!}D#=PF@gWiIE8>XP6WRn>TT zaXw*rzi8RN1E~d{)={0st}-=DQPL*Z!6LHzSr0*+!^i*#cL5g z(lfUdw1(Z5T>Pn49AVY79%2yB*96Rp(GHGddfIzQP+G0Vy~5!6);WiQ(qM>e;$XkV zs>9#SU=A_2=ZW<@Qt3M8<`Bl#Bz@f5hkbwf^gLf0(&m%LKw}R6+MNT2F^)Zj$IERH zbk331^W{mw7weXp3B8!SO0&*6l~nI}yN1W%Xd#QQ*CZ>-R3KI~| z`sTLy6O(rnoAU!+QPRXoBg0pP*nDP>zi*9GMw(9h?-WR4Y!XvYpiJKkVtpE$$u0eM z=;1MGIOPMdc*Rt<&K3LR9_q)(1epz&K^8jffA2}`wWmAWA#}FED`b^b6lKR2sW}k_ z3r;lyFjN~^FdqN0qW9sqIQ{LPRh%^ehIUV)#otwP5*j3ug&=9n5Vf1 z8eELi+Q$WICdUI(BRzaaODND&O zoI>)N z#a7&SH93#QyEk<<{24T@4-u<-$}67v*GCH`qB>T?Q^bmu@7UAxJH+=ZGNNj90+a^u z(CX+m8;#kRyHhFM73P@FfkNaRc<< zp{%A34EXPTK?>)7t_0?BzP=7st=TE-=m*t`(8UzrAS7Z|u>65Dm2=(%jA!u>46&r+ z3FOR`hV0&B5P{sLSOS;Kz`LSwq*CQn8>u}`{79&4e?%?}3dwWdm+KTl=PJmAh(XA6 z^(SWQ@yaM>Z-gJK6#V(KD7;P56F%;_b1-grA7b%r?a%&t+sTez-5ql4As#6iRRB8h zv}>iAe+u3F-Wt(@I|lsN&k#F~7Ry_w%`V$cb03Vq$GN}@oA(q2jKUp#HB?YPs02Qh zk2vrJ1w$I$#zv6Btr#J!D(N`;XvG{-*eu?44iG z^3u*a)D?{XtfrVAVG4)5UOJF{5b`xr&UOKz$^6+ZQ$|68$W1VlJQB@$!+Jljt;++Q zt9F;P_o&@7(EI@5#k@jawcKvK<8l$~WWL@T@^OiJX$P*|xPD32Jh^sh0#f|O0Ycq( zmiHF=h;p1X|LtPtW=jJPeWYOEET}CUl$Fxv7b5bsY~w-@PW|NyR{hVa+7kEG@ZW46 zeWM}}C!{3Um_~CZGhaH;W6v`f*v)VF;}K>YghCC!Jf?%ZrQ6pi(9c^{1Yd+e6CMF% z0H!xVh6tEN>&?B3JyjSa)ze_T0=?|UQ2kk=NWry3aHK{7+Mcv`w*0y|hjQ{HD*Gm} z%5TD7cVM@?zPeftY4v>SXqPW96P1M(_!Mn5eF7;S*Tb;^yq424nw^`gY zEuAP3ymP2GK%z20dBt_~L##|qPpC+@-^A~C@FT?6S)Z)#r1i+ksf;DRD{p*~trW0( zrb9Mq@fS(Nda?Oz*>|pUo_5^?I$-lx$J1FhBfn1&31W5!%>ocupsy6d_%2O)PJ|Q$Ztg!EfGsKgCTcx<}>mb&O3EzSy?|g+e1>M>QY2Ak;Y9sA0cD;lf2IhT$J|1== zsax@4>^mE0o{&@|*5Ex&xXqk5jnt1*(5b(~epKu!GN>O2#_x&fp&i(oE>+f25z#T$ zF7updkE;RR+4=o-{5mq|*mwuX8B#|!{(FiliTV@p_#LnFc9D`UnGW^}5HiU?w=9&916kpeo@Iae^G>5e7hW=g;sytoFQxgp-5 z4|Im(j$hm6Lp>@s-F*6jckmnD8~##(uo8O*XlWxxX`nG`PhG|vX{ZW4q-z3;f+1+D zdY_fUt9)PxD7TyH!FVQ{EFOr4I>Wj)IQ;?^ z`uJGx+x46^)eW2LnJ5$WoyE7xY}U+{wuLHwk)O-RjoXg`asd<+RCCA&(@-ReobL_2 z*4DM_7i>xr=4UY+QqNOKdEdSxzx!9-9_mBRE5FV27XtqI=QZg5Pp+B#e(>ynzM+5> Zk@%IqntZ3@zI`G`G1R-I3)6NC|38(8PvHOn literal 0 HcmV?d00001 diff --git a/media/docs.css b/media/docs.css new file mode 100644 index 0000000..e986855 --- /dev/null +++ b/media/docs.css @@ -0,0 +1,24 @@ +.codeblock { + padding: 0.5em; + margin: .5em 0; + overflow: auto; + border-radius: 0.3em; + !background-color: #fdf6e3; +} + +body { + margin-right: 200px; +} + +a { + text-decoration: none; +} + +#map { + position: fixed; + top: 0; + right: 0; + width: 200px; + height: 100%; + z-index: 100; +} diff --git a/media/pagemap.js b/media/pagemap.js new file mode 100644 index 0000000..4c50d66 --- /dev/null +++ b/media/pagemap.js @@ -0,0 +1,349 @@ +/*! pagemap v1.4.0 - https://larsjung.de/pagemap/ */ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define("pagemap", [], factory); + else if(typeof exports === 'object') + exports["pagemap"] = factory(); + else + root["pagemap"] = factory(); +})((typeof self !== 'undefined' ? self : this), function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + +/* WEBPACK VAR INJECTION */(function(global) {module.exports = function (canvas, options) { + var WIN = global.window; + var DOC = WIN.document; + var DOC_EL = DOC.documentElement; + var BODY = DOC.querySelector('body'); + var CTX = canvas.getContext('2d'); + + var black = function black(pc) { + return "rgba(0,0,0,".concat(pc / 100, ")"); + }; + + var settings = Object.assign({ + viewport: null, + styles: { + 'header,footer,section,article': black(8), + 'h1,a': black(10), + 'h2,h3,h4': black(8) + }, + back: black(2), + view: black(5), + drag: black(10), + interval: null + }, options); + + var _listener = function _listener(el, method, types, fn) { + return types.split(/\s+/).forEach(function (type) { + return el[method](type, fn); + }); + }; + + var on = function on(el, types, fn) { + return _listener(el, 'addEventListener', types, fn, {passive: true}); + }; + + var off = function off(el, types, fn) { + return _listener(el, 'removeEventListener', types, fn); + }; + + var Rect = function Rect(x, y, w, h) { + return { + x: x, + y: y, + w: w, + h: h + }; + }; + + var rect_rel_to = function rect_rel_to(rect) { + var pos = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { + x: 0, + y: 0 + }; + return Rect(rect.x - pos.x, rect.y - pos.y, rect.w, rect.h); + }; + + var rect_of_doc = function rect_of_doc() { + return Rect(0, 0, DOC_EL.scrollWidth, DOC_EL.scrollHeight); + }; + + var rect_of_win = function rect_of_win() { + return Rect(WIN.pageXOffset, WIN.pageYOffset, DOC_EL.clientWidth, DOC_EL.clientHeight); + }; + + var el_get_offset = function el_get_offset(el) { + var br = el.getBoundingClientRect(); + return { + x: br.left + WIN.pageXOffset, + y: br.top + WIN.pageYOffset + }; + }; + + var rect_of_el = function rect_of_el(el) { + var _el_get_offset = el_get_offset(el), + x = _el_get_offset.x, + y = _el_get_offset.y; + + return Rect(x, y, el.offsetWidth, el.offsetHeight); + }; + + var rect_of_viewport = function rect_of_viewport(el) { + var _el_get_offset2 = el_get_offset(el), + x = _el_get_offset2.x, + y = _el_get_offset2.y; + + return Rect(x + el.clientLeft, y + el.clientTop, el.clientWidth, el.clientHeight); + }; + + var rect_of_content = function rect_of_content(el) { + var _el_get_offset3 = el_get_offset(el), + x = _el_get_offset3.x, + y = _el_get_offset3.y; + + return Rect(x + el.clientLeft - el.scrollLeft, y + el.clientTop - el.scrollTop, el.scrollWidth, el.scrollHeight); + }; + + var calc_scale = function () { + var width = canvas.clientWidth; + var height = canvas.clientHeight; + return function (w, h) { + return Math.min(width / w, height / h); + }; + }(); + + var resize_canvas = function resize_canvas(w, h) { + canvas.width = w; + canvas.height = h; + canvas.style.width = "".concat(w, "px"); + canvas.style.height = "".concat(h, "px"); + }; + + var viewport = settings.viewport; + + var find = function find(sel) { + return Array.from((viewport || DOC).querySelectorAll(sel)); + }; + + var drag = false; + var root_rect; + var view_rect; + var scale; + var drag_rx; + var drag_ry; + + var draw_rect = function draw_rect(rect, col) { + if (col) { + CTX.beginPath(); + CTX.rect(rect.x, rect.y, rect.w, rect.h); + CTX.fillStyle = col; + CTX.fill(); + } + }; + + var apply_styles = function apply_styles(styles) { + Object.keys(styles).forEach(function (sel) { + var col = styles[sel]; + find(sel).forEach(function (el) { + draw_rect(rect_rel_to(rect_of_el(el), root_rect), col); + }); + }); + }; + + var draw = function draw() { + root_rect = viewport ? rect_of_content(viewport) : rect_of_doc(); + view_rect = viewport ? rect_of_viewport(viewport) : rect_of_win(); + scale = calc_scale(root_rect.w, root_rect.h); + resize_canvas(root_rect.w * scale, root_rect.h * scale); + CTX.setTransform(1, 0, 0, 1, 0, 0); + CTX.clearRect(0, 0, canvas.width, canvas.height); + CTX.scale(scale, scale); + draw_rect(rect_rel_to(root_rect, root_rect), settings.back); + apply_styles(settings.styles); + draw_rect(rect_rel_to(view_rect, root_rect), drag ? settings.drag : settings.view); + }; + + var on_drag = function on_drag(ev) { + ev.preventDefault(); + var cr = rect_of_viewport(canvas); + var x = (ev.pageX - cr.x) / scale - view_rect.w * drag_rx; + var y = (ev.pageY - cr.y) / scale - view_rect.h * drag_ry; + + if (viewport) { + viewport.scrollLeft = x; + viewport.scrollTop = y; + } else { + WIN.scrollTo(x, y); + } + + draw(); + }; + + var on_drag_end = function on_drag_end(ev) { + drag = false; + canvas.style.cursor = 'pointer'; + BODY.style.cursor = 'auto'; + off(WIN, 'mousemove', on_drag); + off(WIN, 'mouseup', on_drag_end); + on_drag(ev); + }; + + var on_drag_start = function on_drag_start(ev) { + drag = true; + var cr = rect_of_viewport(canvas); + var vr = rect_rel_to(view_rect, root_rect); + drag_rx = ((ev.pageX - cr.x) / scale - vr.x) / vr.w; + drag_ry = ((ev.pageY - cr.y) / scale - vr.y) / vr.h; + + if (drag_rx < 0 || drag_rx > 1 || drag_ry < 0 || drag_ry > 1) { + drag_rx = 0.5; + drag_ry = 0.5; + } + + canvas.style.cursor = 'crosshair'; + BODY.style.cursor = 'crosshair'; + on(WIN, 'mousemove', on_drag); + on(WIN, 'mouseup', on_drag_end); + on_drag(ev); + }; + + var init = function init() { + canvas.style.cursor = 'pointer'; + on(canvas, 'mousedown', on_drag_start); + on(viewport || WIN, 'load resize scroll', draw); + + if (settings.interval > 0) { + setInterval(function () { + return draw(); + }, settings.interval); + } + + draw(); + }; + + init(); + return { + redraw: draw + }; +}; +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1))) + +/***/ }), +/* 1 */ +/***/ (function(module, exports) { + +var g; + +// This works in non-strict mode +g = (function() { + return this; +})(); + +try { + // This works if eval is allowed (see CSP) + g = g || new Function("return this")(); +} catch (e) { + // This works if the window reference is available + if (typeof window === "object") g = window; +} + +// g can still be undefined, but nothing to do about it... +// We return undefined, instead of nothing here, so it's +// easier to handle this case. if(!global) { ...} + +module.exports = g; + + +/***/ }) +/******/ ]); +}); diff --git a/media/prism.css b/media/prism.css new file mode 100644 index 0000000..79b8a14 --- /dev/null +++ b/media/prism.css @@ -0,0 +1,128 @@ +code[class*="language-"], +pre[class*="language-"] { + color: #657b83; + /* base00 */ + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"]::-moz-selection, +pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, +code[class*="language-"] ::-moz-selection { + background: #073642; + /* base02 */ +} + +pre[class*="language-"]::selection, +pre[class*="language-"] ::selection, +code[class*="language-"]::selection, +code[class*="language-"] ::selection { + background: #073642; + /* base02 */ +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; + border-radius: 0.3em; +} + +:not(pre)>code[class*="language-"], +pre[class*="language-"] { + background-color: #fdf6e3; +} + +/* Inline code */ +:not(pre)>code[class*="language-"] { + padding: .1em; + border-radius: .3em; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: #6A9955; +} + +.token.punctuation { + color: #586e75; +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #569cd6; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.url, +.token.inserted { + color: #ce9178; +} + +.token.entity { + color: #657b83; + background: #eee8d5; +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #859900; +} + +.token.function, +.token.class-name { + color: #4EC9B0; +} + +.token.regex, +.token.important, +.token.variable { + color: #cb4b16; +} + +.token.important, +.token.bold { + font-weight: bold; +} + +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} diff --git a/package-lock.json b/package-lock.json index 8467178..4ec3888 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "godot-tools", - "version": "1.3.1", + "version": "2.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "godot-tools", - "version": "1.3.1", + "version": "2.0.0", "license": "MIT", "dependencies": { "@vscode/debugadapter": "^1.64.0", @@ -18,11 +18,14 @@ "prismjs": "^1.17.1", "terminate": "^2.5.0", "vscode-languageclient": "^7.0.0", - "ws": "^8.13.0" + "vscode-oniguruma": "^2.0.1", + "vscode-textmate": "^9.0.0", + "ws": "^8.13.0", + "ya-bbcode": "^4.0.0" }, "devDependencies": { "@types/marked": "^4.0.8", - "@types/mocha": "^9.1.0", + "@types/mocha": "^10.0.6", "@types/node": "^18.15.0", "@types/prismjs": "^1.16.8", "@types/vscode": "^1.80.0", @@ -30,9 +33,12 @@ "@typescript-eslint/eslint-plugin": "^5.57.1", "@typescript-eslint/eslint-plugin-tslint": "^5.57.1", "@typescript-eslint/parser": "^5.57.1", + "@vscode/test-cli": "^0.0.4", + "@vscode/test-electron": "^2.3.8", "@vscode/vsce": "^2.21.0", "esbuild": "^0.17.15", "eslint": "^8.37.0", + "mocha": "^10.2.0", "ts-node": "^10.9.1", "tsconfig-paths": "^4.2.0", "tslint": "^5.20.1", @@ -560,6 +566,102 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", @@ -620,6 +722,25 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", @@ -657,9 +778,9 @@ "dev": true }, "node_modules/@types/mocha": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.0.tgz", - "integrity": "sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg==", + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.6.tgz", + "integrity": "sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==", "dev": true }, "node_modules/@types/node": { @@ -1006,6 +1127,197 @@ "resolved": "https://registry.npmjs.org/@vscode/debugprotocol/-/debugprotocol-1.64.0.tgz", "integrity": "sha512-Zhf3KvB+J04M4HPE2yCvEILGVtPixXUQMLBvx4QcAtjhc5lnwlZbbt80LCsZO2B+2BH8RMgVXk3QQ5DEzEne2Q==" }, + "node_modules/@vscode/test-cli": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@vscode/test-cli/-/test-cli-0.0.4.tgz", + "integrity": "sha512-Tx0tfbxeSb2Xlo+jpd+GJrNLgKQHobhRHrYvOipZRZQYWZ82sKiK02VY09UjU1Czc/YnZnqyAnjUfaVGl3h09w==", + "dev": true, + "dependencies": { + "@types/mocha": "^10.0.2", + "chokidar": "^3.5.3", + "glob": "^10.3.10", + "minimatch": "^9.0.3", + "mocha": "^10.2.0", + "supports-color": "^9.4.0", + "yargs": "^17.7.2" + }, + "bin": { + "vscode-test": "out/bin.mjs" + } + }, + "node_modules/@vscode/test-cli/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@vscode/test-cli/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@vscode/test-cli/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@vscode/test-cli/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vscode/test-cli/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@vscode/test-cli/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vscode/test-cli/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@vscode/test-cli/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@vscode/test-cli/node_modules/supports-color": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", + "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@vscode/test-cli/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@vscode/test-cli/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@vscode/test-electron": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.8.tgz", + "integrity": "sha512-b4aZZsBKtMGdDljAsOPObnAi7+VWIaYl3ylCz1jTs+oV6BZ4TNHcVNC3xUn0azPeszBmwSBDQYfFESIaUQnrOg==", + "dev": true, + "dependencies": { + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "jszip": "^3.10.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@vscode/test-electron/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@vscode/vsce": { "version": "2.21.1", "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.21.1.tgz", @@ -1110,6 +1422,18 @@ "node": ">=0.4.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1126,6 +1450,15 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -1148,6 +1481,19 @@ "node": ">=4" } }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -1231,6 +1577,15 @@ ], "optional": true }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -1285,6 +1640,12 @@ "node": ">=8" } }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -1350,6 +1711,18 @@ "node": ">=6" } }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -1407,6 +1780,45 @@ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", @@ -1414,6 +1826,61 @@ "dev": true, "optional": true }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -1461,8 +1928,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true, - "optional": true + "dev": true }, "node_modules/create-require": { "version": "1.1.1", @@ -1529,6 +1995,18 @@ } } }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/decompress-response": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", @@ -1676,6 +2154,18 @@ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -1732,6 +2222,15 @@ "@esbuild/win32-x64": "0.17.19" } }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -2184,6 +2683,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, "node_modules/flat-cache": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", @@ -2204,6 +2712,34 @@ "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/from": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", @@ -2222,6 +2758,20 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -2245,6 +2795,15 @@ "wide-align": "^1.1.0" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", @@ -2267,9 +2826,9 @@ "optional": true }, "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -2388,6 +2947,15 @@ "dev": true, "optional": true }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, "node_modules/hosted-git-info": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", @@ -2419,6 +2987,33 @@ "entities": "^2.0.0" } }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -2449,6 +3044,12 @@ "node": ">= 4" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -2497,6 +3098,18 @@ "dev": true, "optional": true }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2549,12 +3162,32 @@ "node": ">=8" } }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true + "dev": true }, "node_modules/isexe": { "version": "2.0.0", @@ -2562,6 +3195,24 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2617,6 +3268,18 @@ "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, "node_modules/keytar": { "version": "7.7.0", "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.7.0.tgz", @@ -2660,6 +3323,15 @@ "node": ">= 0.8.0" } }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/linkify-it": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", @@ -2690,6 +3362,92 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -2832,6 +3590,15 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", @@ -2851,6 +3618,148 @@ "dev": true, "optional": true }, + "node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "dev": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mocha/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -2863,6 +3772,18 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "node_modules/nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/napi-build-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", @@ -2904,6 +3825,15 @@ "dev": true, "optional": true }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", @@ -3014,6 +3944,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -3083,6 +4019,31 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -3175,8 +4136,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "optional": true + "dev": true }, "node_modules/ps-tree": { "version": "1.2.0", @@ -3247,6 +4207,15 @@ } ] }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -3280,7 +4249,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, - "optional": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -3291,6 +4259,27 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", @@ -3364,8 +4353,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true + "dev": true }, "node_modules/sax": { "version": "1.2.4", @@ -3382,6 +4370,15 @@ "semver": "bin/semver" } }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -3389,6 +4386,12 @@ "dev": true, "optional": true }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -3503,7 +4506,6 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "optional": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -3523,6 +4525,51 @@ "node": ">=0.10.0" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -3536,6 +4583,28 @@ "node": ">=0.10.0" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -3864,8 +4933,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true + "dev": true }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", @@ -3922,6 +4990,16 @@ "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==" }, + "node_modules/vscode-oniguruma": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-2.0.1.tgz", + "integrity": "sha512-poJU8iHIWnC3vgphJnrLZyI3YdqRlR27xzqDmpPXYzA93R4Gk8z7T6oqDzDoHjoikA2aS82crdXFkjELCdJsjQ==" + }, + "node_modules/vscode-textmate": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-9.0.0.tgz", + "integrity": "sha512-Cl65diFGxz7gpwbav10HqiY/eVYTO1sjQpmRmV991Bj7wAoOAjGQ97PpQcXorDE2Uc4hnGWLY17xme+5t6MlSg==" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3947,6 +5025,201 @@ "string-width": "^1.0.2 || 2 || 3 || 4" } }, + "node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -3982,11 +5255,115 @@ "node": ">=4.0" } }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ya-bbcode": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ya-bbcode/-/ya-bbcode-4.0.0.tgz", + "integrity": "sha512-J1mMD5a/H3rXjdZPEHdgr2DsfBb6G+KkSb2kebyP6SZqclWxVKngp+o+S55aRPLWOivHmUbvJOYdDEx125Ulag==", + "engines": { + "node": ">=16", + "npm": ">=8" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", diff --git a/package.json b/package.json index 1d1dd77..640e41c 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "godot-tools", "displayName": "godot-tools", "icon": "icon.png", - "version": "1.3.1", + "version": "2.0.0", "description": "Tools for game development with Godot Engine and GDScript", "repository": { "type": "git", @@ -22,6 +22,7 @@ "Linters", "Snippets", "Debuggers", + "Formatters", "Other" ], "activationEvents": [ @@ -38,9 +39,21 @@ "esbuild-base": "esbuild ./src/extension.ts --bundle --outfile=out/extension.js --external:vscode --format=cjs --platform=node", "esbuild": "npm run esbuild-base -- --sourcemap", "esbuild-watch": "npm run esbuild-base -- --sourcemap --watch", - "generate-icons": "ts-node tools/generate_icons.ts" + "generate-icons": "ts-node tools/generate_icons.ts", + "test": "vscode-test" }, "contributes": { + "customEditors": [ + { + "viewType": "gddoc", + "displayName": "Godot Documentation", + "selector": [ + { + "filenamePattern": "*.gddoc" + } + ] + } + ], "commands": [ { "category": "Godot Tools", @@ -59,21 +72,16 @@ }, { "category": "Godot Tools", - "command": "godotTools.listNativeClasses", - "title": "List native classes of godot" - }, - { - "category": "Godot Tools", - "command": "godotTools.openTypeDocumentation", - "title": "Open Type Documentation" + "command": "godotTools.listGodotClasses", + "title": "List Godot classes" }, { "category": "Godot Tools", "command": "godotTools.debugger.inspectNode", "title": "Inspect Remote Node", "icon": { - "light": "resources/light/icon_GUI_visibility_visible.svg", - "dark": "resources/dark/icon_GUI_visibility_visible.svg" + "light": "resources/godot_icons/light/GuiVisibilityVisible.svg", + "dark": "resources/godot_icons/dark/GuiVisibilityVisible.svg" } }, { @@ -81,8 +89,8 @@ "command": "godotTools.debugger.refreshSceneTree", "title": "Refresh", "icon": { - "light": "resources/light/icon_refresh.svg", - "dark": "resources/dark/icon_refresh.svg" + "light": "resources/godot_icons/light/Reload.svg", + "dark": "resources/godot_icons/dark/Reload.svg" } }, { @@ -90,8 +98,8 @@ "command": "godotTools.debugger.refreshInspector", "title": "Refresh", "icon": { - "light": "resources/light/icon_refresh.svg", - "dark": "resources/dark/icon_refresh.svg" + "light": "resources/godot_icons/light/Reload.svg", + "dark": "resources/godot_icons/dark/Reload.svg" } }, { @@ -99,21 +107,27 @@ "command": "godotTools.debugger.editValue", "title": "Edit value", "icon": { - "light": "resources/light/icon_edit.svg", - "dark": "resources/dark/icon_edit.svg" + "light": "resources/godot_icons/light/Edit.svg", + "dark": "resources/godot_icons/dark/Edit.svg" } }, { "category": "Godot Tools", "command": "godotTools.debugger.debugCurrentFile", "title": "Debug Current File", - "icon": "$(play)" + "icon": { + "light": "resources/godot_icons/light/PlayScene.svg", + "dark": "resources/godot_icons/dark/PlayScene.svg" + } }, { "category": "Godot Tools", "command": "godotTools.debugger.debugPinnedFile", "title": "Debug Pinned File", - "icon": "$(play)" + "icon": { + "light": "resources/godot_icons/light/Play.svg", + "dark": "resources/godot_icons/dark/Play.svg" + } }, { "category": "Godot Tools", @@ -154,6 +168,11 @@ "command": "godotTools.scenePreview.goToDefinition", "title": "Go to Definition" }, + { + "category": "Godot Tools", + "command": "godotTools.scenePreview.openDocumentation", + "title": "Open Documentation" + }, { "category": "Godot Tools", "command": "godotTools.scenePreview.copyNodePath", @@ -167,12 +186,20 @@ { "category": "Godot Tools", "command": "godotTools.scenePreview.openScene", - "title": "Open Scene" + "title": "Open Scene", + "icon": { + "light": "resources/InstanceOptions.svg", + "dark": "resources/InstanceOptions.svg" + } }, { "category": "Godot Tools", "command": "godotTools.scenePreview.openScript", - "title": "Open Script" + "title": "Open Script", + "icon": { + "light": "resources/godot_icons/light/Script.svg", + "dark": "resources/godot_icons/dark/Script.svg" + } }, { "category": "Godot Tools", @@ -189,7 +216,7 @@ { "command": "godotTools.switchSceneScript", "key": "alt+o", - "when": "editorLangId == 'gdscript' && editorTextFocus || editorLangId == 'gdresource' && editorTextFocus" + "when": "editorLangId in godotTools.context.godotFiles && editorTextFocus" } ], "configuration": { @@ -251,28 +278,6 @@ "default": 10, "description": "How many times the client will attempt to reconnect" }, - "godotTools.debugger.forceVisibleCollisionShapes": { - "type": "boolean", - "default": false, - "description": "Force the project to run with visible collision shapes" - }, - "godotTools.debugger.forceVisibleNavMesh": { - "type": "boolean", - "default": false, - "description": "Force the project to run with visible navigation meshes" - }, - "godotTools.documentation.newTabPlacement": { - "enum": [ - "active", - "beside" - ], - "enumDescriptions": [ - "Place new documentation views in the active tabs group", - "Place new documentation views beside the active tabs group" - ], - "default": "beside", - "description": "Where to place new documentation views" - }, "godotTools.scenePreview.previewRelatedScenes": { "enum": [ "anyFolder", @@ -299,7 +304,7 @@ "extensions": [ ".gd" ], - "configuration": "./configurations/gdscript-configuration.json" + "configuration": "./configurations/gdscript.language-configuration.json" }, { "id": "gdscene", @@ -310,7 +315,7 @@ "extensions": [ "tscn" ], - "configuration": "./configurations/gdresource-configuration.json" + "configuration": "./configurations/gdresource.language-configuration.json" }, { "id": "gdresource", @@ -325,7 +330,7 @@ "gdns", "gdnlib" ], - "configuration": "./configurations/gdresource-configuration.json" + "configuration": "./configurations/gdresource.language-configuration.json" }, { "id": "gdshader", @@ -333,9 +338,10 @@ "gdshader" ], "extensions": [ - ".gdshader" + ".gdshader", + ".gdshaderinc" ], - "configuration": "./configurations/gdshader-configuration.json" + "configuration": "./configurations/gdshader.language-configuration.json" } ], "grammars": [ @@ -349,12 +355,26 @@ "scopeName": "source.gdresource", "path": "./syntaxes/GDResource.tmLanguage.json" }, + { + "language": "gdscene", + "scopeName": "source.gdresource", + "path": "./syntaxes/GDResource.tmLanguage.json" + }, { "language": "gdshader", "scopeName": "source.gdshader", "path": "./syntaxes/GDShader.tmLanguage.json" } ], + "semanticTokenScopes": [ + { + "scopes": { + "nodePath": [ + "constant.character.escape" + ] + } + } + ], "snippets": [ { "language": "gdscript", @@ -402,7 +422,60 @@ }, "editor_path": { "type": "string", - "description": "Absolute path to the Godot executable to be used for this debug profile." + "description": "Absolute path to the Godot executable to be used for this debug profile.", + "default": false + }, + "profiling": { + "type": "boolean", + "description": "Enable profiling in the script debugger.", + "default": false + }, + "single_threaded_scene": { + "type": "boolean", + "description": "Scene tree runs in single-threaded mode. Sub-thread groups are disabled and run on the main thread. (Godot 4 only)", + "default": false + }, + "debug_collisions": { + "type": "boolean", + "description": "Show collision shapes when running the scene.", + "default": false + }, + "debug_paths": { + "type": "boolean", + "description": "Show navigation polygons when running the scene. (Godot 4 only)", + "default": false + }, + "debug_navigation": { + "type": "boolean", + "description": "Show navigation polygons when running the scene.", + "default": false + }, + "debug_avoidance": { + "type": "boolean", + "description": "Show navigation avoidance debug visuals when running the scene. (Godot 4 only)", + "default": false + }, + "debug_stringnames": { + "type": "boolean", + "description": "Print all StringName allocations to stdout when the engine quits. (Godot 4 only)", + "default": false + }, + "frame_delay": { + "type": "number", + "description": "Simulate high CPU load (delay each frame by milliseconds)." + }, + "time_scale": { + "type": "number", + "description": "Force time scale (higher values are faster, 1.0 is normal speed)." + }, + "disable_vsync": { + "type": "boolean", + "description": "Forces disabling of vertical synchronization, even if enabled in the project settings. Does not override driver-level V-Sync enforcement. (Godot 4 only)", + "default": false + }, + "fixed_fps": { + "type": "number", + "description": "Force a fixed number of frames per second. This setting disables real-time synchronization." }, "additional_options": { "type": "string", @@ -429,28 +502,34 @@ }, "initialConfigurations": [ { - "name": "GDScript: Launch Godot", + "name": "GDScript: Launch Project", "type": "godot", "request": "launch", "project": "${workspaceFolder}", + "debug_collisions": false, + "debug_paths": false, + "debug_navigation": false, "additional_options": "" } ], "configurationSnippets": [ { - "label": "GDScript Godot Debug: Launch", - "description": "A new configuration for debugging a Godot project.", + "label": "GDScript: Launch Project", + "description": "A config to launch the current project.", "body": { "name": "GDScript: Launch Project", "type": "godot", "request": "launch", "project": "${workspaceFolder}", + "debug_collisions": false, + "debug_paths": false, + "debug_navigation": false, "additional_options": "" } }, { "label": "GDScript: Launch Current File", - "description": "A new configuration for debugging a Godot project.", + "description": "A config to launch the currently open scene.", "body": { "name": "GDScript: Launch Current File", "type": "godot", @@ -462,7 +541,7 @@ }, { "label": "GDScript: Launch Pinned File", - "description": "A new configuration for debugging a Godot project.", + "description": "A config to launch the currently pinned scene.", "body": { "name": "GDScript: Launch Pinned File", "type": "godot", @@ -471,17 +550,6 @@ "project": "${workspaceFolder}", "additional_options": "" } - }, - { - "label": "GDScript Godot Debug: Attach", - "description": "A new configuration for debugging a Godot project.", - "body": { - "name": "GDScript: Attach to Godot", - "type": "godot", - "request": "attach", - "address": "127.0.0.1", - "port": 6007 - } } ] } @@ -534,6 +602,10 @@ ], "menus": { "commandPalette": [ + { + "command": "godotTools.listGodotClasses", + "when": "godotTools.context.connectedToLSP" + }, { "command": "godotTools.scenePreview.refresh", "when": "false" @@ -542,6 +614,10 @@ "command": "godotTools.scenePreview.goToDefinition", "when": "false" }, + { + "command": "godotTools.scenePreview.openDocumentation", + "when": "false" + }, { "command": "godotTools.scenePreview.pin", "when": "false" @@ -626,6 +702,11 @@ "when": "view == scenePreview", "group": "1@1" }, + { + "command": "godotTools.scenePreview.openDocumentation", + "when": "view == scenePreview", + "group": "1@1" + }, { "command": "godotTools.scenePreview.copyNodePath", "when": "view == scenePreview" @@ -643,6 +724,16 @@ "command": "godotTools.scenePreview.openScript", "when": "view == scenePreview && viewItem =~ /hasScript/", "group": "1@2" + }, + { + "command": "godotTools.scenePreview.openScene", + "when": "view == scenePreview && viewItem =~ /openable/", + "group": "inline" + }, + { + "command": "godotTools.scenePreview.openScript", + "when": "view == scenePreview && viewItem =~ /hasScript/", + "group": "inline" } ], "explorer/context": [ @@ -702,14 +793,9 @@ } ], "editor/context": [ - { - "command": "godotTools.openTypeDocumentation", - "when": "godotTools.context.connectedToLSP && godotTools.context.typeFound", - "group": "navigation@9" - }, { "command": "godotTools.switchSceneScript", - "when": "editorLangId in godotTools.context.sceneLikeFiles", + "when": "editorLangId in godotTools.context.godotFiles", "group": "custom1@1" } ] @@ -717,7 +803,7 @@ }, "devDependencies": { "@types/marked": "^4.0.8", - "@types/mocha": "^9.1.0", + "@types/mocha": "^10.0.6", "@types/node": "^18.15.0", "@types/prismjs": "^1.16.8", "@types/vscode": "^1.80.0", @@ -725,9 +811,12 @@ "@typescript-eslint/eslint-plugin": "^5.57.1", "@typescript-eslint/eslint-plugin-tslint": "^5.57.1", "@typescript-eslint/parser": "^5.57.1", + "@vscode/test-cli": "^0.0.4", + "@vscode/test-electron": "^2.3.8", "@vscode/vsce": "^2.21.0", "esbuild": "^0.17.15", "eslint": "^8.37.0", + "mocha": "^10.2.0", "ts-node": "^10.9.1", "tsconfig-paths": "^4.2.0", "tslint": "^5.20.1", @@ -743,6 +832,9 @@ "prismjs": "^1.17.1", "terminate": "^2.5.0", "vscode-languageclient": "^7.0.0", - "ws": "^8.13.0" + "vscode-oniguruma": "^2.0.1", + "vscode-textmate": "^9.0.0", + "ws": "^8.13.0", + "ya-bbcode": "^4.0.0" } } diff --git a/resources/dark/icon_GUI_visibility_visible.svg b/resources/dark/icon_GUI_visibility_visible.svg deleted file mode 100644 index e203119..0000000 --- a/resources/dark/icon_GUI_visibility_visible.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_a_r_v_r_anchor.svg b/resources/dark/icon_a_r_v_r_anchor.svg deleted file mode 100644 index 5bb7c53..0000000 --- a/resources/dark/icon_a_r_v_r_anchor.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_a_r_v_r_camera.svg b/resources/dark/icon_a_r_v_r_camera.svg deleted file mode 100644 index 123f277..0000000 --- a/resources/dark/icon_a_r_v_r_camera.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_a_r_v_r_controller.svg b/resources/dark/icon_a_r_v_r_controller.svg deleted file mode 100644 index 60487e3..0000000 --- a/resources/dark/icon_a_r_v_r_controller.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_a_r_v_r_origin.svg b/resources/dark/icon_a_r_v_r_origin.svg deleted file mode 100644 index 558fe79..0000000 --- a/resources/dark/icon_a_r_v_r_origin.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_accept_dialog.svg b/resources/dark/icon_accept_dialog.svg deleted file mode 100644 index bed006d..0000000 --- a/resources/dark/icon_accept_dialog.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_animated_sprite.svg b/resources/dark/icon_animated_sprite.svg deleted file mode 100644 index 044168b..0000000 --- a/resources/dark/icon_animated_sprite.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/resources/dark/icon_animated_sprite_3d.svg b/resources/dark/icon_animated_sprite_3d.svg deleted file mode 100644 index 69546be..0000000 --- a/resources/dark/icon_animated_sprite_3d.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/resources/dark/icon_animation_player.svg b/resources/dark/icon_animation_player.svg deleted file mode 100644 index a68af49..0000000 --- a/resources/dark/icon_animation_player.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_animation_tree.svg b/resources/dark/icon_animation_tree.svg deleted file mode 100644 index 75ae516..0000000 --- a/resources/dark/icon_animation_tree.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_animation_tree_player.svg b/resources/dark/icon_animation_tree_player.svg deleted file mode 100644 index 75ae516..0000000 --- a/resources/dark/icon_animation_tree_player.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_area.svg b/resources/dark/icon_area.svg deleted file mode 100644 index 1ab7106..0000000 --- a/resources/dark/icon_area.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_area_2d.svg b/resources/dark/icon_area_2d.svg deleted file mode 100644 index 6ccd61e..0000000 --- a/resources/dark/icon_area_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_audio_stream_player.svg b/resources/dark/icon_audio_stream_player.svg deleted file mode 100644 index 21e95af..0000000 --- a/resources/dark/icon_audio_stream_player.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/resources/dark/icon_audio_stream_player_2_d.svg b/resources/dark/icon_audio_stream_player_2_d.svg deleted file mode 100644 index 75b5241..0000000 --- a/resources/dark/icon_audio_stream_player_2_d.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/resources/dark/icon_audio_stream_player_3_d.svg b/resources/dark/icon_audio_stream_player_3_d.svg deleted file mode 100644 index 85217f6..0000000 --- a/resources/dark/icon_audio_stream_player_3_d.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/resources/dark/icon_back_buffer_copy.svg b/resources/dark/icon_back_buffer_copy.svg deleted file mode 100644 index c7abc53..0000000 --- a/resources/dark/icon_back_buffer_copy.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_baked_lightmap.svg b/resources/dark/icon_baked_lightmap.svg deleted file mode 100644 index b540a60..0000000 --- a/resources/dark/icon_baked_lightmap.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_bone_2_d.svg b/resources/dark/icon_bone_2_d.svg deleted file mode 100644 index 5585202..0000000 --- a/resources/dark/icon_bone_2_d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_bone_attachment.svg b/resources/dark/icon_bone_attachment.svg deleted file mode 100644 index 54c0a30..0000000 --- a/resources/dark/icon_bone_attachment.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_button.svg b/resources/dark/icon_button.svg deleted file mode 100644 index 37e627a..0000000 --- a/resources/dark/icon_button.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_c_p_u_particles.svg b/resources/dark/icon_c_p_u_particles.svg deleted file mode 100644 index 01634eb..0000000 --- a/resources/dark/icon_c_p_u_particles.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_c_p_u_particles_2_d.svg b/resources/dark/icon_c_p_u_particles_2_d.svg deleted file mode 100644 index 261659a..0000000 --- a/resources/dark/icon_c_p_u_particles_2_d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_camera.svg b/resources/dark/icon_camera.svg deleted file mode 100644 index 42dcab8..0000000 --- a/resources/dark/icon_camera.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_camera_2d.svg b/resources/dark/icon_camera_2d.svg deleted file mode 100644 index b12126e..0000000 --- a/resources/dark/icon_camera_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_canvas_layer.svg b/resources/dark/icon_canvas_layer.svg deleted file mode 100644 index 8bd2541..0000000 --- a/resources/dark/icon_canvas_layer.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_canvas_modulate.svg b/resources/dark/icon_canvas_modulate.svg deleted file mode 100644 index 93e21ab..0000000 --- a/resources/dark/icon_canvas_modulate.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/resources/dark/icon_center_container.svg b/resources/dark/icon_center_container.svg deleted file mode 100644 index 2159a20..0000000 --- a/resources/dark/icon_center_container.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_check_box.svg b/resources/dark/icon_check_box.svg deleted file mode 100644 index aa63e1a..0000000 --- a/resources/dark/icon_check_box.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_check_button.svg b/resources/dark/icon_check_button.svg deleted file mode 100644 index 0b60838..0000000 --- a/resources/dark/icon_check_button.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_clipped_camera.svg b/resources/dark/icon_clipped_camera.svg deleted file mode 100644 index 0e31510..0000000 --- a/resources/dark/icon_clipped_camera.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_collision_polygon.svg b/resources/dark/icon_collision_polygon.svg deleted file mode 100644 index 8b4b415..0000000 --- a/resources/dark/icon_collision_polygon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_collision_polygon_2d.svg b/resources/dark/icon_collision_polygon_2d.svg deleted file mode 100644 index e435366..0000000 --- a/resources/dark/icon_collision_polygon_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_collision_shape.svg b/resources/dark/icon_collision_shape.svg deleted file mode 100644 index 1ab14b1..0000000 --- a/resources/dark/icon_collision_shape.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_collision_shape_2d.svg b/resources/dark/icon_collision_shape_2d.svg deleted file mode 100644 index 71ab11b..0000000 --- a/resources/dark/icon_collision_shape_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_color_picker.svg b/resources/dark/icon_color_picker.svg deleted file mode 100644 index 2f08260..0000000 --- a/resources/dark/icon_color_picker.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_color_picker_button.svg b/resources/dark/icon_color_picker_button.svg deleted file mode 100644 index 4eb3f9a..0000000 --- a/resources/dark/icon_color_picker_button.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_color_rect.svg b/resources/dark/icon_color_rect.svg deleted file mode 100644 index 542361f..0000000 --- a/resources/dark/icon_color_rect.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/resources/dark/icon_cone_twist_joint.svg b/resources/dark/icon_cone_twist_joint.svg deleted file mode 100644 index 2941436..0000000 --- a/resources/dark/icon_cone_twist_joint.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_confirmation_dialog.svg b/resources/dark/icon_confirmation_dialog.svg deleted file mode 100644 index 86ce894..0000000 --- a/resources/dark/icon_confirmation_dialog.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_container.svg b/resources/dark/icon_container.svg deleted file mode 100644 index 345cb19..0000000 --- a/resources/dark/icon_container.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_control.svg b/resources/dark/icon_control.svg deleted file mode 100644 index f767760..0000000 --- a/resources/dark/icon_control.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_damped_spring_joint_2d.svg b/resources/dark/icon_damped_spring_joint_2d.svg deleted file mode 100644 index 32163c5..0000000 --- a/resources/dark/icon_damped_spring_joint_2d.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/resources/dark/icon_directional_light.svg b/resources/dark/icon_directional_light.svg deleted file mode 100644 index f55d8b9..0000000 --- a/resources/dark/icon_directional_light.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_file_dialog.svg b/resources/dark/icon_file_dialog.svg deleted file mode 100644 index 1bfb86f..0000000 --- a/resources/dark/icon_file_dialog.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_g_i_probe.svg b/resources/dark/icon_g_i_probe.svg deleted file mode 100644 index 8cbef11..0000000 --- a/resources/dark/icon_g_i_probe.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_generic_6_d_o_f_joint.svg b/resources/dark/icon_generic_6_d_o_f_joint.svg deleted file mode 100644 index 234f8c4..0000000 --- a/resources/dark/icon_generic_6_d_o_f_joint.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_graph_edit.svg b/resources/dark/icon_graph_edit.svg deleted file mode 100644 index 9962d51..0000000 --- a/resources/dark/icon_graph_edit.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/resources/dark/icon_graph_node.svg b/resources/dark/icon_graph_node.svg deleted file mode 100644 index 7b803bc..0000000 --- a/resources/dark/icon_graph_node.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/resources/dark/icon_grid_container.svg b/resources/dark/icon_grid_container.svg deleted file mode 100644 index f891f59..0000000 --- a/resources/dark/icon_grid_container.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_groove_joint_2d.svg b/resources/dark/icon_groove_joint_2d.svg deleted file mode 100644 index cb34d30..0000000 --- a/resources/dark/icon_groove_joint_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_h_box_container.svg b/resources/dark/icon_h_box_container.svg deleted file mode 100644 index 32e6a1f..0000000 --- a/resources/dark/icon_h_box_container.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_h_scroll_bar.svg b/resources/dark/icon_h_scroll_bar.svg deleted file mode 100644 index fda3ce9..0000000 --- a/resources/dark/icon_h_scroll_bar.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_h_separator.svg b/resources/dark/icon_h_separator.svg deleted file mode 100644 index 19a7769..0000000 --- a/resources/dark/icon_h_separator.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_h_slider.svg b/resources/dark/icon_h_slider.svg deleted file mode 100644 index cda1d01..0000000 --- a/resources/dark/icon_h_slider.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_h_split_container.svg b/resources/dark/icon_h_split_container.svg deleted file mode 100644 index 705cc0b..0000000 --- a/resources/dark/icon_h_split_container.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_h_t_t_p_request.svg b/resources/dark/icon_h_t_t_p_request.svg deleted file mode 100644 index f291bd4..0000000 --- a/resources/dark/icon_h_t_t_p_request.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_hinge_joint.svg b/resources/dark/icon_hinge_joint.svg deleted file mode 100644 index 053d0b7..0000000 --- a/resources/dark/icon_hinge_joint.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_immediate_geometry.svg b/resources/dark/icon_immediate_geometry.svg deleted file mode 100644 index ce11351..0000000 --- a/resources/dark/icon_immediate_geometry.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_interpolated_camera.svg b/resources/dark/icon_interpolated_camera.svg deleted file mode 100644 index 7d254e1..0000000 --- a/resources/dark/icon_interpolated_camera.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_item_list.svg b/resources/dark/icon_item_list.svg deleted file mode 100644 index 7a21d17..0000000 --- a/resources/dark/icon_item_list.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_kinematic_body.svg b/resources/dark/icon_kinematic_body.svg deleted file mode 100644 index d6f9eed..0000000 --- a/resources/dark/icon_kinematic_body.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_kinematic_body_2d.svg b/resources/dark/icon_kinematic_body_2d.svg deleted file mode 100644 index b4058cd..0000000 --- a/resources/dark/icon_kinematic_body_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_label.svg b/resources/dark/icon_label.svg deleted file mode 100644 index d8b2d82..0000000 --- a/resources/dark/icon_label.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_light_2d.svg b/resources/dark/icon_light_2d.svg deleted file mode 100644 index 2b92eee..0000000 --- a/resources/dark/icon_light_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_light_occluder_2d.svg b/resources/dark/icon_light_occluder_2d.svg deleted file mode 100644 index c4e838f..0000000 --- a/resources/dark/icon_light_occluder_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_line_2d.svg b/resources/dark/icon_line_2d.svg deleted file mode 100644 index 15a21f5..0000000 --- a/resources/dark/icon_line_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_line_edit.svg b/resources/dark/icon_line_edit.svg deleted file mode 100644 index 32a8794..0000000 --- a/resources/dark/icon_line_edit.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_link_button.svg b/resources/dark/icon_link_button.svg deleted file mode 100644 index b3bba30..0000000 --- a/resources/dark/icon_link_button.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_listener.svg b/resources/dark/icon_listener.svg deleted file mode 100644 index 98c7069..0000000 --- a/resources/dark/icon_listener.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_margin_container.svg b/resources/dark/icon_margin_container.svg deleted file mode 100644 index 183b2bd..0000000 --- a/resources/dark/icon_margin_container.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/resources/dark/icon_menu_button.svg b/resources/dark/icon_menu_button.svg deleted file mode 100644 index c1cac77..0000000 --- a/resources/dark/icon_menu_button.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_mesh_instance.svg b/resources/dark/icon_mesh_instance.svg deleted file mode 100644 index 2ed890f..0000000 --- a/resources/dark/icon_mesh_instance.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_mesh_instance_2d.svg b/resources/dark/icon_mesh_instance_2d.svg deleted file mode 100644 index 3199be2..0000000 --- a/resources/dark/icon_mesh_instance_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_multi_mesh_instance.svg b/resources/dark/icon_multi_mesh_instance.svg deleted file mode 100644 index 78aabcc..0000000 --- a/resources/dark/icon_multi_mesh_instance.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_multi_mesh_instance_2d.svg b/resources/dark/icon_multi_mesh_instance_2d.svg deleted file mode 100644 index cc57849..0000000 --- a/resources/dark/icon_multi_mesh_instance_2d.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/resources/dark/icon_navigation.svg b/resources/dark/icon_navigation.svg deleted file mode 100644 index d10b990..0000000 --- a/resources/dark/icon_navigation.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_navigation_2d.svg b/resources/dark/icon_navigation_2d.svg deleted file mode 100644 index c5c8382..0000000 --- a/resources/dark/icon_navigation_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_navigation_mesh_instance.svg b/resources/dark/icon_navigation_mesh_instance.svg deleted file mode 100644 index 7fbd8e8..0000000 --- a/resources/dark/icon_navigation_mesh_instance.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_navigation_polygon_instance.svg b/resources/dark/icon_navigation_polygon_instance.svg deleted file mode 100644 index 3989433..0000000 --- a/resources/dark/icon_navigation_polygon_instance.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/resources/dark/icon_nine_patch_rect.svg b/resources/dark/icon_nine_patch_rect.svg deleted file mode 100644 index 33d7570..0000000 --- a/resources/dark/icon_nine_patch_rect.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/resources/dark/icon_node.svg b/resources/dark/icon_node.svg deleted file mode 100644 index dc3c027..0000000 --- a/resources/dark/icon_node.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_node_2d.svg b/resources/dark/icon_node_2d.svg deleted file mode 100644 index 75d5e43..0000000 --- a/resources/dark/icon_node_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_omni_light.svg b/resources/dark/icon_omni_light.svg deleted file mode 100644 index 9e101f0..0000000 --- a/resources/dark/icon_omni_light.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_option_button.svg b/resources/dark/icon_option_button.svg deleted file mode 100644 index 78f435f..0000000 --- a/resources/dark/icon_option_button.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/resources/dark/icon_panel.svg b/resources/dark/icon_panel.svg deleted file mode 100644 index 6928d34..0000000 --- a/resources/dark/icon_panel.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_panel_container.svg b/resources/dark/icon_panel_container.svg deleted file mode 100644 index 9a4c113..0000000 --- a/resources/dark/icon_panel_container.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_parallax_background.svg b/resources/dark/icon_parallax_background.svg deleted file mode 100644 index a81d69e..0000000 --- a/resources/dark/icon_parallax_background.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/resources/dark/icon_parallax_layer.svg b/resources/dark/icon_parallax_layer.svg deleted file mode 100644 index afa6288..0000000 --- a/resources/dark/icon_parallax_layer.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/resources/dark/icon_particles.svg b/resources/dark/icon_particles.svg deleted file mode 100644 index c006658..0000000 --- a/resources/dark/icon_particles.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_particles_2d.svg b/resources/dark/icon_particles_2d.svg deleted file mode 100644 index 35b67ef..0000000 --- a/resources/dark/icon_particles_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_path.svg b/resources/dark/icon_path.svg deleted file mode 100644 index 1d7b838..0000000 --- a/resources/dark/icon_path.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_path_2d.svg b/resources/dark/icon_path_2d.svg deleted file mode 100644 index 529b130..0000000 --- a/resources/dark/icon_path_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_path_follow.svg b/resources/dark/icon_path_follow.svg deleted file mode 100644 index 89a475c..0000000 --- a/resources/dark/icon_path_follow.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_path_follow_2d.svg b/resources/dark/icon_path_follow_2d.svg deleted file mode 100644 index 46c9fca..0000000 --- a/resources/dark/icon_path_follow_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_physical_bone.svg b/resources/dark/icon_physical_bone.svg deleted file mode 100644 index 93794b3..0000000 --- a/resources/dark/icon_physical_bone.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/resources/dark/icon_pin_joint.svg b/resources/dark/icon_pin_joint.svg deleted file mode 100644 index 2ee5773..0000000 --- a/resources/dark/icon_pin_joint.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_pin_joint_2d.svg b/resources/dark/icon_pin_joint_2d.svg deleted file mode 100644 index 91f3ffc..0000000 --- a/resources/dark/icon_pin_joint_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_polygon_2_d.svg b/resources/dark/icon_polygon_2_d.svg deleted file mode 100644 index 5a32403..0000000 --- a/resources/dark/icon_polygon_2_d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_popup.svg b/resources/dark/icon_popup.svg deleted file mode 100644 index 2eb53e9..0000000 --- a/resources/dark/icon_popup.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_popup_dialog.svg b/resources/dark/icon_popup_dialog.svg deleted file mode 100644 index 422be97..0000000 --- a/resources/dark/icon_popup_dialog.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_popup_menu.svg b/resources/dark/icon_popup_menu.svg deleted file mode 100644 index 140635b..0000000 --- a/resources/dark/icon_popup_menu.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_popup_panel.svg b/resources/dark/icon_popup_panel.svg deleted file mode 100644 index d8980ce..0000000 --- a/resources/dark/icon_popup_panel.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_position_2d.svg b/resources/dark/icon_position_2d.svg deleted file mode 100644 index b813033..0000000 --- a/resources/dark/icon_position_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_position_3d.svg b/resources/dark/icon_position_3d.svg deleted file mode 100644 index 5e94db9..0000000 --- a/resources/dark/icon_position_3d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_progress_bar.svg b/resources/dark/icon_progress_bar.svg deleted file mode 100644 index ca6e417..0000000 --- a/resources/dark/icon_progress_bar.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_ray_cast.svg b/resources/dark/icon_ray_cast.svg deleted file mode 100644 index 0a6e4cb..0000000 --- a/resources/dark/icon_ray_cast.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_ray_cast_2d.svg b/resources/dark/icon_ray_cast_2d.svg deleted file mode 100644 index 1468cd9..0000000 --- a/resources/dark/icon_ray_cast_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_reference_rect.svg b/resources/dark/icon_reference_rect.svg deleted file mode 100644 index 140b4a2..0000000 --- a/resources/dark/icon_reference_rect.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_reflection_probe.svg b/resources/dark/icon_reflection_probe.svg deleted file mode 100644 index ff85399..0000000 --- a/resources/dark/icon_reflection_probe.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_remote_transform.svg b/resources/dark/icon_remote_transform.svg deleted file mode 100644 index 59408fe..0000000 --- a/resources/dark/icon_remote_transform.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_remote_transform_2d.svg b/resources/dark/icon_remote_transform_2d.svg deleted file mode 100644 index 1f515e2..0000000 --- a/resources/dark/icon_remote_transform_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_resource_preloader.svg b/resources/dark/icon_resource_preloader.svg deleted file mode 100644 index 98d6e18..0000000 --- a/resources/dark/icon_resource_preloader.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_rich_text_label.svg b/resources/dark/icon_rich_text_label.svg deleted file mode 100644 index ae87273..0000000 --- a/resources/dark/icon_rich_text_label.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_rigid_body.svg b/resources/dark/icon_rigid_body.svg deleted file mode 100644 index 1f7ffcb..0000000 --- a/resources/dark/icon_rigid_body.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_rigid_body_2d.svg b/resources/dark/icon_rigid_body_2d.svg deleted file mode 100644 index 424e0c4..0000000 --- a/resources/dark/icon_rigid_body_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_scroll_container.svg b/resources/dark/icon_scroll_container.svg deleted file mode 100644 index 930c0a2..0000000 --- a/resources/dark/icon_scroll_container.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_skeleton.svg b/resources/dark/icon_skeleton.svg deleted file mode 100644 index 1f34427..0000000 --- a/resources/dark/icon_skeleton.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_skeleton_2d.svg b/resources/dark/icon_skeleton_2d.svg deleted file mode 100644 index b298c87..0000000 --- a/resources/dark/icon_skeleton_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_skeleton_i_k.svg b/resources/dark/icon_skeleton_i_k.svg deleted file mode 100644 index 0b5759d..0000000 --- a/resources/dark/icon_skeleton_i_k.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_slider_joint.svg b/resources/dark/icon_slider_joint.svg deleted file mode 100644 index 80d956b..0000000 --- a/resources/dark/icon_slider_joint.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_soft_body.svg b/resources/dark/icon_soft_body.svg deleted file mode 100644 index d5f32d5..0000000 --- a/resources/dark/icon_soft_body.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_spatial.svg b/resources/dark/icon_spatial.svg deleted file mode 100644 index 7f68d62..0000000 --- a/resources/dark/icon_spatial.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_spin_box.svg b/resources/dark/icon_spin_box.svg deleted file mode 100644 index 3fe639f..0000000 --- a/resources/dark/icon_spin_box.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_spot_light.svg b/resources/dark/icon_spot_light.svg deleted file mode 100644 index 622326f..0000000 --- a/resources/dark/icon_spot_light.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_spring_arm.svg b/resources/dark/icon_spring_arm.svg deleted file mode 100644 index a79efde..0000000 --- a/resources/dark/icon_spring_arm.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/resources/dark/icon_sprite.svg b/resources/dark/icon_sprite.svg deleted file mode 100644 index 592bdd2..0000000 --- a/resources/dark/icon_sprite.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_sprite_3d.svg b/resources/dark/icon_sprite_3d.svg deleted file mode 100644 index ed1e7c3..0000000 --- a/resources/dark/icon_sprite_3d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_static_body.svg b/resources/dark/icon_static_body.svg deleted file mode 100644 index 450ced8..0000000 --- a/resources/dark/icon_static_body.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_static_body_2d.svg b/resources/dark/icon_static_body_2d.svg deleted file mode 100644 index cdea347..0000000 --- a/resources/dark/icon_static_body_2d.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/resources/dark/icon_tab_container.svg b/resources/dark/icon_tab_container.svg deleted file mode 100644 index 736fee2..0000000 --- a/resources/dark/icon_tab_container.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_tabs.svg b/resources/dark/icon_tabs.svg deleted file mode 100644 index 468fcae..0000000 --- a/resources/dark/icon_tabs.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_text_edit.svg b/resources/dark/icon_text_edit.svg deleted file mode 100644 index 52725ea..0000000 --- a/resources/dark/icon_text_edit.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/resources/dark/icon_texture_button.svg b/resources/dark/icon_texture_button.svg deleted file mode 100644 index 0834ce7..0000000 --- a/resources/dark/icon_texture_button.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_texture_progress.svg b/resources/dark/icon_texture_progress.svg deleted file mode 100644 index b48f38e..0000000 --- a/resources/dark/icon_texture_progress.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/resources/dark/icon_texture_rect.svg b/resources/dark/icon_texture_rect.svg deleted file mode 100644 index 416bbe5..0000000 --- a/resources/dark/icon_texture_rect.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_tile_map.svg b/resources/dark/icon_tile_map.svg deleted file mode 100644 index d65feaf..0000000 --- a/resources/dark/icon_tile_map.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_timer.svg b/resources/dark/icon_timer.svg deleted file mode 100644 index 6aed859..0000000 --- a/resources/dark/icon_timer.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_tool_button.svg b/resources/dark/icon_tool_button.svg deleted file mode 100644 index c3f2ea6..0000000 --- a/resources/dark/icon_tool_button.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_touch_screen_button.svg b/resources/dark/icon_touch_screen_button.svg deleted file mode 100644 index 1a08e36..0000000 --- a/resources/dark/icon_touch_screen_button.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_tree.svg b/resources/dark/icon_tree.svg deleted file mode 100644 index 58338e6..0000000 --- a/resources/dark/icon_tree.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_tween.svg b/resources/dark/icon_tween.svg deleted file mode 100644 index ad8bd94..0000000 --- a/resources/dark/icon_tween.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_v_box_container.svg b/resources/dark/icon_v_box_container.svg deleted file mode 100644 index 0e37156..0000000 --- a/resources/dark/icon_v_box_container.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_v_scroll_bar.svg b/resources/dark/icon_v_scroll_bar.svg deleted file mode 100644 index d793e3a..0000000 --- a/resources/dark/icon_v_scroll_bar.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_v_separator.svg b/resources/dark/icon_v_separator.svg deleted file mode 100644 index bb07e5d..0000000 --- a/resources/dark/icon_v_separator.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_v_slider.svg b/resources/dark/icon_v_slider.svg deleted file mode 100644 index fa9ff88..0000000 --- a/resources/dark/icon_v_slider.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_v_split_container.svg b/resources/dark/icon_v_split_container.svg deleted file mode 100644 index 3ac0a63..0000000 --- a/resources/dark/icon_v_split_container.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_vehicle_body.svg b/resources/dark/icon_vehicle_body.svg deleted file mode 100644 index 92120a4..0000000 --- a/resources/dark/icon_vehicle_body.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_vehicle_wheel.svg b/resources/dark/icon_vehicle_wheel.svg deleted file mode 100644 index cbe7552..0000000 --- a/resources/dark/icon_vehicle_wheel.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_video_player.svg b/resources/dark/icon_video_player.svg deleted file mode 100644 index 52b4365..0000000 --- a/resources/dark/icon_video_player.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_viewport.svg b/resources/dark/icon_viewport.svg deleted file mode 100644 index e7ea83f..0000000 --- a/resources/dark/icon_viewport.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_viewport_container.svg b/resources/dark/icon_viewport_container.svg deleted file mode 100644 index a251833..0000000 --- a/resources/dark/icon_viewport_container.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_visibility_enabler.svg b/resources/dark/icon_visibility_enabler.svg deleted file mode 100644 index 222f5d7..0000000 --- a/resources/dark/icon_visibility_enabler.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_visibility_enabler_2d.svg b/resources/dark/icon_visibility_enabler_2d.svg deleted file mode 100644 index 27dd937..0000000 --- a/resources/dark/icon_visibility_enabler_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_visibility_notifier.svg b/resources/dark/icon_visibility_notifier.svg deleted file mode 100644 index 96d0cbf..0000000 --- a/resources/dark/icon_visibility_notifier.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_visibility_notifier_2d.svg b/resources/dark/icon_visibility_notifier_2d.svg deleted file mode 100644 index 3e90d8a..0000000 --- a/resources/dark/icon_visibility_notifier_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_window_dialog.svg b/resources/dark/icon_window_dialog.svg deleted file mode 100644 index dbf49fd..0000000 --- a/resources/dark/icon_window_dialog.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/dark/icon_world_environment.svg b/resources/dark/icon_world_environment.svg deleted file mode 100644 index 06cff10..0000000 --- a/resources/dark/icon_world_environment.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/resources/dark/icon_y_sort.svg b/resources/dark/icon_y_sort.svg deleted file mode 100644 index 18b0a03..0000000 --- a/resources/dark/icon_y_sort.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/godot_icons/dark/AcceptDialog.svg b/resources/godot_icons/dark/AcceptDialog.svg index d88ebd4..5d60a31 100644 --- a/resources/godot_icons/dark/AcceptDialog.svg +++ b/resources/godot_icons/dark/AcceptDialog.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/AnimatableBody2D.svg b/resources/godot_icons/dark/AnimatableBody2D.svg index f41e22a..7365a24 100644 --- a/resources/godot_icons/dark/AnimatableBody2D.svg +++ b/resources/godot_icons/dark/AnimatableBody2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/AnimatableBody3D.svg b/resources/godot_icons/dark/AnimatableBody3D.svg index a01a828..37f3083 100644 --- a/resources/godot_icons/dark/AnimatableBody3D.svg +++ b/resources/godot_icons/dark/AnimatableBody3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/AnimatedSprite2D.svg b/resources/godot_icons/dark/AnimatedSprite2D.svg index 0c9d293..56aba60 100644 --- a/resources/godot_icons/dark/AnimatedSprite2D.svg +++ b/resources/godot_icons/dark/AnimatedSprite2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/AnimatedSprite3D.svg b/resources/godot_icons/dark/AnimatedSprite3D.svg index b25ebae..1b2cf47 100644 --- a/resources/godot_icons/dark/AnimatedSprite3D.svg +++ b/resources/godot_icons/dark/AnimatedSprite3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/AnimatedTexture.svg b/resources/godot_icons/dark/AnimatedTexture.svg index 5325731..eead92e 100644 --- a/resources/godot_icons/dark/AnimatedTexture.svg +++ b/resources/godot_icons/dark/AnimatedTexture.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Animation.svg b/resources/godot_icons/dark/Animation.svg index 917784b..55d4809 100644 --- a/resources/godot_icons/dark/Animation.svg +++ b/resources/godot_icons/dark/Animation.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/AnimationLibrary.svg b/resources/godot_icons/dark/AnimationLibrary.svg index 097a53a..63ed97b 100644 --- a/resources/godot_icons/dark/AnimationLibrary.svg +++ b/resources/godot_icons/dark/AnimationLibrary.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/AnimationPlayer.svg b/resources/godot_icons/dark/AnimationPlayer.svg index 52b6b02..258eaf0 100644 --- a/resources/godot_icons/dark/AnimationPlayer.svg +++ b/resources/godot_icons/dark/AnimationPlayer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/AnimationTree.svg b/resources/godot_icons/dark/AnimationTree.svg index d648409..e11d0f1 100644 --- a/resources/godot_icons/dark/AnimationTree.svg +++ b/resources/godot_icons/dark/AnimationTree.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Area2D.svg b/resources/godot_icons/dark/Area2D.svg index 005f70e..5b0eceb 100644 --- a/resources/godot_icons/dark/Area2D.svg +++ b/resources/godot_icons/dark/Area2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Area3D.svg b/resources/godot_icons/dark/Area3D.svg index 4be8a2c..faf4e2f 100644 --- a/resources/godot_icons/dark/Area3D.svg +++ b/resources/godot_icons/dark/Area3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/ArrayMesh.svg b/resources/godot_icons/dark/ArrayMesh.svg index 2494a51..9e39024 100644 --- a/resources/godot_icons/dark/ArrayMesh.svg +++ b/resources/godot_icons/dark/ArrayMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/ArrayOccluder3D.svg b/resources/godot_icons/dark/ArrayOccluder3D.svg index ac45821..3d18fa0 100644 --- a/resources/godot_icons/dark/ArrayOccluder3D.svg +++ b/resources/godot_icons/dark/ArrayOccluder3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/ArrowDown.svg b/resources/godot_icons/dark/ArrowDown.svg new file mode 100644 index 0000000..23b7af8 --- /dev/null +++ b/resources/godot_icons/dark/ArrowDown.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/ArrowLeft.svg b/resources/godot_icons/dark/ArrowLeft.svg new file mode 100644 index 0000000..4141c3b --- /dev/null +++ b/resources/godot_icons/dark/ArrowLeft.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/ArrowRight.svg b/resources/godot_icons/dark/ArrowRight.svg new file mode 100644 index 0000000..f433ef3 --- /dev/null +++ b/resources/godot_icons/dark/ArrowRight.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/ArrowUp.svg b/resources/godot_icons/dark/ArrowUp.svg new file mode 100644 index 0000000..377d275 --- /dev/null +++ b/resources/godot_icons/dark/ArrowUp.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/AspectRatioContainer.svg b/resources/godot_icons/dark/AspectRatioContainer.svg index a7aef8e..8418cef 100644 --- a/resources/godot_icons/dark/AspectRatioContainer.svg +++ b/resources/godot_icons/dark/AspectRatioContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/AtlasTexture.svg b/resources/godot_icons/dark/AtlasTexture.svg index e261d37..4f41122 100644 --- a/resources/godot_icons/dark/AtlasTexture.svg +++ b/resources/godot_icons/dark/AtlasTexture.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/AudioListener2D.svg b/resources/godot_icons/dark/AudioListener2D.svg index db84dcf..58f3b66 100644 --- a/resources/godot_icons/dark/AudioListener2D.svg +++ b/resources/godot_icons/dark/AudioListener2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/AudioListener3D.svg b/resources/godot_icons/dark/AudioListener3D.svg index 7afbdcc..c669d39 100644 --- a/resources/godot_icons/dark/AudioListener3D.svg +++ b/resources/godot_icons/dark/AudioListener3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/AudioStreamPlayer.svg b/resources/godot_icons/dark/AudioStreamPlayer.svg index 31bd847..317b25d 100644 --- a/resources/godot_icons/dark/AudioStreamPlayer.svg +++ b/resources/godot_icons/dark/AudioStreamPlayer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/AudioStreamPlayer2D.svg b/resources/godot_icons/dark/AudioStreamPlayer2D.svg index 7a8fde8..9788416 100644 --- a/resources/godot_icons/dark/AudioStreamPlayer2D.svg +++ b/resources/godot_icons/dark/AudioStreamPlayer2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/AudioStreamPlayer3D.svg b/resources/godot_icons/dark/AudioStreamPlayer3D.svg index 5aa7e6d..02a8918 100644 --- a/resources/godot_icons/dark/AudioStreamPlayer3D.svg +++ b/resources/godot_icons/dark/AudioStreamPlayer3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/AudioStreamPolyphonic.svg b/resources/godot_icons/dark/AudioStreamPolyphonic.svg new file mode 100644 index 0000000..0e20205 --- /dev/null +++ b/resources/godot_icons/dark/AudioStreamPolyphonic.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/AudioStreamWAV.svg b/resources/godot_icons/dark/AudioStreamWAV.svg index 2e54de9..bb06b90 100644 --- a/resources/godot_icons/dark/AudioStreamWAV.svg +++ b/resources/godot_icons/dark/AudioStreamWAV.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Bone2D.svg b/resources/godot_icons/dark/Bone2D.svg index 2298022..a15a3d5 100644 --- a/resources/godot_icons/dark/Bone2D.svg +++ b/resources/godot_icons/dark/Bone2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/BoneAttachment3D.svg b/resources/godot_icons/dark/BoneAttachment3D.svg index 2f2a9cd..ec53486 100644 --- a/resources/godot_icons/dark/BoneAttachment3D.svg +++ b/resources/godot_icons/dark/BoneAttachment3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/BoxContainer.svg b/resources/godot_icons/dark/BoxContainer.svg index b5baf15..acb0620 100644 --- a/resources/godot_icons/dark/BoxContainer.svg +++ b/resources/godot_icons/dark/BoxContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/BoxMesh.svg b/resources/godot_icons/dark/BoxMesh.svg index ef2f77a..734f239 100644 --- a/resources/godot_icons/dark/BoxMesh.svg +++ b/resources/godot_icons/dark/BoxMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/BoxOccluder3D.svg b/resources/godot_icons/dark/BoxOccluder3D.svg index 3cee3db..888e9fe 100644 --- a/resources/godot_icons/dark/BoxOccluder3D.svg +++ b/resources/godot_icons/dark/BoxOccluder3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/BoxShape3D.svg b/resources/godot_icons/dark/BoxShape3D.svg index a16f0bb..ba86e08 100644 --- a/resources/godot_icons/dark/BoxShape3D.svg +++ b/resources/godot_icons/dark/BoxShape3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Button.svg b/resources/godot_icons/dark/Button.svg index 6046038..5f48214 100644 --- a/resources/godot_icons/dark/Button.svg +++ b/resources/godot_icons/dark/Button.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/ButtonGroup.svg b/resources/godot_icons/dark/ButtonGroup.svg index 0fd49f0..81eaa7a 100644 --- a/resources/godot_icons/dark/ButtonGroup.svg +++ b/resources/godot_icons/dark/ButtonGroup.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CPUParticles2D.svg b/resources/godot_icons/dark/CPUParticles2D.svg index 2bb648a..d4d240a 100644 --- a/resources/godot_icons/dark/CPUParticles2D.svg +++ b/resources/godot_icons/dark/CPUParticles2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CPUParticles3D.svg b/resources/godot_icons/dark/CPUParticles3D.svg index d4c3b6b..fb17176 100644 --- a/resources/godot_icons/dark/CPUParticles3D.svg +++ b/resources/godot_icons/dark/CPUParticles3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CSGBox3D.svg b/resources/godot_icons/dark/CSGBox3D.svg index c2d4e20..682f75c 100644 --- a/resources/godot_icons/dark/CSGBox3D.svg +++ b/resources/godot_icons/dark/CSGBox3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CSGCombiner3D.svg b/resources/godot_icons/dark/CSGCombiner3D.svg index b159d0e..e648fd6 100644 --- a/resources/godot_icons/dark/CSGCombiner3D.svg +++ b/resources/godot_icons/dark/CSGCombiner3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CSGCylinder3D.svg b/resources/godot_icons/dark/CSGCylinder3D.svg index 90fb45f..84bea3e 100644 --- a/resources/godot_icons/dark/CSGCylinder3D.svg +++ b/resources/godot_icons/dark/CSGCylinder3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CSGMesh3D.svg b/resources/godot_icons/dark/CSGMesh3D.svg index dd46504..e306c2b 100644 --- a/resources/godot_icons/dark/CSGMesh3D.svg +++ b/resources/godot_icons/dark/CSGMesh3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CSGPolygon3D.svg b/resources/godot_icons/dark/CSGPolygon3D.svg index 1f5c3d4..bdf5138 100644 --- a/resources/godot_icons/dark/CSGPolygon3D.svg +++ b/resources/godot_icons/dark/CSGPolygon3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CSGSphere3D.svg b/resources/godot_icons/dark/CSGSphere3D.svg index 45cf9a3..5e432c8 100644 --- a/resources/godot_icons/dark/CSGSphere3D.svg +++ b/resources/godot_icons/dark/CSGSphere3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CSGTorus3D.svg b/resources/godot_icons/dark/CSGTorus3D.svg index d2e7649..340d504 100644 --- a/resources/godot_icons/dark/CSGTorus3D.svg +++ b/resources/godot_icons/dark/CSGTorus3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CSharpScript.svg b/resources/godot_icons/dark/CSharpScript.svg index 0b2cc84..1e1ec96 100644 --- a/resources/godot_icons/dark/CSharpScript.svg +++ b/resources/godot_icons/dark/CSharpScript.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Camera2D.svg b/resources/godot_icons/dark/Camera2D.svg index b6aa869..f0a63c2 100644 --- a/resources/godot_icons/dark/Camera2D.svg +++ b/resources/godot_icons/dark/Camera2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Camera3D.svg b/resources/godot_icons/dark/Camera3D.svg index f6e99cb..038307f 100644 --- a/resources/godot_icons/dark/Camera3D.svg +++ b/resources/godot_icons/dark/Camera3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CameraAttributesPhysical.svg b/resources/godot_icons/dark/CameraAttributesPhysical.svg new file mode 100644 index 0000000..6871177 --- /dev/null +++ b/resources/godot_icons/dark/CameraAttributesPhysical.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/CameraAttributesPractical.svg b/resources/godot_icons/dark/CameraAttributesPractical.svg new file mode 100644 index 0000000..c33351a --- /dev/null +++ b/resources/godot_icons/dark/CameraAttributesPractical.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/CameraTexture.svg b/resources/godot_icons/dark/CameraTexture.svg index 91e3fe9..af9c32f 100644 --- a/resources/godot_icons/dark/CameraTexture.svg +++ b/resources/godot_icons/dark/CameraTexture.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CanvasGroup.svg b/resources/godot_icons/dark/CanvasGroup.svg index d3c9ba2..06284d9 100644 --- a/resources/godot_icons/dark/CanvasGroup.svg +++ b/resources/godot_icons/dark/CanvasGroup.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CanvasItemMaterial.svg b/resources/godot_icons/dark/CanvasItemMaterial.svg index 9a7a894..35f4bbb 100644 --- a/resources/godot_icons/dark/CanvasItemMaterial.svg +++ b/resources/godot_icons/dark/CanvasItemMaterial.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CanvasLayer.svg b/resources/godot_icons/dark/CanvasLayer.svg index 87295e6..e334df1 100644 --- a/resources/godot_icons/dark/CanvasLayer.svg +++ b/resources/godot_icons/dark/CanvasLayer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CanvasModulate.svg b/resources/godot_icons/dark/CanvasModulate.svg index fb27d76..2593bf3 100644 --- a/resources/godot_icons/dark/CanvasModulate.svg +++ b/resources/godot_icons/dark/CanvasModulate.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CanvasTexture.svg b/resources/godot_icons/dark/CanvasTexture.svg new file mode 100644 index 0000000..8734da3 --- /dev/null +++ b/resources/godot_icons/dark/CanvasTexture.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/CapsuleMesh.svg b/resources/godot_icons/dark/CapsuleMesh.svg index 0bc7814..ad8eea2 100644 --- a/resources/godot_icons/dark/CapsuleMesh.svg +++ b/resources/godot_icons/dark/CapsuleMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CapsuleShape2D.svg b/resources/godot_icons/dark/CapsuleShape2D.svg index 5b3c411..dc1d5b0 100644 --- a/resources/godot_icons/dark/CapsuleShape2D.svg +++ b/resources/godot_icons/dark/CapsuleShape2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CapsuleShape3D.svg b/resources/godot_icons/dark/CapsuleShape3D.svg index c566d68..c8f000e 100644 --- a/resources/godot_icons/dark/CapsuleShape3D.svg +++ b/resources/godot_icons/dark/CapsuleShape3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CharacterBody2D.svg b/resources/godot_icons/dark/CharacterBody2D.svg index 70faad6..feb5700 100644 --- a/resources/godot_icons/dark/CharacterBody2D.svg +++ b/resources/godot_icons/dark/CharacterBody2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CharacterBody3D.svg b/resources/godot_icons/dark/CharacterBody3D.svg index f289813..1d8de12 100644 --- a/resources/godot_icons/dark/CharacterBody3D.svg +++ b/resources/godot_icons/dark/CharacterBody3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CheckBox.svg b/resources/godot_icons/dark/CheckBox.svg index 8707dfc..0acceaa 100644 --- a/resources/godot_icons/dark/CheckBox.svg +++ b/resources/godot_icons/dark/CheckBox.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CircleShape2D.svg b/resources/godot_icons/dark/CircleShape2D.svg index 37a0903..da55f1d 100644 --- a/resources/godot_icons/dark/CircleShape2D.svg +++ b/resources/godot_icons/dark/CircleShape2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CodeEdit.svg b/resources/godot_icons/dark/CodeEdit.svg index 46755cb..0ca6e3a 100644 --- a/resources/godot_icons/dark/CodeEdit.svg +++ b/resources/godot_icons/dark/CodeEdit.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CodeHighlighter.svg b/resources/godot_icons/dark/CodeHighlighter.svg new file mode 100644 index 0000000..8e0de9c --- /dev/null +++ b/resources/godot_icons/dark/CodeHighlighter.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/CollisionPolygon2D.svg b/resources/godot_icons/dark/CollisionPolygon2D.svg index 59b991e..3d414e6 100644 --- a/resources/godot_icons/dark/CollisionPolygon2D.svg +++ b/resources/godot_icons/dark/CollisionPolygon2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CollisionPolygon3D.svg b/resources/godot_icons/dark/CollisionPolygon3D.svg index 1964bed..cdc8dd0 100644 --- a/resources/godot_icons/dark/CollisionPolygon3D.svg +++ b/resources/godot_icons/dark/CollisionPolygon3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CollisionShape2D.svg b/resources/godot_icons/dark/CollisionShape2D.svg index 9cac61f..8270280 100644 --- a/resources/godot_icons/dark/CollisionShape2D.svg +++ b/resources/godot_icons/dark/CollisionShape2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CollisionShape3D.svg b/resources/godot_icons/dark/CollisionShape3D.svg index 87d0705..d995c49 100644 --- a/resources/godot_icons/dark/CollisionShape3D.svg +++ b/resources/godot_icons/dark/CollisionShape3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/ColorPicker.svg b/resources/godot_icons/dark/ColorPicker.svg index c4f48cd..81cdbbe 100644 --- a/resources/godot_icons/dark/ColorPicker.svg +++ b/resources/godot_icons/dark/ColorPicker.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/ColorPickerButton.svg b/resources/godot_icons/dark/ColorPickerButton.svg index fa2a615..d00a6cd 100644 --- a/resources/godot_icons/dark/ColorPickerButton.svg +++ b/resources/godot_icons/dark/ColorPickerButton.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/ColorRect.svg b/resources/godot_icons/dark/ColorRect.svg index 39fb7a5..ccee4ca 100644 --- a/resources/godot_icons/dark/ColorRect.svg +++ b/resources/godot_icons/dark/ColorRect.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CompressedTexture2D.svg b/resources/godot_icons/dark/CompressedTexture2D.svg index 54ff10b..aa65696 100644 --- a/resources/godot_icons/dark/CompressedTexture2D.svg +++ b/resources/godot_icons/dark/CompressedTexture2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CompressedTexture3D.svg b/resources/godot_icons/dark/CompressedTexture3D.svg new file mode 100644 index 0000000..0f027ad --- /dev/null +++ b/resources/godot_icons/dark/CompressedTexture3D.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/ConcavePolygonShape2D.svg b/resources/godot_icons/dark/ConcavePolygonShape2D.svg index 26eda84..cb5d98c 100644 --- a/resources/godot_icons/dark/ConcavePolygonShape2D.svg +++ b/resources/godot_icons/dark/ConcavePolygonShape2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/ConcavePolygonShape3D.svg b/resources/godot_icons/dark/ConcavePolygonShape3D.svg index 67631ec..d970a16 100644 --- a/resources/godot_icons/dark/ConcavePolygonShape3D.svg +++ b/resources/godot_icons/dark/ConcavePolygonShape3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/ConeTwistJoint3D.svg b/resources/godot_icons/dark/ConeTwistJoint3D.svg index 9eff38d..d44247d 100644 --- a/resources/godot_icons/dark/ConeTwistJoint3D.svg +++ b/resources/godot_icons/dark/ConeTwistJoint3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/ConfirmationDialog.svg b/resources/godot_icons/dark/ConfirmationDialog.svg index f23b5f9..1ef0c3c 100644 --- a/resources/godot_icons/dark/ConfirmationDialog.svg +++ b/resources/godot_icons/dark/ConfirmationDialog.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Container.svg b/resources/godot_icons/dark/Container.svg index a7be880..59f7083 100644 --- a/resources/godot_icons/dark/Container.svg +++ b/resources/godot_icons/dark/Container.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Control.svg b/resources/godot_icons/dark/Control.svg index 0ec9c4c..fe80f24 100644 --- a/resources/godot_icons/dark/Control.svg +++ b/resources/godot_icons/dark/Control.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/ConvexPolygonShape2D.svg b/resources/godot_icons/dark/ConvexPolygonShape2D.svg index fa5369a..2324919 100644 --- a/resources/godot_icons/dark/ConvexPolygonShape2D.svg +++ b/resources/godot_icons/dark/ConvexPolygonShape2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/ConvexPolygonShape3D.svg b/resources/godot_icons/dark/ConvexPolygonShape3D.svg index f0c9101..09c5ee9 100644 --- a/resources/godot_icons/dark/ConvexPolygonShape3D.svg +++ b/resources/godot_icons/dark/ConvexPolygonShape3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Curve.svg b/resources/godot_icons/dark/Curve.svg index 34d537a..4061583 100644 --- a/resources/godot_icons/dark/Curve.svg +++ b/resources/godot_icons/dark/Curve.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Curve2D.svg b/resources/godot_icons/dark/Curve2D.svg index 4470e66..e4cf1dc 100644 --- a/resources/godot_icons/dark/Curve2D.svg +++ b/resources/godot_icons/dark/Curve2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Curve3D.svg b/resources/godot_icons/dark/Curve3D.svg index f61b344..a5cd204 100644 --- a/resources/godot_icons/dark/Curve3D.svg +++ b/resources/godot_icons/dark/Curve3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CurveTexture.svg b/resources/godot_icons/dark/CurveTexture.svg index f5a2eec..b9838eb 100644 --- a/resources/godot_icons/dark/CurveTexture.svg +++ b/resources/godot_icons/dark/CurveTexture.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CurveXYZTexture.svg b/resources/godot_icons/dark/CurveXYZTexture.svg new file mode 100644 index 0000000..e376dd4 --- /dev/null +++ b/resources/godot_icons/dark/CurveXYZTexture.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/CylinderMesh.svg b/resources/godot_icons/dark/CylinderMesh.svg index f6315c2..9d0045a 100644 --- a/resources/godot_icons/dark/CylinderMesh.svg +++ b/resources/godot_icons/dark/CylinderMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/CylinderShape3D.svg b/resources/godot_icons/dark/CylinderShape3D.svg index 1283097..a70a760 100644 --- a/resources/godot_icons/dark/CylinderShape3D.svg +++ b/resources/godot_icons/dark/CylinderShape3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/DampedSpringJoint2D.svg b/resources/godot_icons/dark/DampedSpringJoint2D.svg index d74f37d..5343ccb 100644 --- a/resources/godot_icons/dark/DampedSpringJoint2D.svg +++ b/resources/godot_icons/dark/DampedSpringJoint2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Decal.svg b/resources/godot_icons/dark/Decal.svg index 3ac5d2d..aa40b2c 100644 --- a/resources/godot_icons/dark/Decal.svg +++ b/resources/godot_icons/dark/Decal.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/DirectionalLight2D.svg b/resources/godot_icons/dark/DirectionalLight2D.svg index c40a4ee..7efbb77 100644 --- a/resources/godot_icons/dark/DirectionalLight2D.svg +++ b/resources/godot_icons/dark/DirectionalLight2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/DirectionalLight3D.svg b/resources/godot_icons/dark/DirectionalLight3D.svg index 5580bd4..6118b81 100644 --- a/resources/godot_icons/dark/DirectionalLight3D.svg +++ b/resources/godot_icons/dark/DirectionalLight3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Edit.svg b/resources/godot_icons/dark/Edit.svg new file mode 100644 index 0000000..6fc7ae0 --- /dev/null +++ b/resources/godot_icons/dark/Edit.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/Environment.svg b/resources/godot_icons/dark/Environment.svg index f42ae39..b356459 100644 --- a/resources/godot_icons/dark/Environment.svg +++ b/resources/godot_icons/dark/Environment.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/FileDialog.svg b/resources/godot_icons/dark/FileDialog.svg index c1e5479..6b16dbb 100644 --- a/resources/godot_icons/dark/FileDialog.svg +++ b/resources/godot_icons/dark/FileDialog.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/FlowContainer.svg b/resources/godot_icons/dark/FlowContainer.svg index ffbb151..d3b0b75 100644 --- a/resources/godot_icons/dark/FlowContainer.svg +++ b/resources/godot_icons/dark/FlowContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/FogMaterial.svg b/resources/godot_icons/dark/FogMaterial.svg index 5db7dea..5fb9951 100644 --- a/resources/godot_icons/dark/FogMaterial.svg +++ b/resources/godot_icons/dark/FogMaterial.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/FogVolume.svg b/resources/godot_icons/dark/FogVolume.svg index 6176d1d..f27f04d 100644 --- a/resources/godot_icons/dark/FogVolume.svg +++ b/resources/godot_icons/dark/FogVolume.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/FontFile.svg b/resources/godot_icons/dark/FontFile.svg index 6b98c26..b9a81cd 100644 --- a/resources/godot_icons/dark/FontFile.svg +++ b/resources/godot_icons/dark/FontFile.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/FontVariation.svg b/resources/godot_icons/dark/FontVariation.svg index 9488679..1915bb3 100644 --- a/resources/godot_icons/dark/FontVariation.svg +++ b/resources/godot_icons/dark/FontVariation.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/GDScript.svg b/resources/godot_icons/dark/GDScript.svg index aa59125..2671c00 100644 --- a/resources/godot_icons/dark/GDScript.svg +++ b/resources/godot_icons/dark/GDScript.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/GPUParticles2D.svg b/resources/godot_icons/dark/GPUParticles2D.svg index b291bcd..90ffcbd 100644 --- a/resources/godot_icons/dark/GPUParticles2D.svg +++ b/resources/godot_icons/dark/GPUParticles2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/GPUParticles3D.svg b/resources/godot_icons/dark/GPUParticles3D.svg index 969b172..04b2fc9 100644 --- a/resources/godot_icons/dark/GPUParticles3D.svg +++ b/resources/godot_icons/dark/GPUParticles3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/GPUParticlesAttractorBox3D.svg b/resources/godot_icons/dark/GPUParticlesAttractorBox3D.svg index e32cfc1..31f3e9e 100644 --- a/resources/godot_icons/dark/GPUParticlesAttractorBox3D.svg +++ b/resources/godot_icons/dark/GPUParticlesAttractorBox3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/GPUParticlesAttractorSphere3D.svg b/resources/godot_icons/dark/GPUParticlesAttractorSphere3D.svg index c330a24..dff12da 100644 --- a/resources/godot_icons/dark/GPUParticlesAttractorSphere3D.svg +++ b/resources/godot_icons/dark/GPUParticlesAttractorSphere3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/GPUParticlesAttractorVectorField3D.svg b/resources/godot_icons/dark/GPUParticlesAttractorVectorField3D.svg index 33c8ea9..c56ea5f 100644 --- a/resources/godot_icons/dark/GPUParticlesAttractorVectorField3D.svg +++ b/resources/godot_icons/dark/GPUParticlesAttractorVectorField3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/GPUParticlesCollisionBox3D.svg b/resources/godot_icons/dark/GPUParticlesCollisionBox3D.svg index 0410d3e..212b269 100644 --- a/resources/godot_icons/dark/GPUParticlesCollisionBox3D.svg +++ b/resources/godot_icons/dark/GPUParticlesCollisionBox3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/GPUParticlesCollisionSDF3D.svg b/resources/godot_icons/dark/GPUParticlesCollisionSDF3D.svg index f6ca4ea..95ed463 100644 --- a/resources/godot_icons/dark/GPUParticlesCollisionSDF3D.svg +++ b/resources/godot_icons/dark/GPUParticlesCollisionSDF3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/GPUParticlesCollisionSphere3D.svg b/resources/godot_icons/dark/GPUParticlesCollisionSphere3D.svg index 88759fa..36bc9c2 100644 --- a/resources/godot_icons/dark/GPUParticlesCollisionSphere3D.svg +++ b/resources/godot_icons/dark/GPUParticlesCollisionSphere3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Generic6DOFJoint3D.svg b/resources/godot_icons/dark/Generic6DOFJoint3D.svg index 63df5fc..d793057 100644 --- a/resources/godot_icons/dark/Generic6DOFJoint3D.svg +++ b/resources/godot_icons/dark/Generic6DOFJoint3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Gradient.svg b/resources/godot_icons/dark/Gradient.svg index 99d3a87..0dff9da 100644 --- a/resources/godot_icons/dark/Gradient.svg +++ b/resources/godot_icons/dark/Gradient.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/GradientTexture1D.svg b/resources/godot_icons/dark/GradientTexture1D.svg index 9be4b00..13da8ab 100644 --- a/resources/godot_icons/dark/GradientTexture1D.svg +++ b/resources/godot_icons/dark/GradientTexture1D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/GradientTexture2D.svg b/resources/godot_icons/dark/GradientTexture2D.svg index 77d38cc..8a03f34 100644 --- a/resources/godot_icons/dark/GradientTexture2D.svg +++ b/resources/godot_icons/dark/GradientTexture2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/GraphEdit.svg b/resources/godot_icons/dark/GraphEdit.svg index c0d9528..eda42d6 100644 --- a/resources/godot_icons/dark/GraphEdit.svg +++ b/resources/godot_icons/dark/GraphEdit.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/GraphElement.svg b/resources/godot_icons/dark/GraphElement.svg new file mode 100644 index 0000000..d5f7006 --- /dev/null +++ b/resources/godot_icons/dark/GraphElement.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/GraphNode.svg b/resources/godot_icons/dark/GraphNode.svg index ebb84e9..9cd726a 100644 --- a/resources/godot_icons/dark/GraphNode.svg +++ b/resources/godot_icons/dark/GraphNode.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/GridContainer.svg b/resources/godot_icons/dark/GridContainer.svg index fb6207d..425407c 100644 --- a/resources/godot_icons/dark/GridContainer.svg +++ b/resources/godot_icons/dark/GridContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/GridMap.svg b/resources/godot_icons/dark/GridMap.svg index 7a36fd8..e426416 100644 --- a/resources/godot_icons/dark/GridMap.svg +++ b/resources/godot_icons/dark/GridMap.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/GrooveJoint2D.svg b/resources/godot_icons/dark/GrooveJoint2D.svg index a9439d5..89dbc33 100644 --- a/resources/godot_icons/dark/GrooveJoint2D.svg +++ b/resources/godot_icons/dark/GrooveJoint2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/GuiVisibilityHidden.svg b/resources/godot_icons/dark/GuiVisibilityHidden.svg new file mode 100644 index 0000000..3a5c959 --- /dev/null +++ b/resources/godot_icons/dark/GuiVisibilityHidden.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/GuiVisibilityVisible.svg b/resources/godot_icons/dark/GuiVisibilityVisible.svg new file mode 100644 index 0000000..18c2cbb --- /dev/null +++ b/resources/godot_icons/dark/GuiVisibilityVisible.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/GuiVisibilityXray.svg b/resources/godot_icons/dark/GuiVisibilityXray.svg new file mode 100644 index 0000000..52d7dd9 --- /dev/null +++ b/resources/godot_icons/dark/GuiVisibilityXray.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/HBoxContainer.svg b/resources/godot_icons/dark/HBoxContainer.svg index 791fca0..678e391 100644 --- a/resources/godot_icons/dark/HBoxContainer.svg +++ b/resources/godot_icons/dark/HBoxContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/HFlowContainer.svg b/resources/godot_icons/dark/HFlowContainer.svg index 8d01398..29761fc 100644 --- a/resources/godot_icons/dark/HFlowContainer.svg +++ b/resources/godot_icons/dark/HFlowContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/HScrollBar.svg b/resources/godot_icons/dark/HScrollBar.svg index 5828ccb..9bf9ee3 100644 --- a/resources/godot_icons/dark/HScrollBar.svg +++ b/resources/godot_icons/dark/HScrollBar.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/HSeparator.svg b/resources/godot_icons/dark/HSeparator.svg index d786767..7434b67 100644 --- a/resources/godot_icons/dark/HSeparator.svg +++ b/resources/godot_icons/dark/HSeparator.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/HSlider.svg b/resources/godot_icons/dark/HSlider.svg index 0ab453b..554dcc5 100644 --- a/resources/godot_icons/dark/HSlider.svg +++ b/resources/godot_icons/dark/HSlider.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/HSplitContainer.svg b/resources/godot_icons/dark/HSplitContainer.svg index 796e331..dcf876f 100644 --- a/resources/godot_icons/dark/HSplitContainer.svg +++ b/resources/godot_icons/dark/HSplitContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/HeightMapShape3D.svg b/resources/godot_icons/dark/HeightMapShape3D.svg index e1b3af8..330cee9 100644 --- a/resources/godot_icons/dark/HeightMapShape3D.svg +++ b/resources/godot_icons/dark/HeightMapShape3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Help.svg b/resources/godot_icons/dark/Help.svg new file mode 100644 index 0000000..ecb9d3e --- /dev/null +++ b/resources/godot_icons/dark/Help.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/HelpSearch.svg b/resources/godot_icons/dark/HelpSearch.svg new file mode 100644 index 0000000..f0935ac --- /dev/null +++ b/resources/godot_icons/dark/HelpSearch.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/HingeJoint3D.svg b/resources/godot_icons/dark/HingeJoint3D.svg index ca97169..607253c 100644 --- a/resources/godot_icons/dark/HingeJoint3D.svg +++ b/resources/godot_icons/dark/HingeJoint3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/ImageTexture.svg b/resources/godot_icons/dark/ImageTexture.svg index 25d4b53..17fc57d 100644 --- a/resources/godot_icons/dark/ImageTexture.svg +++ b/resources/godot_icons/dark/ImageTexture.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/ImageTexture3D.svg b/resources/godot_icons/dark/ImageTexture3D.svg new file mode 100644 index 0000000..7cb4d46 --- /dev/null +++ b/resources/godot_icons/dark/ImageTexture3D.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/ImmediateMesh.svg b/resources/godot_icons/dark/ImmediateMesh.svg index f94ef8c..ceedc00 100644 --- a/resources/godot_icons/dark/ImmediateMesh.svg +++ b/resources/godot_icons/dark/ImmediateMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/ImportCheck.svg b/resources/godot_icons/dark/ImportCheck.svg new file mode 100644 index 0000000..83668e3 --- /dev/null +++ b/resources/godot_icons/dark/ImportCheck.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/ImportFail.svg b/resources/godot_icons/dark/ImportFail.svg new file mode 100644 index 0000000..7343408 --- /dev/null +++ b/resources/godot_icons/dark/ImportFail.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/ImporterMeshInstance3D.svg b/resources/godot_icons/dark/ImporterMeshInstance3D.svg index 5f42ee8..3a832fb 100644 --- a/resources/godot_icons/dark/ImporterMeshInstance3D.svg +++ b/resources/godot_icons/dark/ImporterMeshInstance3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Info.svg b/resources/godot_icons/dark/Info.svg new file mode 100644 index 0000000..1a16f74 --- /dev/null +++ b/resources/godot_icons/dark/Info.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/ItemList.svg b/resources/godot_icons/dark/ItemList.svg index fb98a70..5d07dbf 100644 --- a/resources/godot_icons/dark/ItemList.svg +++ b/resources/godot_icons/dark/ItemList.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Label.svg b/resources/godot_icons/dark/Label.svg index bfb1c90..e81d3b7 100644 --- a/resources/godot_icons/dark/Label.svg +++ b/resources/godot_icons/dark/Label.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Label3D.svg b/resources/godot_icons/dark/Label3D.svg index 1012553..547dfe5 100644 --- a/resources/godot_icons/dark/Label3D.svg +++ b/resources/godot_icons/dark/Label3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/LabelSettings.svg b/resources/godot_icons/dark/LabelSettings.svg index 5fef135..98f74fe 100644 --- a/resources/godot_icons/dark/LabelSettings.svg +++ b/resources/godot_icons/dark/LabelSettings.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/LightOccluder2D.svg b/resources/godot_icons/dark/LightOccluder2D.svg index 69a55d9..96807c0 100644 --- a/resources/godot_icons/dark/LightOccluder2D.svg +++ b/resources/godot_icons/dark/LightOccluder2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/LightmapProbe.svg b/resources/godot_icons/dark/LightmapProbe.svg index fdc4c84..31708e1 100644 --- a/resources/godot_icons/dark/LightmapProbe.svg +++ b/resources/godot_icons/dark/LightmapProbe.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Line2D.svg b/resources/godot_icons/dark/Line2D.svg index a0f9d1e..7185906 100644 --- a/resources/godot_icons/dark/Line2D.svg +++ b/resources/godot_icons/dark/Line2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/LineEdit.svg b/resources/godot_icons/dark/LineEdit.svg index 54e3190..3fea8a2 100644 --- a/resources/godot_icons/dark/LineEdit.svg +++ b/resources/godot_icons/dark/LineEdit.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/LinkButton.svg b/resources/godot_icons/dark/LinkButton.svg index 3a99d24..22624bc 100644 --- a/resources/godot_icons/dark/LinkButton.svg +++ b/resources/godot_icons/dark/LinkButton.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Lock.svg b/resources/godot_icons/dark/Lock.svg new file mode 100644 index 0000000..df66e52 --- /dev/null +++ b/resources/godot_icons/dark/Lock.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/MarginContainer.svg b/resources/godot_icons/dark/MarginContainer.svg index 82e72c0..27613b6 100644 --- a/resources/godot_icons/dark/MarginContainer.svg +++ b/resources/godot_icons/dark/MarginContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/MeshInstance2D.svg b/resources/godot_icons/dark/MeshInstance2D.svg index b8df076..4e18520 100644 --- a/resources/godot_icons/dark/MeshInstance2D.svg +++ b/resources/godot_icons/dark/MeshInstance2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/MeshInstance3D.svg b/resources/godot_icons/dark/MeshInstance3D.svg index c8cde0e..0ab5399 100644 --- a/resources/godot_icons/dark/MeshInstance3D.svg +++ b/resources/godot_icons/dark/MeshInstance3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/MeshLibrary.svg b/resources/godot_icons/dark/MeshLibrary.svg index 5d64acd..62a2b3e 100644 --- a/resources/godot_icons/dark/MeshLibrary.svg +++ b/resources/godot_icons/dark/MeshLibrary.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/MeshTexture.svg b/resources/godot_icons/dark/MeshTexture.svg index ccf16b8..4068d13 100644 --- a/resources/godot_icons/dark/MeshTexture.svg +++ b/resources/godot_icons/dark/MeshTexture.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/MultiMesh.svg b/resources/godot_icons/dark/MultiMesh.svg index 5b49008..23c26c7 100644 --- a/resources/godot_icons/dark/MultiMesh.svg +++ b/resources/godot_icons/dark/MultiMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/MultiMeshInstance2D.svg b/resources/godot_icons/dark/MultiMeshInstance2D.svg index 07c72ae..724e08f 100644 --- a/resources/godot_icons/dark/MultiMeshInstance2D.svg +++ b/resources/godot_icons/dark/MultiMeshInstance2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/MultiMeshInstance3D.svg b/resources/godot_icons/dark/MultiMeshInstance3D.svg index 7f319f3..e161118 100644 --- a/resources/godot_icons/dark/MultiMeshInstance3D.svg +++ b/resources/godot_icons/dark/MultiMeshInstance3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/NavigationAgent2D.svg b/resources/godot_icons/dark/NavigationAgent2D.svg index fafa508..3701e44 100644 --- a/resources/godot_icons/dark/NavigationAgent2D.svg +++ b/resources/godot_icons/dark/NavigationAgent2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/NavigationAgent3D.svg b/resources/godot_icons/dark/NavigationAgent3D.svg index 0c74394..4973dca 100644 --- a/resources/godot_icons/dark/NavigationAgent3D.svg +++ b/resources/godot_icons/dark/NavigationAgent3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/NavigationLink2D.svg b/resources/godot_icons/dark/NavigationLink2D.svg index df470ec..149a0f0 100644 --- a/resources/godot_icons/dark/NavigationLink2D.svg +++ b/resources/godot_icons/dark/NavigationLink2D.svg @@ -1,4 +1 @@ - - - - + diff --git a/resources/godot_icons/dark/NavigationLink3D.svg b/resources/godot_icons/dark/NavigationLink3D.svg index 05f36da..5e89c67 100644 --- a/resources/godot_icons/dark/NavigationLink3D.svg +++ b/resources/godot_icons/dark/NavigationLink3D.svg @@ -1,4 +1 @@ - - - - + diff --git a/resources/godot_icons/dark/NavigationObstacle2D.svg b/resources/godot_icons/dark/NavigationObstacle2D.svg index 6999ddb..71e0e84 100644 --- a/resources/godot_icons/dark/NavigationObstacle2D.svg +++ b/resources/godot_icons/dark/NavigationObstacle2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/NavigationObstacle3D.svg b/resources/godot_icons/dark/NavigationObstacle3D.svg index e93303d..a35f3c4 100644 --- a/resources/godot_icons/dark/NavigationObstacle3D.svg +++ b/resources/godot_icons/dark/NavigationObstacle3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/NavigationPolygon.svg b/resources/godot_icons/dark/NavigationPolygon.svg index d0fc822..c120b4b 100644 --- a/resources/godot_icons/dark/NavigationPolygon.svg +++ b/resources/godot_icons/dark/NavigationPolygon.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/NavigationRegion2D.svg b/resources/godot_icons/dark/NavigationRegion2D.svg index ba77b84..87feb39 100644 --- a/resources/godot_icons/dark/NavigationRegion2D.svg +++ b/resources/godot_icons/dark/NavigationRegion2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/NavigationRegion3D.svg b/resources/godot_icons/dark/NavigationRegion3D.svg index 15018de..cc661a5 100644 --- a/resources/godot_icons/dark/NavigationRegion3D.svg +++ b/resources/godot_icons/dark/NavigationRegion3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/NinePatchRect.svg b/resources/godot_icons/dark/NinePatchRect.svg index d857b71..17c9fc7 100644 --- a/resources/godot_icons/dark/NinePatchRect.svg +++ b/resources/godot_icons/dark/NinePatchRect.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Node.svg b/resources/godot_icons/dark/Node.svg index 199f94e..faa87ee 100644 --- a/resources/godot_icons/dark/Node.svg +++ b/resources/godot_icons/dark/Node.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Node2D.svg b/resources/godot_icons/dark/Node2D.svg index 7f27e06..a34b07e 100644 --- a/resources/godot_icons/dark/Node2D.svg +++ b/resources/godot_icons/dark/Node2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Node3D.svg b/resources/godot_icons/dark/Node3D.svg index dcd93f6..22d3481 100644 --- a/resources/godot_icons/dark/Node3D.svg +++ b/resources/godot_icons/dark/Node3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/NoiseTexture2D.svg b/resources/godot_icons/dark/NoiseTexture2D.svg new file mode 100644 index 0000000..0c22cfd --- /dev/null +++ b/resources/godot_icons/dark/NoiseTexture2D.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/NoiseTexture3D.svg b/resources/godot_icons/dark/NoiseTexture3D.svg new file mode 100644 index 0000000..92da633 --- /dev/null +++ b/resources/godot_icons/dark/NoiseTexture3D.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/ORMMaterial3D.svg b/resources/godot_icons/dark/ORMMaterial3D.svg index e092081..a70c44f 100644 --- a/resources/godot_icons/dark/ORMMaterial3D.svg +++ b/resources/godot_icons/dark/ORMMaterial3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Object.svg b/resources/godot_icons/dark/Object.svg index b1fa85d..2578fbe 100644 --- a/resources/godot_icons/dark/Object.svg +++ b/resources/godot_icons/dark/Object.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/OccluderInstance3D.svg b/resources/godot_icons/dark/OccluderInstance3D.svg index e204b7f..5810de9 100644 --- a/resources/godot_icons/dark/OccluderInstance3D.svg +++ b/resources/godot_icons/dark/OccluderInstance3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/OccluderPolygon2D.svg b/resources/godot_icons/dark/OccluderPolygon2D.svg index aca2338..ba0eedf 100644 --- a/resources/godot_icons/dark/OccluderPolygon2D.svg +++ b/resources/godot_icons/dark/OccluderPolygon2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/OmniLight3D.svg b/resources/godot_icons/dark/OmniLight3D.svg index a3119f6..9ecf89b 100644 --- a/resources/godot_icons/dark/OmniLight3D.svg +++ b/resources/godot_icons/dark/OmniLight3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/OptionButton.svg b/resources/godot_icons/dark/OptionButton.svg index 50e6fae..39117e9 100644 --- a/resources/godot_icons/dark/OptionButton.svg +++ b/resources/godot_icons/dark/OptionButton.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/PackedScene.svg b/resources/godot_icons/dark/PackedScene.svg index 6294989..935c159 100644 --- a/resources/godot_icons/dark/PackedScene.svg +++ b/resources/godot_icons/dark/PackedScene.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Panel.svg b/resources/godot_icons/dark/Panel.svg index f82822c..4ea5124 100644 --- a/resources/godot_icons/dark/Panel.svg +++ b/resources/godot_icons/dark/Panel.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/PanelContainer.svg b/resources/godot_icons/dark/PanelContainer.svg index 017941b..c43f992 100644 --- a/resources/godot_icons/dark/PanelContainer.svg +++ b/resources/godot_icons/dark/PanelContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/PanoramaSkyMaterial.svg b/resources/godot_icons/dark/PanoramaSkyMaterial.svg index eddcbfd..d230ba5 100644 --- a/resources/godot_icons/dark/PanoramaSkyMaterial.svg +++ b/resources/godot_icons/dark/PanoramaSkyMaterial.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/ParallaxBackground.svg b/resources/godot_icons/dark/ParallaxBackground.svg index 71a586e..d1badf5 100644 --- a/resources/godot_icons/dark/ParallaxBackground.svg +++ b/resources/godot_icons/dark/ParallaxBackground.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/ParallaxLayer.svg b/resources/godot_icons/dark/ParallaxLayer.svg index 8216c35..e2bccd6 100644 --- a/resources/godot_icons/dark/ParallaxLayer.svg +++ b/resources/godot_icons/dark/ParallaxLayer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/ParticleProcessMaterial.svg b/resources/godot_icons/dark/ParticleProcessMaterial.svg index 3359898..530c459 100644 --- a/resources/godot_icons/dark/ParticleProcessMaterial.svg +++ b/resources/godot_icons/dark/ParticleProcessMaterial.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Path2D.svg b/resources/godot_icons/dark/Path2D.svg index c911f9a..42fcf06 100644 --- a/resources/godot_icons/dark/Path2D.svg +++ b/resources/godot_icons/dark/Path2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Path3D.svg b/resources/godot_icons/dark/Path3D.svg index 2c5d783..8f6a62c 100644 --- a/resources/godot_icons/dark/Path3D.svg +++ b/resources/godot_icons/dark/Path3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/PathFollow2D.svg b/resources/godot_icons/dark/PathFollow2D.svg index 50df95c..f94b959 100644 --- a/resources/godot_icons/dark/PathFollow2D.svg +++ b/resources/godot_icons/dark/PathFollow2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/PathFollow3D.svg b/resources/godot_icons/dark/PathFollow3D.svg index 13d8162..03a7c63 100644 --- a/resources/godot_icons/dark/PathFollow3D.svg +++ b/resources/godot_icons/dark/PathFollow3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/PhysicalBone2D.svg b/resources/godot_icons/dark/PhysicalBone2D.svg new file mode 100644 index 0000000..850e0a2 --- /dev/null +++ b/resources/godot_icons/dark/PhysicalBone2D.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/PhysicalBone3D.svg b/resources/godot_icons/dark/PhysicalBone3D.svg index 55df1f1..799b5bf 100644 --- a/resources/godot_icons/dark/PhysicalBone3D.svg +++ b/resources/godot_icons/dark/PhysicalBone3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/PhysicalSkyMaterial.svg b/resources/godot_icons/dark/PhysicalSkyMaterial.svg index a32b451..48763a5 100644 --- a/resources/godot_icons/dark/PhysicalSkyMaterial.svg +++ b/resources/godot_icons/dark/PhysicalSkyMaterial.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/PinJoint2D.svg b/resources/godot_icons/dark/PinJoint2D.svg index 1b705a2..4caa2f9 100644 --- a/resources/godot_icons/dark/PinJoint2D.svg +++ b/resources/godot_icons/dark/PinJoint2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/PinJoint3D.svg b/resources/godot_icons/dark/PinJoint3D.svg index 12f388b..f21dac4 100644 --- a/resources/godot_icons/dark/PinJoint3D.svg +++ b/resources/godot_icons/dark/PinJoint3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/PlaceholderMaterial.svg b/resources/godot_icons/dark/PlaceholderMaterial.svg new file mode 100644 index 0000000..3b5a803 --- /dev/null +++ b/resources/godot_icons/dark/PlaceholderMaterial.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/PlaceholderMesh.svg b/resources/godot_icons/dark/PlaceholderMesh.svg new file mode 100644 index 0000000..c36156e --- /dev/null +++ b/resources/godot_icons/dark/PlaceholderMesh.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/PlaceholderTexture2D.svg b/resources/godot_icons/dark/PlaceholderTexture2D.svg new file mode 100644 index 0000000..3e7a375 --- /dev/null +++ b/resources/godot_icons/dark/PlaceholderTexture2D.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/PlaceholderTexture3D.svg b/resources/godot_icons/dark/PlaceholderTexture3D.svg new file mode 100644 index 0000000..93014b9 --- /dev/null +++ b/resources/godot_icons/dark/PlaceholderTexture3D.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/PlaneMesh.svg b/resources/godot_icons/dark/PlaneMesh.svg index 54b3361..857583d 100644 --- a/resources/godot_icons/dark/PlaneMesh.svg +++ b/resources/godot_icons/dark/PlaneMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Play.svg b/resources/godot_icons/dark/Play.svg new file mode 100644 index 0000000..385d501 --- /dev/null +++ b/resources/godot_icons/dark/Play.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/PlayBackwards.svg b/resources/godot_icons/dark/PlayBackwards.svg new file mode 100644 index 0000000..8ab80c7 --- /dev/null +++ b/resources/godot_icons/dark/PlayBackwards.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/PlayCustom.svg b/resources/godot_icons/dark/PlayCustom.svg new file mode 100644 index 0000000..118545e --- /dev/null +++ b/resources/godot_icons/dark/PlayCustom.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/PlayRemote.svg b/resources/godot_icons/dark/PlayRemote.svg new file mode 100644 index 0000000..78e5ae8 --- /dev/null +++ b/resources/godot_icons/dark/PlayRemote.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/PlayScene.svg b/resources/godot_icons/dark/PlayScene.svg new file mode 100644 index 0000000..7de0736 --- /dev/null +++ b/resources/godot_icons/dark/PlayScene.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/PlayStart.svg b/resources/godot_icons/dark/PlayStart.svg new file mode 100644 index 0000000..ef24084 --- /dev/null +++ b/resources/godot_icons/dark/PlayStart.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/PointLight2D.svg b/resources/godot_icons/dark/PointLight2D.svg index ed7300d..1ebcdfa 100644 --- a/resources/godot_icons/dark/PointLight2D.svg +++ b/resources/godot_icons/dark/PointLight2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/PointMesh.svg b/resources/godot_icons/dark/PointMesh.svg index ec04989..2cafedc 100644 --- a/resources/godot_icons/dark/PointMesh.svg +++ b/resources/godot_icons/dark/PointMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Polygon2D.svg b/resources/godot_icons/dark/Polygon2D.svg index e59aba3..10a8588 100644 --- a/resources/godot_icons/dark/Polygon2D.svg +++ b/resources/godot_icons/dark/Polygon2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/PolygonOccluder3D.svg b/resources/godot_icons/dark/PolygonOccluder3D.svg index fc87e5e..f4cbec0 100644 --- a/resources/godot_icons/dark/PolygonOccluder3D.svg +++ b/resources/godot_icons/dark/PolygonOccluder3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/PolygonPathFinder.svg b/resources/godot_icons/dark/PolygonPathFinder.svg index f400037..50c5ffc 100644 --- a/resources/godot_icons/dark/PolygonPathFinder.svg +++ b/resources/godot_icons/dark/PolygonPathFinder.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Popup.svg b/resources/godot_icons/dark/Popup.svg index c25cc5b..a6cfe07 100644 --- a/resources/godot_icons/dark/Popup.svg +++ b/resources/godot_icons/dark/Popup.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/PortableCompressedTexture2D.svg b/resources/godot_icons/dark/PortableCompressedTexture2D.svg new file mode 100644 index 0000000..3f63dda --- /dev/null +++ b/resources/godot_icons/dark/PortableCompressedTexture2D.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/PrismMesh.svg b/resources/godot_icons/dark/PrismMesh.svg index 0fd169c..6481b26 100644 --- a/resources/godot_icons/dark/PrismMesh.svg +++ b/resources/godot_icons/dark/PrismMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/ProceduralSkyMaterial.svg b/resources/godot_icons/dark/ProceduralSkyMaterial.svg index ceaf56d..87d61de 100644 --- a/resources/godot_icons/dark/ProceduralSkyMaterial.svg +++ b/resources/godot_icons/dark/ProceduralSkyMaterial.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Progress1.svg b/resources/godot_icons/dark/Progress1.svg new file mode 100644 index 0000000..8385bf0 --- /dev/null +++ b/resources/godot_icons/dark/Progress1.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/Progress2.svg b/resources/godot_icons/dark/Progress2.svg new file mode 100644 index 0000000..9d48f48 --- /dev/null +++ b/resources/godot_icons/dark/Progress2.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/Progress3.svg b/resources/godot_icons/dark/Progress3.svg new file mode 100644 index 0000000..c0ac80a --- /dev/null +++ b/resources/godot_icons/dark/Progress3.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/Progress4.svg b/resources/godot_icons/dark/Progress4.svg new file mode 100644 index 0000000..b5162d0 --- /dev/null +++ b/resources/godot_icons/dark/Progress4.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/Progress5.svg b/resources/godot_icons/dark/Progress5.svg new file mode 100644 index 0000000..f7b8f7a --- /dev/null +++ b/resources/godot_icons/dark/Progress5.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/Progress6.svg b/resources/godot_icons/dark/Progress6.svg new file mode 100644 index 0000000..485c477 --- /dev/null +++ b/resources/godot_icons/dark/Progress6.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/Progress7.svg b/resources/godot_icons/dark/Progress7.svg new file mode 100644 index 0000000..5a15ad8 --- /dev/null +++ b/resources/godot_icons/dark/Progress7.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/Progress8.svg b/resources/godot_icons/dark/Progress8.svg new file mode 100644 index 0000000..06d0204 --- /dev/null +++ b/resources/godot_icons/dark/Progress8.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/ProgressBar.svg b/resources/godot_icons/dark/ProgressBar.svg index 2200cb8..1bdd750 100644 --- a/resources/godot_icons/dark/ProgressBar.svg +++ b/resources/godot_icons/dark/ProgressBar.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/QuadMesh.svg b/resources/godot_icons/dark/QuadMesh.svg index 86cc1bc..c9f762c 100644 --- a/resources/godot_icons/dark/QuadMesh.svg +++ b/resources/godot_icons/dark/QuadMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/QuadOccluder3D.svg b/resources/godot_icons/dark/QuadOccluder3D.svg index 16da6f4..1f91cde 100644 --- a/resources/godot_icons/dark/QuadOccluder3D.svg +++ b/resources/godot_icons/dark/QuadOccluder3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/RectangleShape2D.svg b/resources/godot_icons/dark/RectangleShape2D.svg index 2d6a503..4a0f516 100644 --- a/resources/godot_icons/dark/RectangleShape2D.svg +++ b/resources/godot_icons/dark/RectangleShape2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/ReflectionProbe.svg b/resources/godot_icons/dark/ReflectionProbe.svg index 4d8248f..aa2138a 100644 --- a/resources/godot_icons/dark/ReflectionProbe.svg +++ b/resources/godot_icons/dark/ReflectionProbe.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/RegEx.svg b/resources/godot_icons/dark/RegEx.svg new file mode 100644 index 0000000..4df26f4 --- /dev/null +++ b/resources/godot_icons/dark/RegEx.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/RegExMatch.svg b/resources/godot_icons/dark/RegExMatch.svg new file mode 100644 index 0000000..889cf6c --- /dev/null +++ b/resources/godot_icons/dark/RegExMatch.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/Reload.svg b/resources/godot_icons/dark/Reload.svg new file mode 100644 index 0000000..9887d0d --- /dev/null +++ b/resources/godot_icons/dark/Reload.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/ReloadSmall.svg b/resources/godot_icons/dark/ReloadSmall.svg new file mode 100644 index 0000000..970383f --- /dev/null +++ b/resources/godot_icons/dark/ReloadSmall.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/RemoteTransform2D.svg b/resources/godot_icons/dark/RemoteTransform2D.svg index abe5e33..ddbd806 100644 --- a/resources/godot_icons/dark/RemoteTransform2D.svg +++ b/resources/godot_icons/dark/RemoteTransform2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/RemoteTransform3D.svg b/resources/godot_icons/dark/RemoteTransform3D.svg index d55e4e4..4ec5032 100644 --- a/resources/godot_icons/dark/RemoteTransform3D.svg +++ b/resources/godot_icons/dark/RemoteTransform3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/ResourcePreloader.svg b/resources/godot_icons/dark/ResourcePreloader.svg index 7a788bb..16a1d8d 100644 --- a/resources/godot_icons/dark/ResourcePreloader.svg +++ b/resources/godot_icons/dark/ResourcePreloader.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/RibbonTrailMesh.svg b/resources/godot_icons/dark/RibbonTrailMesh.svg index 3f6cf0b..7b22a2b 100644 --- a/resources/godot_icons/dark/RibbonTrailMesh.svg +++ b/resources/godot_icons/dark/RibbonTrailMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/RichTextEffect.svg b/resources/godot_icons/dark/RichTextEffect.svg index f1d3f16..d06fb3f 100644 --- a/resources/godot_icons/dark/RichTextEffect.svg +++ b/resources/godot_icons/dark/RichTextEffect.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/RigidBody2D.svg b/resources/godot_icons/dark/RigidBody2D.svg index 39c00d4..ca241c7 100644 --- a/resources/godot_icons/dark/RigidBody2D.svg +++ b/resources/godot_icons/dark/RigidBody2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/RigidBody3D.svg b/resources/godot_icons/dark/RigidBody3D.svg index 6e7bdbf..a962ad2 100644 --- a/resources/godot_icons/dark/RigidBody3D.svg +++ b/resources/godot_icons/dark/RigidBody3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/RootMotionView.svg b/resources/godot_icons/dark/RootMotionView.svg index 9dee731..ef891a7 100644 --- a/resources/godot_icons/dark/RootMotionView.svg +++ b/resources/godot_icons/dark/RootMotionView.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Script.svg b/resources/godot_icons/dark/Script.svg new file mode 100644 index 0000000..0c5b363 --- /dev/null +++ b/resources/godot_icons/dark/Script.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/ScriptCreate.svg b/resources/godot_icons/dark/ScriptCreate.svg new file mode 100644 index 0000000..fc54651 --- /dev/null +++ b/resources/godot_icons/dark/ScriptCreate.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/ScriptRemove.svg b/resources/godot_icons/dark/ScriptRemove.svg new file mode 100644 index 0000000..14ae5d1 --- /dev/null +++ b/resources/godot_icons/dark/ScriptRemove.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/ScrollContainer.svg b/resources/godot_icons/dark/ScrollContainer.svg index 6005906..351e231 100644 --- a/resources/godot_icons/dark/ScrollContainer.svg +++ b/resources/godot_icons/dark/ScrollContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Search.svg b/resources/godot_icons/dark/Search.svg new file mode 100644 index 0000000..e046e87 --- /dev/null +++ b/resources/godot_icons/dark/Search.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/SegmentShape2D.svg b/resources/godot_icons/dark/SegmentShape2D.svg index b6763f7..23e7054 100644 --- a/resources/godot_icons/dark/SegmentShape2D.svg +++ b/resources/godot_icons/dark/SegmentShape2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/SeparationRayShape2D.svg b/resources/godot_icons/dark/SeparationRayShape2D.svg index 6966e75..71da58f 100644 --- a/resources/godot_icons/dark/SeparationRayShape2D.svg +++ b/resources/godot_icons/dark/SeparationRayShape2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/SeparationRayShape3D.svg b/resources/godot_icons/dark/SeparationRayShape3D.svg index 44d32fe..65c68d0 100644 --- a/resources/godot_icons/dark/SeparationRayShape3D.svg +++ b/resources/godot_icons/dark/SeparationRayShape3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Shader.svg b/resources/godot_icons/dark/Shader.svg index 5a7e511..2828ad5 100644 --- a/resources/godot_icons/dark/Shader.svg +++ b/resources/godot_icons/dark/Shader.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/ShaderGlobalsOverride.svg b/resources/godot_icons/dark/ShaderGlobalsOverride.svg index 3a4e4cf..8ac50f0 100644 --- a/resources/godot_icons/dark/ShaderGlobalsOverride.svg +++ b/resources/godot_icons/dark/ShaderGlobalsOverride.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/ShaderInclude.svg b/resources/godot_icons/dark/ShaderInclude.svg new file mode 100644 index 0000000..8c540b5 --- /dev/null +++ b/resources/godot_icons/dark/ShaderInclude.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/ShaderMaterial.svg b/resources/godot_icons/dark/ShaderMaterial.svg index 80a1d0a..a53be38 100644 --- a/resources/godot_icons/dark/ShaderMaterial.svg +++ b/resources/godot_icons/dark/ShaderMaterial.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/ShapeCast2D.svg b/resources/godot_icons/dark/ShapeCast2D.svg index dcdba92..b1e71b3 100644 --- a/resources/godot_icons/dark/ShapeCast2D.svg +++ b/resources/godot_icons/dark/ShapeCast2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/ShapeCast3D.svg b/resources/godot_icons/dark/ShapeCast3D.svg index 258dfa5..7ffa630 100644 --- a/resources/godot_icons/dark/ShapeCast3D.svg +++ b/resources/godot_icons/dark/ShapeCast3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Signals.svg b/resources/godot_icons/dark/Signals.svg new file mode 100644 index 0000000..3ac7c2b --- /dev/null +++ b/resources/godot_icons/dark/Signals.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/SignalsAndGroups.svg b/resources/godot_icons/dark/SignalsAndGroups.svg new file mode 100644 index 0000000..3f618c6 --- /dev/null +++ b/resources/godot_icons/dark/SignalsAndGroups.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/Skeleton2D.svg b/resources/godot_icons/dark/Skeleton2D.svg index b34a2a9..f9aa146 100644 --- a/resources/godot_icons/dark/Skeleton2D.svg +++ b/resources/godot_icons/dark/Skeleton2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Skeleton3D.svg b/resources/godot_icons/dark/Skeleton3D.svg index c376aef..965651e 100644 --- a/resources/godot_icons/dark/Skeleton3D.svg +++ b/resources/godot_icons/dark/Skeleton3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/SkeletonIK3D.svg b/resources/godot_icons/dark/SkeletonIK3D.svg index f497934..94c0354 100644 --- a/resources/godot_icons/dark/SkeletonIK3D.svg +++ b/resources/godot_icons/dark/SkeletonIK3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Sky.svg b/resources/godot_icons/dark/Sky.svg index e463c5f..73656ed 100644 --- a/resources/godot_icons/dark/Sky.svg +++ b/resources/godot_icons/dark/Sky.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/SliderJoint3D.svg b/resources/godot_icons/dark/SliderJoint3D.svg index 57d22df..1b76e43 100644 --- a/resources/godot_icons/dark/SliderJoint3D.svg +++ b/resources/godot_icons/dark/SliderJoint3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Slot.svg b/resources/godot_icons/dark/Slot.svg new file mode 100644 index 0000000..93c125a --- /dev/null +++ b/resources/godot_icons/dark/Slot.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/SphereMesh.svg b/resources/godot_icons/dark/SphereMesh.svg index be2dd44..83dd42f 100644 --- a/resources/godot_icons/dark/SphereMesh.svg +++ b/resources/godot_icons/dark/SphereMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/SphereOccluder3D.svg b/resources/godot_icons/dark/SphereOccluder3D.svg index 850e265..d593ce6 100644 --- a/resources/godot_icons/dark/SphereOccluder3D.svg +++ b/resources/godot_icons/dark/SphereOccluder3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/SpinBox.svg b/resources/godot_icons/dark/SpinBox.svg index a8dc55d..aa63a09 100644 --- a/resources/godot_icons/dark/SpinBox.svg +++ b/resources/godot_icons/dark/SpinBox.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/SplitContainer.svg b/resources/godot_icons/dark/SplitContainer.svg index 44ec14c..f9ee381 100644 --- a/resources/godot_icons/dark/SplitContainer.svg +++ b/resources/godot_icons/dark/SplitContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/SpotLight3D.svg b/resources/godot_icons/dark/SpotLight3D.svg index 5849c80..547662d 100644 --- a/resources/godot_icons/dark/SpotLight3D.svg +++ b/resources/godot_icons/dark/SpotLight3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Sprite2D.svg b/resources/godot_icons/dark/Sprite2D.svg index faae0e4..16a903d 100644 --- a/resources/godot_icons/dark/Sprite2D.svg +++ b/resources/godot_icons/dark/Sprite2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Sprite3D.svg b/resources/godot_icons/dark/Sprite3D.svg index 4ccd8f9..e18a79b 100644 --- a/resources/godot_icons/dark/Sprite3D.svg +++ b/resources/godot_icons/dark/Sprite3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/SpriteFrames.svg b/resources/godot_icons/dark/SpriteFrames.svg index 8ab0ec2..a6aecc4 100644 --- a/resources/godot_icons/dark/SpriteFrames.svg +++ b/resources/godot_icons/dark/SpriteFrames.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/StandardMaterial3D.svg b/resources/godot_icons/dark/StandardMaterial3D.svg index 717ba5d..41e9a67 100644 --- a/resources/godot_icons/dark/StandardMaterial3D.svg +++ b/resources/godot_icons/dark/StandardMaterial3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/StaticBody2D.svg b/resources/godot_icons/dark/StaticBody2D.svg index dce7134..0270f24 100644 --- a/resources/godot_icons/dark/StaticBody2D.svg +++ b/resources/godot_icons/dark/StaticBody2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/StaticBody3D.svg b/resources/godot_icons/dark/StaticBody3D.svg index 770417c..4b331ff 100644 --- a/resources/godot_icons/dark/StaticBody3D.svg +++ b/resources/godot_icons/dark/StaticBody3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Stop.svg b/resources/godot_icons/dark/Stop.svg new file mode 100644 index 0000000..b10acdb --- /dev/null +++ b/resources/godot_icons/dark/Stop.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/StyleBoxEmpty.svg b/resources/godot_icons/dark/StyleBoxEmpty.svg index 3c4546d..c110d45 100644 --- a/resources/godot_icons/dark/StyleBoxEmpty.svg +++ b/resources/godot_icons/dark/StyleBoxEmpty.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/StyleBoxFlat.svg b/resources/godot_icons/dark/StyleBoxFlat.svg index 5bf01f5..9868644 100644 --- a/resources/godot_icons/dark/StyleBoxFlat.svg +++ b/resources/godot_icons/dark/StyleBoxFlat.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/StyleBoxLine.svg b/resources/godot_icons/dark/StyleBoxLine.svg index 995f56f..818864f 100644 --- a/resources/godot_icons/dark/StyleBoxLine.svg +++ b/resources/godot_icons/dark/StyleBoxLine.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/StyleBoxTexture.svg b/resources/godot_icons/dark/StyleBoxTexture.svg index a356d11..9054053 100644 --- a/resources/godot_icons/dark/StyleBoxTexture.svg +++ b/resources/godot_icons/dark/StyleBoxTexture.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/SubViewport.svg b/resources/godot_icons/dark/SubViewport.svg index d5da67e..3644215 100644 --- a/resources/godot_icons/dark/SubViewport.svg +++ b/resources/godot_icons/dark/SubViewport.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/SubViewportContainer.svg b/resources/godot_icons/dark/SubViewportContainer.svg index baf80e5..abe65e2 100644 --- a/resources/godot_icons/dark/SubViewportContainer.svg +++ b/resources/godot_icons/dark/SubViewportContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/SyntaxHighlighter.svg b/resources/godot_icons/dark/SyntaxHighlighter.svg new file mode 100644 index 0000000..4773251 --- /dev/null +++ b/resources/godot_icons/dark/SyntaxHighlighter.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/SystemFont.svg b/resources/godot_icons/dark/SystemFont.svg index 25415a2..438c707 100644 --- a/resources/godot_icons/dark/SystemFont.svg +++ b/resources/godot_icons/dark/SystemFont.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/TabBar.svg b/resources/godot_icons/dark/TabBar.svg index 4fd4a5c..e6c6449 100644 --- a/resources/godot_icons/dark/TabBar.svg +++ b/resources/godot_icons/dark/TabBar.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/TabContainer.svg b/resources/godot_icons/dark/TabContainer.svg index aeb5507..bd9ae38 100644 --- a/resources/godot_icons/dark/TabContainer.svg +++ b/resources/godot_icons/dark/TabContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/TextEdit.svg b/resources/godot_icons/dark/TextEdit.svg index 4dfbff8..6ea17d7 100644 --- a/resources/godot_icons/dark/TextEdit.svg +++ b/resources/godot_icons/dark/TextEdit.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/TextMesh.svg b/resources/godot_icons/dark/TextMesh.svg index 234ce75..868ab6e 100644 --- a/resources/godot_icons/dark/TextMesh.svg +++ b/resources/godot_icons/dark/TextMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Texture2DArray.svg b/resources/godot_icons/dark/Texture2DArray.svg index 6d5bf0d..f585263 100644 --- a/resources/godot_icons/dark/Texture2DArray.svg +++ b/resources/godot_icons/dark/Texture2DArray.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/TextureButton.svg b/resources/godot_icons/dark/TextureButton.svg index 4973869..4765d5a 100644 --- a/resources/godot_icons/dark/TextureButton.svg +++ b/resources/godot_icons/dark/TextureButton.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/TextureProgressBar.svg b/resources/godot_icons/dark/TextureProgressBar.svg index 30d76e3..423e87e 100644 --- a/resources/godot_icons/dark/TextureProgressBar.svg +++ b/resources/godot_icons/dark/TextureProgressBar.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Theme.svg b/resources/godot_icons/dark/Theme.svg index 401d884..f35462d 100644 --- a/resources/godot_icons/dark/Theme.svg +++ b/resources/godot_icons/dark/Theme.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/TileMap.svg b/resources/godot_icons/dark/TileMap.svg index 87bca73..d07b87a 100644 --- a/resources/godot_icons/dark/TileMap.svg +++ b/resources/godot_icons/dark/TileMap.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/TileSet.svg b/resources/godot_icons/dark/TileSet.svg index 5da4068..5d423c0 100644 --- a/resources/godot_icons/dark/TileSet.svg +++ b/resources/godot_icons/dark/TileSet.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Timer.svg b/resources/godot_icons/dark/Timer.svg index 3fc6975..565a3b7 100644 --- a/resources/godot_icons/dark/Timer.svg +++ b/resources/godot_icons/dark/Timer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/TorusMesh.svg b/resources/godot_icons/dark/TorusMesh.svg index 2ed973d..adf3a84 100644 --- a/resources/godot_icons/dark/TorusMesh.svg +++ b/resources/godot_icons/dark/TorusMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/TouchScreenButton.svg b/resources/godot_icons/dark/TouchScreenButton.svg index 8ec481e..71c10f2 100644 --- a/resources/godot_icons/dark/TouchScreenButton.svg +++ b/resources/godot_icons/dark/TouchScreenButton.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Tree.svg b/resources/godot_icons/dark/Tree.svg index 9476f40..c17a928 100644 --- a/resources/godot_icons/dark/Tree.svg +++ b/resources/godot_icons/dark/Tree.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/TubeTrailMesh.svg b/resources/godot_icons/dark/TubeTrailMesh.svg index 3ca5242..1cbab36 100644 --- a/resources/godot_icons/dark/TubeTrailMesh.svg +++ b/resources/godot_icons/dark/TubeTrailMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Tween.svg b/resources/godot_icons/dark/Tween.svg index d5cfbbc..9d382a4 100644 --- a/resources/godot_icons/dark/Tween.svg +++ b/resources/godot_icons/dark/Tween.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Unlock.svg b/resources/godot_icons/dark/Unlock.svg new file mode 100644 index 0000000..d377cf1 --- /dev/null +++ b/resources/godot_icons/dark/Unlock.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/VBoxContainer.svg b/resources/godot_icons/dark/VBoxContainer.svg index 9a68df4..4cc0c91 100644 --- a/resources/godot_icons/dark/VBoxContainer.svg +++ b/resources/godot_icons/dark/VBoxContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VFlowContainer.svg b/resources/godot_icons/dark/VFlowContainer.svg index 392b214..cc9abce 100644 --- a/resources/godot_icons/dark/VFlowContainer.svg +++ b/resources/godot_icons/dark/VFlowContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VScrollBar.svg b/resources/godot_icons/dark/VScrollBar.svg index e0fc575..fa86213 100644 --- a/resources/godot_icons/dark/VScrollBar.svg +++ b/resources/godot_icons/dark/VScrollBar.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VSeparator.svg b/resources/godot_icons/dark/VSeparator.svg index 11038b7..afe309b 100644 --- a/resources/godot_icons/dark/VSeparator.svg +++ b/resources/godot_icons/dark/VSeparator.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VSlider.svg b/resources/godot_icons/dark/VSlider.svg index 0ecb1e9..9ba42e8 100644 --- a/resources/godot_icons/dark/VSlider.svg +++ b/resources/godot_icons/dark/VSlider.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VSplitContainer.svg b/resources/godot_icons/dark/VSplitContainer.svg index 21d45bd..1d60a38 100644 --- a/resources/godot_icons/dark/VSplitContainer.svg +++ b/resources/godot_icons/dark/VSplitContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VehicleBody3D.svg b/resources/godot_icons/dark/VehicleBody3D.svg index 6684368..34a35c8 100644 --- a/resources/godot_icons/dark/VehicleBody3D.svg +++ b/resources/godot_icons/dark/VehicleBody3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VehicleWheel3D.svg b/resources/godot_icons/dark/VehicleWheel3D.svg index 623d851..c567dd4 100644 --- a/resources/godot_icons/dark/VehicleWheel3D.svg +++ b/resources/godot_icons/dark/VehicleWheel3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VideoStreamPlayer.svg b/resources/godot_icons/dark/VideoStreamPlayer.svg index c5433e0..304a17c 100644 --- a/resources/godot_icons/dark/VideoStreamPlayer.svg +++ b/resources/godot_icons/dark/VideoStreamPlayer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/ViewportTexture.svg b/resources/godot_icons/dark/ViewportTexture.svg index a5b1e4a..de2ad7f 100644 --- a/resources/godot_icons/dark/ViewportTexture.svg +++ b/resources/godot_icons/dark/ViewportTexture.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VisibleOnScreenEnabler2D.svg b/resources/godot_icons/dark/VisibleOnScreenEnabler2D.svg index 688890b..0214851 100644 --- a/resources/godot_icons/dark/VisibleOnScreenEnabler2D.svg +++ b/resources/godot_icons/dark/VisibleOnScreenEnabler2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VisibleOnScreenEnabler3D.svg b/resources/godot_icons/dark/VisibleOnScreenEnabler3D.svg index 9b2ead8..3c03239 100644 --- a/resources/godot_icons/dark/VisibleOnScreenEnabler3D.svg +++ b/resources/godot_icons/dark/VisibleOnScreenEnabler3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VisibleOnScreenNotifier2D.svg b/resources/godot_icons/dark/VisibleOnScreenNotifier2D.svg index 8eaf833..1d694ac 100644 --- a/resources/godot_icons/dark/VisibleOnScreenNotifier2D.svg +++ b/resources/godot_icons/dark/VisibleOnScreenNotifier2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VisibleOnScreenNotifier3D.svg b/resources/godot_icons/dark/VisibleOnScreenNotifier3D.svg index 56f0a65..31c6a1c 100644 --- a/resources/godot_icons/dark/VisibleOnScreenNotifier3D.svg +++ b/resources/godot_icons/dark/VisibleOnScreenNotifier3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VisualShader.svg b/resources/godot_icons/dark/VisualShader.svg index 92b4737..945d215 100644 --- a/resources/godot_icons/dark/VisualShader.svg +++ b/resources/godot_icons/dark/VisualShader.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VisualShaderNodeColorConstant.svg b/resources/godot_icons/dark/VisualShaderNodeColorConstant.svg index d327012..c2af7df 100644 --- a/resources/godot_icons/dark/VisualShaderNodeColorConstant.svg +++ b/resources/godot_icons/dark/VisualShaderNodeColorConstant.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VisualShaderNodeColorOp.svg b/resources/godot_icons/dark/VisualShaderNodeColorOp.svg index 005da8b..c21852a 100644 --- a/resources/godot_icons/dark/VisualShaderNodeColorOp.svg +++ b/resources/godot_icons/dark/VisualShaderNodeColorOp.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VisualShaderNodeCubeMap.svg b/resources/godot_icons/dark/VisualShaderNodeCubeMap.svg index fecb4d1..e28552c 100644 --- a/resources/godot_icons/dark/VisualShaderNodeCubeMap.svg +++ b/resources/godot_icons/dark/VisualShaderNodeCubeMap.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VisualShaderNodeCurveTexture.svg b/resources/godot_icons/dark/VisualShaderNodeCurveTexture.svg index e468acf..f1f6a54 100644 --- a/resources/godot_icons/dark/VisualShaderNodeCurveTexture.svg +++ b/resources/godot_icons/dark/VisualShaderNodeCurveTexture.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VisualShaderNodeCurveXYZTexture.svg b/resources/godot_icons/dark/VisualShaderNodeCurveXYZTexture.svg index e468acf..f1f6a54 100644 --- a/resources/godot_icons/dark/VisualShaderNodeCurveXYZTexture.svg +++ b/resources/godot_icons/dark/VisualShaderNodeCurveXYZTexture.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VisualShaderNodeExpression.svg b/resources/godot_icons/dark/VisualShaderNodeExpression.svg index 710ba81..ae403da 100644 --- a/resources/godot_icons/dark/VisualShaderNodeExpression.svg +++ b/resources/godot_icons/dark/VisualShaderNodeExpression.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VisualShaderNodeFloatFunc.svg b/resources/godot_icons/dark/VisualShaderNodeFloatFunc.svg index 382c4e6..7cf2a5f 100644 --- a/resources/godot_icons/dark/VisualShaderNodeFloatFunc.svg +++ b/resources/godot_icons/dark/VisualShaderNodeFloatFunc.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VisualShaderNodeFloatOp.svg b/resources/godot_icons/dark/VisualShaderNodeFloatOp.svg index 546ffc1..54048f0 100644 --- a/resources/godot_icons/dark/VisualShaderNodeFloatOp.svg +++ b/resources/godot_icons/dark/VisualShaderNodeFloatOp.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VisualShaderNodeGlobalExpression.svg b/resources/godot_icons/dark/VisualShaderNodeGlobalExpression.svg index 0cafffb..14b75e2 100644 --- a/resources/godot_icons/dark/VisualShaderNodeGlobalExpression.svg +++ b/resources/godot_icons/dark/VisualShaderNodeGlobalExpression.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VisualShaderNodeIntFunc.svg b/resources/godot_icons/dark/VisualShaderNodeIntFunc.svg index 382c4e6..7cf2a5f 100644 --- a/resources/godot_icons/dark/VisualShaderNodeIntFunc.svg +++ b/resources/godot_icons/dark/VisualShaderNodeIntFunc.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VisualShaderNodeIntOp.svg b/resources/godot_icons/dark/VisualShaderNodeIntOp.svg index 546ffc1..54048f0 100644 --- a/resources/godot_icons/dark/VisualShaderNodeIntOp.svg +++ b/resources/godot_icons/dark/VisualShaderNodeIntOp.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VisualShaderNodeTransformCompose.svg b/resources/godot_icons/dark/VisualShaderNodeTransformCompose.svg index 774f9e7..6f44f23 100644 --- a/resources/godot_icons/dark/VisualShaderNodeTransformCompose.svg +++ b/resources/godot_icons/dark/VisualShaderNodeTransformCompose.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VisualShaderNodeTransformDecompose.svg b/resources/godot_icons/dark/VisualShaderNodeTransformDecompose.svg index 9594bcb..1521181 100644 --- a/resources/godot_icons/dark/VisualShaderNodeTransformDecompose.svg +++ b/resources/godot_icons/dark/VisualShaderNodeTransformDecompose.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VisualShaderNodeTransformVecMult.svg b/resources/godot_icons/dark/VisualShaderNodeTransformVecMult.svg index 611f027..cd108f6 100644 --- a/resources/godot_icons/dark/VisualShaderNodeTransformVecMult.svg +++ b/resources/godot_icons/dark/VisualShaderNodeTransformVecMult.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VisualShaderNodeVectorCompose.svg b/resources/godot_icons/dark/VisualShaderNodeVectorCompose.svg index 2c4c1fb..6502ca5 100644 --- a/resources/godot_icons/dark/VisualShaderNodeVectorCompose.svg +++ b/resources/godot_icons/dark/VisualShaderNodeVectorCompose.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VisualShaderNodeVectorDecompose.svg b/resources/godot_icons/dark/VisualShaderNodeVectorDecompose.svg index 5fb8661..5ff0706 100644 --- a/resources/godot_icons/dark/VisualShaderNodeVectorDecompose.svg +++ b/resources/godot_icons/dark/VisualShaderNodeVectorDecompose.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VisualShaderNodeVectorDistance.svg b/resources/godot_icons/dark/VisualShaderNodeVectorDistance.svg index b7185f2..9ea5462 100644 --- a/resources/godot_icons/dark/VisualShaderNodeVectorDistance.svg +++ b/resources/godot_icons/dark/VisualShaderNodeVectorDistance.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VisualShaderNodeVectorFunc.svg b/resources/godot_icons/dark/VisualShaderNodeVectorFunc.svg index e452bc3..11405f1 100644 --- a/resources/godot_icons/dark/VisualShaderNodeVectorFunc.svg +++ b/resources/godot_icons/dark/VisualShaderNodeVectorFunc.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VisualShaderNodeVectorLen.svg b/resources/godot_icons/dark/VisualShaderNodeVectorLen.svg index dce4890..ad9b51d 100644 --- a/resources/godot_icons/dark/VisualShaderNodeVectorLen.svg +++ b/resources/godot_icons/dark/VisualShaderNodeVectorLen.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VoxelGI.svg b/resources/godot_icons/dark/VoxelGI.svg index 1f22cd8..6cad765 100644 --- a/resources/godot_icons/dark/VoxelGI.svg +++ b/resources/godot_icons/dark/VoxelGI.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/VoxelGIData.svg b/resources/godot_icons/dark/VoxelGIData.svg index 5975115..a4eb174 100644 --- a/resources/godot_icons/dark/VoxelGIData.svg +++ b/resources/godot_icons/dark/VoxelGIData.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/World2D.svg b/resources/godot_icons/dark/World2D.svg index d784836..94d42a2 100644 --- a/resources/godot_icons/dark/World2D.svg +++ b/resources/godot_icons/dark/World2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/World3D.svg b/resources/godot_icons/dark/World3D.svg index acb1083..1e292e2 100644 --- a/resources/godot_icons/dark/World3D.svg +++ b/resources/godot_icons/dark/World3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/WorldBoundaryShape2D.svg b/resources/godot_icons/dark/WorldBoundaryShape2D.svg index 70defbe..34dcbdc 100644 --- a/resources/godot_icons/dark/WorldBoundaryShape2D.svg +++ b/resources/godot_icons/dark/WorldBoundaryShape2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/WorldBoundaryShape3D.svg b/resources/godot_icons/dark/WorldBoundaryShape3D.svg index a73e74a..c7d0495 100644 --- a/resources/godot_icons/dark/WorldBoundaryShape3D.svg +++ b/resources/godot_icons/dark/WorldBoundaryShape3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/WorldEnvironment.svg b/resources/godot_icons/dark/WorldEnvironment.svg index 2df8b2b..c6497ce 100644 --- a/resources/godot_icons/dark/WorldEnvironment.svg +++ b/resources/godot_icons/dark/WorldEnvironment.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/XRAnchor3D.svg b/resources/godot_icons/dark/XRAnchor3D.svg index 0f6282a..83173e6 100644 --- a/resources/godot_icons/dark/XRAnchor3D.svg +++ b/resources/godot_icons/dark/XRAnchor3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/XRCamera3D.svg b/resources/godot_icons/dark/XRCamera3D.svg index 9f9072f..9608bfd 100644 --- a/resources/godot_icons/dark/XRCamera3D.svg +++ b/resources/godot_icons/dark/XRCamera3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/XRController3D.svg b/resources/godot_icons/dark/XRController3D.svg index 9296b11..2bd776b 100644 --- a/resources/godot_icons/dark/XRController3D.svg +++ b/resources/godot_icons/dark/XRController3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/XROrigin3D.svg b/resources/godot_icons/dark/XROrigin3D.svg index dda24e7..178bce2 100644 --- a/resources/godot_icons/dark/XROrigin3D.svg +++ b/resources/godot_icons/dark/XROrigin3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/dark/Zoom.svg b/resources/godot_icons/dark/Zoom.svg new file mode 100644 index 0000000..655636b --- /dev/null +++ b/resources/godot_icons/dark/Zoom.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/ZoomLess.svg b/resources/godot_icons/dark/ZoomLess.svg new file mode 100644 index 0000000..acaadb6 --- /dev/null +++ b/resources/godot_icons/dark/ZoomLess.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/ZoomMore.svg b/resources/godot_icons/dark/ZoomMore.svg new file mode 100644 index 0000000..2327fca --- /dev/null +++ b/resources/godot_icons/dark/ZoomMore.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/dark/ZoomReset.svg b/resources/godot_icons/dark/ZoomReset.svg new file mode 100644 index 0000000..75c9aeb --- /dev/null +++ b/resources/godot_icons/dark/ZoomReset.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/AcceptDialog.svg b/resources/godot_icons/light/AcceptDialog.svg index 35b5b47..c06a51f 100644 --- a/resources/godot_icons/light/AcceptDialog.svg +++ b/resources/godot_icons/light/AcceptDialog.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/AnimatableBody2D.svg b/resources/godot_icons/light/AnimatableBody2D.svg index 49ac80a..0d8eb99 100644 --- a/resources/godot_icons/light/AnimatableBody2D.svg +++ b/resources/godot_icons/light/AnimatableBody2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/AnimatableBody3D.svg b/resources/godot_icons/light/AnimatableBody3D.svg index 7744881..993ac56 100644 --- a/resources/godot_icons/light/AnimatableBody3D.svg +++ b/resources/godot_icons/light/AnimatableBody3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/AnimatedSprite2D.svg b/resources/godot_icons/light/AnimatedSprite2D.svg index ad39f86..2bbeaff 100644 --- a/resources/godot_icons/light/AnimatedSprite2D.svg +++ b/resources/godot_icons/light/AnimatedSprite2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/AnimatedSprite3D.svg b/resources/godot_icons/light/AnimatedSprite3D.svg index ee6c5da..91a15c5 100644 --- a/resources/godot_icons/light/AnimatedSprite3D.svg +++ b/resources/godot_icons/light/AnimatedSprite3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/AnimatedTexture.svg b/resources/godot_icons/light/AnimatedTexture.svg index c7c363e..2a5c896 100644 --- a/resources/godot_icons/light/AnimatedTexture.svg +++ b/resources/godot_icons/light/AnimatedTexture.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Animation.svg b/resources/godot_icons/light/Animation.svg index 52095ee..bfde7bb 100644 --- a/resources/godot_icons/light/Animation.svg +++ b/resources/godot_icons/light/Animation.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/AnimationLibrary.svg b/resources/godot_icons/light/AnimationLibrary.svg index 0aaf38a..c328ef2 100644 --- a/resources/godot_icons/light/AnimationLibrary.svg +++ b/resources/godot_icons/light/AnimationLibrary.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/AnimationPlayer.svg b/resources/godot_icons/light/AnimationPlayer.svg index 38ec45d..13f927f 100644 --- a/resources/godot_icons/light/AnimationPlayer.svg +++ b/resources/godot_icons/light/AnimationPlayer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/AnimationTree.svg b/resources/godot_icons/light/AnimationTree.svg index ea2d4c3..f1fb371 100644 --- a/resources/godot_icons/light/AnimationTree.svg +++ b/resources/godot_icons/light/AnimationTree.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Area2D.svg b/resources/godot_icons/light/Area2D.svg index a5e0837..9e74d92 100644 --- a/resources/godot_icons/light/Area2D.svg +++ b/resources/godot_icons/light/Area2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Area3D.svg b/resources/godot_icons/light/Area3D.svg index a5dd916..79eb41b 100644 --- a/resources/godot_icons/light/Area3D.svg +++ b/resources/godot_icons/light/Area3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/ArrayMesh.svg b/resources/godot_icons/light/ArrayMesh.svg index 2494a51..9e39024 100644 --- a/resources/godot_icons/light/ArrayMesh.svg +++ b/resources/godot_icons/light/ArrayMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/ArrayOccluder3D.svg b/resources/godot_icons/light/ArrayOccluder3D.svg index ac45821..3d18fa0 100644 --- a/resources/godot_icons/light/ArrayOccluder3D.svg +++ b/resources/godot_icons/light/ArrayOccluder3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/ArrowDown.svg b/resources/godot_icons/light/ArrowDown.svg new file mode 100644 index 0000000..5be994e --- /dev/null +++ b/resources/godot_icons/light/ArrowDown.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/ArrowLeft.svg b/resources/godot_icons/light/ArrowLeft.svg new file mode 100644 index 0000000..3d83bc3 --- /dev/null +++ b/resources/godot_icons/light/ArrowLeft.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/ArrowRight.svg b/resources/godot_icons/light/ArrowRight.svg new file mode 100644 index 0000000..9a150e4 --- /dev/null +++ b/resources/godot_icons/light/ArrowRight.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/ArrowUp.svg b/resources/godot_icons/light/ArrowUp.svg new file mode 100644 index 0000000..76febc0 --- /dev/null +++ b/resources/godot_icons/light/ArrowUp.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/AspectRatioContainer.svg b/resources/godot_icons/light/AspectRatioContainer.svg index 868ace9..efe0439 100644 --- a/resources/godot_icons/light/AspectRatioContainer.svg +++ b/resources/godot_icons/light/AspectRatioContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/AtlasTexture.svg b/resources/godot_icons/light/AtlasTexture.svg index d862857..5a10abe 100644 --- a/resources/godot_icons/light/AtlasTexture.svg +++ b/resources/godot_icons/light/AtlasTexture.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/AudioListener2D.svg b/resources/godot_icons/light/AudioListener2D.svg index 3d8d02f..c3d532a 100644 --- a/resources/godot_icons/light/AudioListener2D.svg +++ b/resources/godot_icons/light/AudioListener2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/AudioListener3D.svg b/resources/godot_icons/light/AudioListener3D.svg index 0a5bee5..40da0f1 100644 --- a/resources/godot_icons/light/AudioListener3D.svg +++ b/resources/godot_icons/light/AudioListener3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/AudioStreamPlayer.svg b/resources/godot_icons/light/AudioStreamPlayer.svg index af4c642..216cce7 100644 --- a/resources/godot_icons/light/AudioStreamPlayer.svg +++ b/resources/godot_icons/light/AudioStreamPlayer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/AudioStreamPlayer2D.svg b/resources/godot_icons/light/AudioStreamPlayer2D.svg index 101f180..3015826 100644 --- a/resources/godot_icons/light/AudioStreamPlayer2D.svg +++ b/resources/godot_icons/light/AudioStreamPlayer2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/AudioStreamPlayer3D.svg b/resources/godot_icons/light/AudioStreamPlayer3D.svg index 087f7ea..6cbfefd 100644 --- a/resources/godot_icons/light/AudioStreamPlayer3D.svg +++ b/resources/godot_icons/light/AudioStreamPlayer3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/AudioStreamPolyphonic.svg b/resources/godot_icons/light/AudioStreamPolyphonic.svg new file mode 100644 index 0000000..0e20205 --- /dev/null +++ b/resources/godot_icons/light/AudioStreamPolyphonic.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/AudioStreamWAV.svg b/resources/godot_icons/light/AudioStreamWAV.svg index 2e54de9..bb06b90 100644 --- a/resources/godot_icons/light/AudioStreamWAV.svg +++ b/resources/godot_icons/light/AudioStreamWAV.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Bone2D.svg b/resources/godot_icons/light/Bone2D.svg index 339c51e..d41c4f7 100644 --- a/resources/godot_icons/light/Bone2D.svg +++ b/resources/godot_icons/light/Bone2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/BoneAttachment3D.svg b/resources/godot_icons/light/BoneAttachment3D.svg index a14f2f5..f8ef02f 100644 --- a/resources/godot_icons/light/BoneAttachment3D.svg +++ b/resources/godot_icons/light/BoneAttachment3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/BoxContainer.svg b/resources/godot_icons/light/BoxContainer.svg index d2cf482..fd2b88c 100644 --- a/resources/godot_icons/light/BoxContainer.svg +++ b/resources/godot_icons/light/BoxContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/BoxMesh.svg b/resources/godot_icons/light/BoxMesh.svg index ef2f77a..734f239 100644 --- a/resources/godot_icons/light/BoxMesh.svg +++ b/resources/godot_icons/light/BoxMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/BoxOccluder3D.svg b/resources/godot_icons/light/BoxOccluder3D.svg index 3cee3db..888e9fe 100644 --- a/resources/godot_icons/light/BoxOccluder3D.svg +++ b/resources/godot_icons/light/BoxOccluder3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/BoxShape3D.svg b/resources/godot_icons/light/BoxShape3D.svg index a16f0bb..ba86e08 100644 --- a/resources/godot_icons/light/BoxShape3D.svg +++ b/resources/godot_icons/light/BoxShape3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Button.svg b/resources/godot_icons/light/Button.svg index 5532cbb..a465d2f 100644 --- a/resources/godot_icons/light/Button.svg +++ b/resources/godot_icons/light/Button.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/ButtonGroup.svg b/resources/godot_icons/light/ButtonGroup.svg index 0807dd9..db40a80 100644 --- a/resources/godot_icons/light/ButtonGroup.svg +++ b/resources/godot_icons/light/ButtonGroup.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CPUParticles2D.svg b/resources/godot_icons/light/CPUParticles2D.svg index 7f4683e..798ab69 100644 --- a/resources/godot_icons/light/CPUParticles2D.svg +++ b/resources/godot_icons/light/CPUParticles2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CPUParticles3D.svg b/resources/godot_icons/light/CPUParticles3D.svg index d246bb9..9f9469c 100644 --- a/resources/godot_icons/light/CPUParticles3D.svg +++ b/resources/godot_icons/light/CPUParticles3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CSGBox3D.svg b/resources/godot_icons/light/CSGBox3D.svg index 4a90a7d..7cbd8f5 100644 --- a/resources/godot_icons/light/CSGBox3D.svg +++ b/resources/godot_icons/light/CSGBox3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CSGCombiner3D.svg b/resources/godot_icons/light/CSGCombiner3D.svg index 052c52e..4dbc5b6 100644 --- a/resources/godot_icons/light/CSGCombiner3D.svg +++ b/resources/godot_icons/light/CSGCombiner3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CSGCylinder3D.svg b/resources/godot_icons/light/CSGCylinder3D.svg index bb12d67..c14946a 100644 --- a/resources/godot_icons/light/CSGCylinder3D.svg +++ b/resources/godot_icons/light/CSGCylinder3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CSGMesh3D.svg b/resources/godot_icons/light/CSGMesh3D.svg index f9289f5..b794693 100644 --- a/resources/godot_icons/light/CSGMesh3D.svg +++ b/resources/godot_icons/light/CSGMesh3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CSGPolygon3D.svg b/resources/godot_icons/light/CSGPolygon3D.svg index 34bf574..aa0ff7d 100644 --- a/resources/godot_icons/light/CSGPolygon3D.svg +++ b/resources/godot_icons/light/CSGPolygon3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CSGSphere3D.svg b/resources/godot_icons/light/CSGSphere3D.svg index 6e24285..35ee560 100644 --- a/resources/godot_icons/light/CSGSphere3D.svg +++ b/resources/godot_icons/light/CSGSphere3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CSGTorus3D.svg b/resources/godot_icons/light/CSGTorus3D.svg index fed77ea..171575c 100644 --- a/resources/godot_icons/light/CSGTorus3D.svg +++ b/resources/godot_icons/light/CSGTorus3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CSharpScript.svg b/resources/godot_icons/light/CSharpScript.svg index 34df0ec..07992dc 100644 --- a/resources/godot_icons/light/CSharpScript.svg +++ b/resources/godot_icons/light/CSharpScript.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Camera2D.svg b/resources/godot_icons/light/Camera2D.svg index 73f1850..4b6fc7c 100644 --- a/resources/godot_icons/light/Camera2D.svg +++ b/resources/godot_icons/light/Camera2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Camera3D.svg b/resources/godot_icons/light/Camera3D.svg index a0ff107..85f4f20 100644 --- a/resources/godot_icons/light/Camera3D.svg +++ b/resources/godot_icons/light/Camera3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CameraAttributesPhysical.svg b/resources/godot_icons/light/CameraAttributesPhysical.svg new file mode 100644 index 0000000..a980480 --- /dev/null +++ b/resources/godot_icons/light/CameraAttributesPhysical.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/CameraAttributesPractical.svg b/resources/godot_icons/light/CameraAttributesPractical.svg new file mode 100644 index 0000000..476adaa --- /dev/null +++ b/resources/godot_icons/light/CameraAttributesPractical.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/CameraTexture.svg b/resources/godot_icons/light/CameraTexture.svg index eb05286..8bd6690 100644 --- a/resources/godot_icons/light/CameraTexture.svg +++ b/resources/godot_icons/light/CameraTexture.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CanvasGroup.svg b/resources/godot_icons/light/CanvasGroup.svg index 9294df3..7d93dde 100644 --- a/resources/godot_icons/light/CanvasGroup.svg +++ b/resources/godot_icons/light/CanvasGroup.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CanvasItemMaterial.svg b/resources/godot_icons/light/CanvasItemMaterial.svg index 9a7a894..35f4bbb 100644 --- a/resources/godot_icons/light/CanvasItemMaterial.svg +++ b/resources/godot_icons/light/CanvasItemMaterial.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CanvasLayer.svg b/resources/godot_icons/light/CanvasLayer.svg index aa06eb3..ae07360 100644 --- a/resources/godot_icons/light/CanvasLayer.svg +++ b/resources/godot_icons/light/CanvasLayer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CanvasModulate.svg b/resources/godot_icons/light/CanvasModulate.svg index 5e23bf5..8c6ff3f 100644 --- a/resources/godot_icons/light/CanvasModulate.svg +++ b/resources/godot_icons/light/CanvasModulate.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CanvasTexture.svg b/resources/godot_icons/light/CanvasTexture.svg new file mode 100644 index 0000000..b3f5239 --- /dev/null +++ b/resources/godot_icons/light/CanvasTexture.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/CapsuleMesh.svg b/resources/godot_icons/light/CapsuleMesh.svg index 0bc7814..ad8eea2 100644 --- a/resources/godot_icons/light/CapsuleMesh.svg +++ b/resources/godot_icons/light/CapsuleMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CapsuleShape2D.svg b/resources/godot_icons/light/CapsuleShape2D.svg index 5b3c411..dc1d5b0 100644 --- a/resources/godot_icons/light/CapsuleShape2D.svg +++ b/resources/godot_icons/light/CapsuleShape2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CapsuleShape3D.svg b/resources/godot_icons/light/CapsuleShape3D.svg index c566d68..c8f000e 100644 --- a/resources/godot_icons/light/CapsuleShape3D.svg +++ b/resources/godot_icons/light/CapsuleShape3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CharacterBody2D.svg b/resources/godot_icons/light/CharacterBody2D.svg index 14f7b9d..1bf25a8 100644 --- a/resources/godot_icons/light/CharacterBody2D.svg +++ b/resources/godot_icons/light/CharacterBody2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CharacterBody3D.svg b/resources/godot_icons/light/CharacterBody3D.svg index 81c1085..47348fc 100644 --- a/resources/godot_icons/light/CharacterBody3D.svg +++ b/resources/godot_icons/light/CharacterBody3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CheckBox.svg b/resources/godot_icons/light/CheckBox.svg index 3feed66..c4e3d71 100644 --- a/resources/godot_icons/light/CheckBox.svg +++ b/resources/godot_icons/light/CheckBox.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CircleShape2D.svg b/resources/godot_icons/light/CircleShape2D.svg index 37a0903..da55f1d 100644 --- a/resources/godot_icons/light/CircleShape2D.svg +++ b/resources/godot_icons/light/CircleShape2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CodeEdit.svg b/resources/godot_icons/light/CodeEdit.svg index a6323c3..af82ec6 100644 --- a/resources/godot_icons/light/CodeEdit.svg +++ b/resources/godot_icons/light/CodeEdit.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CodeHighlighter.svg b/resources/godot_icons/light/CodeHighlighter.svg new file mode 100644 index 0000000..5ac077f --- /dev/null +++ b/resources/godot_icons/light/CodeHighlighter.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/CollisionPolygon2D.svg b/resources/godot_icons/light/CollisionPolygon2D.svg index 0a382bc..e59aefb 100644 --- a/resources/godot_icons/light/CollisionPolygon2D.svg +++ b/resources/godot_icons/light/CollisionPolygon2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CollisionPolygon3D.svg b/resources/godot_icons/light/CollisionPolygon3D.svg index e3fe83e..389fb6d 100644 --- a/resources/godot_icons/light/CollisionPolygon3D.svg +++ b/resources/godot_icons/light/CollisionPolygon3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CollisionShape2D.svg b/resources/godot_icons/light/CollisionShape2D.svg index dc13dd2..3223f91 100644 --- a/resources/godot_icons/light/CollisionShape2D.svg +++ b/resources/godot_icons/light/CollisionShape2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CollisionShape3D.svg b/resources/godot_icons/light/CollisionShape3D.svg index 9012123..7ec34db 100644 --- a/resources/godot_icons/light/CollisionShape3D.svg +++ b/resources/godot_icons/light/CollisionShape3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/ColorPicker.svg b/resources/godot_icons/light/ColorPicker.svg index 37d81eb..0cddd3e 100644 --- a/resources/godot_icons/light/ColorPicker.svg +++ b/resources/godot_icons/light/ColorPicker.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/ColorPickerButton.svg b/resources/godot_icons/light/ColorPickerButton.svg index ea65e63..b1463e2 100644 --- a/resources/godot_icons/light/ColorPickerButton.svg +++ b/resources/godot_icons/light/ColorPickerButton.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/ColorRect.svg b/resources/godot_icons/light/ColorRect.svg index 8a60f19..f7c412c 100644 --- a/resources/godot_icons/light/ColorRect.svg +++ b/resources/godot_icons/light/ColorRect.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CompressedTexture2D.svg b/resources/godot_icons/light/CompressedTexture2D.svg index dafbd4f..079de58 100644 --- a/resources/godot_icons/light/CompressedTexture2D.svg +++ b/resources/godot_icons/light/CompressedTexture2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CompressedTexture3D.svg b/resources/godot_icons/light/CompressedTexture3D.svg new file mode 100644 index 0000000..ebe2a4e --- /dev/null +++ b/resources/godot_icons/light/CompressedTexture3D.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/ConcavePolygonShape2D.svg b/resources/godot_icons/light/ConcavePolygonShape2D.svg index 26eda84..cb5d98c 100644 --- a/resources/godot_icons/light/ConcavePolygonShape2D.svg +++ b/resources/godot_icons/light/ConcavePolygonShape2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/ConcavePolygonShape3D.svg b/resources/godot_icons/light/ConcavePolygonShape3D.svg index 67631ec..d970a16 100644 --- a/resources/godot_icons/light/ConcavePolygonShape3D.svg +++ b/resources/godot_icons/light/ConcavePolygonShape3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/ConeTwistJoint3D.svg b/resources/godot_icons/light/ConeTwistJoint3D.svg index 0ad0481..42d63ec 100644 --- a/resources/godot_icons/light/ConeTwistJoint3D.svg +++ b/resources/godot_icons/light/ConeTwistJoint3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/ConfirmationDialog.svg b/resources/godot_icons/light/ConfirmationDialog.svg index 58e658e..1c5e6a3 100644 --- a/resources/godot_icons/light/ConfirmationDialog.svg +++ b/resources/godot_icons/light/ConfirmationDialog.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Container.svg b/resources/godot_icons/light/Container.svg index 00c49cc..55d56f8 100644 --- a/resources/godot_icons/light/Container.svg +++ b/resources/godot_icons/light/Container.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Control.svg b/resources/godot_icons/light/Control.svg index 86ab859..8e24219 100644 --- a/resources/godot_icons/light/Control.svg +++ b/resources/godot_icons/light/Control.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/ConvexPolygonShape2D.svg b/resources/godot_icons/light/ConvexPolygonShape2D.svg index fa5369a..2324919 100644 --- a/resources/godot_icons/light/ConvexPolygonShape2D.svg +++ b/resources/godot_icons/light/ConvexPolygonShape2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/ConvexPolygonShape3D.svg b/resources/godot_icons/light/ConvexPolygonShape3D.svg index f0c9101..09c5ee9 100644 --- a/resources/godot_icons/light/ConvexPolygonShape3D.svg +++ b/resources/godot_icons/light/ConvexPolygonShape3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Curve.svg b/resources/godot_icons/light/Curve.svg index 62b5711..03c5ed5 100644 --- a/resources/godot_icons/light/Curve.svg +++ b/resources/godot_icons/light/Curve.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Curve2D.svg b/resources/godot_icons/light/Curve2D.svg index 0dcba50..1b0c321 100644 --- a/resources/godot_icons/light/Curve2D.svg +++ b/resources/godot_icons/light/Curve2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Curve3D.svg b/resources/godot_icons/light/Curve3D.svg index 0f0e29e..3661d7d 100644 --- a/resources/godot_icons/light/Curve3D.svg +++ b/resources/godot_icons/light/Curve3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CurveTexture.svg b/resources/godot_icons/light/CurveTexture.svg index 8e1d8d1..5aecd63 100644 --- a/resources/godot_icons/light/CurveTexture.svg +++ b/resources/godot_icons/light/CurveTexture.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CurveXYZTexture.svg b/resources/godot_icons/light/CurveXYZTexture.svg new file mode 100644 index 0000000..dc2bd86 --- /dev/null +++ b/resources/godot_icons/light/CurveXYZTexture.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/CylinderMesh.svg b/resources/godot_icons/light/CylinderMesh.svg index f6315c2..9d0045a 100644 --- a/resources/godot_icons/light/CylinderMesh.svg +++ b/resources/godot_icons/light/CylinderMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/CylinderShape3D.svg b/resources/godot_icons/light/CylinderShape3D.svg index 1283097..a70a760 100644 --- a/resources/godot_icons/light/CylinderShape3D.svg +++ b/resources/godot_icons/light/CylinderShape3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/DampedSpringJoint2D.svg b/resources/godot_icons/light/DampedSpringJoint2D.svg index fe2d32e..3601ac9 100644 --- a/resources/godot_icons/light/DampedSpringJoint2D.svg +++ b/resources/godot_icons/light/DampedSpringJoint2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Decal.svg b/resources/godot_icons/light/Decal.svg index 5fcca3e..bddfec4 100644 --- a/resources/godot_icons/light/Decal.svg +++ b/resources/godot_icons/light/Decal.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/DirectionalLight2D.svg b/resources/godot_icons/light/DirectionalLight2D.svg index e29ee19..eec5ce3 100644 --- a/resources/godot_icons/light/DirectionalLight2D.svg +++ b/resources/godot_icons/light/DirectionalLight2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/DirectionalLight3D.svg b/resources/godot_icons/light/DirectionalLight3D.svg index f648951..139718e 100644 --- a/resources/godot_icons/light/DirectionalLight3D.svg +++ b/resources/godot_icons/light/DirectionalLight3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Edit.svg b/resources/godot_icons/light/Edit.svg new file mode 100644 index 0000000..7ae4d03 --- /dev/null +++ b/resources/godot_icons/light/Edit.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/Environment.svg b/resources/godot_icons/light/Environment.svg index 5e195a9..cf634fc 100644 --- a/resources/godot_icons/light/Environment.svg +++ b/resources/godot_icons/light/Environment.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/FileDialog.svg b/resources/godot_icons/light/FileDialog.svg index 59246e6..086ac35 100644 --- a/resources/godot_icons/light/FileDialog.svg +++ b/resources/godot_icons/light/FileDialog.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/FlowContainer.svg b/resources/godot_icons/light/FlowContainer.svg index ada32b0..ac79f76 100644 --- a/resources/godot_icons/light/FlowContainer.svg +++ b/resources/godot_icons/light/FlowContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/FogMaterial.svg b/resources/godot_icons/light/FogMaterial.svg index 5db7dea..5fb9951 100644 --- a/resources/godot_icons/light/FogMaterial.svg +++ b/resources/godot_icons/light/FogMaterial.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/FogVolume.svg b/resources/godot_icons/light/FogVolume.svg index a98742f..96cdfc2 100644 --- a/resources/godot_icons/light/FogVolume.svg +++ b/resources/godot_icons/light/FogVolume.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/FontFile.svg b/resources/godot_icons/light/FontFile.svg index e9595e9..33a7363 100644 --- a/resources/godot_icons/light/FontFile.svg +++ b/resources/godot_icons/light/FontFile.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/FontVariation.svg b/resources/godot_icons/light/FontVariation.svg index 119e354..d9c2e4a 100644 --- a/resources/godot_icons/light/FontVariation.svg +++ b/resources/godot_icons/light/FontVariation.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/GDScript.svg b/resources/godot_icons/light/GDScript.svg index 5407eb4..c6a0835 100644 --- a/resources/godot_icons/light/GDScript.svg +++ b/resources/godot_icons/light/GDScript.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/GPUParticles2D.svg b/resources/godot_icons/light/GPUParticles2D.svg index 70707e9..855f1bf 100644 --- a/resources/godot_icons/light/GPUParticles2D.svg +++ b/resources/godot_icons/light/GPUParticles2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/GPUParticles3D.svg b/resources/godot_icons/light/GPUParticles3D.svg index 00d8335..5253cf3 100644 --- a/resources/godot_icons/light/GPUParticles3D.svg +++ b/resources/godot_icons/light/GPUParticles3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/GPUParticlesAttractorBox3D.svg b/resources/godot_icons/light/GPUParticlesAttractorBox3D.svg index 0a4ff11..4ba807c 100644 --- a/resources/godot_icons/light/GPUParticlesAttractorBox3D.svg +++ b/resources/godot_icons/light/GPUParticlesAttractorBox3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/GPUParticlesAttractorSphere3D.svg b/resources/godot_icons/light/GPUParticlesAttractorSphere3D.svg index a4fe432..bcaa50e 100644 --- a/resources/godot_icons/light/GPUParticlesAttractorSphere3D.svg +++ b/resources/godot_icons/light/GPUParticlesAttractorSphere3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/GPUParticlesAttractorVectorField3D.svg b/resources/godot_icons/light/GPUParticlesAttractorVectorField3D.svg index fd95329..b803c90 100644 --- a/resources/godot_icons/light/GPUParticlesAttractorVectorField3D.svg +++ b/resources/godot_icons/light/GPUParticlesAttractorVectorField3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/GPUParticlesCollisionBox3D.svg b/resources/godot_icons/light/GPUParticlesCollisionBox3D.svg index 7148f4d..3c44ee2 100644 --- a/resources/godot_icons/light/GPUParticlesCollisionBox3D.svg +++ b/resources/godot_icons/light/GPUParticlesCollisionBox3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/GPUParticlesCollisionSDF3D.svg b/resources/godot_icons/light/GPUParticlesCollisionSDF3D.svg index fb85e0f..58dda79 100644 --- a/resources/godot_icons/light/GPUParticlesCollisionSDF3D.svg +++ b/resources/godot_icons/light/GPUParticlesCollisionSDF3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/GPUParticlesCollisionSphere3D.svg b/resources/godot_icons/light/GPUParticlesCollisionSphere3D.svg index 8ae3113..f845e91 100644 --- a/resources/godot_icons/light/GPUParticlesCollisionSphere3D.svg +++ b/resources/godot_icons/light/GPUParticlesCollisionSphere3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Generic6DOFJoint3D.svg b/resources/godot_icons/light/Generic6DOFJoint3D.svg index 73d45d8..5795003 100644 --- a/resources/godot_icons/light/Generic6DOFJoint3D.svg +++ b/resources/godot_icons/light/Generic6DOFJoint3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Gradient.svg b/resources/godot_icons/light/Gradient.svg index b9996e4..62044fb 100644 --- a/resources/godot_icons/light/Gradient.svg +++ b/resources/godot_icons/light/Gradient.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/GradientTexture1D.svg b/resources/godot_icons/light/GradientTexture1D.svg index c269e82..078bd18 100644 --- a/resources/godot_icons/light/GradientTexture1D.svg +++ b/resources/godot_icons/light/GradientTexture1D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/GradientTexture2D.svg b/resources/godot_icons/light/GradientTexture2D.svg index 4b18cd3..0bc5e42 100644 --- a/resources/godot_icons/light/GradientTexture2D.svg +++ b/resources/godot_icons/light/GradientTexture2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/GraphEdit.svg b/resources/godot_icons/light/GraphEdit.svg index 8330c13..b7d4d18 100644 --- a/resources/godot_icons/light/GraphEdit.svg +++ b/resources/godot_icons/light/GraphEdit.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/GraphElement.svg b/resources/godot_icons/light/GraphElement.svg new file mode 100644 index 0000000..995e6b5 --- /dev/null +++ b/resources/godot_icons/light/GraphElement.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/GraphNode.svg b/resources/godot_icons/light/GraphNode.svg index 22d4645..493fa0c 100644 --- a/resources/godot_icons/light/GraphNode.svg +++ b/resources/godot_icons/light/GraphNode.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/GridContainer.svg b/resources/godot_icons/light/GridContainer.svg index 9297f98..fe284fc 100644 --- a/resources/godot_icons/light/GridContainer.svg +++ b/resources/godot_icons/light/GridContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/GridMap.svg b/resources/godot_icons/light/GridMap.svg index 2b0694f..50a7518 100644 --- a/resources/godot_icons/light/GridMap.svg +++ b/resources/godot_icons/light/GridMap.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/GrooveJoint2D.svg b/resources/godot_icons/light/GrooveJoint2D.svg index 2b5280e..9545bbd 100644 --- a/resources/godot_icons/light/GrooveJoint2D.svg +++ b/resources/godot_icons/light/GrooveJoint2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/GuiVisibilityHidden.svg b/resources/godot_icons/light/GuiVisibilityHidden.svg new file mode 100644 index 0000000..7d323fb --- /dev/null +++ b/resources/godot_icons/light/GuiVisibilityHidden.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/GuiVisibilityVisible.svg b/resources/godot_icons/light/GuiVisibilityVisible.svg new file mode 100644 index 0000000..335149f --- /dev/null +++ b/resources/godot_icons/light/GuiVisibilityVisible.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/GuiVisibilityXray.svg b/resources/godot_icons/light/GuiVisibilityXray.svg new file mode 100644 index 0000000..a88f617 --- /dev/null +++ b/resources/godot_icons/light/GuiVisibilityXray.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/HBoxContainer.svg b/resources/godot_icons/light/HBoxContainer.svg index 5e9f116..49d1f3c 100644 --- a/resources/godot_icons/light/HBoxContainer.svg +++ b/resources/godot_icons/light/HBoxContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/HFlowContainer.svg b/resources/godot_icons/light/HFlowContainer.svg index 573c063..757c119 100644 --- a/resources/godot_icons/light/HFlowContainer.svg +++ b/resources/godot_icons/light/HFlowContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/HScrollBar.svg b/resources/godot_icons/light/HScrollBar.svg index ba7f9e2..53662f4 100644 --- a/resources/godot_icons/light/HScrollBar.svg +++ b/resources/godot_icons/light/HScrollBar.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/HSeparator.svg b/resources/godot_icons/light/HSeparator.svg index 9dfc724..3e8df20 100644 --- a/resources/godot_icons/light/HSeparator.svg +++ b/resources/godot_icons/light/HSeparator.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/HSlider.svg b/resources/godot_icons/light/HSlider.svg index c02391f..ee54917 100644 --- a/resources/godot_icons/light/HSlider.svg +++ b/resources/godot_icons/light/HSlider.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/HSplitContainer.svg b/resources/godot_icons/light/HSplitContainer.svg index 3558bc8..24bd682 100644 --- a/resources/godot_icons/light/HSplitContainer.svg +++ b/resources/godot_icons/light/HSplitContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/HeightMapShape3D.svg b/resources/godot_icons/light/HeightMapShape3D.svg index e1b3af8..330cee9 100644 --- a/resources/godot_icons/light/HeightMapShape3D.svg +++ b/resources/godot_icons/light/HeightMapShape3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Help.svg b/resources/godot_icons/light/Help.svg new file mode 100644 index 0000000..40dd7aa --- /dev/null +++ b/resources/godot_icons/light/Help.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/HelpSearch.svg b/resources/godot_icons/light/HelpSearch.svg new file mode 100644 index 0000000..8366ec4 --- /dev/null +++ b/resources/godot_icons/light/HelpSearch.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/HingeJoint3D.svg b/resources/godot_icons/light/HingeJoint3D.svg index 200cf43..1ff5099 100644 --- a/resources/godot_icons/light/HingeJoint3D.svg +++ b/resources/godot_icons/light/HingeJoint3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/ImageTexture.svg b/resources/godot_icons/light/ImageTexture.svg index e5d93f3..ee80559 100644 --- a/resources/godot_icons/light/ImageTexture.svg +++ b/resources/godot_icons/light/ImageTexture.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/ImageTexture3D.svg b/resources/godot_icons/light/ImageTexture3D.svg new file mode 100644 index 0000000..1c65636 --- /dev/null +++ b/resources/godot_icons/light/ImageTexture3D.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/ImmediateMesh.svg b/resources/godot_icons/light/ImmediateMesh.svg index f94ef8c..ceedc00 100644 --- a/resources/godot_icons/light/ImmediateMesh.svg +++ b/resources/godot_icons/light/ImmediateMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/ImportCheck.svg b/resources/godot_icons/light/ImportCheck.svg new file mode 100644 index 0000000..83668e3 --- /dev/null +++ b/resources/godot_icons/light/ImportCheck.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/ImportFail.svg b/resources/godot_icons/light/ImportFail.svg new file mode 100644 index 0000000..7343408 --- /dev/null +++ b/resources/godot_icons/light/ImportFail.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/ImporterMeshInstance3D.svg b/resources/godot_icons/light/ImporterMeshInstance3D.svg index 1937769..17c3a57 100644 --- a/resources/godot_icons/light/ImporterMeshInstance3D.svg +++ b/resources/godot_icons/light/ImporterMeshInstance3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Info.svg b/resources/godot_icons/light/Info.svg new file mode 100644 index 0000000..8773a66 --- /dev/null +++ b/resources/godot_icons/light/Info.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/ItemList.svg b/resources/godot_icons/light/ItemList.svg index acd21f3..07293b8 100644 --- a/resources/godot_icons/light/ItemList.svg +++ b/resources/godot_icons/light/ItemList.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Label.svg b/resources/godot_icons/light/Label.svg index 718f76c..bfa902e 100644 --- a/resources/godot_icons/light/Label.svg +++ b/resources/godot_icons/light/Label.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Label3D.svg b/resources/godot_icons/light/Label3D.svg index 0324b1b..cfb1b73 100644 --- a/resources/godot_icons/light/Label3D.svg +++ b/resources/godot_icons/light/Label3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/LabelSettings.svg b/resources/godot_icons/light/LabelSettings.svg index 2695248..b7e2679 100644 --- a/resources/godot_icons/light/LabelSettings.svg +++ b/resources/godot_icons/light/LabelSettings.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/LightOccluder2D.svg b/resources/godot_icons/light/LightOccluder2D.svg index 2a42087..655396b 100644 --- a/resources/godot_icons/light/LightOccluder2D.svg +++ b/resources/godot_icons/light/LightOccluder2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/LightmapProbe.svg b/resources/godot_icons/light/LightmapProbe.svg index bc32b4f..c690c25 100644 --- a/resources/godot_icons/light/LightmapProbe.svg +++ b/resources/godot_icons/light/LightmapProbe.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Line2D.svg b/resources/godot_icons/light/Line2D.svg index 17dc2aa..797607d 100644 --- a/resources/godot_icons/light/Line2D.svg +++ b/resources/godot_icons/light/Line2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/LineEdit.svg b/resources/godot_icons/light/LineEdit.svg index 2868ab7..e84ef1d 100644 --- a/resources/godot_icons/light/LineEdit.svg +++ b/resources/godot_icons/light/LineEdit.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/LinkButton.svg b/resources/godot_icons/light/LinkButton.svg index 6f05e80..c912c65 100644 --- a/resources/godot_icons/light/LinkButton.svg +++ b/resources/godot_icons/light/LinkButton.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Lock.svg b/resources/godot_icons/light/Lock.svg new file mode 100644 index 0000000..17e4565 --- /dev/null +++ b/resources/godot_icons/light/Lock.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/MarginContainer.svg b/resources/godot_icons/light/MarginContainer.svg index a7f095a..5ef6000 100644 --- a/resources/godot_icons/light/MarginContainer.svg +++ b/resources/godot_icons/light/MarginContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/MeshInstance2D.svg b/resources/godot_icons/light/MeshInstance2D.svg index cada502..26f48bb 100644 --- a/resources/godot_icons/light/MeshInstance2D.svg +++ b/resources/godot_icons/light/MeshInstance2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/MeshInstance3D.svg b/resources/godot_icons/light/MeshInstance3D.svg index 166674c..19128bb 100644 --- a/resources/godot_icons/light/MeshInstance3D.svg +++ b/resources/godot_icons/light/MeshInstance3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/MeshLibrary.svg b/resources/godot_icons/light/MeshLibrary.svg index 5d64acd..62a2b3e 100644 --- a/resources/godot_icons/light/MeshLibrary.svg +++ b/resources/godot_icons/light/MeshLibrary.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/MeshTexture.svg b/resources/godot_icons/light/MeshTexture.svg index d91933b..0da5518 100644 --- a/resources/godot_icons/light/MeshTexture.svg +++ b/resources/godot_icons/light/MeshTexture.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/MultiMesh.svg b/resources/godot_icons/light/MultiMesh.svg index 5b49008..23c26c7 100644 --- a/resources/godot_icons/light/MultiMesh.svg +++ b/resources/godot_icons/light/MultiMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/MultiMeshInstance2D.svg b/resources/godot_icons/light/MultiMeshInstance2D.svg index 0bb3a1f..59c37aa 100644 --- a/resources/godot_icons/light/MultiMeshInstance2D.svg +++ b/resources/godot_icons/light/MultiMeshInstance2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/MultiMeshInstance3D.svg b/resources/godot_icons/light/MultiMeshInstance3D.svg index 630bd74..238c609 100644 --- a/resources/godot_icons/light/MultiMeshInstance3D.svg +++ b/resources/godot_icons/light/MultiMeshInstance3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/NavigationAgent2D.svg b/resources/godot_icons/light/NavigationAgent2D.svg index 5e146d6..7c5d281 100644 --- a/resources/godot_icons/light/NavigationAgent2D.svg +++ b/resources/godot_icons/light/NavigationAgent2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/NavigationAgent3D.svg b/resources/godot_icons/light/NavigationAgent3D.svg index 423a038..9563eb1 100644 --- a/resources/godot_icons/light/NavigationAgent3D.svg +++ b/resources/godot_icons/light/NavigationAgent3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/NavigationLink2D.svg b/resources/godot_icons/light/NavigationLink2D.svg index df470ec..483b332 100644 --- a/resources/godot_icons/light/NavigationLink2D.svg +++ b/resources/godot_icons/light/NavigationLink2D.svg @@ -1,4 +1 @@ - - - - + diff --git a/resources/godot_icons/light/NavigationLink3D.svg b/resources/godot_icons/light/NavigationLink3D.svg index 05f36da..63faa56 100644 --- a/resources/godot_icons/light/NavigationLink3D.svg +++ b/resources/godot_icons/light/NavigationLink3D.svg @@ -1,4 +1 @@ - - - - + diff --git a/resources/godot_icons/light/NavigationObstacle2D.svg b/resources/godot_icons/light/NavigationObstacle2D.svg index 58331b5..44d45e0 100644 --- a/resources/godot_icons/light/NavigationObstacle2D.svg +++ b/resources/godot_icons/light/NavigationObstacle2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/NavigationObstacle3D.svg b/resources/godot_icons/light/NavigationObstacle3D.svg index 8bcce21..6383d35 100644 --- a/resources/godot_icons/light/NavigationObstacle3D.svg +++ b/resources/godot_icons/light/NavigationObstacle3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/NavigationPolygon.svg b/resources/godot_icons/light/NavigationPolygon.svg index b525e6a..fc15da0 100644 --- a/resources/godot_icons/light/NavigationPolygon.svg +++ b/resources/godot_icons/light/NavigationPolygon.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/NavigationRegion2D.svg b/resources/godot_icons/light/NavigationRegion2D.svg index b4db666..10e3fbe 100644 --- a/resources/godot_icons/light/NavigationRegion2D.svg +++ b/resources/godot_icons/light/NavigationRegion2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/NavigationRegion3D.svg b/resources/godot_icons/light/NavigationRegion3D.svg index 388394a..a66f4e2 100644 --- a/resources/godot_icons/light/NavigationRegion3D.svg +++ b/resources/godot_icons/light/NavigationRegion3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/NinePatchRect.svg b/resources/godot_icons/light/NinePatchRect.svg index a034283..0166565 100644 --- a/resources/godot_icons/light/NinePatchRect.svg +++ b/resources/godot_icons/light/NinePatchRect.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Node.svg b/resources/godot_icons/light/Node.svg index a0cde6c..87e7b05 100644 --- a/resources/godot_icons/light/Node.svg +++ b/resources/godot_icons/light/Node.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Node2D.svg b/resources/godot_icons/light/Node2D.svg index a3a004a..ff0f1d9 100644 --- a/resources/godot_icons/light/Node2D.svg +++ b/resources/godot_icons/light/Node2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Node3D.svg b/resources/godot_icons/light/Node3D.svg index 6183d9e..4c665d0 100644 --- a/resources/godot_icons/light/Node3D.svg +++ b/resources/godot_icons/light/Node3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/NoiseTexture2D.svg b/resources/godot_icons/light/NoiseTexture2D.svg new file mode 100644 index 0000000..2fcdb2b --- /dev/null +++ b/resources/godot_icons/light/NoiseTexture2D.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/NoiseTexture3D.svg b/resources/godot_icons/light/NoiseTexture3D.svg new file mode 100644 index 0000000..4b7529d --- /dev/null +++ b/resources/godot_icons/light/NoiseTexture3D.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/ORMMaterial3D.svg b/resources/godot_icons/light/ORMMaterial3D.svg index e092081..a70c44f 100644 --- a/resources/godot_icons/light/ORMMaterial3D.svg +++ b/resources/godot_icons/light/ORMMaterial3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Object.svg b/resources/godot_icons/light/Object.svg index e87ef4b..972d3d9 100644 --- a/resources/godot_icons/light/Object.svg +++ b/resources/godot_icons/light/Object.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/OccluderInstance3D.svg b/resources/godot_icons/light/OccluderInstance3D.svg index 68ac1ea..dd7663c 100644 --- a/resources/godot_icons/light/OccluderInstance3D.svg +++ b/resources/godot_icons/light/OccluderInstance3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/OccluderPolygon2D.svg b/resources/godot_icons/light/OccluderPolygon2D.svg index 21662d0..cd9acde 100644 --- a/resources/godot_icons/light/OccluderPolygon2D.svg +++ b/resources/godot_icons/light/OccluderPolygon2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/OmniLight3D.svg b/resources/godot_icons/light/OmniLight3D.svg index 4f95a5d..cc28159 100644 --- a/resources/godot_icons/light/OmniLight3D.svg +++ b/resources/godot_icons/light/OmniLight3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/OptionButton.svg b/resources/godot_icons/light/OptionButton.svg index f90ea34..8b1c1b3 100644 --- a/resources/godot_icons/light/OptionButton.svg +++ b/resources/godot_icons/light/OptionButton.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/PackedScene.svg b/resources/godot_icons/light/PackedScene.svg index 67f3250..fc1a257 100644 --- a/resources/godot_icons/light/PackedScene.svg +++ b/resources/godot_icons/light/PackedScene.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Panel.svg b/resources/godot_icons/light/Panel.svg index aeda1bb..4868947 100644 --- a/resources/godot_icons/light/Panel.svg +++ b/resources/godot_icons/light/Panel.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/PanelContainer.svg b/resources/godot_icons/light/PanelContainer.svg index 320ce60..f234285 100644 --- a/resources/godot_icons/light/PanelContainer.svg +++ b/resources/godot_icons/light/PanelContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/PanoramaSkyMaterial.svg b/resources/godot_icons/light/PanoramaSkyMaterial.svg index eddcbfd..d230ba5 100644 --- a/resources/godot_icons/light/PanoramaSkyMaterial.svg +++ b/resources/godot_icons/light/PanoramaSkyMaterial.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/ParallaxBackground.svg b/resources/godot_icons/light/ParallaxBackground.svg index f3485ea..4f68563 100644 --- a/resources/godot_icons/light/ParallaxBackground.svg +++ b/resources/godot_icons/light/ParallaxBackground.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/ParallaxLayer.svg b/resources/godot_icons/light/ParallaxLayer.svg index 81912b9..a683f64 100644 --- a/resources/godot_icons/light/ParallaxLayer.svg +++ b/resources/godot_icons/light/ParallaxLayer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/ParticleProcessMaterial.svg b/resources/godot_icons/light/ParticleProcessMaterial.svg index 3359898..530c459 100644 --- a/resources/godot_icons/light/ParticleProcessMaterial.svg +++ b/resources/godot_icons/light/ParticleProcessMaterial.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Path2D.svg b/resources/godot_icons/light/Path2D.svg index 569ad85..8503957 100644 --- a/resources/godot_icons/light/Path2D.svg +++ b/resources/godot_icons/light/Path2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Path3D.svg b/resources/godot_icons/light/Path3D.svg index a35b717..1e7cdf6 100644 --- a/resources/godot_icons/light/Path3D.svg +++ b/resources/godot_icons/light/Path3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/PathFollow2D.svg b/resources/godot_icons/light/PathFollow2D.svg index 4a279b2..a0f093d 100644 --- a/resources/godot_icons/light/PathFollow2D.svg +++ b/resources/godot_icons/light/PathFollow2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/PathFollow3D.svg b/resources/godot_icons/light/PathFollow3D.svg index 1ea019c..cdd0cc9 100644 --- a/resources/godot_icons/light/PathFollow3D.svg +++ b/resources/godot_icons/light/PathFollow3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/PhysicalBone2D.svg b/resources/godot_icons/light/PhysicalBone2D.svg new file mode 100644 index 0000000..e2cc3d8 --- /dev/null +++ b/resources/godot_icons/light/PhysicalBone2D.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/PhysicalBone3D.svg b/resources/godot_icons/light/PhysicalBone3D.svg index 57abd40..921341f 100644 --- a/resources/godot_icons/light/PhysicalBone3D.svg +++ b/resources/godot_icons/light/PhysicalBone3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/PhysicalSkyMaterial.svg b/resources/godot_icons/light/PhysicalSkyMaterial.svg index a32b451..48763a5 100644 --- a/resources/godot_icons/light/PhysicalSkyMaterial.svg +++ b/resources/godot_icons/light/PhysicalSkyMaterial.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/PinJoint2D.svg b/resources/godot_icons/light/PinJoint2D.svg index ddb1d70..9013627 100644 --- a/resources/godot_icons/light/PinJoint2D.svg +++ b/resources/godot_icons/light/PinJoint2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/PinJoint3D.svg b/resources/godot_icons/light/PinJoint3D.svg index 1edb877..9f46490 100644 --- a/resources/godot_icons/light/PinJoint3D.svg +++ b/resources/godot_icons/light/PinJoint3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/PlaceholderMaterial.svg b/resources/godot_icons/light/PlaceholderMaterial.svg new file mode 100644 index 0000000..3b5a803 --- /dev/null +++ b/resources/godot_icons/light/PlaceholderMaterial.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/PlaceholderMesh.svg b/resources/godot_icons/light/PlaceholderMesh.svg new file mode 100644 index 0000000..c36156e --- /dev/null +++ b/resources/godot_icons/light/PlaceholderMesh.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/PlaceholderTexture2D.svg b/resources/godot_icons/light/PlaceholderTexture2D.svg new file mode 100644 index 0000000..f77c5ae --- /dev/null +++ b/resources/godot_icons/light/PlaceholderTexture2D.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/PlaceholderTexture3D.svg b/resources/godot_icons/light/PlaceholderTexture3D.svg new file mode 100644 index 0000000..42a1832 --- /dev/null +++ b/resources/godot_icons/light/PlaceholderTexture3D.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/PlaneMesh.svg b/resources/godot_icons/light/PlaneMesh.svg index 54b3361..857583d 100644 --- a/resources/godot_icons/light/PlaneMesh.svg +++ b/resources/godot_icons/light/PlaneMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Play.svg b/resources/godot_icons/light/Play.svg new file mode 100644 index 0000000..5662730 --- /dev/null +++ b/resources/godot_icons/light/Play.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/PlayBackwards.svg b/resources/godot_icons/light/PlayBackwards.svg new file mode 100644 index 0000000..41fd32a --- /dev/null +++ b/resources/godot_icons/light/PlayBackwards.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/PlayCustom.svg b/resources/godot_icons/light/PlayCustom.svg new file mode 100644 index 0000000..654c206 --- /dev/null +++ b/resources/godot_icons/light/PlayCustom.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/PlayRemote.svg b/resources/godot_icons/light/PlayRemote.svg new file mode 100644 index 0000000..3456cec --- /dev/null +++ b/resources/godot_icons/light/PlayRemote.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/PlayScene.svg b/resources/godot_icons/light/PlayScene.svg new file mode 100644 index 0000000..3e43368 --- /dev/null +++ b/resources/godot_icons/light/PlayScene.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/PlayStart.svg b/resources/godot_icons/light/PlayStart.svg new file mode 100644 index 0000000..19666f1 --- /dev/null +++ b/resources/godot_icons/light/PlayStart.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/PointLight2D.svg b/resources/godot_icons/light/PointLight2D.svg index f51b3c8..40d3b6f 100644 --- a/resources/godot_icons/light/PointLight2D.svg +++ b/resources/godot_icons/light/PointLight2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/PointMesh.svg b/resources/godot_icons/light/PointMesh.svg index ec04989..2cafedc 100644 --- a/resources/godot_icons/light/PointMesh.svg +++ b/resources/godot_icons/light/PointMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Polygon2D.svg b/resources/godot_icons/light/Polygon2D.svg index 182623b..d87b0c0 100644 --- a/resources/godot_icons/light/Polygon2D.svg +++ b/resources/godot_icons/light/Polygon2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/PolygonOccluder3D.svg b/resources/godot_icons/light/PolygonOccluder3D.svg index fc87e5e..f4cbec0 100644 --- a/resources/godot_icons/light/PolygonOccluder3D.svg +++ b/resources/godot_icons/light/PolygonOccluder3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/PolygonPathFinder.svg b/resources/godot_icons/light/PolygonPathFinder.svg index 3225006..a3b1540 100644 --- a/resources/godot_icons/light/PolygonPathFinder.svg +++ b/resources/godot_icons/light/PolygonPathFinder.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Popup.svg b/resources/godot_icons/light/Popup.svg index 76897b3..739802f 100644 --- a/resources/godot_icons/light/Popup.svg +++ b/resources/godot_icons/light/Popup.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/PortableCompressedTexture2D.svg b/resources/godot_icons/light/PortableCompressedTexture2D.svg new file mode 100644 index 0000000..b8e5421 --- /dev/null +++ b/resources/godot_icons/light/PortableCompressedTexture2D.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/PrismMesh.svg b/resources/godot_icons/light/PrismMesh.svg index 0fd169c..6481b26 100644 --- a/resources/godot_icons/light/PrismMesh.svg +++ b/resources/godot_icons/light/PrismMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/ProceduralSkyMaterial.svg b/resources/godot_icons/light/ProceduralSkyMaterial.svg index ceaf56d..87d61de 100644 --- a/resources/godot_icons/light/ProceduralSkyMaterial.svg +++ b/resources/godot_icons/light/ProceduralSkyMaterial.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Progress1.svg b/resources/godot_icons/light/Progress1.svg new file mode 100644 index 0000000..1eff9a7 --- /dev/null +++ b/resources/godot_icons/light/Progress1.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/Progress2.svg b/resources/godot_icons/light/Progress2.svg new file mode 100644 index 0000000..cc40810 --- /dev/null +++ b/resources/godot_icons/light/Progress2.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/Progress3.svg b/resources/godot_icons/light/Progress3.svg new file mode 100644 index 0000000..bfa3b47 --- /dev/null +++ b/resources/godot_icons/light/Progress3.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/Progress4.svg b/resources/godot_icons/light/Progress4.svg new file mode 100644 index 0000000..b53bacf --- /dev/null +++ b/resources/godot_icons/light/Progress4.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/Progress5.svg b/resources/godot_icons/light/Progress5.svg new file mode 100644 index 0000000..a34be81 --- /dev/null +++ b/resources/godot_icons/light/Progress5.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/Progress6.svg b/resources/godot_icons/light/Progress6.svg new file mode 100644 index 0000000..8f223b1 --- /dev/null +++ b/resources/godot_icons/light/Progress6.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/Progress7.svg b/resources/godot_icons/light/Progress7.svg new file mode 100644 index 0000000..17abb3b --- /dev/null +++ b/resources/godot_icons/light/Progress7.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/Progress8.svg b/resources/godot_icons/light/Progress8.svg new file mode 100644 index 0000000..168b53b --- /dev/null +++ b/resources/godot_icons/light/Progress8.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/ProgressBar.svg b/resources/godot_icons/light/ProgressBar.svg index 241365e..7fc41be 100644 --- a/resources/godot_icons/light/ProgressBar.svg +++ b/resources/godot_icons/light/ProgressBar.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/QuadMesh.svg b/resources/godot_icons/light/QuadMesh.svg index 86cc1bc..c9f762c 100644 --- a/resources/godot_icons/light/QuadMesh.svg +++ b/resources/godot_icons/light/QuadMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/QuadOccluder3D.svg b/resources/godot_icons/light/QuadOccluder3D.svg index 16da6f4..1f91cde 100644 --- a/resources/godot_icons/light/QuadOccluder3D.svg +++ b/resources/godot_icons/light/QuadOccluder3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/RectangleShape2D.svg b/resources/godot_icons/light/RectangleShape2D.svg index 2d6a503..4a0f516 100644 --- a/resources/godot_icons/light/RectangleShape2D.svg +++ b/resources/godot_icons/light/RectangleShape2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/ReflectionProbe.svg b/resources/godot_icons/light/ReflectionProbe.svg index 7ab1640..b95a8af 100644 --- a/resources/godot_icons/light/ReflectionProbe.svg +++ b/resources/godot_icons/light/ReflectionProbe.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/RegEx.svg b/resources/godot_icons/light/RegEx.svg new file mode 100644 index 0000000..cd3dace --- /dev/null +++ b/resources/godot_icons/light/RegEx.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/RegExMatch.svg b/resources/godot_icons/light/RegExMatch.svg new file mode 100644 index 0000000..f180431 --- /dev/null +++ b/resources/godot_icons/light/RegExMatch.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/Reload.svg b/resources/godot_icons/light/Reload.svg new file mode 100644 index 0000000..8d1403c --- /dev/null +++ b/resources/godot_icons/light/Reload.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/ReloadSmall.svg b/resources/godot_icons/light/ReloadSmall.svg new file mode 100644 index 0000000..9770ebc --- /dev/null +++ b/resources/godot_icons/light/ReloadSmall.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/RemoteTransform2D.svg b/resources/godot_icons/light/RemoteTransform2D.svg index d768e6d..a52afa4 100644 --- a/resources/godot_icons/light/RemoteTransform2D.svg +++ b/resources/godot_icons/light/RemoteTransform2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/RemoteTransform3D.svg b/resources/godot_icons/light/RemoteTransform3D.svg index 4ca650a..c2bab89 100644 --- a/resources/godot_icons/light/RemoteTransform3D.svg +++ b/resources/godot_icons/light/RemoteTransform3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/ResourcePreloader.svg b/resources/godot_icons/light/ResourcePreloader.svg index 3de2de8..1b3f03b 100644 --- a/resources/godot_icons/light/ResourcePreloader.svg +++ b/resources/godot_icons/light/ResourcePreloader.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/RibbonTrailMesh.svg b/resources/godot_icons/light/RibbonTrailMesh.svg index 3f6cf0b..7b22a2b 100644 --- a/resources/godot_icons/light/RibbonTrailMesh.svg +++ b/resources/godot_icons/light/RibbonTrailMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/RichTextEffect.svg b/resources/godot_icons/light/RichTextEffect.svg index 65e59b6..f89e808 100644 --- a/resources/godot_icons/light/RichTextEffect.svg +++ b/resources/godot_icons/light/RichTextEffect.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/RigidBody2D.svg b/resources/godot_icons/light/RigidBody2D.svg index 412fc8b..9d26e57 100644 --- a/resources/godot_icons/light/RigidBody2D.svg +++ b/resources/godot_icons/light/RigidBody2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/RigidBody3D.svg b/resources/godot_icons/light/RigidBody3D.svg index 8858243..392c83c 100644 --- a/resources/godot_icons/light/RigidBody3D.svg +++ b/resources/godot_icons/light/RigidBody3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/RootMotionView.svg b/resources/godot_icons/light/RootMotionView.svg index 702c16a..0e37b8b 100644 --- a/resources/godot_icons/light/RootMotionView.svg +++ b/resources/godot_icons/light/RootMotionView.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Script.svg b/resources/godot_icons/light/Script.svg new file mode 100644 index 0000000..be0b8e3 --- /dev/null +++ b/resources/godot_icons/light/Script.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/ScriptCreate.svg b/resources/godot_icons/light/ScriptCreate.svg new file mode 100644 index 0000000..6de652f --- /dev/null +++ b/resources/godot_icons/light/ScriptCreate.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/ScriptRemove.svg b/resources/godot_icons/light/ScriptRemove.svg new file mode 100644 index 0000000..6383cc7 --- /dev/null +++ b/resources/godot_icons/light/ScriptRemove.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/ScrollContainer.svg b/resources/godot_icons/light/ScrollContainer.svg index 45ed149..344a939 100644 --- a/resources/godot_icons/light/ScrollContainer.svg +++ b/resources/godot_icons/light/ScrollContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Search.svg b/resources/godot_icons/light/Search.svg new file mode 100644 index 0000000..040e70e --- /dev/null +++ b/resources/godot_icons/light/Search.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/SegmentShape2D.svg b/resources/godot_icons/light/SegmentShape2D.svg index b6763f7..23e7054 100644 --- a/resources/godot_icons/light/SegmentShape2D.svg +++ b/resources/godot_icons/light/SegmentShape2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/SeparationRayShape2D.svg b/resources/godot_icons/light/SeparationRayShape2D.svg index 6966e75..71da58f 100644 --- a/resources/godot_icons/light/SeparationRayShape2D.svg +++ b/resources/godot_icons/light/SeparationRayShape2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/SeparationRayShape3D.svg b/resources/godot_icons/light/SeparationRayShape3D.svg index 44d32fe..65c68d0 100644 --- a/resources/godot_icons/light/SeparationRayShape3D.svg +++ b/resources/godot_icons/light/SeparationRayShape3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Shader.svg b/resources/godot_icons/light/Shader.svg index 532af5a..354dde9 100644 --- a/resources/godot_icons/light/Shader.svg +++ b/resources/godot_icons/light/Shader.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/ShaderGlobalsOverride.svg b/resources/godot_icons/light/ShaderGlobalsOverride.svg index 8de6c10..1171481 100644 --- a/resources/godot_icons/light/ShaderGlobalsOverride.svg +++ b/resources/godot_icons/light/ShaderGlobalsOverride.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/ShaderInclude.svg b/resources/godot_icons/light/ShaderInclude.svg new file mode 100644 index 0000000..cff1f03 --- /dev/null +++ b/resources/godot_icons/light/ShaderInclude.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/ShaderMaterial.svg b/resources/godot_icons/light/ShaderMaterial.svg index 80a1d0a..a53be38 100644 --- a/resources/godot_icons/light/ShaderMaterial.svg +++ b/resources/godot_icons/light/ShaderMaterial.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/ShapeCast2D.svg b/resources/godot_icons/light/ShapeCast2D.svg index 019df10..77cff29 100644 --- a/resources/godot_icons/light/ShapeCast2D.svg +++ b/resources/godot_icons/light/ShapeCast2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/ShapeCast3D.svg b/resources/godot_icons/light/ShapeCast3D.svg index 13a82a0..57b27ff 100644 --- a/resources/godot_icons/light/ShapeCast3D.svg +++ b/resources/godot_icons/light/ShapeCast3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Signals.svg b/resources/godot_icons/light/Signals.svg new file mode 100644 index 0000000..434ddbb --- /dev/null +++ b/resources/godot_icons/light/Signals.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/SignalsAndGroups.svg b/resources/godot_icons/light/SignalsAndGroups.svg new file mode 100644 index 0000000..0c2c77f --- /dev/null +++ b/resources/godot_icons/light/SignalsAndGroups.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/Skeleton2D.svg b/resources/godot_icons/light/Skeleton2D.svg index 9a71620..cdcda14 100644 --- a/resources/godot_icons/light/Skeleton2D.svg +++ b/resources/godot_icons/light/Skeleton2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Skeleton3D.svg b/resources/godot_icons/light/Skeleton3D.svg index 19617c0..249715d 100644 --- a/resources/godot_icons/light/Skeleton3D.svg +++ b/resources/godot_icons/light/Skeleton3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/SkeletonIK3D.svg b/resources/godot_icons/light/SkeletonIK3D.svg index 724e0ef..1d2d0f5 100644 --- a/resources/godot_icons/light/SkeletonIK3D.svg +++ b/resources/godot_icons/light/SkeletonIK3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Sky.svg b/resources/godot_icons/light/Sky.svg index e463c5f..73656ed 100644 --- a/resources/godot_icons/light/Sky.svg +++ b/resources/godot_icons/light/Sky.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/SliderJoint3D.svg b/resources/godot_icons/light/SliderJoint3D.svg index 38a0a08..94853a5 100644 --- a/resources/godot_icons/light/SliderJoint3D.svg +++ b/resources/godot_icons/light/SliderJoint3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Slot.svg b/resources/godot_icons/light/Slot.svg new file mode 100644 index 0000000..93c125a --- /dev/null +++ b/resources/godot_icons/light/Slot.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/SphereMesh.svg b/resources/godot_icons/light/SphereMesh.svg index be2dd44..83dd42f 100644 --- a/resources/godot_icons/light/SphereMesh.svg +++ b/resources/godot_icons/light/SphereMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/SphereOccluder3D.svg b/resources/godot_icons/light/SphereOccluder3D.svg index 850e265..d593ce6 100644 --- a/resources/godot_icons/light/SphereOccluder3D.svg +++ b/resources/godot_icons/light/SphereOccluder3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/SpinBox.svg b/resources/godot_icons/light/SpinBox.svg index bc15b79..31ca217 100644 --- a/resources/godot_icons/light/SpinBox.svg +++ b/resources/godot_icons/light/SpinBox.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/SplitContainer.svg b/resources/godot_icons/light/SplitContainer.svg index 06b46b8..241fbb4 100644 --- a/resources/godot_icons/light/SplitContainer.svg +++ b/resources/godot_icons/light/SplitContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/SpotLight3D.svg b/resources/godot_icons/light/SpotLight3D.svg index d280576..fcca99e 100644 --- a/resources/godot_icons/light/SpotLight3D.svg +++ b/resources/godot_icons/light/SpotLight3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Sprite2D.svg b/resources/godot_icons/light/Sprite2D.svg index 80affa4..4683e74 100644 --- a/resources/godot_icons/light/Sprite2D.svg +++ b/resources/godot_icons/light/Sprite2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Sprite3D.svg b/resources/godot_icons/light/Sprite3D.svg index c994380..134ae57 100644 --- a/resources/godot_icons/light/Sprite3D.svg +++ b/resources/godot_icons/light/Sprite3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/SpriteFrames.svg b/resources/godot_icons/light/SpriteFrames.svg index 53ee6f6..34a6b5d 100644 --- a/resources/godot_icons/light/SpriteFrames.svg +++ b/resources/godot_icons/light/SpriteFrames.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/StandardMaterial3D.svg b/resources/godot_icons/light/StandardMaterial3D.svg index 717ba5d..41e9a67 100644 --- a/resources/godot_icons/light/StandardMaterial3D.svg +++ b/resources/godot_icons/light/StandardMaterial3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/StaticBody2D.svg b/resources/godot_icons/light/StaticBody2D.svg index 3dc4893..e15c9f1 100644 --- a/resources/godot_icons/light/StaticBody2D.svg +++ b/resources/godot_icons/light/StaticBody2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/StaticBody3D.svg b/resources/godot_icons/light/StaticBody3D.svg index d86c881..a4f1773 100644 --- a/resources/godot_icons/light/StaticBody3D.svg +++ b/resources/godot_icons/light/StaticBody3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Stop.svg b/resources/godot_icons/light/Stop.svg new file mode 100644 index 0000000..7b1ef97 --- /dev/null +++ b/resources/godot_icons/light/Stop.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/StyleBoxEmpty.svg b/resources/godot_icons/light/StyleBoxEmpty.svg index 3c4546d..c110d45 100644 --- a/resources/godot_icons/light/StyleBoxEmpty.svg +++ b/resources/godot_icons/light/StyleBoxEmpty.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/StyleBoxFlat.svg b/resources/godot_icons/light/StyleBoxFlat.svg index 5bf01f5..9868644 100644 --- a/resources/godot_icons/light/StyleBoxFlat.svg +++ b/resources/godot_icons/light/StyleBoxFlat.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/StyleBoxLine.svg b/resources/godot_icons/light/StyleBoxLine.svg index 995f56f..818864f 100644 --- a/resources/godot_icons/light/StyleBoxLine.svg +++ b/resources/godot_icons/light/StyleBoxLine.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/StyleBoxTexture.svg b/resources/godot_icons/light/StyleBoxTexture.svg index a356d11..9054053 100644 --- a/resources/godot_icons/light/StyleBoxTexture.svg +++ b/resources/godot_icons/light/StyleBoxTexture.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/SubViewport.svg b/resources/godot_icons/light/SubViewport.svg index 5b80105..10f85fb 100644 --- a/resources/godot_icons/light/SubViewport.svg +++ b/resources/godot_icons/light/SubViewport.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/SubViewportContainer.svg b/resources/godot_icons/light/SubViewportContainer.svg index 49c8f4f..8f2516d 100644 --- a/resources/godot_icons/light/SubViewportContainer.svg +++ b/resources/godot_icons/light/SubViewportContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/SyntaxHighlighter.svg b/resources/godot_icons/light/SyntaxHighlighter.svg new file mode 100644 index 0000000..6bd0176 --- /dev/null +++ b/resources/godot_icons/light/SyntaxHighlighter.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/SystemFont.svg b/resources/godot_icons/light/SystemFont.svg index 93a84a9..9f3520b 100644 --- a/resources/godot_icons/light/SystemFont.svg +++ b/resources/godot_icons/light/SystemFont.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/TabBar.svg b/resources/godot_icons/light/TabBar.svg index 9ed03bd..24f1941 100644 --- a/resources/godot_icons/light/TabBar.svg +++ b/resources/godot_icons/light/TabBar.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/TabContainer.svg b/resources/godot_icons/light/TabContainer.svg index 130ce79..0283308 100644 --- a/resources/godot_icons/light/TabContainer.svg +++ b/resources/godot_icons/light/TabContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/TextEdit.svg b/resources/godot_icons/light/TextEdit.svg index 661a540..fd9b09f 100644 --- a/resources/godot_icons/light/TextEdit.svg +++ b/resources/godot_icons/light/TextEdit.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/TextMesh.svg b/resources/godot_icons/light/TextMesh.svg index 234ce75..868ab6e 100644 --- a/resources/godot_icons/light/TextMesh.svg +++ b/resources/godot_icons/light/TextMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Texture2DArray.svg b/resources/godot_icons/light/Texture2DArray.svg index 88b695d..331495b 100644 --- a/resources/godot_icons/light/Texture2DArray.svg +++ b/resources/godot_icons/light/Texture2DArray.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/TextureButton.svg b/resources/godot_icons/light/TextureButton.svg index 0d45d2c..f5f061c 100644 --- a/resources/godot_icons/light/TextureButton.svg +++ b/resources/godot_icons/light/TextureButton.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/TextureProgressBar.svg b/resources/godot_icons/light/TextureProgressBar.svg index 2095997..058d115 100644 --- a/resources/godot_icons/light/TextureProgressBar.svg +++ b/resources/godot_icons/light/TextureProgressBar.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Theme.svg b/resources/godot_icons/light/Theme.svg index 401d884..f35462d 100644 --- a/resources/godot_icons/light/Theme.svg +++ b/resources/godot_icons/light/Theme.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/TileMap.svg b/resources/godot_icons/light/TileMap.svg index bad925b..6272897 100644 --- a/resources/godot_icons/light/TileMap.svg +++ b/resources/godot_icons/light/TileMap.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/TileSet.svg b/resources/godot_icons/light/TileSet.svg index 1f123ea..126a4cc 100644 --- a/resources/godot_icons/light/TileSet.svg +++ b/resources/godot_icons/light/TileSet.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Timer.svg b/resources/godot_icons/light/Timer.svg index 7a9eb35..ea36d18 100644 --- a/resources/godot_icons/light/Timer.svg +++ b/resources/godot_icons/light/Timer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/TorusMesh.svg b/resources/godot_icons/light/TorusMesh.svg index 2ed973d..adf3a84 100644 --- a/resources/godot_icons/light/TorusMesh.svg +++ b/resources/godot_icons/light/TorusMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/TouchScreenButton.svg b/resources/godot_icons/light/TouchScreenButton.svg index 77d8264..afef08b 100644 --- a/resources/godot_icons/light/TouchScreenButton.svg +++ b/resources/godot_icons/light/TouchScreenButton.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Tree.svg b/resources/godot_icons/light/Tree.svg index 902486b..9028f38 100644 --- a/resources/godot_icons/light/Tree.svg +++ b/resources/godot_icons/light/Tree.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/TubeTrailMesh.svg b/resources/godot_icons/light/TubeTrailMesh.svg index 3ca5242..1cbab36 100644 --- a/resources/godot_icons/light/TubeTrailMesh.svg +++ b/resources/godot_icons/light/TubeTrailMesh.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Tween.svg b/resources/godot_icons/light/Tween.svg index a7310e5..53d1fd4 100644 --- a/resources/godot_icons/light/Tween.svg +++ b/resources/godot_icons/light/Tween.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Unlock.svg b/resources/godot_icons/light/Unlock.svg new file mode 100644 index 0000000..eef8fbf --- /dev/null +++ b/resources/godot_icons/light/Unlock.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/VBoxContainer.svg b/resources/godot_icons/light/VBoxContainer.svg index 1a804e3..60c5280 100644 --- a/resources/godot_icons/light/VBoxContainer.svg +++ b/resources/godot_icons/light/VBoxContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VFlowContainer.svg b/resources/godot_icons/light/VFlowContainer.svg index a75bc52..b148987 100644 --- a/resources/godot_icons/light/VFlowContainer.svg +++ b/resources/godot_icons/light/VFlowContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VScrollBar.svg b/resources/godot_icons/light/VScrollBar.svg index e98da2e..ef07040 100644 --- a/resources/godot_icons/light/VScrollBar.svg +++ b/resources/godot_icons/light/VScrollBar.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VSeparator.svg b/resources/godot_icons/light/VSeparator.svg index 3980f67..01d1070 100644 --- a/resources/godot_icons/light/VSeparator.svg +++ b/resources/godot_icons/light/VSeparator.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VSlider.svg b/resources/godot_icons/light/VSlider.svg index 6f21d81..84dc823 100644 --- a/resources/godot_icons/light/VSlider.svg +++ b/resources/godot_icons/light/VSlider.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VSplitContainer.svg b/resources/godot_icons/light/VSplitContainer.svg index aa9701c..b130e52 100644 --- a/resources/godot_icons/light/VSplitContainer.svg +++ b/resources/godot_icons/light/VSplitContainer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VehicleBody3D.svg b/resources/godot_icons/light/VehicleBody3D.svg index d83f85f..badb5d7 100644 --- a/resources/godot_icons/light/VehicleBody3D.svg +++ b/resources/godot_icons/light/VehicleBody3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VehicleWheel3D.svg b/resources/godot_icons/light/VehicleWheel3D.svg index ecab1e9..88e377c 100644 --- a/resources/godot_icons/light/VehicleWheel3D.svg +++ b/resources/godot_icons/light/VehicleWheel3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VideoStreamPlayer.svg b/resources/godot_icons/light/VideoStreamPlayer.svg index d89d55b..92afaae 100644 --- a/resources/godot_icons/light/VideoStreamPlayer.svg +++ b/resources/godot_icons/light/VideoStreamPlayer.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/ViewportTexture.svg b/resources/godot_icons/light/ViewportTexture.svg index 18e7a45..05ebe22 100644 --- a/resources/godot_icons/light/ViewportTexture.svg +++ b/resources/godot_icons/light/ViewportTexture.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VisibleOnScreenEnabler2D.svg b/resources/godot_icons/light/VisibleOnScreenEnabler2D.svg index 95b8b89..5a56a49 100644 --- a/resources/godot_icons/light/VisibleOnScreenEnabler2D.svg +++ b/resources/godot_icons/light/VisibleOnScreenEnabler2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VisibleOnScreenEnabler3D.svg b/resources/godot_icons/light/VisibleOnScreenEnabler3D.svg index bf3412b..62dedcf 100644 --- a/resources/godot_icons/light/VisibleOnScreenEnabler3D.svg +++ b/resources/godot_icons/light/VisibleOnScreenEnabler3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VisibleOnScreenNotifier2D.svg b/resources/godot_icons/light/VisibleOnScreenNotifier2D.svg index 2a85b4f..9f32063 100644 --- a/resources/godot_icons/light/VisibleOnScreenNotifier2D.svg +++ b/resources/godot_icons/light/VisibleOnScreenNotifier2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VisibleOnScreenNotifier3D.svg b/resources/godot_icons/light/VisibleOnScreenNotifier3D.svg index 76f5e24..904455a 100644 --- a/resources/godot_icons/light/VisibleOnScreenNotifier3D.svg +++ b/resources/godot_icons/light/VisibleOnScreenNotifier3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VisualShader.svg b/resources/godot_icons/light/VisualShader.svg index 929f296..d0125a8 100644 --- a/resources/godot_icons/light/VisualShader.svg +++ b/resources/godot_icons/light/VisualShader.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VisualShaderNodeColorConstant.svg b/resources/godot_icons/light/VisualShaderNodeColorConstant.svg index d327012..c2af7df 100644 --- a/resources/godot_icons/light/VisualShaderNodeColorConstant.svg +++ b/resources/godot_icons/light/VisualShaderNodeColorConstant.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VisualShaderNodeColorOp.svg b/resources/godot_icons/light/VisualShaderNodeColorOp.svg index 005da8b..c21852a 100644 --- a/resources/godot_icons/light/VisualShaderNodeColorOp.svg +++ b/resources/godot_icons/light/VisualShaderNodeColorOp.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VisualShaderNodeCubeMap.svg b/resources/godot_icons/light/VisualShaderNodeCubeMap.svg index fecb4d1..e28552c 100644 --- a/resources/godot_icons/light/VisualShaderNodeCubeMap.svg +++ b/resources/godot_icons/light/VisualShaderNodeCubeMap.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VisualShaderNodeCurveTexture.svg b/resources/godot_icons/light/VisualShaderNodeCurveTexture.svg index e468acf..f1f6a54 100644 --- a/resources/godot_icons/light/VisualShaderNodeCurveTexture.svg +++ b/resources/godot_icons/light/VisualShaderNodeCurveTexture.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VisualShaderNodeCurveXYZTexture.svg b/resources/godot_icons/light/VisualShaderNodeCurveXYZTexture.svg index e468acf..f1f6a54 100644 --- a/resources/godot_icons/light/VisualShaderNodeCurveXYZTexture.svg +++ b/resources/godot_icons/light/VisualShaderNodeCurveXYZTexture.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VisualShaderNodeExpression.svg b/resources/godot_icons/light/VisualShaderNodeExpression.svg index 710ba81..ae403da 100644 --- a/resources/godot_icons/light/VisualShaderNodeExpression.svg +++ b/resources/godot_icons/light/VisualShaderNodeExpression.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VisualShaderNodeFloatFunc.svg b/resources/godot_icons/light/VisualShaderNodeFloatFunc.svg index 382c4e6..7cf2a5f 100644 --- a/resources/godot_icons/light/VisualShaderNodeFloatFunc.svg +++ b/resources/godot_icons/light/VisualShaderNodeFloatFunc.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VisualShaderNodeFloatOp.svg b/resources/godot_icons/light/VisualShaderNodeFloatOp.svg index 546ffc1..54048f0 100644 --- a/resources/godot_icons/light/VisualShaderNodeFloatOp.svg +++ b/resources/godot_icons/light/VisualShaderNodeFloatOp.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VisualShaderNodeGlobalExpression.svg b/resources/godot_icons/light/VisualShaderNodeGlobalExpression.svg index 0cafffb..14b75e2 100644 --- a/resources/godot_icons/light/VisualShaderNodeGlobalExpression.svg +++ b/resources/godot_icons/light/VisualShaderNodeGlobalExpression.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VisualShaderNodeIntFunc.svg b/resources/godot_icons/light/VisualShaderNodeIntFunc.svg index 382c4e6..7cf2a5f 100644 --- a/resources/godot_icons/light/VisualShaderNodeIntFunc.svg +++ b/resources/godot_icons/light/VisualShaderNodeIntFunc.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VisualShaderNodeIntOp.svg b/resources/godot_icons/light/VisualShaderNodeIntOp.svg index 546ffc1..54048f0 100644 --- a/resources/godot_icons/light/VisualShaderNodeIntOp.svg +++ b/resources/godot_icons/light/VisualShaderNodeIntOp.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VisualShaderNodeTransformCompose.svg b/resources/godot_icons/light/VisualShaderNodeTransformCompose.svg index 774f9e7..6f44f23 100644 --- a/resources/godot_icons/light/VisualShaderNodeTransformCompose.svg +++ b/resources/godot_icons/light/VisualShaderNodeTransformCompose.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VisualShaderNodeTransformDecompose.svg b/resources/godot_icons/light/VisualShaderNodeTransformDecompose.svg index 9594bcb..1521181 100644 --- a/resources/godot_icons/light/VisualShaderNodeTransformDecompose.svg +++ b/resources/godot_icons/light/VisualShaderNodeTransformDecompose.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VisualShaderNodeTransformVecMult.svg b/resources/godot_icons/light/VisualShaderNodeTransformVecMult.svg index 611f027..cd108f6 100644 --- a/resources/godot_icons/light/VisualShaderNodeTransformVecMult.svg +++ b/resources/godot_icons/light/VisualShaderNodeTransformVecMult.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VisualShaderNodeVectorCompose.svg b/resources/godot_icons/light/VisualShaderNodeVectorCompose.svg index 2c4c1fb..6502ca5 100644 --- a/resources/godot_icons/light/VisualShaderNodeVectorCompose.svg +++ b/resources/godot_icons/light/VisualShaderNodeVectorCompose.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VisualShaderNodeVectorDecompose.svg b/resources/godot_icons/light/VisualShaderNodeVectorDecompose.svg index 5fb8661..5ff0706 100644 --- a/resources/godot_icons/light/VisualShaderNodeVectorDecompose.svg +++ b/resources/godot_icons/light/VisualShaderNodeVectorDecompose.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VisualShaderNodeVectorDistance.svg b/resources/godot_icons/light/VisualShaderNodeVectorDistance.svg index b7185f2..9ea5462 100644 --- a/resources/godot_icons/light/VisualShaderNodeVectorDistance.svg +++ b/resources/godot_icons/light/VisualShaderNodeVectorDistance.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VisualShaderNodeVectorFunc.svg b/resources/godot_icons/light/VisualShaderNodeVectorFunc.svg index e452bc3..11405f1 100644 --- a/resources/godot_icons/light/VisualShaderNodeVectorFunc.svg +++ b/resources/godot_icons/light/VisualShaderNodeVectorFunc.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VisualShaderNodeVectorLen.svg b/resources/godot_icons/light/VisualShaderNodeVectorLen.svg index dce4890..ad9b51d 100644 --- a/resources/godot_icons/light/VisualShaderNodeVectorLen.svg +++ b/resources/godot_icons/light/VisualShaderNodeVectorLen.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VoxelGI.svg b/resources/godot_icons/light/VoxelGI.svg index 47edc49..d3fc3ba 100644 --- a/resources/godot_icons/light/VoxelGI.svg +++ b/resources/godot_icons/light/VoxelGI.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/VoxelGIData.svg b/resources/godot_icons/light/VoxelGIData.svg index ff2f84f..ff91ec1 100644 --- a/resources/godot_icons/light/VoxelGIData.svg +++ b/resources/godot_icons/light/VoxelGIData.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/World2D.svg b/resources/godot_icons/light/World2D.svg index 5e53b20..d39466b 100644 --- a/resources/godot_icons/light/World2D.svg +++ b/resources/godot_icons/light/World2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/World3D.svg b/resources/godot_icons/light/World3D.svg index b3f20e7..372d157 100644 --- a/resources/godot_icons/light/World3D.svg +++ b/resources/godot_icons/light/World3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/WorldBoundaryShape2D.svg b/resources/godot_icons/light/WorldBoundaryShape2D.svg index 70defbe..34dcbdc 100644 --- a/resources/godot_icons/light/WorldBoundaryShape2D.svg +++ b/resources/godot_icons/light/WorldBoundaryShape2D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/WorldBoundaryShape3D.svg b/resources/godot_icons/light/WorldBoundaryShape3D.svg index a73e74a..c7d0495 100644 --- a/resources/godot_icons/light/WorldBoundaryShape3D.svg +++ b/resources/godot_icons/light/WorldBoundaryShape3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/WorldEnvironment.svg b/resources/godot_icons/light/WorldEnvironment.svg index c4cc955..8cb9a9a 100644 --- a/resources/godot_icons/light/WorldEnvironment.svg +++ b/resources/godot_icons/light/WorldEnvironment.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/XRAnchor3D.svg b/resources/godot_icons/light/XRAnchor3D.svg index ba49827..4789db6 100644 --- a/resources/godot_icons/light/XRAnchor3D.svg +++ b/resources/godot_icons/light/XRAnchor3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/XRCamera3D.svg b/resources/godot_icons/light/XRCamera3D.svg index 4e754c0..dbbd116 100644 --- a/resources/godot_icons/light/XRCamera3D.svg +++ b/resources/godot_icons/light/XRCamera3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/XRController3D.svg b/resources/godot_icons/light/XRController3D.svg index e7fb638..0c5dc93 100644 --- a/resources/godot_icons/light/XRController3D.svg +++ b/resources/godot_icons/light/XRController3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/XROrigin3D.svg b/resources/godot_icons/light/XROrigin3D.svg index aeef103..844d830 100644 --- a/resources/godot_icons/light/XROrigin3D.svg +++ b/resources/godot_icons/light/XROrigin3D.svg @@ -1 +1 @@ - + diff --git a/resources/godot_icons/light/Zoom.svg b/resources/godot_icons/light/Zoom.svg new file mode 100644 index 0000000..1bbff97 --- /dev/null +++ b/resources/godot_icons/light/Zoom.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/ZoomLess.svg b/resources/godot_icons/light/ZoomLess.svg new file mode 100644 index 0000000..1a193d8 --- /dev/null +++ b/resources/godot_icons/light/ZoomLess.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/ZoomMore.svg b/resources/godot_icons/light/ZoomMore.svg new file mode 100644 index 0000000..d918527 --- /dev/null +++ b/resources/godot_icons/light/ZoomMore.svg @@ -0,0 +1 @@ + diff --git a/resources/godot_icons/light/ZoomReset.svg b/resources/godot_icons/light/ZoomReset.svg new file mode 100644 index 0000000..c8e773d --- /dev/null +++ b/resources/godot_icons/light/ZoomReset.svg @@ -0,0 +1 @@ + diff --git a/resources/hashes b/resources/hashes deleted file mode 100644 index 7ca3616..0000000 --- a/resources/hashes +++ /dev/null @@ -1,161 +0,0 @@ -icon_accept_dialog acd6ad21bbb15e44cda96d9063a8901f -icon_animated_sprite 270529e7145defc9e9f25a9662673536 -icon_animated_sprite_3d 7b0302f87d63ed013ba494a8d9218dc5 -icon_animation_player b2ede8ebdb67a4c8cbcb9c59d7b7e6b6 -icon_animation_tree a2fdc32212441cff75b0e5494c1b925e -icon_animation_tree_player a2fdc32212441cff75b0e5494c1b925e -icon_area 91092ba21aea2dd4928fcdd938ff6e46 -icon_area_2d 05545caafbc5d05bba2fc6de5928181e -icon_audio_stream_player 45e9947805241cce604d16b441ce6949 -icon_audio_stream_player_2_d c1e674966c627afa39068d8b8b88ddaf -icon_audio_stream_player_3_d ea1f6cc9624afa009419246b1e040ad6 -icon_a_r_v_r_anchor c2fa7d8b07c8753708ccd51fbfb750fb -icon_a_r_v_r_camera 57c9ee0a702fe1a03dd2f396ff304615 -icon_a_r_v_r_controller 5f39b1c4684b3a48a660f740fa9995d3 -icon_a_r_v_r_origin 9ee2aae61803f98f1913cbbfe6086e95 -icon_back_buffer_copy 1e8f39900ca051e8a9eeabc36a407135 -icon_baked_lightmap 99174fff2b5652da2c9bdf7c8869ef6c -icon_bone_2_d 04b832eadd359da67c3b51ac5198c2d2 -icon_bone_attachment b69dccb74bec608ea2bf6aedc3554d8d -icon_button a446868b97eb18615b1c0a649134535c -icon_camera 6b0ecdc420e94bdd635029132b7cf46a -icon_camera_2d f80f29d6af02ef6375c57fdf047900f8 -icon_canvas_layer 9d9d90ac888f833a0380b5b79819bda8 -icon_canvas_modulate eda1bd7d03c35d1f0762aa186b300480 -icon_center_container 04c7fecadc8f545fa39531e4398305e5 -icon_check_box a52807384ac7c3ad00ea2ef342501873 -icon_check_button 10c5f6800dd76afd34131a7cfc5208b5 -icon_clipped_camera 8c35cee49100276370afdb1492d8b649 -icon_collision_polygon c34c38ea1b38d6fb6d4f53817df41360 -icon_collision_polygon_2d 4bc34f2d5ff14a1c2ebf71c73942c21c -icon_collision_shape 8d4af566441db96cbc91b39d96912b27 -icon_collision_shape_2d c0e2b1ff8f25204d410ca0999d63c73d -icon_color_picker 720b46e85ba2f78e9192d6ed256340c1 -icon_color_picker_button 257604d44e7e23830d1983c86d4b555c -icon_color_rect 895c788b6b267baf2362622ff6f4f63b -icon_cone_twist_joint 79de179e62442e6571f5308a4605a6d2 -icon_confirmation_dialog 492c281c1d2512085ddbc8aaaa2ccf4f -icon_container df91572922e2a08dada37efbc1c4fea2 -icon_control ec59a74f624ed7a94a1ff24fd7bf3b93 -icon_c_p_u_particles b0e67fd89e1dee6663d87609b91c97a3 -icon_c_p_u_particles_2_d 221a2e65f720f258fb840f846cf3b191 -icon_damped_spring_joint_2d 483fc5a895c9b61b12c08e4ec78f14d8 -icon_directional_light ae154b892f967b6007dd56cf1b48555f -icon_edit dc3fff822c1ee004b92abbde27c7c682 -icon_file_dialog ca184caa0803a839bd8b6a1741c488c4 -icon_generic_6_d_o_f_joint 2bda3edbadf5cdda95fdcba6d16f8298 -icon_graph_edit 6a702bc4f31f63480019ba02cccbe6c0 -icon_graph_node fcf82785241eff77ea9972fc6fc2ef6e -icon_grid_container ea1012684b85a26c83ca7a491f9ab69e -icon_groove_joint_2d c3a49e1857964a04f7ed79866f3a8593 -icon_GUI_visibility_visible d956e435dec554864979aeee1bded043 -icon_g_i_probe a9aa9a6c2dc9ec58e0866e68e32ee24a -icon_hinge_joint 6b6364c48a664b654b841e48f794c4b0 -icon_h_box_container e2bf20d71fd7e612fcd787fa2c578bfc -icon_h_scroll_bar f4caa08c6ba15499e9e887ff9c701b0d -icon_h_separator 6a85f7720840b049fb9f9b47aa573329 -icon_h_slider 024c37595249a0e528206ecfed2ce983 -icon_h_split_container 74af42ae4779ef2dac29edaae1796c8d -icon_h_t_t_p_request 0f4d11fea914d437e713592e78bcd177 -icon_immediate_geometry 462129d475ce79f04670e2bcd1e47d32 -icon_interpolated_camera 2613060b44a5de86691362e07421192d -icon_item_list 82c5e66a1a2760c6701e66963c643118 -icon_kinematic_body baf39f197a9bed032b00783ce2b6c24b -icon_kinematic_body_2d 2ad0acbb50e157b9dfc46bf9af6e2449 -icon_label b8145440a57c66e2ac5e137cb907e640 -icon_light_2d 3e2947b328601f54f04ad885062c0726 -icon_light_occluder_2d 4c8471724f261ee26e4bfd428e4fa629 -icon_line_2d e21071cf08d2c0d89460aff3325a786d -icon_line_edit 4b4df6e706db709878cfffc97719145c -icon_link_button a505b74407b6259e96bf8c7f250a4557 -icon_listener 25920e978223a76a1ed8638d3e91dfca -icon_margin_container 7c7987b67b00a6ce200bd11414347ce8 -icon_menu_button 92af7cdf26a019204c853d6e4dad0e2f -icon_mesh_instance 417906bfc6e01952a01b12ce411a34b9 -icon_mesh_instance_2d 74e10998b51ae9fb88a4435933e63536 -icon_multi_mesh_instance 7f282664fe0b8a5c2a4be1a7c79b6090 -icon_multi_mesh_instance_2d 3bec394a3502b2b93292964b40cffb34 -icon_navigation 1cbcea8e75045c000204ac8a1ac08c7d -icon_navigation_2d 813a74261535fe2aec60a85b803ab26e -icon_navigation_mesh_instance 45706f13916f2d5997a376282337b150 -icon_navigation_polygon_instance 2bde0514ce8a5b758b4d515487bfc671 -icon_nine_patch_rect 146f15b2dd23bcd6c71bc262750c75ae -icon_node 8eed32d4596a4ac5573c98f8b8db554d -icon_node_2d 2c21bd745d7b8242048e1cba9d036d36 -icon_omni_light 56662c10dea4add3ecbab319d5fc19b8 -icon_option_button 5f0ab46ce7953dafef13f58430c412e4 -icon_panel ec03c4f34c36bdfcbf34291550acc18f -icon_panel_container 20aded28be4f4094c432a9ae617da43b -icon_parallax_background fb28ab07c87d2abd63a0a897d0e22668 -icon_parallax_layer 7a7782d2622475c351ae9194a37a3de9 -icon_particles 876f1f2b496c0a7cd7fdf698d5744c5a -icon_particles_2d f0cc98af251a7ddd1b7f3783d56998c1 -icon_path bd3a8f248df5492e785ff9774f6c14ff -icon_path_2d ad4c04049cc0dab5b73f67970f871502 -icon_path_follow 3c96e4979e645b6278984a4165b7451e -icon_path_follow_2d 0e5ed2a4bec5117ba72a1da8bfcdc370 -icon_physical_bone 477ad88c7ee226caa82c9fd4f9c4fe03 -icon_pin_joint 0859ac5caf660107e4e981e7f4bd4292 -icon_pin_joint_2d ac9b958e5029c3e517ff02863b3de602 -icon_polygon_2_d 1e9aaa8f172ed5df66af9c80c491f446 -icon_popup 70dd3a76942d94f4a50eab4937eb8de8 -icon_popup_dialog 8750584d6ad520368fc36dae74a25e96 -icon_popup_menu faa11ffe4722a1ed4cc212c0473325cb -icon_popup_panel e6d82be16a1f4cbd995c3628a7221743 -icon_position_2d 272e1b2f9c31550e8dd6aee94cf814c8 -icon_position_3d a21e92e39df5f17111eb6a751c258f36 -icon_progress_bar f0457c45b4b062743f6e17992d91fd4f -icon_ray_cast 3da43b7484ca367cb63dd7e8089038e1 -icon_ray_cast_2d 6dcd2660cb0da6620af18c2f15ca1f2d -icon_reference_rect 7bb50d353c0fbe4c66c65aad105a3710 -icon_reflection_probe 34acdd090988fd2432f046ed9daae7b2 -icon_refresh 6a7635d996186118ca7bdec52940fa47 -icon_remote_transform cbe7a93c44f0aa2fd6c1b4ce791f7d18 -icon_remote_transform_2d da99738feafc61c71990da52d09217c5 -icon_resource_preloader 54f8797edfb1a591469bd8a495693ecd -icon_rich_text_label 90c5820d0690ccbbc2417abddf10a065 -icon_rigid_body 384368c095922e9ca71cf241b1959e7d -icon_rigid_body_2d a5d7985831fe85fa523a9c4de7949a29 -icon_scroll_container c16f92706fe8b478fa1e4b4cb989bceb -icon_skeleton 4380f3accb79e3f21221d8094fec7f00 -icon_skeleton_2d c23ad7d61b470c55741e340adccd258c -icon_skeleton_i_k 33310ed7229c0f427bd024e5e09aa583 -icon_slider_joint b3ea8ca937ae99391356917bd4828f7f -icon_soft_body e3bcbf442155f984d4a221d0bb2d51bd -icon_spatial 8c3b8eb9e610cf9f9f408cfda48eb22f -icon_spin_box dde10cb14e0b9b747e771f5ab24cfefa -icon_spot_light 6770b4669be1bc20dd3577c65048432b -icon_spring_arm d74a1036e477174520013ab462b4e1c3 -icon_sprite ac17b5a5be395600db43ddbca3d463d4 -icon_sprite_3d 5dac01bc8de8c2dfcede3c999842f2a3 -icon_static_body 0f92bf400c4623adbb64c15b01e0382e -icon_static_body_2d 3dd22d2168d5372b3dee50429c4b6ecb -icon_tabs 7e78ecce029538648eb6ef5cc3f94d57 -icon_tab_container 9270d0970d93715da62075751ae88bc9 -icon_texture_button 488e98f85acc4ba2cdd9558a5af29344 -icon_texture_progress b8b440d119ea40edcbeade9e10ee35b5 -icon_texture_rect 92ced3405382fa051b6560e714b4b8ed -icon_text_edit 9d93c58e090d546b5f1ee3e0a693fbd2 -icon_tile_map e1558aa483145cd909169b9ec1cfa1ae -icon_timer d1419c36011566b646e568d77be7cb09 -icon_tool_button 4a65d7656827a1a1b5ac38f10b4646e8 -icon_touch_screen_button 30adb0de710d854b0cb0bf15b1536835 -icon_tree bad9393472d4c2f33bbe3afb8cb64f39 -icon_tween edf1c6b9262a66c22ecf96982c557337 -icon_vehicle_body 49ab6b5393e04b3285ca459b77078713 -icon_vehicle_wheel 7ffca5bd273ac964bfac6a7de017edc9 -icon_video_player 56452495f2f5a67026259ac4d765b2ba -icon_viewport f4d16e71d5ede737174bd18800757696 -icon_viewport_container f1d6d0ef263589f8a59fad13ac648d45 -icon_visibility_enabler 7c774f0c24f95fd89e419ea28cedd33f -icon_visibility_enabler_2d a38023de192b545a8834ad4e2547c659 -icon_visibility_notifier b7114d0e69234903d554819775947360 -icon_visibility_notifier_2d c93ff4ad11f6cc5d63b65346698bc5fc -icon_v_box_container 53ab4bb91711b591043e9207219d983f -icon_v_scroll_bar 8dcfef3ee1fb291f07c278786c4af788 -icon_v_separator cdbf0a84486f142e1776e16b4c50c918 -icon_v_slider 17b523456407d17b95bc2895e5baf528 -icon_v_split_container 4c3c0ae52be2afe50860a3c622eefe49 -icon_window_dialog 174b718610528486f3f8445f0bfba263 -icon_world_environment 451ec32bf9d7a89d2e1e34dfa1158e26 -icon_y_sort f76aa85d366d9d55e4b86d2390cf988c diff --git a/resources/light/icon_GUI_visibility_visible.svg b/resources/light/icon_GUI_visibility_visible.svg deleted file mode 100644 index cad97b6..0000000 --- a/resources/light/icon_GUI_visibility_visible.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_a_r_v_r_anchor.svg b/resources/light/icon_a_r_v_r_anchor.svg deleted file mode 100644 index 2a9ad42..0000000 --- a/resources/light/icon_a_r_v_r_anchor.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_a_r_v_r_camera.svg b/resources/light/icon_a_r_v_r_camera.svg deleted file mode 100644 index 82cf4ca..0000000 --- a/resources/light/icon_a_r_v_r_camera.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_a_r_v_r_controller.svg b/resources/light/icon_a_r_v_r_controller.svg deleted file mode 100644 index ee3d772..0000000 --- a/resources/light/icon_a_r_v_r_controller.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_a_r_v_r_origin.svg b/resources/light/icon_a_r_v_r_origin.svg deleted file mode 100644 index 3ac4a06..0000000 --- a/resources/light/icon_a_r_v_r_origin.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_accept_dialog.svg b/resources/light/icon_accept_dialog.svg deleted file mode 100644 index d35907f..0000000 --- a/resources/light/icon_accept_dialog.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_animated_sprite.svg b/resources/light/icon_animated_sprite.svg deleted file mode 100644 index cab15ea..0000000 --- a/resources/light/icon_animated_sprite.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/resources/light/icon_animated_sprite_3d.svg b/resources/light/icon_animated_sprite_3d.svg deleted file mode 100644 index 9c26784..0000000 --- a/resources/light/icon_animated_sprite_3d.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/resources/light/icon_animation_player.svg b/resources/light/icon_animation_player.svg deleted file mode 100644 index 15e210d..0000000 --- a/resources/light/icon_animation_player.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_animation_tree.svg b/resources/light/icon_animation_tree.svg deleted file mode 100644 index 578dc19..0000000 --- a/resources/light/icon_animation_tree.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_animation_tree_player.svg b/resources/light/icon_animation_tree_player.svg deleted file mode 100644 index 578dc19..0000000 --- a/resources/light/icon_animation_tree_player.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_area.svg b/resources/light/icon_area.svg deleted file mode 100644 index adb2881..0000000 --- a/resources/light/icon_area.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_area_2d.svg b/resources/light/icon_area_2d.svg deleted file mode 100644 index bfb4be4..0000000 --- a/resources/light/icon_area_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_audio_stream_player.svg b/resources/light/icon_audio_stream_player.svg deleted file mode 100644 index 6b5ee1a..0000000 --- a/resources/light/icon_audio_stream_player.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/resources/light/icon_audio_stream_player_2_d.svg b/resources/light/icon_audio_stream_player_2_d.svg deleted file mode 100644 index b2efc1e..0000000 --- a/resources/light/icon_audio_stream_player_2_d.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/resources/light/icon_audio_stream_player_3_d.svg b/resources/light/icon_audio_stream_player_3_d.svg deleted file mode 100644 index 6981acc..0000000 --- a/resources/light/icon_audio_stream_player_3_d.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/resources/light/icon_back_buffer_copy.svg b/resources/light/icon_back_buffer_copy.svg deleted file mode 100644 index e7fd1a6..0000000 --- a/resources/light/icon_back_buffer_copy.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_baked_lightmap.svg b/resources/light/icon_baked_lightmap.svg deleted file mode 100644 index 2a4bde3..0000000 --- a/resources/light/icon_baked_lightmap.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_bone_2_d.svg b/resources/light/icon_bone_2_d.svg deleted file mode 100644 index 18dc6c8..0000000 --- a/resources/light/icon_bone_2_d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_bone_attachment.svg b/resources/light/icon_bone_attachment.svg deleted file mode 100644 index 9ebcfc9..0000000 --- a/resources/light/icon_bone_attachment.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_button.svg b/resources/light/icon_button.svg deleted file mode 100644 index d233dfb..0000000 --- a/resources/light/icon_button.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_c_p_u_particles.svg b/resources/light/icon_c_p_u_particles.svg deleted file mode 100644 index c5d04d2..0000000 --- a/resources/light/icon_c_p_u_particles.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_c_p_u_particles_2_d.svg b/resources/light/icon_c_p_u_particles_2_d.svg deleted file mode 100644 index 7b1aeb9..0000000 --- a/resources/light/icon_c_p_u_particles_2_d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_camera.svg b/resources/light/icon_camera.svg deleted file mode 100644 index 1bbff56..0000000 --- a/resources/light/icon_camera.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_camera_2d.svg b/resources/light/icon_camera_2d.svg deleted file mode 100644 index 08bd9e7..0000000 --- a/resources/light/icon_camera_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_canvas_layer.svg b/resources/light/icon_canvas_layer.svg deleted file mode 100644 index 5a4c8df..0000000 --- a/resources/light/icon_canvas_layer.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_canvas_modulate.svg b/resources/light/icon_canvas_modulate.svg deleted file mode 100644 index 2a1e91b..0000000 --- a/resources/light/icon_canvas_modulate.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/resources/light/icon_center_container.svg b/resources/light/icon_center_container.svg deleted file mode 100644 index edd2211..0000000 --- a/resources/light/icon_center_container.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_check_box.svg b/resources/light/icon_check_box.svg deleted file mode 100644 index d8735cb..0000000 --- a/resources/light/icon_check_box.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_check_button.svg b/resources/light/icon_check_button.svg deleted file mode 100644 index 094d9b2..0000000 --- a/resources/light/icon_check_button.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_clipped_camera.svg b/resources/light/icon_clipped_camera.svg deleted file mode 100644 index f9f117f..0000000 --- a/resources/light/icon_clipped_camera.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_collision_polygon.svg b/resources/light/icon_collision_polygon.svg deleted file mode 100644 index e6efc22..0000000 --- a/resources/light/icon_collision_polygon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_collision_polygon_2d.svg b/resources/light/icon_collision_polygon_2d.svg deleted file mode 100644 index c10933c..0000000 --- a/resources/light/icon_collision_polygon_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_collision_shape.svg b/resources/light/icon_collision_shape.svg deleted file mode 100644 index 5a6c301..0000000 --- a/resources/light/icon_collision_shape.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_collision_shape_2d.svg b/resources/light/icon_collision_shape_2d.svg deleted file mode 100644 index 70278bc..0000000 --- a/resources/light/icon_collision_shape_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_color_picker.svg b/resources/light/icon_color_picker.svg deleted file mode 100644 index b11fe60..0000000 --- a/resources/light/icon_color_picker.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_color_picker_button.svg b/resources/light/icon_color_picker_button.svg deleted file mode 100644 index 25b6613..0000000 --- a/resources/light/icon_color_picker_button.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_color_rect.svg b/resources/light/icon_color_rect.svg deleted file mode 100644 index bb205e2..0000000 --- a/resources/light/icon_color_rect.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/resources/light/icon_cone_twist_joint.svg b/resources/light/icon_cone_twist_joint.svg deleted file mode 100644 index c420963..0000000 --- a/resources/light/icon_cone_twist_joint.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_confirmation_dialog.svg b/resources/light/icon_confirmation_dialog.svg deleted file mode 100644 index 64f2941..0000000 --- a/resources/light/icon_confirmation_dialog.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_container.svg b/resources/light/icon_container.svg deleted file mode 100644 index c04c212..0000000 --- a/resources/light/icon_container.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_control.svg b/resources/light/icon_control.svg deleted file mode 100644 index 63a1aa7..0000000 --- a/resources/light/icon_control.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_damped_spring_joint_2d.svg b/resources/light/icon_damped_spring_joint_2d.svg deleted file mode 100644 index 6c5741f..0000000 --- a/resources/light/icon_damped_spring_joint_2d.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/resources/light/icon_directional_light.svg b/resources/light/icon_directional_light.svg deleted file mode 100644 index 2cddf9a..0000000 --- a/resources/light/icon_directional_light.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_file_dialog.svg b/resources/light/icon_file_dialog.svg deleted file mode 100644 index 8027951..0000000 --- a/resources/light/icon_file_dialog.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_g_i_probe.svg b/resources/light/icon_g_i_probe.svg deleted file mode 100644 index 6a1282d..0000000 --- a/resources/light/icon_g_i_probe.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_generic_6_d_o_f_joint.svg b/resources/light/icon_generic_6_d_o_f_joint.svg deleted file mode 100644 index f1b7b55..0000000 --- a/resources/light/icon_generic_6_d_o_f_joint.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_graph_edit.svg b/resources/light/icon_graph_edit.svg deleted file mode 100644 index 36c9ae5..0000000 --- a/resources/light/icon_graph_edit.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/resources/light/icon_graph_node.svg b/resources/light/icon_graph_node.svg deleted file mode 100644 index 468aaf0..0000000 --- a/resources/light/icon_graph_node.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/resources/light/icon_grid_container.svg b/resources/light/icon_grid_container.svg deleted file mode 100644 index 40953c9..0000000 --- a/resources/light/icon_grid_container.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_groove_joint_2d.svg b/resources/light/icon_groove_joint_2d.svg deleted file mode 100644 index e7b2929..0000000 --- a/resources/light/icon_groove_joint_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_h_box_container.svg b/resources/light/icon_h_box_container.svg deleted file mode 100644 index efcdffa..0000000 --- a/resources/light/icon_h_box_container.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_h_scroll_bar.svg b/resources/light/icon_h_scroll_bar.svg deleted file mode 100644 index a5b2b2a..0000000 --- a/resources/light/icon_h_scroll_bar.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_h_separator.svg b/resources/light/icon_h_separator.svg deleted file mode 100644 index 2a8ca25..0000000 --- a/resources/light/icon_h_separator.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_h_slider.svg b/resources/light/icon_h_slider.svg deleted file mode 100644 index 2f3483d..0000000 --- a/resources/light/icon_h_slider.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_h_split_container.svg b/resources/light/icon_h_split_container.svg deleted file mode 100644 index 76650dd..0000000 --- a/resources/light/icon_h_split_container.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_h_t_t_p_request.svg b/resources/light/icon_h_t_t_p_request.svg deleted file mode 100644 index ed6981a..0000000 --- a/resources/light/icon_h_t_t_p_request.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_hinge_joint.svg b/resources/light/icon_hinge_joint.svg deleted file mode 100644 index aa66c4c..0000000 --- a/resources/light/icon_hinge_joint.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_immediate_geometry.svg b/resources/light/icon_immediate_geometry.svg deleted file mode 100644 index c01f380..0000000 --- a/resources/light/icon_immediate_geometry.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_interpolated_camera.svg b/resources/light/icon_interpolated_camera.svg deleted file mode 100644 index 87c1e3b..0000000 --- a/resources/light/icon_interpolated_camera.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_item_list.svg b/resources/light/icon_item_list.svg deleted file mode 100644 index 93d6b68..0000000 --- a/resources/light/icon_item_list.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_kinematic_body.svg b/resources/light/icon_kinematic_body.svg deleted file mode 100644 index c7abf9a..0000000 --- a/resources/light/icon_kinematic_body.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_kinematic_body_2d.svg b/resources/light/icon_kinematic_body_2d.svg deleted file mode 100644 index baebfa2..0000000 --- a/resources/light/icon_kinematic_body_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_label.svg b/resources/light/icon_label.svg deleted file mode 100644 index 8a818bd..0000000 --- a/resources/light/icon_label.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_light_2d.svg b/resources/light/icon_light_2d.svg deleted file mode 100644 index 9edaaee..0000000 --- a/resources/light/icon_light_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_light_occluder_2d.svg b/resources/light/icon_light_occluder_2d.svg deleted file mode 100644 index 3c38f92..0000000 --- a/resources/light/icon_light_occluder_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_line_2d.svg b/resources/light/icon_line_2d.svg deleted file mode 100644 index 13752b5..0000000 --- a/resources/light/icon_line_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_line_edit.svg b/resources/light/icon_line_edit.svg deleted file mode 100644 index cd487c5..0000000 --- a/resources/light/icon_line_edit.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_link_button.svg b/resources/light/icon_link_button.svg deleted file mode 100644 index f88c1f2..0000000 --- a/resources/light/icon_link_button.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_listener.svg b/resources/light/icon_listener.svg deleted file mode 100644 index 0b4fd72..0000000 --- a/resources/light/icon_listener.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_margin_container.svg b/resources/light/icon_margin_container.svg deleted file mode 100644 index 47fe297..0000000 --- a/resources/light/icon_margin_container.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/resources/light/icon_menu_button.svg b/resources/light/icon_menu_button.svg deleted file mode 100644 index a2180e9..0000000 --- a/resources/light/icon_menu_button.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_mesh_instance.svg b/resources/light/icon_mesh_instance.svg deleted file mode 100644 index df548c3..0000000 --- a/resources/light/icon_mesh_instance.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_mesh_instance_2d.svg b/resources/light/icon_mesh_instance_2d.svg deleted file mode 100644 index 6a7f305..0000000 --- a/resources/light/icon_mesh_instance_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_multi_mesh_instance.svg b/resources/light/icon_multi_mesh_instance.svg deleted file mode 100644 index b2b9b65..0000000 --- a/resources/light/icon_multi_mesh_instance.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_multi_mesh_instance_2d.svg b/resources/light/icon_multi_mesh_instance_2d.svg deleted file mode 100644 index e09a1f5..0000000 --- a/resources/light/icon_multi_mesh_instance_2d.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/resources/light/icon_navigation.svg b/resources/light/icon_navigation.svg deleted file mode 100644 index 778ce5b..0000000 --- a/resources/light/icon_navigation.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_navigation_2d.svg b/resources/light/icon_navigation_2d.svg deleted file mode 100644 index dc3c552..0000000 --- a/resources/light/icon_navigation_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_navigation_mesh_instance.svg b/resources/light/icon_navigation_mesh_instance.svg deleted file mode 100644 index 84ffabf..0000000 --- a/resources/light/icon_navigation_mesh_instance.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_navigation_polygon_instance.svg b/resources/light/icon_navigation_polygon_instance.svg deleted file mode 100644 index c93b7d1..0000000 --- a/resources/light/icon_navigation_polygon_instance.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/resources/light/icon_nine_patch_rect.svg b/resources/light/icon_nine_patch_rect.svg deleted file mode 100644 index 74072b5..0000000 --- a/resources/light/icon_nine_patch_rect.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/resources/light/icon_node.svg b/resources/light/icon_node.svg deleted file mode 100644 index cae7079..0000000 --- a/resources/light/icon_node.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_node_2d.svg b/resources/light/icon_node_2d.svg deleted file mode 100644 index 356a1bd..0000000 --- a/resources/light/icon_node_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_omni_light.svg b/resources/light/icon_omni_light.svg deleted file mode 100644 index 87f8ab1..0000000 --- a/resources/light/icon_omni_light.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_option_button.svg b/resources/light/icon_option_button.svg deleted file mode 100644 index d84f205..0000000 --- a/resources/light/icon_option_button.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/resources/light/icon_panel.svg b/resources/light/icon_panel.svg deleted file mode 100644 index 9f723a0..0000000 --- a/resources/light/icon_panel.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_panel_container.svg b/resources/light/icon_panel_container.svg deleted file mode 100644 index 1d1f1ab..0000000 --- a/resources/light/icon_panel_container.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_parallax_background.svg b/resources/light/icon_parallax_background.svg deleted file mode 100644 index bfe6bad..0000000 --- a/resources/light/icon_parallax_background.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/resources/light/icon_parallax_layer.svg b/resources/light/icon_parallax_layer.svg deleted file mode 100644 index 54d0b55..0000000 --- a/resources/light/icon_parallax_layer.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/resources/light/icon_particles.svg b/resources/light/icon_particles.svg deleted file mode 100644 index 4ece220..0000000 --- a/resources/light/icon_particles.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_particles_2d.svg b/resources/light/icon_particles_2d.svg deleted file mode 100644 index 5ddd269..0000000 --- a/resources/light/icon_particles_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_path.svg b/resources/light/icon_path.svg deleted file mode 100644 index f1cd7bc..0000000 --- a/resources/light/icon_path.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_path_2d.svg b/resources/light/icon_path_2d.svg deleted file mode 100644 index 43492dd..0000000 --- a/resources/light/icon_path_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_path_follow.svg b/resources/light/icon_path_follow.svg deleted file mode 100644 index a165202..0000000 --- a/resources/light/icon_path_follow.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_path_follow_2d.svg b/resources/light/icon_path_follow_2d.svg deleted file mode 100644 index d7f4fbc..0000000 --- a/resources/light/icon_path_follow_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_physical_bone.svg b/resources/light/icon_physical_bone.svg deleted file mode 100644 index 5f25040..0000000 --- a/resources/light/icon_physical_bone.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/resources/light/icon_pin_joint.svg b/resources/light/icon_pin_joint.svg deleted file mode 100644 index 3a732c2..0000000 --- a/resources/light/icon_pin_joint.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_pin_joint_2d.svg b/resources/light/icon_pin_joint_2d.svg deleted file mode 100644 index dfe0bf5..0000000 --- a/resources/light/icon_pin_joint_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_polygon_2_d.svg b/resources/light/icon_polygon_2_d.svg deleted file mode 100644 index 0dd196b..0000000 --- a/resources/light/icon_polygon_2_d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_popup.svg b/resources/light/icon_popup.svg deleted file mode 100644 index af3ac1b..0000000 --- a/resources/light/icon_popup.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_popup_dialog.svg b/resources/light/icon_popup_dialog.svg deleted file mode 100644 index 3d99858..0000000 --- a/resources/light/icon_popup_dialog.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_popup_menu.svg b/resources/light/icon_popup_menu.svg deleted file mode 100644 index f78dd50..0000000 --- a/resources/light/icon_popup_menu.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_popup_panel.svg b/resources/light/icon_popup_panel.svg deleted file mode 100644 index 55f4af5..0000000 --- a/resources/light/icon_popup_panel.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_position_2d.svg b/resources/light/icon_position_2d.svg deleted file mode 100644 index fd9116c..0000000 --- a/resources/light/icon_position_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_position_3d.svg b/resources/light/icon_position_3d.svg deleted file mode 100644 index 58dea0e..0000000 --- a/resources/light/icon_position_3d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_progress_bar.svg b/resources/light/icon_progress_bar.svg deleted file mode 100644 index 01d3387..0000000 --- a/resources/light/icon_progress_bar.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_ray_cast.svg b/resources/light/icon_ray_cast.svg deleted file mode 100644 index 69a2281..0000000 --- a/resources/light/icon_ray_cast.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_ray_cast_2d.svg b/resources/light/icon_ray_cast_2d.svg deleted file mode 100644 index 7791071..0000000 --- a/resources/light/icon_ray_cast_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_reference_rect.svg b/resources/light/icon_reference_rect.svg deleted file mode 100644 index 3fb547a..0000000 --- a/resources/light/icon_reference_rect.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_reflection_probe.svg b/resources/light/icon_reflection_probe.svg deleted file mode 100644 index ddf10f6..0000000 --- a/resources/light/icon_reflection_probe.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_remote_transform.svg b/resources/light/icon_remote_transform.svg deleted file mode 100644 index 359fa93..0000000 --- a/resources/light/icon_remote_transform.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_remote_transform_2d.svg b/resources/light/icon_remote_transform_2d.svg deleted file mode 100644 index f2afdd4..0000000 --- a/resources/light/icon_remote_transform_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_resource_preloader.svg b/resources/light/icon_resource_preloader.svg deleted file mode 100644 index fc31ea4..0000000 --- a/resources/light/icon_resource_preloader.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_rich_text_label.svg b/resources/light/icon_rich_text_label.svg deleted file mode 100644 index 9b86f48..0000000 --- a/resources/light/icon_rich_text_label.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_rigid_body.svg b/resources/light/icon_rigid_body.svg deleted file mode 100644 index 9968a6a..0000000 --- a/resources/light/icon_rigid_body.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_rigid_body_2d.svg b/resources/light/icon_rigid_body_2d.svg deleted file mode 100644 index 057cb01..0000000 --- a/resources/light/icon_rigid_body_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_scroll_container.svg b/resources/light/icon_scroll_container.svg deleted file mode 100644 index 2eeb60e..0000000 --- a/resources/light/icon_scroll_container.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_skeleton.svg b/resources/light/icon_skeleton.svg deleted file mode 100644 index a82f891..0000000 --- a/resources/light/icon_skeleton.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_skeleton_2d.svg b/resources/light/icon_skeleton_2d.svg deleted file mode 100644 index a9a925c..0000000 --- a/resources/light/icon_skeleton_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_skeleton_i_k.svg b/resources/light/icon_skeleton_i_k.svg deleted file mode 100644 index 4585882..0000000 --- a/resources/light/icon_skeleton_i_k.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_slider_joint.svg b/resources/light/icon_slider_joint.svg deleted file mode 100644 index bf5e467..0000000 --- a/resources/light/icon_slider_joint.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_soft_body.svg b/resources/light/icon_soft_body.svg deleted file mode 100644 index a912f12..0000000 --- a/resources/light/icon_soft_body.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_spatial.svg b/resources/light/icon_spatial.svg deleted file mode 100644 index e59eff4..0000000 --- a/resources/light/icon_spatial.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_spin_box.svg b/resources/light/icon_spin_box.svg deleted file mode 100644 index becdaca..0000000 --- a/resources/light/icon_spin_box.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_spot_light.svg b/resources/light/icon_spot_light.svg deleted file mode 100644 index 44a1dd6..0000000 --- a/resources/light/icon_spot_light.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_spring_arm.svg b/resources/light/icon_spring_arm.svg deleted file mode 100644 index 8869e94..0000000 --- a/resources/light/icon_spring_arm.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/resources/light/icon_sprite.svg b/resources/light/icon_sprite.svg deleted file mode 100644 index 82cadaa..0000000 --- a/resources/light/icon_sprite.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_sprite_3d.svg b/resources/light/icon_sprite_3d.svg deleted file mode 100644 index aa0518e..0000000 --- a/resources/light/icon_sprite_3d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_static_body.svg b/resources/light/icon_static_body.svg deleted file mode 100644 index 45b0d5b..0000000 --- a/resources/light/icon_static_body.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_static_body_2d.svg b/resources/light/icon_static_body_2d.svg deleted file mode 100644 index 3004e89..0000000 --- a/resources/light/icon_static_body_2d.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/resources/light/icon_tab_container.svg b/resources/light/icon_tab_container.svg deleted file mode 100644 index f97cab1..0000000 --- a/resources/light/icon_tab_container.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_tabs.svg b/resources/light/icon_tabs.svg deleted file mode 100644 index 0df9d7e..0000000 --- a/resources/light/icon_tabs.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_text_edit.svg b/resources/light/icon_text_edit.svg deleted file mode 100644 index 4a41e95..0000000 --- a/resources/light/icon_text_edit.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/resources/light/icon_texture_button.svg b/resources/light/icon_texture_button.svg deleted file mode 100644 index 778346c..0000000 --- a/resources/light/icon_texture_button.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_texture_progress.svg b/resources/light/icon_texture_progress.svg deleted file mode 100644 index 465f4b5..0000000 --- a/resources/light/icon_texture_progress.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/resources/light/icon_texture_rect.svg b/resources/light/icon_texture_rect.svg deleted file mode 100644 index 3696914..0000000 --- a/resources/light/icon_texture_rect.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_tile_map.svg b/resources/light/icon_tile_map.svg deleted file mode 100644 index 64ff6ec..0000000 --- a/resources/light/icon_tile_map.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_timer.svg b/resources/light/icon_timer.svg deleted file mode 100644 index c7bc63d..0000000 --- a/resources/light/icon_timer.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_tool_button.svg b/resources/light/icon_tool_button.svg deleted file mode 100644 index 7aaad76..0000000 --- a/resources/light/icon_tool_button.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_touch_screen_button.svg b/resources/light/icon_touch_screen_button.svg deleted file mode 100644 index 2ca363e..0000000 --- a/resources/light/icon_touch_screen_button.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_tree.svg b/resources/light/icon_tree.svg deleted file mode 100644 index 0480f94..0000000 --- a/resources/light/icon_tree.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_tween.svg b/resources/light/icon_tween.svg deleted file mode 100644 index 10f7a99..0000000 --- a/resources/light/icon_tween.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_v_box_container.svg b/resources/light/icon_v_box_container.svg deleted file mode 100644 index 3e9390f..0000000 --- a/resources/light/icon_v_box_container.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_v_scroll_bar.svg b/resources/light/icon_v_scroll_bar.svg deleted file mode 100644 index 38d0196..0000000 --- a/resources/light/icon_v_scroll_bar.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_v_separator.svg b/resources/light/icon_v_separator.svg deleted file mode 100644 index 58781a9..0000000 --- a/resources/light/icon_v_separator.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_v_slider.svg b/resources/light/icon_v_slider.svg deleted file mode 100644 index 728de39..0000000 --- a/resources/light/icon_v_slider.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_v_split_container.svg b/resources/light/icon_v_split_container.svg deleted file mode 100644 index 7fc7990..0000000 --- a/resources/light/icon_v_split_container.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_vehicle_body.svg b/resources/light/icon_vehicle_body.svg deleted file mode 100644 index 4bca6e1..0000000 --- a/resources/light/icon_vehicle_body.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_vehicle_wheel.svg b/resources/light/icon_vehicle_wheel.svg deleted file mode 100644 index 9783eec..0000000 --- a/resources/light/icon_vehicle_wheel.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_video_player.svg b/resources/light/icon_video_player.svg deleted file mode 100644 index adcc5de..0000000 --- a/resources/light/icon_video_player.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_viewport.svg b/resources/light/icon_viewport.svg deleted file mode 100644 index a9be724..0000000 --- a/resources/light/icon_viewport.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_viewport_container.svg b/resources/light/icon_viewport_container.svg deleted file mode 100644 index 7284518..0000000 --- a/resources/light/icon_viewport_container.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_visibility_enabler.svg b/resources/light/icon_visibility_enabler.svg deleted file mode 100644 index 283f75d..0000000 --- a/resources/light/icon_visibility_enabler.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_visibility_enabler_2d.svg b/resources/light/icon_visibility_enabler_2d.svg deleted file mode 100644 index d3151a6..0000000 --- a/resources/light/icon_visibility_enabler_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_visibility_notifier.svg b/resources/light/icon_visibility_notifier.svg deleted file mode 100644 index 52d38f9..0000000 --- a/resources/light/icon_visibility_notifier.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_visibility_notifier_2d.svg b/resources/light/icon_visibility_notifier_2d.svg deleted file mode 100644 index 6be2ab7..0000000 --- a/resources/light/icon_visibility_notifier_2d.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_window_dialog.svg b/resources/light/icon_window_dialog.svg deleted file mode 100644 index 19db82a..0000000 --- a/resources/light/icon_window_dialog.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/light/icon_world_environment.svg b/resources/light/icon_world_environment.svg deleted file mode 100644 index 1ecc4a2..0000000 --- a/resources/light/icon_world_environment.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/resources/light/icon_y_sort.svg b/resources/light/icon_y_sort.svg deleted file mode 100644 index 1fd9bd0..0000000 --- a/resources/light/icon_y_sort.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/onig.wasm b/resources/onig.wasm new file mode 100644 index 0000000000000000000000000000000000000000..162f14a61a62d78b07c3dd98c3eddd8e24323445 GIT binary patch literal 473151 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%0AZBNCq+>{)3wNVvJK?TOS;LP^^szVYm813 z5Z6z9dY`==y1`gM!ZBtB$%UpbBasA$8HeiJ^aKa)m*=L}de%EPeX++6d-n45jI-mO z4bDxc=?-VFKyM#`!v7d(UP6~U%!=)`X;pQn2g_68h*{_Es5&yGpFYRG`PA=oEay4F zQLW5|(e<}C-d5mEVzPaJGjcTE*xY~M;8jPC9(&Q%*HqKli;utLr7t^i?aNiVyG^=oc;?TxQ{{Tpt2<2QfPyT0)o-uaHN|GKxo?Q6g0t@oV0`>s3hxc$uO+itz3 zK6USV!ofgRI;2K*LOso#qbMHT%e)^;eX-t-AcKzFadf(mzRQ{8#hGu?|E`;n;pGfn zj>r+GRv6ej^Wqnz8Nue;r!et!e6R0cua>%3rOL%<7KXt@p+2Uv%73IPsVao?rtHL{ z(M&kFaV0nCMk`G>g7qFLrbo1)A@xJ_9sDO3X7aq~3P--&3(t<@5j)@2j59BAQQgCQ zfCB0IbBrMvO!@_}{!EQ9RVliuQ2==5hH8{viej6W*7Hl0?z}9MpG}V;v66r=Wn%$= zdzyFLsvOV?Zh)WabwzWA7z(Jo6vJ+>SX#SI(nEkq1#Lks|V9^ z>HOBQl}wPR4n@?MFZp_I-sJ1Kd6T6NgE$v!A4$4uoXneeH$YEiXNkj5QAssU@2)8K zL}-{dE6KbOk4#pBZMcMo72IRYV<_Fo@%ISA{NVyO!fO3+v1QgjluLmjL{eCT3EnfT zUZ%CP4+Zg_Vg1D~k*=*1q{+8<*@1B6`8omCs+D~!%;)*-pR4xa7nmKT(|qfY1^H{+ zBJ|zWkfBYrcGA?LTp$j!o}I4E-^0fImiBvbLGHDa9WvOwA+$1Ye@ia4duII2?YHA1 zz3sG>Iy}8i&8YN~oig3Vu^olXVd&-?0c-Ef_?z0L#>K8uzZo9iqttX8rFgOvp(|^3 zl6^|FWXKySz_$qiL(OD3p>aWwEi0QOBPzq&_0D!>aj~niZ`ixC zbbD82>Gm!{q}$}*BfLG)C&=OL1~e9>t&O}PeRS>3iS!Q89%d6n(Zmaqtw=Cv6LdN~ z{su2ddcn`>@r@a+P!#MUbL-+xNy+4i#Dj9A8e;M+)jeX(c&@a|+PKUaU;hj$eP_GU z*LYD1L3w(70}ym+5D;*9S_oM2F9iOK79f0`9En&*m@V3^fR`t8yWc@Yc6l48o|ByU)zvt zekH=}q2+o?YcMuYlF{Ev9D4qm2cQ z2hsLB0JYuB(}~-F(y6D>>1DWYdk%2l@m%1J0pbF7Mzs!P*I^9_NF!`Hy`+Krwq>}9 zszdpO|3TJZ@bzSI&grvfON8gt7%lcJKIRR$b%_eMF1O~^<<{JiTH}Z~S~GgCt-1ZV zkj8mua6fO+F4_S75^ZitJxAgA7Qeb)gCg}bG9IyWFeF3UTo40~&T zyBq%yC1`_buvG3kv{8pOi1)o*I8D24{N{#NN1pA#MWOIxkolAt&|lhWaH4L)0YzRe z4lFG-c@C%ZC*FGV3x$Q#<2TK*z*&g=o6A%F1xi}Y-;MZNVMSR7Am?q(v~cLwrtu*9 zNjI@Z(+}S4*C^gO1c9`ssKf-gsMNrzhr@UeA=c_9=HxXgn;zz8HfO@X?NvQtPmgwAH*6X<7yNIfmiFwp|J zHj0kolsbrLVGR?x)dCXmZk+7g#k?2q)xWYn-OO%+L4{9~g|=*4f~NxS+UUOeF?2Kh zOxoDl`cVWo$fxn0aODS+(@X^h%18CaJna<^9z0jG)emlC--$9e4OL4s9%OyH zyT(ec1{dl_y62AO=&VuQr-*J*beOPy?DtozeOR;Mk(cr-nRI1fNT}nT78z%}AE_{x z2=xqbm$6nRtSzVm*35R7u|`U7tshut#D;i*ia4}^D{!qrKs`cB{c@^ahFrlvx`Vk` zZ<7@M*(d)%(25gr95l-0+=FdefCU(AMY9DZ7tp}uLs~?NAVz~ciTNVC2zOH}F!T1+ z>!;7#DCT!2+q3cU4y3m8(>~P+ho|d2oAqBBL=~pyolBzWzGyMNbb8DoTTJR|Tm1Oz zqQh+7J{ujKsYni0oGf_QNS5{b2M4*sh$Xyj@f9o_{Uu-0U83&woi$Nrt0sDj6@ly$S#oT;n=PuI!jZ>^pJGetPa^%JgXV4vWZKr_ZPgbGl&7H>pU1Irrx|zKl}@9 z0tnY1YVIAH--{ylqo!LN9>vgCHtT(RMnT^$z!v9tx`2_63oenv6%Cf^4 zan94Ur-azM+B0a{gFp!+fZmWU0c8t}EJkc%RG;eZcl@u9mt(UwfX+vOcUIJIBrpP& zvRnyhWb@_5knr1vtg`8uQP}LNlnBWUwOOv#H3yV!cN{ULhO9^x>0Vo+4--w>8=IZ7 zvy$uGiHHFWKn$(Ac^Wj>u$pB`edzlP0JZ`nMj*|nOmescjPv7{hTxhDRKO-K#Rt!` zA)Q$0FB2ofVBO9SZq^$Kb*K-7Uz;)ZrP>oXh@3|*DX3I&@g z(DAtw^iLy85O%kr)T+UGLdv*WJ$=rV+J{IXIqy$ZtP=xevMr^gZuOz>4|dieu^I91 zd}P>r)YGD0d~+z|O`Bl#rgpbdZh9!lJy2N-cpI96Zl&Pbn>b(W;H-S=OfyZ)`q%-TcFs=MTBl`jD%o4`0hA z2BKaw267d$^|iF_wY2WFO_4WdVKg`OAkvz1VI@W!M$>6mc&NYQv?62?YseYQW^5tCz)(;`24&2w(wYcH#PpSoxyU%Q2Sw@<5Q zseOAl?A2@#xOc<8DmRS9is1#@7sKX#snFS&C9>U9$mSJ{=!5u6fkM5Lc6@bt(PW!j z)#Nt(-WoaUnx9&&`MwvVS7Eg#I%dko2rJbX{f4DPX8oA%;)b+g2%G#s`!0iLUgI}= zxZ#*|js5hP_un@pXMOO_z6z%4Ar3Qc+2g4)jDsB)=iI{vZ*A^zBdCB*TI|3qoaNoj zAJ;bso<(FxZFCWZ_i@Y z)+_8Fz=FwS%5d_fFfwT}68?kG&h`!`hU=WPGp zug>2Bal^1v_QA|)jvdslAC>sJ#&QhnP@4=?DTp^cQ{_>qIfBB;2gQsly0EVBpsTw@vmfIKR?PeTdyRq`4_&IGWmjEk^1+SaIV`IK2gAq*kQ8c8q?Qc8$rD_C0;;(;uuW52$%bp7`7mY*b#e6 zEmgVa&PqJ_1b5u4fuQ~7$?5S)(VOOs!))$+(S>8lS+FFlHQ1xhFb}z_LIadN98+C(kQFat>zuqFGojlhL(4WD0XL zurNL3&BRvID{10p$kqdhpyD(!9ilGvLPAntbEoQe(izrT=I~CU^U>;}(7 zML3QpHiYZhq;jk^3``+;kd_t)p2nk>X5{T#AWyzX3h98K&yhA(KR+|1#qP-&X;&`r zl=}Kntk2w&3Cp+yw)TE?31=YaXp0;>I>&9}mo=S3B<}1P(Jy!eQ!Lu|G>#Fdxq z5Su$Y1mm7(-XTa)_w*ftDo)UQn+|d1J>!?tdF>FKp3uIAsO;7dL_ML=J(~9cSlZqJ z*B7^v*iH-OlsY{VEW$7=5@lZlcl!{HD?Jyhe{m;tuS zS{PoYq3a>KGC@FWOU$REZ2<~-huzNH*U2R39>bgGFr6+#8|*gYd(1eP1;64*=V!*d z2lo(4u^K1CruBI{RERpeg)z~K7-)fSoJ?P2Y0*{3JJnU1D|c}S;W%^W zvKh%pMuA{bY9ozjh&!ZZ#p<;ytE=i)AyOp-rz{ZzvsbYXMRjN{mVJPO!B<(jmG7Hz zYR-eCUmnNP>9P2DA(D@Q2*&Q!F;T#(LL#RWG6^9LbcfYdC(66P4#mS7vtxS+Waz!G zq7nFN+o~=&~!{N9W9*VJYialngT0UI7LL2M|kR2xWZERC$vk&fsMg}TE zvxmFMbl?>tgwJr3vxDj0di^C5aja~y^)f^YgVxckq(WYMT&=FTvAi#F;Cne7ys>-_ z2cjL{%>fJRT^tB5dnX45NpI)CFzT%w$f0rU-z86i``|1xKenN{92@t=mxd;6+<<1~ zEl&_a9LpAotWS_M#;%f5#v5Iu;G86@z4;9u+gRzOc-lsCV%&s5yMFgL5wj4HUPk{Q8k~ zC&UI(6Pv50nhY@UVm{zwtQR*@?Q3SGNrOKT&lzGx{Sm`Jd{Wr?^vGQRl?foc+LsHE z%4h))=EgEW?A%Q!Gam$U%8?JWx-@+HKBjIDZSeM-URQG_x|m^3e_r;?*=_>EHa}fX zP{~v9liV$|ayRTOcVC2=*uxXOHo7VhDxW-CfEm?Zs!K`I6d@)rhJ22` zjJ*(a)q2D=(`$iV1w1hdM{69Jx8$ltOURlGxN2F5-}dzqmQ~(4KGOJ^@i9vjGv6E) z5TY`}0CPB}0VeAvYQoIhZKNEYSIb$@em2~L)s}7bQJTdH-9!xuox|<=;2Dwo3?lBH z0+AStLv)kfj=lbxKEd*@?df5W)JS)Bzzpp}(}Hgg*T4H|?cm$S%uUu`YQpL1ACdLq z240>)fE%O(mSX)r>=_#$BIH?f1Qz&HaD6X2 z&(Fq^VlS1s?rhOR$*0B~JLdO7Nz(u4`g~3u9iPvXI!7ud}J zsaZJY0?n*-2yfh}83Q8bhZ$CaXa$obrKN{m-4T}id^DJ37<3L#VHhehx zTx_lAvq(&LIU0FST7mvk3?zc{!|Y6*I71y~L8F#KS!1%H1ePT=RBOLKI<%XLO}^?K z5*!=snb9$j;Mn5S%$0N^6uhyJA|W*9L!SjY#eKEDKqp-Cj5X+<=uCJFE=heC9!VHw zy;aie!6M_(bhan821JK?onIk@GKnt-CcG<`>W%?Z81Z{Dt?-Pr2_^aHxr&7=E)7R0 ziZK4>nyu+P$^`orohLA3^oFBErEOyO%h9e+fs2K*%KCI6q1tu`#7JUkVJjbazA$v? zPXUIWj!JEd0}Lf}DE1ae0v$=7?N@0>SR&4XlN~JilR8C`=O77~`5^gnsQ7ev+6iN5 zl1sqI>{+NgLuvN{HSt(<;meAjKX_?c#!#mnIFHe;oVpKFcP~*Yi0L^xVxo@76LqsR zG>*;@8iPW@`dz92Y6vi9kyRl3mCiA>=`IIbdR}5^bwC&$B_lPP2TnUX!eR&Na6x7x z16zqZ;hbbU<%{8QbR?i!ZKguSqt|olUw*|!ze@H&W5LX)Bv}ZG2*^cmWTHL$x%im0 z*n1!tf`EY_IyH%B*?bQcYJfqAK1YKoT+mMe%roHU1{i(Q0Zx`uT8@w(vsa3rObRgEKhEqi0q(q*a|%&ydhyi)DEXG~s|`Rvdk zraAC>huyZG+~YCV$I9|lF(;2=tQY7;`3pWW?W6_3#oI`HV$9gwvt$lq^TLeTAvhi0 z!~e<@C21g{Nt!}weqPh6GT=t@Xu`M5ovudhhtiaYpqlM1Il4FX{~Y2n#)2YGop+V` zcjw*NRotS`Pz1aM%*6OqSDhXkdDwbT9pe_h>*^@ML+8ZHNY7N#^}rlXVD7GkgTHAe zzVf-JKewD)OassZD`OaAuh}G)E+>-UDVR(F6B64AP{(70S3Md%fQVThgdG59L38}w zk&v*(@(7So9vwAerV~U3_YD)RLx|)j4Rj}N!CT1eqa_W9kfuchH86>YARaN-jlhaz zvB3;bF*5-({>(7J1gsg}to9{w7yb^cD#kGJy_}WUfHRg0%LbfHn2duBNQFinSK`4< zWS&8_%mx$Lz{$fUHaIF9?7S-rMhfs;O0dDCI(izv+tLH)Ymh1XU_01=wfIO^#0dsG zG2X!g`y$ys@O$awEasevwevQnINi1#rm`oJ8%nnNB|JDJlOW0iH|e6lXQg`AF0Iy- zn+i-v_1Khpis;%qMs~Snyc^TVq_D6bGHMm^lFjw;NlYbXN_;V6aylHiqlld!2bJL( z=t$g-!eODE9vP_fn6}%7S3%}jF`&~YILQz_R;D91SYYp3<9&ISj51;HNE$$SPU(_| zDF$`Srb8FMkq?{?oFelxc+4o7Xw&w@7>*7eElbl*(K<$J(YjQhOpSk7FsShWv&T)H zPK^(?c%0HE444*A7e>8jP@*FtMf_ZRERTKTlteg!Ft?vZ(oR_M6#q6{Z*cn)3 zW7A*tQl>VHjBQK{I24OvVOls76QQyW^(g-#lzVyy4sDEwr?e^(S)J3)uJ`4_@!AFN z2l10U2@o(D(t42HEBBqlF z*H9eM`hdIFXSbfef-NJ$CB@HzozL`Tv zw;RjXbISD64b;uVVl%fyl_R1h;o?1X%jW_%(03+2{IKmFB{(FCfe&}?EudhYNHksEdayz@hdAq!Qw<5_i`)jTdA5WNn!|s4WRe?j7ylUwCHPM=>)Zi~%B+|qpV{qA7AlHxC zY@ma*3|VNQYyv?q>wrim)YpbT)GgN7{TpynJ0pj0WEUM{fEZ1Mo%g=kT7AM9YUqUX zUkaF=l$>0$40~tf97O>G*k1{bM8uHFA(J?A9h26^CrFP@{oNHg70I}a9O5oKT7UPZ zCK8|=o{={UL{&pNOy!(@$_dskPKI2RMp<$`Em{=kPEhc?b$N;?GU?mOPN+b7(|oe$ z%sR^e64_yiod&?BM605QCCDof9Nh{n%aJc2Yr-fT;2o1vZls_~%_VP<_7U7Ed*ix> zN&f9>u|ekJyb&+-{C`U(SwI0GY*%Y{)8mlG(u8NXzyWyo!2=oO>>6tkYXHXrZaj_< z@YsGN)&hx}-u84q(Ebsr+74(#EdKoFo!AU+l~J-$9w2k){j*?ILMgY&32Fx+1#UGU zJrZ$rcVp>U({#g1k#?&mJH!Id1{{Ekn*iL`yhrx_Ayrk(Kx=v&;bFj7N={h z&g0et=wuDrWlofTM5rj@0N78^8`lzOn?xAd*BJ!`hOlN>5C~y_aBJus8AqA~$75*s zsgs;I)K0XpcgFw_ppQZ59Q=*E${Xle^oFsVUe*;ZaXOru%w)`lj_3qSC`#nF{L8cM_MKWG>5fY^FGhZxL0xHQ9*x`o&h zMmNkiu;L?O4OUN!BD(T9WopGB#sbXdnYP=soEvnhx{F=vE6COgQwt|HaR|bGq|s#= zM&ygs=>%P3Hz5)c(>s&Cgt4G^>a5NW(TPP2U01YmpH7#W8LRC8Xs~Va`jsdHrJ4*n zeE=EM+$9^H7!H4MA9+Cu;yOhlD)ceMKiq}bp*0T&(n0{NsTEy&MzgS%DtKsJ9m)Bz zWW_TK*oJyuG(rXr2QHMwj2n7l{*RC+Wy>_=X5mZR}>{O)HS!=qYP)f~D>3-6lvQ27BiSNRrf&t@@lB+WyWLSS<>^?)s zpjQ|^GWGg-O$LaHKG80ZvoO@T!?-7vadSFc$76Kz3E$Gd2hrN&A!VWM1%lzU<~vk0 z|DTswV)y{V7Q6>N8Rg7)m8Y};@l2P$-4=s3%t%6mRy9At==N+wxZmU2+u)t|@|gDH ztb&c*yQaI{-~uiM)%3wRwM6n7-HdN6#3ARHQe8i{r9RoH+WA}5R?}BX$N2?8TQWT_9a*T`65!y8BlUiv#z@`8ibqgqDgDp=s=q=zrF)G zZ^k(Gl@oV(-Q><7WT_{;Q;7;`;i$bDPClsjQYQ)SnMe$Tu7`tQt=Zu2Q0nOu^dg@$ zY>~(JXU4-3{)?a(h|O!z_Ac8&0w1z6s?~r6Cdlihgf#>%!4MyRLDf;7Ru)ClP!|*OMemjcDO-2P{@&A6Zd` z?10L8)ti>5{%f#_cV~`G)tj5{MIo`n6xUP^SY5d{>F12!F6run;P2##G=^{@)@fjo z%&o-nVO%uqjyE%|u`t<)OAAWQ82jZ#whw@w4Wdygag$}%(h_M1!A%20ee<`X55eD@Tr-R=_2Y(wGcI~j_RE3oC!}$cye!$ z?s4||%xK;KJ>d!KfV{|hO+zt7n$=GO2c`%+lVXRa1?V%Rrv*=p+!)p`E85V!qiG4= z;8T@sH)qF1iRCkVM((h)L&>K4=Q>u|c4`~5V}1B{3pUun4!Is{nH!N48J~`l3-6CP z%#V9j|4&~Er(E(I4eG}~y-y#V`Um5%{`KZ*n3nb9&81GFLH)bUWtC|oy~z6?;`S)U z6$UeIp~-h@kDKH<_7x4RtP+?GScBo0-Kw2NJA&Cz9(MVc{$$5Ig6V|0C+X<`477ao ze%$38F3iT;SitHX#*Y==$PoW@Au@=&c?`X?4`$WG-IE<+&0FJ{wDKh_m5A{S-CNBA z+b)e~be^h$D9>ffd2cf1O-x>Jjfr7RsZYjIf{mzdiz?wC{3P>F1E}~^13{Kxh|^7j z!29S6$(&x(oDMT4nbVPBS`5%ZW9@V#NYA)H3M7L%%wMYW8*;;`xYehAmtLWVMIny0 zZ3!)~{@VNuJU|n-Av|HumSC;k!Cmq(v%jwYSutd9^(2rUyr@zZgCcIo>1CojoN`#8CmJuo3w)T^x?p53A≷b}RuTNLk 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 z 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

PW;PG~iV~(eOVs>0W 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 T?79^lh+n*~T1!K7aE5^n literal 0 HcmV?d00001 diff --git a/resources/dark/icon_edit.svg b/resources/other_icons/dark/icon_edit.svg similarity index 100% rename from resources/dark/icon_edit.svg rename to resources/other_icons/dark/icon_edit.svg diff --git a/resources/dark/icon_refresh.svg b/resources/other_icons/dark/icon_refresh.svg similarity index 100% rename from resources/dark/icon_refresh.svg rename to resources/other_icons/dark/icon_refresh.svg diff --git a/resources/light/icon_edit.svg b/resources/other_icons/light/icon_edit.svg similarity index 99% rename from resources/light/icon_edit.svg rename to resources/other_icons/light/icon_edit.svg index b826c1c..96850e4 100644 --- a/resources/light/icon_edit.svg +++ b/resources/other_icons/light/icon_edit.svg @@ -1,5 +1,5 @@ - - - - - + + + + + diff --git a/resources/light/icon_refresh.svg b/resources/other_icons/light/icon_refresh.svg similarity index 99% rename from resources/light/icon_refresh.svg rename to resources/other_icons/light/icon_refresh.svg index f8e9ae3..4973f5e 100644 --- a/resources/light/icon_refresh.svg +++ b/resources/other_icons/light/icon_refresh.svg @@ -1,3 +1,3 @@ - - - + + + diff --git a/src/debugger/debug_runtime.ts b/src/debugger/debug_runtime.ts index afe9e25..6a70aa3 100644 --- a/src/debugger/debug_runtime.ts +++ b/src/debugger/debug_runtime.ts @@ -1,6 +1,6 @@ import { SceneTreeProvider } from "./scene_tree_provider"; import path = require("path"); -import { createLogger } from "../logger"; +import { createLogger } from "../utils"; const log = createLogger("debugger.runtime"); diff --git a/src/debugger/debugger.ts b/src/debugger/debugger.ts index 257e02b..c35601b 100644 --- a/src/debugger/debugger.ts +++ b/src/debugger/debugger.ts @@ -13,15 +13,18 @@ import { DebugSession, CancellationToken, ProviderResult, - Uri + FileDecoration, + FileDecorationProvider, + Uri, + EventEmitter, + Event, } from "vscode"; import { DebugProtocol } from "@vscode/debugprotocol"; import { GodotDebugSession as Godot3DebugSession } from "./godot3/debug_session"; import { GodotDebugSession as Godot4DebugSession } from "./godot4/debug_session"; -import { register_command, projectVersion, set_context } from "../utils"; +import { register_command, projectVersion, set_context, createLogger } from "../utils"; import { SceneTreeProvider, SceneNode } from "./scene_tree_provider"; import { InspectorProvider, RemoteProperty } from "./inspector_provider"; -import { createLogger } from "../logger"; const log = createLogger("debugger", { output: "Godot Debugger" }); @@ -31,6 +34,17 @@ export interface LaunchRequestArguments extends DebugProtocol.LaunchRequestArgum project: string; scene: string; editor_path: string; + profiling: boolean; + single_threaded_scene: boolean; + debug_collisions: boolean; + debug_paths: boolean; + debug_navigation: boolean; + debug_avoidance: boolean; + debug_stringnames: boolean; + frame_delay: number; + time_scale: number; + disable_vsync: boolean; + fixed_fps: number; additional_options: string; } @@ -44,20 +58,27 @@ export interface AttachRequestArguments extends DebugProtocol.AttachRequestArgum export let pinnedScene: Uri; -export class GodotDebugger implements DebugAdapterDescriptorFactory, DebugConfigurationProvider { +export class GodotDebugger implements DebugAdapterDescriptorFactory, DebugConfigurationProvider, FileDecorationProvider { public session?: Godot3DebugSession | Godot4DebugSession; public inspectorProvider = new InspectorProvider(); public sceneTreeProvider = new SceneTreeProvider(); + private _onDidChangeFileDecorations = new EventEmitter(); + get onDidChangeFileDecorations(): Event { + return this._onDidChangeFileDecorations.event; + } constructor(private context: ExtensionContext) { log.info("Initializing Godot Debugger"); + this.restore_pinned_file(); + context.subscriptions.push( debug.registerDebugConfigurationProvider("godot", this), debug.registerDebugAdapterDescriptorFactory("godot", this), window.registerTreeDataProvider("inspectNode", this.inspectorProvider), window.registerTreeDataProvider("activeSceneTree", this.sceneTreeProvider), + window.registerFileDecorationProvider(this), register_command("debugger.inspectNode", this.inspect_node.bind(this)), register_command("debugger.refreshSceneTree", this.refresh_scene_tree.bind(this)), register_command("debugger.refreshInspector", this.refresh_inspector.bind(this)), @@ -70,6 +91,15 @@ export class GodotDebugger implements DebugAdapterDescriptorFactory, DebugConfig ); } + provideFileDecoration(uri: Uri, token: CancellationToken): FileDecoration | undefined { + if (uri.scheme !== "file") return undefined; + if (pinnedScene && uri.fsPath === pinnedScene.fsPath) { + return { + badge: "🖈", + }; + } + } + public createDebugAdapterDescriptor(session: DebugSession): ProviderResult { log.info("Creating debug session"); log.info(`Project version identified as ${projectVersion}`); @@ -182,18 +212,34 @@ export class GodotDebugger implements DebugAdapterDescriptorFactory, DebugConfig } log.info(`Pinning debug target file: '${uri.fsPath}'`); set_context("pinnedScene", [uri.fsPath]); + if (pinnedScene) { + this._onDidChangeFileDecorations.fire(pinnedScene); + } pinnedScene = uri; + this.context.workspaceState.update("pinnedScene", pinnedScene); + this._onDidChangeFileDecorations.fire(uri); } public unpin_file(uri: Uri) { log.info(`Unpinning debug target file: '${pinnedScene}'`); set_context("pinnedScene", []); + const previousPinnedScene = pinnedScene; pinnedScene = undefined; + this.context.workspaceState.update("pinnedScene", pinnedScene); + this._onDidChangeFileDecorations.fire(previousPinnedScene); + } + + public restore_pinned_file() { + pinnedScene = this.context.workspaceState.get("pinnedScene", undefined); + if (pinnedScene) { + log.info(`Restoring pinned debug target file: '${pinnedScene.fsPath}'`); + set_context("pinnedScene", [pinnedScene.fsPath]); + } } public open_pinned_file() { log.info(`Opening pinned debug target file: '${pinnedScene}'`); - if (pinnedScene){ + if (pinnedScene) { window.showTextDocument(pinnedScene); } } diff --git a/src/debugger/godot3/debug_session.ts b/src/debugger/godot3/debug_session.ts index e7a1a30..620bc8e 100644 --- a/src/debugger/godot3/debug_session.ts +++ b/src/debugger/godot3/debug_session.ts @@ -17,7 +17,7 @@ import { SceneTreeProvider } from "../scene_tree_provider"; import { ObjectId } from "./variables/variants"; import { parse_variable, is_variable_built_in_type } from "./helpers"; import { ServerController } from "./server_controller"; -import { createLogger } from "../../logger"; +import { createLogger } from "../../utils"; const log = createLogger("debugger.session", { output: "Godot Debugger" }); diff --git a/src/debugger/godot3/helpers.ts b/src/debugger/godot3/helpers.ts index 60f00a4..e03e9ff 100644 --- a/src/debugger/godot3/helpers.ts +++ b/src/debugger/godot3/helpers.ts @@ -1,18 +1,18 @@ -import { GodotVariable, RawObject } from "../debug_runtime"; +import { GodotVariable, } from "../debug_runtime"; import { SceneNode } from "../scene_tree_provider"; export function parse_next_scene_node(params: any[], ofs: { offset: number } = { offset: 0 }): SceneNode { - const child_count: number = params[ofs.offset++]; + const childCount: number = params[ofs.offset++]; const name: string = params[ofs.offset++]; - const class_name: string = params[ofs.offset++]; + const className: string = params[ofs.offset++]; const id: number = params[ofs.offset++]; const children: SceneNode[] = []; - for (let i = 0; i < child_count; ++i) { + for (let i = 0; i < childCount; ++i) { children.push(parse_next_scene_node(params, ofs)); } - return new SceneNode(name, class_name, id, children); + return new SceneNode(name, className, id, children); } export function split_buffers(buffer: Buffer) { @@ -65,7 +65,7 @@ export function build_sub_values(va: GodotVariable) { va.sub_values = subValues; - subValues?.forEach((sva) => build_sub_values(sva)); + subValues?.forEach(build_sub_values); } export function parse_variable(va: GodotVariable, i?: number) { diff --git a/src/debugger/godot3/server_controller.ts b/src/debugger/godot3/server_controller.ts index cd69d89..5b0c139 100644 --- a/src/debugger/godot3/server_controller.ts +++ b/src/debugger/godot3/server_controller.ts @@ -9,11 +9,10 @@ import { RawObject } from "./variables/variants"; import { GodotStackFrame, GodotStackVars } from "../debug_runtime"; import { GodotDebugSession } from "./debug_session"; import { parse_next_scene_node, split_buffers, build_sub_values } from "./helpers"; -import { get_configuration, get_free_port, projectVersion } from "../../utils"; +import { get_configuration, get_free_port, projectVersion, createLogger } from "../../utils"; import { prompt_for_godot_executable } from "../../utils/prompts"; import { subProcess, killSubProcesses } from "../../utils/subspawn"; import { LaunchRequestArguments, AttachRequestArguments, pinnedScene } from "../debugger"; -import { createLogger } from "../../logger"; const log = createLogger("debugger.controller", { output: "Godot Debugger" }); const socketLog = createLogger("debugger.socket"); @@ -139,12 +138,12 @@ export class ServerController { const address = args.address.replace("tcp://", ""); command += ` --remote-debug "${address}:${args.port}"`; - if (get_configuration("debugger.forceVisibleCollisionShapes")) { - command += " --debug-collisions"; - } - if (get_configuration("debugger.forceVisibleNavMesh")) { - command += " --debug-navigation"; - } + if (args.profiling) { command += " --profiling"; } + if (args.debug_collisions) { command += " --debug-collisions"; } + if (args.debug_paths) { command += " --debug-paths"; } + if (args.frame_delay) { command += ` --frame-delay ${args.frame_delay}`; } + if (args.time_scale) { command += ` --time-scale ${args.time_scale}`; } + if (args.fixed_fps) { command += ` --fixed-fps ${args.fixed_fps}`; } if (args.scene && args.scene !== "main") { log.info(`Custom scene argument provided: ${args.scene}`); diff --git a/src/debugger/godot4/debug_session.ts b/src/debugger/godot4/debug_session.ts index e7a1a30..f36159d 100644 --- a/src/debugger/godot4/debug_session.ts +++ b/src/debugger/godot4/debug_session.ts @@ -17,7 +17,7 @@ import { SceneTreeProvider } from "../scene_tree_provider"; import { ObjectId } from "./variables/variants"; import { parse_variable, is_variable_built_in_type } from "./helpers"; import { ServerController } from "./server_controller"; -import { createLogger } from "../../logger"; +import { createLogger } from "../../utils"; const log = createLogger("debugger.session", { output: "Godot Debugger" }); @@ -515,8 +515,9 @@ export class GodotDebugSession extends LoggingDebugSession { ? collection_items.get(key)?.id : collection_items[key]?.id; } else { - result.object_id = Array.from(root.value.entries()) - .find(x => x && x[0].split("Members/").join("").split("Locals/").join("") == propertyName)[1].id; + const entries = Array.from(root.value.entries()); + const item = entries.find(x => x && x[0].split("Members/").join("").split("Locals/").join("") == propertyName); + result.object_id = item?.[1].id; } } diff --git a/src/debugger/godot4/helpers.ts b/src/debugger/godot4/helpers.ts index a40d4bb..066a985 100644 --- a/src/debugger/godot4/helpers.ts +++ b/src/debugger/godot4/helpers.ts @@ -1,23 +1,20 @@ -import { GodotVariable, RawObject } from "../debug_runtime"; +import { GodotVariable, } from "../debug_runtime"; import { SceneNode } from "../scene_tree_provider"; -import { createLogger } from "../../logger"; - -const log = createLogger("debugger.helpers"); export function parse_next_scene_node(params: any[], ofs: { offset: number } = { offset: 0 }): SceneNode { - const child_count: number = params[ofs.offset++]; + const childCount: number = params[ofs.offset++]; const name: string = params[ofs.offset++]; - const class_name: string = params[ofs.offset++]; + const className: string = params[ofs.offset++]; const id: number = params[ofs.offset++]; - const scene_file_path: string = params[ofs.offset++]; - const view_flags: number = params[ofs.offset++]; + const sceneFilePath: string = params[ofs.offset++]; + const viewFlags: number = params[ofs.offset++]; const children: SceneNode[] = []; - for (let i = 0; i < child_count; ++i) { + for (let i = 0; i < childCount; ++i) { children.push(parse_next_scene_node(params, ofs)); } - return new SceneNode(name, class_name, id, children, scene_file_path, view_flags); + return new SceneNode(name, className, id, children, sceneFilePath, viewFlags); } export function split_buffers(buffer: Buffer) { @@ -39,7 +36,6 @@ export function is_variable_built_in_type(va: GodotVariable) { return ["number", "bigint", "boolean", "string"].some(x => x == type); } - export function build_sub_values(va: GodotVariable) { const value = va.value; @@ -74,7 +70,6 @@ export function build_sub_values(va: GodotVariable) { subValues?.forEach(build_sub_values); } - export function parse_variable(va: GodotVariable, i?: number) { const value = va.value; let rendered_value = ""; diff --git a/src/debugger/godot4/server_controller.ts b/src/debugger/godot4/server_controller.ts index 1939a2f..2c6c524 100644 --- a/src/debugger/godot4/server_controller.ts +++ b/src/debugger/godot4/server_controller.ts @@ -9,11 +9,10 @@ import { RawObject } from "./variables/variants"; import { GodotStackFrame, GodotVariable, GodotStackVars } from "../debug_runtime"; import { GodotDebugSession } from "./debug_session"; import { parse_next_scene_node, split_buffers, build_sub_values } from "./helpers"; -import { get_configuration, get_free_port, projectVersion } from "../../utils"; +import { get_configuration, get_free_port, projectVersion, createLogger } from "../../utils"; import { prompt_for_godot_executable } from "../../utils/prompts"; import { subProcess, killSubProcesses } from "../../utils/subspawn"; import { LaunchRequestArguments, AttachRequestArguments, pinnedScene } from "../debugger"; -import { createLogger } from "../../logger"; const log = createLogger("debugger.controller", { output: "Godot Debugger" }); const socketLog = createLogger("debugger.socket"); @@ -140,12 +139,17 @@ export class ServerController { const address = args.address.replace("tcp://", ""); command += ` --remote-debug "tcp://${address}:${args.port}"`; - if (get_configuration("debugger.forceVisibleCollisionShapes")) { - command += " --debug-collisions"; - } - if (get_configuration("debugger.forceVisibleNavMesh")) { - command += " --debug-navigation"; - } + if (args.profiling) { command += " --profiling"; } + if (args.single_threaded_scene) { command += " --single-threaded-scene"; } + if (args.debug_collisions) { command += " --debug-collisions"; } + if (args.debug_paths) { command += " --debug-paths"; } + if (args.debug_navigation) { command += " --debug-navigation"; } + if (args.debug_avoidance) { command += " --debug-avoidance"; } + if (args.debug_stringnames) { command += " --debug-stringnames"; } + if (args.frame_delay) { command += ` --frame-delay ${args.frame_delay}`; } + if (args.time_scale) { command += ` --time-scale ${args.time_scale}`; } + if (args.disable_vsync) { command += " --disable-vsync"; } + if (args.fixed_fps) { command += ` --fixed-fps ${args.fixed_fps}`; } if (args.scene && args.scene !== "main") { log.info(`Custom scene argument provided: ${args.scene}`); diff --git a/src/debugger/index.ts b/src/debugger/index.ts new file mode 100644 index 0000000..2392ae7 --- /dev/null +++ b/src/debugger/index.ts @@ -0,0 +1 @@ +export * from "./debugger"; diff --git a/src/debugger/scene_tree_provider.ts b/src/debugger/scene_tree_provider.ts index acbf822..b09052a 100644 --- a/src/debugger/scene_tree_provider.ts +++ b/src/debugger/scene_tree_provider.ts @@ -7,6 +7,9 @@ import { TreeItemCollapsibleState, } from "vscode"; import path = require("path"); +import { get_extension_uri } from "../utils"; + +const iconDir = get_extension_uri("resources", "godot_icons").fsPath; export class SceneTreeProvider implements TreeDataProvider { private _on_did_change_tree_data: EventEmitter< @@ -75,7 +78,6 @@ export class SceneNode extends TreeItem { ) { super(label); - const iconDir = path.join(__filename, "..", "..", "..", "resources", "godot_icons"); const iconName = class_name + ".svg"; this.iconPath = { diff --git a/src/document_link_provider.ts b/src/document_link_provider.ts deleted file mode 100644 index 39cfa79..0000000 --- a/src/document_link_provider.ts +++ /dev/null @@ -1,39 +0,0 @@ -import * as vscode from "vscode"; -import { Uri, Position, Range } from "vscode"; -import { convert_resource_path_to_uri } from "./utils"; - -export class GDDocumentLinkProvider implements vscode.DocumentLinkProvider { - private context: vscode.ExtensionContext; - - constructor(context: vscode.ExtensionContext) { - this.context = context; - - const disp = vscode.languages.registerDocumentLinkProvider( - ["gdresource"], - this - ); - - context.subscriptions.push(disp); - } - - async provideDocumentLinks( - document: vscode.TextDocument, - token: vscode.CancellationToken - ): Promise { - let links = []; - let lines = document.getText().split("\n"); - for (let i = 0; i < lines.length; i++) { - const match = lines[i].match(/res:\/\/[^"^']*/); - if (match) { - const start = new Position(i, match.index); - const end = new Position(i, match.index + match[0].length); - const r = new Range(start, end); - const uri = await convert_resource_path_to_uri(match[0]); - if (uri instanceof Uri) { - links.push(new vscode.DocumentLink(r, uri)); - } - } - } - return links; - } -} diff --git a/src/extension.ts b/src/extension.ts index 59f8867..bcc2b24 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,10 +1,20 @@ import * as path from "path"; import * as vscode from "vscode"; -import { attemptSettingsUpdate } from "./settings_updater"; -import { GDDocumentLinkProvider } from "./document_link_provider"; -import { ClientConnectionManager } from "./lsp/ClientConnectionManager"; -import { ScenePreviewProvider } from "./scene_preview_provider"; -import { GodotDebugger } from "./debugger/debugger"; +import { attemptSettingsUpdate } from "./utils"; +import { + GDInlayHintsProvider, + GDHoverProvider, + GDDocumentLinkProvider, + GDSemanticTokensProvider, + GDCompletionItemProvider, + GDDocumentationProvider, + GDDefinitionProvider, + GDTaskProvider, +} from "./providers"; +import { ClientConnectionManager } from "./lsp"; +import { ScenePreviewProvider } from "./scene_tools"; +import { GodotDebugger } from "./debugger"; +import { FormattingProvider } from "./formatter"; import { exec, execSync } from "child_process"; import { get_configuration, @@ -18,23 +28,45 @@ import { } from "./utils"; import { prompt_for_godot_executable } from "./utils/prompts"; -let lspClientManager: ClientConnectionManager = null; -let linkProvider: GDDocumentLinkProvider = null; -let scenePreviewManager: ScenePreviewProvider = null; -let godotDebugger: GodotDebugger = null; +interface Extension { + context?: vscode.ExtensionContext; + lsp?: ClientConnectionManager; + debug?: GodotDebugger; + scenePreviewProvider?: ScenePreviewProvider; + linkProvider?: GDDocumentLinkProvider; + hoverProvider?: GDHoverProvider; + inlayProvider?: GDInlayHintsProvider; + formattingProvider?: FormattingProvider; + docsProvider?: GDDocumentationProvider; + definitionProvider?: GDDefinitionProvider; + semanticTokensProvider?: GDSemanticTokensProvider; + completionProvider?: GDCompletionItemProvider; + tasksProvider?: GDTaskProvider; +} + +export const globals: Extension = {}; export function activate(context: vscode.ExtensionContext) { attemptSettingsUpdate(context); - lspClientManager = new ClientConnectionManager(context); - linkProvider = new GDDocumentLinkProvider(context); - scenePreviewManager = new ScenePreviewProvider(); - godotDebugger = new GodotDebugger(context); + globals.context = context; + globals.lsp = new ClientConnectionManager(context); + globals.debug = new GodotDebugger(context); + globals.scenePreviewProvider = new ScenePreviewProvider(context); + globals.linkProvider = new GDDocumentLinkProvider(context); + globals.hoverProvider = new GDHoverProvider(context); + globals.inlayProvider = new GDInlayHintsProvider(context); + globals.formattingProvider = new FormattingProvider(context); + globals.docsProvider = new GDDocumentationProvider(context); + globals.definitionProvider = new GDDefinitionProvider(context); + // globals.semanticTokensProvider = new GDSemanticTokensProvider(context); + // globals.completionProvider = new GDCompletionItemProvider(context); + // globals.tasksProvider = new GDTaskProvider(context); context.subscriptions.push( register_command("openEditor", open_workspace_with_editor), register_command("copyResourcePath", copy_resource_path), - register_command("openTypeDocumentation", open_type_documentation), + register_command("listGodotClasses", list_classes), register_command("switchSceneScript", switch_scene_script), ); @@ -46,7 +78,7 @@ export function activate(context: vscode.ExtensionContext) { export function deactivate(): Thenable { return new Promise((resolve, reject) => { - lspClientManager.client.stop(); + globals.lsp.client.stop(); resolve(); }); } @@ -68,8 +100,8 @@ function copy_resource_path(uri: vscode.Uri) { vscode.env.clipboard.writeText(relative_path); } -function open_type_documentation() { - lspClientManager.client.open_documentation(); +async function list_classes() { + await globals.lsp.client.list_classes(); } async function switch_scene_script() { @@ -96,7 +128,7 @@ function open_workspace_with_editor() { const pattern = /([34])\.([0-9]+)\.(?:[0-9]+\.)?(?:\w+\.)+[0-9a-f]{9}/; const match = output.match(pattern); if (!match) { - const message = `Cannot launch Godot editor: '${settingName}' of '${godotPath}' is not a valid Godot executable`; + const message = `Cannot launch Godot editor: '${settingName}' value of '${godotPath}' is not a valid Godot executable`; prompt_for_godot_executable(message, settingName); return; } @@ -106,7 +138,7 @@ function open_workspace_with_editor() { return; } } catch { - const message = `Cannot launch Godot editor: ${settingName} of ${godotPath} is not a valid Godot executable`; + const message = `Cannot launch Godot editor: ${settingName} value of ${godotPath} is not a valid Godot executable`; prompt_for_godot_executable(message, settingName); return; } diff --git a/src/formatter/formatter.test.ts b/src/formatter/formatter.test.ts new file mode 100644 index 0000000..0561626 --- /dev/null +++ b/src/formatter/formatter.test.ts @@ -0,0 +1,17 @@ +import * as assert from "assert"; +import * as vscode from "vscode"; +import * as path from "path"; + +import { format_document } from "./textmate"; + +const dots = ["..", "..", ".."]; +const basePath = path.join(__filename, ...dots); + +suite("GDScript Formatter Tests", () => { + test("Test Formatting", async () => { + const uri = vscode.Uri.file(path.join(basePath, "src/formatter/tests/test1.in.gd")); + const document = await vscode.workspace.openTextDocument(uri); + const edits = format_document(document); + assert.strictEqual(4, edits.length); + }); +}); diff --git a/src/formatter/formatter.ts b/src/formatter/formatter.ts new file mode 100644 index 0000000..cda1e51 --- /dev/null +++ b/src/formatter/formatter.ts @@ -0,0 +1,19 @@ +import * as vscode from "vscode"; +import { format_document } from "./textmate"; +import { createLogger } from "../utils"; + +const log = createLogger("formatter"); + +export class FormattingProvider implements vscode.DocumentFormattingEditProvider { + constructor(private context: vscode.ExtensionContext) { + const selector = { language: "gdscript", scheme: "file" }; + + context.subscriptions.push( + vscode.languages.registerDocumentFormattingEditProvider(selector, this), + ); + } + + public provideDocumentFormattingEdits(document: vscode.TextDocument) { + return format_document(document); + } +} diff --git a/src/formatter/index.ts b/src/formatter/index.ts new file mode 100644 index 0000000..e4288c7 --- /dev/null +++ b/src/formatter/index.ts @@ -0,0 +1 @@ +export * from "./formatter"; diff --git a/src/formatter/symbols.ts b/src/formatter/symbols.ts new file mode 100644 index 0000000..43f2db6 --- /dev/null +++ b/src/formatter/symbols.ts @@ -0,0 +1,73 @@ + +export const keywords = [ + "and", + "as", + "await", + "break", + "breakpoint", + "class_name", + "class", + "const", + "continue", + "elif", + "else", + "enum", + "export", + "extends", + "for", + "if", + "in", + "is", + "master", + "mastersync", + "match", + "not", + "onready", + "or", + "pass", + "puppet", + "puppetsync", + "remote", + "remotesync", + "return", + "setget", + "signal", + "static", + "tool", + "var", + "while", + "yield", +]; + +export const symbols = [ + "**", + "<<", + ">>", + "==", + "!=", + ">=", + "<=", + "&&", + "||", + "+=", + "-=", + "*=", + "/=", + "%=", + "**=", + "&=", + "^=", + "|=", + "<<=", + ">>=", + ":=", + "->", + "-", + "+", + "/", + "*", + ">", + "<", + "-", + "%", +]; diff --git a/src/formatter/tests/test1.in.gd b/src/formatter/tests/test1.in.gd new file mode 100644 index 0000000..1ee6ca7 --- /dev/null +++ b/src/formatter/tests/test1.in.gd @@ -0,0 +1,5 @@ +extends Node + + +func test (): + pass diff --git a/src/formatter/tests/test1.out.gd b/src/formatter/tests/test1.out.gd new file mode 100644 index 0000000..db8d4c9 --- /dev/null +++ b/src/formatter/tests/test1.out.gd @@ -0,0 +1,4 @@ +extends Node + +func test(): + pass diff --git a/src/formatter/textmate.ts b/src/formatter/textmate.ts new file mode 100644 index 0000000..920b51c --- /dev/null +++ b/src/formatter/textmate.ts @@ -0,0 +1,196 @@ +import { Range, TextDocument, TextEdit } from "vscode"; +import * as fs from "fs"; +import * as vsctm from "vscode-textmate"; +import * as oniguruma from "vscode-oniguruma"; +import { keywords, symbols } from "./symbols"; +import { get_extension_uri } from "../utils"; + +// Promisify readFile +function readFile(path) { + return new Promise((resolve, reject) => { + fs.readFile(path, (error, data) => error ? reject(error) : resolve(data)); + }); +} + +const grammarPath = get_extension_uri("syntaxes/GDScript.tmLanguage.json").fsPath; +const wasmPath = get_extension_uri("resources/onig.wasm").fsPath; +const wasmBin = fs.readFileSync(wasmPath).buffer; + +// Create a registry that can create a grammar from a scope name. +const registry = new vsctm.Registry({ + onigLib: oniguruma.loadWASM(wasmBin).then(() => { + return { + createOnigScanner(patterns) { return new oniguruma.OnigScanner(patterns); }, + createOnigString(s) { return new oniguruma.OnigString(s); } + }; + }), + loadGrammar: (scopeName) => { + if (scopeName === "source.gdscript") { + return readFile(grammarPath).then(data => vsctm.parseRawGrammar(data.toString(), grammarPath)); + } + console.log(`Unknown scope name: ${scopeName}`); + return null; + } +}); + +interface Token { + // startIndex: number; + // endIndex: number; + scopes: string[]; + value: string; + type?: string; + param?: boolean; + skip?: boolean; +} + +function parse_token(token: Token) { + if (token.scopes.includes("meta.function.parameters.gdscript")) { + token.param = true; + } + if (token.scopes.includes("meta.literal.nodepath.gdscript")) { + token.skip = true; + } + if (keywords.includes(token.value)) { + token.type = "keyword"; + return; + } + if (symbols.includes(token.value)) { + token.type = "symbol"; + return; + } + if (token.scopes.includes("keyword.language.gdscript")) { + token.type = "keyword"; + return; + } + if (token.scopes.includes("constant.language.gdscript")) { + token.type = "constant"; + return; + } + if (token.scopes.includes("variable.other.gdscript")) { + token.type = "variable"; + return; + } +} + +function between(tokens: Token[], current: number) { + const nextToken = tokens[current]; + const prevToken = tokens[current - 1]; + const next = nextToken.value; + const prev = prevToken?.value; + + // console.log(prevToken, nextToken); + + if (!prev) return ""; + + if (next === "#") return " "; + if (prevToken.skip) return ""; + + if (nextToken.param) { + if (next === "=") return ""; + if (prev === "=") return ""; + if (prevToken?.type === "symbol") return " "; + if (nextToken.type === "symbol") return " "; + } + + if (next === ":") { + if (["var", "const"].includes(tokens[current - 2]?.value)) { + if (tokens[current + 1]?.value !== "=") return ""; + return " "; + } + if (prevToken?.type === "keyword") return ""; + } + if (prev === "@") return ""; + + if (prev === ":" && next === "=") return ""; + if (next === "(") { + if (prev === "export") return ""; + if (prev === "func") return ""; + if (prev === "assert") return ""; + } + + if (prev === ")" && nextToken.type === "keyword") return " "; + + if (prev === ":") return " "; + if (prev === ";") return " "; + if (prev === "#") return " "; + if (next === "=") return " "; + if (prev === "=") return " "; + if (prev === "(") return ""; + if (next === "{") return " "; + if (next === "{}") return " "; + + if (prevToken?.type === "keyword") return " "; + if (nextToken.type === "keyword") return " "; + if (prevToken?.type === "symbol") return " "; + if (nextToken.type === "symbol") return " "; + + if (prev === ",") return " "; + + return ""; +} + +let grammar = null; + +registry.loadGrammar("source.gdscript").then(g => { grammar = g; }); + +export function format_document(document: TextDocument): TextEdit[] { + // quit early if grammar is not loaded + if (!grammar) { + return []; + } + const edits: TextEdit[] = []; + + let lineTokens: vsctm.ITokenizeLineResult = null; + for (let lineNum = 0; lineNum < document.lineCount; lineNum++) { + const line = document.lineAt(lineNum); + + // skip empty lines + if (line.isEmptyOrWhitespace) { + // delete empty lines + if (lineNum === 0 || document.lineAt(lineNum - 1).isEmptyOrWhitespace) { + const range = new Range(lineNum, 0, lineNum + 1, 0); + edits.push(TextEdit.delete(range)); + } + continue; + } + // skip comments + if (line.text[line.firstNonWhitespaceCharacterIndex] === "#") { + continue; + } + + let nextLine = ""; + lineTokens = grammar.tokenizeLine(line.text, lineTokens?.ruleStack ?? vsctm.INITIAL); + + // TODO: detect whitespace type and automatically convert + const leadingWhitespace = line.text.slice(0, line.firstNonWhitespaceCharacterIndex); + nextLine += leadingWhitespace; + const first = lineTokens.tokens[0]; + if (line.text.slice(first.startIndex, first.endIndex).trim() === "") { + lineTokens.tokens.shift(); + } + + const tokens: Token[] = []; + for (const t of lineTokens.tokens) { + const value = line.text.slice(t.startIndex, t.endIndex).trim(); + // skip whitespace tokens + if (value.trim() === "") { + continue; + } + + const token: Token = { + scopes: t.scopes, + value: value, + }; + + parse_token(token); + tokens.push(token); + } + for (let i = 0; i < tokens.length; i++) { + nextLine += between(tokens, i) + tokens[i].value; + } + + edits.push(TextEdit.replace(line.range, nextLine)); + } + + return edits; +} diff --git a/src/lsp/ClientConnectionManager.ts b/src/lsp/ClientConnectionManager.ts index 7814059..a9aec80 100644 --- a/src/lsp/ClientConnectionManager.ts +++ b/src/lsp/ClientConnectionManager.ts @@ -1,5 +1,4 @@ import * as vscode from "vscode"; -import * as fs from "fs"; import GDScriptLanguageClient, { ClientStatus, TargetLSP } from "./GDScriptLanguageClient"; import { get_configuration, @@ -9,9 +8,9 @@ import { set_context, register_command, set_configuration, + createLogger, } from "../utils"; import { prompt_for_godot_executable, prompt_for_reload, select_godot_executable } from "../utils/prompts"; -import { createLogger } from "../logger"; import { execSync } from "child_process"; import { subProcess, killSubProcesses } from "../utils/subspawn"; @@ -28,7 +27,6 @@ enum ManagerStatus { } export class ClientConnectionManager { - private context: vscode.ExtensionContext; public client: GDScriptLanguageClient = null; private reconnectionAttempts = 0; @@ -39,26 +37,16 @@ export class ClientConnectionManager { private connectedVersion: string = ""; - constructor(p_context: vscode.ExtensionContext) { - this.context = p_context; + constructor(private context: vscode.ExtensionContext) { + this.context = context; - this.client = new GDScriptLanguageClient(p_context); + this.client = new GDScriptLanguageClient(context); this.client.watch_status(this.on_client_status_changed.bind(this)); setInterval(() => { this.retry_callback(); }, get_configuration("lsp.autoReconnect.cooldown")); - register_command("startLanguageServer", () => { - // TODO: this might leave the manager in a wierd state - this.start_language_server(); - this.reconnectionAttempts = 0; - this.target = TargetLSP.HEADLESS; - this.client.connect_to_server(this.target); - }); - register_command("stopLanguageServer", this.stop_language_server.bind(this)); - register_command("checkStatus", this.on_status_item_click.bind(this)); - set_context("connectedToLSP", false); this.statusWidget = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right); @@ -66,6 +54,19 @@ export class ClientConnectionManager { this.statusWidget.show(); this.update_status_widget(); + context.subscriptions.push( + register_command("startLanguageServer", () => { + // TODO: this might leave the manager in a wierd state + this.start_language_server(); + this.reconnectionAttempts = 0; + this.target = TargetLSP.HEADLESS; + this.client.connect_to_server(this.target); + }), + register_command("stopLanguageServer", this.stop_language_server.bind(this)), + register_command("checkStatus", this.on_status_item_click.bind(this)), + this.statusWidget, + ); + this.connect_to_language_server(); } @@ -172,7 +173,7 @@ export class ClientConnectionManager { } private get_lsp_connection_string() { - let host = get_configuration("lsp.serverHost"); + const host = get_configuration("lsp.serverHost"); let port = get_configuration("lsp.serverPort"); if (this.client.port !== -1) { port = this.client.port; @@ -313,11 +314,20 @@ export class ClientConnectionManager { this.update_status_widget(); const lspTarget = this.get_lsp_connection_string(); - let message = `Couldn't connect to the GDScript language server at ${lspTarget}. Is the Godot editor or language server running?`; - vscode.window.showErrorMessage(message, "Retry", "Ignore").then(item => { + const message = `Couldn't connect to the GDScript language server at ${lspTarget}. Is the Godot editor or language server running?`; + + let options = ["Retry", "Ignore"]; + if (this.target == TargetLSP.EDITOR) { + options = ["Open workspace with Godot Editor", ...options]; + } + + vscode.window.showErrorMessage(message, ...options).then(item => { if (item == "Retry") { this.connect_to_language_server(); } + if (item == "Open workspace with Godot Editor") { + vscode.commands.executeCommand("godotTools.openEditor"); + } }); } } diff --git a/src/lsp/GDScriptLanguageClient.ts b/src/lsp/GDScriptLanguageClient.ts index 606a1b9..7d399d7 100644 --- a/src/lsp/GDScriptLanguageClient.ts +++ b/src/lsp/GDScriptLanguageClient.ts @@ -1,12 +1,11 @@ +import * as vscode from "vscode"; +import { LanguageClient, NotificationMessage, RequestMessage, ResponseMessage } from "vscode-languageclient/node"; import { EventEmitter } from "events"; -import * as vscode from 'vscode'; -import { LanguageClient, RequestMessage, ResponseMessage, integer } from "vscode-languageclient/node"; -import { createLogger, LOG_LEVEL } from "../logger"; -import { get_configuration, set_context } from "../utils"; +import { get_configuration, createLogger } from "../utils"; import { Message, MessageIO, MessageIOReader, MessageIOWriter, TCPMessageIO, WebSocketMessageIO } from "./MessageIO"; -import { NativeDocumentManager } from './NativeDocumentManager'; +import { globals } from "../extension"; -const log = createLogger("lsp.client", {level: LOG_LEVEL.SILENT}); +const log = createLogger("lsp.client"); export enum ClientStatus { PENDING, @@ -24,13 +23,9 @@ const CUSTOM_MESSAGE = "gdscript_client/"; export default class GDScriptLanguageClient extends LanguageClient { public readonly io: MessageIO = (get_configuration("lsp.serverProtocol") == "ws") ? new WebSocketMessageIO() : new TCPMessageIO(); - private context: vscode.ExtensionContext; - private _started: boolean = false; - private _status: ClientStatus; private _status_changed_callbacks: ((v: ClientStatus) => void)[] = []; private _initialize_request: Message = null; - private message_handler: MessageHandler = null; - private native_doc_manager: NativeDocumentManager = null; + private messageHandler: MessageHandler = null; public target: TargetLSP = TargetLSP.EDITOR; @@ -39,7 +34,10 @@ export default class GDScriptLanguageClient extends LanguageClient { public sentMessages = new Map(); public lastSymbolHovered: string = ""; + private _started: boolean = false; public get started(): boolean { return this._started; } + + private _status: ClientStatus; public get status(): ClientStatus { return this._status; } public set status(v: ClientStatus) { if (this._status != v) { @@ -56,14 +54,9 @@ export default class GDScriptLanguageClient extends LanguageClient { } } - public open_documentation() { - const symbol = this.lastSymbolHovered; - this.native_doc_manager.request_documentation(symbol); - } - - constructor(context: vscode.ExtensionContext) { + constructor(private context: vscode.ExtensionContext) { super( - `GDScriptLanguageClient`, + "GDScriptLanguageClient", () => { return new Promise((resolve, reject) => { resolve({ reader: new MessageIOReader(this.io), writer: new MessageIOWriter(this.io) }); @@ -77,18 +70,20 @@ export default class GDScriptLanguageClient extends LanguageClient { ], synchronize: { // Notify the server about file changes to '.gd files contain in the workspace - // fileEvents: workspace.createFileSystemWatcher("**/*.gd"), + fileEvents: vscode.workspace.createFileSystemWatcher("**/*.gd"), }, } ); - this.context = context; this.status = ClientStatus.PENDING; - this.message_handler = new MessageHandler(this.io); - this.io.on('disconnected', this.on_disconnected.bind(this)); - this.io.on('connected', this.on_connected.bind(this)); - this.io.on('message', this.on_message.bind(this)); - this.io.on('send_message', this.on_send_message.bind(this)); - this.native_doc_manager = new NativeDocumentManager(this.io); + this.io.on("disconnected", this.on_disconnected.bind(this)); + this.io.on("connected", this.on_connected.bind(this)); + this.io.on("message", this.on_message.bind(this)); + this.io.on("send_message", this.on_send_message.bind(this)); + this.messageHandler = new MessageHandler(this.io); + } + + public async list_classes() { + await globals.docsProvider.list_native_classes(); } connect_to_server(target: TargetLSP = TargetLSP.EDITOR) { @@ -120,18 +115,15 @@ export default class GDScriptLanguageClient extends LanguageClient { } private on_send_message(message: RequestMessage) { - log.debug("tx:", message); - - this.sentMessages.set(message.id, message.method); + this.sentMessages.set(message.id, message); if (message.method == "initialize") { this._initialize_request = message; } } - private on_message(message: ResponseMessage) { + private on_message(message: ResponseMessage | NotificationMessage) { const msgString = JSON.stringify(message); - log.debug("rx:", message); // This is a dirty hack to fix the language server sending us // invalid file URIs @@ -142,55 +134,78 @@ export default class GDScriptLanguageClient extends LanguageClient { const count = (message["result"] as Array).length; for (let i = 0; i < count; i++) { const x: string = message["result"][i]["target"]; - message["result"][i]["target"] = x.replace('file://', 'file:///'); + message["result"][i]["target"] = x.replace("file://", "file:///"); } } - const method = this.sentMessages.get(message.id); - if (method === "textDocument/hover") { - this.handle_hover_response(message); - - // this is a dirty hack to fix language server sending us prerendered - // markdown but not correctly stripping leading #'s, leading to - // docstrings being displayed as titles - const value: string = message.result["contents"]?.value; - message.result["contents"].value = value?.replace(/\n[#]+/g, '\n'); + if ("method" in message && message.method === "gdscript/capabilities") { + globals.docsProvider.register_capabilities(message); } - this.message_handler.on_message(message); + if ("id" in message) { + const sentMessage = this.sentMessages.get(message.id); + if (sentMessage && sentMessage.method === "textDocument/hover") { + // fix markdown contents + let value: string = message.result["contents"]?.value; + if (value) { + // this is a dirty hack to fix language server sending us prerendered + // markdown but not correctly stripping leading #'s, leading to + // docstrings being displayed as titles + value = value.replace(/\n[#]+/g, "\n"); + + // fix bbcode code boxes + value = value.replace("`codeblocks`", ""); + value = value.replace("`/codeblocks`", ""); + value = value.replace("`gdscript`", "\nGDScript:\n```gdscript"); + value = value.replace("`/gdscript`", "```"); + value = value.replace("`csharp`", "\nC#:\n```csharp"); + value = value.replace("`/csharp`", "```"); + + message.result["contents"].value = value; + } + } + } + + this.messageHandler.on_message(message); } - private handle_hover_response(message: ResponseMessage) { - this.lastSymbolHovered = ""; - set_context("typeFound", false); + public async get_symbol_at_position(uri: vscode.Uri, position: vscode.Position) { + const params = { + textDocument: { uri: uri.toString() }, + position: { line: position.line, character: position.character }, + }; + const response = await this.sendRequest("textDocument/hover", params); - let decl: string = message?.result["contents"]?.value; + return this.parse_hover_response(response); + } + + private parse_hover_response(message) { + const contents = message["contents"]; + + let decl: string; + if (contents instanceof Array) { + decl = contents[0]; + } else { + decl = contents.value; + } if (!decl) { - return; + return ""; } decl = decl.split("\n")[0].trim(); - // strip off the value - if (decl.includes("=")) { - decl = decl.split("=")[0]; - } - if (decl.includes(":")) { - const parts = decl.split(":"); - if (parts.length === 2) { - decl = parts[1].trim(); - - } - } - if (decl.includes("")) { - decl = decl.split(" ")[2]; + let match; + let result = undefined; + match = decl.match(/(?:func|const) (@?\w+)\.(\w+)/); + if (match) { + result = `${match[1]}.${match[2]}`; } - if (decl.includes(" ")) { - return; + match = decl.match(/ class (\w+)/); + if (match) { + result = `${match[1]}`; } - this.lastSymbolHovered = decl; - set_context("typeFound", true); + return result; } private on_connected() { @@ -228,14 +243,14 @@ class MessageHandler extends EventEmitter { this.io = io; } - changeWorkspace(params: { path: string }) { - vscode.window.showErrorMessage("The GDScript language server can't work properly!\nThe open workspace is different from the editor's.", 'Reload', 'Ignore').then(item => { - if (item == "Reload") { - let folderUrl = vscode.Uri.file(params.path); - vscode.commands.executeCommand('vscode.openFolder', folderUrl, false); - } - }); - } + // changeWorkspace(params: { path: string }) { + // vscode.window.showErrorMessage("The GDScript language server can't work properly!\nThe open workspace is different from the editor's.", 'Reload', 'Ignore').then(item => { + // if (item == "Reload") { + // let folderUrl = vscode.Uri.file(params.path); + // vscode.commands.executeCommand('vscode.openFolder', folderUrl, false); + // } + // }); + // } on_message(message: any) { // FIXME: Hot fix VSCode 1.42 hover position @@ -243,10 +258,11 @@ class MessageHandler extends EventEmitter { message.result.range = undefined; } + // What does this do? if (message && message.method && (message.method as string).startsWith(CUSTOM_MESSAGE)) { const method = (message.method as string).substring(CUSTOM_MESSAGE.length, message.method.length); if (this[method]) { - let ret = this[method](message.params); + const ret = this[method](message.params); if (ret) { this.io.writer.write(ret); } diff --git a/src/lsp/MessageIO.ts b/src/lsp/MessageIO.ts index a430542..560ed06 100644 --- a/src/lsp/MessageIO.ts +++ b/src/lsp/MessageIO.ts @@ -1,11 +1,22 @@ -import { AbstractMessageReader, MessageReader, DataCallback, Disposable } from "vscode-jsonrpc"; +import { + AbstractMessageReader, + MessageReader, + DataCallback, + Disposable, + RequestMessage, + ResponseMessage, + NotificationMessage, + AbstractMessageWriter, + MessageWriter +} from "vscode-jsonrpc"; import { EventEmitter } from "events"; -import { WebSocket, Data } from 'ws'; -import { Socket } from 'net'; - +import { WebSocket, Data } from "ws"; +import { Socket } from "net"; import MessageBuffer from "./MessageBuffer"; -import { AbstractMessageWriter, MessageWriter } from "vscode-jsonrpc"; -import { RequestMessage, ResponseMessage, NotificationMessage } from "vscode-jsonrpc"; +import { createLogger } from "../utils"; + +const log = createLogger("lsp.io"); + export type Message = RequestMessage | ResponseMessage | NotificationMessage; export class MessageIO extends EventEmitter { @@ -19,7 +30,7 @@ export class MessageIO extends EventEmitter { protected on_message(chunk: Data) { let message = chunk.toString(); - this.emit('data', message); + this.emit("data", message); } on_send_message(message: any) { @@ -46,14 +57,14 @@ export class WebSocketMessageIO extends MessageIO { } } - async connect_to_language_server(host:string, port: number): Promise { + async connect_to_language_server(host: string, port: number): Promise { return new Promise((resolve, reject) => { this.socket = null; const ws = new WebSocket(`ws://${host}:${port}`); - ws.on('open', ()=>{ this.on_connected(ws); resolve(); }); - ws.on('message', this.on_message.bind(this)); - ws.on('error', this.on_disconnected.bind(this)); - ws.on('close', this.on_disconnected.bind(this)); + ws.on("open", () => { this.on_connected(ws); resolve(); }); + ws.on("message", this.on_message.bind(this)); + ws.on("error", this.on_disconnected.bind(this)); + ws.on("close", this.on_disconnected.bind(this)); }); } @@ -64,7 +75,7 @@ export class WebSocketMessageIO extends MessageIO { protected on_disconnected() { this.socket = null; - this.emit('disconnected'); + this.emit("disconnected"); } } @@ -77,16 +88,16 @@ export class TCPMessageIO extends MessageIO { } } - async connect_to_language_server(host:string, port: number):Promise { + async connect_to_language_server(host: string, port: number): Promise { return new Promise((resolve, reject) => { this.socket = null; const socket = new Socket(); socket.connect(port, host); - socket.on('connect', ()=>{ this.on_connected(socket); resolve(); }); - socket.on('data', this.on_message.bind(this)); - socket.on('end', this.on_disconnected.bind(this)); - socket.on('close', this.on_disconnected.bind(this)); - socket.on('error', this.on_error.bind(this)); + socket.on("connect", () => { this.on_connected(socket); resolve(); }); + socket.on("data", this.on_message.bind(this)); + socket.on("end", this.on_disconnected.bind(this)); + socket.on("close", this.on_disconnected.bind(this)); + socket.on("error", this.on_error.bind(this)); }); } @@ -97,7 +108,7 @@ export class TCPMessageIO extends MessageIO { protected on_disconnected() { this.socket = null; - this.emit('disconnected'); + this.emit("disconnected"); } protected on_error(error) { @@ -116,7 +127,7 @@ export class MessageIOReader extends AbstractMessageReader implements MessageRea private partialMessageTimer: NodeJS.Timeout | undefined; private _partialMessageTimeout: number; - public constructor(io: MessageIO, encoding: BufferEncoding = 'utf8') { + public constructor(io: MessageIO, encoding: BufferEncoding = "utf8") { super(); this.io = io; this.io.reader = this; @@ -137,12 +148,9 @@ export class MessageIOReader extends AbstractMessageReader implements MessageRea this.messageToken = 0; this.partialMessageTimer = undefined; this.callback = callback; - this.io.on('data', (data: Buffer) => { - this.onData(data); - }); - this.io.on('error', (error: any) => this.fireError(error)); - this.io.on('close', () => this.fireClose()); - + this.io.on("data", this.onData.bind(this)); + this.io.on("error", this.fireError.bind(this)); + this.io.on("close", this.fireClose.bind(this)); return; } @@ -154,13 +162,13 @@ export class MessageIOReader extends AbstractMessageReader implements MessageRea if (!headers) { return; } - let contentLength = headers['Content-Length']; + let contentLength = headers["Content-Length"]; if (!contentLength) { - throw new Error('Header must provide a Content-Length property.'); + throw new Error("Header must provide a Content-Length property."); } let length = parseInt(contentLength); if (isNaN(length)) { - throw new Error('Content-Length value must be a number.'); + throw new Error("Content-Length value must be a number."); } this.nextMessageLength = length; // Take the encoding form the header. For compatibility @@ -176,6 +184,8 @@ export class MessageIOReader extends AbstractMessageReader implements MessageRea this.nextMessageLength = -1; this.messageToken++; var json = JSON.parse(msg); + + log.debug("rx:", json); this.callback(json); // callback this.io.on_message_callback(json); @@ -204,29 +214,32 @@ export class MessageIOReader extends AbstractMessageReader implements MessageRea } } -const ContentLength: string = 'Content-Length: '; -const CRLF = '\r\n'; +const ContentLength: string = "Content-Length: "; +const CRLF = "\r\n"; export class MessageIOWriter extends AbstractMessageWriter implements MessageWriter { private io: MessageIO; private encoding: BufferEncoding; private errorCount: number; - public constructor(io: MessageIO, encoding: BufferEncoding = 'utf8') { + public constructor(io: MessageIO, encoding: BufferEncoding = "utf8") { super(); this.io = io; this.io.writer = this; this.encoding = encoding as BufferEncoding; this.errorCount = 0; - this.io.on('error', (error: any) => this.fireError(error)); - this.io.on('close', () => this.fireClose()); + this.io.on("error", (error: any) => this.fireError(error)); + this.io.on("close", () => this.fireClose()); } - + public end(): void { - + } public write(msg: Message): Promise { + if ((msg as RequestMessage).method === "didChangeWatchedFiles") { + return; + } let json = JSON.stringify(msg); let contentLength = Buffer.byteLength(json, this.encoding); @@ -238,15 +251,17 @@ export class MessageIOWriter extends AbstractMessageWriter implements MessageWri // callback this.io.on_send_message(msg); // Header must be written in ASCII encoding - this.io.send_message(headers.join('')); + this.io.send_message(headers.join("")); // Now write the content. This can be written in any encoding + + log.debug("tx:", msg); this.io.send_message(json); this.errorCount = 0; } catch (error) { this.errorCount++; this.fireError(error, msg, this.errorCount); } - + return; } } diff --git a/src/lsp/NativeDocumentManager.ts b/src/lsp/NativeDocumentManager.ts deleted file mode 100644 index 71f8930..0000000 --- a/src/lsp/NativeDocumentManager.ts +++ /dev/null @@ -1,695 +0,0 @@ -import * as vscode from "vscode"; -import * as ls from "vscode-languageclient"; -import { EventEmitter } from "events"; -import { MessageIO } from "./MessageIO"; -import { NotificationMessage } from "vscode-jsonrpc"; -import * as Prism from "prismjs"; -import { marked } from "marked"; -import { get_configuration, register_command } from "../utils"; -import { - Methods, - NativeSymbolInspectParams, - GodotNativeSymbol, - GodotNativeClassInfo, - GodotCapabilities, -} from "./gdscript.capabilities"; - -marked.setOptions({ - highlight: function (code, lang) { - return Prism.highlight(code, GDScriptGrammar, lang); - }, -}); - -const enum WebViewMessageType { - INSPECT_NATIVE_SYMBOL = "INSPECT_NATIVE_SYMBOL", -} - -export class NativeDocumentManager extends EventEmitter { - private io: MessageIO = null; - private native_classes: { [key: string]: GodotNativeClassInfo } = {}; - - constructor(io: MessageIO) { - super(); - this.io = io; - io.on("message", (message: NotificationMessage) => { - if (message.method == Methods.SHOW_NATIVE_SYMBOL) { - this.show_native_symbol(message.params as GodotNativeSymbol); - } else if (message.method == Methods.GDSCRIPT_CAPABILITIES) { - for (const gdclass of (message.params as GodotCapabilities) - .native_classes) { - this.native_classes[gdclass.name] = gdclass; - } - for (const gdclass of (message.params as GodotCapabilities) - .native_classes) { - if (gdclass.inherits) { - const extended_classes = - this.native_classes[gdclass.inherits].extended_classes || []; - extended_classes.push(gdclass.name); - this.native_classes[ - gdclass.inherits - ].extended_classes = extended_classes; - } - } - } - }); - - register_command("listNativeClasses", this.list_native_classes.bind(this)); - } - - public request_documentation(symbolName: string) { - if (symbolName in this.native_classes) { - this.inspect_native_symbol({ - native_class: symbolName, - symbol_name: symbolName, - }); - } - } - - private async list_native_classes() { - let classname = await vscode.window.showQuickPick( - Object.keys(this.native_classes).sort(), - { - placeHolder: "Type godot class name here", - canPickMany: false, - } - ); - if (classname) { - this.inspect_native_symbol({ - native_class: classname, - symbol_name: classname, - }); - } - } - - private inspect_native_symbol(params: NativeSymbolInspectParams) { - let json_data = ""; - if (get_configuration("lsp.serverProtocol") == "ws") { - json_data = JSON.stringify({ - id: -1, - jsonrpc: "2.0", - method: Methods.INSPECT_NATIVE_SYMBOL, - params, - }); - } else { - json_data = JSON.stringify({ - jsonrpc: "2.0", - method: Methods.INSPECT_NATIVE_SYMBOL, - params: params, - }); - this.send_header(json_data.length); - } - this.io.send_message(json_data); - } - - private send_header(data_length: number) { - this.io.send_message(`Content-Length: ${data_length}\r\n\r\n`); - } - - private show_native_symbol(symbol: GodotNativeSymbol) { - // 创建webview - const panel = vscode.window.createWebviewPanel( - "doc", - symbol.name, - this.get_new_native_symbol_column(), - { - enableScripts: true, // 启用JS,默认禁用 - retainContextWhenHidden: false, // webview被隐藏时保持状态,避免被重置 - enableFindWidget: true, - } - ); - panel.title = symbol.name; - panel.webview.html = this.make_html_content(symbol); - panel.webview.onDidReceiveMessage(this.on_webview_message.bind(this)); - } - - /** - * Returns placement for a new native symbol window based on the extension - * configuration and previously opened native symbols. - */ - private get_new_native_symbol_column(): vscode.ViewColumn { - const config_placement = get_configuration("documentation.newTabPlacement"); - - if (config_placement == "active") { - return vscode.ViewColumn.Active; - } - - const tab_groups = vscode.window.tabGroups; - const visible_text_editors = vscode.window.visibleTextEditors; - const editor_columns = visible_text_editors.map(editor => editor.viewColumn); - - // Assume the first non-editor column is the column where other native - // symbols have been opened. - - const active_column = tab_groups.activeTabGroup.viewColumn; - const is_non_editor_column_active = !editor_columns.includes(active_column); - if (is_non_editor_column_active) { - return active_column; - } - - const all_columns = tab_groups.all.map(group => group.viewColumn); - const first_non_editor_column = all_columns.find(column => !editor_columns.includes(column)); - if (first_non_editor_column) { - return first_non_editor_column; - } else { - return vscode.ViewColumn.Beside; - } - } - - private on_webview_message(msg: any) { - switch (msg.type) { - case WebViewMessageType.INSPECT_NATIVE_SYMBOL: - this.inspect_native_symbol(msg.data); - break; - default: - break; - } - } - - private make_html_content(symbol: GodotNativeSymbol): string { - return ` - - - - - ${this.make_symbol_document(symbol)} - - `; - } - - private make_symbol_document(symbol: GodotNativeSymbol): string { - const classlink = make_link(symbol.native_class, undefined); - const classinfo = this.native_classes[symbol.native_class]; - - function make_function_signature(s: GodotNativeSymbol, with_class = false) { - let parts = /\((.*)?\)\s*\-\>\s*(([A-z0-9]+)?)$/.exec(s.detail); - if (!parts) { - return ""; - } - const ret_type = make_link(parts[2] || "void", undefined); - let args = (parts[1] || "").replace( - /\:\s([A-z0-9_]+)(\,\s*)?/g, - `: $1$2` - ); - args = args.replace(/\s=\s(.*?)[\,\)]/g, ""); - return `${ret_type} ${with_class ? `${classlink}.` : ""}${element( - "a", - s.name, - { href: `#${s.name}` } - )}( ${args} )`; - } - - function make_symbol_elements( - s: GodotNativeSymbol, - with_class = false - ): { index?: string; body: string } { - switch (s.kind) { - case ls.SymbolKind.Property: - case ls.SymbolKind.Variable: - { - // var Control.anchor_left: float - const parts = /\.([A-z_0-9]+)\:\s(.*)$/.exec(s.detail); - if (!parts) { - return; - } - let type = make_link(parts[2], undefined); - let name = element("a", s.name, { href: `#${s.name}` }); - const title = element( - "h4", - `${type} ${with_class ? `${classlink}.` : ""}${s.name}` - ); - const doc = element( - "p", - format_documentation(s.documentation, symbol.native_class) - ); - const div = element("div", title + doc); - return { - index: type + " " + name, - body: div, - }; - } - break; - case ls.SymbolKind.Constant: - { - // const Control.FOCUS_ALL: FocusMode = 2 - // const Control.NOTIFICATION_RESIZED = 40 - const parts = /\.([A-Za-z_0-9]+)(\:\s*)?([A-z0-9_\.]+)?\s*=\s*(.*)$/.exec( - s.detail - ); - if (!parts) { - return; - } - let type = make_link(parts[3] || "int", undefined); - let name = parts[1]; - let value = element("code", parts[4]); - - const title = element( - "p", - `${type} ${with_class ? `${classlink}.` : ""}${name} = ${value}` - ); - const doc = element( - "p", - format_documentation(s.documentation, symbol.native_class) - ); - const div = element("div", title + doc); - return { - body: div, - }; - } - break; - case ls.SymbolKind.Event: - { - const parts = /\.([A-z0-9]+)\((.*)?\)/.exec(s.detail); - if (!parts) { - return; - } - const args = (parts[2] || "").replace( - /\:\s([A-z0-9_]+)(\,\s*)?/g, - `: $1$2` - ); - const title = element( - "p", - `${with_class ? `signal ${with_class ? `${classlink}.` : ""}` : "" - }${s.name}( ${args} )` - ); - const doc = element( - "p", - format_documentation(s.documentation, symbol.native_class) - ); - const div = element("div", title + doc); - return { - body: div, - }; - } - break; - case ls.SymbolKind.Method: - case ls.SymbolKind.Function: - { - const signature = make_function_signature(s, with_class); - const title = element("h4", signature); - const doc = element( - "p", - format_documentation(s.documentation, symbol.native_class) - ); - const div = element("div", title + doc); - return { - index: signature, - body: div, - }; - } - break; - default: - break; - } - } - - if (symbol.kind == ls.SymbolKind.Class) { - let doc = element("h2", `Native class ${symbol.name}`); - const parts = /extends\s+([A-z0-9]+)/.exec(symbol.detail); - let inherits = parts && parts.length > 1 ? parts[1] : ""; - if (inherits) { - let inherits_chian = ""; - let base_class = this.native_classes[inherits]; - while (base_class) { - inherits_chian += `${inherits_chian ? " >" : ""} ${make_link( - base_class.name, - undefined - )}`; - base_class = this.native_classes[base_class.inherits]; - } - inherits = `Inherits: ${inherits_chian}`; - doc += element("p", inherits); - } - if (classinfo && classinfo.extended_classes) { - let inherited = ""; - for (const c of classinfo.extended_classes) { - inherited += (inherited ? ", " : " ") + make_link(c, c); - } - doc += element("p", `Inherited by:${inherited}`); - } - - let constants = ""; - let signals = ""; - let methods_index = ""; - let methods = ""; - let properties_index = ""; - let propertyies = ""; - let others = ""; - - for (let s of symbol.children as GodotNativeSymbol[]) { - const elements = make_symbol_elements(s); - switch (s.kind) { - case ls.SymbolKind.Property: - case ls.SymbolKind.Variable: - properties_index += element("li", elements.index); - propertyies += element("li", elements.body, { id: s.name }); - break; - case ls.SymbolKind.Constant: - constants += element("li", elements.body, { id: s.name }); - break; - case ls.SymbolKind.Event: - signals += element("li", elements.body, { id: s.name }); - break; - case ls.SymbolKind.Method: - case ls.SymbolKind.Function: - methods_index += element("li", elements.index); - methods += element("li", elements.body, { id: s.name }); - break; - default: - others += element("li", elements.body, { id: s.name }); - break; - } - } - - function add_group(title: string, block: string) { - if (block) { - doc += element("h3", title); - doc += element("ul", block); - } - } - - doc += element( - "p", - format_documentation(symbol.documentation, symbol.native_class) - ); - add_group("Properties", properties_index); - add_group("Constants", constants); - add_group("Signals", signals); - add_group("Methods", methods_index); - add_group("Property Descriptions", propertyies); - add_group("Method Descriptions", methods); - add_group("Other Members", others); - doc += element("script", `var godot_class = "${symbol.native_class}";`); - - return doc; - } else { - let doc = ""; - const elements = make_symbol_elements(symbol, true); - if (elements.index) { - const symbols: ls.SymbolKind[] = [ls.SymbolKind.Function, ls.SymbolKind.Method]; - if (!symbols.includes(symbol.kind)) { - doc += element("h2", elements.index); - } - } - doc += element("div", elements.body); - return doc; - } - } -} - -function element( - tag: K, - content: string, - props = {}, - new_line?: boolean, - indent?: string -) { - let props_str = ""; - for (const key in props) { - if (props.hasOwnProperty(key)) { - props_str += ` ${key}="${props[key]}"`; - } - } - return `${indent || ""}<${tag} ${props_str}>${content}${new_line ? "\n" : "" - }`; -} -function make_link(classname: string, symbol: string) { - if (!symbol || symbol == classname) { - return element("a", classname, { - onclick: `inspect('${classname}', '${classname}')`, - href: "", - }); - } else { - return element("a", `${classname}.${symbol}`, { - onclick: `inspect('${classname}', '${symbol}')`, - href: "", - }); - } -} - -function make_codeblock(code: string) { - const md = marked.parse("```gdscript\n" + code + "\n```"); - return `
${md}
`; -} - -function format_documentation(p_bbcode: string, classname: string) { - let html = p_bbcode.trim(); - let lines = html.split("\n"); - let in_code_block = false; - let code_block_indent = -1; - let cur_code_block = ""; - - html = ""; - for (let i = 0; i < lines.length; i++) { - let line = lines[i]; - let block_start = line.indexOf("[codeblock]"); - if (block_start != -1) { - code_block_indent = block_start; - in_code_block = true; - line = line.replace("[codeblock]", ""); - } else if (in_code_block) { - line = line.substr(code_block_indent, line.length); - } - - if (in_code_block && line.indexOf("[/codeblock]") != -1) { - line = line.replace("[/codeblock]", ""); - in_code_block = false; - html += make_codeblock(cur_code_block); - cur_code_block = ""; - } - - if (!in_code_block) { - line = line.trim(); - // [i] [/u] [code] --> - line = line.replace(/(\[(\/?)([a-z]+)\])/g, `<$2$3>`); - // [Reference] --> Reference - line = line.replace( - /(\[([A-Z]+[A-Z_a-z0-9]*)\])/g, - `$2` - ); - // [method _set] --> _set - line = line.replace( - /(\[([a-z]+)\s+([A-Z_a-z][A-Z_a-z0-9]*)\])/g, - `$3` - ); - line += "
"; - html += line; - } else { - line += "\n"; - if (cur_code_block || line.trim()) { - cur_code_block += line; - } - } - } - return html; -} - -const GDScriptGrammar = { - comment: { - pattern: /(^|[^\\])#.*/, - lookbehind: true, - }, - "string-interpolation": { - pattern: /(?:f|rf|fr)(?:("""|''')[\s\S]+?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i, - greedy: true, - inside: { - interpolation: { - // "{" "}" - pattern: /((?:^|[^{])(?:{{)*){(?!{)(?:[^{}]|{(?!{)(?:[^{}]|{(?!{)(?:[^{}])+})+})+}/, - lookbehind: true, - inside: { - "format-spec": { - pattern: /(:)[^:(){}]+(?=}$)/, - lookbehind: true, - }, - "conversion-option": { - pattern: /![sra](?=[:}]$)/, - alias: "punctuation", - }, - rest: null, - }, - }, - string: /[\s\S]+/, - }, - }, - "triple-quoted-string": { - pattern: /(?:[rub]|rb|br)?("""|''')[\s\S]+?\1/i, - greedy: true, - alias: "string", - }, - string: { - pattern: /(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i, - greedy: true, - }, - function: { - pattern: /((?:^|\s)func[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g, - lookbehind: true, - }, - "class-name": { - pattern: /(\bclass\s+)\w+/i, - lookbehind: true, - }, - decorator: { - pattern: /(^\s*)@\w+(?:\.\w+)*/im, - lookbehind: true, - alias: ["annotation", "punctuation"], - inside: { - punctuation: /\./, - }, - }, - keyword: /\b(?:if|elif|else|for|while|break|continue|pass|return|match|func|class|class_name|extends|is|onready|tool|static|export|setget|const|var|as|void|enum|preload|assert|yield|signal|breakpoint|rpc|sync|master|puppet|slave|remotesync|mastersync|puppetsync)\b/, - builtin: /\b(?:PI|TAU|NAN|INF|_|sin|cos|tan|sinh|cosh|tanh|asin|acos|atan|atan2|sqrt|fmod|fposmod|floor|ceil|round|abs|sign|pow|log|exp|is_nan|is_inf|ease|decimals|stepify|lerp|dectime|randomize|randi|randf|rand_range|seed|rand_seed|deg2rad|rad2deg|linear2db|db2linear|max|min|clamp|nearest_po2|weakref|funcref|convert|typeof|type_exists|char|str|print|printt|prints|printerr|printraw|var2str|str2var|var2bytes|bytes2var|range|load|inst2dict|dict2inst|hash|Color8|print_stack|instance_from_id|preload|yield|assert|Vector2|Vector3|Color|Rect2|Array|Basis|Dictionary|Plane|Quat|RID|Rect3|Transform|Transform2D|AABB|String|Color|NodePath|RID|Object|Dictionary|Array|PoolByteArray|PoolIntArray|PoolRealArray|PoolStringArray|PoolVector2Array|PoolVector3Array|PoolColorArray)\b/, - boolean: /\b(?:true|false)\b/, - number: /(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i, - operator: /[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/, - punctuation: /[{}[\];(),.:]/, -}; - -const PrismStyleSheet = ` -code[class*="language-"], -pre[class*="language-"] { - color: #657b83; /* base00 */ - font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; - font-size: 1em; - text-align: left; - white-space: pre; - word-spacing: normal; - word-break: normal; - word-wrap: normal; - - line-height: 1.5; - - -moz-tab-size: 4; - -o-tab-size: 4; - tab-size: 4; - - -webkit-hyphens: none; - -moz-hyphens: none; - -ms-hyphens: none; - hyphens: none; -} - -pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, -code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { - background: #073642; /* base02 */ -} - -pre[class*="language-"]::selection, pre[class*="language-"] ::selection, -code[class*="language-"]::selection, code[class*="language-"] ::selection { - background: #073642; /* base02 */ -} - -/* Code blocks */ -pre[class*="language-"] { - padding: 1em; - margin: .5em 0; - overflow: auto; - border-radius: 0.3em; -} - -:not(pre) > code[class*="language-"], -pre[class*="language-"] { - background-color: #fdf6e3; /* base3 */ -} - -/* Inline code */ -:not(pre) > code[class*="language-"] { - padding: .1em; - border-radius: .3em; -} - -.token.comment, -.token.prolog, -.token.doctype, -.token.cdata { - color: #93a1a1; /* base1 */ -} - -.token.punctuation { - color: #586e75; /* base01 */ -} - -.namespace { - opacity: .7; -} - -.token.property, -.token.tag, -.token.boolean, -.token.number, -.token.constant, -.token.symbol, -.token.deleted { - color: #268bd2; /* blue */ -} - -.token.selector, -.token.attr-name, -.token.string, -.token.char, -.token.builtin, -.token.url, -.token.inserted { - color: #2aa198; /* cyan */ -} - -.token.entity { - color: #657b83; /* base00 */ - background: #eee8d5; /* base2 */ -} - -.token.atrule, -.token.attr-value, -.token.keyword { - color: #859900; /* green */ -} - -.token.function, -.token.class-name { - color: #b58900; /* yellow */ -} - -.token.regex, -.token.important, -.token.variable { - color: #cb4b16; /* orange */ -} - -.token.important, -.token.bold { - font-weight: bold; -} -.token.italic { - font-style: italic; -} - -.token.entity { - cursor: help; -} -`; diff --git a/src/lsp/gdscript.capabilities.ts b/src/lsp/gdscript.capabilities.ts index 35e7ff7..e1a805e 100644 --- a/src/lsp/gdscript.capabilities.ts +++ b/src/lsp/gdscript.capabilities.ts @@ -1,12 +1,5 @@ import { DocumentSymbol, Range, SymbolKind } from "vscode-languageclient"; - -export const enum Methods { - GDSCRIPT_CAPABILITIES = 'gdscript/capabilities', - SHOW_NATIVE_SYMBOL = 'gdscript/show_native_symbol', - INSPECT_NATIVE_SYMBOL = 'textDocument/nativeSymbol' -} - export interface NativeSymbolInspectParams { native_class: string; symbol_name: string; @@ -23,6 +16,7 @@ export class GodotNativeSymbol implements DocumentSymbol { children?: DocumentSymbol[]; documentation: string; native_class: string; + class_info?: GodotNativeClassInfo; } export interface GodotNativeClassInfo { diff --git a/src/lsp/index.ts b/src/lsp/index.ts new file mode 100644 index 0000000..dfbe3c8 --- /dev/null +++ b/src/lsp/index.ts @@ -0,0 +1 @@ +export { ClientConnectionManager } from "./ClientConnectionManager"; diff --git a/src/providers/completions.ts b/src/providers/completions.ts new file mode 100644 index 0000000..f87d8ac --- /dev/null +++ b/src/providers/completions.ts @@ -0,0 +1,41 @@ +import * as vscode from "vscode"; +import { + Uri, + Position, + Range, + TextDocument, + CancellationToken, + ProviderResult, + CompletionContext, + CompletionList, + CompletionItem, + CompletionItemProvider, + ExtensionContext, +} from "vscode"; +import { createLogger } from "../utils"; + +const log = createLogger("providers.completions"); + +export class GDCompletionItemProvider implements CompletionItemProvider { + constructor(private context: ExtensionContext) { + const selector = [ + { language: "gdresource", scheme: "file" }, + { language: "gdscene", scheme: "file" }, + { language: "gdscript", scheme: "file" }, + ]; + context.subscriptions.push( + vscode.languages.registerCompletionItemProvider(selector, this), + ); + } + + provideCompletionItems(document: TextDocument, position: Position, token: CancellationToken, context: CompletionContext): ProviderResult> { + const items = []; + + const linePrefix = document.lineAt(position).text.slice(0, position.character); + + log.debug("provideCompletionItems"); + log.debug("linePrefix", linePrefix); + + return items; + } +} diff --git a/src/providers/definition.ts b/src/providers/definition.ts new file mode 100644 index 0000000..7e60dc0 --- /dev/null +++ b/src/providers/definition.ts @@ -0,0 +1,69 @@ +import * as vscode from "vscode"; +import { + Uri, + Position, + TextDocument, + CancellationToken, + Location, + Definition, + DefinitionProvider, + ExtensionContext, +} from "vscode"; +import { make_docs_uri, createLogger } from "../utils"; +import { globals } from "../extension"; + +const log = createLogger("providers.definitions"); + +export class GDDefinitionProvider implements DefinitionProvider { + constructor(private context: ExtensionContext) { + const selector = [ + { language: "gdresource", scheme: "file" }, + { language: "gdscene", scheme: "file" }, + { language: "gdscript", scheme: "file" }, + ]; + + context.subscriptions.push( + vscode.languages.registerDefinitionProvider(selector, this), + ); + } + + async provideDefinition(document: TextDocument, position: Position, token: CancellationToken): Promise { + if (["gdresource", "gdscene"].includes(document.languageId)) { + const range = document.getWordRangeAtPosition(position, /(\w+)/); + if (range) { + const word = document.getText(range); + if (globals.docsProvider.classInfo[word] !== undefined) { + const uri = make_docs_uri(word); + return new Location(uri, new Position(0, 0)); + } else { + let i = 0; + let line; + let match; + + do { + line = document.lineAt(position.line - i++); + match = line.text.match(/(?<=type)="(\w+)"/); + } while (!match && line.lineNumber > 0); + + if (globals.docsProvider.classInfo[match[1]] !== undefined) { + const uri = make_docs_uri(match[1], word); + return new Location(uri, new Position(0, 0)); + } + } + } + + return null; + } + + const target = await globals.lsp.client.get_symbol_at_position(document.uri, position); + + if (!target) { + return null; + } + + const parts = target.split("."); + const uri = make_docs_uri(parts[0], parts[1]); + + return new Location(uri, new Position(0, 0)); + } +} diff --git a/src/providers/document_link.ts b/src/providers/document_link.ts new file mode 100644 index 0000000..f5e23a8 --- /dev/null +++ b/src/providers/document_link.ts @@ -0,0 +1,82 @@ +import * as vscode from "vscode"; +import { + Uri, + Range, + TextDocument, + CancellationToken, + DocumentLink, + DocumentLinkProvider, + ExtensionContext, +} from "vscode"; +import { SceneParser } from "../scene_tools"; +import { convert_resource_path_to_uri, createLogger } from "../utils"; + +const log = createLogger("providers.document_links"); + +export class GDDocumentLinkProvider implements DocumentLinkProvider { + public parser = new SceneParser(); + + constructor(private context: ExtensionContext) { + const selector = [ + { language: "gdresource", scheme: "file" }, + { language: "gdscene", scheme: "file" }, + { language: "gdscript", scheme: "file" }, + ]; + context.subscriptions.push( + vscode.languages.registerDocumentLinkProvider(selector, this), + ); + } + + async provideDocumentLinks(document: TextDocument, token: CancellationToken): Promise { + const scene = this.parser.parse_scene(document); + const text = document.getText(); + const path = document.uri.fsPath; + + const links: DocumentLink[] = []; + + if (["gdresource", "gdscene"].includes(document.languageId)) { + for (const match of text.matchAll(/ExtResource\(\s?"?(\w+)\s?"?\)/g)) { + const id = match[1]; + const uri = Uri.from({ + scheme: "file", + path: path, + fragment: `${scene.externalResources[id].line},0`, + }); + + const r = this.create_range(document, match); + const link = new DocumentLink(r, uri); + link.tooltip = "Jump to resource definition"; + links.push(link); + } + + for (const match of text.matchAll(/SubResource\(\s?"?(\w+)\s?"?\)/g)) { + const id = match[1]; + const uri = Uri.from({ + scheme: "file", + path: path, + fragment: `${scene.subResources[id].line},0`, + }); + + const r = this.create_range(document, match); + const link = new DocumentLink(r, uri); + links.push(link); + } + } + for (const match of text.matchAll(/res:\/\/[^"^']*/g)) { + const r = this.create_range(document, match); + const uri = await convert_resource_path_to_uri(match[0]); + if (uri instanceof Uri) { + links.push(new DocumentLink(r, uri)); + } + } + + return links; + } + + private create_range(document: TextDocument, match: RegExpMatchArray) { + const start = document.positionAt(match.index); + const end = document.positionAt(match.index + match[0].length); + const r = new Range(start, end); + return r; + } +} diff --git a/src/providers/documentation.ts b/src/providers/documentation.ts new file mode 100644 index 0000000..6dedf1c --- /dev/null +++ b/src/providers/documentation.ts @@ -0,0 +1,124 @@ +import * as vscode from "vscode"; +import { + CancellationToken, + CustomDocument, + CustomDocumentOpenContext, + CustomReadonlyEditorProvider, + ExtensionContext, + Uri, + WebviewPanel, +} from "vscode"; +import { NotificationMessage } from "vscode-jsonrpc"; +import { + NativeSymbolInspectParams, + GodotNativeSymbol, + GodotNativeClassInfo, + GodotCapabilities, +} from "../lsp/gdscript.capabilities"; +import { make_html_content } from "./documentation_builder"; +import { createLogger, get_extension_uri, make_docs_uri } from "../utils"; +import { globals } from "../extension"; + +const log = createLogger("providers.docs"); + +export class GDDocumentationProvider implements CustomReadonlyEditorProvider { + public classInfo = new Map(); + public symbolDb = new Map(); + public htmlDb = new Map(); + + private ready = false; + + constructor(private context: ExtensionContext) { + const options = { + webviewOptions: { + enableScripts: true, + retainContextWhenHidden: true, + enableFindWidget: true, + }, + supportsMultipleEditorsPerDocument: true, + }; + context.subscriptions.push( + vscode.window.registerCustomEditorProvider("gddoc", this, options), + ); + } + + public register_capabilities(message: NotificationMessage) { + for (const gdclass of (message.params as GodotCapabilities).native_classes) { + this.classInfo[gdclass.name] = gdclass; + } + for (const gdclass of (message.params as GodotCapabilities).native_classes) { + if (gdclass.inherits) { + const extended_classes = this.classInfo[gdclass.inherits].extended_classes || []; + extended_classes.push(gdclass.name); + this.classInfo[gdclass.inherits].extended_classes = extended_classes; + } + } + this.ready = true; + } + + public async list_native_classes() { + const classname = await vscode.window.showQuickPick( + Object.keys(this.classInfo).sort(), + { + placeHolder: "Type godot class name here", + canPickMany: false, + } + ); + if (classname) { + vscode.commands.executeCommand("vscode.open", make_docs_uri(classname)); + } + } + + public openCustomDocument(uri: Uri, openContext: CustomDocumentOpenContext, token: CancellationToken): CustomDocument { + return { uri: uri, dispose: () => { } }; + } + + public async resolveCustomEditor(document: CustomDocument, panel: WebviewPanel, token: CancellationToken): Promise { + const className = document.uri.path.split(".")[0]; + const target = document.uri.fragment; + let symbol: GodotNativeSymbol = null; + + panel.webview.options = { + enableScripts: true, + }; + + while (!this.ready) { + await new Promise(resolve => setTimeout(resolve, 100)); + } + + if (className in this.symbolDb) { + symbol = this.symbolDb[className]; + } + + if (!symbol && className in this.classInfo) { + const params: NativeSymbolInspectParams = { + native_class: className, + symbol_name: className, + }; + + const response = await globals.lsp.client.sendRequest("textDocument/nativeSymbol", params); + + symbol = response as GodotNativeSymbol; + symbol.class_info = this.classInfo[symbol.name]; + this.symbolDb[symbol.name] = symbol; + } + if (!this.htmlDb.has(className)) { + this.htmlDb[className] = make_html_content(panel.webview, symbol, target); + } + panel.webview.html = this.htmlDb[className]; + panel.iconPath = get_extension_uri("resources/godot_icon.svg"); + panel.webview.onDidReceiveMessage(msg => { + if (msg.type === "INSPECT_NATIVE_SYMBOL") { + const uri = make_docs_uri(msg.data.native_class, msg.data.symbol_name); + vscode.commands.executeCommand("vscode.open", uri); + } + }); + + if (target) { + panel.webview.postMessage({ + command: "focus", + target: target, + }); + } + } +} diff --git a/src/providers/documentation_builder.ts b/src/providers/documentation_builder.ts new file mode 100644 index 0000000..8673708 --- /dev/null +++ b/src/providers/documentation_builder.ts @@ -0,0 +1,485 @@ +import * as vscode from "vscode"; +import { SymbolKind } from "vscode-languageclient"; +import * as Prism from "prismjs"; +import * as csharp from "prismjs/components/prism-csharp"; +import { marked } from "marked"; +import { GodotNativeSymbol } from "../lsp/gdscript.capabilities"; +import { get_extension_uri } from "../utils"; +import yabbcode = require("ya-bbcode"); + +const parser = new yabbcode(); + +//! I do not understand why this is necessary +//! if you don't touch this csharp object, it's not imported or something, idk +const wtf = csharp; + +marked.setOptions({ + highlight: function (code, lang) { + if (lang === "gdscript") { + return Prism.highlight(code, GDScriptGrammar, lang); + } + if (lang === "csharp") { + return Prism.highlight(code, Prism.languages.csharp, lang); + } + }, +}); + +// TODO: find a better way to apply this theming +let options = ""; +const theme = vscode.window.activeColorTheme.kind; +if (theme === vscode.ColorThemeKind.Dark) { + options = `{ + viewport: null, + styles: { + 'header,footer,section,article': '#d4d4d480', + 'h1,a': '#d4d4d480', + 'h2,h3,h4': '#d4d4d480' + }, + back: 'rgba(1,1,1,0.08)', + view: '#79797933', + drag: '#bfbfbf33', + interval: 50 + }`; +} else if (theme === vscode.ColorThemeKind.Light) { + options = `{ + viewport: null, + styles: { + 'header,footer,section,article': 'rgba(0,0,0,0.08)', + 'h1,a': 'rgba(0,0,0,0.10)', + 'h2,h3,h4': 'rgba(0,0,0,0.08)' + }, + back: 'rgba(0,0,0,0.08)', + view: 'rgba(0,0,0,0.08)', + drag: 'rgba(0,0,0,0.08)', + interval: 50 + }`; +} + +export function make_html_content(webview: vscode.Webview, symbol: GodotNativeSymbol, target?: string): string { + const pagemapJsUri = webview.asWebviewUri(get_extension_uri("media", "pagemap.js")); + const prismCssUri = webview.asWebviewUri(get_extension_uri("media", "prism.css")); + const docsCssUri = webview.asWebviewUri(get_extension_uri("media", "docs.css")); + + let initialFocus = ""; + if (target) { + initialFocus = ` + window.addEventListener('load', event => { + document.getElementById('${target}').scrollIntoView(); + }); + `; + } + + return /*html*/` + + + + + + + ${symbol.name} + + +
+ ${make_symbol_document(symbol)} +
+ + + + + + + `; +} + +export function make_symbol_document(symbol: GodotNativeSymbol): string { + const classlink = make_link(symbol.native_class, undefined); + + function make_function_signature(s: GodotNativeSymbol, with_class = false) { + const parts = /\((.*)?\)\s*\-\>\s*(([A-z0-9]+)?)$/.exec(s.detail); + if (!parts) { + return ""; + } + const ret_type = make_link(parts[2] || "void", undefined); + let args = (parts[1] || "").replace( + /\:\s([A-z0-9_]+)(\,\s*)?/g, + ": $1$2" + ); + args = args.replace(/\s=\s(.*?)[\,\)]/g, ""); + return `${ret_type} ${with_class ? `${classlink}.` : ""}${element( + "a", + s.name, + { href: `#${s.name}` } + )}( ${args} )`; + } + + function make_symbol_elements( + s: GodotNativeSymbol, + with_class = false + ): { index?: string; body: string } { + switch (s.kind) { + case SymbolKind.Property: + case SymbolKind.Variable: + { + // var Control.anchor_left: float + const parts = /\.([A-z_0-9]+)\:\s(.*)$/.exec(s.detail); + if (!parts) { + return; + } + const type = make_link(parts[2], undefined); + const name = element("a", s.name, { href: `#${s.name}` }); + const title = element( + "h4", + `${type} ${with_class ? `${classlink}.` : ""}${s.name}` + ); + const doc = element( + "p", + format_documentation(s.documentation, symbol.native_class) + ); + const div = element("div", title + doc); + return { + index: type + " " + name, + body: div, + }; + } + break; + case SymbolKind.Constant: + { + // const Control.FOCUS_ALL: FocusMode = 2 + // const Control.NOTIFICATION_RESIZED = 40 + const parts = /\.([A-Za-z_0-9]+)(\:\s*)?([A-z0-9_\.]+)?\s*=\s*(.*)$/.exec( + s.detail + ); + if (!parts) { + return; + } + const type = make_link(parts[3] || "int", undefined); + const name = parts[1]; + const value = element("code", parts[4]); + + const title = element( + "p", + `${type} ${with_class ? `${classlink}.` : ""}${name} = ${value}` + ); + const doc = element( + "p", + format_documentation(s.documentation, symbol.native_class) + ); + const div = element("div", title + doc); + return { + body: div, + }; + } + break; + case SymbolKind.Event: + { + const parts = /\.([A-z0-9]+)\((.*)?\)/.exec(s.detail); + if (!parts) { + return; + } + const args = (parts[2] || "").replace( + /\:\s([A-z0-9_]+)(\,\s*)?/g, + ": $1$2" + ); + const title = element( + "p", + `${with_class ? `signal ${with_class ? `${classlink}.` : ""}` : "" + }${s.name}( ${args} )` + ); + const doc = element( + "p", + format_documentation(s.documentation, symbol.native_class) + ); + const div = element("div", title + doc); + return { + body: div, + }; + } + break; + case SymbolKind.Method: + case SymbolKind.Function: + { + const signature = make_function_signature(s, with_class); + const title = element("h4", signature); + const doc = element( + "p", + format_documentation(s.documentation, symbol.native_class) + ); + const div = element("div", title + doc); + return { + index: signature, + body: div, + }; + } + break; + default: + break; + } + } + + if (symbol.kind == SymbolKind.Class) { + let doc = element("h2", `Native class ${symbol.name}`); + const parts = /extends\s+([A-z0-9]+)/.exec(symbol.detail); + let inherits = parts && parts.length > 1 ? parts[1] : ""; + if (inherits) { + let inherits_chain = ""; + let base_class = symbol.class_info[inherits]; + while (base_class) { + inherits_chain += `${inherits_chain ? " >" : ""} ${make_link( + base_class.name, + undefined + )}`; + base_class = symbol.class_info[base_class.inherits]; + } + inherits = `Inherits: ${inherits_chain}`; + doc += element("p", inherits); + } + if (symbol.class_info && symbol.class_info.extended_classes) { + let inherited = ""; + for (const c of symbol.class_info.extended_classes) { + inherited += (inherited ? ", " : " ") + make_link(c, c); + } + doc += element("p", `Inherited by:${inherited}`); + } + + let constants = ""; + let signals = ""; + let methods_index = ""; + let methods = ""; + let properties_index = ""; + let propertyies = ""; + let others = ""; + + for (const s of symbol.children as GodotNativeSymbol[]) { + const elements = make_symbol_elements(s); + switch (s.kind) { + case SymbolKind.Property: + case SymbolKind.Variable: + properties_index += element("li", elements.index); + propertyies += element("li", elements.body, { id: s.name }); + break; + case SymbolKind.Constant: + constants += element("li", elements.body, { id: s.name }); + break; + case SymbolKind.Event: + signals += element("li", elements.body, { id: s.name }); + break; + case SymbolKind.Method: + case SymbolKind.Function: + methods_index += element("li", elements.index); + methods += element("li", elements.body, { id: s.name }); + break; + default: + others += element("li", elements.body, { id: s.name }); + break; + } + } + + const add_group = (title: string, block: string) => { + if (block) { + doc += element("h3", title); + doc += element("ul", block); + } + }; + + doc += element( + "p", + format_documentation(symbol.documentation, symbol.native_class) + ); + add_group("Properties", properties_index); + add_group("Constants", constants); + add_group("Signals", signals); + add_group("Methods", methods_index); + add_group("Property Descriptions", propertyies); + add_group("Method Descriptions", methods); + add_group("Other Members", others); + doc += element("script", `var godot_class = "${symbol.native_class}";`); + + return doc; + } else { + let doc = ""; + const elements = make_symbol_elements(symbol, true); + if (elements.index) { + const symbols: SymbolKind[] = [SymbolKind.Function, SymbolKind.Method]; + if (!symbols.includes(symbol.kind)) { + doc += element("h2", elements.index); + } + } + doc += element("div", elements.body); + return doc; + } +} + +function element( + tag: K, + content: string, + props = {}, + new_line?: boolean, + indent?: string +) { + let props_str = ""; + for (const key in props) { + if (Object.prototype.hasOwnProperty.call(props, key)) { + props_str += ` ${key}="${props[key]}"`; + } + } + return `${indent || ""}<${tag} ${props_str}>${content}${new_line ? "\n" : "" + }`; +} + +function make_link(classname: string, symbol: string) { + if (!symbol || symbol == classname) { + return element("a", classname, { + onclick: `inspect('${classname}')`, + href: "", + }); + } else { + return element("a", `${classname}.${symbol}`, { + onclick: `inspect('${classname}', '${symbol}')`, + href: "", + }); + } +} + +function make_codeblock(code: string, language: string) { + const lines = code.split("\n"); + const indent = lines[0].match(/^\s*/)[0].length; + code = lines.map(line => line.slice(indent)).join("\n"); + return marked.parse(`\`\`\`${language}\n${code}\n\`\`\``); +} + +function format_documentation(bbcode: string, classname: string) { + let html = parser.parse(bbcode.trim()); + + html = html.replaceAll(/\[\/?codeblocks\]()?/g, ""); + html = html.replaceAll(""", "\""); + + for (const match of html.matchAll(/\[codeblock].*?\[\/codeblock]/gs)) { + let block = match[0]; + block = block.replaceAll(/\[\/?codeblock\]()?/g, ""); + block = block.replaceAll("
", "\n"); + html = html.replace(match[0], make_codeblock(block, "gdscript")); + } + for (const match of html.matchAll(/\[gdscript].*?\[\/gdscript]/gs)) { + let block = match[0]; + block = block.replaceAll(/\[\/?gdscript\]()?/g, ""); + block = block.replaceAll("
", "\n"); + html = html.replace(match[0], make_codeblock(block, "gdscript")); + } + for (const match of html.matchAll(/\[csharp].*?\[\/csharp]/gs)) { + let block = match[0]; + block = block.replaceAll(/\[\/?csharp\]()?/g, ""); + block = block.replaceAll("
", "\n"); + html = html.replace(match[0], make_codeblock(block, "csharp")); + } + +html = html.replaceAll("
", ""); +// [param ] +html = html.replaceAll( + /\[param\s+(@?[A-Z_a-z][A-Z_a-z0-9]*?)\]/g, + "$1" +); +// [method ] +html = html.replaceAll( + /\[method\s+(@?[A-Z_a-z][A-Z_a-z0-9]*?)\]/g, + `$1` +); +// [] +html = html.replaceAll( + /\[(\w+)\]/g, + `$1` // eslint-disable-line quotes +); +// [method .] +html = html.replaceAll( + /\[\w+\s+(@?[A-Z_a-z][A-Z_a-z0-9]*?)\.(\w+)\]/g, + `$1.$2` // eslint-disable-line quotes +); + + return html; +} + +const GDScriptGrammar = { + comment: { + pattern: /(^|[^\\])#.*/, + lookbehind: true, + }, + "string-interpolation": { + pattern: /(?:f|rf|fr)(?:("""|''')[\s\S]+?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i, + greedy: true, + inside: { + interpolation: { + // "{" "}" + pattern: /((?:^|[^{])(?:{{)*){(?!{)(?:[^{}]|{(?!{)(?:[^{}]|{(?!{)(?:[^{}])+})+})+}/, + lookbehind: true, + inside: { + "format-spec": { + pattern: /(:)[^:(){}]+(?=}$)/, + lookbehind: true, + }, + "conversion-option": { + pattern: /![sra](?=[:}]$)/, + alias: "punctuation", + }, + rest: null, + }, + }, + string: /[\s\S]+/, + }, + }, + "triple-quoted-string": { + pattern: /(?:[rub]|rb|br)?("""|''')[\s\S]+?\1/i, + greedy: true, + alias: "string", + }, + string: { + pattern: /(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i, + greedy: true, + }, + function: { + pattern: /((?:^|\s)func[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g, + lookbehind: true, + }, + "class-name": { + pattern: /(\bclass\s+)\w+/i, + lookbehind: true, + }, + decorator: { + pattern: /(^\s*)@\w+(?:\.\w+)*/im, + lookbehind: true, + alias: ["annotation", "punctuation"], + inside: { + punctuation: /\./, + }, + }, + keyword: /\b(?:if|elif|else|for|while|break|continue|pass|return|match|func|class|class_name|extends|is|onready|tool|static|export|setget|const|var|as|void|enum|preload|assert|yield|signal|breakpoint|rpc|sync|master|puppet|slave|remotesync|mastersync|puppetsync)\b/, + builtin: /\b(?:PI|TAU|NAN|INF|_|sin|cos|tan|sinh|cosh|tanh|asin|acos|atan|atan2|sqrt|fmod|fposmod|floor|ceil|round|abs|sign|pow|log|exp|is_nan|is_inf|ease|decimals|stepify|lerp|dectime|randomize|randi|randf|rand_range|seed|rand_seed|deg2rad|rad2deg|linear2db|db2linear|max|min|clamp|nearest_po2|weakref|funcref|convert|typeof|type_exists|char|str|print|printt|prints|printerr|printraw|var2str|str2var|var2bytes|bytes2var|range|load|inst2dict|dict2inst|hash|Color8|print_stack|instance_from_id|preload|yield|assert|Vector2|Vector3|Color|Rect2|Array|Basis|Dictionary|Plane|Quat|RID|Rect3|Transform|Transform2D|AABB|String|Color|NodePath|RID|Object|Dictionary|Array|PoolByteArray|PoolIntArray|PoolRealArray|PoolStringArray|PoolVector2Array|PoolVector3Array|PoolColorArray)\b/, + boolean: /\b(?:true|false)\b/, + number: /(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i, + operator: /[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/, + punctuation: /[{}[\];(),.:]/, +}; diff --git a/src/providers/hover.ts b/src/providers/hover.ts new file mode 100644 index 0000000..b04a5a0 --- /dev/null +++ b/src/providers/hover.ts @@ -0,0 +1,108 @@ +import * as vscode from "vscode"; +import { + Uri, + Position, + TextDocument, + CancellationToken, + ExtensionContext, + HoverProvider, + MarkdownString, + Hover, +} from "vscode"; +import { SceneParser } from "../scene_tools"; +import { convert_resource_path_to_uri, createLogger } from "../utils"; + +const log = createLogger("providers.hover"); + +export class GDHoverProvider implements HoverProvider { + public parser = new SceneParser(); + + constructor(private context: ExtensionContext) { + const selector = [ + { language: "gdresource", scheme: "file" }, + { language: "gdscene", scheme: "file" }, + { language: "gdscript", scheme: "file" }, + ]; + context.subscriptions.push( + vscode.languages.registerHoverProvider(selector, this), + ); + } + + async get_links(text: string): Promise { + let links = ""; + for (const match of text.matchAll(/res:\/\/[^"^']*/g)) { + const uri = await convert_resource_path_to_uri(match[0]); + if (uri instanceof Uri) { + links += `* [${match[0]}](${uri})\n`; + } + } + return links; + } + + async provideHover(document: TextDocument, position: Position, token: CancellationToken): Promise { + if (["gdresource", "gdscene"].includes(document.languageId)) { + const scene = this.parser.parse_scene(document); + + const wordPattern = /(?:Ext|Sub)Resource\(\s?"?(\w+)\s?"?\)/; + const word = document.getText(document.getWordRangeAtPosition(position, wordPattern)); + + if (word.startsWith("ExtResource")) { + const match = word.match(wordPattern); + const id = match[1]; + const resource = scene.externalResources[id]; + const definition = scene.externalResources[id].body; + const links = await this.get_links(definition); + + const contents = new MarkdownString(); + contents.appendMarkdown(links); + contents.appendMarkdown("---"); + contents.appendCodeblock(definition, "gdresource"); + if (resource.type === "Script") { + contents.appendMarkdown("---"); + const uri = await convert_resource_path_to_uri(resource.path); + const text = (await vscode.workspace.openTextDocument(uri)).getText(); + contents.appendCodeblock(text, "gdscript"); + } + const hover = new Hover(contents); + return hover; + } + + if (word.startsWith("SubResource")) { + const match = word.match(wordPattern); + const id = match[1]; + + let definition = scene.subResources[id].body; + // don't display contents of giant arrays + definition = definition?.replace(/Array\([0-9,\.\- ]*\)/, "Array(...)"); + + const contents = new MarkdownString(); + contents.appendCodeblock(definition, "gdresource"); + const hover = new Hover(contents); + return hover; + } + } + + const link = document.getText(document.getWordRangeAtPosition(position, /res:\/\/[^"^']*/)); + if (link.startsWith("res://")) { + let type = ""; + if (link.endsWith(".gd")) { + type = "gdscript"; + } else if (link.endsWith(".cs")) { + type = "csharp"; + } else if (link.endsWith(".tscn")) { + type = "gdscene"; + } else if (link.endsWith(".tres")) { + type = "gdresource"; + } else { + return; + } + + const uri = await convert_resource_path_to_uri(link); + const text = (await vscode.workspace.openTextDocument(uri)).getText(); + const contents = new MarkdownString(); + contents.appendCodeblock(text, type); + const hover = new Hover(contents); + return hover; + } + } +} diff --git a/src/providers/index.ts b/src/providers/index.ts new file mode 100644 index 0000000..9373428 --- /dev/null +++ b/src/providers/index.ts @@ -0,0 +1,8 @@ +export * from "./completions"; +export * from "./definition"; +export * from "./document_link"; +export * from "./hover"; +export * from "./inlay_hints"; +export * from "./semantic_tokens"; +export * from "./documentation"; +export * from "./tasks"; diff --git a/src/providers/inlay_hints.ts b/src/providers/inlay_hints.ts new file mode 100644 index 0000000..726cfc7 --- /dev/null +++ b/src/providers/inlay_hints.ts @@ -0,0 +1,63 @@ +import * as vscode from "vscode"; +import { + Range, + TextDocument, + CancellationToken, + InlayHint, + ProviderResult, + InlayHintKind, + InlayHintsProvider, + ExtensionContext, +} from "vscode"; +import { SceneParser } from "../scene_tools"; +import { createLogger } from "../utils"; + +const log = createLogger("providers.inlay_hints"); + +export class GDInlayHintsProvider implements InlayHintsProvider { + public parser = new SceneParser(); + + constructor(private context: ExtensionContext) { + const selector = [ + { language: "gdresource", scheme: "file" }, + { language: "gdscene", scheme: "file" }, + { language: "gdscript", scheme: "file" }, + ]; + context.subscriptions.push( + vscode.languages.registerInlayHintsProvider(selector, this), + ); + } + + provideInlayHints(document: TextDocument, range: Range, token: CancellationToken): ProviderResult { + const scene = this.parser.parse_scene(document); + const text = document.getText(); + + const hints: InlayHint[] = []; + + for (const match of text.matchAll(/ExtResource\(\s?"?(\w+)\s?"?\)/g)) { + const id = match[1]; + const end = document.positionAt(match.index + match[0].length); + const resource = scene.externalResources[id]; + + const label = `${resource.type}: "${resource.path}"`; + + const hint = new InlayHint(end, label, InlayHintKind.Type); + hint.paddingLeft = true; + hints.push(hint); + } + + for (const match of text.matchAll(/SubResource\(\s?"?(\w+)\s?"?\)/g)) { + const id = match[1]; + const end = document.positionAt(match.index + match[0].length); + const resource = scene.subResources[id]; + + const label = `${resource.type}`; + + const hint = new InlayHint(end, label, InlayHintKind.Type); + hint.paddingLeft = true; + hints.push(hint); + } + + return hints; + } +} diff --git a/src/providers/semantic_tokens.ts b/src/providers/semantic_tokens.ts new file mode 100644 index 0000000..31e479c --- /dev/null +++ b/src/providers/semantic_tokens.ts @@ -0,0 +1,59 @@ +import * as vscode from "vscode"; +import { + Uri, + Position, + Range, + TextDocument, + CancellationToken, + ExtensionContext, + DocumentSemanticTokensProvider, + SemanticTokens, + SemanticTokensLegend, + SemanticTokensBuilder, +} from "vscode"; +import { createLogger } from "../utils"; + +const log = createLogger("providers.tokens"); + +export class GDSemanticTokensProvider implements DocumentSemanticTokensProvider { + private legend = new SemanticTokensLegend( + [ + "nodePath", + "%", + ], + ["test"], + ); + + constructor(private context: ExtensionContext) { + const selector = [ + { language: "gdresource", scheme: "file" }, + { language: "gdscene", scheme: "file" }, + { language: "gdscript", scheme: "file" }, + ]; + + context.subscriptions.push( + vscode.languages.registerDocumentSemanticTokensProvider(selector, this, this.legend), + ); + } + + async provideDocumentSemanticTokens(document: TextDocument, token: CancellationToken): Promise { + log.debug("provideDocumentSemanticTokens"); + const builder = new SemanticTokensBuilder(this.legend); + const text = document.getText(); + + const pattern = /(?<=(?:get_node|has_node|find_node|get_node_or_null|has_node_and_resource)\(\s?)(("|')((?!\2).)*\2)(?=\s?\))/g; + for (const match of text.matchAll(pattern)) { + const r = this.create_range(document, match); + builder.push(r, "nodePath", []); + } + + return builder.build(); + } + + private create_range(document: TextDocument, match: RegExpMatchArray) { + const start = document.positionAt(match.index); + const end = document.positionAt(match.index + match[0].length); + const r = new Range(start, end); + return r; + } +} diff --git a/src/providers/tasks.ts b/src/providers/tasks.ts new file mode 100644 index 0000000..b4a626b --- /dev/null +++ b/src/providers/tasks.ts @@ -0,0 +1,45 @@ +import * as vscode from "vscode"; +import { + Task, + TaskProvider, + TaskScope, + TaskDefinition, + ExtensionContext, +} from "vscode"; +import { createLogger } from "../utils"; + +const log = createLogger("providers.tasks"); + +interface GDTaskDefinition extends TaskDefinition { + task: string; + file?: string; +} + +export class GDTaskProvider implements TaskProvider { + constructor(private context: ExtensionContext) { + context.subscriptions.push( + vscode.tasks.registerTaskProvider("godot", this), + ); + } + + public provideTasks() { + const tasks: Task[] = []; + + const workspaceFolder = vscode.workspace.workspaceFolders[0]; + const taskName = "test"; + const kind: GDTaskDefinition = { + type: "godot", + task: taskName, + }; + const task = new vscode.Task(kind, workspaceFolder, taskName, "godot"); + tasks.push(task); + + return tasks; + } + + public resolveTask(_task: Task) { + log.debug("resolveTask", _task); + + return _task; + } +} diff --git a/src/scene_preview_provider.ts b/src/scene_preview_provider.ts deleted file mode 100644 index 4a13aef..0000000 --- a/src/scene_preview_provider.ts +++ /dev/null @@ -1,339 +0,0 @@ -import { - TreeDataProvider, - EventEmitter, - Event, - TreeView, - ProviderResult, - TreeItem, - TreeItemCollapsibleState, -} from "vscode"; -import path = require("path"); -import fs = require("fs"); -import * as vscode from "vscode"; -import { - get_configuration, - find_file, - set_context, - convert_resource_path_to_uri, - register_command, -} from "./utils"; -import { createLogger } from "./logger"; - -const log = createLogger("scene preview"); - -export class ScenePreviewProvider implements TreeDataProvider { - private root: SceneNode | undefined; - private tree: TreeView; - private scenePreviewPinned = false; - private currentScene = ""; - private externalResources = {}; - - private changeEvent = new EventEmitter(); - - public get onDidChangeTreeData(): Event { - return this.changeEvent.event; - } - - public async refresh() { - if (this.scenePreviewPinned) { - return; - } - - const editor = vscode.window.activeTextEditor; - if (editor) { - let fileName = editor.document.uri.fsPath; - const mode = get_configuration("scenePreview.previewRelatedScenes"); - // attempt to find related scene - if (!fileName.endsWith(".tscn")) { - const searchName = fileName.replace(".gd", ".tscn"); - - if (mode == "anyFolder") { - const relatedScene = await find_file(searchName); - if (!relatedScene) { - return; - } - fileName = relatedScene.fsPath; - } - - if (mode == "sameFolder") { - if (fs.existsSync(searchName)) { - fileName = searchName; - } else { - return; - } - } - if (mode == "off") { - return; - } - } - // don't attempt to parse non-scenes - if (!fileName.endsWith(".tscn")) { - return; - } - // don't reparse the currently selected scene - if (this.currentScene == fileName) { - // TODO: reparse the currentScene if it's changed - // ideas: store a hash? check last modified time? - return; - } - await this.parse_scene(fileName); - this.changeEvent.fire(); - } - } - - constructor() { - this.tree = vscode.window.createTreeView("scenePreview", { - treeDataProvider: this, - }); - - this.tree.onDidChangeSelection(this.tree_selection_changed); - - register_command("scenePreview.pin", this.pin_preview.bind(this)); - register_command("scenePreview.unpin", this.unpin_preview.bind(this)); - register_command("scenePreview.copyNodePath", this.copy_node_path.bind(this)); - register_command("scenePreview.copyResourcePath", this.copy_resource_path.bind(this)); - register_command("scenePreview.openScene", this.open_scene.bind(this)); - register_command("scenePreview.openScript", this.open_script.bind(this)); - register_command("scenePreview.goToDefinition", this.go_to_definition.bind(this)); - - register_command("scenePreview.refresh", () => - this.refresh() - ); - - vscode.window.onDidChangeActiveTextEditor(() => { - vscode.commands.executeCommand("godotTools.scenePreview.refresh"); - }); - - this.refresh(); - } - - private pin_preview() { - this.scenePreviewPinned = true; - set_context("scenePreview.pinned", true); - } - - private unpin_preview() { - this.scenePreviewPinned = false; - set_context("scenePreview.pinned", false); - this.refresh(); - } - - private copy_node_path(item: SceneNode) { - if (item.unique) { - vscode.env.clipboard.writeText("%" + item.label); - return; - } - vscode.env.clipboard.writeText(item.relativePath); - } - - private copy_resource_path(item: SceneNode) { - vscode.env.clipboard.writeText(item.resourcePath); - } - - private async open_scene(item: SceneNode) { - const uri = await convert_resource_path_to_uri(item.resourcePath); - if (uri) { - vscode.window.showTextDocument(uri, { preview: true }); - } - } - - private async open_script(item: SceneNode) { - const id = this.externalResources[item.scriptId].path; - - const uri = await convert_resource_path_to_uri(id); - if (uri) { - vscode.window.showTextDocument(uri, { preview: true }); - } - } - - private async go_to_definition(item: SceneNode) { - const document = await vscode.workspace.openTextDocument(this.currentScene); - const start = document.positionAt(item.position); - const end = document.positionAt(item.position + item.text.length); - const range = new vscode.Range(start, end); - vscode.window.showTextDocument(document, { selection: range }); - } - - private tree_selection_changed(event: vscode.TreeViewSelectionChangeEvent) { - // const item = event.selection[0]; - // log(item.body); - - // const editor = vscode.window.activeTextEditor; - // const range = editor.document.getText() - // editor.revealRange(range) - } - - public async parse_scene(scene: string) { - this.currentScene = scene; - this.tree.message = path.basename(scene); - - const document = await vscode.workspace.openTextDocument(scene); - const text = document.getText(); - - this.externalResources = {}; - - const resourceRegex = /\[ext_resource.*/g; - for (const match of text.matchAll(resourceRegex)) { - const line = match[0]; - const type = line.match(/type="([\w]+)"/)?.[1]; - const path = line.match(/path="([\w.:/]+)"/)?.[1]; - const uid = line.match(/uid="([\w:/]+)"/)?.[1]; - const id = line.match(/id="([\w]+)"/)?.[1]; - - this.externalResources[id] = { - path: path, - type: type, - uid: uid, - id: id, - }; - } - - let root = ""; - let nodes = {}; - let lastNode = null; - - const nodeRegex = /\[node name="([\w]*)"(?: type="([\w]*)")?(?: parent="([\w\/.]*)")?(?: instance=ExtResource\(\s*"?([\w]+)"?\s*\))?\]/g; - for (const match of text.matchAll(nodeRegex)) { - let name = match[1]; - let type = match[2] ? match[2] : "PackedScene"; - let parent = match[3]; - let instance = match[4] ? match[4] : 0; - let _path = ""; - let relativePath = ""; - - if (parent == undefined) { - root = name; - _path = name; - } else if (parent == ".") { - parent = root; - relativePath = name; - _path = parent + "/" + name; - } else { - relativePath = parent + "/" + name; - parent = root + "/" + parent; - _path = parent + "/" + name; - } - if (lastNode) { - lastNode.body = text.slice(lastNode.position, match.index); - lastNode.parse_body(); - } - - let node = new SceneNode(name, type); - node.path = _path; - node.description = type; - node.relativePath = relativePath; - node.parent = parent; - node.text = match[0]; - node.position = match.index; - if (instance) { - if (instance in this.externalResources) { - node.tooltip = this.externalResources[instance].path; - node.resourcePath = this.externalResources[instance].path; - if (['.tscn'].includes(path.extname(node.resourcePath))) { - node.contextValue += "openable"; - } - } - node.contextValue += "hasResourcePath"; - } - if (_path == root) { - this.root = node; - } - if (parent in nodes) { - nodes[parent].children.push(node); - } - nodes[_path] = node; - - lastNode = node; - } - - lastNode.body = text.slice(lastNode.position, text.length); - lastNode.parse_body(); - } - - public getChildren(element?: SceneNode): ProviderResult { - if (!element) { - if (!this.root) { - return Promise.resolve([]); - } else { - return Promise.resolve([this.root]); - } - } else { - return Promise.resolve(element.children); - } - } - - public getTreeItem(element: SceneNode): TreeItem | Thenable { - if (element.children.length > 0) { - element.collapsibleState = TreeItemCollapsibleState.Expanded; - } else { - element.collapsibleState = TreeItemCollapsibleState.None; - } - - return element; - } -} - -export class SceneNode extends TreeItem { - public path: string; - public relativePath: string; - public resourcePath: string; - public parent: string; - public text: string; - public position: number; - public body: string; - public unique: boolean = false; - public hasScript: boolean = false; - public scriptId: string = ''; - public children: SceneNode[] = []; - - constructor( - public label: string, - public className: string, - public collapsibleState?: TreeItemCollapsibleState - ) { - super(label, collapsibleState); - - const iconDir = path.join(__filename, "..", "..", "resources", "godot_icons"); - const iconName = className + '.svg'; - - this.iconPath = { - light: path.join(iconDir, "light", iconName), - dark: path.join(iconDir, "dark", iconName), - }; - } - - public parse_body() { - const lines = this.body.split("\n"); - let newLines = []; - let tags = []; - for (let i = 0; i < lines.length; i++) { - let line = lines[i]; - if (line.startsWith("tile_data")) { - line = "tile_data = PoolIntArray(...)"; - } - if (line.startsWith("unique_name_in_owner = true")) { - tags.push("%"); - this.unique = true; - } - if (line.startsWith("script = ExtResource")) { - tags.push("S"); - this.hasScript = true; - this.scriptId = line.match(/script = ExtResource\(\s*"?([\w]+)"?\s*\)/)[1]; - this.contextValue += "hasScript"; - } - if (line != "") { - newLines.push(line); - } - } - this.body = newLines.join("\n"); - - let prefix = ""; - if (tags.length != 0) { - prefix = tags.join(" ") + " | "; - } - this.description = prefix + this.description; - const content = new vscode.MarkdownString(); - content.appendCodeblock(this.body, "gdresource"); - this.tooltip = content; - } -} diff --git a/src/scene_tools/index.ts b/src/scene_tools/index.ts new file mode 100644 index 0000000..4b1da46 --- /dev/null +++ b/src/scene_tools/index.ts @@ -0,0 +1,3 @@ +export * from "./preview"; +export * from "./parser"; +export * from "./types"; diff --git a/src/scene_tools/parser.ts b/src/scene_tools/parser.ts new file mode 100644 index 0000000..acb9705 --- /dev/null +++ b/src/scene_tools/parser.ts @@ -0,0 +1,164 @@ +import { TextDocument, Uri } from "vscode"; +import { basename, extname } from "path"; +import * as fs from "fs"; +import { SceneNode, Scene } from "./types"; +import { createLogger } from "../utils"; + +const log = createLogger("scenes.parser"); + +export class SceneParser { + private static instance: SceneParser; + public scenes: Map = new Map(); + + constructor() { + if (SceneParser.instance) { + return SceneParser.instance; + } + SceneParser.instance = this; + } + + public parse_scene(document: TextDocument) { + const path = document.uri.fsPath; + const stats = fs.statSync(path); + + if (this.scenes.has(path)) { + const scene = this.scenes.get(path); + + if (scene.mtime == stats.mtimeMs) { + return scene; + } + } + + const scene = new Scene(); + scene.path = path; + scene.mtime = stats.mtimeMs; + scene.title = basename(path); + + this.scenes.set(path, scene); + + const text = document.getText(); + + for (const match of text.matchAll(/\[ext_resource.*/g)) { + const line = match[0]; + const type = line.match(/type="([\w]+)"/)?.[1]; + const path = line.match(/path="([\w.:/]+)"/)?.[1]; + const uid = line.match(/uid="([\w:/]+)"/)?.[1]; + const id = line.match(/ id="?([\w]+)"?/)?.[1]; + + scene.externalResources[id] = { + body: line, + path: path, + type: type, + uid: uid, + id: id, + index: match.index, + line: document.lineAt(document.positionAt(match.index)).lineNumber + 1, + }; + } + + let lastResource = null; + for (const match of text.matchAll(/\[sub_resource.*/g)) { + const line = match[0]; + const type = line.match(/type="([\w]+)"/)?.[1]; + const path = line.match(/path="([\w.:/]+)"/)?.[1]; + const uid = line.match(/uid="([\w:/]+)"/)?.[1]; + const id = line.match(/ id="?([\w]+)"?/)?.[1]; + const resource = { + path: path, + type: type, + uid: uid, + id: id, + index: match.index, + line: document.lineAt(document.positionAt(match.index)).lineNumber + 1, + }; + if (lastResource) { + lastResource.body = text.slice(lastResource.index, match.index).trimEnd(); + } + + scene.subResources[id] = resource; + lastResource = resource; + } + + let root = ""; + const nodes = {}; + let lastNode = null; + + const nodeRegex = /\[node name="([\w]*)"(?: type="([\w]*)")?(?: parent="([\w\/.]*)")?(?: instance=ExtResource\(\s*"?([\w]+)"?\s*\))?\]/g; + for (const match of text.matchAll(nodeRegex)) { + const name = match[1]; + const type = match[2] ? match[2] : "PackedScene"; + let parent = match[3]; + const instance = match[4] ? match[4] : 0; + let _path = ""; + let relativePath = ""; + + if (parent == undefined) { + root = name; + _path = name; + } else if (parent == ".") { + parent = root; + relativePath = name; + _path = parent + "/" + name; + } else { + relativePath = parent + "/" + name; + parent = root + "/" + parent; + _path = parent + "/" + name; + } + if (lastNode) { + lastNode.body = text.slice(lastNode.position, match.index); + lastNode.parse_body(); + } + if (lastResource) { + lastResource.body = text.slice(lastResource.index, match.index).trimEnd(); + lastResource = null; + } + + const node = new SceneNode(name, type); + node.path = _path; + node.description = type; + node.relativePath = relativePath; + node.parent = parent; + node.text = match[0]; + node.position = match.index; + node.resourceUri = Uri.from({ + scheme: "godot", + path: _path, + }); + scene.nodes.set(_path, node); + + if (instance) { + if (instance in scene.externalResources) { + node.tooltip = scene.externalResources[instance].path; + node.resourcePath = scene.externalResources[instance].path; + if ([".tscn"].includes(extname(node.resourcePath))) { + node.contextValue += "openable"; + } + } + node.contextValue += "hasResourcePath"; + } + if (_path == root) { + scene.root = node; + } + if (parent in nodes) { + nodes[parent].children.push(node); + } + nodes[_path] = node; + + lastNode = node; + } + + if (lastNode) { + lastNode.body = text.slice(lastNode.position, text.length); + lastNode.parse_body(); + } + + const resourceRegex = /\[resource\]/g; + for (const match of text.matchAll(resourceRegex)) { + if (lastResource) { + lastResource.body = text.slice(lastResource.index, match.index).trimEnd(); + lastResource = null; + } + } + return scene; + } +} diff --git a/src/scene_tools/preview.ts b/src/scene_tools/preview.ts new file mode 100644 index 0000000..aab4a9c --- /dev/null +++ b/src/scene_tools/preview.ts @@ -0,0 +1,289 @@ +import * as vscode from "vscode"; +import { + TreeDataProvider, + TreeDragAndDropController, + ExtensionContext, + EventEmitter, + Event, + TreeView, + ProviderResult, + TreeItem, + TreeItemCollapsibleState, + window, + languages, + Uri, + CancellationToken, + FileDecoration, + DocumentDropEditProvider, + workspace, +} from "vscode"; +import * as fs from "fs"; +import { + get_configuration, + find_file, + set_context, + convert_resource_path_to_uri, + register_command, + createLogger, + make_docs_uri, +} from "../utils"; +import { SceneParser } from "./parser"; +import { SceneNode, Scene } from "./types"; + +const log = createLogger("scenes.preview"); + +export class ScenePreviewProvider implements TreeDataProvider, TreeDragAndDropController, DocumentDropEditProvider { + public dropMimeTypes = []; + public dragMimeTypes = []; + private tree: TreeView; + private scenePreviewPinned = false; + private currentScene = ""; + public parser = new SceneParser(); + public scene: Scene; + watcher = workspace.createFileSystemWatcher("**/*.tscn"); + uniqueDecorator = new UniqueDecorationProvider(this); + scriptDecorator = new ScriptDecorationProvider(this); + + private changeTreeEvent = new EventEmitter(); + public get onDidChangeTreeData(): Event { + return this.changeTreeEvent.event; + } + + constructor(private context: ExtensionContext) { + this.tree = vscode.window.createTreeView("scenePreview", { + treeDataProvider: this, + dragAndDropController: this + }); + + const selector = [ + { language: "csharp", scheme: "file" }, + { language: "gdscript", scheme: "file" }, + ]; + context.subscriptions.push( + register_command("scenePreview.pin", this.pin_preview.bind(this)), + register_command("scenePreview.unpin", this.unpin_preview.bind(this)), + register_command("scenePreview.copyNodePath", this.copy_node_path.bind(this)), + register_command("scenePreview.copyResourcePath", this.copy_resource_path.bind(this)), + register_command("scenePreview.openScene", this.open_scene.bind(this)), + register_command("scenePreview.openScript", this.open_script.bind(this)), + register_command("scenePreview.goToDefinition", this.go_to_definition.bind(this)), + register_command("scenePreview.openDocumentation", this.open_documentation.bind(this)), + register_command("scenePreview.refresh", this.refresh.bind(this)), + window.onDidChangeActiveTextEditor(this.refresh.bind(this)), + window.registerFileDecorationProvider(this.uniqueDecorator), + window.registerFileDecorationProvider(this.scriptDecorator), + languages.registerDocumentDropEditProvider(selector, this), + this.watcher.onDidChange(this.on_file_changed.bind(this)), + this.watcher, + this.tree.onDidChangeSelection(this.tree_selection_changed), + this.tree, + ); + + this.refresh(); + } + + public handleDrag(source: readonly SceneNode[], data: vscode.DataTransfer, token: vscode.CancellationToken): void | Thenable { + data.set("godot/path", new vscode.DataTransferItem(source[0].relativePath)); + data.set("godot/class", new vscode.DataTransferItem(source[0].className)); + } + + public provideDocumentDropEdits(document: vscode.TextDocument, position: vscode.Position, dataTransfer: vscode.DataTransfer, token: vscode.CancellationToken): vscode.ProviderResult { + const path = dataTransfer.get("godot/path").value; + const className = dataTransfer.get("godot/class").value; + + if (path && className) { + if (document.languageId === "gdscript") { + return new vscode.DocumentDropEdit(`$${path}`); + } + if (document.languageId === "csharp") { + return new vscode.DocumentDropEdit(`GetNode<${className}>("${path}")`); + } + } + } + + public async on_file_changed(uri: vscode.Uri) { + if (!uri.fsPath.endsWith(".tscn")) { + return; + } + setTimeout(async () => { + if (uri.fsPath == this.currentScene) { + this.refresh(); + } else { + const document = await vscode.workspace.openTextDocument(uri); + this.parser.parse_scene(document); + } + }, 20); + } + + public async refresh() { + if (this.scenePreviewPinned) { + return; + } + + const editor = vscode.window.activeTextEditor; + if (editor) { + let fileName = editor.document.uri.fsPath; + const mode = get_configuration("scenePreview.previewRelatedScenes"); + // attempt to find related scene + if (!fileName.endsWith(".tscn")) { + const searchName = fileName.replace(".gd", ".tscn").replace(".cs", ".tscn"); + + if (mode == "anyFolder") { + const relatedScene = await find_file(searchName); + if (!relatedScene) { + return; + } + fileName = relatedScene.fsPath; + } + + if (mode == "sameFolder") { + if (fs.existsSync(searchName)) { + fileName = searchName; + } else { + return; + } + } + if (mode == "off") { + return; + } + } + // don't attempt to parse non-scenes + if (!fileName.endsWith(".tscn")) { + return; + } + + const document = await vscode.workspace.openTextDocument(fileName); + this.scene = this.parser.parse_scene(document); + + this.tree.message = this.scene.title; + this.currentScene = fileName; + + this.changeTreeEvent.fire(); + } + } + + private pin_preview() { + this.scenePreviewPinned = true; + set_context("scenePreview.pinned", true); + } + + private unpin_preview() { + this.scenePreviewPinned = false; + set_context("scenePreview.pinned", false); + this.refresh(); + } + + private copy_node_path(item: SceneNode) { + if (item.unique) { + vscode.env.clipboard.writeText("%" + item.label); + return; + } + vscode.env.clipboard.writeText(item.relativePath); + } + + private copy_resource_path(item: SceneNode) { + vscode.env.clipboard.writeText(item.resourcePath); + } + + private async open_scene(item: SceneNode) { + const uri = await convert_resource_path_to_uri(item.resourcePath); + if (uri) { + vscode.window.showTextDocument(uri, { preview: true }); + } + } + + private async open_script(item: SceneNode) { + const path = this.scene.externalResources[item.scriptId].path; + + const uri = await convert_resource_path_to_uri(path); + if (uri) { + vscode.window.showTextDocument(uri, { preview: true }); + } + } + + private async go_to_definition(item: SceneNode) { + const document = await vscode.workspace.openTextDocument(this.currentScene); + const start = document.positionAt(item.position); + const end = document.positionAt(item.position + item.text.length); + const range = new vscode.Range(start, end); + vscode.window.showTextDocument(document, { selection: range }); + } + + private async open_documentation(item: SceneNode) { + vscode.commands.executeCommand("vscode.open", make_docs_uri(item.className)); + } + + private tree_selection_changed(event: vscode.TreeViewSelectionChangeEvent) { + // const item = event.selection[0]; + // log(item.body); + + // const editor = vscode.window.activeTextEditor; + // const range = editor.document.getText() + // editor.revealRange(range) + } + + public getChildren(element?: SceneNode): ProviderResult { + if (!element) { + if (!this.scene?.root) { + return Promise.resolve([]); + } else { + return Promise.resolve([this.scene?.root]); + } + } else { + return Promise.resolve(element.children); + } + } + + public getTreeItem(element: SceneNode): TreeItem | Thenable { + if (element.children.length > 0) { + element.collapsibleState = TreeItemCollapsibleState.Expanded; + } else { + element.collapsibleState = TreeItemCollapsibleState.None; + } + + this.uniqueDecorator.changeDecorationsEvent.fire(element.resourceUri); + this.scriptDecorator.changeDecorationsEvent.fire(element.resourceUri); + + return element; + } +} + +class UniqueDecorationProvider implements vscode.FileDecorationProvider { + public changeDecorationsEvent = new EventEmitter(); + get onDidChangeFileDecorations(): Event { + return this.changeDecorationsEvent.event; + } + + constructor(private previewer: ScenePreviewProvider) { } + + provideFileDecoration(uri: Uri, token: CancellationToken): FileDecoration | undefined { + if (uri.scheme !== "godot") return undefined; + + const node = this.previewer.scene?.nodes.get(uri.path); + if (node && node.unique) { + return { + badge: "%", + }; + } + } +} + +class ScriptDecorationProvider implements vscode.FileDecorationProvider { + public changeDecorationsEvent = new EventEmitter(); + get onDidChangeFileDecorations(): Event { + return this.changeDecorationsEvent.event; + } + + constructor(private previewer: ScenePreviewProvider) { } + + provideFileDecoration(uri: Uri, token: CancellationToken): FileDecoration | undefined { + if (uri.scheme !== "godot") return undefined; + + const node = this.previewer.scene?.nodes.get(uri.path); + if (node && node.hasScript) { + return { + badge: "S", + }; + } + } +} diff --git a/src/scene_tools/types.ts b/src/scene_tools/types.ts new file mode 100644 index 0000000..c43c415 --- /dev/null +++ b/src/scene_tools/types.ts @@ -0,0 +1,84 @@ +import { + TreeItem, + TreeItemCollapsibleState, + MarkdownString, +} from "vscode"; +import * as path from "path"; +import { get_extension_uri } from "../utils"; + +const iconDir = get_extension_uri("resources", "godot_icons").fsPath; + +export class SceneNode extends TreeItem { + public path: string; + public relativePath: string; + public resourcePath: string; + public parent: string; + public text: string; + public position: number; + public body: string; + public unique: boolean = false; + public hasScript: boolean = false; + public scriptId: string = ""; + public children: SceneNode[] = []; + + constructor( + public label: string, + public className: string, + public collapsibleState?: TreeItemCollapsibleState + ) { + super(label, collapsibleState); + + const iconName = className + ".svg"; + + this.iconPath = { + light: path.join(iconDir, "light", iconName), + dark: path.join(iconDir, "dark", iconName), + }; + } + + public parse_body() { + const lines = this.body.split("\n"); + const newLines = []; + for (let i = 0; i < lines.length; i++) { + let line = lines[i]; + if (line.startsWith("tile_data")) { + line = "tile_data = PoolIntArray(...)"; + } + if (line.startsWith("unique_name_in_owner = true")) { + this.unique = true; + } + if (line.startsWith("script = ExtResource")) { + this.hasScript = true; + this.scriptId = line.match(/script = ExtResource\(\s*"?([\w]+)"?\s*\)/)[1]; + this.contextValue += "hasScript"; + } + if (line != "") { + newLines.push(line); + } + } + this.body = newLines.join("\n"); + const content = new MarkdownString(); + content.appendCodeblock(this.body, "gdresource"); + this.tooltip = content; + } +} + +export interface GDResource { + path: string; + type: string; + id: string; + uid: string; + body?: string; + index: number; + line: number; +} + +export class Scene { + public path: string; + public title: string; + public mtime: number; + public root: SceneNode | undefined; + public externalResources: {[key: string]: GDResource} = {}; + public subResources: {[key: string]: GDResource} = {}; + public nodes: Map = new Map(); +} diff --git a/src/utils.ts b/src/utils/index.ts similarity index 70% rename from src/utils.ts rename to src/utils/index.ts index a8c8bc4..507127c 100644 --- a/src/utils.ts +++ b/src/utils/index.ts @@ -3,43 +3,14 @@ import * as path from "path"; import * as fs from "fs"; import { AddressInfo, createServer } from "net"; -const EXTENSION_PREFIX = "godotTools"; - -export function get_configuration(name: string, defaultValue?: any) { - const configValue = vscode.workspace.getConfiguration(EXTENSION_PREFIX).get(name, null); - if (defaultValue && configValue === null) { - return defaultValue; - } - return configValue; -} - -export function set_configuration(name: string, value: any) { - return vscode.workspace.getConfiguration(EXTENSION_PREFIX).update(name, value); -} +export * from "./logger"; +export * from "./settings_updater"; +export * from "./vscode_utils"; export function is_debug_mode(): boolean { return process.env.VSCODE_DEBUG_MODE === "true"; } -const CONTEXT_PREFIX = `${EXTENSION_PREFIX}.context.`; - -export function set_context(name: string, value: any) { - return vscode.commands.executeCommand("setContext", CONTEXT_PREFIX + name, value); -} - -export function register_command(command: string, callback: (...args: any[]) => any, thisArg?: any): vscode.Disposable { - return vscode.commands.registerCommand(`${EXTENSION_PREFIX}.${command}`, callback); -} - -export function get_word_under_cursor(): string { - const activeEditor = vscode.window.activeTextEditor; - const document = activeEditor.document; - const curPos = activeEditor.selection.active; - const wordRange = document.getWordRangeAtPosition(curPos); - const symbolName = document.getText(wordRange); - return symbolName; -} - export let projectVersion = undefined; export async function get_project_version(): Promise { @@ -75,7 +46,7 @@ export async function get_project_dir() { let projectFile = ""; if (vscode.workspace.workspaceFolders != undefined) { const files = await vscode.workspace.findFiles("**/project.godot"); - if (files) { + if (files[0]) { projectFile = files[0].fsPath; if (fs.existsSync(projectFile) && fs.statSync(projectFile).isFile()) { dir = path.dirname(projectFile); @@ -121,7 +92,7 @@ export async function find_file(file: string): Promise { export async function convert_resource_path_to_uri(resPath: string): Promise { const files = await vscode.workspace.findFiles("**/project.godot"); - if (!files) { + if (!files || files[0] === undefined) { return null; } const dir = files[0].fsPath.replace("project.godot", ""); @@ -137,3 +108,11 @@ export async function get_free_port(): Promise { }); }); } + +export function make_docs_uri(path: string, fragment?: string) { + return vscode.Uri.from({ + scheme: "gddoc", + path: path + ".gddoc", + fragment: fragment, + }); +} diff --git a/src/logger.ts b/src/utils/logger.ts similarity index 98% rename from src/logger.ts rename to src/utils/logger.ts index c70d55c..7edb237 100644 --- a/src/logger.ts +++ b/src/utils/logger.ts @@ -1,5 +1,5 @@ import { LogOutputChannel, window } from "vscode"; -import { is_debug_mode } from "./utils"; +import { is_debug_mode } from "."; export enum LOG_LEVEL { SILENT, diff --git a/src/utils/prompts.ts b/src/utils/prompts.ts index e4ed9f8..85ee656 100644 --- a/src/utils/prompts.ts +++ b/src/utils/prompts.ts @@ -1,5 +1,5 @@ import * as vscode from "vscode"; -import { set_configuration } from "../utils"; +import { set_configuration } from "."; export function prompt_for_reload() { const message = "Reload VSCode to apply settings"; diff --git a/src/settings_updater.ts b/src/utils/settings_updater.ts similarity index 73% rename from src/settings_updater.ts rename to src/utils/settings_updater.ts index 13d176e..60cbbc8 100644 --- a/src/settings_updater.ts +++ b/src/utils/settings_updater.ts @@ -2,23 +2,21 @@ import * as vscode from "vscode"; const OLD_SETTINGS_CONVERSIONS = [ ["godot_tools.editor_path", "godotTools.editorPath.godot3"], + ["godot_tools.editor_path", "godotTools.editorPath.godot4"], ["godot_tools.gdscript_lsp_server_protocol", "godotTools.lsp.serverProtocol"], ["godot_tools.gdscript_lsp_server_host", "godotTools.lsp.serverHost"], ["godot_tools.gdscript_lsp_server_port", "godotTools.lsp.serverPort"], ["godot_tools.reconnect_automatically", "godotTools.lsp.autoReconnect.enabled"], ["godot_tools.reconnect_cooldown", "godotTools.lsp.autoReconnect.cooldown"], ["godot_tools.reconnect_attempts", "godotTools.lsp.autoReconnect.attempts"], - ["godot_tools.force_visible_collision_shapes", "godotTools.debugger.forceVisibleCollisionShapes"], - ["godot_tools.force_visible_nav_mesh", "godotTools.debugger.forceVisibleNavMesh"], - ["godot_tools.native_symbol_placement", "godotTools.documentation.newTabPlacement"], ["godot_tools.scenePreview.previewRelatedScenes", "godotTools.scenePreview.previewRelatedScenes"] ]; export function updateOldStyleSettings() { - let configuration = vscode.workspace.getConfiguration(); + const configuration = vscode.workspace.getConfiguration(); let settings_changed = false; - for (let [old_style_key, new_style_key] of OLD_SETTINGS_CONVERSIONS) { - let value = configuration.get(old_style_key); + for (const [old_style_key, new_style_key] of OLD_SETTINGS_CONVERSIONS) { + const value = configuration.get(old_style_key); if (value === undefined) { continue; } @@ -29,9 +27,9 @@ export function updateOldStyleSettings() { // Only show this message if things have actually changed, to prevent users who // are just reinstalling the extension from receiveing it. vscode.window.showInformationMessage( - `Settings from godot-tools version <1.4.0 have been updated to the new format. - Please view the changelog for version 1.4.0 for more information.`, - 'Okay' + `Settings from godot-tools version <2.0.0 have been updated to the new format. + Please view the changelog for version 2.0.0 for more information.`, + "Okay" ); } } @@ -41,17 +39,17 @@ export function updateOldStyleSettings() { * which persists across restarts & updates. */ export function updateStoredVersion(context: vscode.ExtensionContext) { - const syncedVersion: string = vscode.extensions.getExtension(context.extension.id)! + const syncedVersion: string = vscode.extensions.getExtension(context.extension.id) .packageJSON.version; context.globalState.update("previousVersion", syncedVersion); } /** - * Checks if settings should try and be converted from the <1.4.0 style. + * Checks if settings should try and be converted from the <2.0.0 style. * * Returns `true` if the extension has no value saved for `localVersion` * in `context.globalState`, meaning it was either just installed, - * or updated from a version <1.4.0. Otherwise, returns `false`. + * or updated from a version <2.0.0. Otherwise, returns `false`. */ export function shouldUpdateSettings(context: vscode.ExtensionContext): boolean { const localVersion: string | undefined = context.globalState.get("previousVersion"); diff --git a/src/utils/subspawn.ts b/src/utils/subspawn.ts index ca48eab..4249f2e 100644 --- a/src/utils/subspawn.ts +++ b/src/utils/subspawn.ts @@ -6,7 +6,7 @@ I had to vendor this library to fix the API in a couple places. */ import { ChildProcess, execSync, spawn, SpawnOptions } from "child_process"; -import { createLogger } from "../logger"; +import { createLogger } from "."; const log = createLogger("subspawn"); diff --git a/src/utils/vscode_utils.ts b/src/utils/vscode_utils.ts new file mode 100644 index 0000000..92e0ee1 --- /dev/null +++ b/src/utils/vscode_utils.ts @@ -0,0 +1,30 @@ +import * as vscode from "vscode"; +import { globals } from "../extension"; + +const EXTENSION_PREFIX = "godotTools"; + +export function get_configuration(name: string, defaultValue?: any) { + const configValue = vscode.workspace.getConfiguration(EXTENSION_PREFIX).get(name, null); + if (defaultValue && configValue === null) { + return defaultValue; + } + return configValue; +} + +export function set_configuration(name: string, value: any) { + return vscode.workspace.getConfiguration(EXTENSION_PREFIX).update(name, value); +} + +const CONTEXT_PREFIX = `${EXTENSION_PREFIX}.context.`; + +export function set_context(name: string, value: any) { + return vscode.commands.executeCommand("setContext", CONTEXT_PREFIX + name, value); +} + +export function register_command(command: string, callback: (...args: any[]) => any, thisArg?: any): vscode.Disposable { + return vscode.commands.registerCommand(`${EXTENSION_PREFIX}.${command}`, callback); +} + +export function get_extension_uri(...paths: string[]) { + return vscode.Uri.joinPath(vscode.extensions.getExtension("geequlim.godot-tools").extensionUri, ...paths ?? ""); +} diff --git a/syntaxes/GDResource.tmLanguage.json b/syntaxes/GDResource.tmLanguage.json index c0062c4..9592980 100644 --- a/syntaxes/GDResource.tmLanguage.json +++ b/syntaxes/GDResource.tmLanguage.json @@ -1,325 +1,193 @@ { - "scopeName": "source.gdresource", - "uuid": "e076faa2-3c52-42fa-a8e6-9a7c453c1a5b", - "patterns": [ - { - "include": "#embedded_shader" - }, - { - "include": "#embedded_gdscript" - }, - { - "include": "#comment" - }, - { - "include": "#heading" - }, - { - "include": "#key_value" - } - ], - "repository": { - "comment": { - "captures": { - "1": { - "name": "punctuation.definition.comment.gdresource" - } - }, - "match": "(;).*$\\n?", - "name": "comment.line.gdresource" - }, - "embedded_shader": { - "name": "meta.embedded.block.gdshader", - "begin": "(code) = \"", - "end": "\"", - "beginCaptures": { - "1": { - "name": "variable.other.property.gdresource" - } - }, - "patterns": [ - { - "include": "source.gdshader" - } - ] - }, - "embedded_gdscript": { - "comment": "meta.embedded.block.gdscript", - "begin": "(script/source) = \"", - "end": "\"", - "beginCaptures": { - "1": { - "name": "variable.other.property.gdresource" - } - }, - "patterns": [ - { - "include": "source.gdscript" - } - ] - }, - "heading": { - "begin": "\\[([a-z_]*)\\s?", - "beginCaptures": { - "1": { - "name": "keyword.control.gdresource" - } - }, - "end": "\\]", - "patterns": [ - { - "include": "#heading_properties" - }, - { - "include": "#data" - } - ] - }, - "heading_properties": { - "patterns": [ - { - "name": "invalid.deprecated.noValue.gdresource", - "match": "(\\s*[A-Za-z_\\-][A-Za-z0-9_\\-]*\\s*=)(?=\\s*$)" - }, - { - "begin": "\\s*([A-Za-z_-][^\\s]*|\".+\"|'.+'|[0-9]+)\\s*(=)\\s*", - "beginCaptures": { - "1": { - "name": "variable.other.property.gdresource" - }, - "2": { - "name": "punctuation.definition.keyValue.gdresource" - } - }, - "end": "($|(?==)|\\,?|\\s*(?=\\}))", - "patterns": [ - { - "include": "#data" - } - ] - } - ] - }, - "key_value": { - "patterns": [ - { - "name": "invalid.deprecated.noValue.gdresource", - "match": "(\\s*[A-Za-z_\\-][A-Za-z0-9_\\-]*\\s*=)(?=\\s*$)" - }, - { - "begin": "\\s*([A-Za-z_-][^\\s]*|\".+\"|'.+'|[0-9]+)\\s*(=)\\s*", - "beginCaptures": { - "1": { - "name": "variable.other.property.gdresource" - }, - "2": { - "name": "punctuation.definition.keyValue.gdresource" - } - }, - "end": "($|(?==)|\\,|\\s*(?=\\}))", - "patterns": [ - { - "include": "#data" - } - ] - } - ] - }, - "data": { - "patterns": [ - { - "include": "#comment" - }, - { - "begin": "(?=|==|<|>|!=", - "name": "keyword.operator.comparison.gdscript" - }, - "arithmetic_op": { - "match": "\\+=|-=|\\*=|/=|%=|&=|\\|=|\\*|/|%|\\+|-|<<|>>|&|\\||\\^|~", - "name": "keyword.operator.arithmetic.gdscript" - }, - "assignment_op": { - "match": "=", - "name": "keyword.operator.assignment.gdscript" - }, - "control_flow": { - "match": "\\b(?:if|elif|else|for|while|break|continue|pass|return|match|yield|await)\\b", - "name": "keyword.control.gdscript" - }, - "keywords": { - "match": "\\b(?:class|class_name|extends|is|onready|tool|static|export|as|void|enum|preload|assert|breakpoint|rpc|sync|remote|master|puppet|slave|remotesync|mastersync|puppetsync|trait|namespace)\\b", - "name": "keyword.language.gdscript" - }, - "letter": { - "match": "\\b(?:true|false|null)\\b", - "name": "constant.language.gdscript" - }, - "numbers": { - "patterns": [ - { - "match": "\\b(?:0b[01_]+)\\b", - "name": "constant.numeric.integer.binary.gdscript" - }, - { - "match": "\\b(?:0x[0-9A-Fa-f_]+)\\b", - "name": "constant.numeric.integer.hexadecimal.gdscript" - }, - { - "match": "\\b(?:([0-9_]+\\.[0-9_]*(e[\\-\\+]?[0-9_]+)?))\\b", - "name": "constant.numeric.float.gdscript" - }, - { - "match": "\\b(?:(\\.[0-9_]+(e[\\-\\+]?[0-9_]+)?))\\b", - "name": "constant.numeric.float.gdscript" - }, - { - "match": "\\b(?:([0-9_]+e[\\-\\+]?\\[0-9_]))\\b", - "name": "constant.numeric.float.gdscript" - }, - { - "match": "\\b[0-9_]+\\b", - "name": "constant.numeric.integer.gdscript" - } - ] - }, - "variable_definition": { - "begin": "\\b(?:(var)|(const))\\s+([a-zA-Z_]\\w*)\\s*", - "end": "$|;", - "beginCaptures": { - "1": { - "name": "storage.type.var.gdscript" - }, - "2": { - "name": "storage.type.const.gdscript" - }, - "3": { - "name": "variable.other.gdscript" - } - }, - "patterns": [ - { - "match": "(:)\\s*([a-zA-Z_]\\w*)?", - "captures": { - "1": { - "name": "punctuation.separator.annotation.gdscript" - }, - "2": { - "name": "entity.name.type.class.gdscript" - } - } - }, - { - "match": "=(?!=)", - "name": "keyword.operator.assignment.gdscript" - }, - { - "match": "(setget)\\s+([a-zA-Z_]\\w*)(?:[,]\\s*([a-zA-Z_]\\w*))?", - "captures": { - "1": { - "name": "storage.type.const.gdscript" - }, - "2": { - "name": "entity.name.function.gdscript" - }, - "3": { - "name": "entity.name.function.gdscript" - } - } - }, - { - "include": "#base_expression" - }, - { - "include": "#letter" - }, - { - "include": "#any_variable" - }, - { - "include": "#any_property" - }, - { - "include": "#keywords" - } - ] - }, - "getter_setter_godot4": { - "patterns": [ - { - "match": "\\b(get):", - "captures": { - "1": { - "name": "entity.name.function.gdscript" - } - } - }, - { - "name": "meta.function.gdscript", - "begin": "(?x) \\s+\n (set) \\s*\n (?=\\()", - "end": "(:|(?=[#'\"\\n]))", - "beginCaptures": { - "1": { - "name": "entity.name.function.gdscript" - } - }, - "patterns": [ - { - "include": "#parameters" - }, - { - "include": "#line_continuation" - }, - { - "match": "\\s*(\\-\\>)\\s*([a-zA-Z_]\\w*)\\s*\\:", - "captures": { - "1": {}, - "2": { - "name": "entity.name.type.class.gdscript" - } - } - } - ] - } - ] - }, - "class_definition": { - "captures": { - "1": { - "name": "entity.name.type.class.gdscript" - }, - "2": { - "name": "class.other.gdscript" - } - }, - "match": "(?<=^class)\\s+([a-zA-Z_]\\w*)\\s*(?=:)" - }, - "class_new": { - "captures": { - "1": { - "name": "entity.name.type.class.gdscript" - }, - "2": { - "name": "storage.type.new.gdscript" - } - }, - "match": "\\b([a-zA-Z_]\\w*).(new)\\(" - }, - "class_is": { - "captures": { - "1": { - "name": "storage.type.is.gdscript" - }, - "2": { - "name": "entity.name.type.class.gdscript" - } - }, - "match": "\\s+(is)\\s+([a-zA-Z_]\\w*)" - }, - "class_enum": { - "captures": { - "1": { - "name": "entity.name.type.class.gdscript" - }, - "2": { - "name": "constant.language.gdscript" - } - }, - "match": "\\b([A-Z][a-zA-Z_0-9]*)\\.([A-Z_0-9]+)" - }, - "class_name": { - "captures": { - "1": { - "name": "entity.name.type.class.gdscript" - }, - "2": { - "name": "class.other.gdscript" - } - }, - "match": "(?<=class_name)\\s+([a-zA-Z_]\\w*(\\.([a-zA-Z_]\\w*))?)" - }, - "extends": { - "match": "(?<=extends)\\s+[a-zA-Z_]\\w*(\\.([a-zA-Z_]\\w*))?", - "name": "entity.other.inherited-class.gdscript" - }, - "builtin_func": { - "match": "(?)\\s*([a-zA-Z_]\\w*)\\s*\\:", - "captures": { - "1": {}, - "2": { - "name": "entity.name.type.class.gdscript" - } - } - } - ] - }, - "lambda_declaration": { - "name": "meta.function.gdscript", - "begin": "(func)(?=\\()", - "end": "(:|(?=[#'\"\\n]))", - "beginCaptures": { - "1": { - "name": "storage.type.function.gdscript" - }, - "2": { - "name": "entity.name.function.gdscript" - } - }, - "patterns": [ - { - "include": "#parameters" - }, - { - "include": "#line_continuation" - } - ] - }, - "function_declaration": { - "name": "meta.function.gdscript", - "begin": "(?x) \\s*\n (func) \\s+\n ([a-zA-Z_]\\w*) \\s*\n (?=\\()", - "end": "((:)|(?=[#'\"\\n]))", - "beginCaptures": { - "1": { - "name": "storage.type.function.gdscript" - }, - "2": { - "name": "entity.name.function.gdscript" - } - }, - "endCaptures": { - "1": { - "name": "punctuation.section.function.begin.gdscript" - } - }, - "patterns": [ - { - "include": "#parameters" - }, - { - "include": "#line_continuation" - }, - { - "match": "\\s*(?:\\-\\>)\\s*(void\\w*)|([a-zA-Z_]\\w*)\\s*\\:", - "captures": { - "1": { - "name": "keyword.language.void.gdscript" - }, - "2": { - "name": "entity.name.type.class.gdscript" - } - } - }, - { - "include": "#base_expression" - } - ] - }, - "function_keyword": { - "match": "func", - "name": "keyword.language.gdscript" - }, - "parameters": { - "name": "meta.function.parameters.gdscript", - "begin": "(\\()", - "end": "(\\))", - "beginCaptures": { - "1": { - "name": "punctuation.definition.parameters.begin.gdscript" - } - }, - "endCaptures": { - "1": { - "name": "punctuation.definition.parameters.end.gdscript" - } - }, - "patterns": [ - { - "include": "#annotated_parameter" - }, - { - "match": "(?x)\n ([a-zA-Z_]\\w*)\n \\s* (?: (,) | (?=[)#\\n=]))\n", - "captures": { - "1": { - "name": "variable.parameter.function.language.gdscript" - }, - "2": { - "name": "punctuation.separator.parameters.gdscript" - } - } - }, - { - "include": "#comment" - }, - { - "include": "#loose_default" - } - ] - }, - "loose_default": { - "begin": "(=)", - "end": "(,)|(?=\\))", - "beginCaptures": { - "1": { - "name": "keyword.operator.gdscript" - } - }, - "endCaptures": { - "1": { - "name": "punctuation.separator.parameters.gdscript" - } - }, - "patterns": [ - { - "include": "#base_expression" - } - ] - }, - "annotated_parameter": { - "begin": "(?x)\n \\b\n ([a-zA-Z_]\\w*) \\s* (:)\n", - "end": "(,)|(?=\\))", - "beginCaptures": { - "1": { - "name": "variable.parameter.function.language.gdscript" - }, - "2": { - "name": "punctuation.separator.annotation.gdscript" - } - }, - "endCaptures": { - "1": { - "name": "punctuation.separator.parameters.gdscript" - } - }, - "patterns": [ - { - "include": "#base_expression" - }, - { - "name": "keyword.operator.assignment.gdscript", - "match": "=(?!=)" - } - ] - }, - "line_continuation": { - "patterns": [ - { - "match": "(\\\\)\\s*(\\S.*$\\n?)", - "captures": { - "1": { - "name": "punctuation.separator.continuation.line.gdscript" - }, - "2": { - "name": "invalid.illegal.line.continuation.gdscript" - } - } - }, - { - "begin": "(\\\\)\\s*$\\n?", - "end": "(?x)\n (?=^\\s*$)\n |\n (?! (\\s* [rR]? (\\'\\'\\'|\\\"\\\"\\\"|\\'|\\\"))\n |\n (\\G $) (?# '\\G' is necessary for ST)\n )\n", - "beginCaptures": { - "1": { - "name": "punctuation.separator.continuation.line.gdscript" - } - }, - "patterns": [ - { - "include": "#base_expression" - } - ] - } - ] - }, - "any_method": { - "match": "\\b([A-Za-z_]\\w*)\\b(?=\\s*(?:[(]))", - "name": "support.function.any-method.gdscript" - }, - "any_variable": { - "match": "\\b(?=|==|<|>|!=", + "name": "keyword.operator.comparison.gdscript" + }, + "arithmetic_op": { + "match": "\\+=|-=|\\*=|/=|%=|&=|\\|=|\\*|/|%|\\+|-|<<|>>|&|\\||\\^|~|!", + "name": "keyword.operator.arithmetic.gdscript" + }, + "assignment_op": { + "match": "=", + "name": "keyword.operator.assignment.gdscript" + }, + "control_flow": { + "match": "\\b(?:if|elif|else|while|break|continue|pass|return|match|yield|await)\\b", + "name": "keyword.control.gdscript" + }, + "keywords": { + "match": "\\b(?:class|class_name|extends|is|onready|tool|static|export|as|void|enum|preload|assert|breakpoint|rpc|sync|remote|master|puppet|slave|remotesync|mastersync|puppetsync|trait|namespace)\\b", + "name": "keyword.language.gdscript" + }, + "letter": { + "match": "\\b(?:true|false|null)\\b", + "name": "constant.language.gdscript" + }, + "numbers": { + "patterns": [ + { + "match": "0b[01_]+", + "name": "constant.numeric.integer.binary.gdscript" + }, + { + "match": "0x[0-9A-Fa-f_]+", + "name": "constant.numeric.integer.hexadecimal.gdscript" + }, + { + "match": "[-]?([0-9_]+\\.[0-9_]*(e[\\-\\+]?[0-9_]+)?)", + "name": "constant.numeric.float.gdscript" + }, + { + "match": "[-]?(\\.[0-9_]+(e[\\-\\+]?[0-9_]+)?)", + "name": "constant.numeric.float.gdscript" + }, + { + "match": "[-]?([0-9_]+e[\\-\\+]?\\[0-9_])", + "name": "constant.numeric.float.gdscript" + }, + { + "match": "[-]?[0-9_]+", + "name": "constant.numeric.integer.gdscript" + } + ] + }, + "variable_definition": { + "begin": "\\b(?:(var)|(const))\\s+([a-zA-Z_]\\w*)\\s*", + "end": "$|;", + "beginCaptures": { + "1": { "name": "keyword.language.gdscript storage.type.var.gdscript" }, + "2": { "name": "keyword.language.gdscript storage.type.const.gdscript" }, + "3": { "name": "variable.other.gdscript" } + }, + "patterns": [ + { + "match": "(:)\\s*([a-zA-Z_]\\w*)?", + "captures": { + "1": { "name": "punctuation.separator.annotation.gdscript" }, + "2": { "name": "entity.name.type.class.gdscript" } + } + }, + { + "match": "=(?!=)", + "name": "keyword.operator.assignment.gdscript" + }, + { + "match": "(setget)\\s+([a-zA-Z_]\\w*)(?:[,]\\s*([a-zA-Z_]\\w*))?", + "captures": { + "1": { "name": "keyword.language.gdscript storage.type.const.gdscript" }, + "2": { "name": "entity.name.function.gdscript" }, + "3": { "name": "entity.name.function.gdscript" } + } + }, + { "include": "#base_expression" }, + { "include": "#letter" }, + { "include": "#any_variable" }, + { "include": "#any_property" }, + { "include": "#keywords" } + ] + }, + "getter_setter_godot4": { + "patterns": [ + { + "match": "\\b(get):", + "captures": { "1": { "name": "entity.name.function.gdscript" } } + }, + { + "name": "meta.function.gdscript", + "begin": "(?x) \\s+\n (set) \\s*\n (?=\\()", + "end": "(:|(?=[#'\"\\n]))", + "beginCaptures": { "1": { "name": "entity.name.function.gdscript" } }, + "patterns": [ + { "include": "#parameters" }, + { "include": "#line_continuation" }, + { + "match": "\\s*(\\-\\>)\\s*([a-zA-Z_]\\w*)\\s*\\:", + "captures": { + "1": { }, + "2": { "name": "entity.name.type.class.gdscript" } + } + } + ] + } + ] + }, + "class_definition": { + "match": "(?<=^class)\\s+([a-zA-Z_]\\w*)\\s*(?=:)", + "captures": { + "1": { "name": "entity.name.type.class.gdscript" }, + "2": { "name": "class.other.gdscript" } + } + }, + "class_new": { + "match": "\\b([a-zA-Z_]\\w*).(new)\\(", + "captures": { + "1": { "name": "entity.name.type.class.gdscript" }, + "2": { "name": "storage.type.new.gdscript" }, + "3": { "name": "punctuation.parenthesis.begin.gdscript" } + } + }, + "class_is": { + "match": "\\s+(is)\\s+([a-zA-Z_]\\w*)", + "captures": { + "1": { "name": "storage.type.is.gdscript" }, + "2": { "name": "entity.name.type.class.gdscript" } + } + }, + "class_enum": { + "captures": { + "1": { "name": "entity.name.type.class.gdscript" }, + "2": { "name": "constant.language.gdscript" } + }, + "match": "\\b([A-Z][a-zA-Z_0-9]*)\\.([A-Z_0-9]+)" + }, + "class_name": { + "captures": { + "1": { "name": "entity.name.type.class.gdscript" }, + "2": { "name": "class.other.gdscript" } + }, + "match": "(?<=class_name)\\s+([a-zA-Z_]\\w*(\\.([a-zA-Z_]\\w*))?)" + }, + "extends": { + "match": "(?<=extends)\\s+[a-zA-Z_]\\w*(\\.([a-zA-Z_]\\w*))?", + "name": "entity.other.inherited-class.gdscript" + }, + "builtin_func": { + "match": "(?)\\s*([a-zA-Z_]\\w*)\\s*\\:", + "captures": { + "1": { }, + "2": { "name": "entity.name.type.class.gdscript" } + } + } + ] + }, + "lambda_declaration": { + "name": "meta.function.gdscript", + "begin": "(func)\\s?(?=\\()", + "end": "(:|(?=[#'\"\\n]))", + "beginCaptures": { + "1": { "name": "keyword.language.gdscript storage.type.function.gdscript" }, + "2": { "name": "entity.name.function.gdscript" } + }, + "patterns": [ + { "include": "#parameters" }, + { "include": "#line_continuation" }, + { + "match": "\\s*(?:\\-\\>)\\s*(void\\w*)|([a-zA-Z_]\\w*)\\s*\\:", + "captures": { + "1": { "name": "keyword.language.void.gdscript" }, + "2": { "name": "entity.name.type.class.gdscript" } + } + }, + { "include": "#base_expression" }, + { "include": "#any_variable" }, + { "include": "#any_property" } + ] + }, + "function_declaration": { + "name": "meta.function.gdscript", + "begin": "(?x) \\s*\n (func) \\s+\n ([a-zA-Z_]\\w*) \\s*\n (?=\\()", + "end": "((:)|(?=[#'\"\\n]))", + "beginCaptures": { + "1": { "name": "keyword.language.gdscript storage.type.function.gdscript" }, + "2": { "name": "entity.name.function.gdscript" } + }, + "endCaptures": { "1": { "name": "punctuation.section.function.begin.gdscript" } }, + "patterns": [ + { "include": "#parameters" }, + { "include": "#line_continuation" }, + { + "match": "\\s*(?:\\-\\>)\\s*(void\\w*)|([a-zA-Z_]\\w*)\\s*\\:", + "captures": { + "1": { "name": "keyword.language.void.gdscript" }, + "2": { "name": "entity.name.type.class.gdscript" } + } + }, + { "include": "#base_expression" } + ] + }, + "function_keyword": { + "match": "func", + "name": "keyword.language.gdscript" + }, + "parameters": { + "name": "meta.function.parameters.gdscript", + "begin": "(\\()", + "end": "(\\))", + "beginCaptures": { "1": { "name": "punctuation.definition.parameters.begin.gdscript" } }, + "endCaptures": { "1": { "name": "punctuation.definition.parameters.end.gdscript" } }, + "patterns": [ + { "include": "#annotated_parameter" }, + { + "match": "(?x)\n ([a-zA-Z_]\\w*)\n \\s* (?: (,) | (?=[)#\\n=]))\n", + "captures": { + "1": { "name": "variable.parameter.function.language.gdscript" }, + "2": { "name": "punctuation.separator.parameters.gdscript" } + } + }, + { "include": "#comment" }, + { "include": "#loose_default" } + ] + }, + "loose_default": { + "begin": "(=)", + "end": "(,)|(?=\\))", + "beginCaptures": { "1": { "name": "keyword.operator.gdscript" } }, + "endCaptures": { "1": { "name": "punctuation.separator.parameters.gdscript" } }, + "patterns": [ { "include": "#base_expression" } ] + }, + "annotated_parameter": { + "begin": "(?x)\n \\b\n ([a-zA-Z_]\\w*) \\s* (:)\n", + "end": "(,)|(?=\\))", + "beginCaptures": { + "1": { "name": "variable.parameter.function.language.gdscript" }, + "2": { "name": "punctuation.separator.annotation.gdscript" } + }, + "endCaptures": { "1": { "name": "punctuation.separator.parameters.gdscript" } }, + "patterns": [ + { "include": "#base_expression" }, + { + "name": "keyword.operator.assignment.gdscript", + "match": "=(?!=)" + } + ] + }, + "round_braces": { + "begin": "\\(", + "end": "\\)", + "beginCaptures": { "0": { "name": "punctuation.parenthesis.begin.gdscript" } }, + "endCaptures": { "0": { "name": "punctuation.parenthesis.end.gdscript" } }, + "patterns": [ + { "include": "#base_expression" }, + { "include": "#any_variable" } + ] + }, + "line_continuation": { + "patterns": [ + { + "match": "(\\\\)\\s*(\\S.*$\\n?)", + "captures": { + "1": { "name": "punctuation.separator.continuation.line.gdscript" }, + "2": { "name": "invalid.illegal.line.continuation.gdscript" } + } + }, + { + "begin": "(\\\\)\\s*$\\n?", + "end": "(?x)\n (?=^\\s*$)\n |\n (?! (\\s* [rR]? (\\'\\'\\'|\\\"\\\"\\\"|\\'|\\\"))\n |\n (\\G $) (?# '\\G' is necessary for ST)\n )\n", + "beginCaptures": { "1": { "name": "punctuation.separator.continuation.line.gdscript" } }, + "patterns": [ { "include": "#base_expression" } ] + } + ] + }, + "any_method": { + "match": "\\b([A-Za-z_]\\w*)\\b(?=\\s*(?:[(]))", + "name": "support.function.any-method.gdscript" + }, + "any_variable": { + "match": "\\b(?\\>\\=?|[-+*/&|<>=!]\\=|\\&\\&|[|][|]|[-+~!*/%<>&^|=]" - } - } + "name": "GDShader", + "scopeName": "source.gdshader", + "uuid": "3a95d25d-688b-481f-a581-eee47f00e5ca", + "fileTypes": [ "gdshader" ], + "patterns": [ { "include": "#any" } ], + "repository": { + "any": { + "patterns": [ + { "include": "#comment" }, + { "include": "#enclosed" }, + { "include": "#classifier" }, + { "include": "#definition" }, + { "include": "#keyword" }, + { "include": "#element" }, + { "include": "#separator" }, + { "include": "#operator" } + ] + }, + "comment": { + "patterns": [ + { "include": "#commentLine" }, + { "include": "#commentBlock" } + ] + }, + "commentLine": { + "name": "comment.line.double-slash.gdshader", + "begin": "//", + "end": "$" + }, + "commentBlock": { + "name": "comment.block.gdshader", + "begin": "/\\*", + "end": "\\*/" + }, + "enclosed": { + "name": "meta.parenthesis.gdshader", + "begin": "\\(", + "end": "\\)", + "captures": { "0": { "name": "punctuation.parenthesis.gdshader" } }, + "patterns": [ { "include": "#any" } ] + }, + "classifier": { + "name": "meta.classifier.gdshader", + "begin": "(?=\\b(?:shader_type|render_mode)\\b)", + "patterns": [ + { "include": "#comment" }, + { "include": "#keyword" }, + { "include": "#identifierClassification" }, + { "include": "#separator" } + ], + "end": "(?<=;)" + }, + "classifierKeyword": { + "name": "keyword.language.classifier.gdshader", + "match": "\\b(?:shader_type|render_mode)\\b" + }, + "identifierClassification": { + "name": "entity.other.inherited-class.gdshader", + "match": "\\b[a-z_]+\\b" + }, + "definition": { + "patterns": [ { "include": "#structDefinition" } ] + }, + "arraySize": { + "name": "meta.array-size.gdshader", + "begin": "\\[", + "end": "\\]", + "captures": { "0": { "name": "punctuation.bracket.gdshader" } }, + "patterns": [ + { "include": "#comment" }, + { "include": "#keyword" }, + { "include": "#element" }, + { "include": "#separator" } + ] + }, + "structDefinition": { + "begin": "(?=\\b(?:struct)\\b)", + "patterns": [ + { "include": "#comment" }, + { "include": "#keyword" }, + { "include": "#structName" }, + { "include": "#structDefinitionBlock" }, + { "include": "#separator" } + ], + "end": "(?<=;)" + }, + "structKeyword": { + "name": "keyword.other.struct.gdshader", + "match": "\\b(?:struct)\\b" + }, + "structName": { + "name": "entity.name.type.struct.gdshader", + "match": "\\b[a-zA-Z_]\\w*\\b" + }, + "structDefinitionBlock": { + "name": "meta.definition.block.struct.gdshader", + "begin": "\\{", + "end": "\\}", + "captures": { "0": { "name": "punctuation.definition.block.struct.gdshader" } }, + "patterns": [ + { "include": "#comment" }, + { "include": "#precisionKeyword" }, + { "include": "#fieldDefinition" }, + { "include": "#keyword" }, + { "include": "#any" } + ] + }, + "fieldDefinition": { + "name": "meta.definition.field.gdshader", + "begin": "\\b[a-zA-Z_]\\w*\\b", + "beginCaptures": { + "0": { + "patterns": [ + { "include": "#typeKeyword" }, + { + "match": ".+", + "name": "entity.name.type.gdshader" + } + ] + } + }, + "patterns": [ + { "include": "#comment" }, + { "include": "#keyword" }, + { "include": "#arraySize" }, + { "include": "#fieldName" }, + { "include": "#any" } + ], + "end": "(?<=;)" + }, + "fieldName": { + "name": "entity.name.variable.field.gdshader", + "match": "\\b[a-zA-Z_]\\w*\\b" + }, + "keyword": { + "patterns": [ + { "include": "#classifierKeyword" }, + { "include": "#structKeyword" }, + { "include": "#controlKeyword" }, + { "include": "#modifierKeyword" }, + { "include": "#precisionKeyword" }, + { "include": "#typeKeyword" }, + { "include": "#hintKeyword" } + ] + }, + "controlKeyword": { + "name": "keyword.control.gdshader", + "match": "\\b(?:if|else|do|while|for|continue|break|switch|case|default|return|discard)\\b" + }, + "modifierKeyword": { + "name": "storage.modifier.gdshader", + "match": "\\b(?:const|global|instance|uniform|varying|in|out|inout|flat|smooth)\\b" + }, + "precisionKeyword": { + "name": "storage.type.built-in.primitive.precision.gdshader", + "match": "\\b(?:low|medium|high)p\\b" + }, + "typeKeyword": { + "name": "support.type.gdshader", + "match": "\\b(?:void|bool|[biu]?vec[234]|u?int|float|mat[234]|[iu]?sampler(?:3D|2D(?:Array)?)|samplerCube)\\b" + }, + "hintKeyword": { + "name": "support.type.annotation.gdshader", + "match": "\\b(?:source_color|hint_(?:color|range|(?:black_)?albedo|normal|(?:default_)?(?:white|black)|aniso|anisotropy|roughness_(?:[rgba]|normal|gray))|filter_(?:nearest|linear)(?:_mipmap(?:_anisotropic)?)?|repeat_(?:en|dis)able)\\b" + }, + "element": { + "patterns": [ + { "include": "#literalFloat" }, + { "include": "#literalInt" }, + { "include": "#literalBool" }, + { "include": "#identifierType" }, + { "include": "#constructor" }, + { "include": "#processorFunction" }, + { "include": "#identifierFunction" }, + { "include": "#swizzling" }, + { "include": "#identifierField" }, + { "include": "#constantFloat" }, + { "include": "#languageVariable" }, + { "include": "#identifierVariable" } + ] + }, + "literalFloat": { + "name": "constant.numeric.float.gdshader", + "match": "\\b(?:\\d+[eE][-+]?\\d+|(?:\\d*[.]\\d+|\\d+[.])(?:[eE][-+]?\\d+)?)[fF]?" + }, + "literalInt": { + "name": "constant.numeric.integer.gdshader", + "match": "\\b(?:0[xX][0-9A-Fa-f]+|\\d+[uU]?)\\b" + }, + "literalBool": { + "name": "constant.language.boolean.gdshader", + "match": "\\b(?:false|true)\\b" + }, + "identifierType": { + "name": "entity.name.type.gdshader", + "match": "\\b[a-zA-Z_]\\w*(?=(?:\\s*\\[\\s*\\w*\\s*\\])?\\s+[a-zA-Z_]\\w*\\b)" + }, + "constructor": { + "name": "entity.name.type.constructor.gdshader", + "match": "\\b[a-zA-Z_]\\w*(?=\\s*\\[\\s*\\w*\\s*\\]\\s*[(])|\\b[A-Z]\\w*(?=\\s*[(])" + }, + "processorFunction": { + "name": "support.function.gdshader", + "match": "\\b(?:vertex|fragment|light|start|process|sky|fog)(?=(?:\\s|/\\*(?:\\*(?!/)|[^*])*\\*/)*[(])" + }, + "identifierFunction": { + "name": "entity.name.function.gdshader", + "match": "\\b[a-zA-Z_]\\w*(?=(?:\\s|/\\*(?:\\*(?!/)|[^*])*\\*/)*[(])" + }, + "swizzling": { + "match": "([.])\\s*([xyzw]{2,4}|[rgba]{2,4}|[stpq]{2,4})\\b", + "captures": { + "1": { "name": "punctuation.accessor.gdshader" }, + "2": { "name": "variable.other.property.gdshader" } + } + }, + "identifierField": { + "match": "([.])\\s*([a-zA-Z_]\\w*)\\b(?!\\s*\\()", + "captures": { + "1": { "name": "punctuation.accessor.gdshader" }, + "2": { "name": "entity.name.variable.field.gdshader" } + } + }, + "constantFloat": { + "name": "constant.language.float.gdshader", + "match": "\\b(?:E|PI|TAU)\\b" + }, + "languageVariable": { + "name": "variable.language.gdshader", + "match": "\\b(?:[A-Z][A-Z_0-9]*)\\b" + }, + "identifierVariable": { + "name": "variable.name.gdshader", + "match": "\\b[a-zA-Z_]\\w*\\b" + }, + "separator": { + "patterns": [ + { + "match": "[.]", + "name": "punctuation.accessor.gdshader" + }, + { "include": "#separatorComma" }, + { + "match": "[;]", + "name": "punctuation.terminator.statement.gdshader" + }, + { + "match": "[:]", + "name": "keyword.operator.type.annotation.gdshader" + } + ] + }, + "separatorComma": { + "name": "punctuation.separator.comma.gdshader", + "match": "[,]" + }, + "operator": { + "name": "keyword.operator.gdshader", + "match": "\\<\\<\\=?|\\>\\>\\=?|[-+*/&|<>=!]\\=|\\&\\&|[|][|]|[-+~!*/%<>&^|=]" + } + } } diff --git a/syntaxes/examples/gdscript1.gd b/syntaxes/examples/gdscript1.gd index 7618bbb..6b80c54 100644 --- a/syntaxes/examples/gdscript1.gd +++ b/syntaxes/examples/gdscript1.gd @@ -144,7 +144,7 @@ var r = 'single quotes' var s = """ triple double quotes """ -var t = '''triple single quotes''' # this should be red because it's invalid +var t = '''triple single quotes''' # ------------------------------------------------------------------------------ diff --git a/tools/generate_icons.ts b/tools/generate_icons.ts index 62935c9..60eef42 100644 --- a/tools/generate_icons.ts +++ b/tools/generate_icons.ts @@ -1,50 +1,50 @@ -import { join, extname } from 'path'; -import fs = require('fs'); +import { join, extname } from "path"; +import * as fs from "fs"; +import util from "node:util"; +import * as child_process from "node:child_process"; +const _exec = util.promisify(child_process.exec); const dark_colors = { - '#fc7f7f': '#fc9c9c', - '#8da5f3': '#a5b7f3', - '#e0e0e0': '#e0e0e0', - '#c38ef1': '#cea4f1', - '#8eef97': '#a5efac', + "#fc7f7f": "#fc9c9c", + "#8da5f3": "#a5b7f3", + "#e0e0e0": "#e0e0e0", + "#c38ef1": "#cea4f1", + "#8eef97": "#a5efac", }; const light_colors = { - '#fc7f7f': '#ff5f5f', - '#8da5f3': '#6d90ff', - '#e0e0e0': '#4f4f4f', - '#c38ef1': '#bb6dff', - '#8eef97': '#29d739', + "#fc7f7f": "#ff5f5f", + "#8da5f3": "#6d90ff", + "#e0e0e0": "#4f4f4f", + "#c38ef1": "#bb6dff", + "#8eef97": "#29d739", }; -function replace_colors(colors: Object, data: String) { +function replace_colors(colors: object, data: string) { for (const [from, to] of Object.entries(colors)) { data = data.replace(from, to); } return data; } -const iconsPath = 'editor/icons'; -const modulesPath = 'modules'; -const outputPath = 'resources/godot_icons'; +const iconsPath = "editor/icons"; +const modulesPath = "modules"; +const outputPath = "resources/godot_icons"; const godotPath = process.argv[2]; -const util = require('node:util'); -const _exec = util.promisify(require('node:child_process').exec); - async function exec(command) { const { stdout, stderr } = await _exec(command); return stdout; } const git = { - diff: 'git diff HEAD', - check_branch: 'git rev-parse --abbrev-ref HEAD', - reset: 'git reset --hard', - stash_push: 'git stash push', - stash_pop: 'git stash pop', - checkout: 'git checkout ', - checkout_4: 'git checkout master', - checkout_3: 'git checkout 3.x', + diff: "git diff HEAD", + check_branch: "git rev-parse --abbrev-ref HEAD", + reset: "git reset --hard", + stash_push: "git stash push", + stash_pop: "git stash pop", + checkout: "git checkout ", + checkout_4: "git checkout master", + checkout_3: "git checkout 3.x", }; function to_title_case(str) { @@ -57,11 +57,56 @@ function to_title_case(str) { } function get_class_list(modules) { - const classes = []; + const classes: string[] = [ + "ArrowDown.svg", + "ArrowLeft.svg", + "ArrowRight.svg", + "ArrowUp.svg", + "GuiVisibilityHidden.svg", + "GuiVisibilityVisible.svg", + "GuiVisibilityXray.svg", + "Edit.svg", + "Help.svg", + "HelpSearch.svg", + "ImportCheck.svg", + "ImportFail.svg", + "Info.svg", + "Play.svg", + "PlayBackwards.svg", + "PlayCustom.svg", + "PlayRemote.svg", + "PlayScene.svg", + "PlayStart.svg", + "Progress1.svg", + "Progress2.svg", + "Progress3.svg", + "Progress4.svg", + "Progress5.svg", + "Progress6.svg", + "Progress7.svg", + "Progress8.svg", + "Progress9.svg", + "Reload.svg", + "ReloadSmall.svg", + "Script.svg", + "ScriptCreate.svg", + "ScriptRemove.svg", + "Search.svg", + "Signals.svg", + "SignalsAndGroups.svg", + "Slot.svg", + "Stop.svg", + "Lock.svg", + "Unlock.svg", + "Zoom.svg", + "ZoomLess.svg", + "ZoomMore.svg", + "ZoomReset.svg", + ]; - const files = ['scene/register_scene_types.cpp']; + const files = ["scene/register_scene_types.cpp"]; modules.forEach(mod => { - files.push(join(mod, 'register_types.cpp')); + files.push(join(mod, "register_types.cpp")); }); const patterns = [ @@ -70,12 +115,12 @@ function get_class_list(modules) { ]; files.forEach(fileName => { - const file = fs.readFileSync(fileName, 'utf8'); - file.split('\n').forEach(line => { + const file = fs.readFileSync(fileName, "utf8"); + file.split("\n").forEach(line => { patterns.forEach(pattern => { const match = line.match(pattern); if (match) { - classes.push(match[1] + '.svg'); + classes.push(match[1] + ".svg"); } }); }); @@ -86,13 +131,13 @@ function get_class_list(modules) { } function discover_modules() { - const modules = []; + const modules: string[] = []; // a valid module is a subdir of modulesPath, and contains a subdir 'icons' - fs.readdirSync(modulesPath, {withFileTypes:true}).forEach(mod => { + fs.readdirSync(modulesPath, { withFileTypes: true }).forEach(mod => { if (mod.isDirectory()) { - fs.readdirSync(join(modulesPath, mod.name), {withFileTypes:true}).forEach(child => { - if (child.isDirectory() && child.name == 'icons') { + fs.readdirSync(join(modulesPath, mod.name), { withFileTypes: true }).forEach(child => { + if (child.isDirectory() && child.name == "icons") { modules.push(join(modulesPath, mod.name)); } }); @@ -101,47 +146,52 @@ function discover_modules() { return modules; } +interface IconData { + name: string; + contents: string; +} -function get_icons() { + +function get_icons(): IconData[] { const modules = discover_modules(); const classes = get_class_list(modules); const searchPaths = [iconsPath]; modules.forEach(mod => { - searchPaths.push(join(mod, 'icons')); + searchPaths.push(join(mod, "icons")); }); - const icons = []; + const icons: IconData[] = []; searchPaths.forEach(searchPath => { fs.readdirSync(searchPath).forEach(file => { - if (extname(file) === '.svg') { + if (extname(file) === ".svg") { let name = file; - if (name.startsWith('icon_')) { - name = name.replace('icon_', ''); - let parts = name.split('_'); + if (name.startsWith("icon_")) { + name = name.replace("icon_", ""); + let parts = name.split("_"); parts = parts.map(to_title_case); - name = parts.join(''); + name = parts.join(""); } if (!classes.includes(name)) { return; } const f = { name: name, - contents: fs.readFileSync(join(searchPath, file), 'utf8') + contents: fs.readFileSync(join(searchPath, file), "utf8") }; icons.push(f); } }); }); - + return icons; } function ensure_paths() { const paths = [ outputPath, - join(outputPath, 'light'), - join(outputPath, 'dark'), + join(outputPath, "light"), + join(outputPath, "dark"), ]; paths.forEach(path => { @@ -153,7 +203,7 @@ function ensure_paths() { async function run() { if (godotPath == undefined) { - console.log('Please provide the absolute path to your godot repo'); + console.log("Please provide the absolute path to your godot repo"); return; } @@ -163,18 +213,18 @@ async function run() { const diff = (await exec(git.diff)).trim(); if (diff) { - console.log('There appear to be uncommitted changes in your godot repo'); - console.log('Revert or stash these changes and try again'); + console.log("There appear to be uncommitted changes in your godot repo"); + console.log("Revert or stash these changes and try again"); return; } const branch = (await exec(git.check_branch)).trim(); - console.log('Gathering Godot 3 icons...'); + console.log("Gathering Godot 3 icons..."); await exec(git.checkout_3); const g3 = get_icons(); - console.log('Gathering Godot 4 icons...'); + console.log("Gathering Godot 4 icons..."); await exec(git.checkout_4); const g4 = get_icons(); @@ -184,10 +234,10 @@ async function run() { console.log(`Found ${g3.length + g4.length} icons...`); - const light_icons = {}; - const dark_icons = {}; + const light_icons: Map = new Map(); + const dark_icons: Map = new Map(); - console.log('Generating themed icons...'); + console.log("Generating themed icons..."); g3.forEach(file => { light_icons[file.name] = replace_colors(light_colors, file.contents); }); @@ -201,15 +251,15 @@ async function run() { dark_icons[file.name] = replace_colors(dark_colors, file.contents); }); - console.log('Ensuring output directory...'); + console.log("Ensuring output directory..."); ensure_paths(); - console.log('Writing icons to output directory...'); + console.log("Writing icons to output directory..."); for (const [file, contents] of Object.entries(light_icons)) { - fs.writeFileSync(join(outputPath, 'light', file), contents); + fs.writeFileSync(join(outputPath, "light", file), contents); } for (const [file, contents] of Object.entries(dark_icons)) { - fs.writeFileSync(join(outputPath, 'dark', file), contents); + fs.writeFileSync(join(outputPath, "dark", file), contents); } } diff --git a/tsconfig.json b/tsconfig.json index 5f9b6af..97fb729 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,10 @@ { "compilerOptions": { - "module": "commonjs", - "target": "es2020", + "module": "NodeNext", + "target": "es2022", + "moduleResolution": "NodeNext", + "moduleDetection": "force", + "isolatedModules": true, "outDir": "out", "lib": [ "es2022", @@ -10,11 +13,13 @@ "sourceMap": true, "rootDir": "src", "strict": false, + "skipLibCheck": true, "allowJs": true }, "exclude": [ "node_modules", "out", - "tools" + "tools", + "media" ] }