From 0bac4dcf36b82049c5f4d9b02fa6d3e8bb97d6fc Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Fri, 22 Nov 2024 19:12:59 +0100 Subject: [PATCH] Add moods (times of day) to Truck Town demo Four moods are available: sunrise, day, sunset, night. Sunset and night also feature artificial point lights placed in the town scene. The mood can be set on the main menu before playing. It can also be cycled during gameplay by pressing M or D-Pad Down. --- 3d/truck_town/README.md | 1 + 3d/truck_town/car_select/car_select.gd | 8 + 3d/truck_town/car_select/car_select.tscn | 58 ++++++- 3d/truck_town/project.godot | 10 ++ 3d/truck_town/town/sky_day.tres | 5 + 3d/truck_town/town/sky_morning.tres | 6 + 3d/truck_town/town/sky_night.tres | 6 + 3d/truck_town/town/sky_sunset.tres | 6 + 3d/truck_town/town/town_scene.gd | 50 ++++++ 3d/truck_town/town/town_scene.tscn | 148 +++++++++++++++++- 3d/truck_town/vehicles/meshes/minivan.res | Bin 10857 -> 10857 bytes 3d/truck_town/vehicles/meshes/tow_truck.res | Bin 12456 -> 12456 bytes 3d/truck_town/vehicles/meshes/truck_cab.res | Bin 11166 -> 11166 bytes .../vehicles/meshes/truck_trailer.res | Bin 15320 -> 15320 bytes 3d/truck_town/vehicles/meshes/wheel.res | Bin 16117 -> 16117 bytes 15 files changed, 289 insertions(+), 9 deletions(-) create mode 100644 3d/truck_town/town/sky_day.tres create mode 100644 3d/truck_town/town/sky_morning.tres create mode 100644 3d/truck_town/town/sky_night.tres create mode 100644 3d/truck_town/town/sky_sunset.tres create mode 100644 3d/truck_town/town/town_scene.gd diff --git a/3d/truck_town/README.md b/3d/truck_town/README.md index d229ae4bffd..b82d6da6e30 100644 --- a/3d/truck_town/README.md +++ b/3d/truck_town/README.md @@ -11,6 +11,7 @@ Controls: - Right Arrow, Gamepad Left Stick, Gamepad D-Pad Right: Steer right - U, Gamepad Select, left-click speedometer: Change speedometer unit (m/s, km/h, mph) - C, Gamepad Y/Triangle: Change camera (exterior, interior, top-down) +- M, Gamepad D-Pad Down: Change mood (sunrise, day, sunset, night) - Escape, Gamepad D-Pad Up: Go back to menu (press again to exit) On mobile platforms, the vehicle automatically accelerates. Touch the left and diff --git a/3d/truck_town/car_select/car_select.gd b/3d/truck_town/car_select/car_select.gd index 10d0e8100dc..6f03ef70326 100644 --- a/3d/truck_town/car_select/car_select.gd +++ b/3d/truck_town/car_select/car_select.gd @@ -16,6 +16,14 @@ func _load_scene(car_scene: PackedScene) -> void: var car: Node3D = car_scene.instantiate() car.name = "car" town = preload("res://town/town_scene.tscn").instantiate() + if $PanelContainer/MarginContainer/HBoxContainer/Sunrise.button_pressed: + town.mood = town.Mood.SUNRISE + elif $PanelContainer/MarginContainer/HBoxContainer/Day.button_pressed: + town.mood = town.Mood.DAY + elif $PanelContainer/MarginContainer/HBoxContainer/Sunset.button_pressed: + town.mood = town.Mood.SUNSET + elif $PanelContainer/MarginContainer/HBoxContainer/Night.button_pressed: + town.mood = town.Mood.NIGHT town.get_node(^"InstancePos").add_child(car) town.get_node(^"Spedometer").car_body = car.get_child(0) town.get_node(^"Back").pressed.connect(_on_back_pressed) diff --git a/3d/truck_town/car_select/car_select.tscn b/3d/truck_town/car_select/car_select.tscn index 4732971a869..38a6221e31c 100644 --- a/3d/truck_town/car_select/car_select.tscn +++ b/3d/truck_town/car_select/car_select.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=6 format=3 uid="uid://ckvqraq6j1okh"] +[gd_scene load_steps=7 format=3 uid="uid://ckvqraq6j1okh"] [ext_resource type="Script" path="res://car_select/car_select.gd" id="1"] [ext_resource type="Texture2D" uid="uid://bh7b4n4lg1uqt" path="res://car_select/choose_van.png" id="2"] @@ -11,6 +11,8 @@ variation_transform = Transform2D(1, 0.2, 0, 1, 0, 0) spacing_glyph = -1 spacing_space = 4 +[sub_resource type="ButtonGroup" id="ButtonGroup_lcrm3"] + [node name="CarSelect" type="Control"] layout_mode = 3 anchors_preset = 8 @@ -75,6 +77,60 @@ theme_override_fonts/font = SubResource("FontVariation_hqcvw") theme_override_font_sizes/font_size = 64 text = "Truck Town" +[node name="PanelContainer" type="PanelContainer" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -325.0 +offset_top = 164.0 +offset_right = 325.0 +offset_bottom = 205.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="MarginContainer" type="MarginContainer" parent="PanelContainer"] +layout_mode = 2 +theme_override_constants/margin_left = 20 +theme_override_constants/margin_top = 5 +theme_override_constants/margin_right = 20 +theme_override_constants/margin_bottom = 5 + +[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/MarginContainer"] +layout_mode = 2 + +[node name="Label" type="Label" parent="PanelContainer/MarginContainer/HBoxContainer"] +custom_minimum_size = Vector2(70, 0) +layout_mode = 2 +text = "Mood" + +[node name="Sunrise" type="CheckBox" parent="PanelContainer/MarginContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +button_group = SubResource("ButtonGroup_lcrm3") +text = "Sunrise" + +[node name="Day" type="CheckBox" parent="PanelContainer/MarginContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +button_pressed = true +button_group = SubResource("ButtonGroup_lcrm3") +text = "Day" + +[node name="Sunset" type="CheckBox" parent="PanelContainer/MarginContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +button_group = SubResource("ButtonGroup_lcrm3") +text = "Sunset" + +[node name="Night" type="CheckBox" parent="PanelContainer/MarginContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +button_group = SubResource("ButtonGroup_lcrm3") +text = "Night" + [connection signal="pressed" from="HBoxContainer/MiniVan" to="." method="_on_mini_van_pressed"] [connection signal="pressed" from="HBoxContainer/TrailerTruck" to="." method="_on_trailer_truck_pressed"] [connection signal="pressed" from="HBoxContainer/TowTruck" to="." method="_on_tow_truck_pressed"] diff --git a/3d/truck_town/project.godot b/3d/truck_town/project.godot index cc0216ab1d4..8de8b7b6787 100644 --- a/3d/truck_town/project.godot +++ b/3d/truck_town/project.godot @@ -148,6 +148,12 @@ cycle_camera={ , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":3,"pressure":0.0,"pressed":false,"script":null) ] } +cycle_mood={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":77,"physical_keycode":0,"key_label":0,"unicode":109,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":12,"pressure":0.0,"pressed":false,"script":null) +] +} [physics] @@ -159,11 +165,15 @@ textures/vram_compression/import_etc2_astc=true lights_and_shadows/directional_shadow/size=8192 lights_and_shadows/directional_shadow/soft_shadow_filter_quality=3 lights_and_shadows/directional_shadow/soft_shadow_filter_quality.mobile=1 +lights_and_shadows/positional_shadow/soft_shadow_filter_quality=3 +lights_and_shadows/positional_shadow/soft_shadow_filter_quality.mobile=1 textures/default_filters/anisotropic_filtering_level=4 textures/default_filters/texture_mipmap_bias=-0.5 textures/decals/filter=1 environment/defaults/default_clear_color=Color(0.133333, 0.133333, 0.133333, 1) anti_aliasing/quality/msaa_3d=2 anti_aliasing/quality/use_debanding=true +lights_and_shadows/positional_shadow/atlas_size=2048 +lights_and_shadows/positional_shadow/atlas_size.mobile=1024 anti_aliasing/quality/msaa_3d.mobile=0 scaling_3d/scale.mobile=0.67 diff --git a/3d/truck_town/town/sky_day.tres b/3d/truck_town/town/sky_day.tres new file mode 100644 index 00000000000..120ebdf8b66 --- /dev/null +++ b/3d/truck_town/town/sky_day.tres @@ -0,0 +1,5 @@ +[gd_resource type="ProceduralSkyMaterial" format=3 uid="uid://bpms6jemjgt36"] + +[resource] +sky_horizon_color = Color(0.64625, 0.65575, 0.67075, 1) +ground_horizon_color = Color(0.64625, 0.65575, 0.67075, 1) diff --git a/3d/truck_town/town/sky_morning.tres b/3d/truck_town/town/sky_morning.tres new file mode 100644 index 00000000000..c09e616a004 --- /dev/null +++ b/3d/truck_town/town/sky_morning.tres @@ -0,0 +1,6 @@ +[gd_resource type="ProceduralSkyMaterial" format=3 uid="uid://drtvj2ilm4c7h"] + +[resource] +sky_top_color = Color(0.164732, 0.303048, 0.411552, 1) +sky_horizon_color = Color(0.686775, 0.600323, 0.467043, 1) +ground_horizon_color = Color(0.686275, 0.6, 0.466667, 1) diff --git a/3d/truck_town/town/sky_night.tres b/3d/truck_town/town/sky_night.tres new file mode 100644 index 00000000000..f674dd71074 --- /dev/null +++ b/3d/truck_town/town/sky_night.tres @@ -0,0 +1,6 @@ +[gd_resource type="ProceduralSkyMaterial" format=3 uid="uid://c2w5t0j2rkiuu"] + +[resource] +sky_top_color = Color(0.0964875, 0.114707, 0.155705, 1) +sky_horizon_color = Color(0.201247, 0.148966, 0.125881, 1) +ground_horizon_color = Color(0.2, 0.14902, 0.12549, 1) diff --git a/3d/truck_town/town/sky_sunset.tres b/3d/truck_town/town/sky_sunset.tres new file mode 100644 index 00000000000..9e6c57ca8de --- /dev/null +++ b/3d/truck_town/town/sky_sunset.tres @@ -0,0 +1,6 @@ +[gd_resource type="ProceduralSkyMaterial" format=3 uid="uid://dbs05x6h8miq2"] + +[resource] +sky_top_color = Color(0.252654, 0.288234, 0.368141, 1) +sky_horizon_color = Color(0.77459, 0.550361, 0.50128, 1) +ground_horizon_color = Color(0.776471, 0.54902, 0.501961, 1) diff --git a/3d/truck_town/town/town_scene.gd b/3d/truck_town/town/town_scene.gd new file mode 100644 index 00000000000..31e6c20bcb7 --- /dev/null +++ b/3d/truck_town/town/town_scene.gd @@ -0,0 +1,50 @@ +extends Node3D + +enum Mood { + SUNRISE, + DAY, + SUNSET, + NIGHT, + MAX, +} + +var mood := Mood.DAY: set = set_mood + + +func _input(event: InputEvent) -> void: + if event.is_action_pressed(&"cycle_mood"): + mood = wrapi(mood + 1, 0, Mood.MAX) as Mood + + +func set_mood(p_mood: Mood) -> void: + mood = p_mood + + match p_mood: + Mood.SUNRISE: + $DirectionalLight3D.rotation_degrees = Vector3(-20, -150, -137) + $DirectionalLight3D.light_color = Color(0.414, 0.377, 0.25) + $DirectionalLight3D.light_energy = 4.0 + $WorldEnvironment.environment.fog_light_color = Color(0.686, 0.6, 0.467) + $WorldEnvironment.environment.sky.sky_material = preload("res://town/sky_morning.tres") + $ArtificialLights.visible = false + Mood.DAY: + $DirectionalLight3D.rotation_degrees = Vector3(-55, -120, -31) + $DirectionalLight3D.light_color = Color.WHITE + $DirectionalLight3D.light_energy = 1.45 + $WorldEnvironment.environment.sky.sky_material = preload("res://town/sky_day.tres") + $WorldEnvironment.environment.fog_light_color = Color(0.62, 0.601, 0.601) + $ArtificialLights.visible = false + Mood.SUNSET: + $DirectionalLight3D.rotation_degrees = Vector3(-19, -31, 62) + $DirectionalLight3D.light_color = Color(0.488, 0.3, 0.1) + $DirectionalLight3D.light_energy = 4.0 + $WorldEnvironment.environment.sky.sky_material = preload("res://town/sky_sunset.tres") + $WorldEnvironment.environment.fog_light_color = Color(0.776, 0.549, 0.502) + $ArtificialLights.visible = true + Mood.NIGHT: + $DirectionalLight3D.rotation_degrees = Vector3(-49, 116, -46) + $DirectionalLight3D.light_color = Color(0.232, 0.415, 0.413) + $DirectionalLight3D.light_energy = 0.7 + $WorldEnvironment.environment.sky.sky_material = preload("res://town/sky_night.tres") + $WorldEnvironment.environment.fog_light_color = Color(0.2, 0.149, 0.125) + $ArtificialLights.visible = true diff --git a/3d/truck_town/town/town_scene.tscn b/3d/truck_town/town/town_scene.tscn index 7c20eeab4aa..ccb588fe891 100644 --- a/3d/truck_town/town/town_scene.tscn +++ b/3d/truck_town/town/town_scene.tscn @@ -1,16 +1,14 @@ -[gd_scene load_steps=38 format=3 uid="uid://d0ygmqpylq0wy"] +[gd_scene load_steps=39 format=3 uid="uid://d0ygmqpylq0wy"] +[ext_resource type="Script" path="res://town/town_scene.gd" id="1_lr47o"] [ext_resource type="PackedScene" uid="uid://dfdgytsvtqxwv" path="res://town/truck_town.glb" id="1_x0dmm"] -[ext_resource type="Script" path="res://spedometer.gd" id="2"] +[ext_resource type="Script" uid="uid://ikqivupl66lr" path="res://spedometer.gd" id="2"] +[ext_resource type="Material" uid="uid://bpms6jemjgt36" path="res://town/sky_day.tres" id="2_1df3w"] [ext_resource type="Texture2D" uid="uid://b2g4dq0w72e68" path="res://town/materials/grass.webp" id="4_cymw0"] [ext_resource type="Material" uid="uid://bdjiubscxkdn6" path="res://town/materials/cement.tres" id="5_83ty7"] -[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_2k12y"] -sky_horizon_color = Color(0.64625, 0.65575, 0.67075, 1) -ground_horizon_color = Color(0.64625, 0.65575, 0.67075, 1) - [sub_resource type="Sky" id="Sky_1gf0c"] -sky_material = SubResource("ProceduralSkyMaterial_2k12y") +sky_material = ExtResource("2_1df3w") [sub_resource type="Environment" id="Environment_dauhq"] background_mode = 2 @@ -134,12 +132,13 @@ data = PackedVector3Array(-2, 0.5, 2, 2, -0.5, 2, -2, -0.5, 2, -2, 0.5, -2, -2, data = PackedVector3Array(-2, 1, 2, 2, -1, 2, -2, -1, 2, -2, 1, -2, -2, -1, -2, 2, -1, -2, -2, 1, 2, -2, 1, -2, 2, -1, 2, -2, 1, -2, 2, -1, -2, 2, -1, 2, -2, 1, -2, -2, 1, 2, -2, -1, -2, -2, 1, 2, -2, -1, 2, -2, -1, -2, -2, -1, 2, 2, -1, 2, -2, -1, -2, 2, -1, 2, 2, -1, -2, -2, -1, -2) [node name="TownScene" type="Node3D"] +script = ExtResource("1_lr47o") [node name="WorldEnvironment" type="WorldEnvironment" parent="."] environment = SubResource("Environment_dauhq") [node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] -transform = Transform3D(0.506501, -0.706305, -0.494561, -4.63342e-08, -0.573577, 0.819152, -0.862239, -0.414901, -0.290517, 11.0084, 12.3453, -31.3148) +transform = Transform3D(-0.793955, 0.350561, -0.496732, -0.295414, 0.491651, 0.819152, 0.531381, 0.797111, -0.286788, 11.0084, 12.3453, -31.3148) light_energy = 1.45 shadow_enabled = true shadow_bias = 0.015 @@ -149,6 +148,139 @@ directional_shadow_max_distance = 80.0 [node name="TruckTown" parent="." instance=ExtResource("1_x0dmm")] +[node name="ArtificialLights" type="Node3D" parent="."] +visible = false + +[node name="OmniLight3D" type="OmniLight3D" parent="ArtificialLights"] +transform = Transform3D(0.747779, 0.367885, -0.552709, 0, 0.832459, 0.554087, 0.663947, -0.414335, 0.622495, 11.1028, 5.58679, -15.1748) +light_color = Color(1, 0.941176, 0.705882, 1) +light_energy = 2.0 +shadow_enabled = true +shadow_bias = 0.06 +shadow_blur = 2.0 +distance_fade_enabled = true +distance_fade_begin = 100.0 +distance_fade_shadow = 35.0 +distance_fade_length = 15.0 +omni_range = 15.0 + +[node name="OmniLight3D2" type="OmniLight3D" parent="ArtificialLights"] +transform = Transform3D(0.747779, 0.367885, -0.552709, 0, 0.832459, 0.554087, 0.663947, -0.414335, 0.622495, -13.8972, 6.58679, -9.17481) +light_color = Color(1, 0.941176, 0.705882, 1) +light_energy = 2.0 +shadow_enabled = true +shadow_bias = 0.06 +shadow_blur = 2.0 +distance_fade_enabled = true +distance_fade_begin = 100.0 +distance_fade_shadow = 35.0 +distance_fade_length = 15.0 +omni_range = 15.0 + +[node name="OmniLight3D3" type="OmniLight3D" parent="ArtificialLights"] +transform = Transform3D(0.747779, 0.367885, -0.552709, 0, 0.832459, 0.554087, 0.663947, -0.414335, 0.622495, -12.8972, 6.58679, -36.1748) +light_color = Color(1, 0.941176, 0.705882, 1) +light_energy = 2.0 +shadow_enabled = true +shadow_bias = 0.06 +shadow_blur = 2.0 +distance_fade_enabled = true +distance_fade_begin = 100.0 +distance_fade_shadow = 35.0 +distance_fade_length = 15.0 +omni_range = 15.0 + +[node name="OmniLight3D4" type="OmniLight3D" parent="ArtificialLights"] +transform = Transform3D(0.747779, 0.367885, -0.552709, 0, 0.832459, 0.554087, 0.663947, -0.414335, 0.622495, 9.10282, 8.58679, -37.1748) +light_color = Color(1, 0.941176, 0.705882, 1) +light_energy = 2.0 +shadow_enabled = true +shadow_bias = 0.06 +shadow_blur = 2.0 +distance_fade_enabled = true +distance_fade_begin = 100.0 +distance_fade_shadow = 35.0 +distance_fade_length = 15.0 +omni_range = 15.0 + +[node name="OmniLight3D5" type="OmniLight3D" parent="ArtificialLights"] +transform = Transform3D(0.747779, 0.367885, -0.552709, 0, 0.832459, 0.554087, 0.663947, -0.414335, 0.622495, 18.1028, 8.58679, -47.1748) +light_color = Color(1, 0.941176, 0.705882, 1) +light_energy = 2.0 +shadow_enabled = true +shadow_bias = 0.06 +shadow_blur = 2.0 +distance_fade_enabled = true +distance_fade_begin = 100.0 +distance_fade_shadow = 35.0 +distance_fade_length = 15.0 +omni_range = 15.0 + +[node name="OmniLight3D6" type="OmniLight3D" parent="ArtificialLights"] +transform = Transform3D(0.747779, 0.367885, -0.552709, 0, 0.832459, 0.554087, 0.663947, -0.414335, 0.622495, -47.8972, 2.58679, -25.1748) +light_color = Color(1, 0.941176, 0.705882, 1) +light_energy = 2.0 +shadow_enabled = true +shadow_bias = 0.06 +shadow_blur = 2.0 +distance_fade_enabled = true +distance_fade_begin = 100.0 +distance_fade_shadow = 35.0 +distance_fade_length = 15.0 +omni_range = 15.0 + +[node name="OmniLight3D7" type="OmniLight3D" parent="ArtificialLights"] +transform = Transform3D(0.747779, 0.367885, -0.552709, 0, 0.832459, 0.554087, 0.663947, -0.414335, 0.622495, -42.8972, 2.58679, -9.17481) +light_color = Color(1, 0.941176, 0.705882, 1) +light_energy = 2.0 +shadow_enabled = true +shadow_bias = 0.06 +shadow_blur = 2.0 +distance_fade_enabled = true +distance_fade_begin = 100.0 +distance_fade_shadow = 35.0 +distance_fade_length = 15.0 +omni_range = 15.0 + +[node name="OmniLight3D8" type="OmniLight3D" parent="ArtificialLights"] +transform = Transform3D(0.747779, 0.367885, -0.552709, 0, 0.832459, 0.554087, 0.663947, -0.414335, 0.622495, -71.8972, 5.58679, -25.1748) +light_color = Color(1, 0.941176, 0.705882, 1) +light_energy = 2.0 +shadow_enabled = true +shadow_bias = 0.06 +shadow_blur = 2.0 +distance_fade_enabled = true +distance_fade_begin = 100.0 +distance_fade_shadow = 35.0 +distance_fade_length = 15.0 +omni_range = 15.0 + +[node name="OmniLight3D9" type="OmniLight3D" parent="ArtificialLights"] +transform = Transform3D(0.747779, 0.367885, -0.552709, 0, 0.832459, 0.554087, 0.663947, -0.414335, 0.622495, -70.8972, 5.58679, -45.1748) +light_color = Color(1, 0.941176, 0.705882, 1) +light_energy = 2.0 +shadow_enabled = true +shadow_bias = 0.06 +shadow_blur = 2.0 +distance_fade_enabled = true +distance_fade_begin = 100.0 +distance_fade_shadow = 35.0 +distance_fade_length = 15.0 +omni_range = 15.0 + +[node name="OmniLight3D10" type="OmniLight3D" parent="ArtificialLights"] +transform = Transform3D(0.747779, 0.367885, -0.552709, 0, 0.832459, 0.554087, 0.663947, -0.414335, 0.622495, -42.7972, -1.41321, -101.175) +light_color = Color(1, 0.941176, 0.705882, 1) +light_energy = 2.0 +shadow_enabled = true +shadow_bias = 0.06 +shadow_blur = 2.0 +distance_fade_enabled = true +distance_fade_begin = 100.0 +distance_fade_shadow = 35.0 +distance_fade_length = 15.0 +omni_range = 15.0 + [node name="InstancePos" type="Marker3D" parent="."] transform = Transform3D(1.31134e-07, 0, -1, 0, 1, 0, 1, 0, 1.31134e-07, 8, 3.36405, -16) diff --git a/3d/truck_town/vehicles/meshes/minivan.res b/3d/truck_town/vehicles/meshes/minivan.res index 65ec6e00295607d396fa8925f30204bf46d4bad4..1a7871ba87c93ba8d3b622b200353a6098f66857 100644 GIT binary patch delta 74 zcmaDE@-k#YIv1;faZ+yaRL*%Omf@)@{zCg*dhvR4|LWmPg1 eOqS%9Wz9@4$w{0n&MnVclAl#RLIC4|+Dk>SccqZp_sj}xJnRL*%Omf@);y~Cg*dha#R|dWmPiN f^GufFmSIg!Pp(X#EY2;@YLHh^ShCrgJ69C|tTPuY delta 76 zcmZ3HxFT^wIu~nYZdpm%RLIC4|+Dk>Qyc_!y`sdD5bnRL*%Omf@)@{!Cg*dhvR4|LWmPg1 ePL|}BWi?K$EXbZL&MnWHo1dSVzuB5QSpfilQ5K&7 delta 75 zcmbOiJ}-PjIu~ncMRK{xRLIC4|+Dk>Scc_!y`sj}xJn