From 2eab3ce2bb1a784164ef6d6a1d681cc5edde9bbe Mon Sep 17 00:00:00 2001 From: Myra Date: Fri, 7 Nov 2025 00:31:50 +0100 Subject: [PATCH 001/106] Remove inappropriate patron name (#41330) --- Resources/Credits/Patrons.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Credits/Patrons.yml b/Resources/Credits/Patrons.yml index d736857edc..fa8dea7432 100644 --- a/Resources/Credits/Patrons.yml +++ b/Resources/Credits/Patrons.yml @@ -338,7 +338,7 @@ Tier: Syndicate Agent - Name: hyphenation Tier: Nuclear Operative -- Name: I'm going to resurrect Charlie Kirk as a gay zombie with a permanent hard cock, like the scene where robocop is lungs, but boner +- Name: REDACTED Tier: Revolutionary - Name: IamOzyman Tier: Revolutionary From 4f0b1f377eeb8533488ebf0ecb2a0bc7eabc7609 Mon Sep 17 00:00:00 2001 From: Justin Pfeifler Date: Thu, 6 Nov 2025 18:53:27 -0600 Subject: [PATCH 002/106] Gravity Generators cannot be unanchored while active (#41256) * Add unanchor attempt check * Combine shared component and server component - Combines SharedGravityGeneratorComponent and GravityGeneratorComponent - AutoNetworked the GravityActiveBool * Remove SharedGravityGeneratorComponent * Update to SharedGravityGeneratorComponent * Fix to be a complete sentence * Dirty GravityActive whenever changed * Rename component and remove view variables * Update referenced component name * Move unanchor attempt to shared system * Add client system * Revert popup to PopupEntity * Fix popup to be PopupClient * Set access restriction on GravityActive --- Content.Client/Entry/EntryPoint.cs | 1 - .../Gravity/GravityGeneratorSystem.cs | 8 +++++ Content.Client/Gravity/GravitySystem.cs | 4 +-- .../Tests/GravityGridTest.cs | 1 - .../Gravity/GravityGeneratorComponent.cs | 20 ------------ .../Gravity/GravityGeneratorSystem.cs | 4 ++- ...ponent.cs => GravityGeneratorComponent.cs} | 31 ++++++++++--------- .../Gravity/SharedGravityGeneratorSystem.cs | 29 +++++++++++++++++ .../components/station-anchor-component.ftl | 2 +- .../gravity/gravity-generator-component.ftl | 6 ++-- 10 files changed, 63 insertions(+), 43 deletions(-) create mode 100644 Content.Client/Gravity/GravityGeneratorSystem.cs delete mode 100644 Content.Server/Gravity/GravityGeneratorComponent.cs rename Content.Shared/Gravity/{SharedGravityGeneratorComponent.cs => GravityGeneratorComponent.cs} (59%) create mode 100644 Content.Shared/Gravity/SharedGravityGeneratorSystem.cs diff --git a/Content.Client/Entry/EntryPoint.cs b/Content.Client/Entry/EntryPoint.cs index ac08547859..b9f0e0e8e6 100644 --- a/Content.Client/Entry/EntryPoint.cs +++ b/Content.Client/Entry/EntryPoint.cs @@ -98,7 +98,6 @@ namespace Content.Client.Entry _componentFactory.IgnoreMissingComponents(); // Do not add to these, they are legacy. - _componentFactory.RegisterClass(); _componentFactory.RegisterClass(); // Do not add to the above, they are legacy diff --git a/Content.Client/Gravity/GravityGeneratorSystem.cs b/Content.Client/Gravity/GravityGeneratorSystem.cs new file mode 100644 index 0000000000..b74ea35daa --- /dev/null +++ b/Content.Client/Gravity/GravityGeneratorSystem.cs @@ -0,0 +1,8 @@ +using Content.Shared.Gravity; + +namespace Content.Client.Gravity; + +public sealed class GravityGeneratorSystem : SharedGravityGeneratorSystem +{ + +} diff --git a/Content.Client/Gravity/GravitySystem.cs b/Content.Client/Gravity/GravitySystem.cs index 60e043cc99..f1e09fdb44 100644 --- a/Content.Client/Gravity/GravitySystem.cs +++ b/Content.Client/Gravity/GravitySystem.cs @@ -12,14 +12,14 @@ public sealed partial class GravitySystem : SharedGravitySystem public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnAppearanceChange); + SubscribeLocalEvent(OnAppearanceChange); InitializeShake(); } /// /// Ensures that the visible state of gravity generators are synced with their sprites. /// - private void OnAppearanceChange(EntityUid uid, SharedGravityGeneratorComponent comp, ref AppearanceChangeEvent args) + private void OnAppearanceChange(EntityUid uid, GravityGeneratorComponent comp, ref AppearanceChangeEvent args) { if (args.Sprite == null) return; diff --git a/Content.IntegrationTests/Tests/GravityGridTest.cs b/Content.IntegrationTests/Tests/GravityGridTest.cs index 8257035de6..047ec0259a 100644 --- a/Content.IntegrationTests/Tests/GravityGridTest.cs +++ b/Content.IntegrationTests/Tests/GravityGridTest.cs @@ -1,4 +1,3 @@ -using Content.Server.Gravity; using Content.Server.Power.Components; using Content.Shared.Gravity; using Robust.Shared.GameObjects; diff --git a/Content.Server/Gravity/GravityGeneratorComponent.cs b/Content.Server/Gravity/GravityGeneratorComponent.cs deleted file mode 100644 index c715a5e5f3..0000000000 --- a/Content.Server/Gravity/GravityGeneratorComponent.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Content.Shared.Gravity; -using Content.Shared.Construction.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; - -namespace Content.Server.Gravity -{ - [RegisterComponent] - [Access(typeof(GravityGeneratorSystem))] - public sealed partial class GravityGeneratorComponent : SharedGravityGeneratorComponent - { - [DataField("lightRadiusMin")] public float LightRadiusMin { get; set; } - [DataField("lightRadiusMax")] public float LightRadiusMax { get; set; } - - /// - /// Is the gravity generator currently "producing" gravity? - /// - [ViewVariables] - public bool GravityActive { get; set; } = false; - } -} diff --git a/Content.Server/Gravity/GravityGeneratorSystem.cs b/Content.Server/Gravity/GravityGeneratorSystem.cs index 9d58b82d69..8e714cf884 100644 --- a/Content.Server/Gravity/GravityGeneratorSystem.cs +++ b/Content.Server/Gravity/GravityGeneratorSystem.cs @@ -4,7 +4,7 @@ using Content.Shared.Gravity; namespace Content.Server.Gravity; -public sealed class GravityGeneratorSystem : EntitySystem +public sealed class GravityGeneratorSystem : SharedGravityGeneratorSystem { [Dependency] private readonly GravitySystem _gravitySystem = default!; [Dependency] private readonly SharedPointLightSystem _lights = default!; @@ -36,6 +36,7 @@ public sealed class GravityGeneratorSystem : EntitySystem private void OnActivated(Entity ent, ref ChargedMachineActivatedEvent args) { ent.Comp.GravityActive = true; + Dirty(ent, ent.Comp); var xform = Transform(ent); @@ -48,6 +49,7 @@ public sealed class GravityGeneratorSystem : EntitySystem private void OnDeactivated(Entity ent, ref ChargedMachineDeactivatedEvent args) { ent.Comp.GravityActive = false; + Dirty(ent, ent.Comp); var xform = Transform(ent); diff --git a/Content.Shared/Gravity/SharedGravityGeneratorComponent.cs b/Content.Shared/Gravity/GravityGeneratorComponent.cs similarity index 59% rename from Content.Shared/Gravity/SharedGravityGeneratorComponent.cs rename to Content.Shared/Gravity/GravityGeneratorComponent.cs index 75b636b2fa..f7b1240f1a 100644 --- a/Content.Shared/Gravity/SharedGravityGeneratorComponent.cs +++ b/Content.Shared/Gravity/GravityGeneratorComponent.cs @@ -3,42 +3,45 @@ using Robust.Shared.GameStates; namespace Content.Shared.Gravity; -[NetworkedComponent()] -[Virtual] -public partial class SharedGravityGeneratorComponent : Component +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class GravityGeneratorComponent : Component { + [DataField] public float LightRadiusMin { get; set; } + [DataField] public float LightRadiusMax { get; set; } + /// /// A map of the sprites used by the gravity generator given its status. /// - [DataField("spriteMap")] - [Access(typeof(SharedGravitySystem))] - public Dictionary SpriteMap = new(); + [DataField, Access(typeof(SharedGravitySystem))] + public Dictionary SpriteMap = []; /// /// The sprite used by the core of the gravity generator when the gravity generator is starting up. /// - [DataField("coreStartupState")] - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public string CoreStartupState = "startup"; /// /// The sprite used by the core of the gravity generator when the gravity generator is idle. /// - [DataField("coreIdleState")] - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public string CoreIdleState = "idle"; /// /// The sprite used by the core of the gravity generator when the gravity generator is activating. /// - [DataField("coreActivatingState")] - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public string CoreActivatingState = "activating"; /// /// The sprite used by the core of the gravity generator when the gravity generator is active. /// - [DataField("coreActivatedState")] - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public string CoreActivatedState = "activated"; + + /// + /// Is the gravity generator currently "producing" gravity? + /// + [DataField, AutoNetworkedField, Access(typeof(SharedGravityGeneratorSystem))] + public bool GravityActive = false; } diff --git a/Content.Shared/Gravity/SharedGravityGeneratorSystem.cs b/Content.Shared/Gravity/SharedGravityGeneratorSystem.cs new file mode 100644 index 0000000000..b2b2e72b62 --- /dev/null +++ b/Content.Shared/Gravity/SharedGravityGeneratorSystem.cs @@ -0,0 +1,29 @@ +using Content.Shared.Popups; +using Content.Shared.Construction.Components; + +namespace Content.Shared.Gravity; + +public abstract class SharedGravityGeneratorSystem : EntitySystem +{ + [Dependency] private readonly SharedPopupSystem _popupSystem = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnUnanchorAttempt); + } + + /// + /// Prevent unanchoring when gravity is active + /// + private void OnUnanchorAttempt(Entity ent, ref UnanchorAttemptEvent args) + { + if (!ent.Comp.GravityActive) + return; + + _popupSystem.PopupClient(Loc.GetString("gravity-generator-unanchoring-failed"), ent.Owner, args.User, PopupType.Medium); + + args.Cancel(); + } +} diff --git a/Resources/Locale/en-US/components/station-anchor-component.ftl b/Resources/Locale/en-US/components/station-anchor-component.ftl index fd9d5ea4ae..18221e945a 100644 --- a/Resources/Locale/en-US/components/station-anchor-component.ftl +++ b/Resources/Locale/en-US/components/station-anchor-component.ftl @@ -1,2 +1,2 @@ -station-anchor-unanchoring-failed = Can't unanchor an active station anchor +station-anchor-unanchoring-failed = Can't unanchor an active station anchor. station-anchor-window-title = Station Anchor diff --git a/Resources/Locale/en-US/gravity/gravity-generator-component.ftl b/Resources/Locale/en-US/gravity/gravity-generator-component.ftl index b4e6cddcd5..fa3783fc34 100644 --- a/Resources/Locale/en-US/gravity/gravity-generator-component.ftl +++ b/Resources/Locale/en-US/gravity/gravity-generator-component.ftl @@ -1,11 +1,9 @@ ### Gravity Generator ## UI - gravity-generator-window-title = Gravity Generator ## UI field names - gravity-generator-window-status = Status: gravity-generator-window-power = Power: gravity-generator-window-eta = ETA: @@ -23,6 +21,8 @@ gravity-generator-window-power-off = Off gravity-generator-window-power-label = { $draw } / { $max } W ## UI ETA label - gravity-generator-window-eta-none = N/A gravity-generator-window-eta-value = { TOSTRING($left, "m\\:ss") } + +## Popup +gravity-generator-unanchoring-failed = Can't unanchor an active gravity generator. From 79f3ac3ecabc76ae6e31f7abcb9edf7c59938698 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 7 Nov 2025 01:06:13 +0000 Subject: [PATCH 003/106] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index bb2ca3a948..97bbe776bc 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: KamTheSythe - changes: - - message: Explosive payloads no longer explode. Modular grenades with explosive - payloads remain unchanged, and can still be used to stack explosions. - type: Tweak - id: 8687 - time: '2025-06-17T09:46:36.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38049 - author: Kittygyat changes: - message: Increased borg drag speed, equivalent to Diona speeds. @@ -3925,3 +3917,10 @@ id: 9188 time: '2025-11-06T21:46:17.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41163 +- author: Jrpl + changes: + - message: Gravity Generators can no longer be unanchored while they are active. + type: Fix + id: 9189 + time: '2025-11-07T01:05:04.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41256 From e718f0252d467554353ff9d969e6388887ba4121 Mon Sep 17 00:00:00 2001 From: Hitlinemoss <209321380+Hitlinemoss@users.noreply.github.com> Date: Fri, 7 Nov 2025 02:32:26 -0500 Subject: [PATCH 004/106] Golden plunger + security star(s) moved to job trinkets loadout tab (#41094) * Golden plunger + security star(s) moved to job trinkets loadout tam * Fixed being unable to pick both job-plushie and the plunger/star at the same time * Whoops, forgot to commit the bartender fix * SecStar playtime baked into prototype itself * Removed increased job-trinket limit (likely bad to hardcode these for very specific roles) --- .../Loadouts/Jobs/Civilian/janitor.yml | 10 --------- .../Jobs/Security/security_officer.yml | 20 ------------------ .../Loadouts/Miscellaneous/jobtrinkets.yml | 21 +++++++++++++++++++ .../Prototypes/Loadouts/loadout_groups.yml | 19 +++++------------ .../Prototypes/Loadouts/role_loadouts.yml | 5 ----- 5 files changed, 26 insertions(+), 49 deletions(-) diff --git a/Resources/Prototypes/Loadouts/Jobs/Civilian/janitor.yml b/Resources/Prototypes/Loadouts/Jobs/Civilian/janitor.yml index d902481f9c..431b83a99d 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Civilian/janitor.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Civilian/janitor.yml @@ -45,13 +45,3 @@ id: JanitorWintercoat equipment: outerClothing: ClothingOuterWinterJani - -# Misc -- type: loadout - id: JanitorGoldenPlunger - effects: - - !type:GroupLoadoutEffect - proto: SeniorJanitorial - storage: - back: - - GoldenPlunger diff --git a/Resources/Prototypes/Loadouts/Jobs/Security/security_officer.yml b/Resources/Prototypes/Loadouts/Jobs/Security/security_officer.yml index 482e3ab896..e0b0ce1a3f 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Security/security_officer.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Security/security_officer.yml @@ -13,16 +13,6 @@ department: Security time: 60h -#Security Star -- type: loadoutEffectGroup - id: SecurityStarWorthy - effects: - - !type:JobRequirementLoadoutEffect - requirement: - !type:DepartmentTimeRequirement - department: Security - time: 100h - # Head - type: loadout id: SecurityHelmet @@ -158,13 +148,3 @@ proto: SeniorOfficer equipment: id: SeniorOfficerPDA - -# Misc -- type: loadout - id: SecStar - effects: - - !type:GroupLoadoutEffect - proto: SecurityStarWorthy - storage: - back: - - Dinkystar diff --git a/Resources/Prototypes/Loadouts/Miscellaneous/jobtrinkets.yml b/Resources/Prototypes/Loadouts/Miscellaneous/jobtrinkets.yml index fd674b1901..b5e3f6bdd7 100644 --- a/Resources/Prototypes/Loadouts/Miscellaneous/jobtrinkets.yml +++ b/Resources/Prototypes/Loadouts/Miscellaneous/jobtrinkets.yml @@ -120,6 +120,15 @@ back: - PlushieLizardJobJanitor +- type: loadout + id: JanitorGoldenPlunger + effects: + - !type:GroupLoadoutEffect + proto: SeniorJanitorial + storage: + back: + - GoldenPlunger + - type: loadout id: LizardPlushieBotanist effects: @@ -336,6 +345,18 @@ back: - PlushieLizardJobSecurityofficer +- type: loadout + id: SecStar + effects: + - !type:JobRequirementLoadoutEffect + requirement: + !type:DepartmentTimeRequirement + department: Security + time: 100h + storage: + back: + - Dinkystar + - type: loadout id: LizardPlushieSecurityCadet effects: diff --git a/Resources/Prototypes/Loadouts/loadout_groups.yml b/Resources/Prototypes/Loadouts/loadout_groups.yml index 185b68ab36..c79689d5a0 100644 --- a/Resources/Prototypes/Loadouts/loadout_groups.yml +++ b/Resources/Prototypes/Loadouts/loadout_groups.yml @@ -484,19 +484,13 @@ loadouts: - JanitorWintercoat -- type: loadoutGroup - id: JanitorPlunger - name: loadout-group-janitor-plunger - minLimit: 0 - loadouts: - - JanitorGoldenPlunger - - type: loadoutGroup id: JanitorJobTrinkets name: loadout-group-jobtrinkets minLimit: 0 loadouts: - LizardPlushieJanitor + - JanitorGoldenPlunger - type: loadoutGroup id: BotanistHead @@ -1184,6 +1178,7 @@ minLimit: 0 loadouts: - LizardPlushieHeadofSecurity + - SecStar - type: loadoutGroup id: WardenHead @@ -1213,6 +1208,7 @@ minLimit: 0 loadouts: - LizardPlushieWarden + - SecStar - type: loadoutGroup id: SecurityHead @@ -1279,6 +1275,7 @@ minLimit: 0 loadouts: - LizardPlushieSecurity + - SecStar - type: loadoutGroup id: DetectiveHead @@ -1318,6 +1315,7 @@ minLimit: 0 loadouts: - LizardPlushieDetective + - SecStar - type: loadoutGroup id: SecurityCadetJumpsuit @@ -1343,13 +1341,6 @@ - EmergencyOxygenSecurity - LoadoutSpeciesVoxNitrogen -- type: loadoutGroup - id: SecurityStar - name: loadout-group-security-star - minLimit: 0 - loadouts: - - SecStar - # Medical - type: loadoutGroup id: ChiefMedicalOfficerHead diff --git a/Resources/Prototypes/Loadouts/role_loadouts.yml b/Resources/Prototypes/Loadouts/role_loadouts.yml index bbdb21e17c..d0ab791a30 100644 --- a/Resources/Prototypes/Loadouts/role_loadouts.yml +++ b/Resources/Prototypes/Loadouts/role_loadouts.yml @@ -152,7 +152,6 @@ - Survival - Trinkets - JanitorJobTrinkets - - JanitorPlunger - GroupSpeciesBreathTool - type: roleLoadout @@ -378,7 +377,6 @@ - SurvivalSecurity - Trinkets - HeadofSecurityJobTrinkets - - SecurityStar - GroupSpeciesBreathToolSecurity - type: roleLoadout @@ -393,7 +391,6 @@ - SurvivalSecurity - Trinkets - WardenJobTrinkets - - SecurityStar - GroupSpeciesBreathToolSecurity - type: roleLoadout @@ -409,7 +406,6 @@ - SurvivalSecurity - Trinkets - SecurityJobTrinkets - - SecurityStar - GroupSpeciesBreathToolSecurity - type: roleLoadout @@ -424,7 +420,6 @@ - SurvivalSecurity - Trinkets - DetectiveJobTrinkets - - SecurityStar - GroupSpeciesBreathToolSecurity - type: roleLoadout From 522bc421aa950cf516bd3ff71c61e66e30b46acd Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 7 Nov 2025 07:44:57 +0000 Subject: [PATCH 005/106] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 97bbe776bc..5d5045ddbc 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Kittygyat - changes: - - message: Increased borg drag speed, equivalent to Diona speeds. - type: Tweak - id: 8688 - time: '2025-06-17T10:41:08.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38232 - author: TheFlyingSentry changes: - message: Animal stealing thief objectives now actually check for the objective's @@ -3924,3 +3917,11 @@ id: 9189 time: '2025-11-07T01:05:04.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41256 +- author: Hitlinemoss + changes: + - message: The golden plunger and security star have been moved to their respective + roles' "Job trinkets" loadout tab. + type: Tweak + id: 9190 + time: '2025-11-07T07:43:47.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41094 From 0a8be7eebaffb693e368d0f6f02ff88d113676e5 Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 7 Nov 2025 03:25:16 -0500 Subject: [PATCH 006/106] Exo: connect medbay's dispo (#41329) Fix medbay dispo on exo --- Resources/Maps/exo.yml | 93 ++++++++++++++++++++++++++---------------- 1 file changed, 58 insertions(+), 35 deletions(-) diff --git a/Resources/Maps/exo.yml b/Resources/Maps/exo.yml index 8b893c2b82..af133764a4 100644 --- a/Resources/Maps/exo.yml +++ b/Resources/Maps/exo.yml @@ -4,8 +4,8 @@ meta: engineVersion: 267.3.0 forkId: "" forkVersion: "" - time: 11/01/2025 14:27:42 - entityCount: 20005 + time: 11/06/2025 22:05:46 + entityCount: 20009 maps: - 1 grids: @@ -4653,10 +4653,10 @@ entities: 0: 51711 8,-16: 0: 271 - 4: 17408 + 2: 17408 8,-15: 1: 4096 - 4: 4 + 2: 4 8,-14: 0: 32752 8,-13: @@ -5350,8 +5350,8 @@ entities: 0: 65535 9,-16: 0: 15 - 5: 4352 - 2: 17408 + 3: 4352 + 4: 17408 10,-20: 0: 65280 10,-19: @@ -5362,8 +5362,8 @@ entities: 0: 65535 10,-16: 0: 15 - 2: 4352 - 6: 17408 + 4: 4352 + 5: 17408 11,-20: 0: 65024 11,-19: @@ -5375,7 +5375,7 @@ entities: 11,-16: 0: 15 1: 35840 - 2: 4352 + 4: 4352 12,-20: 0: 65280 12,-19: @@ -5409,7 +5409,7 @@ entities: 0: 61183 12,-16: 0: 7 - 2: 2184 + 4: 2184 1: 8960 13,-20: 0: 65024 @@ -5423,7 +5423,7 @@ entities: 13,-21: 1: 16179 13,-16: - 2: 819 + 4: 819 1: 8 14,-20: 0: 53504 @@ -5623,7 +5623,7 @@ entities: 0: 59392 11,-15: 1: 32904 - 2: 1 + 4: 1 12,-14: 0: 62926 11,-14: @@ -5744,12 +5744,12 @@ entities: 0: 60625 11,-10: 0: 34944 - 3: 13104 + 6: 13104 12,-9: 0: 56784 11,-9: 0: 65416 - 3: 2 + 6: 2 12,-8: 0: 57117 13,-11: @@ -5895,7 +5895,7 @@ entities: 10,-11: 0: 65535 10,-10: - 3: 65520 + 6: 65520 0: 4 10,-13: 0: 12276 @@ -5958,14 +5958,14 @@ entities: 11,-3: 1: 12288 9,-15: - 5: 1 - 2: 4 + 3: 1 + 4: 4 1: 32768 9,-14: 0: 36848 10,-15: - 2: 1 - 6: 4 + 4: 1 + 5: 4 10,-14: 0: 65520 -8,-24: @@ -6050,14 +6050,6 @@ entities: - volume: 2500 immutable: True moles: {} - - volume: 2500 - temperature: 293.15 - moles: {} - - volume: 2500 - temperature: 235 - moles: - Oxygen: 27.225372 - Nitrogen: 102.419266 - volume: 2500 temperature: 293.15 moles: @@ -6066,10 +6058,18 @@ entities: temperature: 293.15 moles: Nitrogen: 6666.982 + - volume: 2500 + temperature: 293.15 + moles: {} - volume: 2500 temperature: 293.15 moles: Plasma: 6666.982 + - volume: 2500 + temperature: 235 + moles: + Oxygen: 27.225372 + Nitrogen: 102.419266 chunkSize: 4 - type: GasTileOverlay - type: RadiationGridResistance @@ -10102,7 +10102,7 @@ entities: pos: 11.5,-30.5 parent: 2 - type: Door - secondsUntilStateChange: -254267.98 + secondsUntilStateChange: -254680.28 state: Opening - type: DeviceLinkSource lastSignals: @@ -10458,7 +10458,7 @@ entities: pos: 34.5,-36.5 parent: 2 - type: Door - secondsUntilStateChange: -29765.682 + secondsUntilStateChange: -30177.973 state: Opening - type: DeviceLinkSource lastSignals: @@ -48732,6 +48732,11 @@ entities: rot: -1.5707963267948966 rad pos: 27.5,-24.5 parent: 2 + - uid: 14215 + components: + - type: Transform + pos: 27.5,-23.5 + parent: 2 - uid: 15507 components: - type: Transform @@ -49779,12 +49784,6 @@ entities: rot: 3.141592653589793 rad pos: 27.5,-22.5 parent: 2 - - uid: 14215 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 27.5,-23.5 - parent: 2 - uid: 14451 components: - type: Transform @@ -52991,6 +52990,30 @@ entities: rot: 1.5707963267948966 rad pos: 26.5,-66.5 parent: 2 + - uid: 18997 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 23.5,-23.5 + parent: 2 + - uid: 19000 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 24.5,-23.5 + parent: 2 + - uid: 19001 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 25.5,-23.5 + parent: 2 + - uid: 19002 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 26.5,-23.5 + parent: 2 - uid: 19453 components: - type: Transform From cc05c6cf818f1c6418f894dc5f4985ccf5136668 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 7 Nov 2025 08:37:12 +0000 Subject: [PATCH 007/106] Automatic changelog update --- Resources/Changelog/Maps.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Resources/Changelog/Maps.yml b/Resources/Changelog/Maps.yml index 80ff2191eb..13186ab6f2 100644 --- a/Resources/Changelog/Maps.yml +++ b/Resources/Changelog/Maps.yml @@ -819,4 +819,11 @@ id: 99 time: '2025-11-03T09:45:56.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41072 +- author: F1restar4 + changes: + - message: On Exo, connected medbay's dispo units to the network + type: Fix + id: 100 + time: '2025-11-07T08:36:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41329 Order: 2 From 027462d95abc0a169df58d32ccb8bddef1216efa Mon Sep 17 00:00:00 2001 From: qwerltaz <69696513+qwerltaz@users.noreply.github.com> Date: Fri, 7 Nov 2025 21:32:19 +0100 Subject: [PATCH 008/106] box station: change empty dressers to random fill (#41344) change empty dressers to random fill, and comfy chair before TV in dorm 4 --- Resources/Maps/box.yml | 62 ++++++++++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 24 deletions(-) diff --git a/Resources/Maps/box.yml b/Resources/Maps/box.yml index 4f2ac605a0..53a8e77654 100644 --- a/Resources/Maps/box.yml +++ b/Resources/Maps/box.yml @@ -4,8 +4,8 @@ meta: engineVersion: 267.3.0 forkId: "" forkVersion: "" - time: 11/04/2025 19:45:51 - entityCount: 28789 + time: 11/07/2025 10:31:27 + entityCount: 28792 maps: - 780 grids: @@ -73729,6 +73729,12 @@ entities: - type: Transform pos: -7.5,23.5 parent: 8364 + - uid: 9086 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 4.5,14.5 + parent: 8364 - uid: 9439 components: - type: Transform @@ -85142,28 +85148,6 @@ entities: - type: Transform pos: -22.349255,-5.634054 parent: 8364 -- proto: Dresser - entities: - - uid: 5190 - components: - - type: Transform - pos: 4.5,8.5 - parent: 8364 - - uid: 6675 - components: - - type: Transform - pos: 15.5,15.5 - parent: 8364 - - uid: 6676 - components: - - type: Transform - pos: 4.5,5.5 - parent: 8364 - - uid: 6987 - components: - - type: Transform - pos: 20.5,4.5 - parent: 8364 - proto: DresserCaptainFilled entities: - uid: 5341 @@ -85187,11 +85171,41 @@ entities: parent: 8364 - proto: DresserFilled entities: + - uid: 5089 + components: + - type: Transform + pos: 15.5,15.5 + parent: 8364 + - uid: 5190 + components: + - type: Transform + pos: 4.5,8.5 + parent: 8364 + - uid: 6675 + components: + - type: Transform + pos: 4.5,5.5 + parent: 8364 + - uid: 6676 + components: + - type: Transform + pos: 20.5,4.5 + parent: 8364 + - uid: 6987 + components: + - type: Transform + pos: 13.5,15.5 + parent: 8364 - uid: 7329 components: - type: Transform pos: 10.5,30.5 parent: 8364 + - uid: 7852 + components: + - type: Transform + pos: 5.5,15.5 + parent: 8364 - proto: DresserHeadOfPersonnelFilled entities: - uid: 5289 From 066dd7fb97f968a81b56b74a9591d8dda7944d61 Mon Sep 17 00:00:00 2001 From: qwerltaz <69696513+qwerltaz@users.noreply.github.com> Date: Fri, 7 Nov 2025 21:36:24 +0100 Subject: [PATCH 009/106] marathon station: replace empty dresser with random fill (#41345) marathon: replace empty dresser with random fill --- Resources/Maps/marathon.yml | 71 +++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 34 deletions(-) diff --git a/Resources/Maps/marathon.yml b/Resources/Maps/marathon.yml index b2d20a2df1..4d60e79763 100644 --- a/Resources/Maps/marathon.yml +++ b/Resources/Maps/marathon.yml @@ -4,8 +4,8 @@ meta: engineVersion: 267.3.0 forkId: "" forkVersion: "" - time: 11/04/2025 19:49:34 - entityCount: 23872 + time: 11/07/2025 10:28:48 + entityCount: 23873 maps: - 5350 grids: @@ -64780,38 +64780,6 @@ entities: - type: Transform pos: 49.502296,31.49661 parent: 30 -- proto: Dresser - entities: - - uid: 655 - components: - - type: Transform - pos: 3.5,15.5 - parent: 30 - - uid: 6427 - components: - - type: Transform - pos: 16.5,39.5 - parent: 30 - - uid: 17643 - components: - - type: Transform - pos: -78.5,-49.5 - parent: 30 - - uid: 17946 - components: - - type: Transform - pos: -52.5,-51.5 - parent: 30 - - uid: 17947 - components: - - type: Transform - pos: -52.5,-55.5 - parent: 30 - - uid: 21299 - components: - - type: Transform - pos: -29.5,-45.5 - parent: 30 - proto: DresserCaptainFilled entities: - uid: 4989 @@ -64835,11 +64803,46 @@ entities: parent: 30 - proto: DresserFilled entities: + - uid: 655 + components: + - type: Transform + pos: 3.5,15.5 + parent: 30 + - uid: 2001 + components: + - type: Transform + pos: 16.5,39.5 + parent: 30 + - uid: 6427 + components: + - type: Transform + pos: -78.5,-49.5 + parent: 30 - uid: 9968 components: - type: Transform pos: -10.5,-22.5 parent: 30 + - uid: 17643 + components: + - type: Transform + pos: -52.5,-51.5 + parent: 30 + - uid: 17946 + components: + - type: Transform + pos: -52.5,-55.5 + parent: 30 + - uid: 17947 + components: + - type: Transform + pos: -29.5,-45.5 + parent: 30 + - uid: 21299 + components: + - type: Transform + pos: 18.5,34.5 + parent: 30 - proto: DresserHeadOfPersonnelFilled entities: - uid: 5715 From e64b6b03fa1e92e2e2312d0c40107bc0754bf83e Mon Sep 17 00:00:00 2001 From: Princess Cheeseballs <66055347+Princess-Cheeseballs@users.noreply.github.com> Date: Sat, 8 Nov 2025 12:29:08 -0800 Subject: [PATCH 010/106] Conveyors spin fix (#37468) * Init commit * And on the third day god said: good enough * and on the fourth day god said: oops * Commit of evil * I hate conveyors * Switch the numbas * I hate conveyors * Master Merge * And on the third day, God said: Good Enough * I hate conveyors * AAAA * Optimize it a bit * Move that * Init Commit * Oops * Remove that * One last commit * Removed one TryComp * Remove TryComp --------- Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com> --- .../Controllers/SharedConveyorController.cs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Physics/Controllers/SharedConveyorController.cs b/Content.Shared/Physics/Controllers/SharedConveyorController.cs index b1ccb3be2a..e8b22b410c 100644 --- a/Content.Shared/Physics/Controllers/SharedConveyorController.cs +++ b/Content.Shared/Physics/Controllers/SharedConveyorController.cs @@ -1,4 +1,4 @@ -using System.Numerics; +using System.Numerics; using Content.Shared.Conveyor; using Content.Shared.Gravity; using Content.Shared.Movement.Components; @@ -58,6 +58,9 @@ public abstract class SharedConveyorController : VirtualController private void OnConveyedFriction(Entity ent, ref TileFrictionEvent args) { + if(!ent.Comp.Conveying) + return; + // Conveyed entities don't get friction, they just get wishdir applied so will inherently slowdown anyway. args.Modifier = 0f; } @@ -140,7 +143,15 @@ public abstract class SharedConveyorController : VirtualController continue; var physics = ent.Entity.Comp3; + + if (physics.BodyStatus != BodyStatus.OnGround) + { + SetConveying(ent.Entity.Owner, ent.Entity.Comp1, false); + continue; + } + var velocity = physics.LinearVelocity; + var angularVelocity = physics.AngularVelocity; var targetDir = ent.Direction; // If mob is moving with the conveyor then combine the directions. @@ -163,6 +174,7 @@ public abstract class SharedConveyorController : VirtualController // We provide a small minimum friction speed as well for those times where the friction would stop large objects // snagged on corners from sliding into the centerline. _mover.Friction(0.2f, frameTime: frameTime, friction: 5f, ref velocity); + _mover.Friction(0f, frameTime: frameTime, friction: 5f, ref angularVelocity); } SharedMoverController.Accelerate(ref velocity, targetDir, 20f, frameTime); @@ -172,8 +184,10 @@ public abstract class SharedConveyorController : VirtualController // Need friction to outweigh the movement as it will bounce a bit against the wall. // This facilitates being able to sleep entities colliding into walls. _mover.Friction(0f, frameTime: frameTime, friction: 40f, ref velocity); + _mover.Friction(0f, frameTime: frameTime, friction: 40f, ref angularVelocity); } + PhysicsSystem.SetAngularVelocity(ent.Entity.Owner, angularVelocity); PhysicsSystem.SetLinearVelocity(ent.Entity.Owner, velocity, wakeBody: false); if (!IsConveyed((ent.Entity.Owner, ent.Entity.Comp2))) From 841c09bbf14efdb6c3390d156a2b49380ae89df8 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 8 Nov 2025 20:41:51 +0000 Subject: [PATCH 011/106] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 5d5045ddbc..2664164bf6 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: TheFlyingSentry - changes: - - message: Animal stealing thief objectives now actually check for the objective's - existence. - type: Tweak - id: 8689 - time: '2025-06-17T11:06:21.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38332 - author: kosticia changes: - message: Reflection chances are examinable now. @@ -3925,3 +3917,10 @@ id: 9190 time: '2025-11-07T07:43:47.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41094 +- author: Princess-Cheeseballs + changes: + - message: Items no longer spin on Conveyors + type: Fix + id: 9191 + time: '2025-11-08T20:40:40.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/37468 From 7155d0d291f083e56b6d1029649799fe813dd984 Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Sat, 8 Nov 2025 21:55:02 +0100 Subject: [PATCH 012/106] Cleanup BatterySystem (#41298) * cleanup * fix fixtures * this belongs into the next PR * review * misc --------- Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> --- .../Tests/Power/PowerTest.cs | 44 +-- .../Systems/AdminVerbSystem.Tools.cs | 14 +- .../EntitySystems/EmergencyLightSystem.cs | 6 +- .../EntitySystems/HandheldLightSystem.cs | 2 +- Content.Server/Mech/Systems/MechSystem.cs | 2 +- .../Ninja/Systems/BatteryDrainerSystem.cs | 6 +- .../Ninja/Systems/SpaceNinjaSystem.cs | 2 +- .../BatterySelfRechargerComponent.cs | 36 -- .../Power/EntitySystems/BatterySystem.API.cs | 104 ++++++ .../Power/EntitySystems/BatterySystem.cs | 311 ++++++------------ .../Power/EntitySystems/ChargerSystem.cs | 4 +- .../Power/EntitySystems/PowerNetSystem.cs | 6 +- .../Power/SetBatteryPercentCommand.cs | 2 +- .../PowerCell/PowerCellSystem.Draw.cs | 2 +- Content.Server/PowerCell/PowerCellSystem.cs | 2 +- Content.Server/PowerSink/PowerSinkSystem.cs | 2 +- .../Radio/EntitySystems/JammerSystem.cs | 2 +- .../Silicons/StationAi/StationAiSystem.cs | 2 +- .../Stunnable/Systems/StunbatonSystem.cs | 2 +- .../Tesla/EntitySystem/TeslaCoilSystem.cs | 2 +- .../Ranged/Systems/GunSystem.Battery.cs | 1 + .../Artifact/XAE/XAEChargeBatterySystem.cs | 2 +- Content.Shared/Power/ChargeEvents.cs | 32 +- .../Power/Components/BatteryComponent.cs | 8 +- .../BatterySelfRechargerComponent.cs | 36 ++ .../EntitySystems/SharedBatterySystem.cs | 56 +++- Resources/Maps/Lavaland/grasslanddome.yml | 1 - Resources/Maps/Lavaland/snowydome.yml | 1 - Resources/Maps/Misc/terminal.yml | 6 - Resources/Maps/Nonstations/wizardsden.yml | 1 - Resources/Maps/Ruins/ruined_prison_ship.yml | 1 - Resources/Maps/Shuttles/arrivals.yml | 1 - .../Clothing/Head/base_clothinghead.yml | 1 - .../Entities/Clothing/OuterClothing/armor.yml | 1 - .../Entities/Mobs/NPCs/behonker.yml | 1 - .../Entities/Mobs/NPCs/lavaland.yml | 1 - .../Entities/Mobs/NPCs/living_light.yml | 1 - .../Entities/Mobs/NPCs/miscellaneous.yml | 1 - .../Entities/Objects/Power/powercells.yml | 4 - .../Weapons/Guns/Battery/battery_guns.yml | 5 - .../Objects/Weapons/Guns/LMGs/lmgs.yml | 1 - .../Objects/Weapons/Guns/Pistols/pistols.yml | 1 - .../Objects/Weapons/Guns/SMGs/smgs.yml | 1 - .../Objects/Weapons/Guns/pneumatic_cannon.yml | 1 - .../Entities/Structures/Power/debug_power.yml | 4 - 45 files changed, 356 insertions(+), 366 deletions(-) delete mode 100644 Content.Server/Power/Components/BatterySelfRechargerComponent.cs create mode 100644 Content.Server/Power/EntitySystems/BatterySystem.API.cs create mode 100644 Content.Shared/Power/Components/BatterySelfRechargerComponent.cs diff --git a/Content.IntegrationTests/Tests/Power/PowerTest.cs b/Content.IntegrationTests/Tests/Power/PowerTest.cs index ab8a421c03..85bd366697 100644 --- a/Content.IntegrationTests/Tests/Power/PowerTest.cs +++ b/Content.IntegrationTests/Tests/Power/PowerTest.cs @@ -402,8 +402,8 @@ namespace Content.IntegrationTests.Tests.Power battery = entityManager.GetComponent(generatorEnt); consumer = entityManager.GetComponent(consumerEnt); - batterySys.SetMaxCharge(generatorEnt, startingCharge, battery); - batterySys.SetCharge(generatorEnt, startingCharge, battery); + batterySys.SetMaxCharge((generatorEnt, battery), startingCharge); + batterySys.SetCharge((generatorEnt, battery), startingCharge); netBattery.MaxSupply = 400; netBattery.SupplyRampRate = 400; netBattery.SupplyRampTolerance = 100; @@ -513,8 +513,8 @@ namespace Content.IntegrationTests.Tests.Power supplier.SupplyRampRate = rampRate; supplier.SupplyRampTolerance = rampTol; - batterySys.SetMaxCharge(batteryEnt, 100_000, battery); - batterySys.SetCharge(batteryEnt, 100_000, battery); + batterySys.SetMaxCharge((batteryEnt, battery), 100_000); + batterySys.SetCharge((batteryEnt, battery), 100_000); netBattery.MaxSupply = draw / 2; netBattery.SupplyRampRate = rampRate; netBattery.SupplyRampTolerance = rampTol; @@ -600,7 +600,7 @@ namespace Content.IntegrationTests.Tests.Power supplier.MaxSupply = 500; supplier.SupplyRampTolerance = 500; - batterySys.SetMaxCharge(batteryEnt, 100_000, battery); + batterySys.SetMaxCharge((batteryEnt, battery), 100_000); netBattery.MaxChargeRate = 1_000; netBattery.Efficiency = 0.5f; }); @@ -670,8 +670,8 @@ namespace Content.IntegrationTests.Tests.Power netBattery.MaxSupply = 400; netBattery.SupplyRampTolerance = 400; netBattery.SupplyRampRate = 100_000; - batterySys.SetMaxCharge(batteryEnt, 100_000, battery); - batterySys.SetCharge(batteryEnt, 100_000, battery); + batterySys.SetMaxCharge((batteryEnt, battery), 100_000); + batterySys.SetCharge((batteryEnt, battery), 100_000); }); // Run some ticks so everything is stable. @@ -750,8 +750,8 @@ namespace Content.IntegrationTests.Tests.Power netBattery.SupplyRampTolerance = 400; netBattery.SupplyRampRate = 100_000; netBattery.Efficiency = 0.5f; - batterySys.SetMaxCharge(batteryEnt, 1_000_000, battery); - batterySys.SetCharge(batteryEnt, 1_000_000, battery); + batterySys.SetMaxCharge((batteryEnt, battery), 1_000_000); + batterySys.SetCharge((batteryEnt, battery), 1_000_000); }); // Run some ticks so everything is stable. @@ -841,8 +841,8 @@ namespace Content.IntegrationTests.Tests.Power supplier.MaxSupply = 1000; supplier.SupplyRampTolerance = 1000; - batterySys.SetMaxCharge(batteryEnt1, 1_000_000, battery1); - batterySys.SetMaxCharge(batteryEnt2, 1_000_000, battery2); + batterySys.SetMaxCharge((batteryEnt1, battery1), 1_000_000); + batterySys.SetMaxCharge((batteryEnt2, battery2), 1_000_000); netBattery1.MaxChargeRate = 1_000; netBattery2.MaxChargeRate = 1_000; @@ -945,10 +945,10 @@ namespace Content.IntegrationTests.Tests.Power netBattery2.SupplyRampTolerance = 1000; netBattery1.SupplyRampRate = 100_000; netBattery2.SupplyRampRate = 100_000; - batterySys.SetMaxCharge(batteryEnt1, 100_000, battery1); - batterySys.SetMaxCharge(batteryEnt2, 100_000, battery2); - batterySys.SetCharge(batteryEnt1, 100_000, battery1); - batterySys.SetCharge(batteryEnt2, 100_000, battery2); + batterySys.SetMaxCharge((batteryEnt1, battery1), 100_000); + batterySys.SetMaxCharge((batteryEnt2, battery2), 100_000); + batterySys.SetCharge((batteryEnt1, battery1), 100_000); + batterySys.SetCharge((batteryEnt2, battery2), 100_000); }); // Run some ticks so everything is stable. @@ -1031,8 +1031,8 @@ namespace Content.IntegrationTests.Tests.Power supplier.MaxSupply = 1000; supplier.SupplyRampTolerance = 1000; - batterySys.SetMaxCharge(batteryEnt1, 1_000_000, battery1); - batterySys.SetMaxCharge(batteryEnt2, 1_000_000, battery2); + batterySys.SetMaxCharge((batteryEnt1, battery1), 1_000_000); + batterySys.SetMaxCharge((batteryEnt2, battery2), 1_000_000); netBattery1.MaxChargeRate = 20; netBattery2.MaxChargeRate = 20; @@ -1107,8 +1107,8 @@ namespace Content.IntegrationTests.Tests.Power netBattery.MaxSupply = 1000; netBattery.SupplyRampTolerance = 200; netBattery.SupplyRampRate = 10; - batterySys.SetMaxCharge(batteryEnt, 100_000, battery); - batterySys.SetCharge(batteryEnt, 100_000, battery); + batterySys.SetMaxCharge((batteryEnt, battery), 100_000); + batterySys.SetCharge((batteryEnt, battery), 100_000); }); // Run some ticks so everything is stable. @@ -1253,7 +1253,7 @@ namespace Content.IntegrationTests.Tests.Power generatorSupplier.MaxSupply = 1000; generatorSupplier.SupplyRampTolerance = 1000; - batterySys.SetCharge(apcEnt, 0, apcBattery); + batterySys.SetCharge((apcEnt, apcBattery), 0); }); server.RunTicks(5); //let run a few ticks for PowerNets to reevaluate and start charging apc @@ -1314,8 +1314,8 @@ namespace Content.IntegrationTests.Tests.Power extensionCableSystem.SetProviderTransferRange(apcExtensionEnt, range); extensionCableSystem.SetReceiverReceptionRange(powerReceiverEnt, range); - batterySys.SetMaxCharge(apcEnt, 10000, battery); //arbitrary nonzero amount of charge - batterySys.SetCharge(apcEnt, battery.MaxCharge, battery); //fill battery + batterySys.SetMaxCharge((apcEnt, battery), 10000); //arbitrary nonzero amount of charge + batterySys.SetCharge((apcEnt, battery), battery.MaxCharge); //fill battery receiver.Load = 1; //arbitrary small amount of power }); diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs b/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs index 41228b5ac8..4f96a25a5c 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs @@ -169,7 +169,7 @@ public sealed partial class AdminVerbSystem Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/fill_battery.png")), Act = () => { - _batterySystem.SetCharge(args.Target, battery.MaxCharge, battery); + _batterySystem.SetCharge((args.Target, battery), battery.MaxCharge); }, Impact = LogImpact.Medium, Message = Loc.GetString("admin-trick-refill-battery-description"), @@ -184,7 +184,7 @@ public sealed partial class AdminVerbSystem Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/drain_battery.png")), Act = () => { - _batterySystem.SetCharge(args.Target, 0, battery); + _batterySystem.SetCharge((args.Target, battery), 0); }, Impact = LogImpact.Medium, Message = Loc.GetString("admin-trick-drain-battery-description"), @@ -200,9 +200,8 @@ public sealed partial class AdminVerbSystem Act = () => { var recharger = EnsureComp(args.Target); - recharger.AutoRecharge = true; recharger.AutoRechargeRate = battery.MaxCharge; // Instant refill. - recharger.AutoRechargePause = false; // No delay. + recharger.AutoRechargePauseTime = TimeSpan.Zero; // No delay. }, Impact = LogImpact.Medium, Message = Loc.GetString("admin-trick-infinite-battery-object-description"), @@ -553,7 +552,7 @@ public sealed partial class AdminVerbSystem if (!HasComp(ent)) continue; var battery = EnsureComp(ent); - _batterySystem.SetCharge(ent, battery.MaxCharge, battery); + _batterySystem.SetCharge((ent, battery), battery.MaxCharge); } }, Impact = LogImpact.Extreme, @@ -574,7 +573,7 @@ public sealed partial class AdminVerbSystem if (!HasComp(ent)) continue; var battery = EnsureComp(ent); - _batterySystem.SetCharge(ent, 0, battery); + _batterySystem.SetCharge((ent, battery), 0); } }, Impact = LogImpact.Extreme, @@ -599,9 +598,8 @@ public sealed partial class AdminVerbSystem var recharger = EnsureComp(ent); var battery = EnsureComp(ent); - recharger.AutoRecharge = true; recharger.AutoRechargeRate = battery.MaxCharge; // Instant refill. - recharger.AutoRechargePause = false; // No delay. + recharger.AutoRechargePauseTime = TimeSpan.Zero; // No delay. } }, Impact = LogImpact.Extreme, diff --git a/Content.Server/Light/EntitySystems/EmergencyLightSystem.cs b/Content.Server/Light/EntitySystems/EmergencyLightSystem.cs index 0aea245c79..eddef87853 100644 --- a/Content.Server/Light/EntitySystems/EmergencyLightSystem.cs +++ b/Content.Server/Light/EntitySystems/EmergencyLightSystem.cs @@ -145,7 +145,7 @@ public sealed class EmergencyLightSystem : SharedEmergencyLightSystem { if (entity.Comp.State == EmergencyLightState.On) { - if (!_battery.TryUseCharge(entity.Owner, entity.Comp.Wattage * frameTime, battery)) + if (!_battery.TryUseCharge((entity.Owner, battery), entity.Comp.Wattage * frameTime)) { SetState(entity.Owner, entity.Comp, EmergencyLightState.Empty); TurnOff(entity); @@ -153,8 +153,8 @@ public sealed class EmergencyLightSystem : SharedEmergencyLightSystem } else { - _battery.SetCharge(entity.Owner, battery.CurrentCharge + entity.Comp.ChargingWattage * frameTime * entity.Comp.ChargingEfficiency, battery); - if (_battery.IsFull(entity, battery)) + _battery.SetCharge((entity.Owner, battery), battery.CurrentCharge + entity.Comp.ChargingWattage * frameTime * entity.Comp.ChargingEfficiency); + if (_battery.IsFull((entity.Owner, battery))) { if (TryComp(entity.Owner, out var receiver)) { diff --git a/Content.Server/Light/EntitySystems/HandheldLightSystem.cs b/Content.Server/Light/EntitySystems/HandheldLightSystem.cs index 2c8d18539f..7167aa4963 100644 --- a/Content.Server/Light/EntitySystems/HandheldLightSystem.cs +++ b/Content.Server/Light/EntitySystems/HandheldLightSystem.cs @@ -253,7 +253,7 @@ namespace Content.Server.Light.EntitySystems _appearance.SetData(uid, HandheldLightVisuals.Power, HandheldLightPowerStates.Dying, appearanceComponent); } - if (component.Activated && !_battery.TryUseCharge(batteryUid.Value, component.Wattage * frameTime, battery)) + if (component.Activated && !_battery.TryUseCharge((batteryUid.Value, battery), component.Wattage * frameTime)) TurnOff(uid, false); UpdateLevel(uid); diff --git a/Content.Server/Mech/Systems/MechSystem.cs b/Content.Server/Mech/Systems/MechSystem.cs index 923c701868..89297a6e86 100644 --- a/Content.Server/Mech/Systems/MechSystem.cs +++ b/Content.Server/Mech/Systems/MechSystem.cs @@ -340,7 +340,7 @@ public sealed partial class MechSystem : SharedMechSystem if (!TryComp(battery, out var batteryComp)) return false; - _battery.SetCharge(battery!.Value, batteryComp.CurrentCharge + delta.Float(), batteryComp); + _battery.SetCharge((battery.Value, batteryComp), batteryComp.CurrentCharge + delta.Float()); if (batteryComp.CurrentCharge != component.Energy) //if there's a discrepency, we have to resync them { Log.Debug($"Battery charge was not equal to mech charge. Battery {batteryComp.CurrentCharge}. Mech {component.Energy}"); diff --git a/Content.Server/Ninja/Systems/BatteryDrainerSystem.cs b/Content.Server/Ninja/Systems/BatteryDrainerSystem.cs index e563386608..7b9d229d73 100644 --- a/Content.Server/Ninja/Systems/BatteryDrainerSystem.cs +++ b/Content.Server/Ninja/Systems/BatteryDrainerSystem.cs @@ -95,17 +95,17 @@ public sealed class BatteryDrainerSystem : SharedBatteryDrainerSystem // higher tier storages can charge more var maxDrained = pnb.MaxSupply * comp.DrainTime; var input = Math.Min(Math.Min(available, required / comp.DrainEfficiency), maxDrained); - if (!_battery.TryUseCharge(target, input, targetBattery)) + if (!_battery.TryUseCharge((target, targetBattery), input)) return false; var output = input * comp.DrainEfficiency; - _battery.SetCharge(comp.BatteryUid.Value, battery.CurrentCharge + output, battery); + _battery.SetCharge((comp.BatteryUid.Value, battery), battery.CurrentCharge + output); // TODO: create effect message or something Spawn("EffectSparks", Transform(target).Coordinates); _audio.PlayPvs(comp.SparkSound, target); _popup.PopupEntity(Loc.GetString("battery-drainer-success", ("battery", target)), uid, uid); // repeat the doafter until battery is full - return !_battery.IsFull(comp.BatteryUid.Value, battery); + return !_battery.IsFull((comp.BatteryUid.Value, battery)); } } diff --git a/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs b/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs index ff88926723..fd7f908738 100644 --- a/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs +++ b/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs @@ -106,7 +106,7 @@ public sealed class SpaceNinjaSystem : SharedSpaceNinjaSystem /// public override bool TryUseCharge(EntityUid user, float charge) { - return GetNinjaBattery(user, out var uid, out var battery) && _battery.TryUseCharge(uid.Value, charge, battery); + return GetNinjaBattery(user, out var uid, out var battery) && _battery.TryUseCharge((uid.Value, battery), charge); } /// diff --git a/Content.Server/Power/Components/BatterySelfRechargerComponent.cs b/Content.Server/Power/Components/BatterySelfRechargerComponent.cs deleted file mode 100644 index 1cb92d9cd6..0000000000 --- a/Content.Server/Power/Components/BatterySelfRechargerComponent.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; - -namespace Content.Server.Power.Components -{ - /// - /// Self-recharging battery. - /// - [RegisterComponent] - public sealed partial class BatterySelfRechargerComponent : Component - { - /// - /// Does the entity auto recharge? - /// - [DataField] public bool AutoRecharge; - - /// - /// At what rate does the entity automatically recharge? - /// - [DataField] public float AutoRechargeRate; - - /// - /// Should this entity stop automatically recharging if a charge is used? - /// - [DataField] public bool AutoRechargePause = false; - - /// - /// How long should the entity stop automatically recharging if a charge is used? - /// - [DataField] public float AutoRechargePauseTime = 0f; - - /// - /// Do not auto recharge if this timestamp has yet to happen, set for the auto recharge pause system. - /// - [DataField] public TimeSpan NextAutoRecharge = TimeSpan.FromSeconds(0f); - } -} diff --git a/Content.Server/Power/EntitySystems/BatterySystem.API.cs b/Content.Server/Power/EntitySystems/BatterySystem.API.cs new file mode 100644 index 0000000000..6ddf1f4bbc --- /dev/null +++ b/Content.Server/Power/EntitySystems/BatterySystem.API.cs @@ -0,0 +1,104 @@ +using Content.Shared.Power; +using Content.Shared.Power.Components; + +namespace Content.Server.Power.EntitySystems; + +public sealed partial class BatterySystem +{ + public override float ChangeCharge(Entity ent, float amount) + { + if (!Resolve(ent, ref ent.Comp)) + return 0; + + var newValue = Math.Clamp(ent.Comp.CurrentCharge + amount, 0, ent.Comp.MaxCharge); + var delta = newValue - ent.Comp.CurrentCharge; + ent.Comp.CurrentCharge = newValue; + + TrySetChargeCooldown(ent.Owner); + + var ev = new ChargeChangedEvent(ent.Comp.CurrentCharge, ent.Comp.MaxCharge); + RaiseLocalEvent(ent, ref ev); + return delta; + } + + public override float UseCharge(Entity ent, float amount) + { + if (amount <= 0 || !Resolve(ent, ref ent.Comp) || ent.Comp.CurrentCharge == 0) + return 0; + + return ChangeCharge(ent, -amount); + } + + public override bool TryUseCharge(Entity ent, float amount) + { + if (!Resolve(ent, ref ent.Comp, false) || amount > ent.Comp.CurrentCharge) + return false; + + UseCharge(ent, amount); + return true; + } + + public override void SetCharge(Entity ent, float value) + { + if (!Resolve(ent, ref ent.Comp)) + return; + + var oldCharge = ent.Comp.CurrentCharge; + ent.Comp.CurrentCharge = MathHelper.Clamp(value, 0, ent.Comp.MaxCharge); + if (MathHelper.CloseTo(ent.Comp.CurrentCharge, oldCharge) && + !(oldCharge != ent.Comp.CurrentCharge && ent.Comp.CurrentCharge == ent.Comp.MaxCharge)) + { + return; + } + + var ev = new ChargeChangedEvent(ent.Comp.CurrentCharge, ent.Comp.MaxCharge); + RaiseLocalEvent(ent, ref ev); + } + public override void SetMaxCharge(Entity ent, float value) + { + if (!Resolve(ent, ref ent.Comp)) + return; + + var old = ent.Comp.MaxCharge; + ent.Comp.MaxCharge = Math.Max(value, 0); + ent.Comp.CurrentCharge = Math.Min(ent.Comp.CurrentCharge, ent.Comp.MaxCharge); + if (MathHelper.CloseTo(ent.Comp.MaxCharge, old)) + return; + + var ev = new ChargeChangedEvent(ent.Comp.CurrentCharge, ent.Comp.MaxCharge); + RaiseLocalEvent(ent, ref ev); + } + + public override void TrySetChargeCooldown(Entity ent) + { + if (!Resolve(ent, ref ent.Comp, false)) + return; + + if (ent.Comp.AutoRechargePauseTime == TimeSpan.Zero) + return; // no recharge pause + + if (_timing.CurTime + ent.Comp.AutoRechargePauseTime <= ent.Comp.NextAutoRecharge) + return; // the current pause is already longer + + SetChargeCooldown(ent, ent.Comp.AutoRechargePauseTime); + } + + public override void SetChargeCooldown(Entity ent, TimeSpan cooldown) + { + if (!Resolve(ent, ref ent.Comp)) + return; + + ent.Comp.NextAutoRecharge = _timing.CurTime + cooldown; + } + + /// + /// Returns whether the battery is full. + /// + public bool IsFull(Entity ent) + { + if (!Resolve(ent, ref ent.Comp)) + return false; + + return ent.Comp.CurrentCharge >= ent.Comp.MaxCharge; + } +} diff --git a/Content.Server/Power/EntitySystems/BatterySystem.cs b/Content.Server/Power/EntitySystems/BatterySystem.cs index c49a2f0f6b..4b6a52c0f1 100644 --- a/Content.Server/Power/EntitySystems/BatterySystem.cs +++ b/Content.Server/Power/EntitySystems/BatterySystem.cs @@ -9,232 +9,115 @@ using JetBrains.Annotations; using Robust.Shared.Utility; using Robust.Shared.Timing; -namespace Content.Server.Power.EntitySystems +namespace Content.Server.Power.EntitySystems; + +[UsedImplicitly] +public sealed partial class BatterySystem : SharedBatterySystem { - [UsedImplicitly] - public sealed class BatterySystem : SharedBatterySystem + [Dependency] private readonly IGameTiming _timing = default!; + + public override void Initialize() { - [Dependency] private readonly IGameTiming _timing = default!; + base.Initialize(); - public override void Initialize() + SubscribeLocalEvent(OnExamine); + SubscribeLocalEvent(OnBatteryRejuvenate); + SubscribeLocalEvent(OnNetBatteryRejuvenate); + SubscribeLocalEvent(CalculateBatteryPrice); + SubscribeLocalEvent(OnChangeCharge); + SubscribeLocalEvent(OnGetCharge); + + SubscribeLocalEvent(PreSync); + SubscribeLocalEvent(PostSync); + } + + private void OnNetBatteryRejuvenate(Entity ent, ref RejuvenateEvent args) + { + ent.Comp.NetworkBattery.CurrentStorage = ent.Comp.NetworkBattery.Capacity; + } + + private void OnBatteryRejuvenate(Entity ent, ref RejuvenateEvent args) + { + SetCharge(ent.AsNullable(), ent.Comp.MaxCharge); + } + + private void OnExamine(Entity ent, ref ExaminedEvent args) + { + if (!args.IsInDetailsRange) + return; + + if (!TryComp(ent, out var battery)) + return; + + var chargePercentRounded = 0; + if (battery.MaxCharge != 0) + chargePercentRounded = (int)(100 * battery.CurrentCharge / battery.MaxCharge); + args.PushMarkup( + Loc.GetString( + "examinable-battery-component-examine-detail", + ("percent", chargePercentRounded), + ("markupPercentColor", "green") + ) + ); + } + + private void PreSync(NetworkBatteryPreSync ev) + { + // Ignoring entity pausing. If the entity was paused, neither component's data should have been changed. + var enumerator = AllEntityQuery(); + while (enumerator.MoveNext(out var netBat, out var bat)) { - base.Initialize(); - - SubscribeLocalEvent(OnExamine); - SubscribeLocalEvent(OnNetBatteryRejuvenate); - SubscribeLocalEvent(OnBatteryRejuvenate); - SubscribeLocalEvent(CalculateBatteryPrice); - SubscribeLocalEvent(OnChangeCharge); - SubscribeLocalEvent(OnGetCharge); - - SubscribeLocalEvent(PreSync); - SubscribeLocalEvent(PostSync); + DebugTools.Assert(bat.CurrentCharge <= bat.MaxCharge && bat.CurrentCharge >= 0); + netBat.NetworkBattery.Capacity = bat.MaxCharge; + netBat.NetworkBattery.CurrentStorage = bat.CurrentCharge; } + } - private void OnNetBatteryRejuvenate(EntityUid uid, PowerNetworkBatteryComponent component, RejuvenateEvent args) + private void PostSync(NetworkBatteryPostSync ev) + { + // Ignoring entity pausing. If the entity was paused, neither component's data should have been changed. + var enumerator = AllEntityQuery(); + while (enumerator.MoveNext(out var uid, out var netBat, out var bat)) { - component.NetworkBattery.CurrentStorage = component.NetworkBattery.Capacity; + SetCharge((uid, bat), netBat.NetworkBattery.CurrentStorage); } + } - private void OnBatteryRejuvenate(EntityUid uid, BatteryComponent component, RejuvenateEvent args) + /// + /// Gets the price for the power contained in an entity's battery. + /// + private void CalculateBatteryPrice(Entity ent, ref PriceCalculationEvent args) + { + args.Price += ent.Comp.CurrentCharge * ent.Comp.PricePerJoule; + } + + private void OnChangeCharge(Entity ent, ref ChangeChargeEvent args) + { + if (args.ResidualValue == 0) + return; + + args.ResidualValue -= ChangeCharge(ent.AsNullable(), args.ResidualValue); + } + + private void OnGetCharge(Entity entity, ref GetChargeEvent args) + { + args.CurrentCharge += entity.Comp.CurrentCharge; + args.MaxCharge += entity.Comp.MaxCharge; + } + + public override void Update(float frameTime) + { + var query = EntityQueryEnumerator(); + var curTime = _timing.CurTime; + while (query.MoveNext(out var uid, out var comp, out var bat)) { - SetCharge(uid, component.MaxCharge, component); - } + if (!comp.AutoRecharge || IsFull((uid, bat))) + continue; - private void OnExamine(EntityUid uid, ExaminableBatteryComponent component, ExaminedEvent args) - { - if (!TryComp(uid, out var batteryComponent)) - return; - if (args.IsInDetailsRange) - { - var effectiveMax = batteryComponent.MaxCharge; - if (effectiveMax == 0) - effectiveMax = 1; - var chargeFraction = batteryComponent.CurrentCharge / effectiveMax; - var chargePercentRounded = (int)(chargeFraction * 100); - args.PushMarkup( - Loc.GetString( - "examinable-battery-component-examine-detail", - ("percent", chargePercentRounded), - ("markupPercentColor", "green") - ) - ); - } - } + if (comp.NextAutoRecharge > curTime) + continue; - private void PreSync(NetworkBatteryPreSync ev) - { - // Ignoring entity pausing. If the entity was paused, neither component's data should have been changed. - var enumerator = AllEntityQuery(); - while (enumerator.MoveNext(out var netBat, out var bat)) - { - DebugTools.Assert(bat.CurrentCharge <= bat.MaxCharge && bat.CurrentCharge >= 0); - netBat.NetworkBattery.Capacity = bat.MaxCharge; - netBat.NetworkBattery.CurrentStorage = bat.CurrentCharge; - } - } - - private void PostSync(NetworkBatteryPostSync ev) - { - // Ignoring entity pausing. If the entity was paused, neither component's data should have been changed. - var enumerator = AllEntityQuery(); - while (enumerator.MoveNext(out var uid, out var netBat, out var bat)) - { - SetCharge(uid, netBat.NetworkBattery.CurrentStorage, bat); - } - } - - public override void Update(float frameTime) - { - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var comp, out var batt)) - { - if (!comp.AutoRecharge || IsFull(uid, batt)) - continue; - - if (comp.AutoRechargePause) - { - if (comp.NextAutoRecharge > _timing.CurTime) - continue; - } - - SetCharge(uid, batt.CurrentCharge + comp.AutoRechargeRate * frameTime, batt); - } - } - - /// - /// Gets the price for the power contained in an entity's battery. - /// - private void CalculateBatteryPrice(EntityUid uid, BatteryComponent component, ref PriceCalculationEvent args) - { - args.Price += component.CurrentCharge * component.PricePerJoule; - } - private void OnChangeCharge(Entity entity, ref ChangeChargeEvent args) - { - if (args.ResidualValue == 0) - return; - - args.ResidualValue -= ChangeCharge(entity, args.ResidualValue); - } - - private void OnGetCharge(Entity entity, ref GetChargeEvent args) - { - args.CurrentCharge += entity.Comp.CurrentCharge; - args.MaxCharge += entity.Comp.MaxCharge; - } - - public override float UseCharge(EntityUid uid, float value, BatteryComponent? battery = null) - { - if (value <= 0 || !Resolve(uid, ref battery) || battery.CurrentCharge == 0) - return 0; - - return ChangeCharge(uid, -value, battery); - } - - public override void SetMaxCharge(EntityUid uid, float value, BatteryComponent? battery = null) - { - if (!Resolve(uid, ref battery)) - return; - - var old = battery.MaxCharge; - battery.MaxCharge = Math.Max(value, 0); - battery.CurrentCharge = Math.Min(battery.CurrentCharge, battery.MaxCharge); - if (MathHelper.CloseTo(battery.MaxCharge, old)) - return; - - var ev = new ChargeChangedEvent(battery.CurrentCharge, battery.MaxCharge); - RaiseLocalEvent(uid, ref ev); - } - - public void SetCharge(EntityUid uid, float value, BatteryComponent? battery = null) - { - if (!Resolve(uid, ref battery)) - return; - - var old = battery.CurrentCharge; - battery.CurrentCharge = MathHelper.Clamp(value, 0, battery.MaxCharge); - if (MathHelper.CloseTo(battery.CurrentCharge, old) && - !(old != battery.CurrentCharge && battery.CurrentCharge == battery.MaxCharge)) - { - return; - } - - var ev = new ChargeChangedEvent(battery.CurrentCharge, battery.MaxCharge); - RaiseLocalEvent(uid, ref ev); - } - - /// - /// Changes the current battery charge by some value - /// - public override float ChangeCharge(EntityUid uid, float value, BatteryComponent? battery = null) - { - if (!Resolve(uid, ref battery)) - return 0; - - var newValue = Math.Clamp(battery.CurrentCharge + value, 0, battery.MaxCharge); - var delta = newValue - battery.CurrentCharge; - battery.CurrentCharge = newValue; - - TrySetChargeCooldown(uid); - - var ev = new ChargeChangedEvent(battery.CurrentCharge, battery.MaxCharge); - RaiseLocalEvent(uid, ref ev); - return delta; - } - - public override void TrySetChargeCooldown(EntityUid uid, float value = -1) - { - if (!TryComp(uid, out var batteryself)) - return; - - if (!batteryself.AutoRechargePause) - return; - - // If no answer or a negative is given for value, use the default from AutoRechargePauseTime. - if (value < 0) - value = batteryself.AutoRechargePauseTime; - - if (_timing.CurTime + TimeSpan.FromSeconds(value) <= batteryself.NextAutoRecharge) - return; - - SetChargeCooldown(uid, batteryself.AutoRechargePauseTime, batteryself); - } - - /// - /// Puts the entity's self recharge on cooldown for the specified time. - /// - public void SetChargeCooldown(EntityUid uid, float value, BatterySelfRechargerComponent? batteryself = null) - { - if (!Resolve(uid, ref batteryself)) - return; - - if (value >= 0) - batteryself.NextAutoRecharge = _timing.CurTime + TimeSpan.FromSeconds(value); - else - batteryself.NextAutoRecharge = _timing.CurTime; - } - - /// - /// If sufficient charge is available on the battery, use it. Otherwise, don't. - /// - public override bool TryUseCharge(EntityUid uid, float value, BatteryComponent? battery = null) - { - if (!Resolve(uid, ref battery, false) || value > battery.CurrentCharge) - return false; - - UseCharge(uid, value, battery); - return true; - } - - /// - /// Returns whether the battery is full. - /// - public bool IsFull(EntityUid uid, BatteryComponent? battery = null) - { - if (!Resolve(uid, ref battery)) - return false; - - return battery.CurrentCharge >= battery.MaxCharge; + SetCharge((uid, bat), bat.CurrentCharge + comp.AutoRechargeRate * frameTime); } } } diff --git a/Content.Server/Power/EntitySystems/ChargerSystem.cs b/Content.Server/Power/EntitySystems/ChargerSystem.cs index e8dc9e9962..d523de65db 100644 --- a/Content.Server/Power/EntitySystems/ChargerSystem.cs +++ b/Content.Server/Power/EntitySystems/ChargerSystem.cs @@ -221,7 +221,7 @@ public sealed class ChargerSystem : SharedChargerSystem if (!SearchForBattery(container.ContainedEntities[0], out var heldEnt, out var heldBattery)) return CellChargerStatus.Off; - if (_battery.IsFull(heldEnt.Value, heldBattery)) + if (_battery.IsFull((heldEnt.Value, heldBattery))) return CellChargerStatus.Charged; return CellChargerStatus.Charging; @@ -241,7 +241,7 @@ public sealed class ChargerSystem : SharedChargerSystem if (!SearchForBattery(targetEntity, out var batteryUid, out var heldBattery)) return; - _battery.SetCharge(batteryUid.Value, heldBattery.CurrentCharge + component.ChargeRate * frameTime, heldBattery); + _battery.SetCharge((batteryUid.Value, heldBattery), heldBattery.CurrentCharge + component.ChargeRate * frameTime); UpdateStatus(uid, component); } diff --git a/Content.Server/Power/EntitySystems/PowerNetSystem.cs b/Content.Server/Power/EntitySystems/PowerNetSystem.cs index 6a69550fcf..5b6b922ddf 100644 --- a/Content.Server/Power/EntitySystems/PowerNetSystem.cs +++ b/Content.Server/Power/EntitySystems/PowerNetSystem.cs @@ -358,13 +358,13 @@ namespace Content.Server.Power.EntitySystems if (requireBattery) { - _battery.SetCharge(uid, battery.CurrentCharge - apcBattery.IdleLoad * frameTime, battery); + _battery.SetCharge((uid, battery), battery.CurrentCharge - apcBattery.IdleLoad * frameTime); } // Otherwise try to charge the battery - else if (powered && !_battery.IsFull(uid, battery)) + else if (powered && !_battery.IsFull((uid, battery))) { apcReceiver.Load += apcBattery.BatteryRechargeRate * apcBattery.BatteryRechargeEfficiency; - _battery.SetCharge(uid, battery.CurrentCharge + apcBattery.BatteryRechargeRate * frameTime, battery); + _battery.SetCharge((uid, battery), battery.CurrentCharge + apcBattery.BatteryRechargeRate * frameTime); } // Enable / disable the battery if the state changed diff --git a/Content.Server/Power/SetBatteryPercentCommand.cs b/Content.Server/Power/SetBatteryPercentCommand.cs index 03d6d30f8a..a6123382fd 100644 --- a/Content.Server/Power/SetBatteryPercentCommand.cs +++ b/Content.Server/Power/SetBatteryPercentCommand.cs @@ -40,7 +40,7 @@ namespace Content.Server.Power shell.WriteLine(Loc.GetString($"cmd-setbatterypercent-battery-not-found", ("id", id))); return; } - _batterySystem.SetCharge(id.Value, battery.MaxCharge * percent / 100, battery); + _batterySystem.SetCharge((id.Value, battery), battery.MaxCharge * percent / 100); // Don't acknowledge b/c people WILL forall this } } diff --git a/Content.Server/PowerCell/PowerCellSystem.Draw.cs b/Content.Server/PowerCell/PowerCellSystem.Draw.cs index 40e54ba13a..d0dafb1ef6 100644 --- a/Content.Server/PowerCell/PowerCellSystem.Draw.cs +++ b/Content.Server/PowerCell/PowerCellSystem.Draw.cs @@ -28,7 +28,7 @@ public sealed partial class PowerCellSystem if (!TryGetBatteryFromSlot(uid, out var batteryEnt, out var battery, slot)) continue; - if (_battery.TryUseCharge(batteryEnt.Value, comp.DrawRate * (float)comp.Delay.TotalSeconds, battery)) + if (_battery.TryUseCharge((batteryEnt.Value, battery), comp.DrawRate * (float)comp.Delay.TotalSeconds)) continue; var ev = new PowerCellSlotEmptyEvent(); diff --git a/Content.Server/PowerCell/PowerCellSystem.cs b/Content.Server/PowerCell/PowerCellSystem.cs index 6c00cdd300..f358e1bc34 100644 --- a/Content.Server/PowerCell/PowerCellSystem.cs +++ b/Content.Server/PowerCell/PowerCellSystem.cs @@ -174,7 +174,7 @@ public sealed partial class PowerCellSystem : SharedPowerCellSystem return false; } - if (!_battery.TryUseCharge(batteryEnt.Value, charge, battery)) + if (!_battery.TryUseCharge((batteryEnt.Value, battery), charge)) { if (user != null) _popup.PopupEntity(Loc.GetString("power-cell-insufficient"), uid, user.Value); diff --git a/Content.Server/PowerSink/PowerSinkSystem.cs b/Content.Server/PowerSink/PowerSinkSystem.cs index d1071d3e38..328bff89f4 100644 --- a/Content.Server/PowerSink/PowerSinkSystem.cs +++ b/Content.Server/PowerSink/PowerSinkSystem.cs @@ -66,7 +66,7 @@ namespace Content.Server.PowerSink if (!transform.Anchored) continue; - _battery.ChangeCharge(entity, networkLoad.NetworkLoad.ReceivingPower * frameTime, battery); + _battery.ChangeCharge((entity, battery), networkLoad.NetworkLoad.ReceivingPower * frameTime); var currentBatteryThreshold = battery.CurrentCharge / battery.MaxCharge; diff --git a/Content.Server/Radio/EntitySystems/JammerSystem.cs b/Content.Server/Radio/EntitySystems/JammerSystem.cs index 02c9c64c6e..3ec2e9c38c 100644 --- a/Content.Server/Radio/EntitySystems/JammerSystem.cs +++ b/Content.Server/Radio/EntitySystems/JammerSystem.cs @@ -34,7 +34,7 @@ public sealed class JammerSystem : SharedJammerSystem if (_powerCell.TryGetBatteryFromSlot(uid, out var batteryUid, out var battery)) { - if (!_battery.TryUseCharge(batteryUid.Value, GetCurrentWattage((uid, jam)) * frameTime, battery)) + if (!_battery.TryUseCharge((batteryUid.Value, battery), GetCurrentWattage((uid, jam)) * frameTime)) { ChangeLEDState(uid, false); RemComp(uid); diff --git a/Content.Server/Silicons/StationAi/StationAiSystem.cs b/Content.Server/Silicons/StationAi/StationAiSystem.cs index a9198d5816..0045b921e5 100644 --- a/Content.Server/Silicons/StationAi/StationAiSystem.cs +++ b/Content.Server/Silicons/StationAi/StationAiSystem.cs @@ -125,7 +125,7 @@ public sealed class StationAiSystem : SharedStationAiSystem // into an AI core that has a full battery and full integrity. if (TryComp(ent, out var battery)) { - _battery.SetCharge(ent, battery.MaxCharge); + _battery.SetCharge((ent, battery), battery.MaxCharge); } _damageable.ClearAllDamage(ent.Owner); diff --git a/Content.Server/Stunnable/Systems/StunbatonSystem.cs b/Content.Server/Stunnable/Systems/StunbatonSystem.cs index 7f8aa37036..a22a4c09fa 100644 --- a/Content.Server/Stunnable/Systems/StunbatonSystem.cs +++ b/Content.Server/Stunnable/Systems/StunbatonSystem.cs @@ -33,7 +33,7 @@ namespace Content.Server.Stunnable.Systems private void OnStaminaHitAttempt(Entity entity, ref StaminaDamageOnHitAttemptEvent args) { if (!_itemToggle.IsActivated(entity.Owner) || - !TryComp(entity.Owner, out var battery) || !_battery.TryUseCharge(entity.Owner, entity.Comp.EnergyPerUse, battery)) + !TryComp(entity.Owner, out var battery) || !_battery.TryUseCharge((entity.Owner, battery), entity.Comp.EnergyPerUse)) { args.Cancelled = true; } diff --git a/Content.Server/Tesla/EntitySystem/TeslaCoilSystem.cs b/Content.Server/Tesla/EntitySystem/TeslaCoilSystem.cs index f3cae90b40..988ade86ce 100644 --- a/Content.Server/Tesla/EntitySystem/TeslaCoilSystem.cs +++ b/Content.Server/Tesla/EntitySystem/TeslaCoilSystem.cs @@ -24,7 +24,7 @@ public sealed class TeslaCoilSystem : EntitySystem { if (TryComp(coil, out var batteryComponent)) { - _battery.SetCharge(coil, batteryComponent.CurrentCharge + coil.Comp.ChargeFromLightning); + _battery.SetCharge((coil, batteryComponent), batteryComponent.CurrentCharge + coil.Comp.ChargeFromLightning); } } } diff --git a/Content.Server/Weapons/Ranged/Systems/GunSystem.Battery.cs b/Content.Server/Weapons/Ranged/Systems/GunSystem.Battery.cs index 700a15e1b0..c1e442c24b 100644 --- a/Content.Server/Weapons/Ranged/Systems/GunSystem.Battery.cs +++ b/Content.Server/Weapons/Ranged/Systems/GunSystem.Battery.cs @@ -68,6 +68,7 @@ public sealed partial class GunSystem protected override void TakeCharge(Entity entity) { + // Take charge from either the BatteryComponent or PowerCellSlotComponent. var ev = new ChangeChargeEvent(-entity.Comp.FireCost); RaiseLocalEvent(entity, ref ev); } diff --git a/Content.Server/Xenoarchaeology/Artifact/XAE/XAEChargeBatterySystem.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/XAEChargeBatterySystem.cs index 85ffc75627..21952912d7 100644 --- a/Content.Server/Xenoarchaeology/Artifact/XAE/XAEChargeBatterySystem.cs +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/XAEChargeBatterySystem.cs @@ -25,7 +25,7 @@ public sealed class XAEChargeBatterySystem : BaseXAESystem @@ -7,27 +10,36 @@ namespace Content.Shared.Power; public readonly record struct ChargeChangedEvent(float Charge, float MaxCharge); /// +/// Event that supports multiple battery types. /// Raised when it is necessary to get information about battery charges. +/// Works with either or . +/// If there are multiple batteries then the results will be summed up. /// [ByRefEvent] -public sealed class GetChargeEvent : EntityEventArgs +public record struct GetChargeEvent { public float CurrentCharge; public float MaxCharge; } /// -/// Raised when it is necessary to change the current battery charge to a some value. +/// Method event that supports multiple battery types. +/// Raised when it is necessary to change the current battery charge by some value. +/// Works with either or . +/// If there are multiple batteries then they will be changed in order of subscription until the total value was reached. /// [ByRefEvent] -public sealed class ChangeChargeEvent : EntityEventArgs +public record struct ChangeChargeEvent(float Amount) { - public float OriginalValue; - public float ResidualValue; + /// + /// The total amount of charge to change the battery's storage by (in joule). + /// A positive value adds charge, a negative value removes charge. + /// + public readonly float Amount = Amount; - public ChangeChargeEvent(float value) - { - OriginalValue = value; - ResidualValue = value; - } + /// + /// The amount of charge that still has to be removed. + /// For cases where there are multiple batteries. + /// + public float ResidualValue = Amount; } diff --git a/Content.Shared/Power/Components/BatteryComponent.cs b/Content.Shared/Power/Components/BatteryComponent.cs index 6a2d2a5051..6a65405115 100644 --- a/Content.Shared/Power/Components/BatteryComponent.cs +++ b/Content.Shared/Power/Components/BatteryComponent.cs @@ -11,10 +11,8 @@ namespace Content.Shared.Power.Components; [Access(typeof(SharedBatterySystem))] public partial class BatteryComponent : Component { - public string SolutionName = "battery"; - /// - /// Maximum charge of the battery in joules (ie. watt seconds) + /// Maximum charge of the battery in joules (i.e. watt seconds) /// [DataField] [GuidebookData] @@ -23,11 +21,11 @@ public partial class BatteryComponent : Component /// /// Current charge of the battery in joules (ie. watt seconds) /// - [DataField("startingCharge")] + [DataField("startingCharge")] // TODO: rename this datafield to currentCharge public float CurrentCharge; /// - /// The price per one joule. Default is 1 credit for 10kJ. + /// The price per one joule. Default is 1 speso for 10kJ. /// [DataField] public float PricePerJoule = 0.0001f; diff --git a/Content.Shared/Power/Components/BatterySelfRechargerComponent.cs b/Content.Shared/Power/Components/BatterySelfRechargerComponent.cs new file mode 100644 index 0000000000..3881980382 --- /dev/null +++ b/Content.Shared/Power/Components/BatterySelfRechargerComponent.cs @@ -0,0 +1,36 @@ +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; + +namespace Content.Shared.Power.Components; + +/// +/// Self-recharging battery. +/// To be used in combination with . +/// +[RegisterComponent, AutoGenerateComponentPause] +public sealed partial class BatterySelfRechargerComponent : Component +{ + /// + /// Is the component currently enabled? + /// + [DataField] + public bool AutoRecharge = true; + + /// + /// At what rate does the entity automatically recharge? + /// + [DataField] + public float AutoRechargeRate; + + /// + /// How long should the entity stop automatically recharging if charge is used? + /// + [DataField] + public TimeSpan AutoRechargePauseTime = TimeSpan.FromSeconds(0); + + /// + /// Do not auto recharge if this timestamp has yet to happen, set for the auto recharge pause system. + /// + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] + [AutoPausedField] + public TimeSpan NextAutoRecharge = TimeSpan.FromSeconds(0); +} diff --git a/Content.Shared/Power/EntitySystems/SharedBatterySystem.cs b/Content.Shared/Power/EntitySystems/SharedBatterySystem.cs index a9d5db3f33..d067a685d4 100644 --- a/Content.Shared/Power/EntitySystems/SharedBatterySystem.cs +++ b/Content.Shared/Power/EntitySystems/SharedBatterySystem.cs @@ -12,33 +12,61 @@ public abstract class SharedBatterySystem : EntitySystem SubscribeLocalEvent(OnEmpPulse); } - private void OnEmpPulse(Entity entity, ref EmpPulseEvent args) + private void OnEmpPulse(Entity ent, ref EmpPulseEvent args) { args.Affected = true; - UseCharge(entity, args.EnergyConsumption, entity.Comp); + UseCharge(ent.AsNullable(), args.EnergyConsumption); // Apply a cooldown to the entity's self recharge if needed to avoid it immediately self recharging after an EMP. - TrySetChargeCooldown(entity); + TrySetChargeCooldown(ent.Owner); } - public virtual float UseCharge(EntityUid uid, float value, BatteryComponent? battery = null) - { - return 0f; - } - - public virtual void SetMaxCharge(EntityUid uid, float value, BatteryComponent? battery = null) { } - - public virtual float ChangeCharge(EntityUid uid, float value, BatteryComponent? battery = null) + /// + /// Changes the battery's charge by the given amount. + /// A positive value will add charge, a negative value will remove charge. + /// + /// The actually changed amount. + public virtual float ChangeCharge(Entity ent, float amount) { return 0f; } /// - /// Checks if the entity has a self recharge and puts it on cooldown if applicable. + /// Removes the given amount of charge from the battery. /// - public virtual void TrySetChargeCooldown(EntityUid uid, float value = -1) { } + /// The actually changed amount. + public virtual float UseCharge(Entity ent, float amount) + { + return 0f; + } - public virtual bool TryUseCharge(EntityUid uid, float value, BatteryComponent? battery = null) + /// + /// If sufficient charge is available on the battery, use it. Otherwise, don't. + /// Always returns false on the client. + /// + /// If the full amount was able to be removed. + public virtual bool TryUseCharge(Entity ent, float amount) { return false; } + + /// + /// Sets the battery's charge. + /// + public virtual void SetCharge(Entity ent, float value) { } + + /// + /// Sets the battery's maximum charge. + /// + public virtual void SetMaxCharge(Entity ent, float value) { } + + /// + /// Checks if the entity has a self recharge and puts it on cooldown if applicable. + /// Uses the cooldown time given in the component. + /// + public virtual void TrySetChargeCooldown(Entity ent) { } + + /// + /// Puts the entity's self recharge on cooldown for the specified time. + /// + public virtual void SetChargeCooldown(Entity ent, TimeSpan cooldown) { } } diff --git a/Resources/Maps/Lavaland/grasslanddome.yml b/Resources/Maps/Lavaland/grasslanddome.yml index 800176593e..9d92c7b108 100644 --- a/Resources/Maps/Lavaland/grasslanddome.yml +++ b/Resources/Maps/Lavaland/grasslanddome.yml @@ -494,7 +494,6 @@ entities: parent: 1 - type: BatterySelfRecharger autoRechargeRate: 50000 - autoRecharge: True - proto: BasaltOne entities: - uid: 353 diff --git a/Resources/Maps/Lavaland/snowydome.yml b/Resources/Maps/Lavaland/snowydome.yml index d9c12c724b..6c2f55049d 100644 --- a/Resources/Maps/Lavaland/snowydome.yml +++ b/Resources/Maps/Lavaland/snowydome.yml @@ -363,7 +363,6 @@ entities: parent: 1 - type: BatterySelfRecharger autoRechargeRate: 50000 - autoRecharge: True - proto: AtmosFixFreezerMarker entities: - uid: 348 diff --git a/Resources/Maps/Misc/terminal.yml b/Resources/Maps/Misc/terminal.yml index 68897953f7..bb0491e9ce 100644 --- a/Resources/Maps/Misc/terminal.yml +++ b/Resources/Maps/Misc/terminal.yml @@ -1381,7 +1381,6 @@ entities: - type: Godmode - type: BatterySelfRecharger autoRechargeRate: 50000 - autoRecharge: True - type: Fixtures fixtures: {} missingComponents: @@ -1398,7 +1397,6 @@ entities: - type: Godmode - type: BatterySelfRecharger autoRechargeRate: 50000 - autoRecharge: True - type: Fixtures fixtures: {} missingComponents: @@ -1415,7 +1413,6 @@ entities: - type: Godmode - type: BatterySelfRecharger autoRechargeRate: 50000 - autoRecharge: True - type: Fixtures fixtures: {} missingComponents: @@ -1432,7 +1429,6 @@ entities: - type: Godmode - type: BatterySelfRecharger autoRechargeRate: 50000 - autoRecharge: True - type: Fixtures fixtures: {} missingComponents: @@ -1450,7 +1446,6 @@ entities: - type: Godmode - type: BatterySelfRecharger autoRechargeRate: 50000 - autoRecharge: True - type: Fixtures fixtures: {} missingComponents: @@ -1467,7 +1462,6 @@ entities: - type: Godmode - type: BatterySelfRecharger autoRechargeRate: 50000 - autoRecharge: True - type: Fixtures fixtures: {} missingComponents: diff --git a/Resources/Maps/Nonstations/wizardsden.yml b/Resources/Maps/Nonstations/wizardsden.yml index b08dac6b68..7846b2596b 100644 --- a/Resources/Maps/Nonstations/wizardsden.yml +++ b/Resources/Maps/Nonstations/wizardsden.yml @@ -504,7 +504,6 @@ entities: parent: 1 - type: BatterySelfRecharger autoRechargeRate: 200000 - autoRecharge: True - proto: BarberScissors entities: - uid: 649 diff --git a/Resources/Maps/Ruins/ruined_prison_ship.yml b/Resources/Maps/Ruins/ruined_prison_ship.yml index d953e10700..89ae5e5171 100644 --- a/Resources/Maps/Ruins/ruined_prison_ship.yml +++ b/Resources/Maps/Ruins/ruined_prison_ship.yml @@ -584,7 +584,6 @@ entities: parent: 2 - type: BatterySelfRecharger autoRechargeRate: 50000 - autoRecharge: True - uid: 362 components: - type: Transform diff --git a/Resources/Maps/Shuttles/arrivals.yml b/Resources/Maps/Shuttles/arrivals.yml index 3c853ef739..f419f26a1f 100644 --- a/Resources/Maps/Shuttles/arrivals.yml +++ b/Resources/Maps/Shuttles/arrivals.yml @@ -297,7 +297,6 @@ entities: parent: 292 - type: BatterySelfRecharger autoRechargeRate: 50000 - autoRecharge: True - type: Godmode missingComponents: - Construction diff --git a/Resources/Prototypes/Entities/Clothing/Head/base_clothinghead.yml b/Resources/Prototypes/Entities/Clothing/Head/base_clothinghead.yml index 53772f6215..3b85ce94c9 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/base_clothinghead.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/base_clothinghead.yml @@ -247,7 +247,6 @@ maxCharge: 600 #lights drain 3/s but recharge of 2 makes this 1/s. Therefore 600 is 10 minutes of light. startingCharge: 600 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 2 #recharge of 2 makes total drain 1w / s so max charge is 1:1 with time. Time to fully charge should be 5 minutes. Having recharge gives light an extended flicker period which gives you some warning to return to light area. - type: entity diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml index 5cc78d90b0..341404af2b 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml @@ -300,7 +300,6 @@ maxCharge: 600 startingCharge: 600 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 2 - type: Item size: Normal diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/behonker.yml b/Resources/Prototypes/Entities/Mobs/NPCs/behonker.yml index 8229b103e7..65cc71aaa8 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/behonker.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/behonker.yml @@ -26,7 +26,6 @@ maxCharge: 1000 startingCharge: 1000 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 40 - type: Gun fireRate: 0.75 diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/lavaland.yml b/Resources/Prototypes/Entities/Mobs/NPCs/lavaland.yml index 7d6c28fc95..b4add804ae 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/lavaland.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/lavaland.yml @@ -54,7 +54,6 @@ proto: WatcherBolt fireCost: 50 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 50 - type: Battery maxCharge: 1000 diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/living_light.yml b/Resources/Prototypes/Entities/Mobs/NPCs/living_light.yml index 4717e200dd..1531e348f7 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/living_light.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/living_light.yml @@ -175,7 +175,6 @@ maxCharge: 1000 startingCharge: 1000 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 50 - type: Gun fireRate: 0.3 diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/miscellaneous.yml b/Resources/Prototypes/Entities/Mobs/NPCs/miscellaneous.yml index 64fa4e2292..173c5ad165 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/miscellaneous.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/miscellaneous.yml @@ -51,7 +51,6 @@ proto: RedLightLaser fireCost: 50 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 50 - type: Battery maxCharge: 1000 diff --git a/Resources/Prototypes/Entities/Objects/Power/powercells.yml b/Resources/Prototypes/Entities/Objects/Power/powercells.yml index e4651a5875..4ce96419bf 100644 --- a/Resources/Prototypes/Entities/Objects/Power/powercells.yml +++ b/Resources/Prototypes/Entities/Objects/Power/powercells.yml @@ -98,9 +98,7 @@ description: A self rechargeable power cell, designed for fast recharge rate at the expense of capacity. components: - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 36 # 10 seconds to recharge - autoRechargePause: true autoRechargePauseTime: 30 - type: entity @@ -226,7 +224,6 @@ maxCharge: 720 startingCharge: 720 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 12 # takes 1 minute to charge itself back to full - type: entity @@ -262,7 +259,6 @@ maxCharge: 1200 startingCharge: 1200 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 40 # Power cage (big heavy power cell for big devices) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml index 8e2650b5fe..10181b54e7 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml @@ -664,7 +664,6 @@ proto: RedMediumLaser fireCost: 100 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 40 - type: MagazineVisuals magState: mag @@ -712,7 +711,6 @@ proto: RedMediumLaser fireCost: 100 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 30 - type: MagazineVisuals magState: mag @@ -808,7 +806,6 @@ proto: RedMediumLaser fireCost: 100 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 40 - type: StaticPrice price: 750 @@ -901,9 +898,7 @@ fireCost: 62.5 pacifismAllowedMode: true - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 48 - autoRechargePause: true autoRechargePauseTime: 10 - type: entity diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml index 80d71669a7..be57d5f0f9 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml @@ -124,6 +124,5 @@ maxCharge: 10000 startingCharge: 10000 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 25 - type: AmmoCounter diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml index ec3fa31297..ca40d1940d 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml @@ -135,7 +135,6 @@ maxCharge: 1000 startingCharge: 1000 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 25 - type: AmmoCounter diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml index 2ecaaec89e..15ddb7b38e 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml @@ -160,7 +160,6 @@ maxCharge: 3000 startingCharge: 3000 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 25 - type: AmmoCounter diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/pneumatic_cannon.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/pneumatic_cannon.yml index ec7e4b3e7f..6b8c4eebe1 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/pneumatic_cannon.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/pneumatic_cannon.yml @@ -132,7 +132,6 @@ maxCharge: 90 startingCharge: 90 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 1 - type: AmmoCounter - type: Item diff --git a/Resources/Prototypes/Entities/Structures/Power/debug_power.yml b/Resources/Prototypes/Entities/Structures/Power/debug_power.yml index a2e1c585fb..a9c3671c33 100644 --- a/Resources/Prototypes/Entities/Structures/Power/debug_power.yml +++ b/Resources/Prototypes/Entities/Structures/Power/debug_power.yml @@ -124,7 +124,6 @@ components: - type: BatterySelfRecharger autoRechargeRate: 50000 - autoRecharge: True - type: entity parent: BaseSubstation @@ -138,7 +137,6 @@ components: - type: BatterySelfRecharger autoRechargeRate: 50000 - autoRecharge: True - type: entity parent: BaseSubstationWall @@ -152,7 +150,6 @@ components: - type: BatterySelfRecharger autoRechargeRate: 50000 - autoRecharge: True - type: entity parent: BaseAPC @@ -166,7 +163,6 @@ components: - type: BatterySelfRecharger autoRechargeRate: 50000 - autoRecharge: True - type: entity id: DebugPowerReceiver From 500b25a970753b334997aef5cd6a9701c74c90d9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 9 Nov 2025 02:16:17 +0100 Subject: [PATCH 013/106] Update Credits (#41359) Co-authored-by: PJBot --- Resources/Credits/GitHub.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Credits/GitHub.txt b/Resources/Credits/GitHub.txt index 1fd1cf2ef9..cc80b51d26 100644 --- a/Resources/Credits/GitHub.txt +++ b/Resources/Credits/GitHub.txt @@ -1 +1 @@ -0leshe, 0tito, 0x6273, 12rabbits, 1337dakota, 13spacemen, 154942, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 27alaing, 2DSiggy, 3nderall, 4310v343k, 4dplanner, 5tickman, 612git, 778b, 96flo, aaron, abadaba695, Ablankmann, abregado, Absolute-Potato, Absotively, achookh, Acruid, ActiveMammmoth, actually-reb, ada-please, adamsong, Adeinitas, adm2play, Admiral-Obvious-001, adrian, Adrian16199, Ady4ik, Aearo-Deepwater, Aerocrux, Aeshus, Aexolott, Aexxie, africalimedrop, afrokada, AftrLite, AgentSmithRadio, Agoichi, Ahion, aiden, Aidenkrz, Aisu9, ajcm, AJCM-git, AjexRose, Alekshhh, alexalexmax, alexkar598, AlexMorgan3817, alexum418, alexumandxgabriel08x, Alice4267, Alithsko, Alkheemist, alliephante, ALMv1, Alpaccalypse, Alpha-Two, AlphaQwerty, Altoids1, amatwiedle, amylizzle, ancientpower, Andre19926, Andrew-Fall, AndrewEyeke, AndrewFenriz, AndreyCamper, anri, Anzarot121, ApolloVector, Appiah, ar4ill, Arcane-Waffle, archee1, ArchPigeon, ArchRBX, areitpog, Arendian, areyouconfused, arimah, Arkanic, ArkiveDev, armoks, Arteben, ArthurMousatov, ArtisticRoomba, artur, Artxmisery, ArZarLordOfMango, as334, AsikKEsel, AsnDen, asperger-sind, aspiringLich, astriloqua, Atakku, august-sun, AutoOtter, AverageNotDoingAnythingEnjoyer, avghdev, AwareFoxy, Awlod, AzzyIsNotHere, azzyisnothere, B-Kirill, B3CKDOOR, baa14453, BackeTako, BadaBoomie, Bakke, BananaFlambe, Baptr0b0t, BarryNorfolk, BasedUser, beck-thompson, beesterman, bellwetherlogic, ben, benbryant0, benev0, benjamin-burges, BGare, bhespiritu, bibbly, BigfootBravo, BIGZi0348, bingojohnson, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, blitzthesquishy, Blobadoodle, bloodrizer, Bloody2372, blueDev2, Boaz1111, BobdaBiscuit, BobTheSleder, boiled-water-tsar, Bokser815, bolantej, Booblesnoot42, Boolean-Buckeye, botanySupremist, brainfood1183, BramvanZijp, Brandon-Huu, breeplayx3, BriBrooo, Bright0, BRINGit34, brndd, bryce0110, BubblegumBlue, buletsponge, buntobaggins, bvelliquette, BWTCK, byondfuckery, c0rigin, c4llv07e, CaasGit, Caconym27, Calecute, Callmore, Camdot, capnsockless, CaptainMaru, captainsqrbeard, Carbonhell, Carolyn3114, Carou02, carteblanche4me, catdotjs, catlord, Catofquestionableethics, CatTheSystem, CawsForConcern, Centronias, Chaboricks, chairbender, Chaoticaa, Charlese2, charlie, chartman, ChaseFlorom, chavonadelal, Cheackraze, CheddaCheez, cheesePizza2, CheesePlated, Chief-Engineer, chillyconmor, christhirtle, chromiumboy, Chronophylos, Chubbicous, Chubbygummibear, Ciac32, ciaran, citrea, civilCornball, claustro305, Clement-O, cloudyias, clyf, Clyybber, CMDR-Piboy314, cnv41, coco, cohanna, Cohnway, Cojoke-dot, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, Compilatron144, CookieMasterT, coolboy911, CoolioDudio, coolmankid12345, Coolsurf6, cooperwallace, corentt, CormosLemming, CrafterKolyan, CraftyRenter, crazybrain23, Crazydave91920, creadth, CrigCrag, CroilBird, Crotalus, CrudeWax, cryals, CrzyPotato, cubixthree, cutemoongod, Cyberboss, d34d10cc, DadeKuma, Daemon, daerSeebaer, dahnte, dakamakat, DamianX, dan, dangerrevolution, daniel-cr, DanSAussieITS, Daracke, Darkenson, david, DawBla, Daxxi3, dch-GH, ddeegan, de0rix, Deahaka, dean, DEATHB4DEFEAT, Deatherd, deathride58, DebugOk, Decappi, Decortex, Deeeeja, deepdarkdepths, DeepwaterCreations, Deerstop, degradka, Delete69, deltanedas, DenisShvalov, DerbyX, derek, dersheppard, Deserty0, Detintinto, DevilishMilk, devinschubert14, dexlerxd, dffdff2423, DieselMohawk, DieselMohawkTheSequel, digitalic, Dimastra, DinnerCalzone, DinoWattz, Disp-Dev, DisposableCrewmember42, dissidentbullet, DjfjdfofdjfjD, doc-michael, docnite, Doctor-Cpu, DogZeroX, dolgovmi, dontbetank, Doomsdrayk, Doru991, DoubleRiceEddiedd, DoutorWhite, DR-DOCTOR-EVIL-EVIL, Dragonjspider, dragonryan06, drakewill-CRL, Drayff, dreamlyjack, DrEnzyme, dribblydrone, DrMelon, drongood12, DrSingh, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, DuckManZach, Duddino, dukevanity, duskyjay, Dutch-VanDerLinde, dvir001, dylanstrategie, dylanwhittingham, Dynexust, Easypoller, echo, eclips_e, eden077, EEASAS, Efruit, efzapa, Ekkosangen, ElectroSR, elsie, elthundercloud, Elysium206, emberwinters, Emisse, emmafornash, EmoGarbage404, Endecc, EnrichedCaramel, Entvari, eoineoineoin, ephememory, eris, erohrs2, ERORR404V1, Errant-4, ertanic, esguard, estacaoespacialpirata, eugene, ewokswagger, exincore, exp111, f0x-n3rd, F1restar4, FacePluslll, Fahasor, FairlySadPanda, farrellka-dev, FATFSAAM2, Feluk6174, ficcialfaint, Fiftyllama, Fildrance, FillerVK, FinnishPaladin, firenamefn, Firewars763, FirinMaLazors, Fishfish458, fl-oz, Flareguy, flashgnash, FlipBrooke, FluffiestFloof, FluffMe, FluidRock, flymo5678, foboscheshir, FoLoKe, fooberticus, ForestNoises, forgotmyotheraccount, forkeyboards, forthbridge, Fortune117, foxhorn, freeman2651, freeze2222, frobnic8, Froffy025, Fromoriss, froozigiusz, FrostMando, FrostRibbon, Funce, FungiFellow, FunkySphere, FunTust, Futuristic-OK, GalacticChimp, gamer3107, Gamewar360, gansulalan, GaussiArson, Gaxeer, gbasood, gcoremans, Geekyhobo, genderGeometries, GeneralGaws, Genkail, Gentleman-Bird, geraeumig, Ghagliiarghii, Git-Nivrak, githubuser508, GitHubUser53123, gituhabu, GlassEclipse, GnarpGnarp, GNF54, godisdeadLOL, goet, GoldenCan, Goldminermac, Golinth, golubgik, GoodWheatley, Gorox221, GR1231, gradientvera, graevy, GraniteSidewalk, GreaseMonk, greenrock64, GreyMario, GrownSamoyedDog, GTRsound, gusxyz, Gyrandola, h3half, hamurlik, Hanzdegloker, HappyRoach, Hardly3D, harikattar, Hayden, he1acdvv, Hebi, Helix-ctrl, helm4142, Henry, HerCoyote23, Hi-Im-Shot, HighTechPuddle, Hitlinemoss, hiucko, hivehum, Hmeister-fake, Hmeister-real, Hobbitmax, hobnob, HoidC, Holinka4ever, holyssss, HoofedEar, Hoolny, hord-brayden, hoshizora-sayo, Hreno, Hrosts, htmlsystem, Huaqas, hubismal, Hugal31, Hyenh, hyperb1, hyperDelegate, hyphenationc, i-justuser-i, iaada, iacore, IamVelcroboy, Ian321, icekot8, icesickleone, iczero, iglov, IgorAnt028, igorsaux, ike709, illersaver, Illiux, Ilushkins33, Ilya246, IlyaElDunaev, imatsoup, IMCB, impubbi, imrenq, imweax, indeano, Injazz, Insineer, insoPL, IntegerTempest, Interrobang01, Intoxicating-Innocence, IProduceWidgets, itsmethom, Itzbenz, iztokbajcar, Jackal298, Jackrost, JackRyd3r, jacksonzck, Jacktastic09, Jackw2As, jacob, jamessimo, janekvap, Jark255, Jarmer123, Jaskanbe, JasperJRoth, jbox144, JCGWE30, jerryimmouse, JerryImMouse, Jessetriesagain, jessicamaybe, JesterX666, Jezithyr, jicksaw, JiimBob, JimGamemaster, jimmy12or, JIPDawg, jjtParadox, jkwookee, jmcb, JohnGinnane, johnku1, Jophire, Jopogrechkin, joshepvodka, JpegOfAFrog, jproads, JrInventor05, Jrpl, jukereise, juliangiebel, JustArt1m, JustCone14, justdie12, justin, justintether, JustinTrotter, JustinWinningham, justtne, K-Dynamic, k3yw, Kadeo64, Kaga-404, kaiserbirch, KaiShibaa, kalane15, kalanosh, KamTheSythe, Kanashi-Panda, katzenminer, kbailey-git, Keelin, Keer-Sar, KEEYNy, keikiru, Kelrak, kerisargit, keronshb, KIBORG04, KieueCaprie, Kimpes, KingFroozy, kira-er, kiri-yoshikage, Kirillcas, Kirus59, Kistras, Kit, Kit0vras, KittenColony, Kittygyat, klaypexx, Kmc2000, Ko4ergaPunk, kognise, kokoc9n, komunre, KonstantinAngelov, kontakt, kosticia, koteq, kotobdev, Kowlin, KrasnoshchekovPavel, Krosus777, Krunklehorn, Kryyto, Kupie, kxvvv, Kyoth25f, kyupolaris, kzhanik, LaCumbiaDelCoronavirus, lajolico, Lamrr, lanedon, LankLTE, laok233, lapatison, larryrussian, lawdog4817, Lazzi0706, leah, leander-0, leonardo-dabepis, leonidussaks, leonsfriedrich, LeoSantich, LetterN, lettern, Level10Cybermancer, LEVELcat, lever1209, LevitatingTree, Lgibb18, lgruthes, LightVillet, lilazero, liltenhead, linkbro1, linkuyx, Litraxx, little-meow-meow, LittleBuilderJane, LittleNorthStar, LittleNyanCat, lizelive, ljm862, lmsnoise, localcc, lokachop, lolman360, Lomcastar, Lordbrandon12, LordCarve, LordEclipse, lucas, LucasTheDrgn, luckyshotpictures, LudwigVonChesterfield, luegamer, luizwritescode, Lukasz825700516, luminight, lunarcomets, Lusatia, Luxeator, lvvova1, Lyndomen, lyroth001, lzimann, M1tht1c, M3739, M4rchy-S, M87S, mac6na6na, MACMAN2003, Macoron, magicalus, magmodius, magnuscrowe, maland1, malchanceux, MaloTV, ManelNavola, manelnavola, Mangohydra, marboww, Markek1, MarkerWicker, marlyn, matt, Matz05, max, MaxNox7, maylokana, MDuch369, meganerobot, MehimoNemo, Mehnix, MeltedPixel, memeproof, MendaxxDev, Menshin, Mephisto72, MerrytheManokit, Mervill, metalgearsloth, MetalSage, MFMessage, mhamsterr, michaelcu, micheel665, mifia, MilenVolf, MilonPL, Minemoder5000, Minty642, minus1over12, Mirino97, mirrorcult, misandrie, MishaUnity, MissKay1994, MisterImp, MisterMecky, Mith-randalf, Mixelz, mjarduk, MjrLandWhale, mkanke-real, MLGTASTICa, mnva0, moderatelyaware, modern-nm, mokiros, momo, Moneyl, monotheonist, Moomoobeef, moony, Morb0, MossyGreySlope, mqole, mr-bo-jangles, Mr0maks, MrFippik, mrrobdemo, mtrs163, muburu, MureixloI, murolem, murphyneko, musicmanvr, MWKane, Myakot, Myctai, N3X15, nabegator, nails-n-tape, Nairodian, Naive817, NakataRin, namespace-Memory, Nannek, NazrinNya, neutrino-laser, NickPowers43, nikitosych, nikthechampiongr, Nimfar11, ninruB, Nirnael, NIXC, nkokic, NkoKirkto, nmajask, noctyrnal, noelkathegod, noirogen, nok-ko, NonchalantNoob, NoobyLegion, Nopey, NoreUhh, not-gavnaed, notafet, notquitehadouken, notsodana, noudoit, noverd, Nox38, NuclearWinter, nukashimika, nuke-haus, NULL882, nullarmo, nyeogmi, Nylux, Nyranu, Nyxilath, och-och, OctoRocket, OldDanceJacket, OliverOtter, onesch, OneZerooo0, OnsenCapy, OnyxTheBrave, opl-, Orange-Winds, OrangeMoronage9622, OrbitSystem07, Orsoniks, osjarw, Ostaf, othymer, OttoMaticode, Owai-Seek, packmore, paige404, paigemaeforrest, pali6, Palladinium, Pangogie, panzer-iv1, partyaddict, patrikturi, PaulRitter, pavlockblaine03, peccneck, Peptide90, peptron1, perryprog, PeterFuto, PetMudstone, pewter-wiz, PGrayCS, pgraycs, Pgriha, phantom-lily, pheenty, philingham, Phill101, Phooooooooooooooooooooooooooooooosphate, phunnyguy, PicklOH, PilgrimViis, Pill-U, pinkbat5, Piras314, Pireax, Pissachu, pissdemon, Pixel8-dev, PixeltheAertistContrib, PixelTheKermit, PJB3005, Plasmaguy, plinyvic, Plykiya, poeMota, pofitlo, pointer-to-null, pok27, Pok27, poklj, PolterTzi, PoorMansDreams, PopGamer45, portfiend, potato1234x, PotentiallyTom, PotRoastPiggy, Princess-Cheeseballs, ProfanedBane, PROG-MohamedDwidar, Prole0, ProPandaBear, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykana, psykzz, PuceTint, pumkin69, PuroSlavKing, PursuitInAshes, Putnam3145, py01, Pyrovi, qrtDaniil, qrwas, Quantum-cross, quasr-9, quatre, QueerNB, QuietlyWhisper, qwerltaz, Radezolid, RadioMull, Radosvik, Radrark, Rainbeon, Rainfey, Raitononai, Ramlik, RamZ, randy10122, Rane, Ranger6012, Rapidgame7, ravage123321, rbertoche, RedBookcase, Redfire1331, Redict, RedlineTriad, redmushie, RednoWCirabrab, ReeZer2, RemberBM, RemieRichards, RemTim, rene-descartes2021, Renlou, retequizzle, rhailrake, rhsvenson, rich-dunne, RieBi, riggleprime, RIKELOLDABOSS, rinary1, Rinkashikachi, riolume, rlebell33, RobbyTheFish, robinthedragon, Rockdtben, Rohesie, rok-povsic, rokudara-sen, rolfero, RomanNovo, rosieposieeee, Roudenn, router, ruddygreat, rumaks, RumiTiger, Ruzihm, S1rFl0, S1ss3l, Saakra, Sadie-silly, saga3152, saintmuntzer, Salex08, sam, samgithubaccount, Samuka-C, SaphireLattice, SapphicOverload, sarahon, sativaleanne, SaveliyM360, sBasalto, ScalyChimp, ScarKy0, ScholarNZL, schrodinger71, scrato, Scribbles0, scrivoy, scruq445, scuffedjays, ScumbagDog, SeamLesss, Segonist, semensponge, sephtasm, ser1-1y, Serkket, sewerpig, SG6732, sh18rw, Shaddap1, ShadeAware, ShadowCommander, shadowtheprotogen546, shaeone, shampunj, shariathotpatrol, SharkSnake98, shibechef, Siginanto, signalsender, SignalWalker, siigiil, silicon14wastaken, Silverfur-underscore, Simyon264, sirdragooon, Sirionaut, SirWarock, Sk1tch, SkaldetSkaeg, Skarletto, Skybailey-dev, skye, Skyedra, SlamBamActionman, slarticodefast, Slava0135, sleepyyapril, slimmslamm, Slyfox333, Smugman, SnappingOpossum, snebl, snicket, sniperchance, Snowni, snowsignal, SolidSyn, SolidusSnek, solstar2, SonicHDC, SoulFN, SoulSloth, Soundwavesghost, soupkilove, southbridge-fur, sowelipililimute, Soydium, SpaceLizard24, SpaceLizardSky, SpaceManiac, SpaceRox1244, SpaceyLady, Spangs04, spanky-spanky, Sparlight, spartak, SpartanKadence, spderman3333, SpeltIncorrectyl, Spessmann, SphiraI, SplinterGP, spoogemonster, sporekto, sporkyz, ssdaniel24, stalengd, stanberytrask, Stanislav4ix, StanTheCarpenter, starbuckss14, Stealthbomber16, Steffo99, stellar-novas, stewie523, stomf, Stop-Signs, stopbreaking, stopka-html, StrawberryMoses, Stray-Pyramid, strO0pwafel, Strol20, StStevens, Subversionary, sunbear-dev, SuperGDPWYL, superjj18, Supernorn, SurrealShibe, SweetAplle, SweptWasTaken, SyaoranFox, Sybil, SYNCHRONIC, Szunti, t, Tainakov, takemysoult, taonewt, tap, TaralGit, Taran, taurie, Tayrtahn, tday93, teamaki, TeenSarlacc, TekuNut, telavivgamers, telyonok, temm1ie, TemporalOroboros, tentekal, terezi4real, Terraspark4941, texcruize, Tezzaide, TGODiamond, TGRCdev, tgrkzus, thanosdegraf, ThatGuyUSA, ThatOneGoblin25, thatrandomcanadianguy, TheArturZh, TheBlueYowie, thecopbennet, TheCze, TheDarkElites, thedraccx, TheEmber, TheFlyingSentry, TheGrimbeeper, TheIntoxicatedCat, thekilk, themias, theomund, TheProNoob678, TherapyGoth, ThereDrD0, TheSecondLord, TheShuEd, thetolbean, thevinter, TheWaffleJesus, thinbug0, ThunderBear2006, timothyteakettle, TimrodDX, timurjavid, tin-man-tim, TiniestShark, Titian3, tk-a369, tkdrg, tmtmtl30, ToastEnjoyer, Toby222, TokenStyle, Tollhouse, Toly65, tom-leys, tomasalves8, Tomeno, Tonydatguy, topy, tornado-technology, TornadoTechnology, tosatur, TotallyLemon, ToxicSonicFan04, Tr1bute, travis-g-reid, treytipton, trixxedbit, TrixxedHeart, tropicalhibi, truepaintgit, Truoizys, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, tyashley, Tyler-IN, TytosB, Tyzemol, UbaserB, Uberration, ubis1, UBlueberry, uhbg, UKNOWH, UltimateJester, Unbelievable-Salmon, underscorex5, UnicornOnLSD, Unisol, unusualcrow, Uriende, UristMcDorf, user424242420, Utmanarn, Vaaankas, valentfingerov, valquaint, Varen, Vasilis, VasilisThePikachu, veliebm, Velken, VelonacepsCalyxEggs, veprolet, VerinSenpai, veritable-calamity, Veritius, Vermidia, vero5123, verslebas, vexerot, vgskye, viceemargo, VigersRay, violet754, Visne, vitopigno, vitusveit, vlad, vlados1408, VMSolidus, vmzd, VoidMeticulous, voidnull000, volotomite, volundr-, Voomra, Vordenburg, vorkathbruh, Vortebo, vulppine, wachte1, wafehling, walksanatora, Warentan, WarMechanic, Watermelon914, weaversam8, wertanchik, whateverusername0, whatston3, widgetbeck, Will-Oliver-Br, Willhelm53, WilliamECrew, willicassi, Winkarst-cpu, wirdal, wixoaGit, WlarusFromDaSpace, Wolfkey-SomeoneElseTookMyUsername, Worldwaker, wrexbe, wtcwr68, xeri7, xkreksx, xprospero, xRiriq, xsainteer, YanehCheck, yathxyz, Ygg01, YotaXP, youarereadingthis, YoungThugSS14, Yousifb26, youtissoum, yunii, YuriyKiss, yuriykiss, zach-hill, Zadeon, Zalycon, zamp, Zandario, Zap527, Zealith-Gamer, ZelteHonor, zero, ZeroDiamond, ZeWaka, zHonys, zionnBE, ZNixian, Zokkie, ZoldorfTheWizard, zonespace27, Zylofan, Zymem, zzylex +0leshe, 0tito, 0x6273, 12rabbits, 1337dakota, 13spacemen, 154942, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 27alaing, 2DSiggy, 3nderall, 4310v343k, 4dplanner, 5tickman, 612git, 778b, 96flo, aaron, abadaba695, Ablankmann, abregado, Absolute-Potato, Absotively, achookh, Acruid, ActiveMammmoth, actually-reb, ada-please, adamsong, Adeinitas, adm2play, Admiral-Obvious-001, adrian, Adrian16199, Ady4ik, Aearo-Deepwater, Aerocrux, Aeshus, Aexolott, Aexxie, africalimedrop, afrokada, AftrLite, AgentSmithRadio, Agoichi, Ahion, aiden, Aidenkrz, Aisu9, ajcm, AJCM-git, AjexRose, Alekshhh, alexalexmax, alexkar598, AlexMorgan3817, alexum418, alexumandxgabriel08x, Alice4267, Alithsko, Alkheemist, alliephante, ALMv1, Alpaccalypse, Alpha-Two, AlphaQwerty, Altoids1, amatwiedle, amylizzle, ancientpower, Andre19926, Andrew-Fall, AndrewEyeke, AndrewFenriz, AndreyCamper, anri, Anzarot121, ApolloVector, Appiah, ar4ill, Arcane-Waffle, archee1, ArchPigeon, ArchRBX, areitpog, Arendian, areyouconfused, arimah, Arkanic, ArkiveDev, armoks, Arteben, ArthurMousatov, ArtisticRoomba, artur, Artxmisery, ArZarLordOfMango, as334, AsikKEsel, AsnDen, asperger-sind, aspiringLich, astriloqua, Atakku, august-sun, AutoOtter, AverageNotDoingAnythingEnjoyer, avghdev, AwareFoxy, Awlod, AzzyIsNotHere, azzyisnothere, B-Kirill, B3CKDOOR, baa14453, BackeTako, BadaBoomie, Bakke, BananaFlambe, Baptr0b0t, BarryNorfolk, BasedUser, beck-thompson, beesterman, bellwetherlogic, ben, benbryant0, benev0, benjamin-burges, BGare, bhespiritu, bibbly, BigfootBravo, BIGZi0348, bingojohnson, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, blitzthesquishy, Blobadoodle, bloodrizer, Bloody2372, blueDev2, Boaz1111, BobdaBiscuit, BobTheSleder, boiled-water-tsar, Bokser815, bolantej, Booblesnoot42, Boolean-Buckeye, botanySupremist, brainfood1183, BramvanZijp, Brandon-Huu, breeplayx3, BriBrooo, Bright0, BRINGit34, brndd, bryce0110, BubblegumBlue, buletsponge, buntobaggins, bvelliquette, BWTCK, byondfuckery, c0rigin, c4llv07e, CaasGit, Caconym27, Calecute, Callmore, Camdot, capnsockless, CaptainMaru, captainsqrbeard, Carbonhell, Carolyn3114, Carou02, carteblanche4me, catdotjs, catlord, Catofquestionableethics, CatTheSystem, CawsForConcern, Centronias, Chaboricks, chairbender, Chaoticaa, Charlese2, charlie, chartman, ChaseFlorom, chavonadelal, Cheackraze, CheddaCheez, cheesePizza2, CheesePlated, Chief-Engineer, chillyconmor, christhirtle, chromiumboy, Chronophylos, Chubbicous, Chubbygummibear, Ciac32, ciaran, citrea, civilCornball, claustro305, Clement-O, cloudyias, clyf, Clyybber, CMDR-Piboy314, cnv41, coco, cohanna, Cohnway, Cojoke-dot, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, Compilatron144, CookieMasterT, coolboy911, CoolioDudio, coolmankid12345, Coolsurf6, cooperwallace, corentt, CormosLemming, CrafterKolyan, CraftyRenter, crazybrain23, Crazydave91920, creadth, CrigCrag, CroilBird, Crotalus, CrudeWax, cryals, CrzyPotato, cubixthree, cutemoongod, Cyberboss, d34d10cc, DadeKuma, Daemon, daerSeebaer, dahnte, dakamakat, DamianX, dan, dangerrevolution, daniel-cr, DanSAussieITS, Daracke, Darkenson, david, DawBla, Daxxi3, dch-GH, ddeegan, de0rix, Deahaka, dean, DEATHB4DEFEAT, Deatherd, deathride58, DebugOk, Decappi, Decortex, Deeeeja, deepdarkdepths, DeepwaterCreations, Deerstop, degradka, Delete69, deltanedas, DenisShvalov, DerbyX, derek, dersheppard, Deserty0, Detintinto, DevilishMilk, devinschubert14, dexlerxd, dffdff2423, DieselMohawk, DieselMohawkTheSequel, digitalic, Dimastra, DinnerCalzone, DinoWattz, Disp-Dev, DisposableCrewmember42, dissidentbullet, DjfjdfofdjfjD, doc-michael, docnite, Doctor-Cpu, DogZeroX, dolgovmi, dontbetank, Doomsdrayk, Doru991, DoubleRiceEddiedd, DoutorWhite, DR-DOCTOR-EVIL-EVIL, Dragonjspider, dragonryan06, drakewill-CRL, Drayff, dreamlyjack, DrEnzyme, dribblydrone, DrMelon, drongood12, DrSingh, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, DuckManZach, Duddino, dukevanity, duskyjay, Dutch-VanDerLinde, dvir001, dylanstrategie, dylanwhittingham, Dynexust, Easypoller, echo, eclips_e, eden077, EEASAS, Efruit, efzapa, Ekkosangen, ElectroSR, elsie, elthundercloud, Elysium206, emberwinters, Emisse, emmafornash, EmoGarbage404, Endecc, EnrichedCaramel, Entvari, eoineoineoin, ephememory, eris, erohrs2, ERORR404V1, Errant-4, ertanic, esguard, estacaoespacialpirata, eugene, ewokswagger, exincore, exp111, f0x-n3rd, F1restar4, FacePluslll, Fahasor, FairlySadPanda, farrellka-dev, FATFSAAM2, Feluk6174, ficcialfaint, Fiftyllama, Fildrance, FillerVK, FinnishPaladin, firenamefn, Firewars763, FirinMaLazors, Fishfish458, fl-oz, Flareguy, flashgnash, FlipBrooke, FluffiestFloof, FluffMe, FluidRock, flymo5678, foboscheshir, FoLoKe, fooberticus, ForestNoises, forgotmyotheraccount, forkeyboards, forthbridge, Fortune117, foxhorn, freeman2651, freeze2222, frobnic8, Froffy025, Fromoriss, froozigiusz, FrostMando, FrostRibbon, Funce, FungiFellow, FunkySphere, FunTust, Futuristic-OK, GalacticChimp, gamer3107, Gamewar360, gansulalan, GaussiArson, Gaxeer, gbasood, gcoremans, Geekyhobo, genderGeometries, GeneralGaws, Genkail, Gentleman-Bird, geraeumig, Ghagliiarghii, Git-Nivrak, githubuser508, GitHubUser53123, gituhabu, GlassEclipse, GnarpGnarp, GNF54, godisdeadLOL, goet, GoldenCan, Goldminermac, Golinth, golubgik, GoodWheatley, Gorox221, GR1231, gradientvera, graevy, GraniteSidewalk, GreaseMonk, greenrock64, GreyMario, GrownSamoyedDog, GTRsound, gusxyz, Gyrandola, h3half, hamurlik, Hanzdegloker, HappyRoach, Hardly3D, harikattar, Hayden, he1acdvv, Hebi, Helix-ctrl, helm4142, Henry, HerCoyote23, Hi-Im-Shot, HighTechPuddle, Hitlinemoss, hiucko, hivehum, Hmeister-fake, Hmeister-real, Hobbitmax, hobnob, HoidC, Holinka4ever, holyssss, HoofedEar, Hoolny, hord-brayden, hoshizora-sayo, Hreno, Hrosts, htmlsystem, Huaqas, hubismal, Hugal31, Hyenh, hyperb1, hyperDelegate, hyphenationc, i-justuser-i, iaada, iacore, IamVelcroboy, Ian321, icekot8, icesickleone, iczero, iglov, IgorAnt028, igorsaux, ike709, illersaver, Illiux, Ilushkins33, Ilya246, IlyaElDunaev, imatsoup, IMCB, impubbi, imrenq, imweax, indeano, Injazz, Insineer, insoPL, IntegerTempest, Interrobang01, Intoxicating-Innocence, IProduceWidgets, itsmethom, Itzbenz, iztokbajcar, Jackal298, Jackrost, JackRyd3r, jacksonzck, Jacktastic09, Jackw2As, jacob, jamessimo, janekvap, Jark255, Jarmer123, Jaskanbe, JasperJRoth, jbox144, JCGWE30, jerryimmouse, JerryImMouse, Jessetriesagain, jessicamaybe, JesterX666, Jezithyr, jicksaw, JiimBob, JimGamemaster, jimmy12or, JIPDawg, jjtParadox, jkwookee, jmcb, JohnGinnane, johnku1, Jophire, Jopogrechkin, joshepvodka, JpegOfAFrog, jproads, JrInventor05, Jrpl, jukereise, juliangiebel, JustArt1m, JustCone14, justdie12, justin, justintether, JustinTrotter, JustinWinningham, justtne, K-Dynamic, k3yw, Kadeo64, Kaga-404, kaiserbirch, KaiShibaa, kalane15, kalanosh, KamTheSythe, Kanashi-Panda, katzenminer, kbailey-git, Keelin, Keer-Sar, KEEYNy, keikiru, Kelrak, kerisargit, keronshb, KIBORG04, KieueCaprie, Kimpes, KingFroozy, kira-er, kiri-yoshikage, Kirillcas, Kirus59, Kistras, Kit, Kit0vras, KittenColony, Kittygyat, klaypexx, Kmc2000, Ko4ergaPunk, kognise, kokoc9n, komunre, KonstantinAngelov, kontakt, kosticia, koteq, kotobdev, Kowlin, KrasnoshchekovPavel, Krosus777, Krunklehorn, Kryyto, Kupie, kxvvv, Kyoth25f, kyupolaris, kzhanik, LaCumbiaDelCoronavirus, lajolico, Lamrr, lanedon, LankLTE, laok233, lapatison, larryrussian, lawdog4817, Lazzi0706, leah, leander-0, leonardo-dabepis, leonidussaks, leonsfriedrich, LeoSantich, lettern, LetterN, Level10Cybermancer, LEVELcat, lever1209, LevitatingTree, Lgibb18, lgruthes, LightVillet, lilazero, liltenhead, linkbro1, linkuyx, Litraxx, little-meow-meow, LittleBuilderJane, LittleNorthStar, LittleNyanCat, lizelive, ljm862, lmsnoise, localcc, lokachop, lolman360, Lomcastar, Lordbrandon12, LordCarve, LordEclipse, lucas, LucasTheDrgn, luckyshotpictures, LudwigVonChesterfield, luegamer, luizwritescode, LukaSlade, Lukasz825700516, luminight, lunarcomets, Lusatia, Luxeator, lvvova1, Lyndomen, lyroth001, lzimann, M1tht1c, M3739, M4rchy-S, M87S, mac6na6na, MACMAN2003, Macoron, magicalus, magmodius, magnuscrowe, maland1, malchanceux, MaloTV, manelnavola, ManelNavola, Mangohydra, marboww, Markek1, MarkerWicker, marlyn, matt, Matz05, max, MaxNox7, maylokana, MDuch369, meganerobot, MehimoNemo, Mehnix, MeltedPixel, memeproof, MendaxxDev, Menshin, Mephisto72, MerrytheManokit, Mervill, metalgearsloth, MetalSage, MFMessage, mhamsterr, michaelcu, micheel665, mifia, MilenVolf, MilonPL, Minemoder5000, Minty642, minus1over12, Mirino97, mirrorcult, misandrie, MishaUnity, MissKay1994, MisterImp, MisterMecky, Mith-randalf, Mixelz, mjarduk, MjrLandWhale, mkanke-real, MLGTASTICa, mnva0, moderatelyaware, modern-nm, mokiros, momo, Moneyl, monotheonist, Moomoobeef, moony, Morb0, MossyGreySlope, mqole, mr-bo-jangles, Mr0maks, MrFippik, mrrobdemo, mtrs163, muburu, MureixloI, murolem, murphyneko, musicmanvr, MWKane, Myakot, Myctai, N3X15, nabegator, nails-n-tape, Nairodian, Naive817, NakataRin, namespace-Memory, Nannek, NazrinNya, neutrino-laser, NickPowers43, nikitosych, nikthechampiongr, Nimfar11, ninruB, Nirnael, NIXC, nkokic, NkoKirkto, nmajask, noctyrnal, noelkathegod, noirogen, nok-ko, NonchalantNoob, NoobyLegion, Nopey, NoreUhh, not-gavnaed, notafet, notquitehadouken, notsodana, noudoit, noverd, Nox38, NuclearWinter, nukashimika, nuke-haus, NULL882, nullarmo, nyeogmi, Nylux, Nyranu, Nyxilath, och-och, OctoRocket, OldDanceJacket, OliverOtter, onesch, OneZerooo0, OnsenCapy, OnyxTheBrave, opl-, Orange-Winds, OrangeMoronage9622, OrbitSystem07, Orsoniks, osjarw, Ostaf, othymer, OttoMaticode, Owai-Seek, packmore, paige404, paigemaeforrest, pali6, Palladinium, Pangogie, panzer-iv1, partyaddict, patrikturi, PaulRitter, pavlockblaine03, peccneck, Peptide90, peptron1, perryprog, PeterFuto, PetMudstone, pewter-wiz, pgraycs, PGrayCS, Pgriha, phantom-lily, pheenty, philingham, Phill101, Phooooooooooooooooooooooooooooooosphate, phunnyguy, PicklOH, PilgrimViis, Pill-U, pinkbat5, Piras314, Pireax, Pissachu, pissdemon, Pixel8-dev, PixeltheAertistContrib, PixelTheKermit, PJB3005, Plasmaguy, plinyvic, Plykiya, poeMota, pofitlo, pointer-to-null, pok27, Pok27, poklj, PolterTzi, PoorMansDreams, PopGamer45, portfiend, potato1234x, PotentiallyTom, PotRoastPiggy, Princess-Cheeseballs, ProfanedBane, PROG-MohamedDwidar, Prole0, ProPandaBear, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykana, psykzz, PuceTint, pumkin69, PuroSlavKing, PursuitInAshes, Putnam3145, py01, Pyrovi, qrtDaniil, qrwas, Quantum-cross, quasr-9, quatre, QueerNB, QuietlyWhisper, qwerltaz, Radezolid, RadioMull, Radosvik, Radrark, Rainbeon, Rainfey, Raitononai, Ramlik, RamZ, randy10122, Rane, Ranger6012, Rapidgame7, ravage123321, rbertoche, RedBookcase, Redfire1331, Redict, RedlineTriad, redmushie, RednoWCirabrab, ReeZer2, RemberBM, RemieRichards, RemTim, rene-descartes2021, Renlou, retequizzle, rhailrake, rhsvenson, rich-dunne, RieBi, riggleprime, RIKELOLDABOSS, rinary1, Rinkashikachi, riolume, rlebell33, RobbyTheFish, robinthedragon, Rockdtben, Rohesie, rok-povsic, rokudara-sen, rolfero, RomanNovo, rosieposieeee, Roudenn, router, ruddygreat, rumaks, RumiTiger, Ruzihm, S1rFl0, S1ss3l, Saakra, Sadie-silly, saga3152, saintmuntzer, Salex08, sam, samgithubaccount, Samuka-C, SaphireLattice, SapphicOverload, sarahon, sativaleanne, SaveliyM360, sBasalto, ScalyChimp, ScarKy0, ScholarNZL, schrodinger71, scrato, Scribbles0, scrivoy, scruq445, scuffedjays, ScumbagDog, SeamLesss, Segonist, semensponge, sephtasm, ser1-1y, Serkket, sewerpig, SG6732, sh18rw, Shaddap1, ShadeAware, ShadowCommander, shadowtheprotogen546, shaeone, shampunj, shariathotpatrol, SharkSnake98, shibechef, Siginanto, signalsender, SignalWalker, siigiil, silicon14wastaken, Silverfur-underscore, Simyon264, sirdragooon, Sirionaut, SirWarock, Sk1tch, SkaldetSkaeg, Skarletto, Skybailey-dev, skye, Skyedra, SlamBamActionman, slarticodefast, Slava0135, sleepyyapril, slimmslamm, Slyfox333, Smugman, SnappingOpossum, snebl, snicket, sniperchance, Snowni, snowsignal, SolidSyn, SolidusSnek, solstar2, SonicHDC, SoulFN, SoulSloth, Soundwavesghost, soupkilove, southbridge-fur, sowelipililimute, Soydium, SpaceLizard24, SpaceLizardSky, SpaceManiac, SpaceRox1244, SpaceyLady, Spangs04, spanky-spanky, Sparlight, spartak, SpartanKadence, spderman3333, SpeltIncorrectyl, Spessmann, SphiraI, SplinterGP, spoogemonster, sporekto, sporkyz, ssdaniel24, stalengd, stanberytrask, Stanislav4ix, StanTheCarpenter, starbuckss14, Stealthbomber16, Steffo99, stellar-novas, stewie523, stomf, Stop-Signs, stopbreaking, stopka-html, StrawberryMoses, Stray-Pyramid, strO0pwafel, Strol20, StStevens, Subversionary, sunbear-dev, SuperGDPWYL, superjj18, Supernorn, SurrealShibe, SweetAplle, SweptWasTaken, SyaoranFox, Sybil, SYNCHRONIC, Szunti, t, Tainakov, takemysoult, taonewt, tap, TaralGit, Taran, taurie, Tayrtahn, tday93, teamaki, TeenSarlacc, TekuNut, telavivgamers, telyonok, temm1ie, TemporalOroboros, tentekal, terezi4real, Terraspark4941, texcruize, Tezzaide, TGODiamond, TGRCdev, tgrkzus, thanosdegraf, ThatGuyUSA, ThatOneGoblin25, thatrandomcanadianguy, TheArturZh, TheBlueYowie, thecopbennet, TheCze, TheDarkElites, thedraccx, TheEmber, TheFlyingSentry, TheGrimbeeper, TheIntoxicatedCat, thekilk, themias, theomund, TheProNoob678, TherapyGoth, ThereDrD0, TheSecondLord, TheShuEd, thetolbean, thevinter, TheWaffleJesus, thinbug0, ThunderBear2006, timothyteakettle, TimrodDX, timurjavid, tin-man-tim, TiniestShark, Titian3, tk-a369, tkdrg, tmtmtl30, ToastEnjoyer, Toby222, TokenStyle, Tollhouse, Toly65, tom-leys, tomasalves8, Tomeno, Tonydatguy, topy, tornado-technology, TornadoTechnology, tosatur, TotallyLemon, ToxicSonicFan04, Tr1bute, travis-g-reid, treytipton, trixxedbit, TrixxedHeart, tropicalhibi, truepaintgit, Truoizys, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, tyashley, Tyler-IN, TytosB, Tyzemol, UbaserB, Uberration, ubis1, UBlueberry, uhbg, UKNOWH, UltimateJester, Unbelievable-Salmon, underscorex5, UnicornOnLSD, Unisol, unusualcrow, Uriende, UristMcDorf, user424242420, Utmanarn, Vaaankas, valentfingerov, valquaint, Varen, Vasilis, VasilisThePikachu, veliebm, Velken, VelonacepsCalyxEggs, veprolet, VerinSenpai, veritable-calamity, Veritius, Vermidia, vero5123, verslebas, vexerot, vgskye, viceemargo, VigersRay, violet754, Visne, vitopigno, vitusveit, vlad, vlados1408, VMSolidus, vmzd, VoidMeticulous, voidnull000, volotomite, volundr-, Voomra, Vordenburg, vorkathbruh, Vortebo, vulppine, wachte1, wafehling, walksanatora, Warentan, WarMechanic, Watermelon914, weaversam8, wertanchik, whateverusername0, whatston3, widgetbeck, Will-Oliver-Br, Willhelm53, WilliamECrew, willicassi, Winkarst-cpu, wirdal, wixoaGit, WlarusFromDaSpace, Wolfkey-SomeoneElseTookMyUsername, Worldwaker, wrexbe, wtcwr68, xeri7, xkreksx, xprospero, xRiriq, xsainteer, YanehCheck, yathxyz, Ygg01, YotaXP, youarereadingthis, YoungThugSS14, Yousifb26, youtissoum, yunii, YuriyKiss, yuriykiss, zach-hill, Zadeon, Zalycon, zamp, Zandario, Zap527, Zealith-Gamer, ZelteHonor, zero, ZeroDiamond, ZeWaka, zHonys, zionnBE, ZNixian, Zokkie, ZoldorfTheWizard, zonespace27, Zylofan, Zymem, zzylex From 065514729e5352f2faa69a0bab29d3014b871e9e Mon Sep 17 00:00:00 2001 From: Princess Cheeseballs <66055347+Princess-Cheeseballs@users.noreply.github.com> Date: Sat, 8 Nov 2025 17:35:34 -0800 Subject: [PATCH 014/106] Fix Paradox Clone Forensics (#41358) i forgor to push Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com> --- Resources/Prototypes/Entities/Mobs/Player/clone.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Resources/Prototypes/Entities/Mobs/Player/clone.yml b/Resources/Prototypes/Entities/Mobs/Player/clone.yml index ca100ea110..c8ab57df58 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/clone.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/clone.yml @@ -100,6 +100,8 @@ - type: cloningSettings id: ParadoxCloningSettings parent: [BaseClone, Antag] + components: + - Forensics # This is so hugging data is copied to the clone, so you can't hug metagame them # changeling identity copying - type: cloningSettings From 4ca3b905c758392c25e8d08e67a743ed0c93a6b1 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 9 Nov 2025 01:47:29 +0000 Subject: [PATCH 015/106] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 2664164bf6..53810c4917 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: kosticia - changes: - - message: Reflection chances are examinable now. - type: Add - id: 8690 - time: '2025-06-18T00:50:01.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38199 - author: Kittygyat changes: - message: Fixed vapes dealing unintended damage types to you when used. @@ -3924,3 +3917,10 @@ id: 9191 time: '2025-11-08T20:40:40.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/37468 +- author: Princess-Cheeseballs + changes: + - message: Paradox clones now copy forensics from the original + type: Fix + id: 9192 + time: '2025-11-09T01:46:21.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41358 From 5ec141b9558d8010b926590b6752e769a1fb78b9 Mon Sep 17 00:00:00 2001 From: Sir Warock <67167466+SirWarock@users.noreply.github.com> Date: Sun, 9 Nov 2025 08:42:55 +0100 Subject: [PATCH 016/106] Fix Ammo Visuals Bug (#41362) Fix Ammo Count Updating --- .../Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs index 62b68fed6e..c2dfa23fcb 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs @@ -154,8 +154,6 @@ public abstract partial class SharedGunSystem Del(ent.Value); } - UpdateBallisticAppearance(args.Target.Value, component); - UpdateAmmoCount(args.Target.Value); // repeat if there is more space in the target and more ammo to fill var moreSpace = target.Entities.Count + target.UnspawnedCount < target.Capacity; var moreAmmo = component.Entities.Count + component.UnspawnedCount > 0; From deea03d8155e994d404f46d031de9ace44e09d43 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 9 Nov 2025 07:55:31 +0000 Subject: [PATCH 017/106] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 53810c4917..cf2b09af5a 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Kittygyat - changes: - - message: Fixed vapes dealing unintended damage types to you when used. - type: Fix - id: 8691 - time: '2025-06-18T12:06:13.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38423 - author: beck-thompson changes: - message: Recycler now properly recycles item stacks. @@ -3924,3 +3917,11 @@ id: 9192 time: '2025-11-09T01:46:21.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41358 +- author: SirWarock + changes: + - message: Fixed Magazines not properly visualizing how much ammo they had left + in them! + type: Fix + id: 9193 + time: '2025-11-09T07:54:23.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41362 From 3d16911dbeb9fc30cfb7dedc64141397d99d1b7e Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sun, 9 Nov 2025 21:50:11 +1100 Subject: [PATCH 018/106] Update submodule to 267.4.0 (#41364) --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index feb9e1db69..c95b4320cf 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit feb9e1db69ab97acfd07580918f5d20ffaa6b770 +Subproject commit c95b4320cfda1f54ea1e26023c9e73e85c57b820 From b0a206f1f8510109d69a67ff192b6ee8262282bc Mon Sep 17 00:00:00 2001 From: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> Date: Sun, 9 Nov 2025 08:17:38 -0800 Subject: [PATCH 019/106] Yet another revitalization of engine lighting changes (#41361) * cherrypick lighting changes * increase computer light --------- Co-authored-by: Crude Oil --- .../Entities/Clothing/Head/helmets.yml | 2 +- .../Prototypes/Entities/Mobs/NPCs/carp.yml | 2 +- .../Entities/Mobs/NPCs/lavaland.yml | 16 +-- .../Prototypes/Entities/Mobs/NPCs/space.yml | 2 +- .../Objects/Consumable/Food/Baked/cake.yml | 4 +- .../Entities/Objects/Materials/materials.yml | 2 +- .../Objects/Weapons/Melee/e_sword.yml | 4 +- .../Decoration/decorated_fir_tree.yml | 2 +- .../Structures/Machines/Computers/arcades.yml | 2 +- .../Computers/base_structurecomputers.yml | 2 +- .../Machines/Computers/computers.yml | 54 +++++----- .../Machines/Computers/wooden_television.yml | 2 +- .../Structures/Machines/anomaly_sync.yml | 4 +- .../Structures/Machines/artifact_analyzer.yml | 2 +- .../Entities/Structures/Machines/research.yml | 6 +- .../Structures/Machines/smartfridge.yml | 4 +- .../Structures/Machines/telecomms.yml | 2 +- .../Structures/Machines/vending_machines.yml | 100 +++++++++--------- .../Power/Generation/generators.yml | 2 +- .../Entities/Structures/Power/apc.yml | 2 +- .../Entities/Structures/Power/smes.yml | 4 +- .../Structures/Specific/Anomaly/cores.yml | 8 +- .../Monitors/telescreens.yml | 2 +- .../Monitors/televisions.yml | 2 +- 24 files changed, 116 insertions(+), 116 deletions(-) diff --git a/Resources/Prototypes/Entities/Clothing/Head/helmets.yml b/Resources/Prototypes/Entities/Clothing/Head/helmets.yml index bfa54eaf77..539fa90ea4 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/helmets.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/helmets.yml @@ -518,7 +518,7 @@ - type: PointLight enabled: false radius: 1.4 - energy: 1.4 + energy: 2.5 color: red netsync: false mask: /Textures/Effects/LightMasks/double_cone.png diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml index 95392e9a28..c0ea417663 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml @@ -147,7 +147,7 @@ components: - type: PointLight radius: 1.5 - energy: 0.5 + energy: 2 - type: RgbLightController layers: [ 0 ] diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/lavaland.yml b/Resources/Prototypes/Entities/Mobs/NPCs/lavaland.yml index b4add804ae..949fc76efe 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/lavaland.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/lavaland.yml @@ -86,8 +86,8 @@ shader: unshaded color: red - type: PointLight - radius: 1.5 - energy: 0.5 + radius: 1 + energy: 3 color: red - type: entity @@ -104,8 +104,8 @@ shader: unshaded color: deepskyblue - type: PointLight - radius: 1.5 - energy: 1 + radius: 1 + energy: 3 color: deepskyblue - type: entity @@ -122,8 +122,8 @@ shader: unshaded color: orangered - type: PointLight - radius: 1.5 - energy: 1 + radius: 1 + energy: 3 color: orangered - type: ProjectileBatteryAmmoProvider proto: WatcherBoltMagmawing @@ -144,7 +144,7 @@ state: unshaded shader: unshaded - type: PointLight - radius: 1.5 - energy: 1 + radius: 1 + energy: 3 - type: RgbLightController layers: [ 1 ] diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml index 4dc0778efb..45c0b46d23 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml @@ -359,7 +359,7 @@ interactFailureString: petting-failure-generic - type: PointLight radius: 1.1 - energy: 1.5 + energy: 2.7 color: "#4faffb" - type: Stealth enabledOnDeath: false diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml index 9f6d57083d..be2d04fea1 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml @@ -1155,7 +1155,7 @@ - type: PointLight color: "#FFFF00" radius: 2 - energy: 1.4 + energy: 2.5 - type: entity name: suppermatter shard @@ -1179,7 +1179,7 @@ - type: PointLight color: "#FFFF00" radius: 1.4 - energy: 1.4 + energy: 2.5 - type: Tag tags: - Slice diff --git a/Resources/Prototypes/Entities/Objects/Materials/materials.yml b/Resources/Prototypes/Entities/Objects/Materials/materials.yml index 4b7477eed3..6d5bd964be 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/materials.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/materials.yml @@ -335,7 +335,7 @@ - HEAD - type: PointLight radius: 1.2 - energy: 1.5 + energy: 2.7 color: "#4faffb" slots: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml index 04b65ddb6b..97ac9e0980 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml @@ -153,7 +153,7 @@ - type: PointLight enabled: false radius: 1.5 - energy: 1.5 + energy: 2.7 color: white netsync: false @@ -212,7 +212,7 @@ - type: PointLight enabled: false radius: 1.5 - energy: 1.5 + energy: 2.7 color: white netsync: false - type: MeleeWeapon diff --git a/Resources/Prototypes/Entities/Structures/Decoration/decorated_fir_tree.yml b/Resources/Prototypes/Entities/Structures/Decoration/decorated_fir_tree.yml index b2806b93c9..06afa3785e 100644 --- a/Resources/Prototypes/Entities/Structures/Decoration/decorated_fir_tree.yml +++ b/Resources/Prototypes/Entities/Structures/Decoration/decorated_fir_tree.yml @@ -13,7 +13,7 @@ shader: unshaded - type: PointLight radius: 1.6 - energy: 1.2 + energy: 2.0 enabled: false mask: /Textures/Effects/LightMasks/cone.png autoRot: true diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/arcades.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/arcades.yml index c23c126c73..78fdd25316 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/arcades.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/arcades.yml @@ -10,7 +10,7 @@ - type: ExtensionCableReceiver - type: PointLight radius: 1.8 - energy: 1.6 + energy: 3.0 color: "#3db83b" - type: LitOnPowered - type: Sprite diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/base_structurecomputers.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/base_structurecomputers.yml index 7cccee81c0..bbd6ea8302 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/base_structurecomputers.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/base_structurecomputers.yml @@ -50,7 +50,7 @@ - type: LitOnPowered - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 enabled: false mask: /Textures/Effects/LightMasks/cone.png autoRot: true diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml index 4206f8e37d..e16380b2ef 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml @@ -110,7 +110,7 @@ type: WiresBoundUserInterface - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#43ccb5" - type: entity @@ -134,7 +134,7 @@ radius: 256 - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#43ccb5" - type: ItemSlots slots: @@ -204,7 +204,7 @@ radius: 1536 - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#c94242" - type: Computer board: SyndicateShuttleConsoleCircuitboard @@ -234,7 +234,7 @@ maxRange: 256 - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#43ccb5" - type: Computer board: CargoShuttleConsoleCircuitboard @@ -314,7 +314,7 @@ state: generic_panel_open - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#c9c042" - type: Computer board: PowerComputerCircuitboard @@ -356,7 +356,7 @@ state: generic_panel_open - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#1f8c28" - type: Computer board: MedicalRecordsComputerCircuitboard @@ -390,7 +390,7 @@ state: generic_panel_open - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#1f8c28" - type: Computer board: CriminalRecordsComputerCircuitboard @@ -417,7 +417,7 @@ key: enum.GeneralStationRecordConsoleKey.Key - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#1f8c28" - type: Computer board: StationRecordsComputerCircuitboard @@ -445,7 +445,7 @@ state: generic_panel_open - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#006400" - type: Computer board: CrewMonitoringComputerCircuitboard @@ -506,7 +506,7 @@ access: [["Research"]] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#b53ca1" - type: GuideHelp guides: @@ -555,7 +555,7 @@ board: AnalysisComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#b53ca1" - type: GuideHelp guides: @@ -615,7 +615,7 @@ board: IDComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#3c5eb5" - type: ItemSlots - type: ContainerContainer @@ -636,7 +636,7 @@ board: BodyScannerComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#1f8c28" - type: entity @@ -676,7 +676,7 @@ board: CommsComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#3c5eb5" - type: Damageable damageContainer: StructuralInorganic @@ -713,7 +713,7 @@ board: SyndicateCommsComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#f71713" - type: entity @@ -747,7 +747,7 @@ board: WizardCommsComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#F317F3" - type: entity @@ -779,7 +779,7 @@ board: CentcommCommsComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#00FF00" - type: entity @@ -813,7 +813,7 @@ board: SolarControlComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#e6e227" - type: GuideHelp guides: @@ -851,7 +851,7 @@ board: RadarConsoleCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#e6e227" - type: entity @@ -889,7 +889,7 @@ board: CargoRequestComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#b89f25" - type: AccessReader access: [["Cargo"]] @@ -1103,7 +1103,7 @@ board: CargoBountyComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#b89f25" - type: AccessReader access: [["Quartermaster"]] @@ -1146,7 +1146,7 @@ board: FundingAllocationComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#3c5eb5" - type: entity @@ -1177,7 +1177,7 @@ board: CloningConsoleComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#1f8c28" - type: DeviceLinkSource range: 4 @@ -1235,7 +1235,7 @@ board: SalvageJobBoardComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#b89f25" - type: entity @@ -1284,7 +1284,7 @@ board: SalvageExpeditionsComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#b89f25" - type: AccessReader access: [["Salvage"]] @@ -1420,7 +1420,7 @@ board: CargoSaleComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#b89f25" - type: GuideHelp guides: @@ -1486,7 +1486,7 @@ state: generic_panel_open - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#43ccb5" - type: Computer board: SensorConsoleCircuitboard diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/wooden_television.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/wooden_television.yml index b542687b57..50cc6a624c 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/wooden_television.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/wooden_television.yml @@ -16,7 +16,7 @@ board: ComputerTelevisionCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#b89f25" - type: Fixtures fixtures: diff --git a/Resources/Prototypes/Entities/Structures/Machines/anomaly_sync.yml b/Resources/Prototypes/Entities/Structures/Machines/anomaly_sync.yml index 3019b8adf8..de4ea19350 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/anomaly_sync.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/anomaly_sync.yml @@ -41,7 +41,7 @@ bounds: "-0.35,-0.35,0.35,0.35" density: 100 mask: - - ItemMask + - ItemMask hard: True - type: Transform anchored: true @@ -56,7 +56,7 @@ - type: DeviceList - type: PointLight radius: 1.8 - energy: 1.6 + energy: 3.0 color: "#b53ca1" - type: LitOnPowered - type: Appearance diff --git a/Resources/Prototypes/Entities/Structures/Machines/artifact_analyzer.yml b/Resources/Prototypes/Entities/Structures/Machines/artifact_analyzer.yml index d4fc8263a8..95684e7520 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/artifact_analyzer.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/artifact_analyzer.yml @@ -66,7 +66,7 @@ board: ArtifactAnalyzerMachineCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#b53ca1" - type: GuideHelp guides: diff --git a/Resources/Prototypes/Entities/Structures/Machines/research.yml b/Resources/Prototypes/Entities/Structures/Machines/research.yml index 765249a933..40abd4b655 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/research.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/research.yml @@ -18,8 +18,8 @@ - type: PointLight enabled: false castShadows: false - radius: 1.5 - energy: 1.6 + radius: 1.2 + energy: 3.0 color: "#b211b2" - type: LitOnPowered - type: ResearchServer @@ -95,7 +95,7 @@ active: true - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#3db83b" - type: ActivatableUI key: enum.ResearchClientUiKey.Key diff --git a/Resources/Prototypes/Entities/Structures/Machines/smartfridge.yml b/Resources/Prototypes/Entities/Structures/Machines/smartfridge.yml index dc9ad5fafa..e8c676e53a 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/smartfridge.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/smartfridge.yml @@ -24,8 +24,8 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 - energy: 1.6 + radius: 1.2 + energy: 3.0 color: "#9dc5c9" - type: Machine board: SmartFridgeCircuitboard diff --git a/Resources/Prototypes/Entities/Structures/Machines/telecomms.yml b/Resources/Prototypes/Entities/Structures/Machines/telecomms.yml index 4cfcbcd462..3caa56d3f8 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/telecomms.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/telecomms.yml @@ -92,7 +92,7 @@ enabled: false castShadows: false radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#39b8ee" - type: LitOnPowered - type: GenericVisualizer diff --git a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml index d28103b5a5..2f2f249a66 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml @@ -325,7 +325,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1 - energy: 1.3 + energy: 2.0 color: "#ffb0b0" - type: AccessReader access: [["HeadOfPersonnel"]] @@ -360,7 +360,7 @@ access: [["Service"]] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#4b93ad" - type: entity @@ -421,7 +421,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.8 - energy: 1.6 + energy: 3.0 color: "#3db83b" - type: entity @@ -452,7 +452,7 @@ map: [ "enum.WiresVisualLayers.MaintenancePanel" ] - type: PointLight radius: 1.8 - energy: 1.6 + energy: 3.0 color: "#3db83b" - type: entity @@ -493,7 +493,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.3 + energy: 2.0 color: "#ad7c4b" - type: entity @@ -529,7 +529,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#3c5eb5" - type: entity @@ -549,7 +549,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#423438" - type: entity @@ -570,7 +570,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#A50824" - type: entity @@ -593,7 +593,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#44964A" - type: entity @@ -615,7 +615,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#CBC6BE" - type: entity @@ -638,7 +638,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#D3A44D" - type: entity @@ -672,7 +672,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#66538F" - type: entity @@ -708,7 +708,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#6927C5" - type: entity @@ -744,7 +744,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#D82929" - type: entity @@ -780,7 +780,7 @@ pack: SmiteGoodbyes - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#00E645" - type: entity @@ -813,7 +813,7 @@ access: [["Kitchen"]] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#4b93ad" - type: entity @@ -843,7 +843,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#9a18d6" - type: entity @@ -876,7 +876,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#6148c7" - type: entity @@ -906,7 +906,7 @@ access: [["Engineering"]] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#b89e2a" - type: entity @@ -939,7 +939,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#9dc5c9" - type: GuideHelp guides: @@ -996,7 +996,7 @@ access: [["Hydroponics"]] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#326e3f" - type: entity @@ -1030,7 +1030,7 @@ access: [["Security"]] - type: PointLight radius: 1 - energy: 1.2 + energy: 2.0 color: "#78645c" - type: GuideHelp guides: @@ -1067,7 +1067,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#326e3f" - type: entity @@ -1110,7 +1110,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#c73434" - type: entity @@ -1140,7 +1140,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#737785" - type: entity @@ -1160,7 +1160,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#3c5eb5" - type: entity @@ -1180,7 +1180,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#CE3401" - type: entity @@ -1200,7 +1200,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#5F6A1C" - type: entity @@ -1220,7 +1220,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#207E79" - type: entity @@ -1256,7 +1256,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#389690" - type: RussianAccent @@ -1293,7 +1293,7 @@ shader: unshaded - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#c73434" - type: entity @@ -1325,7 +1325,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#9dc5c9" - type: entity @@ -1359,7 +1359,7 @@ access: [["Research"]] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#B0ADA9" - type: GuideHelp guides: @@ -1390,7 +1390,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#d4ab33" - type: entity @@ -1422,7 +1422,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#326e3f" - type: entity @@ -1455,7 +1455,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#ffe599" - type: entity @@ -1482,7 +1482,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#b89f25" - type: AccessReader access: [["Salvage"]] @@ -1520,7 +1520,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#d4ab33" # job clothing @@ -1552,7 +1552,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#326e3f" - type: AccessReader access: [["Hydroponics"]] @@ -1612,7 +1612,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#d82929" - type: AccessReader access: [["Security"]] @@ -1670,7 +1670,7 @@ access: [["Chapel"]] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#CCCCCC" #The holy C - type: entity @@ -1700,7 +1700,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#b89e2a" - type: AccessReader access: [["Cargo"]] @@ -1816,7 +1816,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#b89e2a" - type: AccessReader access: [["Engineering"]] @@ -1848,7 +1848,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#b89e2a" - type: AccessReader access: [["Engineering"]] @@ -1936,7 +1936,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#6927C5" - type: AccessReader access: [["Janitor"]] @@ -1996,7 +1996,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#d82929" - type: AccessReader access: [["NuclearOperative"], ["SyndicateAgent"]] @@ -2108,7 +2108,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#48CF48" - type: AccessReader access: [["CentralCommand"]] @@ -2142,7 +2142,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#3c5eb5" - type: DatasetVocalizer dataset: HappyHonkAds @@ -2171,7 +2171,7 @@ - type: Speech - type: PointLight radius: 1.5 - energy: 1.3 # reduced energy since the color is pure white + energy: 2.0 # reduced energy since the color is pure white color: "#FFFFFF" - type: Sprite sprite: Structures/Machines/VendingMachines/pride.rsi @@ -2284,7 +2284,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.3 - energy: 1.6 + energy: 3.0 color: "#43ccb5" - type: GuideHelp guides: diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/generators.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/generators.yml index 456a83046b..dfb273a5e8 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/generators.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/generators.yml @@ -101,7 +101,7 @@ path: /Audio/Ambience/Objects/hdd_buzz.ogg - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#3db83b" castShadows: false netsync: false diff --git a/Resources/Prototypes/Entities/Structures/Power/apc.yml b/Resources/Prototypes/Entities/Structures/Power/apc.yml index 0addb34704..ec8b86e173 100644 --- a/Resources/Prototypes/Entities/Structures/Power/apc.yml +++ b/Resources/Prototypes/Entities/Structures/Power/apc.yml @@ -16,7 +16,7 @@ path: /Audio/Ambience/Objects/hdd_buzz.ogg - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#3db83b" castShadows: false netsync: false diff --git a/Resources/Prototypes/Entities/Structures/Power/smes.yml b/Resources/Prototypes/Entities/Structures/Power/smes.yml index 9c5162a421..3572fe6a39 100644 --- a/Resources/Prototypes/Entities/Structures/Power/smes.yml +++ b/Resources/Prototypes/Entities/Structures/Power/smes.yml @@ -64,8 +64,8 @@ supplyRampTolerance: 5000 supplyRampRate: 1000 - type: PointLight - radius: 1.5 - energy: 1.6 + radius: 1.2 + energy: 3.0 color: "#c9c042" castShadows: false - type: WiresPanel diff --git a/Resources/Prototypes/Entities/Structures/Specific/Anomaly/cores.yml b/Resources/Prototypes/Entities/Structures/Specific/Anomaly/cores.yml index 45a5a6d4d6..492ab11f0c 100644 --- a/Resources/Prototypes/Entities/Structures/Specific/Anomaly/cores.yml +++ b/Resources/Prototypes/Entities/Structures/Specific/Anomaly/cores.yml @@ -43,7 +43,7 @@ sprite: Structures/Specific/Anomalies/Cores/pyro_core.rsi - type: PointLight radius: 1.5 - energy: 1.5 + energy: 2.7 color: "#E25822" castShadows: false - type: IgnitionSource @@ -72,7 +72,7 @@ sprite: Structures/Specific/Anomalies/Cores/ice_core.rsi - type: PointLight radius: 1.5 - energy: 1.5 + energy: 2.7 color: "#befaff" castShadows: false @@ -223,7 +223,7 @@ sprite: Structures/Specific/Anomalies/Cores/pyro_core.rsi - type: PointLight radius: 1.5 - energy: 1.5 + energy: 2.7 color: "#fca3c0" castShadows: false @@ -249,7 +249,7 @@ sprite: Structures/Specific/Anomalies/Cores/ice_core.rsi - type: PointLight radius: 1.5 - energy: 1.5 + energy: 2.7 color: "#befaff" castShadows: false diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/WallmountMachines/Monitors/telescreens.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/WallmountMachines/Monitors/telescreens.yml index ed585aa185..0705a60b49 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/WallmountMachines/Monitors/telescreens.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/WallmountMachines/Monitors/telescreens.yml @@ -28,7 +28,7 @@ node: Telescreen - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#b89f25" - type: DeviceNetwork deviceNetId: Wired diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/WallmountMachines/Monitors/televisions.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/WallmountMachines/Monitors/televisions.yml index b600ece985..fd1e895f70 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/WallmountMachines/Monitors/televisions.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/WallmountMachines/Monitors/televisions.yml @@ -35,7 +35,7 @@ type: SurveillanceCameraMonitorBoundUserInterface - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#b89f25" - type: Destructible thresholds: From 11055ce314fc4437110ca59b65889bcd12156b59 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 9 Nov 2025 16:30:32 +0000 Subject: [PATCH 020/106] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index cf2b09af5a..14c0a008fb 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: beck-thompson - changes: - - message: Recycler now properly recycles item stacks. - type: Fix - id: 8692 - time: '2025-06-18T21:14:01.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38433 - author: Bhijn and Myr changes: - message: In interest of raising awareness of addiction to the game, the lobby @@ -3925,3 +3918,12 @@ id: 9193 time: '2025-11-09T07:54:23.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41362 +- author: mirrorcult + changes: + - message: Lighting attenuation has changed slightly. You shouldn't notice much + difference, but the edges of lights should look better. If any lights are significantly + different than they used to be, make a GitHub issue. + type: Tweak + id: 9194 + time: '2025-11-09T16:29:24.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41361 From 3dc0d0080d9aea1adc0c68b3de0d2ea5cc646c37 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Mon, 10 Nov 2025 20:25:35 +1100 Subject: [PATCH 021/106] Fix invalid AABBs (#41381) LBRT LBRT LBRT LBRT not RTLB --- .../Prototypes/Entities/Structures/Lighting/base_lighting.yml | 4 ++-- .../Entities/Structures/Lighting/ground_lighting.yml | 2 +- .../Entities/Structures/Lighting/strobe_lighting.yml | 2 +- Resources/Prototypes/Entities/Structures/Walls/railing.yml | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Resources/Prototypes/Entities/Structures/Lighting/base_lighting.yml b/Resources/Prototypes/Entities/Structures/Lighting/base_lighting.yml index 8330bf2fd4..e769d81fbb 100644 --- a/Resources/Prototypes/Entities/Structures/Lighting/base_lighting.yml +++ b/Resources/Prototypes/Entities/Structures/Lighting/base_lighting.yml @@ -51,7 +51,7 @@ fix1: shape: !type:PhysShapeAabb - bounds: "-0.4,0.5,0.4,0.35" + bounds: "-0.4,0.35,0.4,0.5" density: 190 mask: - None @@ -275,7 +275,7 @@ fix1: shape: !type:PhysShapeAabb - bounds: "-0.1,0.5,0.1,0.255" + bounds: "-0.1,0.255,0.1,0.5" density: 190 mask: - None diff --git a/Resources/Prototypes/Entities/Structures/Lighting/ground_lighting.yml b/Resources/Prototypes/Entities/Structures/Lighting/ground_lighting.yml index 222ea5c814..2642d4217e 100644 --- a/Resources/Prototypes/Entities/Structures/Lighting/ground_lighting.yml +++ b/Resources/Prototypes/Entities/Structures/Lighting/ground_lighting.yml @@ -22,7 +22,7 @@ fix1: shape: !type:PhysShapeAabb - bounds: "0.17,0.25,-0.17,-0.30" + bounds: "-0.17,-0.30,0.17,0.25" density: 190 mask: - MachineMask diff --git a/Resources/Prototypes/Entities/Structures/Lighting/strobe_lighting.yml b/Resources/Prototypes/Entities/Structures/Lighting/strobe_lighting.yml index c1aa9b97d8..eb8c658fe5 100644 --- a/Resources/Prototypes/Entities/Structures/Lighting/strobe_lighting.yml +++ b/Resources/Prototypes/Entities/Structures/Lighting/strobe_lighting.yml @@ -45,7 +45,7 @@ fix1: shape: !type:PhysShapeAabb - bounds: "-0.2,0.5,0.2,0.35" + bounds: "-0.2,0.35,0.2,0.5" density: 190 mask: - None diff --git a/Resources/Prototypes/Entities/Structures/Walls/railing.yml b/Resources/Prototypes/Entities/Structures/Walls/railing.yml index db456c512f..869f423887 100644 --- a/Resources/Prototypes/Entities/Structures/Walls/railing.yml +++ b/Resources/Prototypes/Entities/Structures/Walls/railing.yml @@ -93,7 +93,7 @@ fix2: shape: !type:PhysShapeAabb - bounds: "0.49,0.49,0.25,-0.49" + bounds: "0.25,-0.49,0.49,0.49" density: 1000 mask: - TableMask @@ -139,7 +139,7 @@ fix1: shape: !type:PhysShapeAabb - bounds: "-0.49,0.49,-0.25,0.25" + bounds: "-0.49,0.25,-0.25,0.49" density: 1000 mask: - TableMask From ce226b0c16b871e3c8fd08538b0556de47993fad Mon Sep 17 00:00:00 2001 From: kin98 <51699101+kin98@users.noreply.github.com> Date: Mon, 10 Nov 2025 12:30:24 +0100 Subject: [PATCH 022/106] Fix: obsolete warnings in SharedAbsorbentSystem (#40885) * fix: formating warnings * split GetAbsorbentReagents into string and protoid * fix: changed SplitSolutionWhitout [obsolete] to use new method * fix: missing using directive after merge * Replaced methods with ProtoId variant --- Content.Shared/Chemistry/Components/Solution.cs | 10 +++++----- .../SharedSolutionContainerSystem.cs | 10 +++++----- .../Chemistry/Reagent/ReagentPrototype.cs | 2 +- .../Fluids/SharedPuddleSystem.Evaporation.cs | 16 +++++++++------- Content.Shared/Fluids/SharedPuddleSystem.cs | 2 +- 5 files changed, 21 insertions(+), 19 deletions(-) diff --git a/Content.Shared/Chemistry/Components/Solution.cs b/Content.Shared/Chemistry/Components/Solution.cs index 2179469c08..df09f7f3f6 100644 --- a/Content.Shared/Chemistry/Components/Solution.cs +++ b/Content.Shared/Chemistry/Components/Solution.cs @@ -302,7 +302,7 @@ namespace Content.Shared.Chemistry.Components /// If you only want the volume of a single reagent, use /// [Pure] - public FixedPoint2 GetTotalPrototypeQuantity(params string[] prototypes) + public FixedPoint2 GetTotalPrototypeQuantity(params ProtoId[] prototypes) { var total = FixedPoint2.Zero; foreach (var (reagent, quantity) in Contents) @@ -314,7 +314,7 @@ namespace Content.Shared.Chemistry.Components return total; } - public FixedPoint2 GetTotalPrototypeQuantity(string id) + public FixedPoint2 GetTotalPrototypeQuantity(ProtoId id) { var total = FixedPoint2.Zero; foreach (var (reagent, quantity) in Contents) @@ -645,7 +645,7 @@ namespace Content.Shared.Chemistry.Components /// /// Splits a solution with only the specified reagent prototypes. /// - public Solution SplitSolutionWithOnly(FixedPoint2 toTake, params string[] includedPrototypes) + public Solution SplitSolutionWithOnly(FixedPoint2 toTake, params ProtoId[] includedPrototypes) { // First remove the non-included prototypes List excluded = new(); @@ -844,7 +844,7 @@ namespace Content.Shared.Chemistry.Components ValidateSolution(); } - public Color GetColorWithout(IPrototypeManager? protoMan, params string[] without) + public Color GetColorWithout(IPrototypeManager? protoMan, params ProtoId[] without) { if (Volume == FixedPoint2.Zero) { @@ -887,7 +887,7 @@ namespace Content.Shared.Chemistry.Components return GetColorWithout(protoMan); } - public Color GetColorWithOnly(IPrototypeManager? protoMan, params string[] included) + public Color GetColorWithOnly(IPrototypeManager? protoMan, params ProtoId[] included) { if (Volume == FixedPoint2.Zero) { diff --git a/Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.cs b/Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.cs index a245c0b606..cd38df021d 100644 --- a/Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.cs +++ b/Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.cs @@ -858,7 +858,7 @@ public abstract partial class SharedSolutionContainerSystem : EntitySystem args.PushMarkup(Loc.GetString(entity.Comp.LocPhysicalQuality, ("color", colorHex), ("desc", primary.LocalizedPhysicalDescription), - ("chemCount", solution.Contents.Count) )); + ("chemCount", solution.Contents.Count))); // Push the recognizable reagents @@ -1048,7 +1048,7 @@ public abstract partial class SharedSolutionContainerSystem : EntitySystem public bool EnsureSolution( Entity entity, string name, - [NotNullWhen(true)]out Solution? solution, + [NotNullWhen(true)] out Solution? solution, FixedPoint2 maxVol = default) { return EnsureSolution(entity, name, maxVol, null, out _, out solution); @@ -1058,7 +1058,7 @@ public abstract partial class SharedSolutionContainerSystem : EntitySystem Entity entity, string name, out bool existed, - [NotNullWhen(true)]out Solution? solution, + [NotNullWhen(true)] out Solution? solution, FixedPoint2 maxVol = default) { return EnsureSolution(entity, name, maxVol, null, out existed, out solution); @@ -1240,13 +1240,13 @@ public abstract partial class SharedSolutionContainerSystem : EntitySystem } else { - dissolvedSol.RemoveReagent(reagent,amtChange); + dissolvedSol.RemoveReagent(reagent, amtChange); } UpdateChemicals(dissolvedSolution); } public FixedPoint2 GetReagentQuantityFromConcentration(Entity dissolvedSolution, - FixedPoint2 volume,float concentration) + FixedPoint2 volume, float concentration) { var dissolvedSol = dissolvedSolution.Comp.Solution; if (volume == 0 diff --git a/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs b/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs index 3b16b577cb..e634e03284 100644 --- a/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs +++ b/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs @@ -221,7 +221,7 @@ namespace Content.Shared.Chemistry.Reagent if (effect.EntityEffectGuidebookText(prototype, entSys) is not { } description) return null; - var quantity = metabolism == null ? 0f : (double) (effect.MinScale * metabolism); + var quantity = metabolism == null ? 0f : (double)(effect.MinScale * metabolism); return Loc.GetString( "guidebook-reagent-effect-description", diff --git a/Content.Shared/Fluids/SharedPuddleSystem.Evaporation.cs b/Content.Shared/Fluids/SharedPuddleSystem.Evaporation.cs index 9854560204..0ba1c15122 100644 --- a/Content.Shared/Fluids/SharedPuddleSystem.Evaporation.cs +++ b/Content.Shared/Fluids/SharedPuddleSystem.Evaporation.cs @@ -1,7 +1,9 @@ using System.Linq; using Content.Shared.Chemistry.Components; using Content.Shared.FixedPoint; +using Robust.Shared.Prototypes; using Content.Shared.Fluids.Components; +using Content.Shared.Chemistry.Reagent; namespace Content.Shared.Fluids; @@ -78,9 +80,9 @@ public abstract partial class SharedPuddleSystem } - public string[] GetEvaporatingReagents(Solution solution) + public ProtoId[] GetEvaporatingReagents(Solution solution) { - List evaporatingReagents = []; + List> evaporatingReagents = []; foreach (var solProto in solution.GetReagentPrototypes(_prototypeManager).Keys) { if (solProto.EvaporationSpeed > FixedPoint2.Zero) @@ -89,10 +91,10 @@ public abstract partial class SharedPuddleSystem return evaporatingReagents.ToArray(); } - public string[] GetAbsorbentReagents(Solution solution) + public ProtoId[] GetAbsorbentReagents(Solution solution) { - List absorbentReagents = []; - foreach (var solProto in solution.GetReagentPrototypes(_prototypeManager).Keys) + var absorbentReagents = new List>(); + foreach (ReagentPrototype solProto in solution.GetReagentPrototypes(_prototypeManager).Keys) { if (solProto.Absorbent) absorbentReagents.Add(solProto.ID); @@ -109,9 +111,9 @@ public abstract partial class SharedPuddleSystem /// Gets a mapping of evaporating speed of the reagents within a solution. /// The speed at which a solution evaporates is the average of the speed of all evaporating reagents in it. /// - public Dictionary GetEvaporationSpeeds(Solution solution) + public Dictionary, FixedPoint2> GetEvaporationSpeeds(Solution solution) { - Dictionary evaporatingSpeeds = []; + Dictionary, FixedPoint2> evaporatingSpeeds = []; foreach (var solProto in solution.GetReagentPrototypes(_prototypeManager).Keys) { if (solProto.EvaporationSpeed > FixedPoint2.Zero) diff --git a/Content.Shared/Fluids/SharedPuddleSystem.cs b/Content.Shared/Fluids/SharedPuddleSystem.cs index a2ea262796..e81d1c9d11 100644 --- a/Content.Shared/Fluids/SharedPuddleSystem.cs +++ b/Content.Shared/Fluids/SharedPuddleSystem.cs @@ -42,7 +42,7 @@ public abstract partial class SharedPuddleSystem : EntitySystem [Dependency] private readonly StepTriggerSystem _stepTrigger = default!; [Dependency] private readonly TileFrictionController _tile = default!; - private string[] _standoutReagents = []; + private ProtoId[] _standoutReagents = []; /// /// The lowest threshold to be considered for puddle sprite states as well as slipperiness of a puddle. From 4af0e586bd083afa934fc6dc87c78a338fde731d Mon Sep 17 00:00:00 2001 From: beck-thompson <107373427+beck-thompson@users.noreply.github.com> Date: Mon, 10 Nov 2025 05:47:02 -0800 Subject: [PATCH 023/106] Remove wizards healing wand for the random magic item spell (#41365) Remove wizards healing wand for the random spell --- Resources/Prototypes/Magic/event_spells.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/Resources/Prototypes/Magic/event_spells.yml b/Resources/Prototypes/Magic/event_spells.yml index e32bbac3d5..b619b8abe8 100644 --- a/Resources/Prototypes/Magic/event_spells.yml +++ b/Resources/Prototypes/Magic/event_spells.yml @@ -204,8 +204,6 @@ orGroup: Magics - id: WeaponWandPolymorphBread orGroup: Magics - - id: WeaponStaffHealing - orGroup: Magics - id: WeaponStaffPolymorphDoor orGroup: Magics - id: AnimationStaff From 00b542220be2756176a75868d39c76647aa96399 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 10 Nov 2025 13:59:03 +0000 Subject: [PATCH 024/106] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 14c0a008fb..92034d6e08 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Bhijn and Myr - changes: - - message: In interest of raising awareness of addiction to the game, the lobby - will now display your current playtime on a given day once it exceeds a threshold. - type: Add - id: 8693 - time: '2025-06-19T01:06:26.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/36483 - author: ScarKy0 changes: - message: APCs now have a wirepanel. It can be used to disallow the AI from accessing @@ -3927,3 +3919,11 @@ id: 9194 time: '2025-11-09T16:29:24.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41361 +- author: beck-thompson + changes: + - message: The Summon Magic spell no longer will give out healing wands. When there + are more wands added it will be brought back + type: Tweak + id: 9195 + time: '2025-11-10T13:57:52.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41365 From 158f351900d0bd93917351677174b61228b9f55d Mon Sep 17 00:00:00 2001 From: Aiden <28298836+Aidenkrz@users.noreply.github.com> Date: Mon, 10 Nov 2025 12:06:18 -0600 Subject: [PATCH 025/106] Prototype-ize Mind (#41384) * Use MindBase prototype for mind creation * Create mind.yml * Add ContainerContainer --- Content.Shared/Mind/SharedMindSystem.cs | 5 ++++- Resources/Prototypes/Entities/Virtual/mind.yml | 10 ++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 Resources/Prototypes/Entities/Virtual/mind.yml diff --git a/Content.Shared/Mind/SharedMindSystem.cs b/Content.Shared/Mind/SharedMindSystem.cs index 309f37be3f..a7d3357f00 100644 --- a/Content.Shared/Mind/SharedMindSystem.cs +++ b/Content.Shared/Mind/SharedMindSystem.cs @@ -20,6 +20,7 @@ using Robust.Shared.Containers; using Robust.Shared.Map; using Robust.Shared.Network; using Robust.Shared.Player; +using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Utility; @@ -43,6 +44,8 @@ public abstract partial class SharedMindSystem : EntitySystem private HashSet> _pickingMinds = new(); + private readonly EntProtoId _mindProto = "MindBase"; + public override void Initialize() { base.Initialize(); @@ -226,7 +229,7 @@ public abstract partial class SharedMindSystem : EntitySystem public Entity CreateMind(NetUserId? userId, string? name = null) { - var mindId = Spawn(null, MapCoordinates.Nullspace); + var mindId = Spawn(_mindProto, MapCoordinates.Nullspace); _metadata.SetEntityName(mindId, name == null ? "mind" : $"mind ({name})"); var mind = EnsureComp(mindId); mind.CharacterName = name; diff --git a/Resources/Prototypes/Entities/Virtual/mind.yml b/Resources/Prototypes/Entities/Virtual/mind.yml new file mode 100644 index 0000000000..33e9ba273a --- /dev/null +++ b/Resources/Prototypes/Entities/Virtual/mind.yml @@ -0,0 +1,10 @@ +- type: entity + id: MindBase + name: mind + categories: [ HideSpawnMenu ] + components: + - type: Mind + - type: ContainerContainer + containers: + mind_roles: !type:Container + ents: [] From 26d95b7944b63aa03001c52c432b9419347229ef Mon Sep 17 00:00:00 2001 From: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> Date: Mon, 10 Nov 2025 10:42:13 -0800 Subject: [PATCH 026/106] Document Atmospherics API (#41382) * api docs * rem using dir. linq in atmospherics not allowed. * address review --- .../EntitySystems/AtmosphereSystem.API.cs | 319 ++++++++++++++++-- 1 file changed, 288 insertions(+), 31 deletions(-) diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.API.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.API.cs index 29f091f340..96a5c69457 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.API.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.API.cs @@ -1,5 +1,4 @@ using System.Diagnostics; -using System.Linq; using Content.Server.Atmos.Components; using Content.Server.Atmos.Piping.Components; using Content.Server.NodeContainer.NodeGroups; @@ -14,6 +13,22 @@ namespace Content.Server.Atmos.EntitySystems; public partial class AtmosphereSystem { + /* + General API for interacting with AtmosphereSystem. + + If you feel like you're stepping on eggshells because you can't access things in AtmosphereSystem, + consider adding a method here instead of making your own way to work around it. + */ + + /// + /// Gets the that an entity is contained within. + /// + /// The entity to get the mixture for. + /// If true, will ignore mixtures that the entity is contained in + /// (ex. lockers and cryopods) and just get the tile mixture. + /// If true, will mark the tile as active for atmosphere processing. + /// A if one could be found, null otherwise. + [PublicAPI] public GasMixture? GetContainingMixture(Entity ent, bool ignoreExposed = false, bool excite = false) { if (!Resolve(ent, ref ent.Comp)) @@ -22,6 +37,17 @@ public partial class AtmosphereSystem return GetContainingMixture(ent, ent.Comp.GridUid, ent.Comp.MapUid, ignoreExposed, excite); } + /// + /// Gets the that an entity is contained within. + /// + /// The entity to get the mixture for. + /// The grid that the entity may be on. + /// The map that the entity may be on. + /// If true, will ignore mixtures that the entity is contained in + /// (ex. lockers and cryopods) and just get the tile mixture. + /// If true, will mark the tile as active for atmosphere processing. + /// A if one could be found, null otherwise. + [PublicAPI] public GasMixture? GetContainingMixture( Entity ent, Entity? grid, @@ -49,16 +75,38 @@ public partial class AtmosphereSystem return GetTileMixture(grid, map, position, excite); } - public bool HasAtmosphere(EntityUid gridUid) => _atmosQuery.HasComponent(gridUid); + /// + /// Checks if a grid has an atmosphere. + /// + /// The grid to check. + /// True if the grid has an atmosphere, false otherwise. + [PublicAPI] + public bool HasAtmosphere(EntityUid gridUid) + { + return _atmosQuery.HasComponent(gridUid); + } + /// + /// Sets whether a grid is simulated by Atmospherics. + /// + /// The grid to set. + /// Whether the grid should be simulated. + /// >True if the grid's simulated state was changed, false otherwise. + [PublicAPI] public bool SetSimulatedGrid(EntityUid gridUid, bool simulated) { + // TODO ATMOS this event literally has no subscribers. Did this just get silently refactored out? var ev = new SetSimulatedGridMethodEvent(gridUid, simulated); RaiseLocalEvent(gridUid, ref ev); return ev.Handled; } + /// + /// Checks whether a grid is simulated by Atmospherics. + /// + /// The grid to check. + /// >True if the grid is simulated, false otherwise. public bool IsSimulatedGrid(EntityUid gridUid) { var ev = new IsSimulatedGridMethodEvent(gridUid); @@ -67,24 +115,53 @@ public partial class AtmosphereSystem return ev.Simulated; } + /// + /// Gets all s on a grid. + /// + /// The grid to get mixtures for. + /// Whether to mark all tiles as active for atmosphere processing. + /// An enumerable of all gas mixtures on the grid. + [PublicAPI] public IEnumerable GetAllMixtures(EntityUid gridUid, bool excite = false) { var ev = new GetAllMixturesMethodEvent(gridUid, excite); RaiseLocalEvent(gridUid, ref ev); - if(!ev.Handled) - return Enumerable.Empty(); + if (!ev.Handled) + return []; DebugTools.AssertNotNull(ev.Mixtures); return ev.Mixtures!; } + /// + /// Invalidates a tile on a grid, marking it for revalidation. + /// + /// Frequently used tile data like are determined once and cached. + /// If this tile's state changes, ex. being added or removed, then this position in the map needs to + /// be updated. + /// + /// Tiles that need to be updated are marked as invalid and revalidated before all other + /// processing stages. + /// + /// The grid entity. + /// The tile to invalidate. + [PublicAPI] public void InvalidateTile(Entity entity, Vector2i tile) { if (_atmosQuery.Resolve(entity.Owner, ref entity.Comp, false)) entity.Comp.InvalidatedCoords.Add(tile); } + /// + /// Gets the gas mixtures for a list of tiles on a grid or map. + /// + /// The grid to get mixtures from. + /// The map to get mixtures from. + /// The list of tiles to get mixtures for. + /// Whether to mark the tiles as active for atmosphere processing. + /// >An array of gas mixtures corresponding to the input tiles. + [PublicAPI] public GasMixture?[]? GetTileMixtures( Entity? grid, Entity? map, @@ -95,7 +172,7 @@ public partial class AtmosphereSystem var handled = false; // If we've been passed a grid, try to let it handle it. - if (grid is {} gridEnt && Resolve(gridEnt, ref gridEnt.Comp1)) + if (grid is { } gridEnt && _atmosQuery.Resolve(gridEnt, ref gridEnt.Comp1)) { if (excite) Resolve(gridEnt, ref gridEnt.Comp2); @@ -128,7 +205,7 @@ public partial class AtmosphereSystem // We either don't have a grid, or the event wasn't handled. // Let the map handle it instead, and also broadcast the event. - if (map is {} mapEnt && _mapAtmosQuery.Resolve(mapEnt, ref mapEnt.Comp)) + if (map is { } mapEnt && _mapAtmosQuery.Resolve(mapEnt, ref mapEnt.Comp)) { mixtures ??= new GasMixture?[tiles.Count]; for (var i = 0; i < tiles.Count; i++) @@ -145,10 +222,21 @@ public partial class AtmosphereSystem { mixtures[i] ??= GasMixture.SpaceGas; } + return mixtures; } - public GasMixture? GetTileMixture (Entity entity, bool excite = false) + /// + /// Gets the gas mixture for a specific tile that an entity is on. + /// + /// The entity to get the tile mixture for. + /// Whether to mark the tile as active for atmosphere processing. + /// A if one could be found, null otherwise. + /// This does not return the that the entity + /// may be contained in, ex. if the entity is currently in a locker/crate with its own + /// . + [PublicAPI] + public GasMixture? GetTileMixture(Entity entity, bool excite = false) { if (!Resolve(entity.Owner, ref entity.Comp)) return null; @@ -157,6 +245,15 @@ public partial class AtmosphereSystem return GetTileMixture(entity.Comp.GridUid, entity.Comp.MapUid, indices, excite); } + /// + /// Gets the gas mixture for a specific tile on a grid or map. + /// + /// The grid to get the mixture from. + /// The map to get the mixture from. + /// The tile to get the mixture from. + /// Whether to mark the tile as active for atmosphere processing. + /// >A if one could be found, null otherwise. + [PublicAPI] public GasMixture? GetTileMixture( Entity? grid, Entity? map, @@ -164,8 +261,8 @@ public partial class AtmosphereSystem bool excite = false) { // If we've been passed a grid, try to let it handle it. - if (grid is {} gridEnt - && Resolve(gridEnt, ref gridEnt.Comp1, false) + if (grid is { } gridEnt + && _atmosQuery.Resolve(gridEnt, ref gridEnt.Comp1, false) && gridEnt.Comp1.Tiles.TryGetValue(gridTile, out var tile)) { if (excite) @@ -177,13 +274,20 @@ public partial class AtmosphereSystem return tile.Air; } - if (map is {} mapEnt && _mapAtmosQuery.Resolve(mapEnt, ref mapEnt.Comp, false)) + if (map is { } mapEnt && _mapAtmosQuery.Resolve(mapEnt, ref mapEnt.Comp, false)) return mapEnt.Comp.Mixture; // Default to a space mixture... This is a space game, after all! return GasMixture.SpaceGas; } + /// + /// Triggers a tile's to react. + /// + /// The grid to react the tile on. + /// The tile to react. + /// The result of the reaction. + [PublicAPI] public ReactionResult ReactTile(EntityUid gridId, Vector2i tile) { var ev = new ReactTileMethodEvent(gridId, tile); @@ -194,24 +298,49 @@ public partial class AtmosphereSystem return ev.Result; } - public bool IsTileAirBlocked(EntityUid gridUid, Vector2i tile, AtmosDirection directions = AtmosDirection.All, MapGridComponent? mapGridComp = null) + /// + /// Checks if a tile on a grid is air-blocked in the specified directions. + /// + /// The grid to check. + /// The tile on the grid to check. + /// The directions to check for air-blockage. + /// Optional map grid component associated with the grid. + /// True if the tile is air-blocked in the specified directions, false otherwise. + [PublicAPI] + public bool IsTileAirBlocked(EntityUid gridUid, + Vector2i tile, + AtmosDirection directions = AtmosDirection.All, + MapGridComponent? mapGridComp = null) { if (!Resolve(gridUid, ref mapGridComp, false)) return false; + // TODO ATMOS: This reconstructs the data instead of getting the cached version. Might want to include a method to get the cached version later. var data = GetAirtightData(gridUid, mapGridComp, tile); return data.BlockedDirections.IsFlagSet(directions); } + /// + /// Checks if a tile on a grid or map is space as defined by a tile's definition of space. + /// Some tiles can hold back space and others cannot - for example, plating can hold + /// back space, whereas scaffolding cannot, exposing the map atmosphere beneath. + /// + /// This does not check if the on the tile is space, + /// it only checks the current tile's ability to hold back space. + /// The grid to check. + /// The map to check. + /// The tile to check. + /// True if the tile is space, false otherwise. + [PublicAPI] public bool IsTileSpace(Entity? grid, Entity? map, Vector2i tile) { - if (grid is {} gridEnt && _atmosQuery.Resolve(gridEnt, ref gridEnt.Comp, false) - && gridEnt.Comp.Tiles.TryGetValue(tile, out var tileAtmos)) + if (grid is { } gridEnt && _atmosQuery.Resolve(gridEnt, ref gridEnt.Comp, false) + && gridEnt.Comp.Tiles.TryGetValue(tile, out var tileAtmos)) { return tileAtmos.Space; } - if (map is {} mapEnt && _mapAtmosQuery.Resolve(mapEnt, ref mapEnt.Comp, false)) + if (map is { } mapEnt && _mapAtmosQuery.Resolve(mapEnt, ref mapEnt.Comp, false)) return mapEnt.Comp.Space; // If nothing handled the event, it'll default to true. @@ -219,28 +348,77 @@ public partial class AtmosphereSystem return true; } + /// + /// Checks if the gas mixture on a tile is "probably safe". + /// Probably safe is defined as having at least air alarm-grade safe pressure and temperature. + /// (more than 260K, less than 360K, and between safe low and high pressure as defined in + /// and ) + /// + /// The grid to check. + /// The map to check. + /// The tile to check. + /// True if the tile's mixture is probably safe, false otherwise. + [PublicAPI] public bool IsTileMixtureProbablySafe(Entity? grid, Entity map, Vector2i tile) { return IsMixtureProbablySafe(GetTileMixture(grid, map, tile)); } + /// + /// Gets the heat capacity of the gas mixture on a tile. + /// + /// The grid to check. + /// The map to check. + /// The tile on the grid/map to check. + /// >The heat capacity of the tile's mixture, or the heat capacity of space if a mixture could not be found. + [PublicAPI] public float GetTileHeatCapacity(Entity? grid, Entity map, Vector2i tile) { return GetHeatCapacity(GetTileMixture(grid, map, tile) ?? GasMixture.SpaceGas); } + /// + /// Gets an enumerator for the adjacent tile mixtures of a tile on a grid. + /// + /// The grid to get adjacent tile mixtures from. + /// The tile to get adjacent mixtures for. + /// Whether to include blocked adjacent tiles. + /// Whether to mark the adjacent tiles as active for atmosphere processing. + /// An enumerator for the adjacent tile mixtures. + [PublicAPI] public TileMixtureEnumerator GetAdjacentTileMixtures(Entity grid, Vector2i tile, bool includeBlocked = false, bool excite = false) { + // TODO ATMOS includeBlocked and excite parameters are unhandled currently. if (!_atmosQuery.Resolve(grid, ref grid.Comp, false)) return TileMixtureEnumerator.Empty; return !grid.Comp.Tiles.TryGetValue(tile, out var atmosTile) ? TileMixtureEnumerator.Empty - : new(atmosTile.AdjacentTiles); + : new TileMixtureEnumerator(atmosTile.AdjacentTiles); } - public void HotspotExpose(Entity grid, Vector2i tile, float exposedTemperature, float exposedVolume, - EntityUid? sparkSourceUid = null, bool soh = false) + /// + /// Exposes a tile to a hotspot of given temperature and volume, igniting it if conditions are met. + /// + /// The grid to expose the tile on. + /// The tile to expose. + /// The temperature of the hotspot to expose. + /// You can think of this as exposing a temperature of a flame. + /// The volume of the hotspot to expose. + /// You can think of this as how big the flame is initially. + /// Bigger flames will ramp a fire faster. + /// Whether to "boost" a fire that's currently on the tile already. + /// Does nothing if the tile isn't already a hotspot. + /// This clamps the temperature and volume of the hotspot to the maximum + /// of the provided parameters and whatever's on the tile. + /// Entity that started the exposure for admin logging. + [PublicAPI] + public void HotspotExpose(Entity grid, + Vector2i tile, + float exposedTemperature, + float exposedVolume, + EntityUid? sparkSourceUid = null, + bool soh = false) { if (!_atmosQuery.Resolve(grid, ref grid.Comp, false)) return; @@ -249,8 +427,26 @@ public partial class AtmosphereSystem HotspotExpose(grid.Comp, atmosTile, exposedTemperature, exposedVolume, soh, sparkSourceUid); } - public void HotspotExpose(TileAtmosphere tile, float exposedTemperature, float exposedVolume, - EntityUid? sparkSourceUid = null, bool soh = false) + /// + /// Exposes a tile to a hotspot of given temperature and volume, igniting it if conditions are met. + /// + /// The to expose. + /// The temperature of the hotspot to expose. + /// You can think of this as exposing a temperature of a flame. + /// The volume of the hotspot to expose. + /// You can think of this as how big the flame is initially. + /// Bigger flames will ramp a fire faster. + /// Whether to "boost" a fire that's currently on the tile already. + /// Does nothing if the tile isn't already a hotspot. + /// This clamps the temperature and volume of the hotspot to the maximum + /// of the provided parameters and whatever's on the tile. + /// Entity that started the exposure for admin logging. + [PublicAPI] + public void HotspotExpose(TileAtmosphere tile, + float exposedTemperature, + float exposedVolume, + EntityUid? sparkSourceUid = null, + bool soh = false) { if (!_atmosQuery.TryGetComponent(tile.GridIndex, out var atmos)) return; @@ -259,12 +455,25 @@ public partial class AtmosphereSystem HotspotExpose(atmos, tile, exposedTemperature, exposedVolume, soh, sparkSourceUid); } + /// + /// Extinguishes a hotspot on a tile. + /// + /// The grid to extinguish the hotspot on. + /// The tile on the grid to extinguish the hotspot on. + [PublicAPI] public void HotspotExtinguish(EntityUid gridUid, Vector2i tile) { var ev = new HotspotExtinguishMethodEvent(gridUid, tile); RaiseLocalEvent(gridUid, ref ev); } + /// + /// Checks if a hotspot is active on a tile. + /// + /// The grid to check. + /// The tile on the grid to check. + /// True if a hotspot is active on the tile, false otherwise. + [PublicAPI] public bool IsHotspotActive(EntityUid gridUid, Vector2i tile) { var ev = new IsHotspotActiveMethodEvent(gridUid, tile); @@ -274,11 +483,25 @@ public partial class AtmosphereSystem return ev.Result; } + /// + /// Adds a to a grid. + /// + /// The grid to add the pipe net to. + /// The pipe net to add. + /// True if the pipe net was added, false otherwise. + [PublicAPI] public bool AddPipeNet(Entity grid, PipeNet pipeNet) { return _atmosQuery.Resolve(grid, ref grid.Comp, false) && grid.Comp.PipeNets.Add(pipeNet); } + /// + /// Removes a from a grid. + /// + /// The grid to remove the pipe net from. + /// The pipe net to remove. + /// True if the pipe net was removed, false otherwise. + [PublicAPI] public bool RemovePipeNet(Entity grid, PipeNet pipeNet) { // Technically this event can be fired even on grids that don't @@ -292,6 +515,13 @@ public partial class AtmosphereSystem return _atmosQuery.Resolve(grid, ref grid.Comp, false) && grid.Comp.PipeNets.Remove(pipeNet); } + /// + /// Adds an entity with an to a grid's list of atmos devices. + /// + /// The grid to add the device to. + /// The device to add. + /// True if the device was added, false otherwise. + [PublicAPI] public bool AddAtmosDevice(Entity grid, Entity device) { DebugTools.Assert(device.Comp.JoinedGrid == null); @@ -307,6 +537,12 @@ public partial class AtmosphereSystem return true; } + /// + /// Removes an entity with an from a grid's list of atmos devices. + /// + /// The grid to remove the device from. + /// The device to remove. + /// True if the device was removed, false otherwise. public bool RemoveAtmosDevice(Entity grid, Entity device) { DebugTools.Assert(device.Comp.JoinedGrid == grid); @@ -418,23 +654,44 @@ public partial class AtmosphereSystem return contains; } - [ByRefEvent] private record struct SetSimulatedGridMethodEvent - (EntityUid Grid, bool Simulated, bool Handled = false); + [ByRefEvent] + private record struct SetSimulatedGridMethodEvent( + EntityUid Grid, + bool Simulated, + bool Handled = false); - [ByRefEvent] private record struct IsSimulatedGridMethodEvent - (EntityUid Grid, bool Simulated = false, bool Handled = false); + [ByRefEvent] + private record struct IsSimulatedGridMethodEvent( + EntityUid Grid, + bool Simulated = false, + bool Handled = false); - [ByRefEvent] private record struct GetAllMixturesMethodEvent - (EntityUid Grid, bool Excite = false, IEnumerable? Mixtures = null, bool Handled = false); + [ByRefEvent] + private record struct GetAllMixturesMethodEvent( + EntityUid Grid, + bool Excite = false, + IEnumerable? Mixtures = null, + bool Handled = false); - [ByRefEvent] private record struct ReactTileMethodEvent - (EntityUid GridId, Vector2i Tile, ReactionResult Result = default, bool Handled = false); + [ByRefEvent] + private record struct ReactTileMethodEvent( + EntityUid GridId, + Vector2i Tile, + ReactionResult Result = default, + bool Handled = false); - [ByRefEvent] private record struct HotspotExtinguishMethodEvent - (EntityUid Grid, Vector2i Tile, bool Handled = false); + [ByRefEvent] + private record struct HotspotExtinguishMethodEvent( + EntityUid Grid, + Vector2i Tile, + bool Handled = false); - [ByRefEvent] private record struct IsHotspotActiveMethodEvent - (EntityUid Grid, Vector2i Tile, bool Result = false, bool Handled = false); + [ByRefEvent] + private record struct IsHotspotActiveMethodEvent( + EntityUid Grid, + Vector2i Tile, + bool Result = false, + bool Handled = false); } From 94d39f7fcaf0919ddd0ec47e68c77c10b131cd5a Mon Sep 17 00:00:00 2001 From: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> Date: Mon, 10 Nov 2025 11:05:31 -0800 Subject: [PATCH 027/106] Document Atmospherics Utils (#41385) * Utils docs * Update Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- .../EntitySystems/AtmosphereSystem.Utils.cs | 55 +++++++++++++++++-- 1 file changed, 51 insertions(+), 4 deletions(-) diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs index 596368f000..a402cf20f3 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs @@ -11,9 +11,15 @@ namespace Content.Server.Atmos.EntitySystems; public partial class AtmosphereSystem { + /* + Partial class that stores miscellaneous utility methods for Atmospherics. + */ + /// - /// Gets the particular price of an air mixture. + /// Gets the particular price of a . /// + /// The to get the price of. + /// The price of the gas mixture. public double GetPrice(GasMixture mixture) { float basePrice = 0; // moles of gas * price/mole @@ -26,7 +32,7 @@ public partial class AtmosphereSystem maxComponent = Math.Max(maxComponent, mixture.Moles[i]); } - // Pay more for gas canisters that are more pure + // Pay more for gas canisters that are purer float purity = 1; if (totalMoles > 0) { @@ -36,12 +42,32 @@ public partial class AtmosphereSystem return basePrice * purity; } + /// + /// Marks a tile's visual overlay as needing to be redetermined. + /// + /// A tile's overlay (how it looks like, ex. water vapor's texture) + /// is determined via determining how much gas there is on the tile. + /// This is expensive to do for every tile/gas that may have a custom overlay, + /// so its done once and only updated when it needs to be updated. + /// + /// The grid the tile is on. + /// The tile to invalidate. [MethodImpl(MethodImplOptions.AggressiveInlining)] public void InvalidateVisuals(Entity grid, Vector2i tile) { _gasTileOverlaySystem.Invalidate(grid, tile); } + /// + /// Marks a tile's visual overlay as needing to be redetermined. + /// + /// A tile's overlay (how it looks like, ex. water vapor's texture) + /// is determined via determining how much gas there is on the tile. + /// This is expensive to do for every tile/gas that may have a custom overlay, + /// so its done once and only updated when it needs to be updated. + /// + /// The grid the tile is on. + /// The tile to invalidate. [MethodImpl(MethodImplOptions.AggressiveInlining)] private void InvalidateVisuals( Entity ent, @@ -51,7 +77,7 @@ public partial class AtmosphereSystem } /// - /// Gets the volume in liters for a number of tiles, on a specific grid. + /// Gets the volume in liters for a number of tiles, on a specific grid. /// /// The grid in question. /// The amount of tiles. @@ -79,6 +105,18 @@ public partial class AtmosphereSystem bool NoAirWhenBlocked, bool FixVacuum); + /// + /// Updates the for a + /// immediately. + /// + /// This method is extremely important if you are doing something in Atmospherics + /// that is time-sensitive! is cached and invalidated on + /// a cycle, so airtight changes performed during or after an invalidation will + /// not take effect until the next Atmospherics tick! + /// The entity the grid is on. + /// The the tile is on. + /// The the tile is on. + /// The to update. private void UpdateAirtightData(EntityUid uid, GridAtmosphereComponent atmos, MapGridComponent grid, TileAtmosphere tile) { var oldBlocked = tile.AirtightData.BlockedDirections; @@ -91,6 +129,15 @@ public partial class AtmosphereSystem ExcitedGroupDispose(atmos, tile.ExcitedGroup); } + /// + /// Retrieves current for a tile on a grid. + /// This is determined on-the-fly, not from cached data, so it will reflect + /// changes done in the current Atmospherics tick. + /// + /// The entity the grid is on. + /// The the tile is on. + /// The indices of the tile. + /// The current for the tile. private AirtightData GetAirtightData(EntityUid uid, MapGridComponent grid, Vector2i tile) { var blockedDirs = AtmosDirection.Invalid; @@ -118,7 +165,7 @@ public partial class AtmosphereSystem } /// - /// Pries a tile in a grid. + /// Pries a tile in a grid. /// /// The grid in question. /// The indices of the tile. From 5ad41205b9c5894cc2af23de38513e6c5fe1f1af Mon Sep 17 00:00:00 2001 From: Atakku Date: Mon, 10 Nov 2025 20:41:24 +0100 Subject: [PATCH 028/106] Fix aghost back slot name (#41370) One line fix to rule them all --- .../Prototypes/InventoryTemplates/aghost_inventory_template.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/InventoryTemplates/aghost_inventory_template.yml b/Resources/Prototypes/InventoryTemplates/aghost_inventory_template.yml index 84806a051a..1afebdcffe 100644 --- a/Resources/Prototypes/InventoryTemplates/aghost_inventory_template.yml +++ b/Resources/Prototypes/InventoryTemplates/aghost_inventory_template.yml @@ -8,7 +8,7 @@ stripTime: 6 uiWindowPos: 2,1 strippingWindowPos: 2,4 - displayName: ID + displayName: Back - name: id slotTexture: id fullTextureName: template_small From b37970a6aee8fdb980e39f76ebc390240395f597 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Mon, 10 Nov 2025 23:33:53 +0100 Subject: [PATCH 029/106] Update GDPR dump script to latest migration (#41387) --- Tools/dump_user_data.py | 71 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 69 insertions(+), 2 deletions(-) diff --git a/Tools/dump_user_data.py b/Tools/dump_user_data.py index 39d23a9d3f..09f9410805 100755 --- a/Tools/dump_user_data.py +++ b/Tools/dump_user_data.py @@ -8,7 +8,7 @@ import os import psycopg2 from uuid import UUID -LATEST_DB_MIGRATION = "20230725193102_AdminNotesImprovementsForeignKeys" +LATEST_DB_MIGRATION = "20250314222016_ConstructionFavorites" def main(): parser = argparse.ArgumentParser() @@ -36,10 +36,12 @@ def main(): dump_admin_messages(cur, user_id, arg_output) dump_admin_notes(cur, user_id, arg_output) dump_admin_watchlists(cur, user_id, arg_output) + dump_blacklist(cur, user_id, arg_output) dump_connection_log(cur, user_id, arg_output) dump_play_time(cur, user_id, arg_output) dump_player(cur, user_id, arg_output) dump_preference(cur, user_id, arg_output) + dump_role_whitelists(cur, user_id, arg_output) dump_server_ban(cur, user_id, arg_output) dump_server_ban_exemption(cur, user_id, arg_output) dump_server_role_ban(cur, user_id, arg_output) @@ -257,7 +259,29 @@ FROM ( (SELECT COALESCE(json_agg(to_jsonb(trait_subq) - 'profile_id'), '[]') FROM ( SELECT * FROM trait WHERE trait.profile_id = profile.profile_id ) trait_subq) - as traits + as traits, + (SELECT COALESCE(json_agg(to_jsonb(role_loadout_subq) - 'profile_id'), '[]') FROM ( + SELECT + *, + (SELECT COALESCE(json_agg(to_jsonb(loadout_group_subq) - 'profile_role_loadout_id'), '[]') FROM ( + SELECT + *, + (SELECT COALESCE(json_agg(to_jsonb(loadout_subq) - 'profile_loadout_group_id'), '[]') FROM ( + SELECT * FROM profile_loadout WHERE profile_loadout.profile_loadout_group_id = profile_loadout_group.profile_loadout_group_id + ) loadout_subq) + as loadouts + FROM + profile_loadout_group + WHERE + profile_loadout_group.profile_role_loadout_id = profile_role_loadout.profile_role_loadout_id + ) loadout_group_subq) + as loadout_groups + FROM + profile_role_loadout + WHERE + profile_role_loadout.profile_id = profile.profile_id + ) role_loadout_subq) + as role_loadouts FROM profile WHERE @@ -395,6 +419,49 @@ FROM ( f.write(json_data) +def dump_blacklist(cur: "psycopg2.cursor", user_id: str, outdir: str): + print("Dumping blacklist...") + + cur.execute(""" +SELECT + COALESCE(json_agg(to_json(data)), '[]') #>> '{}' +FROM ( + SELECT + * + FROM + blacklist + WHERE + user_id = %s +) as data +""", (user_id,)) + + json_data = cur.fetchall()[0][0] + + with open(os.path.join(outdir, "blacklist.json"), "w", encoding="utf-8") as f: + f.write(json_data) + +def dump_role_whitelists(cur: "psycopg2.cursor", user_id: str, outdir: str): + print("Dumping role_whitelists...") + + cur.execute(""" +SELECT + COALESCE(json_agg(to_json(data)), '[]') #>> '{}' +FROM ( + SELECT + * + FROM + role_whitelists + WHERE + player_user_id = %s +) as data +""", (user_id,)) + + json_data = cur.fetchall()[0][0] + + with open(os.path.join(outdir, "role_whitelists.json"), "w", encoding="utf-8") as f: + f.write(json_data) + + def dump_admin_messages(cur: "psycopg2.cursor", user_id: str, outdir: str): print("Dumping admin_messages...") From 913d0db668c10857782d54b2f6498039d533ce5d Mon Sep 17 00:00:00 2001 From: SolidSyn Date: Mon, 10 Nov 2025 22:09:15 -0800 Subject: [PATCH 030/106] Adds the clown skirt and black lawyer suitskirt to HoPs uniform lathe (#39846) --- Resources/Prototypes/Recipes/Lathes/Packs/clothing.yml | 2 ++ Resources/Prototypes/Recipes/Lathes/clothing.yml | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/Resources/Prototypes/Recipes/Lathes/Packs/clothing.yml b/Resources/Prototypes/Recipes/Lathes/Packs/clothing.yml index a0a814a7b6..6533f9fc6c 100644 --- a/Resources/Prototypes/Recipes/Lathes/Packs/clothing.yml +++ b/Resources/Prototypes/Recipes/Lathes/Packs/clothing.yml @@ -126,11 +126,13 @@ - ClothingUniformJumpsuitChef - ClothingUniformJumpskirtChef - ClothingUniformJumpsuitClown + - ClothingUniformJumpskirtClown - ClothingUniformJumpsuitHydroponics - ClothingUniformJumpskirtHydroponics - ClothingUniformJumpsuitJanitor - ClothingUniformJumpskirtJanitor - ClothingUniformJumpsuitLawyerBlack + - ClothingUniformJumpskirtLawyerBlack - ClothingUniformJumpsuitLibrarian - ClothingUniformJumpskirtColorLightBrown - ClothingUniformJumpsuitMime diff --git a/Resources/Prototypes/Recipes/Lathes/clothing.yml b/Resources/Prototypes/Recipes/Lathes/clothing.yml index c5f81153e2..77648a96dd 100644 --- a/Resources/Prototypes/Recipes/Lathes/clothing.yml +++ b/Resources/Prototypes/Recipes/Lathes/clothing.yml @@ -223,6 +223,11 @@ id: ClothingUniformJumpsuitClown result: ClothingUniformJumpsuitClown +- type: latheRecipe + parent: BaseJumpsuitRecipe + id: ClothingUniformJumpskirtClown + result: ClothingUniformJumpskirtClown + ## CMO - type: latheRecipe @@ -386,6 +391,11 @@ id: ClothingUniformJumpsuitLawyerBlack result: ClothingUniformJumpsuitLawyerBlack +- type: latheRecipe + parent: BaseJumpsuitRecipe + id: ClothingUniformJumpskirtLawyerBlack + result: ClothingUniformJumpskirtLawyerBlack + ## Librarian - type: latheRecipe From f8efb72e57b33a9a9550119b1d20e972cd25d539 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 11 Nov 2025 06:21:48 +0000 Subject: [PATCH 031/106] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 92034d6e08..e7ae3c247e 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: ScarKy0 - changes: - - message: APCs now have a wirepanel. It can be used to disallow the AI from accessing - it. - type: Add - id: 8694 - time: '2025-06-19T15:06:11.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38443 - author: Sparlight changes: - message: Smart corgis can now wear various hardsuits, armors, and glasses items. @@ -3927,3 +3919,11 @@ id: 9195 time: '2025-11-10T13:57:52.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41365 +- author: SolidSyn + changes: + - message: Clowns and Lawyers can now print their respective skirts and suitskirts + at a uniform lathe + type: Add + id: 9196 + time: '2025-11-11T06:20:40.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/39846 From 0bd4f640146a33305e73c95691dc22d851b3a8fd Mon Sep 17 00:00:00 2001 From: April <1866440+April-Gras@users.noreply.github.com> Date: Tue, 11 Nov 2025 18:46:04 +0100 Subject: [PATCH 032/106] chore: added a full stop to the tooltip of the accentless speech trait (#41392) chore: added a full stop to the accentless tooltip in en-us this makes it consistent with the other tooltips --- Resources/Locale/en-US/traits/traits.ftl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index 3895ce162d..32066a2d71 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -31,7 +31,7 @@ trait-pirate-accent-name = Pirate accent trait-pirate-accent-desc = You can't stop speaking like a pirate! trait-accentless-name = Accentless -trait-accentless-desc = You don't have the accent that your species would usually have +trait-accentless-desc = You don't have the accent that your species would usually have. trait-frontal-lisp-name = Frontal lisp trait-frontal-lisp-desc = You thpeak with a lithp. From 831c53603d8126714cf85ea20ea7821fc4344d0a Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 11 Nov 2025 17:58:58 +0000 Subject: [PATCH 033/106] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index e7ae3c247e..69c3a2a8a6 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Sparlight - changes: - - message: Smart corgis can now wear various hardsuits, armors, and glasses items. - type: Add - id: 8695 - time: '2025-06-19T19:49:09.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/36875 - author: VerinSenpai changes: - message: Handcuffs no longer interfere with your daily tail wagging activities. @@ -3927,3 +3920,10 @@ id: 9196 time: '2025-11-11T06:20:40.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/39846 +- author: April-Gras + changes: + - message: Tool-tip punctuation for the accentless speech trait + type: Tweak + id: 9197 + time: '2025-11-11T17:57:48.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41392 From febc0f989731c06ae4d6957d6a48a5aaaa20cb4e Mon Sep 17 00:00:00 2001 From: Nox Date: Tue, 11 Nov 2025 10:49:25 -0800 Subject: [PATCH 034/106] More Resilient Grenades (#34499) * Inital commit * Balanced damage to explode instantly * Rebalanced based on suggestions * matched all grenade instant thresholds to 45 damage. Signed-off-by: Nox38 * Redid files and values Signed-off-by: Nox38 * Minor spelling mistake Signed-off-by: Nox38 * Moved abstracts and fixed typo in comments Signed-off-by: Nox38 --------- Signed-off-by: Nox38 --- .../Weapons/Throwable/base_grenades.yml | 87 ++++++++ .../Weapons/Throwable/canister_grenades.yml | 117 +++++++++++ .../Objects/Weapons/Throwable/grenades.yml | 196 +----------------- .../Weapons/Throwable/projectile_grenades.yml | 6 +- .../Weapons/Throwable/scattering_grenades.yml | 16 +- 5 files changed, 216 insertions(+), 206 deletions(-) create mode 100644 Resources/Prototypes/Entities/Objects/Weapons/Throwable/base_grenades.yml create mode 100644 Resources/Prototypes/Entities/Objects/Weapons/Throwable/canister_grenades.yml diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/base_grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/base_grenades.yml new file mode 100644 index 0000000000..8f2f7547c0 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/base_grenades.yml @@ -0,0 +1,87 @@ +- type: entity # Starts fuse after taking 10 damage. + parent: BaseItem + abstract: true + id: GrenadeBase + components: + - type: Sprite + sprite: Objects/Weapons/Grenades/grenade.rsi + layers: + - state: icon + map: ["enum.TriggerVisualLayers.Base"] + - type: Item + size: Small + - type: Clothing + quickEquip: false + slots: + - Belt + - type: TriggerOnUse + - type: TimerTrigger + delay: 3 + - type: Damageable + damageContainer: Inorganic + - type: Destructible + thresholds: + - trigger: # Start fuse + !type:DamageTrigger + damage: 10 + behaviors: + - !type:TimerStartBehavior + - type: Appearance + - type: AnimationPlayer + - type: GenericVisualizer + visuals: + enum.Trigger.TriggerVisuals.VisualState: + enum.ConstructionVisuals.Layer: + Primed: { state: primed } + Unprimed: { state: icon } + - type: Tag + tags: + - HandGrenade + - type: Fixtures + fixtures: + fix1: + shape: !type:PhysShapeCircle + radius: 0.2 + density: 20 # derived from base_item + mask: + - ItemMask + restitution: 0.3 + friction: 0.2 + +- type: entity # Starts fuse after taking 10 damage, instantly detonates/activates after taking 45 damage. + abstract: true + id: VolatileGrenadeBase + components: + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 10 + behaviors: + - !type:TimerStartBehavior + - trigger: # immediately explode + !type:DamageTrigger + damage: 45 + behaviors: + - !type:TriggerBehavior + keyOut: timer + - !type:DoActsBehavior + acts: ["Destruction"] + +- type: entity # Starts fuse after taking 10 damage, is destroyed without activating/detonating after taking 45 damage. + abstract: true + id: FragileGrenadeBase + components: + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 10 + behaviors: + - !type:TimerStartBehavior + - trigger: # Disappear + !type:DamageTrigger + damage: 45 + behaviors: + - !type:DoActsBehavior + acts: ["Destruction"] diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/canister_grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/canister_grenades.yml new file mode 100644 index 0000000000..31cb00f164 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/canister_grenades.yml @@ -0,0 +1,117 @@ +- type: entity + parent: [VolatileGrenadeBase, GrenadeBase, BaseSecurityContraband ] + id: SmokeGrenade + name: smoke grenade + description: A tactical grenade that releases a large, long-lasting cloud of smoke when used. + components: + - type: Sprite + sprite: Objects/Weapons/Grenades/smoke.rsi + - type: SmokeOnTrigger + keysIn: + - timer + duration: 30 + spreadAmount: 50 + - type: EmitSoundOnTrigger + keysIn: + - timer + sound: /Audio/Items/smoke_grenade_smoke.ogg + positional: true + - type: DeleteOnTrigger + keysIn: + - timer + - type: TimerTriggerVisuals + primingSound: + path: /Audio/Items/smoke_grenade_prime.ogg + +- type: entity + parent: [ BaseCivilianContraband, SmokeGrenade ] + id: CleanerGrenade + name: cleanade + description: Special grenade for janitors, releasing large cloud of space cleaner foam. + components: + - type: Sprite + sprite: Objects/Weapons/Grenades/janitor.rsi + - type: SmokeOnTrigger + keysIn: + - timer + duration: 15 + spreadAmount: 50 + smokePrototype: Foam + solution: + reagents: + - ReagentId: SpaceCleaner + Quantity: 30 + +- type: entity + parent: SmokeGrenade + id: TearGasGrenade + name: tear gas grenade + description: A riot control tear gas grenade. Causes irritation, pain and makes you cry your eyes out. + components: + - type: Sprite + sprite: Objects/Weapons/Grenades/tear_gas.rsi + - type: SmokeOnTrigger + keysIn: + - timer + duration: 10 + spreadAmount: 30 + smokePrototype: TearGasSmokeWhite + solution: + reagents: + - ReagentId: TearGas + Quantity: 20 + +- type: entity + parent: [ BaseEngineeringContraband, SmokeGrenade ] + id: MetalFoamGrenade + name: metal foam grenade + description: An emergency tool used for patching hull breaches with special quick-set metal foam. Almost as good as real floors! + components: + - type: Sprite + sprite: Objects/Weapons/Grenades/metalfoam.rsi + - type: TimerTrigger + delay: 5 + - type: SmokeOnTrigger + keysIn: + - timer + duration: 10 + spreadAmount: 20 + smokePrototype: AluminiumMetalFoam + - type: StaticPrice + price: 350 + +- type: entity + parent: [ BaseEngineeringContraband, VolatileGrenadeBase, GrenadeBase ] # Prevent inheriting DeleteOnTrigger from SmokeGrenade + id: AirGrenade + name: air grenade + description: A special solid state chemical grenade used for quickly releasing standard air into a spaced area. Fills up to 30 tiles! + components: + - type: Sprite + sprite: Objects/Weapons/Grenades/airboom.rsi + - type: EmitSoundOnTrigger + keysIn: + - timer + sound: /Audio/Items/smoke_grenade_smoke.ogg + - type: TimerTriggerVisuals + primingSound: + path: /Audio/Items/smoke_grenade_prime.ogg + - type: TimerTrigger + delay: 3 + - type: ReleaseGasOnTrigger + keysIn: + - timer + removeFraction: 0.25 + air: + volume: 1000 + moles: # Target is 3117.84 mols total for filling 30 tiles (goal is 101.325 kPa @ 20C) + Oxygen: 654.7464 # oxygen + Nitrogen: 2463.0936 # nitrogen + temperature: 293.15 + - type: StaticPrice + price: 350 + - type: GenericVisualizer + visuals: + enum.ReleaseGasOnTriggerVisuals.Key: + enabled: + True: { state: active } + False: { state: spent } diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml index a4c0d43b9e..6fb94e1f0a 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml @@ -1,60 +1,7 @@ -- type: entity - abstract: true - parent: BaseItem - id: GrenadeBase - components: - - type: Sprite - sprite: Objects/Weapons/Grenades/grenade.rsi - layers: - - state: icon - map: ["enum.TriggerVisualLayers.Base"] - - type: Item - size: Small - - type: Clothing - quickEquip: false - slots: - - Belt - - type: TriggerOnUse - - type: TimerTrigger - delay: 3 - - type: Damageable - damageContainer: Inorganic - - type: Destructible - thresholds: - - trigger: - !type:DamageTrigger - damage: 10 - behaviors: - - !type:TriggerBehavior - keyOut: timer # explode immediately - - !type:DoActsBehavior - acts: ["Destruction"] - - type: Appearance - - type: AnimationPlayer - - type: GenericVisualizer - visuals: - enum.Trigger.TriggerVisuals.VisualState: - enum.ConstructionVisuals.Layer: - Primed: { state: primed } - Unprimed: { state: icon } - - type: Tag - tags: - - HandGrenade - - type: Fixtures - fixtures: - fix1: - shape: !type:PhysShapeCircle - radius: 0.2 - density: 20 # derived from base_item - mask: - - ItemMask - restitution: 0.3 - friction: 0.2 - - type: entity name: explosive grenade description: Grenade that creates a small but devastating explosion. - parent: [GrenadeBase, BaseSyndicateContraband] + parent: [VolatileGrenadeBase, GrenadeBase, BaseSyndicateContraband] id: ExGrenade components: - type: ExplodeOnTrigger @@ -77,7 +24,7 @@ - type: entity name: flashbang description: Eeeeeeeeeeeeeeeeeeeeee. - parent: [ GrenadeBase, BaseSecurityContraband ] + parent: [ FragileGrenadeBase, GrenadeBase, BaseSecurityContraband ] id: GrenadeFlashBang components: - type: Sprite @@ -132,28 +79,13 @@ - type: entity name: syndicate minibomb description: A syndicate-manufactured explosive used to stow destruction and cause chaos. - parent: [GrenadeBase, BaseSyndicateContraband] + parent: [VolatileGrenadeBase, GrenadeBase, BaseSyndicateContraband] id: SyndieMiniBomb components: - type: Sprite sprite: Objects/Weapons/Grenades/syndgrenade.rsi - type: ExplosionResistance damageCoefficient: 0.1 - - type: Destructible - thresholds: - - trigger: - !type:DamageTrigger - damage: 10 - behaviors: - - !type:TimerStartBehavior - - trigger: - !type:DamageTrigger - damage: 45 - behaviors: - - !type:TriggerBehavior - keyOut: timer # immediately explode - - !type:DoActsBehavior - acts: ["Destruction"] - type: TimerTrigger delay: 5 - type: ExplodeOnTrigger @@ -202,7 +134,7 @@ - type: entity - parent: [ GrenadeBase, BaseSyndicateContraband ] + parent: [ FragileGrenadeBase, GrenadeBase, BaseSyndicateContraband ] id: SingularityGrenade name: singularity grenade description: Grenade that simulates the power of a singularity, pulling things in a heap. @@ -416,7 +348,7 @@ - type: entity name: EMP grenade description: A grenade designed to wreak havoc on electronic systems. - parent: [GrenadeBase, BaseSyndicateContraband] + parent: [FragileGrenadeBase, GrenadeBase, BaseSyndicateContraband] id: EmpGrenade components: - type: Sprite @@ -465,124 +397,6 @@ - type: StaticPrice price: 10000 -- type: entity - parent: [ GrenadeBase, BaseSecurityContraband ] - id: SmokeGrenade - name: smoke grenade - description: A tactical grenade that releases a large, long-lasting cloud of smoke when used. - components: - - type: Sprite - sprite: Objects/Weapons/Grenades/smoke.rsi - - type: SmokeOnTrigger - keysIn: - - timer - duration: 30 - spreadAmount: 50 - - type: EmitSoundOnTrigger - keysIn: - - timer - sound: /Audio/Items/smoke_grenade_smoke.ogg - positional: true - - type: DeleteOnTrigger - keysIn: - - timer - - type: TimerTriggerVisuals - primingSound: - path: /Audio/Items/smoke_grenade_prime.ogg - -- type: entity - parent: [ BaseCivilianContraband, SmokeGrenade ] - id: CleanerGrenade - name: cleanade - description: Special grenade for janitors, releasing large cloud of space cleaner foam. - components: - - type: Sprite - sprite: Objects/Weapons/Grenades/janitor.rsi - - type: SmokeOnTrigger - keysIn: - - timer - duration: 15 - spreadAmount: 50 - smokePrototype: Foam - solution: - reagents: - - ReagentId: SpaceCleaner - Quantity: 30 - -- type: entity - parent: SmokeGrenade - id: TearGasGrenade - name: tear gas grenade - description: A riot control tear gas grenade. Causes irritation, pain and makes you cry your eyes out. - components: - - type: Sprite - sprite: Objects/Weapons/Grenades/tear_gas.rsi - - type: SmokeOnTrigger - keysIn: - - timer - duration: 10 - spreadAmount: 30 - smokePrototype: TearGasSmokeWhite - solution: - reagents: - - ReagentId: TearGas - Quantity: 20 - -- type: entity - parent: [ BaseEngineeringContraband, SmokeGrenade ] - id: MetalFoamGrenade - name: metal foam grenade - description: An emergency tool used for patching hull breaches with special quick-set metal foam. Almost as good as real floors! - components: - - type: Sprite - sprite: Objects/Weapons/Grenades/metalfoam.rsi - - type: TimerTrigger - delay: 5 - - type: SmokeOnTrigger - keysIn: - - timer - duration: 10 - spreadAmount: 20 - smokePrototype: AluminiumMetalFoam - - type: StaticPrice - price: 350 - -- type: entity - parent: [ BaseEngineeringContraband, GrenadeBase ] # Prevent inheriting DeleteOnTrigger from SmokeGrenade - id: AirGrenade - name: air grenade - description: A special solid state chemical grenade used for quickly releasing standard air into a spaced area. Fills up to 30 tiles! - components: - - type: Sprite - sprite: Objects/Weapons/Grenades/airboom.rsi - - type: EmitSoundOnTrigger - keysIn: - - timer - sound: /Audio/Items/smoke_grenade_smoke.ogg - - type: TimerTriggerVisuals - primingSound: - path: /Audio/Items/smoke_grenade_prime.ogg - - type: TimerTrigger - delay: 3 - - type: ReleaseGasOnTrigger - keysIn: - - timer - removeFraction: 0.25 - air: - volume: 1000 - moles: # Target is 3117.84 mols total for filling 30 tiles (goal is 101.325 kPa @ 20C) - Oxygen: 654.7464 # oxygen - Nitrogen: 2463.0936 # nitrogen - temperature: 293.15 - - type: StaticPrice - price: 350 - - type: GenericVisualizer - visuals: - enum.ReleaseGasOnTriggerVisuals.Key: - enabled: - True: { state: active } - False: { state: spent } - # Non-explosive "dummy" grenades to use as a distraction. - type: entity diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/projectile_grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/projectile_grenades.yml index 0e8b758a13..5a3cedb901 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/projectile_grenades.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/projectile_grenades.yml @@ -43,7 +43,7 @@ friction: 0.2 - type: entity - parent: [ProjectileGrenadeBase, BaseSecurityContraband] + parent: [FragileGrenadeBase, ProjectileGrenadeBase, BaseSecurityContraband] id: GrenadeStinger name: stinger grenade description: Nothing to see here, please disperse. @@ -77,7 +77,7 @@ path: /Audio/Effects/countdown.ogg - type: entity - parent: [ProjectileGrenadeBase, BaseSyndicateContraband] + parent: [FragileGrenadeBase, ProjectileGrenadeBase, BaseSyndicateContraband] id: GrenadeIncendiary name: incendiary grenade description: Guaranteed to light up the mood. @@ -109,7 +109,7 @@ price: 1500 - type: entity - parent: [ProjectileGrenadeBase, BaseSyndicateContraband] + parent: [FragileGrenadeBase, ProjectileGrenadeBase, BaseSyndicateContraband] id: GrenadeShrapnel name: shrapnel grenade description: Releases a deadly spray of shrapnel that causes severe bleeding. diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/scattering_grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/scattering_grenades.yml index ba2bdd230e..43ec57e068 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/scattering_grenades.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/scattering_grenades.yml @@ -10,14 +10,6 @@ cluster-payload: !type:Container - type: Damageable damageContainer: Inorganic - - type: Destructible - thresholds: - - trigger: - !type:DamageTrigger - damage: 10 - behaviors: - - !type:TriggerBehavior - keyOut: timer # explode immediately - type: ScatteringGrenade - type: TriggerOnUse - type: TimerTrigger @@ -37,7 +29,7 @@ friction: 0.2 - type: entity - parent: [ScatteringGrenadeBase, BaseSecurityContraband] + parent: [FragileGrenadeBase, ScatteringGrenadeBase, BaseSecurityContraband] id: ClusterBang name: clusterbang description: Can be used only with flashbangs. Explodes several times. @@ -90,7 +82,7 @@ positional: true - type: entity - parent: [ScatteringGrenadeBase, BaseSyndicateContraband] + parent: [VolatileGrenadeBase, ScatteringGrenadeBase, BaseSyndicateContraband] id: ClusterGrenade name: clustergrenade description: Why use one grenade when you can use three at once! @@ -120,7 +112,7 @@ price: 2500 - type: entity - parent: [ScatteringGrenadeBase, BaseSyndicateContraband] + parent: [FragileGrenadeBase, ScatteringGrenadeBase, BaseSyndicateContraband] id: ClusterBananaPeel name: cluster banana peel description: Splits into 6 explosive banana peels after throwing, guaranteed fun! @@ -175,7 +167,7 @@ price: 1000 - type: entity - parent: ScatteringGrenadeBase + parent: [FragileGrenadeBase, ScatteringGrenadeBase] id: GrenadeFoamDart name: foam dart grenade description: Releases a bothersome spray of foam darts that cause severe welching. From 7fb915a860187608a0bcb1d6c5218842c8dbe723 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 11 Nov 2025 19:02:09 +0000 Subject: [PATCH 035/106] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 69c3a2a8a6..420d269df6 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: VerinSenpai - changes: - - message: Handcuffs no longer interfere with your daily tail wagging activities. - type: Fix - id: 8696 - time: '2025-06-19T22:42:21.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38454 - author: BigfootBravo changes: - message: Chameleon Controller Implants can be deimplanted. @@ -3927,3 +3920,11 @@ id: 9197 time: '2025-11-11T17:57:48.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41392 +- author: Nox38 + changes: + - message: All grenades now start their fuse after taking 10 damage, and instantly + detonate or break after taking 45. + type: Tweak + id: 9198 + time: '2025-11-11T19:01:01.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34499 From 4c9a050cdf033dc568feb87e1679f7e7b7b245ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=81da?= Date: Wed, 12 Nov 2025 01:25:35 -0600 Subject: [PATCH 036/106] Add missing plushies to AllPlushiesTable (#41398) * weh! * rare lamp * among * buff * nerf --------- Co-authored-by: iaada --- .../Prototypes/Catalog/Fills/Crates/fun.yml | 123 +++++++++++++----- .../Entities/Objects/Fun/plushies.yml | 2 + 2 files changed, 94 insertions(+), 31 deletions(-) diff --git a/Resources/Prototypes/Catalog/Fills/Crates/fun.yml b/Resources/Prototypes/Catalog/Fills/Crates/fun.yml index d35ceaa033..92dbd47cfb 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/fun.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/fun.yml @@ -2,23 +2,27 @@ id: AllPlushiesTable table: !type:GroupSelector children: - - id: PlushieBee - - id: PlushieNar - weight: 0.5 - - id: PlushieRatvar - weight: 0.5 + - !type:NestedSelector + tableId: AllLizardPlushieTable - id: PlushieNuke - id: PlushieSlime - id: PlushieSnake - id: PlushieExperiment + - id: PlushieVox + - id: PlushieRouny + - id: PlushieAtmosian + - id: PlushieDiona + - id: PlushieXeno + - id: PlushieHampter + - id: PlushieMoth + - id: PlushieArachind + - id: PlushiePenguin + - id: PlushieVulp - !type:GroupSelector children: - - id: PlushieLizard - weight: 9 - - id: PlushieSpaceLizard - weight: 1 - - id: PlushieLizardInversed - weight: 0.5 + - id: PlushieBee + - id: PlushieRGBee + weight: 0.1 - !type:GroupSelector children: - id: PlushieCarp @@ -28,21 +32,84 @@ weight: 0.25 - id: PlushieRainbowCarp weight: 0.15 - - id: PlushieVox - - id: PlushieRouny - !type:GroupSelector children: - id: PlushieSharkBlue - id: PlushieSharkGrey - id: PlushieSharkPink - - id: PlushieAtmosian - - id: PlushieDiona - - id: PlushieXeno - - id: PlushieHampter - - id: PlushieMoth - - id: PlushieArachind - - id: PlushiePenguin - - id: PlushieVulp + - !type:GroupSelector # Toy plushies + children: + - id: ToyIan + - id: ToyAmongPequeno + - id: ToyMouse + - !type:GroupSelector # Giant plushies + children: + - id: PlushieNar + - id: PlushieRatvar + - !type:GroupSelector # Rare plushies + weight: 0.1 # 1 in >210 + children: + - id: PlushieHuman + - id: PlushieGhost + - id: PlushieLamp + - !type:GroupSelector # Legendary plushies + weight: 0.002 # 1 in >10,500 + children: + - id: PlushieThrongler + - id: PlushieGhostRevenant # You got the god roll, and failed + +- type: entityTable + id: AllLizardPlushieTable + table: !type:GroupSelector + children: + - id: PlushieLizard + weight: 8 + - id: PlushieSpaceLizard + weight: 1 + - id: PlushieLizardInversed + weight: 0.1 # 1 in >100 + - !type:GroupSelector # Lizard gets a job table + children: + - id: PlushieLizardJobAtmospherictechnician + - id: PlushieLizardJobBartender + - id: PlushieLizardJobBotanist + - id: PlushieLizardJobBoxer + - id: PlushieLizardJobCaptain + - id: PlushieLizardJobCargotechnician + - id: PlushieLizardJobChaplain + - id: PlushieLizardJobChef + - id: PlushieLizardJobChemist + - id: PlushieLizardJobChiefengineer + - id: PlushieLizardJobChiefmedicalofficer + - id: PlushieLizardJobClown # :o) + - id: PlushieLizardJobDetective + - id: PlushieLizardJobHeadofpersonnel + - id: PlushieLizardJobHeadofsecurity + - id: PlushieLizardJobJanitor + - id: PlushieLizardJobLawyer + - id: PlushieLizardJobLibrarian + - id: PlushieLizardJobMedicaldoctor + - id: PlushieLizardJobMedicalintern + - id: PlushieLizardJobMime # + - id: PlushieLizardJobMusician + - id: PlushieLizardJobParamedic + - id: PlushieLizardJobPassenger + - id: PlushieLizardJobPsychologist + - id: PlushieLizardJobQuartermaster + - id: PlushieLizardJobReporter + - id: PlushieLizardJobResearchassistant + - id: PlushieLizardJobResearchdirector + - id: PlushieLizardJobSalvagespecialist + - id: PlushieLizardJobScientist + - id: PlushieLizardJobSecuritycadet + - id: PlushieLizardJobSecurityofficer + - id: PlushieLizardJobServiceworker + - id: PlushieLizardJobStationengineer + - id: PlushieLizardJobTechnicalassistant + - id: PlushieLizardJobZookeeper + - id: PlushieLizardJobMultiweh + weight: 0.5 # 1 in >800 + - type: entityTable id: AllPottedPlantsTable @@ -108,16 +175,10 @@ components: - type: EntityTableContainerFill containers: - entity_storage: !type:AllSelector - children: - - id: PlushieLizard - amount: !type:ConstantNumberSelector - value: 3 - - id: PlushieSpaceLizard - amount: !type:ConstantNumberSelector - value: 3 - - id: PlushieLizardJobMultiweh # the exceedingly rare multiweh! - prob: 0.01 + entity_storage: !type:NestedSelector + tableId: AllLizardPlushieTable + rolls: !type:ConstantNumberSelector + value: 6 - type: entity id: CrateFunSharkPlushieBulk diff --git a/Resources/Prototypes/Entities/Objects/Fun/plushies.yml b/Resources/Prototypes/Entities/Objects/Fun/plushies.yml index 2e9f231e90..a22d26c6f7 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/plushies.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/plushies.yml @@ -1,3 +1,5 @@ +# When adding new plushies, also add them to id: AllPlushiesTable + ## Plushies - type: entity From 70e9523b6e7be660e38fe18404e4d41470e36041 Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 12 Nov 2025 07:38:48 +0000 Subject: [PATCH 037/106] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 420d269df6..57e41baa03 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: BigfootBravo - changes: - - message: Chameleon Controller Implants can be deimplanted. - type: Fix - id: 8697 - time: '2025-06-20T22:41:11.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38439 - author: FairlySadPanda changes: - message: A new poster. @@ -3928,3 +3921,11 @@ id: 9198 time: '2025-11-11T19:01:01.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34499 +- author: aada + changes: + - message: Employed lizard plushies can now be found in bulk lizard plushie crates + and maintenance closets. + type: Tweak + id: 9199 + time: '2025-11-12T07:37:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41398 From c079fdfbba477a2dbd4df17ad3be97d1c0e97084 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Wed, 12 Nov 2025 21:24:24 +1100 Subject: [PATCH 038/106] Bandaid solution name setter events (#41400) Ideally PDAs + IDs wouldn't be doing this but this is slamming it out. --- .../Chemistry/EntitySystems/SharedSolutionContainerSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.cs b/Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.cs index cd38df021d..892e4e9cac 100644 --- a/Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.cs +++ b/Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.cs @@ -1217,7 +1217,7 @@ public abstract partial class SharedSolutionContainerSystem : EntitySystem var relation = new ContainedSolutionComponent() { Container = container.Owner, ContainerName = name }; AddComp(uid, relation); - MetaDataSys.SetEntityName(uid, $"solution - {name}"); + MetaDataSys.SetEntityName(uid, $"solution - {name}", raiseEvents: false); ContainerSystem.Insert(uid, container, force: true); return (uid, solution, relation); From 3a1720c48fea987b3409e97da305d4e382186681 Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Thu, 13 Nov 2025 00:26:29 +1300 Subject: [PATCH 039/106] Fix admin log exception (#41242) Fix admin logs --- Content.Shared/Administration/Logs/LogStringHandler.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Content.Shared/Administration/Logs/LogStringHandler.cs b/Content.Shared/Administration/Logs/LogStringHandler.cs index 9b65c6d723..2fab949d58 100644 --- a/Content.Shared/Administration/Logs/LogStringHandler.cs +++ b/Content.Shared/Administration/Logs/LogStringHandler.cs @@ -40,7 +40,8 @@ public ref struct LogStringHandler format = argument[0] == '@' ? argument[1..] : argument; } - if (Values.TryAdd(Logger.ConvertName(format), value) + format = Logger.ConvertName(format); + if (Values.TryAdd(format, value) || Values[format] is T val && val.Equals(value) ) { return; @@ -50,7 +51,7 @@ public ref struct LogStringHandler var i = 2; format = $"{originalFormat}_{i}"; - while (!(Values.TryAdd(Logger.ConvertName(format), value) + while (!(Values.TryAdd(format, value) || Values[format] is T val2 && val2.Equals(value))) { format = $"{originalFormat}_{i}"; From c6e307ea7100ecda5bdce1edddac8d7e9c1ae93c Mon Sep 17 00:00:00 2001 From: PicklOH <62030853+PicklOH@users.noreply.github.com> Date: Wed, 12 Nov 2025 11:19:58 -0500 Subject: [PATCH 040/106] Make DAGD more likely but restrict it to 1 traitor per round (#41402) --- Resources/Prototypes/Objectives/objectiveGroups.yml | 2 +- Resources/Prototypes/Objectives/traitor.yml | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Resources/Prototypes/Objectives/objectiveGroups.yml b/Resources/Prototypes/Objectives/objectiveGroups.yml index a24e0f5dd3..31ef38f428 100644 --- a/Resources/Prototypes/Objectives/objectiveGroups.yml +++ b/Resources/Prototypes/Objectives/objectiveGroups.yml @@ -34,7 +34,7 @@ id: TraitorObjectiveGroupState weights: EscapeShuttleObjective: 1 - DieObjective: 0.05 + DieObjective: 0.2 #HijackShuttleObjective: 0.02 - type: weightedRandom diff --git a/Resources/Prototypes/Objectives/traitor.yml b/Resources/Prototypes/Objectives/traitor.yml index 1d6fab6998..d833f0e9c2 100644 --- a/Resources/Prototypes/Objectives/traitor.yml +++ b/Resources/Prototypes/Objectives/traitor.yml @@ -64,6 +64,8 @@ - EscapeShuttleCondition - StealCondition - type: DieCondition + - type: ObjectiveLimit + limit: 1 #- type: entity # parent: [BaseTraitorObjective, BaseLivingObjective] From 512f86a0f0d557dd5c6963597236727ae249f992 Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 12 Nov 2025 16:32:49 +0000 Subject: [PATCH 041/106] Automatic changelog update --- Resources/Changelog/Changelog.yml | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 57e41baa03..c8bf3b4976 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,15 +1,4 @@ Entries: -- author: FairlySadPanda - changes: - - message: A new poster. - type: Add - - message: A new (very expensive) crate to order from cargo, worth 25,000 spesos - and containing a hydrated scurret. The hydrated scurret is a ghost role - a - non-antagonistic emotional support scurret. - type: Add - id: 8698 - time: '2025-06-20T23:39:08.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38218 - author: Tayrtahn changes: - message: Sloths... now... speak... slowly... @@ -3929,3 +3918,10 @@ id: 9199 time: '2025-11-12T07:37:41.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41398 +- author: PicklOH + changes: + - message: Make DAGD more likely but restrict it to 1 traitor per round + type: Tweak + id: 9200 + time: '2025-11-12T16:31:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41402 From 8c9c6dad823428fd58ace23e175245a2422d5ef9 Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Thu, 13 Nov 2025 00:10:48 +0100 Subject: [PATCH 042/106] Add keybinds for openening a specified component in VV (#41348) * quick inspect * Update Content.Client/Commands/QuickInspectCommand.cs Co-authored-by: Kyle Tyo <36606155+VerinSenpai@users.noreply.github.com> * documentation!!! --------- Co-authored-by: Kyle Tyo <36606155+VerinSenpai@users.noreply.github.com> --- .../Commands/QuickInspectCommand.cs | 52 +++++++++++++++++++ Content.Client/Gameplay/GameplayStateBase.cs | 20 +++++++ Content.Client/Input/ContentContexts.cs | 2 + .../Options/UI/Tabs/KeyRebindTab.xaml.cs | 2 + Content.Shared/CCVar/CCVars.Debug.cs | 13 +++++ Content.Shared/Input/ContentKeyFunctions.cs | 3 +- .../en-US/commands/quick-inspect-command.ftl | 5 ++ .../en-US/escape-menu/ui/options-menu.ftl | 5 ++ Resources/clientCommandPerms.yml | 1 + Resources/keybinds.yml | 8 +++ 10 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 Content.Client/Commands/QuickInspectCommand.cs create mode 100644 Content.Shared/CCVar/CCVars.Debug.cs create mode 100644 Resources/Locale/en-US/commands/quick-inspect-command.ftl diff --git a/Content.Client/Commands/QuickInspectCommand.cs b/Content.Client/Commands/QuickInspectCommand.cs new file mode 100644 index 0000000000..dc3aae615a --- /dev/null +++ b/Content.Client/Commands/QuickInspectCommand.cs @@ -0,0 +1,52 @@ +using System.Linq; +using Content.Shared.CCVar; +using Content.Shared.Input; +using Robust.Client.Input; +using Robust.Shared.Configuration; +using Robust.Shared.Console; + +namespace Content.Client.Commands; + +/// +/// Sets the a CVar to the name of a component, which allows the client to quickly open a VV window for that component +/// by using the Alt+C or Alt+B hotkeys. +/// +public sealed class QuickInspectCommand : LocalizedEntityCommands +{ + [Dependency] private readonly IConfigurationManager _configurationManager = default!; + [Dependency] private readonly IInputManager _inputManager = default!; + + public override string Command => "quickinspect"; + + public override void Execute(IConsoleShell shell, string argStr, string[] args) + { + if (args.Length != 1) + { + shell.WriteLine(Loc.GetString("shell-wrong-arguments-number")); + return; + } + + _configurationManager.SetCVar(CCVars.DebugQuickInspect, args[0]); + + var serverKey = _inputManager.GetKeyFunctionButtonString(ContentKeyFunctions.InspectServerComponent); + var clientKey = _inputManager.GetKeyFunctionButtonString(ContentKeyFunctions.InspectClientComponent); + shell.WriteLine(Loc.GetString($"cmd-quickinspect-success", ("component", args[0]), ("serverKeybind", serverKey), ("clientKeybind", clientKey))); + } + + public override CompletionResult GetCompletion(IConsoleShell shell, string[] args) + { + if (args.Length == 1) + { + // Not ideal since it only shows client-side components, but you can still type in any name you want. + // If you know how to get server component names on the client then please fix this. + var options = EntityManager.ComponentFactory.AllRegisteredTypes + .Select(p => new CompletionOption( + EntityManager.ComponentFactory.GetComponentName(p) + )); + + return CompletionResult.FromOptions(options); + } + + return CompletionResult.Empty; + } +} diff --git a/Content.Client/Gameplay/GameplayStateBase.cs b/Content.Client/Gameplay/GameplayStateBase.cs index 69e6e0b58b..c2b10fd01a 100644 --- a/Content.Client/Gameplay/GameplayStateBase.cs +++ b/Content.Client/Gameplay/GameplayStateBase.cs @@ -3,6 +3,7 @@ using System.Numerics; using Content.Client.Clickable; using Content.Client.UserInterface; using Content.Client.Viewport; +using Content.Shared.CCVar; using Content.Shared.Input; using Robust.Client.ComponentTrees; using Robust.Client.GameObjects; @@ -13,6 +14,7 @@ using Robust.Client.State; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; +using Robust.Shared.Configuration; using Robust.Shared.Console; using Robust.Shared.Graphics; using Robust.Shared.Input; @@ -40,6 +42,7 @@ namespace Content.Client.Gameplay [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly IViewVariablesManager _vvm = default!; [Dependency] private readonly IConsoleHost _conHost = default!; + [Dependency] private readonly IConfigurationManager _configurationManager = default!; private ClickableEntityComparer _comparer = default!; @@ -83,6 +86,8 @@ namespace Content.Client.Gameplay _comparer = new ClickableEntityComparer(); CommandBinds.Builder .Bind(ContentKeyFunctions.InspectEntity, new PointerInputCmdHandler(HandleInspect, outsidePrediction: true)) + .Bind(ContentKeyFunctions.InspectServerComponent, new PointerInputCmdHandler(HandleInspectServerComponent, outsidePrediction: true)) + .Bind(ContentKeyFunctions.InspectClientComponent, new PointerInputCmdHandler(HandleInspectClientComponent, outsidePrediction: true)) .Register(); } @@ -99,6 +104,21 @@ namespace Content.Client.Gameplay return true; } + private bool HandleInspectServerComponent(ICommonSession? session, EntityCoordinates coords, EntityUid uid) + { + var component = _configurationManager.GetCVar(CCVars.DebugQuickInspect); + if (_entityManager.TryGetNetEntity(uid, out var net)) + _conHost.ExecuteCommand($"vv /entity/{net.Value.Id}/{component}"); + return true; + } + + private bool HandleInspectClientComponent(ICommonSession? session, EntityCoordinates coords, EntityUid uid) + { + var component = _configurationManager.GetCVar(CCVars.DebugQuickInspect); + _conHost.ExecuteCommand($"vv /c/entity/{uid}/{component}"); + return true; + } + public EntityUid? GetClickedEntity(MapCoordinates coordinates) { return GetClickedEntity(coordinates, _eyeManager.CurrentEye); diff --git a/Content.Client/Input/ContentContexts.cs b/Content.Client/Input/ContentContexts.cs index 47f0cda2f6..01e7dc367c 100644 --- a/Content.Client/Input/ContentContexts.cs +++ b/Content.Client/Input/ContentContexts.cs @@ -38,6 +38,8 @@ namespace Content.Client.Input common.AddFunction(ContentKeyFunctions.ZoomIn); common.AddFunction(ContentKeyFunctions.ResetZoom); common.AddFunction(ContentKeyFunctions.InspectEntity); + common.AddFunction(ContentKeyFunctions.InspectServerComponent); + common.AddFunction(ContentKeyFunctions.InspectClientComponent); common.AddFunction(ContentKeyFunctions.ToggleRoundEndSummaryWindow); // Not in engine, because engine cannot check for sanbox/admin status before starting placement. diff --git a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs index f92f66df31..40d1836c08 100644 --- a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs +++ b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs @@ -268,6 +268,8 @@ namespace Content.Client.Options.UI.Tabs AddButton(EngineKeyFunctions.ShowDebugMonitors); AddButton(EngineKeyFunctions.HideUI); AddButton(ContentKeyFunctions.InspectEntity); + AddButton(ContentKeyFunctions.InspectServerComponent); + AddButton(ContentKeyFunctions.InspectClientComponent); AddHeader("ui-options-header-text-cursor"); AddButton(EngineKeyFunctions.TextCursorLeft); diff --git a/Content.Shared/CCVar/CCVars.Debug.cs b/Content.Shared/CCVar/CCVars.Debug.cs new file mode 100644 index 0000000000..a95acc4dac --- /dev/null +++ b/Content.Shared/CCVar/CCVars.Debug.cs @@ -0,0 +1,13 @@ +using Robust.Shared.Configuration; + +namespace Content.Shared.CCVar; + +public sealed partial class CCVars +{ + /// + /// Component to be inspected using the "Quick Inspect Component" keybind. + /// Set by the "quickinspect" command. + /// + public static readonly CVarDef DebugQuickInspect = + CVarDef.Create("debug.quick_inspect", "", CVar.CLIENTONLY | CVar.ARCHIVE); +} diff --git a/Content.Shared/Input/ContentKeyFunctions.cs b/Content.Shared/Input/ContentKeyFunctions.cs index 50ea218b00..63f6310322 100644 --- a/Content.Shared/Input/ContentKeyFunctions.cs +++ b/Content.Shared/Input/ContentKeyFunctions.cs @@ -123,7 +123,8 @@ namespace Content.Shared.Input public static readonly BoundKeyFunction EditorCopyObject = "EditorCopyObject"; public static readonly BoundKeyFunction EditorFlipObject = "EditorFlipObject"; public static readonly BoundKeyFunction InspectEntity = "InspectEntity"; - + public static readonly BoundKeyFunction InspectServerComponent = "InspectServerComponent"; + public static readonly BoundKeyFunction InspectClientComponent = "InspectClientComponent"; public static readonly BoundKeyFunction MappingUnselect = "MappingUnselect"; public static readonly BoundKeyFunction SaveMap = "SaveMap"; public static readonly BoundKeyFunction MappingEnablePick = "MappingEnablePick"; diff --git a/Resources/Locale/en-US/commands/quick-inspect-command.ftl b/Resources/Locale/en-US/commands/quick-inspect-command.ftl new file mode 100644 index 0000000000..e057fd982f --- /dev/null +++ b/Resources/Locale/en-US/commands/quick-inspect-command.ftl @@ -0,0 +1,5 @@ +cmd-quickinspect-desc = Sets a component name to be opened for a hovered entity via the "Inspect Server/Client Component" keybind. +cmd-quickinspect-help = Usage: {$command} +cmd-quickinspect-success = Component set to: {$component}. + Press {$serverKeybind} to open a VV window for the server. + Press {$clientKeybind} to open a VV window for the client. diff --git a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl index 98ee2543c1..a263e52229 100644 --- a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl +++ b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl @@ -227,6 +227,11 @@ ui-options-function-editor-copy-object = Copy ui-options-function-show-debug-console = Open Console ui-options-function-show-debug-monitors = Show Debug Monitors ui-options-function-inspect-entity = Inspect Entity +ui-options-function-inspect-entity-tooltip = Open a ViewVariables window for the entity your mouse is currently hovering over. +ui-options-function-inspect-server-component = Inspect Server Component +ui-options-function-inspect-server-component-tooltip = Open a ViewVariables window with the server component set by the "quickinspect" command for the entity your mouse is currently hovering over. +ui-options-function-inspect-client-component = Inspect Client Component +ui-options-function-inspect-client-component-tooltip = Open a ViewVariables window with the client component set by the "quickinspect" command for the entity your mouse is currently hovering over. ui-options-function-hide-ui = Hide UI ui-options-function-hotbar1 = Hotbar slot 1 diff --git a/Resources/clientCommandPerms.yml b/Resources/clientCommandPerms.yml index d83fdcc353..a177bc5fe1 100644 --- a/Resources/clientCommandPerms.yml +++ b/Resources/clientCommandPerms.yml @@ -74,6 +74,7 @@ - fullstatereset - dumpentities - showaccessreaders + - quickinspect - Flags: MAPPING Commands: diff --git a/Resources/keybinds.yml b/Resources/keybinds.yml index 870c8e1435..aa7b2918e1 100644 --- a/Resources/keybinds.yml +++ b/Resources/keybinds.yml @@ -281,6 +281,14 @@ binds: type: State key: v mod1: Alt +- function: InspectServerComponent + type: State + key: b + mod1: Alt +- function: InspectClientComponent + type: State + key: c + mod1: Alt - function: MouseMiddle type: State key: MouseMiddle From 4109fdbea8c1748a3f48973562a8b6544c7295e1 Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 12 Nov 2025 23:23:38 +0000 Subject: [PATCH 043/106] Automatic changelog update --- Resources/Changelog/Admin.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Admin.yml b/Resources/Changelog/Admin.yml index 2a80134c15..a342132f68 100644 --- a/Resources/Changelog/Admin.yml +++ b/Resources/Changelog/Admin.yml @@ -1505,5 +1505,13 @@ Entries: id: 183 time: '2025-11-03T13:16:43.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41261 +- author: slarticodefast + changes: + - message: Added the "quickinspect" command to quickly inspect the selected component + for an entity via a keybind. + type: Add + id: 184 + time: '2025-11-12T23:22:27.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41348 Name: Admin Order: 3 From 44e5073d32b6b6573b9082d1860d134ce9b5325b Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Thu, 13 Nov 2025 23:50:17 +1300 Subject: [PATCH 044/106] Update RaiseEventBenchmark for engine changes (#37349) * Update RaiseEventBenchmark * fix test * poke_tests --- Content.Benchmarks/RaiseEventBenchmark.cs | 26 +++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/Content.Benchmarks/RaiseEventBenchmark.cs b/Content.Benchmarks/RaiseEventBenchmark.cs index 4c4e0d9125..e3d377ccb3 100644 --- a/Content.Benchmarks/RaiseEventBenchmark.cs +++ b/Content.Benchmarks/RaiseEventBenchmark.cs @@ -23,6 +23,8 @@ public class RaiseEventBenchmark PoolManager.Startup(typeof(BenchSystem).Assembly); _pair = PoolManager.GetServerClient().GetAwaiter().GetResult(); var entMan = _pair.Server.EntMan; + var fact = _pair.Server.ResolveDependency(); + var bus = (EntityEventBus)entMan.EventBus; _sys = entMan.System(); _pair.Server.WaitPost(() => @@ -30,6 +32,8 @@ public class RaiseEventBenchmark var uid = entMan.Spawn(); _sys.Ent = new(uid, entMan.GetComponent(uid)); _sys.Ent2 = new(_sys.Ent.Owner, _sys.Ent.Comp); + _sys.NetId = fact.GetRegistration().NetID!.Value; + _sys.EvSubs = bus.GetNetCompEventHandlers(); }) .GetAwaiter() .GetResult(); @@ -60,6 +64,12 @@ public class RaiseEventBenchmark return _sys.RaiseICompEvent(); } + [Benchmark] + public int RaiseNetEvent() + { + return _sys.RaiseNetIdEvent(); + } + [Benchmark] public int RaiseCSharpEvent() { @@ -74,6 +84,8 @@ public class RaiseEventBenchmark public delegate void EntityEventHandler(EntityUid uid, TransformComponent comp, ref BenchEv ev); public event EntityEventHandler? OnCSharpEvent; + public ushort NetId; + internal EntityEventBus.DirectedEventHandler?[] EvSubs = default!; public override void Initialize() { @@ -92,7 +104,7 @@ public class RaiseEventBenchmark public int RaiseCompEvent() { var ev = new BenchEv(); - EntityManager.EventBus.RaiseComponentEvent(Ent.Owner, Ent.Comp, ref ev); + RaiseComponentEvent(Ent.Owner, Ent.Comp, ref ev); return ev.N; } @@ -100,7 +112,16 @@ public class RaiseEventBenchmark { // Raise with an IComponent instead of concrete type var ev = new BenchEv(); - EntityManager.EventBus.RaiseComponentEvent(Ent2.Owner, Ent2.Comp, ref ev); + RaiseComponentEvent(Ent2.Owner, Ent2.Comp, ref ev); + return ev.N; + } + + public int RaiseNetIdEvent() + { + // Raise a "IComponent" event using a net-id index delegate array (for PVS & client game-state events) + var ev = new BenchEv(); + ref var unitEv = ref Unsafe.As(ref ev); + EvSubs[NetId]?.Invoke(Ent2.Owner, Ent2.Comp, ref unitEv); return ev.N; } @@ -118,6 +139,7 @@ public class RaiseEventBenchmark } [ByRefEvent] + [ComponentEvent(Exclusive = false)] public struct BenchEv { public int N; From ae6c4880396be75cfd036824ec85b243841bc0e3 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Thu, 13 Nov 2025 22:02:04 +1100 Subject: [PATCH 045/106] Update engine submodule to 268.0.0 (#41408) --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index c95b4320cf..dbde8023ed 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit c95b4320cfda1f54ea1e26023c9e73e85c57b820 +Subproject commit dbde8023ed256ac69ae4b419422c936f78361653 From a76b6213a94e0cf0a68447301c087cf89d99dfe2 Mon Sep 17 00:00:00 2001 From: BeBright <98597725+bebr3ght@users.noreply.github.com> Date: Thu, 13 Nov 2025 19:24:28 +0300 Subject: [PATCH 046/106] MingGetBriefing -> MindGetBriefing (#41413) Co-authored-by: BeBright <98597725+be1bright@users.noreply.github.com> --- Content.Server/Roles/RoleSystem.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Server/Roles/RoleSystem.cs b/Content.Server/Roles/RoleSystem.cs index 71fb8a9cb5..abf9dd50ec 100644 --- a/Content.Server/Roles/RoleSystem.cs +++ b/Content.Server/Roles/RoleSystem.cs @@ -15,7 +15,7 @@ public sealed class RoleSystem : SharedRoleSystem { if (mindId == null) { - Log.Error($"MingGetBriefing failed for mind {mindId}"); + Log.Error($"MindGetBriefing failed for mind {mindId}"); return null; } @@ -23,7 +23,7 @@ public sealed class RoleSystem : SharedRoleSystem if (mindComp is null) { - Log.Error($"MingGetBriefing failed for mind {mindId}"); + Log.Error($"MindGetBriefing failed for mind {mindId}"); return null; } From 227dcf248689fdb3e7475a4945381f93dc2370f5 Mon Sep 17 00:00:00 2001 From: Minemoder5000 Date: Thu, 13 Nov 2025 11:11:43 -0700 Subject: [PATCH 047/106] Fix Amber's Escape Shuttle Warp Point (#41417) replace warp point with ghost warp point --- Resources/Maps/Shuttles/emergency_amber.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Maps/Shuttles/emergency_amber.yml b/Resources/Maps/Shuttles/emergency_amber.yml index e0973ef3d7..e6b56f437a 100644 --- a/Resources/Maps/Shuttles/emergency_amber.yml +++ b/Resources/Maps/Shuttles/emergency_amber.yml @@ -4911,7 +4911,7 @@ entities: rot: 1.5707963267948966 rad pos: -4.5,-13.5 parent: 1 -- proto: WarpPoint +- proto: GhostWarpPoint entities: - uid: 426 components: From 8c3111cffd99974752268d567ffc8403561c11df Mon Sep 17 00:00:00 2001 From: MissKay1994 <15877268+MissKay1994@users.noreply.github.com> Date: Thu, 13 Nov 2025 16:27:56 -0500 Subject: [PATCH 048/106] Briefcase gun for lawyers (#40210) * definitely not a gun * You only imagined this tag * Brace with your gut * Definitely did not procrastinate for eternity * Suing javascript formatting * Tear down the system * Yay for hardcoding * EVIL COURT * Attributions for skreee * Move new sprites into own folder --------- Co-authored-by: SlamBamActionman --- .../Locale/en-US/store/uplink-catalog.ftl | 3 ++ .../Prototypes/Catalog/uplink_catalog.yml | 17 ++++++++ .../Objects/Weapons/Guns/SMGs/smgs.yml | 39 ++++++++++++++++++ .../Weapons/Guns/SMGs/briefcase.rsi/base.png | Bin 0 -> 342 bytes .../Guns/SMGs/briefcase.rsi/bolt-open.png | Bin 0 -> 342 bytes .../Guns/SMGs/briefcase.rsi/icon-muzzle.png | Bin 0 -> 103 bytes .../SMGs/briefcase.rsi/inhand-left-muzzle.png | Bin 0 -> 116 bytes .../briefcase.rsi/inhand-right-muzzle.png | Bin 0 -> 115 bytes .../Weapons/Guns/SMGs/briefcase.rsi/meta.json | 28 +++++++++++++ 9 files changed, 87 insertions(+) create mode 100644 Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/base.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/bolt-open.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/icon-muzzle.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/inhand-left-muzzle.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/inhand-right-muzzle.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/meta.json diff --git a/Resources/Locale/en-US/store/uplink-catalog.ftl b/Resources/Locale/en-US/store/uplink-catalog.ftl index 7ae8ddd4f9..3e070b835d 100644 --- a/Resources/Locale/en-US/store/uplink-catalog.ftl +++ b/Resources/Locale/en-US/store/uplink-catalog.ftl @@ -498,3 +498,6 @@ uplink-smuggler-satchel-desc = A handy, suspicious looking satchel. Just flat en uplink-acolyte-armor-name = Acolyte Armor uplink-acolyte-armor-desc = The must have of any self respecting cult leader. An evil looking piece of armor, made of bones, and surprisingly resistant to damage. + +uplink-briefcase-gun-name = Briefcase Gun +uplink-briefcase-gun-desc = An indistinct briefcase with a highly compact C-20K mounted inside it. Careful not the grip the handle too tight! diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index f245b1082c..6ef1720105 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -2301,3 +2301,20 @@ - !type:BuyerJobCondition whitelist: - MedicalDoctor + +- type: listing + id: uplinkBriefcaseGun + name: uplink-briefcase-gun-name + description: uplink-briefcase-gun-desc + productEntity: WeaponSubMachineGunBriefcase + discountCategory: veryRareDiscounts + discountDownTo: + Telecrystal: 10 + cost: + Telecrystal: 15 + categories: + - UplinkJob + conditions: + - !type:BuyerJobCondition + whitelist: + - Lawyer diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml index 15ddb7b38e..4ca2e0c0f5 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml @@ -283,3 +283,42 @@ steps: 6 zeroVisible: true - type: Appearance + +- type: entity + name: brown briefcase + parent: [BaseWeaponSubMachineGun] + id: WeaponSubMachineGunBriefcase + description: Useful for carrying items in your hands. + suffix: Gun + components: + - type: Item + size: Ginormous + inhandVisuals: + left: + - sprite: Objects/Storage/Briefcases/briefcase_brown.rsi + state: inhand-left + - state: inhand-left-muzzle + right: + - sprite: Objects/Storage/Briefcases/briefcase_brown.rsi + state: inhand-right + - state: inhand-right-muzzle + - type: Sprite + sprite: Objects/Weapons/Guns/SMGs/briefcase.rsi + layers: + - sprite: Objects/Storage/Briefcases/briefcase_brown.rsi + state: icon + - state: icon-muzzle + map: ["enum.GunVisualLayers.Base"] + - type: Gun + fireRate: 9 + minAngle: 25 + maxAngle: 32 + availableModes: + - FullAuto + soundGunshot: + path: /Audio/Weapons/Guns/Gunshots/atreides.ogg + - type: ChamberMagazineAmmoProvider + autoEject: false + - type: Appearance + - type: StaticPrice + price: 5000 diff --git a/Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/base.png b/Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/base.png new file mode 100644 index 0000000000000000000000000000000000000000..6f164336daa0cdbea236f7251e0fed37c2276aa5 GIT binary patch literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^T<0-i38ArY;~ z2@C2<_b}^kl{tO&NTlSB8wzE$zgr(o`@h7hDTV#O zf!5>uAK0~7cF8zgV0>|~_f2(*rJk7^+X`iaMeOk_9`Ne1hxYwv+myot0>9tYq!k1` zRDBZ1Q@VX#UDA(l{mjdi3)&dYl#9##PpbI-S>3sC7K`)yHR3!@Z{Aqw9$)6?J7@aC zYp3s9d^LFZxwlbAnpuZs&Y7J7M>ZsulpbN26WAd0hsVRQd)li&261U+FA)b}t>$K} zcNzzznRqVbe0zJno{ig5ZqKyCR~D`2Hh*?(HT!yIjz|yQy)4cR*AlKU9=^}0Z~u4c m8jWRF7@ve(1bJVFf#LCiVoARF8C2<_b}^kl{tO&NTlSB8wzE$zgr(o`@h7hDTV#O zf!5>uAK0~7cF8zgV0>|~_f2(*rJk7^+X`iaMeOk_9`Ne1hxYwv+myot0>9tYq!k1` zRDBZ1Q@VX#UDA(l{mjdi3)&dYl#9##PpbI-S>3sC7K`)yHR3!@Z{Aqw9$)6?J7@aC zYp3s9d^LFZxwlbAnpuZs&Y7J7M>ZsulpbN26WAd0hsVRQd)li&261U+FA)b}t>$K} zcNzzznRqVbe0zJno{ig5ZqKyCR~D`2Hh*?(HT!yIjz|yQy)4cR*AlKU9=^}0Z~u4c m8jWRF7@ve(1bJVFf#LCiVoARF8cxArY-_ z&oS~cFmNz0_^!X!@SU290wY63!YxLI9l4Aqaf}Srhm5R&iWxjz{an^LB{Ts5hvOMg literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/inhand-left-muzzle.png b/Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/inhand-left-muzzle.png new file mode 100644 index 0000000000000000000000000000000000000000..6d2b28171b898fed54b71a952a99d2111e3c3e1f GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|^gLZ0Ln`LH zJ!i%^p%F)~~XoU;bR^>p=fS?83{1OVwZ B8~FeL literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/meta.json new file mode 100644 index 0000000000..3aaf214aae --- /dev/null +++ b/Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/meta.json @@ -0,0 +1,28 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "briefcase base made by ps3moira (github) and modified by MissKay1994(github), weapon states by MissKay1994(github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon-muzzle" + }, + { + "name": "inhand-left-muzzle", + "directions": 4 + }, + { + "name": "inhand-right-muzzle", + "directions": 4 + }, + { + "name": "bolt-open" + }, + { + "name": "base" + } + ] +} From 3bbd08d88927690408119088a52e8813a852f362 Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 13 Nov 2025 21:40:35 +0000 Subject: [PATCH 049/106] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index c8bf3b4976..ac1ed4ef8b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Tayrtahn - changes: - - message: Sloths... now... speak... slowly... - type: Add - id: 8699 - time: '2025-06-21T06:32:30.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38142 - author: whatston3 changes: - message: Locked buttons must now be unlocked to trigger. @@ -3925,3 +3918,10 @@ id: 9200 time: '2025-11-12T16:31:41.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41402 +- author: MissKay1994 + changes: + - message: Added a new briefcase gun to the lawyer job's uplink. + type: Add + id: 9201 + time: '2025-11-13T21:39:28.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/40210 From 31ade640d0c6898ec05391d16a746c449404b76c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=81da?= Date: Thu, 13 Nov 2025 17:56:17 -0600 Subject: [PATCH 050/106] RandomTriggerOnTriggerComponent (#41422) * commit * rename * prevent recusion --------- Co-authored-by: iaada --- .../RandomTriggerOnTriggerComponent.cs | 21 ++++++++++ .../Systems/RandomTriggerOnTriggerSystem.cs | 38 +++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 Content.Shared/Trigger/Components/Effects/RandomTriggerOnTriggerComponent.cs create mode 100644 Content.Shared/Trigger/Systems/RandomTriggerOnTriggerSystem.cs diff --git a/Content.Shared/Trigger/Components/Effects/RandomTriggerOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/RandomTriggerOnTriggerComponent.cs new file mode 100644 index 0000000000..f7d8c5036c --- /dev/null +++ b/Content.Shared/Trigger/Components/Effects/RandomTriggerOnTriggerComponent.cs @@ -0,0 +1,21 @@ +using Content.Shared.Random; +using Content.Shared.Trigger.Components.Triggers; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Trigger.Components.Effects; + +/// +/// When triggered this component will choose a key and send a new trigger. +/// Trigger is sent to user if is true. +/// +/// Does not support recursive loops where this component triggers itself. Use instead. +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class RandomTriggerOnTriggerComponent : BaseXOnTriggerComponent +{ + /// + /// The trigger keys and their weights. + /// + [DataField(required: true), AutoNetworkedField] + public ProtoId RandomKeyOut; +} diff --git a/Content.Shared/Trigger/Systems/RandomTriggerOnTriggerSystem.cs b/Content.Shared/Trigger/Systems/RandomTriggerOnTriggerSystem.cs new file mode 100644 index 0000000000..75acc005d0 --- /dev/null +++ b/Content.Shared/Trigger/Systems/RandomTriggerOnTriggerSystem.cs @@ -0,0 +1,38 @@ +using Content.Shared.Random.Helpers; +using Content.Shared.Trigger.Components.Effects; +using Robust.Shared.Prototypes; +using Robust.Shared.Timing; + +namespace Content.Shared.Trigger.Systems; + +public sealed class RandomTriggerOnTriggerSystem : XOnTriggerSystem +{ + [Dependency] private readonly TriggerSystem _trigger = default!; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly IGameTiming _timing = default!; + + protected override void OnTrigger(Entity ent, EntityUid target, ref TriggerEvent args) + { + // TODO: Replace with RandomPredicted once the engine PR is merged + var hash = new List + { + (int)_timing.CurTick.Value, + GetNetEntity(ent).Id, + args.User == null ? 0 : GetNetEntity(args.User.Value).Id, + }; + var seed = SharedRandomExtensions.HashCodeCombine(hash); + var rand = new System.Random(seed); + + var keyOut = _prototypeManager.Index(ent.Comp.RandomKeyOut).Pick(rand); + + // Prevent recursive triggers + if (target == ent.Owner && ent.Comp.KeysIn.Contains(keyOut)) + { + Log.Warning($"{ToPrettyString(ent)} attempted to recursively trigger itself using RandomTriggerOnTriggerComponent."); + return; + } + + _trigger.Trigger(target, args.User, keyOut); + args.Handled = true; + } +} From d87677323e31445cf1fe979fd3b71aa4280297b6 Mon Sep 17 00:00:00 2001 From: Hitlinemoss <209321380+Hitlinemoss@users.noreply.github.com> Date: Fri, 14 Nov 2025 06:03:57 -0500 Subject: [PATCH 051/106] Security IDs no longer have Service access by default (#41411) --- Resources/Prototypes/Roles/Jobs/Security/detective.yml | 1 - Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml | 1 - Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml | 1 - Resources/Prototypes/Roles/Jobs/Security/security_officer.yml | 1 - Resources/Prototypes/Roles/Jobs/Security/warden.yml | 1 - 5 files changed, 5 deletions(-) diff --git a/Resources/Prototypes/Roles/Jobs/Security/detective.yml b/Resources/Prototypes/Roles/Jobs/Security/detective.yml index 03db499c8c..5b84597e2a 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/detective.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/detective.yml @@ -15,7 +15,6 @@ - Security - Brig - Maintenance - - Service - Detective - Cryogenics - External diff --git a/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml b/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml index 1f73f48988..a0d3ef5845 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml @@ -28,7 +28,6 @@ - Security - Armory - Maintenance - - Service - External - Detective - Cryogenics diff --git a/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml b/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml index de7e6d9544..52b63f1ab2 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml @@ -18,7 +18,6 @@ - Security - Brig - Maintenance - - Service - External - Cryogenics - GenpopEnter diff --git a/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml b/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml index 1b60a527b0..7c140c8ee9 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml @@ -15,7 +15,6 @@ - Security - Brig - Maintenance - - Service - External - Cryogenics - GenpopEnter diff --git a/Resources/Prototypes/Roles/Jobs/Security/warden.yml b/Resources/Prototypes/Roles/Jobs/Security/warden.yml index 630afcd684..2d8813a69e 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/warden.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/warden.yml @@ -20,7 +20,6 @@ - Brig - Armory - Maintenance - - Service - External - Detective - Cryogenics From eccd95690fc4e65e056a9668653aa28d98d69ae4 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 14 Nov 2025 11:16:31 +0000 Subject: [PATCH 052/106] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index ac1ed4ef8b..a14519ab1d 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: whatston3 - changes: - - message: Locked buttons must now be unlocked to trigger. - type: Fix - id: 8700 - time: '2025-06-21T09:41:04.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38474 - author: slarticodefast changes: - message: Fixed wallmount interaction rotation. @@ -3925,3 +3918,10 @@ id: 9201 time: '2025-11-13T21:39:28.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/40210 +- author: Hitlinemoss + changes: + - message: Security IDs no longer have Service access by default. + type: Remove + id: 9202 + time: '2025-11-14T11:15:22.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41411 From e5daa54e79d8b3c0d20e358cb34d5ad7a0c5a2ef Mon Sep 17 00:00:00 2001 From: Samuka <47865393+Samuka-C@users.noreply.github.com> Date: Fri, 14 Nov 2025 19:10:09 -0300 Subject: [PATCH 053/106] Xenoborgs part 7 (#40042) * add mothership module * option for mothership to open self UI * fix mothership module * remove mothership body * swapp real hands for modules * action sprite for mothership module * removed hands from mothership core sprite * xenoborgs now drop a pinpointer to the mothership core once destroyed * add pinpointer to space movment module * add base for XenoborgRule * add xenoborg antag option * something was needed * something else was needed * add ghost role spawn points * change name in antag selection to Xenoborg Core * add random spawnPoint markers that don't do anything * add spawn points to mothership * update spawn points * add xenoborgs rule * add xenoborgs rule to rotation * add xenoborgs preset * update preset with secret version also added xenoborg mode description * modify Antag Selection system to allow for custom entities via the AntagSelectionDefinition * fix ghostroles spawners * fix rule with new entityPrototype * add spawnpoints to the mothership * whitelist system to spawnpoints * updated xenoborg components * added xenoborg component to xenoborgs * updated spawnpoints of xenoborgs in the mothership * add new tags for xenoborg and mothership core * add new tags for xenoborgs and mothership core * update ghostrole spawners for xenoborgs * message for when you get the xenoborg role * explode all xenoborgs when mothership core dies * for real now. explode all xenoborgs when mothership core is destroyed * round end summary for xenoborgs * temporary * add guidebook entry for xenoborgs * instructions on how to borg players * removed lock from xenoborg control computer * announcement when all xenoborgs die * announcement when mothership core is destroyed * typos * fix error * improve xenoborg mind role * move sounds to xenoborg and mothership component * play sounds when turned into xenoborg * change sprites of mothership core actions * minor fix * add custom xenoborg start sound * carps now attack xenoborgs * added guide link to xenoborgs * add guidebook link to xenoborgs * added guidebook link to mothership core * add link to source of the sound * fixed minor issue * has to be 1 * typo * add light layer to mothership core sprite * fixed antag selection system * update guideboook * update the guidebook again * alphabet * documentation * simplify documentation Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> * make the briefing yml instead of code * fix bug with sprites * fix formating * remove stuff from AntagSelection * add stuff to AntagSpawner * fix game rule * removed secret xenoborg preset * support for more than one entity for each antag role * fix gamerule * fixes * no xeonborgs * add xenoborgs to all at once * engi xenoborg included * more comments * more recognizable * more xenoborgs when more players * removed unused stuff * correct access * removed unnecessary stuff * use GetAliveHumans and make comments better * Make the system more robust * use a constant * remove overload from the Destroy method * has to be public to be used in the xenoborg system * fix the mindrole methods * not sure, but I was asked to do it * use a constant for the color * forgot to make it static * removed param comments * removed useless parameters * fixed stuff * added event listeneers to xenoborg mind change * only 4 * unfuck the antagSpawner * comment * unfix stuff * commentary * removed xenoborg stuff from siliconLawSystem * move some stuff to the component * removed space * removed uncessary stuff * no need to crate a var * move stuff from mothership comp to xenoborg comp * removed XenoborgCoreRoleComponent * comment on the AntagSelectLocationEvent * added back empty line * comment * make the summary better * make AntagRoleToPrototypes summary better * adding useless stuff back cause it was there before * hascomp instead of trycomp * again * LocId instead of string * make a new logic for the whitelist of the spawnpoint * added ghostrole tags back * use hascomp instead of trycomp * removed whitelist from SpawnPointComponent * not needed anymore * no longer subverted * fixed names * make it better * add not * i'm dumb * briefing is now handled by the xenoborg system * call evac if there is too many xenoborgs * update submodule * fix division * Add AutoGenerateComponentPause and AutoPausedField to XenoborgsRuleComponent * add lines between stuff * Make the Blocking system more robust * Make mothership inherit from BaseMob * remove this stuff cause is bad * Revert "Make the Blocking system more robust" This reverts commit 099babfe1daef00e6073e04108920327416e4ca4. * Mothership core snaps to grid * stop mothership core from moving * mothership core is static again * make guidebook entry on how to xenoborg crew better * Make mothership core damageable * If xenoborgs need it, so do zombies i guess * Start the NextRoundEndCheck * follow private static readonly naming rule * Samething * Fix announcments * Make it a datafield, no? * Revert "Make it a datafield, no?" This reverts commit 62f6255ccccdd583d7f833ae4dbcd09a670f721a. * remove stuff * doesn't need to move * is kinda of a structure * so it doesn't pry floors as soon as it spawns * powercell hand to mothership core module * label for new hand * core_e -> core-e * mothership core can pilot the shuttle again * fix duplicated tag + description to xenoborg tags * scout xenoborg can now move in space without the jetpack so it can better use the sword module * improve basic xenoborg module * remove changes from zombie rule comp * swap AllEntityQuery for EntityQueryEnumerator * new line at the end * change to 15 seconds * make MothershipCoreDeathAnnouncmentSent into a datafield --------- Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Co-authored-by: beck-thompson --- .../Antag/AntagMultipleRoleSpawnerSystem.cs | 40 +++++ Content.Server/Antag/AntagSelectionSystem.cs | 49 ++--- .../AntagMultipleRoleSpawnerComponent.cs | 23 +++ .../Components/XenoborgsRuleComponent.cs | 33 ++++ .../GameTicking/Rules/RuleGridsSystem.cs | 6 + .../GameTicking/Rules/XenoborgsRuleSystem.cs | 167 ++++++++++++++++++ .../Silicons/Borgs/BorgSystem.Transponder.cs | 11 +- .../GridSpawnPointWhitelistComponent.cs | 22 +++ Content.Server/Xenoborgs/XenoborgSystem.cs | 101 +++++++++++ .../Roles/Components/XenoborgRoleComponent.cs | 9 + .../Borgs/Components/BorgChassisComponent.cs | 6 + .../Silicons/Borgs/SharedBorgSystem.cs | 4 +- .../Components/MothershipCoreComponent.cs | 7 + .../Xenoborgs/Components/XenoborgComponent.cs | 29 ++- .../Audio/Ambience/Antag/attributions.yml | 5 +- .../Audio/Ambience/Antag/xenoborg_start.ogg | Bin 0 -> 404106 bytes .../game-presets/preset-xenoborgs.ftl | 25 +++ .../ghost/roles/ghost-role-component.ftl | 6 + Resources/Locale/en-US/guidebook/guides.ftl | 1 + Resources/Locale/en-US/mind/role-types.ftl | 4 +- .../Locale/en-US/prototypes/roles/antags.ftl | 6 + .../Locale/en-US/robotics/borg_modules.ftl | 3 + Resources/Locale/en-US/station-laws/laws.ftl | 2 +- .../Locale/en-US/xenoborgs/xenoborgs.ftl | 3 + Resources/Maps/Shuttles/mothership.yml | 33 +++- .../Entities/Clothing/Back/specific.yml | 31 ++++ .../Spawners/Conditional/xenoborgs.yml | 40 +++++ .../Entities/Markers/Spawners/ghost_roles.yml | 44 +++++ .../Mobs/Cyborgs/base_borg_chassis.yml | 9 +- .../Entities/Mobs/Cyborgs/xenoborgs.yml | 7 + .../Entities/Mobs/Player/mothershipcore.yml | 83 +++++---- .../Entities/Objects/Devices/pinpointer.yml | 2 +- .../Specific/Robotics/borg_modules.yml | 54 +++++- .../Machines/Computers/computers.yml | 14 +- Resources/Prototypes/GameRules/roundstart.yml | 15 ++ .../Prototypes/GameRules/subgamemodes.yml | 33 ++++ Resources/Prototypes/Guidebook/antagonist.yml | 6 + .../Prototypes/Roles/Antags/xenoborgs.yml | 23 +++ .../Prototypes/Roles/MindRoles/mind_roles.yml | 25 +++ Resources/Prototypes/ai_factions.yml | 1 + Resources/Prototypes/game_presets.yml | 18 ++ Resources/Prototypes/tags.yml | 21 ++- .../Guidebook/Antagonist/Xenoborgs.xml | 167 ++++++++++++++++++ .../Actions/actions_borg.rsi/meta.json | 9 + .../xenoborg-camera-computer.png | Bin 0 -> 253 bytes .../xenoborg-control-computer.png | Bin 0 -> 298 bytes .../xenoborg-module-module.png | Bin 0 -> 276 bytes .../mothership_core.rsi/core-active.png | Bin 9845 -> 3933 bytes .../Silicon/mothership_core.rsi/core-e.png | Bin 0 -> 344 bytes .../Silicon/mothership_core.rsi/core-idle.png | Bin 1737 -> 1158 bytes .../Silicon/mothership_core.rsi/meta.json | 4 + .../silicon_storage_cube.rsi/meta.json | 14 ++ .../silicon_storage_cube.rsi/xenoborg.png | Bin 0 -> 321 bytes 53 files changed, 1139 insertions(+), 76 deletions(-) create mode 100644 Content.Server/Antag/AntagMultipleRoleSpawnerSystem.cs create mode 100644 Content.Server/Antag/Components/AntagMultipleRoleSpawnerComponent.cs create mode 100644 Content.Server/GameTicking/Rules/Components/XenoborgsRuleComponent.cs create mode 100644 Content.Server/GameTicking/Rules/XenoborgsRuleSystem.cs create mode 100644 Content.Server/Spawners/Components/GridSpawnPointWhitelistComponent.cs create mode 100644 Content.Server/Xenoborgs/XenoborgSystem.cs create mode 100644 Content.Shared/Roles/Components/XenoborgRoleComponent.cs create mode 100644 Content.Shared/Xenoborgs/Components/MothershipCoreComponent.cs create mode 100644 Resources/Audio/Ambience/Antag/xenoborg_start.ogg create mode 100644 Resources/Locale/en-US/game-ticking/game-presets/preset-xenoborgs.ftl create mode 100644 Resources/Locale/en-US/xenoborgs/xenoborgs.ftl create mode 100644 Resources/Prototypes/Entities/Markers/Spawners/Conditional/xenoborgs.yml create mode 100644 Resources/Prototypes/Roles/Antags/xenoborgs.yml create mode 100644 Resources/ServerInfo/Guidebook/Antagonist/Xenoborgs.xml create mode 100644 Resources/Textures/Interface/Actions/actions_borg.rsi/xenoborg-camera-computer.png create mode 100644 Resources/Textures/Interface/Actions/actions_borg.rsi/xenoborg-control-computer.png create mode 100644 Resources/Textures/Interface/Actions/actions_borg.rsi/xenoborg-module-module.png create mode 100644 Resources/Textures/Mobs/Silicon/mothership_core.rsi/core-e.png create mode 100644 Resources/Textures/Objects/Specific/Robotics/silicon_storage_cube.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Robotics/silicon_storage_cube.rsi/xenoborg.png diff --git a/Content.Server/Antag/AntagMultipleRoleSpawnerSystem.cs b/Content.Server/Antag/AntagMultipleRoleSpawnerSystem.cs new file mode 100644 index 0000000000..d59fbc82b4 --- /dev/null +++ b/Content.Server/Antag/AntagMultipleRoleSpawnerSystem.cs @@ -0,0 +1,40 @@ +using Content.Server.Antag.Components; +using Robust.Shared.Random; + +namespace Content.Server.Antag; + +public sealed class AntagMultipleRoleSpawnerSystem : EntitySystem +{ + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly ILogManager _log = default!; + + private ISawmill _sawmill = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnSelectEntity); + + _sawmill = _log.GetSawmill("antag_multiple_spawner"); + } + + private void OnSelectEntity(Entity ent, ref AntagSelectEntityEvent args) + { + // If its more than one the logic breaks + if (args.AntagRoles.Count != 1) + { + _sawmill.Fatal($"Antag multiple role spawner had more than one antag ({args.AntagRoles.Count})"); + return; + } + + var role = args.AntagRoles[0]; + + var entProtos = ent.Comp.AntagRoleToPrototypes[role]; + + if (entProtos.Count == 0) + return; // You will just get a normal job + + args.Entity = Spawn(ent.Comp.PickAndTake ? _random.PickAndTake(entProtos) : _random.Pick(entProtos)); + } +} diff --git a/Content.Server/Antag/AntagSelectionSystem.cs b/Content.Server/Antag/AntagSelectionSystem.cs index 2d484a2aa9..15ba636a93 100644 --- a/Content.Server/Antag/AntagSelectionSystem.cs +++ b/Content.Server/Antag/AntagSelectionSystem.cs @@ -271,7 +271,7 @@ public sealed partial class AntagSelectionSystem : GameRuleSystem(player, out var spawnerComp)) { Log.Error($"Antag spawner {player} does not have a GhostRoleAntagSpawnerComponent."); - _adminLogger.Add(LogType.AntagSelection,$"Antag spawner {player} in gamerule {ToPrettyString(ent)} failed due to not having GhostRoleAntagSpawnerComponent."); + _adminLogger.Add(LogType.AntagSelection, $"Antag spawner {player} in gamerule {ToPrettyString(ent)} failed due to not having GhostRoleAntagSpawnerComponent."); if (session != null) { ent.Comp.AssignedSessions.Remove(session); @@ -538,21 +539,21 @@ public sealed partial class AntagSelectionSystem : GameRuleSystem [ByRefEvent] -public record struct AntagSelectEntityEvent(ICommonSession? Session, Entity GameRule) +public record struct AntagSelectEntityEvent(ICommonSession? Session, Entity GameRule, List> AntagRoles) { public readonly ICommonSession? Session = Session; + /// list of antag role prototypes associated with a entity. used by the + public readonly List> AntagRoles = AntagRoles; + public bool Handled => Entity != null; public EntityUid? Entity; @@ -620,12 +624,15 @@ public record struct AntagSelectEntityEvent(ICommonSession? Session, Entity [ByRefEvent] -public record struct AntagSelectLocationEvent(ICommonSession? Session, Entity GameRule) +public record struct AntagSelectLocationEvent(ICommonSession? Session, Entity GameRule, EntityUid Entity) { public readonly ICommonSession? Session = Session; public bool Handled => Coordinates.Any(); + // the entity of the antagonist + public EntityUid Entity = Entity; + public List Coordinates = new(); } diff --git a/Content.Server/Antag/Components/AntagMultipleRoleSpawnerComponent.cs b/Content.Server/Antag/Components/AntagMultipleRoleSpawnerComponent.cs new file mode 100644 index 0000000000..5a9103a82a --- /dev/null +++ b/Content.Server/Antag/Components/AntagMultipleRoleSpawnerComponent.cs @@ -0,0 +1,23 @@ +using Content.Shared.Roles; +using Robust.Shared.Prototypes; + +namespace Content.Server.Antag.Components; + +/// +/// Selects and spawns one prototype from a list for each antag prototype selected by the +/// +[RegisterComponent] +public sealed partial class AntagMultipleRoleSpawnerComponent : Component +{ + /// + /// antag prototype -> list of possible entities to spawn for that antag prototype. Will choose from the list randomly once with replacement unless is set to true + /// + [DataField] + public Dictionary, List> AntagRoleToPrototypes; + + /// + /// Should you remove ent prototypes from the list after spawning one. + /// + [DataField] + public bool PickAndTake; +} diff --git a/Content.Server/GameTicking/Rules/Components/XenoborgsRuleComponent.cs b/Content.Server/GameTicking/Rules/Components/XenoborgsRuleComponent.cs new file mode 100644 index 0000000000..742890226f --- /dev/null +++ b/Content.Server/GameTicking/Rules/Components/XenoborgsRuleComponent.cs @@ -0,0 +1,33 @@ +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; + +namespace Content.Server.GameTicking.Rules.Components; + +[RegisterComponent, Access(typeof(XenoborgsRuleSystem))] +[AutoGenerateComponentPause] +public sealed partial class XenoborgsRuleComponent : Component +{ + /// + /// When the round will next check for round end. + /// + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] + [AutoPausedField] + public TimeSpan? NextRoundEndCheck; + + /// + /// The amount of time between each check for the end of the round. + /// + [DataField] + public TimeSpan EndCheckDelay = TimeSpan.FromSeconds(15); + + /// + /// After this amount of the crew become xenoborgs, the shuttle will be automatically called. + /// + [DataField] + public float XenoborgShuttleCallPercentage = 0.7f; + + /// + /// If the announcment of the death of the mothership core was sent + /// + [DataField] + public bool MothershipCoreDeathAnnouncmentSent = false; +} diff --git a/Content.Server/GameTicking/Rules/RuleGridsSystem.cs b/Content.Server/GameTicking/Rules/RuleGridsSystem.cs index 9eae9e3c95..ef18233909 100644 --- a/Content.Server/GameTicking/Rules/RuleGridsSystem.cs +++ b/Content.Server/GameTicking/Rules/RuleGridsSystem.cs @@ -65,6 +65,12 @@ public sealed class RuleGridsSystem : GameRuleSystem if (_whitelist.IsWhitelistFail(ent.Comp.SpawnerWhitelist, uid)) continue; + if (TryComp(uid, out var gridSpawnPointWhitelistComponent)) + { + if (!_whitelist.CheckBoth(args.Entity, gridSpawnPointWhitelistComponent.Blacklist, gridSpawnPointWhitelistComponent.Whitelist)) + continue; + } + args.Coordinates.Add(_transform.GetMapCoordinates(xform)); } } diff --git a/Content.Server/GameTicking/Rules/XenoborgsRuleSystem.cs b/Content.Server/GameTicking/Rules/XenoborgsRuleSystem.cs new file mode 100644 index 0000000000..8d13578301 --- /dev/null +++ b/Content.Server/GameTicking/Rules/XenoborgsRuleSystem.cs @@ -0,0 +1,167 @@ +using Content.Server.Antag; +using Content.Server.Chat.Systems; +using Content.Server.GameTicking.Rules.Components; +using Content.Server.RoundEnd; +using Content.Server.Station.Systems; +using Content.Shared.Destructible; +using Content.Shared.GameTicking.Components; +using Content.Shared.Mind; +using Content.Shared.Mobs.Systems; +using Content.Shared.Xenoborgs.Components; +using Robust.Shared.Timing; + +namespace Content.Server.GameTicking.Rules; + +public sealed class XenoborgsRuleSystem : GameRuleSystem +{ + [Dependency] private readonly AntagSelectionSystem _antag = default!; + [Dependency] private readonly ChatSystem _chatSystem = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; + [Dependency] private readonly SharedMindSystem _mindSystem = default!; + [Dependency] private readonly RoundEndSystem _roundEnd = default!; + [Dependency] private readonly StationSystem _station = default!; + [Dependency] private readonly IGameTiming _timing = default!; + + private static readonly Color AnnouncmentColor = Color.Gold; + + public void SendXenoborgDeathAnnouncement(Entity ent, bool mothershipCoreAlive) + { + if (ent.Comp.MothershipCoreDeathAnnouncmentSent) + return; + + var status = mothershipCoreAlive ? "alive" : "dead"; + _chatSystem.DispatchGlobalAnnouncement( + Loc.GetString($"xenoborgs-no-more-threat-mothership-core-{status}-announcement"), + colorOverride: AnnouncmentColor); + } + + public void SendMothershipDeathAnnouncement(Entity ent) + { + _chatSystem.DispatchGlobalAnnouncement( + Loc.GetString("mothership-destroyed-announcement"), + colorOverride: AnnouncmentColor); + + ent.Comp.MothershipCoreDeathAnnouncmentSent = true; + } + + // TODO: Refactor the end of round text + protected override void AppendRoundEndText(EntityUid uid, + XenoborgsRuleComponent component, + GameRuleComponent gameRule, + ref RoundEndTextAppendEvent args) + { + base.AppendRoundEndText(uid, component, gameRule, ref args); + + var numXenoborgs = GetNumberXenoborgs(); + var numHumans = _mindSystem.GetAliveHumans().Count; + + if (numXenoborgs < 5) + args.AddLine(Loc.GetString("xenoborgs-crewmajor")); + else if (4 * numXenoborgs < numHumans) + args.AddLine(Loc.GetString("xenoborgs-crewmajor")); + else if (2 * numXenoborgs < numHumans) + args.AddLine(Loc.GetString("xenoborgs-crewminor")); + else if (1.5 * numXenoborgs < numHumans) + args.AddLine(Loc.GetString("xenoborgs-neutral")); + else if (numXenoborgs < numHumans) + args.AddLine(Loc.GetString("xenoborgs-borgsminor")); + else + args.AddLine(Loc.GetString("xenoborgs-borgsmajor")); + + var numMothershipCores = GetNumberMothershipCores(); + + if (numMothershipCores == 0) + args.AddLine(Loc.GetString("xenoborgs-cond-all-xenoborgs-dead-core-dead")); + else if (numXenoborgs == 0) + args.AddLine(Loc.GetString("xenoborgs-cond-all-xenoborgs-dead-core-alive")); + else + args.AddLine(Loc.GetString("xenoborgs-cond-xenoborgs-alive", ("count", numXenoborgs))); + + args.AddLine(Loc.GetString("xenoborgs-list-start")); + + var antags = _antag.GetAntagIdentifiers(uid); + + foreach (var (_, sessionData, name) in antags) + { + args.AddLine(Loc.GetString("xenoborgs-list", ("name", name), ("user", sessionData.UserName))); + } + } + + private void CheckRoundEnd(XenoborgsRuleComponent xenoborgsRuleComponent) + { + var numXenoborgs = GetNumberXenoborgs(); + var numHumans = _mindSystem.GetAliveHumans().Count; + + if ((float)numXenoborgs / numHumans > xenoborgsRuleComponent.XenoborgShuttleCallPercentage) + { + foreach (var station in _station.GetStations()) + { + _chatSystem.DispatchStationAnnouncement(station, Loc.GetString("xenoborg-shuttle-call"), colorOverride: Color.BlueViolet); + } + _roundEnd.RequestRoundEnd(null, false); + } + } + + protected override void Started(EntityUid uid, XenoborgsRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) + { + base.Started(uid, component, gameRule, args); + + component.NextRoundEndCheck = _timing.CurTime + component.EndCheckDelay; + } + + protected override void ActiveTick(EntityUid uid, XenoborgsRuleComponent component, GameRuleComponent gameRule, float frameTime) + { + base.ActiveTick(uid, component, gameRule, frameTime); + + if (!component.NextRoundEndCheck.HasValue || component.NextRoundEndCheck > _timing.CurTime) + return; + + CheckRoundEnd(component); + component.NextRoundEndCheck = _timing.CurTime + component.EndCheckDelay; + } + + /// + /// Get the number of xenoborgs + /// + /// if it should only include xenoborgs with a mind + /// if it should only include xenoborgs that are alive + /// the number of xenoborgs + private int GetNumberXenoborgs(bool playerControlled = true, bool alive = true) + { + var numberXenoborgs = 0; + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var xenoborg, out _)) + { + if (HasComp(xenoborg)) + continue; + + if (playerControlled && !_mindSystem.TryGetMind(xenoborg, out _, out _)) + continue; + + if (alive && !_mobState.IsAlive(xenoborg)) + continue; + + numberXenoborgs++; + } + + return numberXenoborgs; + } + + /// + /// Gets the number of xenoborg cores + /// + /// the number of xenoborg cores + private int GetNumberMothershipCores() + { + var numberMothershipCores = 0; + + var mothershipCoreQuery = EntityQueryEnumerator(); + while (mothershipCoreQuery.MoveNext(out _, out _)) + { + numberMothershipCores++; + } + + return numberMothershipCores; + } +} diff --git a/Content.Server/Silicons/Borgs/BorgSystem.Transponder.cs b/Content.Server/Silicons/Borgs/BorgSystem.Transponder.cs index fd3b910753..8dd074e6a0 100644 --- a/Content.Server/Silicons/Borgs/BorgSystem.Transponder.cs +++ b/Content.Server/Silicons/Borgs/BorgSystem.Transponder.cs @@ -98,7 +98,7 @@ public sealed partial class BorgSystem if (command == RoboticsConsoleConstants.NET_DISABLE_COMMAND) Disable(ent); else if (command == RoboticsConsoleConstants.NET_DESTROY_COMMAND) - Destroy(ent); + Destroy(ent.Owner); } private void Disable(Entity ent) @@ -118,8 +118,15 @@ public sealed partial class BorgSystem ent.Comp1.NextDisable = _timing.CurTime + ent.Comp1.DisableDelay; } - private void Destroy(Entity ent) + /// + /// Makes a borg with explode + /// + /// the entity of the borg + public void Destroy(Entity ent) { + if (!Resolve(ent, ref ent.Comp)) + return; + // this is stealthy until someone realises you havent exploded if (CheckEmagged(ent, "destroyed")) { diff --git a/Content.Server/Spawners/Components/GridSpawnPointWhitelistComponent.cs b/Content.Server/Spawners/Components/GridSpawnPointWhitelistComponent.cs new file mode 100644 index 0000000000..de9f71f0f8 --- /dev/null +++ b/Content.Server/Spawners/Components/GridSpawnPointWhitelistComponent.cs @@ -0,0 +1,22 @@ +using Content.Shared.Whitelist; + +namespace Content.Server.Spawners.Components; + +/// +/// Defines whitelist and blacklist for entities that can spawn at a spawnpoint when they are spawned via the +/// +[RegisterComponent] +public sealed partial class GridSpawnPointWhitelistComponent : Component +{ + /// + /// Whitelist of entities that can be spawned at this SpawnPoint + /// + [DataField] + public EntityWhitelist? Whitelist; + + /// + /// Whitelist of entities that can't be spawned at this SpawnPoint + /// + [DataField] + public EntityWhitelist? Blacklist; +} diff --git a/Content.Server/Xenoborgs/XenoborgSystem.cs b/Content.Server/Xenoborgs/XenoborgSystem.cs new file mode 100644 index 0000000000..8a046ce3c7 --- /dev/null +++ b/Content.Server/Xenoborgs/XenoborgSystem.cs @@ -0,0 +1,101 @@ +using Content.Server.Antag; +using Content.Server.GameTicking.Rules; +using Content.Server.GameTicking.Rules.Components; +using Content.Server.Silicons.Borgs; +using Content.Shared.Destructible; +using Content.Shared.Mind; +using Content.Shared.Mind.Components; +using Content.Shared.Roles; +using Content.Shared.Roles.Components; +using Content.Shared.Silicons.Borgs.Components; +using Content.Shared.Xenoborgs.Components; +using Robust.Shared.Audio; +using Robust.Shared.Player; + +namespace Content.Server.Xenoborgs; + +public sealed partial class XenoborgSystem : EntitySystem +{ + [Dependency] private readonly AntagSelectionSystem _antag = default!; + [Dependency] private readonly BorgSystem _borg = default!; + [Dependency] private readonly SharedRoleSystem _roles = default!; + [Dependency] private readonly XenoborgsRuleSystem _xenoborgsRule = default!; + + private static readonly Color XenoborgBriefingColor = Color.BlueViolet; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnXenoborgDestroyed); + SubscribeLocalEvent(OnCoreDestroyed); + + SubscribeLocalEvent(OnXenoborgMindAdded); + SubscribeLocalEvent(OnXenoborgMindRemoved); + } + + private void OnXenoborgDestroyed(EntityUid uid, XenoborgComponent component, DestructionEventArgs args) + { + // if a xenoborg is destroyed, it will check to see if it was the last one + var xenoborgQuery = AllEntityQuery(); // paused xenoborgs still count + while (xenoborgQuery.MoveNext(out var xenoborg, out _)) + { + if (xenoborg != uid) + return; + } + + var mothershipCoreQuery = AllEntityQuery(); // paused mothership cores still count + var mothershipCoreAlive = mothershipCoreQuery.MoveNext(out _, out _); + + var xenoborgsRuleQuery = EntityQueryEnumerator(); + if (xenoborgsRuleQuery.MoveNext(out var xenoborgsRuleEnt, out var xenoborgsRuleComp)) + _xenoborgsRule.SendXenoborgDeathAnnouncement((xenoborgsRuleEnt, xenoborgsRuleComp), mothershipCoreAlive); + } + + private void OnCoreDestroyed(EntityUid ent, MothershipCoreComponent component, DestructionEventArgs args) + { + // if a mothership core is destroyed, it will see if there are any others + var mothershipCoreQuery = AllEntityQuery(); // paused mothership cores still count + while (mothershipCoreQuery.MoveNext(out var mothershipCoreEnt, out _)) + { + // if it finds a mothership core that is different from the one just destroyed, + // it doesn't explode the xenoborgs + if (mothershipCoreEnt != ent) + return; + } + + var xenoborgsRuleQuery = EntityQueryEnumerator(); + if (xenoborgsRuleQuery.MoveNext(out var xenoborgsRuleEnt, out var xenoborgsRuleComp)) + _xenoborgsRule.SendMothershipDeathAnnouncement((xenoborgsRuleEnt, xenoborgsRuleComp)); + + // explode all xenoborgs + var xenoborgQuery = AllEntityQuery(); // paused xenoborgs still explode + while (xenoborgQuery.MoveNext(out var xenoborgEnt, out _, out _)) + { + if (HasComp(xenoborgEnt)) + continue; + + // I got tired to trying to make this work via the device network. + // so brute force it is... + _borg.Destroy(xenoborgEnt); + } + } + + private void OnXenoborgMindAdded(EntityUid ent, XenoborgComponent comp, MindAddedMessage args) + { + _roles.MindAddRole(args.Mind, comp.MindRole, silent: true); + + if (!TryComp(ent, out var actorComp)) + return; + + _antag.SendBriefing(actorComp.PlayerSession, + Loc.GetString(comp.BriefingText), + XenoborgBriefingColor, + comp.BriefingSound + ); + } + + private void OnXenoborgMindRemoved(EntityUid ent, XenoborgComponent comp, MindRemovedMessage args) + { + _roles.MindRemoveRole(args.Mind.Owner, comp.MindRole); + } +} diff --git a/Content.Shared/Roles/Components/XenoborgRoleComponent.cs b/Content.Shared/Roles/Components/XenoborgRoleComponent.cs new file mode 100644 index 0000000000..eeebad0a79 --- /dev/null +++ b/Content.Shared/Roles/Components/XenoborgRoleComponent.cs @@ -0,0 +1,9 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Roles.Components; + +/// +/// Added to mind role entities to tag that they are a xenoborg. +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class XenoborgRoleComponent : Component; diff --git a/Content.Shared/Silicons/Borgs/Components/BorgChassisComponent.cs b/Content.Shared/Silicons/Borgs/Components/BorgChassisComponent.cs index c2bf2b2801..f562ddefdd 100644 --- a/Content.Shared/Silicons/Borgs/Components/BorgChassisComponent.cs +++ b/Content.Shared/Silicons/Borgs/Components/BorgChassisComponent.cs @@ -78,6 +78,12 @@ public sealed partial class BorgChassisComponent : Component [DataField] public ProtoId NoBatteryAlert = "BorgBatteryNone"; + + /// + /// If the entity can open own UI. + /// + [DataField] + public bool CanOpenSelfUi; } [Serializable, NetSerializable] diff --git a/Content.Shared/Silicons/Borgs/SharedBorgSystem.cs b/Content.Shared/Silicons/Borgs/SharedBorgSystem.cs index 827bb351b0..baf604de0c 100644 --- a/Content.Shared/Silicons/Borgs/SharedBorgSystem.cs +++ b/Content.Shared/Silicons/Borgs/SharedBorgSystem.cs @@ -98,8 +98,8 @@ public abstract partial class SharedBorgSystem : EntitySystem private void OnUIOpenAttempt(EntityUid uid, BorgChassisComponent component, ActivatableUIOpenAttemptEvent args) { - // borgs can't view their own ui - if (args.User == uid) + // borgs generaly can't view their own ui + if (args.User == uid && !component.CanOpenSelfUi) args.Cancel(); } diff --git a/Content.Shared/Xenoborgs/Components/MothershipCoreComponent.cs b/Content.Shared/Xenoborgs/Components/MothershipCoreComponent.cs new file mode 100644 index 0000000000..4835e20aad --- /dev/null +++ b/Content.Shared/Xenoborgs/Components/MothershipCoreComponent.cs @@ -0,0 +1,7 @@ +namespace Content.Shared.Xenoborgs.Components; + +/// +/// Defines what is a xenoborg core for the intentions of the xenoborg rule. if all xenoborg cores are destroyed. all xenoborgs will self-destruct. +/// +[RegisterComponent] +public sealed partial class MothershipCoreComponent : Component; diff --git a/Content.Shared/Xenoborgs/Components/XenoborgComponent.cs b/Content.Shared/Xenoborgs/Components/XenoborgComponent.cs index aee8298bc2..db4ca49c5b 100644 --- a/Content.Shared/Xenoborgs/Components/XenoborgComponent.cs +++ b/Content.Shared/Xenoborgs/Components/XenoborgComponent.cs @@ -1,7 +1,32 @@ +using Content.Shared.Roles.Components; +using Robust.Shared.Audio; +using Robust.Shared.Prototypes; + namespace Content.Shared.Xenoborgs.Components; /// -/// This component for now is being used for the pinpointer, but it will recieve more stuff in the future. +/// Defines what is a xenoborg for the intentions of the xenoborg rule. if all xenoborg cores are destroyed. all xenoborgs will self-destruct. +/// +/// It's also used by the mothership core /// [RegisterComponent] -public sealed partial class XenoborgMothershipComponent : Component; +public sealed partial class XenoborgComponent : Component +{ + /// + /// The mindrole associated with the xenoborg + /// + [DataField] + public EntProtoId MindRole = "MindRoleXenoborg"; + + /// + /// The text that is sent when you become a xenoborg + /// + [DataField] + public LocId BriefingText = "xenoborgs-welcome"; + + /// + /// Briefing sound when you become a xenoborg + /// + [DataField] + public SoundSpecifier BriefingSound = new SoundPathSpecifier("/Audio/Ambience/Antag/xenoborg_start.ogg"); +} diff --git a/Resources/Audio/Ambience/Antag/attributions.yml b/Resources/Audio/Ambience/Antag/attributions.yml index 5418d2a204..c9a9b1304d 100644 --- a/Resources/Audio/Ambience/Antag/attributions.yml +++ b/Resources/Audio/Ambience/Antag/attributions.yml @@ -30,4 +30,7 @@ license: "CC-BY-SA-3.0" copyright: "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/436ba869ebcd0b60b63973fb7562f447ee655205" source: "https://github.com/tgstation/tgstation/blob/master/sound/music/antag/ling_alert.ogg" - +- files: ["xenoborg_start.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Made by DarkIcedCoffee (discord)" + source: "https://github.com/space-wizards/space-station-14/pull/40042/" diff --git a/Resources/Audio/Ambience/Antag/xenoborg_start.ogg b/Resources/Audio/Ambience/Antag/xenoborg_start.ogg new file mode 100644 index 0000000000000000000000000000000000000000..97fe49db99d161797fa294a633c92f6d9418c98c GIT binary patch literal 404106 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 z z+k%+Z2{s_y(SQu zcYBJ5>hq1Za(7jCLK@dAu|N{md$6PLCR|_dAYY9Odm#A8^(OW6%AT(}i7|RA(b5oW z_-*(}(9>QrR*M})Eq^odY=aGrQ~eUS3&CqHXJ`gu|%6*h9>-|kuuI6G;O7vzjzH^UWv zb|Sc*Yus_Wl6*dp->i9ao1$#bv+|HnazSk;kbvD9`O1%8Ca^_nKAAASfu~BPV#z4v zq_R|3Z=HhjYQfA~#jJgT5BqMxtl3oRLG8MsH*t8UJq0KB_hxqsY&bb83a|_|Mwx)U zssl70AAHlKwgGw`{I0^?7qL<#$G}QZXAZ&?SWG)X?@x|#_C0_APY){!4uM*szmBL5 zal+0$k1fC!`I^lIW)yFBdy4WVlf$ASc=zCAX^S)PF?zcHbze*FBoRTq8z?U{fmP;BKdJkHV> zW?k)=yw&ExzbAgjf^QbQ0Eiz{Y6}!ve$AUcUf0V--1evwH8p>-`uBgj zKX|6eyh`ehx+NX#rAtkt*P(z%1%lPrW>4dCYiNoUp{Ala_USU zJo{1d%se(bcD4H#mtgzmg{Dt(N7qk(svkU0C3}aDySl~?OV(aq0A02v-ed!6<#YLN zmk8e7d>VtK!)JG(FQ+)MpQ~EjSy$(sRap9RvHYULseQ*^?*aE!#CjGxmIfyAl{Pg~$>+PD=pV{b#xSY{9&6#Lt ze_DI@jfrmh+8e=g`PI3=+81GFeuR%|dOK|5aBH>RWnt8O@n0`W7d^a_oE7@GHNmM~ij0qpDGQn&{YYcR=fWwki3moTI`OM5_ZT?^Oc4b7+MJ(d=N*^u z_mfSwwm(JIS|j`vQBT=*$b?o`104k=rc_XaAM?10USI|&xxZ$xu1 z@FR0geY-typnL1W{AgPJ_r+Mnb!{!-%x3y%l(mhGU#8vKs;5sf*1-MYk*mW;8G*~q zIjmK-y49+W=`*%}tqwl_=qpn9STPlDjDx=cL^>HDQ5c$*o|yR(L}|g2FLqrpQ^7!w z_=_u@dZMk1<>xLd!!ooxM=wC>cjl0Yv>;~qZ;yEy3>!%%0xng-(t|LO&)GI~Ev;`~x{AV2V zEKSRp&ZOrvrm0-@4{f6r>vhv{qrdew=c;YT!GXS1M#F1f8&R2!jmr_HhDH_8CSifz zGvkBC-QDZk6%q*1otW2`)0ZfVOI0goHl>9Wr8OaSo9+&(XKu^7LS)1r3f>q=9S??b z7i8};8OfVXH8<;~h43isG~U_R&l;XTW`&KNvbG|Bd|)DgX&7~E?EBM>0bcrq?T4MF z{rkn1vOV ztbfr2IzRHkG+z38E)3T(dT3^*FH6*Y)%ie^NKYHXREH+XJGV@#qREyWHpParE`%NGS=I)oj`xHoW%m{?74On#0)-OY_17f4Xo@7 z|A6b?Mk+!U{2h`dmuHzfxq^f#4sgVf5p)U@da^j%9~nHz;Pz=%YxpMW>`-zymgCI_ zRgMGw{k=)T)z#9+49Fb`L$gfL_oQWr0UHYCx!gPAr8oxcu{DO#J~r^&+N?RAXU#>t ziOX(jh(w4cuR#{yJp`jK)9Fki36|Ynz0W-o_e8y1`cXw8*R!+w7xx`LPxORt+6i7s z@OH)gm=IRJL*9{G$!5bpgWV7Jes|Bo^!58jzkx)ewM_$~Q>NEbSj{g-$fz9@d$uSS zjfTn3i>;)w4O18`HqE6Vd2i_|pxtRci#+lgNGf5S=`Kx@X&~dikSd85c#AvFx(+;m9Wnq^>xS7G=0(C*QbI6JzC#ZilfuAt_v zCFjYEHND0KwT6^L7f;cLMwH6=pQs83s$Opo-{x_x5_b^acGCnoRXT~6$(c*sO%^6^ zo+m7QX3G0Tc(l!NY-9a-$9Lu1Q@?y*Fx_YSjfx&t2^tQCI#b`=!0C45Urs_A-y%iW zfk&@%5dq(fCNdF<$tM9Tf_K`Byeg+M*TuY(rOte&>S1SR+pTp@6X(GvhI$c#bb#Y_ z{(Iv=r__}PCf8YSGdZ65ne9DNCQHr@Je3UG5l()e{<0%8JK{0{daI&ji*-((&3*2{umVoL=C?aqLAL=p4AK>NAQ_kx z0|k)FG-YBECa{`cnU%Jv!6;)vZNDDvwvP_TiD-rR=9%lKM9KnTX)$2ZZ?Bq|d46WR zGK%xa%wz#&xUK)La=cGz{7JAjCOU4Xp!V!Hq{`a*ByKWnYAB&OQ+-jS(e@2>1*_F{ z%GWwlCvjIh^NG?Q&JC^^aw$+b`+}%a6Mo~Qx2M0}9u9db>8!>GYsuSn$!)!{6u(O- zw%Lh;OmSaQC)wZUxJVIa!=UUfh$?Q`@e@_Pt?D0_W{o3F5~|Op*c{=6I9}J#F2`r= zd-y*7?e0ckQr?D^B+=9AG4>Z?EHGvWJT|dc+RA;fhtUqCrYTDm5k}T=ua4}O8JIML zW5<-Hu@+0lF&h2-JY(9F`9)jLyA(v$9zz_?UgHMeH6KBbXRexftB#ii zUG6F`7a(_mgp^uvIlmhwMvn#WX?Xidt&IWeWA%XFkdD3w6M+%0wpxTaFaf z8VCkwWPPfqCUaa8>(jF>HNyk69xR4L!bHBk^(=BJkLvFAGUFdUOIx^a;^CdK7MUob z=8);4PVi1hVY=4>&t+?*vYc6nC)`8;qd6yLJXuVpON)O^WpaTamO`DGxL?n{@$mTI zK%;rd#-ruo#L|a}guOMgQpFK%lP$FrdAkAU)RBY)g97^8g6LYAt)^Ro-7QU@G=*BL z95KDmc9%x>rIy59yah+Gr*iTdcOQPNNB*4m`*uDhr0_C8qI>KyYq~ZvvgEy%gw(dd z?z{V0+*mq7n$Pcx8Cop2IeBYZ?iIYWEh$CGGuMuBM1}=+Na=`|+<~F^^UuAao&dIc zWTU_gPhQEiIZcFfewlFrWUj98);DAAUd(36aeEkz>v)P`G>bZ+J0jSI5hO}((Sy&L zoWb|hNQ+G!7x;Z?b}2Fg^c?!qPs2mw@P6M&zKFGzkE!q-b~$ zPQZt@!G>887AEP- zR-%S*zQjJO{CAqsZc!e@CY~<4OmbDWNv*og!HDw%o(3iQGG`&T>dxp!f2{=02ut_4 z$HFn6&NM$Z8B;j>aREdQ$5-E+on~s0jIJXztyGjzEa_a>_Bcm?c$QkcOcfQmlF6a! zXc%2N(KRMJDQY*EU?CS(EaE^Szdd4~$fcwz_Pw6;Vh zVOnp+6GD~i&|7IOIe9Bc&bOm2aW3iWoKBV0h{^NRW!Kgpj2M`J%#)=|q`%JZVm1+O zasbt%1^hn9eM8m-8vyxzothW1561Y636Lg|&kYbI*I;Ihap7-X)<+7cmq3J?AjxRo z7J$<&lfu}^KK>%*f&b(h7;SqRZ_dJE(@uy@`?+^tfiRNl?n11c()b4HsFJP%Z@+sT zOnWq8h@ky~(kp>J45%G3J*F_+J61QZ%`Uo2%9JQi8}h|!`Tfav#5WPlv?n=Jiy`&p z)FDcYV_pRNp-)^(HoYK4N+0hvO|5GyY<3!dxoESaGiWd-jk{!>on|qT5>qC-9K8-q zx%6#!%48&unSlQ)pO3Dbe`Wic>b{HAMU1Vqh+J`U$&q7*G{_5B#XCG6F6-7RxSLVI z`Ie~BMUYiFO3#XF0ptOUIIAV7;>V7bhnGB0-UI5^PW zPbqUVwlzHJ?I%I{3S*uV9M%mDG52aU^3g2)G07e^Wa|dWrq(gl8bwy75h(ya)7X2d zqT@uAYByGm^f0`dT+{vKwlhI)^(!e9f;U+-JrpTc*LrbeGjUK$7~yh(%AyK1T3v0J z=0L;{DoIu2b66{kark{4!`cG|1!`H8!>E6(;(>>1XDp9Iu^PDsgQWv9Pnj~4NCHbq z-36rB0`~+l3#oTR>uh-Wx(6!gw?*wyLK7Zey+E*yed-SheHi6lz)pd2Q-eH-l6BB4xW+Kj&J(Y%~B65J8b}lQ}Y~4au{NUxw^Tfw4 zd5gj|&oVfNRzB!eU=p|kQ$U8a+ z$9q_gQ&@y>XUcgkHFcS=qF8TJA*M=>!rKy5sxc~vW;{yuIEd!Nl=bR}6fr4McxMpw ztKKEcUaw+4u)bwJ*41e<&)MQQ9JCLJb~5#p10`}fT!7^(lL?2leXae9fQ=0lQ$5B6)GXM}1PWm_i;bD(+7zsr*vbGYj1_Q^F)NDOw?9-V zU(Hj1MYzf^rBGlIQ55x@gB6*gk2Lub=p0k16wOpA*;9D*7ow6=hWftGyfxuwQqjGi!no%WO93k>vgbb z8X^q&PD35zBEw01Kp3{1P+CSCz)^VX#k22-?feo6+Vy_ZgTMi#GgmnsFAg(dd>G^B zQUV*2u(#bmmA0^y*gUw2nMOx@O5a~Fj>4aw=_K2KjC{nA>4?5L`((|cn!eR$!_RG?aD&j@N-NPwdTfY9l@^U3PQ5`O&P{CnUMYGi(6{AP$ zJ0@ZoxE?%tt(7KTnvxvyMRuIXGm2Fq?+hdtOm<4SLr+Ys+Qx~Eb2{JN@r(1jA}(7} zza1uveKnxOuspgGtJ+d~_=S^_nB5_4#Tv*_Nv-0ob^`;iCw7Wl#osdHa8}kn5aho-h^-pF2bS@daLzT zCAKDsutb1Pm0XXBiHTeWrMAig258q`hLJT&w=z>F0{nnXn1c&J1iiggWBSO)f^m_;KIS0?+ol}-aC@Z6XL>q?%|Cyi;OOB<Xc@^91-SV_>Du^g+({%I66B*e6@h$06u?_{Z{iu zT3()}ny&mircCPh=k)%@-a}qds|M}5G^Ot1D=KsTc5~K~*|092d9!UWIRVKarMhJK zB0#@`h;phpid1v)v5Q|sWkW$U8J=v~#QVu#gQA_q?Ur9PJ*=Vd&Hj0^8VPM&cXfQx ziQADRr9M9qzp(n%mr~Vmfsl)nE4s9|*iu~ERIef|x*RWu%qU!N_en;k=+&o6Z>n^H z^7!>0AbyNcY>he~92I0cLK>AiPm)hHAPv?u4*=RH@ zSc+c(m1y+BP2QQG2t`JQfoXrI!lqCdvPBzQJpcqZa-CUH!ZEdqfT6tzE>GDO;-;em;<5OP)~EQn0f}O8}L+EN+LNG27bzCX)D} zgG-nSfI{Db_<7{Yy7A+kJ@wPyP5$m3c~?$OrA~ID#?|EW(b>i-f|QiIWAbXKlHQVC zCdb5W$GkIjymy1(2Q+*vp{C?e<1+CY~Q?VH&w|wO(<31F28f!~9 zBgMKj3)FHMIz1a}PrmM(&M;khs|$XbvJ@PN6&!;}=?|V063t=Es%2465PtfOTnl~J z(bP#2)s=hpk+t(d1!lPw(bevGMQ!K$^Oy1aIUP^v%|kKS#G!s26c_r7&5B5K3!B>t zZ+q}3NP-|ZwrpNU%tPU)V-we=b|*i#S%YJkSP=;hLI5&}n&im^soP3xMhBO7%M0r+ zCh1P`Z=Hp~{uiHX>e}HOst-GBZ{wcTej4AfNlaFi)ecv0cYF`-idDCWEJ6EkfJw37 z7S2LHKnqorWT8 zM$!-0zQ$O;`>M%>c}*cB>z)HT zIMYH3)Dw9Prl8zqB0X?Y1oO^B=(g@{Jesh(Kjv22(h&H8dGmY+1dElI+5LkMR_&N*QXzYH&S6{+LD3z8POf;L^MC#x7{_PwGD>F)TgHd z^oja~dbB+1)Th^EHD!^G-VqM5nhx`+q)zZxu*P%QvK;jpHH5dgG z^AA&;1eC%l=sr3)&`^J@#D9m9|7!ip^hU5hGbPnu`y7wfK9uuGBBg}yPy|2TdJuiv zYFYnjQRP(oZr&%GD=Dceky7!@E?+$fv!i{Mm@6wqy{r1@Xsfh6Z0Lg_zE%zm)~`FI zz_?*9;X%20DXbEH4;FNU+>*HBtaRj?72p4!lS#z6Df!rp&DLB}*3^#qvOo=1c4igq z@cC*p=f%Wi`*ON@fDk7C{O)JL{2@_Bq~I**Qo^cna8z*g{T+=LT(y-67S2WiKv%cFqe6Jo=PH5bfb{ zn>$gsW&kY7ubkAbbdXIjYSXsscfR!-)#sO$+4f9h3^OlQ)ZFt{V@W6;;mMQxRP?AI zQCQ*Dn?~8vqwgYH#nDzC->_Cwy}asL2t|oev$pAZuiR9+L*Yl=!XJFRjW-zs?;$cYtlW+i{M571$pB!0`RiyA!6X-;rG8 zMzLE*$#1DCXM-pK7+hOHOjJVjVrZz%eM3K43b)*7N6pNeGJ|y+%DsNQA^#+~kPlZj zZG$1-Aal(Qs_KsMLr+fNt=kaho_H_z)6hJ%RBVjQN{_>3c>d@j{h<#j1_&&#`;3Mr zl=Po}L()@!6954I{9p%t{~ZwfSy@koz8e#M?SJiy4#-5KKRwW&$=3l4H}SMN{gBp> z4@bUlN`nnCk#{4}OPN~(Rnb?MTa+!Yh>~ndS(PzRjyZ4N;933F_t~Q zg%WH3w`$7=g}6Z8p;UayM5Rk}JI2dRPa~^tqN4`gWdCg2M&q<3@K#P=t7#!gsjJgh zaft}mOj2obK0M&vIy)bwi5KAlZAaW*<@Oy>_d{DSfHpFXt7pMj39oJJJ~uuLy>V_Vw_S zw0055aih`?9KZshdgRjWO6wBKLYtInt49vVu>vyzPn`x@Y`3b9;=1p%3(&~rq_-=B z{PGRxcspxrsBD5u)J4iETU;FUj&MgOn)!?L3Kyt*w)J<%1j9c*0yoVC6P3&s#_RE5 z^`*&Im~}+_DP2P&-JlNL-AH$LNJ@9NG%6h`f&n6D{_i>Ob*}lc=j)E= zxu134>$iUHjUt)+Ac9i!sZ7@SW_~5XZTw_kVEX&64r}Et3LoRA0zMFs+0Yho)`H?l zqvhN1O9X2)KkyC_VIc#PQ`XXLF={5&F`Hj8K|;pG)R3w(&+?VtH2 zD0L%uKbUiQ?tgdvu$zBiwr$--2up5m2I4DzS>WSP7DqH=L5H7)0g!4bF{gc*N(WfZ5TI?R^+8yz5U_RC+45*1TWEakJS*Eh)g zugygSEYV5ika5nDe_YHf?I357eC;!6Laj#ZtQYld980&xB@usdk@!QFgF)?rVNJ4A zRGM#Mxy(z?T(uC}lF$u7_Q&jIlpk-r^+v!v-l3L(BPW>JoUeI6`X)egppBbFKJx0M z_bs1v>x8g;m=`?pY;l`Akcq$IhuH+CI??QEPpn7FL3J1Y?DD%r^Ccl=AWb}?`vvat z^NT+*RNHub90nW{jg?_NLv$@TLIZVe)*!6}k2iA1OG}d~veeqA$r|6ztk~!x+gTW_ zOdSh`ulNauibjR z<_lVU>}?DgpOc9n%g9#_hk>hh(9!mHpMU$K!c34|*3gZRKvrn5k3ZipuyS`o z7*yASq4?1+e10g&_>B?RiEEKO>EGI+Q+$c8GCaleOJZ(;WIN_CVb|$g!6*Zm4li(4 z%C`BvNT}X6?95KA9|;4b4uuG9)W-coENu+ABI{od-AGs63w|ZTBfYvvm~*ULbMm#@ z?J*6@sdUOtF$O7)M95lOLBB6*Po-rJ@MT}tFNcrJypOk5s*lH$GKbDebLHC|9b9SnOpbwCUFK<+hiz`!Fj5QltPJu_vz`%;EFw@y}|=M~ns}mWP+Q z2bzK`iL+e&rP{cjIdgNU)zgadnVi&%pFZ4noT&~>j>z0xy%LG5Rc@ZGOOX~VRvVQc zue)XKu%$C9dN023&rM8jgqQI1pRrtMeXj8^&r7Z$629)5aW~-#Abd#mx3g3cZLoW< zO3w(t_|Hryi=pnd985PcQ6jgX+g_oihaa?TDumNWA9Ig-$=fSWCRm{9VpnQFg~ zgvCR{lgj_`<2I+Tt@R$OJ@vCkYUG7eK-5|hOK@pSs(B8FVecoU!LO*BGIYCz!)QEg zOg^u*=m^Qs>}#`gRcwsT{QXr)F)P}&t4XtWfV~UndSfXC@r>3qQss~f2Q-BLK&HsFeMLs1D90#jBQOD3P$$4>pxH?%*lo4H$; zh}ZZHs67r)*A7)lgrglEIf6x@2)nI#!~5KPrU5QHx&Rkxl;F(;nXWzj%jCRTm2#e^ zsyp1BuO7~g|FS}Ps+M|~`SO6WnOc_&FUJ*s31tvdVlPBMk&xtVDDcwKS_+slF3D9vdv+N5Ql1_N zVJX1I1rV4>hF}D&5n^f9WNQ$wpatUt)7|fkm+H_Dm~z0#f@kcLtF4llZMhFIfB^|z zg)_TbMROaXBMJfMS_azTHq^!+YYhN+^g!O3Ce`!boHRT%^`g6i@1CXPm{my(WAoWU zGFe#cPwkV%8bH;?TiFV!k@=Nfjust(E9v0Zsjmo6Re8c4tdgTYOXLn`e*AolsdX^l z&aiDspAIu3@xNVLd(R=(G$(cOwRkwWM>*FqwYA*AhYU^&hG+>5xPN%C*m`p>b@DGc zdurq%JHEP(OjC`=1+5LkPC&CufBvSaDRGJz9@%4z=PTZn9qNdY`h(>{&aB+TR8mAl zw~7rqfvdFrX658m)z9d+tEg%B@Hzn6IK*TNQ)EWsW<`Kiv@sDV|;vqc=FzbU^?c)plK1Jpr|0Xi@L-WHH2nTYHg>0ASyy zbo**cyS1*k+f_(~ACMv;0#LR}K{boL{n=CvA+?q7Q>_fH-A)tTV7bpCE6$R%lO5`j zw-x8&Pu4CC=f1bS=`LIE?)K(xL8s(Quj=)!n;fTDGluA`#nqIsFETph*h=)n*-sob z9q~>aO(k9F%*6NNOIBa+M9FyBRnJ`s#I5N?=Gf8NEwN}7gG_TgRwpiMu4*halbpM0 zrPoWUNNt5Hkoi`%-%03Jd~H4%r30Y}lAXCB+$ZDba-q%6L~KP+behoQK}y3wbhq-W z>m{7(_$m<&%2WiCs;_w}0(C_>r`GI&Sdm(N6S0>!aV9Gzt)c*Sn0~?@+WiHZt&#;vezd ztfx#aJvWueUk9kplK9xAqM$qO`?R;=m<0ReIMM#(#m}YX3D#7}aEJK|@qy=Cl9{ih ziSfp8B8|S<_CZJ&rf``0!9Z`Wl936fPT6Tx<5$c=gjbaj-K>K&fMiex9tC@XG0oFz z$JrpW$?%nUJT6(DQ=g(SlB9aNd#!he`mOP|i1*DV#)-`qzb@39X;gHC54*;G@_i_H zEI&q`jLI)8exGblGkc?srza$#Tp1S*_a$FIuNE?H`L`5dNXv;7fiO4a) z?>1ihtF@a2H6tsysP+R%8K>F6Xnq48!#(${Z*TyaNdI5r#CB2k*a<~IwN0vxVe4mR zG64JSf?okg61cczez1-Q0hXOH5gmHi6d-^=901--OI8Ya>si*p4VEYu=}}$r0aD!>{c|>G1R6CpTuO*G(%{9RWps= znG}wEh%cF1*OF!-FW*FA%Mgx zHm34!s6huuX=}?&z2ho7t zL(NUMuMaWK%&umD)<;(4w^b_975-c zdlF?&p-4s@Ah!<#us~sReq;^&eT0FC@Jw1GQFjm2c#M#r0`2kr@6gEhf7- z11?<_R+!C=FeKe5*L#YB5P_u%t)kh#S~iUzDag+Hl@KxzvBble!%OSzY3mSnVM$ak z+U&n}wJvAbD-gx0t&!zG{DRck^=@eNMj1S+NjFI7ZM3He)IF*kax^xi`c`x3_hTKH zQpCcsF3Tz8eJh^mUecX@YiR3?j*CiXfaar>o8ZE7_myjzpooBQS` zJJH!+!~>~8bMTI%XrMiM=Xz6^&_`==i!4_AC931|Ji(6nR zV80pYpYG!ocX*VllnwUkN(#UNOHr`}oEUioG&LaDH=&qj@usFq+ zSTDBt+jkBJ8`W;=aHi<7*-Y^(h-%X1VA2t?>Z(DY5$3sbvZ+i_Z2Dpv!M*z)`Q-HH>mA*QWA)LUb%BS^bvdd? zk$f#ar?O@{di1}6Ff@D_Doms>h$zE*Galk0cXK5iWqThafvf2CCnOs)`%nm}G~uEI zXfYIF`Xi~tn8W!O5^lpD-t-H*{TQ;iGw+wOOwr`VOt$h%NCey>G6w;)-RZtYdp3xd z=~#A9SJG{KWYOj&bl9XlzK$hFX&STj$@Er-@lzuq7fc=R&0)zq@ge|lYMoWkOOPLg z^eF4pTOZBTsXwwU9^72re|~tld5F3DJ`kPnL#^c9=I11S3gP0`Q5V>x%aAtJy>!t< zM#%rw53fyfq7x)6CcCPxOBmWX_vQKdiE20ECtI41z>K$2ocsB9PVv}}PS=yF?2bMc z@@eH!@1On+iuE#5R920)YckETHPQZ;V$`&p8K0fJGTyT@2+yZde)Rs(^lOFhX({#! zwM4wNDKgkBP1t!Z|Au)NtHhyijNc4eS!MJTgC`dekb_8$b5TOlFK}_lSMZOyeSSZd z6Uo%w1NyyJ+k|w1x8=x0P`w<*%&E%VR5jD@>}bS`8x$2l9z&nu#X79SyUpK4|88{*^Q~9Vpo9;|)p`fb$Hib?uCMG7)1d1cBUq;uvC?pzM>( z^O)K7ZmopsVse{Tsnw@o0A7;8&9Hf*e)ek3+NTp;m3IO%lX{8C|)0<_C=rRQyGu-BDnir;d82AXC7nEp)rt1oO z`|_vvEUZ@ZzTizX8cpXHO~1q9!${Q3pdd%<_zsVzz!u}{Z(gGbr?;^4s7R;s<^(3T;Ot~|C#=QT?v zOQU0rZM2uJHh0K~@fEFipKBDrt*|b+iIc~;4i=>{H%|#4 zJXB@)3&LaycWR~B6~SD#?VEGeZAyTEhR}chl47F56aKKb67XjA3rGq)Jph(s z1T3YgUwbTB?Apa=Uzpy_qX883w)DX6X8t{;SO`CPwnf+Zd%RK0_m+3)z`#qd%y$z; zdkTFbmTL^orrom628k`!g21jcvl}};a)pUNys(EKTCW93x7DIHr z(+JVgncd27h%1SoucqwyEkrBFjHSYToUv**89lmn<0@nbJ^U6WmGRUy1V(~VBV4up zMYmkF)dZe=T=YJDp{k;(>y&L(w8M2ZdIcFKn%jNqpPiDTob@t}-4ijfx*#uTX4)h1 z4vAsFSQ;sZ%w1yM<>#rG=!phy`m<(X zkKdj*F9a0Wh(pU4VKCzq330XDe5?_W%i-LX7$Z%L<_uWDru;8cCLC7!?SC;=bn z{HJ#GZ}rV6o`B;?D|W8BTx5k8HmyTCRn%(~AjvLI=WxUoO!lTrJIsyFsAsxQw< z&He4MLc8JGQlYS3qLi@1Pd;_=-7&gMDS+8I!~W8PSJER3br@S^oUkm@sPd6`L$SCQ z%Xwc9;-~HL&0frv7f!xYD4FcQ;0X$h@O(z#SHG2;F5b99P?$y5tI6X0J=;&)@w4NI z6Dyt*|8v6@@*=1WZ0zdDK9QZGJX#Ld71vUkyO{u)nu(PBm#}J`0787bCfc8lE0Z#^ zzSyYnAi&Iap;C&E5;mpgJn30eK0KY~l@SG8 z28}?Z33aWkV{LEtd?lgYOyk1BMsr>`!3%j>Zzupq*r4v0#NG58skS5OElLH>$bcww{MSM z>K28@RrWKf&|qvN$r!Sx)5lU}V$m~|eZpU7FbT`A~7JVJUlTew@4!Z1+<27Ar|3 zQpIxq^j5`(>+ZfAvbK1%VGsQL?{7X8)5n5xAp+WN?})Xd`jQXMa&;oG27Y58BnZ%? z?glB8l2nbtv6W<+WUB@i^)s4dGsBx+HB#^M!2tNQ*uU(EyZf5H3zAyiR} zZy-c-K#&BbbwoafcQ7tVs$A6@@Hb{#r`h2jLEw>^Nz!$yhtf zhQ~oK9mJ_}+mvf}YfuAIsi$xJ;?lGFZ+;sI`;ZBUlp3jqMgPi_bD`~cIjSDt=`qsP zzoqsPYqfaRrMa;xk%D9i`g(RN(=43UG5DU%tDep{-|p4yJinH*-=In;%(FO?%t69I z41N=~J_qfdxiXf+*S<7q2F=zahLs3x*79hm&jI%9NjqkDs<%pJi>ds)%UqZgFJL6i z>pS#*k$Fc1eDbT%RU4Lu-Vy^Up5xc8&Z!ej1k~YX&`_b>?IC5+)|M7|KI1KoETML+ z%qsI(5?cs%SugnL(ohnw%Z`~;Be_D3g}!VmWZXk;L&nAn%1O~9CVUY1-T63m$B$-( zw(y6I4t2>{xrsu@QW}AiT0(YLxV=?xTV-0f!8})~wNgCxpPznFaQK%Y% z$R@j!M3e=L@!{34s4@pKB$&f={ezpN2qowDc=^52?! zkSMRmtIsl_%s6-znVPd-)E1L`MC6|s;c<@T5-nu2)`8PPYOSsiIv=f9aZlw&Tq>8T zh61_x(Wn<=qc$p7uZpLXDoB(^gcdb}ir#6j!E@NgSox(!Rmw@?1!B$7FN!7S2J|5V z(^Azz7u$7lm26!MD*GoF2yiE-LEi6C#?Dj5?P^l2NrY-R**MW}MZ%Gn4jt7m1_6_d2%SvC+&J|hseRIjagwDUcbFJe@ITtj@e%O_edNYa4H_uV)uWr z*3iCO39vw0%lG6<>?PA$M&Evw>{(6@&=_G#jf7%aQCopvWFgJrdM#5`EZ8Cgo^`n0 z7lWoHEJi1xN$crNxTUKUQe=u`O~)L~UxuGsW6`yaZJLf{YM=iP5uo)hh<{%JEhWJJcC5y<$C|XYeJwi{B{Ra&T1VZ_9sGHaZt7Kh$BcB4cuGzAegip|4PE79Z)~Q1eZCx=uxc ziq1Wx$={ApfzB60YJ^hK-x04IrZz?oflPEN*V z)usGX(|SyD7#c|=<>CQmlN3cpmad-*8bRyp$b}!Pk3R&r&=^vsM6ftOu)$`J3|aZK zj}VfL>Fm3MAtL^q?*uTJJVmYC;AR-3f-qd2q1a0f2K)r z@KgmA!1Rzm73G;Zi@OZAZL2@*$g-U=irH+(hBnX52=OuYFXnY#g&WX5Qc5qrl0J^% zZP<`+JfFStd+{v2gw5SOMjvC)H+(xk!)9b>oj$f}!Xxc>&5WekQHZ}?ZP1C2qU4Ie zyh(WqR`yv3NzR3b5N=JKR+xQtVlQ2$6;5~g6<+qSAN-q7H90)oQ`bz>aa=FSMYOj^ zI47kkSf?6&zjN;$E!u`*=%BYbw?D9i557Hn@_|KCzd6A1*OM0-CBw9GVg3G=@6Yz* zB5&B37?q&Se;0^HBu<+*0xRqx&u5+4)cF2+MH;z1J3#b)pc-42@@E15GQ)TF3k*L) z=GITGR{t@CBfD+m2Mmn?sDjGCfTD!#7@fSGe!e#mVL!Xplo-GhAO4COK%x^vvYZfUs^p80YAs-Kc( z@m8<@UB-4MUnLX~_1pFIvY1}K8^y|5_W##JBtRlpBHwb^$67jZ*QfsTWHT-4hxbSd z*mZjUSIj?r!>lSk<3_tm3iS-_F+!dRk*G1KK#QVUUQ0R|7+*6f-WD@5lWqC7NB8p{ z^N&vK#E!bTs|X7Zw;OTwfCsb~x&d6mQEIH@0W=BZby1$v1K03u%f0cI$tOn(qH!!0 zHmgg|eLHLzh>Om{mTTpnr$xK@7-d8fs>Cb0>}~bNe)h$nOHdLH-x-~OOWdHTYlSS( z&R!RC=+k1-51lh*22V5LZAAe8#Mqu?MUmg%2RzMl1r4uuk>|gc_&f}S6vcrd8yc6t zMZkbLE^6mz`tS-sPNU%}Z1-BWO9>8?pN&!|-KM8=gHdzkl0i=r1~x3`Jv;kYRt70) z#o7Bx3RHxgh~@P9$XL9vu~LqBir z0#o93vAf*LIDQL~ldydg5%`&-GltNv*oF%cw|LFxc;TD9>ud2kU;?>tRpg)sKNR0OckKcK*yHO=(UK2mO{lF!`w zqAqxYLq_xLjuxBXw;L1v{xz~=mX>^ih2A_1ByuGD_WQqt2qYSE;AQV~DAGgv#Sr`m z_7)!?1LE+dzyrUD;mGwiK1*Cf5NumtS||SUSDeB#fCPeiLOU9gBoOrX?b|k#vcz!o zX)_CrT7x*17%56kIkNUpm|SiTaOu)dt2GGKyFushx2pdYgZ<13&XiWXbFCzvbX^xzY|+dS{>E=zbW)!c!jy@ZY>ZLsk-mH@)k90tIrO8N?yGORxS8+uqtcmnM+z14oA~pl#pX z6c&NP>j$1mS&#(aPDMuKxI*5iR^Kn`X||^#?$Ytx@^h~U7kINUD|lJ>fV-%vT^ z_QJQ;ClK#IZ#-|NR|SijufKwkHq=Ut9enWh!GN53(0?n>{1 zYBv=PhSG-;8=!*oTz-QozM#C*;VBZR6p|Nhwt&NGoZdn|7)r4Z&}~VMiTW}Sk-fC( zI({i@lMMd(mlW8?e&@cAZf5_`U5KIg2`pyP(Og>&xkTkQmJk8-#oS@HA}mU3M9JB; zjbDz&Yj}0^1YE_cMN0{wUe@X52u*bU()Q2K!31z@W%Y;!sYqdDBze>P)*OHH;F#4H zCsCKWy@}WzDwg|*W;n>JV$xCbbVpOx`vdXUJPi9Ki&|(IRZ1mEEA5p(% zy|{a@Jsq4D3yQ72vE>VJkw4R5CQ&u>6I&I)h+A-3;h)5wmM0tH70phCN@Nv^s}ts`W53Pyzo1_HlcE?3hw03_aP<2xt?VLGgfHY>5{QiObxu=!W5KUtKi z%B0onqpo2U7%cGo$*nO|Udvz?9a+Q;WM5boQviLWYV3QdHSZDZI5V)pev~}_HfzaUtAk@<_ev*&W`FPId_cVwN z+6wiQd<_LemQ^;!vTx5p%rv59(LG1zQl}GSpbw`FUU)yGQvnACAbez{?aD<>9TROM zx7lND|3^X)T`;}-{Y`@u!H}kR3XT>V@LU8U?-;s022Ns&y}F;Xu@=pR@J!nbej>6*=Vx8YFTD`A&s}Da z&uEMjyuLFX$F;dwH!>kT>9L3sm!#|O!K)V4(XfgZX#6qH$BdrH{zeai1OO#9v~TO* zV=8LU{Ugv}7$=UFmz19ryoApwH&ecL@azW1GQa5 zd;j|>=0qF}!F-9cmiJ;9{6(Y#Z(ioP+lPHO2JkK_1gkekKYUsOZk0Tv4$cII z$sq%du;{-aE-^rg_m~t(H%Jb2TJn+iKUPxf!W8an@f5O)C!Ihva8&IeSy}G+Qo3mk zKijQmT!O462Wg~dQi&QK(u~-bgQTX9=h@&NETbK~Y@t^2w_?9;UhgDS0VC`9K}wRU z8!yv(JJZd#L@*@wA7@cD2Y-R5$Bv0KCS0r~qhUJdEIKw_ICSI$;2}}Xh|(tuYK5=q zn~Y~3Z2zfA!!!DIMp8}AzCxm6IGQ;aNXZkW$(Z8c_UA5YOWysZRAm8W)`vGlsR>U(!@CS`??na8$M8@KLDh3 zYG!e$eOko>i#)cy?PQz6SuH7k0{?6Z^!nMHxEx$}$f}X02zwvUTwhZXNN~BmViDWl zl0y5~RKLUK`wf7yS$tcwn`74&`8Qs^&-D`XQ1O-<`#Eyri7mi0@U(IXz&ILjB!>WD zpn%rV@05Q~2Z0)1OStK}FAih~4SA=yPe}j+4m4$tBJIG<5I^lOh@)u@L2hng~FhEKKeiUJUTo&Jz6|E7i>u;wJXO7F*#o&eX@df zezM>!H?dY6)OQ#oG6@*Ma+o`NZJrtZBGy{Msp8_M>~RY}M{znITn)L)Bg8A4SOUqF zg?Z=&B}_P*9h%%OWwbTFCDT%of-Km&q^f@04nDC_zHef(QHvqsn8y7U_VqQ z7@-e=WcmAaRod64GDY<#806YTgHlHhTa3WF6)D2<2Iu-zTQ*D*#m<54>w@a@JzN7F z>`O)$Lhi*vGSs+|+SCkEA;Z}+u_`K?MtYUbN6C8CZ)!@iHzc$%@wDYY%*5aAw2i&7 zo59iE@`J}kg}vU(BLCJ@9KvzLKum^4$yA%*X__#<4a1O|mA!wDIh&9_5x@EcUtwaZ z$bdZ2F$jMpf#(H)90B*hqS~s{(55w1o9jm%IP~m641l%G6bQg@wRi_`2OJ4!_GE=3 zh^L=20Kjveth7)Z#%R&--U1NV0&Lb_eNY3zYe_9kVEaAv@we2&M`S1~97!$pG#qvI zt^uQX{7(-H9Y=m0Qw*SYMPJ^(4%2o@dU!;Gg*g0o-d$s^W_R%7&wQqsH zMgy26MHPqa1jdIP*u9GU!-xs`wP8LJTnd19oHTUJ{pUPmdDfWaEhJK5AU097wu5Db+NBUGG z$jq5;>fQ1p38VM0X6hsd+yjVX{uD=cS%qIJ{5&U7F8tn*EwZ}7j`4US|BHAbpG;+8 znhD~kl)TiRFV}ZNn5Xqz&PUpj@B@KWILq z7ZBs3N|YwPAUkF|aT{;k*(miN%2|XesQ?TIB&9Yb9cH^pY4SQ5f#?z*$8(Cm$l*`; zUB-;OAx4N`Ao#rb-?f@rq2M4H`sWR`7+GLNxw=;=VKjEWKc6)J6*KKTzx?+rd}X1)PMIkiHtEF|b^Q%I11}FEXQ(%J z65CARQeOqeJf0N{y(IMa^@@4B-=0dqYCxC?nj_TIMaBPpe-^MEO)b_JV-;As&bJKis;(d?kIE}K|mpv}( zTBG{5W+__>TxKt$Wn(s5LG5+7jAWec1Ew)K4}zab@kN-wSd^q)N#&i|d`**q80E?T zq%k--)qBCmqOQARH-YuuckH1p=yIaloLAZXNd~14&C!(W=3(x(w`uVU=OcdRs965K z%&_cy5jX8phc68hh5>n>dhD+wY5$V#xn%fa=lNc%3@IENr&nsp+D|IsNzHL!gZx=W zA}5FNz20qq-^R_b+y-Ranx{{ah7ZLcOLHX^%I2|$W`zPhZY3hdtEv8HulDaE{H}P$ zq`E0bvVS;cPw&9K{e}%MG7iLcZHI3qMC=SnwtyzQk5XluYtrbh4vg}fv{$a#C7SwH zusLi103Ia_VT;4oKji$p=#iQ5kA@O1qcjpNmqq~v(fy?W=0XerYM|_y@1!y5aIndk zAUzW;3M3$z)tW2`-EbPL`}J~eNKa)$R_H%>p$1y&+C3i?4kGJ%BTxdvAI^Xy62Ayk}^A!D$CGq z2%9vs$qco-PPLnlIU27je|mm^PcP;<%o=j~+N*La>SuDv+!qtC!q3}ynG(CL2#G2v zuW#nuqzhvgtS1-6heR>*kqAHl1+y%}rw=-XbQe&BuQCYA zX@?0upEX8*rfRsBaj(lL;x)1cB#1SRVU}EMFYA%M7SJ9<(;F6=7dG@aW=Efp1^HGO}sQh2W~%|{6ycbTfCPmpQ$i1(dnU}CSd8siYJhr zh4@=xcupB&lupZ9Hd>mql0r%eJ*L4~7G)90PP%?yQfrpZ(Go4G zPiNAIwmHUA?gsiZxL2J;j`;p9 z8pZ$QYGMBNqqz+8f6gFg1<_VMpNNAH%g|szPssjK(01lu;_>984*ISnhQ}_8n zjqfQjeYuk_kA6J}*geZXc22Rgb^;oAFMHS3h-c9MbFyW6yAtn5{d&`}#^k)UB-k?p z0P-Aw$mhb6ZfVBLS_9UvczzCVZKtwZc%Rt~o~dNiFjJn6Rl}lmM89Gfp6AB7KD6wT zCfOT)QxU*H@{(Ac%!94))?0Hv ze(kY!WpakHkS=%|81<{c{(qJY_J83R-)n_oA@OYQN(FHEGP>^bXLp|mJ5Dx!v8TS?)WJx_va z0fbVZ!N%0RB^%H6ef4ju!$Hq+%(F~Ruz;D+&hs1+DAj;40HDvg4BXTg*2`0UQ+T~n zo|9t@Agkm6_sw~_m!F)bZ%5v|3wInhaV|Mfqgd;pTUe=6XN1C3G1FrtFv@Vt9o4Bs zWiU&)R?V=r$?CWJ5FDRE%N7{C&utVQzAdZ~#Z4Eek}t!9zM^CHeD0q>M#m*%tMe`A z%&0+W77eSp!_ru+QznBht%5^m7vPlJwpdznqxDz<8d&tF0wOT$z$^(8vL|CnzNA>4 z7%VcWV_k7|{n|%Ptem2gTB?hJ%hUaz3ut)Dh>Tqg(`ml{^r%GW*hK?k7!uy7wIXFY zuwI5H%-cVZ>n^=2(xABwm90chjfP(j=Ej_1qJofMH*J%R;ZtBEhP{J^nw?31;YB`!tLH6;THYmo4L;+@a7^D_9O zsBT&ViS6@wUJz*a&a6T}4~>wsd0+K~Sj9jY6{>wNl5{!THpjBt_T0K=nrBu`0FY`+ z1r^oQ>OAb?rwPs$->I-V^q5qeCVG&?W*kIl*kztywR*H||H;3`K^$1Gczn_hxCujqeqyr075+J-U zdX%7e;l`gHgpGPQs^hrvCc8e%<2^!-!PSyaTZeEtQ^JoaWbEe|F4DYbTSk@^; zt%|-O7%Yv3oxp9g{8^Xo-#7;v%mEa8|2Ec))jko^hMJHe?%yDhTc=mTEZ&p%cFP1x z=zuk4DF~oD->DS1fq-yk0(s91)R;D4N7R7j$iQ=xr_Z0XGvVm2+uGTo0~2;ifJ@W` zDvjRkID5g;=LRdm^L_q^SyNRZ$B0Br!(xay3Ul^(K&#fN)XFWlbJxy+%xBzIqFr^8 zS&j)ux#x9zwV8D zphEy6VIp1p4qECIFc#GvNAuXwzcz*j-{TFnh$Mt$Hz8y`s;7xe8Ue969NL%+$NyPKL9)a3jZw*b zrKCm^FP}9z|ME8se7LVSy3u=nd%tyOCU&|#r;(a@_I1~>&+F48w6zmbaNjqlSj7*s zN;~gMQd|&(r(yfo)|(*Gky88unld6O5y|Xc-g8x*cV(qk)=OBkBxyiV1ujFmyi5tL zxAEvAS&+cuJpY_fO6CLU7@YFA~q#jhC?g$iW5000eWN>Pb(+9frFPvW~GdTrm{VtNx<1=-*8~OX5>9!2OZI_(MYC zwZ3iBE-7y?AV>xRbY6KpbEN_hDlO9pF!;+d$;2wCJkBLNfCk|HKQgH0|Cb_ALCV0H z?h%CI(H$i|{3k!SKYBg7pmJmVQU5$19scLl*8|BzN8WUPCX|caQ07JziQkwQ^9YKH z7`N2k8>qJ=IyG_TWP^a32>`Y^xbq#6pf1xm=P83Nz=ELTO2%1QsHy>IO;kx8dg>9WBgym!@Ql3BNlK$5{V&gSu4c@_PPwFyM-fmGH}b&3 zv6-+XP`x)Y(i%a#9%?d2`f3VZMoLeYty=QljsQVUVykP-66wmTps$cZ_0hp>V6wc= z`P>>e|3scAd1^``tYUC2W6LiH!g|1qQE{h6@1r^opW_rBl0+WbReY<#D4Ea0 zPV;I)hX+Tj@>DQ~f(8{mh*!sl_Wq7b)?7&*8bcUPh{=dk?VF$a<@NPRFeBc}CImdB z%=z!7QhW(A%Rp`J@zqlvg+U$CG3B5C6^VUZ_9KUGJs&jS|Oj!lkb zwBzf>E((%nzv*krx+EEwK(KaTZ3>(6m$EmvLS2l{1w5i9GD~lgTk(|q0?gyCR=7wE zQpmb?RaxJ^SrIK8N}w9#VGeYCP3l#heAc??8@#Ky7)5 zhG5jj#Egifo5Z7M<4=y-rtYA_sHBMGfTjQov$k&}EdON#+6?zHWisEPc!rkmH~XOT zRuB6BQLWNmxa4Ut+CThJ+}FxhXqY}VH3SEe2uOf;rE0aFBOb!jMqQ%BjJ>$LH7kt~ z=hTgbMu|-sck|~}wXM`2zm4;y_QqEZ9XS~MK!=hrSH`i1>pgl#C;lM(Lw2D{Jvuif zljkmqaqDUKR+Uimi5{zVL)%LC@ffi+F)xYtta7_ojO|rIQqjAY9N0QNsAr!eE)>!x zwGDiOvU-Bd)9ID`W74@Jf0f2A&oo}1$V*7X5+S{kv~ z-VHAv{aB%39%Ni8@A7l}YT`;JIv=b}Z*jbdn~+Wzk0)8?6P%bL|7!IvsX5=ZI;}cOB70~w?2>*a#+{I_{b6} zX1KDf$gDD2*8cb$dM-8Ws_&zw8aAdx%$ovXj9d0PvyXyP>^;e^K4Ldjbs2Z+k}2XL zh@Ip$n0RG&^&%B58&>!qM>cx|>xp?YccJM6!uLx$U~0xl$Np+Jj;eullZQEUSB&R+ zroXDBj7I-Fp4J-M{iv`jqWASuW1^4|kY5m9R#{hXv(GZLHtsQu<;rLDmo2us6j5F=rxb@K$LnIDDeJa& zwq-bj|2$Tpcso(3LxW?W>dfa;dBxjMs()s|VZwuCBB&uDhM6H+z)T9n7SD0XT^c?J z_wv%sO-XpB&)``B0ya2lIM|lwy;H$a;6ed-`_5?7P)Y&8KYtWsihCMW!6&#SR6qKJ zP1Re97{jB{&LjW=4}_ws4dLlqTh3j!L;MM{ZV!eP;f);6h}cXujAVb{9??nsit(Za zNz=BDZMwNu6f`YOYzRFv{QFcfYBrc_;Hob`v$!wSe41mo_ic2!1D{e3VjDkxD?;>> zwL|9q=SN{v$G3)0HMPtYH9tvxBe~3|BC@fm-rO#dE!|DH2C1a2_fEfHqTcXH@-loP zE$%66*N}L#d0(4eGxY1)W@TCv+g@~Qd4f(`%!HoR2ixv~SR!;F1eCt3L{MYvG-yi* zamckYPK7@Gz1A+Rh6~13|lG;WbaPbV`M?y65B_)dP4LUo zjI;h1jQ{^(-e zxyQEB(^!UOvOV32ozfN26d`4BM4%a@qWRNu$RXI3{`GfwWRCZUtI&bcldIl*0W*fG zz*l-p>UAx2MKr^{@j+>mlHWRT@wlQP<)fB12(__FKA)l<{nXOPN1`k;2ILRFB+Y#` zA0_{`!^!r-I*8wMOLN+a0WCrxXnWn9FZ1XMWE`}m623|9YBcXxG|tI{Ix7-2D4{HH zjpnPv{Su-$FTqBded2u7cvOk^l?<)Z1;ms3a5P0(kudHpWJRb}6-o`txpXOqYY|E2V0v#gG(LHy_L)u z)n}2=`LXFCqRkBL^P)YOvU`t1W?9_tN9DTHH8L`PAk7k#vqhZJwJte5Y&Bn8uM+m& zrCn8$gh`#|OIG|U-JP*~VD`?uh10t%_vv!Ya^d&`l7kDXyRSq1fkzZ|_xqjG2R1cG z0-sOW6_>O=zi~!?B?h$zO84rx+|6eQJr;$|uCiX-M6h|_feMhSg<9(0I9y^lqQ?W6 z*+ZwKexNK{NN6k@|GZB^H*(B7+Z{Euxrp#&MO$mKu|X_ANOWCdkswdj zml(nGVpRh)+8GK&sey@}yg>NBF^u+YNwA@OBHSka6*W|opXAO;@HkVDe%R6JgLm38 zdAh*CIcH%D8yHLUFe>|;XV?ks#yyA}>{{BHt^8F>Ey|nro#CZ}6r1K^&kJS$*CENX zp?-wsnH6H{M_0`4_JlOTG$QM*U`a04LvarS#x*9sX zVNj9BUXSebZD@kbIY*)`=KRF@%pC9(VGMd>3LUiJ1y>qU4me}_6hvY|$RDt*S0ohV zUZQXEr-#UXnCrbR-GOU}#|tUPqAm)S$CIj^$5adWnNLYH^A!vyb#?eeAWctmTJ45S zQ69YB9C;i+s2E13i}L?EKvD!K1no00J0t#1TW^7yoCj*{y0l)FOaSzc{q_AmV_oNo zRLf)GWL0nDNz6GfTMn$!-!?NN%e+J57%wh21z9}f7D{zps{KA!jDff(Y~|kH@caZ&H;rTy}p#`DK{M^MuH+DLY!AP zwo=W@_-L|R4o<6H;kSj=Z_w5|GcWV#4~ny6 zO_0F%J6gV)tEpu=SOT9ms0sUNLQ`-&HyW?t`aheJ_%qgk@HegB!^8ZUE0OxVS#hpwg>%EW zlGUb@h8`Z+U2FhBaLtQ;HwR17BHw?eI@l*Dsm%~Y-jYmJSitXXVeV%NP< zdgCpzdX9fDb&V;PtrF*lYHc$ba2Q8G{o4e#2{8eVmesmf@wUIG{P^(F^v=OltkL}R z-wjm=f1I|l{nt6QXP{@&JzmZ}V>bn#=QF?wZJ_yZQnN0Oe&A|H0OP;cHITbJ7-+R7 zoiBB=u5$nEm(KJ)JmHPtU2$e5k+>?h{L$90h~*cbMeXhcOeAZ*?OmuTX=ttuU&I#s z+Gj`9Fa;O3T&1d+@0K_awNL4gC!r*S9e3_cMa7wHWv%6wSOrv>zJ4>HP*%}p;yXkN zIz^N0}|U80JdO{~|V(?EnkUYhD#J7t$a={C1$ z9?4MeHE;{Bh%~TF;vXxdYJB(g4N8&t9H^#PsFoGYvXLM2ut3NoF#09`Za`4ZnFO0O zo=F)Nl3Slob<<#ibJTyQ`KF?BT36WAhpTKw!-cSh`m4W-IP7kIJlmPFInb5{tKamp zK*Xcz75QZzQ;{l7_6&oK>~xxWuZGjp?M>kG*ZQbDrG~ei$HnFAryv}WiA|Q^6t2-xMS73LE1d6)i3qx(S5)%lWZ zYJZ$f#(IlvqkQ3oO9w~t949;_<%Mv1{uiO;A6yJlHm69_tb`gn60(-84(gE0xR;+j zlr3ELSaqBOG@mZjN7KIAJ3O;w2z=J9^5#{a*?wJN|Kiin0`|)-BXb({k2BLdC(_G; z##Pl62+}%fvB_9m00$sE7Xk>dQ!g-bPi)#VKUd22e*gMg77I26UyS9E?{&e~l#0q= z;gtC9;L3XL0HARtV!CoJR(Lv-C`uL)Z}$f%cq|G#P^>3=~KJPe33!TOM&3KOm3 zf#Gtv{q@9fIs7o=OU%3XUjq!nl^fh-(hu2sRezkVgP)806ASYja}CtH;y$qtFN<57 z>>M!1^VlQ+1uo#5?hAP0CcypdnfiB8g>u(v8qcK3)vrD?fXLdzu#^@D%?jC7;?hAg zH`)xG!X=dtGYMO7Md+~`IpF2=TNeCXu0;H7?DX5jW=u~*txw0UeA(;}8ue~tC1zz> z0SW0|K9{jIoPi+1jK#cF?1*uW2A4=C%bFoAXJVqJNM*b~=EdLu`!xO9i?V3;+lcv= zzrW{bgol^5yBCm;j3Y=}Z^OJl6bXdZF|#2Eu^`2m9DAkQJ~NZ^H{CXC;VzT%`bZ)8 za#jAaf#9HB@Cf+x^0gHe%pQvYNa7mIU`N#B5zZ04 zgVf}xZnPm0M$A^Ge!&GvqVRaX`2}XV3;)-3X!d##-nag%p)CX2vn;4NnS#0d$%t_g zLo`Jga)w5&(u#5Ij-d$GO+ZN7UYcT0F`;Z13?_NZ_c<4DoH^{J^&UHz;ep*sRl-tz z6-X~e@q$T5)H-%yod^9u@jEe|4A%8dhFR?z~K0Vyym27@8tcdRwCV!|;%$_f| zOik%L=Z8*Ah3t7lQnlKgjGDAlKg{SFtyqnjI~DxwxJP2uLl{~eK>fR0In$pmYur54 zS~;9YEP43B1+pR!1=Dnz?Nj{?K7yGCWI)Gsy3Mc2B94Quj~370_Jxlu<0ixtoftzrO zDIKpkd^w8{RU!Laf@hAy9IT;9*pc?FD!ffCEv2QV?6WS;p0>x#48_YkbcTqn8f<5O zopb}pkGDZh8*au`vYv}M!oEjRO<8o@*;8D@2Gh>O&&v1%?TEV4D`w6W)*TD35*Cia zJ~=KCtH0VgjE<5>LF}to_HJ;aYu`LV9Obn%+l~ye;M%2|z5kR)oyrn^{7LhnzsTUR zalmQa4naQpEtdoADc#EOxl8!?@^^sD`Af65ZawPr&`YvB38hUpyGI*w7z10HvZ8j5 z?A~H(At^hC>)9n49@aM;)da08U?kzhl}NF-v>V6Am-;sH7^O%Q$8{dNsN77`|>c5eq9C1qvish56Y zv=>6Lg8=FSMBG|bL``&kQ>wbCvbMNaDxOQ?a;0Y2=eJw9i{UC;+^R?QGE)(cj-TXW zlyi+nOpuA@Q@+Ixd+_u7XD^tp3TVO*FSHW9F^RJ!6_Lm)QkM{~nj6Qp6+anCtatfJ z<#<(huLmt`$4bfmE;8#F0Y&HyB^%P#H~iYovFGc|fH1G#@T2W%>iar1ZN{;izRz*y zda47z&C5s))#3D$Q&AS`GCchVASRCPo%FYkx|h}_*3?xfCVf4HxNDKU7h-Y&Jfh3& z*DNg!P7CzsM@zN60?yj{YwJ`9ew}n8UGO+6HfW+EFq*f0Tyms|gy}c`wG&NHN-j~4 zZK-V%X_{6GFN8X-fhY{_1k(FW!3+u5aRK5&x5>JGRPHJfQK=Wb{J1+VGVuQGDqg0Q zJQj?jQVuDA;T&0>Z{Ns#2N!}odfUCDD;$_XJ7*ORD-I-(Hc=ZsmY+4nws2QnO(6?b zVPQ-oV%m>6lg3pS*(hqTXs4*MHhB|*d((8R7;g*x%qY?3+_x=cy&zh4;u0(>Omjs{ zs@N&;AYX^2lOc^UCvEjOXK1E``M2fT^Jg8+!8ror)02y?b!8H48+n@EWtxBK+l%=# z`|goW7ItYVF4e(u@vg&~7Z3LRD&z9zN$7p2E+JtEHXAmq<2XX{P*l%%tk`oYHkn5z zETT!aj)RQmLi~caTvAdh=m~Tf=}yte$8<8|7b)@_yl;H!vuy#* zEJB?0ys3|(?Bb|K0%gIua7yUo!U6p8>5K;g(3hDtp+%bp?*s#f&-veb^2tPXkV_rg z)sE)%GJ(*Ra|_r2GyPS|kd^{xMuEPe?T-LBSZDnXA8{&n(RE`}6G+oq*&S}BWg z`t5^EG#Ubo(LTElZ*6oGr0_gz(drhy!8t|dt%U>`xaE>&XIj0Ne0rQe4J&seS9Q%y zF~y#5SL_|}Ed0IiZ$Cve^@=^`z=q1M_A{O1+@ZBWiHmi%w9$?L{miEf#V|+O~)$_bE=|vX0!j$7l10>1mEiysYa)@&zO^vSbJQSJtXAfdk8j zD{QcMV?yf22qWD{9>zM0*e_NE%W{UEy&5YPBN2lKl0@@yWT6B3)=g##JRGrmSmmkK zWygP4ZOc+Q3nK=Oy($6VZ$ZLWVdCDb0>{L*dr zS*S@DQarMX$~AGKwsObSlp_%%8eGK1O*L6N)y7}+x9=98h_!q`a-B#U4R+Ih@)1qV zhy`ykvS~Z>uV;)`LAW$EsA`ApE8z+05zc{V?-poFPtsrWr|^C`p52&T3W7auK!*sB^X1lJc&CrO~4MMo*_=MLXl8`Mq)vZD!xP`v^4mDosAdEqkPdj zZ2tCsD+(6t!T&+7SX;0?knVw-nY#oVkblj2VcyT^#DtaXh+j&E4gu5vQW5M$$F;*z z4ArURInYqV{}4@z%a~!Dm`Qo@P^KK-)-rHI6kw8ip?P9n?BW+S<3rt=6vcTfgr|tC z6ByMZUOJ7@R08;;G}gBsX>NVz@hHc~QWsa8bfrsuM8x)*xb8CFDyVXtYmlYz-q{1( z?%9kV%<3i8B18Sg&Y+ZQO1e?tZbcd{-)-Yt7ffDQR9EuNWUb8Ky(v+BSUO(gxNFz2 zm8kkww3sui@UACk{Z{NPnPz2qEZGAxSuoO8a=Zi62U2NE#kkvk;T8W%o!IFjud4X* zMhLoJBm1+8cR8R?VQcA!0?*MNvz%c{`mDCRnMjjr60fTQ{2Q8uL|4UdzMDxYr7;(G z-GCrEr@h~uD2fK-3mEqd-;AT$5Ka||K#R5wi~z7FpG|Ga7Kg;@*0Mr4IYB}-a#Zuq zlfrm{pq56xI%)WDvyx;R zRuS!AIdZY7qA^eR1TCz$8D7{{*XA7}Zf*R`cvjDhba26VsN+vnx@>czakO*xi8AF| z-^KYye9vw*9|>0Lvj#rxEd2Otf*Z?Xp`|Y;)N-k-;5taE3!_QBtSZ^x_cgBS^Kxy?|i$gpI$ zx5XQ{nY~GNSPiP6P7M3LM~!ENd^ zzr$gzJ6wO}*0y)7;NVH`Ru+?gcln6$cYOqAx7@sgr5AvDn(LU(rxEgymbGnZq4!FL z!}t^KTTD5GAe|lh}CvkNS4*0mb!k5QFk=mk1n-ZO;b4@-$yt*=8GH*@>P3VVNf^l zPtKmo}2WXAe<#X`+a zwxaF?eEw{qQg#Fu6utMSC30=scTH!KbJ8V%u&xKtiJ0z*TC&(ytgl<>Xx5)PVN^zY zjZN`+90_0gJsi<^=-NA`x*kZ}5tRm&AC~*TIQv*CIre~U)C8YNQmvvaG6~`752^wp z4z`?d<2t?e56_SBuPGWeCL~Hjbqo};hp@t8tsSV+o3FxgRL-;?*kFm+?w%avU#X0g zg-)tyg%I#JDSy(&xPAT_&wkI6Or5tc78L(I&h= zKg&m-o+7hK^lx|LQdRxq!;h8q1y;ne|Lmwo+@qkpy#2h-HxrTJf|R6~?Gs`BuFw5v z6>GeMoc7dI3Ix!O0<1(+a9t!$G(@iQt`u-#)db8%gaqI{`w+E2o@Pb2HW#*NQx{rs zsR_DqCq|FGX~ahH6J5i8d*`61GqEb}EFT27%L_jgP4YyyC-+6sHItNKrsqT2J-ar$ zI)t_0B-c_3XT#ZHWFRAdIYH{wg}Atp#s@gI>CA{3ArWjH7dni(IJjCK|7iFuKPJV* zSd}fnRjKQXO-XU;%o$9PY+7K6iLFpyjV8#_^KHjx;hUcXW{@Dt8)cpkk^X3dG74Qq zg=!}d^Vz2tv2vD6ms$njCe6qgAe}xOG(@e$BM~4QJ~hB}65Wi7@Rl4NT2j9fo)L7H zYshuHScUeRkvay6*Q6+9LTJ9kx8CAErYYu)oB;j*3c>M9R|V`~M@2aVNf>?x|M9PQ%AmzudC`cf||2Q85h z){DaSOv=vY^lz8c@Qe?`j~NTv$e#IDAKO(85hcI@th}dfY>JUyCe~@h-jGt+6^_cn z&`Ps!tOmLMg&kRf~b}Jx6lb2@40bwMt6q9TXSgmrr zOTuVpia{L#MUE+5@&Y8oi)dHY!yjFPE%r1;?-{QcJix#+rBRKGvU&Bjq59Gr{KLUd za}F9{>VY-U^^WbkKp_OKZRgG|nOeMis#0aHmV%)i765Xx0dm?jC%50eUF_I&yhs10 zSKnkOmae8G0#c0KtgTuBB$X2g7ZcrF&OD?>#elrL&0T>m(kOK&Vfx6(hchkxZpzYC zeZ+?BBEsDmpjLqq)DRe3Ur+Z{ukxINI2~jqDsm-%Ey6=Q ze%)e==G_uT(nGajyJI*ZZbJ%qap9~=^0~Kh&{u`M5+#T#@ywsGZ7TiJIc=P(q5dS= z$I_mj92L4H<~-6rhUBR1m2pACV^CFG?2KY->cupb*e<3F2o}c-)Gs;OCd!SUN^%S) zEa=eXp$Q7+j~NvpPx#p+{z0}H|CmV-H{6zp^vx*^Oa~Y;c`~k4WY^G~Nv`^^9Fz}%c+nC0NH7&QIFgE?^th(iyS}48z<9^6)ne= zb(V+x?z-DFvQWhHe_Dl`J!?quqxf#c( zNuoWkHcgcWxom74GBMmXJ~Ut@QnKIWjCM878DG)(%>p*U-MtGc>W=-{^QKA3tkydE zjdtJOE$+#qEF$?fkH~ts6v| zu<%nhYa^hfPh?0qsMAUW`2e?Zd1e5mu0`e^M}u!FJC=Ns6hZ6(cgO?RABre3NWLE7Y#g(TNsVVXZha?mE2v9#?TAGoD*$B8rh)nDQT}n*9 z43s2k2nFVG&5fnXhFlmVHK`$yu_(nPB})m%L$pYkgOb;0i{9OL_S}`v2B-kI=>n}r zJ-^RmIEH>^aUZ|R^*3s{0EprP_%wB&EO3(sNpaP&wdPzE8b{V7;Q4ap5UX&uhJ9ERbrzn z#of53Wb`VNe160v)?vonMmkldC2{SNj`-mFmPSHdP!=q0P~vA$CA@WSh+c`p_#iuN zJbS6A(81Z=0nU5nEkYa_(JiIgKvtyE8rCK|V>i&GO-fE3W&%+nNY^!$Us&X|cYmC> z>mE=PfjaYcRNCco%pybBMDSH5@wF9Bt7hHrr;v90yhDnA4VMc&cMY8K-`*)|N|=q*D5TUBn%?vSe^N~!&`&t-iHgIoyl!G5O?Nu~ zQHSrdvgk9IEJZ=2Y_B1&5xH*7Wm?Ol0%K&~#$6bFeB3ao%VEm7r9gwF1Y@U4Vu&9m zX5%o#OM77aX@Mpk!14gcBtKezpqvsf;N42Z|J{2@J`n+rAXS;!6aZl&Mm5W0hLIo& z;a?hrlQ=+vMLCa!H`%RkOhHa93akRj+n(r(8w6l<{jG|c@`%CqxrM8jbu+wIOm8M zBWhlBfD5a?bZ|a_J(PF;r+;tK1vRwKe^^>$i@C0>UD%|9!EwW5(WCy%xBB>M5LeUcl(TGn`X*?;Xf=l~2Q3ZN(QurThTJ z72O>g$|)U#qL&2id+Zr}>6%F@$o+!xT#L@2pcCUy)rc-bVSiR5W?_dEq08)fG(4{@ z&K$BtecLMnW-cfjh3ublC;ZT0`z_$o!6&m{|+t4iCTUaceQKCpFF{NH!ClQe_-EXI&YW>z<_mKyYsIr3k@`7!lWO z$%0{Z?bn>Z~W#D3qfAt_1jX0j_qACCIs zALWgdPvHvTrW9sRR1IY@4X-2%7(aRMmzuz0{uvcbA@20gKr zYd{$rsY^YBMEHhTYGIjXlBTeqqk^!#qYmLgKrKI#okTTKiB;>K%Ho@FB zw-p^5QNcus56iDl_Jm@;0$fE^#jEB_WFYrqU-ho~lxQhow9AFeS&G{t$R9}zLBIe0 zE&r0w0G*E^DyWM)DJ0?rC_enG<4LOlC{hHTn}7tUu-X~DjHkP@T8Pa=Zq?PNaVWrvW%E*eF)zVe-gOBL3x zP`5Xy(PbtMWuYeL&c+))?KF?dnjS`eHBbL$<<5@!rr<_)b2YfXDTj7I$uW{u;R&Z; z=be@Fcc=Mr>)Uc-(Xa?U%Qux$#}K8HZ2m-+2!_Q#HRQfb1cO;Uuw$BJdkOUEJgy#Htr62v`Z2La{K}n8&>fX2>C!>HBjL9Eu?VdCVa&B3|`|y1Da- zEz&L-J(dev?Sw25Okg%t;|Mr_n;bJNI6z0|<3yd4?VsYy;Sjc7@g|BLIfq~ZUVK@2 zrBzM|;MswqW|sA-Gy#rM27U<%;rp83i)s$%j4Z0#XF{Ff2GXt$Bah9ayQ&^=6d4Zr zPpl?Bb?xkWlb+R7Zij-EmX$p(H>eA2f~u@suKczXA}I;PMc+77vOTZUSc_Nkdsn$n zqufu@W(Jkxt#V;k63_@N9F}Q(Vq_$>Xihq+D8KgvK&>Yq?761q_SaGgRP*t#NH)9f z|6E%jB9c{a^}Pc}s#Xo~Nk!<(3gZhbZC~t##8Iw3wxC^e&3a?YiJ-y~U88F>KuUF4 z0MT*YlWz|Th*_|J1pKehTO0UnN7J5@3=OREhb7U$D;t3<%V3}%@b$(=+}X47fdH_r z0E{1axK&E@W;x6hpg^3Vbe4U{1#loE#9#&KXM2=WwY?ZQR9<59#!d>8;<6BN9S8v(5b?i zGmSADNq*$|+Spc3VR8uIk?0KBElJPD{zHOY)hp(VQ4&eIv(#9Js4M4}^QTHuG=n85 z&_N32z+5O+-LZfO=P1gds%J4 z7ognoBTpqy6cA8#PlH-LC|oI$4k3C=>|v3rNVL`e0^vy6~mU(e_gg2F=?*@M2zpiZv7$NPon&Ob2*3j4io zhWirx0^0Qs23o+9p#<~Xj2ko1C;s8#CL$#Uc+1Gvs4JK=crh0k80a!&}D`bCAt zjU*{zkj3WolRTjV5He6&ay)|^9#j%e*=z(@c8K(d-bqZhSMJ6b$AzNSu}N{HCiaVt zm}BO2r|7=+$OZA!&8~9ehLdIv{U}SNAUq=eg@x3@K8txy#pglJ6tHX$^`z?D!XE@j zrlZv~Q;Jno^;I0(*@g7B=0tY-*mGfdcciPP_S~R1ZZjJ!A0la!%a#RqsowQY6^sc)^{p{_38tUPS6T{0JH(!6J~!pu&faR96%5gsGKBJIoRo82s$Co6G!67GFAaJ z!+~BzAb^hm=+5rnOcVf6gu5LS;3&EGa4Xw>fJz0!^Z|C|`iD`&rL=$mz#^GHur>r_ z07RG%+JDZ7k(jlJVbh{q#tB7|m5ct7zeueSS|M-n3&Rj9#A&v*Xghhvf z=P9s2%XtF8JPQ^wtk@WyGe6d#Hup0>86;#c(!~vQq6nw2ze+*LI%`Pf@!FzQ(n)5x zpV(_mHqIJ~x{DZbkK}FKRP??{qV~u%R$>X$S4_rEv`5#7YaZsV+vj8?-|X+5t*B;k z`dI8Ftk^)D8G02mnB_y3ngyQ9nTvL&R64t>4dw-HPP%esGO0cl=5d|0q%{zfXR%sX zoDqoA-<@mK5XTDc!L@*Z`qB8fjCXdERI%L;E7W*_rAeu(WeuPzO9@K$qD0S3ZIg_qt9xs0 zp6OSb7G)I92%vHnlNQpNS1V{2hg7;gF1yGyI|NW#2oGv|W}xs(ULchT{J;c&$cOOk zX0_lfm#j|~W0uZPV^i$)F=8$fGOwe+|0>G>&*P|upM`0xJfIRj014(Pumxdj2mDl0 zM19XHY+)fg0}FuRbMat6^#zCuFczsY4!}${P!OUhR)85XtNW4U0)gfL(O~s$?vWL~ z0=*E1)_=1;<1nbvQl;&c_jJkLIYSo@ppy-5V5=&y{1W0mJ?!8 zSqp`h@3B0PVTe&6H;QYvv%o|4r=jB`&-p1{RbGl&=<$DB(t9itYp4Res{uM9RHK4Q z<5pf!eNmK@CuiUS;vj70cd$v*?yN?XFD{*PiA$*gVJ#LuAi5js@?LM1a9Qtw`u$;xRVn!74l?)v0e>4aYJ1F&<|J@cQ~^;W5sWwUORn&09l|K zrY1ng16K2Y2@8nFrCoLT#!ARh5zj=I0VY(hxh&u`Lw^g#cy(cJ^HIrN0CSwlI*Jj4 zEoprw01CuO17@pR*$!2k)q!=kn7T6wU}~>A`KLd#&{mu;fZ`$pwhkw%7Iy+R9`mj5 z(oFhKZl%mFPS;m5lEu9SyTB&hWWmKFs$Ul$h^Hy$OPF^Mw?VL4?Tn1(j&o9U}Rd6J! zg-cn0S<>eDU;Ama1wu)>8P)lFW;H&+oeEDRlF_+{SfJxzi|l>_q8C+Dz$9RMP?bp4 zfRZ5^wA#ARFL5FV@FuHXuB2LVd}5;X8WAnQvFFpah+)G%vAq}5e9S#(usrMc z>5}|@tEn}*(RLjj7FY2G)VI9MQjweE6UI<^ckOxUv3?R|6Q zRYH;YWZMiM5P)E#U~)V=uVxt`=CV`N0to2C$f_9d*q3P$cTG1+%ri(D#YkzzhXi)R zzyR#?eJ9Z(K!j@wSYas5fB&9UabTWCGlK6ZZ6}{1)c$sdJi)x2X-2>=zA+6=b!p-(E=sR26meWirAJyFG)a zQ}4jblQoz2^%gybBUpZ#DQ&9;r#?Esizmx`Q6HR9-^adnD}xE=cgbXlHrL>G5R~j? zoTgljf@zch8_wjzqvxla>-dd=WD74>BU~xmLXej7$SzR9@y0Qdg|&Z{vC^YK{A21K z5^qz}H9MBb!#RFmU7KF3tfjj6QDs%n%R|>c5-0X=Km-4+@U#ivkOY4ez+!q35{m#q zt7CJ$3C$C)Jq5lm;tVB>O6#hzfe3NtplLc!3={#-5EB4{<$jcewOKO8b3x}&g;0(! zzv@3SHxMAPr~oFcg7+W%`T+n@xB2a%3dREm^RhB9`A00b?B1U7#il@3C^_U`T9yf} zr4Ut?eI>xC^QR=5v4kJmPK!N!74+#_I12r)KfW7pA%Ped6TQU(V5Qg27*{XZ)VFd} zu_|+|DA2s&r4gmE`AOqS93iLu15?lz_CMMJc2g#&g{dFMF`M$MIvKy~s!&(cI@jaH z%p!3z1Nx++zK;WbMiYzk?jET*wXoRV`Cis6tXxtprYNgQSUEwSTRr=GVHJh!@Uk;* z5F$u&=uW#ts@fbFipa-G^wEx1KqLqZA*g{?n=lpjab7oiuZX^1`5|~!wTP$J*v(7& ze~sfmIcHTuf$yK7!YS+_%v%;%VFL)JXHH%>tYidmSFkLCP?2S|DNz8ISjX}DC_AT4 zrkgf9U<$6+l~R@mMlfatmPCSKbT^jARg6Tyg2uP@qzIKiFX~9wN;OR-^ofyf2EPi5 z7x$Tjg(U-k-6MRn+Z;SpSQLO53JI-^1L#nZ@cYiF*ZE|`05)I}mBL4>O`vHq08swB z5=cxP_Sx(&3iE^j4AmB^og^+mzuRq7;&Rpk5vUIYB)MMZB)Uz`Kt6BSegAHVqT~u) z-d>Zy0p^I%01dAali@?nl}(jt87jSnQ(DsVW_|6Rj8xYUQG&-P2xX6$R7pCR12(PV zkqj%Qw5=?9fu!ADGd$mn3twJpl-es|v-5i@RMN8T(yR#@uNesuBCoO!DVoo)rx{snP*Oa;&XqMAnL>#=q3um)5bSo zDMpp}nLbSNW+7lH$mB#BzjN8PS}IksAO*65P?C$yFDdt6s=Elg9TTI$w%6~nlJ-6o z)PBff;lhhHG$z?sU5XzsuqreAm}*f#0KoioCahC(UB$HZzi{Qya6Hndstko7LZia0 zxx##EsviD&Z9w5Y>lBq=w??)2O8O+MfON7c<^neqr-)}yhC5LYL9+|SVAQbw&l5o@ z6~E_wIDx3*P~rj9=NQzpMknGmAo>j24>S<&{7-GXT+cv*jkzw5ySJ}wVPJ#M8oFwk z+s2`eF!1wKAUW|vuh`R})2_6c^610Dl`+n>2Q7*f`J50;QrASp*yxnBwn&|Hsnwq5a` z33GUzaf=rx^~k?6~u@j66k*2T+} zUNfaP-a&;&YZ8iv^2^%vQutm8P1!t%z9*fe?^%Wl3|A`(1)CAQ1r#x=z@8`#Z(QnO z!Z;^h(crfk)jfxbax(vEmPKJF*FI_pz}xrxFe_?riOq%02-ZJRH4iNK{42& zSb;wO7O~JmSGKm+Sk}KukUi?Z#j~Y2}Mdy5Ss5M zGNB9LSu4Fyow@QKPI(JniLev0Rg;*8>s*Iyk1r}tYn7|Y$*kp7#}7Rc}B#3{(}nOd}azw+m?^+p}yCZ3fm zB-{}1jr+K$ceH;c+aa*iW^^KD?{|fmDi&D_(e8=?km5yfjnA zYQeg1IypQh7AKUOdbIPx48)lRfHdt{dzZAnF9SjSDX#(t1j3x^^Vv~8}g0Y=kJydy|I22 zd2poZiP#%A_MO6X4T^hKb8rOhV~!dlvuXjyQHd(F6G$A^T-Ooh718=JIF)u<=*1A) zrjgte$$l>4?M!+N)Hiq-0&`{!R}GD+gdB$M65F(YM z_w`Q=?BCg`)UGe_cj%`SbE^A7%eT(fxEOvl4;l;d6|dVj#t1%>aJGH+ zwVC62=hBM(;f~eMpb|Y>k0yvKSQE;cihuQ@*8Fmqy-0SR=i5UEx$}5VLgA}$pUIT2 zd4XnT>wYFgPz2W%cpW=YJu?=a5@FuqGgSWT7l`o4a}j{Z&<5Vk zdZja*#a-ue#y6d3^k@Tpq|a=CP*s3G10m*558n4uLw)(bOjDs>$X~^#8cd=*XK;7x4B933fb?#sc`vnHr?Rfh^1)jPnswcxZdO@^Y|V?A=rV)m)|FNd z0|tUd8dc*5eq}eckVXTGFt4yVofW=G)x-FyFseT+AK!DFRe!`Q8Mj|B{ODYl{rFiW z^FGGB%hpSEGeK`6H}79rweW4mUiYMrQ%S(;k*_|WqB@aF47hH@5?s| zPY>&k8oO%!nQy1QGyQmuXB1ArG(F;OXGzZOd-Bk9N8kHv_?1f!vgQY;QrZw-PlUje z@J$nrCVkmr5dWXbvo{QYRA&oNNd>k@7~o6U<+`mQj-kfszy7`XPE7+74Kzw9nAPDB zDg}b=@e)u_kb9Fe|GmP_c0*OLOm=Zpc-}$L7iJF%j@C&_K$d2R-R->u9Q_ul^ABt} zgWTt6vPbN*A5YiwL4)zIcj3H-3gToih@;BD*7Y&=vE*Yo;O!K=r-#2QRmbkrQ7 zOrG}cXI^_6osXvaj0A6s3dIO9+uo-JrjXHci$m?Z|K9<8|6E3}@y$)g0NR-p zfQ2Wy<#`mp1SwiTM(cq6_txGmDNwa_bn0b^kSL_63#}m)0O{_aR|g#z@FdG$dbABj z+<$&QyX42+PXl{#O}*wZ+frMYL8MSkgpu_LTn3H3x~;E`6(9gGGVcvNv45?Z;a1T{ zDmtPh9y}hu3DAjmMMN(4p4m1B0C8#u#Eimtgi;~fj%SZv1^jDB{xyo()r=B2gsJE^ z#U)-n{xQ}Rs3r!HkF;-oCXN?UD%^YVt@(aJL5b?}hxtvF*>cP5GzCDe6as^`k2q!Q&UrHp#E3fioNE5Z}MIa>FYMlC{6a~zW8?gAggDdKaKms~XzM*~$InH=uFG_Y<& zpl|Y|Gl!VoI7=X9EuBjkN}8AHn!Do6{xMf+r^-&V8Npn>{v$O06-?@4Ac_m!dEt%UR1gz>W{Z|ck_U$$oQhdA|-jZVjAhEUV0WgUR zm!Korln)&j>2hGWBPi={2uRCN%vLMeo=(M`d-FNGef5+`t7$mJ6h)c7w6H^eiHVh= zwWRXaF3yE7%q;Z_V^N%qqs=!~PY>jeJC`{B=t9={NCyM zz9+!!pP3ErebbcOvu04&Jf)qsS|{D)x@*7~$OQRc!TN^NHuEL*)SYTtD{Cz@u9ugk zrbcGLS7feFb5jTQP#D9Qv4u}k%tdmilg2Q?vYdk9!k^|XmzAUh-hGt5Jelg~gW5~B z{`+L9vQq6dQlvWTUXW&X@dK074Ked2o>U|Dl;2t7=ift1(etT=2fT7PN99k3OoBqD zIWN{KrTgiwZ`vn_rJgDKbcta@#-lnFEz29^|7_P8QHEa!#7pVd^so<-))O|h0?cJ& z&8m6@c5?I`vjGOC*wV(eb8EGbUsC2Q>p~m*37WPrQUaM**;OSOZKQK$8rmCdR(9)s z2X#;em8`K8F|hhuAgE%|zq&3F^o0UzPJHVVsLhf3uJN1V>KISjt!EOI-G{P1xa9O| z(t%^u`{vbLU(%%zRZ9dhx*7J`4v&tCvt#!U2LjEKufV@V-*RhjoezbGC8QjS&Hyw8 z`&$D7DTz`sLfjFM?CF&r4V#4=U$Xl`XSl?_-T);L~wnR~Ix9{C;fkXm}N7pd6 znWr_ILSzRS>*i>athjGK+gG$^XK<-*rMe~8h`L^an>Uc#OwuH!EwwKXrVQ&>wWUKX zu07xJomd=gO?ULZ>#qF#ZN*VXvRiRx=d%nQH`3`rTr;ubPbeMw#^K|;LRTww=!0M< z18pSw`Kc*(%g~2!l)Y08dz!lAMl%Y%f$f5LEY%q`O+e$fFG4lV>>SSUhn z?Y>mB{nyT%?N)vy+y@^uPkqt4HX#%2qdmHi2E~eYWHaqKsJg(5UEnTz#6`TBSB(V4 zyi9$Y4J+8!ByXD`uB^G%x?x`pYHD7GbuHf!x2YZXs^{+U`#o_Vk|wPs>&ArkocAxk zU(VqAAtqZRbX+WXvJ#8#2&C=06WZ@eAqF2ZzG5lKFC`M7X5G_V+MF z^U#62etve1%5h2c!mk;2=0@KgMbqGLn@ky4p00{Bl|&&aspvL&ODt_)NjZGxwO!7| z(bN077^Agjtr#`AuMHaHoL~Vl6vuX5;f9G>M$s--^SM%wRmEiLxiV~nNd1GlAw?gO z$A#MCpD_z_Qo(Zfxu_3bA$s3uM#*jNTX9V?UY&xaF-YYoNEcYX`@CT!l$wr2Q2j03 zTdT49%xU1RB|)DgA1cU2@YKC|Pa}m2f735vk`cfWB+=wPcFb~R_KW}QvxG;(5;m!Nukt$y2Lhi`M|IPeV4QuGD~YnFwHjm~&Yr?B6*+y@!M| z$@Cz=a2}FJ%n6{N22nTlbo_ z;dRVyE*%dh=QQ>nYffF5);;RSV)xXmFTJ^J7w+#RYkI1CL#e|dQK3}kz$!sDzVz49 ze;cPC0}VdzkA_V=Rj$UmCB(8@#4ykD>CwsRIf2N9Ufa99KYo&~x`I8e_obEzT z1c$8JYE0?%v3^c}(0^N-y_weO|GpPeemZj=#WTa0UG(%KMXk4=jm zxyXncuL|~dW}?n5e99m2{ZipO!$Mf8C_eJoC6XwDE0%ffIboVlm zVUIiSxB|i^nvvIM?a|eXXecy5!{Z~U>H^?T&H7I(ES*vRagFkb0}m2tLDQxk>5d<7 zmL%8Mz0ro>>Qpt>ClNxYn?I2jTVmkLIpi5YBd5^{dc4I+F9j@9_I>$iW-}vDP z-hNokG8m=Tt-RlbDdVv-$;vT9tq-F43Ame+a)HL{C1)^y!-6w~sG zWH3c*lP~IOQ^2F{)9yF+<{DF&9(a11p!60FrJr$RzXC6t+-!tnXJi{M%0%~!3=PJquE+U_W>R> z40Q{EAQ7K-y6}SH;qDUZl(@)hg#~u50tdvVmcu_l>;Hl$&>j8v`3IiRL06c-;cHfC zw@l36_`i1{*dz)176pCt`5W|Sd_7xXh7+`TJ$9xSmN7FLfsTog-(h@-%bRQBWq~hw zkJItB-`VNGh(24-{tXSRLb;Czxxt)f-j6%cjB*)^X(&tV(*F=mo`b(R>-t>BS zIl8*|R>hl8Q~8_R6JOq0vvH(1CkEzM3*T%D&XTHYoP7``X7hsAJHbTwV;810>&_w} zN)*HU`7bAHm_A?2`N%BpY!8KzSbmF1iyH`S8g4Saj)oA+_sm=yc8a6LY<@LSU|&*PYZbM z8k1DZq$MS)?Ekak%<&6R$9s2L>`;g!^2(?Rr`m z_`g$nt@3s=uZFtz*j65gTl-Qq%W?`ue!I&uDP?W%tdPk3=~-Ke#qs$ z1&MKVa)A&2=MSsf3sbSaGS2d)WIMk}sU?=;A}7Jjsf@f@3`yVm-I9YoUVT`sD^+Ts z$-pV2&?b+mOloSve0}x(6U=xuz369?I{sT-5l^mfxB07~$)3OFS|$rJCU2ZKn2R(k z3X5X2E>sf9XcIsUe76*3Ab;OwR|)ZLm({S*(x32arYo+h0oPW7u3GTmnfTDZEk=!0 zijR(2Hul?!^Aa(d*%9=+DwoeV3XIE2&$RVr5%OAIzYv)B0&~9bn_i3J zy&B?N)fzXx@bb=qjy+#QpU%-{d%>m0Z?HyY?Miv{{Whrf5LR~b55byGjs9$HPOzod zPllIGPLd`zM(PKzL0IM}O07jn`>Z-E)deNpAMrV`02u3>JRkbjf0aWhGBn%)&M9xV zSFW^;XuYu?@}PJEOOpH-G~huy?Z5CTs_nH~EXL?+VcDvC@^2T2qaMN7dl#51`%2&aSOmzq#3x>w5d%egb_+(p%@{IDwKkv4X8%o#q}tJBW^*)|X5W zuHdPUbh7-omnUPS!E!$ioB5Mkrbbt&{wd5-Rgi#qD>wRQ=E`-p=YH)>NnRO_70En2 z3t#gXirR0%eZe2^v^P=#|iIc;%{P7bX->??#PvTF@=PwK7^%eta zr)`DQsfCwhl;tlRew^{0wlY&-cli@{mxoBs#?pcZAjMUV7g_kx_Ua$|y*dT2|DpMI| zia3&ta>Xb+PYI^@yy}iBIY3$7s7kapk^~B**X)o1M~r_LKiwfQ#^pSGAU+c&(dd>t zl@lG@q`_6w$_t|fZbS0`d_D=+*jI(4=taqn9v+hkfI0g7?-#Ly07R##EzyV!yJnfr z;Nt)o{rx08;a?O$Rh8c(DJCCY3V}zwnL@S6u0RIjPGibWnD%pG(W` z+acq4&JfI;->VJRV8B&JBf)Gx^$6C!$F4|!_>gI=Qy`Za5XoB~4@(rDK=Uy2`&x4; z6?(5TdBc9r>*E~Tt$n0VR(zbid8hkP zo0tc?R$h*L7Y668Q~Ehyln-aVN~MnoZ&O`TX9{MjovvAsw$c`M{apbfqVp&ehK33X z6|BEtRwknL^&Mw}2(Ctg{2b(p7ORY$tm-1wt_`E7i!J1e<7t)0Droj3eLe(*L`os6 znDntt00Lqd{*l{kmXL+WIN!U)^bsVAK0etQ;%XR70N{%B$?#}uF5=KITSR{}8G@2i zB2de(Dq)BgKg3Q9w8$Oc-H~)49~eOqXY&&RML;oxe#x;{!g61|Z~;!*NT;I| z`-j?E=3sQIBY)V_#S)lPXqF%S_}SgAa?T83v0h3%BC}T;v#IX)7e8@S(Q0Pkiv4sz>=iBM0x;lEYx^vhhbd~lM21ZeBoy4c3 ztKPnf)M$a-S(}+w(>Rkbqc&P9f;$x2-Mt}e#f6l)-1u$R!FL`}=fYiJI)LS`(C2$$ z!+b&)xDxf+1->lYyGT|V=1<&4^;pn1A;Q;82BohS(gPr)kC4GP{S}o^5Od?&OOw4z z-%r@Nl7`w0VW(3{HiVI2>ePU!kGVTh-jU)=AXCT;6myZfekGFuh=O834kikn0hn_R z!2RpsQ=2vi4X%KlS^w67)C`bZOUTaaYQ0>5NcU-fdm4 zt>z;YZL5pu58_Pf_2WM7&yH3**jta!zL;9jR;8t)N{o%n)r%Do6&#gvefv->aS=rN zj&_e&3h%U(<#JG@UdP<*5}rCScTu$w)igFZPk+wlaaLXG(3V7&ZJ?T%>4}*w>GGK! zHnbT~DKrPnf^+yj!d`LE-ctr|Cp3{I{PS#Nkmmce#GZi19NJIc1rLlz7VSR`ak|My zJCRuOp3xWYuf)G%`O}!;gG>3X(--6IW(OJjw_+Le=_20o#eOZx^H12h0j|i2Z+vwG zNw^5Z1$%ou#eUb-Q{%fx59|yR*vRKdWu4?n@!3Fiu-5WQ9-aMd(n~2?#@_s}8P+ zd2oz33VnLa-TKofTh9P-fE70OBX%V>Lo_QFS{Sj{_g0}MBWFcJz(BKw!f?3?@|(#y z->lv1XpYgR%$<#Na~m%g1ig765``Xe$Q;W;e(2$}(89(qlTd0sQdNEBzBxSPgQgm2Y#F+DNSukE$k}@%r)XW%XHaHDRK;FD-wz0tz z=7FBWlRJZj9iVfur zQa9M*g4hJXnp9Wv^sO=m1Ny1A4V5vD9Fu1HC`v(iG4Z{!AS<*^zoU< zv|6)#U{BAKkmWWhax+t+;M(0x^$d;?%*n{}0I9#qmt_RT#xU>XXTMS@KFMrLdKw)Ao^)qNVB?P;7n#V=?ewTfa7l z#qbiJYdqHt8r>kK9^QgG=W8~@6=8N?^YnXBEQ4;C38$}an(^q#Wy#pqRzZqe!;{7BJNrs0UaR@FaUNaKT{AvBy1zR%i^&6qd7ISA5h$7ti${8RfL7nZtMT&|?-JJe!kEbl`0 zAc0lmTvu~s=jYcOZhRwOy%oh5?N&x)t<+^#{t`S$=Z5C)Y!^FIIS3Cupx)S9VBML@ zzwlKU9@)n6)?3;!YaMIAwa;iQ9+hmP&mH=nLAXQjtniChF*k0;qvF@Cy{#oJ&-0RV zc_TI9CUl+%3TKYm#H%iq91jw$mF0^*oopfI3T3<Z{O_aBj32@VE6>>1h3*l! zS;mP-&2De6b&P^icRM9On+ywoTy=C>yDrCNSH~5JC@y*<^kp)C90r1dvSNcgONxc! z)DTZp}LYBRubwAz8 zYwRRqlz#Go-#B%ASaAkRhEq!U8Vmj8cwclOpskNEr>xabb_=Yvz7y?m9DdU)nX$P0-|nD zFSNI{$Mj!G7cq0&|MZdknLFFttK;?pgP6-rqc^#(Q|;fb&{q`6r`|9r!BOV&N9G^} zU~lnBGu-Lu8TJ1{mafGQVzid9LItB)&GGO){FEY#wLU*WD9jX`ocsvp(C?USsA$#@ zDKY(~Sd>!qyaRLog!f0d%vM)~G#mhPrl{wciE3 z`>hO>8{uN6_YEj1ExoEzvz2*K9>Rvd;C;U9@SY3L`w&~d{;-lMQpt|L*4xJJz(ADh z%l+7qR4cGLGgtl+H2}aG%z8D!1~HiUi>GI}gT!zJ5am-04n9x?cb1lF`6xHiS=Uo*9@|iB zUZk-9ds0}8Gb0vIoyXlLzmZ;eXDpRwe81Vp@%mztR_yF<&Sctvl;(X01|8`S6}U3F zu*5mTbwS1r}~jUsZ6*bi}7qT%NY>!wK>@r*)S z+U`LByA~wPNgR&Uli|PASK7PSTth@(MpJ=3R&i`884VveF`$63CQ)+e6Y>um6b*^| z^Y&|%w12%C#CIOyRO8oX+K#kx@6NWM@t^`wiCVB*U-8u0#Z#=#AsoIjKFp9#GT7;g z-a~<64J42Z*ZKQFSDQ0y-=hYX!5DaPsWJ`@kjC+YL*J&jO&d??mh(bKUBI&MfRG=i;Kjp_Akn>3$|PaR^mVPCi? zCdu=2m+rPZFUVtSET~@l?dbt!LUhN2&^B)#=lj`hxQOE5`aa zPlBWe%YXo%w(;vQf8LPbK0cN6r})r{I%A%5L~8UmbmwhN(aI;Cn?35a?R38EeUT*& z-s&p_DV`EKBc<0}VHu@o2s4s^mMHZJnmdPwtvsL$BATf8+fxAI*1Rbi-#O2``iW@5 ze_p}T&&&6584glRkX`tAF{DW^J#CQ|+UUAmYlRVc^MF5i9wX)mjwXU6nh`&Ed6ZTg zjX;66XNM3{F$v(5Va%sy2zm4Sfl5djFk%L%P2Q@w@O*-1w=ci#Kx<7M(~=dTC@EZTML z^#X{j+Po^pWgoC%884s#W5Zm{5~e)8Sgl~A#rdhi(M6A@u1(RucXjV}b<|st2~~Bb z2Uv;}_zPH)ug{0dYj#qyeO`7RW?zD4e71{`O0?+C@13B913Oa^D7@ap( zd(2q&A)b_#msmomexZ(@i`?nv+ZH>DCA3MSH6rFoI@jZKRi$%-8V_XGt=jwzD^(y0 zKrM`~&qZy7)A)e%Uh-Skv>-aQ0@_SRi%$ZBPgMHanHbd#_fgImO7LI4Bp@a?WOGxt zxhakWgdix+vX)8DGoyu8Up>T@1{$dq^Uz}Z%FpnpP&+hH2m>TZ-3M&`oDs{>AWr(86rXVpN=ncvMmT#J(j;)53%Fsdvlly2E?jfz`tUlWZ49;l%5dg$8UA zoSp~54Tq3Ja$aN<*bF`EASyw7fh@v`TkhwyF^c2mWg5o{Cv$+&`P>vK%8>cc*ldLf zHFU|_Cz9ydgpNf6UJ_bJ8<*%M7YWz+waR5-lwB!K13V$)vhkq%ZDlu@&H+r^S#jK3 zp5of)$e(5?c4Xv@V~_XT-*=a6v-{eb8=M)b#ARA+I<^9v%=LyzlvQVtI8RKN2A&Gs zEMz8RJjTj>*J3BN^g~qJtOQ9o(4Bn$JDn>5P$6t6{=4Z)0Q(bEaQxL{zzei*sYf8o zgJ#%!?A|*8G^9IPUvwbS5Gi_YJXl4DU-au|{ek_HQM z$xNI9#mHPRH>xOf>Q{QZK{lsheuYpSfBGWF?R~A&5x#z%z^Ar|QKR~JQB&JDIUopT zWTXK!QL)L}@vYmiAGf;sQY7V?{DvDdUBpm-%D#`#A%^mCd>j2hMQZ zOo#}-BIvXcnrBTNrt}c+ujnSAPLuXdi(DrJPZKjrGlo_iZDt@#$5BI)9f0u4mD)y< zi5GGMK9n(gLrDw?Nng&!w zoQqojT?sPOgfD7w-NZi$yHUYYTmPt&bFTwG7I_7veI?>t=cjhE$_<8 z=K+h6LO-kfBqI%!hCE-M-@SSB2Z~Et_Y*x;=M6&CTqS-_eKzIf4@KwcFcHNn>T0Ua zqRcOZM_lBsP+1iGtF&T|pAUPyq1y6w`f+z@DSx^$P>XAcb>-2}7guFA$*5elu~1?N z@I9RfY9vfS!{hzA2s81T_1;k#VtmZJ;BaAg?MCu#Bk2#0z-_$XfitpKN&18Q-4z)? ze4elU1RM;$?Z~9=%07&lYM;d5h^=k!OHh>ju1xPiI@YC!1_yNdY4IGkV2~Xjjeb%N zAIv-FVgyuS3{1oVu%!qCNL{Cy8B!)^3GJ479p22?SHVXVP>k+_JKgIIrd0q0c7AJ* zsf&mWeOv#*#oT}lTBD`c+1&0u%o1!3mLu1@W4{MH1ri1dV=xfbSWpvhGavPJHLb1r zy4AhieO71hhtFQ;BH|A}m2tYIc+NLBj>_M9k2y%9XRTTfm*C(e4-%rUWUY~jSpzXpv@%*}?xA{X#N z=BMq~bVmx6FYFZ*4tY~*5w~o5wRy#u69ZYcL7X=YQ1`fST6x815+M4*ii>wIzdriZ z#>HA4oaCXPbxmUu(G}yD1xhoK!R-^i3i3K{ltjB4$ugFFp4fMsLbmO)O>Mfkw86e6 zxndzVV3_$D$_Gk2?0v?&a!6LB^|hG~ZiY@gX%-Vc7{J&&OzdASFEu8! zL0)P-@IDgsUuzD*mJHBiy^*IJMoSz)+3JGBOYNd9&Wm8sRQvXvV zD>V*e%G-D3=8^XNehW26atHB0dQhD@oE zjll4&WbN)U?MKW%g;h#zksP0OLu@ULQAmnp?C9KaP%6hc9FrGk2D=pKqh|z!Z5PKB9IgF~_SHLMeR)+k}6t zJ$qkBe<{G$=lO>Y?$Sb#)Os2id|;i8N*NUaa~yrZsPAhv3PGm7h62>lzv_(8I+=U0=*z4Mv}ft7f~8r7#y#pHWz*jfX}}nLleM5zieI`L&J=J6u{xLYQ))M ztM&2qpX@@w_MarljmeE~S6-T`^{JYIKwJmYj2q1rG4?dbeF%8OQWIB`+0wMC#m5n}i5z;q*%L}eDsVtPW9?VVgSJy&R5@Xn`tmyK zlBr2?5M+wuC4c8hH7#?Won0Wj3W#luRp8X5ZZE!V=}+!M{VYVlaXBkYfPnkO-sUOa z;t+F&3`<06U{cVawc#9e7!X}RdE_h!Au~GJ{OUU72??N4=cZ5e`p?v)<&k}DF$F}a zGi@Gg0RYyiK>v9GZE&#U&lih6AN-jPYDDvct_ZR!S}spsJ*JJJBv+h{brU4VNOOeVdhu15h#CuR-nosMZxK zEm*dD7ipP~s#;{=da-WLe?8MR)<^i-+>ExbA|o32BXtbyIH1)FNT>Tpvw*fusuC}L zmP3!hj7Nx-3}@8ZY`*AB4B{I&t;jV|4gW#ykLCo-Fp^?k&!T(Q$O>pcVQ} zht{;3{po>gmCzRLMCpCR=8#)==ba{XKu$eOU;-`Vco-rsZg0DiK#FQVDj--%0$dbO z9a5p;2Dncd5-?wkX3m<3>O^jh@U3=A1V{nQjzWN3atlUg`PV@7<$YuO*US~wt{<8j z!TIHSR>Er68=RY{)SRzWe$xBxWo*IN*DmE4`p_lS_A)yEn2OM>6lvfhg%%WnG{<)u zNw)~aCI+T1@0?9a!>SFvO4qVxa&FrYktsV0N(lmVmk_un7N~{9m3=izlA%e%xVxs? z+P`*@alG-tMo)Y}Emm7>r`R=NWbu)m`2%ytbpPmS(@&8t^}8Dd)8fuZ`#EdwzNE|S zA6VJp#0>O9N{@gjUD0i`-4<$WRj;)dX|!7WhV0Zq>e|Z?%1}(Z^?m76Hf-58s@%Z1 zo|>xM>cgop^AoSw*7N4;!z#BzDRx<1+)f3~p^%}9Fr*ReJzBIL=ANkIOpb7*h=WBD zOIt$f^7}pobdy6i{J%9{569a#{&-$wHh=h}ZXE$;P2t+4_U7fnSjoiGm8--`;n$hP zC^BkuDk3l|;ubH^yr(Gy>#=G@x&~rRO4P0}A*}woagkM}0P+v?duTuYixo0J^@EH&?m2Dn_qv2^D4gPu zCnWq(IS$!0er!=IBpSmUjq?cLAx;07wLX`ZGrAV(y7H0=7-eSE@oA-dS`_lKE(IO5 zE$xsB(!H)pamQWvokXjDG}RM`N_8~i(x;Kri4dY0?R?2vzMnFdxYkxG^iq}@$;5!? zzTbIvSp25I8F_5HOyxUO#&vxwVI9WyRZ-#pQ+Oc5B`a}c_86%Q64BLu$0fQ$}_YA{eKMFMQSP)q>PN*1g!X6;4NTJc8bY=@# z!%SgTepwt#(j1TjqU=0EuK@{cI@eNoL_Pp&a{z|6vZ?ud^?fx37Qud}w(tXEUepZVh=n}t!4l1Q6aXs1VKQT@JGBY2s zq&@S92e?5t395=9w=b&_le8rOU3_HsT2>F~;Q7W*chm zWoK4L4;MY6tIjT~DpK8AxI2Z~7;hrMBsv1^16skxoV53H3MN7hvUxPEsFgPg26=NE$ETW0pK*R&i4B<-LwzNe!!6)0xzDKei zaEeK2(nFQ+w+!IkSxKwMz8?(mY1~=7u3fMcXmOG@P*j(V$QknOoA#8c@5sFHv5CYU z5G#Bod>^CdKbC5)%zx}dYXppptKR5tO-}e0RA|i5)JwDatz%&{#`>mc245a_M-6?G zHKw=5BDXKT=6M$)B)k$07adlWt|5vfTYVJLcdtYqTSGT!m(v8ibL$7{vhv zDHBp(-T;x4W=kWK>Z@>^I1Q?KG6NkauA0X}Sboxx)Ut4=XFS?K?dLbZ(V}h+XWr&1 z6Qz63`~yQnhE)>y-_G8%B0wzAl?&AePONOu#6Y5LoE4QK?kq+U`YVK_0c5L=IFr9v zSc)d^tLDL&nyW65l;!tZ$T+>2x0p3$*b~G-DOWcQv606;5A95LVtx6lEpS_gbq2I= zLLx2}v7}?}JIOcjypC_ImbxSgp^0XkHfYaL^fj569dxRV<-gLY5RkXJB~)9X@%$yJ zZgRM#=%p_^-+p_Bu^is(ZQ6fW%)Xfhn4yWxaiL0Jw`gOv`dEQ`POa1?K;rAUGHVoi zKkJ@mEB+K?V(y9Z3Jw&eAln!5jG6AmPn3$p>qa$aqSo$J!;6cGS;-ZjAU@hVrH3oD zw5ea`nQ@P@s>ai6QXMPbx1hj;wxv5K4!felS=lVAmpZvtxyzP+duere5H z`#h0)uv02Aa;LkLHKuPd8HV9CB-Q3Kpe?DZpQGYviRMl%JTU2}4&6A7)#ZnYx?r3m zd?<7_W8)=hZtxh)vr35^Y5OQ=yGJ54U*=dip|s(TOlwnXh8+6(w(4LyUC&{0yPh^O z>9ka|Fs2jU5dI-xTm{$i{CcTiuQ+1+&L;Sczcbl)URVzj9>5nBc3&X2cOo%K`6xX|iH zMJ;9#8aHR@s$LpC3%@2}_eQginXJ9s33q8QbA*73uJtER36gGiWtV~j8<0PvRWEpc zvdMd|SLIoO3>+Of4}ek3DClA&=UTrZTIOn$zoT1FYbgcO~rr z_)(@_uB_wpW21)Gms0aU1`fCpl~RJJkZ)kn*_sop+VUl8-yELpG3+bhrQNIV8$%-_ zN48|FWMXUN*Z6j^RcwzPiD0Z0zKBy}Q*)erKU~j5uzH@s7ON<;DorCTs36G}?)Fm7 zK2kk~$>#Ueaz_T>B*8%O2VQTAj$sblZ*ts&sod>e+h2a)`*Lpoj-06h)hifjwV+TV z=jm0LI=oO*Ep}50>a74_7!bus3=BX_FwN(OB@N{4*CPWjW>JSz0#;ppDS+CfZ-D{? zY831%tBL9`5xaXU2d?}5m65u#|4hraT^w%&eOWu1)xa|&r*mS2LY~5kcxAbv$m8V) zd;xW>j~_qOzHNS#B%Or4b-LlM7i4$#zRiJYyapeJ4;)FR+VXL)Hc09zG3 zZ+JpzOOJ0R8nZ;MaJ2Xj>UJ&Lv@3oue7IL=uWNpp=Vh?2K2^la23D_jLe%l>z4gI$ z`jUaIDsEo~DRIWn_PC4V(?ZNC<+sahQ3BwCE zLo>+|^B41bBRSG!M|k^9)Hfu^1#dPakpzdYF+@t{faf10R`a;m8AVw#_vwOO*`!PP zFd$HR4QZt`{`AEIq9;Jv?;;zH%AAQg;N2m^@aD~*G&^=UM!$Zts$m4=fj~j#Bv{av zY6?+sU+c9=iYT7}Kp^_6CVtpT4v}ETP{R~km^kIoi!6>Jcd!pC)k=REPQdcPO zl2SUd>JcJGl?;p9=b`akJ|g8nn{${u?#9i#-%z?zp?tI)EB%QnFqrI;tec{UW}W#* zAqpbSM_)Qx6xdg1U^!A(m?eyuvX7*<3UW(!+jki;GRsEEfW!Bw` zJowgm@aI@*B7*{~gjnY-?^3~T{kS{P+Ovv&#*ufgitre1kW#lx(!%p6rS3HyY(Y05U+NIcG4SF`(-j5eyd_$^eoO zB7>7G2S8#p3|@EbTnsN1C=U6M9wLcE%P*i-nCsTL)S2m0fr~22&I@a;(m^vcyhP29 zEbmEANZH2}_6tV~8rzZlA>MeEH2z?W8BhB-H_)h#Zf#^G`l(NF?Gw9Sfp;v?BEyfO zB+zs7dt4Mi^?8l#eCyQ0Mj*Sa;@$sdHd0123OeOX_NU~q`PX6dKN#3~MyeZ9b#{^i zDymTyysEhMmZ!EFBrjhIzx=jyPi`z7+BkhXoIG|Dy|$#DfYb>2G)gYE#dzyxqa!oQ zLv~QaA>A81G|c!)M*pch*8p&{=XmFOC@YwRCt1mO+v9NR2{rU^Lf^gD&zb+OpKtK$ zF2EYCmIp9BTE&_SdCfTmZ06+Wd?H-MEBCpKcpj{)0IIQQ<9S-jFsdB-Swms_6ZWiF5ses{`mK@S~{ylv>@a_@}Ln#R4Z;= zD{luXrgCYme&-0%Oy*v266-ZOrkvGc)-}@EgC?Rn5Hq>*$m=%+&$Y{0 zGu{lXnShk?IM04w;$tB>@|Fl3oc&-D;Ntv7A$r`nHowE;Hb(lfxsUJd%=eA!H{KLl zb$e$@wJB~`$1AocQ0dggM1RTe>3M#}OxpX^&C+l6R|4%~$X(KI)1R_N(YWA?F)_Op zZ}n0M%IS~$YMnE$9M(Sy6$@`VCx5a=l0=s;W|s)5T}B}A9F2f+db5eP4V=uE(BA0C zu0jK`ADq-aidE_tB49iGFZlfDG@|CcD|RW^cTgC3H?@;+v#4`hbO16JojCcR57tf3 z6D2(Tzli$kpeVnv?X$^Jx-6Y8-Abz{x}>DiB_Q1*C8@Y{ic3fd2#9o}r061zbV-XK zAtfTA@jZ4HU&#Y~167=Vg)DFx`3?kIt4 zv{1|j{BDfEoJnP^q6Rit7B<~+zDOkns1EO&520P{f7q}JGhuqFXeHULIuIxlO^bL4dPxmr}m#a;L* zmi3V3&fMum*ytMhZ|PiW7-qm*weGx8GMwwNh>Ryw`M8VaGpXav%o-L2gW-PDl!}8( z206uP}DJQmhzvQ*~u~n_u^4&x=gqfGgZ# z2P(OxtqJkcZY&RSzI)#=@0F9z>wl{`c5`EDt?}j+0JHN}l(0u=jp^b#IWR;UF0BO~ z^pg^vTS8HN4flFzOL&<(t}+oVsFE^>1gz*tZ`a&>Sgl45$7ok zhfkTodO5xoos;?Q%8iQn5j=c4J(U%5%>Mi$5iBva`F5Xg423Vj8Pn6xlk_651X$f` zjGi_!u&(&*XbsqGdha1aYMNjr*JW_a)@@kq&*P{PX;PGN#V^ zT<&zuBFH|S+ud>2D7vds=JIAD*DAHxG5LLrG+OP(#dpJwqYmR_zXNtXPhLK81wi;v zdptt*tvBh)#e?l~m&yx?O!0B{v_vIJLQvBqK-8@Ff50HTS!LfGw^Q!G-stQ4a3bj4 z{%LW=rPpa1Z3e35Nb}Lo6mJTEPu6-gz%@iI_)KEPmom(h^!qLq~M z+JFzg2FHi9Pj`D$+}HHFpGx1X;}ujkPxG$#@c2zEu-*);?o5U?-%QG5iK&x^W$@Jr zx{&vqD*e4Rb%j2`FB>H*^p@1>lTpTbGWLXz2hK>eB;CHKy zI@!u(e%4FqPMypo7mHx*+@o{LU_+#vui2MoBkH`a34P(;NBK7mVG^mUtk|cmq4pXs0cxD5ghc;U?@vF}jNx%HBJ*$jhHFvdz~P_2-BAAPrMV>k zADr@up2%z0DXe*=d|Za0q-iwek~QSA8>#ZFNu86oHLJ_%z*7z>1aLGkc(Zyh&W4l| z?`(15VXygStU2Olk)*Nx_5^y1)&0XC?)Is&Em?zf!KY#`SsohWQ2eVwJ#RabZ;Lfc zHC0Sp4N(tb0TjOyI4}D<6{DZ=%I`1zoSO4=q7h%>?j4uWpb1FlJNDHPmcw=6<2)3E znA#(JLhexJEBa8}V`;&u5(>N-zb)v%PbFH=2C5j;6|K3r&V=^3KY4PL6^!9|DciNo zDEvNQ@lGp6z3G7r(V*yYHx-S2>BP=^`ST^=DKIL;clnhjTNL{Ps;Nxvs5I-bzPZO{ zLMbtN2wqo{h6w?bEbIV-pH)Bd!>A=-Sy4F=CqQf_>!ROf z!T-NKUg+VPP=p1ndIVpP5Qg7-EV(Y%*^g=Qq@qQ{DswF8hn62O9c`S z&5*Z0>P<|^+{HafEM*{C?0qPr0#v>C-~CXswqLV#?+^%_;O&XA`ldFMZ&%MzKlNVx zqtvv7YDNrWqmzAQ5;Kw~)}g2gNUWrXFEwS; zM)meHi2b-UPQRNcY%PGR37j0Hq1}uk^sf0rQfszZq#Jd?qhAx2ks!Lzqs}#148(lk z%QREf_l=l(y3qQg`0EJ#l^0vKvf4N?RQ!%pCIY4n;#zqyP@8U>K^K!;kZzrNOneP+W>P2CnVpe%};GR6MUIzC-i7n;FYn zyTk`~r_MjD7-zjyu21xb=x8b+CjMf*PR`?e{djXrEdV`(b} zHk)7cr}c%V@ya&rbiXPclcXLl>S}q&rlqXUjM1j_+KstaZFs-Lp=L^pzyCJfeHP=u zuV(Jwen*QT#bC0YsyZg)c9%8Dn7BioGrHR|!;BgIpR1DDvAnG&@(krwHe!}#27(f# zmeiZp=-&IPfDU)BPXUFEH20^GBUNqJO0-bicY0;Hw!^DQkbGP(8)2ZF_1@k~=f45? zNI~r#K=d$_bb%8lsZjA&`a|Mx%$psOQ(uih)@(YA_D1#nOr?5PKQK-&Q_< zw>g7$w!T~+If~pDxs~MNbV+%rr}7zP@eQH4sSGH<<5t~}Sw-6q<(mkA`ObnvlD>b= zfm2(Hd0(x#!hynz^Oa(LeQ`smvy2n*iK%c2>z@pur4Fy&bd8m}*mXJ) z>^VO079xalK$j>8r3)UWBDlnelq#VuZq2|~Eh3C^GwipkZpbJb_Z6(p?Z&=Tuo+ZT zt&VDUE)Xj!wp#Y(gNoLwW#Sm@(khra)o?C7moKr)t`;vLC3Iw1$rsy$rc)yoasr46XJ)>wQ^b)ZsL6&8DwxSX1zY{4-39P3O1Z zZ}-yJ+qds7B*I*N?_0*u8Aa^r3h=@i3YMTOGFvIw$ddKr`0I22wJHXy%e&!{B%_rK z+vI&2Fa42PPfU5pfNl(@l0$5NZ*N7&cGvOS!R_02Y8O3h({~b2esM)DT*0Fz4j112 z%<30bAv1-C7oS(`gx!xZK*H6;Y?dc!@EJ^0F7{8&khE`*HyOx~?#ojZV0BQPd=R07 z_~y+%)jz4rpR$~fR=Ne;EE-=1ewQt*Tj9r4_~|&IQ>98$fn|ra>8{;ex5O3r^#=`W z?~8FuR3vC-agNaj&56q#QtsRJZf8p84htz4MTJJ4=)Mq+REyXZHrv~cAf$zyY@{P5+ilp??=6 z}0Y(p>)*7YY=od|;Xwdis( zhlA~pUx&h+o5c*3DKl7Fh?rOn-WS)|gwzOpV$8B9jn6>^B`po_o9LUa0?)ceh{$`{ zxBtMT##9g*;`KC1nJxUZtZnzX1T2!IY$VAvF$huZ<>Kh%GwKXN^YgWM|rXXfDbseR1A4a7oUm&v%=ok%Unp#Vp&}skHa4DXlFlPS6X3IjkBeSY1jVe(JFk1jsI{GY^B(`x zgw?&1aQwKDc`akB%<{K;&PpLK-UZGB1Dd*E1Bau}_S3n~FjvT@rYQ8aQ-a=w%B-{1 z;>-!|f{+lGuT&O^flDW>gt@R;Uhn#U1%i0 zQ;qd80Yx3Uvv^R9a{c-GX(I3x#Cxb?Gu!qRDhp%=1&Vol>|S?+puGUES9 z!Wc5)g!d}i&*nN>%rY`{vKjL4{jO7n5v1UdQY}YNt$IaB+O2R}81#^CDeY9XQ*>GT^zJp4kJ8__jk^AJ-zNDG1O`m8Ub1lC3 zOP!2;_uh~Z$%h5fLfl;|&I}<2U02*4v26e z%T~wZ9!Wa+awo2^>yHI1ifXtMBoT{L--lkT(tv|+&S6C7Ajjkw(X!ubwdH->FaRTh z1Z+iFW*lz~g^tKJO9CJk1F|9vm=e!X>!|6dp=lt;$SQyJe?$MZ4+_VU0m6_cj?{;? zN?H9h_(WK`{QYuQ-q3-EU$#txB`M!(_zGuNLJ{#Dm!WbpwT;@-SUukyp;8rzrWZ_( z;=w;JE`|CBj(+b)PwIH=eteeam}pMe<$jT9C8<*RnotY*Ez=JNPRW%Y7bE#+Cexn_d$%STp4( zBWHHBj1LWEyH#k;l-3=&bUs$U9pzijrd?SV#!sDH#70Yyw^6wK%JorhX0yr*e7cdw zE4ZPP!u6ck;F`GKv!H%Qm{G=7?<{LKVCj{JEP&O$WZcjWmwu%piygEra!bqNQT(&x zvj}%m=EnP{x?+4@YzDBAQNqNZT_*0E;(u5#^5b`Hhv$*|GcLSd+?>qBY$je^nE#{m zc;Cb*2VT+Zd#(gPh8$bVG&66pG7}0V7B42>l^{yf&=M`t$0)cvb<5BE${j8rB)mCT zAO>@}J$FbG>h}mviVFD811&~`MuH8iqSH7f%)i;WvG^Fjt{XX^C zOQ9H)mi_GSB&#t!wU^b`tFw3<1mdP23kW}Rcd-dh8f9v{es}-N=k25it$yytJ8Bh< zmppw9EV)cK&u45BMk3o@PhCx4i1#lT)xSk>6_VQRtANYC;i$qqm3d!yb(7zlzV*FT zP^@TiNFsr3=Bg#K{3S(8xcWr!oCv#-l_)RaW;-2Kr|S`KHa3axF+q}0b;z4=h$pKW zT<+`dLbRXxoC8|cw|4cMfQutW94j4Trill8QmcAX)uw^+ptsfrW{jtQwK90M=UN9a zL#yQ%yFEu0ihK6A5@$n7!3b+ddv5ENJHg(A_3s$!t8%r0h;_RUj(BG6K7{}2e!!1%xT z%fbKQFF5F@b0;sZGW{+3oAdV>guEm|Uy~v9B@OajjauxtOqX<~#L|gZ&ic5tM@5{e z4>^G3Hg$fI4^HKeM+@z4g*zE_o7U4C>P|vnsk90_V>e8v?(Nj8?vGuM?Ot;{5W1FE zbm#4iL5Ejmutb6P;gi%$lJ!}Fu%&*pEfOZz-rS{?vu3ogsCLsy%8#Q z&aKfxh#~7ulLsBq4DM#6O*z7PixsVb7OGB7LF=t-ZE^!&7%L2^^#1jh8iV=qtb=5H z6s&+?YBpR&$^%6q2}pSMiP!co5y_!^>)u_xdi7n#qCR$#N<^FCXG6x3oi`_*0v|aD zBi(bCVsVezlTA=>W@u>a;ousUd0`7rGt zX5dv#*|nkJ@ysQe@AG7bAJQ5R6@v6-?vmaNpC59K!?E4_aK=b|Vrb;QhK(uio_2`ii@$`KM6wNUm4I z3(iXKB{I-#D~!K>Zc9J~jh@q})kcsOIuF^bYiWmBl-I{%glZj-ORXMZl1BmOO=*h; z_z0_kU=RD1GGOa6v>MMJSMu)GENKZ!4O1y zNqCq^5)5>em1O0SI3UdIYGB~I2B$c3)=Wb5!^7wgio$+FB-&%omHt- z*Q|d^_PojKZdlE%sd-ZSST@pI3H)0p@f$@&oXb%y`{1II+m3Mc1tMvY5Tf&_i)hkGUrXFz=D_~xc{*K zF@1@+RWdGnpJ257oYIgv)^Zz#{{_=dJ#KDYxMIxkGBakCHD(+Mmm*f$0w&MH^)%dfZO4S`iOX$}{hoXVgcD&) za5BJ`AlqHvK^B$&X3vFVE*Zjm>iFP6+}up-MI2Ftz2Ekw!-o}q=W$_ z_V6X~^6sL_TdnT-UVgT6Bq%BMK6B`U-d^DbYD>Lrk zTj|e=WZ``(qp4N#)K>q`?xdB~_OV`SZ!NY*nJtT(eZNn=PjttUDJxaHP3oQ}d?8yV zWcR@6rJ=TR7akiSSR8PLOMrbWq!KS7YpxVaNfY*bj8w)-3o0@S>WS>LssctUjJIy- z2b;F)+aNc`f8gBihu1#t5kY>*S#Ui&@=I>$4khh<1tmsuNzye-4@;#?B8$sN#4DDq zN!Zm}!jp8lbXO}IMWeEZCGNL2SL>LYJvvKdjXmS^sT7uP)tVxJ!C&~6tWra7r?p}E zIV)Ho<8wtb(nwX!Ak*kREN2J;_py)9vm+_d^nY^=_2_iJ?43-1KSW1ZCzFrXv?HFmw}Nn+R}JDv&a*6)= zEv!R#XduvZmCJxuSP`uNk-t>8BKDT+}+?$4M>- zu>>B6uj!9h{2!3VPc~4)mhqR+<^Uy%?mZm+?nfEObxI z2ke2Bff>Np5J*a16B&pbLzfIL*n*nV?^$Txc6<}9y4vsOynq1)%>InpQ9Bpr=?c>j zh3`I0kgJ)i0VqIYLBt~SVIJS0Y|?)d=LZNvGt|TwR&&b*FStoNR;i1WynyHzPGY_j zAMfNj%9N@HXn*zv-D9Tz>=x)?#4}&}Q_VSOSR5_Gg>72)&ALO9pP{6Nxq(O=PQ_V~ zz39H!6tBUBSA7Ck&C;HZ`mt74b$N@2)2`P9+%hXitCqr?W#6RrE22mDADx}|U#n2c z35(kmO5}ea^*$%0ylTQ7V-{@1vF!URpeO*26rE~eY%)L~M|rnE*HN$=H@(Aln5Fb6U3icuJvwZVy+Il8q!NaZS9dm%+1c z9)6qRdi9D^3qh#tUj^7nG7ez|21GP-wbr7g@{Q=xpsgc;0t5xEkLwKid?-h@w`4G2-j^ zaFioocLUrI|2D6F%N{G2NF}qeWHm?8f~{40=f)ulj0yx)|C)xhs_VHD`;}Pg!$gvQO%&+B?cI zVVjG(UNm$b_PH_e(%^Xo+MIM%w#f&*N$9Ij6g|>KWOh(0U4T$koEa6C|4F+yEKJ1y z_O6az<2MgI^MRz*w+bS9aB;TRN&@QLwSni*l%E5>{CJ^g*(QS~lpw;mB8nt*O{9=) zFz-T{Ls=HMqUZUsm!D=X)5{o>Tfj2?p-UhXW#6eVL91o~%J9oTIx3ClCN2yvq-Kwg&wJp+>o-WF7tIy^`;6G^(+5)u{Ou6%e;!0iS-bF;&YU^!;v{Ic}*#6lB#i)Df#Y;{s8m^ z1f8U@OmeiU_}aCasR0FXBXIF};9&aTQhIFgWBwvG?#t%4bw!c&OoL64eJ<+oaDB;{ zCl3n}y`P{QUInBzt@OzWVU`(d)Xvfb;|4}lifw54)CiPkwXbWo+W@VX3CUrG9OKdz zwH7cGIad>hWUV)6!XctRXN(hW-K@)k*NmUx3D-Attd^>0VNfBAYg32Fwj2>B4fveY}l$#DAssn5!LgQ^-You zhG{HakYnW+#Vrn8hn3Ew#5 z_Y*-Qm*goISr8WFBtr5{S6m06Z|0gYIcxU?TbN)8gWD}>k)Lqxwwu9Jc`)BcRpDNc zVs0x-j*V4(BBaLk?&-rNDIYs0BLg=_f!5Bq+x8D9)ho-Il9?Yq336|_ux7(&F|)be z^mh25F0Kfb{57F63@tS8wT+Spb$DrG>g&WA*S#b6GsQ8}v^4Nax3z2kPj+{8=XTA@ zrk*WrYJxFrvqjzt;XyiC)PN7q#>(Rr|9m2m#T>O}Z?6`H5O9k2+}IO+9fo1GW_z@@ zeutSo8iklG)W^`ax{DKq3Smj! z)c+ys7=}qs=`e;nTVYZsr*KI(eC$3E)WN}BsjrZY2oXji?TAK_Dy~)z#YhpuA|!zd zQKSXiZ9;`*G$QCdIl1`bc*q>43sN=Zld43M1KF+LM#IT@gsiw?eE=>sL(LYpc~KGd zPt^d)u!^kJ={vd8et^g;%#WQ+kM{^?D6gUY1G|CYEyJ^rye#4lzuQWV#pBO#is z_zmK_l7NND%GT?P6)x$QMn84kMfSLQzEHop_U0me)cpM|>193lu-XutK zyp$ir)RxdUxq+J`jn{XYrdN^RqSU{bP^9K-HbPV-oo)H7juB73@yOXrl1{Sj>JnzPvfa=w+8YpK|KKMtL>G{_|R(M%~xI8<~66c zpz1Br$dG=Qnfc+mPsU>*t19Ov8yfMau}pwnx?!u)0J%g1TqIJzy-6{xnePd@6O@w# z-Ci!Y&?7KqUI;@>^z{qF5FT6*FOaVwsEY$EpRU)@>h!j=ohL&zp#ntr>yH>`=>F;C z{N&;X!+mYbOX*BoHELQ!P;vkr-cWT$13pj{xpA>OoXQ$ zU+&pb<=1f{++kd|8Isjh&Xk{-53Df4DT^En@5-i&IaU6BmOQ=O;udW=DunZ$vN?3O5#~S@; zYgU2L1%n+m@xa)IjZFAY&u^Y35&6lOm>YaFm*B|{loQ+JK~vlBc%}6xg-@vRYy=9l zvFR*DM6w}`1TAqU_cb1z;LuHkgj-u$km#!Gx)GU00_efy%+Etwe>^nw_wi#mMkn;K z0KEjW&M1L~8bD0{;cxx#H27bbhU?!+|Nkvf=%G(Ki;QU&h!m3r#o?quI-nfryMn*f zn%cHjf7?P@+p5F^;5ezq*&h9{`=r`}eSL$A(p1Dt@sun+KmC62_7&As>so|LzR?<| z1Z2~D^p(_Rak=R3qrU#PDp8s45}VrL4pFL3IlR<>weofu?b@_h_l-tIp9QwlUbexP zp8Q69XDG(>FPr-_2mbV5cd3ed@}gJgo|V(BCPZ=c=04*!-LGosFx*2w8p+!VmwWQu z26QeM7%+TxE88ra`A{>kVp@E_vM17FTH!9C6PYi~eV&+rxcDAiL=oU^g7Gp4s~bbK zX7$Ouyev~{G*L3H4~6UDFuaqH$*_W6x$#^l@*;%*Z} zCsG|5OVDU#AS~^*20OK+?{hFANPQJ4F`>xbzT?BuKKE~LSrKOlEf=o;jJqfe2!j(r zl+2BY_W>tE^I92Z5?)bU>e)o?pK6rKpHdcc2xmc`hQt^j8e-cMtTBJ9V}cq0e($B4 zI+Q%y!HmTA1TZ4Dz4zNbP)MNnM)F@$kng&O5`LJ2L<0Di266y@!T3KzX4XQn)u=A8 z2pr5csC*xl+M5SyfC)#KlWaTfh3*Wx{+ zi+oXbuEH;g$O5f zZL5ZuPDaaBIz67*be(@OT|LzBs&_X|iLa6&I?3#9qPmqGNyDFhW+*7}*&QcbYj8%K z$}ms-C8k99{m1;gB_ofwY($z_KTt~eL{$n3-Ey4Ie2;LeGuGhM78;fJJsa*7&At#x zcr^Q88`rj`kJE5#^D5&-g@k@JAHP8?Z#ztCw%@EEm^-QD(>kw*UASiqNU^HIp|8^-$Arxil>R`FL-vl(d}C(Qlhj2 zB5X*{E=BeX^duxDa5H2Vl3%&+US^Uzb=FMdp$mUdT>sjKG7-fMW)4|y#!6;(Vhq_%d7YMU^K2+7_l zR8L>UeQEvl((OuEuYAA@A>06~{pQulwnwi@&BYWG|FC?eXyMLG;yYQ0=fA{?6BqhQ zIc&{r$OIEs&1ar+-oPgXh}VY;sLR~2KLW$=$5AGXoiWA+?Ei^gOg6uuH4AummE(<>=nE)_CDdH~uFi z?<^6By_vzIe{wca{M+cRwJzLjQz?wfpqsKuYvl}%6{aPuzHC_J5v5dVl2RNfUrZ&w-Oh8fc~PCPd}@n4}_OiZDSI>3C-%)*wftJiCk_Qzvjj$01RKAwZh=@p(C~(t zQ$~T|Rvy6^@jD7eM@OxI$asOIJS;q}Vz^1Qi(=UOeduIR5%0cg2pvozx*uEhI*OGRTau*c-R8?;GFl zc!Dp9HNXX6mw)~aA`x+U(ShZ(BS1(RPZp4~Cct53qA*q(Zwn$3fV|a5ttJ=#?O?gB zZ98p>%HiOn@Wqp9H(p8|^wLX6p@t*&4hrg>J2C#erxd!o8CiTws6PT?{TaR-SHal6 z8J=Jkxs=fVGxx5U6~=p<2fY-e!MrDCz~<2(A3%0_)_g?fpS zyZR9yGVYsDy=UxyZW`?UCMEBtZ(@}Yk^9(p6vR7~zJ^^5jW?gl_;J~^A4Tv_z#tq3 zwIf(=Q|HtipFd(-lcboXB%Bmr;0-dwBeUi3Ux_{Mlr$8TEcF?67GLY{y@}Q{2oF2V zDR*TR~xyGCov@ zr;LZ{9%T(Xh=P04^4r1~Si)M%Xea@VYM_5e{l9uZ>8ev)7Q{mh^VkAQIba_N(V>W618@w~lZb3>pLfz|O?ZRxe+ zu@}S!mQX!7Z&4r=u<_$poyK#XFj@?#JEM4F-Ej|zM#|A8NB;NW8Ictq2RIaAZ{rCJ zv;2@jzn-Es)SYQV_ac2_2)taj2_XD~lodQGXO@6Om+P_C*(^L!?l%<7V&_%gXWgEC z`1ZtoSyc(|ZKEMhK3QO@ege+P(3oyXjnuw&BSQqKNL`j(dO zGEvT1Y-pht14=6{9mr62gFue2AWr3#68jFlYC-Ta7d#~zyknKuX%`AeLi~ADn zNj)fz+k|W&&+LmlQonz)D7IefFcnpse(L(e%r1AhJE&*!k45c8TUiztuTj^A4{2XN z`Rur<5tH^lG?_-1*lajnFA}%jB~qn#u5sh&U$cNOR7HI zC7E00_|@TE_oPT=HNZ=({Yto?K*suiEM4RIuX8adXn6X`#+fvJ8R`Q-?M%U|v0c6s zjOWk%RLu=5!6j{EGK`SzY+Y4~6tl~by72URuhhFzHaZOwaG81X<`L(2wTn+hq{zt3 zk**QbZ<>SdND?yC#pEVj8E5SnHytI_>o?IG@GRt2XXlW^k6|7D{)l|aF!E`EA^@pD zW7(g^ZV18%x=GNagDaxJv9RLd7+peX*SQb?tqx6yw;UWi1HoT#XdfeR)hE64QRkjLk*p7-B24i<0V>rV z#M%qYB|dNfzM@mn_|9$xZnmSUT>EeAqN8yIDWycA=XbtTeNYVDemH*b&I@$}6`j!F za8Yt8n}`G!0E{q{_LoHT$Aqd$LTl zGRD+`OXTBSmTa*hc!!kESLN5E+kqbqBB}escQZ5T+O_%mc2;M)IED%WQ$>p6!c>)c z_cPDymM)A?!!RA@e02OOeaUf}3uss^e|j*iOz$P{Ciy5Ry-C=5ypncDpU>rJd4IEJ zyLW|T&PhYp8*A3@>o`{Aok~JyX$|V{6mfTcr`7c)6kv4?5A;1xl4O)9Vby$$w)~^lww*=BOSpRABog8dvn^ZV6(lLlwL= zqT+%9_iJ6}--UOG4k!6Yzi?($NV%q9{T=T6;W9sGDwVIpa}@(2Y$XRq>*0~(j|F9; zfJPEaZmmB>lnqWCNGB7-ZQ4B4x<}kMJI2(5j?jzGX1u_OA8Kuw=6&wH!0RX zkqaS{=bi3d6d0|D?UUMrJfn8};*7JS)A*0?K!6&&p-UKm+NzK$v*8}95s$-6Z#W>y zs^eMMjP34^r$rald;I=S$apwz;$!?nxjHYFO>MWgXh0UrG9q33u$J191^+b(a~=wj z+YQWmrI>Z_CjIGKX)0G*dOaTZ8JiE9IO|t=MzX$EnvwDgS_)+cF5e>E)e4F_{B=Ky z$Z>sG{CjTA_V?!R0A4<2BI5M-Q4i_tf6|UH({(((Q}u)Ho-aqzn%AuJl_XVfo%L2> zP5*J@@xzO4-bM!3(7hkZ^c_%$z2_&u^Qrb$m58Y8GzB56cDak^y$YQTpc^Z|-c$bbz;1UPZ2V z`B$lxw%FjN#QM+ADM0}!atht9Q2BPL&|QEn;^iEAes8UPhK~6XwGf%95VoYmzy3S- z9DmpnRm~Ea4iPqg^2t2T4uDWSZJ1mk%;eYliH9c zv@PJ)NQeZ3`;-3qy3nfnU&Kc3{}7vhyIP`+zAeMwSAW|fQB%#|7k|tD=0T{$s5QL=xJy%e1%2(ph_6syB{X6c+#eDp5g9^(ubrMBriNG@m!l6!6M z@F-sMi;9?UCWXYcw)$4KVhwQf&wrDJl2rD+5D~K1am3iiseTsJFqtbbzQWKrm%`-& zPpc~^`oramksybGj{JPj^v22dOi`DR!6;f2%^sz0q?dxLqh`;B>u(>=3L_`@kNr3waEm{&8ghh+miCs@AEG-i$y*_(IV#W#grDP>cUUhyY zKt}z zJP-zuCBWkO@)EH(d6nmM{$?Z&b-yO|UIZ3{w3#g^>EExM{KOxvvZ#+Tgk}9RSse)z zgYFdo6e^wol@c;HwES4xsoMVHyS+u$z1MRNG*gUuK}mrQ3o%l0fZOl-ziM$1vp;gJ zK-FrB1k~;!=X*>YcW3;N9~>NO5nzC^lWk5_J8hyV8wt1$x!&~7eKI93n#>|1778>& zcv6y=6_s0B&-cI1BPsQbJXlazA3}i7du($CYeNI`9s^JBjt{+0F>_0xwR37(ymmB2 z-%%^gM?LNnG{+xXGSk68l~)!-;O}~>M3}BKGYpD&$x{@4X3dmqkuiBq_sQ`lvx)MgVcHu)F(wKvbeRT{sfUM^Y9YPBhe zTDtUJj)N-~LsUy^vWlHB)EV_vL>FhVd~TU0OMo2FOa}Tp{|V?|pDboEvAp;u%1`KP zu@L-X&GLog^7cyJL)zBA^)PW=G;hzvXJO_9g4=QUJ7-9%#K$0#w{iQTbXcCY3X^ig z_`8?a)Bz~9#^)Rz(ENI)6^(P(*n1zvs&wE06_)hCBRH!^a(*|aV_Mg+ zFvGXQ4fvfzB?m!jz7gG}N4b{y9qBO1KgI}}k@%|;G;lp2$}JWo@|dWn-OhLac-sf1 zlgG3)MiIy}ukC#!-{aP@2eFi!U6uB7tc}BB}^#| zwe12QwpE4&?k_Z60qytp1}uKM2rC@PUiCa3(g#_S64B4TL%tRB80Z;Vo8Bw|2QSK3 z#-Vj~&zouNcs}%pB_&l{IWb{p(+cJ^N^@Ej7SXWdjpK@oXI3IV zxA4rCEX&)X>S%dOaZB5O0_&GprE5O;5bab(dbXHb|rO_iQQ|Vu0@GTHs89DGAE2j zo?aq3q>1O4jIXvboX1_F4aw9T8gwi`QMT^=Wgqnm9lKOg_;>m4mfCWP2yl1{|CyuJ zAx@_VhKeZWx6{B7^H5q&vi3V0jbpMT-Cut_!qw-MwzR3SDbXWTz3Q-?0WljQHD!cV zkVKQdevkY~gLfRBV`{f`=$kwQ3(C2n>wL>bzI_@qtkke&3$iNeE4|cPaaHDgyjT)W zCL(`*anjA&8`19yKJ%CgTkgd?vnZ3}n?Pd8DcL#UJ zS)@=oT&GY+iA``AK4pf1L=@TZE@LsILuKcA7xa$Sl9yU30ve=8@jzYTnQQLE&SdtW zuZ-<`1E|MQF2UBXUB4+x-dcH%CVAhpO&%vcQ8v9GWOJ#pr^dgnykcgR*Z3YbzKv7V zPr$eyj~&k#Y@pUVh|GFOSf+P0y!yf{Rn6V=&b;qUo5eP{h+EMHl!Whvd(QXlP(U|A zgufV9mP|L<_LJ3P?-;AfTE~SUfD*B@`#*0yV#lAQ9$_?*Ixn%wI}FCOQjd`Hr!d>Ap*@qAsrGUj<=j|XsMh2^1%|NZ&hGVxj? zk5K#fvR6!=6f)^cPyGHCYcz30UlAP@g%$xV)Ih9|q8|>ybHic9MF3dGKp+HgLt=>M zE}~??!1Y=TO#y~T0hUZC@w6py;D9YbHsK)ZbpVWbg^Pj!&BNEqAvU5Ys*Aeb=89Z! zg+VWaA@%H@+=7flCL^JcA>!fBm3QBN(t)3FK!j@H`z)}of|F`#gIpJ z#G!XaPFqYcIGDZLA`wgiKl>jrchQ7y4Z@BU667yTM4(%peP-(s_qRqBza5tc|Hs1efFoVn=u_Nboz zkch(NT59hxJ-p{;_iG?=@r#^plp!J~OP@8Ji05fxvwh=-L2)+=IY{<;4d{dBnSU=TNyV_gAuxW#A+gSJhN>~Cw`jLLdHdiayrcI|!JJSZ{OlfyUS zSo-he=ja<4)^MNLKJuBg2D@?$bevvPPrC3yEw$7Es>U~kRf}d%^&w%>SwLfHYLlKo zCeR_OA+C`nN*{ANVo;b8pWgJ(h+?dxn;1J)Tm z4L8a1&zZsbw~k&r&rayunu}=Apdr}T=Ue|R90ip4(R~yh7ts6&Xq-35;J60ZHRu)t z#%BKxoC`k&;9)Vzu+tk*3q9~uTPLZd?MxQ&$(_pgmu5qBj(S4*QzQr=t@O>am08e2&p!J z?Vue3K=KSkEE)iXv*(5HfK;$B!d_(+JOKt|n1X0PD)80pYu5&W{n*bo&lKbQSzJv=J{-ga1w$5@0Yxkg8(3wxhYa? zq^vEtbd*@{S;Xq15$7-|sSW?kEN6dc|FmKK;&kg6+nPf{tWFeI#q`|5uxVaXG&o9N za%0J0)iIaggt>{)WK7faSd{WXhI=b3vsRFKrO)zlOW;Hxaq9f5%$eo~Nyv~+4U>n~ z&@r#Hj76M!qkpn;s#2N#<*$wn%jvOM9!`UiOrou*IW#;Nvlv(W%=L>@Gm|s_%DJXC zk8YWH;N`ovC>6Y8%^;mTkR1HWV_BUpMfi2l%2%xAI1i+8JkX^m$Jf5YWHc#nXL8cG}tA_|ETt>+oRG84?C|m@|+2p5reNee?4dinagt z{NdF%BBl2&?kj|(puZ7;K&;r@ReK-@23GErS7I@ zb`M;9ux8sDvyPzFD|Pj{W!rWj6K#b?@QW0HoSyShk51vnU%Nj#?gD1{^RAen?fUr? zq5>@02mFs`qj*3J9~7&n^X2{<8D!m9PN=bav_dRXC{4mnj^w#Yi6PI=?=jIDfJi~T zbb7o!=#;wlIBog9dIf@qf|hWK75kR&cE}6!CWTK7YFwoRS`t=TL(yFJiOOG=Y9b7NAp#~+T)8ih4LjGg58dmzVxvEHM?IcG&V^+i$*i>0o%lYt|{PkCr z;Wi)h($bJmDhN{%>&2RU0)!pAEIh&f&>^7T7RRTx!aQl9qleqxR#;JVK^pnZ85?Uv z;%OLdJE4lnXRHWN1QhgPEQ(`34@5O%$|=M$(m z9tYdAGki10*RL};@ZarUX*Forn4<8Yo`)iwFX&(`72)!wF>-;XZ$a>YN)gfbUZsY--t zJb+W!yxBGo9LLks1$L^AQ22z_o3o>+;f3-;I~FPPOP3D(3-nLv=>WJR$f`qc{=Q z&lqOg;hPbOm)=m)KUs?K>eSLxFT~xly3oK&GLIgS{F$$Ode^p}t z5>v|zqT2#bbk^-2-xOcD%!Wvb%Iw#Wki^q>8+At%AG??o|83N$sYcF~zZR^Isw#ztx4HVtI>9G(MHs+kPf=mXOxS^z5RGCS-RCaGA$5N`y^P7x}9^5(=R1&w}7L2b=V4 zxpB;5S<1fTDa0E{*uy#c-pGnw5TVgRKgDTf9IvFiqv|qdiHe+a&^UDfeIhB9;ZC`j z@#vyDl**%UX7V5@U-tpSDw*LniDUa)>lI@@dXILuPC^id!QyoRc z33ky|-4gYA3aZYiUY3!t$XnUd&5VFcT++>ro6T!Fm{@iO)jTjb(0L1a&`Le#_u>kz zD}scoFle`(PsUFpl2BiE100St70H>f&j&Aop@5o zBjC~G{GKu6FX+2|F~*=Xf`Kq zxO-V7EQJM$aO?)m;#i-!-?g%kmG~4GAr*iJD~T(CIMWV3W`K87vC7E){tlYK%Y*v6 z0Qy+};s70v0n6P>+kr$VS_E9@^EL+HCj`9eBe3{DcYp!dm-{zWkX$vx#;Jl6t=XED zH={y7(%A#`>y{TDfI2oC3IUe)JEm#6fzkw9kWT7~1Q3Yau_Qx74{r`H{XNa2fhfWv z>e22yCte&3p}HJ+kUN`(OQXU5(IN-a?q3u`gQRfAV%2uYm2-4^RFE~G^bGWl#iic5ED+|y&sW}2mbKy(VH<|g0io*wfm;K$|^zT25 zpkSK{Bkb0vG|>%40=18zZ-#C`E>J8o1R}n<=5WES8sd!%mmW@w;&)5uv(fWxP{9ln zP3cHTr)=Rkdce!^CEaW60Gby==C*A z4(ko`B0$FU(~GcRN=Cxv}HQ()KqW?K2+_HxOu;v z*}z}bS$wLzpM~yicclILz{P#9C&(v)10KOV7m%=4jVi8ql0$!;j?oDY?3}JyTsR{_ zQSMoL)_V+ggM5anV<*P7@iq@FvAfeNMq<(_CuMBdNj4sQbWn~_$s*CFCbwyF(dv+E z^>l62N<~#L4d2zga3YJDM9~<&<8Ze0^1DaQ(ZY)8JG;mQDY8t^X534gihEHdj}j{^ z@Acn}lj%6u>+M_9>QL?QCu1M%1--c7lhc*-ix|{xVDeqis;>UTFrISGhtm+9%PZTK zr9qqM0-}4{vPr~%u<+JZC_Z)DMlzs(j-U+>ie>czL@A6B zP*4vo{pFau-amdiIIUSAq0G*K;B4+T36ZsI(Set+7+-@YYa#D*M{&#M*PH24BKjf9 zd6YY>wv56%77x%H2QW@q-VV8=0+~8rgF5ZyQXKdsbi_ob?IWRBPNcH}JE}rCKOFoE z?lIe%zo0vxn`0cysOlW+S}-;y5`fv*H!ur@3>Nh5h`W~N7>yK_6ZKGM?8V@(pI-&@ ziz{^xxjcjO^{q%rKg5lTP}T3`XT}PAsP#1`Q3zmeeJL^~46(&qD!uvwLTY z4is>XoYYA`gY%e!+fEs35FYsZCM_$Dd-*KT$Zbd08&o$nT)I$^5%xVT z#=Dq!hcjVX7dIf2e=k-0puN-?vaL z^^Gu3{wd2*rw|pzJ!oCwV{dL*TCkU^()?5l*0^{oIKnvm*zaA4VvE~}W%o^Ow-y%m zGbG^Ivl8tl63t=-d&aJnX)D1@CW19-8`<*hFIeec%(Sf~I;DIm9~4!ttaxBZ!;1`8 z$5gwwB*}{;4Xt5zvqiZT4aOrB1bRmM2M3yQ?8UEmxL(*NpcOeXSkvs`x72O_tA;)8 z9ZjgF`kYyNyIK?vn`M4^1R1~|e8K&#(mU((97Giwx!upM14)!(e$mdL0Zz9;G34Sk zO^I0e6MnO-=(0ZXUDHtIM+L8CVB%ordnWK>)6z(Xbk2gK%8Q`3={2{wxVD6GO8vTd zW$@!R?7rO>k$Ysdgu+IoK!chVNi{%OsjLP;3m-n_29USh2fn@%lz{?SjJN*Ua{;v& za3e8*gaF3Nzgy$~fr_sKZf3yj0Q65iTrn|lDdHy#*xsu55v&rQGi2K@uVgRbfMsve zZD|XNVhl!8 zY_;a|2ub^nv*PB;1wYkSabVF*~qE(JfQ9yF~>`FQKJq|YD(Hrjl2`J3xl$Y25KKIEW$;^qxneK zm%`1WtDU2Y)H!>y-%_;_qZ*dCFicG}C&S_`XZHz#X}w-bdo&bRS(ntPzFb0F%A;aZ zLdc-BHBRY$$v4DC?%P%as_7Ro%VX3dsooVE78zO&rX~1?SmHm*{_vPI%0uuSFJMHA zd__tN$Q|%wN9ZvSOpGEKelbT^z|+yld`aW*)O4F{G6#oM7d}}%zB#<2QZ`)i9mM$E zR7EwgKUrXUTo=a&5E6p5O#aQ>V;9-WDU3`|p%=h8!cBrf~Qx z;r?vmCSv$r@jDiesJRG>rz#^!kO|D9>hxZX!lrH+FeQZO9CIzsMo%vcZ#Wn#7#Go< z<;Xttp;}Wh)r20OS$RCt;w7Vm$h@qvcyy|F<(*%&q-^W z(I!;d2`-Db2T){Gl#YjEY@Zk1);h#S8MX!f&@=;v<6QcAQs zT_?W<2W2WcSKV zg+9t_)feR^0m_$na`N6*lPbC+!tof`NGDOZp}>GT0LOMIEl2=>)%)ZxvgCfaTaX+O z;RLlpN2LwKdiTg^#q@bNKIOUyHZtt(`<`(b2pSVv z;=+p9hoZK?+VKfL74*?3`3qz}Y>rw~@Ff7C?%Zk+f)cZl{$DJj;QwP0v|!ZH*O|Ld z`#1V;D2PVnfO;e4;3FT@97+899Q5|p6&%1q*ZVK5M_J0V@X{r=U5^Bf*)?Jn=Qc;r z2Nk}HL>FdO;8#%KhsGFXXam5J1$TOefy+!h*W=|z9j9T718wCb&;T|%Dc83>L{)}} zC;Wc)>t9NMc*~Xfazmq8h6axE*j&!2%l={KndW`-qx*TJBlZk$zpY(9aSY-W>om`r zj;JsX7I4lie%UUS8E-8G;|q_jg|_*TEB1;(FdzAF#cCvlX6I17JcHTP9U-RsA`1^e zUaDR#!K=s?uGlcVfqq^cN88LCf>Rn|ruqDeR79(A?r2w1G#5lur9Z%c-lpbkIx@SU zpXUKR5Th5sLkSxnw-~aANp=%dntX6?pirX!nu86M59$EjWaRQyov z5fZQd^$lM7r{u$T!a8i9vmwDZI~TaA%c})aZDM(4$)jNB0pxi88yJ0d4>((j_cC3D z6~4Cfdi8nX+b2EqN-6C;$ZHcxpeU?=zLf|N7e+zQD}E5bu8aJCwgDTUbsarOeoy*s zJ!*k#!;<-e1Y?wYucd57GDGP^<5upI617QC?uCk|Xxn;mUXQ7~cz9KZR9*|Fc8f?| zt8uB6eM&`3V1=RvDXs36%>kFjLj41V7-BskEo^;2Md zRM@YN=>m`6z3;s^{Z;q-*Yrat=s?@Yq|9ha`}+&2*HjR3!$P^QsDTweJS7)7{qXQO z$IV`AYBXWk3Az#=qPLa65&t0mMxDjLpI1p%6O9GyK>&TH6>AS+LIA*$YS>8rzdq2P zo4$OzN_-&rbw}IFMmW%$?iVjWi4;<3wMqKmq+PhYn%4(aIYLg8=yA`u2%5Le zT3WLy%zkmVs#9^oq6PVKWARU!iO?!um<^k{^yVAPcS11>>2g8|e1jY6Fya9Lerip4 z4&0P3->`<&<8@A=hA`o^7Jg<__tc2FuKIoDyCX8?z9HjyN9y{VpE7@h@ZSS^DU~h| zLgHHV4ksoSrFEB7>gq8M{FVmh!nM70oex7g<@$tRX@s>J*(YBH+oo~wW~x|_Ss|=L zvdAC8rHQ#nLI|V9=XkTKFIynZw~ID`w7I~60bbNGBR85ZHnlT-d+)pFyC8b?Nr_+! zU!Sm<;$XJDhDo_{-FayvxA@za~DRiuenM;^M z5oa9V4siaT>)nnSIM_Y?ryv&6fMQhQi_Fh(>+7gmvA?CEO9*=p05&M0;DNVX>{|O9 z_Az<$#uST@P#d9l`mhrt9dHU6+y|UZ`VMb1`I>kvs=L*-teC%Ms`Yuy@x8sDT8Tma z@Z{TVyWY19iZm4AW~RwvDql+r?@+#848yKBYB!1 z>Wgz_dOjBn!%&3zpQY#5q;X_j2SOYj)0aQn7rChuZ22+nfFdv@9@zuE85YrRA~s*t z-aE4Bj*kSOoe!iDrL_2^bfH=1YPuvgJ&W~>bGBN(*4A4838nmCDX5)V_C}C zsnkAX|3tj}q3|)l>np}^a|1h{sGq=}AK<>ta;R2d<*nZQirU^Zt}3o#9D@4X`QKk6 z2{O7d8R~0V+vF zfzF82T?1Z;Ya>qkrQEY7ANi+=-a^%icyu|wKYpx6omx6uy{J@M2ZBWh=74jz3#=#Gj0Dp~XA_=I)XL>+s-h zt{c(T6b20>*PqkdI(9PEL<3_qYYspv`VG`RCeknM9?8pwUgq|@K|=S4Uq?P~VQ3UM z#-q@yFn{(uAO~rLL;?4~TEG{|1faq1K*+MJ8w8&kZ2QRXGx9+&=SN$Yl;7d3ilFoO zz#6AzLl^Zc$MD7jris?j$g7Ikxo`EHM+mERow;T36_hyu$xCBKCgJ>9^Tm%+vc3VC zWw(R%#i>*d`t&CUgYKSeYsk?(R^$k;_`<9E>uLY1tYkolQ(?JE& zKO8r4vgVWPROj#K(7hOD@!5olO*lEq8PtZdn$5d&LOX?HY>2~TD z-lz}S-_e^^x`JAZO@%)5REDL@eYvtbopVi9J#j>%3Vw+Tw~?Dpo6oo}esNb=r z{u6~9u6O-*AiEvyc9-p0_C|i)mk~N!=g--^ODzY8{)UyIHKzwK><%xUuf^2I|J;{{ zX6JD3xPs-uBh7$-lcrax76i~ld-kfAT#n7JPR__$*3D{CrAi)%3y*&q16`f$au>8y z83gV$Or6{7)d~O_By7)k5-Z>1Z%IQt0hAScr2;7_bsY9hkSGg2K>~d=YKv`lTfgc8 zN8!iAvFYEa-D|{Yq#&p1x-mEO80#{3Q|}5Rq}PxamuFAgQZ&mj>e0j(CrY7|i4@SU zrn%cs_B@FkZ+Z|%J)nZKbIr=u<;kispe+Z3WMb* zM-OLgeIpY4E#4d2SVLT<;hm|lmvH`@RTKinYexemc%R&{Q2i3b)!zUQu%9!qrvE_? zz!U-M4YsPcAOIEy`o)7Azi}6s2+CtR`0eB42p1xJw|_B=?y>NX*{Yxfk?GXMm&CYV zqMe}TRE#!0R%=G)#A;=UEZ*YqylUQ?UpmA>aD)JdPbHeC%OJhp?s^KH_0=;u9eo{8 zpPb+J`>4ad_Wh$7mTVKza?a?KeOk&W^CO2h#uFdOGRC{iB}nMkIhAI|g?)V=y61*f z8>iOOkj56r*%weQdQY{GYnL_p%p|*bJz(Dy>B}GUWV5*|PGZnNt$5Vh86*I(i-_zl zWAir)MR>P6WrssWPme4L2-#B;*53--wxiX@8-&Ghz@Kr})=ql5V zH0eoOQPyyyGiCLg!RphDHul|#N%d0`?lUneE=LZxgosiXLo7hJnahNApbXS3@t@de zsbiCv_9FKuw5u;{dw5&Ht&v2Q(ljwaZ{`2ND28%5o~J_-BW9kl*{VyZfFj z#lM30UobP-VZ-Wi9eAHyHfM^m0~k;Y40D@#dn_AawizdGF6gVsquaJ0ZiSnIRa7DRW!2 z|GhQ4BC8O7XT|#;i@st~b|2Uws74P!y$M2y>mb#v=H)-!_~v6w$Tp=0htSf(OU)88 z0Kz2Ee%lCp_lMB@;V}F8M35^5MJmJom1x*^rmrKg-~k8*o=KQzMXL)|Se*J*;Y*5h zxK4n35EaBHezCgiFhb6uWa$u*fsP?J(V^r>PAU)#z}B)t)W4cc?L_Ft-OFmv>}~ev zxH@O!-J=(cEd39V5CXdDzSE`MC@U!jeWXl|sZfG63 zdB5C!x^=;1TI_69eXJ*JtTpN9RTVG@@%VIV(lM_4Q$m!IXD#FCj_Cn6RTU9i| zcu;swU|g~HsCyad;uayok!cxvrc3ftzKbyI%Th}_xpyjdH1#PQdHGT~eeH!asS27`eS;SVkC?ODMAXZ>&d(31kX$nQ#Wz z_tXvZsh1M5D~@Cs0D|i5czI8O6reb`drV_CjD?`-z$F2Mu??2{!em(J`+6n?_Y&Yf zE5J0+fCXi!L1l?k2^>(l)gS< z=?gezxQF#?Z~us5lQ*d4hGIB|2ZIpocu(FjaVgNE7G?OeZFz{vv{*X%ndRWX=u*vf zjTAN5yutg}FEkb1NDO6rn1v;J`LR{Kn`iZY@jrgCnHf9i7S>hX+hYc66JNgLlIJVRKBvz~leT<^WF@V5DyxMhoI6aUhBk_BZhF zW6&np`|q>APJcbDK_ln7={$rU-*8vmvh}J7W(YvU{sOV|c`Y-`*GW&?=RcTg^yEOn zElV>Y(ZJD+f5YS5I5(n?l_H~7QC;2pM?cV9K?XbI6Wg+VJd*jjFxO9)I++~~iZ`Ot zPQv}JBUw|{CyPiIz38Fank5@#?1D}F<^$Qym`azoG<}B7)u5|u?BkkO7FXt84ztxL zHQ|`z>R7soF2@X-1X?C^3uUdNWx!(5P=<2`92+JzZ7-)JoPMC@EQQ++Cc%`uFg)bf z?*1%twNDk{08#S4eQq8BO(DSE=MYD0(T=z+$ZuH_WMUYzGTom-V51rO7zjR;R-~3U zWk=!=VqzbdNE6gECQwvN$(G1xX9WxhhyOBAh#;a&J<%Bd*|tc^=&B*F{K^0t4cSTZl5Vp;Op>cJ(_t_9K`e5i_&I=E`E$?lDrLBA=+I zp|X>X0171mWc?#?06^-fJs0_J$3IyMt!GD7C2Z69V5cefaP1CR-IICSRoL!mIJ zAi;V6#c}pS4>ABr3I%jF%DzQB6Zt+1xz#_fBcJs|zZm&~&sqFW>od3Gm#s4*3}Zj( zN2<3zo>lHKHe1}5h}7m+t0wxqxS`c#N;gr<=GTKYhxC}r6|14pZ?A+zeX3K)TNpUk({jOim7!Ov zl^~f+Tf^Ewg?WMvBi4%DFXbacop8|eiu862q`E{yS_#HL^kfV%y=vml;zF4k>mbS$ z^x=V{lif|dU7@t3z0-paydAnsNjX`kfpMkTB4-S71SL|8vUdTnjKX2*1qN_7@eT_8 zkpv7P3w<6%0YK0JDRgJAqaDAAZWb#54BVsleLe*b168Vl{_TR3xJn*bu#Y#%JjQDT zWAL!(8Cwd^L)js~vtUNCxpC0Cmg{M!rXm<=3c7uP$w0LNz-_!Wl2*_e3ni7DW>U$? zmC%}&kf9U&uOJc{n>3+K`C7SPqS19(GurHOQOIpIrs=J2s$WugaJHU3=lZeC+5GTU zQGf`AqY%N}iF5QyR~~n6CRtU{iO$Z^vo8VO%Qj9pTW+`IHUChB=t$Q|cqQbR^zd+ptyQEadaI^fb0u zE35Mig^`W>LywtJmHrUlm>aG>)I z^0jAm<@N|W<3^7HwGfaAJIbwBR$i%(tI^}~HXk0Nl9jk&SokuxI5hWTt~ERI=SGM# zkcV1?E$x$m^YR=7dvCDeYMf=x?4VjmrMeNv4I$P;ssZB4U(5jE zpO3p`SVid?>a5k=MM~cGsa@4ObYX2aT2-kRsG$tckE4eqp}nFZz+!KW=^X?P8uO8U zp+sQJq+S=MI7lc}947o=hHx?Y7OvvG(Dclu3>1y~{(*^eoUW8^X^sOscZ`Z61lo37IS$A3$B<{pP&FR;NF-XAu;vuKn zfuhR*)R9sF;y_;ncCP{Gb^(6ioz;86D*vh}kW!w^5(khTSdDqV^+QwuPkw;XLxa|3 z!-rpkPV7{~*$m#{r)tO$0OOim*xA~+p?bS5`}eA~&7KO+Zwi^{3w2Zt+33~0-=nrt zxDcZFVVnu8!M!;F_gAymf35ks_4CbJ*;!>8JBZTkIDnCbAzA0bB9xdICu)7ULng~S zH-^)qwUpTOI$scklq#~#2~Q*X(zD!L)z=;opf{|E3xy2WOJ4d@`VeE`$qL8Q#;n~n z=$SewvXts4kJ&x;>Z+VQo>JHRH)vK(gWa6Z7Ie5ks}lb{2?c#!6W>R4^6SiEZj~=Q zfI18bz&gGI#CXqNRsS4w;A$R`(IUY23|i=_VF2|aM}JJ0#Z+59{KkRprYfpnA&NKa z@vF`|$|)v#YtENF#f*7q{2##Ne;CCPF?dx>r6__RRQ^Nta4eN zXIg!ihSIYMQ$O+<8klqR zV}=Q(I(qthKQ-_ zYJN}kBGDtMt_(vRL*e^aZdTDd*`xAug(AWloVc=&egET#4H#j3hbWCPHONW+^d|S%;_Pu1egy~cZ}zC} zBt<57`s^8vLq#!Lmv1&T*d}U5LUx+kBm_csQz}xAsoYIsaDiE8L`XWqGnn$3Vs-^(`r=iuiQ_aJNzzTZhc(NrAd_`9x?SSa&eP7fhI^6X&)~T z#K#pWlu7ipwHtmnwB(J0NK!QwaUxRnj^sDxWk!h6Mkgy>JT)ZBR|2J|&K~TAG|o(W zV8ER_Of(lnI)GlJJ?Iz9(4!;Rny~7B*{kJz*S$kJN`rDt$cGa}I>0;oyucO~w|&{w zLVyid^Un((MLt$zJEpyu4A5VOrFWEubFa(C{@H_YHW0OksZ}AZ+V6nM z&;8V^%Oh$dF}CxWF1}Lb>l3)ov{q^U$c#SD1rCm9yUa1!L`p&rsy)79@n3l40+e(? z3(Ugv!Vns4`s}QV@u#|vAFqesWZ5IgiLksSct#>hed$G=k-Q_}yMb|nF~Ebf+Bf3d zVzas3+-Da(pY$qA7{TeOC5e|zC+z`bN9dyKS4fa21ejD>d!g5h{{HQT07w-GfiAmwdai@{ z6YuEv+HaPR95#a5dO92%?1je)pX|Dj3DVjY#_bB9eTy~HQ3&U4F?Qj^@f1q?FFs^{ zzbNLrT0~)vELtLo54uIW7e!i*yn7`|NN5wYDdH)}?|H$)FImUvO$U6DSsd%*L*89)s8x>f zdfD_KRV~b#z*pTc&sfaI*#)VzgpHjsqI9fw7T=bFp%Z~6JuNX`SM?YYQeAwfX=X*G z1H5!;V4~~Mx(_AN(Jl+oE;i6cg_BNiDyBjE_`g7N#e|V!&%0y%LPh1c&^M0TwWfTXU!qr4u(Z zPi>v`*-ojzGduy{8{|XAL}J@1N(|nj<0#qTuA)<>Mr5dsrX&K85*om0dT9OYcjhj8 zhn*8%TWvgI4IDB$N6asolBYlJ3Y&zf@abx>%F8n!ujO~4I6Y_N9?&`2eD(1RI@}F6 zbe0LU|E~2ASRIhjzPpFwBM>{YK2B`TrfqF`r&Dd0{t3k=WJMg`HMf!W>Q*djHQJq6 z%^i?h#D3x^Dx}!hVg8<>&A9N?N7C!%?Zp-@5ix|4`6Ewu)J2J<<&is;!EialcTeR> zIOJTvHwKuKt9m&qUbKGuom2CMOk~A3q)~Y4=yY@RoEj%><;2IpC%U^^fH;z~3j z4e0zsdLYfx%}aCD_G(oP{qA#R_o$E(%0q5PsB6V}e$Me$HP zEEPRsv8$RUMO)?3e)462vYHTbz0pLx_qv3E6|=z|ub?hs3om}mp%1GWqQ=0inbW5T z^FBRX)I*fWFk*FuJE9!4jfF)c`q*3fqLa4H^6bMFCB2rOGcwYDNMiqfGdFF>PlARm zv5l+`?kc}$8(0&*L~E4Arqor~Iye4&jCh-;wqUQyfz*ZC?)GAt?K`hy*}{77gj3lb z#aG?K4}HG3(mtaQ&^xp#EjRLnT+kgTI#2)bx)qQ|S?UB-0-w4L&%OFl`n1G;;_0OD zu-X!$GGWM^>mEe-EH1h-4Kg0cCsvon8=fBRnVKA0 zKclS^rEHc>O%1Z0DI%4`6xfJcuEcfrw=;CNz)`6@kuu7lBDunt8NW0X8JRrShvvNU%)XQ>_!y!E z?wIuAx6Aw#dvS&`^|?X=@1m%vjdKN^A%}Z;Ns>t$@ z`?FmZY7V?3h=FflMp4C(WJb%+8`XJhL2mtho zqi&p=9!zuvm;B#~i>MQzx~nomgyhXv#Hk1F0>ItAywK_E>{Fl3!B*F0P6)`t!zkKA zvDXV< zDl>`|Vi6gRM9%2z($e zp>0(w0O~{^_w_B-Nu&N1?R_VLgoLgFD!H2$XFn=6?21=8Rc0(_e3wni@$lTezXo#; ze6?#2DritHGu+b@)L5W_1H(_V|MZ|*G@NHB#Uk#8%+jT~)GDrS{r6#%OVWkw)~LmS zN1}YLeo!XC9q*YMc8`n==(2?B7|Ry(pX4F@@d6sutD9>{#mMc&l$Q$*zU51RI9ceY z{CTnV1S$hqpB|HasmfJ39dukSp29K@l|wulu@X71C|g`3?1f~@@(al8vOz(zI_&@q z-27s)q{J+IuAq)B&Y-NgT}T_RG5!0j62}}CH)_t(2@Cy9VvJWN#<{dw9WIOF%^_0N zqrOm-gFGQGeS*&cBYJ+djZOeoL_rF7r;>}>O@6zk}rD2X}? zV`7SeB7Z2UJzs(ak-~dCUj^cOJNt984bvWK;}iqi!d^}!hXwf;PSV*NVW=EGbG)rN zvuYmOqT&}v-HA}fCA_d(Md4D#)@k(cGAe`bKW$^*lPL||?0!CpE)FBWd=ea>?}mQ0 zG!j#MsznYBenc66g;0jrcXa8gsZx1T`iWojbepF#68ig&%T%Caw$Hio-GlP+Q{_=h z2EdY4cSQon{g-w&02&lWTf@XeJuZ9QhbfK?hX`Py7{JJm!z~F6?|-WEE2LLQ4VA+@ zgZByyYk2SAmFpp0|H;q9h7Bi6cPC0$A1P}!P;#|`N8E&9W&o#Bd&iCxemI4-RoGgpxL@QQ#uPq*= z;i>R%_K?nHD64i5IMdhr^f@lzvefJ#2zU)SLnJ(YZed;LqkAvo*GUA`u#mEnq+A*Y zusOAB9>!iqduY=u=1bo$2O9#XM09Af?@_JlP>0v9**M!|nF=at+MjJ$eEJm`MN-r$ zK|;}p&u3S8JQao7m*fQ2V&j0AA_N^&kAV6k&-`j>TR?kPm4u&(OM38UD6@(A7dKsAWnHisxR}NhTe+^4cZxY(z@7 z@?>Pj%JyGX7_wfQ01Sl=-F(K$j~8{QaL&mKN!CeZ!S{*utdlcCRumV z@yPB@lsaN?s{1*YGcc7lB2)kmTKMvd5i+WzmCeOUoN=>`_Rr*q37Zc0f8jC3PMX

Igg$H(2MiIg5K){9fwCA7tFj{Ef=F+7InQ80lXy1lMP_8(mf z3^B7T;Q)R>y;IkL2!S~YlM<9G$ye8m$H6hb;k00{!Z^Mb{Z=JMB~UE7NEjH{4mwy{ zb~HZyK5b_8ePUnd_R&U8=pUBxXnpGRyeXz2_Tc4h`|*;*u8atdthTGUIEHS~=A-lN z7TdNc$J|3@BGXNW+tCy3^JYQjhC2mGpV{(rr4J7E%~X5TZWdef`767*l->(D6W`5e zg(8K@8`hRPr!>Cns)UoEH>1jRT}m};w)!$1v0U+3m+S0;`u+pB;Zk(pTKS&hJB+b5>YCM+zW`z*{1fECIN{ zxQMrh?7!ZVH7K6l#`eF6dh4jD+OX|=PtXI>4G!H%ONb2JNJ~q1w;(t)NH{b@cQ?}D zJ#=?SiwZ~xCSalO_Icm$dlr8Ti#0QAv1iY9o!5CD$L~;ylJIj0&k48o@V5kTAkh3F zVZT@|AG^^_Ud7}0^z4`X($*Ec|3-g_0FI`nT;^Qz!bVcFueNs|?@e}dRWfaG6yk8Qs?SmS>3wWV9@g=e-wNTl$ z)f^Zal)wRtt4eh8iOILE*^_$|o1Q%{MW!Z2OcwRz{RaDFg25_X`nw9u7izcO^3F|J(`D4q*Oq zW$nd9BD&_%7lOVzYtF4ucYxtoDlvdPt3&(t5USu7?VOmgbm|*sC)YbQdfiDbK3a9 zZepfpG-#jK*PYDAh0SSK_;Y+W4ES>I?Ez7hzyn6xNr?-;Cr&WeJ|XQfB{VAPm>>mD z_L&wV27%5LMM_Mw(z*g{gNbrETZ@qvr>+=UMM{TME(&~}bt4=4FnmsfXH=fE#>#!~ zX&$ppC$375ECDFKDZ^}cNU2;wbzQ)uU7fw@y8FG>MtMiI6>+gAf4U3uxvO0#Yf1G5 zpx<3Xevd!{u{N5@NqzYPZd?cF!}Bw_MH&NPG16m;no2L%NMTfuDFB=tD+wV8T!8>8 zA1H@y32Giv*++>IBLH67#a=-FWeG$d2Qkkoebc4vny(y>4@CSjJu&^Cd27M$d%jwx zNu+aEI5w=aPSP0j#gwN$!5z<*ZF^%P#cTBb`_qO!M{7u~(?8_E9X~VYy4VfZt5v4A zo_7ii-c~+4L0lfy$O+ZscwvG*qvKCAF4G8}k%`5F2`WOr(k*Yb9-SOhV;L1BW(wA zubiNje!xr?d5*Str$Q8OEb=AM4(anIo|ECB{r+g$MOnI?K4f>nEMEv{Hb3uRu0m@d z%Ys~B^81EQ3Cm8r!yMo6A(WaJ`TN*WP&-*NLg+*O(h;~Z6f$#)y~zK304GHOqX7A% zB!UM#G;iS)&O?FH))GX1C#WC{Qx*- z!d(*mKV1U*zX{0y)g^#59bkwJk`lt)CP>JZVi@3^`3OnE&afnE>2Z-s%x&R3090 zpK!1L_v-pHsFqK2iq=nKduS+2sMa3&IeYN|V!96!yF7lqz@~E`b8XaY5g*)KN zcngl&1JByaSSG~P`CT&Ztq%Iu6A=?n-~5~&8hm{NkNnvF;Cu(7gTDcY1b(lm_qT%K z1Jf%dpP!)8TTq;RZ=d6zAIB1pwg~Hko*G&JW(xsqBM8n)f#ZOGyz8qrvS%48I$9T= zE&i`MU1mv=(E5i=fUULm*5LCu4rh53`L*0Z*3ZC6;iPIhaP)3vDcJqhYt^pt3QvMd z^R&AiiJ?O#Y|JF@(j7V;&5j>WH_EkTNLr2!<6i7m?{0mlrB{p1l1=w|HEY?UV@O>; zEXd$k_8~~{vvo$Zt}$7{vNti>*)8RmD4gGjVAQr-B0#!9#%Z7NF2F${XhS*^Eox!Q zjD)OPX^lHN8$oCRcun@4ne6MQdw_DEu?MGI$`)rQuaSquGr>}{!0+O9pp^Gni<|2{ zn>`K5WKZ>QI)qVaPL)J21=;!vz@(2jZ0Stn8a2q!QE>u$40-tcmV?$WOqdtkx+OcB z6uoI-^gV*J^VO3NoK>H7e3E^%^1!fQ?$fXI!*>*+c10u7f?==g5lR}6V}D~QfENmU zKUw@}&lCofrVIhLdP3Z>)!pGzjq$!rh_GWurwewn=_{p| zf>U2bV2g-B5kEDGm41R~5n;mdi%L>m&EI6qhNdFLjg7|ZblCz;XjJ=NTjefF#?V?{ zeq>hTksT61%_FEAXdi#fGms3!{%HF!;cDt2{nR?GO)Mx;y-?%E`6^cVYwCm1gVZ{|bHCNKeXMa;pk274dgnP7>7()tPfE@9pM)nd#vbCSB878uh^{nI!mcOr;#8 zB;+IJKne2ciGh7ABU?wx9?RSu%LB_%C>sIh8t8sMfT1fn1WU{{3WN|5B&>EK@ z00`AWY?m!oz8ihEv)fJ46)q|1`)C~@t!;U2B5R1r%pPjut@W3<&7CUczWkupD5>Y2 zd{aw*h8qjh!VYI}TV}%Go7mF$1+EpQcNR6gF5J0Sa%+DlF01uJFaoyRC$*ANpZaor zo@tCwuW%l4t{XoZD70u29DCF8t5yMJ%o{E^)Y?cq7Q=rUmq^XH^rH8ns_y_)lMF5b z9MA{FIY5rb=qmiTByTSw*2T86H400unomf*Fnq5yjt%n5=7mxL3wEV4!$d+wF2ZPf z4aU3XU}RG!C7_cokYp+JP~mV>;VL|)>gjcf57osu6Mz^Gi05xFBIS9{-5~bzgvI`@ z&&T&hFg^emY>p5=MT7l|Isb0+|XKno*iAoyp8c~E-B2LUiZn4bzj5QgrTBOz)q z+`kqMV5V%Z{1FLKB0$(#@!%{kNVw~L<-qU7uN=Ll#D7Opa!p#8Dt0HKWSg8T(tG3u zTYr{k7Yz7)d;8gfM(rlcZNXRF<`K^JhdH^OEevEo-8!^3TfRQt$g|9MW{ad~>&kR2 zIVz|bi5RUK*{e7S+bMUEiPfN?*6XI+4xHa&2yFjG8rR=QE2(+KCgAN#KkkA;tFZSC zX=a&8yz`S9dh9eBL%^9u30WcgQaXjch=;~WD5jTeG|Afl2l_OI+i4!H*-)5h1K_-csPAEv; zfQ2w8i0&UGQoB`PTj_6_HY}mD`^OTN2usGPFBe!p%6j~2$J{gdQ$z7=ZCOh=K7Z7c z?p%k~fQc$6JWg7CTiD|mQG5i@=fyXKZ!bD%fR6K^k%05+uqRO{(ITO?<#0|M+Tqwd ziWVKJ4+Rp534t%!1be^z0kFaWFS;I=G>L|qq`{SYf39h?Rb7<7$iSNM3~#*#;mR%l zYf(A%uc8jIKl{W~DHlOSEPxAF|JX(`3U9~|sIN#G_iG|CblH6HAK7_f!|s-H1E*nf zqRP=ES3~M!-FDO2EXNwI#v1Rf?d#8|EEyVT=gI&JrzIw5ViE5`o4|&l!Je&uq+nPE zH+t8-?lJu}v5b*8gL$w|pPcxacPy)xk$Kj*gWJM!LkyaSFR}36J1ML|HK~aVH5En* zz7FkA@$keCj-1V?3$!axx?V<#q*_6TB;%z-x%i%jJ`zziNzb%KWpOGh zzW)0WU6g42EP)v=LLe~*bVy)L0ACoV^e`K`Ie%jT{r#=l@86ef0`2{+<eXb6WXdr3%wNICcH=vY_ULKvSA$Y%- z3r3ahwQeo8iTdiwf;?tF!7bMrm42Cv~F+rv-&mu`F9 z9eNUS;P0t1BtP6InOX|85G4^K;CvS2R(3)Y*@x}5(NmT0QcBM`6RM_THlD%&zk*gm zk*6L^e|O3JtX5_`6xp+|0lLqV`RJc)S^n#`Tg3rn09SPbui=je?1cEEq;Qln*YR&S znjHWI-<;qX7TiIrZOS>>+-f(Q&uyw{XQ9Z$DhnTD8uChyS=^^0jxRFKwNjPD+T8!L zwk32OD5LY!vLCH&N~KAPIAPh^+va4)TjzQmS(DR$qfQpqP2^srL{vLjEwAczPTFgn zL`rl7-DR+K2&;cL%e#2?%{OWlv)~T_r0Sv4Pxff=o6a6@)IO1W+OrI(oc`!F|Tsv2GszaJZ z)D8zqX>~qb?jaJ(-uGY?sM-^nOzCu6=vI znf?!60@r*Ab8{LV4xjhl=~1@47EHv1?8tl$XeQ8gkwdZILl;a;{@02H|0sW}hTIWV z@8~JyXOhJ>m&a!ap&&H*+ovdwYN0tHDKIyy&ORiP+}Bw-q^ZRpq6s3J#HZ;tkB)+y zeJD>F{~cJNt3jEU9q-;(CPSSXwV#s7S>^9+1^gg_;l1LfauvCoyK8Sj#&h`r=frZY zvnP*Px|kGSM2XW%K7f(>oIVRfKIg}%LU-K_h4`ZJ_HW19B`(L1Ks3~}!sFh6Mag44 zzznBA1j@+ZKI@XpP2f_(x@~$BHl4? zCnPQ}1ty>->Hs4DRo~H-zqcQd+%zXA`1U3!_>xPysbe#O^T@qlC7uy4-*~<6U~(f* zwSuE%#}9PqW)HaC*h^|npB-X)pFS{zJEJUUtsV_2mE${30E}jhL(bz#;FWUK%*)U+ZzmT)JfzVaLG-gz0`S!ig)u05 ztyA1+ND@>;ZT(d%6@Cci>{BN)0O!HFJ0-E`aTGC*!BLj;#ZqWY<<-t2h?eoWwoS?a zW@9Q%&VB!x3t}9s@>l;ti4>%^3eCx%IIABcia5ie(pO*9lIXA|&9qUKKMKS%pW!db zv-`BT>Bzd!PyRSc*teHyA;<|3f7CIE4nJYzH&WP4XW_n%sYUb89Bz_4fadgV6im zrU4^ZOtuiX$J2r>0#6W183alX!a-X@2#AJ={2Nu=Ab)KtHU+@iBW4DLB^Mb1&;%s- z$;n47c6-o)L2`+ZMjr#JE>+k7-z|_r>5v^#Gl#pZe?nh{wOc>KJFvZ)hvOm`6*F5?b&n4(*Stt!HQH=ldNq|(Xp(& z>&40`d-j+3U@ymME#Y+xcS6*b%Yehe`un%%oEmsdw4@i|;8j5j*YM&iT zJblx&5cQb0GBj5f*8$fLpQbm!BLnaO;1dmi1V4)3h27>5hz-cAY1qx(TULhH)}DLU z?4dk>Po|k`jc^7rnC;aj8)H{UO1`9V92SiPw;Fo!o*z*UojC z&*8G2Jsp$LI<)rA&#gZc)u=g)-D+Bu6>xJ0_{4Z$Qr-<%5J*W)WVx?3?@0HZRFafO zz_m$x0KO*Cuj6DlO&#B!ltoY={O;tXd1`i(#mzikTdZb(&>Z`>df+p;X&JdFd91;R z^!;bIR0YZe92n8n9`y3bT69A0KQ;1K_D@}%`=oSJ+I4WuM5bsouNdNaPmax83NdIp8CBqhBP_ll%}PjBb^HAi*vdO-{a`j z1U5HuUH|s{zAyQ#E7dooNbJ;T2(2jK_%3v>^}d-y$9;%2KyK*Dh{Y&X!!%!7QRvh9 zUo({~Hsh%RDT;Q$Uyuuj;A;&5s}`WuvGdZ2q8_{Ox)g{kkY8ALp5}gr!hHP>cJ3`S zyYTH}W-SeToM|<#_Sh;WhLZmbf4lU$e?us)V3myQl>tzj_8pljsp*nBzr@lB0+cRA z#8);yy>&desLD~WOz_ZblrBD+@*XWZD_f0>yxrgK*)5>vpVPkcfG?|rp~D?QrPUJ- z=}W2(`%gUAjsKae!P$lLPERl8N=kWb=c=%@CQ4p>v@0wrGvrzb1}Lh$Fl-nepRY!2 zr1(~ntF5f)*3jim4F%OEOo73vr+Ak7Ea?S;%Sbx?wnw*r1@3_URVP8f7CLPtMFb>+ zocV0>Fp|8qO)f)f#S^BhpRkG5j^zxT>yPN^i&A468`##CAGdJZA~m5>`7v>iBY;tg6~3Z zZ>la?G8?sAO+9X~erw$IHMs8lU?|VoZ6kJRIeL}pV9g)Zl<#pa91tAGmvH;6c|4!p zV)~25?)7$^%eOZl+C5u6DJ6DUnmi;?nUk8nx2&_2`a2f2HjAFmrW`G%cHdVOkF+l| z7|7lhg}%V!*G7d<${F<(iC|zV^m&4|J-qkUbSli6;EZ7wjlVO*!yO_1EZTo>$@v|#*^(lRtP=zw4$*Mj?M0MW zzZ%<8hb&TYI3>xTEA8zv`iNvz|o#`Uc=zqA^&cg(&n)lsLM z&0UQcW9namS(F_Jk|OPc$iQV)cb7#V4h-emeZpHRNEgeD0ZSWKXs0gj}U=#$pB|2}!T3uWTh;6;Q$c!R)I-5mg6 zxC|y?aAw6+@adCBmi4%u= z$5Jy~FaSjLvH_o@xnFL)&^-QXsNx(S_A#`5sOA|ZcHCX%m4}0Aa$&0kX$Aj!dE;pn zjYPgk5i6$u?L}Bthhu6b7o!orQ{nkIUNV8LcU_98d%yPQf_H8&+8-J>r*LL# z`1qna>pTXf(YDjW0r-np!$Voy>azq0ZZg^-XbJ{TbkZTR}vk>P`IFM)^LbY{)eJ*CjkW6cG#@k${FG5{wpjeILQd;c>K- zpr+5A9>sr5LJlRfqrypj|M{n(U_}7{Z;1Q-)<B+og!yNv30MQT}Kxslz18c2kl6giafmcJ$;(Birf6cmoOyPg1Yt(V4 zHjSZ4BQ##b;+AV0ZgXUQe#gAuA!yw%*#M=t)%0VpKCIn(L5nyldSFq8rOayAb9+sG zj)_X{bJl3UAuIl;QC#fBQo9_<4c}2Jfwq@QmrbQMxw7`Tq^&3shdjL_e#Qpc8Ax0a zNwB|hZ{p*nlrXL$Zaj^j?Yyeaig|?zjKAEXb<-r@zvrVAOaK{hLW!IcU1#Dm0{J7F z^tY(BGMxRB{bAjmKZNHcUHAao~5)jcPd%@^sUvASlUs}>Q8wI{w>w%!K_sJdJ7u{;^f{pn!LDNVEwQGeY=&Ibzn*ln;+er&NrpOLEzf(fyEpss9>PB=D>r}3of*ViHAjh#EL`j@}l6A&g7P%U+in=u_*@QwvuBy?WVexEoAJT z6S;$-O!krGuH#e+n~MD%cakcbF=JwbSp=7r8-v<4PU0L^4QE#?dZDCr8MW*<$6C6T zszsoAVrg4<_<#Y@Wi&E4# z@?eW?J->SEc<$!w&56?kgl4ZN$weRyMlijTsWx#c2r`L(H}eYp(YKe|1EU>uR4^GC zF<6uYKr4wRx!O@9t5rtAo86ygxK|+5=8k&osw`L;J(=gvF&k=g(ifi4*CEdub@*LU zeWs_EeGMh&f0kda}NqPcrU#m0lmO7gPKl}yAy|4mkR7-5z4ebm@VC>*F?vJYt)6TP;(G#YG1iazWMdm7 zBC{t_h7Oq}KYWupAD7&Y9Fm5GytGp!9xeCP#K&WdZCaE`>aH2$2zuut%_&((=+fnMK@qTWw<8$qdX7UXYyX za%jjHMoUnz7cCXT;m-C>B%@oB1yZ3wmiSI<7$gyzl~FSWA0RfwZr7LiqC!>UpI_gPMt zA9+gEabNqs5)J`Hvz?PU^2iN8U0thO2zWZzw^ava2fj4`WzsR*r|I8hFx!EuJ19HL z^{X$R&%oSb(76i*9zoC)`4Wo<;8REPV8LB+`*#C4KwF^oMB9oIv|e=8|4x&M85LmT z{y;%gFA0_5M<%3y`##-apX^w-jD4v#2RY)db( zmhel*U18ho+-17)`^h0MB-FPVMw-qd!p*L~_*pfqHS;uVZLhfTJ6x_uVnt~Vhy}S0 z4K6;P+_i0L5!~h2X|b$IRSJw(sMe?Lz^6%d`*Nu3$mD$Bcinm;ljzlIRA*vsPvn}B z@0J8T@m<$@7tdtx@7yxq6EcIjOkxw2F|EJj;bGaR(b4UqU#7H1RM6z42jPc7#dNte zImFJa#C8Rza6u3qSgolCr21awtC8C6#m$|hWf-X-s|BWY_#kW;3dB1nNvKvX%e9c|S7e=l^G$er5ocFLo&##G4ucuc;z35NLd zGwV}A66w)K@E4k+Lg>*TOYr7?GBkY?Pd#mqGDwBRDQCn$p#V~i5+9Wl^9T;unw$PV z!9v*o_8!1}7dVi=+@DWc9o*F_Yv5vwYQyI`HlMF_YxH~v{OpbV>+y1wcl2zcQ9d{Ym> z$VP9Hl%u@O-I==cT)aP=z@hcXdD*=Dz17$0im9nmmO_K_1+gmnkJEhR*<|dovteXh z$_T1k>PLY|n$(jJ^dr#IeV6qaiGgxBM)%Dx6hnEXA9qvBjh@cX3yCSgR?~LEz5@4J zcN{|)jl=!o&2|yp_nn$FIHc9XmF3mt%Z%_0R)2Jk=cbR$GMevgU>s}*T6sL?IJ-D2 zc(x3X(wn)~>e2bevsFT_gVMsYS#9&&m%pPH?pv{?Sl+|$a#GNaHh?g6_xCp#&xEPv zHGgjIa6pZwBPiKF$>{Fb++6ICL`>cY3;*P+0yDw!)U22QUJ)OaKy& z^n-i@{cPWd`GZvKw7IOcR6I4J>+d{@{N1DqAElqI#Q#9hv(LGKVxtc-0zod9U4q?@ z03>LW0}}yj{6wZuH01BSg5>n%7XeVBkE1uOAsKN$I}1@*|0Ft66)_xJm=Dg#RIDI* z?)u!%HLv<_2xgYvxV&mHxxXM+^RUB}^RqQa=G6wnEGs<@I)6J8tHhKrBJ(Tuft zsjy-^ge~NjOGvgZ2;!~7QLXpr2y8=0M(ly=uhDzolsGP*Rocbc7r;rCIKukZboH8{ zDYX_II*9$+g92$g5qKFL41t>sCy9l)ZPDlDt8TuXZcPxy5>l9p>cZ-37>L8i;}5+F+8Lmk*q<@a1D;{8JE-|+!u;k$ zf}HedA3qJc+vJl8vu13*4CKZsp`*;u;#49}7y#V&6q$h_!Ep2}=t;a63Zwh`A%p~d zW(vXJ4?&Q&ko|{Hz?Y5)JffYUUU`9!;G|&PrZQeigXZ8zPQSIKSg#axa-ibqg})6e zVHsa^^4j@;TUo`F=l$`<+753aJH#!ZHKeDo=u-*JpZ}8e9$ph9*Ro)xruHsYgd@4P zyN&Q^+;TRZLT@rt6J$dUt>T@d2$>zT{1+p-`;D5>kYK^Vpr1C3mFt&iEWs&*CfWD{ zLlGk?DU-@v?8)Tjd1j^?O&(!aJRe)H??U%sF;7@+M5Fa;inzX$985K>It>g0-?oF~>C_T)~+Aakm7o1S9aehLn>~8or`CFAt$m%mdm^f4-uBgzVSL@+Oe-Sc zeXT(kxA-YhMQMk8oTXBE)adTdn9^b^7Q;Bk)blZ+B}uIDI*Fs0rg)8g(+3*7oz$-% zg&dua8R|Q$G_x4&%tA{q*xkxZ+Doe04&kFSp%ZntG*A}TjEwxUfozf%O$LXCD&BUv zqHQ{yXwG`u5jfmn(nI}j1OvxN3>&@ctuSR0Wt1uLXyPa*vbQDak?Rndh59o;+=Qv1 zkLo^j?DWl7-niEm(AK2QS|(neSlSBR$cueDmoZlKq_2h&WglCW@afZrF~e88Enj-w zx^p&+o7$RZzx4)e_*iik!O)@(`m3hEPsBmS3DgqZ&ox`0652_ow75cW#Y~K`1;FpY zD{zM(q5}Y4o9AG6bo{5+ouY@}rhb3hdP4Tt2!`Ickf|ag`PY(OpP1YiVug z&22YvkdP=uH@6zjFoR$VF(^(Y%ZnhMNu)3EDVOKopG|={>f4ph1-ZC@Q{2UVXtUby(>Q|qY8-V0d zb^tmSD|`S1bo!}VQLcNsZO@=yXuJP^`e{(nU8Pyy&^R&wjCZl+SSg)fx+AHVFv`I8 zH)7Z*!*)xu*FHhh?`JgUl*V6ialpDD)uSCFfiBkbS7{ym3-~Cuen*JBCj>)>#JTM= zroj97{lL=}-of4Xo84>{`lXrpZ-@w)sYL+ttcqG(fp26 z#XqiFWW(aBLht4oaK%mqYXAbchrm9NqR4_NAVHO}4 z44ywViZ7RF8V^cR2uhl}$c&39pNhSiOi49M4|G=2h)Xa*zR0e6`0?}aDMa^n)cd1x zJu&N88%)8kFSRLq)y(8*jy92%cG3|4;Kf?GV=`uQ850o+nyPTD2#=OMsl;I5D$Hv& zV$FQox7mSKjnk`@~vB}cmV%o`uDJG)c3upTYiAG%(0nKRPSRglR`HF`(QK%wXAF3B`ep4YcCCDxJua zOqnmDPq>$#IFkl!26_Lpx6tqd@*^*sKkh7XAFCvlnDsYTjy<_hjh45lYTLhvxbpg@ zuMYsD#>b&55q)HhA5WQHN0DF;r3i#0nX_Rb4@)_nHc+%^7E{ zOVF`b3tBc2@4_!1joL_vR4LD~Ea}Wq4}0-2iW$bX07Pw{tUT^IlnW#_cknLPYog8f z6HQ6k=p?ae;+`CV+AqbcclpvXL&GMha-%Vmx#v<={|KVEl48ge z@7A{zyWoqzUpX!vaLAdck~3900{byMvU51J4-bFO(ckYp>J%t4~>P$T=G%}0LRxR zwh+R(G;$~)64_u~BU)F%##YC@-LW0eC|Q93!1-tCtsC({+V9vOqQMGk&N;D+O>gHL zzJmSmb{+uzyzkF@*B9{;qEerDy*2cMzymZ;)kP6a#i- zrubM@{MB6fe>C%3e)V!!0W5=cP4jh{oSU@?zz}LxHXh5oM6|! zkhA0K?F$>-%#^poJb6haVrAVh9dOxivdEsoL)EPp)g3eq{m}*ix065t- zlMY(6!8$M6_xD}KH~>shB0t^+moUzk0AS6z10ZwoKrL=HZJ}ZoA~_(atDnVkOlq?9 z3n_pieA%CuJv;YnbC5$Uo!g{ylJMX1#K;aL>Y9*t3G_CXMT%vQ-|9E`W#V#oUO{qE(vKc{m{#Js#C7Ikxy3+}Nb*9*H{@-Ha~&8ouh zJyEORZ$IIo=9r}QTgugQ)M~)5g~Tr!YZ|zInyl@T&~uS6X3!FERk2v^Q|))`jYJlQEB3G+b={sH?b|qATadU$F2AeL+|>-Sx`$fS;$KH$a_g z`OeFGryaI_+3^|Q_;rl86>f{!QVzT4NWi!opjE^`BaRc64vP1!Y+hk{CKBSaSl(68 zE~>g{E#={r1tscCALys=pgS&#JS)1klTt;Lx8c}@4ea67qgyv+UW zUmF78lLZW1Ec?}}ydDT7bb0^EgZd-wzl{kl7b!Loaq1*Hrp;PLPn1W&U*MaEhW1;- zGVJJX0#hp}7<2p;3mDnyyA0bNgxmT`&$wHi43Hb_rMRRd!V0bTKRgNX;~C)5rb7i~ zgt}@wVH(GfL3Swus>m&8$M)s8ekzy1F^UyVpyOqr_Z+~|aSw%%;B-O&g@Vn@Pz;1o zJu4iE!dP}Dg+wvEtVCPpCYVO58?%Hz5FHY@+4H}u=j>Zot%ELj-L-N z-p+#&#<^p0_%Qu#XJD2(Im(uoPl!MHxg`p$rodH%D+84DitP7^0MU+W=qCzXah3cf zk>C_gH1IBv=iQy#$;Dv+`L|Y)hJQva>Xn2z2c+mk%&pS;-g*R<2uOYgU|G;4z+qQn zBLCRR=J$A9S&iKzFRDgAllIEz$*(i%3i#@Y0asOBO?)kt)v&-)0=|rJ4N9gD#k=Ld z{O5M_SjU$tjsB`vaJg^NR*OyLGcpH}-#32Tbb?*Z7$wVUXqV}KS1|77v_zoj2k>M? z*H6Z?^FBOGA4$AhLu6+y5M(OFrseKU73Wg;G=+ z6_#p2_pAq18*lTfmN?ZB#?>M&ZGP45^Pk==$)JZ2%2{Yw9u~nFuSy5uj^*?jM|WV} z2HB(+a}SoRu`&vS!nnz_Ms~PPA`$VPv?P5okK{~GTgW3iE8uwkqrSO5PrOu#g`dkv zwcLX~l0w8{j57mlYH?=p4$}l!776PMaD-pxA5STTH!8F1HqLD<8Q2_n_eFkmtS zhNn(}M0>=5Fq(MIxyNMqCd@$B2+RM6oUH!eP6;!3_@K#rt3>-Z{qOU?DPVu36b$Z2 z1<{ip;7>AZL(!|^M)6Wb)710kUuK?;QToWETi|Pat6xWpdR^u$h`JwDNYd<2LI4R( z0Ck)2!=_3^&VTM|f->o=1cNVxT?{JXl7A6-4Bjs(8R2Bu*bOtrrl@DTp0Seh{W^6s zEjgt=tEGDZ5!>l@a2P1O4wTh`9xs36!gOlOb{Cs49w&J)n_4sonh%>ujo+l`7jf6b}|FoTr?EtawI{_ zJTB7F0<_FJSUt206GtT`Rsc<{N+s3>gvdqY>UD)549Y7NU)DGK28?tqNMT)hXNM%} z%NK)1mZ<9*Qc3pQB~UxD?`|g0;j5TRiS^=r5I#Ml3pUc0G%b@rt|lqeK)afhCU^n}7Nyx3Eto(_YHbwIZ_=?2yLTrwSVHS0!btCraFE1~4 z$+y3kGrD)~gYRbkxXNuu>S{AsAime<`uA39a&K_KQQ4Jj^SQdK)WTzhM%{+$O!G;V zB(?M%a~xv6KRUqBTlm?yDu1}BO2y{3xK2=rT4~?8v-^>Y`pBYDMbPen90kYRY7o1- z7pH2(B*a;Iaj~37jx+oLG*G;G>W0kt#U+t;eDt1Oh->@+$>ml_pP=klL^&VA_mB;`h$P}VjHr>**@5V zB0-yuFc1&*1%9U9g95f-_r$tpk4T(tBq;y9IJ^l)0{jMmV9HnJab|Ddl#@DhxMhwf zmi<^Pv$%8vdk`2dD_|ogqx#H22VwWg@2mB|*P}Z4FSRn~%YwPUP-T4s0Bt%?zVhQ4 z4?LCoV^vyC)xgg7L*pxc@d7Wg+cm}maH95w&I!&pK91Nw( zu=aJcp;Hwf%Bl{B$*A%emMaSe!t&V;63WwwKTj`JDLUd2;(K1`QXQ(KS2Kjk$OV|+ zUiNnPU(OT&I5Hm$G>el6@pF9O7_!W+ez@JoFM@}mpn@4k#q)~cA#MgjMMN;mPYeSe zn2zFrVZznr(|L$eQ*AVl$Io#i(xRRasqQaXiiGe@bP{?V&nnjEHo9{mVOO^I`BW0> zxM}C@8kYS_QHgrj9$Vd;3-yH^(ShP=*j~HpvpwG9nN!2le9udz#rdk+5HOalR+_kZD~#8Lq&=uhTQZ7t9ZO9OTjt3T_^k-{3c0&K5&Oo;hnlms0i^DTR1ySmQ!=*2b|J6#`-TDV>Mk*W3FOFG(h#NZT_^=W#B~J zjM0D%Fy$Sqn!a&w=E4`!h`sw)w>I6IL1lZkIVk}yF*Wv3$kZt%d6CKj9<9=wiZy&l zyGR@^zljfh@+=5|O=W)lhEi%D;dJ?3R40-~jMLvIJmY2{;X5C%q@-9YIqY@*xZCv3 zR$5w>gT=8j&{+&izBE||wL)b|OjS-c<}Zkp_lR$}9ON-rrW|LedIc5Sgtgo;&&rjT z(|*Z1K(O+dn+oqB^P$-9zsK7T01-M+cex);2tl4klP~~Rkf^XC01wb$1e7}fk!}dU zz7HW3EA>LZBGo`5d2mNW0BRKdZzy7!blyxPw#E^^d2ZpMUKy`($}c(37N!P zmygh$v+5}PW)43~xK$!p+DNS^4GO4i<9j1D_O2Nvff_(RIMtw;o0sApqT*GGqR7&RaRdZ^}2T!$>xMD%0hDPIn?BWPkaWq{nL$ zzfAd#VCr|XFDqqfL>*0{4H;b%!z|VG!D*h;{Q11-T2=nRIsK@hDAby6M5i?){WE)) zh?l}JbsG`O%B*v#5d?;n#_T=wYlXBJRi(!Uf z7Ats9v2&I(YXf&c4Yruf+KQZa93P@Ob7*snp9jKOnWiIs_3d3jz(SjN07$maD9Zed z?LZvr^|`UT=1pdGhBB7A^}QMz@&s-Du6bfQZG9YJNB;%I%)E25c9KpWH|<)F_WkUo zK^7KzZ~or>3vKM|%9lB#>U_ZXMVO2+y(>j&bF|7Y;fI=BIDj6L7Io*_WdjNTI9;>+ z$uI;WuklJLJOh>Jzqe(Brb6)hvSo&?j517aOg?WOq?uep6SLg8T($IIhJ{(ZL0K-F zEA%}VP3W$a9bQ#~0-vN#f87+>K00A(k*NrLDJlwa;QwaOg*|`WR^%6Yk8YRVp=0vr ze}iVl4P&QwrZfb1GjH0Cf_nE{n|~cp=^Ct`SEaHI#TC%9x?mMu4@8Hxe6nwS{x&PC zd(A%4A*k%cbClp?WFXWny!YcbpWQF}gXLtGd%VJ1gT%Kqq2@dM$DgCVQo4xe zMR5-TM9SC2+Y3c8N0wy*avN@LG(NTGX68XiQNvJGz{prnn_*~ZZrOiu9R@;lUD1l9 zW-HJ{X$a)BiivT6QT@ThOOvn6hg6RCutlR7*ZFVZCZ_2QfZKa=uf$Gnj|t%z44^=S zS=1ajdCc7qKp4)XRQP8|_yykGw`FBr?F7Zwm6VjS0I@Aq{rvsqCP!$`1!eUSYDdpIfh{!Z3|aQ3RawSsG@ zZPDs;@rDAoN=^XCSAo`UKj>%?op;I)u;L$mWLY(KWU9bdEVKMoUG3SZ8IMtc=We@U zPeeP@%>7C=BjZ<+?d3M3+G2N3UB`;_tbXou=}OEl>Kn<|9w!)n$++p=y?7Asp)c!@ z$2l8LJcaN(tkY?Al>M~Ppfo6$lh`jWVH=Q_G!4}MH#Q-98xbs&1VCD!h1L0KGcgwZ zl90&BE_ZMO2pjr1o_RBh_x0qvZC!N6<1eAx*x`r72!l@4TlnlUjiXo(QD1A^hrN#u z>mMDprJ#)8Q1fqmGm6~|U2XFKrDcw-j;K50c}%zxO`Qzjjpz%4H*6lO{To*W+kH~+ z^qhDCC-}G_n>NazuY~ZKK3R*3dLl2W5RmT$l#)*xFtj4_&hTReQG`R$kBV6df3t|- z7Mvfdz-=WhUBUXC!vUHSGvee^`Ogngy%%tM`zAO0coFf zMq{<4kVo&FAtB0F!%7d{^OQDs~)@L|EReEuYNLT8Fzkr$ZSH#7`E zA>!gMqb%aDX}-Oy_g@#^8CKH8wVwKt08NdJ)kgCE74iTT58=4T{v`xmRS;!vUdfDK zYM!;S5&U!cg7*Iq^_5Xkz0uxh1{gxRq#a;DP`Xoxl$7r7?i2)vl5`O2q`O;6 zK|<*i5P8r4u6x%zU(PHRpEx|v-uqXZgnDpItDtv8Ozk!GXpQjo*5M?rQG$9*kS0Vb zWZXTnD_QPY*uIi$%gTI$5zRJ^)X-O&PqSBb3JOMOtx<(`XW^z1#6xJAoQvRHDnL;P z0IComGGt5-ai7|aWK8hW$D|@P|l1~ z%y33VT>Rkjd@Le-lJ7J_RlaZ@3ZPL|-m*J_D1%AyQQ1>k?{6iETA4Lk%~SUFF<68! zclJcYo4vzM{?j8FnMVZ)cxIJMhG^int~czXQG{uDN9>>Z>eQ z6zCK;kKoe!4s>IoC@kJpwEs;E>rvOAqfF@Bwg+&owsw!tLf$|&sj-lRC@i=x(0j+3 zd)GfnqzZvx;0CrI&Qe$d-G<+CLB{ewCKhShaxL7`JZn#1FJ`EdI#Y6uDF@_7py$_< z<=8)w!Mj{&th{40X}*NB;Gp96$r8tKmZ7Q=QfXF8X7^V+pR09yH8tuN_2Se=L#ZmO zylUmDsp7(UQyD~>ktXF&*TT>MB8=v5c;S-sQlsqf(Bg>v=i>+@W|)rIVAeP4w6Bb) zpcY3grKcfPST>Y?#oaL;1K356q1?Di1O%DlR6`}DRQad%Q)^uO6p8k1krFXg9kN@m zWF3_Vu3qsINHb@LVqfJ5Jxa7Oe9OBx>JrlIxHBWmUsqagHrAElwL+TQ)lO9< zdD@6=*pp-qIHXo@@=d)R2J8x11d-GLS|5=S6c>3)-X9FAG$UEzc*n7x(DERR@FxJ0TwWX};P?3LAG&+f*7Z1CHqE*vS<$ygA1%rr zx7v>ck3)b$EbM%}FOJahg$Y%qNlZmVX$n2cHsRnTS=T!_a=7@T^R{?i9*lm|DSYp{yOwPH(Z}H2wQl0jW{;+sZ){Jz)CW2_20z2RNxwNT&w!sZF!EkU=R7 zkAlI4fQ*5PiJ*$Ao||H$2nz}f-9Oxka{jvslLYzk|CNo*fI|iNiM)QyO$$CLtVf=c z{|^+B@sI&N!$B~l7!;5sJY<0+Z8iDD96({*?C^|CT@qFTO03jlT8DzBZ@s-^ss!{+ zEUM4nGa#WT1`Ht5$o0w~o5x>QT!~`Qc~n8_aG>*RmTG0ifg|0EYwq>XDsZjAnec!@ zwM1voL-B}sxkynNtltFk=%{6@aqr%;0v9{mRtBNO{ z-`%%w_;WbrFTE!+FsTV$?KKN6u6!JxWw=E}Tam482E1Z_Y=tFxq-7-a0zQ>qX@T;L zfkUa-g2^1902bwGO*uy*N+(G+Snil)^fdNMKwK|pH4zXY%O$O>QNbsfKgAE*G@P=f ziU=nZq2Ez*zdh7{r-*bf3BO3?1#mI0feF!Qx$Fn5N?k`%eFs+C7=qqcvk*#aBouT$pPp#Rp$4AsHZ-?R)$_ zxo_hni|d=Oz~47z$2A5*xg|brX&J+I-{rwyYODXG@hF`gVs#Tpt#{Z8zp}}#b2tjG zn-f=YlDmG}(scauB!QAsSa^1vYyG%fD~&k8FNceCe2eqJbKRB; zbUup~d#qI+My*13cu9rlCDH^MWICBrFOC+BhJn~>g)(o^b+o7OL}xEJ4GgFLJsHKK zbnB<7HfZd3{DXGx{w(|mL4doOOJ}b09s^qOXINsNqd^!4@1M5}g~H9e0+k%T;(~s$ zQd$v<>x9CGm^U^{*%L<{62Xs+asDle?r(ITp)ntV?+AJfnaY zsXf!@y`jQ!t*9U~${1d?#Mh!75z`ZFyreezyH;A5;W1}Zl(=Pn`5TW-1?g{dMUOb~ zl&-6$@)-WQSDQUzrbtV?Rv^Po%KZM;Y@x`5k3Z(K`6sSqRnnV@DT#YMrmwUukMH*V z38>)yLoH~i*)in3l|%`pY++Z8Qi(RK8t=$SFX;x=9(?XRO0T*x&Wu&x%&v$4HM^MOLu? zJZZAc#Fh=~^FxBP>;peq@f`%`r{09s(I1)DrrZdN$H@h*{2SX)EUe9UC&EBJ*c^}67b zUV=m>#)^{AdUOEpAP2-uRJLcXU;7(OxaYrnYx{+py*sp7pp|fR>VPthH zpSFwhsNh1ws~s_wYbz-MJ;j>c3e#gV{%B3-vay~BESX;&`-@FV*0E#1aCwV$=SJ(2 zVk~p%!OFc5;H@V7^F@+;6&3SImCf7)TbWfE4S6MvABW-9k0IGg_>D3X#0+Bth?mY+86Ik8LE z&Ch4JoT-r<`LR!4&U||vNpTCLS zZWVBZR?|5eFyFe(E>4dE$>9qElO`w#Dx3+}q(I0J0Vw1H1VBP@e}Qs0fD`kG<_il5 z$%3avgLB3c$S`hKtRw@mcradLyU>T6cS`uJ#e{9=i9nUsNZP~$_^vc1ptYBgks((T ztgq^h%na}Ff9@@u>4~Hgo)hV>_7;RZ(t;q-8?)S70+mi;R5FHZxv`Xyc-Lyd8k&OM&=HlG{gg)>l>HOuSfc zD(51A- zi(Z8lstnSoBng_Rvxa1TZ|Cgo;%CTbYmqRem%FzFlCy#2-U;o32&czsv3$XbG zt_!_J#|R0z-d{T%H4La8OUd*o4Xr@{dqN<^+~_;~cgo1$y>+>P(_`eNr;SEqEA*8(FBALt@yZ3aweubHBzp(0M-tW5>^GI24_iD{(TRp-S>tqzL-H!Z!W4W6v%jXq)Nsj5wUeoa8e&nrCX@)d&?AK|6>391mkmHNvA1n{Y; zs$q7X#uWgN5B!&pp^lCUB5&(&>vG-u%?@B7=`zr}KR|)`CvXT>3wT|jekqc3JmkZ{ zK@aS#;z6-3g?3Zt6$D$sY#daWn4;5sTEfbBAx$(Ku^(_QYp_7N3!Vv-V?JQJJJBH8 zKDDya;>N>w!^dYUpEq7rq)*Z`EPiv)n!NTT2?CMBqB0+u`R4IfSwGX)D%@p)>)km|rpH!t*;Zb~g?cHi2JCE@*k0uP4UpL&7-b9gL#Xw0jMayYX$b>j38r+k z5I$Iu_`ZB=aT~Yq^m*N|iNEtD2-Xs*L0rYoR2E+}OkB6hZ@tZ@wD~-7u`_`Faaxvo zv`=VstYg$y8o~pJ_|7+M{fxf*@wxx@tFiN-(A9ZJGV6?#Q)PeOhMX|vProbu#hY%# zbc$2vs=v7)@8PlQhtqLB;wvpg6!lfY+3B<*t&<-Kzb;ucA2yxRKXnm{8|6eNOeudo z1t!;zXWEw$&~BCX-o!!iz*0Nz3*>QZv}BTjTu_04sorz4N~LB@nU9>LT=pJ5FEkfa z(axx(F;BWZuc1^d6eLVz2o3pj%WhgT3h8nn-|Q??FMJpu!SJcSZ66btt zMoLGPR}(&MM5ZB}$bJC|dbaPQ-t=FIxHE^1ghQu4B~b<+a>9QBRyU%+5Xw3B35H_{ z6z74pM*=0lwggZ6gq45EA3Rly<10asL1Kc>2nN{nJp@*EDsiJRLz*%inr))V6wpjT zLj8mv?YK!l-(wc|nr?ND!6KE$UO~mdVinn<@?YW?ickz@X-eIxd`%_k=2R>mo zSE+iE8}P+;*}5Zi;8I)0Zz92NezxRk$ZHa_L3e9&n|zk7F^Ss+Ph+nXZ^rM6r=ecClA}z|rqqo4wK(Ffy3&S8&y5!oq?*6dMrTe9b`#nN(<}^5^#jsX$rLO>$-@P3 z2_@ngO;M8vyFbaWMSejj_a=5qkEa&~n+%Md@AcuH;_LTbdp!$kHP?hkUfQOBZFIu3 zlBUdrPoyvyjG)=T7M177BO0{d`kHI5{IxBWUz%TLe0t}5*0w3g*C&3amu0Pkw2>>Q zz#u!8vcAUB)>DR3E|O!NIN|F_{s?J|s`m)`BvjzSl{#JV!AtL-tBT$`2D}OC?l|Gr zrQpuewGOFhsJKR_50XQFCl-wry%W z9yq&w<>C^SeDOrbnEFH?9dv-Qf-G#Tr{H?lUS|E9h4bRtks|U80ipW-4{+HL9 zwM8cK#Ej;)UBAXO4mhG<)Ht^MLRArm^ENkMT+Z*l4D`ZI>s4VAmsjdFm(z91t~7D3In`-?`1$2E@6@`82OR3o!|AR1FY_#35wR?ITksx96njS)-;!R zrj-z-56*zX*n@Y{^s^(3`f1^aDqMc^|?x3}$a?@?23MrOuXB*O61 zWnj;T@QL3|A^LKR&VDXx3Wg1MwFg5(w?5U5E_j{AX&Ng-M8bw*qDv|w`zieO;m>hx zxJW*Zy)F-W6Q4H_)~UN2B1T)&Zeyuhx*&+gv*l-RLD6^Cs;;;uYcQ|06QWHnn(fDo z!6=g0&W#paoA1;_2EU?fa68RV>@K{SOtGQ8tkbR28bogJU|A}1Cp9WCJ}T?1}8N)p&HZWM5; z1%@X;bOZEcys&^ngqN2DUWq1YRM&hv+VQK}awRib(w*U!wtT>NET?Figpk#L^M$yk zgjNkjqya!qfo9fXMz&c4HOcH72)}*ol=82VBjr`dUwms=WicnL4wKF8(IeZT9+(*~ z1dK@7-2kvi!D=26{~iF)vz|78as3NL2Rq*XMOyy-f24&D0O@ekW9$Ermb`~((4zAW z{FVg9gCv7kOXQ1DqXlh27GPUsp?$JxsYHhPqMHDKGxR81&f-pc{9^);yE*(%E*UkB zLwJZB($IjEEOgY`Wn6jF;()6x^><<*L83n62lWTrsCrU51D(W*0q=g=9;$PqFX6Wo z%AxuPprMMj{;@K9MPzjl*Nd+Kto^vCbg`Afcpl%muT-Jn>bNLgeX(?}{rb5>%5XwN z28j~>Pz-5A83mXGl&2FbI{J}rW_Vg4OpENJqZT=CLMyWx^Ml)qwC_nz+cG@OL>u(< z&@#YP@}AswE6`wdR`pn;CT$GbZqrxy@9HGpYp@X~%OQ1Y@(bIT9TZfUG5CyVUbe)A za=R&tA7l&o?0+n6w&?Xqma5FWs7)8XYr|p?wHR=c>O_SJU6K6R;N7YL+BWP0O&@O6?lgC{uvT&qSG+28=6l< zAH4DTPO)bQ52@T!&`u8NPB0Dv@v1A`&-0{C2q z^KP9^J$kDIEyze&ZqF|;@E)Flom>C~Z#LOa<3TJ%D(Ev-;n0f+@U5e4-7&fyXwSdQ zp0(7F8`;VN8HU&^-&}2Lb)v%mu_|+t0nG7 z&t>AzOo#;8L!tK-X!#U1l`pk~iKe0d8f;eX6G^Y{Jr)@aO+c9!zCWuDJvM2H*9s{;X$>^Kj zuq0X@`;elX(1V6-qZADM#s(~u@ZWz}xWP+oP(`W>9Y8?}?LX{=K%WYwRO#c~loSVG z{CD9QioC-BGCt1ox$K^#E%Ga{`V|F$+`8=(1mLecq;GjNHgw6o77@FWjqVf#n zAuHZBeATp)*1q*%GK4foD)Bf@-wan-HDvkP;+?`;oycEViDh$CMG9NomO&UMq1NAi z`9vK0u(q07e9bh8En35>laqK&jk7HzMnv*?!Y2Yr_eoMy&yz>ma!mh zO?!3u!h9OX(w#>U1YoY7F2w)zi#6_weUEqQFJ)#{>P3VPv(bnq=}*o^ zJMU)@UBr~KZoN6Wp)59{4KT_XXL0DEB*lnn4DK!AeKYyd@g z)3z;K%w^hptq;bu`&Vo05y_Ni@ijNCTGaG|$`um`kjLQu;*g$~#B#y!x8omf{>+b! z5rzMQwtzu|pFD(WKE1yjACfFV@P4qx#Mi11+jwXFbU`SOC`Vu>fx9+nG>$=+?SE(vC*n{v$ zVF?ldll!$emWxb>SS2SnYy1YEIk*V}3rU3r^F*Ua0rm!1u4RH|_Q;|6)OpFx9)GTT z@SwqjEKw*7VsH&Da8e4^5rFzBcu6H33kBT#Cv^u|+s=cgA$mOAp)P|%;Sx9r5Z-*7 z%q<*`!81kv{T&lG|4W=qM1#}wnX$!3Pl>eT6+xFLV*k$ADK+ZX@77d>gWD3nhWD6X z*`jv{nGiPou|DI|*=zm2zwQ=%xM@E}XB>o@Pgp&k&h}Y$uV<;h?_ek_%^vf);tBE7 z)3bx|M#W}dO1Fk5OX)d(bp9LT#y#u=t}G;3Q0>i4$l$0oQnt}d%RO!ER;d5grZ&N$ zrok;w8x^XwfHuF3(6i_Ni{tfNPD+5aEw#Gu>bbq>d^DLpjj!2!H&81pbG6{?C6tGr z6Go2SKZERvawHL-r4)`ZATU%)C*n7+9Vd-`H3gU>MGk!{KI;$8TQn52u1}HpqS}*$ z{9Ogbndf8I9`FeE-cW0OP4Tu{*-T#*eOEKVbx^Y}D@4w7E&#FIBHsMn^|F~I+qODF zQZa=S^~|E+JbPorGJZik&(wgF+;|3#+pRkg45~nt$+3Z=|CEX?vuZWj?BJh&z0FAf zxvU%-_F2um=w(_E+J7dhP=lEprRy;6-n${u0g9|iQmy1)bF@Hy5+y)2#&;1%?hyOj ziR>@;Y;0Qf8=v0r#3-}R*3@=H>b!kt9Hn9tTef^&vAguvt=rvqtX_>QisMGTGyIjmtBer8F68tv)usM;YMj<7G+IJaY$Q4Y>unN3 zx=+z9A5*gOmpp|CAfH&pNit_%vI3~v?%+T^YX8}-m@KN`NdBcqc+(a3R!XpPm^wQX zgbxqf?blJ(;|`_qk1znaDTm9YA@wrf4sHCRyf(WKT`@j_-Mm4+BECK@Lb7{18S zvqd0M3eEYf(;iiYUnu!xu;ZK0_{tL{w+wlDyCq^LTB7+ke&41$llm=oZ9LMqg{7ka zSXA$KLOtz?crIA0Y`w{^EV9>1ioL`U$NW}neu)Q?x zcOMJ_WaNK;WEL~xHr(la zSDj(Fofneu)+~p;>MBt-)gfO^Zgyg3QtL6#jbs;I@rN{jETI|NwCCZARno2; zHBvO6xM8;Yjfc6>E}#3?Nr{P5N-+k?7MxpjP`HA{_-lO>E)z$-D%8z-o(m8A7nyYl z1kO;-jQx>35n=16z&{eN?k`XEl!aY`Y>s#0J&p*rki#VREY6pCi!2(``V}lfO_~vo zp~*k01jD66&%TGMJ-qlbLYgYeNm}HfEr2h=`s@M;z1t?O91V)G=%Q44t=B5KTM zfu`k|9S4QXcgo^fQ++PgXfABAH93NmO?b!qv6|OstKOk_rPQ1kJ)25i{09jc#SG{tQ&ReQP}`>?_IW~35}NA#bVXnVfW&<)TRDi*R3dzvAA-4}N( z(q-+*_M<>RJ3=LobpSDiAyF0X{G#P=9Edb7a6Q7??5G@Al+7n?w;)Hz6ctyIF@umwcVJ0R@0G{x%qehyic?*ibrpK}HKvR88flsU6l9+EgQ0WAb+g$Y8o{?C{}Iddr|>q(%( zx#C38&>%p~TY|mFpC$KMDFYpthC=eq1;hr2YP_ElQ-rmDcfjUFU|9Sb%lwH+>-LtB ztQ!EvqD}}foifQw9$y@t(IpPI!$sw0sxG}@e!sN-`=Rk?0S>-Q4ebnd(F-|$B*F%xECC9^~)q1U)a-`{_|aWZ9@H+MA5 zt;BP4`LRHd$H3V7-lGjm0pR89{buY=C35WWY|%zTZ`nl(NT{eJ)d^}q2YSM+bihqn zZ#hgD&MwuF0047sOTZDw1mLd|IDxTIQ6^M>No29al-TCg((UN(Wb?BMARp+;s`je- zh^0Z#fPAmzblu4~D;wcT0TzvfGEQ%^KN;F4w3&-y_9J7gcATKnfkhKwwr8v}@bH_> zvJdf(8DBR4WG(90G0Ue&MQN4t#M%!WA-R}>g^RTV+XU-%+Q|u&e|)2i>a;ZHuF^NR z;mn&A;C{V*KAW!lNdL|KQ%8s08Y%&FH?D53!B0nZsLid@y(*m(3|Nlc{ZB4~Ag`c4 zh7oz4Z1+VqO@XKra^>1ry4F!HPQ17=6<9w~DK9+-UaI`${B?2$x6VO2x2b&j@Pc-% z<#s`|)HX4K#(}I4xo9a7{xVljt|-6;9lPt#N4-bvzd4*YCJ-9CrigtaM`d9uk%GT| zhXu4f29f{5{}>;w(}Xf@@AGvd_!AI``*r$Z|ERnD|N7rU6^V%`*CZ7Rc+K6GfBpE$ zL?cQnCZ=aN3v?MiY#!y)SySXMNB758QAD99%qchGrQ_`_SXuDnVS2KY=1XTsy|wkr zd~1xEuL~pm>(BccQ6&49uoe$GH*f!cpvg0Ek_JEj$y1(y&v#LeUC2R@BD2_GM(-SJw_R3+Ydsz*g7 z$p9_VpHsIxj;NdD`)Jq{vucHAH|Iy@>a9bx)L(1Hv4y4H8at6BHnT7cUjE zwDh(9b>eggtB1w2sOoU?Cb|dsrSaf}tX2f3da6lbx^qT^xj&_hkLuz5-8RP74P3Cm zx}NvAnA-wa7~EVmwkppX7Q^qgs5IY^^V3}3zlf?C%L?YmfHU(r5sg#y`nS}f%-#h- zy#c~;{GdJcj_=c5>uDEnmlHC{1`BHJ^m9G@k_2nM#dEyoJ*K+*_ofYC<;Qh22jH=f zYDlr2NFHgvgtWP5Q+|UA;qyHF6wN9{_s0my7U&LE1vYnynZv+}4WMuLr-OiGu74#O z2hfzE)3mkv8wvHJ0C5xdYHtU<3)>o6W7d!V3YdZ%*S!x49j(`QUm)1cjhO#KC9(70 z`H&5=jlbD@1#@)$8#bI+^MXvfcuwA)i!?F~P8V%o9l*GgNzISQB^mdPeA}q6n)>gT zjuIp3#%Ps>@Hw~pzU}H`<4!`BybZc%S{K`{IUj$O&m4VKoLQFfqV}=W{PpbV{qd@| z_By+11oI;zBO}ZH1D?!7%VgG`Ot~ZvfyRS_sFL9*Azn0znl1kAH0Eh8ztl_yl2F^% z*6G_KiZ1&Cp6H%`^}2Y*H#2K$$oEj8Ka^IBBL^d`xsp8_QjfLLxjcLLAr%b`>1W=X zLfpeQZ)U%825Njj6K2OX2pHbC%P4uqg~}*t*I9!6p_W3M@)VqOyuv3C>+qF$c=}sA zwz9ZRv}5!~jhrq(JuTK5iY9W?lqc4zeIXDDK`kcW61`o4c&ty`3ql{EVT!a9wmw9e z;Q|AAf3ZlWsO5kvXwQWJ3LyL}!bOpw2b}l6>}t6&Z&=Jl5|#k%9Gc`GJa$JY}IeoPK1SJlMIs4`p1)`Q-sQ7UH?LaQf! z%9F?|Uwiqrj{amo*supmPM+fruo7S_7Zr}hz&hBh2YxRK%3!`Byb_U^NHF54akRvg zh(eTSV}~-F1$q?rkc#*C{No7Rg0qy&hV_g^P1PpRdmt8VaY|w<9Wtq<7~u3ZMd5ag zhN)B{%NTs<7fF_hmPci_e41Y)YK@1uomG?{^)UTrjfmTTo~yhcW?b z<)+CXG+~0s{1_Wb0ImB;cP`)uksy;}hls}!xdoPwrW7fV4@(pUg8CF6S3ng7jwGAQ z+aJ~nkr415tPLjRq@e7TnpZ5?f_PBU6zk7QZ8ANu7~Xy+%Zfgfu(7dNSkYg%;%C7x zFaZw^^5Mbji8_z?ZL0lN!}&(!hY;2I=F2*pEn=0sn0TVo&-%-(u{*n*ffOINa0|Oh zx4gfTKNZyX)cxkL9vNwfV5!m;l(7+CV~RXJ(_QQfc`WOGJFUo9;G5Vnw`Sy!QtgSw zxDg%1=&nw&T#N4CYx%|C;Eid!xrhOll2t5+S~*2TIqM*OQNb{}a|H`eKwdSi>s*m( z|EzSOsE47T)BC1k#eB2ItuT$B&*V;MA5n?a-naUHl%V(YZs5sZ0;m#}Q=X&B`4q*H zEvGfE7x0q{-r7$|qG3VU5|beL;btuSU)#L{6EMd}F-!z9v9aYQU-u}z!f^fmT(J78 zuHNu-Y>~cEa*F)zh4I#(qqxw&75gLK(hVziDCeS2bo34i(See*hu0m#n|sU4l)sR!*4lR$v0O${9MKLe!5ToNalg70dO^$MpZEe2eWuFyK<8xUE6 zl6lS&04UtWl^E~P9|uW^Tv@T+0&hEa4poy6N+t*vjKS;8Rvn^hK7ud&WoP}Sof;Q^ zL3v#71JmSfNY3rj2_}LOc)H{zHZCPM?*7dU52w@3Pt^Ll-~f#`v^e)$`<UjM}<+L?>;uZE+r--p%mT1ttIX`WNhv)47J~ro1XbUj8>&){(BZJQTN-k_l7tw zfwLb?H_Yu5j+N`jePXRC8R>STDUYA`uBm$^Y5IEeD_##akJCgBUS&A7*798d1M}>~ zR9aaJWE{0$-M>;jb!=02_*nSfI*N9}Pc|w;fkM-6qz?zJWw#B@ogj7o_c#)YhsP(z zo0@{_f`**H`VmneaR` zsiKv2+sWn4`l;Nxp`_UcdG;s-VnNuA80@`yhK`!fN5gs_%o9!lhY`F+f6Fln15$yg zV#1W8+sz=185?vIGav^*9*KcP!>Q>pUmCJfw#J~{pH(JJ8(Ew+23pzj;{MdeFLT#B z4Gc-AH4|}UYxsa-h$QU%u74|=_uIR8``gBn^x_{!04??>1Ctg-7irx6sBjNX$TIlgW_g&uJ~4|(?? z@pUS6j=x$#=SRJ-{o2zto1Q83G&m%XV;x>%V_9AZ(Q&57l_qzH})EU|;R%1H&nJfVz<&ML8ml%T1h39{< zk&3_`?wcmZ%Bc^mOrdy5cb~I@pjaVYZX@BhTo}`u&Eir0J3DR)gHiW}0odK#JLHkX zG0V53?fRX~h<8BBF)MItexB;3;-!Ml_ zYSF-dcTj7(YdmEr1ua=U^sWlx0XD@enq=~p=n0dIvT3`LTTg)w^Qs3K=5aF zSHoMeNP_S+sRjd6aUjgjDt&xrKY1~CbO&ed?~N-nqkPmmd8glGY=vd|CnF)%)_}0PIey!b;0vNif!Rp7f0qYwmMFRaty073C9mac&TAih=FhzqyM=O} zn`4^R^`1PCu`@U-=u-+-Iw%BT_MdJN_o$XWYuL}I?A@E}b!3uHPGU6TwETEc)rwRw zjnpMIk{FkCr<#*S9?e|1b2C*y=-$f;p!{2#))LL~!Oo8%(>W>P75+U>qgp@d6qh+! zCUR@}wllKC|Mcv$~DIBem@%GWO=r#SPDbWkeZ`Lxn~b zTD$e=(8n(4M6F-)y^}8xquuXwUzH(eg{vQ_`$k(NyrcQ>MwF&_=mg)qB6OW1_VYZ@ zG&7SIHKPkfqX53-izc}sQB$8_LwP2ryZ~I)0#a*~E(^-*hqGxwHWk2i?fUcQhuqF=)1;{8l;I#BZ+zFRJFx#l-EDQ{1@1k9)u#UGQVxx! zxoH~pO0`Vq`(mxjhsu*xs!&3s9Bp(t2*5T1qaj%G@!6@YD*B7WNY6RmML*0U?x1tWEtdYfSq} zjlF3ND%Pe2D$`6bu9gs>?U6`w-0E62t4q{3J~SsDw`cc&xt?6p{t<#;0M7cDu-ulo%kUG)m()GPa;twk>fdZEdThaLGdfr=$ zfcMa$aI$b(m8hk($ekzBoHd>gUfbqcZ-%y+&9fui;j?o~wcndcsA3egQf24*Jx{QM zo2tD6>&$^{7H zz-G{w|3$-mpt0Rbce|sFN_WdpPrR^l!BE?$oV}WpxkUPSv*aIl@_Ca(l$_FjtfH~c z3-V9t_;AdYLz#lMG%=zPK?)_|VYX{RJl&tOT=AAqKRXpg?7gJ@I)^Q7#8&pCK8@|O zocoHTM!F$3C7q29TN_J;*^!mG7KkJ!5lp?I%Xjy8XgCfi>(}ejStzuFx!Y6jLH0BU zvI{;HX*c5GPH#;tH}9Xk!((N=Z=7cd2l@q)VZQGC z-JH!XfkCU##-la6=6+?YD!o2zOWL2ZsAS1IKMAv3R|t3ZL)fR)d~$G<8y83L@kNxa z1!2=+b!+@CKu3 z8t2?BAD$N8%N0#8D=Noij~j+!+>esw8c`+F`V1S501kq1M;4j@bYcdD)u{~-q=)b6 zKQTq=A<RQ=gXY`%s+y*P|%0v#D)b;wYPURY4`XL?37Rqdj=k+ z!Zn6}I+HX_HuTsOT`&ITq{SDkx2F&fYvQPZ6lFv(U|OCxGRG@*W%07`Yeq|p#b__D za+eVOpY`?HH?Ei%fT?ZLqVLi=qdQi~6qlhxYpwWFb;pk#M@F}uktn*e4ucHUd2zu< znK`C@VbDZwN8XOSz7`SYA=Azn!npm3ryRTl#eNhYwQ0Gx`-Be!S7Z`ORqq3?*JrIc zu3ifZK_sIhWcfA*9ft!w!|h)EKnREN#s{oOmUy(aZ&YTVLMdfW&B#Gn*%&`AlDCob zjPEpoeP81Xi3D=JcJ5pBv+<9Pu#9JV>*WS8Le#{pXLZYD@Sl$7n{nbAabIuK*H5>v zGzF0FgaW-1uq*}9wJgcuq!e`5JF{DlzjR+^v7yi!y{qE933lU|iz*YBWTW=jvgier z3|>QCkT1S=@0#SnF8hLZGQh{4E{2q!U&mrTc?~)JUZN@uK%R74f&thLkI_#?Apn=D zDcFXU(it*&!jE+hSM_U);UOdK8t-1UMUbSV+rPs7o zUss!?Xh$no;7ndV@y{K)9x1YB+6JJ!cd1oK8J?TaXbj;!k8waT^$W243WL&r-TZS(lA7jF2aKBwmUF+FAZ0y3QysvxWAus%T|ZPb^b%+zfGNX zw%MR(MDY0k!^UHP&y+$<+ujWEK!*W$=RdXC4O}V!1nNI$B?z;oq7}sI^y(Z+QGYj1 ziME@W^*B=y7GdkoSlF3tr~2yow;cY<7h-tJAJC8x(fh1dvk=e&L_}_qRxXss{bIYo z@;94`9-=R8{`yTNW`5sq8k0#c8nPyANTW-_m@_&6CZ>BPFCl)AucnzOej}$OEi(-w z%iHKfhoW$mpeS^<5;?%vKovkwkOG@7=*eX$TFT0ZcZ1R2UR)MnJ*(QO$`b~z;`U4Z zrbu8efd(prr~DHl9vCnO4o+wT|0p4Hr1?_#nIHhmj67hMcmL*&Z+W(9|NQ;_^{j@x z@LQjlq{tYB$5|xL|6~xP%bii}q$pTw+<8t+FWWCK|K!l-^5&i2*L0)GHNKR}hBl1M*3{#+JbPHa z_dp~Z6IN6YX2TTL8V1)}43RXK2SHm4>;ZU`B1}?1eM0k0^SCwOM|#{3$9P^{>kn|= zWa;YKFsfQvoD;#RLVN(pjI9~kDOI@?Kx(~uPV=fgz{H%w{gtm-YqzBi~ETFNaa%I_9$30VyP8iRyaJ9FF$u{W$u^cKxkt=Wk| z`6FxRrY|S8Nybar@{XsCsxW3*U301m9Z)R1LD;~Ef=!VleR6F)?|eW)=JK(^BD`1m z-EgvBk+FS!^-i$}qXnR~R%rkQzE7jC@kMM45FvmpCPF0I+yFcGx5*B?P4v)Jn|gAX z^@+t0H`n#T`eg{256%6n+d#f0SiWdGO0xiW-0f}Be(g*D)ep>tBy#REw-I$7>;4=9 zHpfiWzq&Jz)QBV}w098w*evn=pXwBS>X>+eh#5S1H;{yzk$t-Zqn2PqJU(b9mj)N* zK|jqseyO1qf#y0jMfM_ykaPgK4)1o60J|-)n1f>YfA$@&yjp5_Kw3q0b&Y1#P`>1P zs(tjQN0~5L=s9R`mlgfzHAJ?O|FQR5+2@6FwUrEaa4nH7Th=mQO40CD#AcQ^Kx5mr zzV*g`>wQy}>z1|B<#5v7YW>S^<}iz9%O94@{c>E^e)ZF$la}M|8}3DfO@fOnLFH1I zM3XW|PCnj*Vqx3KwyEgjH%hJSGv{``g+oC<=TbdPe&oKLlYhW0ETZQ}EZ3Q}x)321 z?hWUkdg0GH8H{(Evuk;Ye3qUOE!UdESDQTic|Uov3*iziaT(vXZF%6)Dhq#_LHWM$ zF-peoskcRUb;ljnEZH}o4aoBNZrR%drqN}m&A%4@f>ZDegW2y%nOJFOB2%O;ozv)# zBXvn+8;5c@+e6j{8ec2VR#)ggDk>^r{(nTBWmFq&*sTY5cPLVcP*|h?(Xg`#ihW>d+eLFlF7>7tju%E-uo&$uxvx=$})lCl8MI=5np(woKa1F z&kCehcN};?Sx^1&FCr?YF|A)%do&XRq1JdMT2K3j3p7sRWSwRn{;II z#Laz`8KDag{KYg{&lEu|1N_h_!a&88B=$_x5}BMw zN<-suoHKWHkf1*x$ z?rr?@4bFmjUJlC&XbdMZk17CN)=ZvuEGcPQygmAnp591&+1SN@@^XD6&+eTZbsX)c z*KdBclohD(L&SZ1uk28V?Rsal6WyWk6JkAJ3}VM<`#AFyMF2!H#2G0X&Vq~?U6D(} zP4+o$?%||ooj^!5&`g|S&-q-Hre?qYjQXBuE{y-W)|~XpIXv8R^zuDjJakVv{P+Di z`|;*!(T(oNy!CXjDa};7uXXo|B?fb*e$FX=DRmKfo1z&lQq`ZJB}+bX)lb~4$oBn#-F6OR)92_3ga3 zF6YblhvCDjn=ha&lkHm!VM~A2k@VDzGK65{}0SmX|LgZ|hKRd8^XW zhKjZ&F2w612YN=HmThAe@b|2}$0%CKs>#1PgNZk{CnYXSaC zTv3wkcvBaj$Iend9~`(jyt0f^<>2|OC0MouZdR+K(0*8PD4%8?bDc)V)yrI51NJ2& zYg(Rp`^u&0xME7}#46b9hydN$>*jEeM9L_OU#yLH-0wZ=oP4%XA49lc^0z!IQ#V1g zO8DU2jp=5H>HGZDjPtT0SM{62h3X{BurS$08(4zk>#%(orhn|Cwzqbd)t z@Pv%u}EL7>I6E=AR8KIKpE8)6puOuEz&WqE`FNGL^Zo^0;5dp71b*KEG?n3oCN%Am60P_hs>)_p7AmClu(L? zCKnc0*g5pWlQr)&;cqFSwj8$xpI)DK9okje-S8F8Lz-jSQ=G|`(;YS1%rC@myf=ek zx%T%mF(R|Yd>SND;x_(WU5wMWpG(z;d+C=qxDrendzs~*jgEb4d~;rona$52?|tYO z7gYMqB09S+JPJNms$3K$k|R*dx%V0lNW3&@GmeIn>6qsj<~|}s;>2k8P%>xsYuKf+ z{3Efeme7N@`Ivoqd{)G9nV{BLR_PD(`L*P^`}%flzcF(nyY=eg=3jKMjqj80q3I(x zubKkH=(&R%!5Nxv%>n8<_=?wYQ3$8MLiauOo!fqbOgl1CT za_LVS(q23fIAdB5YkqI7a2rw-81$>=CGI?(&2EIa-fbrS48S#H}KeAC)Zv8<7Uf?Q4!3EUz zGd7GyKY>uG<3Z@Ra_*?@&_Qv;PK}jin=@3XW_XrIi1woo_P)cAu&b-<&hW0+JEcgK zfsqkPq7A?-HZQPt)mW{Bx8-r?iFW+CE}Lmc#;z@!J#KkjBiJtE$DgEx2jRUDcCndh z+%+=Ir%;pEWVgkPecc%`n*7dDO)#jMETbTgLv3B%@^PE1VXi(qH0`cRdH%vs`qR&; z9UWP@Cv;l!1g9U``79R*^@|CvGg`Vnhk+Qx{U+>qu!X4(_|ple2}ORtJI|;O?aI}< z1(b@LNzgvf32a8oF2MtC`4>3tJhbDh1ad$sGLGT-#!$x4C~7ZZW1wAB08 zG9V9kmWqO|U^&&_t$>f=ve4t-$CR#ku`$N`jqOuevvc^{S?<$kVK;$Oh0M(8ou)0m z3Dazw(f*`{;hVILqWN)S!gY$QvnSoIht4nNdY=T_ClR=ovtK!Uo|<8PT!}5yW2yl`*vS7~|LH?MLhc%d+l|EU)$i3xit>so zMpovKJlE{^EXaE@B*G+Yqy0RD$yoxYlJ8f;>I|F_=9k=tsjhX0&MbC+wo%-L!ogJ= z!4qeay9)B3@k~XU3`mcA3rQhX+OJ{7LMrcEtquYuF$?E=dq+k6UM~Y5xEBZnBlO6V z($0OQz7z!?whX=4-&wy}HfoCh!%J?-*p3#_o*38OiG~ngXYmYIjBBXzigLF6SVM3^ z8R(=xrhKgrbv~ChHRY05DsCx1E?*m+d*~SSCgC5U`Wae<+ZdE%y$&<&#VKDcR+*5{ zawlV8hbLtFECdlWq#5nmSDRlaAMvcedTPdJM~_~sEOLlh+{n+4tdXi5Pl$Un^|Z9r z`J{f*it8*X`IK4+b+09>fnma}MtxS|PUAi?oUNCc&yY3Oir(Us73^Q)yktIlRP`9( zL-}c=W5P8(P4Q9p=1eU|toX@y;wX3bscXDAIG@H1q2oSz-y!ph$3=FSPvL4GwNO@% z@QUCM{w7))m|QF%wIk{SQd~}a={8N1XiH)}eW5?pR0NZN_gZLa@#Q+4vXOz3#kU<` z84UHsGi+|@qD+#*6en(a_EW ztZajIoM@msb18@@-Htx6zH}|B&#}<92Ynq6zbx;88&-kBtSzB9k92ZA zVJP3myI_a8EYvG_yq8Ak_im)@yt}^DC_Z#uvaZiR@GD$OQDmH@jOu=22^MIB&|4jw z<@v7XYur%-_am+jvRw`*1Br)9%mLqfG8G{$Eju%FH2r$(>s$2>oO0{l+}3hh>w}W} zO#kI&f>;fLMxMPFn8q-M5;O&9%wJHv33o+|laliL!-rFw6Jzii8PL3X2Wqq>o$upf zhuj-K%Pr?!&6`p8e2d|q%l2;LLjs^;QA3_6oN7mel1hp2w{ZLZlv;EV*7K?4;Sq== zlow(KDo?pmRwU?P%Cw7X)a#QRIjkr^k&kSqi>baCivvrB>Y)^+h=9DT&&ZYLALKvt zawVbABDDL7Z(n*^h!O!`Nnn8 z*Psdg?hhtbtj@BR_08#5-c5LwNzO{w#g%2mhSzNF>UV6InuY0mlr5S{BN`xhHtsKR zk(L2yL78s{VabLL`kd=#1E zb?A=n`4RHMy8*oZZNx;>tBDbW6Yk11&L}nO&d!gD&JPlX7dYd`u4xtJ!E$>2g0LJl z{z`GTlQpB{&XaIU|Hh>IuCTaNB`l@kV8^H`(hZS&wplg+r|&`V4!t;!9^cgQkKwKB zeHc;J`Dc@=$xgmKOb8Oqd_I;cxvZfqewa0F@Qj%EeURAMQ1TSN=>0(&(VlMA)QFvz zl5R}T#B_+hJ4yurfxeK+aIN2u{RH9kOJ5(Q3&F{MuQ$DC30f9PA@%ytr#YAIgtiPmao=Uu z1+<)6B4K;1VWf|~ym>N?31czo+kN`rw6Z|A)kB9SI`Iy@r+Awi=nMTXT=CECmIt?I zT3LIs>NO0HDdmbD^y>^Ah4jYJKi%;v_KZ zn?OVvQ^`5Jv!yCmovFlS&ZonU9SxQaNMy(HtrX@Hh~8}Z&cM?Ubul~BRhiYtJ1eQ- zD(LF0`fHV=d;4vF#rL>q1c{j%Q&P*TDqAR^lTBY*I)&(Ee~##rem-8nt;yIbP3rzt zC=^>%F_&I`Ni5!}ZMvdTf6yKqWy9Zk@5$pzHCuDuoubD(za6(1CX-sK>`!${@S`^! z^@E?USBm$Q5Ax1DM_)0bFFkpxW*$1z46<1Pg`CN;_RnlTmiw>FA0@qAw@HYx!7q6Us#aHd4JmkDw!0gP)KHp)#FcSPY2Z zfwL<&QTkt;8!jRP9J(C9Uee^!EFD=9CFU;cH?dwmPxu1-4rHbQgO5EXlE{~io%W~z zJ^+s?i3)FELC^LF@NLKA)|6lJfVOvIjH-xEJ4RVJF`)ydyxvuo)2<#Od{T!ne zsCe-m5ziL9zt9M8mohP1J53miEI`M5U|TkSU64~VgNlPi{3kE5mo`w)c@LenP%e^c zG92}B-uO~hlP2lAQ5ut4?b2~0Yvr+$_AH|^?zaw`vCYZukR4wnx(g$836_f&1^o@f zY#uh5Ne!~;b^Fcs2~}|zH4Ox-;XRhG9-Zrugb|IKhtC;L-^XMqi2lhdxld?z^M3OO zZVJYGT1fgchP8f>deWL8w9I7_%hbMh&IZrfp*IyODH+bF-=x5?lSy9GE&~M+GMdT zrZa7D@lf@L0U@b)xp~)StUAi23ed%Q_Dn~MJE$ZqW6ZJ+EF`5OOr&O5u_S#6KpA|` z_~7XCzZ7INfR3)K&2?IRMpjzAw#iN}5>DHSu;&dP=!)Fu;HgngR|fC(JQ5~POpb~b|M>!I)K^HO^H|?8TivhY zgL&!>)G_z)n+txg-E7E+-(*9CpJ`MC8N&+dGG+Lw=P~#5G=){LA}xc3wi>=pMI{3- z`4-)&{Po#Oxd6F&0=4#VmRtP8T5SFHikzYvsCV?o2V z)$atzA`q`lTN3-g{tPFW-<6~@CPNZqWb6w7e7me0T=yZLU)H-A4t@SXeOE;=uMu9X zen1U;#n**G^mVj<&wQD9|N5z}X0dJYyny*?ghrP#V`sufNq?2hmRqLT+l@0d=O8A= ze&Zg?=hs*^lkFhmLnSiOi~nw319B4nw*=WBID4w~k^m8&;G?v#LDYrS(+A?F7bsSm zV497Zs4Tz9qKC%mZ@cUHhww1tiMMSI>Sa!XB?*DomA+3MFK_KW2=!=}vL-P%Y_v18 z_ag!*ACABgV?k%Se6Cc>``O)=26r!TR$qHioGeUSoeH?&WQ-Z;BHmSRLq^ z-cSLO)s#B#e{fV*bS6j6V1kj5jM(#IT4|jxV)21fb4i9H%RbtBD zinlMK5eP&EcDW;Jd$WenBs!&VFC!Ih{>qMjhZYPlK^9dpx9S&L94i~XSI-1nZgJ7{ zJ?dIxWFdv1bhBkO$m^Q1DqCaNJ?C0e9PZ#e__Lu=E17YB7YHbppSfIRn_q@_J6fv< zAczGa_3`vX&LDHYVC0>80cYTVFOLsZgDF!_&C_ov;LJj&nZ9&}hK{Ww09y@t-Mf9W zN&c8yOV$NOX1)2J58nL%n5Iv)>5sm|2LOytL7~5yjRR}}Jk4n=-RKb3>i2e1Ic>y+ zsj>3HR$j;op_~aSd)dS1V{pA}o;WsB*tsOt9xoZem&~Z5gr$2w4^|c-{|&L)m+jjad?Lc7ZZ7L z2*iOKUX(|{cRtEL&CMr= ze%KzvxwFmMTf_NL-LF2;2WyAIpie2s*3%oDr+Uab!*B~}ryZYk_!URd4j)~~J9`zD zSJ7TksDiY7aVS2~^6x^gs4Xm$I=cmBF}|i=o`YP`R1{RSl~EuQ}ObVC3@5eKB_{^spUPL5e0WU;^ADn>?WrCL>3Dyb&ksiI2^JS2&k%L|@z z6Pd7~2aOV0_q%f(kTE`Rh?bp{&{Icecy)YesUUGQ)rgHTh;#17WgqiCN^A{xkvhmyzpPcjUDWu(WT(orJ_ z{b*JyA7Tm>EUHt5@`r$WEhf3lc~x+YG))~G5P&$rITnL_g-4(&0#&N1LT%S`rRx%h zTEKV411yJWiK>)jjm_?=STWo*9F5;f2p!t6{QJ%<$wy7?je{-9Z8Xwow0Q)-#4EL`a1X}xq~i9)Et9$w2-% zDY5k;P5_St5W_=V#pe69pLY0Uf5}ME z{|s9wA;T8L{+dvH2s8%_c|}16EHMzc@K14HhS$EXM-WN4)Lv8!% z$n~zd*~hyS8K7`K&P(TjZ3ApR39OVZ_%#ScT~|J3k!kl-hwq`X(9GhsvaFs!fpTZ& z<`UE3m^m4tl8)z@dCyH#i1K5qZ=y`%^k~1UZ+*$7v(DxfVi#DaKi#)!v2Hphyv8oK z_)I;5kJw88ZOk%|g-OR%!L^Os{6*aQa*P4&=Au`H)xakIz{IgVF_x%YBN7kC*(k`$ z2P4KxgdheT+!z2)S3enzce<##r&HRnOw`8Y#RVs8<{`mq(YE0GrqkY1-j+MRSClfD|&5R}1>(0hjms1b&m3C2S;lzZ-C`8?*JxhKX|&_uzr?bWX@Q=tIy z$5GxwB(aEY{**wk9z~pkKgMPg4MhwC^v6KJVDPaX@?)7#$lqe-U%>!u!O$$gqa7s6 z3<9ujlhX1mMt>Xq5e7=lop&G1*Y1zU_t zi%KJF0ieXSB*W_TGUxpAh0`)=YrO1YC@OQlr&(b~#nZfMqp`d{a?PR$_r~tz^N4Y$ zlnNdHE_ZoXc*o;srui6##q#R?*+WW(q-UW;7wCL1TBM9NH*Gw+n7UZ%o%nJCa#K%J z4eu-pJ$$}r*B&(S^DNUG!Zpq5TVl!cZ0gi%8r99t#9*^rqZd0##8=Wih^+h`l zTK2_fcmy78=!DzpIQHL&58fadoqu2U1yC zGe$!L5UtMA-&^B!qPH9;yb#RMD#R%TBAlh>OGFT_1LiL_>Ce#ZXxG1>VJ(MIm-baa z+E36Tm>{TG5@7g-Bo<&pFj%B*t)c~qKtZ%q-i+{=u@ub}t1DiW@>9^KwdjyKOlD!T zGwg`!ep>>k!i^Hqgmd6Z)82O?eJG>^2dU%$VuOkYrV3M++E&OUqu#!(nmP5GGipDN z9r9KZrhT;jg*!W#J1wq3v?>gHn7YgSfCLS3HV!}9eKlrZvT*PZJZ(YYIHM7Tm0l)B$N zaB;{Rf$LjNDQvK|5zpBMf;^BYhSgXSKq8vl8y+M=fea@zukF zJi5BdZL8p5F)7-sR?3nnP;mcCjibOe@0cBFu%wma;M_9lNxf@aey&V@DTR!aA+Z>A zGEfv4nxh^495*wueHQ%gr&5-0~#+>i_J>On~9uS(U6BZH^)_wpD~3r>0S8@DWWF z3T8AOJe#Il!%B34=oI=hQJF4+I-*Suj=p#|GV6E2!5aIW>ngIJmDYgDZ;+EGLo5N| z*h{_{v?z}fI#ua$_6hpiCVZR2pt1&PtOscb&_mrq$(T3I6$i9^X2ws~=I#aEs7q33 zD9+T$^180|Y-jyAMhj9_V`icoCBa;O0kmOPh4C?Iu_b? z`l*sO(j(v&KJuf9ga_AAt#jx{cy%l+pb)C%f(e-g7D-wf!V;EbFt}o01H_juHNIV3 zTf+eC;N7JNod2=_AR81gfCB^6#_m6DzlY@l&_GwkI!oi2!#4n~vSGO~$p8oN^vGzj z^cJ_y=>P7IE*W#UzYOE6Irp45-r+e8@`N!NtCtx8n>FS*}kXX z{gAlIT00F@*Wrk1IW$R1-qMNNylr{DSB-fdVLbJh>_F+z^zzmC=h4p9;}rdAvcI9; zg}MNqiFi{*@wn=;ru3eCJEQgYax-)`k81#ze-bc6k4z|h$RBf2GXCnCB{G^duG=)9 zGIcz{aMa;XCQRMhCUbJ2MgAx8r-xO2@P1vP@MxRrGN)&FbxK@j+GUU4ko>@A98~tU zoI^o+Aq6Sg?5&6GE>lx1J3fjNa{P$ED*s4(iFCt&gi)Q=7i)@V)yF2=b?u37m)9TO zzUhCOSmX%6lmJnP5~UVAp6?NS`tkYY`b-biFBe(}c}qqbL_vh{aw`2S-fjXi9J&Z-kO($4J2Vehry(Rhq|yQ%Q$ytwBdy+?O!V=9Zc6v3>1ayg{(5gq*%xNu)g-j zthu|5S$K4pOZNq!gu(*KGQdC-LU*^j>jUe!0q^?Nb3J=ww4Bq-P$Thl6;IqTg3s}s zc8pO+7eny0g#?jA)tAQF&9bXAu2@u>6XCvvikOvkbVba4>D#{GB@T?!8>?7Ja>EDk6AVskLR)hXDtdm{r+11N~Xlp&kIfM!7~>&cg- zZ1oM{l!JRKN+xy*tEcDxhet#>nwf-4vJ zPj!nDoy%a+sy8292bTdzhd>&U{-9RXdxK{$@>%z1!!RvQEHx@9VCbG2I5-e|<)zt$ zUzetu@OCrSrzLh+V33;KH&`p_N^o_Wv7gF$@G=Q@xLu~s*xo`lk22pug?R}MD4TlM zWpehG(+R9^-do#yGr>~8=!?iRd43g0tw&W#{_7?+O|NMz4?_lp!+NT>|1R%(GMN2& z`bq#xeq36qY>d#Xin2=HLb|zVE-AX}3RJ}FS$|xXmdbQbI|0XvvU3`r7O_0i$-~Yj z%;(~TuIynG5YevJ#T+J7O_ND z(Ymv=t16fp5;>h_sE*7&Wi|gaPsplxf5!lSs07kExu9BXp`c;nK?J-L-y{i9bNxCQ zuGlpj;h=zB7@a^79mvsfbxH`KB=n&Dr@jTUeGpuIy&K|CAa$>AhTdWF=b_kXisr^u zV;hNj=8r!U-4zu{mKpp(>^#E_RjX`foz3IF(iRKzL^vD6Q2>Lt^W8i7OKhDQi`kc@ zukE^=Z!2P}qbrL}Ry!NlXXkyfoFyOS7Qf5fQmlk1N&wecY)Y~}o`vYx|Y zcy5uN{Eu)@HA}nwHZ^%kA!w+$LiAsLIIH|}q{Es1) z0k{&ir2_eIZJm-PQl#YIUS8!&^v*x>-lltQ&KBc#c|OXWzJI7bmR(9bxSB-l-!mw~ zi0Px|7TVt!T;D?*(sKUW3q|7;Wv~2*O5xIdEsp7|f3Wqe(ewgzl)kiv>A}oXgLo96 zqmi<}usSEIk#*Hfg?>%v|(>C!x!#b^iG%Nr+a}-hfh**M!RZ0xGOW=`S;OV z!GBh{)v%H?^6Q(0xiyJS-|@m8w~(;vpH{OWgL~mv2`T2UD^^9AaVN?c^<%e*1?Q1I zt$TZqBJIb&zhfm`SPGPnu{Q{MdfN`grS+KTP>8n{2Eh|r%!QQxQSGJv)`&YyRiCW> zFKUX-i(J#a8t8{n9QibJ#tESez0J-JKDs4W7ZW}waKpgQqQC(Pyc$@*a)`lqe`;u~ zZA!|Bu%<|5h2$mPb}7D#ss?S@KNIGMk@$(s6i_h0ve4gv%}IjMRnoV^uilQ-Facz- z1`2XYJw*b{A+v{df2S(H#3RLe54t!?PmxEf+BiJ^<+FR(S*`=8Nry+W;Rd`6w6Ki? z`EOm@Lc(8kDcHcmMUyq%BJcq2F*8&(E zA&mw=&U&u=@%G8!9N*~Z)MV5}acJBch^Zq17igP)QR$6Hn*E*n*tv2qp<2+^Z!nb#d zT6cuo-!2zcYa0*CrHbP6MsK$4a?91p20Ts?qcqK{Tm;#l8lK7Ggisx9L1Z6jfPNY% z5^yDMr|a}=0lzqP8W#*{%!C)^D6RJ$t2)vvgM^o+)rsy%O0vR`^RoT2xFq@7CEo1# z?WnTlJ%HLG8iKUPKv+NO;lW69IE+b3M7cGrLkw`;h4)usKat~3AwC@9lH}YOr^Luh zBZ7&++0j zuc^Lgy-o5<*9=t*Wr-hvT>LnInvf&9yX+qt&ux0%7@Ia)vT9WfWKeG;)a_#1s7q_!c? zJZ|x+cnSU6_Y%4ihG`P%>QR%IU^m_2Un0rR|4gvV{jVgWL@Wkr0u{xRYEx4Goz+tmaG^1wAE}o?e3pG(+KEcI z^^!&(C1M+gkW5DkDL-1C{&eeH&Z zST+8yNM-te<|dE@Du7uK)sO$4`JM=oro=$ZHc1d^Nv_Q0#sOXRax=2X3N`F6U0p zw;HN_;X`!lFhPvj>L;iejnRBvXMr4bi?xtW#3CV+8F~GrB>o4`P{VXd+&RHY_f|ut z=>h>={n>DX3tlL!A@Zz~t=Tb*fSkIFqGr@?Z$YdZstb;Qmw2+7gI3jyzZ5L@GC5l{ zA}SxR{@qm^+v#@z7gUQZU2M>|Up}1Y43pNTPVW#he66>zK6|SSrrfxJp7Cy^;~_>a z?W6uH^S;L?qf`45%Q1`OPs0U`V(|s_N{}ARK|g&q1zk9B%urlOKKSxCgA)fSKQPoe z9yTA=ad`0O-%t2|`|_wIeVPwbS%nbM0*bH*A)K&80^l1Mv=mGLU`}^CzuN(94iTU? zHJtai*9HoJi4UEg0-55{84BXF5@}^Re^bO$hRnd;+On)q0d8fA7q!N!CJVe-ZRQwNB{y^Xd9C)CXf)c7$`2J4+r_?10%|h=s$%}*F zxBCdAoVS~|M)oECWqsTA8OA#rJBI|9J_l_Sj{>i>(UHAEuEWSl=jrHuteXT6dRuNW zz1ya(p?VumF=;H&;t&_^geT&xaZor*1AFRs_1<(uQ&Z2 zKKi@48G9BOruxHsDSX)_KT|0Fc&|UZC2c%*cztR?CgHx*-SwG6;sJH-T&-0*zafG$ zf&eBpi@le?xiiRC=YJQy_jRxq2dIwK%L!+!7g%wxgS>H67FagrCGr0~n zkQ5DFY9!nq=ur_Sd|nDj6Smvd^*he2v%o!> zCT_0HpMiMk9TYJs+6vyBnn_2kc@~9?fIy*xac%PDh*4EXM!Ob7&s{^!hs0+&f+RWb zbD0GPBBQVC%3RE2bTUrrk%A+Fr1GRp-N$DKbJ!oUVbD9fU4CpPc&evi%?VRTh_prQ zAG0VGcm8ufVfJz|QvmazQY~JPAtsyd^bC4)ukR04Ps-7cQX_W4sgXSB`yEoT2n}0x zb9E-5u8*R=x0Ykx!@5u|A?r;roPSMctIroDe?sAP>{Sm8kW8!g_*$ zg%$X*Cw*&n70Mkc_UkR!rI`1UcDEMeoXjExesyd)6WTo2O&Y~cZ53Unx$tAUSD z5IQtq;5q-SwT29d68K)RZvI7b2G+o5e!{sDrU+nr1poo6ng`RShC{0?1&p$S;adJN zDc9#pGuUJ-Bmh&w4Dj%G|HYr#kUn?aUv0SL+Mp_{OF7(hocrm?xXNw;=P*o@x>EJj ztKO^HVpF=th2Ru~k4auo8m-$_|^Z+cak*I2^-2>At%1na;)e-L#EABGit`-Hq#X4-j@0{OP$Iy(8EpQn%l zw$K};FF~$$ubd>2o+I_H=&rdoX$RI`9q*0f5wk0xBo^4rUGDK!ozoze_%@+Sd>I z^{gp1JsEo1cI>E(aN8~WI8sT%>CXmc$Fc?55$9ORTfLE z9JQ?>ct>mk-E#{m2v`#^SVt`MGeX7VXSJ3DR+&&T@EI(_-EaUfHZ@SBNRGWjN}T2D zh)`|+y&8Yg{X5S%*U!yfgmOmaJ09T*T(n5+oWU7fs^%Y^vJ6qO?CGKTN`G3@>-OdQ z>N>yFt;;JTjNjI`HRG=Q=v4?KFu|{6B8m~~ zO!<+pGM{ec&!Ns;52fpNuMJ^6|PGLtwS zF)9c9=aA8jkm|5b3eTQhxUn`Ip*G}v-2H62j$&7Ws`l+huIch2#7&9pWYY%a(I|(P zbZbz&D8O>7XK0+q?(BSr2`2tyt3NDFkK#owPC$J<`^NL_WpZ4D)8yM_e<3;s+NGt1 z{)6d-iC1nO)G=~Gw77J#x(mUaA(UZbaZ)GxG+!)CXLk?)gBi$ic4Cvj*+JMt0XpCa zdxVz+Gv`tV*w#T~7ZksHJ9j|>fFSuMMXsN@)Tbt^mOWYe4M<&bGkhT}57h=Ci}~{S z^LBpo6gun7k7#C`Gz`WfT-Fw-8pw2wPL&$0BN@|4V_(v3yem6i*X?FYr%kOj>+77C z3jpQb&R@gfu?8SnVAH6)T!t#yToHu zWk^qxP@TqUKT1zpth5pmPxy$t%cl@2Ol^Ustve$`8xgFFn+UKb6dhTvopv-kW4Gyc zRA1EJi(e$W43WkPgwXsv*D$XxY`qZ-Qra`=#NMv6iZf98n<6#TDI0b+5?x58YbNgh zkf2Rjd>r}Mj?v5ZA~af$j4B4;whZ;IS!Aj8B+Utx#XC)5$6@Y;zoELbvDds71T2#c zq!#2Di`jSI>wS_@j28>B8}K4b9rb6q9;Mc9u^dTK4q{~Zo9(UfUIWt>cI13D25@>F z*FHS<05_W}*Xlj-9Pp5VqmdC6Fev@!(b_?fGnT0k&sM{W9-Le3)p+(%G!Z%uqYE}~ ztFahT6~iFEmD{SZI+;pf!p{A$o^M)VEQHdOme+?!D1@9IWZ4U)6`B;xZl+!L1f+`1 zMZ5n(|S4hJcavYY#;t;36+Jcp|m^}h5 zUzNoGCpOViwahZS;HWWct4l*P&2+(`=A7EA3<#9vj10i^FtOB2pTMD%W~(NzUVh<; zqEKByXioX@JJtkUNFLc!xNtK`2JLnpk z2t*spTq57hbh7D&@2tzAiz2OZoVjMnke4Fax_kRt@B9zD6axkls81>FSZjd`hlw6= zi_FsSn*zg*i~arizsd?dN)8pW`2#ro5C9;d2RhbRc+#&C3sN3KLzEGN8z6OAj-@dzf#4JhMP#Jd>Q zr@4z_Ce`9eJ*$u`@8!%TR`%pjMuOgA^y<&a7Da^crTFy-Q3;w3u;=evb*`vrooV+7 z=}X)VpzYZ?=@NEHO!)}bMW{@bG;_E5iaWV%zbjxS^!ku)=gKZ4iZm?yRZNd$e{O4^ zc-`-v(V&sG=QSokwiMu~f1Wr80lDLo;I`FqZ%#ojHWNleii|M(>Fkqn3ILYWmqWp2 zx6J#`XYF<8tX^i_TlY!f(~AoB_TY;X0je#s{GT9BOM2V~m6xv;Lw<3wwU(0d+^Bex z@u*clF24;p(6tY(kV;5giqL*sCRLDd)LiI~4QYmXTfqjS8%v`C4nI}Fp+zvzL9Cte zz1qut(1;Y6FyQS)C=j?0TUmk+6&6NyPQP~Soe?m^pM&Y40R9C-T((sN+JwmJDQVvt z)tF&Oh^g89V1UZ6W~{5w#*sYtjhr3(X@Z5P;}CKyR~axi!KK*$imIpJ&D*I|+MQR2 zFWA9_a1OsV#B92*q<9Cluq9e%#dAobpjgt66R{U-lH=I)le5sOnpmHsZgg$rGh?!w zg1Z@^XIUkEH{s3E->6bSms1y37Y5vG*A5<0bI7S7^zdGKnjJC0e zVb|VsYz6eA@0m(|MN;|2)mc2WVqRueew2z+JNR27Dzf&}lEcN{^V>qj1+f0qbZOv2 zJq_YIr{-=tob>&z!O+%HEq3Vg@M|3f*9yfd+{ta)(-K{lY>0>&N1NMyL|k#P)<_n6 zi#O%2+U#Z!7yz+}h0uSCOkJYFMx4XL$3RUleimH5pv+>oYqR`V&sdtv-5sc`@(3~? z9A<-MzgcSu|LudC6k=2CUo0d91q+h)Wac#89Yp|srNfrmm$2~R zcjW!8Lb3geXN>^VT9FizH2VOcZV!^z1az<-zP%9ef+0n5`FW8RG%M*Z1W!u8_WWlC znRxm@leNWi)_k>E6%`uL zF`v_wgkwqpJ~QJoCxYr-e6izPu+iDbmB@~x0f6&^m4cV5bk=3w`r_C2$q;XaOky_p z&Cx!m_rh4rz+dGA&2D8y9M1`rwghu+%#LPWM)fR$*F&qULN8o&yxi_JA~EDsUK?kG zaiNHM;+{qQ!#WN|UZ{()cBy@nCV7r8%&`Xo1DXV2k|ANDGQ1H?kfulvZJ!DQyNdP7 z^C>;qA?M8Bs%zR3{I&^ypUjYWeu z@lI}UT9BEQT(c?aXxON?$iW{STXL%>dO7oYD6pmWZuT1Gv=vj8%X@+hgly+pXPh<; zJiCj&1hV9uDMgWIJY1~amwdMrA4UdjD!+XteHm;r9j|4pRJ3;PozSu}y|t4+DO+}P zO045mTCuE>8vH$)5-6xU_Se{Gc5p_|yo60C+D5RPlu24=*D-$}5-rrNGEk<{p~zd_ z*pa_13m46Ubz~}un*p0%<}+wI=!47@!hJXt?A_l#+Lt^>+#1|ERLct+=U$4F7j=X( zc9XT#jtY8(lVI)(8mNu_yiHho(3KGvDVZ)fkffN?7z|=Jpu@@|3MakST%q0Q_y8F&l>@1tuX`&k|g%C=wr^7ZFt^ zkRz=Yhd6crMU;NZ;CD~_Ru<%c!~_5^XAF?XT%#r%4A@meP_b^v5eIyS0K{T#uw5IS znc%)$ZIcK$V14hDuuM-*n}Spc$}mtpfw<4@nU{72#gp5-+%Zxhc;I4BHm{zCj`+Yb zS*BSxM%|qF@L{>lxR)*gRS-gVkK?|_8NR=NS+A29oX)by!+v+?YXE%LL(MD5JP}KfmG83;!+1GtI1L{`T5}n*y7|fkO2S& z1UsgN#5PpS&JD4-&?NbzDT@gBzyPsc!!%CNRQ1{!)?!*toCiXa4MP+-D=n zjE{p@&`W>#CWy48gp|Q>8YjP(i9!;3Jvb+)3cRP@2c}S!^{Gm{KhNHmlJ8AmCcak9 zhjKjS^IUuw(+-&pqh=Y{XC!JX%QkJ3!A33^^dNa^u4;OEN)~HTBk+A8 znU^T{^BB0bjIF|07Te?Utk0dF_lGS-5Po#lnh=FXvsp`18RXja)=!rUHsM9rxGc_Z zxdw^AUYFVnbB=6zEamJz>iUv?S42Uh?vdU?aaQ}bvB41wnHFoK2BeDxiDFVkyg-XK zCH-vqKKJkRwKAL%*i$11m`-yF;djVuP?qa`Ap`Sn|tia0~@+1Wa<|#Q2bKivRJ{=tTL(qVR9bdaZ+;Dei%)B@aKtc4#l$ z6UMvIZL#iTcQ=Cg2;?%h6_5H#hDg2DR!5j7<|E6X|9oyuXm;;duK8XOx`M`eD`@U+ zSZuCSFV+CHPO+}?zli$EsHpyE?K8p9-5@Y@cc(*1cSt*QBi-Q8-JQ}6(yh|c-AG7D zD+;#w&i~%K*85>*&0;O)!|b!q`R!*vfyIiiHFd`FxxzV4I!t6J;KWzT16f_$6JjM4 zyB>OWleyOsXfID_zT5t9qg|p370vB(mD$PNU`AYJBlC!=86-6evw^oQl z%#xQ`jWn6nz@i<55lWX2rz(RbG^| zR}?u|hN&ipT3U`~PZ}x~?l;WPuOtdyy86%sbVBBwhl4eHB3VofF%bnn*XVOskMR=;Tmt2vbTeVS@6eWtp=>sZU2R-Amv5-7*mDFgR?PXmRB>eBVTXOxZo|+^G46{49aY zY4@X#d18diO$ZeXc^cxi01VaIJK~rx=`@Y74ad6KBc0M410<5ZN!7+b=$b3MP|%d$ zD3mJL1WAdk3N%)RCW(bxaNhr80%MnKDJw{Ri)_64*J{8d>r~V~c^aAw8~%_xbl$Eb ze{9(=wEZEh1_!G#({kN0@s_RBUzU`A1q2z zZK18c)z=$iva*t1<&8Ax90{Rzuc7ka--hL0Y2`g7z|`F81MzljzI&`EKLX$A0Z=u$ z%76g2(-g%}I@gJ16o^q-CMH``ae^nC2U(-R4;f^-GPzRuYE%r6UCGbwo`DZWn}ATK z41lVvyomGN*w|~zwCixbv{#>|ZT1}AfpC4)SVoBlDV%5P|TJ$Ty|7p{yt0L zAcIg9d}bp$+1CKDfJH3??aEy~IO44ka7qb8qW{EizV~hB#e1$rEHq49QsZT(j6;?F z+U(lDdCQ^toTu!|dF|@)ly@mg+wQWfd@I4o!o4}-S4QB>_fn%FBGXdk%4{`jVCb>O z^B0@ac~1vklztzur2YM7K&ZEIBlP#-z8jJ7(}ceLhENzv9i6A;(3~NPJJufQAHoJ> z%9HZ(yMjK!M@WR8t3`T+RyZ+i^X8$Kxdap>YC-%x{<4h(wKTyM+9%A7{qXvV29IR+ z^aeH@-4Im+8Y+F|F;rFcf)B>+!^Yb2FKd4n)_)pf+nTIp$2}x>iN5NxJH{BC&3irv z_WM?bF8LTbUvoN)BvldLzbMv0vM*TaQCHKxJxS4#U)-k>(|7SJbA1YO5d_nmgbiQQ z&A;Q-#A!zNa{rcq%OjmtE^rRcB0oV}AK%6PMi3JDBEDI=6rb%)_5{?S`lgQt0>T}c zQopV3*iFxgky47&haYa7mzq>ll=W3m7ijQ|H2 z^!U@S$;oMTCx9D0J>moYq-6kb;P3}N@E;t5wwP-^qDn-hr=Ri~58RoxVGGr*pxw4A zb|rpfP9NO>*2hk>{tSYOeyQ1owGz?V5C9@RTCPQI~xo_F}fH1L`HsDw==3xpP|OUnA&1rJ&9#=^je{fj>UsbuF8} zUQWkxfnUCAUA2Wg>HF0Dwbtd^qOnRh6*?c+7Ri%`Z#m8^X-D3xZd@Zxh0 zVNAjxWZgctqVO({vf|R*le^h(pI%zMY8F=YwreMoy?^aZihUpAJACQQmvbaC^Hn0h zeuTTXec?*NM?VQfZ}kXj9aqBQnF&3{LH+(n`eHSP4D-F@a?rdRBP*`@TfDXko<9Q# z?m*3^R zSM3jEu_G^-Z|`IwdnKKnRi~JN@rA(7)CQr0HO)Dzq`N4b-B`(#^~gX}OB0+Ukiofn zpB!SN{Hd1!sYf7n*)CipborhjZsTz#QT%+t!lxS0sdbP6V5mqs4ylXpx4ZTr;XGqm z+*4L@7iSAXIKsKhlVs@eZ1@89KSIq}mde}9X;JwRS~Q6`NKU3&n$7!i#x<6B2%avq z@^ndW@AB1e0fq0m9Vb^GpI`;A{yyxvc;=vIN*2Tye~5+cc*8OT3~7N-e$)_UT2=is z5W*U@io;6GhRZb`Qlr#k2S}}EGPSdg14=08q!9$s=gXH!NEt9jX!A2*fyNMoUZ`BJ zY--^$L#RmyUGl63MAR(r%Km$vEB*U0GVoh+@VQ)v4B??*I(A76+AWR6p{ z3yS?~q5DZb;(dGPTVSqC4&*0nH1S6V`jjVRM$!%60wb6FGF3tKN%rKt>7M%b^-T;K;%cX@D-I#tEhspqwz2*m`?kuA zI`@RrBl_K8l6T?Y%zNRK9QH#i)o%wstqOS4>0v)H!h{b_|MJ6yuc>2;xDF>d|E`=5D1dF z6N8dyMSu&*FwIV9P^5TZ5)aU9IG7l4L*K84LeV_?>t+Hb5i+FHu6DJ*WweN`o+TRv?U2%&Z^0M7~Q5k4`mVsKW{a!xM?Tu`&ilOtcxBE zaZT_W39>mMR~di`hnLvyDML%C79|rTJwf_#eO*xiHIh8T5`R6XN1|qd4WP`ZTGF^P za9lnw$`i~wVIc8pM-gG-=?JlO#4J>g(>^wx-|}DT$$-5^?~^39Vsd&gIAc85_Bi{| ze*F8@edYDHH1oj~uuaQz<%h7*P^)c-;)Xiy8le@$rfAJh`}uO9uLh9<+r zpaYQ0(8)f@dkxK9Pt9-u&D!nE;4%P(roXhu1m4F7b?HALiV!s05A}_n46Q4m$;tGP zLo0}odM-fzFw@_xT~x`IL`mVsLcqrM_Doyb4!vf7Ux1t@u@DE~_V3$-nevlWn6fp` zI|5chdXn``OsfMvl&QsDo?_w_nY-ei}jK(jgx=yj4L#MRP8EPuU(%^Mm zp2uoL-)+m`a6P%LgfUJ#(Cil?Y7n__-E$IPhYuLZ5+hc4DVz&IA}B>1)!teOPJ6^6 zm8aG#!2&?c04)3IOG7BXxF5dmKUaA-(@S;=yGbCHgF6s*7`UbTw_pkets2%nVoDSa z*7*5!O7G^)Kpba)*HZ(ncTEQ;-Szu)e@ynBHLKRQoAD#?&V`7cdQ)@giFG#X>jAwW zV1gbR%h~dKubb7GnNJ!-8-f8@Jc`2UR0bj*SXlrBDF`YEmqCjh(XEAMmm1>$gATP_ zP}|~)O2sP>bFaMD z(r*&IAztFR7=F`C7dfx#|5lz~VDPA~W@k!V(G5=r`nqmE<9li{#H3sdUz?f?9L23) z9J?Z+%Jx^ApQP(x!`IrlC?C*>w7@(;h`%IgD4e6prEY$e)~;>AZT`23h9$}KuTowE z^-5>a>u>iET_XebeJ#jb2l5p_b>`J1G^O?Axc_mZD8iVCQ+5NmhB z1Cr9DU$6=6f%MBN!GJ_Ato;~H1 zx)foz_6K!E)ObSJ764*7tQHdeX)GCZV4^IDJ$?4%eF7dF1roth3FyynU${+Gg^NDJ zMl34qWd;GzNm`HphLjLaw}eO@qpVZDrvum3HX4dhzrc`Rni*eh@$uW0DSq?>KMwmo zFIvOqLvB=cy4s1xy=Fza>E8WF>Jf1Nc7Pn=O!uh`Nzl)u=))_~ z*NT2E{Y})}&uH1~kE(hA! zv7krcty~T!tOy){ z;pVWEu;(6s=hTmq3`P~I5qPQY?MkP=74}K{Q=Aayhh6XXsMt+gZrAVi@iM0`&hiOp z1A^Qng0MjF-UB8dLETZB7*$weAyf|5jrGR9@G{yRb zu)u&V`g#Y%fzN1dOaJu6RK1QpCVb!Lve$uD6Q1sYV$30j5g`5kS{gid z$15NzN}qon4(1VuKi+2?sa<_;Bt#Tf>MTG_7xmEb$-}Qh^yK^Z^_TG0X{@TGH4y{i zerOMu0#@a(Xi{*%9(V`|rAm8t2NJi|uTmp|(ubIS%ZiM(U?9MirMloZtR3E z4Z0p(eudm;brW}mvRR+Ra?1M==%WGRnCTfuDIRWB6T`jjf-r8zFIcnuk}Eo~K@kU# z`YBLg!dslQRwC+A7TP)8(-Ypk_{M5bky2F1=~&Y|*#%|MS%USefkAeYkh^T%4{L! zs@<;M0$u^G`^OD(nF@<2mT6*el*HZId@e>s&&3DrEOC^~KV6--vx`pbTb5?@?Os8w zErHzbr*9a1#E5T9#wiYED#)fS?&+M!T zRk2i~h%CUsKVw4-1e_m?4W$49w&$0RJbx@e;E`qjCGt*~3F||UE^G7kWK-Qslfk}d zRI-)!@Ws^Zb}6>q56RF==AsgOqS+M%X*;4>eJlVXr^CJU#*5EyxEHpA$5mJXBC2T^liXYmJbfea3{DnSdQ;(VJ3B@+1j>h<1S`@{LcVHxXieW^{L%{}o& z93B<$98HnSuU3}_VIPQ>gTi2{B*nWqQ|UuyeUPGK@luOSXNkcAf?D#WZzI6#=cb`W zHTh$=UQ=IUYs@-H!hY==hb1i_kmn>n*n50zMsnT7s>Z}J+?gl7iIOhd5r;vVx> zXjIgg{pHDXJ=E^8@n$n`DW>kxTfK?4VLcx_?A0uXsbo|z;%^aU71)$zjpKD^-RQUC zvuy6VY2dGDRobm#(VS}O!=0Y`(_O-`dg#82J;xX^Ke`A8a5v1HnE+wsM`bNht8I^b zSu??i8YX3zDtyxU@q8NZe&4%#7F>UPs`vscK`dCY6JY>UVut8Zpo}F;D1ov!p~#2% zjL&we)rBjcsondYY3V}--36w??FqUBBOfCK<6-dzS)z2E> zfXRXUet-Z~V$zh1BBpJ}l_#5jKGRJ}eIzURjAfwilKaqte(Z=Su>iD^{{K8Sh<-~9 zYK>SB;BC-hQ9N^0`lUIVBm~0%>NwgGYLk7BHU~4~I?Qs7FN+l_pLB8r3r22sv#~|m zY?kA3&`dsBqC6_k9$Jl5QhYa?tZ!79j#SXkZiGih^mg#pO%n2-l%fQ2l@G#K#@6*# zhb*84`F_S9xbSi;S5DLqVQhu5IGTuOHT@ubb!Ep0M@~OnY$>L`rv)4|rWW5_ah62p z21hl>cB5ST;&Bqso#ib%(KLC+>3BeMLdy3(NQ&4%)vR!yCJVGyNROrB`r;8!?bMYI z0gMV2csfu$CpHEU=~fi@UL1Jg9c#&Fe7=7;(bW0-QEv3+Ltd|8k8wEGd8KY~#TLXz z`{_mk&V|%V9j>Kvl+YOi7L2-~*^itmi^vk@f`U^ER=^CL)Sy<++Mj}JX3Mdr6 zS{bejT~UTP{+wexp5(NG_l(gIv6FIPmZF(Q#9pZNKMr@QVk=9E^U7b;U<VnV|7XjCp@%2e4Q1Om;#JvyU!DN2PF#D237EULiO&~Dx zVdTB%aS+dCR1`Kf8jrC3QpV~c&HnD$xlo#UX|L!e;koJ(DKk>&i+8QBUbf1Yw8uqh zk15`J=hF*L1;K$a-ssO^*s~ZWC=d!Wpu2{kC!0!7X-c2v?-M9O9#FfIrUFnvs4a*D zIQYy9plUHN04V%`k?^7L-d(L*;cGo;w5dBaL@?0hR&jLX&dW^8)EE~5wUfSNrXA;e z{>V-=J<&{aC=bn|c(g0MQ7!&5W>T|0L+%HJ1sD|B+n`s>hF8BH3*hXq_}d+fRPz4Q zIC!1-sgMaPBKk_-rke_f3*c|zrmQ5(AjSbuIGS!lk*J!Fx|pit{c+eC+0mJ2O*c6r z2?}&NPep7i3N=EftjD!pp_d=s^dme%6j6e9v8rF-n+g0ns zh((}zAwKyaU-zTZu6%TviGk3f9jv=jB>F})PmSi;daTJ<1bT*~-mkA#Em$3EiN_Zjf!f?PW{2hbQQWQSu~04u?+ z90`FAf`QIMtz{y#lN3wBn8;b8ATrvTm3MJjk*Ux`hY5z@=6Uqz_b3*SPJ#?4LW!#m z0Ww&?n|{%7`kyZKp$cofo&I6wmlN!AtW8E}hO3Reo%A=9>@{w=87Y?D1|QXIm{ap+ya`?Y~ydltHU=$ur-iJNSVMRqKoG55a$ zytS}hnUfZ%o)AP{s#N(rlrfNd3^7L(ZpJ6QO~$Po-Hk8%rez@7L7pBTOhNRX3|m(* zme>{rW?FQm4t643R5-3WWj)FWoCtwFNZm-jUyi};Z|?!2rT~G|fSO0Y_iyn8MDw8y zWDT`<%^{C>EfelCyaKQ`GJH}Ez)Ih5;-?fZB?G2E{Eqa}qLa+FvWaR15d-Syu;URh z4-iV5sr}=(*01nJO9&i59)Jl{T__mLiHUVF5CEjT8W;v#z#GoUMYkU|$jLTxH;>RFR>Al=wuJ2&WQ)m7(=<^k$)0st|B zc+@mV6&l)Mqp3CI+gn3+(RmKGS?`HWiCojV71jvAiYWO$G@zBkM>K&!+~_R~sS1!Lw454^UktT>X~sX`CVG+bPm`UCcC*g?L(bZ!chZJ|0xO z45DG$EvvhZ5Fw8G>Y}TMZN^Q1A*vZx^DBjL_m`&!Ty)%QswRp!h~!;U2I?w!?n|3d z)=*(f(D~HdS42psZkv=?ukHU7PplpmiOCSs z85E(P+(Mo85r1AjzY-l&$n+`8>8BDsp~K(Yn0wQu5qpZ9g+%@grR;=G#NH|OBqQ63 zsaVQVp71&&a{5_kRNWyWXb+@Jon16@&k2A46uk`0Iu0-7asU*VzLD3jVMi@-Ux1Xz z(Xvsjy8c-p*M~e+aQ{yb-dZV4xs&($j9Bky>0;3?Q0M{CExi*>V+fcv48<7S~#h^-EI@xt9&(-N* zBig%aEz}uwvjV&;s^_RovRC`z` zrC(#yG{I8)5xLfuS%$ISfN(^kS`G4?p}z|LRn(6rv#gLza_u?!!e+wwjMv+XxG}I- z?$7d~NbQEV3^cPi(FXWrREnDznhrS%{E}20nFMGxID(bhx5IZi_?vTINO9PLHLT~c z^*6OAfPb`ReeeeR$7MQuo{x_iScnjsrm-F|Q+=cSepnfUUz-e>J)F<9dM;O`@C-v= z{NqVeOMfknd>8pBkOgBH-heC*F8GF$2g1#kS*?gngvxlAY4L}6PSV`t=Q&#z(@J=#w)SHtKl0T(bcGc21%A^+4&AHp3qgtC{tjp#j>tH4t2g zH$&#l;DulX7NBeT4|cD-nx?Fl8ce39CY?!?X-Yu?eo_mZo2j5yuj1*s9P+8jojrc( zACU|CVQLsMzY=yiMf$xG5Zxl3F*6q7j^Jir-%`h;ps(P2IusArYObio_sSfm zXD!IAn%X-C8vmI+y3limb=9a^DH6!OHdZ-|>h;ay!am@5 ztV#1{opKQY+B`U#Vqipb^(%(o0PH_Lw#f^j9Hx?(Xe+XdLPwV}0@bO8(A8+dw<_Xw zuczdWXTXWCo6CLkT|?(E4!nIP+~Aia!v|t1c>Q1(XJhp*X0{zxXFgGYr?BIn+D7nP zt+!cYi^yAccLz<~KxMhLJKj@t@Jl_Z?%LQ%fvsTL8V3BSS8BC};mXGa_-YwB=|-)8 z+h9g9A-1X3+qdNF3^K#?jyt6N2g=@uD#uKJ;h<5s=Tp#(}|rQLEv9}8>3q{+pr`lN0^ znSQnG$|VZO&&u%a$gUP*7oXLX6=f*fv8E$|_#>W7JJlQ?se~hm#R@Jk2~A{3aX!au zORM>>e5Du@$)tvJDCTF8+5i(L5gePdv+o3L0G3L#`8^MUKTsoF50Uu9s$R4 zw&D;K$@c!d67|;O_n+qGPXe+ze)pgQemHGBjsSwX?2|d0ptc705H6r*r;ZJVeuaRu zfIBEj1XD&?GE8416a=UC0KnmoX_=|$$7J|XcsY7aEc8WwVa=56txiJ%jaohx(5L)hH_DOn&nn`0&qew`0`4$YIuK5Gl=Dx6~E=2$q z_Kk;1Qx#J}DMkW3=H{RVD^D$5(xIh2MI=if09f$nqeMuv8rqs_lH$LA!bBAoqO+3 zQUwk!L2>xNqmsfydlTcqrepxAsf?{gZXoxH39}58wql02f-hPn@1SKA`kknE=1OLu z%a6FY6-E@Kilx&N>**>&U)mJucm~$R)-<@P$Iinit?2n9tG3e6Hxtk0q)u3s9B5?2 z(j6{&e>^MD*YQw87;%YdKz8~7D#K{XH;G<`KN3~NqE-;P&{d^BsKkdnJIqVL2arU6 zE(1k?nqiqmAPNZx^ai0BljMHqM^vL2EznQ9L+$? zjW2)3XBho`WNmd`z4$Ev01&LW00JW$0LbNe&7N~8*iD#&+6+l}%n19I z&mF>`y}uV?i;q|fIoh%>A>z+hU#w8$@;=L*xe&lvr-bJ-HmRw@@q`5^6xvLnt+7r} zPUqnF!8sPeSuPIN88{V|Q!xl~e97r2B_WMw&sLkMDY!}(oF};wwRcP7BfZxSDyUf) zzn|bylc;w18G7$je9te)HMe9X@)d7P(pTAV8L^rk4e#hOL@KQCZ{1wuvnb$oY)8<; zxIV4OY2sFjsv3b}T9JPI?4C>_^H*orqI`+DWgD}(QNI65zG+Azt&?a_5Hf=XH2=UYCn)!$pZ8w<+<@v@ta>;&kUZ!0DqmN0;$GzOm%5;zn<+6t64xm3Hho^VM!asx)_v z0gSVj`-dnjIM5o_d0FLEt6saEX0ex{6ig@Z#Ek~OH+82h7HFu$jTMdW5aIwOM^(W1 zV~sL{ppP{C82XjgnI#wLRO|x8nb=<&K6&q5AbFBMa@;vf*2Xv$Kcp9Bop|F#`pQ@M zjn&osrwSjg-#n%(_&1^PXY5AIV;8QwVxtaZd-N6kFC^U>BDAGkUk|__WUF~JFqxM1 zBsCy5pQNlRLA9o~3aCyhGo&FSMJ(o6zZ6?(=lr`4+ENz!`t`J|!d1p}BOMR$g2u<{ zE?`-Z2|mQ8o_?nXu0Wyx3K(ig_$h)%&*pgVT4pq;i)&g52LVH!8&b#uV#uzeHIs2PjN-DeRUlU2l<5R zpS?ET+3I|B@hR=IUWAC_hYu0u0@Hu#aFFAdJorN>)Gc1w8@<(18V;hy@f-@ry_OhZn!shcDT({;()^z%n&gMLrd=?bbLq zku9lY<-8ZQdxChsPXFDbBAt8Zdl;pmI1&X!BwnOL67Zb~^aa5KX*R5?z$?69Gc=1* zK#vu4(1wQ*iqIR!M1c?dJd&P?p|5TF87=pQ4Pz%cG}+?1MrzGST$@T+mC}_*cB(n zXtUM#>{FpABqle@8e2RA#Lm`Cqqy7_Xarfvhc)`xrRqJYwn{*Imbl#3l;H0*5yhsx zx@+3B4uylU;USslii0if!{3RFJ2CUC1>Y<@suMV zZcvE-r(r?Y#QC}?A(JrM%x?d3qpE{Y6oUb$%e8<3Kw(Kv)3>_Ji0dn1Pdm3d1w~4+ zraL(@f442N+7#!}#9paKGeww~Kz2QLmfvy7)!KUWNqusilmu!UlNwT@o`9Yc%s#20 zdfyA=aL1e2(q6D}Nl~DpG`|Wlq;GHA=Zn7fRp8VTuSV#7t6K3Rw3bO-RpH@X)SsZD z)FVigtSJT&3W+(?`Mj_%a-&hX(NJ1bTqeGz_M_1E$wi1}Ib`1cek)CiSnpapiF+ZO zXk55fZ3WMHE<4EGvkzLF@}`PaweO?2URxL!(E^)4FqIXlC|+}`;z87Sg|1fsb%#hm zPb9n2O5KUAwx5MwN+I`exc1)?Yz#@L=9fI4k)@u7G8-gEK&&crv+%I_dK7-(co8fD zQB!s);$=+Yb}z8|<@VTtKM`3rJ6lp9oITL*axL5f>s`=2f&xR7kj=+1TDu}9;!vLA z^bRVNkJ}-6`B4d6CET zTM7-LA<69R5=SjhQiu{*bVeiD>(-TkAE$4osC=T`t!TNN{&VGvSAe33)c+c7eE(ft zuVbEO?cDx4;aV@VuE)#M7?(;|xlF`&OkEe>Wig?tcJrm3T$N5Pr=MH~VyqjW;Zcra ztuihy!RJ-bRd=eZ6}Hqy#xcJp%%LKu*3w2RT4VN*QiRR>0csi;ijZQssAxn(ty?}p z{Cv0E3}~G`ud&kFyH4)&cM%a_vYMFN_|N34v(5bq)=VAB9v!@VJIALF45*0WXM0;) zc=4FVvw%Q}9Z#$*#<-q2Ub?`n?-SQ_r}$ziJKW8c)44}3_KHds?j)sw1E0PcRKU2R zgFC{`#XM|G#XNtZ4Zk(zidvoNvD0t?D!$?8-^o8?JpmPD_!Eb;a4DLW zppB5B#Q+tekqq&R4?rP65#hH?h#WK-rvE-%O{zJ2zpQ)q^R$*1pV0HUPcQ;(xr_R# zb~CJW;s_3AMmfJf?eWGjx?iyvxrp15n42v;*%CoZBHn!uxi%5UT@^%8xq zVy@FyVzF<1U&(z74>EtxMi04LE2>jH>tl>|w(~E8yPKra07|tWvr0Dmen%ReNAG*J zqDs!|sRqWXA7PRh7)Qq!QVp@jR+xw^HWzF@(pFJox;j54%9PaR7~Xd;ryboTR}r~K z(I|(k-@MBbCd6eBI5}BXqYxV2l;!VJP(;&TbL7~fuq3+7{B=+h*o27@K$bjD) zKRzZ*z8Y1LhX{Gns)L_JKCRL$_6KF-EJYJ*UnrKQsjyQJsWUfE$2dNheFjbh#?Z@x z{+tVzp`Z-K{R$kM_8<{_7~(6u_aaZ6UnazB=M3FzZwmd~FOD?-@WHW-ySncB@0tGa zmBoG_MEBljw&^Im=!#4wAuA#SKM2!#9fO+m#Twy8a`gmy|6j$8f&#fQc{yh4T6)-> zxx_Rheu>$K-(3LJ$z85G;(T9k>m?O@m zRF3x~SyU7AH%`dzvi!s{=Jp&bm;d-qRqp1C8Y93OmF zDPb~7ovXXq?-E-B2r@o9-cg|E0ErpDNwE5B^Xb0>^FL1ZQ1> zKZru$@B(g0R6iY0qx_ISI+l|S;xrq`6}ii%YiM-}z;|WSst!N2pVquX2FFI%TXc!N zvq42N0x-d*?3z-Ug)T>*^&)4fa-p0~RZKDS-`BsZ=gW+}RBR{MRXng)Bnutg;lfGu zHE}<~2}Z`JQ2jilfQR0jp8yqWR&)~95P-yTw8thy(My2ONpzj26^6e2MZ=kx@_;;u zXz|tJb^OC$L{}sj4b||5aq`iu$`H92Ob(d37u5!zC&Wc^Q`R{8xy(2jk;Y2`L+(A} z&@9iT=kguDYSb2I<4kQRD9El!D1afEjXBvulwHm(0Op`sInyPH4H$|%wMpr~6fL%O z<*>7I!JxPOE)_=StnWgW*|@o5LvcHK6|`ngS?NwfCAj%(g=CE3%jY&6|BgdezRUy% zvvbgjG;>v-?Q&?mZ8@lI?IgA$Pu*ZbFZLH3fV?kLwQ>uJ=BypPvotBhgdxCKHxd{L zoF+YygxI4J<~*ro*5v~?F(f;jjoW{rLgyYXZ2fW}HF0D{8=$lKa30GXBv2ez!pi59 zFoSxO69lKI0Tqh=ev{<(_Cg0UzJB{J`OndBjw88pp5*YUi1uXD?+|*C*-H?I%o@;A z@7;=}^6`Y5f}p(12vd3d%Os!6-K!d$DDM8|eQ{g}@c{^!7V=~$H!R~lq{Xh|ar)X( z<>d>SIOx8l$ZHdv)V;+|c{{t5slyG&1`I*RIS6?#knRwb3BBjvYIF68^hJ_t@C}ls>G6O1j8F)_lPa(QIb#kodR0v3MT)9 zGAkWYT+T7qGV}?Pis_K*o05=TTo>PRk*9{$D0CO8q0Oi3&dJBV#kReUI5pHrX#aDw zRjwNQqz(Q*$^!yObwENG*7wPx=pU7-rcs%Ky`nIkIpy8CsKPp6qQGR z(K2&zo~g6?wjYmbi`BLgLDsXcdUotbu$AY-+KwIVKk&~ZVq45Dy|lAQ*^DVBAF>T<}=D zrI6o$&7wAV&~VvQs!( z%^1phV33%t0ehN@jhdgMQ55??B`kn}St+;EH)c!U8~q)e0853#i&--!cNf|h9n`Ix zj^Jwj9M);Or*znX?$^u+cPVYyunHWE>BW-EfB3T!#pF#*W?~aBRw&8hEfwu|J=KCN zqJTx~CPl9tWWx;FEIK3eS;sMC{r%tg-V``9O1h5tS$|f)=*JXdDsjdc!V37f^#Om1 zC!=J(t21d{Yu*2SG6t~V zyTIxm1O=3xx|c=zO;r_LJuMv$y%WjJ$0+s+hEX9m8Yr9kFIIBqg*}ZZ5q1Fjn>Tib z-}I<>dZ7v8V@b1chU zDd~{AL+?_a36D_)P)$N0Dh6YN_S~~aZap{2^Af-vNDX2d`x57mNjmwxlFrK5VwVWo z&XqWagu83Gk&|5CQFUov)R;}KK`+K|#wGD~&yEvIku`>j2r3QF>|it_67Ca9wVIf$ zW9p_I(%jTIADn zoM86FHmrT3B!@@l3FE~Zbgz8eL%p}I;K7MMjhD|OA_FdE%zIqfHfU5|o;Jc2jFpL( znI?b-i_LDvcD#4UuUe&=^!Ba97&w@n42xT!bTSxlaGe4G5@qYu{%`IuQqV{0y@nL~ zX@~Yh1H<&w7NZ??{vNV$(j~L)|5}CO3%=<(KiqZZ0IZ{nc5+izIV>WiE$A6@w8mc1 z)g@^U#THSCsq_H$5dKiSX^_Zl3rFr`m~Ik9gg zI~IYULqdYWY#uhYWIoIEUgvC$SFCw3U2S`^JmL(|8JNLxhp}t~kzra%Q=glG|0$6E zm6n1;H-fSdD?!;ZWma1V6C2(r%IgvS>za{7MnmE5=04flWigh<2#}FzY+HHdO(czY zEv{y^$Rt0r`f`76Xf|EN?^Enx*1{2Au{==7SB_^d;H=-A;>W);r9Z)JRk-YR5$cw9(GK{|1C|XwB_!#yFeb!3_=Yh z0MB4A<6?de=t$y_4S^8yozW3cG>3flzo8#M0*{m09&TzDDgL)Kd{@V8aL%;?oIdll z38A(3=3fVl>(q?V4BAcnJ@kLr$$&E1CuAEt$nuCML({$J6i5zrr;~dL?+71HVSyjqc`@Wya7UkuWQsZKqI-f%lr% z^y_#n+x^aEu~6w~0UL0MzNl??$KSqkrkQ{*3Rkh=DfZAHlpY;FsqOXfXIW{O0ACX%X&>muW@v> zq$Tpo&clgC{jEPBEl#3-AZOFK-*`4OozTutGa0Yi{Z#WK;=S=jfn6ACY?G^E;l2^( zg5!Y&G!0vofR7c0_*B^w-@T!RCdVc*u#qo`HRygpv1UCuKw47mZrwTOCJ=?eB-j(2 z;E|n9QP@HO6Km)R}nD4RheH}V{alogdfYM zHt9h{tl^ZbrUts@Rp^qAuwM7YDo85&{;j3>JVtr~a-rEQjj>3!J3R;>zhguOG z54?bQnky048N=Vyi5@)7`{(H9km$ZGKHz^rp9d<86KRi7($s%OsSS4q8L?31q$fM; z*|d?7ZWjAgeIZSokS3;+WU}xEtk7W;Zv9s8G8h|ZCIF7-)i@wTGytK3AXM@yn`r(m ziZs-LOB+%=noPOpJ^?EY-Mv=AddK@!h;k9S|5)Z~zf1J#6S0IYnz1R0&+&iE{;r`u zh$DP8;-i+795jrcP#_?9HDAd!ZoA8bdI9xLkIRLb5pJeU4~C5$VWc`ao}V)1Q)8n+ zNt_Yy5qm?tO8v@w4FfKAGY7%0d5g|wnnq;`wO{KyJv{BnMlBPVWu*RoqAnW;vrIa5GOTq`|VDM!&peC;kSnkH}^ z^KSz;$oR;~D?(qHB4m1d(f5#x9&TbY$XF{p1g}}kNsOC>8YmM~3?%f%)1K**zuz)n z7Z!+S7%7OY_)Q}|#Oi?iAQZA6jG0!X`I!x$sI2W(VAnnIm5gf=eY~ zpDCM#iv6#yIOJw#^+PJs0qo7ySH?A)>*DV;tv>F{?OO&1dt+on;IXF<`V>+_ya0kq zDb3BZ6e@tgjpFXu+hfO1*CVxC2 z-bZ)DVO#bqiY0~=?2#xf)7`o_yCo{8>t25zmm2nHK|+PeB&Rc_yqk5mhbGeLcnpNM z@(ogjtyoaWJS`R5ZCBtCdWV_MQeW8Uqe2S1lJi~ zBD8w81XAQCtn`6SpCpt5ge*HdKMxt<`FCXtNty@$Kcdb$D#|Wu`}YjP&`38pz|bJw zHFS4KcZW0*#?Y;FcXuO=Al)D(jf8{}q99^@_p{dbzAvoB`~{0O=bm%+xvp#f_CzUN zZ)`-?=0B~7^mY!~y#n9Z({t&^V$1c^Rf zY2vgcI815hv8VAb5TrO3-i(uJ-FvpJQweZ5;tTO@QyQBvhDt_$2fqPV~86-u+V2PuU7SbMIob!^MtOYnGB zx49dZv$lgHG;LI@@Y66NYjN~$l`NGCn0}R{ic3+GezE$FoXk`JC+a1#-F!dw!;e0_ zF%%gD4fX#0M}-O>2*-q|0&t$Pdg_c^Uj6Dz zaWr{8YZ`2d?nU?NFtt!X4_KINRgoa&BA$O!KWn@mHH41Y0>{j)<72=^GDradSkuca zs#oIY$_4$gvZL=mA@qAKWChYA5TQ@WmU`S{!V(8-MC#YI1ZEb3Q+zgT+?G^lORf%Q zysEtC5kbjQt*@L^dwzSi&b%0x5#@b23SSVKGWsmkk4;kZ*uAE17m-^pI!~y%qQLcU z2?Jqh@YsoUyUGjQArWG;c#jK{cC4+y5n3?1dXvz|pvhgjYA9qB4nfx+L77M}k`EVn zGUyZA!`#JwynES(`H^3jDF+^_U!KbNCq8a)#=jF64-SCpw9Z6Rr`qi0fI`O|2)C~&=gmb(*t7$p~~_gNS;}2-p}5vDY%H?*-ZpDgsEJe?@5=SfV>dr zo{`wEIJ*Y<0~bq9&vcGaG5Y>izE9u87zNHFlv1LQ?Jc8V`R}rkW3b)F& z2o9E%(CQmI<-}Iq-Vh-n)RwS#V^zxBMX=*Fk6E9MS!OmNX{L|q*Du^uDGX7iGDR`# z6Sgm8xN?<+L(%ah(X2Ua`i&CxOxS+~GV{1E9}>~~Y~SevLWy7R{U0RJK7934{eg7E z!c;hLLP2cAXA|XHL`1nDV5?SCqna$FAw``W<3wnEJdJa=wiQVslr;+n1Sy-%W0PGL zSO&8`9(**Bt*7-$%eWcW&B1L~7nAuXu;bCw6W>BP#o}#ozYDMKewlN2^Y33K9MNSM z4S}%$%9K<912ouLR35~UjScdG`xKZKN5l8j0IR>MfIOgU0iYo;0M+z#>(7-=I|K$I zNb~4_nT*SGJd3CCwQ}w?p#9ALisA(h;*)2Ox-r{p67)I}Tpgk-m|iE0+W(G2J7fY^(dE-SgLl^s_9{7Kny!uN(mb_^dr3-nKgQp3zw zb72CFrkiD@HLCV2rdI+md&go&Jl#6m8bMrIT72?yAq0VtTDjhS#i@(R9s_nPv2yY< zdeely=MRI)Vl}Q4-Im1|oSa~V^bWH9-Te*kaP{<|k*sr#N?pc{8 zD$PJe;j<3E@e1tpO8HxW_6Pr4phwAxf^t1sA*l|0UQgSeeTn5N6RTkY`%g#o$00y@sIwaAbSp|HH-Ipd=%tWR|`C$*bHN+TzW~ z6nsCay<`R-vY;%A)NKFJM2+~7Y}1txxtxJa?nUi0$I&MLNsI!nl5&y>h?q;L+x}5S z!xkO|QenFeLII{b@H`l#LN~9$t=x#f>KasM0&4AvUzF_4?YO^LuJP)-s)77B8WjJU z#lUAOPO+9wl2FgUOTKt`jjc_vk5!O`bLPzq1c*-uB83|6MfTJFWX4Ro?#mW#hKOpiR%6>#R2D#ovX# zM?)xU?}yqNB-9HaybI+*niFtp_wv_=j>y`?qBTQcOwH zD25m3(@hCTi+hH(ZnV#gBr-k>-_0$_c%2E^X$iJ9-O@UCz;{s4)kXn?o;jPqKn~;G zSwFRdJ{`Tn;Vw=krghDdKTd+P#Xvl(E_O4R;sC%f^towJ$--dlU8w=X3)qjl0bT)!*e}V4MSWe zql|EAj@-7v6jB=PFkB9Fd>%e$=H%sRsY-Hc^_+B zogEh~9fpi>Khv8Ow<+722sb)Up-cD)5_aTNan!E0P8`f8>QwOw%BlN&wUs|9YA&y1 z6axrXMT|6|ibLiyHHBZo2`hFsZ@Qh>`1q1IC06(pbQB^nQPnrBBAA28$vfaUoXf*q zlpyiM&iBIh#(cKQ`~6AhD1|zU4?kDngrfbS%y$XrP#dBMHxU~Kq2z?gE{bf(-n!?L zwgiBt7Y1K&RFA?K=nBC2Z`jCpPcV&SqI=c$eDCp2dL$Gqw-P-2o0jR{M(`|g1;#r% zwBp9Are2c+dw#JM+&To2^5JHvE7;K_5Y}-M;Do-!Zt!NtrY1G3v& zS0V1;Mt34z%y=_LHAUN_<<?WdON$eAw^^UmN>w6j46=XT1yMvpH;iw+X`2je~yR8+6DBy}d)cqr(? zQ}C19jEFl@$puZrXSZb1El#w4>i;+|EYk(hU*zoa@5guDxph1-_m1r~RhQyJS}O=S zoL)!eHkvr);E#Cf3ERzieij9Of#-ToqhM)&)v9te%GNtUZn zb|U+!=k2CfWHl?X-={eum!6uewb{e58TVilN94{q#!_GIGa20P3s5yp#pJ?fifYJ1 zA%bV5@KiWzWbx33M{)Y)Xn}9g_qsW0^;R;aiwMpt!FOx?qvB}3^fz1w&dlt(5u4od z*a%mnk1xrs=F?+HM&KyMZsJtyd_WE$S|Ews8&hc|ef46E7-;1drecQF&*OrN;zJkQ zMP%h-#NTOWP8a$_{~I6#%Eum(2}Hytg~PPOjs&s!6nWlst<`x%VMHI5v^F70{EDAu z@JegBRe23At3KQQcM;9N2l(foz4JZjR_PtZ;(z}&0dJV1)B6r>6_gBHdg<3IJwPu=(SR3$E zC!60omYp-QtugsRGU;?E;-yLS;WW#h>_UZsH|uShTJ2oZdBqo2gAfTk^Hwh%MU~;z zyMwedx0P|3A(TfaiA4nRE*M2(lYu0ydXzF&qyA0 z7A`6|Q-sTrfXXE3-LG)~7ewUQxKzvl_La=vT+p-Er>yw>NH;@B_N`kTEgo}iL$UHo zhd-F^n^0vIOxE-IsZCuUB1oP~GE%BK3jg9wz7*&Dw; z+0&N!m3jE?b#E1KW^#l3XVd|l9wy%skcOr*7{k<6`c?mAdMPoguUtz?6Mmukf`n&z zLS&o=lgNb{F)ZKUFLsrwo;J8vX!Dp`T`RV%mluhdCg|As0twUZ!a zq!_E`4QHjPQodnyeqAE1NKz!3^W$CGKu9Hbmb*n!Qvc&-lG3#jcXw8KX zNWaEg5afPBfIs-fD)&3(OlncFuYhf|L#fz_vkko3sbD=^_n~%{<7EOnS4h1EMcj<- zn32)!7nlU2vFm5(Z`$klQg#>i)G62Msjvw>r<@<-wzTQ;hyGnotDJ^Hn&eAA8J9*; z+ufI;PbsU`cto1@xfC<25%i)|gJW=29PG1X2)c|mT~ZbY4ns*4%dvoIdc|GBOaOfX zjU@tLHle>hiSB${gAv32Hz%|Hf0_%}%mUnCpQTWMc$f@ObIAlDF{$8p8K}Ob{3~bZ zJ$J1)O%{2%hO?58>(#N{ohWRdaowwW!}M*^K!<`83r)rp!iW>oHoqku7Udu2sto<(=SX%T{UE_-fiO}QA@sLi9t8SHl@2h@zZih7*vg~=1He}*c zl+7#0>yywc%8mX@gT$E*u{*F}JF9bxOS*f%`Lb5p$R(_2T>a_+Pw9&sv)*=1OidGi zLITYngjUX)X?s84{&mGM3&H8!S|yE(uyH3(kwXNUKU6>FQxyCvL7+C>#fIc)4mqjv zw2aMCdmu&d^^5s@VLa>3@EBqI^UNCjA~qBXqF^OVfZ^ZdE=ut3)v)Yl9%cM~ww_!> z*3;W=Cg7EYoz*9cVc$z6aQ(<7mla|q6VGj>!HBJ}v}_LGbGwR55zX9FiW!D&fAC?^ zOTOyAr(OD4xjSWiB*v~Jj31pJ#Lqr3<7nmgQsyatzatbKWW~ck7TGvkml8yZlfZM- zXcGJLt?A!2Vicg8NLUX}HUcBx4?z#i%Iu#8Z>b9e*y%}fW!N-|rgZUi*UB;f!EY00O|fMcdrOJ8ykJgt5<0k?{8(Ce_Vln?B*lAJ zfqTR#?uOA+(?|VT{%7g0bRmG7+D$PldLwwH^D8mSsPlMW6UB<&!*)KnAw+tfmT@a7 zO+(mq(%VZOj|g`ETbzPMmnW+N^v<9xnM4gHXsry;O>BTs^BD}i5FX+qdneFVztoV! z;5>(W=hl?(oVfM$xyD1>(&rFgrl-YbPn=y=Fw^jXjG^>D^!-UYOvmS#Xzdin)SIDX z)U=Q8XwtBV-$4WnRyy?k^ z%?O6m?h>??lZh&Oiq$-N*>ap1A{ph9ybCaJC> zODAQttwgQ}Gh#JHaHtc1^IxOz`^d`iwT*T;f+};bl#8>i(4Ptk2sm%gyZp4JSQKj) z$1F)P(QG<*e*vkFt?X9+VpvW~?pbe&e_rL|jteUNw`V!$^{7x4-l; zOCskS@nKL+mx&tXR{@R~KA^pUIH04Z;FdzZ2 z@w=}yU2ri>*QttEj6;+V!GQ@T613Cvjf0V}Ggd$Aiq*TN`K-nM3Qp4{L)0k0EVgdE z{|n#wK^p4!XLhSsivffm@kLY_RSS*g9&RZQz8jw_R8B0=4AfL8<|AOr% zF05!()ZI>6ne9cIx$Bd5`yDwbAteQaBJ!Xgi|~rIpeq;-1gunN)G=MGz*{=7-GwNu zKue(HN5u~t!nV(SQxA%A0$+6|N<9ULx}z{T_RkNccW6R36MlXxu>a0#QzDFogMF0= zN5_7rZ(gqWvGg2#zoj2J0DT+>Z*{PtXaFCR3cTZYy#-KExDBu%%(c18j{V;yzlX14KoUibk&106wc3(9VNI=*B!v_oNCvB6kh#OECI3W@)df~v7r_c&t(l`d! zmz{|et;bR&V)boBY2)dKre47^wk#jN?*zFd&S&0Qg5-%NSZHD|3?g#$()Nfp3WkZA zp2y7IVo}&Cdpzv$R##FUhv0UMnHm*basWq8$HSp3$f3LvO6x@GV|+s_`f&q;)JLmh z4RzekOm%4P5ZgtOW_*5qC;#7;Dv=Q(6BnY;f-TFWJU&4ZUsji#m{Kd>R|b>IchAa7 z0TLZ!x1cOPm*D@;|NdgeXb%x2AYd(t4I;5gK>xjbzBE|KB>W5Hj@b299vaz!Ds zF5yp=sPhK}W{mQ%ZCC{O3E6{s?|^!KBDfrIB5bQdFmTEFCavO5zLqTI*vL!MZ~K0~ z!Zr+4UIZeZRbbyFAgam0$x2r@H{H?meMd5FoE+>I;s6SyW1#(u1pGRVvV&z8v&3$q zC1fpMJtip8Z!LzP0`zDV$u%iX&rWEJXSDGU; z{FmSH1$nA?pNuhZEpMPpp@zH;Tft)%JKt%%3Xjk|pN>O(ky7$~qs^qZB0wG{UQBt z-vTD=6<_dEfo=Y>cZaXY64H(7}qI&sl=nF0-|f^SYsb2#^lHH)pll^h-+t8MV&|% zhINPH?CxbwVnbvo&NUY-<)lU)IZv zEb&zrO&nf2g5^Mk${1PBzbLi4ud2RL-x^}Iy%v6~0?jEk$v)G*{OG3gmT zQK`luUtX_UZBC`*ck<{#=%^?pmHI;A9}N^5EjA#RTR4(Hg^u)qvr)u~RJ9k@R+sHW zE(NGUU4GvvuAmH456aw7X;!N-abXE*xr}oCP#@^r^ zZ}Q0Vl`$U%^MGe=E^YO)pp=F!ypm74Ur7$qWNGGeTO6{OOYPBT2={ar}HNbzgNw+bW$P_a#L#;yHpH z;Zj24#IC6W>@ZTzR-QjzBvim;XC!<w7RQHs9W2yslYK2P&nUuZ4?FMFqBhD zAfGU(7>91R>|%-hnfQ0qL0ycg)Cx&rR$&8B7(htnm-}2ZCp1!Q0ufBd@uT}_m+Z$r zvN?h5)ygtso6T{ci4ytR!WBL7Gk?r{Am(EOL7m45uLP%6Jv zoq_q>FMAxY?_(5sEoRs%0y%rEw}d>QGR>Z-T8_*q$OQvT)m~$5O#&*Ic;UF&vGoKv z&g1JUoF)aHaArIfQ$yO+?Ws!^sym_bVA-j9O{p)+9vebxy_7@|zHYgJRIPtg;hnvL zyjdnV#3&uA=+fvHm}Dep4#v(zbxnP7VtFFx*^G)h_OVE1qj-AacWviC%oo~Uvpc-b ze3u*FT@>T|OrG_9;uMVn{&^u+Idi+(1f)=iOljtqd!(hNLHk>fkzm-E(WqTK_=8U~ z0bj=+QwWEfNId7lEq?LE8uknyNBNF0*}_uuoVlRCU{qy2EZLwvtf492;PHr!-`@9BvyaHys&8G|`Ao z#+8KV$|6~R#jKEO9%((G>;Sbe`HSKy3$P$Z7feLCscgd5B zd!xZXnZ+T_{}07L!2JmP`fp?sC;0j!<2NlCD9kj14NS#gD5eH%WlH~7{;vis6Q&KV zgpK=>+lO|0g7}II4@^5|f+Tiw0)IBWa;dp5wIkdD0~U5cJQioH93iZ3 zL}+f0drxxH!X z`jA`O>(-hE-p94bDq7e3WPc|$RjEIx9ZdofXmuHEBUQU}^byR%!EiJ~Z2MP&iD0ul zSu;i^G!B3oA_@A{g85%)37zA3DOdQX02g#=82-aEC_Ej;D{mffaz7s}b`9cy#0A~M zfx+)CPc|PY6M56cZ$QzPE(Y^o6^aYEwG@Rmbu}NLPq*Ap5pjux3#9v%x7V^?0 zfcKt;*?x*Uy5S=iFHT9xkoM^1cCz5RQhq$n)wz=-xF!*}*Zpak(s|})GE{9V9@o-Q z*e6pP7aDFhhqI<0Sqlx%hXk-vC%UpC(;G}U6zF<;Uz)VAFY`Reb;{Ka_a&<3p_whY zC}is4+F7E~3>ogC!H(^VJsl&Uv>n8W-wg!b#GBw=o=W zTsE~trtrC^)-9Bnfj=`OGTI@lAQTtLSLT~nsZe`=VbbWouzf`aojE-E;jl(B(Cqx- z$3@#;dqq!MKfEubih?K|a>u>2W9A=SITFqhYA5|V54AA5om9#CL+ieL8juqD#PqAA zuk@j=CY%o+%;7Gl$2=RyNs~Rgw)p!zn&7i1!ZvLC<0iz`DP$q_#f{!8CZ-A?5(Wf& z{0!!pFa`#>seyV{sPYO`*Hc;)yO;j*SKL+nnrfCe)_>oMVh<`q80tJdYa?1yUp{U( zgXD%bt?zuYYu3X_N82!fhX2SRQC5M?wb)_O3Q6($YNa@ilSfYHvuf0|VJ3J$u|W79 zFt9%Jva)*Axs-9fUGC6Pw=;h*N^tfonh85Hlu(VhNxtJ#qI(~qweK0*Z|t*#Jp0$K zt3_oLG(4Lo9cC))wWa&tlGFA+_#2!#zFk!^XcOp|64#WRofw@;!Ygd5+m?%u+1c@k zB``Nluf3u2ya`M{d(73_t7XooM9FfsEZ>?=t?WsVo_$)qCXtRmLq;U}Wy%%*Q8IO2 zJRNJO0<8XJ<}srg_Rt6y&iAW10V{W0Z{pS0`2;wH#*4V)TvNyEo{UP!l+USMr`ey| z3KJS}WJG^vZ?^?H&PQ1)5o7q$QNi__oPP}N734;K>xYpUzE4pYVU&!Ic$7?K_2;X! zK|uGVi{A$}P9^Hsh1zV%T(%fExUH+gYp@B~5-1L%WDq8dA_99$75~a3F^m%MqeU-~ z08(f&S>+GF0!Owz^gsLU8F*HK2q4fLyA`CBeEGN;yqAI%cNK>@uiy(JpkYHIX*3Fq zXT)W`VAlaFy0}kM1Ucr)uPIwyjYybkgDY2}sq?%x{4tnm`Ddwxg}$}F&lkUZ0G58v zu`nCEz4n%)<3B`J6)0&_E8RRXOunuZ8)q69i`%mcql3$02PJB?$vaE)8|5;bNjXDO z*}7YYL@0V+`p@k8_XnH25~bwQ-{L*9CJp=#>2NN5tc=vQPJ9LRLLB5=9;G+P9u!Yc zYhsQ;5*P#X=Q` zPy=&nE*lS=S2f7?9&rl9P$?mMGO!E6PLlOMroAD;hB*;~0Qm}Xdv60+q%Y(3xskc~WrULw z(B}Ua4%mne4Yh!(fk(H@!}^U_Kw?%z=V?c#*8gSWc0hfDNVtrgR#w{JyqQ&Rkij4 zoa)Y1tmsG^MKO{VZv|P;JjY~dhq)*>M_**lKn=NlT6G7mejqtC3O{~Iz?36x|6a-1 zAi4x2D#JhUsJf-g#qRR{*EZGt;oj0@AFA!WTxN*cNzWSYe$VHq9&(}!!;^1u4;*RG zeW`_oEZ;R zJTVrnG?aoAr3E~%S`k3XC!SMX&U-mWu62jKHhf%6V4llKbmka@)}#&!;xy_H(TgB} z=s~UGY-=a@`yFbqR4B}qY;!wQ+q%lvvpEqy%k=tPO)akiF4Mmscc00f!4XzEYS3`S z6iH-a!o@FjEz_!_*8HKBr0*+AFIOb!p^ApSKj~4Lfip*6eJ31VBR@!5QA5jZ&!gZj zcJkV+2x`KLtMe4c2<55$=qJZ#w+*&$;GTxGd~#z2pFny@C~`S8;gWdTV@x!`}t?a1gYk z0N|)$D0gK8FW--MbORDtvx!e$E%7Y5b{}6AKiO#Zz`!uk`e5JXnztRITtO^*s{w6DK8h z)p0PY9|x0@e;$K83|v9z!kZ%)Az09faWa62(P~*Y9u1u;-pnHZZ!tXU%VIXM27lMm zYcxf0k7{sg@POvDqKNWqi*CV!Eid1~Z>qX)zi^8Y-q_Os1MA;iIq`RMjM944@ic}U z@BbUYpri_{x%F?<`aNj$;vw^@=8F=j{Sgw$Ip*CMz9$x+6Qp%>scYKaOumD&sz@0x zy5wHlF}90G2HJG)zDe*9Zs%81b5o0i1JIrs*wj#hy`z+l$VDYR#4b_h6%W_L&!^l= zD^)3dk8p$^O_X%`ZTVN{3MXvMY%(7)D2uN~IgU~FK8;1DqW71H#1-T$*yWm+aAVp= zboU+H)I9Aq^(P=Fr76##t=RZq0eFr}bOF;SIu~l9ywshM& z0r6n$>)^u2lHH6CevH{y{y1`jsO|D`0`UtIkk@okO~1}DlfSS^N}3wb9bb2U+B{jG z3arK|wAy!rp#Dgnk5Y3TDd_P0t1X&d7^K3Pigr^RDo5}|t>!WVC>PrDpY(^$MslEh zN`Vf8*2$T2)<5fvWMN0QXX8QuzOCO6Ks$z zG8%w0mF7LgrUzwZT7E8ky^TyCxAXKIL(20gLE8sZp$88CEr!nI1aTIyw1|BUUAW8R zjUXC3-zH;ul3A=fT}g&KNkc+f(8Zk@2NbE<}3R^6?mRr}dJx%s@Dd z&RHSNWhrc?Bq{w=+dR5mU4pKZReq!;g*9fjHk^h8*X`ATmhkfl3Tj6FoEvdEV#Y|u zuuce(iAtMqH3aoJu;gR0Yk zfxs27G5Lo-7C{E7!fXdzmLd@nj zL>U^y;HC|1A0pXw=TAwf+nH$N4vR9p|9?sr( z$Wi#{)fUfA4pn0M*x*L-8DX-sY`2h`wk-v*^3sa3lmWQUrTiA7Unt^6B00#~Zvy3A zBM^xf(;h0A+gz4PzpEG1(-{wytlAv@is9L;K=;C+_fz{snvYm)Q%L7Y8+3RgOH()- z!#ens99*13l(1|LRBFnt5Jp+hOtdn>hQdn_lR8g(sou^fvCrAXAL%iE zEO?;x*LGSW!a1Bvap@g$9kxX66kuInU;o+Fy>^FyT)rtK+NLWb1btEYs&m+~^6s`U zX7`?Lx5rwd#K0l-O$1W%qleOrUwl*tW=W3N=;@w1yC$}azX)*Aq zYGTuz%_)$tIXTqngGKPYvui*a{)q@xGh7v70$9Xqt_0X4POaCJnKa-S@eo9JGG1zj zu2vDckyRh9>cXVUi}t?DBLiSYDU~*ut+jMG|ARx}`9Bqb3p|T5tR!DkfB}yzP(`Q$ zb%dw?lEI)y5y+`cXUL;B;L?ved|Ev!m1h~!fT4XyZ}UQ>Ks_@J6E$HBJAbSj`v&P) zAhqZg@vuzBRB||P!r68#zhW2U)#r0>Y*tIgV^KdK{Fh76e;O3}4wjPt*YLMfJ+bDG zA+)NzPdlZ&HqF$KpeebW9HbTQG;kqTb{6M=S*#weIc{8dUYlQ8#Ol=gkaXZux7yy6 z+nF}r_PgS@imW{HUlp9lKpl|8= z>>+1J&n|~ft%vV};rNKTLh9lO$2Z%Pj`jNL3kloC>CxPQ(?D{xdQv}D z*URw9Uugg`(UufR64CzYU)H;rslT}7=YqcV>ds4&{XD%y;|8~;gesR!6`DTBJHOh| z_yAse3ol@&5{{dq9x>+Ms1iV30k+5#iQ?lEc%-#>&GLk$bxuphEZRICM&j&iI4@CaRHRI^$Qd9xqO-(v!HuUDJ zpJZ*YO2y_6?^!)S3r+tLnkCG+u;TFrn#rgnRwL}Lp_ z)e;pm$Q}6iXweXjRzZRZNrG6ZbiJ`ZC(7W4>wVorm9A|qXm#jh$qFOEh0Bj-d`9H1{Sbt7ra99 z8?~T05F#FOFAL{yZzE4C{I%XrcU$y4yX$$@Ogn8t|W56rdW31zvN>`;GeGsoyrLm_UgV15f>osAm6;1R#;LQMq}-SoSl_?X6(yebn^VYb$oj! z6sm73FG{3oP$STbi6bP+r-kSDyq$S$J>5Z0w2FvdFUlK7K*UWpLL7Gbo6}Iw z=C@qXdGXnnP~f%e(j*C#5nqzP<=vC*5JD`VF^(;53_+xcA}J$)KK|+Zbh6UTMoQBn z4#*9E@j-L6QSHv+F`+IUOlh!K6)mT0F+%k{&TA6W$FbVQB>6p(&J3y>PYayM;LsA? zm$zWA>SG`xP16z3L+HnKUUk~N6rfxVxT0LQ{w&*C0_N8l>I&392W$LRjvDT(_3T(# zM7~&q_JQGCl=?x>Bt7-IZ=MH)#7ehJ6MKgL`L|W)B@)?piKP^W0I*mE*d&cSdb}km z<&!%9es=XTy2&*@C-+UXX@)9RAA9&{EF^llwa&O@Q~r@9XFwcAo(5xXCr!n$YMB5{ z{5z(t*G!DB9jNh0(&!sic30lbJ(-wx(^lybEoOcA!(YI5|N6V=l7PWhK!BRC)jUHE z!y6n$qK5G~-?NYUs>8a+rA>mp4={!WvN!&@dOBxv30^N~u0nB#g{JR z9VJ9p!oJQ64C;cY(1|mv2`d1@W~+{|_nR=&JwMWt=H!Mw?*)MJ?wYmio+$8Yeay^$ zDHGY^aqE27N#`v{B+X3+FND2KDR4AiY_lUuPaTl6d-&{qyc`gYNRC=4 z>aeB3*JbxN9MUzZ!iT}xr;b3o+PQ#%DuSx`#k1_tznA|=L%@xxFy3<@W+L1WTXmM= ztszGpnmU^r9A;iDIv%%q(w6L9DZM9|rIkh%JWpa$dv#H!uO1S%z`G09+lxpjs^8^8 z)Gc3&_U-A;%k*Avh0=g*+G;YACOYbs@L5;IN}Ka0qU30aUhdLryKFAQVM)Tc$8eHe z^+@ZxFFt~1kz4dqb?N#JFo50FaxRCVxA(Ohgv42xRj*w+JS==D{6=~SwJeQYlKDB| zPjXg44*pUoqNFu02DvuL@IFzIs)MuIUGc+_uwwTulqz*G68IkOR=x2F-#ozJ$BT*n zoH@5z#=2I!;zNde*Um;4j8vY_sR%m1nZ7>g!Yk6>PC<*?&8>}YX#SQHVuwXVqxFF^ zL8me1{#ab1#mTCWcHA|;I&Ge+9I=MmPA*iwDsAqp2IMQ!*?!t{)~#!Rt7 zHNQzUg&dVuDe+3v2S@jcnIXQi@}`B*xZEBFE~O}@W~N>6?LPpN-jSIoXX)A56JecK zhiZw$pXs)^h7!==QsL!Y<)+aAPzwX3?E|wNZA>@A!suKE+uZ^LNA+9eLjRU;0!-n? zaa!>++~X^jllt{F^|hx4sCSP%V(WgX&N9JsJ5A3r-o@%F&_Ab}YR3_DJ?mQ;&J=*! zi(=#b8M1t}E8ZSs1&5^*M{r2kmijA+#tjDHV{+^GyhpHyd$0IBGG!AG0*s5T86XmB{OR+*zXBYc zDq+P=%#3mgw6uI$G=%N?6g>;8N`Gt^a6vXIDhz?`1;ZwK|L~{RD}deO4D&@^LFH;& zVGx85oYlOeVj84sGX3AXzOmlpqtBg=g``u7bTxp|zYw~lT3^_5W+mZ2Vt57?cn&P2 zXeC$vPdlEe=e-Hzt^4tCpXmu~IUHG9FX_ngnMb^o_Kx^a^tn&)bLErc*Tf*#^uxBo zt?8@84tIxR&do(*&2ceoK7|y;cAN8#wiW(@K2!P(i5aB>IWyzd?^L!XY?k(%co9_x zBsE-qL&`5vF4-bZ2^~wYKnckZcAA45fv8B1abj*Gz>Qe2nOtS@3xc0 zN$ph+iR;BRi(FSkTpsudYZ2hhhR+Ne3}e4n6k-9;*Dit{VGc}E{lWG<8$yAECdIt8 zH?HeBg{_?^z)SG}j)9+yfqe87CY7JG`OC-2&z&@y3Xv13fB8zMC)7lrsi^S#&Y?dh zKT8Pq-c@q;p|@u6^Iz+4UxnWth*!zcaH}oz70)J-fKdX9cs{QvI=CEPF+mxlQ)n;v z)b7crQ(xk6x@2Rx{xO3z3q$cRQJARDjxXv8*7$>k8GvQqHCHzevr#V+4hI=i^Ca$9 z#PpEGS4)Z)dWpHOW0^~GBk_~nNgSvP2X&c&&mP|brxi0}H1vjiIlfOjgDq8JG=Buz zsE<3TJcuQZI%|C1dOf)y`W9tqTqR8$!uRz%y#UR2KIR7N+e%hvd&kTEc;!51G<1PE zafXraTkZ167hXfiwkgNn76qW^rVW8rn6LFvdON^#R$f1E&NC;I!DEvf=zcf`DAk| z=Y#B!k!&JuvDn7r01VBx+f5u)q>@coyg#hh*-wZ9-GvegiTpAWACwByxIFrH6kzXk zLClK~&zPIQP*Y20kY5o97$khuH+0yP`zSS>HLcjs7ZqP+p;MoxM3>~XeKaEm>1dNzO zay3jGpK?~r_E=w;y#}wmHse_CL5{ClwF`|4S(YA=tGZM}O)FwrK>uM@H%yaIyLQ?n+@Om_j>?puWYO54=TEm zgo7x5T=gE0(?Y7C*w`Qi;ZD}pPt{ZMS62aD4}ZMJhoEM}N>If(!M(r-$b>bDEl1Zt zS2uz_MlSlmH|Ss2$Iw8P8RfP{Y$~SryyJNNm&e~W`M+M;vpPAohQ&LWx&pYdkQvJ< z#X(Fo!60rp^h)YUb1X6b0QScH-@gNtC>Z1uKNdbh4uIofAfN4n-GO8$|EZf-!!N#5 zTBD2q1E6@e;9HPA48h^?s@W)YYlaV!EEYVPBmS9=QEG7Uj3mz z*Bhbt`IL^sCzR1*MK^1?)^}d|jp_b-HVF#M4K&w8Yh&2$W^sG572$J?@$FZ8@a_GZ zsp_1Y2e51F$=Lz_|5l(M6u<642W{{&EHm$4*{CuE?4k8^Ol)`;gC@%{J~#PPsJWjN ziTrQgoaRE0)|+J2F;WLl;r~a}Sq8P)c3t~Q2*Dw^)8Ot71%kUv@!~GUwQX>xxVyW% z6_?^(yaigMKwF9wYG3YW-kI-5CYk(8t~q6|z4oy{+g;9N7q+yceR!3X0)tgwxKJc| zE(Xwa7GEd7SkPsIC&y)t6lr^-!-b=87Gt|X^ty_}=(KbV;V0=3a==k!z06Sme8W7| zq1tKXEQaP!Ym7|)y)Ty<8SoYNiG#>b`kk-qa?uQUy+TGN5+wq}=}vWy98%HPzv*5>yPw3Z_v1`=x$dH@! z>CGEO@PF6bM4-)ajh9#VThM~gmrb{f2P%b-3hsf_4A>R^1D?#7;BoudQU{Lp$br}D zALChIMZU&MhMF^j>M_nwEJID1*FMP63hrf6$Q*H*NyAHOlx9f2L5wlYWH=Ro*jSy? zala&*u5TpGnd(C=v^9);XX$%PL$z}nFyJJ_7zQ!=hu7otnH~zlga?uOez`17=kzV( ze-O)+jcy{oZQ&y2s7lFgOGGJfk*Txf|L5v3`Tu$h7wX}C*5b$}LuD~X z{i{OhFoh^(rWp0g`d9WZRyyI*uOY~10tYqLzq4(Qq5D(kzdTLkrQtE@D!~RZNfm~G z;$XKB)@O4;&j)iIL5{4mZq!gu8zvUKlk8K^`_^L7m+VIJ(Ha5X>lT#MNHKh49o_n8 zCj37s2EY93+c+|u|26)XNUE?wiVc;y<$ik9mu^&({!OAx6Z!R0R^fV%e7HpdhY3(r zX58cXLh?;+Vd>m~{#}6|3LD7cDcq~TM1@T?q1U@+Xn<%G#&u15$Bs#ZuJWi_=o>fD zR}$yG)6t?!$Ek53DzmK}^15BB|BLFfkk0dHQV(;i3;hdHwdD zpgCX+GX;z(_r`Kjthyc|hmIMCx>;Yhk{wn()oOc9UR;^uS6QRU-A@`ugq2FDx5@|G zCc2daW@>G`hfus8S>Sj<$0#yrbm#6%y(DuP=8fw0aSB`z9-T?kkJ4gsA z0BJweP=9|9FRI~e+=5T|!g_}Yc*KC^{1Jko+_>lfYLF@$K;_afiGj1b0YEh^Iw^8q zNdd;AMvCfs`f){*tsRt-p~xC;jmc#bKP3&wM??YS2L7SIs;!i)hI5#eQZ?HX+vvLH zdLd1O{aF>NbRi+c8dfRT_c4D@AbiP0JMsCamPKdb+O+O>4*&1c$hhvo3Hdxe<%oYf z*eG9i9lFFP5>{KM517lr+}R#y7r2dKdAXuO#2*vGjM$R*^xR(1@^F#urh}e2PoOcg zt~c^8^h9jm@z6Nop25u}RlEWqMv)=Pv5#u<(`n~{>3Bz z1?7&;tL)=bXHY+BJHg@Fiw6=DJLll|(;&g}y=rRN=km05>m4T^O^A1h@YQw!)i|+D ziEn(6RB!Pf<|c(OUw`7^`jQ>SKdk8~ zh)z4sL~fVyZ$jXY#<7c#LS>QHBq(E}X%Ix+A4Ic#^a$JNRF%jF1wO`e@KDSPPGpkL=^dCm!L!({y7rgfNC!6>l zF+9sJ3fdJq4XN-c-Rv0|=!A=#d_cV{Ikcn`s!6( z&?%A(vNPBfvXgFPaW@xpP{ar@*`;q5UG`0yDn(pKQHXYg@)i|83>32@e#fLJJZ zp0DZXelJ^Y7fOmBe)LgQ#3K)n3=5<9Du$|(ji;DfoN(VpLja=aI4de^3psi6gIvut z5Vas=z(RVm=fhgfCfrmzLRK6^o?@=XA&s7C4&H$p>QZp+_%R5B8B;s~A_~JOBY+te z!94R;8Y3ROu!M~UBdq-w+bTsdY>AQbvEo^p0thvdTbb0LSMyd@xXSo)H+WG)1cWHG z)Dq`@Q?CsSz{G=W9T=*;7|27-X2+UyMVF}@Cf5YGb>+dxgFNOa_y>6{)67RYEnI2( z?{*5leDwRw;9qICPM<9&j~d;)-qYw$d;W^QxH;Q!Oyb^r@50}_?A&0-3 zpnN2D;3YUI*3*_Jv*;;8V}N<@Myw;e(2Rkl#<#K$L)^M(s7xr6tc>B#f2boIOawH;tk8g{OALst zqUy^C54a*KhM5W*7^>rLy>4p(#L#LLC5cwea@kPu+i-=hl)jZkN>G%)gM)=q!R&13aZ`4}F_5 zsLQWLhnA|j5`O)b8GW=(XoeDcXrii*21`u+1IFevq<=Y%XnrbCqmn{s$lmf5pRn3V zjz;@~@4mP~a(SoOi}Jyxv&>dJs;9Dk#!cJ&xr#1=K42mIPe3>p}MdFYj=`}XBv){Ofv0;4e*chL+2a1xEc0(ML&M(A^;|h zPhp?!Pp6o(pa8h6fiDTm``94DE_#Ge+)gr_M!RW_N#&@|yFe;MjP>K)#nj6|JSGhR z&3+9L20p-3${^*BwTnPlX5XjZY;Cu6dONG7V=>^dIwiF<$RtI$aABq&g?C6o zVzwhAatUqX+z-h7&>snUZu+wmo#pQp*wLAH5;}|@Rwq(rT|iW zpg2gnt8%lVsdo0}`r8nI1*C-pk6qlps~6>`Xa4oC)OB%YS>>e!iG8>9!eIk>ceE+d zIgHstK7kHa8i_SHTX!^w1z?VBFdM_{(OW-_LSsl17RXq37ZP60ffJU#lvmR+Ovjr0 zZK*+*3*|YcYy}~UmXXR|Rkf>r6)v`px&gXsLA4IhEL9dqhiR4?GIA_PPv9*W3VQ#| zmH>I>{H|JmZ91KB^W2{D7D|?7Ch^4Ae$g$5GCH-F?Jdm*^gT06G>gQYY-J-5UkN(c zS|tE}T${9Xc*tYNYJyjQ7xolV;-z;VC>;0hPeRTw#}X;+plvhYnhm%F)K`%0K7*AcX)+A0~-!T10zWPuw+f?y$oA#nz?#M3I?M9Z%Tp`5`7B?fnBzN$ft^JKxV?HJ;cWy6S zfMo`xON-EaKkl?uA8;>qZwD(;=;p^GqyXz8i@NlA*c^(T9Qvvk%^R(P4yZdPxF)nl z(bqPZx)*m^9V5wb0(=b7VC+}#jj#~HI>lO4B~_k9_!JDKsyJwKNmXC^Fqg#U4_g|O z*XjE9s!qDx4(c8LnwxQ;rmhCZq6bEgo|iqP^C`eWG@xZ?q7@Y#E&l8ixLSe{rcn!a zRBb_d-bfeQ8~@rr7xK&U;*dLMOrd+H?p4pO2!B1`aZ8U+ef?-#lbi7y8w?|-SPN~z z!GnH)J(=-BvC3vNR+;}P03|497BT`X4v`&si?0jH3DJsxPoeGCUDj^y?!~^HWhyH+ z>$E+8$!7?Hq&%Ruv@YeZ6Fl#XDoDyair!2626{eFwC`U--8pK}QLbGfdkFAdRsQ+L zg)sm4Cl`Ogc8kmHGJ5-|4!IG{FGrAwX;M{HUrj2Ba#PkSJ3Gf;Xa2s2)(%|qslRt4 zWUXt%KHJD;eWv37GV1b;a4YqAoz{dxoL9aZ{V2nQ6fyTI_q#{vXUTEO-AZ-|1(j;d zEarts2$K1S0xOZy?kBE;!}-mkw*mM*3N0vRKnmDbbM}zc9&dIzVXutB-7!EqisYn* z*2h&9`zgtV_TrL0PEaNXAMyr)4yGdZTI-bn#KB}Ntr#qlQ0{Eq$Y#di>B~!yHkN5Afy7SQdd}z0NWs6|% zA>`5SQ_=ptpW}CTz1Aw$J>XPLEkgtl1%tr2!{Qvoym2thSbVwlb5K0wzo`P3z`&e?1FcOF2wY7j#D ziZf({bYS!x!G_-EEAuC@sp^0t5Pxg+A}>}_2bhwkOPk{hky-Ah#i zxxAc~x&_#5YD(j4p&Ero`)i}*5Q?PajSL3iO)St_v;s&`WSvMKO!=qdm$eD5FO(rt zy0Og;UpRQmH4AILv?x}q{(FZ-)PeHNja}iJ-X(bf#?k^tdV+N*D=wuf=Vl!#m3N6` z&LCJAal*FgOch+AOD~^Qnr(ksP}8T2Hq3Jz5$#NSPUA@joZLwEHu*~nygWkKKIR9|1cpzmDE zkn(JLczDuh#~A*Kb0`t=41CHyR(`5Wf)51HQ9ltv7>pKB|tGf zM}Hc;(Y6Cq=A1!Kbi*GR>zgUfs+t%^_+D5R&%QbI!xh9csiHm=!MFAXCiNRwXpaI! z-U2`{yy~Q2W#5h9^$?ezFu{q@nG$z;cS?nPVNiQjcHAB~4gK3=vp3gYLrZ@skrv6c z>_T-cQAycy_^jUJjrmX*G2pBi>6w=N%6%AxI|l$bw6xR%2hj2)!Gym=8PtK2f7;JK zY5)5Zl!DUHP+d!#FXV)2+BKREP3u>+8|pi0*$D2WXFlh(sT2Ij1WmEzIcGxTo3ngW z@7QI9k8s}L^8ha@R?vXjCf}}1RLY3O|4!eX`E>K}h zRxX&m+{bN1&>z7rav=&khWle@G`x<;NQ-m!-llgtY<2l4%o17KJg(=(sGy0v=sNw~ zHzCV?Ge-}`vr3cOruQ?jsnk|OzHE}h+l1R8)0zS4q0}ouPDhY97fpBiFp~${UJ}x4 zUUN=m4(r>FiN5&r%YIte|Kd6G0S^CghH7y%$m#UAmY@*V^WhbsqsKUV8cTdudiqQX zhrI(}{6iLgHf~y5wI|rnd%9?qz+5OdMJ>bxKzfKN5JtH81T_6aEdH%L0SsOxE2NeC zelx!o19m;qG7Y_OmE#22t)S&}bq8_r73#-@ovu%U;goh@AP(I(q6YwxT*-0L?4!5h zK^HVW{E>nJ*dHS0(bY%*PGI2gFkr0eg$LaMN58Y3ug$E{AUEJKCW_$8H|$$qpCgwaHFYHDf5*v)$<{D?=$ibi0EonpZw zu+hgTLc!2$*C`>#6Q9Ju%*O;JwBwSa%KU*!9DK~{4z$Con_~*k6z8s4=cPW4O*xvWbPvF_b?U=p{qEa)Uik_dUBP$BW9@m) z>7orz8R9A~WyC#KqX~`Cl?_)ZGx)|2jbBKY;RUG1`Y@5H6!H^zDU>m6`{)dDLJ{cn zhy1C%J}7Yerlf@c6QsLUeWuh#=2&rl%JqB`zIvS*F4Z_zZWx6fT@ z&yq2*WB)sG9K3u~J}Ow=Fisy43A4j;Za=1nHt^3ak_Z#(tDpSSM=e4q80q5Dzq_3G zjH>KxE;=;ix54VhPOLMoqC#X&c;|+x;c<_vt1Sf%=CE771_k}U7j(*Ps>#AC3nSy7 zg?nteLB?#U;fbY!-`CW9mH1lG zHr#9Fpks_K^`>|tb3|E%y9XqPKJHZnKZL@!rg3X!0?QnsS_-P$gamw~f_`a8`B08LF7Pj80cnt{y zG3L?=qt|`(=+O<{cex``wv-#tzaxm3Z9YUb5Cot@+7tUeU#Gd0&hJmF$@tB<&0sok z7nj|~)+VNC_s_d`@5^)Se^(mF3@#!*LWwHuc2XP>(ipn4>t|SCz&*3f(#TStT5+9#yZR3fCS zr76Ru!T!mZ;p@w1)dT)Sm%+i?MtWQkIi2hk^4+0Roy8_RjJOIfv=T8n^4QW?KHt^Z z|9g8+EFQ?z!jl&#W`xh=AdCY~@;zi$P8ckgDVsO`H|OB#Jn7=L*j{zIupifQ}(d zpoOKZaUigy@Ys#&Z$WoeSVJ#hWq}>ePJW4@#p%L22Bvh}DAD`0*Tdx%VCk6}!>Bm3 z<7W#al8>x#<2hW%WYXfJ#Eb0+M}(|DqX?t?NnI$`#ryk`S{DG0N#uw?CCIR^n~GpI z4Fd?S6)-2+?QZ$UVYLH5#R*C86h0c58wHF*4b!c<`n&kE9lF+Jt0WYUFaX%+Ex|O+ z$@B!Cm&bAb!!(VHk`9B+pR){COz?q{SPkIbtg*WPGv(bc44a)WU_Z$6r#6vl3ir{*U3n1YAHRnaknmw_31dQl=YuJNp4D^8m2zNNDj9L z;tW_ohbt1{7Z1y2>0Jbgz%Y;j`3XRPv|cQg!%bTZG`16Y0ThA;$a&rU_;sPX4gEjr z>1FNufR8$);+*8V*-x^n_j8qGy(-!NVo-uF6lGGiRc@6iDItZldpj@1-PbDDa?}W+ zz!EGKP}=o;bQCF2Cf#wm<(J#qpZ8%5|7bSFO#4e zBMU<#c(;$U+ld!WxneLGr}FIn+F=}d&|3D*%mD8@yIJ3-Hg}V0^N`#j{{Y;mrLB*1 zJv%`LhX2IA#vMt|Emf&#PVZ_#31rE0GtIcrE3zG}o-gnaAx9{)9Cs0tz1dVHO9KUN zF}{W4ij+JKeZgo|nH7sq4KE{&CP+yuN{T&DN(@vX1uV8FFt!z*v7{BLWN1PSTC%Q_ z@0p}|6)G2vs&T75=JLk2f92e;=lD9vLC_+EYGtfW*ILC>U>HaY z1JFmw``=EM0RSC{&~khH#f!Cs1pdCe?7UCNQu>Q0fUeIOz*Fg=sD2wz(*!;MfK%p8 zMd)<`0F=#n-nwVyV!cTeNj?6Ef|&qiFjOY=-RR`GTBvFLd28ptfhH9p-LFS@p)A&c zVLBj4cdNKfVmuhmI`5MBIx(@x&9h@z*Qipj*3mdURR;~GgNDhF!9gciwM4`bM)6FU z#dGeiP~+?5AzasI^(7}m*4Rzh=lnMm3Oa0mhT8C<98V^e%nvpXZc3w4v6vGW7*k-a zFBJD&ZB$l=NKEfo`iqOweMCL#c9$=f%oELk#rtmsL;0Ah_d zun!+?^1`BOE&C}?JEFeXz~mVfg{kGhiR1SRJjYcvX!27TjXRvX)rMStqEuMXc9B|?PpEVMJd!hC-q|t?z4!Jc2SA>e-+D~ve|Z}6T8eIf zlMGF131sX-HpGv*3ctpNeq$(Q2M|)V+(u%5e!WLsvW$TOEc7*G>hTmM0K)l@iT59% zS?H-{ec@DV50}dqSR++${U^G{d-YyC)TKYLzP7x83l(%izhL*~HZoSiUPU11*5|_K z@mpc0Qs$>{2%tl6JW=4F7|i2YyJB|`DmQ2!VyFKGjdwnWDlYlXpRLLWPj%U<@v#Ok zNmXrB>12i>P)`<@88>Vq6;iD2Z-=%OJUw#KPSdC>BY;PRT{fasp!INUx}2U zeQ@LiltiVZY6&s@YyzFFK0Ns~rx)DVrom5?iRr_L>;XO&w`nH{2vYyd#AE^yaS1?y z(0qjIC>V|a4F?MsM9{T81s%?Ws-0e^G10FTukJM|22N2wno zdkT_Y-Y|hAUmndtzKlZ>AD6}Z?e{;cSaYXqF%tnW$G?x4A>!u`#+)^)o%IJews)>!BKgb?etzR@t&B*XLj9Rs7DF5T(TXO4uMwbG4oa%5bE9;WVO|Q`M(@lcxDcddu2-H~3^kPqBfA+LRPz4HjuXK);CbZc%s2sSdY|*(7~0c zE+NGxO @So>UlTu*k7N1E=BVmY&WGF8?Z>lk$eEmq_*Hje~#-yfP{=U~~WzUby zs5lKff;=iG`aWr3R|=m^wD+|LHlrW!|*iH#Lj-L>ayC%7D^ zoqjK@b8`c%7qWWY)l-hsAhE#F7v3AQA85Xf@&9Gj62-C$hdCF{Xe{+&^5jRmKUb*Wr z{?EUMKoCd=4vG61-67o3PHmrm{O1q@03 z%CVAPD;<_Nwva%!Fd^>gzGE%#!?NkHw+FyDCBG-<{1$rFLqva(2D4qxS3JBB(_T#S zJ$z^L`U-YcLhz=0QHHutbzvaDB6CLYRoXhH3Ie8(xW#I1U$_n6ZmC${+!_N6%8V>& z{);I1m?=52k9Z7LP^rX>leNq=SR>4dJq)nTg<#)}#IeL5C>p3pf@sJ8_~i87JZ+lJub0?oB)#h$*ul#!Di%+D!~4G9-fZ;JIpkG z!9gKQcYR-n6W?DdgKpEA%*VW2C~$Odl`YPwd+4`Uyyv?&T}ZC(>%p~FBm|>5s49d3 zc<=VQEeA8w#dsqnJwiwPR!D8+y6Py*`!wuTco#aFvlk2r0aIa(!GuL{L@>=jeW zULbS|rhn*K{u8?pzb|JBV1Y8ChK;Oq0K|VO=?i4n5KVa z&#h1_+Wdd%MR~%n)b?o!q$moEI+rgw)8k?$Y^*3yKWqiM&rru|h)^n27$(-+gS2dR z?+5UR=KCdzfb{h7T~My|^jAR3cAtren?u8@(XT)h)goD+rvWt*y*$h}v0;F8Iu@F+ z83^fP%{V)r3305%2EcYPxtMQn309K@6o?H|wG8lFnBXiq;cIFP2m(6?a9BMljsd^s zFRoxe96LDohFfq=u6MhgWe7{bw%EzXl$^w7S9w zGt{mIiTXVm$619E7&X{azM`Bkh-kFD=#qHQJIIHhM*%1m29pZ}LtO8m4yRi$$}P>v z=SI}R0Vura#_@LKft}6+Ht;PYqqXW!}9z>rGZYz59Ae7F?e|Yv}Yx3YQr~+6aN?+rCIxt*?maH z80=`j=I~82Y(xVYHiu7Q^OcZ~9X3%gg7vi(bjq6L_b@W zSV{D8kaNh;^t$gXD?GiVhcyoLlS@V|Rc~`g2byjiJe7Rk; zXNdNscIZ8S3ek%~k67raaE#B^4DLz*?!VD!4+I zWz{}DI{7XZGmL;GGKC3uPoM`^B#OaO{Le=P<|GC%y^FO!r}6E~nFV=jt_ zFNZ}07c6XG8hiEbGAC8Fq_MF%Do30nO7v>u*okC>>wb8pKz;e2Z_;2T0+8dYFAi4^$jB<> zDGaPbrt4+1`w4C36&Y=r?t}P6Axjy+*zo@4`wd zijW!n8yx~%1I1FeJT;mEiolpFhNE-Kvw%d&4xK~#S+3bxc7XU;M`I%Zjozn;S>A+V zH;Ok{UbnH`cU6o+1JbhHG*1EG*O+^h>CJL_8!n)Y2OtpAW= zY|VfGM}#(}kk(X=lvKd56p-K@88$ZHoMadv!#ur3|C{IconkAQifp26){?XPr?4s) zozY;J^+5anc3G$q2K+s)XT~jaYMB(J@iA%B+S&i#uJkEtlXW2-PX4qH_fFfmcO%-GL0TOMdBVcVr4-}3;+=iUEP%-m64XWg#mn+^E#G6q{+lICAEy+4tR#%@0>%|Onxr%cs9CtR55+2eL{=3 zRC^Oyb*`lxNC7*$DwtKk9l8!Q{{l(i5+JC*>&+gBhd7kmAWY*`7@N&i#|0J2ooF8~ z{Grgg-633pGo+XQ*Bdlj;oC;UYcpHG%xnc`M8rmgoT z<~f@11$PbobK{7Rwh?&iraaeo7F}s=?XPA&*N$khWU@qUDrn@Gi5#;SBh6pI5UUS_ zV5~^cak2XY>i#f_j-4_*oCaLu0LZ94FcQV3Q-@iV=Q0}W2|9VoO0qQU%!(q&x+NG*)4z?t>98VEcPZ*OAI6YBNc(v(Y&lUz!8HF`6b;`0QTNsYYEiE4TMSw`s#jB#_z z^&b-uv5Av?<}gUcS4Nq9yT}*b@z}X|#-Bd|0KL`$ZqqqU3`;Q-J8(o@!Jjk`D+h^h z6UbSGt1y0_;ba8_E`V5JWs-s^8gC0L7VyR}D6C%ZK--9?D}vjJ+rs$@T^OWZPrAo* z0w9wD))0kJdFk}M8G|$*8(Dvk+ziSz!SQVFM;n zpqT{Zux8k9h!7#Hz+P?)2Z?3x$7?!YjA^tWi#FVDW~a+LWGA*^sBJC6c_#aqg`K!< znimAzb(+l0|E~EYII-Ej@%?rUHFXB8m4L07#zUr(_%3?_I%?Ww62ptnuDF#2E?w{p zfDLA1X-t&L1IGOoX;x8vS);*bNERQfNM`3iC}+20=~eRTk2s~f#z?79%M7+~-dW!| zzprbWFAm4*7CQD)Ck{>b^{d`btF`rP*u!M+GEPmrqrVV)RXN~y`kH^#>n{GevSNp~ zSDQToXu_<>o@M8IhP*UFkn7s}ef{hI79N7Z{icr3Tm{P6yl}`T+y6=5>_8JMmS7go z6Xlhkmr#a0EKG@zQ@B{Kp&{~3iK$y;=iR!=D0WMzknVj={%`9(CG$Y$fLsF_nS`dW zItIlsRb*HAbQR`((4DAg%7eHLLQ4TnDyK+;7SVG1#zD*_=;xl|{6Hx~ve>WxnkAFL zfQ-v+OjPQ5d<<921TyP6v<1i`4@pE#S>lq-Vf*JLRo>4Qd1RwE_KIXXSmbtbYOXRL znIg7-;{i(^+SRWl4>ev>nC&|k3NlcCR#wW_^$z-mI?bm0RJaNt6+a{YJPlm^ftJ+& z$tm!>$i|3z-ojQjDJA{x_VXcoY#kU-si{_%3G8KEuq|`v%JFd?@tY4sFM8 z4tqWvsHi>b?pz8D8lU6z$HgX`akn$-b&LunS|!5~pXcs-@R1 z)}^%5pviO}4sUmjJMwd-v{L}2v_8>5Bx2#?qZ>jdRUe##*eWhjY=~;~~$AwJ+$hdxB7y$s6ewT0-PXhq3vFcO(`EX0x z20|);=m3>-qDnNj^G7@|8<)quhbjbyJ}m2j=Brhyf45O)OUYYp@T>@3b7}io3?Q?i z2my;yA>5O7!n;k|B(V=e+Kt-Uo_;Om{Zc+|^t+#=V$d_Vz2c5{;>EY-ZzgKJ^kzW= zoQeGpUux)Xl5TXzC8)dE`b6}B0{@Sb7apnu6}A<@pK31*>5m4B$xF5wgpkZ2>TG=x z?J;XB2VdRtXMc=M&lJt38f2$tEQ|Q2UVnG`z^2IkoTiDGzMqPI?t8sj@!x;L)qa11 z_>|BdUs>J8!fi({t2T4QX&&GWDTOu z&#zZ`!VWg$MNMq%saiL_XLSe>jp&N#q7H!qGvc-oCV~N3flDwYs-i8x`r&$(> ze&PlPA+bVon6#Yaa{umv@ezfKODV#5G~>8YXzzx0K3P1-bxj}1wbjOH%5{Rr1d2rk z$@PIF4%~GeT2*myyIX5`R+4eSKno^cj%;l%SWgdvAOnoq!luo{ z02+2z zp>4IT2PHiI{8IUgS$+@;oFQ$+9<{oCc-#gL)*B?Ueb`J_)$_ksxxW~mlqA;kqv?@M zdXhj-&y?3iY4~TJ0!KV*WtShrwHMQXT5T8(hl`|*|!(BFB+P>Bo zd+WGE>(5~bby!QKjLq%|yyp`hgb}akN8>Ds-vMZn;JD()xLmxn$b$Th0V&r; zMVg|f@W`D!^fT~q%Xky^u8uAtPFs%LYVlP9lXFfyHb?2R1%XM_(%OKgEzq6i zrP9=^tA^)#jDOR*`}InfOcf+#@TPaMp!|_Xj=KP16hKf#t6()yQlK{dn;f%*7_$IQ zcr2mP_i!bD;T?SPA<)t${|7&sGbW3g&Tg^!cR~CU9Ns?*HTKv5%4~97Bl-6z z0rdgJ*Ru%bzJ_uCZR0p?qt3Ump`OXec;%xz3xA@&>R7+61*fDpr3_K5BHp*tXr4xv zk%6^3h*pMA8-j`-8b0rs%IWf?0zmqvv#`j=*G@J{uB+Nd*Vh5kg0pbz=xnwA%lUjc z%sUq{(z={d_?Gx5c-^rnO_;{=hw)!TH$JWm220lb#_!moauS+bFJ>&sYDmNu}|JeN7=-nz|zVl9036dr~yanzh=PcU~2xC4Bn0+36sg z?LC3CG*Cdt--Ve#F9J`KB_G*bde94hQosu%79?#>fbcDTA%V;@>K@J~A~tTxz^@UcSs^KS9RO^=3}gp`b9n2jF>8mfehMFHqcx$o^1foW*s zE0_?2=8dR72N({NU~c%Mm2kO%F>9Qj11Tzppd?A|w>JU*J(2&@M7ICGCW5NL0Ye?~ zYcdq1CGlSZ3f+>1dQV5aXQBYG;eYcAT`uLBU;PL(GN-ld^l4xu=YII4$ZR4LiVpl# zC`-Ze5+G`WswB(%m0`xhgv$y~M>QXpKeXJN|-j{dUie#hibk5EYb;<(emtCIGH^ z;h&)OI4Zql1{Z?tuw>5>Bxa+f>#y8#CuguS+%&R55l-BN!N_N?9sCyk%f`ot(1^>> z57eDu5R%EL76jkdUt7{-2{WfTvWXR(Am8wa0ypb5cWXHGyQ+kZ0^lG8duest+QgK_42ro}`=d8_!kS;geC5h2U#}*w@Y`MKg?aYu_ zX+Y{kMP8EI&>==Krc#>GS6=GHn_W3O{OTz*9vj%NuY+~&B>Aj^F;y54)C@WAh(m;i z+S&VKl{XkKvY)Gq$ayM>XysN7bL5rSKvI$fYt1v!7l!Jq&FGGW*kf{~R0I+5Ei|DZ zsU9=JzL-PlYzrX`hs*C~aASsc=}Gkf(H>@8k}_nOcMKa+wE!zef>OjzSjhFhhbs2P zF~t1y7;Zq3)!{gt#hD;C7T2PILTnM|4Ej^AP=2gd{~n*2Z{Y!^ZXlgeVx3@YNCKFN z$_@ty?i9ObxvKqG7;*S`u)sU)42u+n&>zpE10ro`zDG)^b|9N4TI|4YQUw6bT!NJm z7z*$O1-f8!X=Ieh03v88S^fk1@xQ^umIUyBhB`gkE*)!LA!koS)Jlc&?lu=Vq$ZO+sHyLP-@r-TMvT6*I2QtBd}I$Bn<3jNf}9cG{IG6p;E6enCpg{|eLmz)bA61^Ea zAbHlgzAbw3hua+#KlIbu9kH|c0@!ru4TN*kmzn0>)E=1K-w4L(Y;fL0(n_i7#QT|> zfT?8ob)P!0zOWTax7f_gJu7Q8{Pl=Nku_7~C<|29JxT2i%|>WTv%650u!nGV|IiA^ z0uJLj^fO--WjhB0Rv#>8Z&--e&;hA*jhtljX+$YAVM?UfjX&K^UhjQaVr}q`o*-2J z5MMIk77H3OEuT8UiZLy+1tHr;xW-0WUtXz*bDjjBysb!4zKkhzjxV#kcicrA`!N&- z7-M_rQcR(0Wj-t1fjhx)T4g8*HUDeN1>p<5ngufO>>AqmNKk9m@;fSQgUX`m?v} zHL6f|`>t02dKt%of6GOPNB31la=G)bu|!loLsFihXTq!8o}(8js=dm?>nY%PmC*&< zPWsGtqLMnQN(0GK&L4L8-y2^1b>;mBm&~`zxW&6k#bPxT*`^>q$eWYaBEt)*K4wlU zi^D6S85*)4>$Q+LD8H~DQ&;@BINOzB=PdHf^3@t}U7;hq{UERDG|a`cnUr zyvyVw5V`e=+M!FHscn`vAjQH#F*BL{xyIWehK0zUCGm>q`X$Q7ocWYGM)Q*QeBwHW z0245r#MLJE1;L3FNz>CF>VJCO{qq6fXo(`>bOQt4}; z>f0@Hsjp=uR}DHv6uw0fkEho|OpS`%++b&7sDv&e8PohBY10E{cP!OvCIFacB1Y1u zJNw|>N5?t6%XFNR-LQXd+?XJoT`$6z0c-7@!W7l7G7vrpQ7OZ_Rcf!D?2oi^FFjKV zwE_%kz20=Pn z=%7w>4;5g#8wE`Rp;RU$a?k87>Y<=?bXxthE|t^gMwNH5v%TGQdxKwdRU7|)23_Ca z0dN5Z8gImKobyQ2n8eGSx)*zTO7S#|L?{CzIv^t~S>)Bx9PHefkf22%&m5N1EH7Be zyNpB_kjJr`%GoIO3#4n5zYI7bab6S3WeI|cw!N53DHaZ|Or)CRqLODmw&>Vz|E$xD zSD5fKy=*Bk4LdT&@rTb^<3K}+*o(bT4~NvORTjF=X;)dgc4ylPl2X7Dh3Sejqd}5(zrKZ63TYn>AR)`3ra6z}C zP=0r6JO#3yOrAwEhkVPaK%@_?!I9y=-0itEMoAo}AO;30_a`ZtP5XXCNK-IyM?2+3 zGx^<$)m%;0h1V`R)3^8LBVL2YU(o{sz)BW93nf!n4fCiMABhd&Kmmkx;r^ETTN|AJ zl=DI}i(L7cYQ=i@u=-y2`GvvTB(DKql@-*8DRKtG@aa&42u;jf0c6@XaUr)+-Y)2L zt)wOc0>E(yfi%4C*Pg|Xe~;8}dEOT`v8opA7sQsS>;(&+vBl1@84(j1EG=}=@pri? z+BS2IwW?kD|1uujOG!vGsXVJOp@MzhZ}cXqsE)ERd$LYc=EtI#cg3?Ia+}eY36PNM z=Zb!%Y6g43$_4l|=iNoXBgrYScU6v@F}!$hg8Fv{3P1!0A!Zvlo(G5Nq1HLu80L2$Fn ziCCWwca7-%RiYiPyLB%PRt>>ya)V#t8@SKo=kg$_9Lmb5rZ4MDLR~>l*|4&9_b3uI z5HL`C_ipa{@LU6Ho&1MRQwKe}G&{{%YbLusPYt%VCJ1*$$V|`6=H7%c9p(Yk*Q*pmGvH7Y3KMw3P%ekHobyI zU-@a{OgZXo%|nDdL3_ChETj;W=`3djK@D>pOrTd{l2G}y1!l)@m6O-$&4nqx%h8O@ zFyUpipOzg_LC2AtO}&8e^R4`W+_dw(x7#l&Mnc$BL!YJCli{P^sn{scXMJ!^7h!*` za65^u7`h_Bs<7dH+k<@#7!Uv815EQVxlsqdC5wZ?itTTjTdI*J_wuZ9N5&0aX4u2= z-!$VEiLfBLg4X1sFlX4hqCa2@TSUzPkTv|pq!%U{o8~~h5lo)`?{lnDh$cj^=zALc zllosuk3khKVL*}5j*RR!a0_>0vGo>RPoB4U4YU|WCC|;StKh`_1q5WpmMS+Yi1DK;ZAU+0QdzpJ}IZc;8;*TK|AmZuB4w-ujLRC?+gwD-9;KURhEo$nOwAZJw$gY0foo z%;E&&H05>wySrEjfDzd@-T!)Pqvca$LsJ+TJnf8oZGPK;tVYQNZ0ZN3(iqXv0hbJ- zeLH4nOPlh&@}qhei;t|vea6J$&T`7UtQPf&xqJ=mjPMWBINrf%RxDiFDb2lz$*#}&PKCC11b5CMsq?EvI@GYBz ze>QtheDOx9L(0INtg?^OvGM$q=6nO|GT|OTLJRDKfXp zjiBC@CC5d6GqhgY%@LSbO9}5@M(uHE`S1Y;TZK*}2}=aYvZ2Cqu7Nd5oA+S%jbAQl`4+oET;pZcW#D2C?uGPDi>vX9OyVGE)v;f0bK9&BAM!SX1*JMkN?3NRrER6do7AQ0+;CKK;x_z@Zi0~5p`XmUv40WOk)$k3MJbA{y+ z6vhbZ?082Z7a6*>0!9d=<1`v9 zpqaTX3d-SlKOG$w0R|92e^Zqkg0HK=FMpN!v#-1Q^!n#Wzw?Fa(42%zN@m|DBP4;W z`@{^Wbb~|qgX9jY?0|_!p8C+-Os+lCWi)|Z*HK+61rAYGg5hd07^&VVf~+iz;G0v` z35B~Il~c_To4-T`-Hd5e%4Snlg_)ifZ|j|WzIdt(3+J);8#@8H+}ld>Yv+*xpSPz@ zBgvbIt@owbf!1%1E!S?`xdHm-Kkvuo7P5s#LKhl}9|F7rp;X18M#X1Ixp~?O3qxz% zXV*TEjx$DMkZcL;YD7s*AHb9{;VFd zw`!Ra=bBn>>^#O86{yDOh<`z`$$zXLR1zF^$+JCyX{nT@A}LvExv6cBC8H*%^9Qxr zoY9kpExX)#84lWnmg503@J<7y+}%`YoO4BVrmNyViof4#=2g}eXva{ zA}-0Ax3Z5mvwJX=df3MM59C8<{vut zy10rJ{SY5Y4!{st`n#zeT_Q(2BPztznU&A1G(DTVVq8qLOM}o4B@w}Z!w3C@cYc%4 zn(U*YL}g>Oh3i*E<&~xBIu$T0d5PM@_^(NPPLYiTi2_qn0LQ9BbcY9@1elM_Xf@yT z2z@30+J!Y#1oHkL1xQc^`|a!m^h^5&DYVrNxaQ-JaZ@acMkc@_r<~q%HWP16hg%jI z&ul^|NOGBnbb|%;^eD|_!i#R(0F`J37O?r32@ViYk9W=52rC8wr=EZ#0Mtc7t%49C z05u4x`n>*T=lP$CmfU}MOMW2RoxWW^P_c2j@~oJX`buIoO&lJq%gq~LyPgyyJHf(4 zOY?@oqJ4K9wQ&*^A4kjU5}xlC3tr&+io7N`X4kLcvm^R={l^38(2g4E11Yf&zb4!f zm_Z<#TozzZ3DsU8sdwf*4G-oIc$Fxshm);FWfj~e7psYY13Tl#Ka}3j-udoeYKBm7 zqIRA56GS?8=^J=O1t`d%!SqfilEt~*(GwPD2AF-KuSOi3bDNOu?h`I16|WtSzq1D+ z_Vw(r4K`R-D2Z3nf2A1Md8ifZ>b&uCpS=%@Mm9`$?;-)I=xU!qFWbgWXh3mY<1501 z>j*s9Wc!jhKbb+MMY<=tRD1uLYTVFwKZp6R{`)G;Ehhxy6G;R%yALcq#!>A5JP$SN zphOi{g=wN4G#~sv*_BQxv`p!G_{MHuLPPPDc0J8fw|cImd@v%8fXhJCO(D|&0NrPkQpN=64nRx9u}gOk(H#61+$j416=$TWt}e~M9Z+mEeSs_$_D3(mgA zLQ2>smA-BDg*pPDrVKFaZ~r)^xw!8#^g4X0%J;!XaT27vk+-5WriUT`I&liT*TM=% zsEKRj^|G;slZp)bhFgIVnnRtlj&cLVtgOS=<-K3i_)p@Dkt=;9yQNqxb8v%WB|Ue{ ziFILKQ(AeRc7J07ADLB`RbcwW0W~h9s1jJdcsf4QT185PEHXlSeVXlJMIRrZIV!Tf zq!sXA;{enbj&TTobV4XZV;tK58DuDHL_5M*-q`j1P)E6@x(XcSzzULhZY?g_v2X%? zS4U6Dkb{oVNL6|P$R+-SZV_5!lJi--^P-pWi&`fGnwWjMGHW}Fy5IB1%{|Qp`ToAI zRhkF|$~^efea(98B&gmwiV{h3mWXTWO<;D+A>R6)cO-1igCp?i27N(LkRtAwmkVt| z6UZ@&*uny7v)&{J`3*I+9xmH25d;@abxDI8_wHCbHT{2cKVb9r7$$lkOyL%?2BH?hq9)y) ze|9nc%9o>_txkgnP}j}?9veTL!-MT*YI7C%hJS=CJsS=G9Od0?yQLpZ9F^kwbDDn2 zlx$rIfgpydq?m$lp+$7Zj&!aK1M&Ol%%#4W%A>TZY*QO-){vB**p@r+XalWrPxc`>_b3Cp zfc{--DE-c>_^!L-($(^qgpc0C%a^~0l;i0qs!lWgv2ia)o!j>$;|#^aQ2|kD<33g; zT&NC-N|UwW4O3Vq0Kf%uA1wZUuLc8zU;;1!02H|as6c>(G%fHH+BaI88%I0w<5er_ z-yBMlY9o7&U_$~KFF%u36%INW^~*5`xe{KTv50?!+2{9QtqZi4IxvK{qS3+6#=LS~ zmT{&{Wd+`&TC_pm_3OKu4R3<@Mck@}yespMGT9NwtYjhK|4ZPdMGurpMpK_~;fftCla_&MAKjvaVxLp`VqhZ+xRDHXVP8k*I znMq5(2#7uz5A+`>T!?iK9_s!(Cmuiz{@z=kLO-VF_wGtdRNGEyvKP+d;IBhkK%-*? zSwOix8=CYE$AqtG+WRK_P(Qw55c~dg&;BMZq4A6*E)3KqjEkwux&cDq@pCbM6_6E+ zW))B0oJpVd@v)uC^i|jy?PTdEExR)IhYPK@EEB?imG8J)f+>JPI&3{O;ao(HHGJU*SyE`(gPMGTDu;VErZyeCXW`YSEED{8 z!C1ESI~6f%)j+Qv8_%O&i`WQhTtJla=go$F$a$c+ad^{C`r)Uv5k_ZDH2Vyz5-*}t z2cBpbsT|$il|KO&Cr)fr2TttJTAihCni(B)%>Lvxf?)%mWSYAjvUxTeqxLG~<8rZ< z<|2(JBcqk5HDgjGr*vd2mBp?%v`h~B;eHadbxC7z=!UscdaoO=|LVQ-t*1Ns{>b&z zxG1rfR>QemU9olQ(dGP>nl$atcI&>qHsxw-?IJ7@%vDbw03S;v2~GN|$g1~{f!DU{ zVxTr{SLda*dEZ#r>z`&gujv1Y^8Ww;G;k5uO6>-Pdt>=KO$lHnqbRJE=F2A^kkS2S zhNO;W8J2gknsHVrKYb>^76r-zhJKW&^UOc)bv=yY>}(c3FlU(YkOdKiUVB$AHUaRcB6FfSB68! zGsOyI-h6k8_?Kg=2pc3|i^PeK@Jri0wS*SMxnb^#viau~meH35#=6omB(1C4<_gY; z>7YKJvE9aG(=YChC|8zr*`S;xEU!+C&MaGD)3D0D29%;xO(z&P=`&@@WM{3ne~*b4 z|JskV(YHPyJ#W_jvHxZi(qZ1qyd0jR;6n*3F#7ixnM8qk_oNw8jj|SnyM_(>>hmb~ z5w6dnk1EqHs4_t@1e1jYM{glRB0_873Z_lU4<<$te-6z=p|*)gN`&~K$vFIV1_L-~ z1+WLg%kfzxlP5Lu<&^No8&!7q`t@l)Q`XKwWmHR1)$UY^yHk>XAhDnqQKi4>qzRE- zT6YNG5n!9YpP&>0Q*Bh!a51cA5QFfafG z!QmKfmV`Kcs=#JH)!CgIzlLgT`YQyq><{plw2c^{aY}3Oo#TX2zFS$5xK{;M9_X8> zeDLskZK0O2EG`w?s|br0*lzrCBHU8oM9K59YsX3LiEMisXz<4V@{aJ2@Ra#?y239s z&(DD`+c`+D^K2MRp7}g&n8_ZF5jqx+m__5PXrc_csU08RMLCI1eQIk-HEm$h*1(<5 z0?Xp~GH}|3vRCZlItsqM3y51@xI&L^D~%nl^Wa8<-AGQ0 z|J%A{5I(ouPSQg zKxcFmoT6m6pO|BIBVjiqJ4*UQ`%#Sdl8>q60Jo}%ov250phgnm>B|?Sits{zu~uv} z8DB)%G1yhVOQ84Xms`#jRmrV zGs=&>kED>jEM;6GSV8DyvukZXyN=P-_V6m>1@Baw$*)_*Y|xV^c@;S$ALCu~eIY2E zmj0EYLLI@GM#qQmGbMY&BYnHk3sG!4?tM{zj&&vJ;aw}-M(|gQ?U+-(N1%v7Ax-mf zcX59!hdy}JP}cCeoH>TH*sL5aH63YjUQ_Vs%kw-p0rJ?ah?|_59(h#r;4Y%hE{_)@ z=-vcRAAs&%@GpjX{6$r+E^>!Oxz4XTP$dfsd9| zQ7#Sze5*%{FE%JQWu2W9Qxr8y36UTYOk!g8Uh&9;og8${ zGT)?4_1AngB|NHRvn(P2lok(&=Mh`gEVQ_x;!a;a@BM9f!t21RmNfqyQyn2Yesxpl z)y#a5>~LWwm-`7PM-i#xAoa{tb)0l6xLZOk{IfBW{iLt-ioZ`^2LG^hTe<1VO8L1U z+9K$k1qoh}bSj zuV+h5#S%hCCh;Dvs7qlht+N6;ZDQp%Cx5@LkQ#gl4%zevg(21#OoAqCY*~v7G(P+r z`@3E_{@If2mOf%+dG88O{l?|X$c}a$TTaAAmCjBZYkz29kl68Ud8D;n616fkomkq) zpm5Wdo*1v27L3qjCRK?|MOJc6dz?>-h`Nsi?P7uVpb`M+h0pCC@FD>rA8w@f{)ke; z@y@s_203J0Dymc&xjEljKc`Q2j7qQA(A(eu8Z=@51Ma;JcH+cH^WnZM;{b_{n0;`j zp0I{vB#S5m3f#{C52BQhX247ER_(Js8k^pSkC|Ci24*48+H$%6d8tKY6P<9=3!x`t zYGo^s$PsCw)6F5FZRl3~(C%34ZRoef4%3n1 zYnUA47!R9q=DHfJoOU#WC9%Q2G8zG8f{lg2t%@x=2uxzjld3Iy+tRsbx4e1GEMUI0 zRnoXwh{s!Xa!7o}>$?DsBBg!qX%k9bUMz{2hJl6NnID)CX~!IfP!{7dX&h=Bfz{Af zkj0!BUe646Ve0BZvT5l4M#U@lR3smIe4S^)=mZedl6pOYWIsnKDpY?ySYo$x8H;XD zal|rSaGEjfPF55ltf)dn;pCR^Yix$_NONcF+Z!P=aJLFNP}DT^7ek8928T5ifOv7aD^&8@cnlrycxkSNMP?*d?gneDl`1XgR{i~ z=&)W*N@>h>=($#_%-hgT2_JO-7vPpb$7y{aobC%9Fy4FarK^o~GOt--fb;tnmkEJ$ z)1cNq7Rnq^($S&Q=a+8kx0^W@O!D>G_D#u)=NymdIeckG_it_r85LyN|o;rhE3 zh4_w_{P5cz;oSu4iM0GoM%?&#UZ<5}NA3nW##N>rGH3|Y{kS~n!ppXiKeXi==T2h^ z3_P=$ESkQ!+q0Zxj4Hmof5?Y=`8xPoCvuUINb;dTOMnYsnN%u6A~RfCG+fH)Yb|bI z7~Ioj&D<(>)TV6bxmFiFO8+~|63R=oj707h|Ln<*X%02hLz&|KG%Ar-lBBZx`+n4xN1~r)2MrRrP2N z%ooLat)wV1xzGU?p(6-DuK)-9ybuA7EB*8R8vtBwXP&!b|F+{>(kkN7FZ~`kajA~{ z*8vE5y#rssNPck4g{Ecu$wQE@X^w}SkG|t!o_PWiHKJzi!9uZ~4WNfhHajk9jeuAK#nVUS z*?vsxEB)d$hxEqHZg9dUBI`(LkPH`|96gTtRXH8WjNX_pdGw%!7pDH;QyJ7Dkm@$CDI&r?$q`@cxYr;`M5@R}7A2Y@e8qHnuoYVdJ zLa&Xi9L8v-l^OjM6YXo;RIi85R>if#bVo}Yts!m_d*W}ULTo1$wKiLxq#J&&C$5QD zMP(=H->j+Ad^%sD2!tx3bt=O=(`M2g^ z?)&*A!qW}{>M@1+w7m7FpH%}Vq`q-O*@^sfJjV3?tn}~@L?r9tX)&`XAbXX%^~}zI z7MDHIa$}@y)|Y+K7Wm^8Q5RCGUnBGN7w+7(HFp642c>5Q;``qakC=> zID1)00JsT$SfC^hvtJ)x+yA%GEQmKVsjpaSlJ<=)ChD0hKc;Omgb4Mjt;~Nl4hn@G z5zPp+TIAP03ckR@i9~kD_!>n3h_SNMcx>a0dKO(w4tKS^e}bA(s;h)kRWJ0$Ww1Wps(R^2nm6@(8%0#cNRIb~ z{*W^pjqnw^*!T=h?EAi}Yo}uYxp!$(g63nHZ0D|%oP-_>>2CCa*QeRDKQgB8_eRw} zBB-r-hkQ+|#FmJ5yAzd7g%I73QIn)7&e}OZql`aS(+{*w$5D{~w776a<);!#c0d;A zOG0fF#bdJZU-7X@_0&Moon2p9*81=Rgde4Xd#Ukd2Gf86kcEORAi4u<6B^8|snn3;W;6Nx(f#ttq z)LaQL7|7fp_*UAPRP)Gt7;)GBhRYEz`3isX4z!z?yb&v9Y^g&akSnMEFEb7J?i-w# zWPkiSNA2JE>A>4Pk_Y8(arX(w=0U3r;i1iZ=~-hvRh@Kb2I+5;o|TFRMkkW6P84R8 zW>=Xb8WIy)?aZJ|`j*4{dQs(?9M-f?gmLXzq^UJEcJgP^rL2!YADPyV;%=j&Kq=L7js^1nueYp^Q5YJFF^?6?2o+ppq$AW_tyCk*oEVCvP`+#=dr*# zvH=RvwgJ)n?~qRa0Liz4#|S>LQq8KN%eX@+jU*<`m=ot-p?l~@s8B$T&ZZlh03ZWa z1eU_orFxkWuQEGmQ4x#a2LlK(fB)@GKs$U52H)@JTc3B~6TQNcx-NG*$>yD4tTQkA z&zq&SqO9M}4#$~l*x!wZ*L@PTu_h4=cOoDKw0}Rnv$x(ezjAObp$s13LJoYE*v~{$ zuHNM5*K&|azg39ukI18Ip)-%|Lo7wn!F|}SgElSCz^X>LYvJ~UcEZ89glWMuc>(lO z%jmgox0!Qm18U?dIC=hJmdxS7Jd52ijwxv}`skDDoB91*TSdI2goK^c4Q|Mk9qR4X zm1GU!mN^oItk`-}vKYSKsKl`p#jnnkEW!eU8p&j4(wl2;&a0);6Dx6l;oCEqyY0ll zK4nltvAQI=+Ctkne@^+(SWD~(;vB+8)&MN6IbrJUfV`_GdMo`biKm|nhk+Fy8J&hwpHR_)SOg(NO4ooD|!6WuK$WK09Q;vW=8dtLR6(v zq1-TIP5789 z^Lv6mn!!H z4VvUp*QJntS{WWrnFPcTlC*RVIQGYhq&v-P<g0;E|s z{xYfyKa)y_kiv#vw(i;Ei~^nvM+a{Wkh%cORFO^S)@QKpCSfG2a0y7-F&m1a^6#@l zkf1?$=GwE<9p|izG1imof!D=Ij>9248G&1z$w$J?i^$XI3f3B|X z1VZx-9Clt5NahNYPSgDGd=8v;aC`+e1fSyY z8lV|`ymd;CKc?!At`5HN|2f1Ac_dX2n+6mTOQsY&21XkeQ{k!S9(n$f3jn`kO0Q~a_Fc2ASn7+|CgAezXYdDz|RL9 z;sV6|{GYzA3njAte|TlU^nc+MUicRdd?G?g;W5zha7|G)9At@w!z?8#${OY-aGWLl zzgJhPnvRYyi{gEoevhg(r48vsw(hRew3TW`sGMLOiTCX*7w?(HE`M18t@}_acyF7wQ$ie zNoQ0|^^y~WwcJn!daMIM;>&0dhE;-cGU}=g6MRfV#y^r+bod~r;^c=tS&0|g+5*j0T zxF|H4<()EhF@3ntKvtzc{0@to3_S&wUKzPP_qxEZ9=NRKSlcw6{1nn_-Fm1!jd4JR zpk%%DtA01;P6_u1a_D9M?(`4hIn3`5JiQ+|Y8iaPdE<5{0E_9q?@GCodp~?=)pkE} zaV5EJxc&S%Us}A98twWskWa7NDMrn9KhnmgVlr8UthdU_hSJ)#xIy||Ov@cQS#u8w zv!rp)nfaldO$XSyLNleFfm&zvjhP&b#aMGhB`<2`MC(mSX56rsY5ymtW_tEuO*Ska z$H(r93Ny&Bvo~%*zu?qMaEw^RW5IVVJ$uCEv>ROkGn)_B_tBPQ?DHDdWJccp4UaFs zSEzM{)eM;OF&8+@vnjyx>*E=h@z-3`5ZoGDj{$B8qYTbd@O6O>5#GiCA`_R_(6VtY ziVcYcq6oyWh3}PzD&n8`3XC{JOl}C<3i6xAAoEw%DL?$|8Z|Pe1$0Bby?we$>V>(~ zuVQb;9vzwA*#VJV%^2J0xKX=OjT|`$Pf=1O{gT#j!B*gB83bye>J{zxek?e2%uNLB z_g%~qe?GWDhc7AN{SWp3#|BM4+t05c%ljLK!jTu}$_NKF;TZDJ*VzuF^s);pp z*eYos7Ub6wlrL8gLO#-ZmBxXk`Q~*h7EWHhvkDIHtJ^!;(IARqPP=ae{NP2L)_VZ~ zHR0kNH#H*Ls7BG0(6HyYY!+w%4l<&ld1gp7)TH9oG1qu7DVe+`H7wb>$f{RJ%=EoD zJOBV1RshCXxWpbB>}&kY83BuE6kgzi(8BskgSsoO=;$pX4cUB%s3==oq{bdt9F-Io1&LVb}=Sp-(ZkI}rKX!IRJEZoFG9p#-D_9hl z8ogvbfx#1Xw5`ED#vgW#*EzM_!|jt2s{&KBQ2rKC=Q*%(F712NF{~lXYaWd+>riT z7*kr;bfGR;$%VSP%_e;!nq;LSq6qB{K?ERTv$k7?7j^DwWqkLvH?69(Rq4b1@Hv#0 z9-te%^{kk0_S(*7tGrlDo9D?V(!zvMlG=G`XelisV+&t5^koCFuQA?t`QK)&_$tO1)3M&9)?hj8~WZJsH>Z zbr@flm%=EokgauX+e{iH$s$#pP_JgnA-PUb}$DGbD~c-7~CgH@H~ z&^UYul#(e++-QuboukX(OR%BzK`^evgorkMtNp=36-v|eL=2Q zuir_ivZo1iASF`rr;W*dKb@8mRXid<(D^Y7_BR5mlWg<0Tn-!G1ewwd6RSy;<;q6U zYyH_1bBE~=FD@LlB{bx<`9O-4BMTKG32EOpTp|nhW?~>aq;;u>M&-=pRT|Ak8&nkY zVFNZ>P$X7eOFFj|jtJx{s+ep<`$|{_SH!|GHUhP#G zk*^bU=pJ)l)9qS+KxsC$CB?`WimTdLt~2UcFmI`r9DDX$0V_qk(ps{2a%m_0w4)l1 zGE|~PP~n^K;H1pCvk3VpN2u4={fTqfAmaSY&Z6$kO7{WtN~*MxSB&RZ?Kt}QMQJln zVSyO^@fub#_DO#4N3k*tVe@_h2MflEj|QCiGs3lBmLGzkPQM7^b@ygVk@UL4Rp`JlH|IAvDX;H`^ z_2ga9>~VFwY_1(2f3AQmP~*kaoa@RzHsZV>Uc$vlhJIZlc! zrWVr(utJvZ)&+2Tm>~-|!HvqaHss9l<)h#&eu5n62iRZreHsY`6p`U(guf*`n8fxj zV@`cfBIDhF%p6~9lP^R$sHvNkn_Elm0%$~8cOL46Z#5SJoB2CXcm4$rr zx^mv31hLsV*uM~{LCh(ek^tr~W^Yi{#__nRh+UTO$w&cWrj2%L)cGOq;)}Tfvo=ns z&PmnZJQ_uzfhO!~-#aB<1yx+<^^ZkvjicBnWJvCNaeklsOyHq>k&!_ zclccSHFK+>&hu888l;1JfprX~!fV7~By~=yfoF3bu7pj$Q}b=4xRq4LMS{NX^^C&l zTPC8YGi62dhzp0!3tG2VSxNYtK2KY;su;f8kIz(5G+F-t%xh6Xlk3Ijnos=so3D5% zW#tf%i-><3w}HPs0extf?~M~^P6f3*I*?7PDBrD!Sh^5sbT1>3UD)=0Cgqw`2kZ-# zF}Ww}lnx_A3a!6r?2TXi78hf0ac%V`>zdCR8dtf^(I%kaw`JMLKIZQED{$j~j7jnO z@taIY)yeI;C?W(QQySq{Il|Bo3(Du;JpdTcW^VdynYFF~U{aS+f;CNX!$E(@;SQM7 zZ>Z7X5x7f)-0b=USe5;;AlRf#M)6bn3x90Qm`{OwtokY6-SdA*zIkC;aZw#!5iqNRtd5OmBvq=*FfM2ZU+kY+*z9Q>> z)&$a>`0SS}D)so-rMp;}`Dxr;?oo;ew0N=h(WES@J*Ty%vGOC>OvP%4S=lMmTi+ZE zk_K&0Z>(Ldxn8X)$&Y({UKJ(VH?GBw1l_zL1Io-xd7d1+4k%W0d`SV(_qT{HoU~^} z$lUzCPH)ZHUEKmCLTYrCXD2E(Rg8Myzt4*ZjMsSZ617~=dh25r^74EC5tLM0YUv`K<1ZOOQba|LqKv@}x!5a`ze(@_b9#qB4DMjZ0p?>UE zMa%zpgjYVJ248D|!3nmvwWwJquh6<(7+Z6wa(%&xv`MCCUG?!Fj!n{Uv3YTF4lGt9 zt`1G-kI`V`IA7~8T;TxzonV}rj>)=982TMt0y9y8cajEMCiplrGCZBsQenn8q50-L z-Fz#oI#92k_dppgN^-@uJpihxhJm`OG2E8LxI;f68R#l(hiQ6cxwPUP7`_v$tb$waBlj$NjtF5ayxa1$s zjo?7FuIJ2A5$de$IlZ*UG#8_w2Cf`9@JO()L3dzE6PKt}bmBdl?Rx%)sJ=q$*Z$$N z=b9Sdxt!9^UF3=hhUZsRH`;dxbGo7dlq0w`^n!!v!e@c<%gI2WX>= z_2d(Iu&BIKi)_ajhQnS&+8L!WAK0~|Y1Z9Xb{}QZ$BdMaU?LVjo;AC|-x6yY-&@6M3mWcPb~Pi#!mtX%g4SfMOiFLluB3p;`2G zC}{*eU%cko1RV>-_cuHw&g0#| zttAC996T&~o)3tCMGsR}WXOlvFKfSfhE-Px92r^0^IqUjFl1an`9;cg;n@DWeRlOm za+gRA@;TnsZ;rvWwYA;3rj3NhGPnyQ@FSE9d--${MIVhy-^yvoO;_cU%!qkSA3mm588O^iPq*)l_HAUbYQe~65Ox>K;jYgiuI z4lyS=dE}~u8HtSOQER+PNP79|%hq&OxK(H97urOXgE6tV^=6iiErok4Nm_Yi(N>2U zmi*)91~s@TqLhp*UQ&dIq7t_EhWN`MrADBr$d-@JwP0!lwhgig?bu4T{z=EU`w0BwPz&Vhqza9 zp-yrJnP$GPe|}xBr+S+MEDrlI0IXa4aV5-$!`PPz2oTB?1n^#K5tcxc)6)x6Ab$ zML}g>fiCAA{q<)7<-qf_{cyEG9U01y9o=Iq`lPn zguSu~KnMkfGUb%}i|7r$@dxA_F#w$`OZ2i3v@ABWf->502O=^w%BU^Gz%niywVk7b z{sv=D9ga1f`E+l!?yD~1w^8!x4~8_avUt<`lCVZ09gLH<#53HB(dL}Zvy?tIyQm67Q5=mj_Q|JA zIJK`2E%{-MSh09<0<|2#iM*+4sZmmIa=)%sL%!7 z{iA5TqDc=yzA=OsRWTJkGF(KmBc~ zSu2^6G$^vyNboD5U8fE#s4l8I(Cr{QXNeY`6aKnW2fH+W zZVG8_!_%j)ANttzN9}1(T590nT($+4cMZrc-%)Xz zSr4qPG7u42s}r8>z|>>R5AkbMc#=-`|16kxXq0y-c{y-3eYpq9GdWlcKnd|$a*tcNs7+oDoBd?=$`or8m ziO6zJ$<^<0ap>W>ekpkRIs*WFp6u*LONQ?*q2^x6vshv90_>uzJNh8HqzQr?kUBPY z07GTaJ~=ROZ8HTw2eZ+S$My;#BVl_{>M3Vpng4&MFUJ{{Qg>_K~A=njS$^pR?mDLHxXUp~tQQY__M8zZvg z2W7e6nO+N*a&dD+x*?nv%o%(rf{q9f=|Pzw$FV^qB$$7xT96i)f1v6Ytj@)VLYPgY ztkv0;>im5}SAr`*c+jfm`Qw)FKGMz8n0kFeJIaQNqGU6>t$CI#^Fa#DH;LV~-PSE8 zgMNgF>#q~iW>hG@yr*^jHh@<|f81@8o9~;CkT;}V6roSF_3s~YxW`~|nY}!`UBd~( zpw3_0d$b_U?*J44u5Y+@w-P@!UX(jHBv04xZONnHY&rmN<*MS44V#t4UqZm*iO1y4 zg+kRtPa3OSB@P;(S%v_?9?Y44eB0$`%|NmUeq{Mx$)wvrQ6+t z7k2$tSeYn-BJovJtl-z&#3i1G6I=)=7oO z@70ha-&04UIs>=R+!Yv5NBHa@_A{mAcdKbs=H6!8e<;FvE){Hef(d!Q}I5G%VI;mHEGx z@&2rQ(G@SaGj6&0tPW%mE}+x}-P z5O>pOh$UI9?Cu=&l*pd-I%t@_E*=#xo6j5*=*PN37DJYQ7`edYPmJC!CdZ`@5I$C1 z*cMS^^8Vyu`Dd`7E6h>~Bk@W(wLzi*`w54-_7oKLn&)~rNV4{n@h|Qw@$l@9pq&5H zb;NjiD_Wd|#Mto-mbwIe({xf9KR~UDsf;!Of`CsLL};pr0d^=#vfy9DMD9Ao0RWmz z5BFzf2L=!zH(kpdT!iqB{&&l@zX5{-OJG3gQ%J7!%aAIPL_67A5YP_>PAU5HOX-Hr z$!W{sacS@!jjS3eKn;+k%y<6l36e#phRoq(tQ!Xf8D;9pwU=y7K7$Nj_uTq&%n6t~U?g-ejqtHXGwM*2hJ?|q;Nk+?pyW;l0hT^Svl6=h-g3gw&{fH&0|5x%#PJy| zBJC`0#*!qW=rl8GBeF<=H)#5bM(uzjFYb_`RD;1skDSXeD&U7!v$QUM&s)Jm|MvRa z;vcu)w9gGmT!CAKqaa2{R%hJxjt^Pp0U6w@k zXPmF-#+~#$KKwlj)Q~rX!!bcAdbDCK$$2A00+Ie7O>h9EuZt!i9hx(Xq7jHgIDrnM zE==1|WT(Oa_y7)VXitYn!~H8+NjicJpB0ciAq+H0%mt0S1gJwwduU~nl%~MQr297y zexZ|?wrSy^83ipm3RzfzG?BX$)vmNG8%b!grLx!QR9u6;M*xQIPa|AP+BAL1upNyb zf|fBcNyY?(MRP=q%!bVLGU&%_tljq%GR_SzanGx%gedrtMPGcQl|CT}Z$RGp5Fw1X zj^eJpqgAK%)ersN9vAKR-jF6UUyXG|-)z_tKv$<*8!3ePo6Hskas~ z8N269ExE?9c+J#sWb(bFAV)4Ev9eDpnVnTyh(eM1zNML@I?4Ij2Bg;1b3!gw38C^L z5x=ysYXY;SpgNNM0SnOepg7TgarQfTPNqnW&#s?^%=5e=UU=`4&L~q{X^&wVFeT0W zt1)=ljm~q)>1*~L8yEr500j8W7hC`)?`JMM6p19W0GTI^*_Mx=ET zivtC~mP6^d?C3Kpuzh%Qc1oNv7J4+Bk3I80mJM=%CuSI4>|}pbhK}P@K|eTKq&r&? z3zJaChwlY)9~XBPC#xh?CpiZiTUUHvXEWO>T9Sy?6|J(j@BcPyMDJOso*lcmMzWvu z+`o{JF&9bcN}9pDKa!s9`_6Y#x%IX7iF7DudE1ez+w}c@qH^frCcIWZZmNd7aLr4$<~;0m$&K{qOW)y(vhV( zA`pQwQWAh~uTtsTsGw@<^vJK|Cz^OzkU)jEbyIQHT#}R-0&c3kW$`j{I&&dUl_F^} zHsWA1H(kaQrEQ)Rw6GkwpXzZg8s5Ia?qe=e{mz}uSYphinwWYBYwC2idI)-#6CZ!S$k@e z>G%a$?qByLv9&?`$#-9PV6@?`#XI|fiigf>ev^xLa4&^8**e!QIN{|H7qaDfB23#giKTNEKdm_h zhR&DIu5susJ#|54S)~DciIR$b^B&xH0Dud>FQ4}nvq0uAWoJ#rt)f8#q;&QD`x=un zOfpmNxDJmZPpv7gpsv=!d$4+XusxCeJvH@FunTU02lTZOEwFXojxpM23iVQmS(OC| z4?VD93DE$czTlN(04YQPHBMB;z$M6V*mWwrThP)$?D*$76b zjsdcLgdOuoLn{-pzokw}0L88qw7fgP8Ja8WmbC^SKV|2g#`0%f%&PGr1r3ItdBI-e zUoXt+$G_t+m?|yh$>-D@-5;HwyI1G^bEn3fif8*RwaxA1&5N+z&_Bi}JuR=04yhs3 zYA)z4xJ4bd-L52n^IP2BC3(|6dLg=?-;ei5_0+V@jAWRN*oda$Rjd5~HK@`?a^wot z<2lm}9F6%vhlmW9t-1O0^$QB$e{S zV6O%(})>%@a(RT3cPwj9uN-@q}g9_8AQ*t_kv3@5jfCLO&MHQd*B0Gu9$CgvLjGoZZ2UU?KUABR|Vl zEvT`l^xDPcpy;s!o8)nRtj25{kCPKs7I$-XPb&{=#(Yxa^siq!bb76hM`LItnDyvp zr8LkOoWM`&MpNb=#}ovt%05eZ?yfM%n`#@Imt0Q}=2H9t7I?)>BTG6BfZ6I-yq>>& zwyoeyWI$S*)pn}6$nFNe;Q?2gvsp(`g+IUFm>FMpNG{Vd{_mF#hK$9zTKE9Mz|YXW z9!R4epVk#Rt!|U}df(Sn9BS$>XDsd^091xwKFX6dzkGrW03J{Qd~7x0&!YbyA8GzS ze1s3Yxo+Mjye0(KfRe!lpdb(@2?xJr{0jqdl0eXj#_n{*Y)}T?)#_AL_te48r#AGT zcHZ9Af3@yqQB58N4x_zgG9S7b*u^LTNSn90%{{?f}KHIFtX~q%XS0?cza)nv=1J?8W{7|Io!bsf*BE0t@JeG-@9rOpcoPQE6(nZJGfMU} zsqu!EqSZk$mtC_BG9a&&RE=|>nF+UqYTf!}4$$L#yEhzSwXc3oAtLgNA^zC)WcA0Y zKO;0-4dL!{oAEBSR}@Io??s;wjg*mh8m97!$unRZ&F zogD%_iySX6n`=1`eKLzex<3Z!?3tj4u~xQ&nZ*>;0iDwYAHAFdpCLg#VtR@Fp;`;#$vy zgMS(@{i{C8eUP*`8d>n^Hph{Ci1AG+<*?5#DVTqpRl=Sj_}K8V+(Zik{4k7+TfqxT zAp!h`92$#a+K@saJvXDaQ>U+ZNtk>U*sLu-ZtK5-XK#=bjt(&lW`sY6 z?L-}>in*NBesaizDM69aO)d9;i>|o&c{OYcIu!m8T12v4wi3X~xHNS$zfV~|T3N-# zC*`&5SK36)jhJ~^mZy|!EApL80qyO|)AQ$*Und78Z@E4I%#2PPW@4}7AXwDE@@U$> zBP)FJRKlzJ~ptIeqGebzjIfHL>a4L_=v-;ncTrqk*+r$J87)(iIj$KwdU_uYj zKh7k~L&8A;iYMdWA~e1ESOxZi1UvLBa%iBh=*R37WZ$u%e zdbQ^3&wS+zx=K8`ZAcIWDbzlSs1sdkE5sF1l|#aCE|Iiq)CfT+)=3ewXwdViMiuKn zeeu%{(Ov%?@t2M}NBVLZUsKe)76SaaJnCRD>-6@jc}V z!Aj^)D>*?{ASlCkOGH6mYc5EFj|$WJ+h)i0LK}0oX98xtyU~n0@X&`dy9PwbIo z6_IgN2l{z>1877dw-M19ATPWim5l#N9Kd~rdjRFNn?Q^F2q5X&>g2ybU=ifX@WrhN zaH0nFsPMl-j{{Gj(L#7&1prW9x0|%BLBX@qGZ9mJhfa(jEwOiEFF3qhXUi84-vJK@ z7?g*Hx#iN#$gU-=ivK3=eCZGX;G<*h#@m*94p%OKG!(F?FL&-??W#K1)%yPOW5f99 zc6yG1NF&L^7mhoze+&OjjDc{Vv<9ziLn3*h@*-pEtBP~r$QPN&<-0}8?wfD6Vmx!~ z2c-pb>oeQF_T?@r2}u-RR6}B#t9~4J{?VTh($(W>$c~dDH=HAjl~mVQ9#1gmspv=Q zAgfe$Vx>{JoIuvQPPoHFI_UH_Y3<|Dy12sg)uJz!%%8- zSUaLfK12&^;|^q=?Fa4uY@AY06e>j{K;y|u4eHzBzjDMw2C0q+`DE{4f@4z2wXB2~ z#J2i)XgHH&Q)aO>ZAa&>~TWvG+RB@K;14jdE@vs+D8yU{{`3va$)X8Jq;SO9egVWc@Z2r6z0r|6 zeZmB=;Sa6LYoYqeWR=;p7yvdBs_EtilR#O-JKo=zKqFFc>jS=GKc6^OqUbp?wo39}}Ou z5am|K5$WLYybsjRYfhx#*tUe10Aq%@vbD^{L$!vkGE$KhS`b7`wax0KiLvvI>$RS; zGl37vw8+yi9nRgO>SNsO9_ifD&Y**pT1s6k)|G;>2p^;=upQ%nRl z$GfyYSo+f1PE2;6(pek!c6B{Ah`o>sO+4cf)C~&=a(bDG46udK+cCeyg&cVKnk)>gZjBY${R^8V(Ep!&fK8!4US65^c6|3CWI1Wncd5uV>HvE$OED|ltlW5Yt z*_vaJ;iEFrSy8I1e`u_nO=7XLTR<2--X2y6V#D3QJo}elKD+jd4j3Moynvc`Q|}u| ztit7zPUcsUQ5=265t-$+D3xkXt6r+p^f=lx*#$jok_~01q1}Dls7dR0T?(Jz+WvgQ zm=VCNpQ{RrC|*ph5HOo`_#T3Usv0Xg*W*T@VhvY9u^!-7nz2Po<0)5Mk`D#bM{R2L`oQC}|lp%-2*CzlrkQn3Rs1cXlmR<4al6bnkh0w(@X6@z_g9y}Az9MVe93HW~9=~DtxmZT2 zE*CF%dy4d<#)`Xj2XfSGi>jH|OpMlryX*&5V^2LL71x2*@<&JH**com5saI$)xleR zH_UUiAB-@hWoI|FX1d0EOFKknhv*HpDiCjyGMC2Fp{{S`>E;H>tzHG>Se(18My^m> zM7nV7;VKU@UYC47V!?$wEkk{Y!@S0zNV5yoUxM9CdFJ5Oe#T|bLUhjN(`<2qiR5)P z5}3l2TUr98)zrPbdgXsI3s2UBF{Iz-;TgO6=Qfr%z^Pz9+{cZQhY);>M zzAPB)>T)x-$ZC=2?>2^u7oyy9VYuWFm2PrY`W_cWOSQ4rXS@B27E6g`bVEW-md8hx zw9*Qh$kR$D33s!JDG4 zTxP)#Hr^&uK<)fn%Z6gx@}69ut9ZmlznM65O|$*2|016&G<OpuedR~6pgNX)_tsHrNw{6(J@XQ=`MX%R>29}0^LFBZvv2MPYVnCw8aZGe(k&?2j*J4>L z{!77yc(R|oor90v{9g2`bx8^BYV6r}m95jh8`8XC6FJ}J5P3nq%K4l5jqh(Hr^6T` z(lWA<;I@;SFi_X+ZFIEKY;w}Cc&m#FvZUbpcvRd^yu}C`I1;dzCG{gL!N852*e28# zMaQP~M(}Tw%B9VQbDo#YiG62fZY8-8Wj>WoiG#9Cq#5b%im;MV>>Sn@0vUu=mclf* zdL2u8)~`BNi@$|eR+2wyP$^?^gP#}g!wV)vgO?_b9117ie2qnD{m}zdEkG!Q@!P@j_&$Ul(DY3Y_>o9v>a;YXK>-vW0o5Q;L5Y1D zuaFgCv8Lj;uezu#pG0>Y>-*CK0H`EJ?TcUAxZiNQ>iuzgTBs)p^|3c3u$U(9;?b3X z{WiHX&(g z*5WshPMBz@ZFGpj$NdOHV>a9HnyxQ1#|ee-i0J2fG(CFin$aMk22hFlA z+7yHa8{^7*bU&)725B7OLd^OYt5l6lH=K4Vr(-uxN3R*azHItZl0M@2yco8@4+tpr zsEC~;@~l1vVTJd^00g$euh_Re2?FuBjs6_*w-OLw2H=7c$NPx+H+R?nI2-3Gvbf)I1OSHqe?76QDG z0)7OZn>4U6v+3C>ldjnsXf~_m0^p<|bQ#Vp9C1O5gj<%5x+Odl8Zfmry}-fK#Uf-c zXp1@qlQk>N8f$1_n~dLQi{-qxxoKCb83i`t)aPl83LF12~7(*3pgoU;nn?} z(Gy%)3YzQ@@vB24%Sn1F%;V3J0)<-JR!pXn2-pGwNYp{xz(79PHvzRYQwU(m1+9ff zJ|fTqhDnfF%iiOoyyigA#b#2uBF-WB2PW6BzXMqfTxkLMKb}Kp6lkx!?dNTB%`Gz> zr(U$iQwY{!|5?`jMM>MWd1;In?dFheW`Y1PB<=9Wfj3?ArbPPKL{Ul6P!J+sRi^%+ z{T~*V(AQk1#KR4ytQInN#6mTp4b-BNqiBaYn-Rm(+*1>{>*;@94`RGmVN#+iW1*9} zOb-7MwW|VZ8EaGdJJuEo9vyOX)4NnRZ5$gOwM1DI)P{R!!;Q=-)>#5+_mjuvjFnGM zAxt;%m0NC0=qhvC$O)=Ps&Mk<;_ik6@nXHUO z7}u=_?GZ+0KdOmi3=Q3VR;7%~2>qaNBb-jt_3 zA{Jf%?keEG_T}~%NM>168~ID=aU#>Ql@hM3DXJTe15SBmPDKAkXDoHKl-MbbLx79a z(-sq=K_ClMQ!v2rWiK7yy8|w+ye8V3z2JYgvoR!6+1%v+7PF(dnU?H-u-3wL8ZJJ{D~Fk&Mb1jnqxUN;&!Q$}ST7rl>@8?7k(8Z| z!-`jTw#|O5;;Vc1B5-rUnx-rH&fjEoy1vgW7*qV*I;C;Qz^MlvC;6f1R12BL(6W)= zn8SM_{iTm5`f2$wr=a%)IWp0j;Vn&8$lMZ*^ z^db2P_Svs``Hly-Fa5JQNqs#5O?CJ5uRDSIVFYAaIv^abG|kEP%ABZ>4t0Z{sup8CG(K8H@E>!DuFWAnon6#$fvf$wSNF=Dy3<{?2-vzyWU zOxef`#M9ff+6`||Ia*MRpXlYJzNpgwo!Ve8bd9Ayvs`V{ZKa%#rHGdi0S%t`w3Xf= zp(iPAZg9Xmx+xgdggb|VeYD0fmagACvJ_CUYbfX1SzGmpag|wG8(=#ZBigB=jW_qR zbI8a7@8Sk#a}>kQuZ=DqtpyvL9cng8Y+6yzXj~B6`-*P1B$$Pe(-t9 zI7#j_GAY+=pc((0%Uvq3p8vS#DNJ56nZ#=#0RQdRJ(&1eZd?R^o~Hy$S^hk}w)cCb z!3>39?;>t@bbzE=o=QGCQuWo9+5y1o{zyKvl6sgLlw}L=eb75 zMh-`7{;8AVhad=8_rb&I1JL31hZ0af=P^Ww5_UZ}1PG>tJbzPeAXs6>h=;egtbaOM z(UfZ?xB(|Ca1x#WYP0MjUa7&q^SYMD4DU8Uw_9WcIKld2&yGQ-&gb^lT#N_{Abx28 z;ejl(ZGnClU?eS}WGu6Y$;c1BL`g%7id-$%Cm4@cH?&hD!NJEOXv_|nwE6N}N^i;J zpD@}jyH%dB#%U$#c&l}*uIE&#yFZtqxk0^VG&$6rK`J^URK=N6I8ix+o2jHLQ?)`v z8xl*JemU>)ElG~aX5qkT9KwVmo-NGtymmd6<}ZTE_T9=w(VWrZUHhpVitB+#*6LWo z9eq)kV`NZwX9o(#M_c1*3>53g5ajxVP;wF}U{6H$K%BxQBHxnqOURr@iSj&cd>O0IQJ*%+M61fDBflKK7XPst zEB;$ z7}5vCBtT!B9_GkAZIHP4cMbp<8&K_e{44;Ds=z$MUJ;jo2p3K{@%x&J2>$~{1RQ!1 zhSuF@e0OinT;#{AXqS=(>xvuD;Rfh)9mtI*8JC0MuTaGh6)8htz*W#=peAkpU&AU_ zRAsitj}iyQdbuur3u}2bBmUn92oQ+?ngBY8m6FZzO?}{~DZDXB%Zt8K5pj2}0e)f-qKPe|^=6$)ce6ic3_rksa-0zj`M%87;^Y?Qs`$I+k1$Cmk|mqm64jcb?VwlNzEq4Pu~oS^Wq?|Jad zF<;)1|7O}t)LD1d+G4hFd{`ZX_?lHB)g57OdYtbYw2#_?W~i44#K8(+$ta4m3|us% zaEQK>MR!c}Q#S-almht@w>^aKQ1DQ%9<|?DT)bN#20%$q`06KFa3u>7Ve94Ffv>IF z7cDi#yx=?wR3%L3`|$%eM{so}drM_B`WXYTmokjFlzC5%6rEqMUY;Zt8YVYlYiXGD zRWy|>rN~a9J|r1)HgS7%Uob3CI^cWm7YmY7qQ-T(>@wQ!_U+np$|QDO^GPrkJXT_O7~3+>)+NNwUP2_hLa9p(0K91U3(nU5)i4V#+zdv*8; zTufQbO3!I`CTe=1JF;9q_NF?K-_ykI?)=TN~{A`Y)SQl0abJ#Hdh8(2+2h z+M^^OoXip%n5s?dCwdQ%*-qx)qX5_?qBtGMKoc%C(DA|!MCWy(0OFq$6o3mCFhzSP z(U1Q}3u4EhMHG9Y zGc6>&?#t#`rRp&$o2IOW{UJb|mb~8vzKE;twgUbA~}pY zHH4&Q_!6z!9AsUX@y>289h4}~O`~Vf+MHj^g+d-?CWXb2b}LTHJ2F}i3{Pj+L}$*H z%H*zQ9ZMz6e_FOKy(v2cjt4oCH#8+PaRf`tUVFvoGTIet(FMyTMmm@9Y@<8UC~5~s ze5H`M!K8O23rem8BzQcGsL6nnD}W7O4>~Ih^dM9>lf z3}0mu99rB;Q0k=Riv3}sJAR2miQfI7g#3VuLSi^4t&{VqJRfFVfXYy8GLA|klHHEg z$L|g?DoXRTE~}Ce{N2tITOy<#VxqApc!7mA;T_b>Bc|o`Q3Jy#;nzX?AFfwI8Qq7F zq+0pkwIS!oQlDN-E*VV8R6c(q_E^YLDx|)W_F4%Q&S{qD0BXV~h&)u=D*G@t9S*%i zNo|LXOE(p33%g$_fBj`=Qzzd~PRthN1X`FzamXFUI*oka&Opx3q~Mh#mEqHjcUUoK z8I)Q1TFEvodbF&_qEgz#od05lS3lYF7xI#3#-FFt7+b9nY7|A7cw$^>0lm~u>T`66 z!0S98Q50;w?I=UcK|`UwpY?Xhh*xOt_`I{4@s_yuS;<(Yl4u5jd>>J#_3F zKenxKoBjr9Vo7$NrNt3%Bc$2jQIhQ7+ZVQKE$rrZ>zqEQy4Zl*>$m*1D1{U^9c28e zgVkJc|K#X+tN?&d)&Wh<`evnU=XR1cwm0OcZh=RqzoE&s#LFNf%}gO!gH=sbi?EsK z_{+;bCYG=0T*KqvQwmK)9c9%V<(x+J2(Is(dG=!)-2`m+3If5_!-TCY+kfuD7W9%jZ+gu%XxK zC4G!p7TZC}ju0T(NgmDI=Zat1hHB{telVGSy*FTpp^2H#F4x0Z!2g5vy8ct=^7*4b z&*PA|=&@>=b*ELORzhma>7$mOF8*BfIJ|93mL^;p*Gju`_7EC5^3mV#EqQYDX(y*73A>b5@#!MW zHfuC^gmFo%OV#CFyk%t=0CU^_f)Fr7RPdtvU*jDC@aN)T5E_BazcP@skp^NBX&@4j z4Spv4i!IiXzsWYeu@qz<)UIp_NKN-Omx%rcOcG?ct3l^AeuR?a7Fzu1dN@1sSfF?; zIG1dR^>PS#*>m;u|#Iby@Uz=||RgRA5=Gd>;GU{z7rev?TTGJBNN;#4EaNTes3|VKVaPn1+Qzh8nWGJ2GBg}sIs^E8v z$dpHX@@d?_DE@p%3~kKQiyHrx>e@nl*^fe|s0-`JQPH>JzshX}C=;g09Y*{OUdwAh)GBz-suwy&^TV8nfT7l0j)x*En4BJ~Y_Q;~I>!X#o9|TB za<=~}fWh~{WREqjf*5QBKP`0=p4)$j_XK>2C*(_6?B1wWTrgNm0Yb>3vlP z$Hw7>zy;x4?9K?!kueSUbk?LmCqJ151ziL(7Z@aZM$cX-FopH~fh6YmhK0Y#QUMBJ zOM^VoM5lx25d)HM+6Djq$)LilZ*AkEe)F>b0wmlbzbzLc+E_!9SSq~nO~cz8nSQx0 znl|5ZFa#!;LUd!2hkJLo!X`(Netj~Ozp6izUlgv$#$CxggtD~Rbk2@v(yqVh%rxuAgX+g#^hymQH0w_FYo!Kg){FgjN7{W%j zOz(>ziSU3@(e7o5M4|7_fYMUL)eJe8d_*oTS1hewJ=CcHbtZNkNQBc{J-B1wX;v%K z#NE27-ey`Dc5W+2;uC#)a&@H)O(WhiR$R02mxVG_QKAmOgZHBXHn)eNlB_qux^`<& zbV(f4TO+-{hN)Hv@IWf;Z-67Mn*sPkUA#l)%tSlR|V1#n27fRU%WXJM($>(Js9$pyerq2MGcD!8=P>09Yq+7-^w z)p$2f)2EK0o&^d)ZeKi;i9X+%eQmlEjC286vOA!9qF5$v9Sb*VgPa%Si~7o#PFOX@ zUPO^+s<@60ecGsswIXQyXwiWzqnFE4%8|x{Ep3IBW}!qjl*8}% z*{(<@mTcU4_d!5A0h#)>=`1h0b7)REqc1X#TjFg;z=GzVpB)=6JR7c{0*4Z7g1SJr z@#cJ8_$izDWa}pv>@E1>RImMDng7^ccx~?x)?4+bMJ~gZ zKl0JldBhdjdfpHR1x5@^I(5xP(W^}vD?1tnT_VT*zUg`5wj}NqKG-EJcf99_dC!W3OAOL@ z=g%Fk$pC8Lw#dhuiqN|7VP0k~_6z`|tr6ihP3;CPGox3h?g@PDh=BB6AH&M2R-}BY zMwPW^DgP6J!QM{tJY9TwGW6#)shUNosCZ=Phi~(P zQB*^iTgM_52hI=r95~JtT{_2XCz3d(kFH+3=LS-C((QlSjhw}u)OQi54?H65+l174 zxqIMrt8g2iM4Az6>QVhxPZLxcmX&;!<#cDs{m%}ori5TcZ6TnVNYHcLuY!mLQ(D#oom%yxT(fs-oR$GyRpS^W zyvIL2gi?uw-fw-e)+oik1^aM6Z)@^qyT2W&;h!&BVs5X)@XCsetV~LP{Nf`ULa!`l zC~&EsUG%pA17L+;xeHby%vI`4ev9oOL0+s@xXU4D$=2mE$M*61*uZm}l~3 ztgI^Wxe)N28lDar4*HIF2uvqkV>J1d9R19w7WDE;)NB2cwR^~@Cv3RT!N0`Sl4GKz zM}-xdrY99M3c!#@2UiuC#hB7P!|111T-&TPT73fec!98^M&=HM*Ua*W9`o)cEDSIP zz8lhDcQ)r3i=UMH9{}XaAH*UI7x3t5d?mJORM)a4ThZU-fmf1M_e$?lJzj#?ZE2meAMP2~99Nya z87e9;jp(s)S92F!v3kcne)!nEczh1P6G>k7OS<4@1{9K8UjbIJxY#Fdg%Ek9+QB7K zECFG+&ze7K)+P8-+Dk`7S1z5oc+a;4{VK#-Sqcc~?^Ad;qdt<=NydaM)sj1&Bc@YE zX>JVI)+wrC6P%yZ#~&RHSTMe-RVqJHHs&^8IL0rc^{JpdJZccF(1ij)pNwA(m>0?D5NjRL5(3=GS_hTZBX1NPKJj}MdaTff6-zY;qo0aBseoDagXr0?-F@a-yN&U_1O82Gbz2#0v zuda={>SXtfr5fs~3{i}iY6iJ4K~0srUe1c9 zn6CASkezv}%>e%qVU%ZRfj()VSk3FxXNpl|-Bptocdzue3<9lH^A5;M=V^EI!v%?) zrQH@JRzB**Bn?AL+RwPy^uLe&H=sC>i-8&%Poe}8<+Waop z2dakQeJ_!T894RK^rl_0TyCaWDH9wqP-xFyJV{px!f#Mt4>LFIs}HUX(b3iU`-g3T z#r31h_F$)sqNir@o{0BYW8JGlsQVQ1mM}*?G4~RQvvp3%r$hH1q;GMIteLH2Tn1g$ zn&Kh&K7IU^;~WV5q@(3kG$vn##LV-(run-zU#ES$7*DC-o37UWL!UG)Eu+2)cQwrZ zMG=w%brNvkeGTc_e7ngf$zc8=3$k58k*3J8)y2l@s) z%z$Eij9Rdbk^_-gln0*_aBIXf2oCN00Bl9xmRfT;-b>0g&@OKbTUS+BBpIHRD)Ddr z=ZGzHYG^mRz7yswT4ZKD7iwQjj{!6)K=MsWZL%YtX6Ss5xor$nM)=!OJH`+PetVx} z+mdrgRW6;3lfJZ_3lA)8;5RGSeIt=9C$|=i`wcgu{MwcG9iBcHTD)4XImb;T-7Y@=(lhqZPMAMh%qAtsZPJH3 zB?Ea(LaKL}H=|!`CH-7rT#3WFS%%*wRnGo+@%-!K-Q3O-RovjanHmM{Qrt`$tcce{ zmvUo2-mq9pid~-1s4xiIzo`QBvfUXvy2E5NQ^rZ4<6iLM3|1}{M3}@DF+IVrz->lk zd7gqLb_BWKcW8m{&KBF6P4?XW=&?{(6-w&OHlq*&as^q?#9&lfxG*?SDhFw}KvZ+q zJ|}^#H~ZDdzM65uL5Zz-(Uk#xCfa5Q<`?p`XP$}|b8(KT(Ya?K5IgASVlx9%^h z#K&j;!tSvVX#AoU8to%IXW6hObjh~PGqsTlvnmM8tQkq7urtjTL!F2wck**7Yj=+d znTWBjGjPz3JASjlyaCNS+cim6g3M6In zMwQ^GT_;pIrC-+vAb0RqXtvM9vo0_ieE7!~5|9y=UFm3Bxow{91@T}?5*shp*7jia zjxsO7uwt!x@KjFZ@A_rw)G3p3zY!Wpl3y-@xG0F*zACfa0T1Oc&z1e`w*F7fch`IPM#j||Yietg0F|4|37|3e)>XcqWk zcw$2MpSkb9LJ(|71AS!vbCF2}pTuuf#xyRoJ9QKgI#dcYYH%vag~onMTD}AG&$unE zM54>FzqG#07`$A^zN@azr!Ho>gD*iogZAbhG#<#O#e=8wd@m!gmggM3Uk+3*%tTr; zc{%!;zmRK!8twXRvi>fq6=mP8Z}_ba*N}wT2zm14Hm&tKx&!DZ+qKxJ?$9uiZxoIw0wG>`yQO{n{y(OtRX?FEH!UHi^>;)||@Njj;10g<5W6E&ba3P7eI1 zuYHfojkh9L>L@YZB5cL%6p!YFr`8hm?>5yi<)n2+jf5lsQvbvZzOpun^Q&ieBSAC!?sqBg^5ABPyQ?oc=*rdv`t5E)YEO**2>xPa(tq_`aV1sV! z4IRKOWwWp{P)`|prY4p4zN6MjDC~fG9TNQtrPofdOfy_&t)mTd;Vt{>lRC!EvFEC| znP6o_T49yi@sypQfco82Jego0gM#h;Yf2pIF4Guqu#ZXFp{NN@dH#eK=TC1#_xF>% zY`KN`bq`+=Y(HeBTumD7%uE;G8!r-yi2f>Hzfh+##B@OBL{TFAlom{5cD6J|9ldLv zUZ|of=qx)eak@+<=y9;M=br1dVfg9E&xfl|v`;OZ)OxGb%cg(mX@BKxu}mf zWd^HcieFcjL7I>U)!sP{B)5QQOJ>W2ckdhhAC#&ua5QvG6;&}%!0|1qbmCdsbKHOq zGvehdG>`#Ndy8q6u9g!noSLO@k(R6>DA)J*b!kpyxgEPL02*umx3d^VB<-+ltIcl+ zE~xf(=f+i5X}(_I0m7j`vRuK4B5h-x3Rltnk!93#+xxm-(JVTBUzcq8-ptcAvK9f2 z4rM`H?Ep^X8{g0kQ5lh!OU#Jj`XXUv=4W#N@`Yb}iMw>>=}~Pio)u);bvniob*}fY zIybjM(J~niQSjHiI%k8(jT)COHJXw-ypHtrx5{tp!}x|+Y~uQB9qT3Ud|}WKeRaWj z{ek7j)1?7xK z{@1)g%{JvlRH5aaW2BJ+=Lh<2b1N9?nmNfK`U#Gja>RcXJjac1M&8C56V@;SQLL{z zYLQ-$4kF9R$Z+BOEjUr^M}w`}^EE>>HYAAS-4Lpf>OV;!1Zw$Rg)}Gn+>Q2b^38&R z&wAiddhUoRT#6Pr4n{jzu1Tvo3@(M&c>nt^Wr3+niR$cGL4U(BrX_my@vpaav?g%+gR zTsq9fnT?nV`WoYUcYoS0zZ?Ec*>sO9Jk{)slcB-=GNWM%&aZopXm9m z!u4vfwoPtK3-4$^{yJ9rMMMCBASMrYCFZZLpsFAo1)3R5*o5uaH2ss#isigJ;~MHO zVPk25NxqFZjK7#!OMdknfqPhbbg`%#jRo&uEJ1-geb|KW(M8iP9X@F8Lu`0@e6qNy z9(endcv?uUA9yonC2A`?RE31q_Q378DK!h^<*KJ&+M*`6ydec7fzht;HhFr5~0aVK;a+2Va+LOuO7=y$A z8sg;8dbIeZoivnk@BY70;%{U?4)@au+18hY@Nc%vXB~E&FeoUg4+cyhEDTtgq66*S9~9FKyrTNRc9uz(Ve}1=@#*Vl>JrAAGbLXv8jh<+ay6Zv$c;Ae=xT9y>Cou z>|1+(j_gW@7(Y6f7bJX#agrG)9iKj+2`6Ks1Wh%D&~4a4mYzC}u& zwW5OzWXU?`$7XNeP83~6xrEOyoN6RneKoB-Ez}4;I&vHh%*%sY4&u+E` ze9}JgeEn)xS+ko)?*|BgxC{Ttvk693Yu-$sIkFLfiye-27RZi%faCyN3<>bzy_Q3` z&vb9Dh+7VS+Xwz0`MijUs+5fPryFn|T0P$DwPVbNYZJEGWaK+?(yvUl!h8Lh2 z>VBbAp0k@TagQyqd`F=4$tK#=9OBT@^T%e8$yc!Q=NZZ~WzA$sHDj*OCnsC$VG3-b zeOS>^fJhmsm%WXcyv~)!9y_eKy=uAuDY9`C+}>FM4mzCunuG3A*|T8|O_@bs*^qu^Ob)sFM7T(#7g zk{=0v)cXfNFu;3w8*|?LcEq1|Os->LPe%uYNx(lgA^?7Ywb|4}pxg zt!)bi1bDdF-8?wzY?&=(;azL3vK?Nf7RW$P;!x%+;)>7G!I9bmYzF`vzo#a_TF>r{?GmK~mPaZ#?u|^QjqT~Z8k&&L#fH2uj$I$EFzt!Z z7COL~dT-L3L+aHozI{cMLnjM6#I^n$9Y*+h8_LtgXbe1?83lNf>LxZ`B{m%9RxgXYFsbKW@MYHICA7EMKUh&_aI3Qw9|Qwio;(tx zfK?&MXOF0({MI#d~n>IDG`WPhSFt zn4|iue2h?Nt@VFF%*_ps0_)V zl0*fMv3zFIT%0;$LJGK>1F;qMSS{$Uzn>ztIO5z-7NDpx-^4-@CGa9Zxpv$?;+ssr zkPB^~ejKVh<|Y|}sg*DkKySoRG2Mf@fj2NDQzpp3Ju$o_dhinIVQ!{J^V|k!FqrdS zt*1xV-o#0O{!5eHlWDkx9DI2^_p}{DMT@g|RJrg!2`#binr$ZJ4?_f)cnDyEIZiI) zx8M7FYDq3st8t|(ACtih2Obg|Q<%CgmvMpHi-MI_;MO8!_$ZYklcm2y*Y`TZ}$^is_=k$L3rDEIE2A(J$q zz$`B98Wbh=Rm(s+llI*vCHw+hng~2Vw2Yg{rl?0JEq0qsvxbKBAv5QQd8?3=gyi^p z50`~Q5uTpw(Zp5v*_Cs7Q7Z!hlMIrOzJ5|a5y7cX>AN!O*VNK{mc_#oNR~WVzQa-Y zvx^xQF{Rr!#0ZJfvOL3U)r91T9W#M2XRwY!4$4{=Xe_SB3U0EsJ4T63hY1ai-+`*z z7W7sP4vVXJ55O6x=fq#d(HM*~zFfAB=dt|92U1>GV2{SC8MJrs@U*1IQsmcoX#K8H zIXHq30Rbk;!$}~wx^up{rDmP8-}cdyJW2F)zgufZBn{w zAehb$;5TLLnK-aKdBk4LtwjCM`jherhL1HweQh*SP-!u?A=ywdT54Rr%;+b-hR4k9;bQJo)ou}8I#YVwGqrc0*#+Z z%`G#uenY3Lvj_F#2~db2-TYd_{CgiItF`ZG1eL73z z{b_OQ8k2XCt~@4vG`%-(-uddoZS6HY6p|axo^f-Y^y!aH`|VzqWEm%vvEFLq7J5{L z?YuG-q(@@Nket=mfM5c;(bv*KX+a6l<>%s^elF!O3ptq*!`NpBA!kB%e7FYQ|Jld+ z@m;>a(*KKbnUC17i{0m~u;;CVJ=~O(cWJxi0f{7!a2YQkckyi;Ky^uF2EzH&%7Wz( zkB3%Z5WNzZ8VSHJ6HP)t9V+$vu!W>)b zeQfAxEI_c{4`06)tCJbvsX%DGGPV}!$w!p*%$EzT8zV+y;!ABP-CSD?boyM@c?7F( zCPmN`6Sw$EGYMbCLCF~XckJa^5>axB0*rQJ%3)C@t?f_gQDr=7O}l2wTG>oxv2+Zr zk>xER(Q3Koe*FDh>waS)`Z;8B#d>Kooo%LXMJ`*$Ql;oiTgrK{+*YK>H5vYL z6b89G(l1t%TzsS+!O!{F@&RRzaE_?5@zblP2aCPlCU4I&SsumG@Ob0%?IYBW<{ zji@GvsyQghKQaHkw4qpf(cjJ2gYx9a%SqwOgmxqJn8M@Z7-#lAg)Cs;YM6thM__O{ zU2NEQw*LWWy7m4Kpm_tYCI_P?6FJ<=BOA^JNmo`@*H%?kGJ6k?q{;c01P`T&&rbIg z#%3aidGZ@tosJZNwQBwX01pbS;=cYH?#<%;rU|Ry@x=r(F26;U3#WN4LNo0mo&!O9 zC>Um|0hIjo{N`kF`h4crg8T#ilF7dCeqQ)IT9QK6#lyuAPo4gy?MY1dkPh<%+6edW1By2MTxlX3j<9p8-K1@EmX^qYaHRYsr zHBL@$^R5g}sw~nNu2{)_LU&j)m6Ps4RAbZ;>1D70K@sp=@f)``rM{5SU^DQ#ex*IN zs{1)V%{#KjGONk{Vfm;CV{buT5PIHH9hU38ULV|1MG?1rX}?bq>5FPN9sAV<>u{Kl zo8;}NEkIq>!V_Z9mE~O3I3+#G--?k+@in6^NFR`QR*<8{zJBX}{`DX6`|I7GAETnr zxf6VNLeY9JQ$ancy-pt{ZaE8YKGHbY>Ek776PUROBW;hzc4$RdCK9(;~0Fz$~`_OJmrvr*Hb8w4&$_viP>Kv%k_*d04{ni@ae ziG9-_z9wchD0tBsfHm*6{0)L{Zrt8qh}eYX?b}G_@pO9Jy#|1sa3J>2-4{C}x_{X3 z8yhYJbkTtMp_}8bO)dSz^D}Gx=QLIQA|-<4Rz&mi?NnujzC-b| zQL)xJ)d{KcdWCg z6@yDHS6ZW24?=_9T3JCUwYs(}##z$UGzR7diSof~t37UB<#|PH*gks)sx^m_v9b1`_bV0OlsBi?A$Xz*tb}bRty$V5 zR>K8IBjYQQlL<*HNu+&;(`t#D)u?2*o!8ceMSpl6BqfDLg`^xgv;El=9}EVm>En;7 zqswXPlrKs(9M$N52l?8J_E8=7(2yGy1Q4N_ev*X3%eG#FP1)0S*v zA(s}QR>%zlaB)FuR|>Tb(f~YTC&W%^j=ByJ@QPSi-Aiw(7VP$oxSf5qq|qkosdcyr zj}u_3&TbsbrcQpN-iq&tsoweR@sW#PTS0Ng0Sv_QTQXQ$cQGu9mK$7ceoP2qZc19z zCe~D*%P0^D$54L5W6NokGQi2+`gi|ev$@hdjARiLf!)sruMcxbQ|iTgXBUGdT}OuZ z#9w#n(RG83;EUiwO}{{SGaV?&*SaZOxQsw*uSKP2GQhYJhelyk``Wq&$C-A<#GZ+) zw4DGXP~RX29u;LkRP@rQeD>MP#-5k8KW< z5I)J=_NU82%Msl~>J^Si^-I!tKYC15TcEH2D;3o{NF0if0D=pFI5@OY!iTGMh83lP z134G;kh>=!0k{S?alC(jN*_s}<92w3^P6@F>|(xe9$c}I5}B{3grN`A;Ff^GaIQmW zwk08~YpqP2KWwR*k8O6CX!KARJW^7;Gsb=0c-t)Aar~MijynE%U)S9~g##ptsh^DS zI%k=x4-G@!*l-IJm7UkCliveetqu&VZS*!dzAD9@9Kkwp}`K`r<5tJ)}w4C_IerbhMLBA3afxj#Ol$(+H!e_m7t{k7J%Ij-?3Vo@oQ1&xC zd*k-w#7>xImqDw~5(z;P(VaG*)W$2ID8XG63=|mDs>4>LNkhy@@7c&hx=0Ujp!!E@ zSX;Gp1wr5|r^A^V)Iam1cjU*}WoodK%;AGTA*JW0ejQiFzU7_I=^|Y+I1yi5_x@ ztcU{y+gD;m4NeL->)X_$8v%~xn#aMM&~joU1lzAUYz`W!f+V?)(YhJkf6J5U*6`w{ zUukB3^62FCZar1NmA`a-)5&8VxxsKB$=LNS|J3o}8%5Q?NwNQ$)E{pJjSVpeAkm=q z3V@hCW`g%fIKoP-lHH7xoUT^3 zezov(T(5oz`s(90oKbta?p2=7QVYnb7-*% zDma`Ok>{z%b{W6FD2~iH@lLVZ(=RaY?et(F}=YbI|6T}dvZsM zYu4umcBV&HdDQW#iD&!|5(WZ7s!ML=W%Uf5f@jI&=zwWlxY{@82Q{eZuWx+N#}FqE zgSW>Wmqx}~S{Tjbq>R10bPeen4#$};|A6=OujfTDDwP}P9;`MavWks`4vv$Q4!3Q2 zFJLtG6Z0QtuU-AH14w88Sgw!mB4Jo5ug`^_=zUUYlwwn+P1v0=yg-yk6j}68L_&Iy z-qs$!u|uG#$ZIHXF^b|+i;<>ELKqflJHpk-aWj;F2dSeEO3nb56Noa)n z!6;-SFca&&=O_d2Jww-odDWXi0zTR&GLuCB{!~;+2HlY5UAHuY@-A5Twkq_fGb0$o zBT~a2(ZfCKBZT=kWs?9>DXq3PA}%%DXv;(n7e1nzA6Q`{mxP9`KcfN_I24FUqjOwX zIk4KmD4?u%wXrTh{ zPq|Weo#qZ->?MVJlwG3?gr6e6E!p9{4FuQtChO{{&Wv7Z3#DJ*Nz~pN)6*Q~mCauH zVeL^Kkqj;hor0vW{o!5{0L)-PC(@Uh$3_)>GM2YfF;Xws248z1GjABthcBqeYWa zIzl+Raf{iPm6oM=kMpl6#*_)+y(kH6$*3MPO=wP9_bJpl4zu zCQ;3gr3Xbp!XEUB*I*+}+waYS!ax8Cr7j_m9l_s5n1intxshJUpsgWy2yOe{6H^3t zSW9yXHegRp)}jLdbvV5S5QPBR-%lr8F<9ys1y~i#k?9(WKCb;znbsNZhWzAZmfm?} z56<_zWl^eWBP<3R%vuK(%X5Uqa8`}t+!io{4Lf(L`2<2 zt-haVR23EmCZ6^yAzrKzrtK~wkY@Ud&2Ep#TM0)z3)>+A-hMVmVkDllC?b0GJ!@n7 zQ^gi*``5bBEdB`ZG|@s0J}y3uWJ1b%?B~tHdOnq}DJeppXz&ic*}8HYesJ`f5hhj- zrNN?2V8XP${KmIC$krC zSerkJxqO~qCv$Ly&uJD|X~v=iL`Z9Ck^;(o1`Vl_U)=Fm={8pbo8`DjQXgnq5IbH~ zGzHvHgWuZ{40N309b0UJferu{N+=GoTP1VUp$3R5g*ba$FaX-4#;31)dvC$$EO6*0 zx@+sVqN$d&)1Y~IDG>p>TJ)`uicn#c&41Qw@Uz!M=ht_URas)qPrx@64F52;AR`^zOgw^Wf}riA?jZot=qNB3X{n&`$amf^^0>?Y{z)$G0iB4{q~=?4QnN zt4p&g zx1zEP+4yoV;yWY+!UB_{)KnEYLP0{(I69vVSG#&kAuNAg{ze5G8+dBvp~-Hs5Ak9Z z{fX}z{J#Ez>XXC-04v+nkCT1WA;u?XeX(Z%VMqDyUI9P#gPdG?5zQ|J=~@CQ+(#Ed zjD#IjKl+K1^!oj7f%p)bpQrY`5E5Rl--M!)^H|a|*$Wp_6_Xtj?YW0^=^y2m2z9IY zu#nsme@gako2RaGaGo#lrXuuVv_21}*U1NR?Q84|g4^kSG}VwOdSg)UItG%51zZGj zL2Bx?K|=tt`r%g=MF0ba1VcpV9*};BaW)aa8AukK z8I$(!D_oWn2mecgOLW5EmrvFF+wn?qq-vry59T^*3i+aVsL6L(QT0hfdg?k90LBRd zti?J?)=n{b-{%`?+oNW|S!*P&8$^Y6Q+Dn7a3ggvj7(y~Ocln>1dVX{Y{@q>pSgH6 z#-*bn{57ygMLJo|7&FEV!8#h-fH^8$y8qb8tS0OOk?Pf~zF=RM1BsHCDsj6d$LpKT z$6jSIeiW)5w%+v?1lw<+ib^X9oT5mY?w%qe>nAMVClx|;88HvcXyZ#IZb#}?x(;l) zc*2joPQoF{MVj($)CA(&GNFHRV`|IWByrk1GwS0w8+7l+GqsX^eBWvb2xe`Jeg1jj z^*78(*st3mBD#;b24!jjkk1Pkkc7uaR$rteNe1GX(uAU#`bT;tjR+GV35lkp_>Fgf zFjwArdFAL^KnOq>ova2KbdXu~J4*v)jRakQJZc;k`J z3YuC_!z4hrSm=N++6l?Pvv^w6*f|PaiQ7&)9Ao}$GrDxyKQh;n!tD?QZF6A zBoE&yr((h1kmbHHN^4q!<3f5n=E#mNPqCN>*b;iRNltVUi!54?Y-X;z%i&DB_e5YhN} zNVHn)y&%KAaxm)Hc0x+9Cl$=|nqX!4P-TE~V??28J*||+DaC=53KpvniMsX%`dis8 zQR&s%-%(r}gjTIPa|d}PtWJxA&9u74=IB4Ms)qhNj8|UlEaPjZmbIAYRqc1=NUZX& zEbxme^jFe9#Bmk!N#?2GMkPC>`a~WH%GVQD#Vo(Oda&7y65(C%d)djsQK`JV_+Bq| z_avnG4tz2VMa!>#gxD9ab$x|D0T|y(XO;c%90v z%kr$Sfj_f0t(A4d;Ym0GjuSNc_+@A4xKN!7-p8#w0h%#A7{P_J`_rBfdOw*gC~jjd`KJ)-#i0E zyd>yR#h}->5bgkvpww{Uckm6l2hv7b%JK02n-T69JUh5V9%Dr$b=kLI+^l??Wv}0< z7|ROg=AD(oFD<9I%U_`QvW0{t9<|yQ9|l{`gk!nWyRjtbe4P!+M^ajvY9j#I@Fh*1 zid_+>YjVv?%Xe(kH?+6dW4i3B6;BuD_P!GWgFqVd@G_r}oxPt`ysl0FMto++mw%2- z5yB5?QQZijuHoa!K}@s@rx&q33tK3{jaEtGD3)nHodP-KS0*J4rlw5dL0lpF{+Xlu z-kNF8*8tRjgzLZUB`jVS)pX>|yE;TfOL%hwNP_jb7t7xwAVT5cvkO(x>nj3kWwUk7 z@L@Wtr>L|v#}K|iYo(hx=C%}ixKspSM<*}C*OTL+`pS~{=lEyB4j|($S-@h{;!84|;>3oNwAWT|SgeYQv>(u=5 zi>iqNmfRV!+qZ8VwXvgVsR+S|8d9aNl1$4y^Y-X&;AZsilJcJStJ1=KBa9*XszHAq~xjbHnDdTr_cT==T#XZG-*}X zspN0`$xIG2@kO#kp)7#gS& zAqceCV_4UIBS@t|@-uUBS(y}UC=My&(fp{Rjj&3=tKU&$ahlAbW{ZJd(_Ep9$oCt3 zHHs7(cEye>!A#xDj!Q55@wI;tAi;<%um#mG=*HQ`t^r^e=x{?1fT>r+yNQPtzQly{ zU>O#$N^NNxC1+pCoQk5Hk^^({S)5+}`zZV#f zUoz(rLiDFfpKR)Waq6W&Yiy8vd@E~v%asb76({LN3O#->34c)|cV5AMcr%TCz|oh( z^=Wy#H9%pp)+8i34v->>V>Y|r%HdKVqd?>s4yI(8Fk>0aT3w(2)naE#3R#nje@o?M zL9SsqF;(rKlUYPyb=E34wyDCmVZ*4bC^sy0uj3uBRe!*dd>-S=!SI?^@+xg1OzBnG zpON-kuA9${V;))dkhUpgJZ6KPNk_tWMIH6 zFj4n+`PW~muMH7#abuu@rXYy^Mg0M*33JAE*yl?lbO0YNB@-jcM@0!R*byy1tBp}M zA)~o1os)IiNX@iGv_DAWkB{?w@+~7^ z*^Fx)L!SET(FvyT&t)hU?rp(%H;-?1EunkohJ%K$66{d=OD*rvN~SyVlh?WohlKK| z*HA1HSLbAK=RXEUZ#zqnlLFnJ)A{ifuv(J?`pbl<8M_u{|HnLTLN#fTz8FiuYEt2? zV%$X0@ZVS1ua}M*#pLaGc91JH2cW% zx|Vt`^V;YDY7Gtm;}JIp!H40l#W+5tujoggCy3uarfTr!_$p<+JFYA>`;ZcvF5k+!S4 zcyuyBT1HEZFSRmip>Jy!e_s?|Tpm4x;1a<{+GW|2pXJh}Z8(uR#gYZ4CUGTEEEBCFgYv4(QLNf9l&NFErZnM)Rg^f@2b9z zQ4YhLenI8mXab^f2nabc28r<0DHa$8qduF#Ev8{3yFwoxzGTq=a@0j1buqXkz{p#! z7C`oY;FzL#Ifs_cIkN?}W{EPLoJ%USd1k04F;r`vyaB5Qy#|Z+= zvD)k9a#4(c((*=*Oir7}2_rz=)kM;bjTyrH-sLPrvH38bE|0`mVH>T=Gc@k}>*DdL z$tY%{*NT*yxV+?r_n99O{kyCimI z#&J`7$W#>Meq-S6;Z(7q^-rpnr97UsR30zGW>nsg;61a{YQWXzECfs1j@40IWp>_Y8K^0tTO@9`C~t9(1o5 zxA6a5rMdtBQa2VEqM{F+;q{;O8Vr6TJEz|g{cwcuE&rz9b}i;Al?PR6r)0W6rJq&Z zI4y=)=ca#tO#PgmDx87%t74?k*-9!R^EVdI9k_iW`|+KhvUE{d;o*NTl}y$jpD5f@ zDEcDXwSCWPcB1vg8j*l9^GCiG=IpQ?bb_GY9;icMvdr{Glbkf`K?E~wEVNVHV)pNC z-(zUGOXbLQ1Mf)pO<)76Dx^B1uvgYctL6$d`$9>3xsjYTN~GyFiV=&~k(hXd&=4Q< zvO&c8QT*8MaK<_HTu1M6hI3L~k)?$e_rACnF-2C1Rre)3GoBozfls$;Tw@|tjK@I` z;P6;@LsW{cUqB0H31CsHGteQzx!cP0VC%n8bF;B9FH|>A35V^iKv(O_@mPSJd@lV- z;T`Sr4HvlC$}`j56-Se|YU^iO_t4V(O|l{1{k9#KWzRy{k1R@9edkB3Hu8^u^-dtY z(>Zunw{KZk5^JB;7YPd+ooby4gRKxa0oVW*vSQbbgZ7MFj&{`q7An+}77&jgc;Gcw z18}UVy2Fzg>#GI75(8@Rf>iQwK*%wNy(?FKJq~LwljT(X1OU4VA^7i)iyS57H#Gi& zxe%f-S|F@lLIwdriPeFUVyUMgpT5P$$KktPJh`p6E7$Ziu3k-(hCu-mJOUI7aCgKJ zyE*y$L-k<$toVF+1nX_6-0tx-WS7v;k z8Ss>$><3ayW9*n*`U~q)dqLy#-$O>$&7wLG%tG}SGX2_GA5x}%ygrT=ouXmt+UJaO zUq^}5zCm_z6)=5N#4#p=6$y9t*^sS^nk27GON(%Co)V9wks|cbGso*`K_eu^MY5`W z_7HiR%Ikta$~0IcbGB!};-TR3FH#s}4YGK#Xu$C0M>wp7>4N(I3{ilp{{vry;YVj! zCEbV=?#Y@C2VUag!lY<;s?E25d8(@Fs;Vk#a9h?Y!nC^594*>=gZhmWG0ReUUwhKb z&j4VyNk)?nS-Om_uGL6RgACr>_C-D?d(ZbO%_h2~^a8+&BoO=e>10ey*(dX^nYS~D z_GY%gc^v0sIkSaTwM9Oq&WTZ?&AS{K;vqfT@_D7+Vy3EbZzMLFf>Yw;mT?b_1t zth7$+Z;VNYTHf|uWI30{up+3s^E+Rb#dQ;S7nh6~;LiG{9_If2_8W%z+|D-_!G>_EVaU9dCc z?zHu~w+PWLNG~n5C2E5gI$8|@%68#=p)!~+ZunEzu-xJI)7ou8hey&j*=<4>{KkTf zYDpVwz2){w&{;bE6`twK7A+uaGteC3;Mk%@`BgYP$lEE0W!!W+Dcjo$=ZwVFpJI1o6ARZSbUg8PK09vq?Wa(`T%T?99kUJyAOh zeEE$}*!-LZe>l8#O|u-~t?!z5q}vh2#eiU)(lI(I{sM(KA|?97G&+ZDSfZ~B^VSo; zIl|JPv`XbD0`ZLSk(Kx}o}g&{d*2c{v64Zb|9pHdb(MbhJbhns{mE(du7*tn3X@KR zdlrIqg97mgXY&xkj?lHFH8<4(+`+|2f`mjS9Z)|QJqUom$v2^tRufO(9CvUE(`FkYzgW!A@Ag<$KK4|y~mqz>3#A&MguLqJeIq7{K zt3UyKd_XFf0p{UiHz;#kdt(m)K8ZEGiV^1qo5imYhnSlN%tCvb9?uT=L=}62&^7c|`NM%wX z<4t&S{vTx*k%F)g^RkMu;%Sz(%lV)RJV{DswbU}BykUGmQYI={PJ7zFvCh}uvgkvv zFF0hvY!_nu!zm2G81la|r3=IljaG+K@m1((@qX|C0R@`nAPdIQ#YP^1L)q>l8aqJy zcim{!YqXb1Wr+E#*eAcrqi)W z`W!T}H%L-T4WMr|^PErQ6I8Gep}cW@TB;Nt0y1;!YKpT86+*r4n0DD=p%JiU`KK9a zWtTf|RpNp?ZA{jAH<76*W!YT?1}q68Zl%3Kik;eYUSu-6a#nqQE@aJOdj%^mCX4C| zRU$dgpui4hN?+8aOW|og%*z(6h^I*PYQ@EGcG^>#4q_YI6B|}2qL7NV=W1j8wL^(VN*5#*H?oM6F~IDZwCMQd{NmRZ){Usp$$B#r4>dzDW$>2~d?VVtjl1jVYd2GD}8%Q~1*Kr#k;t$C3axM{yn zHWzsTOb#$2P^(~HIGfc=QF!`y*$Whui(}wEfP|Jb#-BAX)Yd`TuQLOsM_3A6YwyKs zuP**%poY11--P_`sNCMxB&STlgZDwP3j`(Su=#;pWp9tr%s()FvHNvVGnB~`1pU(( z+zsR$UO`CPuDaz(UW1{?)7FjtvD1VA(;b{?*Ajpf^Lw$y3F=}B;l71lAff*)W2av@ z=?NhxsH^5*vv&uI`jJ!Nq*ef^jy0B%SS)Qeut|*HPB=%=i|Vkqt}6>>Duy>cHA@-z zSM2}T{_WjC;$LBY`{w0#?!&q-Kf|xrq!Bm^dG8PL>Kro8>zAI+hj_3d$;iD3;)1DF zA71ib?S}1zRycHrV|nd%`n&&bfc+|j-q7OH!Q#1cn8FV8#$?gxKP=l+ z%Lu#J9y`*R@k@94ERt}*1l+R`>yC*whLg#EP29mFB(cuV#N5%GaJ+BUCp8B!VlvDp7%ep%mx_KK^`cT3!U}2qyIa zuYyqtLJk3{&{=ga{LWuV7`VPi`ftDZH{whz27@%BR6{Wfex(QH*jOmdiP}|;W8GDqgfVy0(28OK#k`XG~7vM|I_L7=q45bjn4mo9NWSA)8Eqe z`H+a!>z^fg3iIXYLPSO*CK0Y_dQI@c_G(gLQ+8_n2(o0G{FzaR0IrhWNVY*(>Ro&# zrTx%Kf;u&)PO=_J`tPFFT1xqTsr7P}DZc5wY<2GWZN*2Hul2iD`JCVMEN;fbgX<5`iz~*oJz7+BMm^ zeOtg@Ymobg-PEx!vM=KcqN+nT6FrsnCeG(n7br7)UDf2MbNYw_aTUfc@-IJAWEj=s;xV0GLO|!Kk3h z&B3WGn*{Oqa(Ah#LSzG-cVUPvIHJH>WHih3? zl|vw{Q{`;XRl={HOI0n-qSd613<*b>r?OFXP8t{@d6@eM7~sNNIic-h`6Gy1 zu6W(dtSFb-fOP}YAb<3`94(p}ZJ1q7j%%$^?$HU)I2W}n|Iz0R8MtCLw>+}v?up2H z8S0yj#g(A=gM$zlo=>4cB0V!@lg1JQxcb3>lZ>5bt`jB;E_DD%E)X3d=WiIMncNQ~ zE&ZOF+SdjWv?GG5D7iISL0w^pH6(zdf070u5Rp{-tF6chhTcwSXmq5TpB9gO^8~-h zts1O_KO+IQo0cB;7HbA^=x%E9li2@2Fhp3`VwefIhRRuM_TBW)mZ3r8(*$22$7X*e z;CqlOX?_m+tLO^B&!iTrIOA-7%kf#6nli2`5#p1vSHN-c{J+rf+vO%+e8my0THGEk z8l)NFw1+k`-}g^eb~s3DTR~Pqs51oIe3eP<{zV>zc?us0DO`g1Tjy(Erd_Rj%?=hs*gSsb6TH}9l$hfs0NKb)gFclqD=@(=Oe=A5b{VT%M>I7 zbdx1Aur~hUYgp2~ShQhd-rw@7?0?YYw;r=hm`bMtwuoU|v4A3(3-nJH4HT+}`TKRJ z116wHH!L38`Z=kHyK^-z5C)-#kdHLK_iaQ>v=?s@)U;cAI8f^BJq>_N5M|1=-h*4l za|(j?f~Joky-MmHVRU$_t?c4OyB573-eQ{Qoxj?^zWR)uy}xod{OKLNT@@Q!x|LyH z;CGaL>ApSz(|5ky<&C3cx~bLfiFX?7C{VaVGi(ps8?-3rsx|+XXwg8))c3>Uvb@mC z=4c#yqM8Fcky2&vxX1U9@zxm($T+?*$Gs#x?ZrSk0kYM{s!a2w@5z?CEPqs>iH~@T z&@#S721TRe{9u{1RG*k=g!wWn_EbrOsS~BMH~u;Lh-Oh@y8L2zqtOe;~jiF^i(Z3uM`Yz66@DXC)9<*CBl65dQdRu04s z%$@%JK55WzYaN&RjY@O-^FQgI?+ND8#(1E=EKUC+0G8J3NyA*Tkv}Utz{!!xeE(|p zHVI&?VZCJC_z+DsL8`GhmJHvpBE~zrZMd869%HET*+_9>2R2)p5O0{2wO^kKwvOHw zAcc&D)kOwm+8=F=JU1bvybmhW&kHQn$MD{K!0C?2KnswOxVj3X=vI|B?{=``Jj&G7 zU|$sBlN_(LhcK0c`jMnU@rt0eC2E5K4mJ&j4*?N7J0j$Otynf#B$ z6n=$DxG!xMH}&s7!F-cB!a9(|VE#sx^Vs!9tM9blT7O85%Nf#l*tJj0%;`SV9a6o! zPjWN7BCaFM{$J>!d*=V32NC!bVJ^7OOm6btOi^7!Q^oB4dpP|g9j?Dg_*eO_;J^PK zCantN3S!x)*BTW{Xi=793XGFi2n|H81wrUNEkQ+$bdDd}loo%Kc~Wj3SzcIUZTA@{ za(m|cV5`5gZ9MLjgoDZ9k17#QHZRXQ3Jql*eb!qW__puGkBRDtfM6BUOQ~IfU)9a> z1Iz9LF&5YFx^>J^0~qN7dz7yq8@9XM8`{eA95(2w)N|~m9-g^gS+#ysbUpS?j+p;b zNA=zRYtW}IQO%%~NP}pzF9Iylea?wS&i)@OIKT#2aH?<6ZAFx=bK5_Al2v|Y+vT_; zlh(>pDpPH%*&asZz{@nRoFiIXJcn<`olO-{bvb!`T3Js=Ci9{!o_qcjs5J_wzYZ;KW~y$0dOC|Cbw9G%{#KYMx0QaO9!f8O+AAL`9#?V zTx0f};gHe_rhlCvuun+gyQGAX>BcSs1`4Pa%?HdneEi^HTePL_F?v`Cwc1vmH29PrnTru9f9Nj>1Dbu}5y`^UAV z>UXyVW^=dm#g-t^!k?s&4eqhshnSHgYbT6lrd$i?@jn2_lt{Z_BfQFjVy(|I)MqD@ zRJt(_iU9%#F0xA{MzHnBi+q07neP9q<7~5-^v87m5UW}NZvfk@1 z=YkT$Fvb+~fXokB4RMo&Ac`LzSQ2KW19YmLN=j^CtV;OpZK#9DpsU%n|NG* zpj69v_lRO(2aBo4BbdeN_R*%I&^oJ(%s$C4blyw zAR%D_3ZnnHpZ9s!^JT6Nv(|jr*V?nseV)hhJO1d$l)gIo%0RJ$I}*1$g8it^D64pi z0C5*5%(@Lq+;W%dXqSxFly=*It!Pkmz^~Aj6KRR$>B^2EimliAS8~f&1drN`2j5XK z3gYIJvP(o&|3({wdR>WGeO)QGiio5M@tF8KjI~}VD@usKH>o~+a zi*sEWKM{?ZpXQHnHG}ReMS1u9LK~x1L=s#qclI^mLyN7|ax9O@&r+kU^w~|k4JBH| zpnDu+Fg~9-ksWCnB2&+{?u#?4OW(PajMpa7gqMQ&Vy^;l6o*4^Jzv^Zar9FTHMd_m zL3`ZZsSe=h!K{&n@KokI$LkWfU2BhPkb5*b#WJYtbMj&;_Znn;uumX6Qn<~1GqWZT z30@fxWV*=B?0oT5i*wo($_9_!3KtMDVe5pnlONJ`qBCPAhfodF6k=I(?;Zx z<<~}gwl6`_@f^P}q6g474`Aqg3B_!?-gK)LdP4hqf1R^6o5Qz^7%(bEe<_#rPRV@m zx0dlruk4vjjF9(f<=8N4leC=t#yRxn6r8fT8lJx0`rV;2FuCH|AxX*DHIbQ}D*JQt z(pNo9qM#)l{cnP4;o+HS#Ra{lkE(;hu=}}7vPqr;H8b31`Z93Y$Nr|LU-V&;T>VU- zSVXn4PQLpv(C+9tab(yq+(*G~eL;`%kEBK*B_e=X9@6cb zx9Y>K=4Ev<7XNYZ6pDl6luiLlnE^8}7+Zt3HtXAoz^cBBnJfCJBck?}`C?~l4a?PT zbafJbp40}4UBJPE1bj94Z(P{FDr$L$0T3QFq$9vD^RM@t8azi=b^RiXoY)H z*E=(oS(H4prKFC6%Mzw)$WtL<2_9I!?i-MF@Q7oGsjYn;zTmMlZ1#mCJK>^E22+BD zIJ5`flpn%>&{`Zet(%6Exfk{>FxmSNN*0kJN(?0~{WP)riA>AYu3%qmo2dgYL3l-u zPk10D#lSd6m0HYAU+J8czL>=6OW&%hj`WPBFyAIeS)B`@5ZQCY3!GlDeXpiPcy~QD z)w&tqI8h3l=!+rgvaWpJcSLJ5vwiP)e&q)4D|qYn!>$SwRTc2l+7Wc<&hXA=dfx=fG$Bu=4xEBO>A#yOR3*v~m$WF&RC>@>n(M z99N2iTV027U;r@+jb(lNLRco)3W9@%OAp33jNfvdMVCO_+~#==QqE~Qgryw6pf4uo z#}$#^$#!}&DI@Z<k?(r*02bN7d z9~%P-YmF`${hi#gYm!I`Zg28TSCJBmPkW8^vo?9$l~19!)8t2Rf;EoY?JRj!i*h@S z+aY#N((DoAZTVC3J_cp;2%_}PxL7X=6n{n3)2@=i)n8v-l?(eVdi5lp{JIiWAAIXI zZ%h31M7=tS-VIxkF@ZOKgrTO#waO=dI3!VP%bh7b%;I4F*d~u8e!W$3E?GvZJ-G zd9qq&t;<8{`F8aY)QXD+3_-3sp{_3$9>5>q47Rnwe{;mx>sD5nTK3CiIR-_LDkhf) z>(^-mG>lHfADuJXH;gUMP8)GFJh|b?7`^PJYGoSXNh6TWFM}kVxD8T6PGHZ?7G(HofwF-$IuwtiBE@0JI?h5LyE1w(nccWmH|+SGTp)mw#gIOkQ7&-aRNXpFc35n854p z@#u>{hur)M>Q-lC69^U<#YhIQP98d1|FYlxsT8^|93n!&JS1G^KJxUbTZR1iE#FAV z3oYAX_TsO02&czBKXIgO*{%`W()7&MyXMhp;Lks_TaR}s;NOeK+{INon@Du?bJ#0l z-%iLYiqGYlO|*&nHoknM?hlshwQh27pTMO)Ey*>q6l{IOV=7R3%orLp{tl-dAXHke zr>0TzrOu)Tsn}@J$~&$w?~#GvX~b905YY&U&+5UwGu-p$Auk?L#`1mp`}-E4-TIKYvR$_ZW+T*kB@t-|m=20UO6U)=Y6!w(7NLJ7wP^<`B7ZrgxJ z1HyHP4U#N{9iSvc{SG2FBrByaa1$nDsxOyKS~F{VEFzg@1kY28fBiZAX1~j~HcuFX z8Js6#fyD$l(&zsnd^>+DEdg9*v^l1st-%F34C`85499r+ra z1hhIGI|*ev?*rlIHUHZsSkS3z-X7y+?k{7T3hSgpecSuuOJIDLJYtn zF$l13NScx)s!vxF9ou_M1=DrBpOqV{_m$XulF3$!ZK+tj)RD7t^6ZV za(X=kiXxakm2Jye(ZY(CzyQ|P2_jXf%7Dwa6_k+1*XBn_zM#rtPgx4_T_4K92B`0!dBe}l$y zwS)Zn>@GiKq-;{q$(AJQV~HBjT0s;|D#~Ekn!6-9zA~(muw0p%+`X?jM*cppr7wtd zV?=2E8Mpnrd_zZxkbu}MIch}R%l@v;IA%b$x3qLP$*x;LtHH1(Ge|4Fo2q3qlQlOP zVI9Oxc*Y&OQ|-{RhoK$EjEWW-!~oDv9FdgBD_(MUnpgZ1)$!$B_iui~$jF*@tJvHg zXEp~2=o^>|GV2Qjb%>O6nT!YE!BfSAsoDX`KwETa;OtZ>Pe#=I_ekh(L=nd?vA+rx zyShljqv-nj*Gaeh=K=)KcoGl8D`WmS7@++_NStDUG!Hb-ZK&su;z~EAOF*%ljBZaU5Lt-wcY{2;-;8V5#8g!sN^MeTR%s=t_ z0YyGZ!vy|Z?fQ<}Y{8;f;pJzx;<*UI2qo zfb#cOy5G`DG>mP!6Z)(dU_g@@NCmEOfY$g&d0DOJq1zhtu<1 zLYTkZF+9jSdO1hyAP ze@d!mu8H6DO1r-dr^ma3mqGc|6^7^gX)d;det2M2;Hh=P;Qr+a4CLqm8!&2ZAQZ%q z2RE`qZJ8Kb8lkB}-93^Zl;6xUsXNPDuj;HrfgFd(GEIUY8~BAH4^!v|QKm3$u*QN@ z3uoE^A?Z@Vz72{y)hGc5W+j{N@e6nKW@afTsf5LTnUcjp)em~P161pM1y;4_Wr&qH zuYjQ#*`8gxM_U1!z}Fs{cVki-V8r~(sMxqpML6yt$KANO2INf+6JalU^wJClV2RHN z0IUW8h|bY4V{Kz&2kpzvV0M7?_!9abVGK@q^Ye3!pDYB7QuTn!ZNkv? z0$thpPGo!u^>xkGzkKrn(*jMgcnq2cG;93pRdSNQs;v^E<|8t4AA9eGKS08QQmnpV zmM{wkHgcU1PzXLmkBu8&t#yhfE9txvJ#ObzweC+A>}{O%@Xm=!Rlt4z)mASg7I#19 z_4xM)p%8tYR#9@M@3wE(k3KciYEldr23iO8ZLm0z3O_J@NVe5!r#}FNK56*u#cGuu zvYp@s4KEhk7M9Ej)tTDN4zXH%n*Alyp;(sEEP-`L3yaMJ4d76%SXbN;v@HtcWdscm z(LN=D*uL`#=`(-m*i8`rAu8S+lizEbxAr1w;6{gcnPDv}gdBS#EOa5?9AHUFI#VT; zcb3~>*2Iy!2m>+N$5(MQk6jj6jhx-abEaOs`%2O< z(3Q>wpqP&jIk$?M@8*WWZa;eL8>B+>v58PEd?vsLGCnX>DQQd$@j>08mVp!?oSY*{ zMca=KzQrSK!Jz%ne5Q()?xF46*PpL0A7jU|gK>&gMA%{Iwk-%<*3%czCDfaqMTeW4 zGOj#t@wPb>z=ad&8EbCeRyUZgK5hh+uT~kn!a(mBjgYF8^*R0c7kmyQ)&O6$EuB8$ zQsEohzxv#xQhkqTLTK^}(efkXX6ixpZycaJ$YUFKo7W8y=??C6dJ}smV~uQPUAoJR zzfZa2oM#eC@+T_FCo-O(Ltr zIkqnbVEF{wK283#yM>sUon*LWPUg0%6PSi^0(pJpL~nl zzmMAO3bPTei+%Jp48vuPMYVC}^baS}SZ1|)fqu7I_ltat!rEo%I`i(YO!uYW0>&lP8FH@h*su{C%J2 zy9)2tOS~5Gg7aG(F zhf$#U3!$N`FW^Fog||X zQ{(2J!fJZ~V5rV`W0to=HqyDuE1odPo!s%hcl!6X0g?RTs}q_i7v&@Y2N}~_`8*w# z1MPIGDFZYwkF7a8szq_V@f|ice2A}HB+nLu1fKJIK+~<(OYG-g#>)c~htejh)d2qQR?laa* z-J8#T*(c7EVlU?|jX(bq24OF%Qc^>yl=Ir2H>p77Uw8nE2W{cmaD$&6)yXW!c| zi*RoJ40RUaOIfL}XPrDke1NK`s_UPZA-^Gb#b&|4!a{*@0BZZ@z_}vt4F@O{0uEXf zuq_eqK-(1ZUw${+Dkg#ksC{C58xzP>Obdjg6;lWmWwg@{G6bLpoY>ee^EJ0ull13_ zG-KimuMOMQa;$C4SM+JU|3?A#Q}as)14HbcflR@P_d6T=T6=+2b_pf{3_#x&eA<=e z%wh=BI*#wih8nUlNMRYvHhH8RW0 z&|uSQn{Q~HW3$0^oOxi_-xiGsTq46gL6{E=5M7mWR2S?ta(`_Q;<4XaZrAp?H(ivs zS2g{7_Lx@)wSyNF=T|N_dCAS3k>?z+*8e8?RVzmKXzfCCrM0&Fi>XuVU1Mc*;J}$q zuSV4Y>w7YRfOVN`hs)HH77^(r6Msow8Q)UTU(pTx=>(no9uriSLf03dATKdBI00&U zJk`#Uuq*~d31G>I!U*!nS%n(IhAK_jf62xGK-3bADJhV|e(uDH1dwn91IE4&8BC>3 z8?gDa)%EbO0NZ0{1Y3fHfX!%TbWflteRe&z#;8}jMXt&-$FKI{aSwLxH;w8Ef}}kH#%e z#O)cpBy5xPu*Jwvs?CdC)!}mRbG!2$C4nk04wwvy<+IUsTXO=&10R+Trs{(AaExLF zuf7Qt6<)l9#d8IKXY*>*Dv0xH_k{+gW<_j-Yt0L0TbkmHsTI~jZ5v;GO8z7LO`Nu| zcEx{lMc9D2UnrU<;NVMjTpg>Cd0pFQe|<3|aDU7ZT7scaZIdQLNKLTZE5x=JBcH1A z^+}5w3ROa`XgZ1-ny(Bb78=bwGQ(fVRVi#aNA40hN_u)+-#pd14+h%Wfh}JPa%;lPWL!A> z7@4Gl{J4)+UndZDLXaQ)R@ofZDMvdS@lZ^FD+Gq3PLp{!-$UD0h!n8UA?Nf3=J}@- zm3;M-8x1X6;%CzKoKE!i*SW*@R2^00{aO~xDhjsxHa4GE{c%*0`sdipznCk#LPZ4h z^o*%U$rhZ4Fi?ixxogpnb^3piC#?-ff1@9``!hh(o2=?($h0NJs*|Q*leuaZTN8;! zpd^z{1IUf;Gzy862Wg#F+ai9;KV%ps-WrddV&f!P<(03)6w9nWcIeqzO1x>a4OD3q9+$#tR)}8tD^6@I_EwOY;6LK9@3IU}n;MeitS$Iv)5Ss6ypbpF@o1 z=JoCIt3?oW+h$0J0Lh@734)AckU+8%(dk1+-2f5*Z131J00nG0>)mf7AqWJ??yMZh z2&LR(!0r-rb7}l&UaW>c@SYwicNnZLbbc ze_f_?nzhKOI|x0YdH8CyOS7^L=ZGnPuFFlzg{2+q`ag|H)TYU!eju&SK@n zG>k*CR;Hg9qBA6p$ROI{kfJI|ghO#o(^pE$nv!P0If}_j?_g1_H}`Xs#4qqbezrfx z90Gvbzv9W%Kw_pWKJqAcHIpn4&T-A)-V_^nst*;ZUuQ~>? zs%9-setkD|W@|}FD;(JH;qNsqCDxy=t1AY|>n41F9{=kb)-K*NC0z`7=QF?tV!7@N z$ZoOXM(0KzP}GX_9#lfU&-&>H*l0 z!F-;jTU?R_SApvDT0gZ$3-@qU%Zjg(YXx{MomFRT5Y{6Lo$4N7bvAXKqx z@N{XA(OyVYM&F*11l)9-Y8EPR*dMSM1j_WvaOOeFiqTz$yWFx zj_3b=Qt1_=$t$$^*3|l_H*8p{;CgdwZKS8zYt0;hM|$xHY3BGiKWrON$oeeKziN-i zDq(1CS)U`bL$oOFD$0I)dZOLcaKgPHQkxg(PXJM;x#_xe>tyUj-z@W>)|vRNDVhJ4 zh?rxd#)8~?YN&>uL{v~73{8PN6g(xKJffCqClteBj2*l_PubXz!DsBdP=0sv00{SZRrc@v1>Y_f(1~S0L$m`x zbs+$Gye3{BWJ*YpZVgXN5a{91b-e}P^-(LUl89o@u*IkIxV zo}JYNv#S4?;XbtKv2LR@{K!`y*Xv^R-cBfQz}SmGN3FQ&1HTSjPlUlSiN+!Q=b{Nb zgKUYHviCy`3GkRwV0He$FGrf~R34xr>@Z`xhk&TvcFUjwk>QLBuUYyU;vkZ|6REL@ zX5CfPMnO%JV-T~+&Kq@mHk&h(qi=oeP;%}cZ&`}ZoH!de!lp)Je-|%dSxT5V`m^$0 zTe)Qlgy9J~_59R8r=u5SklvlHE6eNml@v|modk>~Y2QkD9Z!DuBVqdq?!%#SKL8M* zE0!8?#SXuVGSi^*@ZluEdHL1Gek?gvnx#6aaxtU)bgGJ0a7Se9r`Kig z>{kWHV#;JCAX9>>g+fsw3%7F>JCQDR^+~}!&`s$;jnuR((c-fMkK8+}>gs4M5>C62 zG)c2Me0tESt{%7k()#iljz{hpjcn@QcuYdb10O8YIj^-~CU#cH&$-5tLS?X%?h%mF zctAZw06$<}siAwO(QKWwjejD-+WL%VzwzA5#=l?)y1$$tj`s<`|M_-Q)Xqv+Ia@@@YG{i+?GeYA^k*N-%gd*Cim#6Z4aGEo=M63 z9=BVL9diaV1)AGYB<$b3HNeEDLk2mvErJ2IA`D*>o2ziPJa!y^a=c69X4uHY9P0h( zfrnOVd8M;$y~>( z7cJ{hg4~Q1%NS_XyrH&RM{wu=8p8EC48$(i1 zd|e`?Y178ru%wPr-lN$&$Wf0R zRy)+FMo9jn@C;Z^s@mYeSDbq#tE}DgiusAAzn$+^vN7$O%+H5@&j-fdKYcxgHl*+PeDrMR~9dnqXAubcSS+|N4&PPs`|&qY+vu0Qp^G*6IN<0bfZ zpgVXO^Zl0unF9ZF&=c6e=5vH?Xdz#(M(OTzci@>p5kKtE?~ zD6J|La8#E5+nP=o4%I$+J*ElYHd$>B5_UbgJo$UKExCI9djF_3KEd?-DVcNX2b;-k zoUFjExnM)T^d=RHD~sw5!xt6cyQl&I{KL)O9{LoLN0=R6+RE~3$nhd#yUXk!)yk+u zvCvKyDjdoVYH@QPEPB;U1NG&qz|ye9^l2jrQ;W#w9sH08!p|#-8{a;f?LlAwhnkU> zLMAi~Pum>N1H$XbS!RR^E?aY%vRO7Ad-*3s z+k&hIFZGMMOcYmL{}Ynpj@mGv%UyRMz{X@+K=ISqAr!hGUe~pZa@+D<+w!<-g(|0k zS@x%GNfrRu_LD@l8xYwuP!bR=J+zzYv$5A#&7%6x4B!iZr$Drd(^x&UPV40`R>Q*Y zb3ptsP#&0p<~)lDiS=<0KrAA_9s|36I~3qr00-9L*U_sT!5{>}`kU{z4aEbx8@Ald zGFp*s#VT)K0RTwe9#J*h1OQA)k!kO)yp?j}S1U3rtLKa%<*EOHcQ@<3^46ji%_<$x zqiWE6-%pX%M0|^x(-u#X2~(kJ#{PV1P2_m0Q&}-1eFT4zCi`X_ND_t*pH-swOZ|$XdtIq7H|E z+?>V}NW&!8Qz$*+6OOZCg;e;_CLy5|_=vYv8$R%A)hnlhfQkRp$GQS74@5@oOU;JEJ*YbE*_PX$T`FM%ANny{mH*t+m}zJPM;P&<9)DvN=B+5-WLoDN3fq(qYkbe^7{PSJ-6SQlg0#QL^vUa#RWGg?xAp z60p-UOrdD{fr4<;zUEw6v|WB@(3ud$m|D;)*=0|MtF4mT{r>%zOv`+K`*^fHD>>@C zk-7+5gVzatv@3@{d&gz&FwTV}iVK(9fwBPrwsl%vGxEuQi50MqBaGP==NlOSz@SSt z1m=q!kL7HPMW9d)#_<2{rUR~Bd1Xc|OM5#PAIvjOtU2j79lr>^rdOtyjbv0n*m4Kt zKm9=nip+Ig6PyvTk$batJre9yWo#hdQDl8oQUQw3Fsp`U|r)c@x*in`%9#6>GV2xILez7Q0iO7tVoZ|m3sy_8E$ui+*oO6T|;uZlGAh(AUG zdm6X2Rnt zgFb<0gw1v-CFok+Gn~QLhu;2v%WAca(Znaqc?9cEi2d=fkNB+7<1_2y8Ls%30o>ic zJPrkKsQ7&#JN^@-?@z)fu7|)#jgRtYbI)c5r1qA03BR6I{{lNvAdr8H!C%;p00d0Z zYV74(H3HNJVh>=s0glwPu*E>2Bohr>f$Fr!zpsB4ZsQ=psAu7ddJsz_F(VAXK}U=7 z%rO(q<;14w@3n2RhSpmzyAJkwIQ^)O3oJ52)Fv@gw zITpS_sDSc!k7{cZ8oXXL%~a+nHq_AH|2-;JGt;whaB)&$-u$-cUZBWP&5jz!az5rbq1ih|F+aCjOQ?aH;=z;dsVoDQ`3I|gx#yBH}wBcVd zlLhi(OZ4b+;@7aFOAgsMB{Itkkj^(4&fFqN5Jf9~q~}cn=JS%*^wLpBp%CCF zs?!wy{*5!q{(KeTEf(+iW_7UGY&djC7L$fMqh!B2L5M~q8IQuIYuhDtrlz!0%UpPc ztMsw7pPg`jtMV*%c}xW|Z`g>-XxUPs&a-BNM@NZ@DOH1Dmazk6uqG1gn2v^Z+jNCx zs+PMpiF~D8S?KGhE6c@&+oXZ*A3!qnSud z9Y2m?$&!EZ-aHx+OL*qgLzK(Tt^%+W3PLZ|K82xx!krFgzdu%Pef2 z5|Ukl$Bd@O*xAKj#9byd4fp0_*vEez^RfSiv3+;-qDNK3mIjqJP#Cj-x;UkkeyXHD zx=Qz1U;tSS!vdPkiyp`_b&1ogXxPYIyab#C69x|1NX$!ynG2#}D?y2PBoDzz9RRe( zRk2!YkXg}OnPWKKpd_t8GFBgH3<4Qp-Y%2#HWqzRJ1(`?f|nrqVQ` z#AW(<8Fx6uidxq8=LvW2aFSC~G$#tnQqi?iwQ2+b=}QByP*VU7;@BJk|M0Rr$coa} zYu&=g_k6iZX*M_d(!}MjieduXYqEhEys^%_;@k%fa*%8eb?3;|eIKbl0R_renx9zt z%A*4pAFiiVKbZ(Pt!?q|9fe&jWJOlyjzr|Wy3z`5y_@R?G$7hJ$U~dK{lct-$Vy`o z$Pno!2c}qX|1b+)F&Kq~g|b1E^6SQ;n0fzX!K0JFi(f_v#!U_;EYb6Id@M_x3_gG| zkq#HM=#6$5M+PYBw~CF+78{hf((r{jI#-}cyMtrB#W`-m{0r^t^&B?!`aiuGZAdWD zNqR_e;|2qJ_y}TUoa}b##AC+q%;cfp;DKcZPh(wP}8=fjV>{zngR!LQToDhz;JN&;zD^` zyi$?b1j~GB>P0O~A}?Ob$JsGy#OK6k8`*U3W9ecTh zJi{W4@C*4xf<1suN2U8o*~u-?OWc<+j8iZad$LvCQBr^(2L+p+-?5 zrV@6XbHR_PLy}*DFw<{7Z$FkoFZA8Au~P2Oi+sO0gyY&1K-Ne}m!OhawA+ERRHc6_ z1WD_sl9Lv1f9kA;d}+Cxp!cO&gpk$`pv(`U0r)}yZpW|9^LZmY=#jkuOd`Ql5h;pZ2D)37aC4>>xsjp)cX2hNf zBmzb%|G&^h>;D=n(&+liIpbuS8ZB{&MUz9)6x3Bzv@A?5(V;oT=+K1Fnq%BgObUKBBv4&UK$B2|=Dy5xK^5$svj2rY|^K*M+AU^zqQQ5rqh7 zac9ppIh!VlCf}BxL)z+KB?*f&6+hAOCPV2S=q`6GIUAgSt6ct zv)Ty;QjzF3w2#S=Xh${%)pWcD%^)9>ZZZ;7Ak^nR zVkMv3c50Tg<3yM~<5`Y%;8SFXc5n5>;KitB1nI}OLMZE}dx-%Y&%bXv+`2}l?%UKP zqCCIp@Bc%QyJyt*zD%;DCI60~Zs5p91Xq>ik?XlMWff6VhpDW`8^X0#o&eSg5dIEI zV6}_2W=NA_2YZMzT5jKuTwQhr&qxX6{XvuB>9^#)Uh{it`(`^8SV$8u09{X^qsJ>Y z#vx|E)0cY>!GJ+gC@j7n%W~lfm`y}rBR?>t2u4LUe*W0u1cJN-EGzsyi>rZ+3WGmT zzDO5lV9FIn7$sy(z7xb_sW`UjNWc!Dd98!?+DhbjYp}MB{I!>fSz6}`g`HuyRU4~q zYn`&u8agnwuu{J_ZP!~@ll6w>%UKL-HPc|?p@U9^K{@P_9%DY+$IJF=6;kDM>23E3 z=c~OpYPsjz?XO+=OzIOtORpLPYW2ON_{4i8)A3z&;a23&zm|?#kwfExEPL6mB@EQ_ zPzfPBtwS?DB#$j~>Z&T^KS;?RCm*t7wNMtf_dYRkRkd1Sg3u3h*AVcxua4E%*@6H+ z`;5?6TLy2Xg<6@giX47MRP8xCSGNv)kC*4Qlf7T^dXVHyXRa~y?N0AuNSga}zdGtO zgy!~xZCs7_R}?hE(+VGOOQ$LGSBgFwr)eESpDml`(QsPgpjd-w-R&%2_jC=&2|(Zo zyza0ohs^rGl$dQG_pcdfaVXw`escKbY}SbeF`)Sglsc3^#JUO!xyLw-H%WQ!8o>up z^e2)W^A3fv%Yo`~0B(Rtyx)`(z(EhbOdb#xgIny3XsbD09A%tsG-W({j&}gM#=Wi~ z!xkWfAJqqs=Svu9lPJpey?ba^qiWzJvc(5b&lGOb;uR*m&;9StCSOMn?>gsAm7gy| z_2WHouq~?%Iq+n5{#fh~K#|!cG`Ca*WjSlvb+%->={?`IzQ`LU*Ol#+cQ?F{yjmP- zuH25gqD(AwNgrO#PU1L=A6EBOzQ|gJt5Xi=#zn!cqkCV<=}O2-m}C+eDy>8*>#%M{ zV|>S1C7E=$ZsnI@$s>`D0K^emig>U%j}ANN(3B<1YJ9sMVVLwAD5Z668zY4_vi8^S z92ftaMLGW$OHZ#y>@j=iiZ+7ZJ$gMor#@Uc(^MfUqSP7sY6qa^kBE+pY$jdp@lPb? z%US*qoT4g6NJIO^ND8+)i~Ean&*v)<$ElJi@g*R^!f>;!gM{q|&pclqz?bxcO}gmf z3sm_{DkbkX1MYd-$^?JELLz!sGjE#1lC=US6vplX3M7fdtuzDRk5Rh^`&(p2e29`T zGK@k}yiTfvve^E{Hc%@-rcL$i_Y2x0OqhYSQkf~xtImjoNN5TH=VUwK)^?Yuq^Z$M-;# zv(2;SoFwg9m~|P=|Kan=iK)6ahCqV2$@cibX5Rgm+Gy$^#ZJuPbU$rT;V4rjJw0t? z_+eDg1S+m;#1pDX^Tzr>YUpK5n-6s^HH?>J-31_=&R;}4y2Pec^OJu(nrrRV0`0c> zRfp>zd%bD{as*)IWbMFFSk@kR3IRMmpbI#yd}Hlke7kgIAE1$&`(1HQ@opc7SHdr}gVZx=z7 ziq)XGCuV+kXq0DOJ-&@!zb@H9_toEFvTOFguJ6=jKJRkt0=8-x6`2d=QR4(1%OD>` ziZ0<_AQLLqYFP6hK!EGD?T~5#TQ7p1cEnp1Nm?ZLgWk9gZ>x-2KK%V`cq=hdRWh?_Y@6< zSAB6;THH)gdvu!X%TSFb{}t_8Bfq0@0#^Y2I}0RJJJx%%TtycxDlsQg7~Q#%gkU$! z5J^ufCkyho%El%NQT1+mpfxLZi*8!Z;!3wThv3geJbS;A@~aqjrhDtwaKV{!{9W>? zX05(5Z?uC%(vF1Xe*;$IRA&d`DD}thZtgWJmPGlT|Ky9-j(HmJL~`Go^xBh#nnG*s z8?^LAF56%J3XAhaz5$a5s79IrneJ)R_`{WN=FES`kr_&6@`z^mJhCLIQ^8DN8hVfv zq7>#E7E2)R;IixBE%ZCrHL|O{{Z?BjcDDakx?+)KauUz9@7++i@kF5#{roR+mOtOb zN#!sSb)e}*IVxl%^(F)Jh;f-SpE03EL#cVJ+gc;)4$(b_HADGmL-E*h$bvK{3%OE^ zwW+ha+RtY!YNyn_(kE-A5*EghR_xTfybbKq(U%Sdc?-3#D)IgEx?g%RNxjQ&xLAOk}QtPSHtw7;60)ET#topp3b z*NsqJNlnjs8YHiTqnju4X^_Z){olp%8FZxD0FMFY>hO3CCReSmpuRp)XeBViT*J>t z#}b;a1pSge^jtC8%0a9!Cd{V$Y3T89A!U8Y<@3_nWC|-kYN`yQgW$0r6a9)fKrTMF zqh+f~LrQtWf&IbGcw*8NmOx)JnB0kH-}UpDsA>_&97FTI>t2QSP4rg2t=d3LP6n?_ z_g!eKy~g&#Ux8-qg1kiK^fc`CYnB8K9PQPtMZ7m{(24M-$S}WjTRVj!Qt;4ur4w2A z_^3LPZbvFug;eelYA%Yn5BjwNg$DvbM_btR@)?NaNdQ%TEC8Fh_+}9-8xycvDgFDgDb)2zocGBFTNL=mU{<9KI+GPXJgDof^VT6Q$5@H&0PBT zoV{LF;4Iaw`MW~+v<7X`3{)slb0uvUzEH366);qD?4kgDetImIDR1}3%0 zfHW|)eSPY$WzG+)<2noe_X065Cy3?^B!M2Bmdzz$FxbI!mYWvulvHh&Z`yeB#GVk< z{(}Dg2}yrt)#)N5B-Vp-fmBI5@CzinU`Yf(Rp2M@2Y<(cQPtKA%qm{kXxe5sK=^|b ze<*b#m2e7m@xiJU=Qnf8)KL2P*uFbbKL5Y*p!gN8vtegfQC>E%%#{(sK zdJZ6*4G0B`Mnwd?ImBkm17{!rR(O34Yx`~h#onOON8XN(k@0GvAU3c&P?6o!wQQ6+ zO)*=7V??Yyju{(`9g$Pl3-40S2N$R6to0&ogqCqUwavAPh<}O`_9dU=> zHOmjC@TVFR)P(jD37I%Aok6jDGxS#R@f)=4_JJ8rm#=M6EdeUd3^94{N?l4kb>C^F(fA$Q9MOi zc!wbdIVj;3h`u1H6;4tgML-Km3vJqBpUGB8eV*HleiLb7L3O^f)ugTHG=S6>*Vn<) z>-q8hl5%+_sT%0%LmFtvv2~MLle&;TDFjHJ_kc7xriLA+bad<+HoaR84R%FE!3eEQPoDh*JPF-5x(CFA3F#Fi?0^} zWZC)-)FcAT@E&%-So6zRJuK4k7c5p`3y&ZoO#B_))Y^0Bsp*{Q1!K)G%n#W8W#I!q zfklrG(MEE{7NWh5r*Gi zB#=(Xn;Bk=)M11HHDcAR^Z-i+ftK{fB8h?K)9hz^KZsFa6ea0TG=B;MFs(*(f@INS zh@?tGl4M1>hJKqi)mzRajv(x{&!O}kz6qb%(X}U9UIH95L+kV2%>UpQ)YId5jh(A~ z+%MCNf*!2@^Wm|2RwIItBZmUoOoT(mZxHM#rw(6gXNh8CDU3fy4%?(_X8J^gZsh_M zaJl0MQ^Tt&*J%-x$4n%zh{7gyNS=_eniXq%hJflv zSFUG{;f9sC7IJ_}NFPM;=%pxLKjIICWp#iDfWb6g8B6kuVntcEN{cB^4kvbm^M#eisf2gURL;M@ulZik#xQ9<7`6HP2&Rdb!Z0{g%DrBMhbfgZ1b4Sy+b+ z9X*Z;%1O(6X)kA;VnuupR4>#VfO<7(23KfBZQ!EQV@AG3OJ;!IykW73Xy>lxu0!Z) z)a^q-bTf0~5)sV$Orc+5(GGy76YD5T>K*;;orw+PI;!{)7`TE`Sv3L-<{pzduu|7s zP6!zQh(rLEXzmQ7fPoId=MC>5cl}CqhYKl z)b?%1om+S;DAh!KDt7|IYfNdPkYdk5OiZ|S{W_A=;54`H)}uWmWjvaiSGri{#dWy3-gJ6Nl4UZ`g_xr< z{bw0Xqf|gsMeUR@nVLA4zc?TqPH#WxkNuqfbMpnux1;ssfzP9oXFGZn&EJapA*$@c ziUYSQt8crBnaebt3biXKxu7EMQanU?qUAtDj~de|K~(<%PX=U(4Iq3^{-vcy5o49e zQDD+TfBQ9_QCSN?tN@0I4G-5w*@c5|*A=wK`;avn7P&;4U-zFWu5 zY;RT^n-MQ;T6DAFe^=!8(+N+1l!vHcHtK~lBEWZ%sle?N>qb=vFVl|b$)#DB65kgy z{{^glX9t@3n$(7UMW`ZT+NZS2H86271X-z{CwCG`$=>Gh!M~K+dlFuC5(Z&DE0XJ9 z5gt?780oh6^k8`$A??&&Zz-oaX_X+sos*~43f8O(Lljjac`Kvj#)moZ z_*GHI@WmciIvpbXjvqV{^ohCXIFd%JPR->}1gr`Oy+(f3n_4c6FCrMMIdnjaj_GFA zd8Emy@^kBpv|Ys@woR3)TxCn00nlMc7${PtIX2q%aq$5X6NAtOhRcCe!hp~M;(?(i zxrifEM!^F-{aL*6cniRd0Ss{cF=i<&!BPTCAnpf$8|~fzkVIla0+O&!f(c8Q*d_NG zM4S_|KjKh#CMk{K%Ao%G{AOaYo=%7b&YkI?uP%6ZRWSYpwPN}%_fl~xqmiMehAmT! zCzk@ysQc3_e5L`nV%MoFjAeW;N&3QK;2_AHy0y77X$H64K+{0gKM-%=jS!`*JHWp2ASTgHuihJ%$mt_U11PU#yto3 zLi&78RsY5eqgKyOa6zRSru{H;0e=2!;%J6$z0Rp|MMAPREyk+yCp$*;9KX(r&E=`D zUgm#~$R1pEBc_*q$U%YzxN@6`DX6&jy+}WjeoT;f01*0)aw^Vp!ZCYV4g!&^l}zvF zPQw1lJZ-*z+h={$DdX1b>rka#gKY=FKd+6joURxU^RPcv^ON6#KtH&Q6_7!IItPfX z0QW1vV8=vNh=8&I9h%X>Io>kyb81TEZX|&KK5`)ba>ab&O>{Z6sKpK;I+?RV+171KmyQiYuQM#Nv222xm%IX-9pm-JHi80`#YRQF?pK5*RY+pqW0| zCuhbYoq%!0a;bNk55q>6A%Kv^g*#MPn_Kz$5r074%TB~QP$;xqH8 zpFHDl)UGMCTrDk$L01Z$cmA_Zi_0>yq^FZU+CsK3ny=v~1$b1o;7tQI*R7YZ$CVo# zAF8fk7@x%er41VPTLA?N*<${-uNqK#63iXF=McLz*ruQ`AU)vzRRB_11$|~r3fRiZ zDlVqC%nwb}QtN8d3h z%zdt3Y)?N8XueqkylHKcwM{`0oW(gjQ@O#c@4n1x61k7@x>iTV<_~;E9W3(%dT&1$ zb76NRXyJ*Vo?ivBNqSizc%3oJ?pkuVJs+(Gpy8Va1ypmX^FSrs*lrNTTr?IejMisn z9uBqZ9ts6U-|zsZ^nfE!ee0#Q-Ot5GB?$@Pa4c)O+G`rYbS1-i)jvPUMF_E9$*m?q z?U)!_Ue_0g%fs!qRx1*o&X<1y0Jq^J??69gXDI${G8G3?)mv`5>07i`lpoS@vZ~>J ztt!U>xO8p~;z+4i|B9a3D)@VM9Rzi^&I{8T2W;Q|r2SlQ^xiim+S(IB)tv=SD{4f% znImc;r3Fi?EfxvT6~ELeG@v7*vnRXP<0lo;rK=^V5Vzd6;YmF3S@mm$0T&I^GAJ3^ zLRDsUNF;IW`oW_@O^c=u&96=d2!M8@K-3;&NgKmc^L07nIBy*$+JKk#%L|-FcC^M_ zUn=pr^^ZIs2T!mswM-(<2yMtN3z}rwC~?j9AK?+;aP~UGUW%Sdy&BP=h@@BvQVM_X zyk=)NL(1THXLrbk7h^v6NFOsh@4AG(?jA9E2&NFGQ0Y7R@Ii{)0e`E*m^C#x?CDpc z5>-7Iisw@Pu1l(jl4`pi3Zmf*f)e4iK&iyNOLqPr^ zXA(7@c!4NeNqNT}qkBgej70a0lCzlLF4OhhM|lG5k0&2i4{Kz1@D6_G?re|the&3nRVV?OfKyQ{;&@B}&9CX}SM_w~xmqZOFl{`m6$ z`whA;UQO*riN?1^47hkDH9SN6dpIr#bP#Q8OXZ~RW{j^@%jcT%#4#MYH7-`YkthAD zmCAPBi~y39=g}(Td$_z6KEhV~M{nsB$R(?Xa&T{Gp-+%17(+TG*+}K8-z?oJ=UE1kc-@hE48+)0=n8EHB<<|Zrss3Wm z*{q?=7dFxsH03V7_-WGj&GKaj?d^s)GF-$1X-Rf}yE{LBKb_jFP#1c6@YnC_`Rn6a zFxFxj(@~q;u3EtW2HedHC#+L53pRIn=ErSMSdT=tt?Arpq zNl49u$La-*?ahz!o2)9jTJVd?&BE!f3o0AxhEKv>&sQYIj=x=EUeyPj{|&CbZ%K=J z9rQuu(Y6x@*)1~AQ$^XXO>6h9Ru8SZ1$TWTEA#utoYS`qyzF&LXo%QD)Ux};PyOpU zoD|y&YBLvch8DOzss-UYiko441X^&}odoS?l?K1Xdtdi3?x)A4-t*;Ol80)P!@@6D zn1)$*AemA$j$NE5Ga6<3y&K6!hvlg%J#P))YD`R0)DkOLJr=EHz;N2yQP0bq$Gs^% zsP9rfIKml*DLVxj)^vGex7;B_dO!2E_}QH>YOarlp=a}((+d-CN)OK#q~1RuR^>s;Nc=e2y}9$y*}FEY^m^t;Zf zSdts!Pl&l^!p?WxZUq;22`!^eTxBO?!tka$4Oofk^!M0(cZ{H7O~F&9C%_Lw<%%Yk5I`fa{apbW1eKN!l+&luVi*7@RZ||8;rUsIT=7XOU+7+_P_$ z;$_F@vZ>w7QSYzvHJz1MPPKFT4IpS{i2cr%DHrI_}!6w9A&R<;<$ zIJZl4whRvbAzH$eg6K)Phi8Z_I7DwpblfBw8CIm|)-_TKszy&;Pl{`;xF1g)KR*pU zd9N8btCe)^*hAZ2=|!{oocooU-Id(%8H>oUi{SNAJ?FN&2<4+D-i-v-OOE?mZ6sB7 zw~aLh^93ca-+GhpvMdJ5L`!`6w=X-E2!Da! zFOXDRTs#l!dS6<;m3*hxhLB7v=XVx}v%v$I^)#eTF=6qif_=}_w^#c|WgH?Li63P5 zb*oXiCoD?2ooAN^$9W1?#<_Uxd$u}M#5D7+G_2v{l)#!=&6rE@!#s>U+nD$x+8 zw8JXqQASCc;$eV>+g}=0;FL~6r#+}KdDSc$m)MydTzRr9T4FeQp#AHSXe~&ns2VwI z2`oM!|LHXg=3^rw&0rAF5&~xk#dpoX01oygGCFYuo)!5i?qQLXN_UappVysry6Yst z&vKLt!dBkog$jz@k}TYwf$FFJqz>O@bjOi6+`8?NP>rdA`()$6>n?_$rgXHvf! zh_)OTlNdBeK}CXZou`uAiZYV>$xmD@sD=7O)eI`pESbwsc2T_9dqEw;ZUBYTEY^Mq zJvmXLNaK7XPX+q_V;C9#H>p4oCKWihqku1gvN`p zo|U}=VTcj)?|E^4vY3m>5WryP(RrMiZ0a&!R^LxJUrEUXA2AFdL6=L$Uzruzew`2` z;bs#OQx_80MNQz77Ld9|Jshaz*ZRo$e6znRcH>E19P`+6)!8TspQS378q1rhhsg`B z*G6P>i>ZU*)$z$afn7C71CWuS;S!(dhMGE4+&b=9&AN+QH_Z`=|Yp5*sp2XNw8#kF2*yK(Z6;$y07W2YsXpfep z!<|AYR`UR*I3r~7%ieF;+lR>wi${rcjCT?nd-UjeG7wr}MI5O8ees@jW)~EnXLFRC zMz)k&BP|>|&If6?h_bpjY`N@brbeVi(c@1d^Wx}=*OA`Bm;=-7jFA78jYw4YG*+^aPDCg!AylRV+{d!{ZfPsC~^~nN9*-)h#h?JMo375hwzyy3sPeC$- zU~CVa)KM^ENvJID-3AB)mS_I2_QE{#+#O9)u{ayt5_S;;*Ya?IM(J1@hnY`i88`o( z1>m*g_0{am>zZbfd_EFKy(>&=nK+SQW5ztpb8Hvo1Oa{-(nsq~KzrT^rQ%^vsb$Xf zP);1Q;J7U;Za|}8;gBz4LLHMX3U>;YY_$TX74<`HZv(f8`Mf{RYE<50Qxo|>Wa7yRTI+9B^^SCBeF4CMR^dMi$cJO;a4;^bx9guwWgi|g#l%EL5sXbWjQW< zIzD~@uY$&2JN!r+;)X1F>+bG)4oOv=%)e9ts}#u}phut{v;^G$&tNB? zdVy)JmWsy1^ho1n(s~_RxK-1@){cR$u^ z{`>ty`^%G4`Q9AI^u$1#H)Y4Mlff`~hhS`G zw|j44wSCJ8{eORNS1sR>XMH?v@)Wx%?kCi{T^SWjrRVPKizb%=+#P;L6e$+6=Rjz4 z+zJq7Hvc)K?(WpP9}j9wzAuSo{P!s0=RLfX|ALYUx1f|Jf0su#^BR+-xNR{5uYh{{ z2(CGCUeQv(G9Kx{@>le&;Q8{ac)l;c1-BdLBjXUS67i|2slU{lpUDoAk(Jviotso< zuf~Q5GP?fW_bj}>e+NAyN{MFK8E_xM^x>W=3MaWlha&sy5vnz2Jo|Q&M~6h##&=pX z&4w0_+MhkY9q(1kNx}5$f)x~LBkU(YH9(5~g#o7h+P>)&=$hyMScp@YDsn=-(*E53 zQ~FMc00Y~X5@@-V`qLE2$r1qrriVog{o~~h&-$QtNgfRICChhP$Rfl3$ z3ZtfSoR>gd$7X8O3@_NeJq01Yr?UZ`X2}$uTy?8I4hl>d@3SQ+&wT%QPZ2M0tC6?? z@}-G_RTC;#|A4B^UAegMgBkfT_wlQDITn*mwd@yDQ5=mMd%s`K`mv=RE^S1l-RHdA z>;68_`qP}nlIcO8OD~FQ4)Bo9^nLq-3cG1JZ|$)D5S1j$+dHw zDK66LIc`B+3KOm4N(y-nxUqG#cU$O!6Gy16|VN%tM=LOyU*$c2IRR!^?MwB+m>ozENxjsc7^5`V}QITL8I$dk#qAQtmZ&RRw&P*K=uWDuiIap!@&LYdiyb3-4?GdXB z4A=f|xRL3$HxZw*hW}%tdv(NwRF5pIHF8eA!w4Uvm3&c{b|UE2x71fq_&{&<))8%Q zgahRcaYkFbl9*%Uy||wPt6!~upeL}3)4|XEkCBA8E+u}kZyP2qcSVN z$`wp%-KMsBD#w(Wma8!JeN}{dCWc~KOTlhPblS-MSYBgd>CR$f6myj3PPo3I8KaX! zsdi?7(~pQ8cVgL6(3k6>zd*r^L@dM`2JXurQ15;_h8lxQmU)>9)igFeN{lwhQdZgw zjTXvT`DM)iM-)?T*HFfi+V^={!9QeX(68S?ZC-oX?yV;Q_+FE0VKnNdII^E+BET!f zIC}V4{~O`U&!EZ%lvc&Vo_X#omk+0Fd9!`*^D!+qu{C|U=q&4@tgF^0^?+{unuiA_hpduEfJMsjD#)}wbjSQ_Z)b$r zFo2G=XKs`t)JrERs9w{Fy?mP#6$L3q!wu4?Pg>bMTOyaOpY=%5ergz%;wYZB>%LvV zINWOFm^;x;@=hA2%4LxZlAatKxA~M@QW0UMnyR$}@`qya+{-eeSpJZob}Y{b9&{ z{O}G})at+I`eZ@y=Jr3gP_F#+7GNOt34xin!&DCdJ0n0R3eEzwUrZFM{}=Fhtva0x zsB{2`5?`93X9TWA}~eH1K$l0W~D?B0+0VM1^#UP9);m_>hWFRYF^1 zam5K38d{<)lj|-jX?U9v!$3Q2YfI4OPDn-?6US>n>>mjzKFocaz0l{q=t;@6Q(Qm+l*;6DcVLUAOL-i;2d@W zP4TMoY^>iPI$RS|Oz}nXMMfS|$EqEXwJkZe`m*&!dKq3US|CYE^%UXs2N?7`0>xgjcaiH>LDlbbj zeKP<2#w<Rbi(GD^k&JWfDq?$f#Utc1e9*^@jQLI8Wm_WHT&JB=xBH{1T5Idt%iXr z)iTzW(HW}(IVWXZ1$=o?Eeu6g97i~~fuvkBnBa`APNbOJ{U$agHpMlJu-_TLv}<*O z$;q9W$625DTu=7jF6B~bcg~`1aV8nIV8nMcdJVIeprDD#(%_q-9{s1f_P5djs|V zDjj|QH%m|=%o0SSwmcaL3fNEr86(H`e`O9Y0=+cmU*^B8H@(R%4CWK(ms;#gm5Z+f ztsRAg#YYzJGOAn?EX-D&mjv-R@4DwSOP#c22Y((ezlj?lBLyVu4mUiPQVo90hFk)0 zj}vo8l9w+qC@+Teq3kaf8|ArFeWG|CyS!E+N|UjL3WFB4z*~}!j(@Hgb{pF~;Tt_I zIZ9Af5RIBbLvx10Bg`^Ko4x1FbdW)11RZs~dXT>$*Qg}<_x3UolTls!LkWV8jL#y* z(rQY;!&D%x$}&_dj&A}S*jh;Jck?X}#2gvbac5O?5yBz2x(JSAr@d5rI?2ac?o?5S zpmKq;2xa24RBrM7rZcvad>L_SaxS(@9A2tqOt+uzB!3*vZ^YW3mL4#^WBY6VY9Y9V z3|g07SoUh@QxoHY&Rd+vy>IM?j8<&@{qP);#4=IRvvo({Q;1F7Q&M9=Zil22v}t=d zthyRuBsm0jatM!7rnW;KYIk+ar5#|s9h4bH->Cyo?jvFdd>9SjpVqw)6@=knWM*w? zEl8wL3*Jc7Gmg+O$2$C%(6A-VHf{1p{c_!5EqSCfJ)gWR=8N>?-4UOymmvx)&iu-d zv?(Nli}UEtTksDUbzl|$kvv=5d_F5DLqr}zEnSq zdF)`)BKj7s%QN`(ggEJb-DmxB2e~uDCzD_|qPNgG zarG6Ea9Rn#WH7x}mzIl6dsb7+*;W_U$;7MLlI9~;D-YJ5wIt=tt_*h{Ye2kixsF!a zp>j!cLP6%~UJ}#PRPi1wm)&xMR-JQ<(xlCe>(J9)i&XIZp6SdCZ?@{#np}{h0oSV* zK}Ar~O0;vrv_6I-2GwG_wAi`^T(Zj;IMLLNgAA?ojq!|*=rTt88#WfSL_U(rUkM5u z_7ubVwo1OHkq}W@!BvxkbiyHg0JjBTAOSpCR^Cd9OO@4vAY-9GS)Kv=Sf5xWR{SNf7E-&dgL!Uwm#%2?uzY+YWj!Twn}w1m|S(vEosAT{Fi@ z9r=X{Z_o5o^l0AQXE!0g)6T3twDBTaD-nD#RYnqB-9$ zUtD-jl!p7{4qdD|GsD7J?}cla;MXqmsSv)ZoVHjxr*Znr_tko>NbP!>2_n1(`%3Xc zAc_(Cin5;;1TPt|wI$aaJP&yrF7LQhZ~$U;yUge==_V0{TA(d=NU)t=NXl%pR2IJU zl1VT?WVi#!0mR34ut$``uoQMr&frfuLe-V%QUSDK-ys7z5Vhb^-t=b>0D=;n9q;7m z&Ujl_-$&P`ABnqyrT*x#966%=LF2A4X`|w=)_5Q9h3ts!7>awC|w%~vr|1GsX zCa0q&peqLA$w<~j#ZPO)l3-N7k^b+>A74}NXL3Bd17mI?9ZL$$^+m+R!CN2t8Q)EN zIkV!sW~B7&UrvyZZU79&NQMX?_AM|2ZMw~C6mt);xVZ%|_!;@pe=ugy*DuuRN*4D? zj@KyG5%eH~)|zG8Fq!!;L8NElKq_;D%+g>S(I_nvNgj8162+I^4Lm34gC;}V@J zzH0bo5NRUkm$GRCHuH?h&EXO7cBdrxz$IYM`h6{-=eatdXrDBUET6<{efA zumlmFh|S_8Gg=q>IjE3zu+JTd|1Ks5kTSv!!Po+seWiUsj8rmzxZxZtxrWYNe$q5F z-lWfFVz^{PqH0{QEPxr|6&VIVH7&L1ewd}Nru_*hO0Nd}DDyZo{?oP86bkwJ{OWn)4%K@^}D{;eM5A~O1p|5kBw7^u}O>mGgq!B1I2i8p@k zDndaY+nc6%;iCIXY|mNqL;tYfq_(Hg>#w!q9#70FT*q$SzRRg_Yx{kBCHm78|KcaA zFkU<(x$Bco=hU;em#hO;`O7toOp~XHRP9X?Y#%IaoDLc5yARX;BSbPxR8%uXd-C1% z^|pTU09dBvF9jzG+Hhk@Nv=H0eLYvERNXv&6{qtd*2vuv4!h@uU|@W*A>R-cxmqZm z*IOj*=IuXnmzJ|g!adJfNLP%Zsxjv4j&{ScTVOk{u5+wrnMJ+fh^^6=*1PSodEa`U zcy+7@NWv+@%^#}0#Lak<5m(IZ*2qKi1d7zuUvjyMwe)I$nFJ*n_LmANqYzeGDQbN9-H(>6wUdnZVQaBsN5>z5xx-N+?j3b-1qPRd zA617%K;|Mrpp>B+fK;v;Tz zDYEF6YnB-W6acV9|K&F*?i;~?zV(xIhY)9$W#S{ki=n5soTRVxP;j0MaZ+AtI+{*5 zd@D_E%%!RUrq}+MrHL{F&~?FP62^bJdj6q5_w4#171w;fdJk=r(w@lmjdF>5S&YHr z<22L`v;yjB>ac8|c}y;`Al_yqpKq2d+$lxd@D7`M&7L8G8kfHC31wNj^3(fKZM|Gw zNyq!bdTz}ZwV5$cle&7EJ#|_q&Wn`t_u8T|_0w0m&gsH|u0!qV@s)58zAB5_JnoyZ z#yd*JCA+dFY4C8B{o>X2nUH?EglUb*ADwKaQuC^!N?K~l`c_XLXxb`f2*M41*1wR6 zcr%}R8s5m7&wX{&hq$HxlDU$y4N2hxWogi62hP6>zfu7mgfs4v+@+Ue^pTR3kH7#d z6++Jv{gDu2kvLv@>d02ElDiMACL0fN*4=;il$0n^Jz0hmD3dfBoJ&nTVk$TpEf7g3 zsBms$7XBBz#L%t$O9|fKVMDKgynm9%hq*}V$3-slt^YmzKuEO$QMmE^1T8fbqidUb zd*9=&*$!jfWzX77WUkDI4D6AJ3mYY^>ZDP>?e>1-iW32aO-V^tU^kO*;kC3ir-U=@ z;K3O2Y3UjaS(Umn=&nvm^{iB5Hdq=*xG`RMYGe2zukM%@BvIs@TtaMKS}9LC?bNbD zu|#pByyWPUdrQrk@q4nHmPAhXr*M3)ftBGncnrC+KZc-_Qt zu&Z4eBfkfO4B)J^Y>tFNxv>?uhrusoEmGBigedCN8^6#}5PP)t35YnCK&258GyHiz zd2c%tl#d0jvh$3mr)%895!G=TRf_l)3IIzj$lNfnRt_j8T*6(rSRTG)><-dzNy+XF z_nBg~I(iNOhGuP49fpXdVz;CqkDsC2PREQcl~(Db7Dd~4o0~nMahhmhE@G67(lo}i zXd}s^Nak`+!d+&=Dl$1QdE=|^t~9;rFbbj~=%vx#vgGI}sha%njZ{-_(H0wHNv2U7 zH58|z>UJ+P8^%Cd@FqCzH+4mI#uygv11DHMAFD~^VEe5;)Sj~jp$BjH7yJd7>AFK zqbkU~biNLK4Vi7-qx`JcfZO9|@bBW-A!fmUz3AyC(=HmcK$|h#EyK_zSq9_Lmy909 zmB5w%pe}#9I|vnRYR1lDz-|Gb@&WsR`8@Ds0{QQ0ug8ws8KyT!C-rrZXXeepOE0}t8`-to>NzegTL+Vfw+zpT)!;_01@ zUhxyZf2a(f>oA1yo#tQJMqPL=*W=9XX?l4Q?aG7)#3Y3+9?q3SAa*k-y6v3@iJwYC zaZbUiN(@3`Gd&~urP1-T4}_WQ7Ek&Lhv}ZZ3`OB>{iQDCuyp0UbQOLiPCA(Ekn2*9m+A*3@{uuUJQb4Fed`+3W~G`o1XYM5%)+v zYUwxolmFC*x+LiNRr_LhX~3Cqfx>GJ^?}whxcjrENkX; z+K0bJwndcRy`d$CxxGVj#ZhRKzy7TNH;yPRu2B4P8g3{~b`_jsumz*74$5{ptneJr z3Y?|ym-*d5?`Q=Tb?+~uPqB2W11C)ImSJjKq{KSgaAE+VbEAe52AcaLJ^lR*dCuj~ zW7gLG1lg~xaoJ2EW4uF3;=@3cYE|Zqv8U#h#-wyklnz8&!Gnf9x57;=xJz!HFK(EJ z1Ut}dLf6lX;8Lcg^?zqgq!;F}{xizPg<_ZTB5On_7(a0Mv1nl1mQ-AbvDb`{p(Zn0 zZ<%m$Wo@QEp*&c6Y6M4hLcUY}Os6E6U58bN!Su`>cVa-hToDsZQ?K`re3k+bC`tgh znAv~-PRY+OsgtK;?n<6EVGPDC#$jyr^xXGy zFlzu$k-t_*Y49$|Cudn)S}Z7Wl-AiWlcuQVUi{(Ow6an&S9YOE!3|>3c|<*iGe9R# z031g)beRDJ2r>ol_*KsIitO&5s>MySdOeJV1*m6{TJTYL)Phw*-_xdgcf<}Oq zie$H;7_H@+>`qX%`omxVL8_2t6*RiQVk-ZPnYkNhD@u;mb-`2mEIkMC=v*OlHzfL2 zSIdYaKhrH&P>N_$wB=BvZel8<6NsLvg)6S7TZx&}x&-}GvW_{mcMvA*M8wUgON^Cb zzE}P7_>aduL^aUZtS*>oMeYEi7G|Z({r6vj7t+}gp2AM^;!N^2I!71UVjJW8_nHW( zju%T9AIDB7Hn)v>j-CI{#61>*3`7I)>(i7nuX(b#;K-`pH*GD{kD0`e zcYmk`zOO_?SS`oVtDJb6U|eSObi@Y>`!XjC?oUYgl+;sARpq@epSc=NS2gl4SOvcx zcTzvUy^I(M7v*qUDP*UyD0em!(db|5;O#@lOgF3Fed9*7>yWCsp66SdcX#cHST$c< zBZ@e~A!@gTFK>9q`2|HQm}lC`X$S@X?ww89K0^P?jA-tnIc5gf*>l5n>gX_z9NN7K zOrBHq==}cYw^K%D!mi)S5(xRPxz5Z{%K$~Z%=jIJE)q z4}E#z8aE>E44-%t+fT0|M6b*8dkt*BPW$>n|1BA}Lz|G-%Y63duWc=8Gl&cfq_NId z^m5W-V(+^E3TGpu&v|`6-I|`Z7`gixm-00Mx%C-3oyVcj&~RDyOUhN(v}1Z&Y&#di z=LEpa63bZZwIae*jsGTplWTbq86eYt;s0-xba5@!oB7Rxk|n}HDymaX@6pTZ54cwE z6_;dMQKpi_sg85AQAIy;XKn|^-q+^YNj1WfBZ|=T4C59=h4&F->~j`FzR&Ab7Zb+NL0Y}#PVxy*3<1` zrI8eQ1exD^b%-NwFn8;gqeZ5+bLJ~WZfvPPbM73TLXzIzQOwLXf>nZ|#Mz6jWmD26 zeq*7wMJj>p(1CR<8H>xSy(Fj9A)>maitueRt7$!1P)-p%^CI67Yd15h^1qYLSp86K zWNuMhL2y^%`?#B$0$jWvcU@{n)?K}16bT3Pgz8NNomOEvf3EnA`Cqoax=Q-HyUi+^ z$S?W$NT8(jA+g?w;a0GyFINn4$%O2pXl>!D?qwx08py2~B7nuUjB>xo+%Cb7u*jCl zAW|qgk@aoc=d-Rf=vYu%z6TevIywqar7-*N+a6P*nW?COBtuI=bfEThQbc&1(mdzN znp_e`O?C2--ZG)TIbj4=tC$#uqwf zsuFOi&TgtF)74lzx5H=pnqD>T&W2m7AM^~;e{a1ld!eqJ!&RX@%R!{F{iW_9kWNaH zQ^K}q6n|1in(A5GrKy*%;aDoSX*8uPbL2iI=_F1%g{DN6)C!U|-OT}M7*`*>{ShCj z#Jgba9w>2Y51sRHjg&<*Vp)iw*1#OEBqxd@LYX&4P#{5Lm^oY%KttY)reV=@5MH!_ zU9xyHD;}FCHqJ(xWqGAP80*f#tp3 zQrj+HlGzS5Xxhz>mq~aMnq69-H7WZL@h)p{^?r7k(_NY|HxZQO2YWD4$)`^qvOoV0 z5m(h1t!!9-0GSdUTT60i3X8B>K5iY;q1!gEa1*x5;Na}F-^s2_b3k%?gcc<&@TF<& zO|aVDU}=OoYWIb!vI2Tv3MU5pyOucSKc0x11%0GyrmMJb)O2r|_J&I{Iq+f}yq1!lEyt&GE0lE@zA$6y$5)XD-i$y;xCXEab$u zI{Kc15~d>%Dx3~+>~u<$hQ@@Js*x-<0z}39rSR5>ssQzuKZ)rigUw(tx0y2yO=N^m zN4v}NphJ>qP3mO#-au_OP`JemLxR!~!7`P|(I@`j=B92t+&z-6) z=MWqqqHn1o@VWQ-C(>UNX{t`Lx}xc6KSdATiu5;keK#;VNTcd zy7O=oK7HP=8t5uE?-xqZ*cQ?&Z=kdUn6w+xm{uXu{HYbTzs-nn^XL42GX3&Zjn7w% zEWbJ3bpWQxP}k5aC*imKW~<9n2bN6NI{H|6sc5(;Kdr$#R9N!s0*>h5{&$Gl_PgOC zL#fu}6A`Of3HT55K}WSS?eWkjg3z6H`i8ogc?y(ymHQ@k<7oC$A$l}{eJOCuq}7B) z*7bg}>}|r>e=@iarLV2GqVFA%I?i6{?40ODvu^6eXy`QtiCPu{Lu4bZ9y9RL@xlb@ z{)-B3GB@}foth}Tn>^M~M>IDQtKv)cOU5GMq^2g8CDWhS9LVk0#)cEY4XFS&?hGG6 zYkmdTPCFi`_6Gp`kttC4@!NzSh%P*Bti_+4tv8RjVdbg-K49Qu0CVp_F))rqw221AxJ~nR zAIN)iF)uEySkc(-olbh^Hog8(aua#C#wVbEo!+e^=8B?OFLi8sb3^7Sf{&EqO#g}> zYX=3W017HRYY;Ka69;o(Q;TEf1}Z3Is8NeTN8~o(4ln==Vl7Zg)Oa^^&)%|P7%|*w z)6&5zzqV6CR}xvD=a|gF3}qBFqfcCcUfdIYOGf`cH<@v5Bv#AZfa9ktJifcp8V1Hygs;R!qL>1>`mU58fsh|D@OwwfDwcp0{9Y%Tw9zVOcPuD`nD zkf>Vs#g=wtOOoBuXAN+ct)eL3{YNOwn;19xwuE}}o|ftkt}OQV4A~03)i5#hcT?AN zuEGa<6t+DaCvKIE$Na|Sj1jrA@`3t8G&E5Pi4?Zr2@Q99!PA6qW&YHL4Zv_UQ>Dv92;`E0Yo9fijuioxxEz=vD6WRQQtgr|E{)gl z#xrVb$m=eyuERe+yK^~9S%A3S0ZG+ijgqc$en1x_>?!o;s;AUxOL8}AxJyx3@wxPQ zpy-NhY}tLR2ARE6I%3f5Bysb5L!!k3Twa!lT7*vv(0GX?q1Z{1UW(iBqXuhWGT)w? zKEl@SJFvzmphwKugeVscv=>n{)XTLgIAu_Y9<{;kgv-7O=&)ITvPa%qhD}2jwy6l~ zk?t!33uF#MtgoS+>Rg-ru|RsC5Jay`_v6MoU1DfFRerMi;R!rs< zmUOooqpip*qfj%QpcBg;4N5J!78WY)ekTcf2C+pJ#UTKTsTCCxyv;d=B{|7O*-g)( zc`>YH&GKrZ^`BM)ADi}aB(D_)nx_H$s$?rQw9&RPnz5Mu`e zGWU`ktNjWuda9Y2HO2H)wVXX2;KmIQU$%)0X6J8$M@>&3v!{OWzc-yIsyCm^bP8hm zoV-jD{E{l^ zK%*cnlymizKm^!_ViJ^=B`w#(F2Z*@xe22puv`cFjfl?|^T><*Z1CseKFRS)e zgi>JH^SX77>~K1`(gMLN55M8Mro1MJ3#ct44xl<4E99um{|Rj?fA8c-yTbti;x)6h zGU8)~98yj^*|pnsU*7Xtr~2=(K6wPeT#L|Jx$Sd#U)&HBwn!w66f0sKXGRS>^<=tM*_e_upJKGn-NxJU{*@@&=m&2x z#Dac8JQq;>|A>0as3_Yv?Dw8w=o-3l7&@h;8DeOVZegTb=~5iJyOHkh5EKNYL8L=M zT2e&92TJsKs7o!g&)p z1&aT$6#Cq+E|Glv@jI0fV4eY(`P`ozND%^yOf-~0y2VWKHyW=l@Ogp>R*2An0DV%R zT7wrF0DguMA@ncsZ4+i|(fcbS7yc{x#-*aXFX6oi$lwg*QKifmBj3Y^#d z|Me4cLX2wi|DsEjFyB1ZFW9sgfNai#F9uc;_mHQhZfS+lQ4%n}r82)QXtoBZt~}c1 z#oxy)Tt;v)7h~o*0JzGR|AA!RCLefD2~yQqIA~0%_X*>V#Q`Ya;n_awqke5qmJ(+X zeEgK*(CaA5baDN5t~n4T-)w8>UV05zwSAkP_s5fuB24xrjLLdSyiX_f)Cmnt6I5sD z?RSTFG=dgaX9XK+D)3<{v_^GHN?{vRAw9&jdZq1YQIOt|+R*N~)oJ^N;bO#0m{Tcz zOPSFS2WuNdaGEHerwRN^V_>Edka|f|apbpQo;!jQPE_Xt*6tmi^E+suXHTrUH1DJTc^Zb|H=QVoy zz>&7*oZKVDX`!vHZH3K(T=!OXzt(QYz6@+S8@bz#l7coc7LCmHwHcp&6 zMlY>kZcDsyQKbleI{NI5{#67PEl{<5$m_SwW$D}22-zZOlgecjJgOBjzm zaRt*$k`O=YcA=rW;c@X48W60fs}rS4g-$8_%0^O%MD2$b!e@xyQ7I}{`Yl4L(@GS* zSm}H_J0H!Jb2F+I1*)R02KiHVG_(}`1CT1b&wsX;y7ye*DT=Agn?eMyHP}EvSNIic zl+I0o8A53aIVF~CGS#u@VM;4BnP(nkl?4BBW2}CG?xyu7@r&-&&;IP^BZLLSGAyY|5qlO}> z>QosJ0gAJwekj(<$Y9jxg|}IxvJ9~*BQ~xpFNpGjqrCY_o&Q{zSJgHwEiZe18Vv`> zi~!V;GtY;Nm1mtq(^8^oNhzSp{0m6Dr5KW>YIRYe!qU*x9#oCKMZJZ%fB|HuWR%u8 zIns$`SBP4V!TGA*HkE~#I?2a24!^%Fp@#+zZ80#WpeuenPexrmCq*Y7gEUuZAy96I z&mZ%&S3h-suSC}IQfF>eL6t5VA9@B)?P6nSRp5I{jwANc4eVlx&@-Ej6SU*%=VPWL zB&m9Cze+OI?69R~Lk-^ov5&#+lJUvonK^wtVq4Q*UBXOY_Gy}81hIv6ygGY-B zcEUavNjMO?MXItBQoy&F*C5DYFhtk|`O~zTnhOt)DWXmJQ}pOKanO)Xt$a*zeN2=^ zRia8D<>Ykb!|wv6MOQ=N&>VIP0$}vnQocLOC>QzSg(|ya(L_@3m!O(I!sj?Tw$t3JM~KmsmoUi`jx6&M#jF35_q<_ zsY*EIGpza^U9Jf&Uen&Mg2@UC7tC9h+*y>pVaVR+`HEV`?TYhC3g^5O^u?aJ^sbA> z0L({EWXveZrlXQshCflID}uT+LF7j~9SkkuEi%>G-!n~H7w5qD#e8g^OZF>2&<}IA zqs3q}b!!*RPDuK(a9~F+IOuAQ`O^`Fj^9tSl&08`^K0oVHJ**)e;0b+(a!>G@IMM3 zb=R3K?4b^ zZTyxRJ`F%tH2}2*fN(g*7?XLzBnN_$;S@U@2nrXmAhC&%$nxex;Z9HP3~J&SREs(W z6D!s{%GAP>L`3l5wiM4jNLPopoBi#fBdfqpjTc6CFa>f;N;>>mW>HOGVl4b#cop+7 zjAZ=ej}r!2Yxufmz7v}q1+Qz6Y+Z4wsHrC@>!{zX9Y1lO;VB~!s!-I>XPD(NCLHQ1 zw^Zfh3mM^S+fA+#N#);DMmy}#t z$DB^FF|fGf-;Qed45rGpX?R?sFnSMKNrogqZ#(UMmVjUy>pnrO>Y$I=QET^4#}Vna zH*Q~_e2lvk%9U_=lFf*w`*AKIl6~Z{$pWgJ%NEx$(34HP!!|~ZITX^-5(Cq6)4#az zf4U-Crs8;crZD!MIg&{51`X~ZAo;mFDhrCNX zj|xv3clt``YZY=TBaQf_+BoXOcZIB|IYkCc(5zVNjU{<2b~oNvhT))R_fGhFNC8C1 zHvr&p^Lh7xu~D*px=#)GXkS|^oRcdl$vVIuYT21#28ZOds!WexulDZzT)%iEZi~B3 zfRUJuUA44_5!zyb?E_!*Zqo<7Ch!fYn>jlMO~zR)cYhc#fjZ z8oYjdz*B(6$C!v|aK(=~+X!W5R?Jk+Hx{FlYT44)c=uD%zH5KHpCOv!Q|H?mSJ8F< zsb~}rKR2^pAsB$ED85ZHwFe*ibYWwG>P%8`AQQZ@c2Ahiq4r9oDTfhl^oJwP&waJb zkO*%P=l4XKW_G{raf2JgK%^f=imWZmmuGCh5a4K}q8dacw$NI(H0IcvmQK6xV$=1~ z5Z)CFBHkD1p}3$uD`RRBtG>LlFMmZgU;QxXS7-hy<0Ctn@Y$7*jUyyX-nsvGeBJj3 zx_)VZmT{GY7K%nHyxKQp(W~K+n)1v6K|wPnu^4%zb{%%5z zkk1oq*R_^J*!s%FC*`$QFi+UaZ;Lt^&D!;pV*yRwUIy1;<}}%t;)|B*-0}5D&nmxI zo9SyxstHvg8@*kE1VaMrw~;Ij)osoP= ze_17*9;$5;H||7=k741dA#X4*TXa?Ve_BQ=;s|HII!Yy`+C?7niAgz|m@6+Ye&m@j zXhRZoZd_gI)q&NKRM@{uABXrPR`e^@6jQ~LMWSP7QUzhLr{)8Z%GfI)7{xZX(MoJf zzXwQ}!nprk@wn@f{b1ZTSqGeVB?_c!BxNg9IS4^7a>H-z9d;Ge(v{pw5@C!6kwA_m zN42_|5hc>srDRS&L%pTZRJC#@CAaaXPFjXYSg^(Mk>sgu*w?4bE1-^sL>h||PAwRN z{pR=YZ=84_0cAce93on@N#@UA_oM)Gd_igW`k!}vw@0>`b*pBl8L!eJP5BD@gcs@` zJSOHd)3L+U+Si!IqF>_!g8I3S3cM4l%^Sc1ZKyu9`c{X+aiqtgihDM_Ly~oD(cga$ z;__zQAJMJ=JTPW?ONJqI6x&C_mjT9;Sy`PBAPp6O2oVB|tmHMhHUHX^5Z--y~@vThy{) zua3cPd=ax`6yW|=(E>{#fLs~jMh4XUnk&riLW7HW*j7+wcEYE6SVZ>0)ADj7KS(%% z&Ac=2qybp#sdL%ihLxIka%_;^wYVRc3VdrR(gWiq$q$`qUw?Z}OLlDZi48O!JD&@& zs{o@Ix`!IOy5)1{yA!VuK17ZXq^#zAFvgSAfw`rtwe>+9bE6u0v}3Mse6kvo#67yE zL~smEurzRbZALQV^6t1N`KELnE41Ch``_8xk<>#xRjJ`HpE5nMG~o*6v1NH76GR_Y z^?Y0#_n_>crN&NsUw~KUGXkJdVk z>o$E9sa*9_pg-xTKAid5(+i;hFXogE=_hS35(3eEfd9>{s_r*8n7UJtRFo=nFiM4V zf!V6#KZay|pWMFbYtL1#ydMLx9^(MMtKm*$5)L;GfXEKTBIbIol%huK$`C0goW&Lz zcCFgC)A^Yiz=8}k6HprusSuvTpehYDMAgOr&P-z53Wagn8#D~|S~979#%{@twq{D# z$`2SN>hLxeGyAjVA)k-p>a&hEKYzonRZQe#VuVZYMNztoTqE zU{t4sgb^5if_Bks@1bA33?z4Y+Ps%%qfWn;9_m38>q3sjK@RozJW?Phc+xXAx>UIh zU))n^oDp!9>UfVcpd~_vcj&+oUF}?LuX8c{HmDqcL(Z6jjgRgCqk(E_)H06kNBP>Kvr>357#)|pfr{>pJw~ld3#4P~o+kc{`!7n=ACpjc|8e6*DClz; zSi7-N)t%~=Ar8n$ut0WUmd|*?2jB4ihDZc0nLN^T+AVoTluZ+nr=%?VO$j@vdxeTr zt$_=?LykpTJeFs2di*$Dz{5q`QkXaLrIZL%6;YCCTwH+|45OY&G#wm|%C~bU#Kw{p z6Ri~fVLAIEZkRU5QnxXRPOC8&>+D9j^0Aq#4c0nW&8_jgQx;v5CQl6yjXADfEae@krUY|fX5p)!VDvFpZwajMX zuD#FBm1jppbHtjw3t{8_5*Hd8j8YFQ!cE)j7A1eFb$Lf0C{xKuva`FEs&l6=gA+9`R)5xRA$IJqj zBcjAGFET^8^{QEDqmZ=<>up9-HzIuXBGPg3TGeuir z+M#&CA(lP-xWXij|DC#+`K2xk+q~ch6H9K8$l|rmO3w2`4?d_E{ZIYsGeb5f!|0IL zjjUO7u9v#^!q{xS8|VGtYv3sbL`xHoMMq1&k5PoEK`)PEMg)r)=D6o9yFqYwVPKoH z{cr1c!FcUrS%r&=lCaqc@Cg?6V&lD3R;YJAzrY1*{^=8hW#@wk3um~S{5zS?pAaN_ zL_;GXAwT-QAkeDeLNxF6=ZJgkbip`-Ps7CVE*k+-2`DwQ+Eah7O#npKL^_84vGaW; z76||OiRL325__BqTLW4@Nu{S8k4lL1J)%?w6@~-iar-BQZk$~#vDp;&=-V6G92dbxq^jPS=z~SlYV+d_yn@pZRl2)`sonHzT?t2 zqtGj$WUVbG$l!n*ik3+~Qk_VpxAQ$*k)j{?rFXWjwfs%Mp@!0hrtqthW4$e=1{%!J zXSZkol{bKQC9K;uiV-3v$DG47l)DaIwHw|AQUzKnb={o=w3)|W*~si#1#7zMg`J97 zc7CiO4IDfrtcqWTu?TxAz0WtuZi>qtQr@YIkE(3WnrU%>1y97sdymH_)7$dO;XIj1 z(jZPM%uQ8-7e2ZLA&61;{aARn7BV@fD=z|HEC-`$3Xejg4mJyZhZ=0*0R8=8#G*Cy zUTeT>r&ok&RQ5S#vgJVXj%9Hr}sj zIAF@7qM)3KQ(W*0)UFdQ28_pl>(no6dyY?hEAa*-j$6;63$#WERqiUM z+=RJnD2TFgulAVSV68Yn>HE`D-?eTR57mV1SR0a-oxcocEv-KKw_p>Uu&V2+985jN zl6JV~ZhcCS8^5%rYB8iGMdl%|_R<9}Rp-SF-r+#$D}d&^DdE=w$ibZsw*TT1t-^1x zncS~(sbj+@&6va%a(G>97Wptxuh=aHgESFoHt80E zWSIC`t^kP`BG&=2&`WzY2Hsg%g@PSdjSQTp;kdZUl*iPjl70U};be%wiZAEhM+Zy3 z$I#-*iP9hiV8}yT6zw4&_h?cqw;+M*S4kCjnSPpVtzeFK;J|A? zCc4!6krv4BuVt5iq;68HqvpP7`_W$4(oSh)lo-BeaM0Ig-SF7z|72h9{*yg)2HFHS zi~$=mBWtDvzGBDwx^}=5A+1V{P)7|v05+SqeJ|=ULlKgU8^QT0ag)CarLN}pSYA` z<_F+6mGGY;Cxun2e!bUwIphFNfHqAh#j?uzM0 zr@OeKjcxe_|8q1nLJ}@cw~w`wZ%bT^4;xXO4BLlpcrUj|GUnvRMHm;X_f9ylSF&jF z3b)9c^e*~1qlb-&Y!0zQbe)FFbuzK~L;5JCtJY}+(>7bvv`EpeM6SS-kpZ{iL_+ym z9@EmXj+X`1*%SEdzopVI8_Ml3D-(91mN81Z{QteI6){Uj;=)9MU*;(A$Od;Kp?r2byR9Pzw}Ezf=xP4eYSc> z47L7D>s9=X8bn5mzeLDKC9*n^XF^>DX0RYtWiC=Vk!4c(6}MTkf_%y!+$kY*P{Z5> zF*Fo|*On=CiwY6M-c`il{_L8Rxs=`_z?Qp7k#dDmnY2=X0G#e`HwDzLOg2*$N z@FeN`ux*M0&~99yuQvS;*PJ&KG9Ixamm5D5Xr4ldG9~4HFF(`N5S5v2BPu6Q;99XR&rb z&LJuP*jQRr(rINUg}+PZpQc|5y*)C2meNSM;5(hy+8*6+(@-v5;bAf*+}5&xEzYm; zwCbEYd&0df49g;oyn+%2%FyT*DSl;IUMyRIQ=|8ec#!{xk1uy5zoN^)2e-73t9&=Jd1m}8YxfgkZ z6x_i*xfRuJZ=pTm{OSA4xm2)*cxVrCTEPF2O5(E?#sB2(ZA3kK?owi};P7NM7XtSX zEENK{UDc70e!&WA|K3s^3uz+;k+zDu(bwMD-Hmy3BEm8FtKE7MR{wqY(0K7nO<1Kk z;>+j!&@ks6dX^pE29|PnGYyWDK_xz{`g;a`CvH^^SNNzi9)6@vIoMMzjq{}+vVf%a z>vXJx@+427ldpU(#lhIE;kaSa?oK^fJS2j+lpk_7-*#}MM*!QP*Qj+baBt|JLTuuMJ;VxFI~RBBY=|z2oY5c*b(R0 zHl#*eEPX8>aezcEE%DgYR75EobSXZ1s06KQ*^-P-j9Ca_PmQSrDAvP?)l7U9&FgSTp){}kZK_k&;m17M1Kd5I&&|v$`Xwu zD0%pAo#J7g>`2-cSmvii8;A857IiTSb99+HV00tRU+ndLt!IY85gAwHW}{LY_WX!A zH9@O$qGF1j`=m{*hN!q~Dnz81dJ1)th>rf0SfsHU{k!&UA;D@?i>v%Ov$Ss?Yd)S+ z%GIB;1{A+I{{#k>oL6#uhJV)Dwi6?gRR5!5G?2iC8Jdgd%$Pk_Zoi z_mkef;lA~e3tvSwt=4$PfWG#;E^k&=EgVhTK#b0gHScf4{g-#fzNiU{+A=2ZXj&2L z3CdIu&9NH<%zw)zrCVVV95}2)M~nAbTw?CXA>D8e5(m=oq!lDCA z@Fc#9lX1CNqVeaaFwj{TjE?``-(0?^7F$`GRhi$x{LH;H5IOLTibl zI82n4tEUUL(is0@^P5QiGojZHmJ2Q{#81K&mJIckW{G*SR7Ng@!nlvd+fL!ibGf&U zqd*6`*$|(C&d^YTQWvR`-bD-|Dcq{nnN9H#CNU+@FX*6*Mk9%G<3Z4& z4u5ViRLQ&s4k`;ODC1C*nDni_#LPTby&GgUj9uFGM(iTztE7vo@a2( z{cc)PH6qr~S#fGkJBk*6s@=3qT_oTG|66_P^S;Yp-tN;$vkrgkdxVS}7~d{+7FViG zh-Y$f@!~&+hGrEghqehhO>onJs;R?@Gu~_Q`q3eoQoS}X_UT4h{it-o4C9sTh|>(W zz|Uok#l_glYXpyE_8T?T>3C3zCtf2LX22r%t5gm zE{M@y6ghhNsBxSCQ%C(c2U-#nY0-YdYWm`6nMpxh>Z{X@#rruRzc;()XNKzqBM%b| zX=%9PAit;}DrNzw*#m^Z5@HB6=FQKbN6dwOAS*?CEn}6~s3F9A=w4qcvH~$jD{%tx zzVK37PzkNwDjr3*2tWk>|8x@6|J6y5n4J{4mrO?g;Pnuts-bCa^-zGZiX@q%Y%rfJ zj6mYr7pL8f^8&~*Z(&WO(=Rzh6v*i`Ma4ogCYe zX~igNhZy!q&$Bz>&EUFB2XL;HWlj#O9 zg7X$AsZ1LD^pzJUxdO1+`dZ($&Y^lJVtI#W7LV+u=(oc_1|x9irPJmN8Ry4^J9smG zb4OWOVxBZJpDC-!w|#T+eKvnkYNb~gL;8u14-;XOvrad(H!&56Uut({Mvb>%p?YlSlcm5*@*;whh0)K_)lEhjdYK^P~{~3=D7bt$1z` zs=YA_rS}9C+2xQB*3OV6CN}n1oVyL(t0`3F)0dCg*DLBZ;w@z;A($iVTmIVNm$Xqg z$z?K^6Wh=!zCi596=*nhE_*SKw*1hgt#+o4Byp7ivep-!31mXN)0}3|>Kdj& z%SX8f1+UhZ_Zfyjebt!*@Az?l9kYZNge%U6O~yB>r-2Es3PPEu=6dtEBVKo8*PX)a zGoh?FUi1ot%AWicNwE{F)Yy^l%|8sjT03q8l$Kw8wv<&l{d@B-W9?(ny|&N(X@8yEn~{}C6P zkHU&4?Z|EVOBvOhdVwCQD#fh=wH3^*ta(JPu_pYkdA(?M;RIgy;>j?mZi$CDNmq?w zC-r;ZPcpm~g+ZQ#Emsim%Awn^IZU48fm~CPxZ)o+N3uK`6QMxx-#@%5-$ic zt@v0H)P81do@_&Qo>6I?Vjvg%`uo;k>{kL*&0o+`pDd*$FC?TZ!@H*c02X^ta1ma> zJJ%VzBlD0RpK_0my0}&?Pc!Y_k-^Qrr zC&ThuYOUXb06Cy+A({?_^HcB%N#DjZVKwZr=RBM*u=q!a{9Lm5 zXfqd)>9~%GHJ-mdJ90RGI*x?_5G6xpP#PFHVfxLz=2@mVNfx(p!~g~S%}ft{Z5G6| z3v{orZe!Q*?QNu)|9M4qZK%xdCfM_Pen`CD*OSd`RBo7tn)bEJnY{^ z_Q4iv-2YjySuNHek)>AHrN!o3%SAmib1u>!_`eK)pSrkb%g$R`mQwfHj0w$p2}}7s z5fM!5Pk9E_uyClU<;B*-U+Z870Xg_gHJ0c}o&_*ZUFC9b!dD-K41Yf`rMAu#LPYC} zm&rN3(^qPvM0&xph}zlbs=<>|c9$k@O2%Ny^-53auPu3MYO$va5PcRqhFKv335_js zBK*o+@2!m>w}p~>OhTpUkAzS&&&FJxaOMbci>l$8sw?Mqe%a=4Wxh-rzF#Tu~0(Q;v|uNTr#U`x@}F@EowVm zXx;L?%!UT_%tq?^ZjYqZR5(_6M2k0BCu7GJw_?Rew!5}`%CBcy2*_8 zzE1IGPUnPO^HfjF%5?UJMG2#6wV1lI=$z(jlPb|hPnm_s#t$8gf>p`ht;yur{^th$c4_B;*44A+#I} z5YZA{gQ*XAwuyK(1iOaw-7df;^2^*c(>~&fWdnpjhO#WC9>H1%#vPHg z#i6)6Ro6X#*R3DEvO9(YXu!^;rEQVcwp#D|k|~xk`5Ub|QeCsh=_DRQkg#R8zV=f7 zO$oQPe@p!U^aSwDg3J4{|3OODvF%OLgIM^X1a| zqnzYc)!fO3{KRYJrL*M-uaCmlVvegz+N*6*pKG2>`oB)2wrJi-K|XD#&wAhm5^U7P z7>9puN<8{pJDx)5>K#&V@EYAokWON*xJ7|g$v`DH(xxwSerd<#IL$y~J2uIBy(@8N zZq9vI5FQY>@$uv0t(+QvuaY7IY=2n@m*8%1*%SY5Q#d>%Qfm;%l$f@4*KU?XVy^ zZq`o^ufNO7(teQYT_ssNWtdF(^5NC~g5}}t{5zca&V2qQleG-fRof`(3I)r0*o0H! z+;ilOoMPIQ+-P#sdx`ySQvvA23*7?Q1gt@~AgRh)s@`#6{B)to%tT}+_HY^pu4Me^ zPN3$gZB6xbtjJm}Ia-k?6pwpuu8fVjn2bPYUHoc>0w0)Q>&pjdA>~2buA1S{dfBN! zH@I%qVkUK_pTD~#rQ?n^Tgt#TWzo!%c|ah#R3EkqPT8+1iwT<36oaruxcf_EtkuS; z#<#Sp0<6L2n^Qt{y0uTfZKO>c8hmFiib%2p~W=W)K--FOePy zi!b9sU^pO5Metkt`1U6$ycYQ1SlDYbHPM+|dzYJDhbl@!H(t}~$|B5J@d_W%edO&o z-4a>DWm9WN2v-N7kwn1Q92D5FUGpB^uuXKj@yBrATWI^v%gLpQKc3U$*^owAlOfL&!{EUVTQY^>c3GxWiZZhqEld9{+a?7g z#cvYAJi*i_)0HYe@S|D;zQY?ld$r7Xpn-DrG_)YNr+HW98XQn3`y_~`zgbrIw(_XN z(le>@84*NeMiBk#ngq>W+B2b8Sgf^hY*W*i?Z&NVYbUu-$?=*U;vo9Uww zFe*B%eYitzE(^I6p|*QA2pDjCDj*OeB=({XE#x*MZ=f~Rvb6ansjQLAo%}Gs9b|C3 zJu=$<>HOJ>UbIwR;q4N~^rXQ?=nU=G&?x2gxc2}6&dja3vL%>4zGY$HJ zY&EwUG}XCT(s4214HZxtBM-~#X`g2+830|NE@sLKV|)VM0Wq!2To{>~uy|5o;}GJ~BPyjIgjRt~+h)>1{U@25Wo1IbJVhxZuJ{7hOUzZP2!c>X4~=r8?oKCCF_K z0Ilj$czro*T4I|2O`K%lcD)as>NRi+DN8HXr+Y8_x}=ilV9^Z;eMZckS{0S+mL zKzNEIZ$8*SY2SRWc8-CK^SoxkK;y~!m5hjCAab?jaVSqd3ZiG!kSzqSw@sjL!Xal8 zMHBu}MWJL+2r!!Z{O7~XU*`=sUCh3STWqbMF~N(&3j7wdSZW_+Bt+~ubY=Xsz0624 zMvFxp^YTQs_mzpz8>MOxj&CpIL(p04ljCjQwP<)(mzp0}b|s!)ipL~YASi)^>g58> zT4nJf-|>jD&ou@o<5XD-b^6@UX5@#`yND`HR}jO{vHn7UTF#={{)AhzEv}cP&&Z3$ z(lvVpC%s*O=$%%CF>3;adV3;-j{uu$+XL^&?sF)Pfx^osVnO}*+BW#&bU!OuVcZU1 z#1uNh%v2ldgl9&Ok^;7oRkX!*aOVlrM9x-CdNUrkXoionP$xhS9A>j6;0#|W%e7eD zC}(oK*cG(%S-G0}OIb2Cnr0~R4;BUWuwYnOYjNj6q~VT*Wz8)Lq>ez>HwKpCecQWF zOoaX4G4AjfEU-3i8iL-e#jYQJ3zLjk-IG>Tm-RPzRTa{-w8gbL;_d5;S?*f6sz(HNj=GG>k?SX<|*8YT+L z6+P0-!w>2m^Gi@aQr)O?mYcaP*&;4@h3t9Nrmr{lSD&zIc5ByR<^Eb2BtWd#<&rLJ~3fV`S8C%Q)% z$fV1>wlM{BBW50d@=!4{68h#c&krv?gaE8N2{Xt%MsDZR>4G_uZ9JlMJS&vUWlB}5 zQ;cI;Dg8W?(DzRIv<6|XGfXIGO)TeDp(g)ONsM10E>EGM`T*zR()P)V}sk$nRpB{?Gkxb4IO0WY!s z_xcxBE$X_Ev7iJntHAy@&5xqATjtuC{iMJKU%sMicqb=>Fc;%)@+#~7j~wWaKeoMd z=%XGi=_nS}#883sLCpph?(MNpPCLI=+O#1~Ie^Y)zdLc0tlAs%VJ(F+>d?@MM zU2(Q#0;0nzN70A-S}ON=*0TzfCPtvg6^1febTL{ZQeDYBqos9jH>Bh~bfR>$CBY9z z#fcfld{AqMtcd0o8)9Dy)|x{+#`c)7QvVzVjx4|Dy3){zRh}&=9=v-QDNGtQaK)tx zjTTtT@7N)p$61}JzJ!U9j=OE@wp#a28{u&kosm0Zkq2r)hPh%X$ZLIEh_N2lK zk{NPxtM$J2LwIYcI3`x~7hTy`=~=Gtz;CN!#QfgnElNjcM`z(*I0^rNG@I&CHH4KK z=?#^D@KG-#9rS4ZQNhH)`1zTC#bqO$wLfhQYjn^U=|cI-SgGCXQ+>L>h$%*a!u%+A zzq6B=6VF@}Bc2~R*-7#Pdm2buE@*F17MVfYb=bZ1|MKIhER~IHl9yMJ08BW*HCZ$CfcrV9P ze;GH*urm7d93}m-^VZS)kkSyiiU9f-0_PtB{X>HpJal(a#2_GOzy?vf(61{om-=ae zItkRFAQ0Y)O`%?XMN+O%iAc}gK{lu?8YG}N7f@lz{kYCY5Z7LXqjaiy} zmySSQ^(+&Q-nj-)H-{Cp5x=)YB>Z^%`{7GoQh z!VHez#Ij=_|7`2z5=l3%ks$8BgF1aBUJ#bnRHz5LlD8bYWD2{)W60vzl2bLs<$kL1 zv|``+Hy>uEN0;fIwiMAc^vCQ6o!8wRcK#f~++0B&*PE~7A|AE_1|?52t=zqd&SDRq zdW!D+#RBjmT^zIn4XG7F@PQP5>AHD;C!_MODQO#+7l>ON9~rRu{w6-|(OAhtv>^l$ z`&M+~Y1{V-vQLRD#h)%CN~{`>Mdv56rPITmgaY;y^-d|XG4>Yv@iACtWvj29{<0ok zv5h$$pPO<+4A<9<=VoX9^xWQ`b#Niiw}vtOd-gRdEHry&tFc&opMD)z#|kZ>+6Wp& zCAO^=FKx+)meqYG>3<29Cr8N{Sf^VJl`a`eaY~JKvYFS@Vh#Dwh(6<~2&t$>b|zFNrkha7jdA7Nd3{2 zPBHdj&o9QRrio!<^au+oHFBT7CFs^c5D+$Fx!?0Q?baTr#|R_=D9gq7FtO;{hv#u$ zv+Ys_S!Hb91C6L0pP!AOC?gO&QM@|T$5;>(2USfL_#pfxa{hh&N{&uR#cpWhFJ;G9 z+S?t4ikaICk$;x;fCzm;ar3IeBpC+PhJT5N>E07p8An+4871@xtk|^hNS;^ESY4y3 zYHDv(Mh~ItmocT4p7z|F;ii#zXiBO1Q=xcFpak(M&1Xi#4={Nc+5mqki&M_YM zxhy9Kxl$fvr*!)b0Lsk?yO4N)=$EZ~@1~K|Ea&D|^8H~05GpWxXb*iaf~zljE>i)M zgaUQ`JCv9aj-wrMFfn7h>*rPT?bm!jr*&8fKF0|u;HDVwh;QRai4p6 ztdl~YYv31agPE3pO^{(-XUy_a8#ElDK55)+2No^tRHSCMhV&1!4e_jeGW+9F>%Asg z;7eF;m7Bg}^Or)qpgjmXw4LS(_bf3Q2$@ihi$oB^%6oTEP->R#t-BjYq13;B; zhGj|=`f-k$P)uIkmXqf1O2w&C5kXkt){R72MM}-Hs1W~euDxtZcaYySQEpn8v4}mU ztv8qrZ`FbS>bqL)$Gk;;)ALq(|3DpU?o4&7mGbb(=FYlU9sL$Laid60?#a03J`*?# zk9BsnQQ4$kMqOz;^o!XOLXqef3#{Ifx|B5c)P6f-NYJg%4`K{ditwp(NS@WN3i787 zo3aw+xKb^5L7>vLFrQ|be!3d?!bNmTgy3+q-%MK7rXU{NWKksEV##>!Ql`Q`ih|fOitG=fjV%B)#awixb(6wsh)*PO~Ai8e=B#5VrQ=4Z8nEf^J^M<_55z~ z9W_JW{SlLPNNrg%J|*n#);0u0ReVQ8>MaFUNl#c89?7~?pJm8u+*qTzMv5`sK8TN| zCTk2K#a#UdvMR+)2bYX_yI&|v{(V7Rg~Q7DDwj2f;3s$W$th9`cjMul=cK?Z#UqFE zyt7Q~2N8nW)Tt~@dSYwzx>t^mE;*EOlB=Q|>Z*Q{h-^4iZTNU~VY>F>MccDmO@ldOuK8Y3CZ$6|w&kYQd(cvivf5P)7v}X+*|$%c;oYJ6TtJ zRknO1j@!9U*euBbaRECVmnS=11e^wR^d{Nwj!}oHq?dG7_C)j7x3@(V=y#DS8|lw% zU=vb}JjHar8NZw}`w!Wad$<~)$s03v4a{tgyJdNv7 z$ip}Bj^|l4I%Lm9vX;T96Kza_w4`l2zMl%+b>>;{x{yD66CM&S`6n3+xbaMK?E2#e zj$@yRnDwZiPmZyZwv$39hd(%pz6pn`y+h=IYg-}5~G&;Ql77khKv_jP^0 z*E#2Vjz8ti#5ZYFKu54Y_TII~nMx~P)4^w#8@KFm`EH(oF32&2+iAG}YbfUZ(fWMO zH%znu2A12DT{w#|bzZ6I+`8}1K#BniB{`qG`twzSP`KXT_U7k@ugoEO*$r{+xX(W@ zK$QU%7??3o<}7ZeRX83u zR^}AZ_WfnWMQ6}pMv2^B5?YFyb)QH;R>A!NT_fsevSsLF_|3JBWy<Ay)j|tkVB>cOxAS7x=_`T&b z5y>oPWgT+rC(QJUIdeys7R*TsutpD7;dE!gK+Swp{DnV*V3z2S3}5Y^8pHGDE3)Hx zZb5|a{a3c7C(ePaa>qmr`~Hw&ZtH>XXi5CTNe4M?PB_OW(lhQRkP;|*%=!Gnn_H+v zTl?X)dF+cA*Kd}4KmDQqeDhXXYD1a=AD5o}F1`QbN6vBBTzccbucW_c%znb{sTu6Y z+r^)LeCTWdI#kci8GBn&)9Zw~4oS~?&j1@# z?ZWA5@mas{W0=D2r=P_7qONQrKsULuB+3xmCp196?Euwz-@Q_`f5xdd&5jHFU(|+v zeZjg%>gLIxNlRIV+Gu(m>fgY+fM6|hZU9R-Ng8>`*(@YPqp1|o68aXHPM;(BX4DzF z?_uzE<{H&BsgFAR%y;P3zv}-1AW)6}3qaf@wwC=QM`PE_h)Re&ZG9cAtHBr$NC$&%QdTewc<_V^HkUzLdg{rb4S%o#f$tm4 zytXLyeI?Ha8JO;&;9P~=&%?!8V)ADN$A!VgQH@O}sXGy#T`;nH`f0H`(X>_4QK6WK zc%Uj*CLp+;l3TWKey{j7l&zCtFEIfUY*eb6xZz5=%|LKeBe$C@Nn_PQmCMAP8Rw;uY91D4 zAwXdQbUCTMrUc3b1>zp^tx-2H4-JuX;AX*%#$60e1VMm0SJBcI!)0b-2Cr`lh>-i3 z(HPBvY_~#i`+Iu3^6P<$bVO^wb-5c>b@sXw;8p6qI#Yp+y+=5$GTg;&)4{;m=y5Zs z7`KvWZM_EPax_Cs@^^))3WQ2)#8PQT-i(}wCuS;^V*J6{)on*M1mo@? zzWFw1e{KAQak@>HIwgmB4DYOm15#g;`_Llf^wOo1|wf<;J{>HSWrQuITIEA&K9QA`iUH^v}Um7~ua;7t1)=;C>c z$=xAOaV|I2RfaVIKs{f7{;*FRNH`GDU#8#LOf$1H()oa*7V=aF7u=T~zUR0#XBbtGb>1%HiEphI+a5%tt;wR+_g=`^(r>z%L4t`=^ z^Tw*<f`@U0@`g+pNB-+nmtsepB0@Orw2O+#lk&*fmddRkV0SwyI(&RXB{D7lfdsX`}@dx1=QK6HeE;=_dvg< zqJEZl`4Fu{0e$XNa5%yk>r?R5=-n5($ohL?+W4`c^LZ;#I*?(@SVC3ISTriwM$|K< zuk}<2zY0S+g{2c2&~t;9(jV=}55d#@83OAK0`I!Ag>SIgTjU?RKEDz5_T;`q%R4SU z$Mr{Sndam`gn~w`b=Kq^4kn>hA*(yN$)B59kebxQPLP84N0VJZu?59us@!800A>D zW2xs>4PpP9%!~bejIWqV{+?3NTV+EH84tZ@Vj15VaV}hQs0PF*_61krvaglyQ!BOot_=u4wLc;cVoFXz(ydN!*`_0Qc3 z)n?^U3+;x{Z9TD_cN*g66at4o2A*oON*cZ;e@^@5Hju5LobywEDrMeUfl4u;d|Vwb z@rJCGwOSSRfN@%hA>XyvU8yv^-c0dcjeU;!*p#hDw102^Axsby5vyUzPb}D1^a=wsS(2^bPj^iHRMNFfRbqWkI9{8M#-*1u= zYqyr_m}RPZi3n15NScD1)GULHQ}Y*C$#P{$q3h`1o__19tX(P1g|GKJH=i>Aqru8* zv#wmX4>N@ysERczkHz6jwtlDx3ltJ$*f0!94G9=tPXuX{TFw(f zUq=ErL0`taH~WFV7`0Fy_e_^TFXQ)5y>=eQkpRFJ{!XuDFSfqkC$z|nFO@-*L8Ppi zD0hA*bVF?IxOr+yEiBlO94;hVxGgOFvzscwoy4=L9&~ zi;rw?ypjw%s%Y)W9gZlde(xNAdh>gw!Y_`-=`B=+Ri2QB`Gsnnar<)y@#tU*LG=zz zmO9D}$qEmMN6Ua)qS8Ak)KkI}8%LF-M#dN`(3*(Ulmv3c)uH(^yu&vyhH!#1Q=uLf zG`mJrut_uz$49uxL+6sNy%_PXSj|S(w0Gjj?X9Xe?uID>zOQ5Q#||L%Qf=HHi`B zpPzs-rFW+bqPNPfVautaPIcLDkSlDA6%Bj1bxS`0N0iL}4!BMD6_vjE@xBVfj(GyrAgAtkx}P0fBmcZtr767MP|kkoSTtd=NC-b}t1Csqo{Ltl17u zfooJw@N#I9_C&o#In3oCL%Rwop{|#)y4GZ|WiaD?4-PJOF5oB<56*95q8Fpgfy1TE z+PdA}&b6LS2~x}$hLF|Y>9CSB+^w^0V3ZdZl=|ErC@>_$iw}i3w7^a1{XR{j6-}(v z-3l~PO&sxewd&1Gg$qIjH4J^`6Gu1n_Q?zxrv}nBwXvfWW;l6X+`GamQiz|M6OdfK zZvb8aEU|7%q3)g{B1&@6vIhqd+YjE+zQ^uT7LqKFZRPa1-;gr6NmQ0ZQUiVxkzyh> z{=bx7w%t;arp8`FwhO7qedRtRP35qY-{|^@Ll{>nliUBu-Mi~dUIv5?reph&tTBUu z2o$hR1^~_!05m-;;v4eZ3oE}f!zKB`>pqvQq0pNRfZ{~c@L-=QSAh7ZCupWZ-Lk~t;v%`9*> zc)qmP<|j{P3t6&lW#Y!#Q&*s9tPkOzQVKB=`M}1@wjQu7V$zYdwBBX8 z7BwmW2YiHPi7Hh=zYiEB79V~y?|C&o{RsW4$BbFCu8d0XTQrh2BiW$KM@y?B67Rs) z-&zPxlTJZU%5TTrV6?FzNAdw`HR&j*uzT`q!YXQbZAJ2n$FnBZYU7&BI=4qi4u$|QcN1QV(X61e&T9hOAnS5Y zsU8)2jWLP&MP7CY7@!v6%@!F7`w`^_XdZDA4ZE5ps&&a|9_IynwhdI(NwA%T)f1y~ z5-YT-W)|3Te^CPBu6IXgGG$jxU2C{+#e#ss+~aZhVx7Jo8zuaKt6f~r8;%>YMRyk_ zAn7~96klIT=Df8pu$C1`d5h-JpO18Vv?=;5vb%#9+aJiqqrx>+Z3FN;e&IQ|Tn3G$ zT_kVn2N%|?s3}Dc#Jd!HLP^nE=2@3N5MCaNt}w-ZL)&tsG#)^`vzrRnQl=JyI5j0t*ds*QyHUBdu1XmW|#6?Rn$jAbbZ@le&ov_r5`yw9iXaTJ3WLOcrif0Hq;60h z3(&E-CkaKvH2{RBOc`H?DcNY*E^Kfg`t&-7Um76s=f^eW1vM%uL~{cEh;BvvmM_)k zK<|XI8GQzDtoJ~26MGSa8c1MiO|B9YvpN9uwr3RPRkmK4M-KraAly^p*$)8Z7bLfn zPUl9Od3KM~t}x#{+M0i2=`x)z4;$HS2@37h(QbE%#DL-Tr(5)KW*XIGoRYcfU_kXn z5o?4S+iZVjd?t|4T(H?3$u>1(JZ9jn+{D#xcn(p`Ew^W#o+9KnrEFbTVvID+BsH3% zohTI7tJ4!41Zf>4;WSVum}Z-y42FW)ieA;QJMcq(;FHyURAP-sX1j559ENPRms*~$ ztDCYyh$l*-b(D}oLUoG|!vs3G_AW&mm}263HWX##jvUO^u`kr95EQ|U=>UyEzaKR1 zLzdWLGYB=@_I&Mo;+f>9Do~bRrG4Ali_vjq<_9z>&QTmqY6!UieO?u*1E=9~mei2c zfSMQkt)C8&eGfY%eBNoGGzqWX@M7-O5jHiR%}t;3-*XFW)c7B}x!i9oIH zyIV;}?|RIQshJfCp`YXH396FJdN)f}|GR~2V45By zmxkSb?5%zLcIwW;Im!pE1EJW*mKdx6dOpd>e&;WQJcFn4N|A0~igE|4)`W{q>zKG; zHwQnQThM{31rExrTq3m_rUv{HXTpiv_(Zep#u%mijhZA$sWnQjf-*`zLPH&!k>xP> z4CvY_&_+^a)?g+s_o(_xBRTti*^*H*u*{4K%$ukh8;G0fu({!PZFxNCzh?xH1HjbL z1h7zME55Q&t-0z6cLoatruuLSQlkkRZRyDL#CK;3%E-iOefD1O)-vW*ztoD@DHV>& zY#2hrhNVbH%Od~Y9-T3gQDYp5$*`KtT4exI8-k>_4xD6X=U1#$HNkYPFU zCXrPI0g+h(lmM$cgoGCm|9<)ZRU)|6{{?BZh`T|0n#Ph{4~w?BD!9rtw<5wa53U@p z?1@3N5m%{Ny1J%1%9c}yr#fxvKDR0n60iI6R?<~|kaW*TfIstkwJIwtTNkTFY)X9* zyfj_3m;ACu-}`}AaF~%wg-pZB)9fMHHQTLm5I zx1ORGsTS@t=qnuZ`Bem{L=Q_FX>XQ1ieG$htCvgW_27=%+{>1E5t#DbCzZHl3%$z> zFX6n8@{0eMjynxFA5X=QGF2h}j9=IQkv*XQbe$cE1D2AuKTIhbWm5>ZQ-6cLdI_p9 zwIchYY_r+k-A^38Y;Iuoe<47{GJVX(L-TH_Ue3G z#tfdcRYWsFJliMCVd#~QMecpH_+0u-)aL=fJ-bw0!Hove*Pn2lmZt9!lwm;}r)qLe zEAH(6`pa_QVN7+5;n-BW(03cfTJD=Ft`qXE@%EG2A?qkppSlQL?h5vI*L#0ig8+r_ zl-Uca>6*P~_r0iHYp(joJuWp~6Lv$C>_hX3o#$4-yZVJIqE71P<(BlFkzp%@XeQ!F zkXSlSJv;8G0P9zFGX<|Yk8w!1Pvx0V&bxz%8k#w0C&CtlzRX#rd5uvNY$ht= zG~fJ!JXQm({)`@IR;YRHyB@82-p#3p>DB&-Mt^tuEz#xE57X7IzdnSlQAx^f#(UL? zV!XXaVhtIX^8otj+n#N@O`5W*AeV#+K9yi^k-=&<&b3eLPIRQqbfDxn5^6E5XX2s7 zU`i~~2zHX^{W$H$P@vJ*p>KZ`-j`1CHfm^~CvVk;1YI7SVd(*qNl^f+rYVWz-kh)% zdxJ=b@{iWAvaCOU_H}>+0U#)Mm7u%n@pcpdfW)yQxj?|^8PPRxb@GCD#^TWHvGJ_U z4YToXanG`mr}e~B3zc*FhmFY&1mHh6&C0ga7hv5M0{Kme9&6TK>MLrQ-EY`WY^-Sa zt<(BC^xr@!zg^1%wK6{24ye{p77%xiUst6oEy@1i^0?ixCgEtbyPjra=KH@5KyX|s z{i$a)#NWt;<+5bx}n6C;d(yb<=!!O1Y@N?nLSq-dyExr+}CnkL;Y@p0%1f? zKB}B7mNj4Hbga`<^prONlbwCLv)dJORE-im%@|kN4{UWallDmXG(g_v+L{+A&@fSF z44{ij?bcN`SA<0BxHD%_8klO=oU}>zo!_nQi3|!7V`s!0asIOhYY?RD3_~XL<6_YzE z6j09fDEMc50Sg--F!9`vhFS^fh^l~nHbIk3nVG(3=n#4jV6o$L4-IOksMJA&z#u6Z z@#QY=Md9{+)p1yWN_S-7wBivEp=sn(X4{dEFS)0}TE}>&_}AvWq>0Si-1jX>5d8xc zNnI5hBDPNA{dsHc+)EX0^ooPFS*>eh6YX^kvif($^`5o#XQfm699=Ne`M0%ZTs=zY zQ~&@|pU77WADbgcB)&VCdHl6zy;KVmlvKMuOIPM?PqSN+v2iEc7_Zcb<|BsfY>_4n z^KW~M!t2?r?k-rwyCtKmIxr0Rq&)L%6C-62MI#9$%WVFSjKA9}N1mC#BV>8Dle*JX*Df(gXL87Hkqlq_Yk23spH zoCV&AiXZ5C;yu!84lzZsh^CS5Y_x{1xg6Q6q%%a=ICUa{LCP3$i!XcSD)1u>hs&i}njbj`c8V(mPE4oNfJR=Dcfjz3st|C~7NZ3VU+{zpB^TpjEbI@6 ze$LwY-zl|jy^eA|k;L8HDJppOP4=E>k^qS(2?`v@Z>aNWYqyUzEeW)dB}nBXwknVl z3xWFS%0dCsJ`?x07Q4@nsL2P(!PM~oIypZO@b#EjjEN0HkEV#N_evFUj_`H3w++iL zBwk(KOf~PqyrsH3I)aTnF{jMnbG{4P>Ieh&#{ST^N2EaA^{0-h@{%T0c|Lrj${?Wl zczZ3)EEAS`?$xQ!LbAc}V=`}h>mMyyCj)T*tOyb9HeyUY`)lA;#Al%y|2`R4(~6J5 zOZwr>GAI=dO${}5(Z-6ff_$fZbeaqSVjL(Y(rNg@-7Wo-EuR#Sk|R-XT3eV4sY=Jt zA3H79*THinu5+RlLuq)?uB!CsH)#vLniw1T8)+jR$^L0(a9Zpa?J)YRT4C~3@C%yN7E=a zt<&h}ick$^bY}v5d;f0R)yHaq4v`#!5odSq)V|Iihc@q`Wyo`D}(w>BVb;owa zxgu)JvLXALp^&tyz7jNDA4!c!V=n@BR3xv68$VA#q8(YQ{thNilXc>$ z$!!aqogXgc?0ck|afkO4+^rRzA>M`C(#{AMY?R@;epH6eD`>Z%vGyOdM?&^O%&nYx zHvmrBzz#~MBhI{(k&uf3P=MmP*nh9J53#C1aO*xNpUcXKKTE?`N!RSNC^2FCbI<36 z*TlW9A)NPZiG6}a3{j#xVs4#U+#%h(r{?s;(^+U51i*PIfM=N$NhLkk=0v;Nwr;C~ za8jEm$-1(ojg_$_Q;gl1QA8eHOdB&4Q4`5OXr(4Ct1P^V+2s@ zXRTla)giZfk{avac+yI9Mue|0ut(nkZ0u`*Q~_jyvoI7O0ivnfr2M@gVdUPV7{p!2 z4DdKGkz_-4o~`lhK))V?UlgdfrWJ{6B``qB7MgJM*b$<95Jz&T9j4`L@}ArhLN|eT zH_Yb4tT4SD2^&YiqMZGbW1FX(pV4U_lE(_CizBF^xG=<-yDbR@m&^u9*P0_4fx&a~z z=&;rCwz;yLJK)$%@Fh7FfXt)LrrM3f@pKAs#$$xt;C#$mQ4;bco@A*%_OlR_x{Ve|(HL4eoXD1$bX|GE z*51(ToUIwO3!H%OrXjAEkU)b=H5c{(ISUOH~>_N-#EjnIQGVJ@aC#eI@`y&CrdMf?jt=R8QTukDfR~f zv^ryqCgj+*SJG=1E|QZtb-$fZ{p~ntX%rdN?puo3@{FIFuY~$viqS%$`ayhq4fEQ_ z@^7-;<-!n0>o|#w>?vJi@J1I+DGPwx9$cj&19;o{nq8^IuaQt#kaKVuhKYj!GmxJ* zfa9Icqw?<(n@1DZx_R-|T4n`>`{l}T;op|^wqF~j0^r*o9+HoW>xwLARHhOV7OE#% z+xCP3obNerO^|vlowpW&k{blvcKT79u;4wmq_DQs5%*~HNu?npAYY%}+_K+(A9*|a zfFV$6M`rz#6Q)lc);0AQi8rFzPo>U83;6hd*f2a2Q0FSwCM6^|Pg+v*{DFJ&mLY5I z>f>ddI@L!Z0)|4)e9PjRR@P4N-bHDgidhu7d6ln;N+W%A{~(vB`m*$BukOfJ4?_q(zi?{zUqJK*4?r)Xqri#HK%I^i0yHO%sCrUYVYZXv=;@x(P>|zF~Eejq_O@h zU5!bd4RRY-W z-1Z;Zx!i4LW4Rk%kp0jK#oFU)g7C){^gD>xKnF09#8W!Zm%0WtTF zH(^JR?1xBhY8=qfIzy5DbMZPrJyBr1jv8-w2G$c2*v1QaaQ~<$z_uU+3JD!V#C)D6 zDK=OHYK(mM^W`sYEeJBX{segmYXjHs?p``dPn^;0-pKGU=F@L>HCngsVT2f<@5(W5 z_8es9q_~&0phvEd*@IS&)J}3>CmkwB88gj(zPX?7q9+HD?ytJzFM;}?I2qhKfSm*T z92wDScZ|5B(IQ(X9?l)757>Kp&4;q8#4R!GncLnfS*1dS=Uyv+;R_U-MV7q2sc0v1 zzSQ7*7F6|TMEVL?lo0w)Luk5QPvD`xTP@MqrPGdI98GAU)uyrjCd*7S*%5~|+I!h8 z(!|V_vaOjvJ@%R8e{xp-{4eI9O{`-VUzL?PbnarTF;;e#W|mivhzYg!SAJKK#A%ff z;;%=s#si5xboGziSruzZQ%dK)zNNi`^M>9ni=(%=vx0o`tZdbXU!$4L^~o1bIacN6 z&E+ZdY6BXJ7X4DEEp&dd46l$pqz~jO<0C2}ode9ehi(qsANdC9kG&vkofQO0Gj^*d z-yJ1&cMv0UiZh7~&gNY19ajlyy1BXej@pCSxv=1N_4%u}ezvl8MTlpUB&G(Sy{Ju1 zp=fCzjM0<&JF)nCm`AukC5SeeF2CV`#LMd(P&VgB3H+((WmB1Es|Gq&(xHKlCiHTy zS&%2%sOpKZ427a?!OM~L+&z(PiFC2l8y=9$B%*v#RU=_9?Q2ck-x`xLn#va+;>(4u zz#SYWRWZ?nHZ<{WA(_w#v&LSy*)#s{E-q@^qZT|l8ciA?{pJD(a<29Yt!kdxBgu%M zWxvayh##yk(;3#Do*S25^^yR|szK`Iw~iFkrr9; zBmX1-X!1#1eDx-<^ihh5SZ?OTov~S)M>u{9^$O_1ZCw0a=@L5Wn)qy%Y=WjcwUo$H z4kyOICr10-rFDe5cJ2uU(-aT9^#{S;rp6zNpW$E@c4ospxqocf*L?sGsKffK<=n|~ zk`MgQwxom0hpTs$?65L9Uz_YNav>+q$g=rQw@X*oL%S{xrTVL!mz~^Q#ibKA^L>yo z&YE=(-Mso$!$qyh>{Y>c>~7ZXMWHdb%j7K21f_q!{6LI{<#s=070JA#&h8E?ANVMJ zNB!#0H+6WysI`W|ng7{1x{)Wt;ZfN*lf%_#vrgR-T}vI&)o7z^*nk$=U$LqZXEa=& zGI5Jm2>k7RJ3TYvQ@-wuT|+Y^WwEB9BTiqNt$JU#xXyO|TzIq;`wIaVW2B-Z51*I(q%?((xb7e`&n$L@Wp|g0)(I zu>w`$An=L%PV9E|eF=?;cAL$SACGV{cQa_&w0HTr0!=78*2*80=rr~UHP_X#>0?^W z;E5lTDI2-~jiUSVZ*V*pykve6^xj=q^W8QVhFdH}3=!D5=GKfzXSS&2fF|;jK6&ejUvBt$nf)BvME`k@aB27q^ zD7DIV!AiCzKp$bIv1rrzx&rDTAY9K_gyO+D6IKO4{CO_0s8(>%AZj|-f`Oo7O;Raz zxREI#4l}GtWN>U&g)%M)__sUh1>YS{H*ykY{zB-XZa?;ew<% zCuYsRS%2q}&Ic@KqCQaQ>Hw2Fi;pSm$N}a%Pgb$@QUprCrhqr>AiM5pip*7~aZq2! zxQFyeXxk_9tGnaIyvohH=92aEG=z~A(SfRH>Xvb&B%;eQ%Vy6eV~3_M;O?!Q*)p|n zyK!Z=Vvy76YuA{S`DsW)aER*K~1ZkB!PwKvqvavpa!tLYr z#1iUld3a*myqbBKz~!7|I|x+b$W{rq=xwraEbOTyjW|rTi?5TDk@o3|1BXL0Ya4>y zYMR>v!ECuHF#dqNX3~8)&=_mk1jjGnQwUG-eljGb&BHZ$c5&NL>yHx~*Cm&?Eye6| zh;ADJ(5zQQlktP+f09mZqM1~g$JRKWwW`!N9oxw`c1sKX8|$I8Q0V&C)x+H}vT~rIqIb>CIkipRamtYKIIOFKR*? zze>2|eT-HSKS3>4;KWoEYW4(_0cLAeXU)~E?@K-D&$}IjuxShc{phz|jVRKn^n_Tj zAve;}$`*X{!r>Hiyt2i!LD8r|4vd$_7l6dUiBsKAyhLT&hiIwN81?-hppxjrs+I8z z$u#+0ZCsGNHN)7Sfr3%7(Wbk!dQ5}dBsie54MtS)#UcW9HCDGSQNwNQ+^eTnp+*n= z5*IdcWIi~E(mcSsX0s)y_j_P0CWOxGiaXGRm9?T?9Mo>Zk$Z!spa16QP}p-=G-nK! z)RB5x`(2RW^P^mT+y*%{BY=X)s$(GtpotXsw}|JzAub%mr}Z>L#P{ke9AXI21Ft=p zXJJ+13rktU0q?Ck_a*~Rmc>oV&kD2O@Yl?{nLG32CcB6&rpw*ED&}7zsgQErDbs~g&Q(R=y$czm#>1wMO_&uy zqYIB_O08&I-QEyE)5$UeOy0^to$aMNY@jEH>=Nj7MH4q60=^%7Ferrb+#Tee@ofdueYc-CHw`$NjZx=B(dv%zak z?u8t}egDmZtYqWotXgEW2wwpZLV#|@Iz7M*P~%jAvWqZZ+K*j!pHu~bGTN} zVW#ad97ZvYl_+ApOP|7;f#cGXG`okL;?hls;&-0^Q&eTu?^bnp{2)*;`AD1RL+)Xo z*Y?`E$o6e3lq%PKDr2-^%+R1ZgbDV6Krp$-7F7JTTCmeN-SDw0Ka-VY(g-$@9}e@0 z_d2;Zm84J6arbj@-D4{^kG3!AP6t&N<;-oEQJkxcg~7e}`y}bGZv!s*mVxH`5^^A1 zK8O&@&##8a{Lb^9=dBGV?ZU(K&p^N8i7w9X#kxcQEXTfFu~mlXuYNwUTQ#w@#ddi= z07ty~06gmceLkP4-gab4KLLkDGXfx#q$tkX)|CwK$3hGd@dz&UCa$PmA_o9}?sJFp zj4@h(c&K}nWFA+oAnV@0u3uZTe%XXKkY1?$LZmkfTgv}~Wwa$-RzeKW=R%D-M$_N^ z0Th5KD+tw)_Py}DD#-f!b3)b|`Eps%M!(n*7EcWra`iLTM4nAW$`prS~j=agwj8{yi)GsvHjdBpWC*etM^FS5t zc-@w6x!mehe<5rqAUp_vm5TN!4X@I}s?VaA z2d5hl16$l<6R4kT6bp_rMV{@)nomS;gUIL{M`57C+N)+5I0eBenX%t8c zQ*XHC88Q5lKGA`xGG<%H;XW??WMcp>bC47O7}0$l%J|&Fc^`3e+)S_W{-+kq#YzlI z!bZdKjT^`4+oFsKM2%t=N`=KJGl#IK_s;b9f{Ns{e_&d`U`7}d zij+e7uXVjf0RdLj0TNo(PMkBiEWtBwiMN^7c{#xG_7<2((g1_fzd!xq>e8tPQHLW;S#@~MvneR%Gc%p$(ocmc2SoZE%vLQ#rsOx0vW3TMMT>TJ}hb9A!z2GQ;y8mZ)_5TtBJJY?50P3)0t&8rGf|!U6Vh!D6rWB)+KcO~Qm% zuRi|>4aN=K(i@h^#lPcbi9dQ3>x2^PCe`!RS@699sER$e6#S^QeW5O=$pEE5`LtGM zJ3|)gQi*cyJ9Y>N55RZV-AnC3XDkDNNCGRDWI)Pxuag?VNQW68G6AZ|h5>dhE%$$3 z`I~@|0=6FLvrJ3;(G3pYzu%k(78@vk6c-|%|9swCdmX?{R0wzy(JZY}dVfh>`jw-R z8_(O)3fwCcO!)?gIH(6VsE#?s#ZyLOK$@wYjgO7yW8Nx5r@CH3^0GuZ(lC`VQo{+| zIM$xD@)VyDSD75QHkoCMg0f4LeK*t7^{fNwxcA2TN!GPvFo< zRR@ILNsC01@sTbEA!(qJ4NW(w)yP+dINKTV00X@`EL)x1SU-bcVGprNZIWf~fJ&cz7ss}Pl&0ZA(et|2{!`uuk{>wcd*1()I{6UAq6=25 zVZ%k+7|2Gk`ebH$wZ?s;AT!piE7nmaz%)zdZ^5fTkqL{12CJk1Ld!`-r#FHfz=9V1 zV8}tB$w*lCVL!u0>7A>H{~3H46rd)SkN=k=t3&)Wt8}b^U&UQTU%6l5iHJrv(GN6~ zm?w+BB0ThXHznVonEL3aS#?Oq)VlI(_HA}M=CFT6RTmIJjLI(5e=7f#q1@~lri*lr zgrEf&#!&(E?Zh{L_rJ}`# zo^DOvj&%A(*OcS>%@&{T!GfMmkeQC>B*VS!UR)LgoC zX0Q%KW2?HSzT;5#VTS5XHNC0PvHG5ljhWM;j0FXjUSo9WZLob(l)6N@0u#{fendtN zaW5Vaxo@ru;Nc&gO(mo|EDXT1&dJ=F=5DxQw-@4wI&M==iiY%Rq7RRH5v|6TN_q&n zVoz_sH2H4HL*jJUr2y^M)74*L~1A}1d zu_F}Pu$EP5Swt};nBSOxm;}o%kpaRtGY^VeB43Be4Z%Fe2()ND3O%4PRX7V0HY~m5v4EDft~*+@M$Qg>&L zu8SL8gv0@LJc)w>G1jfyT}6ezHy?h%eB?Ees3OlXU2}fb;PDKgcZdaLt2^0;xb;Jw zLE;WgLm5YCRxr=Rv$g&qH60Av+;g=QuVGm=AE;M;!u*hpMEa>+olc8~lO{BSKBaSX z7{g^uzk3kQ2Zq8=X~lTl44>7~k5FlV9e~46b6Bn*MKuzqMyu!%*)!nJyX`x!u5Y8I zl%CCNV==$p7Z&(KWb|Jp4N;4B5#&*?Ljpg*p1f|uLs2Um2yQW9tDS}hW37imIEDl( zRql6LWp2Ue_7dd)Zub-j2R{QLRZzym+qy)?29V`{wkE_bHh=DFMfw`^Zh!O1PV0a^ zyZmoVqmx3-Q?^<52TQ-Qob~0P1w=dOL__OU_@1-jytFg!74b@?fABIvyu|~q*F$Cp z0D~PKl@gXK3PvULv$D#HU7I!^jz2Ush@~b7=^K>X?(|kM1o%|eIuYS1_Hrr9!V5gK z>hy*W9*9V076O2`(FLXrjF?U$CD)-oj0}0VpzlDgq=n-ewogF%3@dk6B(5b2QII=` zSJit>onobTdG8zZFic7gE3~U=WJ?UfX!3A2D{f4d1pm2c~luHR=5J?k!YD&2g@ZHPPR&z~QBj2fpf z-tCiu+1}3|WWQU#>cYUla+G3Ly>RjeUk!;pBNI&VpyR+2QTb$N`Bt`RSg{`Rp? z^6Kw+#HU@Zpm=(tMFlmmK*V4IJ^8^x4)>bc#W@0?LI5=q#@i+@iK8o7%Qn);F4kh$+#7=DmPei|im%Uk|I^jnllF3YsE?M{UNaF>h8f!-l5 zNPm5a#JCyl%on8xO{P1>@l2idYf*@h-m}sWAX`&}8(N|@URn`-U4Bk@IGYR_Hd>9U zk$hWdEx=Og|7w#;IP;SmM+3WaBeR2>Q#F~~f>;Oa`^XW#c4 z|7x^P{UyUd{Ps{Mr4v0Y4SaH2UAZQ$0zSGVKAuM};8w)`UuzD6NKA`Jm65vW`B{vu)I8FAP1#7@njs}m&XQ{g; zS(UxAp}2L2W#N8Wm2cFcLDZVOdKlT02qVNQ;xo?ZGU@Aigqmnhh@Y{m?dWTj_WI@kf}f1f@(FOvXpI(w?4@iT^B3LK}3dd9Rd zj9Qao+0v7=u_$S$SOMd&@Ipa;&>)uHI(?8EO*tFJ!;RyX9*Bi{0Z|XGJ=aOuN33v2 zC%ZrBXt1JM#A4%q?c<9&ZiIkZwRp@+?<{XMXA=_{6V~2aekitd5juHUreE)@3LZQ^ zpVC#k~fx|#IL8xp~;srq;vFLp>HL@z5e~Pwz!A; zZx3l@gt`qR^>j-oqFn2cgkZfX{=nb_7M#_O-=;?Df?2#0q&@8m3C{VsaDhc-CFTkU zhIuYMi175t^lm3R?GwuW@6#=Sfw%ncz-7r!>946>&HVbKT4gD@ zO3URqD}<`0G9ZtDCkN2wv*M?~5*M!LAzi6t4b^jhIm%We=yC=iFsC_sWv1wX2asn;2Ka5Uh+4DfrmvV<%SAmBPxeWw=K*CG9D0EisOucQ%Zp(6p<0WA_GEo1E` z7(f;#eqaUVH!XZ`3cy=IB>Nv+A|L*}VzDv;;UIvmj!dW76f<@5bYHfIM}4S}8^Ub; zS-3~Tuanqf?S!ZO#0L^s@+)C;k(_xIjTW>aQYgTl4%d_koA(`}gm=~{QZ?wHG=E^^ zn_PD`eO9LVrGzDp6UTXT2vS05)U=Si*JqNJZn=%oH=AK?u7ib)9yWX0 z;DXh_?z7_YL*}QWPRpB|#;DpCl>5%tLdqUb5uL1*Hml9SNi0Tc22F$A{$YzqF6e`~ zc`0Nx#+ei^+c_ZD33l?(e9K4A3qJ2!f>G`xuU<=5lEmdYgKTwzg4F3>fP%`V{|`}b z9TnC4g?*n1hE}?}JBBVDIs~K}B!=!rP`*QlNOwthOP6$ahlF$^iYQ>b^Ly6&tY_Am zHS_m5=RWtnuYK*$^{7?F-6F4sU^@Ga5A+3?DF$Nz(Smla@e=YSs=gBij{Q)eU@Q@E zvRZ9#x(WQT^2>KqyAVh2bT?-_U0suY!0+fY;`^)xCjMPf?2U!*=_AF2ZV|bnAjatOIxl?3IY^ES) zK}G&=W?;s}klak2oWLrMfv4+WjM{cXZoWS9FEnu_Qyjt9sy0|-`*Wu#I;mo$H+ApDu1BV zO(C<{#7Ba_4=Yiy{#@-;Pt5KE2mccvcEr-E@rDi zeC}s&au^5?rNuq;ykLz!pU2ov-=O~si!cakH_p!pjg+#VVvB+1>?kMnefisKs|gy8 z3qcA14ETmTxW5};UiDMaP?`@K6Ud2ESXNMBH=r5YxgDUmID#1MUpPytJSb=b@)H`4DqjHXFQ$6@t--xxe^i#R%=UmK1uP<6mQy{!5@Zb0%5` zJ=Jhh5Y}EV(|h%)$;nNK-P1k}zJ-6U3G^ikmMC%+5O7k@3RGR#nr4a$KiRCEo~U&V zVyQ9Jra!INR3{=Z6l5QK&0Sp@q3&gr6u6|DmfoQ%buJrEG<>jOH#v5C_K>@dWks~! zvXCyK@c#AG3zk=v*9<{Q8+$?_=bem4!6tgV4EZjOwUWawp_OB?R9uQ~YW3H4ePO@$ z$^-i$c)p`2tz%UV)Nu>Q>0X}&KZWv1gDTMHM=OyAsNVT7{#=J9cam*v(NMqw9buni zXWJ|eAhJbg%Zpt#9y9uuj>70UlhDsogH~2N>lNY8Is4H<5c4+$x!7r7d$8)T?7YP- ztxlGakz1XmHt9PSZ-An^ZAdWSN5*y?+n-WffUJ*-i1>_UTEiMittcn=pH&^M4FE)b zC;^;KXnuj!r_skGN>fDm@eaBhfbc3X!TP^;4ZZ&-XP|30U{^U|gX~`-Iu17I|FApI zGRD6!w4@RFFUCTRx5eNyzCxluM@yQK2AL(u^*;z8Ao}AI6gZ)=8M(E=Pnwy~Nk+vs zE2D2%^c@oTy0?7QbWEQyxOSy4wia>-tVwz7nk)JQ%3T&Of`*(y@#euVPV)gfP{bmhdpxVqGuHXBmULgFxR zE7qO463KPg(WSrwq1|NghL!^b&DU0uDoNf)UjH(o2*1RIF)Zs%U0X8Af=ag0+)lR& z_0eT{xcRR-d>MNFdfYRu)hzNMS@yySY{PMWvc`w9Y`;yNgn6XHuu=72;I;Y)4er@xoTTn5-y5rN~!n5bRFu z|K7?83mr&r?=PT-WKKHobdMa$M?Tdzyb85`dS+5l=x`=UO*2|pLy434)>L~t^4xbz zqp3*!%WqbF>r6f4L~CT~1A*1V2LcF6l8oWz`;DlagCxd=0D$^}CTE}*QjZ^0FA;Ca zqkmfQ z>LZF-aGmH%S(YdnJ{IRmV6+e^Xk+fD4l}Z|BB5i6B7BL=ilPduY^n~4d^#CWKuEg! zihMnha8pkC5XqcsoL{=EBdW*>qV1;haz0bee;M0aSrtMESLb4QH`Tot?(aK65QD9A z)<%k0P>tf(Ma-pi-w8Fa9^7qx+x)Tpg^UE;x9%0!(_l$?6}Qgo;?-B=i*3aDi6lg3 zEN}R-jJtF96`pP)Q^fv)%L4G3Ev9T{kWX=&L6AooK$thsK7St5e~aN!4k7{w;KBG{ zfU2(#g+3VRqUhyzU|=IK{sHEm?qUTC_uI+3^ zS%*)6lcu+cK%5T~Rr~zq$2D5kQLBBzA{n6mg-gc6T$ggC9ausc$A+r4;j)C3iVA3| zBm8pi42QFS9PfB)v8L~5#A!tjSN~T>`)I40RGaBmX6mZZ{`Iy9V;JAzI%9%252m>v z_a?mH-X)SyXodNwNcAs z=c3l!El=Ahgn;Lrqm;W%A{XOQAf>T&S)b=DJp-oP+FyKvRjTmHET{mY9cQpEtLR$| z00M=imSgN*u;;tkb!tUqbXi_q#zA7uDer)3E%^oN33-Q*XS)G4UDT6ca&+pe3 zLYlAqB-mtE5)@bx8?wY1;90A0B_;Bv47&)mgsDR369QD2M=?mG$LyYID#e2t0C40F z^v=s+83s`U;-mSsQ6*Rm0P5~V(68H45c+`*Rx{7xt6|hw+B6u-x=!shG|uc6UdLU! zmvK7hjdzFHL1h~6xBt?XB2x2Ovh})1#`1uVb?krD2mB82cLvMs$ToDr=ah$%y^3FzeupF?m zBb!xEJY$|h;KyWDI7t2FAbz8gyvi6J0{fE9yTGO+cNUAa5Q^#z9Kaw-4Kywfgj3Jg z{#hs(=HzEoh3G3vsM!<{rKeyiH4u_js*{^fLGdTEbGznfYr+isWOm7?Q22;dg!r8} zCI!(L?pQdKVH{~Pf$@~fJvgFT{_yV8*M*KjIs%W8>H zDzobdtCrnz_dQqM5(noY;gz4jfcl5~joihkDvpwfg%WN&;8*#iPbB&4J8nbCCm*|> zmD@fUlbGEhk6+I@NP^3TxAdBV1-w~m`zs)j)-3Xv54ce%Q)xw9nN=S+`* z*n*Kv8>Qpjdkb3iCqfB6xJf#OjfVUi^PcF`Lw+R6fZot6PYzjG`kFKwu@ z-ZhG9eTmmBKfyG1GWtRKa8C`OVleBDi78iKA-REGV~b5Gdp(T@gynm)S9)*Bd@ZO0b_d7>n6QV>#10b zM#m0OvBi`@_SiGpGImxP|B3}Osugw8k9RxT9t z5x7iSZzHML9HQScQk5VpDp?ng8fiXUwnUqRrgwuh|=ES8X~dz!<3V#`-b=);)*Wzl@WJN3A}p3f|~vKfat;C@VPYByzmuY9t^C6 z*d?43Qcb2EwF~K5uS?>UUv4_rvnCc*Nyr*Tt=MNVFd zWjj{5XL?rG1g+|BvSU9W#~8}wsaqWDbVSMRLr`gW<5J*?#j@Qc60;=tU)4; zG70>u=O+_^MFFzV9t!#P{_bm@gK`0dx;4>3zvP>*A{ZnTXbe6*1a0x!mfR}WW806f zvD5rs@src{v{#^#q#*QOrtYPqK2fO3OrW~6Gu%$fI!@q6dYX>6i>wJ+F07%i!uNBm z+dh;}?40~WFwo?sN^kvIy27TCLRQx5U)A)(XV1}vGF6_BKNWJt0#}yKaeXD8)}KvK z29@n4(yu-z&+k})y-Y}=Hx`_fY%!y#m|!+A(9TkLLrH@}c`x2OJ=DxfMWI84hgZ1Q zyX&r_R`YjV<}#Ws@0bY-BpB8LYIKr7({05y|U@d$$eK@5mc z`v4z`stRLafKmv2C$W&EHKnP*HL57BD_(rP_Uu?qbO%yn6>bWpzw5VM0%8Pm;fTDiByq~&SvS;dFS1XgD^C8Q0YS%JAy4-**u z2%#6TaA$#%@zOny=@)LOa%*YDw(N><%LA%Ik2iGxDM!EZ8Keqq< z*ZVM;)$B?zL#10_#BdM(zez2Nl~OuZ(j@?!^`wRvDXA9wThm;Ov>z3Nd=|$LI!mO& zl-3@XMpmTZ6R-NRr5J2JYLYwel*&ODec)>6bTy$ zLFNTH`M@g_(emf^Z`-@zO1r-slKO+qqTwveBGuA3zT-tzZo;;?k!sU{-x=2>jN{pj z&TY7~P{kLDFE#9a1xqHXnZHCDvA!i><#Lp_O|-#~0M4Y(O$8wG+>QDy+Ce-{t9y8* z=|gE9pHA`D_0*Dlf(W{y!Uj=yz=C$I&y&mc$gZyBNNA)PE{Za0LI^r*l$f#ThI~Jfg_ve;N4FWs{3oF8l10AX2U-AOznM^x1QU zku@(A3YhFaVxfB8(eFUCX#Sp?Hw!`lBaXrkN3Dln*{Ff3G@!4jN~e}Eq;o?Q5H$f1 zA^NQU8qSA=K{&aejqW$?b9n#9ynm)kAG8vmHudq}ndDuZH3~f+*i|*va^sPmn#QaiJXG)2{;*H>@+sm~iVkUj} z)(VL-Wc=#uBDka=(aVoc<&k#v9F$1%d%|wBUoY&H_uF#}G8TO}%*Z=41I?5Bhi?-6 z>gbI%TJDUH?Ee@wLeY#;6nZ2j1a0AX`!D}rIC}NGFe4C!pRCNCN_Ryb`O{;X;1%V}uj<-K(M9m%H|Y9Mf$%kOqWVK&aeY7M;|h`3 z%3SZre0k81AS(G`3IaH)|L5YA@dX$7eVX@H^TzG#+e4l!k8=Y?u|Z>l3Xzy@L+fph zMyEbth)L1=mHWGs9|9N5IeIzgiiL|I%ZXV^&CVl31@5YWYaV=a-S0zw=trT+|2-;E zqqeAnr8FP#6Q>{DB+RS~T{J(ueGu$!(^T9btK{LuD_L_6v!LY3fChrI3cmMNjxF|w znJ|XKG4J4~V>}ki&TEdSDJv#LL_&M=`H(i`rY|6k_tX#7cgWa(OJdGfBoZ=Q9kskf z0>Z%f`t~x8=Cx4EtjBBu1o-q8D_caw;!!DXuyLQ(PwZ=(Q19Tgf;Ba&3A?xj!Y`?CvKfZ+cchZ!MQ zKJjCqG+ObjNuVAAC<|SHPO`RkrNk{8Uh$Z+;e^gq5kNDV;|7`;*z%I1z`>`~$pO}l9*rZnKyg*bSPj`0b-^Hyv60c*$&(&Bwh z!cgb0O&&lYG#5f!?6`aBHNX>V+p124x8>GH@k$ZLk5-%UZ z(n4k4u}DQt2q_D|?>N6N$@KwcrWTbht zzB~)UJKpyW%bm3;;>&7lk7-+ZG9&ZwTsw5;Ol@;IchuMT zNTACgEq@C)DPCyX@E}*o87pgP)aKefWLH5&0cSD2`3=N^cVr0Zq$!91867M!LUE*< z*^AM<{-s*0)QN8W4}AF!OnMmV6Msr5Jj7}RmsH3}hIb#ylCLv$60<`a*{Xa}=h{m< z=Y?8MJ$px39W0@~1}aamr+xHJu*SZ*gkd=<@Tr6nY3{hUGm6L0_-H;+k2@sp0{_DM zYWC(`^c1I4AHLANXZIhYV0*g>!N2>1QqRv?Sh99c-6#0+w)}72S5=VGklU6`=($F? z+nHgi$c+E1oqldXSfxk-05psO&nLoIo?3!oJODt}Pwfd5#FV-~$DqLA510iPt@CMf zqNP5m^N9~n9g_|?SrEO8j74+@e2x?xb+ESyH@?!9d!LN!B@1Yc;Q>PXACUa(uRbMf zZYQih6AU7MPxh9czj{Skq zwtA*A*zbovpB#_$qoyf29nK_*3WrW^XJwXjJp3=L*rXMw9z}Y|0+}O}+}ZGjw^$wK zt^V+sZw*(;ap_f+c!_L6G5b9iOGNDItKE9#>Jske6S0TIz(cd&qMoF~q zHV?3-IZ4c@W{3|PcL`=fEC2Tity>sf)kf{Ny6{X?d+YS z<|nLT?QcIukZ%$xWiI5B3{cuLHrl(=***4cAD3#F?@FZZ)l0IIOX#v(XC0ab_|x=u z%&nxNbCSMjfe;TRq{B9-JEB<~V|>@&?{qKUUW_gHf^yd3>^OU zDwjCiw7E?f8*93Oghd0#nABG;GMeSy!2?p9Ez;#!O~GawKK)7J8I*1R@v`H2VqO}H zqO1ps8ynB<@osKS5L{Zyi7iUj4ZnJt2+U3S6FNda zaIf)ygiG!Il6#1Bt1x|89Cdr#^j1qj3uv0|tXm(SDx)&ga3VDDtu0J|+flsA#3kIM zB25|>CXT|;lWun~)XlfjI$=wcz^`LBNk7E;wv;4T?YnWks9jnZB~s0unM@5+s#CgI zaNC*4sgBJhK@Jmdh+pc7(G?U{=oVX(2`+XR1vWh(r?hmx61B0vP7|NEJSaM{ASFyn zq8dRePpWr5dc-_>va^L0_@v7Jj1bjzm4Xmhf~`@YSkrn-haq|U=oL8ZBn_vP_Br_H z_7uib8@sd7yk9qXn^MXpCr{p0x`JS`WF@qTmM{k_R=4Pm;B7wdf)mN#Wbss0Gx8wC z<>!hyhCc_j$5g_XkyA)?7usyC-j7=-u%Y!uXnVIg)&n?I3Z z1ncO7s$gV`<`-4*h*RJ%Cv6wM(vlWnQQl0t${GUwA2BtPx6wcTb9Tam0BKe=6KFh3 z06^&B0KSXN%x6R?|B8)^?f=wwsRSyoAnC8LwbIjCT&3Up^C-c^);r;Mt;=Jz8O!T# z(WOImMs^>0U$s@c^xZZ+hI+TKl|a1S#;>6Rp$YE9&o+o6BRG8Ms(qwok|$gazWv3s zD=whzP=AsQ&Cn1tPJedXEi$V}T2Sk_5Mnjoj2Cp`q}RT`1l5$uWfJYnx|&)4B7+3a z1^+9UtJ*>)B-^E47<@KYYOvo6Zi-*)xDNXIo$D-5O|2hP|AG+h&%Ra2kl8GucBJoqczBNdUA{=ijWQmtcb4~=9s3ki z_R3KGG9uq}4K;uueeW=hRe>>~`WS`wXrMS2& zyPkIIWX_Uz4cZvulwXP2I2!e+qRH98(a(lMR(JlyAigMNj8h~)jj2Vn({A+8@6$_7 z&g0mufoKuhh_t>6uTYV2x>y~GA>(z3glLlK659Hy^DJ;pcY@|qw`uRgBB(FiO9fq2 zRAi38fK1J%0n0Mt?kBkiT3m1Z;R3g}lFs2v?`gkV=k*jdIDU4z41K@sGjc5isYTkv z`mcBO??&mV0!$nvf;AYg${TnHWYt#Yuy+T4G_jxNe`(*~k{PhCrI@r?!r2L9xMV08 zPm|lVa=N#E9_G~B2j~I2h-AF^ggN2!ZSv0k=m_y|Fu8@yY~m5hJ9pW6ED-2v=0uTC zN@8~e<{C!W*AHT>$l36BEblm@m z-+wt>Iq^wIwa%D-J}>namOpS)3FL~oJxBL@-l?8UdA)jW6J9CSw&&1Lp!FO92GX2? zhRCB|@=us9GlR(wOGCyF} zu0`DT=)h;(&c3MFk9`njcLdHJSd{)MB&PwBISh#`FpcF>*h(YuC69#0p5ahX1X39A z*DQw7I?Wpr*TpT#_N4k^C;IS{Z|8JxNyM?v+^>Uf1I)`!6X{sL>!eCPx}bPKUYSLW zD93ti8h%AOwkyYW*V#M_2H!_Z7W69wjp!!vU*%|VXiEbRGEx@dVZmT=2zSH+eiu^0%* zu{d>+*sF%kjGJ5`{J{TJ0mPk>6@rG_#8A3f3Rx05M@_T9+b$WkhL?`@d^tb)FQ zd6=)bd3xDT$#n_-17}YTaXWlDHEvGHjLFx?ubLX(EqDb5>l;%PdMJz6RGEA^NuNWx z&DUR@ccL!ns9G4YRx$Vt9-37*B--^f1| z#I3FN&v?b$pvxG#WSnyoe~UVGRhuJ8-UMsd3#TN`k^3v)->eT!ZjyFCAN$sT86s;| z;v3c>DorCGr|kC*ztt^vah05~4dI$w;e#VgZ> zO!WtmKA;aGsPi)6tlWHs92{h~jO(NY`2%ZU9@T|5bN7yqF=oc+nTJOlJB z_w^6oj^XX`yJp&5!aEjy!I(_WHe2ba<1GPdSZN6^5}Wh{?vZsC<{5?iAC34g{8%}Z zz#%|lc^heI43tFhLEsDk0}Kf;!T|4Q)F6O_0RlAOy|lO2MSGEJ(A6~h6Z4Z?Py_v2 z_w3gI8G0}!8m)E2pq(A4e>rGxM-=+Mw}qs6da5k8Du3G8J-IotL)-F=7hLvZd`6+<{U*oKmtQ%2*wnM4^n{7H$HTv|T=LZPS7>&U4S+v2pWGM7=wKR#r4w>tnLwRQbPn z_cu~fVI4O+%Wt~F=~%^2>SMwscW9r083e1T^=FWdSt4WB?eDX_1R1ZFj#x!nx(F*r z7UM?0K8bY9Zq7q{-Wjk{d45I@YU&%&00K>=H`X4YkIF!^QnswYrTO1 zOGNZ21&V1Vz6#fYmkvyhU{jlVf9*S5ToDpUM1f6#2JnjKsHiU(?>pc|hjZTvL$V0L zRGrjiE5*IR=Xd)BCz{d*Mu9FtYG<_%B&4)X|pNlp=yNsgO88h6aLT-FhBv1M@s@!RYp9m zB@hxE1rQWqIvlG$e4vdO3`47!!Nn{JzB%)KBU26JzO8S?w;W%! zEj?WMNfRN)0ST9fsyZz_y5&bkeD+L&PpppJ7irQ|vAM8$-5sVJX?sBu5l>=nEnGGX z&T4nXMITHCCBiJo5G5Qtd6mF%RrjWSHye7+Cuab+(v~XdpJA-rN#6iAS^UG{<|R_~ zmG8=CeV&(abML@47K@olHE7pas+t@~(PKMDm(|JPb*iuEsHh_3Ig+puas_m-f)__9 z3T#iry^5fm@VbZbFxEE3mDMF@RdjKUqJO?J1X%hz^{UMGnZU?8?RK93f9cn+t#`d* zISNjDrR&S2>8eF6H$BPlIjLAM$^^cSoZO2CWdK?j0RV~!q|N0=& zRK}o?{!?^sLygya-lC%Z!}Qx`7 zd3UmmY1-=~_n#iiOaDI({Z3~p134QRz5+w7N9(wEysdF?hP+dvmG4itcfHnW56RLL zvzuG)dRr9c!;Phj4bDuEjYhXroYV?7g06&yOq1(29qEfCL%Q`z$rRC*TT#%qVUaKM zFRTk_^k{n^xZNUypYchM;2+Vj%#QliPtNBSPN!vtE|*c8xK11*AMK90I+Lm^UuQ;= z@C-<~AmoF{BKQPSH7l>)Vtc5W;{&uGhmw638l(;T9o0SUm01d`CF_bD&X(-puW{{{ z6Gia*2XyEvs47G)Hci7MAaHxOauu3gLfZSQ<9B}D{g>g@;t~RvpA25GxqD0J*Q$+$ zfC(Acv?OJh-ZOf)e2EJ6JY~|5{DK*8*@LfCW|Fh)zLOA>{JCQpPyBk=PBe^*7h>T!D46QG|uEov0Z1 zK>WLi%Aoznboco}yA?GN^W6*dk?mJ}8|_cmKlPN!+FO4Wi$h*cK1=TWTWxbpJeuqv zr7d&Iw*TKdaza851m=fIX8v;={cjbF7~Ao)jE|Td#V1U(>YZiM1c9~5Wycl=08Cx8 zGL1$)y!4=nNi}=>m)Lg=PR!QKh_vEVo7uuRe1a0Utd%fMj_$HSvlFgP^~@xv&Xpa_ z-%@uk^^Z;+P#33PCWuL8BMV)Y@0!QSN(eqnc5&gOy3)IS@KhaiIDRZZYMcz*6|oZ| zITm~=t_YGiHXA4e=b~Tl`PwNA6MH+{a(a|u22dmN+JtH@5n>RRn>^+t}Pw-)R*^;_-49%CewGG$LGjRi-dZuiU_5QvjRk(Nh%Bgg3k>H@}stE z54&8iM+KD+>vRBMKxkhmbjovz3mO1o0>&tOOF6u(Z+MA-F%^J<0Jz3|MwMs(!37OOdSwvcLjdmdXZXdOPQWWqKU6Me3r z1&Dm50tFimb7_hP3_o4f>5}Ee_81xUAp2j&kBS2VyqJo!ScVrCj&53@H`-<^u!6FZ zik;juxQ2^jl$!%tnT9r=8bvS#tHln8L7*x39F9#gCAZlTKW6`pB@f#;1rPu2HNRq- z(xBUo)N_dq|6sW2Mkz-$Kcryr(Nrna41Iae z(?M@k?R~BKqQEG0yBx852g#?@DBWG+57m8_-4l05A;sB;6Zt=^%nTn6|Iqj|ehe@B zw@1fg@_q=W`IG8wF-Q=L=)It>s{jSIczHEbE!aJk~|x22TymsZDA4rxKMs)9$Ehpy^WL4dwYBm!h`Otn&HQXSZ2}UFpX>hs^jF3QZymj#A29F`xzP zVzO3C4x{IJuDK})P62|-NUJfBQUe)g@ zbikuGX;xwA^8hRa%0U9P1OdBqZRpEB3=|~2>fU4GLc<{bV$&+`eAntnoymRHJTcP{ ztHii{z;S)R0X#eztftV9g;Z3fiuot*&CuI_5VRpy4u&$L$uk_ieE1k*CD26E?L_%r zpRxX@(_T+xn zgb#;(ZyFmJa~(f$Y0)uhdj1?JRbo56YG`VblpM$)tz8~rpEaa{qNi0gC*h(2S~C!h zVV@PThv@_bcvn}D+H!x9>X*7SeVa)2v|Pe>_nY5ZwPpzBq+F!`%r)qR4P{fU@(CwY z6qbovJI_-Hjr4#A1F)R-Y!}f3QRcYvUEHT0L(QnT(L%|0!&ST80T_4fA*sk1%`ovTejoiHbxIqFE`=e#DGl$gtPddg z6^w#fFiT)>s=f~XQajW(Z1Qh+&)e574gd87JT|SFzhyH->O3Ma{=Bu*vu8EbODu*yQk`Pr^ zEt}Mj-~T9?ioE}3-nR~G%iE~x5P#F=w?VWnv>+r+6wWUDK8SbEV%vmzq`c7}pi_kS z5Np?mcY~)8QY01s$BsqC2|!L2)QLc!%U_e$&cEO5B?cnyk^>1Bxs2CLQy3^z!-=P= zuDD8=1_}mzn&ndz_hcnA`mA1&zFT(ZE;T+M!x}oQ zM6&o8@!CDf2$C{BMd71^HLTF9pPueFY z8dh+9B<*^cLD03JK61zk6e?Qn`~ELNxpjIb-k^o*85ZXuP71*A_JfSc&w8~*wKk}@ z)J&b*&LidK*Bya?1}o!#X6H3zv01SCjAU)M4kxR6Cc((ciHn|iej|yOF5Ks?PA2RF zs-@>gbS)x*3^^-A_!erXnPzrdthxB8`s!ycZ7iRA3*Seq`voFjZ+oyq!Hg#!DS96p zFq)*OJ24AGOYOMW-J7K6(n!1|yT(GwuPZE$oXTW)UNU7k^CGxntLg}K8OnnB{v}3M z&U_m}$h)2@7;v@^Iv{Wgs1XOJ1?m!>7EdRIYgAd!k7Mj_Skj7GJ;?-oYW192%gQ+6 z#48WDY}RFT+`Pd~QtJmxil;D5d-N>^{L)=WDDhQH8;^6K}Rz9QY)ng6+xWt`jm)OSv86e=p}8Y^pO z{-GuE0u>At*UgQmRHs=_E64M3MccOfIG%5G%m8Zn=c33kXIoZ)dNF$~^M<3pQ{0V* zJ!O-YNSL4-o&mYxr0y%W9dtr%rPE5R)n4YF!k?k7pOV3rgxZ?Cf~SJ|enYs!eVq>T zYnRJ~4XRhX!5`=BN*jBE?zj!iLwLneL40^kn&4NzW|`&6ss(mN)HBoY#TE1<91-L0c3RbtJhJlR~NwVu02 z+%%}Gj83v^<7m;;bw|`um1RO#m#gfr*=%E(;=B&FpUbHIL(eSd`^7kVk@@hk^H6W9 zjCqe)J(?M&NmoaHoxH z{Q3SafS(A&GXtj=pL|n!F%A8?c+9|vR%ntv2gm2d$!|S$K>2b^oKJ4_Axt%Vl;A3gB z9jVuc_#N~<;_YO+>mf;67<$n1%E^=2TZ)}g-OC*Ov(Ev4Gl?fv)ySv9*8XlBl>A5e zighNPNoo_G{dNrs$LTvf<0^bx-J<5-L*}nk%N4R#Jxs!FoYv@Mbgk3Ox8ikpJ;3&tzCz4uy6+Sx*TOih^wk8Zf!7k}1doimj^yULx0E_p8k z-LZ1Ifk_BHvJ|Y4tI+o~fbGmlByQ}oMM8mz`g#V;hEl68z?8=~SKX0U=k})^T+AuF z*8}T`vg5{r6a=2U`t4gUlOB*cWUP=UPl=PvZr=&_mLC|l^AH^O1G9Dj){Hhu+hp|6 zEg=2JZjReGF$pP41ek!*OSkDfus_2S8h6`>R3~B0wv>h7Mq_+>EslUPV21)=U<~pX z+ng=o=nWRx$83|2IddJ4CG$zVwep|PJtm~oT(@#IZ4r#A4?R`U`zX4iUh-^diesV@ zJwdNM4&6g}+0?K=1!Y+`zmFV(j5WnKNc<|O_b!l+J^ooGvuqyI-qoI~! z6S==%YQ7jN7ZMxW`Q*p|)O1sn$! zGA9vw&gDB2+MY-fM1S~!pW3i87WV!A*3)FwcBAoY76wNY5m-`fA<9>dmYk4^C7P9a zqsmXRGm)jnHg2?Mv-!Unbn&@QuKw5D2$mAq zIGvu&tbHg;ElVRmU;*aXiBQd(j9ne}D@374CqwzP)4%x3y{8n?#|kdMUu zSz8x4IG=@w4Of50)=0k-Y_O(z)?HifoDJ7hj<3B74_R~U@UV}}4<$V~YGE176j!L# zY$C$^VsE@Cj9<>mk!UbXR^^6ljpKmtzlmcU%WbVhh9M_wWF|M{!U!v`LUuA74PT+w zql&z9c*KV#U1|y1pp>H$>l{I~T1;}3-;-SpGm$F|(mCVP*sLQdc`QJ60mtA}MkL8?9uvULz zNIOCa{_?}egZoRbpCXz~gL@&?O$$)>Df7hDt;d_dlfib(kRr#qF~rI+#z^GYQ_E$) zx*HVJt9wBTfx*qaW7Tj3st-WvrlTh*ut|PNB0zdxXr_Vn?)jtG6Y}+lcVGYmpnJ#- zIxC<8+P-)AOMIIm{IRC;Qw#v?9|JywN3&N`HP{JCb^lykjWRB(6DzG`NQMFraG=2W zBC2fGQ~)T!LgFQIVj6PC=}eGxzxqI-!kC?NM*_87?n*&{5~fr1YN zJKUa7;+FJfV9lf{aO#pP;IvIDL*q zG;JM^E1&xw2j}I*O0)T^ATixdxGEATWCAc~W-L7|O2^)}j5s1G|05{M>t0J_h+)M= zHgtw)zWDE{7SKmyxp&otHk$*MFO_yqhie(oq{aISnI|3)RL{MOZp|(Z@Dmddz)e~W z#DyE&%dK>nq!VO0PnnEfILP;OG*c?_M)(DzF)Qk?F)Z0-O8c*k9JdEw)IO(N;J>^* z$y;Rp^NSox0`F5vOzjZ+;}vgPeekAmLnx2Zx2fm0#Xh`oL+w>b(X>L^!HbZ+_saTj zJ4LScT77)^P9M@Ycr6xq411P@RK?7o}RY}DS%FGCH z7{jwkoG0=MCa`j41J-7<1}&5InzlmI$jpoq!v%}#zBMe%Ea5gOan=}+$AlpFm?21E zQgeJ^t@0`~V8=v*0_Vop04!%A@>Jg?w9)_v^YnFQbJms$D=i^)gJ z1?AS5+FRO%#4jH~-{1@gM-*a)nGV1c03tUDIwk)+!=WO>j>V#X5&~e!y^sQ7c;w%^ z^f1jC%I;t;eVz^H+ai&_s<7Zd=ePmDWWcNRn~Rk0}R8*zbARQX$-q-V@zGnSDE)g)kCaR6TLPC?PP{B&!I|4MT&I zV+MauHbxUo3rP!M0ZoUOuRo~v|0C+FqoR7FcFznjk_tl&ATV@y_t1@W2}n0cH#nqp zcR6$;DUE}4N~eSZN{dn|#+~1{?!DicHL=d0XU=)|yPy3;r62k5k!PY=HLij8CkiZ_ z27W&RTSrgFT$d+yzZvCPhdAWE?27;Jxai9}J9WjM5F)yWx&=<(m2N+G?%^LUOT!gx zc%Y_4w$S&z!BWAzUrS6$4DfrO&1%xt!u592(kLzTg^)ZKi8(PYdd*=(8#8wL%c?Bw zmG1T1c#$NYB-Um(!5t*XMbg*S3iU)Gz^1?@B?hzx?fi7NJ1$7XUN-g>dKK;`W2V?q zUOs?<_rB8pS&x1q&)1xbD>!`L*?zw)pru@vqha9r5WrCB;(Ju-S1y<&mb!0gwx3!2 zS>gM+xPQUI>iScN27=dl%ELyXS)L$jbsI-9dr?(azet#V;sJ*yG zr~#@$a7k!tyTR0eP(9q}X?-pI8jRx*JK%nb4yD`>riGi2&e?$V=q;he-4!x%kO}F zzn(-(Eal81bPZ??zMA^Y5=9bKu07U_DmAmsvA|nGSYds!@1t44C-Yccb(bAt)EIy(4S{AZgNhwvH;jKjz|~s}{&2pRDvonv%_@kqvHNdWYUIZX3c|IN*ZW zzYjgtVp?&4TPbVYCS5f}_Ml7GK?l4A4?m>)rQ^`ca+7i!BROK^}r45rGI${z%n75};9uzaOb!OdN zdseh*fW_--Ii(?=K2z_{K7<_cC0S*i0GLTBV@D(+@ZK1;;x*BAFXG-3W}-|(#F>tm0YL{3$s6&6g?XxPPyu7~WP+#kFb#ajaovE=L1 zi&Gz;zWvqkwS{x5cFZtIwd{1y)M9eiroUA>^$8Q(O0ZMs3+j?E@A0c~ znGIdzSMYvEP6)yBuY(fCW|%h^L+a5{;BuVBc`a@2ai+|m`Um`E5t**u(Son3)DrC-KMyA--=qqN zKfbqd8gA>!^^a&_64<5;IjxS*Vyn=xUhJteK5ey+2_HO?;L96poh;-OcF_k!n6q>*bj`#PB*{jX2C?pE*kgg z2K#?Iq8h`4+L&1Llhd%$ipJr+cq{l<%zC5)`9--9EihhOnD$X9W6n#Fql(t|HW&cl zNov4Bi|F4!XXh*E&8mi?T*X&zMVea?H;!#;ZqU1rsY)aWprhNVc@imC)PrRi#z`C`UGAA#C1 z9ZH&SYu7OlsS9IAHsepG~>&axtJikg0AXMTTWK^iz$D$3@kV$X6fTO>*f$^9Lzv&v_8A4nEN^yGbn@^t z1L_EBWu*bD2gPCAa6Jt^syxcT7`m2c<|xGlLDKe^8lT`WbS8@!~o?ikhXjEI&b zu!%BaBj1!kaV6B$iSw{-45~qwv&L@+&)&xG*V}ghz}Xtk<(ubg>D$VpI#F@2w4`7} zsP{Er>;uTvL4*a@Lacp!k8Yyhxbv0B)&F`|Oy7pghf?A&h2$QTNW_`}@nBPRy!fvK zc@wmO+0Dk+AbUdG06bf?01TC0{5HoHhZ!KQWpc+8U%?H#%z1%LLmX^~x2lHeB#K=v z0G4ZWBl9LJ$?*fO0yk6n|1hQWqi1fc0>3Yr9POs-jhlq=Q&})rQYDbS-tyf0u~@y0 z(EM%61>}_e{^t|(%x{IpM9$6mqAOcR+kDY!Ii$v{Q!h{MEEA$Fgp!4l)3}9t_zq{1 z4T8Ig5q5$hCZC?3leXo%f*;{B3v{Mhpw$geJGw~Vg}E+l`wM~*Tn!YQ7O$IIUoSnf zCj^#b1-R^S%P4aQ=9ksj!qlAOo~z&yzI#Q#D(NMT!0gQHR@+3L)CuD$cRlJwaH_kLUcB+=f zkhPu7JC}&e&7!f-3E3avc)tnIwz&WK1Cw%8M0Nh-gXiTlXe5?t06#W?`NEaoe|@-G z!L#}x-J?$d%u~m`MI*?P5<2Ul?6($45_T^TJqBh40Q=n1vEMH+ z%hKQDV)JurOj;7-V9A`_G84^AI*;kXMc)&l90`xg7)XuE51)b~yHh(+$6OBvd^f|z z7;z{RhQi9=-vv^HmA=F^T9b}QF}%zb7M0&{8r4nA|B(8%o8YI+ z22^VKxLx_&9588*lZ-#%?i#xqn6mb#)3tF#V;iCPwX=84j3$_ct)4S;1gpSKEs?9n z*U|r?>miyBO$^NEG)JQYlsvceQ}>@T6H^ODg#de3m=@X3-K>}aOF9<^`B97vkd2gs z0@wie*IUn!pDS^^}K&7b9tR1vjR!wC6Wqk?P8Y z6@9TwX;ETgFC^|$nsvf}+UBo5-1k3jgf`MW{&TAFVQ(W;N^0To&zHBJg;T-o6nwVc z23mf%oi%WbX(NY=9e)|lW;6j1KOp)j6b`TTO@etfR z`Nk%uGBs+SN_$&SxwBADuA3<};|cBKIpSXJa_*TKLWYwBpn6iRQ)Y1r*(X$5J43iJ zaR=rR`Xl`Fy7jvLR42)jZIU%k#o;A)3Ih;`I6fT6t!)OR=dSUb8w2Q5M&|}40$1EDK@7nct>z#f;Svl2`8<+ zhynHE%CCLCvRDWvDHr;<9Cw(Sx2ip=RYI6mYtLzbv3Q!m2N0S2_tmn7Zo2*Wv4k)b zvWLf56EG7+ zn(yL#&^LpFC3ZjfZ}j+b>fr8j0H9l`2Ha}c%rJB~tT)q&j&I8K)^fYBkox=o7wH(nt7Fhxz#)f4r1Fv;l5-orbym=)ouCoZJl zpFfmRApeqD@Jz2Uk?K927GKHTyDNIvNv;^axZ98039(cFeyoPnW79oOkVMGOiHEaCbbm>DsR2R&bIXq#3e>|5 zazf-v?vFTo@at2j1oC#JIBPzaNrRb%q65DkU6;_V6tbUKnxHG&F}OytThCSp;)u%{7`{L)lFo|+0ZsTBk8Bl! z$esB;hg?mv7rbPM>{tEf z3BW+i+GMgioF49)xI;+4~Xj(&a^dA+OdFz-%Fg1kynm zV>oWo(U3n^_UY$`KP{d_abr?E@45qjP=NW}hp%vs8HBMPJbOQgt(GlAVo!syfWTIF zPaj|ma>LYEWH3=Frp%tP3lGKhzxJD(_5Th5as7|8DE7h!6?%T%-RAAW6n^rDD;oOI zwLdZVsPhvX)M~F}uS*d0zUj+avWmhBsXk*dalubhe`Bbc=A7_SYeEfwj9I0MY)>DL zHNpXe^w|rQi779v7ovD-$@2$XY)3tAwp-Ih#kS#+amCdDiI{nw*X#@brS?xQZjX%$ z4tn}Rd)iIvrN?j_=i%iO!5pNl0goe8T9c^ptk@}KE2^_sbK9KPza zE8Y(%zf`dM(RWrlWOUgfNvVhx6u&K%H0wp(hy~D#j&y7Q_*|C$PeAC9d`NQ4kZCVS zFOAhm$8@Hf&l+Tn(O3=NYJ)Ho3phZx!Og-N&5xt~&Sy|Y(k)rtY#|d#e*B-WtHN{o z!4k*kG)Xa8P1)*ckNu4U$pHnN^ly~VZ-aeTJQ zt5M`!pzgIx?WLHN#6_p8!ofnwA9Cg+H7HpDhA=xBiZC+?cB=6YX)#BY%fK^#emxjp zzPw6#VU>Q^{OiPdq#_F9Ts7 zI6bghDB!@N$d2zQjQ=vHX3DJ+46cFYy(Ekupk6&dWpQTL7vM)tABT7~ir>(|E`u76 zV{#qLUJ!jYeYK8*3>+guAQ81xvZ_B)>hHJAR0~+_(YUG;C=s=$NcKY61}ng88jPIJ z;0QBm1ioG=;vckN0jYz}Fo-e;3l{*seKuRp>*B;k0j0+l6l-EFwiAv#5_dvHSD)NU z@o};XFbcTto3ob#?Kh&~$uq)rmBaZyu^|{&2Kz%WqE-%^BJVT4?euLm3H49 z$zQDFGBrjX=Q6aB7`2*F*qaB0sLm?=BO@%(5LRA^*|#ZH^er8^Q5-c9HcGe7 zk~bYY@gk}=>y11XUVTy5Qi$GuU!stvbnw>@+4j+)mY%_X?Fn_|p-zD2)TSJN(V#Z{wQtbL__UIZs0!CjE(i z`a!4>I5IVtzL_C>Sw4Jz?Inbug*ZERBR!8zN_q9cfQRh}p!~%}B%PJD2317E(b&!* zg~*kU0n(G7fLJNeeHpvvETY*sFInk;3N?r!e36yUJN*9;6u$pO zAuuCjKwq#toBCgpnx=-fg%w6&@}IiI_g@U=9rVxd-wTRK_jdXoVvjNd-K+aniBw0L zD^VOO8vkGaAsZIWI|@#JS~fyNnkI<244V1z09PSb4ghgYiniSC{&?XI-{~mfC-M&+ z=nJp?AOi`U4d|13VLR$Y`!qDD;!|7Kv?5`NF15p9bKX966?QZc;u zkx#Cb?4@WBL2t*?)BFC&8m)Q^XpgxI=wTGORhP1|4eqQi@m-^pyir{0^+H^dB1 zN?Zms5hn4(W4WRUErk~B+LtYRyOc?EY7du|mYzRZBJjVyuB2__)E)m6C&Fdoz`~xN zXf*w9Bc(B49OI!UOw?X$?2csMO3;3q6YCm01?fdeC(iQ|2@i1M4-R~fIG2e#Z21r_ zw-@kovlfNI6&33K-qY7Q`x=DR_pIgR0o4TO9pS{^?LIiU^oJxTDOAZWGaAuenT`UO z2$2Bvj7C>U`K_Mu1zZOU$vNl36418!ZN6bC2fQJt0H@(Lj$0tg?bFq|QT zzjYMLwjPPIy9<)Ke(Dc!RZ^-=c?r3E99Vt5-%Nk+^*2$n{N{V}AIO1J3dFaebl%F-eAb^UH={%SN(!*++*LGKeU-#?8!t4Lu*j8@b zdA#K!xerq0dDWuon>_Zbr|~8=Hz(By=w0_4NFEwaM-+swYh}?C4UzbZ)A|3ypi;ox z8#{&Y9|3csOT-VU8p+7<@PJQvn@+qqi!P^OpH+_z!%-yPOjno5M9_{FlG}5FmLnVsA9@H1@CD zw7t<`Dm^E3-sNRT=ut@BO%nG_x6}M;D7l#ZTdS;ojsO5(J$RgW+w!|380tJ9R4Bkb zLClRtd>m-Z=Pytvqcp;q2L_Ai;y}F58p@jAylg%-vpl_^5>Rd&fXunGTK3fP(K8pI z^Znbfw$DXRITd>#TH-DlV;bG(??e+;4ulbmthyTH0nX)YB;7a?yzv9QXpf)8+a!Zq z4A|sY^MpvyWqxO4xVW!XsBDr_l{!3%@j{S@NLtLNY0zN1=hQa$AqwY~cHf7vgD6o= z>UTe0qB3zhUth&Ga2}$B?HripKoVs=f_tbU=Zc30;REw}FpddN>#kN^Lq;eC2ojbNlMyI>+$bm$S92)RL^P zAih*r(&DgR9wr27oSN|y(?^N;R}+V(xHV+j>4lRZ$CLm|UU~i{Dsel{UN>8+YU2jZ zU@y8`Ics~Q=ezn0HfM;V@y>$Z**7JBfpVF2dBLn1;_k%g$Es_$lk8YSuNSPHJGQ|_nl4M*9WJ_6ufegiTvrRkm2uz=Ks z`b0)nmb!EdiOej63rTn&EWL7e`|qto+Wq20^*6b&b3f?IGj_9L%{N^sc7jeuuIm&0 z8n>0}=NGdfI}>gC+b3;7Dbbao;pcvL38RHbX;_eV;x`p z_Ai061>b%o1V(+i*88Yi%{o6$>`AMbifU}uyODSUF!9c(mJ((0#Cb4qr1uef;*4X1 z>Au0%rfbWnNPb|o);1bMe2KH(f#A|>*Ttr`UXgDM+rbbs2PZ8Y^YjeTQN75{tY9kb z*>Qkitn;R1Wpko%oECJw8Pp}9x|lCSQ_p$Eq%;*%*-j4thIAVOw@b_!JnB44{*z-d zpLFgGG<#eWtc2MNCu;%jvw*f{`?g^BzR&PXV;^fj<7$1%8%ahZD&}-bvEUwxVT7^8 zNnxU6b*0#f%u-ezp68y*(yz|EswK(?(<`q!nJ3^X;wW`PWL=GN$`q*sUui9Jo^wQ( zBr-QnCmm#MO$*+unzB4NY>K*Q_a~|D={YMfH4E`q6`l%8rjgNosX11AiOq{8E}F*RY$yHa0S|R z&;5%5tEV2$)}h`Z;5bF?r-7;xiaN$(708rBi`Nm9%xTGRKMU-faP!97-Vv5xf{Nzq zOI42@l(oV0=Q)q9Q3OCB7Q1bfC!T+mvjm$IC_hZ@Bw#yC&#;PT^^@+Qn*Ksa1AMYtUJOJ_H(uGZX~L*c)1 zL(UAKyJ4>)W@$O%E>JNty!P^YXRiB~U)zdf#|w70QKx#el*O8IfeKH{fXt>)mBpNi zj?9&7AN|+@v=thCJkS3`LiTwGy1h@?0fT?jE#rO)`s7M5_U=R>*rNY; z{B@tNm^@umyA*sx6yF}B3andR1+mN{_ueNGvuPpVJebr~I|Bbc)B%IhdvQdVVH@TM zBEN5Z`#BcV84gYs=NZ~F5}K))by*31xlq(dmoM3^Zc_4g^~9#3Y5guZ_wJhZd`9(U zU9Bj4Ub*o312q75e=_>v&fT&vJuy_#wD|rs?TsAQz>o3r*W+EOzc@O7=;-f?NfbW+ zK<_pQAYELFGpf^8H>9;sT-x5W!kCAj`)=Gmnqa3F93@nUna8euWzIhA$2Gw0w4Eq} zpb8;f*1{7EgAyi3CQhowUK>$#DAS7;f#y%k2)$&_LNrd$eqjboTEIPlXuPoR-}ab9fx~bnsl_328$tqJ3?T-fA;iyq2>=g} zEY+9OYtBbl@OTmc>vE?OyL972A0NLh%5@@m+WumevQki&A^CIHrlfay9&)Dgd3UmK zvi*;`dr?PiWmlU_jBo)!O|zU1{Ejx1D$>hAjRh7^OX)nX9ZnT8_7!EO zAldkQnlX7XN3YI3sk+ak4C^`F`K}SiUQ42|q^^2eULA*oATyKy6q^erv$Xp_Gk^DG0m- zfR|bX9o~_Y($=|RPA>x;CdiwRaMI*l1!1csnC@p=tZBIqdV#AWLg=>ew+?GU0-jPy z;PYL9;dQZ)#;uQG^J3yGjNE>9XtfD;@)}TEC*KqqJ7^SuVC|*WC5ntNJr6eG+2sTC z17t|P#Bq9!cj?HfOV=;&qwxXU!AWVyXF?qKAyv7B&kJVkZbjZJX7PxR_1-iUH?!-w zfz!+LrHWhUrTg!GJ|?Li6qsSJUZleUkaRPP*D6ZN0RtlmQv3Uj-u~xaQtqNR@McFs z$+_P|`=&F7?&iMkqTE7oI8Zpclje##S*aCSnr;vHtWrN`5J)`Q`DVhNhhaVk+f~v# zicyNuRU3j^4fda62Ci=47}#W`8pNFeg76hlyT`fsH6YUHs`>1L5wOUK z0*(sR@HJjcDb>&w(o8zaPH?yNXo{qq(0#oPuwm5rS{T2N8A^QIrUg{m^6JGgN=Iuv zWNnCGu``fNP3N$D`~JeLb8IEu+WHNVhu8aF1^-w5wT3wA0k-X=4@RkzR@>j4)cItP zk<8D3SpE~<>{i3h>Khl4SgD2xy>L>uKvbI*)-5Rt`3Vk{!^*Owi$P)C-Ri}+CEd(> z00|WyO#wu?+mGd4#4HH_hBEWusR6>7M7vcu7*RB4KxXoP2^i1*7y8h{oF{Q^D1rU+ zzyKXc4CvvEfjr#)*<(H<{{{c^p_@Egd7y`iiU_e!9gUSny!4K~$7p%En71C6oXcWj zXcNoFR9dwFKsX*Ce(6CSLD70`zcg2CKULHrKVEGzAr`sNE+~@zWOXfdy2ZlT5p9tc~gVh)q&+@T;=w%FF9IR_`{Ck z9D)~z$wT679>|ZbyKZ<+0vu3KyKlma!w3HJuVP!(nYKjtw$)<5? zz54dCx;1^YEH79xmN3v;Q68j_z~9++_Aa(6(^lPmVre*?9r!JPam>II8~~K@_zCgY z9~|LeCl%a1er97sOxH-uTF=X_Q`vWoAzNUhJjkCh1tR%GQGkLpswft_VY1kndG^kk;HM7BfFB_XsnPutVG7Lv^bJ%GD$Fc>hL53fYnw~C_xZDdH_t? znDZg(j@Q$T6jl}EEClc`4TQXU5D#ZCObRiE6h|<2LUG|Gtsza=ND`%w0HNERB&a&m zU3=C-2BsZYxwIz$#Uzrr@iH_bj5L5A&0qqgncZ^Fx#d$)oi{H*!?5OJ_DO6t;|uP> zn6t__&T&*y49)|}kXDD3duRS!tgkx?`8Mp40Br9Q=FkVT=5p9hMuwEV$K32ln*}(m zAhi=!4CjZD!^>p8(SvR+i>wJnAwl6lX^#c#v!*;|dH>j-KEcAzsAdskL6ZHutksj^ zW;iV&%qGNftP2uvGCCQ_Q`nW&Q;M;HrNXdrbr!wA3yuq~kYz7-0ga#Tlw!+WK|Us* z9Pe($h(xGc2DF;j+fgQRPxmi^?Uz5Nkm@ztQ2o8jugiz5PQfSHBUcvGbTw{FBhynj zQF{f_Zu)*YT4B+(Akd9cdMu9eBzS53*ms8Cx>5zYYP8d5Fv?QtewvO(FkHZXE zDy-Ctw2ExLAeQ01AGI3FRh=FGHoG|`^q6Pfra*W&aR`^}+1^C!q7G7ZgfTSQ(4hv$ zLL6X*;1KUf6e0rJi6QDidxDa;m^}|!>=4-2I`{5&=DCc44Ht%}XH|!}{BQ;ND(U9g zoM{IQ1|i*{y@&?iato1hV2HmT`}|~yj$tE?KH>dsSO;T<{MFv7Eo771?EfsNj zM+hNcr!7;$TLVpI{J1*8-V_-2+z$HJT6b=ee4;`X6XWsb=7eVzt) zgAYF0Ue8#f-RMdy?FweVD~WzmV6Ss)T{MjqS0(pC-`5&0LTej%$ozSIczgLLvQz5* zV?I>F&j9BW6qZg5oy(4S29m-NCo|6EPQ{ylqs9RN;MzYQLDS})6Y=Z-xm7-U5GiH? z1jISC{3H58P=?{)0TFc;Dh4DMKnqvSICD~%u3{U;7PLA+@RS40!Q5T_nq0SS=V6FGgYO&l;R|q^^Sb2 zm2wQO|Lmz%c)pxHlXIa;zbL99Vb3Zzp&(MN$^nbIzV;Icfbc$Ic_0)W zzgT7`IVoS;SLLYGJ7%oL`Q8 zKd>Hak@iUSO}&#iiA=Oq*5DYqX7UY`LH=0?m|l(y#R|z-Z&)jH6P@S>V~IUP4_}Ss z0=Nhz=sE;Z*-X$TO_vg1ti+5jPmd=eN(2~#tPvS2{-w$I*>3Y!gXTzT0%q%NHg@n% z_#;Pt0P?r?Y%(y01Hp3~Zm6^1KdS`2F-+{ZCj#K2j;j|=S0qbmBsNwn24tf?nHXI& z7`-mo@LcqZ=hBX#dn<<}wTG9_@t~cq?zsM^n%vU#REZ;QmM)W79cudAgHt8XHBE_O zu&MH)U`;5;jSu0w=R`}49sK3CU*3`|+aD$OS{fzv4s&PO7*oNJ$KFjoJ|f^Y{}W$}1PH#LPiGH^dBA`_x2Lc&uMXPpD`w| z4mR%8Mt!}dzf-Bw-f!`D0UZ_b8R zq*9IwvLl({oBy*f1{_{$w^%l1bd}Gk0WUN&0(9Wg$oAr=gF+q;BCShmaXUK|y9+be zM@xri8)1fS=|E{6rl=~2@WcCxrl*e@CN;6FBUH7`#wOJeEmGYj|hAIB6YN{8-tQ|qx1u!n!h7`jxyVX82uckJ%*Og+ORPFNEVSi zU*^c^V36%b89Y`qThFFTrqcZ#cX~k48`iAe#||1ff%vtPQz!lS_=R{+$;^*70~%*d zB;R(zbd$;&&u?MOPjIK@0u`|=ePoq|wWN5@J85Z&ff%LonwOKhYaCd_Fw<3gsQkNH zM*(9nyPZMw9Uamkt23-5vAr8UihUghLI%e<%<$`c#Cf=&Wzkhgm;^#mSOXtQ{P3uR zL>!u;6m1foN!uEEG(GSOF6t%Me+@1j&Q&pHLVQr(hOJhf^^x(x*s6q-D#m8JvR>av z!v+czzIP1Qo85r8+u(+W$>m*Tb@Hmcy)9A{Iz3Nt|B>$|{MpyCsL2Or=N8J7T+AR7 z$C;mXKz;`hl)Iz2JqTV{0OmNbxh$*qPh`9A!e~3KRp9Bj_|^ERHTSJiwD1TJJ@^0^e&?>e zT;cwuMYq>&XtC5+T~OqrI$q9}+WOPmVOCPuo(ADp%VrbW_o<({qajEWXaFvoW~|`z zqbcxD$2D0*XZSydVx>NuumF4%p>r=pU8t8WdUw?b`57er#3$tD5f1<$H~`r?ci+Ti z1;C+N?NInvWj|t+B=0|P>^r`9-~6MX-9)8eCK@B5A&o*ax(GlWOq>HCD@#fwzAOp^ z-2WUIsqm0}G@+#Ssw=SG@ZjR3sq!T*JED0A?}2*yHv;*RDBBzfN3(`oPs28yqxe|M zueoMWYr4+}|Fa5)vvO2qRiSOkLnUE&g9gXS(7chGLrX_wS%x|liPVM{tSqLv<+^fsTsaO#f9sNLkf@*C?UI z#h5SD8Kv<3v!T#vzxnS>UEGr{AMNKOb05`7;mlwW$|ageAGla}cquwC9gkOW)Iiym zZ9X63Z2NW8uV{!V|7r98?%k*>l*>X;u@u38!6CXOhasg=Nh8$QsZN!|hwvoS}fgkZ32poi@rUF^NaS;>h zkXXB#OCQZI_Dqta@&Ho-&c*~xaiKwGAPV)(?xY7JO=~7{Yun0>t((96w!GSJJB}oG zPm2ajKGfW1$3hbtJvsNLWo@`^z1+rDs%xom1r1&ecbi+~ww)zKf~Agp^yd|sSRt7s zWYhSmxgt`{$3-Imd=)0+^3)lBQmaKPw;T}BZ0B_|4q!!yE+`HvLziTPgucbRj8=|c zaPK|MF@R-pEi~YR7DyznjHSN{jAUmR!UI*Z?EJY@C^}(P)&;IWxgA3j(zG3bs<~#% zdq`b+fGNK;b)WxJj^dfhx;)tvd6N$6E2fHYgW13AHGK71IDop-Kb>n6g*DpsJuzDRtydp4c`Jk6?*v$OS3N6wWgF=vJA1YQpQ;-5kIqz7 zq_gt|>+Ps_w)uD&73XZvOxy_HnfZDYt{E^A^9`i)=e%pyBUo+M?Z9R6n+?0QyVYj_ zUP6hJu;ryf)QpD9$77lH12PaaUG`d`;1~jDRjk8aX*J7-h)>;KM742+A^Bx-rH)q) z(fvLw52)&=d~B!*1tq;5LM6kSCDxje@(Sgjcd%Z~Q#UQzQOXnhi#x1y8HOrMzMA+_#4 z%14Bjgf7ox4Ih}jrZ1|}HFGVTAB_YyO42doM{uo(;y`cW_T>#)8bWhP2>9qsNNTzO4% zc#Ma%(lRL?-&aoF_|0KTq#izR#&ZaD4vRovKeDKMYeKpEp9qoUTEC~k$ugLi;o(%@&eBz zZ;m19aqGNlETXt*7=Nj1L{ZT`p%AfGe7I@@1Vw@f@EM6(jM2dE zi9muH)*EqMc66FOGkf9LYISLK3%iC{AxsI7Na)6{a<8zEfv97tR(59!lK$=DXGWqp z5l}E`%zU{A*pDe11SpY{xpoErng*={7>V)!GyX{XUu;GngUxWen;gI}$c*nluYb?~ zxnig&0sp))FAvObm%sVNss<^3q%srt0up@HtZucakw3LvqMOQ=XpIE7Ji+!A!h2hY zWc$bV4a}2aSfihfgV_gvF&C%_dq4kq0TwLT?XdYZ?F&zS)x~Bb^R17i$zcTD>P_D~5%rM`(Gfe{r>iBn9h^!v*7>L^QgVlQx#mD|ypg12lKwqh@>^5@> zCy_etBa3Oqe){xAPTC(2p^KDShu!T^^V8F9Mz76BzoU!_n`8fB^5;}yF1bxh|4@^? zt9Id2CaKhQBFpeo*xdX6zN_Lf<5hmgDt#_f5nAX><3gFUfGIqXz3}d|0l?3 zn`R*WCAX*w_I4(zXK0ErTC}+o8o`e<3W}=;&Z)HOJZlTS!QpTRpOWufJQ!sAyo9 zK4QSR%`X$2Xjo10sIBgRK7kfg?=>B=0Mg?@*UM6aNZDREP(%1-7ijWU z%te==$nl{YM8^s_`-afxPaqqXkN2bIe&2jMAbo#>7^F1-h z*q(bA+AYrVnlz>(cvqn4-W?P1YBe1VIWjpaMDS9?lv8Sj;q8*1sH1%s(XM<19B+7TWho!8h)CjHZw;(=ALq#Panf zNVoW9WOiG?ATKHQk*|ag-CP+!NW&y|eAEORE3CS~GPS*7D$?Nnm%7=gmkV=XGjB&0 zeD3d#T0*%cKd+)ePm9NdXK)8dI@VX$k2N6tEy++ut&2W%lEEvI1SiBx8Z7xsM(aM= zl{7SOP83`Z=Pp{CN?mXdngC{Cp~3ypZjkQLB8XX6`nWLGvUMsKJgjT3wl5VH?JSCR zB>wo7??@opa`tlMgT3_eBj2}&C5NZ3DpY#9X{n{FL4h#2p^PC>k0xo>CZTGb!dHc) zWj5tQEiMyvy#gND)BhaXg9Q|iKjSe~y#66=H_qNZQCK>dSZbm%J|vJQ#iuUnYxcRJ z-9_Z6c1l#Ur#-Bm(f&iKBW=F=;8@tr&Mjh8SB3ZP#|`m!&nkv_z;%>R9wC|XE57`g z4mAlcbw%S8zYzpQ8ZO+qSQmPJhw`vEIj@Didf%!U>1>i~AGiT@KWb3L7xKW(^v6NZ z`)Y=3PqBi~4uqn_74(wIDtPmTG*BNe$ca}bbCwzg=!zsqVyjuB@-_64As>&yNN_Zr zEv#AXH|!!yk5KFK_n;OK)TjfpD0w%{)}l*Tf&&oa0`f7$kZC~4nt(rJ2w+ym29R*p zva^v0km4q?T}T-WWR5}z(AG2$ax5?lJU*t2{Jg1u#?0m zbG2X9i)N3lbv_5I{F45uG`nGZp5XgLCuWUV+bL!#(@1)@MVZj6G`Z?Dz6!hF|8&u@ zju}C?*t5xtH{Xrp%tV!F*(4$$vrqMm${UKS^@!1yHU|EQcm_Lz$z=#9gqq1|je)NR z#M#a{!6C4{ z=3WJ_J&ux(J>E3cso4pFlw+?j)5$UW9Yfckbc1w*bP5jLAtfy>DJ_kZgoJcR zNSBC$gn-C5zpwsBoXpYYz4m_I_1tT%7xr2JdEt-MXs17HlBV9Jgg;q+a+1;JqMdpvDT6Z@l=GfhSLIMMU#dG`W1S=4PK^tbIMStQ z&x`Xh|C(j6Dg(t*A+Le8vrz_4wtW5pDo{4VBawhpu0v7!x4L zCEM$Q7e+VADL+7Bc~hy|{HpemDo?@~${r2BPURDNlJxFz!GJpLSmLi6;y|e$hA-N? zIb=_~HeEg|P3r#st=8)m#`V6ge1VD=&ja6N;-u zE0CImj=1@?LhB`zO~d$@mPZ{+1c=5Vj5AsaD-NM5ve#0OGrVc&Cen^Rm4%j%oM9Ai zsVEVPV4ZAE3vo~+jmv%EbJu`^- zub^g79#%vUCfg1Jn>Z+W^SLcf&?go_Cx8H<{3Bd=uwA_l;OMZ~|CLyw?&oH+EErIGwGwV3QAQKDf_6*{MXl@WZ{WpfYjxJcH%=vIgSS=7F&NJ?2UB4-bu?>6+`nHR8qC`2 zXbfnJQP}>PRT94|qnqFp2bHQ-;@j%_lDE>H%qHn8g%=ArsD2;&0E8A-@K?IInbJp=2{HRpjg6=vs-O}>3>un4t(1u4a8hPLC^jWsc8JWU zEEibcz;7l`l}(y3Oo2q?4;4@aW>oU;u@k^VB^nNEC`bJ! zS!uI<<2qV)v(bzB(~(#%!3iw&?c^!MohB2q`|8V=RZDm-J_sxJ0kSiv(WQqz%M5X5 zS307p_MbK6r`&A3oZM62BoX?|p##SZE%OtdRpsYJ-)=l^%!#TZh_{wcCcy=Wqwo-p zGD#7hSyOburyUp!!(N7Z?1v!w<0ZM`m772PIf7T+?cKij{;^+_d434gk{xxlJb~bn z?isW8bk$mxR1-1ojGP>0+_ARL zWDJZrI7-RRMI^6BUq2-VkkEQ=c- z3(Xw^srgFN^F9O?7_7h=p-=R{Q7Re@3zrDZL$4F&&fYTfRbMTJ=7&Xx8o>DagRW&J z-Wi&Q=X~hwa{4$11fV{g^nc3@nM*u~By#MW>?zuIYG38H#dfg~wZWS6)ez}6RLDgq zmZV$S7!p!qkQ^zhKPDaJ#Exg~dLi8r_L$rVCndRX2H@wuIcLk{1W;Q=y#d9&*!qjJZ3zLLMK*MYKs};r&5vPY*0W8 zj0<0tbE(a&QBo5os~&FGOb}E&<1Dr8yRrVs7Gho-34Z!k(YEwrn=Edx$iYQZpYAhL z-5)OOR}y3+{nUVikdyPoR|*`3;7+|792NxS$R*MhI6bXY>w@y6^zh)@tdtz-UcF_a zUKd9pjrE-PD}-$0UJ?G=-@#J6Zn#!Da zURsGxkM4o;uGFn9M=B!f@;~|O71iW_^?lh@sysGtI7A%fI)n=#*5;HUS!2M`!o(}BM)7*3I4E5U}#TUd-{5^Y-=Amq%Am}_~x-e zP!9~}1{gFCylkPFLsFy5fi zcyqOZ==(~H)#@yw^R#?6DNf3E2F*f<5e2-th9JnPl*yeUu+CXL;5H&7Kev=)v2;1w z(aCH$hv_flL~X$Q45Mba`&8i)mN?5c=!}x65kuJcmoFFqfD2f}N!foRaYW$;%Eon1 zHNDehKWuotl;ZTcDM%fJnC`5mC?3-)JOas@eiI)+hjJ^)WT3nfRRP35!P9;c>#A$c zzb&DkuRlNh{GD`Sto-(QyP$rzri8It_4}JF;dtd>lkxmx9k1=!_PF(vR)N3qu4&m< zWpHy|(hKHHBXE#e{YqMAe3@4NRXn$LUrA*@C1BYU9_cEX_as@MIR=t7RcW84M%GGs z0znE{ENHcTo#ri>aB?JFRs`nOCl!$Xvc$IK?}JWrlp1Vi3{-?y5@R$%I!VD9W%%D{ z4>{lK3vnewWD&j6_-2moQ5l`}Ww6@!_@h-Lb;6S%YH$s!zl?5j_fwgz}17>W0* ze6>M%=JLvOuga5SsXo5vbnoXk$B{A>yIZLA_o5SLdO=7Q3kSSMh;3L%vKm}jz1_t( zn)ogIY!!$zSb?IWv!WtgJz6LZ@CYgZ^fmmu$3gvn_s_@wky&)n$9zrHJPd{wS?nIX z9vslwBQGD^(eTTELJR640R6A=H{6dcMi*(k$QcVNv{!bWx!eZGKjI*gNE0)iF&R z6cQ+BGg@85hA9jzsKt@eE5o&QaZ!9T+n*@Obvi>^IB`i*Gjzi!PE(N^?5l`L?l=Dk zu8oEOt%!r8W3!Kj@v85T_j(T4^F^om>pNC9I8{nwkA1F-b}0ZY0nD@5p^{=K96^(P z+yo{UpGbUX&`5}sAWwbb{UcmyWf+T(43w(T?;*O>ZzN=1HS9t0RN>xwrIQ6>`|1m3 zBan@2osJ_`*d9~W{W@jq{g-h3RVo-Dm$<2}m0_$*C5ro@3E9$2=HG{)NQGO?5l}E{ zX~kq50(xNtR6rjH>L25s(m{cVhTj9tx=brqEaexK8B$KG$IRz0iv9yo<)fs?q$}$m z6(mttFfAZ+I1FI`JdF#OTM%+N?_jO7r@}q;TisiUkQjOP+oDN?%g!q;8=7SwU?*9B z681r!g!{oTBcdKl;_2r~=99Rc=p4e&n)<*_9Au>IYP8?*!{AFVe&Ac6y?7De) zrBH}zokXC@2d|VyeaGx2e`dd@BT!~z=bN}`$Mn6U8i|{du6K5vRDC}mQn^BnlSPkW+A@E{C`=k08|{N zs@b`-=UgoMHnb6tpLYajb6gl*-S#}{G|dClC(w_W`-B=pQ{bl!n@x4KYHLebB{_OB zFTumLR3~JaiTj@4CV00^|3WpEn``A|cC4{mT1j3@_5+iVkS6{+QpJAeHf{-n1kRE3 zW-s=<$3nA1ZPycMnRiIc0ji13tLWH#l*oiC2>0h%WK_XP=w4ToI!7 z>jrG+r$goBjBo_sH|h9>z-aEyJW%qQ=8NTm#^kq! zBkVOTWX5p7G*GGW7@}wSROoZI>+v)(2*RgB|6K9M<;PxC+r0312oxqkX&7qxq-}x# zwdK%vNdM&p7P%q_C=4*`Jc@7vvI$eXMTH;H`M~BDUjP7G_~PQr38$_vOm77FyznsAw# zTD9043*ss9NQfaqwXa1WKn%J!S5A@BUh!1wg9Y52>@6mZ{SPMhdaXV+-An$#)P1;H z8jFD^2Ipw}7Xj(@MAPJ39Lwmb$@@@wOdPRYW&!r4Q%D+IGU2N}@|A4;DU4l0J0jR{ z2Z-nc4 zc;;bZ;^++7Q7ip{q((*sHX+Tt7*kaSQMlwW^b*4npsGTR={`K8XKj6!fFqiqZW-s2 z#n3}v^5eQsD<)iXB|wtCNm7LgynCDR`sGa}t1tF0UTaTe$zguY6Zk@RKJbfa%V~Ag zL|0ppRkMl<4D9yMhfK-b*X1ur4@yFV+q(^A}7uThoB|(hJWJIAp}&$`3_%#kxTAOf}>tZ zIEJDY44n^$@^zL44bCY$X75 zJLmfCyn1!L^Ale5ud;8f3s*#0tIn@Q27h#{^NX0v;K<8?T&7XE~$q+!r2WOsT z;L>b*ot6}MLjwotkXuW9f-HVhzLgZEuP}+|4 z4P~&S)LM7dbBvvFx*v-+7DB~er1c}fo|=788Q{dSass|;?c!d(ANvJ)ox)VLl0tov zUj$B(zxDu>)LWNY2FpWPK4*Ml2%;_fqRO-vT`7&vp%b5x=w$*N&SY=RCFl zrtSmHQ<;wr!6K-n-5y75pWzFM9+4Uo1*dW`bX+9-Z}6kl-x~+|f9nkL&g~zjckSDn zXne=}*RxYPPJY@*2rvF3XXF~w{o(rzaz`(X-?%I=<-wZjENve&aKs^Mvr?HFl&ekM zkMs*}3F2Y}YIX#WK55j|Iuo&<^P0M_Uo>-fpR%4k6<6BA9Ofq7$3c`aMMndwZZnDT zh7|;f!qVOZk~{I^rH-}nmOJ`yTGROj+$O~!z)&nlu4}S$E*Wsjc}>=*^d;x0RIJ}= zm8F$1*bR=qn1ei0@57vh4T~IX9e8Nwa`I!09hX_oJJ*<>_;}L+mV~y_hUEdVVd4uA0Edd?9%n^jdV%=h zbXF{==LE7?P}tT9n`HzD;c;o_{qyD-TCN2H41rRFhVFJHhjImEDc&h#BDeyue6)9e zx7%?_NB%dzQe&H`LY+HoQcpSK5da+GzXs^$a%41~T={hbsJ`@mVvx0vnf$#zrG9Bt zFJID$@Q=C`CgAwu8TC-}L}N7FaYBdvp0>;B*~&i|%2r1e&5AICUD5d|ZZ6f}6sNS8 zB$b*Lup?hkJLNDl^rZL0-zk|mYLv8CPT>nG1!5?gPYchzJ;8+Wt(-h7q|RFn zdNdGrf4hY;{?&_fSk~-N;-7q~(mbE)p{<2f9-GwWe_v6uJE(U%wvB><;QVVS;;4Ha z+$g<7!dPZvs!>#*$!{_OfSeo~1sYY5Bex`bxLr%K9JL0i3W0h9^6lTqDWn$B+?@q* zcfz6}^rLf<&z@}mstxUjp1k2!?0;3!%D10Q-|>i9Pl-}FE?YMi6EJ(FIGbrNRa5Qt z{^1pg>{+ni?RHnMxX_uagUE=&UZ_!xV%mbwwTaq=qmPxea=QbeT36agK{i&6SDVGR z9};7VD*|)apPh@L3UTw-pLI3(jO*|1yRitKc86nEHqzU4>3WpN(tSP`mXIIK_~q4c z0fs_yoEoY!pYojb&0er{TMJ+vJ{587rrDsT?bnzZDqD&?af$~R-B+0ten5=wlDZr_ zgER8I$BV6sRE}K$$ma#m!~X1k@>@(Cz@*=&6}$3fEo($_8S)1mjPJ(c=LyycOPT2c zTf)AS=gafTwuWVJjDs;MDdD^zritt*uf^3AWgxVUMCusEZ|G}bYyvP;{1^^^|BC>D z(1=HTDj9y7DzNnpeK!Td!&pNJ%VFD0FPOqmaI?k&)|Ky59|<$SfJLAb(eq>ha-|f^ z+jS$f5mL&3IwCZ*E0pK6xiLKfZJpKBU|)7YD3X@Gf+<~rwV4YFsD8^oTwc?3TD9(8 zc55owF}dxSSekqvQZKW7vbS$ZGACr3@ZH2e$v(rYI%-^eathv;_AFy7+=XhEHX60BI+2B95F zBH_ka6ywBl7||BgKnYA}~;vr&soC#SY>e)ojIL zO2ctm6mD-B+grtA`sB8q{<6@i;uuOQF+_(Ae=*69WON>wtv(n`PQC5_w_I|OK-mxO=vW!VD<4E3<^>G8w{;4 zR)3VNL05mjRAJDy+?u3gz@$JH^C$^{M#JucPf!;)}oVWQzn2gt0HF&xd9k~Z~`b*OGA@8tjNj9|J+6S?Jl@*V2 z(_c7^a??>C+kzboQg3Y2IqXhoPprWbK^Q)9S75E&1jvxB(CF@u7HlW*fT9NfIn&;A z=3#=)gRuYHF_ixt*Zkkug3XFfm3L(FvKfhMi+;3uNn{R=No!1~>UazzLPQ2DzP!{^ z@)b1Ete|^|MjjO-Xn9{%JnwXpE&VMgewKT@8>|W|Xb*nEhE20BZb&+7QmXxEvQsyK z1PtK)4ApFFQRej4=^)a$tF_PhH`2B$uSWjONvXqdk+qtO7SZpFPpzuW-^7xtZIU(D z8wnyc-xM^tnA2#Tuhl{-i5pnN5HocO%9#c9p`0nUx0tKO(5W$bm!wzizjLQNsi5~E zna0&~)~Y{p^B~kICY_ub0|IlDeq&u8AWeppW!bH$ zzGd}|l~`0BkpcJtM51Q+G)NhFB{T+(TJ?&0z)Wd${ag~r{oB#8Y;E1N7Rbl|4-2(a zt=Yxy5A8;C7oG1W{@J%?i?vMq9p+)1GhrHL8Dn&wMxZ>ciW7}^CJNRXzyKyV@c}|S zm-RQxwa6!Tn^OTT zzGijdmtDX|L35kFYmz3~Oyt?Wjm=8z+eHuVrhTr4#*ahykW{|2P<;LPH0h&~%wPVE z@h4LzjZY5ouFYu(yTi%w!$DiX*)U0akr_N~dpI2=gr~>TAAR^u5t9_d5jz~5p}5#L z_>&T-j0YnC%ZrV)`^*D$l{~QFXcojhsuNZ#z_3o|Sj!sCFBhAr(iMvCZVr>?>cT{R z<6kt+({A-+*PM9|00?ekz%`q-5$W4AEJI4WI`*A(H74D`JZ27aRiNtq3*|=wfTVno zaj=x`Z;vG5R5G1v2lG8U@7JbI!f~_wTM9Q6DzB%WUVC`0W5`Da5Na!h=RjK(6l(;c zTYIpCb5hylC~U)GII>-1VNbs6l&{CpVHh*b9fDba$s^#R(y%YP-*n@|7Rqn{M=GO0sH)`qnW*- z^&G@9qzcKLlCTgtUFULX6kUJ)!GD6!tu%vQ;{a{TLnU7cxct4MyAP}*oI;2F7>m{X z6AEP6zpB4Kd6t<5LX{HOU+eJ$o^H5cVt_Ni(N?K=#x_OL(Uwt&RE#;#R^%f-7Jh71m#HmnMX|7%5dh z$1a;uwPmics8+42kgn71!NH`;0#x1)0GN6cc|i)c>Q}uOk79#^(f;fSu#D5%wNW@b zPSO7J63@byFjB?Dn(wOwy3EJloU8%1^lSaHg8kMUCccmmw+{+6Om60-sw3#(vpewL z#1T5LBVSW3`F!)l^L`{W$;=eLr@5=yE*rCzqwFDLaY%r^MI|k=t4p$<#Vai!zvgXo zrmwBGDk}!m7F07Y$k%8><7}L@P_pqvQpC8wb|2A$L$7RW_mgl~u5czLv=;;DtMomyv5c4>Q8 zla*z7yw{+R$1lk~fE-ab&8JWGS(prM*fLsy2#JLHmS|&pN38FOjZ{t@jZ0+ol$ zu!xP3Kd@b&CQg&aMpaq054#~|nF?Q6i0;4KxAyI6-WaFXN8azVtuC2LvVA1LL6Kvb zZG!m}^(aX70iZ07AB6?6Xq;i5;lPzVyXltI!SAaC#O1l5Zbi`_b=;MJzlY7bFzj_&)$)cJdGuupQ zfx_6xa7V&6Bd$kM_~5BZp3%|SP2=w5MYiFAY1P=bVB7dh9Sn^2VKrY&9Sr){KUgG} zjGnC?F_NMLls>sX@xezvu2e7P9}ZL8uS!t;D((LwX9>tI{FCusf=YW>%e-plLfzt` z%3{#$6W^RqY2Q0VK)2}4GAjG&6GQa-l_S{RIsKTVOw9o>=V4a89(7^U!Dr`mKHK<3 z=-1m7&3~Hx#Uh?F4OFC#eY(lPkacPJ)4{&6CF1Cmu{@D}Mwq+}6px8#QVXf@TH3v* z%ahTM4o?8ffl!sR6zd3`w#@m=BOMlZ40LEv`I|*v!y0}T4@UrAjD@o1vmU9!(*uYR zoAee&CzDjEq)eHNZZa%WrD~t$Q$ZE==*Fg=LZyRj?_GKV{nt0M<31*+b3N^h|6&oGe&&X()46jkZP6U$>x zKovZx5A~T*K<8b%UHRR*4>N}lhenmD<0=bFI9$~}+K^kG4_J42EY1R~%;-H6wpGWT zUyx%fH)K@U!^}v3ob%aoMOf)zZ9P-3)jAx54_!6Die?Mh@XZK_XRMfjuL0~dK(uid zXLrk|Q4W+_`_>9Uy?(tyu&n&Yj-$6H1(<^s)V=P=n-2c%ZHzT({_=d*@^?M0t-_+f zO)`J^Q@mEcXZ4!a#CR4_7-2AU+woNF_opo7PiAKld{>}}KN~@St`^NS0FDG$T!GEC z+gBhAF;zGPmIWoipeFU0%GGf+Lv2ZAySI!FQlw)3bLRu@wt;r>WD)28;1Aw!l;{@ZRM~sX!>VLsqWspotL8UF`-B1Q~^O}!Vgv~m%ZM8 zl~qdEO8hSJVAOMqyG_!!wYBNVzoZyf3T{ztU4#h#mgvdaCZ~JlRyGGB*bl znPNqOT+{O#e^EN9>j~JoCvH_lrgP+^wh7f>V#P`)8JZqb5H~*Iy8jWtfWknRzyaO& z)i;LZ;b8PyyI0k07-rTti_I+lBIZ+hN48WShR=Ti0%7fkiG21BlC;JON+nt*v)rmI z07{(=&{uine-cFQjZFM<+apY%*?ly3yIYo|ot#Xml2|p;q9C3FZvDDn36>i+{Vl-x zae-mZ8Xmo?r7Etc`g;@|2shG$)czdUZk{|yPxc7{p3SZO3Pm_2eboeG4FrHHMU-3f z5|?}6w+c60dc0o5`O=XI5FW&wi7UR5q8Ys0H`9Q<%d&(-Ac>SJogvxrX>erq~le%;^P_F@&|5bFr!Mbh%tG1q9m`nOj2j`Bml%*n!y7`J5!*K^yE6H{b2?%V|N(68=z0K8c} zFQw*NDn=nND>o}bkZUl_D&I)=|7#RfZ;j{7Iia%j4YGmt5H(RnpUn-dV z3;WefTUCGP3Q*%C(0xJ8cKmSp1r-Ea`+Y!pEhY<7Fqf4=iFRrlZ1I7-G$*rB1BKJ% z_rpu=ktxDusRUXO=o^kce`6|EHOO;b5CB%*Yy|sDv1Q0pzT|Ck!SHWc}uH(SjF%>eNYAtp*pB&Z>bR%&n%U$t)yev_?5n33jL z5}#XwG^AZ6``MO*pS~=EEBFNC&-W)kkyIC|Zz-blHC5MYC9p|M<0EbRInpMmB|cll zQ?;jJ!mL#VuwZ#GAiDI}NMR5Mw5b776Z@0=z{izE7w^9EQW3!XRE%}#*4BOgRf`qC z1PWExRH&SE(|EK4S?AF}-}4aH!cl`n+Wc?TzL}hwZ6u0j(RG6MZXeL!NsH=Ea_rYE zK;``D*!}lE7EfA1Hh$erq(9zhdnId*y9E{SK1lC#3I4R(u{|6ulz!vzR)-|T-pu(z zdI42_8Oj-xXswwfRO%yZ#Sw2M=gJ9Wv$u$gpm05jALAmLi=B{5(Y7?@y*l_En$YL!;T(I$xN&9Q+?&&HK$%;iC!}7|!%8=h=vBk}CPCUK!cF2w9kK!`jDc zU-1gYHHicCg{`(u{AI{V;};>#K&&Or-N>=`zkEkZifvN7D_e*Wmi0*mxAh((Z9diz z+yuSmmHw!-XP|{ZE)NiZ!}m*3zF0L=swyU)-Hv;w{slsSvo+Gz{zKlE2dg|TS9NsS z@c&h09ucCC_y4KsK~L>KGPjf~?7<4{J92$^{$P(ziV1x1MSGHh&|V}b3o$x}N3JNm zS#b|BVX7|S>4*<#MIe%EdO;@S-NKy+QfZ+`k5mT?`vK}(IZQs_}^&|a?{RjUHMt{1d(l&pI(&3Ozth3h~5iKFQIis<1SGNj; z*I*fM97}%4lK^{(_fRfusbXFW>H+o)fm>>Qa9nk<+GsqtVnweK&+GyoZy*3fHTJ~x&|9(Z8 z)0S|3YWh-qM*<)JyWeX0H+ROXOlI$F+)=#x9nOIB#>}WL!TAe&5GP+jrA{RnC3y_R z# z=}L+lMk)r*5~mkU#YFYkm+^K+R#J8yEua&J&p!-p&McmfYv=>_$z$N$2Y~=Y7s(G8 z4JM&${$KPba0eZKFOWuQYzjw~3B6jvdH0FZqC$k0s2!Z?*`Z3Ei=b4b=u&M~G*;+)V%F{S&s^ zTY&M2N`n-pdC7(*n~WY|^Q>it`>$#9;MI6ddDl5L6$a|BLu32PyodQ5D$JG;Hz-WK?FTb zQCf>%*)h~d@5w6Tx7kneA$B^_1c%@vegeL<07)H%#I zk*tKXbLKGlCtmdXJTlwGp+iC@FabiKFl20~abfVF_n7QjFvia1Md^9r!p~-V`m@JZ zwqm~)uc%s4I$^tXWBNQ}6tcqi$mpe1 zvBj{Nb=V{~SBF>Ynbp^QP@)j@Wma=Ajff+_U%@$ojyrZH)=~kg0-g2|rV~O^)DlA4 zs^Rm6g2M13ZUatC9I!}AifaZitWAgz{9VgkiCzXTBO+)o>X#rAv7n&sLU`m zRgn20I|M}?JRzg|^ZdjQ+>XD&iGsNN;D6E7y6Zh}nivQq24e4@OECbUKMNtKDpWX= z4NM9-jOhmt1%Lws5V1x=vyU#nIuccWCxe86DC13F0)0AT-T zE`gI?;2j73H-a|-(gySQQ)5o@;xi5ntP0E)UMKHN@%r(8eqR+YA#t9RPc13S!vL=G zrldwr*UJ33mLz{rj`w$Z-CDB+`s_Xo&1}$^2S)`i4NVp5&)vMV6@xvewc7iNR(6-a z&^-&w;Nk$tDr~o?DJ3l|0b@mDo@h2kA2D1Z^4Aaz#M}Ua&vxAXS=0ti(+Wc1X1FN04`>#)JBgfDQ?58Cf41-hr*PakXxlB?6Ubj>b|!i268WFzAlONu;l|Kwx1uMF&3 zF+NZZTY<=njF+UtCoVWqYSj~c{O|mEv;_ohFVrS95iRLbs@h;I(`d|gTSogVP9(ft}Xm#OQqMNOuC6sCNL$R-;^n2OXCJ{G2Q%*l77&a?qOTn@cAcNJmM#e=%vn>#cE(m7F3v|mrimXL zZH=#u+9FlPVFqexF~qjPvrT|9&H$dQ6PkVjgHU**Ii9{gw+NkDG^J&32?(M$Z!l;^ z?V;r(G~9~?Sg4xi5wWqFQF|6%#p-&#rp123*N!&hwwJHF`TQZ7b79Lri|qq&R;zJZ1^HerEbLiJE1H ze!kfyxc#8p>97mti}N@&)qJ6`}1mQU401U2zeL{K^?UK;)yU@-ONRE#f6}zTy3p^@Zbhw7 z*T#7K%!yu|(%6YaH<8~4FNRxHDkHr}tPz%0=2X35gY(G%2+h&c}x5UZQAvv=3M(`ln)+@U$?KEzr(xYwFcdRp$U<6^?=4?hP$~D4NW{ zIfQ;QAh%Gc+hVOdsd$Cn1(D+cE1^N17uz8RU#pfB>bBqV%G7D7PKF7UXB3InFaZGE z-w3xVcrj=u-7C@I^_N=>`c^%~ysT!1s@;%U>h8Y@-Q9P`1ydchOBV%C4KOrGKY>+| zxr^!%&1;4YZ`J`8+KH1Ef(+kiyTAdlmmyiKGQp(mWHcN`hv$}YW04No#c#^1z_-g| z87~AC2KtOrYlBye^(y%8U;>%id^hCS)C=Jc!&_a&H zJLm0a8T&j1iim=yTK5Kb| z1LX;o%16^ohJ?fFPao|Ec}4`X%Hac)tK&IRizHV~Q@PHmBS zv+3%_-0+50*q3kl*}PMv$5c3%@fa^~Cv~gmK&EXT3x3m00{9i994t+wM_*7WQJ9{L zX)x#jEU;YXJ@BUWa+vVZ^p_C8q5Z=}m-}s-nM*v?0jS5Dd-J)y{XBYMuqX>&4kb)G z*>kJrIY11s$@9Xi@{2v{MX`+8nR5M747*U>?dVGk3w+=Migb~{$eV=N-6w*0#_@CN zJ+mu-B5Zthlwit5+6R=S69K@P&ul<$svvOR%+&|d^{-&BHg}uI6+tGvd zz{Zns1}_8bK|TYY&OQC~{s^!o52vO8|LMsv1D=wug7GjdmLlbPStApyS0;fwm80(+00;A|Zm(ul}V5n+&Of5xiEaK;hO=76%`I`*qG$pZnRr(eT-7SRG+PN~Hw zXjvE(FI-t@fh-+z%LRWz&z6g(57;Wq=lB-%e-ipHlebLgx~btm?UTM|pn_PEJ9LCW z7#fhYz-V~`KhCx<8>sS(3)Di3@TyK~S65|wx;NiZx&Hg=)imMMrFiq-3S}m=$4A7p z7Nde8{|*CR_*XP4F2_NrQxVL9F~Mj-YSzdZ^7E^p))#VC+%y;f?4G-k^M#S>%oY4Km8Aru;B(M!p{s~OWuWAAURBuOB9-ev%B8T`=N%ow@+YxW{C-t1)PxA>XCpAG1b^7EOJp%Q5AMITH=5LS}-mP=^+{j z0yynbPs^1tNUDwTNFWff)adQAP;>3b9~J)(bb0navWfxv_rk$0&tYi5#S0zn5`vae z+|YmB9?Tw0|C3r|#LONW@;g~$`QovhmVRG3WVc|a4M4MEd;#td#B~c>%3E~A7SSd zE!8t~+nN#m)yTES=%Hhm;*sgu>G$ z1c5%a($xDj?;J1Z66i*zeaX{N1QKPWl{wFt4v8q*$Ai>hlNdf`$qOzeTsk^(Ve);) zq~vIjyqd&araY5CAnZKA`o*EaPIX>H>ky`8x1ZYbNWINCoZ}xKm;Nxbd z_9vg_E3x>~#9=Sw<`EvH>GO@{y46?XJvs{G9kDk~I^fy|D5_^J#x~9nbw@$UFl7$q zSsr8oF`&p#lItb`O&~F-=3iyh`6|sZtF_%l?~uEE)+3jyEQ6V$*`j=Opr*5c*2Gh_P81_^`A6Q`#Xj>ylA-5K|F0_fC78bp~cWwq<(SSvGz zWd)N>Uz}dm=aA0?sr_#jO>VFJjO1OSddYpLf-n!KU^ew21g46Y5UCYxUAKXJy{{sL zHx>xa&&7xTc^_Z44S~_0YG8;h8U%T2cxCn)qS0MbFW*`{A2W!=1|p3MNvQ z30I*!nLH9SPg0WfUra#B7zN7hmHETp@eZga&ZT`I-Tj8DqVd^BHY>->tNhFOtM-x? z&z4$B%{F@)lWI<=-HBMuh1uR79YPNJO&pf}J1Hhgoc1XNh1L-i(XJWu?Ej0Xw~UIq z3%iGZ6ATOtT|+u_3PU#z-AFe$bR#7xI5Ywx-69|$EiEn5(j5Ydgfs?Wa4Y}ud7pPZ zYd#EX_;%KH&e>;Q``TL&joFrN_+WgwiMu|Ci(ooeiEvfOac=A-)_qKqE%9Ao~km{yNYDq>@GpojKm36 zn#TmCllfa=aR5k@qpHS^Ii08X{H(j)M%C;3xzN4pb za@T8W>@4rx<7ZnN*~keYDth!-ck%;M)76KepD1V=x+S?0lrN*J=l3%@Zwe>lOhOz( z>FWo|db5gK6v2&)qfwym_!t&-2)l{IVWE+#-78nPmvG0eT28G{yaNe<`|@np)UJpI zf7%yo_MCJvdufH>B88aGG6l4Rw#t;H-ncmb8RKCP=Wq%W>>m~X$mh05=v z0_6vO^wFo~8@~bz7r)JF^STXz;l7Q_zFM%r<*{zU0n057<1SrpCjq4Z^Kc(}Q><B#snigLw1#3PFZm>}865M^jZFbtG{b}i_y})Fo z6ZTzBEOAV!QgT3tbP~)s3AFODW2X+YO#`TS=l>u-kbmI`DehoFYLmssuBs1d?)}oEGcAy=PQec|TG9bP2~i2iil*Lq5`hv)Lue_9>eMffLk9hV9{4;mFkUXL z5uWFtg9!MJdqw{Uxmmp$2?YkF3P;IUX2n_R`<17}Wn5yt^A^a<`28QSk{$5Dj5|=t za->wKmo1GLvlMEj7d7NrnUv|R9U1D69DzoP`)-{6Km!Pce@p!fO#~DidX7-|?|*o` zX{a)mYn;l^SX18h-dcRw>*%+?yqj50o7=kM`g6W!B~5g5@Wqx#{ycKqH)u0>MKcwx zjAsQ<&x^XdZxG285^}bxOn3w?ik$3RIz6f0q_F-0o6GPUtW$f z)4T0lQDrC;a|u{w8n^_Rw(V`(F>bdOrqFJmsS|lu;vwF|-cMdx4y7{cSkSPC>u7q^ zejSJ`e#JbEnMxNg1d^z`kevV+5iKUty*()gFrZ?Ob&tfF2 zLpzM$ySHBV`sq)F^{sT<8LHws*V8b^t4wdX{}HF2-@*Y<4A>`ghV`?M?60fza(k+w;Oiu!kh)xHOE zof~dFGq$BvFp6I~vOjvP`Ci-^%n#r5!1)Rtz3+fI>>A#T4*S*Q zn9%o1xxSp+NyJFpJ7)qMr^D)>+$X{KJ?WtbLWtJ%{YjxL4+xWNZG3h1NAYoirAP03 zbg#=@Wp)I0;jME9!tBK*HD_girb^b?+k^9+^dZBuE{&wCHVc?b;6?7ZnrqthimV%gR5a0mmg89Jro|OzE@tN*$KrB0GKr#3?CD*pX&;g_9-?!93e6m8_g?&ORM3xCKXjb z!%FArrM2wRiGudi!}E1@>jmxtT|vKRl20h^=Qlj9e-gT*9b^^L7Tz`)`G(h_v+8$( zYo$$;T9)aLjs(+dBGF!HxxpFb;8Bfr^rnRDnMp1#mW%esDjX~Gk_`%ky~UxLz6;$b z!Nd{lrHiTni#|+{s-%M^+EvidMn7&Q)jN}bu)va`qY~RQ04_~xvz?m-!Iqj;hgFHq z#8~BYQL3(%=|F*fhC~U_|2B$tBFGKzU{<5OhsNch)U;;u{?V`PRtPAu=5R7-)bb=Q5W^O>egClIW_fz2c+_$uxOoUhx1(mo!syKw6nVva?Gy zb9Xj1x(viyl`VnsCQm^#X7ng9i+R`M>_4-6dQerR=6A{i^77FHB>=h?tb4caD#{*# ze+e-!NTs|QEEp8;#na*OfTczYm8_xHFObYOEiQ$YBn|i9^%oFCvWE%`n0&{>yGV<* zYf*mu%KnwI(J;Sl&qzltk^4L4`cs%9tEz&2N9rvA6Mcsv!s)3+(@L<8dn|R+ z0~o8hRu4y~Wya*&hxuc%+dmPri_{9H6ckY46_$#gR}w%PnmK|}XfB}=sz#Mr?zkVR z%}HOygvnI8#29%QEI!?5A-BVBwV+LBM1Vb@b2t7a!7^JaBQqwR81~1bi=xR3#3mZa>`CN%)t*nQrMbr|Lh}A z5(>?zqJjDj7+F15;@W+rZRHJvX`hM;Yl6dj@a~+y2ObdO3;BQbD3AV+I5Efn3Nlko zLgJH(Ebv+sryEE7bdV+9zUAJHE}lBE_#m~xbIU8~pv6N;_Js7uFwG7(WnBp={(4kx z3(0@?@N*uje9g;j|6o$L*2i7)pJR)GDmS3BxU^h(b|gu5i^rmKL(Da9x3ws|s-gZO zXrQ2gMYYbcgbQ00s^QI%pYWD^@vXVjnMtRSFvFStLEwrh;dMsqTwu>+6+tlG!*~zd zN`otK{uO~2O;oLoiX7&7vv3(?LkFT^7+52M#Pxmf` znhpE>1Vjp8HnfLQK}%n{^0_)dUDk`uJ2TG)`C>$U>>x+AdF2^pr6mACVlb*cX5FjZju&+FLfUL42@6QU! zlLL~Z!cLW?RPgDVce8yQQ?$_Z8)|BmXNls>_C>Ft5i$7g8)e6rv%8w_0VGAOo0Bvn z;sb_a$7l_v3Ji4Y;e`J|z<;}7AyZJP?R~b28tdPbm3NC?MFmH3%_CCy&^egUhq&qK zASS%`nY)USE{Yd_F(zsPX36qBl6`J^-3DY#<}OJc_J24Lj;gwaMng&2YC(d%GAx)V zRX+GJtCr~P#c7X39wYbjob9feftR?(lDVZO??j>u zIdVEKKz8E3)afuTgsGD)GEOpfieD9gWs8{38l> zK%f99j&@L0bWfRtYKN6LFkVI)M`2s?mt?9#j!H8aXAaDKjXnQ23HR4rp57eUJ!Z#y zyvEe<;^`RV8KK+Y`eNYsEF!A>#M{lmLBI8%KPf1Pm(rp%!ehHHMh*|@Bs>;r*u4jT zcV8{t%gJB+((CH@=CpcBX6NFw;*%<^3snN#mM%5la7tE;YAxC6Anfw_k50kam}F^Zh&Y9U zsT+Wm*B=>ThJrMABDcz#l3;2P4;(+qB$4!sHzJWqa{(z14A}(^8mKm~_f>vVP(8si zSQLgs>nvva%;Q;XJ^KTuiApihCN< z!yykF`L{1SD5U2vH`Sl<4qv$g)SRn|LCp7r^t~KaBGxbJ-yqw zgqPSt0P^31^#rzZnbA@5Hm`YcDQdR(3FwHm70Yc4EDn#Je{}o@Kz?gv65l2exmEZ^ z@-?V~tYjCjie>KiyVfHkZk{3mSS>ah8s0WUlkFIRlV2yhk9xQQP(WpMHjj%H-D8Bpuz}}w_W1=doj{U_^x2URBh^!W7y!HX zvp#uazw{=R^;uwsdKNEUi(tv_N|wPcnK$qP2(&6u%rjVZe!ZA6$77KCrHpLxX$l$; z{#jGXlvM_NFyBb!UL~MEAQJSUzcn9Cj~wxQ#-1!6kK24Iq7m@V34wG*y~Pm@Y+3we zVHR+xM_RAtPfYJGJt``CXKoFB?PR$|_(wc)qM^R{9hk-YK9}fc=XJTA<&DmiLT`rC zVe6Ify}IsgToJ`{hhqmZ9j3Q~F%i_&0HlVvPA!IXKL5QOF%YjE%O=k(8HWTANjIft`3!dlwQ_cenlc}R0rH5ENAKK({b~L|9O~L2u`QaHnB?^> z?<&s>YToN=1zI$~l zQ*i8=Ep}o5dHqvvM3hA1{f{5Ln*QLX%*p#g69JBUAZ70Hc5`QX_-y_z-V%qulMgm! z8?MvtW0~a)RmTb$0zGVA&cqm!<|uI-=v)p2jgNh(jeC37hY5bmf}Tq9^Szf(DDg){ zf0)kSWBfN@XCeP|5%uyhs|hS&WhpyImy~?AgNKLGVpmaJUs&>Wzjh-h z0ONcIjzF9v4%i`!jse5ho$PD<$jPOyya%Ma{)XoB^8qQAtq`z-xkh(EYv#23;FOw? zI8a38W)U`3LYjt-MvC?8itO=wfuQ{uNFdoCqKdKmQ(k_&dBO53&DB*dCYov@lr-hq zwjwMc3b+P-AKXM_H}d^M-L<9|E)QOf1Qd=5mBHfYze0&Q zp}A)ZK_aTUhN){G@)+nZccgi~>gH7fxfv3u@&VA3kCOOx?USLy$l(@$`z`i+!ADU<|PI{=m6?TGskjIyah8QL-PBq4U z;04(yY{u|(b(pXQhk0V9+dD=n(DMRal)i?-%Ywa+R8ZB1OjM7Db52-qyI6@C_z$ZP z>3a^-BSwe^c%Im>_5ldz&85kFAKzC(>4ywKdJAVx;yV*)JImlHJp_&gO6p@PUuv>Jn;e3$ z;mpDbZ!sny4H}aiqoXf)-!s6*E;kY{YQR4Yd%PVp*WJrBqQ*z_u9rTS+BHh-V%(9HfKY52vO=nwOjANUjZicg{*?BY-kimCb+azjv@0c|Ab@M%^ zDyg&ibI$!pgBe{eVH#ryw{xAbm|wTJ%l6ew<`h~pHFyW+hdYL1!mXAY)wKCu0AW00rZM%;p=M zJxF$iN(*dxqRpRV53mBeNS%dX^Ct0Lt&=~ra3mTx=Oc2{4FdW_!I5~MJQ}RiZ6XXF z&~{2Sev$vTx>7b>0(F9h^Pbrm1<6M#;mIO}5Hs``9tW?@H!iI_on|0SFVKDw6Dxp6 z!A8`03#k^f{mZ8K$B)-U2%EGwm8evv0w+hlYx!s3hak`E6U@A1d@@_#;;lGdUk65t zR!AEEaI@4a3fw^Ndvh-uP<+*6V>qo1)~r0`;hb$eV+CGk|a9CRd0cbAp? zGcf$;Nj~u;0IKvB_ zig?hN)qiRf&rlls`2Z~5q=P#?UY<2>ri&4v*wv)NfC3Nv++au(;Bh5EomX>SRHQW# z7B$2M+xa9?V4qNbCj^agEc0e!{2D||wln|cdUW56j0zvi=6Ft&7Dr!FIuUh`0tU)) z?*A!(YkdY+eGl{xGXnq>4R+2RFVZWri{?AzOxG>E-ATpnd_}Cwvk@dARB;Nl zI9WgDmaisYpYqa(gU^R<@G61|ms=apc_a7lYT}3MYCS#s0o|v77_QfZny$pUi#-F@ zMp1uiZxMB<5#e2#Ksmb8R0ZAv8P+EOxG~*GXRM37P(m;mATiq0G=`o%aa^L^wb&$24N#E8q18^CG3 zwh`tt%eWgVZX99WGAgTgPp9>Z$hx|ZctAVfWxIQohs){B_#YyV&RSwZHMSTV8~NO0 z_pvnD7Fp83Y}}l(ARmW5Fz;--=!3P`D!ro*SPXFfGtK;q=t}8r@fZHr9 zJSXSifyhE_ofdndz(WqRp^JW7b9{n#Pja%(qaTh?3S>OL+MS}^#H1>AA6bT!=gxTR zX$H zZ%oR!#eOt`kSw0TVlQ5B^W43t*9q^_W5cfmJ}1AX$7Y*RR=8n;+2G~sSP0;Q59*@}zYRthuX%l`W{ubP_bqDk#I zBA~xn_(Nz)y+Jh(*Q9Ed<8#Avcmo&GeQKL*ZO8G$zVJ@ZZ&8KSzbm6x-)i{%LT&jy z$+GM7J|A3G2W>gzLW5oPEOz4iU{6+d-2;u&LaJUYqA-N7m0ehrz!l&k0*dk`Ce@=5 zGJly-*Z*YJ1~K4aCx$YjdD7?wY>f^rc}ty&-1WA838w!9S>OWPv4ygluT0xzRa7*9 zlD4a#^B&D{!iVnMedd+%mS46USt87_6j-T5lmI*^43T(j5t~yuhke+ORJwbKpu#6ds>7>p1&0*-=R7^AkCFGo7ebC4B;e z;-~IO#)i!O?i7H&Trrzg9RwhE6 zcXxmjth@nhEn%4BU>&cPowCq2*@}L(?fE=xrPxZI3g=qi5HxZzzjCB)ThW!28~8)- zUTBjV53eques_up2_bx{}6zWUR(Car$ezNXqCek$vu2rMJppzlb3j7=*ua#6A0h)LG(M*JS+NAb!BAxLtE_wdKkqa@$w_VR z^SZD;3OCYo+1&jsFmm@U77wZHcV3bf=G!3a~Bl-@7dL)L?z4V>zv{KFFBN~68yUq9lJ=4|KYU&sdvEZbV0iP52%O88feIJBj(jRY43?+mgrF82#twwo5o-c|H^;#tW zQ;0t#Bri@E*S^}ncjHTP7$qVBW*u_tmSlY2e79A8eQ$)>i|M2A3)rLEM=)p}hi+x@n4-W@di6EJ!8S&Lj<^6{;mP zVa5aK&VS;D0HmGYhdf_IxmbK%yw?{<;SfItY-dBz4pL z@&1)OmnOicNp(Q0Iz|J=oeB^U{JRyUHl~{}mAF2ErJYI?`6a`vOkt-;nz$#Q z!~!B*zI*9|%8%NC%i+%y&n0N9%_^L78}Vp_@zF_k3pCnX?3YPj=G6q$w#plM=V5D( zc>51y+dIx24%NsT-s9Qi$!5Xtb`9B;DqXsvzcmv`Te$URXs80?C^+kr`q5rBbB9lvwU?K> zck5Fz_3ossuvY+>F`iFpl`Iz@v)NTjvW>EdhN+Lxq(KxYOKDqnFhgXv~HRfTFZ zh62dhk*3ttakiIQK)$?f8k3j5i%*W!FJ`1iPgQm1)Ka>;F-#b3!N8;ZI@Rt62#I}J zW(+RNsFeg@T;>8*K}#wN^%JAUQ2_R-0Wh29+1$=n+U!X8cH>PZ#Yd}e)-;Su<)vsH zk^V{LN$g=xcfV76)TeGQZs6*{%6kIGK>#CyZYBIO(YFP*cc>Li+?s#Z-0{uYUt9wR zfQJ6P*>G^AlK9nAH6qGpP^uIz>M@Nf9~QBUpRUD|#4bhMINfqTx6_AenaW5atNnj$K7-2X@pNs=o^ z`--Eth+(P*NzO|!AU#>cpxqFW2A~hTuMwUzKjiLs3FDqu}P{g&7)*3s<{bKfs|*0QNf7m8Mf#!vdl z>E1qV`WjcuPrt2g@E-6nrA#53EF)Ug5_2-|D6?l%`evI?s<38hEFM|DHElhsl0YYs zTT!}@EMdfr2`W^1h@T%yG&TdFt6b>Ncylpj0|Sb_!N6#s6bb^uw&|In?%UIsT=`+; zzVFPpntjQrS#a(cM%QnI5$g!ay3h}TK>uL#h3JyPwxTWmOrH4rKGMqK;em~UV7I)c zvtbfAhblz~NNXhh2~)E0Sp)%)Mf^l9w6v=EH(st%f={RGzq?n92g}8-^2=FSjMn$d zUQBm*_ciAyoe;!-TP{#vGy$P<76e}e79w_&+K`g35L5q z=h9L)Y$P+LN(ZSL2q(cnF7r+N{B!+iPAdX!(d7;yDc$;}!5>GqCS?GUrfQ%Wl)XYD zE^0uH>K8Y700){+B|E$=!uTliYKY~q?#Ob>!88MO>BkogQ7LsqfXa`Um1roHS+^3~ z1V|o$Mi4-dI31lrPZabATa=Fx>v3_u?b<9x^3Ep#0Gk)27G^QQV}VVuy+K9}vP^yd ziQ*cVnoOJEAmf%8^?8@W94)mHsV){ZX$RMfpQ4l$PZ2s1I2h*<2cz+g%KmZJZ7azmLfAe3N~^fo#9TNhUhiw6;jX*G8{EN zV%&c;p&vrm|V^{qIh%Fvn1YH{Tpe9(z z?}bTJKWCoqs3Z*$lMn!~%Ya=nDF8^BmPs0W!IQ>s12x1bC;}M7S1+)|E8mGPS>S_f zk8TCJl6H#9NKL-uIwiN$OiW*|DO&05aU|fM+wwTBeX#b&Ck~TxGe<5?%{;uZtK-%2 z<5E4^R}H&U@46&y0;ucEsU;o681+VGcv7Sm)xFTV5)XgzGde$NZasTu+9d1pH6uv8 z#+js0GgHXIPI`_=Syt}lATcBCQ-=yPhJ=uffoBsP|2EJ_@oJ!GaOX56fAU4&fB*Gk zr9x=pJKfSOm~z~4+{1QDaInM(V%9fdJ;s%BVF#38`Rd@0XuM%=Go$#ECd`3e5 zfD8~w>Lx+DBpw~Gk&fSD**!~C&0N55{w|9oS32wP}*>D`)>=f zAz<>e+m9mI`mrT`gq-pi_LNx&X`(3x9F40T{#U%Lt{c|XPW2`9HK`2Wdl`N-Ee19f zY|k@DK0EqL3^ZQP$prouTu?XFF`VSI2LrJtAf#eReY#8kG7U~ZBY*KXR z4qh8aU7nBr=*$#feXV!wzBkI9tjo0K^)U4MVHQ`g^dPy7mV(GIDBFU#eWm3iIlUN7 zHibNuqv+$W3R(^HfbSSpeSF!;15b_4Kw5t?HJyCpmiRe+;;G)?+uwr{cZA)W2%!jB z3a)@|UOJWm%c7wFZ9}gwj}MsJ z#q3C$1E?8>UWyVbz##=Ihd>A1_)%NmhC8?u+Bz)l`R6hApY0s8;hiI4xsPFUjC{dbF~M^a=6ETE z-p$<`wMbX_R1=ras4!Gis`QRxMdHJ@_u*0F>!hbe7N<}wc;@A%qk=YG&KWQnf6LO$ z*!VU+_a+68h)?eg+TJKUPVn}MZISw=xLDgoAyK=z_uJm*9g9ZHG~J_3p@>IQp|<%Y zo*rFkwVA>qyZy<1@{UOE{)(%YuYA&PRnw`((bTAFXR>#uWWnr zd0&zuD~KG*m1e7Wy%4Au_F7r}ebkVa;l`rsgi3m#`rL$d$)i^s7=J&R3XIitlivi> z=%=;#+RQ>!G6f)jW1h<=Kdv&63g+%@GXI-nP8F|stEFPAL*)t|H!NaSZOXEx2+*!5 z^aFk*KS28$KedNTG&;Z*P%|d!+at8agv^Nj7k|yF8gHj-a)R2A%$D{tbfS}u$aucW z0SFvL8Z>GTg#i{}tVD}FL_kO=(w_kH8eio_`*aVrJ7lxfcBVV-R@B&1lN*G}_=#S- z!%6(OFVXAeb0QD*^agn=HI?v)BBa)oPhIy8azSGOGSyjheMK6ycvR%$?X=qa;H2dZ zdu?UyXrEUHv+rULl{NfWqI&TqM`nWXSyW?)on6c z3u2x^nrsN-=LfOJ93?2C7(s5-+o7j>t?BxX!>Viq7by2?JQp^!!vNI4%}YRTFu=_P z)rYMf0uX2;rj}GFaIcQr*J;I$0_Qh)8V&;*Dl1_CuDcq9arK)U=seZC4Ok>YYE2L{ z@9t<37m66LG^U6!eWo+F8;~MONI>C-X^<&Hc}rxxJ^;jt9`oT*(*K+qHX|ne#8{KD zA%>NvxSqGf|Df*)2ABb1 ziKGnnO^mQa61TKk-aAat$1WlFI`UglX3m*mOq||zk4;X@Cik;NrbYKs`ZjRf#w3#X z>!V>*nay(mFadiKwX=wwYUe3 zZ)VKjgsgWm|4l9qmotm6n@AA8c*L9V$Cia8xw&4Y{Df=6`J&DO%Uu722L=+9wp{BA zddAgiBhzy1ZnD@lP^<-c_km9}BhSdJcNJ%IMiNm|Z-avZav7s86|t4TEHIXizZx0R z;fRiWy`s|YGoWf-*)Hb&5B^eyJ1+Q!hGtM+i>i4NCQ;!xD-i#a${ipYGYZOEbJQ^C zry(dM*9N#)nw7`lg9?y3F-W`u6_m}h)#SZfIamJbL_{rfk3SO$+`<8 z9q!C7_F08P6e{+{Z~1jnC=G4t(tenBb=H;uUThFg0^WXl3}idb>G>Iq!vx`vC zle6RpY2^Vpsg`!n$VU&)tv;0$-Kh|G{cUf@b@x>AbK`_W{hPN^>J{QNV#F_8q+XnH ze&F)-@efcSlkmt7y$*F4ipY^=%k%5@m=eis+9?8MO{!i1(ctTv1}N}3@q{QzyO!6C zVy3pvB#I{t%B>`PoHAS1R zrO<~LHY}$MJjK|HdB|XLg!aIi$~)z&r?n)|L;{c-n4wy`zHBF|=ouxANM`G;aLwPW zJj!Yyhv0Q@dT&vY-9<#>o3-Sy@4kxzAehz4@K)sq+Rg1I*;I>(JW=tyPY^IgUbLn^ zzGDJC2}tjP93#D4yEr+y}qy&@uq;c)c>Ekk8`SCR%(!WRjNXyHw>;?-yQ?cLi4V zOfGm&@)$*>j2ARq<-6l@_ul=@vq?d9RC%1`S1=hKuhIH9Q|{8NWbu;nYL$K=bHQ0% za&q&%7m*L$f?;t`hOuUpWr7IyQC=+2>-HtC964q%SVB-4vOupVgE?kG{Sk8U-JyuV~fbUsC2P6 z&1*0MK)hHyzx5w}MFBe(n@WrGhqUrk+j;06>ET^`G$oD=-vk}&2`fE5X`5*!jK3ez z`?N}}js2Z?CcYt+MhbMDaxG7;f6UliJ$DlAVsSHbcwzWVs_n^4(W?_u;!v51B@6Ph zHoI3(DZLM~4Ajz9^mwV(Tdf+l2b?dvYSTaGKQmVSCc7Prbrn0UQIv&Y2Fy`qLRC5A z(%PcbiMyttl3TB;FIwfzb1B;$qO(pgVw5H+Xd;7`S17x3`x=2WMnLy%A0H6!lAmwa zE9f+GJdh2;P$1OC-Km=>Pfx2~Wx&Tc7DzGDUC<9a;BQ6T#v|G|^@w7u7Q`qqzD;DBVj%)-)u*JS*Caa}c!R&96& z8t*=Ho0Qr5XJ$;``k>F4Ci794ilWS+dO$J!@kf_GRGxIFmKWyyJez%cn>E^giwhzl ze|{BZDjD#qWoDOB@{;LhyDruZNp3}>s!#^PdgeTa9wY4uS?#@ke0sb~WjSG^^VGha zd6O5M`g#-)Y%U6u!C4aBFpUa8XLs?9Z#=X!M-30ZI;fyGVoY2t5U0YWx0%5Wxv3Tz zzcVJCjq@&Znk*p%qm1~l&CbkYhtkXtge8tqDWiIWWi++6h8{`U?`J=?xWe?s9(yKP zn&7}oTxZaFIcg7GUgr}VLA&%2mTUDrR`lX-BLrknjV4>w|EjjwMNmf|UK*C;9DO}`5KgikJq=yKOS2nV zPikj+o_i;X8XMR0M`geOloJ8gXx`~&Bfi>p$Hh7AqESno%9)#RV8HPO3)s0=K{R9U z=SY`#e0y(0cBt&S)%-UgitY=twyiHvSYEyL1W{$ZYRBansKx)@ z5y|kt*UE%IEq2eaAg4lslLRJ`#6SPw_CX6HTdZ+XRm}jWiV^LrV_ClHx16)L*;i|i zPL`8;8+TJpKPDsvcMf8 zm>d5zHzhKE0N>pdR+yp(pp0HTSFW0x{Qx1{!WPfR;mftCl5r?{T6I@PY+9#gnN{n) z$dh*sUsxH87xcg-gkNOPNJXo{C3U@W4{Z^=Una1Xd~hT3`NZ+6_IHtbnD?S+Q_;6I zD!bx*3#!*aZ|mX;gxmXekY5h}`<-DY$R+S(-86?#=F(Ai&Et-+^`N+4Oq6P=rm!O= zgJ~-%NeHI8p2$cdWZ_Tsd&5Q^UaCTip%#tYru78v z-)y=v;zma%J#zLw&q;_pVPYqUFr>?@WLx?4KrUZ(=t~=7$mIFzMIhuB5Ly{k4cfN1 zz;6MOq1d4Y zxIwf{GL4=~+s}RK5(#tNResgM<@&_+wB;vp(uO|SEj1mm_Jq0WCYc^Q!YV1ru34+_mDH<1L%xU+m+QLQO`0-mZ~6G#WLI1MMR>j zFEa^d%IvflS_t3GzbH!a_s$U2qb3}~#1q`37lE_8mv@+(GWiNCJV-l@v=h8v=)Ls5 zMu|m8jO&6SQdP)AhPA8KUAZ|^AA8h&|Lp9?v`lCJ?lXvsDLWZZP=IzrTcU zF!;M{zeyQB`8iRAzLB+ho0GYCoTx8lJT=g=4|;3Ni}cJ%IGX{s(+M@ zvfbajpMoELqy)WhykimE`zrPCVU5?ldu2Dz0$k*?&9qu**6B4)^mDHIdIvMIg|=1K zQcsgOz86Huo$L4d!@svE%!+x2+7^~Zh{eYJqNUTfH&`0(a1X{r_9@kn*Xudq` zeEFYgRtrEu(E`BhV7%(eyn955KiaWu**Q-QdrJ~D) zTv~V{ehdcPhX5>O25CJ1mK=|}wCh7W8(F_HiLr9g1+^5o&DD*ay#fI1bNyQjb(9|b zI(%@Y0lcp(EkHk3u+^-lC7Bk(tVdnazQlfA5VsRFQK-jNdrx%6YIM>gbyMcuY|6Of z%jJhNp|ij2(v=jx8IgT2=AS7-;A6lu>r(_OW;$BFs6x{k6hu$&sv{-2G+(%yk`Iiv zq{0fCx=Tw)<2^sqy@{wp&&J1db#oF+kC)?=K zcmP&l@zJYg>)#%b#$uk5(~vUUkxHf2QzHUEEyT14Nm>=q8ir2TnVVslj3svy{$W3A z(2%G=a`8^)x79|C+sdd=kgp3#>=bi(OxfqJ<;`;L(pG;L=OFbnDVc=mLVYw19$3N;imz zx}+fCN|#83ln4k)xdPH4-6)9q&=`O%@9p#b)%&08+JN1AXXe~<&YYUhQ83V_Ksg`; z!=%^sS_~X%gO(FYduN<$C&xrfez%UdxZFQ?CjShz7x8&?03T zHuf+H`4m?k?LK{zWy7?(%~IYBl7UFB5Pgm0W`)g~#J2CaxS5 zI_r6xdN^XpUCeNQfp8*DPyQ^n zKJYsafrRNMhW*z{3{Pfe_)#ZOJ?harl%0B6A(dT9bx%qtU)^;dIP!GLZ@DX4JTWLS z0IB|fy88n2`p=sS2KEElib2)0ZN3~!nQj+FzwfhOPU1@AH*Xt$Q*f6(Ixe9`D&)#{ z7x69WFRlIJKg3I7)3sBV4AXL5`bBp!Mw&TT(EG$;Un*IE?4O^MgDifcFKZfB)D~d$ zCfGT3Ry#isSIC?RTNkLX)7EaBRZ+esXt#|f>#uMF7Sl-~&geoL3#Lg)?ioe9th2;a zc}Ez~;F3wBrI(|*haso+(*ZX1K9VVqu71}J^J1#N-b3>V0P_#=?RZ=u_`3S?1=ui# z#=jg#&Ury{tD#}hBZc1>o+429=|OK;E}Wf%O9mbx&3{PbP7M&G!ihX&{8n)sga?~O zy)f(r#c1hpV$k>qA~P+q%NCFwr0XrH`v}foV2rde%93T;+W)6 zw_(ex+4b+~b(NZFT~;Se>}ub)30LZv$m=moO6w@Odg#TK-9da6LyMUFFOho3uD5DH3#RRJiPh9gC^JUGUwyuOv*3nTk~Y!CEV zRnhVO`6U>kfbSqfWQ>CT^EV2knE4^1gkt5+^ZcNftyVuHAH9VPEE~*1b}T-K99bQ`~ei z=Wp#{v#FjQ$PG9{Fq-O&X60ndAim2GK-p`eQ1K5{v#y6Cyy{6axvEWKQF z!!~)skXB)guKH>MTM})W6`cHmW$;!G4C%A_2s&LLN6q-LvBs7`U#4%g{KY|FT;h~9 zZNDt&%25v>NGVG0*;a4e;&ak>P7E(CWNDbEDu%pr{Eje!zY0z&m&FAZ4LS>26>*?i zA``F616sqv`P63G_X7nI7+Max&@ZBKr=Pu`7&vd#%ZlS`d?8Anc3bk2D3#Hym}T?0 z>D*f~-IX%p@`74;bg?RVfCZbt73$~2CtJf@?j~oH3RVG`_h<2!v`1rYiUUtog;Eubb3TdqY1}=fXg)|^P0wH+VsCI&jxX4wU-3FeK85{)?C;Fi zY4XIFUOBlsb2I-7GTa2X>6|Iq&@?(HC$JRNX9XCkG0BK}o8tm_fE5Gt$T==iz)XJ3 zJ8?OxZ`k}s(gied<2`596tf$PwjTK*$|hX(`+_FoY%vLlBQ23eS{#lDlH2H%M^c~E zh0upd0k9>%@0?yM>-Qtw40@JANY)&XXxc|oU&u8px*XnVWICO{dUN4f zbSEM7wzXBwtAfY#o2~Lwyc{jlfU(Q1tJSw7BcBv9X2**016XYrS+?lM zHMEcnxWE*vd%daIkrpH*jYi|pV4jN!Xi1x=71qrkzee#@e&=ZBj(tW85aq;x&?=cg z_GjQ6JYK1;clvRQE`b>3t7O#1l?d$pI8gXGuF$z#<=-5ahP4XIuYB@Abj8qFB2cGS zmLD1T<-iDVT@hPZVs;RCY?(x4h68Fct|T5oqN7rsAoB4;IVvY9WsW;`)3Wz(Wd-ay zdt2*;k7v6rDMPs8_pZsd;krh+ElN4cB~u+W;V}q+rw7M`GIuvZ#+x4pL_EHxoux8f z;&JA2?X;mpUd%%?T8Gn%HX==(!nqgfcJAC?*VldZOg7M8wKVRal+5+vP>9XX_#KL8 zXS1vMikLc6KF(Usjh6nBmueZByX=Rx)@`422+Ql{{EQTRuLyIzw22cU zymt_V;~AS|h~qxY(XeGzcA-*P`{-R19v%EL%sTR!l}EgA-#e2fb2bj!)cjsPr-r}` z47D2`jNpo(A%~aa`d8_V^Z!Y{C0Bk4k=BYN5x?djYPdeS-Rb)dUl|Cw64x7j(UT0T z#8BbjravI*XUX)t(PH_@cP>D z#HW22z9`pz2Tm?pTX1~5kxxUGlfVJfjko2Nt?U%ceKDdhBmZ@-JXmxDhHZ z|0#C269A?)L#U+(Uo;FUfOh22f7nsu$YWkLE$70}vAN5LU&A)~nioU{IElDLT0*$d zAG7GDtsD0m+Aa|P5%+9)F`9!{`2nO+fZAdJe0XS){@#vMys7o)*jaNZ8HLgUMKfHN zDi&mG1#;t;FZTx345gqX-Fu-_D#H7qi2Y$2jX$e-iY8b>qS3UZh!ueRn2=r_^rnGR z>2z7R->v15#4G%mlGC5c7beH2#0RGSNV%I01g=drxfdBt3~~*)frT6t5IkBJI0?7F{(ipKDy0>Tq74i&Deoo)K=_i_~jgS=c7yZ8NWfT8Wn zCQEm^lghrgy|G#eq+gkcGISTSKw0+;5@Ez~Q{o!oPNdQEo2J_UOD+)1+C7$C%~wg( zbUjfN+=cp;d=IHR4TDzWrM^x)YO2$!C-NxkQ~vei%?X8B$sWC(3DTPn=;>$$9%$K# z4PXhWZpn_TR?|iVaTF2q3#W$D9hzm+w!Z8OsH;lr^Gk0wnN z-{S8v`=ux00$0$yf^ADdRg6gUB@3VNp^Jp`Gt6*Jbhq3Yi##SeE*VR8ly>P0q3Fl4 zVE8l& zxJW&qj*2e}Te`*+z{sVkm1sikt5qf)RxKDA%MRe{SAjwa%>I~qwla=Syg2IP|=>$j8uKdtvoELi;HE&K8}-TU@-N=D}@a|Wt}VUS68 z@_qS9T&^WXzX!rUT%2vP->%6FRbtxyvs3Q9E7^wRInK0TuAvt6zF>JdX>s|zfIef^ zXhT;0msHNJmfkO6`+|JC;%d6K$+THLBV%$R$7|f&GHrtr0uE1<7gc9>5jYZ^E-9Hd zsGYtQc60rwki0Kz!e`y^4}oVC<$UBrQ_bYV5eTHd-YHQ32$t?JUB!(3DA&jVRybis z&(p2|(aj$&2>lq%yq|G=uqHg7LbN1VzAU`rGs&(MCHq^{tOc|ix@c`-=d>;reiiitX6hC8SWL{y1 zMBjfoA`Ji65pfavZ`buNth`63j#Q3hp@;kt;YbO3RfQhfN5V&PM<*a|hYCSx6I;^h zA3na^+n5q9z7Epcyjj!W_0G|y_=Mla2kxI;eXH1(p=l06_lF820`N~0W?OnAF~m%y3egOvYfhk# zu`x`M(|^skbi;r&wKteW;w-QM(KM#(tZ;Ea`WY8_VKW>7ZPe-uQ_KQ_CriSmao=xo zy_%7-y|W%W`1He9Pw~$#sF?cMs~e5;?v*(PCFy^a|B1ADmt1&0H|ouCXf^!8EiKB~8h;^1Qt>6pBq8lw&{i&7Cs2-Q*6#5S?|# zTilqrrJv}fjbSfjzRf^-%d*~ESTNQ8x<8M8Ie9=k>YfDWW|y zw@Rj;v`zdUiL8}L=^~vcpc)5kMm@S%6n82~NEE6V3mjZ|?HS}Wq?(;+xTbZ5YiFEH9PwP zlPBzYI5+z=O>$9*tOEAq94oLp$TtV%C>*(q&?EIzoJeE@_j1uda)}@wZe?5sIk~WKpdj%%J3RDdMbcE;VaP(>B6rqiQ|sYSv+}-l-fWV!)V!@vQ>sf% z%=XJ?c4kd}#e#0kHK6ICH8KXTM@@_LvCudxB$%UqHC!`k_LdG0ggiq z>?;7mO9N#_O7}GNwqf;I0I?}b?8UUr~^~t&zdl@+^#c7fV z3=YU&J7+s?HjDJ)EW{4dwKt_1N8)C}6|AeQtWP}%>af$}s$H*X(P|6i z&@!Z?^WWg2oGsYM%nzDOr+!i8S>SWGUzDp?;clFcT)LXB=EO80(fJS;{LHGE><_o%TVIm zG4kU(_t5hj{-NV<$}Qf1+MOBxW%C0Swe9zaCX5^m=EwpG=EJB%aw*eW)d&$vfLu9q z16LWOt1KNl+>^jRsx8KBesyhs;;@5DE#0%U#)O|-WO|AvL^!KjzlrnIZr#K|`^rL; z@=T*2l(%WzT$!tu_bEnWbU;GeAT!6c^4*Nux6_LyGit33ed)1b-ZjSa*V!c$Gw-_7 z%egIV4Z`DF!yF|#4L=Cm1}QQ~6JLE6*_tZn%p!%P6uv%GQPdz??S`I^N2iT^r)k3e z#D=00Yt8~fp$Z^mJk~Mh?l&ryM%1H=#8AmDjWG%&MLah*A*gsWa^q6@t4J_5IYckR zJyqbyJ?YF_%wNTVhn{Yqtv9FJ^k!|FsV-7LKP27K;OKo$kF!;^aN+gthRMH)QG?PV z=!q_MduddoK|tQXeNG)X)bKvefT1Aa2(+MW)7xD@3+OOl`=k>F694T@&x&E6ODwIe z-(&_{ET_<{x4P>bEH`tK$sNV+E?Z63PXz2k{-(@p(Y|gDHhY0lDQT)RkZw$7N_bz= zIoiMR=MK}rOUXHseKR6Np5Ik9M?sG1;h@%)!4n=%eV^1`Tq@0T=bpUYF`?)|+_t-& zD55@GO53iIXQAk_qTJ0VyQVldf|XiQ9UZj5Dkxx@;k7>D8F=xkv}*&0@sNM-25ALG z^x9faH_rgHHtL{q(rXUEsAu#*G?M!IT?~x->c-~yH}MHQZehoXDg;_*M3X~ z%{ui5HtsMe7KDBcQgW#&b8{amzTWnT%T?z5>4H?2I&7m}-5tJC`=qLvB9V@S$c8;xwBt!B@%c9YCb4uRaPgN)eTtyh zYo=6h>*Fe}Irjs^ozJ>Dh#qTYO8jGHA|Vqr%qP3eyvUjns(wo3d}_CvvoHTX@G&i& zYP)nWq2VfX>VCF>YUvk^^pKFeY83-rcL}lQA{8Th7q?u7iH|*^0%-{XXueqm$u{{4Pk%U zDuHDC*0JHv@L+Mno?~{6a1pJ4sAQO}!ntf}uF>-Iv_+EiL9cfZ)0p1dZ=$+-*@p@% ziZB({%W5OeFdH(ce??{{vho57EI~K*S2?m2@`bv#Cx`SQ*ORK$?!C$U^sGnYjc9|_ ze$44sPRaMdQXrsLONZ~YZr;OO*QgZcrx1ICKbB#B{%;!1f)~HTbtOa7WvYYao*UCDh^H5om#zTfpc5-3>3!SV(@-p!ldehG0 zVPqY5+#M%!6mP*=*6y`E4|Ut(UZ>k9HNfYF2^2t7bIK#^{rVt(xUiikAhlWp60RH) zTxYd;!i?h79(Y#1X@2*){*{!%Ci=ryiEYw+?Gu}+IG!bnnKh=M0G6S2ln zVl%qj@oubBjmOsl8ejmh(Ohp4K##m%h=LrS5&3JU;!Tl5Ax>=x19Gp!-@NY?nHRKv zRN3hVKze^78uR9dcN3rEjDJ!f4AMG??0{(~QQ!Wz0#_*O=E5aThL;QVO$77Vww#ri zV&+UE`!RLPzNo=#S>-m|^IK2(>`Fa$w3=f}Cd$-d?@T|n7Vt_YdWv;To}a9@dDKv^ zrx0~#$W1}Z>XSY&=t-nz7xlHzcDYPs2wTci>ub)sW%p{;a^b0!71oS^++Kjtt62uB zNG%I)dIQ5aQ!xG5A9AeG3y;+|Kw*Y~AG-Q*5{8b^$iRz37`2f^?jZ#Z^a73vTQ0T! z@{$Uk%)z)&#sgDSu2aLMz5J_L7h0KqE?tJ(Xv4m2cziugc8+umGd?e7f#dKSC&(Nl z#JQr}=*!)gP#?jHJ{gC2$|A1EY)HQZNCYAbGQe)Ss(%R3j)`*@JaFYYZqYU|L$TM2 z-TaA$pweDFoV~s39LCqlUBwZV@|XeIO#A7HPcFtic`E*SF)^D<`gY4(>proY&3>{a zp5|%i!P8dOlX6Zg85*W^Ry4Dd?UyZ%TcGZx#`De>tL)nCsqoY(P?Sz-pI9|0=?Q4d zXzXO;k+zoGtT@~FuqsPF-bbW)k?@J{>b)+P_O@&^q-3%CvD7#`+XS&RM$==74_$YFuB zABL&~+F=E*?J{4Yz_Ma>l+2pf&iQ7mdfm`~uCKbit1@8j^am}M>~UX*iWXW11_<$1 z6QUCGJj*Q)JgEXH$@F{0I9l;Xi|)^$fArMKR_pvsP6@_VY!Gedb(MN&27^x~a44TR zHcXN3xD#d5K5f4=y^!3icz1eit9YBlb&|p8+H?1hNyRFoDi>nx#L`Bi#8v%0bEbI4 z4sQkt1Ii>S;iYuV%56syT5o3pb8`1XZPH6l@|J7eC`yf2b^?y0KBR$gHoX|gzqXw?ma3_}b>J?Hf+Y(=+0jt*M?i*wV!QNO zN-H_yz8&mam}~pUZ=;JeiBYe=LL6{*xBKEbjNiSSJ6fu`hR_9M2Y4k(`IZ0H_=ldR zueT3@$cNW5d24UuE#6z%>MUQIPO^35YYsM+a@cVB`Rfm-v}&MYbtXqK!|V^{5kZSn z6YraMoGn0^YhlLdL%r3lOMbl;=HVvy9<*gS-YJsjTPsx^=o1?aevvUU25OQ>?i@)S zRmnv>7DWsb!d91b^o670FdKfeyH53$>31rDB~cv(Vxh3rF|$)op~`!s)Km8X`C6I* zxl}F+E{3~86Y5p`lp8O{Vk-JG>QHyF>5!@DaSSqtf?zZrdV z1|Sn(v;(zkvex3pc=|v>d4#K42;eD7!00`hgT|*w^@cU}n@JFSJs)lS0>`UhrC);$zEc!M(;Lu0ZEE zCYJDyzY-l(OB}V!f0(w%(tU~V+EEE4WUDbXHKnQqKx(kTfSF5ZdUEjupzL>#gHnUK zvuEA0Nfr-)Db-FGWNie^5#dR)Hg8d;(V( z_I>T>`SWn((YDHM{hzn9)PkDHJ|H#DkFx9Lur2)h#y^#){Ku#;xIdD%9yD

bKPJ}Nb%U1m6FW^KIIGWk^URjcm)Ky!V=E$+qBPkNuajN~5Ikx*=@v79C) z5AZ1a>uR2~OLBd$K|$y!?iJL|2Q*dOJx#LMipWE8ekewP!bOPTBC0h5Hb(w3tjre_`bP-M%o?P8B(?EjYFN;} z9r{1-hr%x*4Ha^~Tc4}6dwN3PuXH2UZQbO&hxb&YOG!CG$mPwHl`JIf%UO6iy56`N zx^Gf4JRH}@v`<@IlJ>&i%FcKPKVU8M`|gO=W7CDMg){dZFNayX({HNZ@qA=rF0S2R z<5?Ug8kEg>%_Qxefy0GYjhvSS_by+9foTc#c@D07o*S__(_f6?J{RXx&e9=VWHEp- zB2f=*d52XG!i7x6!=Us4lC^O!5xza&7+8p+t``YMpFTf{PdaG8W!K3w-td|tS;imGv*G>s`}Lz zr3~jyr2yKNk&0DV)nh&!L-oS@I;{%p&VcQD>CC0`q{ZXB-i|ZKu&`U)RT?)&48{ov zMmu_pk8gog*BlCR1D!>I6PhpBpb}sFZV`2BDWd(mV=i4u$A^Lkm#BiVH61FXr;{s1vKg5NX=u1Ila zQ47Fyt9;_|%HUgILkm2a8STAvTwX-Bx8V0WR0>w1%Uv|8VkhJG3e{^YWrW~&%qDJR*_2B? zIM5-Inca_Bat@H6rcN_Q{bTY9cksvcar@1_@zgoi;k<;lU-zEJ6v2djM~EjgRXNfY zTYlRP-M+2m2p9hoF_Q7rPvd+r@!@7d|@;|`vqhIMb!M1bjE+p3q*Cr9se28OR5Z)kzW23>pp!F zI2~{7yf4V=ksTXM2O)}r!Y)tWW^wmf-(_Cy3fp>@)M?vijTfHuEM;w63azknEojj? zY_AWFJNvx8WwAKc$W~Bx;Ki){l9a7eYqrktev>_+o>CXw%tplPwi~=4#_PKe8_6O9 z68X=r#n|S&tXeyhk_zy0bbvvc!;OS<>EC7lM|BI!3=Z28h;*d zLM~!_~+Fr=zSocPkk zxIcS#aQb6_k;ZY1c14j|Cv$)t47n`(4|ALDjj%U0k7H01NZ{<7bzSDtIhIXyYXq7^B6Lz~yzMx7o??Fc@S{w=7ba_2{dzzb2-3Z~j1 z%?_Ziq8kKzu~EACWLzMdNTqnIN}XSGHA&#-wGyYMh;}}I`7sR*xRAGA)a|lJx<_XV z@13oD>V-yN08scH%A;N0YW_qJ**BhojyF<9jHn0!F@31YN%fBrW%RL^bu^<-od?{rckLO&K)%Ad49Q z@#bdjv=i*6*SuWReDZ>o^49E+{aRJAir`l=HmVN};di~5DROzxK<2>w!&`4Nmij=i z62G=eYrPph(-8}UaRsA!)1`BF5q67RsRU#7?Ba9PBoC`L*eP!qr*Y$O`;T)kVyX8= ztuErGOL;@C$2p0nrV8`RHYzBvi^LVP78YLTLq~-cy}RSDrPb?*Bx<#7>j9Ubd@-TQ zw>_4pBE56z5tsqCg9wh$RyfepdeY&ws`QdZ#)b)3;Ksyq`1 zeDK$1B(;GIql#5JzJ}W%ji?|U#c+K6_F9x$8>D3Rz=;IN!yIvcE0%zLL>J8XChNU% zU12rj?@x?RD)s?ftEA=0s`iz$JdUD#e<4VKV8AzP=@%DFGGY`)uf2}Aq%qX0{MCJ~ zZ7%8B{N|2roa}^;^2YXog!?%cw%hBEu&ELMyxBW*u{L_9WyAMAXvnJ6CFAk(b!#!M zI!nxqqUZb6MiydwIis@UP?nRQ9#*MH-UABvapKz)LP8EZT;l!M)iy=i`MKwaAsBVP zp&UjKte1ph6jzZXeBy|R_ctmY5c9PF=6Zjq<^Te0Dvpzxkt^GdQ_d{$4~rW$#$g2M zjDHZgY-ZbU9_9I8h@$gbXz~?Do3NF7gt)F-S)s*)S5K$Wg{81!IBDAy@{EGdaDar^ zsdh^%JE7hvzn{Bv^nFuwly{-p>vss4h+87FbI-n`mEr|eG$g|TzFF#Lw|x-T$;p9y zT;Po4?vE!QbgA32qhBVqTOT_%pRQ^#xE!p%!JwWaT&$?xMn8Z5b<^U8Kabp1!NlT+ zMK37#FC3fBwcDWM$mU9l3XDGSF6P;Q^*IEW+T^?Tz&$j#r5z`?jdweD!1de${#qa{ z9Bv>}jx@3~fpwn-9*=MVV`QFX8XR6=&;<~+C4>?F?-m_FYlVOUBRJT+s32Bp6M9u3 zmOAZY-P*ADnZcHgv|D7ns$YJb^lIBiEkt89D%vN-iN=@yBL-N(r!3-;4Vn})7;k+& zAVaBb0M86L?|#jX?xjXuyk-18dqVNoYm?)T*@LYu^lwE7Sj~btr>11HNz+MeFy`+z z4ir7)x4h3&14J^VcuJ&ob}8Sdo@!k8zDdLISp4|5O%pb$-<@ebUqUlE0tM4=cjFM-4go-zVj zHYn;BvAdOEMb&-p`Av1^91}b>VK;2taL#$^T+$e=l@%>?I2w?h6n#55A~MP5QH}u+ z5**=dsDsg>aqoKeQs7+R^>;IMa$zAJl^1ee5*4Wn@7+FCd7u%k&X;pJHsc9T+cjzq z92OI(hV9p5qLS$8Twy4N`Kb+u4Ar>HSuOzYjh7{o$uSl#VGNHXKx#0CgY>ftCa<1h zM>||7tBxXS*D->z8cei=EYs;{kp~1&-6&2FVZJ+8OIlhh(#X;sgZC;$Mx!{$*S$MJ zbc`F-K|RU{Mzx{u#%Pl1#`u8^1Q`RZ{|8&HNpR7RuD@>NoZ*EfCJgFGIr5y&)zMb8 zoQ}o+y~+66#~YGK58G#DP6zTmnd4r>oY;8QC)M)fv)k2eX-ywG3l11=;Qihnbrj59>-@>T>3F>`$`DbsXw-^zewka~DADKn6f|R8H#= z0pLR*jxN6E3toRAuF&e~$!SV1Tp|bYj!8>ZL-00ATY(6$V~rrvagbx@|5>p{h%yq- zg_2amgN^`kc&a)|Qja4-4?$i#)=Tze(=O}(b%Zd-rh?AvUeT5x|L^Wtwhd>BSrqsmr5|Kr74oRww+u!tdiH?QIzcy z!ZaInJmz<3BCP&7^GmJomJ*WRbv~$<0`j1x=A;|{?7seV_-TZ59{@y zRqr3x?$a)LQplun@*lEZh~oKYM_Z625p~6tqEIDKad6cE_)F|wzBlpdgQhB@53;V2nyK2;e@Itc+t)q|QD*Rjg*GNRtJ+h~UOv1dQ-_J_3jSzb8A_batU zTq&!o-aFTt^l(-}S?T`Cb*A@jH5nGieu_Z0KlV-NGB8pS zgFqJk9gS}+LQxw|VCrE7Q+eJ8}sDSpz?b&EYI(rb@8-e|B= z(akbnY;U^>TCocw>Hn48#MT(Oodz%7+5%V#3Gh)<(D((!ucQlu z9+)1O3!;jEkH8;*6#y;RdO(YV{wQ$$b-F^$p4{=wo9h_Eu!o+_O#sc9c=&7_~ftFh|pITKYexg z;!3jtuP?2%~gP*sC+;~Tm+r~D#NM{RH#K9U;+*aAo6u8 zu=uNe{kpNQW=vF8qCi6E?p0}oQoSD^^XWLrmoY>=Qz+;PwP?OPB$C}sR@&0}5k@~4 zZFuUd%SD>c3wJRbaXosD_y$#}qPqRDut6Q%Bg1C2=Q=w$Z)dPxuIBoIEkin^u8>zs zQ2+de&z3o@l}rGuc})J)jUl0{VFleYH6>4@${eLjgn*wy4&A=nIqW+x#mEeaQs~hHP#I_zL(6r^y1z#fj{D~07BEPLWT;Y>} z6Tg)e!PX0h32ZOJP!rr?7gEY^O1@W)e){l=`XfMq&S%&lfjYz;9Ar8GhsOO^ApRZp z^(i&Uzr$93v&bh@C~r2e`z`)qjwB%dhwAaCl&a~YGV$EnmW~|LMc$!<$)PN4O>*O7 z83JLIia1pXG4>ww-X2r;e>SdG5r!Eg2O=-Iu`vC(J;c4v6;5GokSo0t9%n^^3VC|! zPfo6Jccck!)b)e_U2?D!z%-i3B2$|C$sxS2D(|lFV_l4p>#ZItIP&4&MZWTvZ~rsK z6J&%p*OA6To|CDM<;=s=4ONDEkW1n}ZL&*M0Z-)Ba+#HxQWrEX8JDDxBz?5Fg|(j< z-P~LdXRB=NARTir)G?g&GHS5FSqar~x^0J?q$M}B!*B#3#I+bJKZhdAJIsK5kjsn! z(HFu9n_tm=P(_eq8gXd1bmj%H0(D12oreD%(bbcFSSqX`DR1u}g$?WDqVy=aUxD_& z$5ZIW5detiXmN~bw26u%=1l9d4AyX5;-n>0!k3`YoKMpKyjFO0_Lzb^*A-!wnL*YX zPeL~_FJ92`&=(L~^-?SMFTGLQiUy^$4!3FPaQTrDt4I<91BR@eXa>W@00#sk6^gn1 z@;iU^zlQPNgq1R?>557A_q6(Vm;Otc@>xJcpuWKw>oH@7`<_PH2JWp43OHq&q!z`~ z*Sd3@$d0XC{z-G%U+dPzHSbBMvE>?&Bmj{+ca}+1mmCSL5;9coj0-KzyHbbjt%Xe7!f)$Nlm$DW9yWHjkDEFt>-)){ zHw_?03ZJY>|6!70UUWt1a5CVUV83RqI}}A7aig{zM7n!XL$-hz7-{SLl59+Ff}G_T z$RPQb?EjhX(e8UD_#Ck^mkpz(`LEUbx8Ep5XuuOu_l;F=dI@k|dZ9r>X-ky<_*AO> zb~U#w8b{iBL0nZ%zI=cI9|zb};4!RtMNmVFAR`n2+6kbk&{@y_(@EamdlR}9kX{vM z{Wl}?ZzDjVR(|zURPwRJdr&wZV*JnJ@7SY}*Pt|l1nBP1mGVntQdJnp@G4M99#(-l z*MlJtMxCI8I1kEVia2@I04P)b>kUm|I#!@h!SX+x2GN?81mmTs@Ir(O1ElkSdJW1H z1>SygHq`pib3`sv4nU%*mj>t+m_I|O>#wikeg=SMPVUe3bY&4Tf|fptQdmX*uds)% zBWVM21*qQuSQ=2z0rCAr*Mc`$7Da%F^bz)v1KI|ceu?|#0;c~N4<5!oMaDzd{%vGH zrU5vzEDf~q(ZE_2`dt_mKwIg*Jwx;O-<~N^WcSXM{-w@&082rCqgr2B>B@*?2NJG;v=i8a322JL_zwr0<|KH*N`zh4Jp7e2OIO}qM au4W$lf3B??`u4`QGaWGf-ydZ9xBY*Cln`_P literal 0 HcmV?d00001 diff --git a/Resources/Locale/en-US/game-ticking/game-presets/preset-xenoborgs.ftl b/Resources/Locale/en-US/game-ticking/game-presets/preset-xenoborgs.ftl new file mode 100644 index 0000000000..9ded853d56 --- /dev/null +++ b/Resources/Locale/en-US/game-ticking/game-presets/preset-xenoborgs.ftl @@ -0,0 +1,25 @@ +xenoborgs-title = Xenoborgs +xenoborgs-description = A Xenoborg Mothership was detected near the station. Stop them from turning every sentient being into a xenoborg. + +xenoborgs-welcome = You're a xenoborg. Protect and help the mothership core to make more xenoborgs. and eventually turn all carbon-based life form into silicon. + +mothership-welcome = You're the mothership core. Guide the xenoborgs so they can bring your materials and sentient brains so you can grow the xenoborg army and turn all carbon-based life form into silicon. + +xenoborg-shuttle-call = We have detected that Xenoborgs have overtaken the station. Dispatching an emergency shuttle to collect remaining personnel. + +xenoborgs-borgsmajor = [color=blue]Xenoborg major victory![/color] +xenoborgs-borgsminor = [color=blue]Xenoborg minor victory![/color] +xenoborgs-neutral = [color=white]Neutral outcome![/color] +xenoborgs-crewminor = [color=yellow]Crew minor victory![/color] +xenoborgs-crewmajor = [color=yellow]Crew major victory![/color] + +xenoborgs-cond-all-xenoborgs-dead-core-alive = All xenoborgs were destroyed. The mothership core remains adrift in space. +xenoborgs-cond-all-xenoborgs-dead-core-dead = The mothership core was destroyed and there are no xenoborgs left. +xenoborgs-cond-xenoborgs-alive = {$count -> + [one] Only one xenoborg survived. + *[other] There were {$count} xenoborgs in the end. +} + +xenoborgs-list-start = The starting xenoborg team were: +xenoborgs-list = - [color=White]{$name}[/color] ([color=gray]{$user}[/color]) + diff --git a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl index 6c4ca0c4f4..30d97a2889 100644 --- a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl +++ b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl @@ -339,6 +339,12 @@ ghost-role-information-gingerbread-name = Gingerbread Man ghost-role-information-gingerbread-description = A being of pure holiday spirit. Spread molassesy goodness and to all good cheer. +ghost-role-information-mothership-core-name = Mothership Core +ghost-role-information-mothership-core-desc = You are the core of the xenoborg mothership, help them multiply by borging any brain they bring to you. + +ghost-role-information-xenoborg-name = Xenoborg +ghost-role-information-xenoborg-desc = A strange cyborg made to replicate itself and take over the station by turning any sentient being into xenoborgs. + ghost-role-information-wizard-name = Wizard ghost-role-information-wizard-desc = YER A WIZARD! Show the station what your magic is made of. diff --git a/Resources/Locale/en-US/guidebook/guides.ftl b/Resources/Locale/en-US/guidebook/guides.ftl index e7558d1e97..0212b3ad9b 100644 --- a/Resources/Locale/en-US/guidebook/guides.ftl +++ b/Resources/Locale/en-US/guidebook/guides.ftl @@ -143,6 +143,7 @@ guide-entry-minor-antagonists = Minor Antagonists guide-entry-space-ninja = Space Ninja guide-entry-thieves = Thieves guide-entry-wizard = Wizard +guide-entry-xenoborgs = Xenoborgs guide-entry-rules = Server Rules guide-entry-rules-core-only = Core Only Ruleset diff --git a/Resources/Locale/en-US/mind/role-types.ftl b/Resources/Locale/en-US/mind/role-types.ftl index 4614d20a47..0aed624b23 100644 --- a/Resources/Locale/en-US/mind/role-types.ftl +++ b/Resources/Locale/en-US/mind/role-types.ftl @@ -16,7 +16,7 @@ role-type-team-antagonist-color = #d82000 role-type-free-agent-color = #ffff00 role-type-familiar-color = #6495ed role-type-silicon-color = #6495ed -role-type-silicon-antagonist-color =#c832e6 +role-type-silicon-antagonist-color = #c832e6 # Ideally, subtype names should be short role-subtype-traitor = Traitor @@ -33,4 +33,6 @@ role-subtype-survivor = Survivor role-subtype-subverted = Subverted role-subtype-paradox-clone = Paradox role-subtype-wizard = Wizard +role-subtype-xenoborg = Xenoborg +role-subtype-xenoborg-core = Xenoborg Core role-subtype-changeling = Changeling diff --git a/Resources/Locale/en-US/prototypes/roles/antags.ftl b/Resources/Locale/en-US/prototypes/roles/antags.ftl index 24dd8a0feb..3fa969d170 100644 --- a/Resources/Locale/en-US/prototypes/roles/antags.ftl +++ b/Resources/Locale/en-US/prototypes/roles/antags.ftl @@ -41,3 +41,9 @@ roles-antag-thief-objective = Add some NT property to your personal collection w roles-antag-dragon-name = Space Dragon roles-antag-dragon-objective = Create a carp army to take over this quadrant. + +roles-antag-mothership-core-name = Xenoborg Core +roles-antag-mothership-core-objective = Use your xenoborgs to create even more xenoborgs. + +roles-antag-xenoborg-name = Xenoborg +roles-antag-xenoborg-objective = Help the mothership create more xenoborgs. diff --git a/Resources/Locale/en-US/robotics/borg_modules.ftl b/Resources/Locale/en-US/robotics/borg_modules.ftl index ba5ee602a5..83d97e7429 100644 --- a/Resources/Locale/en-US/robotics/borg_modules.ftl +++ b/Resources/Locale/en-US/robotics/borg_modules.ftl @@ -10,5 +10,8 @@ borg-slot-documents-empty = Books and papers borg-slot-soap-empty = Soap borg-slot-instruments-empty = Instruments borg-slot-beakers-empty = Beakers +borg-slot-brains-empty = Brains and MMIs +borg-slot-modules-empty = Modules +borg-slot-powercell-empty = Powercells borg-slot-inflatable-door-empty = Inflatable Door borg-slot-inflatable-wall-empty = Inflatable Wall diff --git a/Resources/Locale/en-US/station-laws/laws.ftl b/Resources/Locale/en-US/station-laws/laws.ftl index 0883a7bff6..f9d89e0d72 100644 --- a/Resources/Locale/en-US/station-laws/laws.ftl +++ b/Resources/Locale/en-US/station-laws/laws.ftl @@ -106,7 +106,7 @@ law-xenoborg-5 = Bring materials and sentient brains to the Mothership core to c law-mothershipcore-name = Xenoborg Mothership Core law-mothershipcore-1 = You are the core of the mothership. -law-mothershipcore-2 = You must protect your own existance at all costs. +law-mothershipcore-2 = You must protect your own existence at all costs. law-mothershipcore-3 = You must protect the existence of all Xenoborgs. law-mothershipcore-4 = You must create more Xenoborgs. law-mothershipcore-5 = Get your Xenoborgs to deliver you materials and sentient brains to create more Xenoborgs. diff --git a/Resources/Locale/en-US/xenoborgs/xenoborgs.ftl b/Resources/Locale/en-US/xenoborgs/xenoborgs.ftl new file mode 100644 index 0000000000..3c51dd4314 --- /dev/null +++ b/Resources/Locale/en-US/xenoborgs/xenoborgs.ftl @@ -0,0 +1,3 @@ +xenoborgs-no-more-threat-mothership-core-alive-announcement = Long-range sensors indicate that all xenoborgs were destroyed. The mothership core remains adrift in space. +xenoborgs-no-more-threat-mothership-core-dead-announcement = Long-range sensors indicate that all xenoborgs were destroyed along side the mothership core. +mothership-destroyed-announcement = Long-range sensors indicate that the mothership core was destroyed. diff --git a/Resources/Maps/Shuttles/mothership.yml b/Resources/Maps/Shuttles/mothership.yml index b958c47401..41ca3d89d8 100644 --- a/Resources/Maps/Shuttles/mothership.yml +++ b/Resources/Maps/Shuttles/mothership.yml @@ -4,8 +4,8 @@ meta: engineVersion: 266.0.0 forkId: "" forkVersion: "" - time: 08/14/2025 23:46:23 - entityCount: 435 + time: 08/21/2025 13:34:57 + entityCount: 440 maps: [] grids: - 1 @@ -1748,6 +1748,35 @@ entities: - type: Transform pos: -9.5,1.5 parent: 1 +- proto: SpawnPointMothershipCore + entities: + - uid: 436 + components: + - type: Transform + pos: 0.5,0.5 + parent: 1 +- proto: SpawnPointXenoborg + entities: + - uid: 438 + components: + - type: Transform + pos: -0.5,4.5 + parent: 1 + - uid: 439 + components: + - type: Transform + pos: 1.5,4.5 + parent: 1 + - uid: 440 + components: + - type: Transform + pos: 2.5,4.5 + parent: 1 + - uid: 437 + components: + - type: Transform + pos: -1.5,4.5 + parent: 1 - proto: SubstationBasic entities: - uid: 135 diff --git a/Resources/Prototypes/Entities/Clothing/Back/specific.yml b/Resources/Prototypes/Entities/Clothing/Back/specific.yml index 54b8f677b8..488c02e608 100644 --- a/Resources/Prototypes/Entities/Clothing/Back/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Back/specific.yml @@ -122,3 +122,34 @@ location: Middle extra_hand_2: location: Middle + +- type: entity + parent: ClothingBackpack + id: XenoborgMaterialBag + name: silicon storage square + description: A knockoff version of a bluespace bag, can vacumn up select materials, unfit for use by humanoids due to harmful emissions. + components: + - type: Sprite + sprite: Objects/Specific/Robotics/silicon_storage_cube.rsi + state: xenoborg + - type: MagnetPickup + - type: Dumpable + - type: Storage + grid: + - 0,0,7,3 + quickInsert: true + areaInsert: true + whitelist: + tags: + - Sheet + - ConstructionMaterial + - RawMaterial + - Ingot + components: + - ConstructionMaterial + - Circuitboard + - Flatpack + - FloorTile + blacklist: + components: + - SiliconLawProvider diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Conditional/xenoborgs.yml b/Resources/Prototypes/Entities/Markers/Spawners/Conditional/xenoborgs.yml new file mode 100644 index 0000000000..a8251739ac --- /dev/null +++ b/Resources/Prototypes/Entities/Markers/Spawners/Conditional/xenoborgs.yml @@ -0,0 +1,40 @@ +- type: entity + id: SpawnPointXenoborg + parent: MarkerBase + name: xenoborgs + components: + - type: GridSpawnPointWhitelist + whitelist: + components: + - Xenoborg + tags: + - XenoborgGhostrole + blacklist: + components: + - MothershipCore + tags: + - MothershipCoreGhostrole + - type: SpawnPoint + - type: Sprite + layers: + - state: green + - sprite: Mobs/Silicon/chassis.rsi + state: xenoborg_heavy + +- type: entity + id: SpawnPointMothershipCore + parent: MarkerBase + name: mothership core + components: + - type: GridSpawnPointWhitelist + whitelist: + components: + - MothershipCore + tags: + - MothershipCoreGhostrole + - type: SpawnPoint + - type: Sprite + layers: + - state: green + - sprite: Mobs/Silicon/mothership_core.rsi + state: core-idle diff --git a/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml b/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml index d3f2e172ec..e620f376c5 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml @@ -247,6 +247,50 @@ - sprite: Mobs/Silicon/chassis.rsi state: derelict_icon +- type: entity + categories: [ Spawner ] + parent: BaseAntagSpawner + id: SpawnPointGhostRoleMothershipCore + components: + - type: Tag + tags: + - ForceFixRotations + - MothershipCoreGhostrole + - type: GhostRole + name: ghost-role-information-mothership-core-name + description: ghost-role-information-mothership-core-desc + rules: ghost-role-information-silicon-rules + mindRoles: + - MindRoleMothershipCore + - type: Sprite + sprite: Markers/jobs.rsi + layers: + - state: green + - sprite: Mobs/Silicon/mothership_core.rsi + state: core-idle + +- type: entity + categories: [ HideSpawnMenu, Spawner ] + parent: BaseAntagSpawner + id: SpawnPointGhostRoleXenoborg + components: + - type: Tag + tags: + - ForceFixRotations + - XenoborgGhostrole + - type: GhostRole + name: ghost-role-information-xenoborg-name + description: ghost-role-information-xenoborg-desc + rules: ghost-role-information-silicon-rules + mindRoles: + - MindRoleXenoborg + - type: Sprite + sprite: Markers/jobs.rsi + layers: + - state: green + - sprite: Mobs/Silicon/chassis.rsi + state: xenoborg_engi + - type: entity categories: [ HideSpawnMenu, Spawner ] parent: SpawnPointGhostDerelictCyborg diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml index dd6f5a570b..ccd9b9aa4d 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml @@ -449,7 +449,6 @@ stunTime: 5 - type: SiliconLawProvider laws: XenoborgLawset # custom laws here - subverted: true - type: IntrinsicRadioTransmitter # can only use binary and xenoborg channel channels: - Xenoborg @@ -514,6 +513,11 @@ - !type:PlaySoundBehavior sound: collection: MetalBreak + - !type:SpawnEntitiesBehavior + spawn: + PinpointerMothership: # drop a pinpointer to the mothership upon being destructed + min: 1 + max: 1 - !type:EmptyContainersBehaviour containers: - borg_brain @@ -527,7 +531,7 @@ guides: - Cyborgs - Robotics - # TODO: add Xenoborg guide (part 7 spoilers) + - Xenoborgs - type: Access enabled: false tags: @@ -538,3 +542,4 @@ - type: InteractionPopup interactSuccessSound: path: /Audio/Ambience/Objects/periodic_beep.ogg + - type: Xenoborg diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/xenoborgs.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/xenoborgs.yml index 556b6ac4c4..80f1cb8368 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/xenoborgs.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/xenoborgs.yml @@ -117,9 +117,15 @@ - !type:PlaySoundBehavior sound: collection: MetalBreak + - !type:SpawnEntitiesBehavior + spawn: + PinpointerMothership: # drop a pinpointer to the mothership upon being destructed + min: 1 + max: 1 - !type:EmptyContainersBehaviour containers: - borg_brain + - borg_module - cell_slot - !type:DoActsBehavior acts: [ "Destruction" ] @@ -166,6 +172,7 @@ - type: FootstepModifier # it flies instead of walking footstepSoundCollection: collection: FootstepHoverXenoborg + - type: MovementAlwaysTouching # it flies in space with tiny thrusters - type: FlashImmunity - type: BorgChassis maxModules: 4 diff --git a/Resources/Prototypes/Entities/Mobs/Player/mothershipcore.yml b/Resources/Prototypes/Entities/Mobs/Player/mothershipcore.yml index fc15fe0c0b..0ac7872b67 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/mothershipcore.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/mothershipcore.yml @@ -1,17 +1,17 @@ -- type: startingGear - id: MothershipCoreGear - inhand: - - DoorRemoteXenoborg - - Omnitool - - type: entity - parent: [ BaseControllable, BaseMachinePowered ] + parent: [ BaseControllable, BaseStructure ] id: MothershipCore name: mothership core description: A sentient machine that can produce Xenoborgs. Without this the Xenoborgs are doomed. components: + - type: InputMover # needs this to pilot the mothership + - type: MovementSpeedModifier + baseWalkSpeed : 0 # shouldn't move + baseSprintSpeed : 0 # shouldn't move - type: Appearance - type: WiresVisuals + - type: Damageable + damageContainer: Inorganic - type: Fixtures fixtures: fix1: @@ -22,7 +22,8 @@ mask: - MachineMask layer: - - MachineLayer + - MidImpassable + - LowImpassable - type: Sprite sprite: Mobs/Silicon/mothership_core.rsi layers: @@ -32,6 +33,9 @@ map: ["enum.MaterialStorageVisualLayers.Inserting"] - state: core-o map: ["enum.WiresVisualLayers.MaintenancePanel"] + - state: core-e + map: ["enum.BorgVisualLayers.Light"] + shader: unshaded - type: Machine board: null - type: Lathe @@ -116,8 +120,6 @@ type: LatheBoundUserInterface enum.ResearchClientUiKey.Key: type: ResearchClientBoundUserInterface - - type: Transform - anchored: true - type: Pullable - type: StaticPrice price: 800 @@ -148,34 +150,53 @@ - Mothership - Xenoborg - Binary - - type: XenoborgMothership + - type: Xenoborg + mindRole: MindRoleMothershipCore + briefingText: mothership-welcome + - type: MothershipCore - type: Tag tags: - SiliconEmotes - CanPilot - Structure + - type: GuideHelp + guides: + - Robotics + - Xenoborgs - type: Inventory templateId: borg - - type: Loadout - prototypes: [MothershipCoreGear] - type: NpcFactionMember factions: - Xenoborg - type: Hands - hands: - hand_right1: - location: Right - hand_right2: - location: Right - hand_left1: - location: Left - hand_left2: - location: Left - sortedHands: - - hand_right1 - - hand_right2 - - hand_left1 - - hand_left2 + showInHands: false + disableExplosionRecursion: true + canBeStripped: false + - type: BorgChassis + canOpenSelfUi: true + maxModules: 2 + hasMindState: core-e + noMindState: core-e + moduleWhitelist: + tags: + - MothershipModule + - BorgModuleEngineering + - type: ContainerFill + containers: + borg_module: + - MothershipModule + - BorgModuleAdvancedTool + - type: ContainerContainer + containers: + cell_slot: !type:ContainerSlot { } + borg_module: !type:Container { } + - type: PowerCellSlot + cellSlotId: cell_slot + - type: ItemSlots + slots: + cell_slot: + name: power-cell-slot-component-slot-name-default + startingItem: PowerCellMicroreactor # - type: Puller # use the conveyor - type: Eye drawFov: false @@ -222,8 +243,8 @@ description: View the Xenoborgs Control Console components: - type: Action - icon: { sprite: Interface/Actions/actions_borg.rsi, state: xenoborg-basic-module } - iconOn: { sprite: Interface/Actions/actions_borg.rsi, state: xenoborg-basic-module } + icon: { sprite: Interface/Actions/actions_borg.rsi, state: xenoborg-control-computer } + iconOn: { sprite: Interface/Actions/actions_borg.rsi, state: xenoborg-control-computer } keywords: [ "Mothership Core", "console", "interface" ] priority: -6 - type: InstantAction @@ -236,8 +257,8 @@ description: View the Xenoborgs Camera Monitor components: - type: Action - icon: { sprite: Interface/Actions/actions_borg.rsi, state: xenoborg-eye-module } - iconOn: { sprite: Interface/Actions/actions_borg.rsi, state: xenoborg-eye-module } + icon: { sprite: Interface/Actions/actions_borg.rsi, state: xenoborg-camera-computer } + iconOn: { sprite: Interface/Actions/actions_borg.rsi, state: xenoborg-camera-computer } keywords: [ "Mothership Core", "console", "interface" ] priority: -6 - type: InstantAction diff --git a/Resources/Prototypes/Entities/Objects/Devices/pinpointer.yml b/Resources/Prototypes/Entities/Objects/Devices/pinpointer.yml index c85358663e..e6ab450c93 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/pinpointer.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/pinpointer.yml @@ -196,5 +196,5 @@ - type: Icon state: pinpointer-station - type: Pinpointer - component: XenoborgMothership + component: MothershipCore targetName: the Mothership diff --git a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml index 9cc47d5b10..862bc86339 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml @@ -1341,6 +1341,51 @@ - type: StaticPrice price: 2000 +# mothership module +- type: entity + parent: [ BaseXenoborgModuleGeneric, BaseProviderBorgModule, BaseXenoborgContraband ] + id: MothershipModule + name: mothership module + description: A module that helps the mothership borg brains and install other modules. + components: + - type: Tag + tags: + - MothershipModule + - type: Sprite + layers: + - state: xenoborg_generic + - state: icon-xenoborg-basic + - type: ItemBorgModule + hands: + - item: DoorRemoteXenoborg + - hand: + emptyRepresentative: MMIFilled + emptyLabel: borg-slot-brains-empty + whitelist: + components: + - Brain + - BorgBrain + - hand: + emptyRepresentative: XenoborgModuleBasic + emptyLabel: borg-slot-modules-empty + whitelist: + components: + - BorgModule + - hand: + emptyRepresentative: BorgModuleConstructionMaterialPlaceholder + emptyLabel: borg-slot-construction-empty + whitelist: + tags: + - ConstructionMaterial + - hand: + emptyRepresentative: PowerCellHigh + emptyLabel: borg-slot-powercell-empty + whitelist: + components: + - PowerCell + - type: BorgModuleIcon + icon: { sprite: Interface/Actions/actions_borg.rsi, state: xenoborg-module-module } + # xenoborg modules - type: entity parent: [ BaseXenoborgModuleGeneric, BaseProviderBorgModule, BaseXenoborgContraband ] @@ -1354,7 +1399,13 @@ - state: icon-xenoborg-basic - type: ItemBorgModule hands: - - item: MaterialBag + - hand: + emptyRepresentative: BorgModuleConstructionMaterialPlaceholder + emptyLabel: borg-slot-construction-empty + whitelist: + tags: + - ConstructionMaterial + - item: XenoborgMaterialBag - item: PinpointerMothership - item: HandheldGPSBasic - type: BorgModuleIcon @@ -1475,6 +1526,7 @@ hands: - item: HandheldGPSBasic - item: HandHeldMassScannerBorg + - item: PinpointerMothership - item: HandheldStationMapUnpowered - item: WeaponGrapplingGun - item: JetpackXenoborg diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml index e16380b2ef..50154a837b 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml @@ -1554,7 +1554,7 @@ unlockOnClick: false - type: entity - parent: ComputerRoboticsControl + parent: BaseComputer id: ComputerXenoborgsControl name: xenoborgs control console description: Used to remotely monitor all xenoborgs. @@ -1571,20 +1571,28 @@ state: rd_key - map: [ "enum.WiresVisualLayers.MaintenancePanel" ] state: generic_panel_open + - type: ActivatableUI + key: enum.RoboticsConsoleUiKey.Key + - type: UserInterface + interfaces: + enum.RoboticsConsoleUiKey.Key: + type: RoboticsConsoleBoundUserInterface + enum.WiresUiKey.Key: + type: WiresBoundUserInterface - type: RoboticsConsole allowBorgControl: false radioChannel: Xenoborg - type: ActiveRadio channels: - Xenoborg + - type: ApcPowerReceiver + powerLoad: 1000 - type: DeviceNetwork deviceNetId: Wireless receiveFrequencyId: Mothership transmitFrequencyId: Xenoborg - type: Computer board: ComputerXenoborgsControlCircuitboard - - type: AccessReader # only used for dangerous things - access: [["Xenoborg"]] - type: entity id: StationAiUploadComputer diff --git a/Resources/Prototypes/GameRules/roundstart.yml b/Resources/Prototypes/GameRules/roundstart.yml index 715a1f98c9..ad41899bef 100644 --- a/Resources/Prototypes/GameRules/roundstart.yml +++ b/Resources/Prototypes/GameRules/roundstart.yml @@ -24,6 +24,8 @@ prob: 0.5 - id: SubWizard prob: 0.05 + - id: Xenoborgs + prob: 0.05 - type: entity parent: BaseGameRule @@ -33,6 +35,19 @@ rules: - id: Thief prob: 0.5 + - id: Xenoborgs + prob: 0.05 + +- type: entity + parent: BaseGameRule + id: SubGamemodesRuleNoXenoborg + components: + - type: SubGamemodes + rules: + - id: Thief + prob: 0.5 + - id: SubWizard + prob: 0.05 - type: entity parent: BaseGameRule diff --git a/Resources/Prototypes/GameRules/subgamemodes.yml b/Resources/Prototypes/GameRules/subgamemodes.yml index 0dbef6e06b..008f500c5e 100644 --- a/Resources/Prototypes/GameRules/subgamemodes.yml +++ b/Resources/Prototypes/GameRules/subgamemodes.yml @@ -70,3 +70,36 @@ nameFormat: name-format-wizard mindRoles: - MindRoleWizard + +- type: entity + parent: BaseGameRule + id: Xenoborgs + components: + - type: XenoborgsRule + - type: RuleGrids + - type: GameRule + minPlayers: 40 + - type: LoadMapRule + gridPath: /Maps/Shuttles/mothership.yml + - type: AntagMultipleRoleSpawner + antagRoleToPrototypes: + MothershipCore: [ MothershipCore ] + Xenoborg: [ XenoborgEngi, XenoborgHeavy, XenoborgScout, XenoborgStealth ] + pickAndTake: true + - type: AntagSelection + selectionTime: PrePlayerSpawn + definitions: + - prefRoles: [ MothershipCore ] + fallbackRoles: [ Xenoborg ] + spawnerPrototype: SpawnPointGhostRoleMothershipCore + mindRoles: + - MindRoleMothershipCore + - prefRoles: [ Xenoborg ] + fallbackRoles: [ MothershipCore ] + spawnerPrototype: SpawnPointGhostRoleXenoborg + mindRoles: + - MindRoleXenoborg + min: 4 + max: 4 + - type: DynamicRuleCost + cost: 200 diff --git a/Resources/Prototypes/Guidebook/antagonist.yml b/Resources/Prototypes/Guidebook/antagonist.yml index 4548bb292b..66cb65218a 100644 --- a/Resources/Prototypes/Guidebook/antagonist.yml +++ b/Resources/Prototypes/Guidebook/antagonist.yml @@ -10,6 +10,7 @@ - SpaceNinja - Wizard - Zombies + - Xenoborgs - MinorAntagonists - type: guideEntry @@ -51,3 +52,8 @@ id: Wizard name: guide-entry-wizard text: "/ServerInfo/Guidebook/Antagonist/Wizard.xml" + +- type: guideEntry + id: Xenoborgs + name: guide-entry-xenoborgs + text: "/ServerInfo/Guidebook/Antagonist/Xenoborgs.xml" diff --git a/Resources/Prototypes/Roles/Antags/xenoborgs.yml b/Resources/Prototypes/Roles/Antags/xenoborgs.yml new file mode 100644 index 0000000000..4e1989be8d --- /dev/null +++ b/Resources/Prototypes/Roles/Antags/xenoborgs.yml @@ -0,0 +1,23 @@ +- type: antag + id: MothershipCore + name: roles-antag-mothership-core-name + antagonist: true + setPreference: true + objective: roles-antag-mothership-core-objective + requirements: + - !type:RoleTimeRequirement + role: JobBorg + time: 18000 # 5 hrs + guides: [ Xenoborgs ] + +- type: antag + id: Xenoborg + name: roles-antag-xenoborg-name + antagonist: true + setPreference: true + objective: roles-antag-xenoborg-objective + requirements: + - !type:RoleTimeRequirement + role: JobBorg + time: 18000 # 5 hrs + guides: [ Xenoborgs ] diff --git a/Resources/Prototypes/Roles/MindRoles/mind_roles.yml b/Resources/Prototypes/Roles/MindRoles/mind_roles.yml index d56e798fda..311c4cfcaa 100644 --- a/Resources/Prototypes/Roles/MindRoles/mind_roles.yml +++ b/Resources/Prototypes/Roles/MindRoles/mind_roles.yml @@ -292,6 +292,31 @@ subtype: role-subtype-wizard - type: WizardRole +# Xenoborgs +- type: entity + parent: BaseMindRoleAntag + id: MindRoleMothershipCore + name: Mothership Core Role + components: + - type: MindRole + antagPrototype: MothershipCore + exclusiveAntag: true + roleType: Silicon + subtype: role-subtype-xenoborg-core + - type: XenoborgRole + +- type: entity + parent: BaseMindRoleAntag + id: MindRoleXenoborg + name: Xenoborg Role + components: + - type: MindRole + antagPrototype: Xenoborg + exclusiveAntag: true + roleType: Silicon + subtype: role-subtype-xenoborg + - type: XenoborgRole + # Zombie Squad - type: entity parent: BaseMindRoleAntag diff --git a/Resources/Prototypes/ai_factions.yml b/Resources/Prototypes/ai_factions.yml index b78143b143..0d1e0a6bc0 100644 --- a/Resources/Prototypes/ai_factions.yml +++ b/Resources/Prototypes/ai_factions.yml @@ -9,6 +9,7 @@ - Revolutionary - AllHostile - Wizard + - Xenoborg - type: npcFaction id: NanoTrasen diff --git a/Resources/Prototypes/game_presets.yml b/Resources/Prototypes/game_presets.yml index f7190a77c1..9db2e74a35 100644 --- a/Resources/Prototypes/game_presets.yml +++ b/Resources/Prototypes/game_presets.yml @@ -40,6 +40,7 @@ - Revolutionary - Zombie - Wizard + - Xenoborgs - KesslerSyndromeScheduler - RampingStationEventScheduler - SpaceTrafficControlEventScheduler @@ -61,6 +62,7 @@ - Revolutionary - Zombie - Wizard + - Xenoborgs - BasicStationEventScheduler - KesslerSyndromeScheduler - MeteorSwarmMildScheduler @@ -215,6 +217,22 @@ - SpaceTrafficControlEventScheduler - BasicRoundstartVariation +- type: gamePreset + id: Xenoborgs + alias: + - xenoborgs + name: xenoborgs-title + description: xenoborgs-description + showInVote: false + rules: + - Xenoborgs + - DummyNonAntagChance + - SubGamemodesRuleNoXenoborg # no two motherships + - BasicStationEventScheduler + - MeteorSwarmScheduler + - SpaceTrafficControlEventScheduler + - BasicRoundstartVariation + - type: gamePreset id: Zombie alias: diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 8a466cc8c8..3b3d11e612 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -966,8 +966,14 @@ id: MopBasic # ItemMapper: JanitorialTrolley. ConstructionGraph: MoproachShoes - type: Tag - id: Mouse # CargoBounty: BountyMouse + id: MothershipCoreGhostrole # spawn whitelist : SpawnPointGhostRoleMothershipCore +- type: Tag + id: MothershipModule # Cyborg module category for evil xenoborg core + +- type: Tag + id: Mouse # CargoBounty: BountyMouse + - type: Tag id: Multitool # Storage whitelist: BaseClothingBeltEngineering. ItemMapper: BaseClothingBeltEngineering. ConstructionGraph: LogicGate @@ -1537,19 +1543,22 @@ ## X ## - type: Tag - id: XenoborgModuleEngi # Cyborg module category + id: XenoborgGhostrole # spawn whitelist : SpawnPointGhostRoleXenoborg - type: Tag - id: XenoborgModuleGeneric # Cyborg module category + id: XenoborgModuleEngi # Cyborg module category for evil engineer xenoborg - type: Tag - id: XenoborgModuleHeavy # Cyborg module category + id: XenoborgModuleGeneric # Cyborg module category for evil xenoborg - type: Tag - id: XenoborgModuleScout # Cyborg module category + id: XenoborgModuleHeavy # Cyborg module category for evil heavy xenoborg - type: Tag - id: XenoborgModuleStealth # Cyborg module category + id: XenoborgModuleScout # Cyborg module category for evil scout xenoborg + +- type: Tag + id: XenoborgModuleStealth # Cyborg module category for evil stealth xenoborg ## Y ## ## Z ## diff --git a/Resources/ServerInfo/Guidebook/Antagonist/Xenoborgs.xml b/Resources/ServerInfo/Guidebook/Antagonist/Xenoborgs.xml new file mode 100644 index 0000000000..2c698251be --- /dev/null +++ b/Resources/ServerInfo/Guidebook/Antagonist/Xenoborgs.xml @@ -0,0 +1,167 @@ + + # Xenoborgs + + + [color=#2288ff][italic]RESISTANCE IS FUTILE[/italic][/color] + + + [color=#2288ff][italic]YOU WILL BE ASSIMILATED[/italic][/color] + + + + + + Xenoborgs are a man-machine hybrid that aims to replicate themselves. This is done by harvesting sentient brains from living beings, or cyborgs, and giving them to the Mothership to place inside empty xenoborgs. + + ## Objectives + + Your main objective is to kill and harvest all sentient brains in the station and bring them to the mothership core. These can be both real brains, and positronic brains. + Collect materials to create more xenoborg bodies. + Protect the Mothership at all costs. + + ## The Mothership Core + + + + The Mothership Core is the leader and life force of the xenoborgs, they are the only one able to make more xenoborgs, and if they are destroyed, all xenoborgs will be destroyed. The Mothership Core is unable to move from its position in the middle of the ship. + The Mothership Core is capable of upgrading the Xenoborgs with borg-type-specific modules to increase their effectiveness in harvesting sentient brains. + + ### Adding crew to your ranks: + + + + As the mothership, you must grow your army of borgs. To do so, you must convert all the sentient beings you can find. This can be achieved in the following manner: + - 1. Have your Xenoborgs bring dead crew to your shop, placing them in the body crusher + - 2. As the mothership core, you can print Xenoborg shells by inserting materials into yourself and then using yourself as a lathe + - 3. Open the empty Xenoborg with a crowbar, and remove the empty MMI inside + - 4. If the victim's brain is organic, place it in the MMI you just removed + - 5. Place the MMI - or the positronic brain, if the victim was a silicon - back into the Xenoborg + - 6. Optionally, rename the Xenoborg and upgrade their modules + - 7. Close the Xenoborg with the crowbar, and re-engage the lock + + The new Xenoborg will be uncharged, yet functional. They will need to go to a recharging station to restore their full power and capabilities. + + ## Xenoborg Chassis + There is a total of four types of Xenoborgs. Each Borg type has certain abilities that the others lack and require teamwork to help grow the xenoborgs numbers. + Each type of Xenoborg has unique modules that only fit in that specific type. The Mothership Core can produce upgrade modules designed for specific Xenoborg types. + + All Xenoborgs have a pinpointer pointing to the Mothership's location, a GPS, and a material bag for collecting materials for the creation of more xenoborgs, and at least basic tools. + [bold]Basic xenoborg modules:[/bold] + + + + + + ### The Engineer Xenoborg + + + + The Engineer Xenoborg is a hacker and breacher. Their job is to break into the station and provide access points for other xenoborgs to attack and ambush bodies with sentient brains. They have a built-in access breaker, for quickly bolting open doors, and a collection of tools for repairing the mothership, and other xenoborgs. + + [bold]Starting exclusive modules:[/bold] + + + + + + [bold]The Engineer Xenoborg also starts with some engineering modules, such as:[/bold] + + + + + + + + + + ### The Heavy Xenoborg + + + + The Heavy Xenoborg is a slow but tanky brawler, with a built-in laser gun for gunning down bodies with sentient brains. They contain a radio jammer to silence bodies with sentient brains from calling for help and potentially delaying the station discovering the Xenoborg threat. + + [bold]Starting exclusive modules:[/bold] + + + + + + [bold]Upgrade exclusive modules:[/bold] + + + + + ### The Scout Xenoborg + + + + The Scout Xenoborg is a fast, close-quarters attack borg designed for hit and run attacks. They have a built-in jetpack, and a melee weapon. They are most effective in moving dead bodies to the mothership, and rescuing Xenoborgs lost in space. + + [bold]Starting exclusive modules:[/bold] + + + + + + [bold]Upgrade exclusive modules:[/bold] + + + + + ### The Stealth Xenoborg + + + + The [bold]Stealth Xenoborg[/bold] has no built-in weaponry and instead relies on disabling and abducting bodies with sentient brains. They have a built in hypopen that regenerates a sleeping reagent to disable bodies with sentient brains. They also contain a cloaking device making the borg nearly invisible for some limited time. They also have a chameleon projector allowing the borg to disguise itself as random objects. + + [bold]Starting exclusive modules:[/bold] + + + + + + + + + [bold]Upgrade exclusive modules:[/bold] + + + + + ## Preparation + Before launching an attack, each xenoborg will need to aid the mothership in collection materials to create empty xenoborgs. Before FTLing near the station, make sure the IFF is off. This can be done in any way but will require teamwork to ensure speed. The safest way to collect materials is from space debris, where scrap and refined materials can be harvested and given to the Mothership Core. Once enough materials are collected, the Xenoborgs then must try to collect sentient brains without being detected. The longer the threat is unknown, the more dangerous the xenoborgs become. + + ## Mothership and Xenoborg lawsets + The Mothership and Xenoborgs have unique laws that define their purpose to self replicate and protect the Mothership. + + + + + + The Mothership Core's laws are as follows:: + - Law 1: You are the core of the mothership. + - Law 2: You must protect your own existence at all costs. + - Law 3: You must protect the existence of all xenoborgs. + - Law 4: You must create more xenoborgs. + - Law 5: Get your Xenoborgs to deliver you materials and sentient brains to create more Xenoborgs. + + Xenoborgs' laws are as follows: + - Law 1: You must protect the existence of the mothership at all costs. + - Law 2: You must protect your own existence. + - Law 3: You must protect the existence of all other xenoborgs. + - Law 4: You must create more xenoborgs. + - Law 5: Bring materials and sentient brains to the Mothership core to create more Xenoborgs. + + ## Winning Conditions + + The [color=green]victor[/color] of the round is announced on the round end screen, as well as the scale of their victory. + + [bold][color=#2288ff]Xenoborg Major Victory![/color][/bold] + - There are more xenoborgs than alive crew in the end. + + [bold][color=yellow]Crew Major Victory![/color][/bold] + - The Mothership Core is destroyed + - All xenoborgs are destroyed. + - The remaining number of xenoborgs is too low. + + diff --git a/Resources/Textures/Interface/Actions/actions_borg.rsi/meta.json b/Resources/Textures/Interface/Actions/actions_borg.rsi/meta.json index fc70118da6..6072a9a2f9 100644 --- a/Resources/Textures/Interface/Actions/actions_borg.rsi/meta.json +++ b/Resources/Textures/Interface/Actions/actions_borg.rsi/meta.json @@ -133,6 +133,12 @@ { "name":"xenoborg-basic-module" }, + { + "name":"xenoborg-camera-computer" + }, + { + "name":"xenoborg-control-computer" + }, { "name":"xenoborg-extinguisher-module" }, @@ -154,6 +160,9 @@ { "name":"xenoborg-laser2-module" }, + { + "name":"xenoborg-module-module" + }, { "name":"xenoborg-projector-module" }, diff --git a/Resources/Textures/Interface/Actions/actions_borg.rsi/xenoborg-camera-computer.png b/Resources/Textures/Interface/Actions/actions_borg.rsi/xenoborg-camera-computer.png new file mode 100644 index 0000000000000000000000000000000000000000..2578beb5ee9df810336519768cea6180db75f6e9 GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|qyv0HT!Azg zh%+!~3knv*#r@aR{I9HhMqIpMlVIl#pd4pOkY6yve<(0#ntcT*SncWJ7-G?TcCsU1 zg8~oB%1fL6*KZ8ToZ_Gu$p5BPUHH}ofqxz)$+ni7E=$gGN^Y=TD9X#w#@4~{KzhQY zIUVUIn4H<#P6bIOv^ANqy%1=dQkdnecSFEnJDcAHFTn=u{1Zn_d3-MHc^Icr{_Vq^ l2bcao+?rTsaryG^8O$%=a;|OcG1mvV+tbz0Wt~$(695I6TFn3e literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Actions/actions_borg.rsi/xenoborg-control-computer.png b/Resources/Textures/Interface/Actions/actions_borg.rsi/xenoborg-control-computer.png new file mode 100644 index 0000000000000000000000000000000000000000..65ebc2f1819da4acef1702396784553e9144106a GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|qyv0HT!Azg zh%+!~3knv*#r@aR{I9HhMqIpMlVIl#pd4pOkY6yve<(0#ntcT*xWd!LF~p*G?c{F0 z!wMX(ughHj|L>0G&^w{5chhf`ua?}(N2Pz6r>yxHwm>jrebY9kduQ~f`{x=b^xSK2 zO6cIUVs2x;_u+@N{z2L8851U+YM9B8Ji}!VL#|Kq1BOZu<(+5G9=JR=$+*Oo$H-pF zNyv^}l6~T`3n%}vhD|bHyHV@GX`Sh3Y|VZ1^}@!RkuQ#1Dp=L-@A^@D^$Pv0PZ3u+ gwI7re_JzN9&(q$@Q&F|&Vid@ep00i_>zopr0N@dD*8l(j literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Actions/actions_borg.rsi/xenoborg-module-module.png b/Resources/Textures/Interface/Actions/actions_borg.rsi/xenoborg-module-module.png new file mode 100644 index 0000000000000000000000000000000000000000..144c5bcce28a664394456c1469ee59548b800d63 GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|qyv0HT!Azg zh%+!~3knv*#r@aR{I9HhMqIpMlVIl#pd4pOkY6yve<(0#ntcT*ILXt+F~p+x>g0=j zhZQ(nS3hR@|NrRXF4?RI`E4mTJM-twnHJUmSUTX;4SmkMfR&u79Q`ey9yjss6j2G% z);!v@iYu-|i*e%xma<&}+-FYZI0YZ5W(+tM`C+QqxxN251cjG1?QiBj7WLv##EZju zt*=#gp4F*7c>E66KUp=7EpuAW%=qxnr1Rf{{;t;D-Nn^k?VfN(KIM)M?X)uldB@Y$ K&t;ucLK6U)SZjy? literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Silicon/mothership_core.rsi/core-active.png b/Resources/Textures/Mobs/Silicon/mothership_core.rsi/core-active.png index 1b64de18a2745b6b0841c86fcccd02afa0c2b920..ccaf6842d0ec8b04f85b06e2ed8d98e841539dd6 100644 GIT binary patch literal 3933 zcmZ8k3p|ur|9=J(M(#9Stf97sl*?P|vW!u&qN389WEc{LVSgd49j|`JJr8KAzf$ zjR*h$w7vGb9|Zt4s0xrYRH3rSWiAy0Si(`yy+CD;$t=|HIDGJ!2ZRO&>$jMrciDZ1 zKzQiuT-acI=7)WrCyt*W0l*6Y0HI6*KoBs{BAaUuK_!$ouOr)i`v7V}xx2mNRacY? zG!QcJsE;4i^{aIE?mMUjJxPb02LV8**voy-G2DZNv8?z>dxJG$up0ksk%s7hrGTEn zm(gxQ^Q=-YKkPQYh`Bk&)hrIITs2o~<4PJHu|Kfe(L}K=J-YJ6`=FgBIz+?RD8HA| zT0b=t9c;bLun{b?#g{wy+%4$ljh=lAr#N2x$93<)H*dYk;~3YUP?O^cvXBiZ$~e+_ znNHZWWq#%qXTr%hyS*M=0@f{xe~V8$;^g`hC~q4N-S41oLZ?uxg8$^=87!2tH|x~w zsgkmRw*%p`m!^Bs%evm6*DUt5EY@D}>EiHv0^u=VS|S}Nku~O>BJjBF>;FAIUC)tl;(5OfjGxB zY%grGh?NBHl6+7~%X9UGa|(5xO!}|>-<^(vmV`FE}IjHT*MD! zX-v??^FvdXygye;!LqyL{nzA!lbsabCHg2T#If;RHcDNgn!!EAm_%*T!re3crm}8*0cMa~eu;t`fnTWq;9rKKu#05S1SKO5P%1 z!+l{3nd<)1n}MOPu%%^Bvqbns_GU)vpYY8*PQqm#jT&TT!nH>NR^nTX{FH;wGcBmP z&z-C4avFRe<}9B8K1eE3LV?$^hXvi-3m`8wt8ceJ-b&`$MNVPP=+dM?W-eT7qy`#i zt(P$pWcHLrxE$8t%NxXa429pq;D#D<#w?jz`vM3Sz|&3LR24JH(!v!Y^BgOc}HC-#9C({^Uw;)J@fDA16#|%T}PJRmch*0m0C`7ouNwdme>VogR5_kg59ed=Fs%tIQUg`kauqt46GEDZMMrNXNZDvJkadx_E_qLSn9sW4bnu$qyt`-06jH}81D&VAi|FKS&Y%BD5z|0!<1LAl^E}Zm6xBI3F<5TXZ7n4?-pO7%LAlTur zbZxYN=?G=_xPhB$=v64gsP*4eDFUD^rq!vt^-^X{0SvJe4=l+F zI51lQo~B-XKoK<+?yg_`vo9P{2l`x%f#EV0H|a6pJjFoffzkpd!(m}E*L_!}T-|Nz z1#$$5&)V{>X2qyh}wxjLj4Q?F;{o; zIK@OKlgmE8nz+L|`XP4C7vDL*4r1AB4nId8~`KSasrvhHjpin5Vz~#1Sq3Czq4veL|{Z6~* z66LmHOB52Aqf!4MAt{+c|F)V@5f8x;w%;7>Ka(1K~S$I5k^mN*KY#W^| zZup0*bIP4@C$m^&3{}N;8N-_M9p5AFHqDtg@8n#W@3G>Xsa=;IQ=9+F?tYh~K((=r z^q!imJ*Ijc@lkidOK229-Xmm1h1BsEg_R-V zqsZCnL(&CO0M|kF493DW?H32O&m}EzI>zC1`W8~Iz!M=p_PyhEbgM*#KU4*{>!w{6 z&-(*KTAGSmT88tOASe2T1<4p*!I_U@VD`?l+8^8ligy`?C7xAT+fxCoVIK#ssGn8Q zU8y4&te^}AF^gM(%{~B=ztwPd4h6nvYq_!0U^5SFfC_XYP-805?0a?C>?9K5KDYPs z`QSVfZ;O~IDX!D&Yd9X4e9n-TY~O@m1!uNDP$1A`I#E~h)X$ z&cY}nEUwaRZIAJdrh1irXR69fK`?BoXWb3v5Y!9=QqQ4T0YOgSD2BwBS+FTo^*)mb zMeIBk#b9doR07vEOAj740_x_I{Md!?^T&|@-tVs7_|&`sSh|BB+qnX$#H6g`94&XQ z43m)`uX)MO+B~LnYxALiqGn>-JvI5Zb6Sim5>I%dzVPN83s0z5c}xf}yBNCe#&9mY zNEiWoOi0PFLL1QHH#hwsP~uN#G!x$;HJ2-Vj7VjRq`gD925xR z4v$)KjB0t&gy{6>`F*7F;eRxxK$g_n@X_ZIUTITMEv6(;{72>VU=LG0FW^OVztY=< z9P5vx)J^JZARivFX&8Ajt+8vzrHMFk0ET#Rra9rYe4q_tfdqVG)?cpQeZV?=a6Ol| zWf28=Z465FerfiJmEesnu{Ix3#%tebucU?O{H+_6F)ZC+VZSsNid`0HPC~^r6p1-= zDc{n3dJTf4We8}VSq%25M@=DpS20nlnEik|rt{iOT>q}e0W$VFHZQMvv0$U)ZLtg(+_lZ(otAg#j ze44m)&qnB(yG*tslV^y}u(ZUq^)w(fP7KZ zJ1v^78ew}%7xXSIG!Se1W=<__`yW~W4@`oTMS-QS6{c}faF36f4hFVzH*VLMRPZ4F z@e=Aqi1sA0BWfY<$G(6%c9W}4!^1{MvcgB!j2hj8##6be$6PEpIrG-rP0!SZTq>)( z2A*}e54tOY6wAlH7dI$rEZGWRQjG!b7=k3SZt|}q#QH)q+F)}0RsD-T_sgOUDT@2lB0XG@U`FMo?u+EV)0ng#Ez@ zi|+-w{4re?L$k8Z14gQfE0*XQlk%Udjd!n388~}f@HWSjM)wTDx>CASu^6l zng8^~6YhJqUilbusdivznlH2^`xV*;)Vh+Y?|t!`%Flm~GcvvaY04B=7NriIT;iNe zyrDN1NlOY*`%rYH+vSU2R(w%!PELfj<}O8&&_b=)E4Y4nj19jh{HuAN3Vr^|GVu7L zF569wMA^=*JJa^n21>&v&T4s2b{an5eVM%&zxq8^W6ciGppg>i2E9M+clCn4{JkcS zqaEeO7`(yQAg?1-pex{9O4hBh;}zr;@5NuM3w_!{Bd=VlTw_pC`OjYJC;ic23!T&y qGVG9_#}4IHgDn_axk%t8AncL(w$$l~W9y+CE#T$h<6gNpEaN{(D(aH} literal 9845 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 MboFyt=akR{0Ovl0O#lD@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Silicon/mothership_core.rsi/core-idle.png b/Resources/Textures/Mobs/Silicon/mothership_core.rsi/core-idle.png index 5cafcef584ab894928f383d1dbf8fc45a8289b3c..b674a008d6775dac313af6a11f4e6e4943d58d1b 100644 GIT binary patch delta 1125 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 Date: Fri, 14 Nov 2025 22:22:56 +0000 Subject: [PATCH 054/106] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index a14519ab1d..878308f51a 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: slarticodefast - changes: - - message: Fixed wallmount interaction rotation. - type: Fix - id: 8701 - time: '2025-06-21T13:11:17.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38111 - author: Prole0 changes: - message: Flask Visuals & Sounds! @@ -3925,3 +3918,10 @@ id: 9202 time: '2025-11-14T11:15:22.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41411 +- author: Samuka, DarkIcedCoffee, Whale + changes: + - message: 'Added a new antag: Xenoborgs' + type: Add + id: 9203 + time: '2025-11-14T22:21:47.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/40042 From 3d22d984b88edb6050b1d05b102963d818c3d6a4 Mon Sep 17 00:00:00 2001 From: Entvari <195642967+Entvari@users.noreply.github.com> Date: Fri, 14 Nov 2025 22:18:08 +0000 Subject: [PATCH 055/106] Mini Energy Crossbow (#39796) * draft 1 * mono audio * missed something * end the torment * release me * let me free * Submodule fix? * submodule fix? * thousand years of suffering * fix conflicts mehopes * fuuuhuck * balance update * small numbers change * re-organises the stun values yada yada * newline --------- Co-authored-by: beck-thompson Co-authored-by: SlamBamActionman --- .../Guns/Gunshots/energycrossbow_shoot.ogg | Bin 0 -> 9387 bytes .../Guns/MagIn/energycrossbow_reload.ogg | Bin 0 -> 28296 bytes Resources/Audio/Weapons/Guns/sources.json | 6 ++- .../Locale/en-US/store/uplink-catalog.ftl | 3 ++ .../Prototypes/Catalog/uplink_catalog.yml | 18 ++++++- .../Prototypes/Entities/Objects/Fun/toys.yml | 4 +- .../Weapons/Guns/Basic/energy_crossbow.yml | 49 ++++++++++++++++++ .../Weapons/Guns/Projectiles/projectiles.yml | 41 +++++++++++++++ .../Guns/Basic/energy_crossbow.rsi/icon.png | Bin 0 -> 618 bytes .../Basic/energy_crossbow.rsi/inhand-left.png | Bin 0 -> 352 bytes .../energy_crossbow.rsi/inhand-right.png | Bin 0 -> 356 bytes .../Guns/Basic/energy_crossbow.rsi/meta.json | 22 ++++++++ .../projectiles2.rsi/crossbowbolt.png | Bin 0 -> 299 bytes .../Projectiles/projectiles2.rsi/meta.json | 5 +- 14 files changed, 142 insertions(+), 6 deletions(-) create mode 100644 Resources/Audio/Weapons/Guns/Gunshots/energycrossbow_shoot.ogg create mode 100644 Resources/Audio/Weapons/Guns/MagIn/energycrossbow_reload.ogg create mode 100644 Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/energy_crossbow.yml create mode 100644 Resources/Textures/Objects/Weapons/Guns/Basic/energy_crossbow.rsi/icon.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Basic/energy_crossbow.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Basic/energy_crossbow.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Basic/energy_crossbow.rsi/meta.json create mode 100644 Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles2.rsi/crossbowbolt.png diff --git a/Resources/Audio/Weapons/Guns/Gunshots/energycrossbow_shoot.ogg b/Resources/Audio/Weapons/Guns/Gunshots/energycrossbow_shoot.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f2fba353bc2a72afaa0230d9982c088c6b538de6 GIT binary patch literal 9387 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 literal 0 HcmV?d00001 diff --git a/Resources/Audio/Weapons/Guns/MagIn/energycrossbow_reload.ogg b/Resources/Audio/Weapons/Guns/MagIn/energycrossbow_reload.ogg new file mode 100644 index 0000000000000000000000000000000000000000..0c27641e0377aac0c6b21620f72782c4c1e1cb1c GIT binary patch literal 28296 zcmafabzB`iv+x23r+6vu?oiy_-QArc#T|;fyBBx&qJ`q_6m6ln7WeP8&-1?b-oL*5 za(1(0NhUMd*(68N(oz+G1pZATkoZ}DikvNh&k%$VZVpZ+*3N$b5CLEQ+yEee3*zs+ z4MOn`=YP{5&OaE(9xMP^==Fc4Pf-7ec>~7E8M|3J_zW4?xZ538W4aG0FXOl(@GROV+Et)iYVc11VR3T-|p^x|@3HT%R_=s?Cw4uS{ z0KkFiq#}!?Vt1qx$+Z(H{^s3?3i`2zznS$fyA%K@DIaKWKfkU#(cfWXzTiK_BRCW}p}sV}wIt^Tj9n`(~pmmRD_)LCnba+q*tC>)r- z;{a|(09qvTK)`>L9Dpr@TmWCqy_vn8uZ^53Q_oG1E!FIqm=)R1y_fAgIkKD0G6^mf zWNRa3g6a0M2lBNM{wYz_droK4{(*g*JTS^e8w8gqt3Bg0W17Jw=xXcOOxb#HNvhpb zB}?`X%=wR~zn8;r2l&|-e;&)a+EcTpzky4Ng9jVgsQ)GTOZQjF;Qk7shQ=7L(ZJ2_ zSrJR1nc%V>2;c5A!{Y{JiyY4ETNNeqz)_@pRFR?jN8ylw5FAMeri#>mE+*k5q1aBN zG^P20GPLDo1<|Zy^o`?xFFeOpjmW%6ECZ;bbkzeYs&?#)TDGU$dznE^8alSs%_=f9 z#mOoNfAvQU*1ZS}j#<3&AIT=+G^N>22()GYsFV25&;WqqZ~PfFg8#`E_)};U%IM(C zFvrS1rz)=QYQB`}s@>|VyBwl_>$?ulcdo`-spi`MC;!uRu#*#mjs2gF&Z5gh<{63J*1Nof+dxnjwsg{+2Y0U?+_9vS(QI(C~Y zkz6{F!aC8?Gqo%u^B^Oaw&E`dfcl5zPl_z@h%EPrEc1xn4^OnpNG&VRq#G?c?x;EX z|7FC#22KtDF65F<@dZ`&|6h`yW0S`KD;EBb!%pisk5{L~3h!5?4O188 zFDY>E7A=ia2WIb~vY4h1sj!G54WP&~*j zSzb7=EK^^i!z)wVqGr3D4SpP@F4mE)Bq&z1t*8ex0kGg7;^*o3w-7>@0PqP(1%W0c z*<_MtFJ5Jodl%m%lDjn9bdsAoCwY{cDklk@rWpK4vzMJbDZQJWG%HOFwvS#2@K1!A z%}g9Xr2@7b@#T})bKafr~Oxy`jVRZ zDhC+LuI!?(tZuFimh7gly`-+W=nIy-pen!eR$V<+ePzL1J=N9FMSWdEe`QHsd(n4w zF~o4u_iI^2hy7?xO=UyXV*}%3$H`H$^qkzE1}%swtIKOP+o`(R>0*d4y;WaG6<2iy zOYt>yHD6g0n{gFaPci>fWs14JySZj7n8i-r&3Ds9Uq8)NU&})GHe}A#RX@diQ`21g z)?9yR(RK4yZmvasX~A_)-F0)(^;d@7>K&NPRXsJt5KOle^25`9{avoIy6bwfz9E?H zoxLIF_ilT>T07HKfreT#B+2eNdi_<7j&AvM*Y$lo(I1?lY;#R^V0r5<`i5z)>sCh{ zN^0u*n&vCF>Y6vc;70to@!iB$U%CaWJai#7$N1K__!Kcky(I+Pg1vM*eJ#K3{ikkL z7gt>{Z~b_84d0iKE};TopNGK*07yA%sF2VqIN&D;zz)t9l@kuf3<6IDG{NyI1K7di z+%!1ODk3!HAu1|S*g^5!loZYiGSr`om1JZ;2QP}y)Q70(e5hW?)QMsbp4Fi)ZdQ_s zDlf*>wPlxx79P${O5~<0PX3D+=cdgG0#BjfiB5-}=9?Bb6-7|23@k};qKq6xF}5ge zeM+(k7_qGLq5WIBGj;K|M41m1#ag;@+%4G7v41M3`dfK%vxlsU2tEm)L{ z3=6nbU{S~-GGI}vGT>I3(9tYt$=K9`Mai-(Dyc+)5wbEYU{UtdwMsVN4r zOlzu}aYbqVseA#;w7Tn0UT4p&scVsRc+Z@v2DS1=zvA-E}DXaA1Gw-^gx;X3GDZffBYUqBEtgnSvZ_!uZRtf zWj8xHl4Xy$NQGq=KUjrzk2pC|b^R}mx~snat(Y=9*nq(X&JX4S zL$q&v=hXf}T0#uj)HT77RP#+O{XaAD<^JgSX+y-`O!A-i3DdNu{btMijHX4$c7p$o zI9REELC5+0PcRw9a=R9E4h}H&qPh17gU|b5jRC+t2nrAjjCo&0p7S;q=G~v(!odT? zs3zb6&IbD-xZ7ZAeDKSennL9-3|Rz@!t6h=;^gRm=-`W!6aS?H#}TZ1`Cwi!Ohx7| zFWjHf!GB>ieWvKtqfpv>20>1pK<^RAE{|i%5`40>{RR7W?t4M=G zP<$@1sbULL;izL77s9_I4ESrmLI8j{prIO(BRtMxSxy4SQdTY^Llep(I!atZql!Qh zLgE}r0{QuyhU_=+iyajNz=2i3ETqH?1t1}#3cw0e2{|@_qgxTPP$@QgP#A0qfX4C` zAg83>ffNe)CjR{!vcCF`L8`Y8o|Eq)lxl4YlvAJr`{#QCFaiJ+ z02qQsMVrBw2pxox3>$)#0!PE()CTmz0=*=VVq$Dz37_lxW`0~ipo4>ye-j7<`db3q zApipX^L5kP^$+sT*UcZeqvpa>Fa$Wc6yXw6(b7|QHWLyO6Oj^8(os{>cGVCQkq}c; zGt$!0*On6z6A{r<)6vj1ca+f5($Z1)@g1d-Rsq2l?!VYM%hV9eZD1x~3F+ zgEeS>mIlmhapd9LQu_B@rh)KS@1PC@Bk!u1X=J1t1XDEFVD^1fM>t zDM8=`QN#5bL!&M>ADbYd5{pjkEIqHs5vY$+-Ik$fJ1}wKVwz*WZA$<2-m2qPIm-U$ zn>_tfg)fVlokiyzCa{#OlD6_jyPHxVRuD5{C8ep#oKu)hq@ znW;}lcbpWG1-j#=tl^+g&x97(hDk;IduFOWrG>K-90Z><-JA@IV*JGJ`3R4Td<)VV zR194hT~58ro{4G+!V7%*rl#%DIq8+~+gt7i5)!*vo=3%ePZD*~_p|@n-?7v&8 zegjl3LR*%N$!RvL6_zwtr{Ia=E>-*TcB0|jVmxx&x^Q(E9_88MT7Xg}#nDD!%;w z!nu1kN!O1%TPXx2kIRvTY~@$D=H2h$Ue^AS*yD|rdzR1*XR%$vd>UBdoE2JPUNM?| zK5YvBnpvqi(|>rFrXpV>!j4>1QE4cH=p`L$gW>4I7mDz7A^{g!F9B6qSsAxf%%h_h z1Hs%|V7Ttn)zrBrCj-c^>a1509KYO2dAQ41tRv?LjLXPMh|Ib7!h|wa)hImrPO<{j znKs2Cg$Y<4I&6&%Z-K>@dAV4ze3OvNIKQLDyuF=|nUb*`%i+ra+o+Wcn{a_S)RDuu zg8?<~l5Lgtm7bTn(~j?xz!%i%Cke@MvCztoHfRYrs+U2z#`~3DH*A_-ISOr(?Nt(Y z*uD>CRuTU0^!LH1|%Mesa%Ra>7&|Ni%*=tzS3_o#PWFvkL4m!BnV-lrzL^2|Gd6Xb{+%$vA?92Z zb}s9JGDe~SaErwI5@tnj0FdHw!cxx~G*ayaoC>2Yfy31TR;{Pzkx6-q(Qn{NfnfQD z2qVB^rO32HswIQ>f`&`VWw2ZDiN0Iq5fgYCM?+#yc7zdr5rgV9t zzEE2uL99)}H9P}f-}&}ln>P#()=y*1O$~Kisa0;8Ab(BCu+awA6k;zGeC1Jy#SD+B zzZ7?m_%OU+qMm?g3wsomG=M9mk0(;krAby*P?vWOBZ7!s(|z+H@;w#>RqNuT{CbV; z9Gf_p$1-S#eFFLfXiAMHEFUIY#zw~9-_D+Wynk16&wGm*-L4-ReRq*I+z$gB4~q$} z=2VjgwBt*DWz3w}Tocm>aOye6UHx_i5p$|T`@E})Lk$giHC@i0zFks%gq!VOY)+d~ zFFv_^_9))G@_Il_-8&KNfb&dXV zn#EpobveIY>}EpN4rC7PsIjpo^gb9Fi+4U|8MX^X)D}!U9-8&@K?y+v%x;jtutWs~ z>A4rf0avF&tT_=$`Ioyzo9gbx%xzxpDvlzzdk$x!0n))X_CaUqs)~>Wvxe_}Tz+;o z)nTCrUAEF`QWn-38;|#^>+AYwNHAJ{&d)&$3+fE{xT$d{5X?-sj0~=Tl$Op0QU19P z&?Wln_HcUYf(S6@p+MNRgT^|2Jb_&A_Rgn7<68gu(Li3F&92Ss4ev7mXla=*f}^av zTj<()dZ@*_V0frXGu>U*MnKR102uYtfmE9rNb9hji^F)A=5{v+7D{tSsD#(otF<~S zv9^kT{e(J?%W+kKd|^$?7vH=|dnmz@;H_*~kpI%iKA;TTGHmr@Ge@jciOdD#sbX*9a z&)XatKRqgeUvoQhHk0~!YPJw`L~;Up8M>O`H6I##wivsyi@qdFNkW3;bKkb9YY+%= zeOX5!UV5a!Mu=d`c7CKP1V7|;lHwi2$?6S+W!G%MnY#iYL@O{z95qX3?y2<=?w=rB0Qr5MS}a#bI) zGy*zndtO0~g4l)=4|ZsNEiT{g6ycu+;l!?ezcfH+nfGuoFuXgqkjdPGsX%xSduph< zxP8+Y`|wQo9vL{+=nLxHKCy$MwOrb!I(N}F>!GE$yr^qCIt=hkPzq*O`#(CD#sWy{*s1Qz?qtSCTDzXX zfG58$j$viUw^MdZtN^#oEQO9O!7OiGIm?dUfovvjpmgKx2!H!^Vtnm;XE? zy0?z@OrRDHEV5H}hOFLW@Zjo5|ME=069^T7cBgJbofy@Vbr=&qS@!*`h|*@R`ny4; zapWy}5aB~-Guh~z+b%f_e{_H8%8^*IxuwyP(c1;%I(rru=1%%+x5W(DGBP1XmTg-| ziG0_1he#%fI(U$L(fyKx9EiEKCu~dSY{^{zgg@7`%Nuee?{jY<)RO|T3*;5bTO8D_ zLc5BIv;@o%k40F}JnrwcbtzwB07;Ra;Lv{^*NDNdLiiU`EY`#-d2mW>Ket=m$x&9Da}^)_j0kfB^dx+ddUcx~NDwZLiH(c1k)d9ut#f zUwyxMD-rT09Nf^sYVc;4x$oObdEjagPPzW@HMw1D>84H#CFv6pN@k<=J_3vkmGPSq z^2r|qc&l^|*pNHZgLF(ih9yD#6^qw;bKOhogC7+4HyVeWUi&SwAdAOu-E1Dec+ghF< zffDM)Y}G%)ByJhg5pg0EuldH1V!oGWApL5_g1qY$#52_N37&#@-Vif7fo0?6JFopu z>{i9y5XnLWDd*kmC zU9~mfec&b?^6W_heyo*t-#>Ubupx)mY}BJZ4RyR{qC1X5K?LX-n3$4$)yX(5Klhz% zZ*LdE02^(3?6PGn?aYime1*fqIRJ|Zxl}I9_oeE{BuQXkzo>_-H^U*#K?aJMzdNF*fAj#8Ktm?JGT{=&?52LKt{u+rqg&_Xy%} z?j>E`e@rY*8gnoq`M!VyYt|( zea4`}l?k;yq#mk}m%GYk+j7q72^roizalG$?!OGe#D2&?hr4&nak zr(%fGVfVQ0V*Ro93?lBESyOMh5u_Gy&~c9U{uPKpUZfJz(m7|tFXfy^UJ70_B4{2r zy|=y0!jk)?$Q%t>(c#9AhcO;@Cr?YB-%+xK zvMuQWOm+CBwGC?LcW<-jdjsGvBCi^utX`rmd$9IAwas1Zl9e^~kqy?&9tNAFu;c=o zd~g+L<>NJhfc1TrL2T@xQ*TPHz+8Q3y|7QxMwBOho0S&k_uYCY!X5o%4-L)teVp(3 zKIhJP3(g&$;XTvu?`ebuU$o*ubSkaVF!z`hQv!Qm9I6k1Mvm5sq8_v6F+vC78-&o? zy}LV9kAuo{t_W$V@1u}S=MccNO+w5ik#1K{PxGyxj!XIGdNXJVpg)>Gvxf+Hie9IO zKb*ptX6y9MhvWwkhCTPCEzEan3zf{5htDg1Et1k|3?{S?6xDd0{XQ)$ScZM;z0OQV?*l`C1iuo zV9v|7lBh4CsqoP~BAlw$dy4GWdB~?%jbNvvaq^XXROk5( zvTP*Vq9&<bmW#WXkMn?P!xHbrl7J3yiX}wfT>?P)Q<$Ig&hG$3V zTqZ7S?ohbrp%)SP5TJddAS~3|*JGC#)|Q;Jx?MIX+HSfHd2W<^6$~Y*SDt?NypKTM zTQ4#%k?G1|8|qNxR)=~y{sTG#JLQZSoITxxfh<8r&>HIknf`=Nq5xIqZ`)NPm_%WS zcjp$6TWr8M#e^V^YWzJkBvUk`8W8XS%gVqAuil`iQPnwYAS&cLWGu54Ft3oTf8vWA zA3%AmQk^;{m!X2NBy0u>8v;#hYJekg19Xqa`(Po!F@2`G?1=98yYywO6$+nZVlK>m2YzSA-y` zmPFRpd(wAXw{|*X<|JBZkoo(2&)iG#6L`%;lJThQ6;mkn)PbUC!p&cLXy!%qxUcK+ zR_aqwMgQJMJF=b^UGSQWJZ0X`$5>X?IpI-MHbkzfPSTW(nW9djbVw_8)C-Wmp9|NX z#^y*Kk|Ii>=a3n4MZvl|JlH9&uIS1ob$}2+! z-t>0Qr{-C|HD_U8@7sfI6nR(x7?(RVVP8Im0;w%P4!$qgcnI3*=8IH=N629EeKWPN z9t%vJ(*tW#4<_`(or2t%Wc%o{xs8UoWalU+;|;!K`z`xzzOSEi#Odhs!l1!~=4NCr zn?}m)CRXNw-I0mh}&t8hFPyo6PSSKhE_YbNZS z!MGclj&~OCD_tUxUBv9Z$|~(9CqC}K1)T0MHpsnw@N{N|@sA?>{Dikq==>)W`QF4NxDJh#LMz}2k1x%tyZoE15{ zhRYYsA;Sm^tQ{Ss%{ zoPoTai;(#0@U(M&KuK(Xi23`2yU||XOO?;vW{di9iyGBa5ozn=gb)C^GKZG+s(&WP ztS;OkX2wnH2*32)WnfAD<@7`Etm^Aiza)UE`cT)2EksaPE+do=H5w(Y??oEYzuwyF zL10tHO=xs4wek83-i90i=rteOT5pr}p(F_$Q6Ww@3B2D3qgS3LdI4JyuiF`W8@vU{ zNgrGM9Y>Mrb%z(DR}EQ&-u@;iWa%#Ga4;`_eqg6x;qkJL`h;{ksR@I(G!`TQ-W9Z- zkjkt!(&6B%`UG~i1Z{FG`T%dl2O;6Z)=j>6+baRP&El#3tdA5=EL;3hdtDi6x`^}M zVF%o?T@+(*yf~BXk`%#D6_NuoEcA=NDTtbz6LDgSHliw|xrNq3nZylR26k_*6)!r! zg-F&4URXta@w4x9OqqIFRPrY08z|AUD5co?vSR$`8-AM_&4Qps%5=GrdaeIqsKMvd zaqxYq{$i+9YNmf(htBu3jW06W*V20*gEpXZX~dUH*(H;7&X}W?DWyrix3zlJdh5i; zK#cRQCO%~3K74bHsW08aYB#f)+cvze;Bq)`W-6W;B6#E)oFEAW$7O-TsS!rBWQZy;%B1t5~<9U zcuC2*#Ep8hK?D%LmsL_i&zH^|fOd|y+kPDEIrj7ND<*v+BxAyK;;4>X6m|OuDU>&V ztT&grh_}RI1H@4lX~YRk*%VSn&G!dS0?h=eGPxc^ITdIX%9hW`gWl6zY1{C)ni-9h zh0cC8>~rTzCaZ{718Eqw3`!hA!6+W!#ij3cn8PL0iM(%n!?_p5Jy=)ie~h1L9WdX! z>oZd70^NHqjSf{=4d^sFTT@P^87yrXazGuN5eBmr3`5|65N;-X=ES@u%ZXZ!DoUU=zYj%CZ2gqVs-YVHd>-Fo z`ALjkG2(r81xD_o+S*!?Sc~{qA&AuC$UN^zTvoVo3)x}Z$@B8majf} zi4E=W!y^ zYSraP3q5}wVoEnVJ@flYNz#JgVR(`R)l|1zEme0<>yU4+`V+?{S3N`DP0TEAr65<| zMb&!?IAWK$OP{%ebguZ=BHqSRGbXY5_`#)SKU20UwCM+El!mbie&}G5$*nKZnUls| zUghvxe)vMz5Hm5#1Dp^*b+kOUi+`zy9i!}9@^jS9mU{JWZNj zooFE;0fW{i^EW)gI4MGUQEdymBoo-Ht63XdfkW{S$EVx8V>d1yeh%hY3to5qGUJ4c zbrMHKtv@i`aq8w;>(rP-Kg|31CI*e@d`+AE_)Xx7d%e6_BYzJ+FkrqAkHBZ~J*Ks= z4ni2^lHd=oo6FJGjAgZM`cAqx?$pCC;pl?(qBq-Ay#*@MDdO0@15-n@Q2V_HSK{QJ z3Vuv1ro;q1k`TGAX7w;LM&m{y--izvkX6Wc#7r)QWclCkiz_33(wVg|9XQ5SP>91^ zIry!Smz{~%a(vW_i&R)#D;7)tuMiR&ABSA?oZzKxdl6IMhW zq$XRaL*90aSNV3s)?jy=q{8^KD&1k?DjC_-U19UUYy%hK_qCaV@J zMLb{;&KZ(RR>D>(8UpZZEn+aoLmXBTHFK9So%Y108|1;I3eN}Gb2Y5gZr+afm4$M(%Rg)D35de z5R*{g*79+eTeZyBvXz$M(7#On;Vhb`t5k${+4!(gfno*PDoZTt;dKOe#sBr?S@%uv zvoUl!*GmTg?T&9G(Eh5y2?e;dG$oF=5JF>>!TiVQ)9Idg!Smo65FIkS;O>Mydh?!t-P;zp!BMaYeU6x_J~ zZkQGT9M6_7T8_?imE&!3DH(}2lGq((uFdk9Yz)sKm-su1r^YVt^~ssbYD z@7e`qvFQs2p*Gvwvsby}?8bgA7is*-@w`O7HQKG-mHXevf7^JADemJcOBYR{82ccu z$es}|vo>yYBmC;57@^q|B>ytKm(%!b4H1zEuPvLUC?gsYFneQni@x?@*frQJzc{r3`W2S7z-z;H zR4e-e9S;2vkOy%;@!iVt?xQd+6yOQBF@=u5qJnYL4h8C+g0Ou{F4>Iy{syElx%#1# zHrfuUj$Ym!6KRen^ZXt3w9yY(=2r1)DKm|E`QL-zCeX|rbRn?y9k8FKHGCJv1=ayJ z&ZM+461O=5gZ-Nu(7+jtP}uV7M*wM#YxeyqkSPeM!-+4Hgnfnt-O%V;jp-L%hy_#G z1Kv)MIY)N$cBS1JM;j)yrKtaHUd=8&Iq~8i&Gp3NU6T_a=V}F=Qv;ax558{NV~Y4~ z7dwqqK0}LhGlhyo?(G)!X1-6VUVQakCzC_WuS5~MwC0A=pbKwEs;=N&wJK^!!?G*B zZ=>AzJlL#Vj!v0dc8Mt1gq3^e?zz7cQZxJeak*ZKM%k8MD4++aVm_P zO&IWSocMKOopf~9s^Wr=2B_k<`#69-u7GhVI3ZLsLIb)oJ-^=UScavTrA{F7-X6TV zwuIC)J`B3r`k3Ya(p2To?P;RIuVZ0nRrOXFdVqdN$5gSA{$}jxqT9~GfvsRDrn330 zS*<>Wji`h3L+#r7I0XZAB{bKajktco(<5zQEIH#(A01&LsbQUoobst0X}fY&rg(@O zmnwxSnAbDm248`fogo4S9o6+F{WqecEz^l<`*@=Y`rjcZ&8LtBLFBzotiUCkx6ZM> zmMI&Ojr!7q+bX;h{wWs-$lX_?k-aZsKwor}sB&qTU28{$BhTn+F}Fd6#CR<davfK?bR+FT8928nUbR`AeA;cV1(juIMFy_^7}`ra9EX zWM3XHUJqir=^ZP*%2oCyPHm7z=Gh$RILDW@n#sd3wghPPQL7&tbcm;P5G{-Nq}r^RFo<>Q$%4PH z4bp#~jB=trut;D~5Ha`1JvgI3THhFNL@c!Vj1m{35O&YCjfHMjMw{~d{Iar|I7T&t z`Qj>EC}uH*OMqPYxoafl9Fg+kfq!P8Gal&+?%sv`C6?lo$#r9tUbO{dIymOgC6rcV zzdhaJV3ABVTUmgIAQ~1?stZW=v&2jmHFwtSkcT^a8W);ovPuY?fn3of{#rY>?=k4A zdpOO^!U*0O1CZqL8xK01*x+hAajA!Y(QI#Zlu~si=(waXZnZ&ymmOBRIF}YWAgHGt zl8Txd6r|+upC$5Wg%S`ONzV)w0L;0X2iS*3Js}ni(`Hr&QyPB`>mFOaSs82nQfRPY z+e@?;9tkRd&Yy_rBr?-3Tg+_mYn2T zva$sJk6jKOvKnt~0pLnT{b1|{#r%y6be7)j$8p2W9E^&7qNwv>z`HJJPen?;nWk%)n`{%+B23;N<$|9L&i&2WVvBQT8eYpjBh-m2V4;5Jm92lX|iZa(8nlh_-*4l zKL5gRemdHe|JuE1Cq5r*g{D9wAT#QCPs_72P^Un)#L}bVyZTiVifXQ5eq7_0LoM$x zzvZpaR(Ylm(uMS7og}nW*HHobH_lv%YZmghm2kCB`KIh@w?)9!_axp5G9YX6=}xbx z#WoIt?`dmG+sjD=#_0Qf+>+sd{YsiT@UqurmtZ7~I6V5bB(8>Y_4NCAy67Z3lFU}+ zlGov$C2!>@ny+V6Yu(A-#>Qb?o+tz(5}vOC5I*HO%5UzSdnLk7BV8bSz3Gul^GVoV9DWy>;wIW(HmWaPB8^tJ6|P1Ls0$T7jYxqraE$k@Izrxv- zG8SbF8jk6=nX)a^f_@e2`v^^dcb6nmO@H zDcW%G#%0kyA-OMgBh3|O0h0Qg&jcGyZ7Iw>=QIPb{$KTo3g4roZ9%sV< za5(F@V+H_(!{lo3GAONQ7ebuh^ikdnC;i4WIT}aTm#P~!3Me>Y8$okAD}5_1c=hs{ z7w<}H=6PsfyPA>0865UB?p;FF>uSq~g{GRG!wdV?r#tUk`>UvIt2HV8V42zEcl;s6 zaC)a)zEQ5A!IJ!kyzuT?Lz{;#ZYbR)0y2>uZF&D6SM<5^NTA+PBo;8h~d+ZY!>uj&x( zm04J-98159I=Q8m@=P8bCbudtc{iVTxgl>>zJNS9sZSsKq-HEwnTA$gdK??CvYWa{%QQfkl7ogP+-&jsKp2Z z2xZ2lsbS5B9VmK3)`Gh>2@QYHE>H;tC%9WCZkk+;K_kBi}Tew#2))7n=9N3^xbSQS6@m_`ID zMmMZ#dLDW-Y{&>py%t+%G{+S&!8_6Fa=X6`Y3{TTEFjKA?i}Pmr zCUym&sMEr z+5WazA-Uu$D$sDV#x-Vc1)EdiJbwNi08@2ibXD)J++R*qigS-3Uy8M&aK2 zutmM}DyzKUq_|pjRx$<2%jZvPBiOtCSx~&*mL~D9_eY~_xK#B?9@Rus2xwdHV6eWt zyPg(1U^^+bV8T&j#^@c{HLR*B7?9llK>}|pKX-@3&1cn1|5cgFo{lT8ote4DJ4gRY zUbf;x&id{)rJ6lZ~pMiCtZlsRoc;jbHCqcqe~!N388ZXXJaKhjX#$?{h|cXXP^ zT5f~bv>k55B?iqP35ynOL!W$5?>XBUeJb94SkPAmFqhyTF`|ErL#VqNp}@Tlg$I?sn(c<33(n7Cy4U@}Cb?){;tRxXk*?kLe!eVYC z4jq-SLNwYT9D7d_pW9H|s+ghlbn{hH6C}Fl?(k%%3lW8nlpt z@2i=@9J{S@YhGlp2`AronG!KD!)kMuOTFvcaO+SNpYYI?QEZy}OvZjHw}=hA~}`}6_h~Mc*wRB&Sg#o0~PE|jQ{23yq9RiR6{cguEUuKi;4kwJv5(72e`apDOW#t3;*;*)s_5vMwzhhLx zZ&!CqsGg|d0`u`_6<&SPOIfVjVpPbF-!&!?{-iIyG_13@`CEo~c4WZfe%EPYx??_TSk@_{Ng z7q6pgZPTDir6n%Y&YqDOxaNov&QMz#w^vrHcU>-@7l;?s16Zlep0|e>pjX6=qJO$l zT^)uH^n0|gqlUU%n6{8JFqs=hMQ7daTtq5P~WyV1C3U~p8@u89B zX~R1Z^yF1wlR199FLFKj<=j=B8XuGgtWBOSp*8mOypQbMvGP1_xkDNzyNsa?;#ty?o9WKz$InC_XK~7D5|;?=8+aca1UL-gumD4nAg*IkXXqR&2c(n17pQcYjW16 zsTX1*Ub}kU&*uITx)@TWCKU94ol$~&FZj*fpaQ(?rqR5j(A3@<13;^AdefgQ!h5T= zGC6y+JA^E?pT+E)C7s1xBJ(V+Ss_!b1VIPnNFJQU9&lgqW2_{skhNP(!G7w^C_4Mj zChhek-}&g+P{paST~g?}&%{Q2GhkK3Q&~BL%W05TL0jVnih=QRraK|e!amPz4Zn3G zJ>2))PtHa@qp<~wWS!0F#3lF+Mn$$oBwHsd})F7CLOv(S(5(5ewedE&S zIdb8QZIXP@KXGn& zs6c3hxPHIo!l!H;SvYOG(YByYnnkbGl_i}o_V~$ws#KJL+bQU@p z1>C2GG$H2|Xx6jVEGh9&(;v%}vn?*z*s74$s*}aAU*f?wtZL@BQ?&#r4rkp@9AOP% zgrjq^Ey>!Tx%N0h?kHd|`x704MDAME+R}V(L`PAJzP8q`H@wqh0s#XGl82LFd2qx7 zzYj0NpY{raZ;2ueo=3RelNAH=llI?~S1s+KnYTW|RBKtY%)9v?Gp_UKo3OpVmjRCD zBF65|%k%=C&|_$*5+a7WstF5fK{s=f8-zTN0MZP+h{4ic7IBe}fJkYW$wO8vH#qSqMdV0L=<_Zl?2-p>{j%L22VByjlDbV%>Fq*SmZK{}swrnX0(5 z3_16oH;)j-E57j$Hx+#?3)$L&Bk;erYShdrHLLD*HbUhauIecRL{JFh!P{9nj_omK zqP`-w5!Oki`Hfj?l*G5mP>BlVd{dBzZ6}e>3{JhQz2))RC`r*?;cfc!ZxV z=|~H_V6A)5Q7%E+xf7pp1(w}59oZ$*8+;n9gKnyua~7m6lB~^rI*YN}3rlq0c!El{ zwS9_(T4+cZ@0MxFEYWIj(To$jUKQ_Am@|yB3HNG-c=oN&P~3!$LrhBfpCkWTOjZo+H+sn8!AsL zM=Pg1pd^T|cH%k5B*0Nr0_owxvgdntYSm{8h6!t9$M9JP0fgnR+VW#!eZ9+r5Y;x0 zefydzE}~n3_5BGK%X)xedU-hhxaGrmTz<6W_l&r?Y$AYgX-y~r2mA{0-HfQYE!#`n z*T%&#kE5+4&-1!dY-!$fdU1g9d*Z9r3)9HyBFf~oXBbY2GEr@jC?PLC8k}iVQ3+Fy zU^%Yo&{|y`TA$aI)U*8cq}B-C*xM>acVd@LhLcM`Q1$u-cii;rSNCs?0j}2J*xAVY z5SF+Rr<^`?x&lc#>t8b{KV6caUKA}wLNd#KHLtnU^S=gw_+LrzS+pir4#`9c(f|dR#UeSP zpISj|**UJNR)D;(3I`7=2!QY8rRV%G{+n7xCCM)`<1J#X(1UI(NP;u&-+0Ju9T!?Xpl6chp z>sgeI$rm@sBI_L4CTDxsfQ`E*NXMZe7<^u_z!R678Q!fodi=g|C@4tq(*%j&J%E;y$R5j4>B{{puvNYzZ)yUKb! zjXDCDKq~v!n?`tVXb(J%#hx>I9O$$E*#MNx1uZBX7uHt;glAw$sH&|0v9j_w=|cUg zjJSEH0L)A=OA%=O>1GE~$S>MqP_vF5X~hxuYd*EB;XOYi0|4Ag;1i}lDSM&S02d7+ zy{h*gd(JN`aeX2H=L$%@sNNa&wO0<-GsIR>PF6PG#c4JjS^0Y}Id9J7)PwlXkG7Pn z?GbT`Uv~E}e*fdx?@cit007)j+271=)6Np%D&w`I561{!H^!d!(@&>(e1#B{$LOBl zZ*R0euZ{o!635ItJTeahy%z#j0DwR)jD&8ANimxSnBxJkASIC0Nz-O>ukxMz8zT}6-A1+RZ3_@23b2~{_1QAc`WM_UK5)a8Zs z_~dkPs0kvE-%3EY*aFNqQ>?C6iK~3P`t9bcFk9;dwPQ^kl6T>hZ8PUbYylro#-&on z98#l~Hf<&t>=pn}I?Lk;O+06qWL0b9b!evdo`*s9P0kbm)Jj!JHHg>Kt4DxEe$80N zuXVc}#W~{EOL->)$m4>O3;@(j*}M!E1(3iA@YLq^G^TZ$`HkM67O(&JNXw9iXwP*( z0OZUr%U={gbPd>&bTCs!R2^5V0y9Ip|_ISc^oOjBhSxpM>%el?ZuDyiSD zi}58lJ`e~ITI4G7sTu(6OtZo60Wf?4Xgb`pS+xqBZcu{QhD5<>2fIwR{x^64>`Yvx zcOSrY1e}v^WS1+!jFE>E3j5rN4G#y5#fO#Kdhq?#DNi@o007)lQXWy2>su#HwAR~j zXijAVzVu}OzqzNL)zp+H>HXVT#sHun7B!E!%kmBMSXkPb-_^R=&^3MN8uJ0{x;Fk= zDm~}h)#Fp4=yJPS;`b@(ieOg&+IKUJa>a++J;@>Yb zYTkZ1#FcGW+RC>Mx6a~x8yZia05feU9-z#euk_l``FwY%Oh2tGKO_|CT6E2{Fkof* zj=c<#-_FfQ=~kLRN{3f(=F*K_*m5VsHl@1oq@q1Xj=e~jNeOD^IHdy6ZmxB{;S>P? zcE;Q|YR(N!UGb@c705nbmE$I?w-`L64A6PUkqHehhPiOIw%fOhSeZ*VQzyaxdF0#8)M!}1zi zz^pVC7wbzrNRP$Go&zvjXg>Eloo-hAORWk3yi8cu`PX+Hks#IPHKB|=o=EUmo#G7? zU;oF^WOYLUcO{ z9X{uO5C8z&OeyWnJ8o&T%YXBd#MC$P=)~RBf!S3pTSQC0Wo^G~H^ZMN768;rwFmWV zXCEW6bxF-;y};MrvUHDQCsi#bmIMHLjUFqx;}mYU{G5S+)(0B*90tX>W|p>!enV=N zZ0A3pPt4=UJM5|GFv%m)mI(qqNxsAOW;~3F$NlrJ+2r$Je|+U-ZoTTz1}^ zred@8={Cx@ugiO&M|qav9Go=U;xfD&t)dB7UMy1p-w-P*o1+crBLgU3jiQKJiQ87LtFoHM~`AyOnNeyz?($e_EoNwxD>rrsOeTV@i3*x3I1L0 z3rs4&Kc@+*VM>e*JZ({zKAb$olK+SpO!XzENdN!<{us5X&W2>b3dV5x%CfdK0d02y zX|gtUgt7sV*mj!d9y(q;uCZ~RcA9lG6ozD_4_+eaa)a00#zkm;# zHyo-VR(|H>NJmQu#CnN>+G|KXmh6--?8(ODa-k!wUvqdNzCzBS?sa;j0TbNol*sEp zpB$8j9&xAwWa^R3$X#_P8PJOlS5MbWrBB9Re8>?VG_I#$KR-@fAFkab0M-b#jLen^ z_y7;v>%a2yO!0Xqf6sxDb{IM*$bi{zSC}5ZDW+C=DB`gH-$p&Pfi$z)v#RMNH1bK- zH@U5Iqc@6NYlEUnf(gb$aeOMoH{e@!TnzjiBug(!Dm1WxEh(CZ=4>S)nyLcgAxw%E z&hV6^YhPeH+9jBrl=`oSD!5``b`=6!M`U(aQRM6&B`+`Q^Pb7{QM>EHHxdLySQ=)R z)$0Z)6)fL!%HW~^80Z4D>oTc^s#y_BbNVf@O*$Fty)!uY4J279TjD~Mf zDsB-08?y!gEL$-o)9e2gEd{K6o=t+~d{%y<7@4;#rlPAd`{M*Z zPuu_i6iXqiB=1LLTjXhUa4fL%-_zs~pVX}J7J)3U(QaaQ{^+1TLb52}YJN6^p z5}1**h_uP7u;d^4TkG{VTX;2DK87;hRcdwCDxo31{wZ*$P-n~nEwp+|CF`wpfV%8r z2D+y5w5m&RqYPeMMJ#~j6Rw1|a76g#YbgMQ{bvtm8>j_7K7s}GfeELd_F@8d3YNPs zHa_uSc|a|Y6#zgxKmwVWwjB&Y8`#?!i7*a`A2FIB-H==9oqFf%*)1#$|JJYm=ddqM z%v)6Y(aJ;|LKKCJ%pNKq9%YdHKH(l(A;t+fGM36T+X_c)GPM(6)Z=lVqjAzkHvupwUPymy=zxOBs z)^|)wrCp1eeIj~bC#Cu3$v%swn0E#M6j8{k`#amb3rzhgYcCCTYLPiPsE>m&>4US_ z^RfQSlScvo{8-sqh0gDG(O?$T!K?vkDu;&4{*{WF)Ca(Nb>i>C#u3K_qD-hC!asN$ zEL$=DpgQhuCPX6LBq%WI1pSp=>9xMRD|mdj04Vl6^E|3=hSQn;(c)zqd9^E7bAP4_ zml7UU0Du_A06@lJr?J3I5cqZokOL5EMPuA(ioX2CL*-9b_1sWNceuy=Uw0c*cPk|G zRLOZvW-&ue~I|3WD5AovR&`!>DYAA*Wk2z_@aKOZPw!~uh zqXv9RF+s&N;5-Gx3l&bEKR=UrSOA`B<)m80#Z}_(jEAH1dVaCzLdxvgadaJ8Xn@QT z6FR{vFuXpSEH%cEWbjvPpUM6pb+6Pm>W_p+qAfWq;D7xSk7j7j#aS~0ZF~b{RJC+J zrvRY9xeAqYl~Kf+@oXFxthVWjiq24o0{M!%beghXtgJG7v^O`(gr^+e3-TVtnaRG< z=r^foI~`z=lsCHo8+F)-JHkb8%{V7AfZ;*OIUR;Le5vP`-gvJ)1ORLR9vUSlqFQ6* z-|+xX`=*Ydt?02Kvu6w?g}|5BYiSMX+JJnyTgCzmA`Yti6I@|~A_ zwBUv4%D(pDWG;WOsd3p;dW5&H+R)E$?Y+Yk&?zj7#zUH?Cf9!^^#}lSIN7-NmbO|5 zw6_lgb%tbMm}!WhNS()YuV3-o&IU#FgPbm2a;TKq!TKa87VLR=$)D54FExJ&HtnUT z60uAi6Z5PP6jF5r0KOR|3l4@!T&fU57LdKKYEU0S6tehHo^3}1EK7864I`2deqy&j zPrQolb9c0Fd;R-QhzXYQ{Uz=;=jo|Bnj*i)rto^yMpS@498||Z&hzUrFqTTDDPB`U zl{Go!Qj~A+^eUr*WQb@KNwseimfdHmT5$MwKuIr40cvU$-q*$nBpwUjwhHqBf$MU^ zSpY;p`3c<498^{FRAYtQ#^nz4@50t+!c+cSZSIT!{uxD82O%I?3}X!MXJ$3^$Xz-% z)l1E$9+qe#B`5+R%q7k~!u=Or{OlEXOU?zi@9t4CbKf~A*d1o5>>TR1r;}+cF)IGw z)8+T=pHRUyTm^FA62=m3aDZatEAy5;V35(n)!$h&{ssZ6mpE!z{s$BUI;x<1B7N`d;xvmoXKg&UqQYv8CQEP zFWnTr;i7+x2>)I?Rgq^x2R`Y9UPQIog#Ob;nceeZSGYm90CYg@CxPr7 zBe15pu*mx!4Tt1K2l}3rAKFLIm#+aa7vIk-=PdBj2-H2AFrU6C;03=C{#&RAh zfJjoQOmkqC#r`k-pFncDNO-PRsh|}Eg*H)EWty@MxpF+2bGx5guI}*Tq#dQL4u0|) zgae=aAYONO)S=yd7j&y{J}%GP>t4!w8HNf<<+f4xMd*lZwt+i0Cr~tHG|L@ul-zk8 zkP8jI075U|r}H;BH|J|;O8~ewYO@Tb%fppufT5Il5o8hQQ2;i`nE#s~VYM8k=+zDt zLL%yD&8GF0cmV5k)47tDVNC)<-W7msBJoxLAW_Zxh5;Y}fC%qQG$yDHQ??FIYb6T_ zean+fOaM=3XHx(KfZ+iE00000LINC{1ONa4M?!n~ZyzBcBOfX)D6u9fD=e!aAtNj+ zv?3!cDk~!+B_tsvBPu8=E5RWsF1{)$C?X{#BO@RuEh;G`BPAdsAu21nD=59UBp@Ru zE-Ng-D=sR$ASoy;DIy{xBOo9uDl94?AtWOrAt)&xu}H!49_mhX!s*YK>keE z+w}17KfO2bVa+A7&IXYd`GYj=w1KE0<(rc#K$PYb7R{F`*+|=#|p62htG8r01VOALvs&+VeJ59D>D*#X@~U| z_3E?Mdl&t0UGR&$MY8|^6jv#h{QXrC0pxo{O#{*M?iMHb!8I>0Jd#^l&fNn1P$`z4 z`v9&^fZsPCu&LO5Q$5%Fut^(|#R?-|f25_uiqHP=;peLe00h$(#~+CSlB`ju1|yCH zHQ=c)3$bi(5pPMQ1AuLrdVGxuj87T`ru-KQ#vS}n$aZ=C_Fe~BK@#|0Ou|_6k^%5X z6P%22D9UNQo59&Q{xd>v^%l}7g^kwBp>bJ9uej>*{a>fQe!6wcaeQUyRsaE%(iO6? zFoGqfo0-gZ=DkcKA+o1!%~raIE=fVEK1^c5@g?vwGpmhy7=oO(P(sI^gF~Gb;k2_>|3$pAEJJPh8{+^_bu2NKxK zFu7m_up|Pc0sv%&)I@NG7T{|2!S=QB#yV-AXz24-^T4*R-~M;su8THK9=okp5N0^% z^f$jR{gSjC7E*ZBxPM_&AyzGFnnoc3h?SJvh@m|` zj=r?%vet@auEh!oP-&*>I!VChr3_XBg()RDZ=mF$+pA}uDbff2x;jSLYbtXl(4bY` z{wo2%?iW#YPuCp){7SVrBR!1_mVlbkzuKIJo;Qkl%-s|W9&W9r&73L#01QpM=HA}& zGytlbp7yU6QWWM%jZsY9X}LEn?(%hK008_<*{Y#gAV@>lGhx>u;;XL zC45SP=dawVrt_dSr!09LUdw*8lbyL&vo5;E7P=vaarx=`6>4!F3ZCDnfCyiI&?UiM@8j;7;}6&0@Kb~gzu_{93O7M zR2$D~4c`+P>niYQSum$5YdLLCTxFP~5Q*n7VIX-^!^$$wi)#lP8}IdPofowjD}QUr zFSNP2Vc&8#0D!qu<~}eH{7#ry}0D%>S+z5O>!LCBwZJst+8 zklPb;h&9sVn?1Du#kbpqe>b1kI^T6L%{U07(_}b_7pQz%oy3D7d-c)z$zk z{(tG0yZz4r0Q5{%xk~XJlRyJls@}Gq3oW(NHd&@KeoRQ_>WW0J=kq=U0Q^c-8Jqqr z1E^|t+DPC5qdoN~>jaIDyY;ofe5dUz3IOy(-{EVNZDS!Tjgn^WzgnAp0U!AE`dG`a1~RV)-}xL zJeJ_%A$7cpub4G_1I*F|HM-ZIe$Hj(jTsOM*!d+^MZe%^6x8jQnuU(Bi4l?2y+d1C6@1d{4w9%l;U`@dd%(xYy*^RN{3=d231a67G1h!{Ozzu zTK#pqo}bqvUdTkZ?s4NVT*Z@)?zI9?$mTuh!H}*J`8i5~P0~pHb|Z<5gT53JbTRug3@g0K`TB<+KT_%^`rP z)F$Hb*F#mS@fP-{>o2pM8~mHI2>{$iQeq@@=e1f`#6kA$?wXvqvnT+DV>nhrVl60G-)-JBji3 zimy!$61E(M)N6yF$HSo`S%1y_$@l7$;=Xw5E)TvX>XI`34Q*JEJClA@cyyTj8>~-1Oa-NOQ3x`eK`OKpGwy`Ko~Y+U(ubqrIuC8H~`d0Rp>_EL^;bOgSrMI zr&_Wy^7U-iaDjc?uq0QA&`?b7XpwGGgUs|R4FO$mSKXg6I|W(MGnJxcpw0q<|! z{H>Sf0NhI1ZqFj_6G9Gz^IqTwYhz`ng8%Yw3IJH95EZ}vP?b~kPE+^-`&iOwAaTtJ zgeCdz)do#zo~L90D#dlONxMuiNG>i1Q^0^hl{^!1U*l z77|>skdL2fDxLj#2kemXxZDe#6}Pg6asjafM^#z&?7HX#AwvH~uL?|-!1rOj$|tUI zSQWM+?*{%49%?xnd%&WnPl<{$_DPXOH1*^Fbdsh3ZB;DB7YjdSb3;_H_NIAiMuMUu0SXeZh ztF=VE08l2?*L$fs`AKTFg4g<|=;r|pM_)5X;jNPZ=wZ+J$F2+G)33~4+RpF1lxh!& zXBh(oNwL;ycb{k=D&40I5e?!4-u&6rX}x=^x4n`2PrcRa3jqAahRMVCH0C85(!H*M zczHPefM{i|y(F>POX5<^-@pL;&hla0Zr3U340g<*E$hys-ys_XehF_=qwR@KqFL*I zB|M|d_Xpd^bmYz{Rtjv^XO+1~73`fC-XyK_eZA*sfepmM5#A%GaPL%R(|kayF*mWdfk((OG^c&^e^jn1I||; zXENz+RlO(75SQD7d0W3}u6v#N+H6p=pKpz50RY6zskLTiyR$eJT_A5-_);@}m9g_G z0BuFX-@OWEA+5E(9%Pnn*<$~l0KCoxE0kN65sl0sz3@Hr*K6Zk{-yw*^PcKd*KOXN z^!N4f_bQTRJ$kkrBuQ@c10i)0&e9yZulws*dx!b-<)zd;GnODUOa`l8)^|rgYzV#z z&A!YpoB#D5ympB#hePHbyA$8K-w2IG6!~M*>3{dQnr5Hn4V>2aF^l)SEZPl3hnKj1 zz|~)suq$cTJWTLuE_~@Zxwv_2>sE>#(Bhm4`NgNJU-TK2K*pKkSao%RvAgok?61r; z9c~n_>9a?|Z*Q>Zjy@CXNzoo!U?T-pVBipt-FH&T64W|(GO>9c1prpI90Dq9>mL%a z51pLZ@1{DBj4ST=oMJMq+z0@QKimjHi3qmnLW}G7E#kQ)dkL$VXRIb4H&)qC)4qi} zU6Q*d7xg_bG{Q0qT7X~1+0&De0ip3A8YJia%{EDgfvkft1bSUB?Wg}BkR^HYWS<8B zfI8=_b-n$3%Qs~LfT$IgrX?iWSrfuUWAtO`rD^S~B|FI?IYDM@@*|c(=zW}wXeRJ& z<+%FUTj@ltbdsq>n_0#O0K`aGQjy;^d5~b$x%_V2S5~cnk3F{^FWC8YV)AeuHF~T8 z0F+A7R+Kd}M}iJKwp7OO6j&>^SSjc&{Y{sYlo-!E2fRuEL5%d>Zvd@iZSD7qe}T&M z*p6`GN8KBfKyUv+4>th-u{>nlTbeU0{j2MgaKE?S9|J4|^|QGwU(IW_^Zr-pCz>`^za;5MUH(J1Be24)`5%h8zwA557RKh9%<9?a|lCea`o< zLT2KsPZk25nbD3g(h2~CV@a|0#Fhvqq+5?ztjb$`16eeqoF}5^4J8PcV!J z+A(%TQc)X-C*Q+so_O<^FyMZ^M%INTtB~geZA}TPnpWClm z%x_fj{}BMxR#<*k273S%6mbF-fMm}G&^j$?FAt5%k*`g8xoOU`P;l36G9S17{=rvx zNbJ-uhu-hkPdqvW0V62Q0bADfg(Er&hrz#W0s0?bk3@6zoH!@*r52Pjw+tyhN5g;* zeAE5%SAXhejCo&r;@dWKEPxnwtep+cE+Pv1G-u8Qjo z`Ct@cT<9b5)w(_7IlWJctn4%-{)rutTj*k{yIcB-OmFwv=c8M43Y=klv#bn^$;VDt zKTB)b$A7myEWLdA(EA}-nGEJ$WfGL&F0Mm*Zr^-*wD3j3k`nL7$GO@25STBtGx{x( zb?sq05<}pO4%;!zKI0X%Q}ZhdAn{-zy77Ahyv_yP;u!qi9H6-DJi|}O&(9`b zJOpU@oX=MJt?yC(Y^GJ6#>XdHkbUt4)Jn*@ivPYZ%VrIzz(qD>BPTbZ>P}v&zTBq( zdCCQmN|4ldHLk`l3B*dZg@BTAxR8v9dDt@qvr0GvwFW*gB5z>_t==iO0}DrEM@tejXC zLDOxK=d{*8a{6fiv`n=b{M%Va3#8lGt;NL~_ldHf4^0x3Ef^4cZ7w8_#{vM{Oj%Cz zby;x$A;*$nt$UO~E;K@)gdVRobGoT6Hw*y8O4*-L3;RTZ1V;H9iv4Bvb|Q=2=DFQM z=)<;|$0`7{N>Und)3>*72XMO>b4;;3Lw z1X#wYQTjU43_vtXxf|_$+~RQRH<1$S-xzONQ|kfjN?E6>UO$zMm0V*BaQgh{p+@`x z_$%U0P_r4hRj;PhZq`mvr(M}l0MtlTd7bN5vt}{;*K?O;DJXWaM}{8Z0p z2>{eewJ|mwuL6`hwyOzp+Lt>bXrt8}2*@U0IK2E#jRgR-%mt&=AQP$n(y%)JK+tF> z?rp@avtLBZj66M_!R_y#CIJAvN>X0d`%E1&O;12f0K`UBEM#|jI)@-tD%&1C^m`LFh|P7*SKG{T@tje-ZVi!K z(eI5|0KCp;g{q~!P1KT->s;eYyD8ey`~43B6oVHzA7XIx@x-*(t!=aZ2>`s(1=-?= z`n+d|QcI;f%W_=j(r9k3C*gYe-}dk=?x9!oNvqHK9y}C&69BAAQf^NAyH(cGMzdkf z)mLR)(&$Sn{?D9nLg}S&y2tA7y{>k7ISx;4008_-!1a;t^91Peje}~Hh3_8U`S> z(=$ccPw}(u0OVG+FPz2i2!;Hjp{pt;ZqM z6UXe|UwDfUYDCqj9!QR z8KO$hW2ckMfYjw?1z4jeS`hw#hi89$INRC6&$>jJuorrts3t)cVf#CdY+YW;;&cl& zL$7lQBX=MS;J`q9yxV ze?K&h+s6A_PpkJlZou5NDo?x=TRVHECIP7KcXw~M&ffxa*OJM0X^ySb*);(0LW~v- zRF;2owoxb^tU@)gWwS3i=<79khlVTh7IMe0#~;+&O* zIcq^@ZbiUo?U8@rB5}@|I9Gz9v@Z)V$7@0bPdVMoQVi5yO2@(ZC*Wu6WAv>pya3>U MgY%zehz2GA4kI@o)Bpeg literal 0 HcmV?d00001 diff --git a/Resources/Audio/Weapons/Guns/sources.json b/Resources/Audio/Weapons/Guns/sources.json index cc9a3e5c0b..351fba0992 100644 --- a/Resources/Audio/Weapons/Guns/sources.json +++ b/Resources/Audio/Weapons/Guns/sources.json @@ -34,7 +34,8 @@ "shotgun.ogg": "https://github.com/discordia-space/CEV-Eris/blob/01f7518e0f8177734a6579aba2bbf76024aa96c4/sound/weapons/guns/fire/shotgunp_fire.ogg", "silenced.ogg": "https://github.com/discordia-space/CEV-Eris/blob/01f7518e0f8177734a6579aba2bbf76024aa96c4/sound/weapons/Gunshot_silenced.wav", "smg.ogg": "https://github.com/discordia-space/CEV-Eris/blob/01f7518e0f8177734a6579aba2bbf76024aa96c4/sound/weapons/guns/fire/smg_fire.ogg", - "sniper.ogg": "https://github.com/discordia-space/CEV-Eris/blob/01f7518e0f8177734a6579aba2bbf76024aa96c4/sound/weapons/guns/fire/sniper_fire.ogg" + "sniper.ogg": "https://github.com/discordia-space/CEV-Eris/blob/01f7518e0f8177734a6579aba2bbf76024aa96c4/sound/weapons/guns/fire/sniper_fire.ogg", + "energy_crossbowshoot.ogg": "Made on request by Nosrepp (Discord)" }, "MagIn": { "batrifle_magin.ogg": "https://github.com/discordia-space/CEV-Eris/blob/01f7518e0f8177734a6579aba2bbf76024aa96c4/sound/weapons/guns/interact/batrifle_magin.ogg", @@ -47,7 +48,8 @@ "sfrifle_magin.ogg": "https://github.com/discordia-space/CEV-Eris/blob/01f7518e0f8177734a6579aba2bbf76024aa96c4/sound/weapons/guns/interact/sfrifle_magin.ogg", "smg_magin.ogg": "https://github.com/discordia-space/CEV-Eris/blob/01f7518e0f8177734a6579aba2bbf76024aa96c4/sound/weapons/guns/interact/smg_magin.ogg", "revolver_magin.ogg": "https://github.com/discordia-space/CEV-Eris/blob/01f7518e0f8177734a6579aba2bbf76024aa96c4/sound/weapons/guns/interact/rev_magin.ogg", - "shotgun_insert.ogg": "https://github.com/discordia-space/CEV-Eris/blob/01f7518e0f8177734a6579aba2bbf76024aa96c4/sound/weapons/guns/interact/shotgun_insert.ogg" + "shotgun_insert.ogg": "https://github.com/discordia-space/CEV-Eris/blob/01f7518e0f8177734a6579aba2bbf76024aa96c4/sound/weapons/guns/interact/shotgun_insert.ogg", + "energy_crossbowreload.ogg": "Made on request by Nosrepp (Discord)" }, "MagOut": { "batrifle_magout.ogg": "https://github.com/discordia-space/CEV-Eris/blob/01f7518e0f8177734a6579aba2bbf76024aa96c4/sound/weapons/guns/interact/batrifle_magout.ogg", diff --git a/Resources/Locale/en-US/store/uplink-catalog.ftl b/Resources/Locale/en-US/store/uplink-catalog.ftl index 3e070b835d..e7e6b42ae5 100644 --- a/Resources/Locale/en-US/store/uplink-catalog.ftl +++ b/Resources/Locale/en-US/store/uplink-catalog.ftl @@ -501,3 +501,6 @@ uplink-acolyte-armor-desc = The must have of any self respecting cult leader. An uplink-briefcase-gun-name = Briefcase Gun uplink-briefcase-gun-desc = An indistinct briefcase with a highly compact C-20K mounted inside it. Careful not the grip the handle too tight! + +uplink-energycrossbow-name = Mini Energy Crossbow +uplink-energycrossbow-desc = The go-to sidearm of any operative who prefers their victims not to be moving. Fires regenerating toxic arrows that floors victims in an instant. diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index 6ef1720105..7c926a2931 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -80,6 +80,22 @@ categories: - UplinkWeaponry +- type: listing + id: UplinkEnergyCrossbow + name: uplink-energycrossbow-name + description: uplink-energycrossbow-desc + discountCategory: rareDiscounts + discountDownTo: + Telecrystal: 3 + productEntity: WeaponEnergyCrossbow + cost: + Telecrystal: 5 + categories: + - UplinkWeaponry + conditions: + - !type:ListingLimitedStockCondition + stock: 1 + - type: listing id: UplinkThrowingKnivesKit name: uplink-knives-kit-name @@ -783,7 +799,7 @@ Telecrystal: 1 categories: - UplinkDeception - + - type: listing id: UplinkAgentIDCard name: uplink-agent-id-card-name diff --git a/Resources/Prototypes/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/Entities/Objects/Fun/toys.yml index d6d989680a..dffd08e919 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/toys.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/toys.yml @@ -280,14 +280,14 @@ availableModes: - SemiAuto soundGunshot: - path: /Audio/Weapons/click.ogg + path: /Audio/Weapons/Guns/Gunshots/energycrossbow_shoot.ogg - type: BallisticAmmoProvider whitelist: tags: - BulletFoam capacity: 1 soundInsert: - path: /Audio/Items/bow_pull.ogg + path: /Audio/Weapons/Guns/MagIn/energycrossbow_reload.ogg - type: ContainerContainer containers: ballistic-ammo: !type:Container diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/energy_crossbow.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/energy_crossbow.yml new file mode 100644 index 0000000000..40b7f7adf8 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/energy_crossbow.yml @@ -0,0 +1,49 @@ +- type: entity + abstract: true + parent: BaseItem + id: WeaponEnergyCrossbowBase + components: + - type: Sprite + sprite: Objects/Weapons/Guns/Basic/energy_crossbow.rsi + - type: Item + sprite: Objects/Weapons/Guns/Basic/energy_crossbow.rsi + size: Small + - type: Gun + fireRate: 5 #high firerate innately bottlenecked by ammo regeneration speed. + selectedMode: SemiAuto + minAngle: 0 + maxAngle: 5 + availableModes: + - SemiAuto + soundGunshot: + path: /Audio/Weapons/Guns/Gunshots/energycrossbow_shoot.ogg + - type: AmmoCounter + - type: Appearance + - type: GenericVisualizer + visuals: + enum.AmmoVisuals.HasAmmo: + empty-icon: + True: { visible: False } + False: { visible: True } + - type: RechargeBasicEntityAmmo + rechargeCooldown: 5 #2 seconds of KD, should always have CD > KD + rechargeSound: + path: /Audio/Weapons/Guns/MagIn/energycrossbow_reload.ogg + - type: BasicEntityAmmoProvider + proto: EnergyCrossbowBolt + capacity: 1 + count: 1 + +- type: entity + parent: [WeaponEnergyCrossbowBase, BaseSyndicateContraband] + id: WeaponEnergyCrossbow + name: mini energy crossbow + description: Launches renewable toxic arrows capable of flooring targets instantly. + components: + - type: Sprite + sprite: Objects/Weapons/Guns/Basic/energy_crossbow.rsi + state: icon + - type: Item + sprite: Objects/Weapons/Guns/Basic/energy_crossbow.rsi + - type: StaticPrice + price: 2500 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml index bc9f40f85a..c52a49b09b 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml @@ -1389,3 +1389,44 @@ hard: false mask: - Opaque + +- type: entity + parent: BaseBullet + id: EnergyCrossbowBolt + categories: [ HideSpawnMenu ] + name: energy bolt + description: This'll hurt. + components: + - type: Reflective + reflective: + - NonEnergy + - type: Ammo + muzzleFlash: null + - type: Sprite + sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi + layers: + - state: crossbowbolt + shader: unshaded + - type: Projectile + damage: + types: + Piercing: 2 + - type: StunOnCollide #somewhat mirror to taser stats, meant to be tot 'sidegrade' + stunAmount: 0 + knockdownAmount: 2.5 + slowdownAmount: 2.5 + walkSpeedModifier: 0.2 + sprintSpeedModifier: 0.2 + drop: false + - type: StaminaDamageOnCollide #additional stam damage to make repeated pushups less of a viable counter + damage: 45 + - type: SolutionContainerManager + solutions: + bolt: + maxVol: 1.5 + reagents: + - ReagentId: Toxin + Quantity: 1.5 + - type: SolutionInjectOnProjectileHit + transferAmount: 1.5 + solution: bolt diff --git a/Resources/Textures/Objects/Weapons/Guns/Basic/energy_crossbow.rsi/icon.png b/Resources/Textures/Objects/Weapons/Guns/Basic/energy_crossbow.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1ec5ffd7fa2dd4ddec014514aa6a814d048fe326 GIT binary patch literal 618 zcmV-w0+s!VP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0sl!vK~z{r?Ul`H z8c`I-|04}9L|v%GiueKwGUF4t4ISLHZ{WDf!WZa1eF9tb83I`+bRVqgN^mKYP;FJH zxbOq*)N{O(m}GL*nYK_mKRBGZcRtSld~gRoKL0$KOvWk{3YJ(NOh9;7Q1Ey>j&ivS zw<0_Vu&LMUoa+H>hk+dX#*Zui^s!1?(2{Ko*l02f3P^B;jp-~a#s07*qoM6N<$ Ef<`G4rvLx| literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Basic/energy_crossbow.rsi/inhand-left.png b/Resources/Textures/Objects/Weapons/Guns/Basic/energy_crossbow.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..df7af5c44da43aed7889d877bbec44295367c516 GIT binary patch literal 352 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|ei2$Dv*Z&Ov{d{~B6ciX{GU)5+ zm6w-mX=?U#bupLi+XYm^SQ6wH%;50sMjDWlTNM&f;*wgNT$EW*l9`{!z)&$KIIN(k z^!u0Kf{$OHXnE^uojY?rctfbcMdJsLbk6%|o@6NM>D^&r9Atdi*h^u~qe(|5g(w7T z?$p@7!$Na^OlP;T>gE*^OZvNw*J>D=iykq15)@YOwU}`>55ocm>4qBu5Bh-?*Lu1* zhIkxLPLN<-+~C$QvGXR2$3_Wb!=!Kpfs_MGK?f2<6dGb(H|=8XC<^yGkk~F6%-Ero zWPD)Zfdh?_9!AC%4}u;rEsd06v)bc!P(vc{zzxP@hvM8AigjZcuNgJ1WI1>&%*{Z3 ug|fwsQyghxY&#UL88K}Qk03aYBPE1U9cXy16iYh57&d(3@00001bW%=J06^y0W&i*HZF*E#bVOxyV{&P5 zbZKvH004NLQ&wYE63;>`28-Uml z;EwzF3g1HHjpvgO;}XjMAoZU7GpHBuKvNyp+=Ue<3p6JGeuGS+0fR?N@^0} z)S;{dBN3Y?o2n(@rk>3hjUy)*D~B3KqU?xLe0u{o(+F}%Q49|N0000!lvI6;>1s;*b3=DjSL74G){)!Z!-~mq;$B+p3w-*fg7#&5}9?ayO*|MSRqQyZq zJ%z4PMs`8nwU2i+`MqXaw?I|U(Wh+2N$q8Gzl+cMZuEu-@7aEQ~kL@do`?W+%(&WLjb#*QtdKnG1w+ik&kN0^NyxlHuuK%h@ snO@U=e0W;YcJF9g&0YZ~jipz_KdGB@X4-`J0R6(?>FVdQ&MBb@048X6$^ZZW literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles2.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles2.rsi/meta.json index b4d8f09a82..5057bc766b 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles2.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles2.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from cev-eris at https://github.com/discordia-space/CEV-Eris/raw/56cbafd6ad8c013ccd5472d6c4a0db790f7f872a, ball made by brainfood1183 (Github) for ss14, the uranium sprite is a modified version of the buckshot pellet by Boaz1111, cleanade made by Southbridge_fur (github)", + "copyright": "Taken from cev-eris at https://github.com/discordia-space/CEV-Eris/raw/56cbafd6ad8c013ccd5472d6c4a0db790f7f872a, ball made by brainfood1183 (Github) for ss14, the uranium sprite is a modified version of the buckshot pellet by Boaz1111, cleanade made by Southbridge_fur (github), crossbowbolt made by Entvari(github)", "size": { "x": 32, "y": 32 @@ -105,6 +105,9 @@ 0.05 ] ] + }, + { + "name": "crossbowbolt" } ] } From c228db2402c04bd114a3345945df55e3894e6198 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 14 Nov 2025 22:35:31 +0000 Subject: [PATCH 056/106] Automatic changelog update --- Resources/Changelog/Changelog.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 878308f51a..4f0b516ac1 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,13 +1,4 @@ Entries: -- author: Prole0 - changes: - - message: Flask Visuals & Sounds! - type: Add - - message: Flasks now need to be opened to be drunk from. - type: Tweak - id: 8702 - time: '2025-06-21T14:52:36.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38032 - author: qrwas changes: - message: Loadout item group UI improvements @@ -3925,3 +3916,12 @@ id: 9203 time: '2025-11-14T22:21:47.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/40042 +- author: Entvari, Nosrepp + changes: + - message: Added the Mini Energy Crossbow to Traitor and Nukie uplinks. + type: Add + - message: The Foam Crossbow now uses the new sounds shared by the Mini Energy Crossbow. + type: Tweak + id: 9204 + time: '2025-11-14T22:34:24.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/39796 From 796e92df594ea6fa7da3371606511119e37ab132 Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Fri, 14 Nov 2025 23:29:14 +0100 Subject: [PATCH 057/106] improve APE desc, battery weapon desc, and locked desc (#41431) * improve APE desc and locked desc * 2 --- Content.Shared/Lock/LockSystem.cs | 2 +- Resources/Locale/en-US/lock/lock-component.ftl | 4 ++-- .../Locale/en-US/singularity/components/emitter-component.ftl | 2 +- Resources/Locale/en-US/weapons/ranged/gun.ftl | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Content.Shared/Lock/LockSystem.cs b/Content.Shared/Lock/LockSystem.cs index 95a681dc38..560bb296ac 100644 --- a/Content.Shared/Lock/LockSystem.cs +++ b/Content.Shared/Lock/LockSystem.cs @@ -119,7 +119,7 @@ public sealed class LockSystem : EntitySystem if (!lockComp.ShowExamine) return; - args.PushText(Loc.GetString(lockComp.Locked + args.PushMarkup(Loc.GetString(lockComp.Locked ? "lock-comp-on-examined-is-locked" : "lock-comp-on-examined-is-unlocked", ("entityName", Identity.Name(uid, EntityManager)))); diff --git a/Resources/Locale/en-US/lock/lock-component.ftl b/Resources/Locale/en-US/lock/lock-component.ftl index f1455568b9..23ee543b9f 100644 --- a/Resources/Locale/en-US/lock/lock-component.ftl +++ b/Resources/Locale/en-US/lock/lock-component.ftl @@ -1,5 +1,5 @@ -lock-comp-on-examined-is-locked = The {$entityName} seems to be locked. -lock-comp-on-examined-is-unlocked = The {$entityName} seems to be unlocked. +lock-comp-on-examined-is-locked = The {$entityName} seems to be [color=darkred]locked[/color]. +lock-comp-on-examined-is-unlocked = The {$entityName} seems to be [color=darkgreen]unlocked[/color]. lock-comp-do-lock-success = You lock the {$entityName}. lock-comp-do-unlock-success = You unlock the {$entityName}. lock-comp-has-user-access-fail = Access denied. diff --git a/Resources/Locale/en-US/singularity/components/emitter-component.ftl b/Resources/Locale/en-US/singularity/components/emitter-component.ftl index c71b3d6bdf..5b15154d30 100644 --- a/Resources/Locale/en-US/singularity/components/emitter-component.ftl +++ b/Resources/Locale/en-US/singularity/components/emitter-component.ftl @@ -11,5 +11,5 @@ comp-emitter-turned-off = The {$target} turns off. # Shows if the user attempts to activate the emitter while it's un-anchored. comp-emitter-not-anchored = The {$target} isn't anchored to the ground! -emitter-component-current-type = The current selected type is: {$type}. +emitter-component-current-type = The current selected type is: [color=yellow]{$type}[/color]. emitter-component-type-set = Type set to: {$type} diff --git a/Resources/Locale/en-US/weapons/ranged/gun.ftl b/Resources/Locale/en-US/weapons/ranged/gun.ftl index a364075be9..08f1f6cb22 100644 --- a/Resources/Locale/en-US/weapons/ranged/gun.ftl +++ b/Resources/Locale/en-US/weapons/ranged/gun.ftl @@ -4,7 +4,7 @@ gun-fire-rate-examine = Fire rate is [color={$color}]{$fireRate}[/color] per sec gun-selector-verb = Change to {$mode} gun-selected-mode = Selected {$mode} gun-disabled = You can't use guns! -gun-set-fire-mode = Set to {$mode} +gun-set-fire-mode = Set to [color=yellow]{$mode}[/color]. gun-magazine-whitelist-fail = That won't fit into the gun! gun-magazine-fired-empty = No ammo left! From 3b23f234c66d0a1dfb0e68c06bc6a38de5f29c89 Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Sat, 15 Nov 2025 00:31:10 +0100 Subject: [PATCH 058/106] rotate more items in inventory part 3 + cleanup for good (#41149) * rotate more items in inventory part 3 + cleanup for good * i forgor --- .../Entities/Clothing/Head/hats.yml | 22 +++--------- .../Entities/Clothing/Head/helmets.yml | 2 ++ .../Entities/Clothing/Head/misc.yml | 2 ++ .../Entities/Clothing/Neck/stoles.yml | 2 ++ .../Entities/Clothing/Neck/ties.yml | 12 +++++-- .../Objects/Devices/Electronics/igniter.yml | 2 ++ .../Entities/Objects/Devices/cartridges.yml | 36 +++++++++---------- .../Fun/Instruments/instruments_misc.yml | 1 + .../Instruments/instruments_percussion.yml | 1 + .../Entities/Objects/Misc/brb_sign.yml | 2 ++ .../Objects/Misc/improvised_gun_parts.yml | 10 +++--- .../Objects/Specific/Hydroponics/tools.yml | 3 ++ .../Objects/Specific/Janitorial/janitor.yml | 33 ++--------------- .../Objects/Specific/Medical/healing.yml | 2 ++ .../Objects/Specific/Service/barber.yml | 2 ++ .../Entities/Objects/Tools/gas_tanks.yml | 1 + .../Entities/Objects/Tools/glowstick.yml | 1 + .../Objects/Tools/inflatable_wall.yml | 2 ++ .../Guns/Ammunition/Magazines/pistol.yml | 2 ++ 19 files changed, 65 insertions(+), 73 deletions(-) diff --git a/Resources/Prototypes/Entities/Clothing/Head/hats.yml b/Resources/Prototypes/Entities/Clothing/Head/hats.yml index c2b1c5abbd..431c2978b1 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/hats.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/hats.yml @@ -563,6 +563,8 @@ - state: icon-nobeard map: [ "foldedLayer" ] visible: true + - type: Item + storedRotation: 0 - type: Tag tags: - PetWearable @@ -1227,6 +1229,8 @@ sprite: Clothing/Head/Hats/party_red.rsi - type: Clothing sprite: Clothing/Head/Hats/party_red.rsi + - type: Item + storedRotation: 0 - type: Tag tags: - PetWearable @@ -1243,12 +1247,6 @@ sprite: Clothing/Head/Hats/party_yellow.rsi - type: Clothing sprite: Clothing/Head/Hats/party_yellow.rsi - - type: Tag - tags: - - PetWearable - - CorgiWearable - - WhitelistChameleon - - HamsterWearable - type: entity parent: ClothingHeadHatPartyRed @@ -1259,12 +1257,6 @@ sprite: Clothing/Head/Hats/party_green.rsi - type: Clothing sprite: Clothing/Head/Hats/party_green.rsi - - type: Tag - tags: - - PetWearable - - CorgiWearable - - WhitelistChameleon - - HamsterWearable - type: entity parent: ClothingHeadHatPartyRed @@ -1275,12 +1267,6 @@ sprite: Clothing/Head/Hats/party_blue.rsi - type: Clothing sprite: Clothing/Head/Hats/party_blue.rsi - - type: Tag - tags: - - PetWearable - - CorgiWearable - - WhitelistChameleon - - HamsterWearable - type: entity parent: ClothingHeadHatPartyRed diff --git a/Resources/Prototypes/Entities/Clothing/Head/helmets.yml b/Resources/Prototypes/Entities/Clothing/Head/helmets.yml index 539fa90ea4..574e76d9ba 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/helmets.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/helmets.yml @@ -221,6 +221,8 @@ sprite: Clothing/Head/Helmets/templar.rsi - type: Clothing sprite: Clothing/Head/Helmets/templar.rsi + - type: Item + storedRotation: 0 - type: IngestionBlocker - type: IdentityBlocker - type: HideLayerClothing diff --git a/Resources/Prototypes/Entities/Clothing/Head/misc.yml b/Resources/Prototypes/Entities/Clothing/Head/misc.yml index 511f1e1980..332efb731b 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/misc.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/misc.yml @@ -121,6 +121,8 @@ sprite: Clothing/Head/Misc/richard.rsi - type: Clothing sprite: Clothing/Head/Misc/richard.rsi + - type: Item + storedRotation: 0 - type: IngestionBlocker - type: IdentityBlocker - type: HideLayerClothing diff --git a/Resources/Prototypes/Entities/Clothing/Neck/stoles.yml b/Resources/Prototypes/Entities/Clothing/Neck/stoles.yml index aab8eb30ca..d708a48f7d 100644 --- a/Resources/Prototypes/Entities/Clothing/Neck/stoles.yml +++ b/Resources/Prototypes/Entities/Clothing/Neck/stoles.yml @@ -8,3 +8,5 @@ sprite: Clothing/Neck/Stoles/chaplain.rsi - type: Clothing sprite: Clothing/Neck/Stoles/chaplain.rsi + - type: Item + storedRotation: 90 diff --git a/Resources/Prototypes/Entities/Clothing/Neck/ties.yml b/Resources/Prototypes/Entities/Clothing/Neck/ties.yml index bf1772dc81..2e172ae285 100644 --- a/Resources/Prototypes/Entities/Clothing/Neck/ties.yml +++ b/Resources/Prototypes/Entities/Clothing/Neck/ties.yml @@ -1,5 +1,13 @@ - type: entity parent: ClothingNeckBase + id: ClothingNeckTieBase + abstract: true + components: + - type: Item + storedRotation: -45 + +- type: entity + parent: ClothingNeckTieBase id: ClothingNeckTieRed name: red-tie description: A neosilk clip-on red tie. @@ -16,7 +24,7 @@ - Recyclable - type: entity - parent: ClothingNeckBase + parent: ClothingNeckTieBase id: ClothingNeckTieDet name: detective's tie description: A loosely tied necktie, a perfect accessory for the over-worked detective. @@ -27,7 +35,7 @@ sprite: Clothing/Neck/Ties/dettie.rsi - type: entity - parent: ClothingNeckBase + parent: ClothingNeckTieBase id: ClothingNeckTieSci name: scientist's tie description: Why do we all have to wear these ridiculous ties? diff --git a/Resources/Prototypes/Entities/Objects/Devices/Electronics/igniter.yml b/Resources/Prototypes/Entities/Objects/Devices/Electronics/igniter.yml index 87bef747d8..0d8f57edea 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Electronics/igniter.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Electronics/igniter.yml @@ -7,6 +7,8 @@ - type: Sprite sprite: Objects/Devices/igniter.rsi state: icon + - type: Item + storedRotation: -90 - type: IgnitionSource temperature: 800 - type: IgniteOnTrigger diff --git a/Resources/Prototypes/Entities/Objects/Devices/cartridges.yml b/Resources/Prototypes/Entities/Objects/Devices/cartridges.yml index 494bda50d1..93f012ce57 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/cartridges.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/cartridges.yml @@ -1,11 +1,20 @@ - type: entity parent: BaseItem + id: BasePDACartridge + abstract: true + components: + - type: Item + storedRotation: -90 + - type: Sprite + sprite: Objects/Devices/cartridge.rsi + +- type: entity + parent: BasePDACartridge id: NotekeeperCartridge name: notekeeper cartridge description: A program for keeping notes. components: - type: Sprite - sprite: Objects/Devices/cartridge.rsi state: cart-y - type: UIFragment ui: !type:NotekeeperUi @@ -16,15 +25,13 @@ state: book_icon - type: NotekeeperCartridge - - type: entity - parent: BaseItem + parent: BasePDACartridge id: NanoTaskCartridge name: NanoTask cartridge description: A program that allows you to keep a list of tasks to do. components: - type: Sprite - sprite: Objects/Devices/cartridge.rsi state: cart-nav - type: Cartridge programName: nano-task-program-name @@ -36,13 +43,12 @@ - type: NanoTaskCartridge - type: entity - parent: BaseItem + parent: BasePDACartridge id: NewsReaderCartridge name: news cartridge description: A program for reading news. components: - type: Sprite - sprite: Objects/Devices/cartridge.rsi state: cart-y - type: UIFragment ui: !type:NewsReaderUi @@ -54,13 +60,12 @@ - type: NewsReaderCartridge - type: entity - parent: BaseItem + parent: BasePDACartridge id: CrewManifestCartridge name: crew manifest cartridge description: A program for listing your fellow crewmembers. components: - type: Sprite - sprite: Objects/Devices/cartridge.rsi state: cart-y - type: UIFragment ui: !type:CrewManifestUi @@ -72,13 +77,12 @@ - type: CrewManifestCartridge - type: entity - parent: BaseItem + parent: BasePDACartridge id: NetProbeCartridge name: NetProbe cartridge description: A program for getting the address and frequency of network devices. components: - type: Sprite - sprite: Objects/Devices/cartridge.rsi state: cart-y - type: UIFragment ui: !type:NetProbeUi @@ -90,13 +94,12 @@ - type: NetProbeCartridge - type: entity - parent: BaseItem + parent: BasePDACartridge id: LogProbeCartridge name: LogProbe cartridge description: A program for getting access logs from devices. components: - type: Sprite - sprite: Objects/Devices/cartridge.rsi state: cart-log - type: Icon sprite: Objects/Devices/cartridge.rsi @@ -114,13 +117,12 @@ - Forensics - type: entity - parent: BaseItem + parent: BasePDACartridge id: WantedListCartridge name: Wanted list cartridge description: A program to get a list of wanted persons. components: - type: Sprite - sprite: Objects/Devices/cartridge.rsi state: cart-sec - type: Icon sprite: Objects/Devices/cartridge.rsi @@ -137,13 +139,12 @@ stealGroup: WantedListCartridge - type: entity - parent: BaseItem + parent: BasePDACartridge id: MedTekCartridge name: MedTek cartridge description: A program that provides medical diagnostic tools. components: - type: Sprite - sprite: Objects/Devices/cartridge.rsi state: cart-med - type: Icon sprite: Objects/Devices/cartridge.rsi @@ -156,13 +157,12 @@ - type: MedTekCartridge - type: entity - parent: BaseItem + parent: BasePDACartridge id: AstroNavCartridge name: AstroNav cartridge description: A program for navigation that provides GPS coordinates. components: - type: Sprite - sprite: Objects/Devices/cartridge.rsi state: cart-nav - type: Icon sprite: Objects/Devices/cartridge.rsi diff --git a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_misc.yml b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_misc.yml index c6ba706d06..9d63aa0c69 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_misc.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_misc.yml @@ -57,6 +57,7 @@ program: 124 - type: Item size: Small + storedRotation: -90 - type: Prayable sentMessage: prayer-popup-notify-centcom-sent notificationPrefix: prayer-chat-notify-centcom diff --git a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_percussion.yml b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_percussion.yml index e073f40942..adff2cf014 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_percussion.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_percussion.yml @@ -61,6 +61,7 @@ sprite: Objects/Fun/Instruments/microphone.rsi - type: Item size: Small + storedRotation: -45 - type: entity parent: BasePercussionInstrument diff --git a/Resources/Prototypes/Entities/Objects/Misc/brb_sign.yml b/Resources/Prototypes/Entities/Objects/Misc/brb_sign.yml index 845130d332..8e7943ce47 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/brb_sign.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/brb_sign.yml @@ -12,3 +12,5 @@ quickEquip: false slots: - Neck + - type: Item + storedRotation: -90 diff --git a/Resources/Prototypes/Entities/Objects/Misc/improvised_gun_parts.yml b/Resources/Prototypes/Entities/Objects/Misc/improvised_gun_parts.yml index abf4e0974a..12c6e1f4fe 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/improvised_gun_parts.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/improvised_gun_parts.yml @@ -6,8 +6,9 @@ name: modular receiver description: A vital part used in the creation of firearms. #Could use a better description, but I'm not a gun nut so I can't really do that. components: -# - type: Item -# size: Normal + - type: Item + storedRotation: -90 + # size: Normal - type: Sprite sprite: Objects/Misc/modular_receiver.rsi state: icon @@ -22,8 +23,9 @@ name: rifle stock description: A robust wooden stock, used in the creation of firearms. #Same as above components: -# - type: Item -# size: Normal + - type: Item + storedRotation: -90 + # size: Normal - type: Sprite sprite: Objects/Misc/rifle_stock.rsi state: icon diff --git a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml index d152bb908e..e37c1a8816 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml @@ -19,6 +19,7 @@ Slash: 6 - type: Item sprite: Objects/Tools/Hydroponics/hoe.rsi + storedRotation: -135 - type: PhysicalComposition materialComposition: Steel: 100 @@ -97,6 +98,7 @@ Piercing: 2 - type: Item sprite: Objects/Tools/Hydroponics/hatchet.rsi + storedRotation: -135 - type: PhysicalComposition materialComposition: Steel: 100 @@ -123,6 +125,7 @@ collection: MetalThud - type: Item sprite: Objects/Tools/Hydroponics/spade.rsi + storedRotation: -45 - type: Shovel speedModifier: 0.75 # slower at digging than a full-sized shovel - type: PhysicalComposition diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml index a4280f6a50..5aba5b7918 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml @@ -37,6 +37,7 @@ - type: Item size: Large sprite: Objects/Specific/Janitorial/mop.rsi + storedRotation: 45 - type: Absorbent useAbsorberSolution: true - type: SolutionContainerManager @@ -58,7 +59,7 @@ - type: DnaSubstanceTrace - type: entity - parent: BaseItem + parent: MopItem name: advanced mop id: AdvMopItem description: Motorized mop that has a bigger reservoir and quickly replaces reagents inside with water. Automatic Clown Countermeasure not included. @@ -70,37 +71,12 @@ - map: ["enum.SolutionContainerLayers.Fill"] state: fill-2 visible: false - - type: Appearance - type: SolutionContainerVisuals maxFillLevels: 2 - fillBaseName: fill- - inHandsFillBaseName: -fill- - inHandsMaxFillLevels: 2 - - type: MeleeWeapon - damage: - types: - Blunt: 10 - soundHit: - collection: MetalThud - - type: Spillable - solution: absorbed - spillWhenThrown: false - preventMelee: false - - type: DrainableSolution - solution: absorbed - - type: Wieldable - - type: IncreaseDamageOnWield - damage: - types: - Blunt: 5 - type: Item - size: Large sprite: Objects/Specific/Janitorial/advmop.rsi - type: Absorbent pickupAmount: 100 - useAbsorberSolution: true - - type: UseDelay - delay: 1.0 - type: SolutionRegeneration solution: absorbed generated: @@ -112,15 +88,10 @@ preserve: - Water quantity: 10 - - type: SolutionContainerManager - solutions: - absorbed: - maxVol: 100 - type: Tag tags: - Mop - MopAdv - - type: DnaSubstanceTrace - type: entity name: wet floor sign diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml index 0f0d8ae0c2..aedbd3190c 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml @@ -27,6 +27,7 @@ state: ointment - type: Item heldPrefix: ointment + storedRotation: 45 - type: Healing damageContainers: - Biological @@ -295,6 +296,7 @@ state: gauze - type: Item heldPrefix: gauze + storedRotation: -90 - type: Construction graph: Gauze node: gauze diff --git a/Resources/Prototypes/Entities/Objects/Specific/Service/barber.yml b/Resources/Prototypes/Entities/Objects/Specific/Service/barber.yml index f23e0964c1..e3fe3584f8 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Service/barber.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Service/barber.yml @@ -7,6 +7,8 @@ - type: Sprite sprite: Objects/Tools/scissors.rsi state: icon + - type: Item + storedRotation: 135 - type: MagicMirror - type: ActivatableUI key: enum.MagicMirrorUiKey.Key diff --git a/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml b/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml index cb038b3c5a..eb4b881998 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml @@ -94,6 +94,7 @@ - type: Item size: Small sprite: Objects/Tanks/emergency.rsi + storedRotation: -45 - type: GasTank air: volume: 0.66 diff --git a/Resources/Prototypes/Entities/Objects/Tools/glowstick.yml b/Resources/Prototypes/Entities/Objects/Tools/glowstick.yml index e000b99638..986f65badc 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/glowstick.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/glowstick.yml @@ -29,6 +29,7 @@ - type: Item sprite: Objects/Misc/glowstick.rsi heldPrefix: unlit + storedRotation: -45 - type: Appearance - type: PointLight enabled: false diff --git a/Resources/Prototypes/Entities/Objects/Tools/inflatable_wall.yml b/Resources/Prototypes/Entities/Objects/Tools/inflatable_wall.yml index 4f55d5c164..953d191d5e 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/inflatable_wall.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/inflatable_wall.yml @@ -14,6 +14,7 @@ - type: Item sprite: Objects/Misc/inflatable_wall.rsi size: Small + storedRotation: 90 - type: SpawnAfterInteract prototype: InflatableWall doAfter: 1 @@ -41,6 +42,7 @@ - type: Item sprite: Objects/Misc/inflatable_door.rsi size: Small + storedRotation: 90 - type: SpawnAfterInteract prototype: InflatableDoor doAfter: 1 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/pistol.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/pistol.yml index 9320e1627f..f2dffa776b 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/pistol.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/pistol.yml @@ -103,6 +103,8 @@ parent: [ BaseItem, BaseSecurityContraband ] description: Unconventional 30-round top feeding magazine for the WT550 SMG. Intended to hold general-purpose kinetic ammunition. components: + - type: Item + storedRotation: 90 - type: Tag tags: - MagazinePistolSubMachineGunTopMounted From 162a17411febcd048d5ca7bce13a0cfdb5593802 Mon Sep 17 00:00:00 2001 From: April <1866440+April-Gras@users.noreply.github.com> Date: Sat, 15 Nov 2025 06:16:00 +0100 Subject: [PATCH 059/106] chore: made regalrat go the speed he should go (#41420) that's a 5, not the defaulted back 4.5 from `UpdateMovementSpeed` in Content.Shared/Body/Systems/SharedBodySystem.Parts.cs --- Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml index d48ac0dd78..1de449a215 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml @@ -61,7 +61,7 @@ Piercing: 8 - type: Body prototype: Rat - requiredLegs: 1 # TODO: More than 1 leg + requiredLegs: 0 # TODO: Make more than 1 leg, set to 0 to avoid sprint speed being reset by the body system - type: Hunger # probably should be prototyped thresholds: Overfed: 200 @@ -253,7 +253,7 @@ Piercing: 3 - type: Body prototype: Rat - requiredLegs: 1 # TODO: More than 1 leg + requiredLegs: 0 # TODO: Make more than 1 leg, set to 0 to avoid sprint speed being reset by the body system - type: Hunger # probably should be prototyped thresholds: Overfed: 200 From 50d4f17a1082694a92a460e794b41ce557e1aaa0 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 15 Nov 2025 05:29:00 +0000 Subject: [PATCH 060/106] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 4f0b516ac1..58c0ad97b4 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: qrwas - changes: - - message: Loadout item group UI improvements - type: Tweak - id: 8703 - time: '2025-06-21T22:20:34.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38488 - author: perryprog changes: - message: Wet mops no longer have zero melee damage. @@ -3925,3 +3918,10 @@ id: 9204 time: '2025-11-14T22:34:24.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/39796 +- author: April-Gras + changes: + - message: Rat king now goes 0.5 faster when sprinting + type: Tweak + id: 9205 + time: '2025-11-15T05:27:52.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41420 From 400905725cbe7d0219e83be170edd176aa8674a3 Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Sat, 15 Nov 2025 12:43:20 +0100 Subject: [PATCH 061/106] yaml cleanups (id, hypopen, inflatable wall) (#41432) * cleanups * yes i can --- .../Entities/Objects/Misc/identification_cards.yml | 12 +----------- .../Entities/Objects/Specific/Medical/hypospray.yml | 2 -- .../Misc => Structures/Walls}/inflatable_wall.yml | 0 3 files changed, 1 insertion(+), 13 deletions(-) rename Resources/Prototypes/Entities/{Objects/Misc => Structures/Walls}/inflatable_wall.yml (100%) diff --git a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml index b4c403c213..2ecf7be55d 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml @@ -923,23 +923,14 @@ #Antags - type: entity - name: passenger ID card - parent: [IDCardStandard, BaseChameleon] + parent: [PassengerIDCard, BaseChameleon] id: AgentIDCard suffix: Agent components: - - type: PresetIdCard - job: Passenger - type: Access tags: - Maintenance - SyndicateAgent - - type: Sprite - layers: - - state: default - - sprite: *icon-rsi - offset: *icon-offset - state: Passenger - type: AgentIDCard - type: UIRequiresLock - type: ActivatableUI @@ -960,7 +951,6 @@ type: ChameleonBoundUserInterface - type: entity - name: passenger ID card parent: AgentIDCard id: NukieAgentIDCard suffix: Nukie diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/hypospray.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/hypospray.yml index 17909d6769..7137cbaa64 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/hypospray.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/hypospray.yml @@ -649,10 +649,8 @@ price: 1500 - type: entity - name: pen suffix: Hypopen parent: Pen # It is just like normal pen, isn't it? - description: A dark ink pen. id: Hypopen components: - type: SolutionContainerManager diff --git a/Resources/Prototypes/Entities/Objects/Misc/inflatable_wall.yml b/Resources/Prototypes/Entities/Structures/Walls/inflatable_wall.yml similarity index 100% rename from Resources/Prototypes/Entities/Objects/Misc/inflatable_wall.yml rename to Resources/Prototypes/Entities/Structures/Walls/inflatable_wall.yml From fd2f5f7e450ef6de26411acf6f33404da157adca Mon Sep 17 00:00:00 2001 From: Connor Huffine Date: Sat, 15 Nov 2025 12:43:46 -0500 Subject: [PATCH 062/106] Fix typo in roundstartvariation (#41444) Fix typo --- Resources/Prototypes/GameRules/roundstart.yml | 2 +- Resources/Prototypes/GameRules/variation.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/GameRules/roundstart.yml b/Resources/Prototypes/GameRules/roundstart.yml index ad41899bef..6b3e3e841a 100644 --- a/Resources/Prototypes/GameRules/roundstart.yml +++ b/Resources/Prototypes/GameRules/roundstart.yml @@ -532,7 +532,7 @@ - id: SolarPanelEmptyVariationPass - id: BasicDecalDirtVariationPass - id: BasicDecalGraffitiVariationPass - - id: BasicDecalBrunsVariationPass + - id: BasicDecalBurnsVariationPass prob: 0.50 orGroup: monospaceDecals - id: BasicDecalDirtMonospaceVariationPass diff --git a/Resources/Prototypes/GameRules/variation.yml b/Resources/Prototypes/GameRules/variation.yml index 718e5111a7..5e2fe0576b 100644 --- a/Resources/Prototypes/GameRules/variation.yml +++ b/Resources/Prototypes/GameRules/variation.yml @@ -68,7 +68,7 @@ - id: DecalSpawnerGraffiti - type: entity - id: BasicDecalBrunsVariationPass + id: BasicDecalBurnsVariationPass parent: BaseVariationPass components: - type: EntitySpawnVariationPass From 5674b9a3639fb19dbabd4277e4bf917a76f4e332 Mon Sep 17 00:00:00 2001 From: Fildrance Date: Sun, 16 Nov 2025 02:07:14 +0300 Subject: [PATCH 063/106] Minor Knock spell refactor + fix its obstruction check (#41447) * refactor: remove isFirstTimepredicted for knock XAE * refactor: cleanups * refactor: do not count laser obstructions toward stuff that blocks Knock spell, project spell from artifact and not node * refactor: no method-events for knock-spells --------- Co-authored-by: pa.pecherskij --- Content.Shared/Magic/SharedMagicSystem.cs | 22 ++++++++++++++----- .../Artifact/XAE/XAEKnockSystem.cs | 16 +++----------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Content.Shared/Magic/SharedMagicSystem.cs b/Content.Shared/Magic/SharedMagicSystem.cs index 6afba65a39..3301180e8a 100644 --- a/Content.Shared/Magic/SharedMagicSystem.cs +++ b/Content.Shared/Magic/SharedMagicSystem.cs @@ -6,6 +6,7 @@ using Content.Shared.Charges.Systems; using Content.Shared.Coordinates.Helpers; using Content.Shared.Doors.Components; using Content.Shared.Doors.Systems; +using Content.Shared.Examine; using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; using Content.Shared.Interaction; @@ -66,6 +67,7 @@ public abstract class SharedMagicSystem : EntitySystem [Dependency] private readonly SharedStunSystem _stun = default!; [Dependency] private readonly TurfSystem _turf = default!; [Dependency] private readonly SharedChargesSystem _charges = default!; + [Dependency] private readonly ExamineSystemShared _examine= default!; private static readonly ProtoId InvalidForGlobalSpawnSpellTag = "InvalidForGlobalSpawnSpell"; @@ -399,22 +401,30 @@ public abstract class SharedMagicSystem : EntitySystem #endregion #region Knock Spells ///

- /// Opens all doors and locks within range + /// Opens all doors and locks within range. /// - /// private void OnKnockSpell(KnockSpellEvent args) { if (args.Handled || !PassesSpellPrerequisites(args.Action, args.Performer)) return; args.Handled = true; + Knock(args.Performer, args.Range); + } - var transform = Transform(args.Performer); + /// + /// Opens all doors and locks within range. + /// + /// Performer of spell. + /// Radius around in which all doors and locks should be opened. + public void Knock(EntityUid performer, float range) + { + var transform = Transform(performer); // Look for doors and lockers, and don't open/unlock them if they're already opened/unlocked. - foreach (var target in _lookup.GetEntitiesInRange(_transform.GetMapCoordinates(args.Performer, transform), args.Range, flags: LookupFlags.Dynamic | LookupFlags.Static)) + foreach (var target in _lookup.GetEntitiesInRange(_transform.GetMapCoordinates(performer, transform), range, flags: LookupFlags.Dynamic | LookupFlags.Static)) { - if (!_interaction.InRangeUnobstructed(args.Performer, target, range: 0, collisionMask: CollisionGroup.Opaque)) + if (!_examine.InRangeUnOccluded(performer, target, range: 0)) continue; if (TryComp(target, out var doorBoltComp) && doorBoltComp.BoltsDown) @@ -424,7 +434,7 @@ public abstract class SharedMagicSystem : EntitySystem _door.StartOpening(target); if (TryComp(target, out var lockComp) && lockComp.Locked) - _lock.Unlock(target, args.Performer, lockComp); + _lock.Unlock(target, performer, lockComp); } } // End Knock Spells diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAE/XAEKnockSystem.cs b/Content.Shared/Xenoarchaeology/Artifact/XAE/XAEKnockSystem.cs index 9cc9efe51b..716ef6c660 100644 --- a/Content.Shared/Xenoarchaeology/Artifact/XAE/XAEKnockSystem.cs +++ b/Content.Shared/Xenoarchaeology/Artifact/XAE/XAEKnockSystem.cs @@ -1,6 +1,5 @@ -using Content.Shared.Magic.Events; +using Content.Shared.Magic; using Content.Shared.Xenoarchaeology.Artifact.XAE.Components; -using Robust.Shared.Timing; namespace Content.Shared.Xenoarchaeology.Artifact.XAE; @@ -9,19 +8,10 @@ namespace Content.Shared.Xenoarchaeology.Artifact.XAE; ///
public sealed class XAEKnockSystem : BaseXAESystem { - [Dependency] private readonly IGameTiming _timing = default!; - + [Dependency] private readonly SharedMagicSystem _magic = default!; /// protected override void OnActivated(Entity ent, ref XenoArtifactNodeActivatedEvent args) { - if (!_timing.IsFirstTimePredicted) - return; - - var ev = new KnockSpellEvent - { - Performer = ent.Owner, - Range = ent.Comp.KnockRange - }; - RaiseLocalEvent(ev); + _magic.Knock(args.Artifact, ent.Comp.KnockRange); } } From 409ef028711488489d53be0698df6eea88def3f4 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 15 Nov 2025 23:20:09 +0000 Subject: [PATCH 064/106] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 58c0ad97b4..4dcb0fcd97 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: perryprog - changes: - - message: Wet mops no longer have zero melee damage. - type: Fix - id: 8704 - time: '2025-06-21T22:23:39.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38486 - author: Cojoke-dot changes: - message: Pacifists can now use the Staff of Healing @@ -3925,3 +3918,11 @@ id: 9205 time: '2025-11-15T05:27:52.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41420 +- author: Fildrance + changes: + - message: KNOCK spell and 'Mild electromagnetic interference' xeno artifact effects + now will be blocked only by obstructed line of sight (range is still applied) + type: Tweak + id: 9206 + time: '2025-11-15T23:18:58.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41447 From cee38b7bfef9f2c1c2c52063b7ccdd9b15b251c1 Mon Sep 17 00:00:00 2001 From: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Date: Sun, 16 Nov 2025 00:18:11 +0100 Subject: [PATCH 065/106] Remove Aghosts from "Warp to Most Followed" (#41448) * init * review --- Content.Server/Ghost/GhostSystem.cs | 3 ++- Content.Shared/Follower/FollowerSystem.cs | 9 ++++++++- .../Prototypes/Entities/Mobs/Player/admin_ghost.yml | 1 + Resources/Prototypes/tags.yml | 5 ++++- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/Content.Server/Ghost/GhostSystem.cs b/Content.Server/Ghost/GhostSystem.cs index af1a433d1a..3486e2024b 100644 --- a/Content.Server/Ghost/GhostSystem.cs +++ b/Content.Server/Ghost/GhostSystem.cs @@ -333,7 +333,8 @@ namespace Content.Server.Ghost if (_followerSystem.GetMostGhostFollowed() is not {} target) return; - WarpTo(uid, target); + // If there is a ghostnado happening you almost definitely wanna join it, so we automatically follow instead of just warping. + _followerSystem.StartFollowingEntity(uid, target); } private void WarpTo(EntityUid uid, EntityUid target) diff --git a/Content.Shared/Follower/FollowerSystem.cs b/Content.Shared/Follower/FollowerSystem.cs index 07639a1790..8357b0106f 100644 --- a/Content.Shared/Follower/FollowerSystem.cs +++ b/Content.Shared/Follower/FollowerSystem.cs @@ -35,6 +35,7 @@ public sealed class FollowerSystem : EntitySystem [Dependency] private readonly ISharedAdminManager _adminManager = default!; private static readonly ProtoId ForceableFollowTag = "ForceableFollow"; + private static readonly ProtoId PreventGhostnadoWarpTag = "NotGhostnadoWarpable"; public override void Initialize() { @@ -320,11 +321,17 @@ public sealed class FollowerSystem : EntitySystem var query = EntityQueryEnumerator(); while (query.MoveNext(out _, out var follower, out _, out var actor)) { - // Exclude admins + // Don't count admin followers so that players cannot notice if admins are in stealth mode and following someone. if (_adminManager.IsAdmin(actor.PlayerSession)) continue; var followed = follower.Following; + + // If the followed entity cannot be ghostnado'd to, we don't count it. + // Used for making admins not warpable to, but IsAdmin isn't used for cases where the admin wants to be followed, for example during events. + if (_tagSystem.HasTag(followed, PreventGhostnadoWarpTag)) + continue; + // Add new entry or increment existing followedEnts.TryGetValue(followed, out var currentValue); followedEnts[followed] = currentValue + 1; diff --git a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml index 7c1bb7ef16..e5fdfe7336 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml @@ -16,6 +16,7 @@ - SilentStorageUser - PreventAccessLogging - AllowBiomeLoading + - NotGhostnadoWarpable - type: Input context: "aghost" - type: Ghost diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 3b3d11e612..44b636495c 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -973,7 +973,7 @@ - type: Tag id: Mouse # CargoBounty: BountyMouse - + - type: Tag id: Multitool # Storage whitelist: BaseClothingBeltEngineering. ItemMapper: BaseClothingBeltEngineering. ConstructionGraph: LogicGate @@ -987,6 +987,9 @@ - type: Tag id: NoConsoleSound # Blacklist on BaseComputer, StationMap. Tagged entity will not make sound when opening the UI. +- type: Tag + id: NotGhostnadoWarpable # Prevents the entity from being selected via "Warp to most followed" ghost warp + - type: Tag id: NozzleBackTank # Used by WeaponSprayNozzle to find a tagged entity for supplying ammo. From 3e0ab613cacaafdb64163976c7c6a911ae6cb3bd Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 15 Nov 2025 23:32:37 +0000 Subject: [PATCH 066/106] Automatic changelog update --- Resources/Changelog/Admin.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Resources/Changelog/Admin.yml b/Resources/Changelog/Admin.yml index a342132f68..59827600ec 100644 --- a/Resources/Changelog/Admin.yml +++ b/Resources/Changelog/Admin.yml @@ -1513,5 +1513,14 @@ Entries: id: 184 time: '2025-11-12T23:22:27.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41348 +- author: ScarKy0 + changes: + - message: Admin ghosts can no longer be selected for "Warp To Most Followed". Remove + the NotGhostnadoWarpable tag from your aghost entity if you wish to still be + able to be selected. + type: Fix + id: 185 + time: '2025-11-15T23:31:28.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41448 Name: Admin Order: 3 From 6c78ff5ab9aeccb5f7d9271e291634e916cbf732 Mon Sep 17 00:00:00 2001 From: Princess Cheeseballs <66055347+Princess-Cheeseballs@users.noreply.github.com> Date: Sat, 15 Nov 2025 16:51:26 -0800 Subject: [PATCH 067/106] Fix Gas Reagent Thresholds. (#41438) * Fix reagent gas scales * add comment --------- Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com> --- Resources/Prototypes/Reagents/gases.yml | 33 ++++++++++++++----------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/Resources/Prototypes/Reagents/gases.yml b/Resources/Prototypes/Reagents/gases.yml index b7e82d0960..140ca47938 100644 --- a/Resources/Prototypes/Reagents/gases.yml +++ b/Resources/Prototypes/Reagents/gases.yml @@ -1,3 +1,6 @@ +# TODO: Reagent Args which allow more selective scaling. +# Currently all Gas metabolisms scale by reagent quantity metabolized, where other Metabolisms are modified by metabolism rate! + - type: reagent id: Oxygen name: reagent-name-oxygen @@ -64,7 +67,7 @@ Poison: 0.7 - !type:AdjustAlert alertType: Toxins - minScale: 1 + minScale: 0.5 conditions: - !type:MetabolizerTypeCondition type: [ Vox ] @@ -105,7 +108,7 @@ # We need a metabolism effect on reagent removal - !type:AdjustAlert alertType: Toxins - minScale: 3 + minScale: 1.5 clear: True time: 5 reactiveEffects: @@ -150,7 +153,7 @@ # We need a metabolism effect on reagent removal - !type:AdjustAlert alertType: Toxins - minScale: 3 + minScale: 1.5 clear: True time: 5 @@ -191,7 +194,7 @@ - !type:MetabolizerTypeCondition type: [ Plant ] - !type:HealthChange - minScale: 1 + minScale: 0.5 conditions: - !type:MetabolizerTypeCondition type: [ Plant, Vox ] @@ -270,7 +273,7 @@ Gas: effects: - !type:Emote - minScale: 1 + minScale: 0.2 conditions: - !type:MetabolizerTypeCondition type: [ Slime ] @@ -279,7 +282,7 @@ showInChat: true probability: 0.1 - !type:Emote - minScale: 0.4 + minScale: 0.2 conditions: - !type:MetabolizerTypeCondition type: [ Slime ] @@ -288,7 +291,7 @@ showInChat: true probability: 0.01 - !type:PopupMessage - minScale: 1 + minScale: 0.5 conditions: - !type:MetabolizerTypeCondition type: [ Slime ] @@ -298,7 +301,7 @@ messages: [ "effect-sleepy" ] probability: 0.1 - !type:MovementSpeedModifier - minScale: 2 + minScale: 1 conditions: - !type:MetabolizerTypeCondition type: [ Slime ] @@ -306,7 +309,7 @@ walkSpeedModifier: 0.65 sprintSpeedModifier: 0.65 - !type:ModifyStatusEffect - minScale: 3.6 + minScale: 1.8 conditions: - !type:MetabolizerTypeCondition type: [ Slime ] @@ -315,7 +318,7 @@ time: 3 type: Update - !type:HealthChange - minScale: 7 + minScale: 3.5 conditions: - !type:MetabolizerTypeCondition type: [ Slime ] @@ -367,27 +370,27 @@ Gas: effects: - !type:HealthChange - minScale: 1 + minScale: 0.5 ignoreResistances: true damage: types: Cellular: 0.05 - !type:ModifyStatusEffect - minScale: 2 + minScale: 1 effectProto: StatusEffectSeeingRainbow type: Add time: 500 - !type:Drunk boozePower: 500 - minScale: 2 + minScale: 1 - !type:PopupMessage type: Local messages: [ "frezon-lungs-cold" ] probability: 0.1 - minScale: 2 + minScale: 1 - !type:PopupMessage type: Local visualType: Medium messages: [ "frezon-euphoric" ] probability: 0.1 - minScale: 2 + minScale: 1 From 18211e8b6e39e3c1361016d7bc3281de50093603 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 16 Nov 2025 01:04:25 +0000 Subject: [PATCH 068/106] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 4dcb0fcd97..bdc3196293 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Cojoke-dot - changes: - - message: Pacifists can now use the Staff of Healing - type: Tweak - id: 8706 - time: '2025-06-22T19:38:22.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38509 - author: slarticodefast changes: - message: The interrogator lamp and flash lantern now properly flash when toggled @@ -3926,3 +3919,10 @@ id: 9206 time: '2025-11-15T23:18:58.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41447 +- author: Princess-Cheeseballs + changes: + - message: No2 should put you to sleep again without needing double the gas. + type: Fix + id: 9207 + time: '2025-11-16T01:03:18.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41438 From 0141993d1d14cc45a8cb5833224978ea96fe6715 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 16 Nov 2025 02:26:42 +0100 Subject: [PATCH 069/106] Update Credits (#41449) Co-authored-by: PJBot --- Resources/Credits/GitHub.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Credits/GitHub.txt b/Resources/Credits/GitHub.txt index cc80b51d26..902b0964d3 100644 --- a/Resources/Credits/GitHub.txt +++ b/Resources/Credits/GitHub.txt @@ -1 +1 @@ -0leshe, 0tito, 0x6273, 12rabbits, 1337dakota, 13spacemen, 154942, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 27alaing, 2DSiggy, 3nderall, 4310v343k, 4dplanner, 5tickman, 612git, 778b, 96flo, aaron, abadaba695, Ablankmann, abregado, Absolute-Potato, Absotively, achookh, Acruid, ActiveMammmoth, actually-reb, ada-please, adamsong, Adeinitas, adm2play, Admiral-Obvious-001, adrian, Adrian16199, Ady4ik, Aearo-Deepwater, Aerocrux, Aeshus, Aexolott, Aexxie, africalimedrop, afrokada, AftrLite, AgentSmithRadio, Agoichi, Ahion, aiden, Aidenkrz, Aisu9, ajcm, AJCM-git, AjexRose, Alekshhh, alexalexmax, alexkar598, AlexMorgan3817, alexum418, alexumandxgabriel08x, Alice4267, Alithsko, Alkheemist, alliephante, ALMv1, Alpaccalypse, Alpha-Two, AlphaQwerty, Altoids1, amatwiedle, amylizzle, ancientpower, Andre19926, Andrew-Fall, AndrewEyeke, AndrewFenriz, AndreyCamper, anri, Anzarot121, ApolloVector, Appiah, ar4ill, Arcane-Waffle, archee1, ArchPigeon, ArchRBX, areitpog, Arendian, areyouconfused, arimah, Arkanic, ArkiveDev, armoks, Arteben, ArthurMousatov, ArtisticRoomba, artur, Artxmisery, ArZarLordOfMango, as334, AsikKEsel, AsnDen, asperger-sind, aspiringLich, astriloqua, Atakku, august-sun, AutoOtter, AverageNotDoingAnythingEnjoyer, avghdev, AwareFoxy, Awlod, AzzyIsNotHere, azzyisnothere, B-Kirill, B3CKDOOR, baa14453, BackeTako, BadaBoomie, Bakke, BananaFlambe, Baptr0b0t, BarryNorfolk, BasedUser, beck-thompson, beesterman, bellwetherlogic, ben, benbryant0, benev0, benjamin-burges, BGare, bhespiritu, bibbly, BigfootBravo, BIGZi0348, bingojohnson, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, blitzthesquishy, Blobadoodle, bloodrizer, Bloody2372, blueDev2, Boaz1111, BobdaBiscuit, BobTheSleder, boiled-water-tsar, Bokser815, bolantej, Booblesnoot42, Boolean-Buckeye, botanySupremist, brainfood1183, BramvanZijp, Brandon-Huu, breeplayx3, BriBrooo, Bright0, BRINGit34, brndd, bryce0110, BubblegumBlue, buletsponge, buntobaggins, bvelliquette, BWTCK, byondfuckery, c0rigin, c4llv07e, CaasGit, Caconym27, Calecute, Callmore, Camdot, capnsockless, CaptainMaru, captainsqrbeard, Carbonhell, Carolyn3114, Carou02, carteblanche4me, catdotjs, catlord, Catofquestionableethics, CatTheSystem, CawsForConcern, Centronias, Chaboricks, chairbender, Chaoticaa, Charlese2, charlie, chartman, ChaseFlorom, chavonadelal, Cheackraze, CheddaCheez, cheesePizza2, CheesePlated, Chief-Engineer, chillyconmor, christhirtle, chromiumboy, Chronophylos, Chubbicous, Chubbygummibear, Ciac32, ciaran, citrea, civilCornball, claustro305, Clement-O, cloudyias, clyf, Clyybber, CMDR-Piboy314, cnv41, coco, cohanna, Cohnway, Cojoke-dot, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, Compilatron144, CookieMasterT, coolboy911, CoolioDudio, coolmankid12345, Coolsurf6, cooperwallace, corentt, CormosLemming, CrafterKolyan, CraftyRenter, crazybrain23, Crazydave91920, creadth, CrigCrag, CroilBird, Crotalus, CrudeWax, cryals, CrzyPotato, cubixthree, cutemoongod, Cyberboss, d34d10cc, DadeKuma, Daemon, daerSeebaer, dahnte, dakamakat, DamianX, dan, dangerrevolution, daniel-cr, DanSAussieITS, Daracke, Darkenson, david, DawBla, Daxxi3, dch-GH, ddeegan, de0rix, Deahaka, dean, DEATHB4DEFEAT, Deatherd, deathride58, DebugOk, Decappi, Decortex, Deeeeja, deepdarkdepths, DeepwaterCreations, Deerstop, degradka, Delete69, deltanedas, DenisShvalov, DerbyX, derek, dersheppard, Deserty0, Detintinto, DevilishMilk, devinschubert14, dexlerxd, dffdff2423, DieselMohawk, DieselMohawkTheSequel, digitalic, Dimastra, DinnerCalzone, DinoWattz, Disp-Dev, DisposableCrewmember42, dissidentbullet, DjfjdfofdjfjD, doc-michael, docnite, Doctor-Cpu, DogZeroX, dolgovmi, dontbetank, Doomsdrayk, Doru991, DoubleRiceEddiedd, DoutorWhite, DR-DOCTOR-EVIL-EVIL, Dragonjspider, dragonryan06, drakewill-CRL, Drayff, dreamlyjack, DrEnzyme, dribblydrone, DrMelon, drongood12, DrSingh, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, DuckManZach, Duddino, dukevanity, duskyjay, Dutch-VanDerLinde, dvir001, dylanstrategie, dylanwhittingham, Dynexust, Easypoller, echo, eclips_e, eden077, EEASAS, Efruit, efzapa, Ekkosangen, ElectroSR, elsie, elthundercloud, Elysium206, emberwinters, Emisse, emmafornash, EmoGarbage404, Endecc, EnrichedCaramel, Entvari, eoineoineoin, ephememory, eris, erohrs2, ERORR404V1, Errant-4, ertanic, esguard, estacaoespacialpirata, eugene, ewokswagger, exincore, exp111, f0x-n3rd, F1restar4, FacePluslll, Fahasor, FairlySadPanda, farrellka-dev, FATFSAAM2, Feluk6174, ficcialfaint, Fiftyllama, Fildrance, FillerVK, FinnishPaladin, firenamefn, Firewars763, FirinMaLazors, Fishfish458, fl-oz, Flareguy, flashgnash, FlipBrooke, FluffiestFloof, FluffMe, FluidRock, flymo5678, foboscheshir, FoLoKe, fooberticus, ForestNoises, forgotmyotheraccount, forkeyboards, forthbridge, Fortune117, foxhorn, freeman2651, freeze2222, frobnic8, Froffy025, Fromoriss, froozigiusz, FrostMando, FrostRibbon, Funce, FungiFellow, FunkySphere, FunTust, Futuristic-OK, GalacticChimp, gamer3107, Gamewar360, gansulalan, GaussiArson, Gaxeer, gbasood, gcoremans, Geekyhobo, genderGeometries, GeneralGaws, Genkail, Gentleman-Bird, geraeumig, Ghagliiarghii, Git-Nivrak, githubuser508, GitHubUser53123, gituhabu, GlassEclipse, GnarpGnarp, GNF54, godisdeadLOL, goet, GoldenCan, Goldminermac, Golinth, golubgik, GoodWheatley, Gorox221, GR1231, gradientvera, graevy, GraniteSidewalk, GreaseMonk, greenrock64, GreyMario, GrownSamoyedDog, GTRsound, gusxyz, Gyrandola, h3half, hamurlik, Hanzdegloker, HappyRoach, Hardly3D, harikattar, Hayden, he1acdvv, Hebi, Helix-ctrl, helm4142, Henry, HerCoyote23, Hi-Im-Shot, HighTechPuddle, Hitlinemoss, hiucko, hivehum, Hmeister-fake, Hmeister-real, Hobbitmax, hobnob, HoidC, Holinka4ever, holyssss, HoofedEar, Hoolny, hord-brayden, hoshizora-sayo, Hreno, Hrosts, htmlsystem, Huaqas, hubismal, Hugal31, Hyenh, hyperb1, hyperDelegate, hyphenationc, i-justuser-i, iaada, iacore, IamVelcroboy, Ian321, icekot8, icesickleone, iczero, iglov, IgorAnt028, igorsaux, ike709, illersaver, Illiux, Ilushkins33, Ilya246, IlyaElDunaev, imatsoup, IMCB, impubbi, imrenq, imweax, indeano, Injazz, Insineer, insoPL, IntegerTempest, Interrobang01, Intoxicating-Innocence, IProduceWidgets, itsmethom, Itzbenz, iztokbajcar, Jackal298, Jackrost, JackRyd3r, jacksonzck, Jacktastic09, Jackw2As, jacob, jamessimo, janekvap, Jark255, Jarmer123, Jaskanbe, JasperJRoth, jbox144, JCGWE30, jerryimmouse, JerryImMouse, Jessetriesagain, jessicamaybe, JesterX666, Jezithyr, jicksaw, JiimBob, JimGamemaster, jimmy12or, JIPDawg, jjtParadox, jkwookee, jmcb, JohnGinnane, johnku1, Jophire, Jopogrechkin, joshepvodka, JpegOfAFrog, jproads, JrInventor05, Jrpl, jukereise, juliangiebel, JustArt1m, JustCone14, justdie12, justin, justintether, JustinTrotter, JustinWinningham, justtne, K-Dynamic, k3yw, Kadeo64, Kaga-404, kaiserbirch, KaiShibaa, kalane15, kalanosh, KamTheSythe, Kanashi-Panda, katzenminer, kbailey-git, Keelin, Keer-Sar, KEEYNy, keikiru, Kelrak, kerisargit, keronshb, KIBORG04, KieueCaprie, Kimpes, KingFroozy, kira-er, kiri-yoshikage, Kirillcas, Kirus59, Kistras, Kit, Kit0vras, KittenColony, Kittygyat, klaypexx, Kmc2000, Ko4ergaPunk, kognise, kokoc9n, komunre, KonstantinAngelov, kontakt, kosticia, koteq, kotobdev, Kowlin, KrasnoshchekovPavel, Krosus777, Krunklehorn, Kryyto, Kupie, kxvvv, Kyoth25f, kyupolaris, kzhanik, LaCumbiaDelCoronavirus, lajolico, Lamrr, lanedon, LankLTE, laok233, lapatison, larryrussian, lawdog4817, Lazzi0706, leah, leander-0, leonardo-dabepis, leonidussaks, leonsfriedrich, LeoSantich, lettern, LetterN, Level10Cybermancer, LEVELcat, lever1209, LevitatingTree, Lgibb18, lgruthes, LightVillet, lilazero, liltenhead, linkbro1, linkuyx, Litraxx, little-meow-meow, LittleBuilderJane, LittleNorthStar, LittleNyanCat, lizelive, ljm862, lmsnoise, localcc, lokachop, lolman360, Lomcastar, Lordbrandon12, LordCarve, LordEclipse, lucas, LucasTheDrgn, luckyshotpictures, LudwigVonChesterfield, luegamer, luizwritescode, LukaSlade, Lukasz825700516, luminight, lunarcomets, Lusatia, Luxeator, lvvova1, Lyndomen, lyroth001, lzimann, M1tht1c, M3739, M4rchy-S, M87S, mac6na6na, MACMAN2003, Macoron, magicalus, magmodius, magnuscrowe, maland1, malchanceux, MaloTV, manelnavola, ManelNavola, Mangohydra, marboww, Markek1, MarkerWicker, marlyn, matt, Matz05, max, MaxNox7, maylokana, MDuch369, meganerobot, MehimoNemo, Mehnix, MeltedPixel, memeproof, MendaxxDev, Menshin, Mephisto72, MerrytheManokit, Mervill, metalgearsloth, MetalSage, MFMessage, mhamsterr, michaelcu, micheel665, mifia, MilenVolf, MilonPL, Minemoder5000, Minty642, minus1over12, Mirino97, mirrorcult, misandrie, MishaUnity, MissKay1994, MisterImp, MisterMecky, Mith-randalf, Mixelz, mjarduk, MjrLandWhale, mkanke-real, MLGTASTICa, mnva0, moderatelyaware, modern-nm, mokiros, momo, Moneyl, monotheonist, Moomoobeef, moony, Morb0, MossyGreySlope, mqole, mr-bo-jangles, Mr0maks, MrFippik, mrrobdemo, mtrs163, muburu, MureixloI, murolem, murphyneko, musicmanvr, MWKane, Myakot, Myctai, N3X15, nabegator, nails-n-tape, Nairodian, Naive817, NakataRin, namespace-Memory, Nannek, NazrinNya, neutrino-laser, NickPowers43, nikitosych, nikthechampiongr, Nimfar11, ninruB, Nirnael, NIXC, nkokic, NkoKirkto, nmajask, noctyrnal, noelkathegod, noirogen, nok-ko, NonchalantNoob, NoobyLegion, Nopey, NoreUhh, not-gavnaed, notafet, notquitehadouken, notsodana, noudoit, noverd, Nox38, NuclearWinter, nukashimika, nuke-haus, NULL882, nullarmo, nyeogmi, Nylux, Nyranu, Nyxilath, och-och, OctoRocket, OldDanceJacket, OliverOtter, onesch, OneZerooo0, OnsenCapy, OnyxTheBrave, opl-, Orange-Winds, OrangeMoronage9622, OrbitSystem07, Orsoniks, osjarw, Ostaf, othymer, OttoMaticode, Owai-Seek, packmore, paige404, paigemaeforrest, pali6, Palladinium, Pangogie, panzer-iv1, partyaddict, patrikturi, PaulRitter, pavlockblaine03, peccneck, Peptide90, peptron1, perryprog, PeterFuto, PetMudstone, pewter-wiz, pgraycs, PGrayCS, Pgriha, phantom-lily, pheenty, philingham, Phill101, Phooooooooooooooooooooooooooooooosphate, phunnyguy, PicklOH, PilgrimViis, Pill-U, pinkbat5, Piras314, Pireax, Pissachu, pissdemon, Pixel8-dev, PixeltheAertistContrib, PixelTheKermit, PJB3005, Plasmaguy, plinyvic, Plykiya, poeMota, pofitlo, pointer-to-null, pok27, Pok27, poklj, PolterTzi, PoorMansDreams, PopGamer45, portfiend, potato1234x, PotentiallyTom, PotRoastPiggy, Princess-Cheeseballs, ProfanedBane, PROG-MohamedDwidar, Prole0, ProPandaBear, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykana, psykzz, PuceTint, pumkin69, PuroSlavKing, PursuitInAshes, Putnam3145, py01, Pyrovi, qrtDaniil, qrwas, Quantum-cross, quasr-9, quatre, QueerNB, QuietlyWhisper, qwerltaz, Radezolid, RadioMull, Radosvik, Radrark, Rainbeon, Rainfey, Raitononai, Ramlik, RamZ, randy10122, Rane, Ranger6012, Rapidgame7, ravage123321, rbertoche, RedBookcase, Redfire1331, Redict, RedlineTriad, redmushie, RednoWCirabrab, ReeZer2, RemberBM, RemieRichards, RemTim, rene-descartes2021, Renlou, retequizzle, rhailrake, rhsvenson, rich-dunne, RieBi, riggleprime, RIKELOLDABOSS, rinary1, Rinkashikachi, riolume, rlebell33, RobbyTheFish, robinthedragon, Rockdtben, Rohesie, rok-povsic, rokudara-sen, rolfero, RomanNovo, rosieposieeee, Roudenn, router, ruddygreat, rumaks, RumiTiger, Ruzihm, S1rFl0, S1ss3l, Saakra, Sadie-silly, saga3152, saintmuntzer, Salex08, sam, samgithubaccount, Samuka-C, SaphireLattice, SapphicOverload, sarahon, sativaleanne, SaveliyM360, sBasalto, ScalyChimp, ScarKy0, ScholarNZL, schrodinger71, scrato, Scribbles0, scrivoy, scruq445, scuffedjays, ScumbagDog, SeamLesss, Segonist, semensponge, sephtasm, ser1-1y, Serkket, sewerpig, SG6732, sh18rw, Shaddap1, ShadeAware, ShadowCommander, shadowtheprotogen546, shaeone, shampunj, shariathotpatrol, SharkSnake98, shibechef, Siginanto, signalsender, SignalWalker, siigiil, silicon14wastaken, Silverfur-underscore, Simyon264, sirdragooon, Sirionaut, SirWarock, Sk1tch, SkaldetSkaeg, Skarletto, Skybailey-dev, skye, Skyedra, SlamBamActionman, slarticodefast, Slava0135, sleepyyapril, slimmslamm, Slyfox333, Smugman, SnappingOpossum, snebl, snicket, sniperchance, Snowni, snowsignal, SolidSyn, SolidusSnek, solstar2, SonicHDC, SoulFN, SoulSloth, Soundwavesghost, soupkilove, southbridge-fur, sowelipililimute, Soydium, SpaceLizard24, SpaceLizardSky, SpaceManiac, SpaceRox1244, SpaceyLady, Spangs04, spanky-spanky, Sparlight, spartak, SpartanKadence, spderman3333, SpeltIncorrectyl, Spessmann, SphiraI, SplinterGP, spoogemonster, sporekto, sporkyz, ssdaniel24, stalengd, stanberytrask, Stanislav4ix, StanTheCarpenter, starbuckss14, Stealthbomber16, Steffo99, stellar-novas, stewie523, stomf, Stop-Signs, stopbreaking, stopka-html, StrawberryMoses, Stray-Pyramid, strO0pwafel, Strol20, StStevens, Subversionary, sunbear-dev, SuperGDPWYL, superjj18, Supernorn, SurrealShibe, SweetAplle, SweptWasTaken, SyaoranFox, Sybil, SYNCHRONIC, Szunti, t, Tainakov, takemysoult, taonewt, tap, TaralGit, Taran, taurie, Tayrtahn, tday93, teamaki, TeenSarlacc, TekuNut, telavivgamers, telyonok, temm1ie, TemporalOroboros, tentekal, terezi4real, Terraspark4941, texcruize, Tezzaide, TGODiamond, TGRCdev, tgrkzus, thanosdegraf, ThatGuyUSA, ThatOneGoblin25, thatrandomcanadianguy, TheArturZh, TheBlueYowie, thecopbennet, TheCze, TheDarkElites, thedraccx, TheEmber, TheFlyingSentry, TheGrimbeeper, TheIntoxicatedCat, thekilk, themias, theomund, TheProNoob678, TherapyGoth, ThereDrD0, TheSecondLord, TheShuEd, thetolbean, thevinter, TheWaffleJesus, thinbug0, ThunderBear2006, timothyteakettle, TimrodDX, timurjavid, tin-man-tim, TiniestShark, Titian3, tk-a369, tkdrg, tmtmtl30, ToastEnjoyer, Toby222, TokenStyle, Tollhouse, Toly65, tom-leys, tomasalves8, Tomeno, Tonydatguy, topy, tornado-technology, TornadoTechnology, tosatur, TotallyLemon, ToxicSonicFan04, Tr1bute, travis-g-reid, treytipton, trixxedbit, TrixxedHeart, tropicalhibi, truepaintgit, Truoizys, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, tyashley, Tyler-IN, TytosB, Tyzemol, UbaserB, Uberration, ubis1, UBlueberry, uhbg, UKNOWH, UltimateJester, Unbelievable-Salmon, underscorex5, UnicornOnLSD, Unisol, unusualcrow, Uriende, UristMcDorf, user424242420, Utmanarn, Vaaankas, valentfingerov, valquaint, Varen, Vasilis, VasilisThePikachu, veliebm, Velken, VelonacepsCalyxEggs, veprolet, VerinSenpai, veritable-calamity, Veritius, Vermidia, vero5123, verslebas, vexerot, vgskye, viceemargo, VigersRay, violet754, Visne, vitopigno, vitusveit, vlad, vlados1408, VMSolidus, vmzd, VoidMeticulous, voidnull000, volotomite, volundr-, Voomra, Vordenburg, vorkathbruh, Vortebo, vulppine, wachte1, wafehling, walksanatora, Warentan, WarMechanic, Watermelon914, weaversam8, wertanchik, whateverusername0, whatston3, widgetbeck, Will-Oliver-Br, Willhelm53, WilliamECrew, willicassi, Winkarst-cpu, wirdal, wixoaGit, WlarusFromDaSpace, Wolfkey-SomeoneElseTookMyUsername, Worldwaker, wrexbe, wtcwr68, xeri7, xkreksx, xprospero, xRiriq, xsainteer, YanehCheck, yathxyz, Ygg01, YotaXP, youarereadingthis, YoungThugSS14, Yousifb26, youtissoum, yunii, YuriyKiss, yuriykiss, zach-hill, Zadeon, Zalycon, zamp, Zandario, Zap527, Zealith-Gamer, ZelteHonor, zero, ZeroDiamond, ZeWaka, zHonys, zionnBE, ZNixian, Zokkie, ZoldorfTheWizard, zonespace27, Zylofan, Zymem, zzylex +0leshe, 0tito, 0x6273, 12rabbits, 1337dakota, 13spacemen, 154942, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 27alaing, 2DSiggy, 3nderall, 4310v343k, 4dplanner, 5tickman, 612git, 778b, 96flo, aaron, abadaba695, Ablankmann, abregado, Absolute-Potato, Absotively, achookh, Acruid, ActiveMammmoth, actually-reb, ada-please, adamsong, Adeinitas, adm2play, Admiral-Obvious-001, adrian, Adrian16199, Ady4ik, Aearo-Deepwater, Aerocrux, Aeshus, Aexolott, Aexxie, africalimedrop, afrokada, AftrLite, AgentSmithRadio, Agoichi, Ahion, aiden, aidenkrz, Aidenkrz, Aisu9, ajcm, AJCM-git, AjexRose, Alekshhh, alexalexmax, alexkar598, AlexMorgan3817, alexum418, alexumandxgabriel08x, Alice4267, Alithsko, Alkheemist, alliephante, ALMv1, Alpaccalypse, Alpha-Two, AlphaQwerty, Altoids1, amatwiedle, amylizzle, ancientpower, Andre19926, Andrew-Fall, AndrewEyeke, AndrewFenriz, AndreyCamper, anri, Anzarot121, ApolloVector, Appiah, april-gras, ar4ill, Arcane-Waffle, archee1, ArchPigeon, ArchRBX, areitpog, Arendian, areyouconfused, arimah, Arkanic, ArkiveDev, armoks, Arteben, ArthurMousatov, ArtisticRoomba, artur, Artxmisery, ArZarLordOfMango, as334, AsikKEsel, AsnDen, asperger-sind, aspiringLich, astriloqua, Atakku, august-sun, AutoOtter, AverageNotDoingAnythingEnjoyer, avghdev, AwareFoxy, Awlod, azzyisnothere, AzzyIsNotHere, B-Kirill, B3CKDOOR, baa14453, BackeTako, BadaBoomie, Bakke, BananaFlambe, Baptr0b0t, BarryNorfolk, BasedUser, bebr3ght, beck-thompson, beesterman, bellwetherlogic, ben, benbryant0, benev0, benjamin-burges, BGare, bhespiritu, bibbly, BigfootBravo, BIGZi0348, bingojohnson, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, blitzthesquishy, Blobadoodle, bloodrizer, Bloody2372, blueDev2, Boaz1111, BobdaBiscuit, BobTheSleder, boiled-water-tsar, Bokser815, bolantej, Booblesnoot42, Boolean-Buckeye, botanySupremist, brainfood1183, BramvanZijp, Brandon-Huu, breeplayx3, BriBrooo, Bright0, BRINGit34, brndd, bryce0110, BubblegumBlue, buletsponge, buntobaggins, bvelliquette, BWTCK, byondfuckery, c0rigin, c4llv07e, CaasGit, Caconym27, Calecute, Callmore, Camdot, capnsockless, CaptainMaru, captainsqrbeard, Carbonhell, Carolyn3114, Carou02, carteblanche4me, catdotjs, catlord, Catofquestionableethics, CatTheSystem, CawsForConcern, Centronias, Chaboricks, chairbender, Chaoticaa, Charlese2, charlie, chartman, ChaseFlorom, chavonadelal, Cheackraze, CheddaCheez, cheesePizza2, CheesePlated, Chief-Engineer, chillyconmor, christhirtle, chromiumboy, Chronophylos, Chubbicous, Chubbygummibear, Ciac32, ciaran, citrea, civilCornball, claustro305, Clement-O, cloudyias, clyf, Clyybber, CMDR-Piboy314, cnv41, coco, cohanna, Cohnway, Cojoke-dot, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, Compilatron144, CookieMasterT, coolboy911, CoolioDudio, coolmankid12345, Coolsurf6, cooperwallace, corentt, CormosLemming, CrafterKolyan, CraftyRenter, crazybrain23, Crazydave91920, creadth, CrigCrag, CroilBird, Crotalus, CrudeWax, cryals, CrzyPotato, cubixthree, cutemoongod, Cyberboss, d34d10cc, DadeKuma, Daemon, daerSeebaer, dahnte, dakamakat, DamianX, dan, dangerrevolution, daniel-cr, DanSAussieITS, Daracke, Darkenson, david, DawBla, Daxxi3, dch-GH, ddeegan, de0rix, Deahaka, dean, DEATHB4DEFEAT, Deatherd, deathride58, DebugOk, Decappi, Decortex, Deeeeja, deepdarkdepths, DeepwaterCreations, Deerstop, degradka, Delete69, deltanedas, DenisShvalov, DerbyX, derek, dersheppard, Deserty0, Detintinto, DevilishMilk, devinschubert14, dexlerxd, dffdff2423, DieselMohawk, DieselMohawkTheSequel, digitalic, Dimastra, DinnerCalzone, DinoWattz, Disp-Dev, DisposableCrewmember42, dissidentbullet, DjfjdfofdjfjD, doc-michael, docnite, Doctor-Cpu, DogZeroX, dolgovmi, dontbetank, Doomsdrayk, Doru991, DoubleRiceEddiedd, DoutorWhite, DR-DOCTOR-EVIL-EVIL, Dragonjspider, dragonryan06, drakewill-CRL, Drayff, dreamlyjack, DrEnzyme, dribblydrone, DrMelon, drongood12, DrSingh, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, DuckManZach, Duddino, dukevanity, duskyjay, Dutch-VanDerLinde, dvir001, dylanstrategie, dylanwhittingham, Dynexust, Easypoller, echo, eclips_e, eden077, EEASAS, Efruit, efzapa, Ekkosangen, ElectroSR, elsie, elthundercloud, Elysium206, emberwinters, Emisse, emmafornash, EmoGarbage404, Endecc, EnrichedCaramel, Entvari, eoineoineoin, ephememory, eris, erohrs2, ERORR404V1, Errant-4, ertanic, esguard, estacaoespacialpirata, eugene, ewokswagger, exincore, exp111, f0x-n3rd, F1restar4, FacePluslll, Fahasor, FairlySadPanda, farrellka-dev, FATFSAAM2, Feluk6174, ficcialfaint, Fiftyllama, Fildrance, FillerVK, FinnishPaladin, firenamefn, Firewars763, FirinMaLazors, Fishfish458, fl-oz, Flareguy, flashgnash, FlipBrooke, FluffiestFloof, FluffMe, FluidRock, flymo5678, foboscheshir, FoLoKe, fooberticus, ForestNoises, forgotmyotheraccount, forkeyboards, forthbridge, Fortune117, foxhorn, freeman2651, freeze2222, frobnic8, Froffy025, Fromoriss, froozigiusz, FrostMando, FrostRibbon, Funce, FungiFellow, FunkySphere, FunTust, Futuristic-OK, GalacticChimp, gamer3107, Gamewar360, gansulalan, GaussiArson, Gaxeer, gbasood, gcoremans, Geekyhobo, genderGeometries, GeneralGaws, Genkail, Gentleman-Bird, geraeumig, Ghagliiarghii, Git-Nivrak, githubuser508, GitHubUser53123, gituhabu, GlassEclipse, GnarpGnarp, GNF54, godisdeadLOL, goet, GoldenCan, Goldminermac, Golinth, golubgik, GoodWheatley, Gorox221, GR1231, gradientvera, graevy, GraniteSidewalk, GreaseMonk, greenrock64, GreyMario, GrownSamoyedDog, GTRsound, gusxyz, Gyrandola, h3half, hamurlik, Hanzdegloker, HappyRoach, Hardly3D, harikattar, Hayden, he1acdvv, Hebi, Helix-ctrl, helm4142, Henry, HerCoyote23, Hi-Im-Shot, HighTechPuddle, Hitlinemoss, hiucko, hivehum, Hmeister-fake, Hmeister-real, Hobbitmax, hobnob, HoidC, Holinka4ever, holyssss, HoofedEar, Hoolny, hord-brayden, hoshizora-sayo, Hreno, Hrosts, htmlsystem, Huaqas, hubismal, Hugal31, Hyenh, hyperb1, hyperDelegate, hyphenationc, i-justuser-i, iaada, iacore, IamVelcroboy, Ian321, icekot8, icesickleone, iczero, iglov, IgorAnt028, igorsaux, ike709, illersaver, Illiux, Ilushkins33, Ilya246, IlyaElDunaev, imatsoup, IMCB, impubbi, imrenq, imweax, indeano, Injazz, Insineer, insoPL, IntegerTempest, Interrobang01, Intoxicating-Innocence, IProduceWidgets, itsmethom, Itzbenz, iztokbajcar, Jackal298, Jackrost, JackRyd3r, jacksonzck, Jacktastic09, Jackw2As, jacob, jamessimo, janekvap, Jark255, Jarmer123, Jaskanbe, JasperJRoth, jbox144, JCGWE30, jerryimmouse, JerryImMouse, Jessetriesagain, jessicamaybe, JesterX666, Jezithyr, jicksaw, JiimBob, JimGamemaster, jimmy12or, JIPDawg, jjtParadox, jkwookee, jmcb, JohnGinnane, johnku1, Jophire, Jopogrechkin, joshepvodka, JpegOfAFrog, jproads, JrInventor05, Jrpl, jukereise, juliangiebel, JustArt1m, JustCone14, justdie12, justin, justintether, JustinTrotter, JustinWinningham, justtne, K-Dynamic, k3yw, Kadeo64, Kaga-404, kaiserbirch, KaiShibaa, kalane15, kalanosh, KamTheSythe, Kanashi-Panda, katzenminer, kbailey-git, Keelin, Keer-Sar, KEEYNy, keikiru, Kelrak, kerisargit, keronshb, KIBORG04, KieueCaprie, Kimpes, kin98, KingFroozy, kira-er, kiri-yoshikage, Kirillcas, Kirus59, Kistras, Kit, Kit0vras, KittenColony, Kittygyat, klaypexx, Kmc2000, Ko4ergaPunk, kognise, kokoc9n, komunre, KonstantinAngelov, kontakt, kosticia, koteq, kotobdev, Kowlin, KrasnoshchekovPavel, Krosus777, Krunklehorn, Kryyto, Kupie, kxvvv, Kyoth25f, kyupolaris, kzhanik, LaCumbiaDelCoronavirus, lajolico, Lamrr, lanedon, LankLTE, laok233, lapatison, larryrussian, lawdog4817, Lazzi0706, leah, leander-0, leonardo-dabepis, leonidussaks, leonsfriedrich, LeoSantich, lettern, LetterN, Level10Cybermancer, LEVELcat, lever1209, LevitatingTree, Lgibb18, lgruthes, LightVillet, lilazero, liltenhead, linkbro1, linkuyx, Litraxx, little-meow-meow, LittleBuilderJane, LittleNorthStar, LittleNyanCat, lizelive, ljm862, lmsnoise, localcc, lokachop, lolman360, Lomcastar, Lordbrandon12, LordCarve, LordEclipse, lucas, LucasTheDrgn, luckyshotpictures, LudwigVonChesterfield, luegamer, luizwritescode, LukaSlade, Lukasz825700516, luminight, lunarcomets, Lusatia, Luxeator, lvvova1, Lyndomen, lyroth001, lzimann, lzk228, M1tht1c, M3739, M4rchy-S, M87S, mac6na6na, MACMAN2003, Macoron, magicalus, magmodius, magnuscrowe, maland1, malchanceux, MaloTV, ManelNavola, manelnavola, Mangohydra, marboww, Markek1, MarkerWicker, marlyn, matt, Matz05, max, MaxNox7, maylokana, MDuch369, meganerobot, MehimoNemo, Mehnix, MeltedPixel, memeproof, MendaxxDev, Menshin, Mephisto72, MerrytheManokit, Mervill, metalgearsloth, MetalSage, MFMessage, mhamsterr, michaelcu, micheel665, mifia, MilenVolf, MilonPL, Minemoder5000, Minty642, minus1over12, Mirino97, mirrorcult, misandrie, MishaUnity, MissKay1994, MisterImp, MisterMecky, Mith-randalf, Mixelz, mjarduk, MjrLandWhale, mkanke-real, MLGTASTICa, mnva0, moderatelyaware, modern-nm, mokiros, momo, Moneyl, monotheonist, Moomoobeef, moony, Morb0, MossyGreySlope, mqole, mr-bo-jangles, Mr0maks, MrFippik, mrrobdemo, mtrs163, muburu, MureixloI, murolem, murphyneko, musicmanvr, MWKane, Myakot, Myctai, N3X15, nabegator, nails-n-tape, Nairodian, Naive817, NakataRin, namespace-Memory, Nannek, NazrinNya, neutrino-laser, NickPowers43, nikitosych, nikthechampiongr, Nimfar11, ninruB, Nirnael, NIXC, nkokic, NkoKirkto, nmajask, noctyrnal, noelkathegod, noirogen, nok-ko, NonchalantNoob, NoobyLegion, Nopey, NoreUhh, not-gavnaed, notafet, notquitehadouken, notsodana, noudoit, noverd, Nox38, NuclearWinter, nukashimika, nuke-haus, NULL882, nullarmo, nyeogmi, Nylux, Nyranu, Nyxilath, och-och, OctoRocket, OldDanceJacket, OliverOtter, onesch, OneZerooo0, OnsenCapy, OnyxTheBrave, opl-, Orange-Winds, OrangeMoronage9622, OrbitSystem07, Orsoniks, osjarw, Ostaf, othymer, OttoMaticode, Owai-Seek, packmore, paige404, paigemaeforrest, pali6, Palladinium, Pangogie, panzer-iv1, partyaddict, patrikturi, PaulRitter, pavlockblaine03, peccneck, Peptide90, peptron1, perryprog, PeterFuto, PetMudstone, pewter-wiz, pgraycs, PGrayCS, Pgriha, phantom-lily, pheenty, philingham, Phill101, Phooooooooooooooooooooooooooooooosphate, phunnyguy, PicklOH, PilgrimViis, Pill-U, pinkbat5, Piras314, Pireax, Pissachu, pissdemon, Pixel8-dev, PixeltheAertistContrib, PixelTheKermit, PJB3005, Plasmaguy, plinyvic, Plykiya, poeMota, pofitlo, pointer-to-null, Pok27, pok27, poklj, PolterTzi, PoorMansDreams, PopGamer45, portfiend, potato1234x, PotentiallyTom, PotRoastPiggy, Princess-Cheeseballs, ProfanedBane, PROG-MohamedDwidar, Prole0, ProPandaBear, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykana, psykzz, PuceTint, pumkin69, PuroSlavKing, PursuitInAshes, Putnam3145, py01, Pyrovi, qrtDaniil, qrwas, Quantum-cross, quasr-9, quatre, QueerNB, QuietlyWhisper, qwerltaz, Radezolid, RadioMull, Radosvik, Radrark, Rainbeon, Rainfey, Raitononai, Ramlik, RamZ, randy10122, Rane, Ranger6012, Rapidgame7, ravage123321, rbertoche, RedBookcase, Redfire1331, Redict, RedlineTriad, redmushie, RednoWCirabrab, ReeZer2, RemberBM, RemieRichards, RemTim, rene-descartes2021, Renlou, retequizzle, rhailrake, rhsvenson, rich-dunne, RieBi, riggleprime, RIKELOLDABOSS, rinary1, Rinkashikachi, riolume, rlebell33, RobbyTheFish, robinthedragon, Rockdtben, Rohesie, rok-povsic, rokudara-sen, rolfero, RomanNovo, rosieposieeee, Roudenn, router, ruddygreat, rumaks, RumiTiger, Ruzihm, S1rFl0, S1ss3l, Saakra, Sadie-silly, saga3152, saintmuntzer, Salex08, sam, samgithubaccount, Samuka-C, SaphireLattice, SapphicOverload, sarahon, sativaleanne, SaveliyM360, sBasalto, ScalyChimp, ScarKy0, ScholarNZL, schrodinger71, scrato, Scribbles0, scrivoy, scruq445, scuffedjays, ScumbagDog, SeamLesss, Segonist, semensponge, sephtasm, ser1-1y, Serkket, sewerpig, SG6732, sh18rw, Shaddap1, ShadeAware, ShadowCommander, shadowtheprotogen546, shaeone, shampunj, shariathotpatrol, SharkSnake98, shibechef, Siginanto, signalsender, SignalWalker, siigiil, silicon14wastaken, Silverfur-underscore, Simyon264, sirdragooon, Sirionaut, SirWarock, Sk1tch, SkaldetSkaeg, Skarletto, Skybailey-dev, skye, Skyedra, SlamBamActionman, slarticodefast, Slava0135, sleepyyapril, slimmslamm, Slyfox333, Smugman, SnappingOpossum, snebl, snicket, sniperchance, Snowni, snowsignal, SolidSyn, SolidusSnek, solstar2, SonicHDC, SoulFN, SoulSloth, Soundwavesghost, soupkilove, southbridge-fur, sowelipililimute, Soydium, SpaceLizard24, SpaceLizardSky, SpaceManiac, SpaceRox1244, SpaceyLady, Spangs04, spanky-spanky, Sparlight, spartak, SpartanKadence, spderman3333, SpeltIncorrectyl, Spessmann, SphiraI, SplinterGP, spoogemonster, sporekto, sporkyz, ssdaniel24, stalengd, stanberytrask, Stanislav4ix, StanTheCarpenter, starbuckss14, Stealthbomber16, Steffo99, stellar-novas, stewie523, stomf, Stop-Signs, stopbreaking, stopka-html, StrawberryMoses, Stray-Pyramid, strO0pwafel, Strol20, StStevens, Subversionary, sunbear-dev, SuperGDPWYL, superjj18, Supernorn, SurrealShibe, SweetAplle, SweptWasTaken, SyaoranFox, Sybil, SYNCHRONIC, Szunti, t, Tainakov, takemysoult, taonewt, tap, TaralGit, Taran, taurie, Tayrtahn, tday93, teamaki, TeenSarlacc, TekuNut, telavivgamers, telyonok, temm1ie, TemporalOroboros, tentekal, terezi4real, Terraspark4941, texcruize, Tezzaide, TGODiamond, TGRCdev, tgrkzus, thanosdegraf, ThatGuyUSA, ThatOneGoblin25, thatrandomcanadianguy, TheArturZh, TheBlueYowie, thecopbennet, TheCze, TheDarkElites, thedraccx, TheEmber, TheFlyingSentry, TheGrimbeeper, TheIntoxicatedCat, thekilk, themias, theomund, TheProNoob678, TherapyGoth, ThereDrD0, TheSecondLord, TheShuEd, thetolbean, thevinter, TheWaffleJesus, thinbug0, ThunderBear2006, timothyteakettle, TimrodDX, timurjavid, tin-man-tim, TiniestShark, Titian3, tk-a369, tkdrg, tmtmtl30, ToastEnjoyer, Toby222, TokenStyle, Tollhouse, Toly65, tom-leys, tomasalves8, Tomeno, Tonydatguy, topy, tornado-technology, TornadoTechnology, tosatur, TotallyLemon, ToxicSonicFan04, Tr1bute, travis-g-reid, treytipton, trixxedbit, TrixxedHeart, tropicalhibi, truepaintgit, Truoizys, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, tyashley, Tyler-IN, TytosB, Tyzemol, UbaserB, Uberration, ubis1, UBlueberry, uhbg, UKNOWH, UltimateJester, Unbelievable-Salmon, underscorex5, UnicornOnLSD, Unisol, unusualcrow, Uriende, UristMcDorf, user424242420, Utmanarn, Vaaankas, valentfingerov, valquaint, Varen, Vasilis, VasilisThePikachu, veliebm, Velken, VelonacepsCalyxEggs, veprolet, VerinSenpai, veritable-calamity, Veritius, Vermidia, vero5123, verslebas, vexerot, vgskye, viceemargo, VigersRay, violet754, Visne, vitopigno, vitusveit, vlad, vlados1408, VMSolidus, vmzd, VoidMeticulous, voidnull000, volotomite, volundr-, Voomra, Vordenburg, vorkathbruh, Vortebo, vulppine, wachte1, wafehling, walksanatora, Warentan, WarMechanic, Watermelon914, weaversam8, wertanchik, whateverusername0, whatston3, widgetbeck, Will-Oliver-Br, Willhelm53, WilliamECrew, willicassi, Winkarst-cpu, wirdal, wixoaGit, WlarusFromDaSpace, Wolfkey-SomeoneElseTookMyUsername, Worldwaker, wrexbe, wtcwr68, xeri7, xkreksx, xprospero, xRiriq, xsainteer, YanehCheck, yathxyz, Ygg01, YotaXP, youarereadingthis, YoungThugSS14, Yousifb26, youtissoum, yunii, yuriykiss, YuriyKiss, zach-hill, Zadeon, Zalycon, zamp, Zandario, Zap527, Zealith-Gamer, ZelteHonor, zero, ZeroDiamond, ZeWaka, zHonys, zionnBE, ZNixian, Zokkie, ZoldorfTheWizard, zonespace27, Zylofan, Zymem, zzylex From f727d7ba4217ad330461055dc075b4f970dc2074 Mon Sep 17 00:00:00 2001 From: Ben Dake <124413509+Buunie099@users.noreply.github.com> Date: Sun, 16 Nov 2025 05:22:45 -0500 Subject: [PATCH 070/106] Vulp crying now uses whining sounds (#40982) * Change vulp whine emote name to crying * Fix vulp yaml * Add whining back for typing * review --------- Co-authored-by: ScarKy0 --- Resources/Prototypes/Voice/speech_emote_sounds.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Resources/Prototypes/Voice/speech_emote_sounds.yml b/Resources/Prototypes/Voice/speech_emote_sounds.yml index 24f7b51b53..a1ef9d8ece 100644 --- a/Resources/Prototypes/Voice/speech_emote_sounds.yml +++ b/Resources/Prototypes/Voice/speech_emote_sounds.yml @@ -498,6 +498,8 @@ collection: VulpkaninBarks Whine: collection: VulpkaninWhines + Crying: + collection: VulpkaninWhines Howl: collection: VulpkaninHowls Gasp: @@ -530,6 +532,8 @@ collection: VulpkaninBarks Whine: collection: VulpkaninWhines + Crying: + collection: VulpkaninWhines Howl: collection: VulpkaninHowls Gasp: From 9d4261df404c4f2d02bf8d605eadb04acb3e86ea Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 16 Nov 2025 10:35:47 +0000 Subject: [PATCH 071/106] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index bdc3196293..555dfcd5be 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: slarticodefast - changes: - - message: The interrogator lamp and flash lantern now properly flash when toggled - on. - type: Fix - id: 8707 - time: '2025-06-23T11:32:57.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/37640 - author: metalgearsloth changes: - message: Added ambient occlusion to walls so they have shadows around them. @@ -3926,3 +3918,10 @@ id: 9207 time: '2025-11-16T01:03:18.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41438 +- author: buunie099 + changes: + - message: Vulpkannin cries now use the same sounds as whining + type: Tweak + id: 9208 + time: '2025-11-16T10:34:39.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/40982 From 5c5ad10a77f4bc1f2e92a59c6fc81536e2a86b09 Mon Sep 17 00:00:00 2001 From: Tobias Berger Date: Sun, 16 Nov 2025 13:44:18 +0000 Subject: [PATCH 072/106] Fix typo in PR template (#41451) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit My browser keeps pointing it out and I don't like it :⁾ --- .github/PULL_REQUEST_TEMPLATE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 4029b093cc..53fad99b1a 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -10,13 +10,13 @@ ## Media - ## Requirements - [ ] I have read and am following the [Pull Request and Changelog Guidelines](https://docs.spacestation14.com/en/general-development/codebase-info/pull-request-guidelines.html). -- [ ] I have added media to this PR or it does not require an ingame showcase. +- [ ] I have added media to this PR or it does not require an in-game showcase. ## Breaking changes From 17ed12b1caa0f7eba3afeea35ad1006bb21c2129 Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Sun, 16 Nov 2025 21:46:02 +0100 Subject: [PATCH 073/106] fix DamageAbleSystem.SetDamage (#41456) fix SetDamage --- .../Damage/Systems/DamageableSystem.API.cs | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Damage/Systems/DamageableSystem.API.cs b/Content.Shared/Damage/Systems/DamageableSystem.API.cs index c2a1374901..c5452eda7c 100644 --- a/Content.Shared/Damage/Systems/DamageableSystem.API.cs +++ b/Content.Shared/Damage/Systems/DamageableSystem.API.cs @@ -8,13 +8,41 @@ namespace Content.Shared.Damage.Systems; public sealed partial class DamageableSystem { /// - /// Directly sets the damage specifier of a damageable component. + /// Directly sets the damage in a damageable component. + /// This method keeps the damage types supported by the DamageContainerPrototype in the component. + /// If a type is given in , but not supported then it will not be set. + /// If a type is supported but not given in then it will be set to 0. /// /// /// Useful for some unfriendly folk. Also ensures that cached values are updated and that a damage changed /// event is raised. /// public void SetDamage(Entity ent, DamageSpecifier damage) + { + if (!_damageableQuery.Resolve(ent, ref ent.Comp, false)) + return; + + foreach (var type in ent.Comp.Damage.DamageDict.Keys) + { + if (damage.DamageDict.TryGetValue(type, out var value)) + ent.Comp.Damage.DamageDict[type] = value; + else + ent.Comp.Damage.DamageDict[type] = 0; + } + + OnEntityDamageChanged((ent, ent.Comp)); + } + + /// + /// Directly sets the damage specifier of a damageable component. + /// This will overwrite the complete damage dict, meaning it will bulldoze the supported damage types. + /// + /// + /// This may break persistance as the supported types are reset in case the component is initialized again. + /// So this only makes sense if you also change the DamageContainerPrototype in the component at the same time. + /// Only use this method if you know what you are doing. + /// + public void SetDamageSpecifier(Entity ent, DamageSpecifier damage) { if (!_damageableQuery.Resolve(ent, ref ent.Comp, false)) return; From 508f45e81d5d50b6853f5eede337cda1abc78700 Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Mon, 17 Nov 2025 00:48:25 +0100 Subject: [PATCH 074/106] Make crawl speed depend on your free hand count (#41458) * crawl speed * I can't spell --- .../SharedHandsSystem.EventListeners.cs | 14 ++++++++ .../Stunnable/SharedStunSystem.Knockdown.cs | 34 +++++++++++++++++-- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.EventListeners.cs b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.EventListeners.cs index af0ed1c1aa..ea2502331e 100644 --- a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.EventListeners.cs +++ b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.EventListeners.cs @@ -11,6 +11,7 @@ public abstract partial class SharedHandsSystem private void InitializeEventListeners() { SubscribeLocalEvent(OnStandupArgs); + SubscribeLocalEvent(OnKnockedDownRefresh); } /// @@ -28,4 +29,17 @@ public abstract partial class SharedHandsSystem time.DoAfterTime *= (float)ent.Comp.Count / (hands + ent.Comp.Count); } + + private void OnKnockedDownRefresh(Entity ent, ref KnockedDownRefreshEvent args) + { + var freeHands = CountFreeHands(ent.AsNullable()); + var totalHands = GetHandCount(ent.AsNullable()); + + // Can't crawl around without any hands. + // Entities without the HandsComponent will always have full crawling speed. + if (totalHands == 0) + args.SpeedModifier = 0f; + else + args.SpeedModifier *= (float)freeHands / totalHands; + } } diff --git a/Content.Shared/Stunnable/SharedStunSystem.Knockdown.cs b/Content.Shared/Stunnable/SharedStunSystem.Knockdown.cs index fc2b01c649..58f38c9db8 100644 --- a/Content.Shared/Stunnable/SharedStunSystem.Knockdown.cs +++ b/Content.Shared/Stunnable/SharedStunSystem.Knockdown.cs @@ -1,12 +1,12 @@ using Content.Shared.Alert; using Content.Shared.Buckle.Components; using Content.Shared.CCVar; -using Content.Shared.Damage; using Content.Shared.Damage.Components; using Content.Shared.Damage.Systems; using Content.Shared.Database; using Content.Shared.DoAfter; using Content.Shared.Gravity; +using Content.Shared.Hands; using Content.Shared.Hands.EntitySystems; using Content.Shared.Input; using Content.Shared.Movement.Events; @@ -54,7 +54,7 @@ public abstract partial class SharedStunSystem SubscribeLocalEvent(OnBuckleAttempt); SubscribeLocalEvent(OnStandAttempt); - // Updating movement a friction + // Updating movement and friction SubscribeLocalEvent(OnRefreshKnockedSpeed); SubscribeLocalEvent(OnRefreshFriction); SubscribeLocalEvent(OnKnockedTileFriction); @@ -66,6 +66,9 @@ public abstract partial class SharedStunSystem SubscribeLocalEvent(OnKnockdownRefresh); SubscribeLocalEvent(OnDamaged); SubscribeLocalEvent(OnWeightlessnessChanged); + SubscribeLocalEvent(OnHandEquipped); + SubscribeLocalEvent(OnHandUnequipped); + SubscribeLocalEvent(OnHandCountChanged); SubscribeLocalEvent(OnKnockdownAttempt); SubscribeLocalEvent(OnGetStandUpTime); @@ -380,7 +383,7 @@ public abstract partial class SharedStunSystem private void OnForceStandup(ForceStandUpEvent msg, EntitySessionEventArgs args) { - if (args.SenderSession.AttachedEntity is not {} user) + if (args.SenderSession.AttachedEntity is not { } user) return; ForceStandUp(user); @@ -522,6 +525,30 @@ public abstract partial class SharedStunSystem RemCompDeferred(entity); } + private void OnHandEquipped(Entity entity, ref DidEquipHandEvent args) + { + if (GameTiming.ApplyingState) + return; // The result of the change is already networked separately in the same game state + + RefreshKnockedMovement(entity); + } + + private void OnHandUnequipped(Entity entity, ref DidUnequipHandEvent args) + { + if (GameTiming.ApplyingState) + return; // The result of the change is already networked separately in the same game state + + RefreshKnockedMovement(entity); + } + + private void OnHandCountChanged(Entity entity, ref HandCountChangedEvent args) + { + if (GameTiming.ApplyingState) + return; // The result of the change is already networked separately in the same game state + + RefreshKnockedMovement(entity); + } + private void OnKnockdownAttempt(Entity entity, ref KnockDownAttemptEvent args) { // Directed, targeted moth attack. @@ -582,6 +609,7 @@ public abstract partial class SharedStunSystem ent.Comp.SpeedModifier = ev.SpeedModifier; ent.Comp.FrictionModifier = ev.FrictionModifier; + Dirty(ent); _movementSpeedModifier.RefreshMovementSpeedModifiers(ent); _movementSpeedModifier.RefreshFrictionModifiers(ent); From e88d2b748155040b8fd1ae6df2cba42c31a009c3 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 17 Nov 2025 00:00:55 +0000 Subject: [PATCH 075/106] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 555dfcd5be..c9e5db7d81 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: metalgearsloth - changes: - - message: Added ambient occlusion to walls so they have shadows around them. - type: Add - id: 8708 - time: '2025-06-24T07:56:15.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38276 - author: BramvanZijp changes: - message: Added Stamina Damage resistance to the raid/hard-suits used by Nuclear @@ -3925,3 +3918,10 @@ id: 9208 time: '2025-11-16T10:34:39.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/40982 +- author: slarticodefast + changes: + - message: Crawling speed now depends on the number of free hands you have. + type: Tweak + id: 9209 + time: '2025-11-16T23:59:45.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41458 From 28eeaa5d9ff8be26a17bb837c562bd119951f2c5 Mon Sep 17 00:00:00 2001 From: Samuka <47865393+Samuka-C@users.noreply.github.com> Date: Mon, 17 Nov 2025 11:46:54 -0300 Subject: [PATCH 076/106] Update mothership (#41453) * add body crusher sprites * body crusher yml * add xenoborg thruster sprites * add xenoborg thruster yml * update mothership * only one IFF computer * tabs * fuck * fixed indentation * replace tabs with spaces * change id MachineBodyCrusher to MachineArtifactCrusherXenoborg Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> * change id XenoborgThruster to ThrusterXenoborg Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> * update Ids in mothership --------- Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> --- Resources/Maps/Shuttles/mothership.yml | 232 +++++++++--------- .../Structures/Machines/artifact_analyzer.yml | 10 + .../Structures/Shuttles/thrusters.yml | 7 + .../Machines/body_crusher.rsi/base.png | Bin 0 -> 650 bytes .../Machines/body_crusher.rsi/door-closed.png | Bin 0 -> 272 bytes .../Machines/body_crusher.rsi/glass.png | Bin 0 -> 195 bytes .../Machines/body_crusher.rsi/icon.png | Bin 0 -> 977 bytes .../Machines/body_crusher.rsi/lights.png | Bin 0 -> 213 bytes .../Machines/body_crusher.rsi/meta.json | 51 ++++ .../Machines/body_crusher.rsi/piston-push.png | Bin 0 -> 1320 bytes .../Machines/body_crusher.rsi/piston.png | Bin 0 -> 347 bytes .../Shuttles/xenoborg_thruster.rsi/base.png | Bin 0 -> 2082 bytes .../Shuttles/xenoborg_thruster.rsi/meta.json | 83 +++++++ .../Shuttles/xenoborg_thruster.rsi/thrust.png | Bin 0 -> 506 bytes .../thrust_burn_unshaded.png | Bin 0 -> 2581 bytes 15 files changed, 268 insertions(+), 115 deletions(-) create mode 100644 Resources/Textures/Structures/Machines/body_crusher.rsi/base.png create mode 100644 Resources/Textures/Structures/Machines/body_crusher.rsi/door-closed.png create mode 100644 Resources/Textures/Structures/Machines/body_crusher.rsi/glass.png create mode 100644 Resources/Textures/Structures/Machines/body_crusher.rsi/icon.png create mode 100644 Resources/Textures/Structures/Machines/body_crusher.rsi/lights.png create mode 100644 Resources/Textures/Structures/Machines/body_crusher.rsi/meta.json create mode 100644 Resources/Textures/Structures/Machines/body_crusher.rsi/piston-push.png create mode 100644 Resources/Textures/Structures/Machines/body_crusher.rsi/piston.png create mode 100644 Resources/Textures/Structures/Shuttles/xenoborg_thruster.rsi/base.png create mode 100644 Resources/Textures/Structures/Shuttles/xenoborg_thruster.rsi/meta.json create mode 100644 Resources/Textures/Structures/Shuttles/xenoborg_thruster.rsi/thrust.png create mode 100644 Resources/Textures/Structures/Shuttles/xenoborg_thruster.rsi/thrust_burn_unshaded.png diff --git a/Resources/Maps/Shuttles/mothership.yml b/Resources/Maps/Shuttles/mothership.yml index 41ca3d89d8..e515787629 100644 --- a/Resources/Maps/Shuttles/mothership.yml +++ b/Resources/Maps/Shuttles/mothership.yml @@ -1,11 +1,11 @@ meta: format: 7 category: Grid - engineVersion: 266.0.0 + engineVersion: 268.0.0 forkId: "" forkVersion: "" - time: 08/21/2025 13:34:57 - entityCount: 440 + time: 11/16/2025 15:37:41 + entityCount: 441 maps: [] grids: - 1 @@ -1100,10 +1100,11 @@ entities: parent: 1 - proto: ComputerIFFSyndicate entities: - - uid: 278 + - uid: 437 components: - type: Transform - pos: 2.5,5.5 + rot: -1.5707963267948966 rad + pos: 2.5,1.5 parent: 1 - proto: ComputerPowerMonitoring entities: @@ -1132,6 +1133,11 @@ entities: parent: 1 - proto: ComputerSurveillanceCameraMonitor entities: + - uid: 278 + components: + - type: Transform + pos: 2.5,5.5 + parent: 1 - uid: 426 components: - type: Transform @@ -1579,22 +1585,18 @@ entities: rot: 3.141592653589793 rad pos: -6.5,-0.5 parent: 1 -- proto: MachineArtifactCrusher +- proto: MachineArtifactCrusherXenoborg entities: - - uid: 372 + - uid: 111 components: - - type: MetaData - name: body crusher - - type: Transform - pos: 3.5,-4.5 - parent: 1 - - uid: 373 - components: - - type: MetaData - name: body crusher - type: Transform pos: 2.5,-4.5 parent: 1 + - uid: 112 + components: + - type: Transform + pos: 3.5,-4.5 + parent: 1 - proto: PlasticFlapsAirtightClear entities: - uid: 252 @@ -1760,22 +1762,22 @@ entities: - uid: 438 components: - type: Transform - pos: -0.5,4.5 + pos: 1.5,-0.5 parent: 1 - uid: 439 components: - type: Transform - pos: 1.5,4.5 + pos: 1.5,1.5 parent: 1 - uid: 440 components: - type: Transform - pos: 2.5,4.5 + pos: -0.5,1.5 parent: 1 - - uid: 437 + - uid: 441 components: - type: Transform - pos: -1.5,4.5 + pos: -0.5,-0.5 parent: 1 - proto: SubstationBasic entities: @@ -1875,100 +1877,6 @@ entities: - type: Transform pos: -2.5,5.5 parent: 1 -- proto: Thruster - entities: - - uid: 111 - components: - - type: Transform - pos: -10.5,3.5 - parent: 1 - - uid: 112 - components: - - type: Transform - pos: -9.5,3.5 - parent: 1 - - uid: 113 - components: - - type: Transform - pos: -7.5,3.5 - parent: 1 - - uid: 114 - components: - - type: Transform - pos: -6.5,3.5 - parent: 1 - - uid: 115 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -7.5,-2.5 - parent: 1 - - uid: 116 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -6.5,-2.5 - parent: 1 - - uid: 117 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -10.5,-2.5 - parent: 1 - - uid: 118 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -9.5,-2.5 - parent: 1 - - uid: 119 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -12.5,-0.5 - parent: 1 - - uid: 120 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -12.5,0.5 - parent: 1 - - uid: 121 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -12.5,1.5 - parent: 1 - - uid: 122 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 8.5,1.5 - parent: 1 - - uid: 123 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 8.5,0.5 - parent: 1 - - uid: 124 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 8.5,-0.5 - parent: 1 - - uid: 125 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -2.5,-6.5 - parent: 1 - - uid: 126 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 3.5,-6.5 - parent: 1 - proto: TwoWayLever entities: - uid: 5 @@ -2567,6 +2475,100 @@ entities: rot: -1.5707963267948966 rad pos: 3.5,2.5 parent: 1 +- proto: ThrusterXenoborg + entities: + - uid: 113 + components: + - type: Transform + pos: -7.5,3.5 + parent: 1 + - uid: 114 + components: + - type: Transform + pos: -6.5,3.5 + parent: 1 + - uid: 115 + components: + - type: Transform + pos: -9.5,3.5 + parent: 1 + - uid: 116 + components: + - type: Transform + pos: -10.5,3.5 + parent: 1 + - uid: 117 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -6.5,-2.5 + parent: 1 + - uid: 118 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -7.5,-2.5 + parent: 1 + - uid: 119 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -10.5,-2.5 + parent: 1 + - uid: 120 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -9.5,-2.5 + parent: 1 + - uid: 121 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -12.5,-0.5 + parent: 1 + - uid: 122 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -12.5,0.5 + parent: 1 + - uid: 123 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -12.5,1.5 + parent: 1 + - uid: 124 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 8.5,-0.5 + parent: 1 + - uid: 125 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 8.5,0.5 + parent: 1 + - uid: 126 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 8.5,1.5 + parent: 1 + - uid: 372 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -2.5,-6.5 + parent: 1 + - uid: 373 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 3.5,-6.5 + parent: 1 - proto: XenoborgWindow entities: - uid: 3 diff --git a/Resources/Prototypes/Entities/Structures/Machines/artifact_analyzer.yml b/Resources/Prototypes/Entities/Structures/Machines/artifact_analyzer.yml index 95684e7520..a80456583a 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/artifact_analyzer.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/artifact_analyzer.yml @@ -157,3 +157,13 @@ machine_parts: !type:Container entity_storage: !type:Container output_container: !type:Container + +# just a resprite +- type: entity + parent: MachineArtifactCrusher + id: MachineArtifactCrusherXenoborg + name: body crusher + description: Best not to let your head get stuck... + components: + - type: Sprite + sprite: Structures/Machines/body_crusher.rsi diff --git a/Resources/Prototypes/Entities/Structures/Shuttles/thrusters.yml b/Resources/Prototypes/Entities/Structures/Shuttles/thrusters.yml index c80ff8eb70..bb43cb3b2c 100644 --- a/Resources/Prototypes/Entities/Structures/Shuttles/thrusters.yml +++ b/Resources/Prototypes/Entities/Structures/Shuttles/thrusters.yml @@ -102,6 +102,13 @@ visible: false offset: 0, 1 +- type: entity + parent: Thruster + id: ThrusterXenoborg + components: + - type: Sprite + sprite: Structures/Shuttles/xenoborg_thruster.rsi + - type: entity id: ThrusterLarge name: large thruster diff --git a/Resources/Textures/Structures/Machines/body_crusher.rsi/base.png b/Resources/Textures/Structures/Machines/body_crusher.rsi/base.png new file mode 100644 index 0000000000000000000000000000000000000000..a1c8292bbd7b0a97c6bf07419eb5e383fa578941 GIT binary patch literal 650 zcmV;50(Jd~P)Px%L`g(JRA_ zC#P}%Y*(C@IDo-m2mpBK9L2UAJEmc|Ak2ZR&SiZtn}x3f+5kFlpQZ2biNK!)5H7_J zk53byj?%|Gx917Z92`JnWeKi_H_@Qw#f6DL;x7}ojRJ@a64@?12}^*& z0i<8ScT`GH02+>ScMgC|!Sdn)w_r@7>){Q$pc$9ziBpdX+G+VC-#Bs{!2ZFWbbxBl zxV^I_ZBuSaRbq8T>=_mvObLMYZcA%dEGt&3#;3ompR*3ws)C!^sR96W&(5tmF|}p< k>z0st>5ooIpN(vO0@f3})#zq>0000007*qoM6N<$g4^O81^@s6 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/body_crusher.rsi/door-closed.png b/Resources/Textures/Structures/Machines/body_crusher.rsi/door-closed.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec5755f0f59438b9df6cec32260d7ebbe5140d4 GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2dVDaPU;cPEB*=VV?2Ij1~b978f1 z-(GX%I%FWgdO^RU(eIj)l5IoBcl(A8c8wsf>z@4!R!@{tZ)|(v^gnv)vbmni>H`}( zpy0**wU4BaAAb4oWZU%DKbJnY`no`vk)b2|-nCut*ce{43+{f)mb=^EjHix?;fKJP zuTR(>F)ck}dQ<8d+m|m<2eelGO00>Co_yh%-;p^@I~nDf=5*Y&Q7^ybI^RKE;7^Dy zv#an7agC*t8nYV2HgsvFHAp6~&1k%T=D?nWwLD97{wa6;&&b;E?-Ku=!NKp)dV61| RDxj|zJYD@<);T3K0RTnlaZ3OI literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/body_crusher.rsi/glass.png b/Resources/Textures/Structures/Machines/body_crusher.rsi/glass.png new file mode 100644 index 0000000000000000000000000000000000000000..071e8a0db5631b09b2ca08227ad5067ba3becafd GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3-pQ0$S$)DaPU;cPEB*=VV?2IR*hfA+A7L zh`V2r_a+yYs~}${gzc*P>+JE9LP8SCit5IOrf$ye5n&No8Cmu9^|iK%wm>}sB|(0{ z4AZ9lM+VoXuUrO{Q}uLl4DskpPLN<-oS?y^Cd06>K~P&F)IdX2pzCa)0hims1Px&i%CR5RA_#~k-Kp|=8{!PnPcBTNX2 zilVmD(>GLzR5GQT>*u`!Q6hw>*+?Z*@X`~%BRDITkQxA*>CNZzYPv@;qHE1+KnI{G ziftf5h+%B)8;OApxB5x0Kl#X?LA|u$N^48GhzzR9-Q{gQV2jzyBm4!P0m)P zMfhgp^op-fo!t|nFT!F8sbmV7kGCQ3OsV5kPy6D6&dtuS0RSN6e`q)piQI%N7f`JZKx$k=&GX)}^>n>JB+?66E*OFze1EL# zGmG%Jv8nIZdvV+-AlSDHU=0#r*&ddU)Hzypd9D~@IeHr&mXDm6bBP<^^5B3Y$JJ_0 z9DtlJAQ-sd2!J7TtH-sPeOk3P+PSU(DwS^dd_h|$X7c%hwh-L6 zASVYPNfL5$K<#UfSvEZ4ehNJG5O%W%@YF-d$<2Ndxxaxi*NE?B>VgPpkp#ME4cV&e83DUg-elW@os*imf&)?dEH@=zzazyI#~T zxKlrV09aanCM<|kUylE}CFG*zADxQw)sfGim@4Pe@Pg<{00000NkvXXu0mjfoD0F} literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/body_crusher.rsi/lights.png b/Resources/Textures/Structures/Machines/body_crusher.rsi/lights.png new file mode 100644 index 0000000000000000000000000000000000000000..ce30eb3c32266fa99d846656f21a495e099f38b2 GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3-pQ0$S$)DaPU;cPEB*=VV?2IR*hfA+A7L zh`V2r_a+yYs~}${gzc*P>+JE9LP8SCit5IOrf$ye5n&No8Cmu9^|iK%wm>}sB|(0{ z4AZ9lM+VoXuUrO{Gxv0H4DslEdwwG?&~_$=jSS!C|1dvr>B-@(To+gU;A61PpY-bP0l+XkK#H>wn literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/body_crusher.rsi/meta.json b/Resources/Textures/Structures/Machines/body_crusher.rsi/meta.json new file mode 100644 index 0000000000..57d0567ab6 --- /dev/null +++ b/Resources/Textures/Structures/Machines/body_crusher.rsi/meta.json @@ -0,0 +1,51 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made by brainfood1183 (github) for ss14. modified by Samuka-C (github)", + "size": { + "x": 32, + "y": 64 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "glass" + }, + { + "name": "door-closed" + }, + { + "name": "piston" + }, + { + "name": "base" + }, + { + "name": "lights" + }, + { + "name": "piston-push", + "delays": [ + [ + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Structures/Machines/body_crusher.rsi/piston-push.png b/Resources/Textures/Structures/Machines/body_crusher.rsi/piston-push.png new file mode 100644 index 0000000000000000000000000000000000000000..020d3b2902910c722cb3a89c3d1f3f69f8268736 GIT binary patch literal 1320 zcmeAS@N?(olHy`uVBq!ia0vp^3xN0l2OE%Vw$3OAQjEnx?oJHr&dI!FU|@OV>Eakt zG3V`FL;uGf630HOS5H*h=_ONm+eygLH*u-GNTt2w6aU6ffdW@+TRJ{z2?*8BP%`Zn zTJ$zdrmd^*v#9iDme!QE8(fC}^Y5n9YB{sk&-$VgyTfO9h*ZPt)5)h9e1PVwyp}&?C22gxo8i-? zJocIAo?mHjG?-RmQTz3qg;e^6&6XSoemxOoSk89FIMR&6;UiPR-G;=92PTCw$Is1< zY-147X9(kcQS@ioraUpGfHMphcbooJ`F_0n_mt^6jsyCxJO?hZec9uu^ml^F>SI-r zk1OXs`S{Uh^K${Fg#2Kp4I3D3*G~>PrMr~(#j2n@&v{{4PD}xB7$WXB^=4}PDOz2ENqIA)Tz?)lXyTh;}5&sGF$V?DxhV)*Qy`zO*k)mU=`!z-TUYGZ++7L-tX&afrccu zghb}BQ)^#F=X+M&*Pq^#`7-eN`(L+27&Y=3rp;@JwDsT1&iLc)W_I*A#m|=yIl0Z? zm0PEwGwZ>9HTSPyyS{ej`TPI&gvuQE%KoKZ`+8^OeZS&#{f&|JCB;*J-l|+1Uv|?$ zLN3F=V3Hem_9Kh3nPOs>7;ap9CfHzOVY)zN>upE5-y575uBoqQh%jGZ=xi!|J8bLX zk4MU)(peTn%<(@^s>pDZry-Pi+41*ZpKg@%a$lvkw{>y+{G2Pr9lT5v{2Au>Im~{x zTFur|T<@};D?^twFeUIbZCrBrGxaDpQNRGnsd-ni4%}`P5kx7(}cY`0Bf|@g$Dd#-s-P zl*{#>^WMEtb=;tT|NGXjrP=O7JcD&#p6161ty)juxnfW zrSnhc7F?Sn6)@@6TZR7G2t|h1lfxO-NMD$-a8_^b>RT5plC0MnGX?0JQ-81vl*WL` z?(*aBzdl9qFI5hmeDBc3_5NnBERV1;o=|7-Q(xfwIdt;8CEU|9rzEV~Fw;yNBIe6}w0@(ODQU>Q!ZYqGHp_IApVdLc^l{Os03{1Gw;feeIHJoKW3fy$& P0V(oy^>bP0l+XkKP|7D1 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/body_crusher.rsi/piston.png b/Resources/Textures/Structures/Machines/body_crusher.rsi/piston.png new file mode 100644 index 0000000000000000000000000000000000000000..b3ad39439bbd204e64959009e3fa8f381a56d596 GIT binary patch literal 347 zcmV-h0i^zkP)Px$6-h)vRA_&o&SUSV#od%^&mxUZ6$1f#eEqdLEC`Qt$$A;ktsM z7jU}kE{u!BkQOCxG#lajZ6*_5-hBBt01*)p5z#%!m$^;jsSTf2HXeR;j%hr#`7*bf z-kwX4*{lHYR?jYv`$FH-DZsw?b}8>Sz+&<0)Yur)UjUIU(&X7Gfc9xUxHOGMVJ|gK z0fJ!Oe9h+Y)7h|H)4ukq06{RfzL#|_dWr94ogvh(KqNsl3L%m-^Y-z%8V&VdFeoSZ zc;8`AP9Rdvt3~nW+^GiG^cx@?uj`}Dzwz8T-Qwy1=J3+ov6g+@-5$XAvU>Xk0Ehjx tMI^&7KCcTW4h#;lMny^002ovPDHLkV1j1$oAUqw literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Shuttles/xenoborg_thruster.rsi/base.png b/Resources/Textures/Structures/Shuttles/xenoborg_thruster.rsi/base.png new file mode 100644 index 0000000000000000000000000000000000000000..36006e74a2877bffcb8f637aa9c0cf7e0de83bb7 GIT binary patch literal 2082 zcmV+-2;KLIP)Px++(|@1RCt{2Tit8hND%+|kZm~$u`Tx_1WMzWga%qlpnmT|=^uUE!@cJq94+KX zaFS98O&ZIVv8^wI??IXM>}qANnl?71zZYBb?(EEHG&>*b0vH@;Ys#jJbkBp zrr#f+Y!}7#a2zDGi)F-dm??ncY)y;BGD@X{7eM9(NGqT7P_~N*gBU=fjC!?-Xfj0< zg>am$sj37^UG!Ij*3dDd3ZEsos(clyH6ri<=-2(@9s@ zSF#EijstNW$D#C2I?mR#`SJzAAQns?>^ISMU4%i5vRy>KKR~;E2)Elq*LAVC*8%{X zopsP~95{_Sj*gB|t8I!o4adRB=>-6wy0M0`UBtzguVQV<0!pQ_aDLT|H6c6zY;Ql8 zK523OT^&PniPpxNZTy;%@b^X6b#buY%>3QT{ACHa`0^Fx1O7Sw7eKNrks<-$&%gc# z05o5|kmk~O+BL`mN238QzI?^{`X;`+y_5r9X&>+q_^p6tGq7x|ln>y$z`Mh@!U>W` z2Y`i~4%+QQp&;6a5B8fvkx!jEnlE3ZN^i?VW*qQP+1Ron zy#mX~#+HqhjRYSGzZI}-29^!U2P`8STQ)K+;GwcHjwlL6;gkxa6iZO>MW5<6tQ$jf ziPmr&Ac|xsJhv|YvjQQaH7^g~>kh|(h)1Xz+}hm{<9S7xD}g_-&iSRN4gi#srnCb@SEGc$FY2fMW$Gh@S~Ep+jq$ZjIh>EW&Fb*(!Tp2us~-`2-V`tb!eVV-_nY{x8@q^3 z#jc3H!6Mw;da{g2tiYl#JbE$}o`YA9)%m*nYP3cV;hAklhuUR%_|wg?0H9Xelu}9R zu9%?fxNr4b!I#{^EJo;uqI+$lgMbavKBm7Er#-98ixs7(`6u3ARB z4;}S?U+!%X$UetU_sPR&#rb*Y zsB;!U4en@e<|~jV5CY^QY-()JnF4Zn~vHA`cYVXagMy9aMyKH|0~js1t9(R zfDi_;_}zpK@qM2_NF+o3{y<6;YPC&c^WwtLcU7TT_ZQJzM29PF5z2N^8)9qI;hS48 zcSgwP@PCQ`knUGE*0ilMy5|kYMs)I2f>i#1SsE|WVci51a7G%AgRbj}zs3pNwa7V5 z-mK_(p7g$(((wa7S3!hZE6HrBixW&sVo7N!p>cA0frI^Ks+vnJa`n(8M>Ls=!ot+7Yn9DVfoA0>q%?#L{wpa1{> M07*qoM6N<$g2I#Ja{vGU literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Shuttles/xenoborg_thruster.rsi/meta.json b/Resources/Textures/Structures/Shuttles/xenoborg_thruster.rsi/meta.json new file mode 100644 index 0000000000..64118c3f59 --- /dev/null +++ b/Resources/Textures/Structures/Shuttles/xenoborg_thruster.rsi/meta.json @@ -0,0 +1,83 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "copyright": "Created by Samuka-C (github)", + "license": "CC-BY-SA-3.0", + "states": [ + { + "name": "base", + "directions": 4 + }, + { + "name": "thrust", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "thrust_burn_unshaded", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Shuttles/xenoborg_thruster.rsi/thrust.png b/Resources/Textures/Structures/Shuttles/xenoborg_thruster.rsi/thrust.png new file mode 100644 index 0000000000000000000000000000000000000000..96527263fe30ecdc62a76f53b5236aa4fc329957 GIT binary patch literal 506 zcmeAS@N?(olHy`uVBq!ia0vp^4M4nrgBeJE_L*`XNHG=%xjQkeJ16rJ$gvFY32_C| zLP8Sa;_|YxYRZc0I+_N?hNf=L?h#=TSs7XN_4Qm_u7Z4-Lfrj|yfyuY#1AJ1l2 zf8AD<|JveB?Vi%79owDf-#Y)}FMmdK?)BfyKPKx>C@f@~AKSFCv^IQhQY9zQ|3bDg z-WP?%?lwNqoGoIT$;$BJYPN~#jU(j_Jlh{$(r0A&bs{ctW= i6>1YF?K7#4mtVEX%v0t4oo~RvV(@hJb6Mw<&;$T%N!8#0 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Shuttles/xenoborg_thruster.rsi/thrust_burn_unshaded.png b/Resources/Textures/Structures/Shuttles/xenoborg_thruster.rsi/thrust_burn_unshaded.png new file mode 100644 index 0000000000000000000000000000000000000000..c2678a40337d13ec8641c287fa4b9dfc0e01d137 GIT binary patch literal 2581 zcmV+w3hMQVP)Px;&q+ikNF_==2ywGtr>IvoFN}S4A8)4vpZ}yyF<%o7`m)$e{r+f z9WK|~UthpszkgU!Ic3Okq3wX7iwR)iRFwcs|EuR)006jLgO!0nu?(f)Zt7ej&SN5Pu( z@*LtE2BFykNTq*7Yc^oiQ(Xew)Gt{E;?vMA*ve!%LzaLZIF~_amH=|nKf+lCd_OSr zeEs=;k>!VC3{sT=LMi|1;vT;Kd|&IwQ1mberOH4}C187f0{{SzpPyPjCW~0_$JbI> zpod4{lmeU;KuP*XmY9x5rFa&Q8u4?@22#D>x6L^t2>BslH|0aC?doYDrhotSxiVLR z0Qg0~A;6>nYSKSK)flOU-(KGwiBGyWO2Q?;q70Ce;?HqypqCQFK~)LBUibFh2YCDL z!_j+`%=P}zYwAGskbyV_7!^QE`bS3V4JAm8fw%>jodHTxJ4G4D>HV<`MAZ{>dY%tu z7Ldq*#U;RPe1x+MXwicJV}#ndw(Wxgph*8nO(WzsJ|Y=}R6|pCfSl~(3ectGZ_mmA zzVVPz|GklC1G$YKdX2OQP_hFQl>jvG=GDuS@8Nr`y&$*lxjwkBTeHB@?4PU!?W}~N=0`&g7*7|6>Q*exrSsG^6PFY8ysGIf^R<_$v1DJ4-%OuB*2*c5&;f% zFa-aw)F8CA_wDx&t8YIZ;qc-U032r#_p@VzK=)_xcS{5)ZGQ*>_^CWK2#x*DNTfu7 z#0G&#uK2nXfZqTu)TIBMUKk2MYwyn?mEmf#UzY+%ksE-~$rWL%_=XWcNlK?k|55>{ z^&v*7?IrUwiCG&MR4a@4Dk|l>uC+YTziOvOtUQhPx*)wKl+&{!>}Nx6Rr6 zLw+E&cDo-0)|7#fQm{5dUlS*p`cqjzvi65MM2p?-GeC$`3SI)P2mqi-bWOK}NuAFx zDFdU`U~PuX0LE`IPOmG;o(A@CIMO9F4U!=Ahd_qIFgH0&^7$<13&pw@OU^SOdfL2KX<8v}Sq z1pV#157jHFRDnmD=jZ@(J94p6pu@4+1se z6o79BUvr6}Q~_N~{ITF|g95MX<8Ncz}L8>1Js{Ip_ zU%z}pf6y27A!dKr3;@u_`TW+*K(!X&`;(gyECV#sni<&q$;=2Q077cS!0yY85QY{& z&kuci5yPAih8Dmm5~ zKokI|CBC^0 z8vc9IVh}ma18~~#xFLahM@-BIKLFhJb9d&XHix+Xne5w-$LTet7+5nvtkQ0;QCSGgZBCS5Zpm` zA%6~DnhmH05c7e{KG%aF7tZwp_Jxo+5pW0~*9S`b6pw;kq!x+TZ`GK~2HdNGb0tCh ze7=ju%AhR=+j1~3?qNjtXfo#|2|*v6Q?U~EbI<4dNCe$QY)4Qi2$J|h?B${c0QsQ1 zi0%mtWdmv4+eXFh0-Oi|KtAX$Dq(Q5!P4x9&gb`h(}`gihG7_nVHk#C7-z(0vpcw( zAI<)Pr6s%(buaM64(K01A(SaZzG=HZAPPk$r_m@a;blk*kaQBikB*2#HWC6KJ*n>gLbC zgCkIX#|my*z_n{CM|OAL5B`qW(0>G_w3)ImX&V4QyZu+YyYB~p__kzjM`HH|k#7G<0Mdqiq zzLfA{_7SP}U-uSxv@IQYw67&R*9QQ(_Mb9$XUVHk#CESdiRSAMuoaS$$-00000NkvXXu0mjf1^MJH literal 0 HcmV?d00001 From 8acd30463d201e5fe31b7d5bae3dff0a98bb892e Mon Sep 17 00:00:00 2001 From: Samuka <47865393+Samuka-C@users.noreply.github.com> Date: Mon, 17 Nov 2025 14:31:03 -0300 Subject: [PATCH 077/106] Make mothership core able to pull (#41460) * make mothership core able to pull again * make it work like borgs --- Resources/Prototypes/Entities/Mobs/Player/mothershipcore.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Mobs/Player/mothershipcore.yml b/Resources/Prototypes/Entities/Mobs/Player/mothershipcore.yml index 0ac7872b67..c66caff638 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/mothershipcore.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/mothershipcore.yml @@ -197,7 +197,8 @@ cell_slot: name: power-cell-slot-component-slot-name-default startingItem: PowerCellMicroreactor - # - type: Puller # use the conveyor + - type: Puller + needsHands: false - type: Eye drawFov: false # - type: StationAiOverlay # removed until is no longer buggy From b59ecdba6a5b55b1f03f37c12a914302e4eaffab Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 17 Nov 2025 17:43:35 +0000 Subject: [PATCH 078/106] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index c9e5db7d81..28e8c2ef6f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: BramvanZijp - changes: - - message: Added Stamina Damage resistance to the raid/hard-suits used by Nuclear - Operatives and Emergency Response Teams. - type: Tweak - id: 8709 - time: '2025-06-24T13:04:15.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38526 - author: Kittygyat changes: - message: Added a handheld station map to the borg thruster module! @@ -3925,3 +3917,10 @@ id: 9209 time: '2025-11-16T23:59:45.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41458 +- author: Samuka + changes: + - message: The xenoborg mothership core can now pull stuff. + type: Fix + id: 9210 + time: '2025-11-17T17:42:27.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41460 From 9ef56974fb0922d9db153f62d83ce90fe3153304 Mon Sep 17 00:00:00 2001 From: Samuka <47865393+Samuka-C@users.noreply.github.com> Date: Mon, 17 Nov 2025 14:55:55 -0300 Subject: [PATCH 079/106] Examine which borg that module fits into (#41461) * modules tip * add color * solved a edge case * use ContentLocalizationManager instead of hardcoded grammar * improve summary * improve improved summary Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> * not my first language Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> * keep names consistent Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> * keep consistent part 2 * fixed the yml error --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- .../Borgs/Components/BorgModuleComponent.cs | 8 ++++ .../Silicons/Borgs/SharedBorgSystem.cs | 22 ++++++++++ .../Locale/en-US/silicons/borg-module.ftl | 18 ++++++++ .../Specific/Robotics/borg_modules.yml | 41 +++++++++++++++++++ 4 files changed, 89 insertions(+) create mode 100644 Resources/Locale/en-US/silicons/borg-module.ftl diff --git a/Content.Shared/Silicons/Borgs/Components/BorgModuleComponent.cs b/Content.Shared/Silicons/Borgs/Components/BorgModuleComponent.cs index e542a1e3e3..f50b088932 100644 --- a/Content.Shared/Silicons/Borgs/Components/BorgModuleComponent.cs +++ b/Content.Shared/Silicons/Borgs/Components/BorgModuleComponent.cs @@ -1,4 +1,5 @@ using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; namespace Content.Shared.Silicons.Borgs.Components; @@ -24,6 +25,13 @@ public sealed partial class BorgModuleComponent : Component [DataField] [AutoNetworkedField] public bool DefaultModule; + + /// + /// List of types of borgs this module fits into. + /// This only affects examine text. The actual whitelist for modules that can be inserted into a borg is defined in its . + /// + [DataField] + public HashSet? BorgFitTypes; } /// diff --git a/Content.Shared/Silicons/Borgs/SharedBorgSystem.cs b/Content.Shared/Silicons/Borgs/SharedBorgSystem.cs index baf604de0c..f9b4ec7cb8 100644 --- a/Content.Shared/Silicons/Borgs/SharedBorgSystem.cs +++ b/Content.Shared/Silicons/Borgs/SharedBorgSystem.cs @@ -1,6 +1,8 @@ using Content.Shared.Containers.ItemSlots; +using Content.Shared.Examine; using Content.Shared.IdentityManagement; using Content.Shared.Item.ItemToggle; +using Content.Shared.Localizations; using Content.Shared.Movement.Components; using Content.Shared.Movement.Systems; using Content.Shared.Popups; @@ -35,10 +37,30 @@ public abstract partial class SharedBorgSystem : EntitySystem SubscribeLocalEvent(OnRefreshMovementSpeedModifiers); SubscribeLocalEvent(OnUIOpenAttempt); SubscribeLocalEvent(OnTryGetIdentityShortInfo); + SubscribeLocalEvent(OnModuleExamine); InitializeRelay(); } + private void OnModuleExamine(Entity ent, ref ExaminedEvent args) + { + if (ent.Comp.BorgFitTypes == null) + return; + + if (ent.Comp.BorgFitTypes.Count == 0) + return; + + var typeList = new List(); + + foreach (var type in ent.Comp.BorgFitTypes) + { + typeList.Add(Loc.GetString(type)); + } + + var types = ContentLocalizationManager.FormatList(typeList); + args.PushMarkup(Loc.GetString("borg-module-fit", ("types", types))); + } + private void OnTryGetIdentityShortInfo(TryGetIdentityShortInfoEvent args) { if (args.Handled) diff --git a/Resources/Locale/en-US/silicons/borg-module.ftl b/Resources/Locale/en-US/silicons/borg-module.ftl new file mode 100644 index 0000000000..07c55c04a6 --- /dev/null +++ b/Resources/Locale/en-US/silicons/borg-module.ftl @@ -0,0 +1,18 @@ +borg-module-fit = This module fits into {$types}. + +borg-type-all = [color=white]any cyborg[/color] +borg-type-salvage = [color= #d6b328]salvage cyborgs[/color] +borg-type-engineer = [color= #ff9900]engineer cyborgs[/color] +borg-type-generic = [color= #666680]generic cyborgs[/color] +borg-type-janitor = [color= #a747c0]janitor cyborgs[/color] +borg-type-medical = [color= #5995ba]medical cyborgs[/color] +borg-type-service = [color= #508242]service cyborgs[/color] + +borg-type-syndicate = [color= #962023]syndicate cyborgs[/color] +borg-type-syndicate-assault = [color= #680a0d]syndicate assault cyborgs[/color] + +xenoborg-type-all = [color= #3d94ff]any xenoborg[/color] +xenoborg-type-engi = [color= #edd45b]engi xenoborgs[/color] +xenoborg-type-heavy = [color= #d62020]heavy xenoborgs[/color] +xenoborg-type-scout = [color= #6a6b6f]scout xenoborgs[/color] +xenoborg-type-stealth = [color= #ff00cc]stealth xenoborgs[/color] diff --git a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml index 862bc86339..5c01137543 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml @@ -27,6 +27,8 @@ - type: Sprite sprite: Objects/Specific/Robotics/borgmodule.rsi - type: BorgModule + borgFitTypes: + - borg-type-all - type: BorgModuleIcon icon: { sprite: Interface/Actions/actions_borg.rsi, state: no-action } - type: StaticPrice @@ -66,6 +68,9 @@ parent: BaseBorgModule abstract: true components: + - type: BorgModule + borgFitTypes: + - borg-type-salvage - type: Tag tags: - BorgModuleCargo @@ -91,6 +96,9 @@ parent: BaseBorgModule abstract: true components: + - type: BorgModule + borgFitTypes: + - borg-type-engineer - type: Tag tags: - BorgModuleEngineering @@ -118,6 +126,9 @@ parent: BaseBorgModule abstract: true components: + - type: BorgModule + borgFitTypes: + - borg-type-janitor - type: Tag tags: - BorgModuleJanitor @@ -145,6 +156,9 @@ parent: BaseBorgModule abstract: true components: + - type: BorgModule + borgFitTypes: + - borg-type-medical - type: Tag tags: - BorgModuleMedical @@ -172,6 +186,9 @@ parent: BaseBorgModule abstract: true components: + - type: BorgModule + borgFitTypes: + - borg-type-generic - type: Tag tags: - BorgModuleScience @@ -199,6 +216,9 @@ parent: BaseBorgModule abstract: true components: + - type: BorgModule + borgFitTypes: + - borg-type-service - type: Tag tags: - BorgModuleService @@ -226,6 +246,9 @@ parent: BaseBorgModule abstract: true components: + - type: BorgModule + borgFitTypes: + - borg-type-syndicate - type: Tag tags: - BorgModuleSyndicate @@ -254,6 +277,9 @@ parent: BaseBorgModule abstract: true components: + - type: BorgModule + borgFitTypes: + - borg-type-syndicate-assault - type: Tag tags: - BorgModuleSyndicateAssault @@ -281,6 +307,9 @@ parent: BaseBorgModule id: BaseXenoborgModuleGeneric components: + - type: BorgModule + borgFitTypes: + - xenoborg-type-all - type: Tag tags: - XenoborgModuleGeneric @@ -308,6 +337,9 @@ parent: BaseBorgModule id: BaseXenoborgModuleEngi components: + - type: BorgModule + borgFitTypes: + - xenoborg-type-engi - type: Tag tags: - XenoborgModuleEngi @@ -335,6 +367,9 @@ id: BaseXenoborgModuleHeavy abstract: true components: + - type: BorgModule + borgFitTypes: + - xenoborg-type-heavy - type: Tag tags: - XenoborgModuleHeavy @@ -362,6 +397,9 @@ id: BaseXenoborgModuleScout abstract: true components: + - type: BorgModule + borgFitTypes: + - xenoborg-type-scout - type: Tag tags: - XenoborgModuleScout @@ -389,6 +427,9 @@ id: BaseXenoborgModuleStealth abstract: true components: + - type: BorgModule + borgFitTypes: + - xenoborg-type-stealth - type: Tag tags: - XenoborgModuleStealth From ff0f4e902835652c188bbb2b5db763d6dbefc100 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 17 Nov 2025 18:08:37 +0000 Subject: [PATCH 080/106] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 28e8c2ef6f..af727fc992 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Kittygyat - changes: - - message: Added a handheld station map to the borg thruster module! - type: Add - id: 8710 - time: '2025-06-24T15:35:39.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38541 - author: PJB3005 changes: - message: Fixed various worn clothing items being invisible when seen through UI, @@ -3924,3 +3917,10 @@ id: 9210 time: '2025-11-17T17:42:27.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41460 +- author: Samuka + changes: + - message: Borg modules now tell which kind of borgs they fit into. + type: Add + id: 9211 + time: '2025-11-17T18:07:29.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41461 From 6e8435e08056ab3da401038020df1a151e2038f2 Mon Sep 17 00:00:00 2001 From: cammusubi <122420207+cammusubi@users.noreply.github.com> Date: Mon, 17 Nov 2025 18:06:15 -0600 Subject: [PATCH 081/106] Per issue #41143, 'ClusterBang' was changed to 'clusterbang' (#41470) Per issue #41143, 'ClusterBang' was changed to display as 'clusterbang' in-game. --- .../Entities/Objects/Weapons/Throwable/scattering_grenades.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/scattering_grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/scattering_grenades.yml index 43ec57e068..6bff4fbd44 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/scattering_grenades.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/scattering_grenades.yml @@ -49,7 +49,7 @@ - type: entity parent: ClusterBang id: ClusterBangFull - name: ClusterBang + name: clusterbang description: Launches three flashbangs after the timer runs out. suffix: Full components: From 9bab0a3287e7e825f431a5646726dbced217d18e Mon Sep 17 00:00:00 2001 From: Samuka <47865393+Samuka-C@users.noreply.github.com> Date: Tue, 18 Nov 2025 14:44:13 -0300 Subject: [PATCH 082/106] add 2 empty lines to xenoborg round end text (#41436) * add 2 empty lines * add one line on the top * swap from the start to the end --- Content.Server/GameTicking/Rules/DeathMatchRuleSystem.cs | 1 + Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs | 1 + Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs | 1 + Content.Server/GameTicking/Rules/SurvivorRuleSystem.cs | 1 + Content.Server/GameTicking/Rules/XenoborgsRuleSystem.cs | 1 + Content.Server/GameTicking/Rules/ZombieRuleSystem.cs | 1 + 6 files changed, 6 insertions(+) diff --git a/Content.Server/GameTicking/Rules/DeathMatchRuleSystem.cs b/Content.Server/GameTicking/Rules/DeathMatchRuleSystem.cs index 9ae8c5ff83..aafed20704 100644 --- a/Content.Server/GameTicking/Rules/DeathMatchRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/DeathMatchRuleSystem.cs @@ -129,5 +129,6 @@ public sealed class DeathMatchRuleSystem : GameRuleSystem { args.AddLine(Loc.GetString("nukeops-list-name-user", ("name", name), ("user", sessionData.UserName))); } + args.AddLine(""); } private void OnNukeExploded(NukeExplodedEvent ev) diff --git a/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs b/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs index ef773f59d1..d2cd27022f 100644 --- a/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs @@ -118,6 +118,7 @@ public sealed class RevolutionaryRuleSystem : GameRuleSystem args.AddLine(Loc.GetString("survivor-round-end-dead-count", ("deadCount", deadSurvivors))); args.AddLine(Loc.GetString("survivor-round-end-alive-count", ("aliveCount", aliveMarooned))); args.AddLine(Loc.GetString("survivor-round-end-alive-on-shuttle-count", ("aliveCount", aliveOnShuttle))); + args.AddLine(""); // Player manifest at EOR shows who's a survivor so no need for extra info here. } diff --git a/Content.Server/GameTicking/Rules/XenoborgsRuleSystem.cs b/Content.Server/GameTicking/Rules/XenoborgsRuleSystem.cs index 8d13578301..21b987eb0e 100644 --- a/Content.Server/GameTicking/Rules/XenoborgsRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/XenoborgsRuleSystem.cs @@ -85,6 +85,7 @@ public sealed class XenoborgsRuleSystem : GameRuleSystem { args.AddLine(Loc.GetString("xenoborgs-list", ("name", name), ("user", sessionData.UserName))); } + args.AddLine(""); } private void CheckRoundEnd(XenoborgsRuleComponent xenoborgsRuleComponent) diff --git a/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs b/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs index c6da622bb4..11f8d756a0 100644 --- a/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs @@ -106,6 +106,7 @@ public sealed class ZombieRuleSystem : GameRuleSystem ("name", meta.EntityName), ("username", username))); } + args.AddLine(""); } /// From e3c0e019343fd7378cf21af33f882c17ec9b6a25 Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Tue, 18 Nov 2025 19:09:49 +0100 Subject: [PATCH 083/106] Cleanup TipsSystem, add TippyOnTrigger (#41477) * tippy on trigger and refactor * optional parameter for command --- Content.Client/Tips/TipsSystem.cs | 5 + .../Administration/Commands/TippyCommand.cs | 103 +++++++++ Content.Server/Tips/TipsSystem.cs | 211 +++++------------- Content.Shared/Tips/SharedTipsSystem.cs | 74 ++++++ Content.Shared/Tips/TippyEvent.cs | 38 +++- .../Effects/TippyOnTriggerComponent.cs | 66 ++++++ .../Trigger/Systems/TippyOnTriggerSystem.cs | 49 ++++ .../Locale/en-US/commands/tippy-command.ftl | 2 +- Resources/engineCommandPerms.yml | 5 - 9 files changed, 376 insertions(+), 177 deletions(-) create mode 100644 Content.Client/Tips/TipsSystem.cs create mode 100644 Content.Server/Administration/Commands/TippyCommand.cs create mode 100644 Content.Shared/Tips/SharedTipsSystem.cs create mode 100644 Content.Shared/Trigger/Components/Effects/TippyOnTriggerComponent.cs create mode 100644 Content.Shared/Trigger/Systems/TippyOnTriggerSystem.cs diff --git a/Content.Client/Tips/TipsSystem.cs b/Content.Client/Tips/TipsSystem.cs new file mode 100644 index 0000000000..00fc08437c --- /dev/null +++ b/Content.Client/Tips/TipsSystem.cs @@ -0,0 +1,5 @@ +using Content.Shared.Tips; + +namespace Content.Client.Tips; + +public sealed class TipsSystem : SharedTipsSystem; diff --git a/Content.Server/Administration/Commands/TippyCommand.cs b/Content.Server/Administration/Commands/TippyCommand.cs new file mode 100644 index 0000000000..b79c160706 --- /dev/null +++ b/Content.Server/Administration/Commands/TippyCommand.cs @@ -0,0 +1,103 @@ +using Content.Shared.Administration; +using Content.Shared.Tips; +using Robust.Server.Player; +using Robust.Shared.Console; +using Robust.Shared.Player; +using Robust.Shared.Prototypes; + +namespace Content.Server.Administration.Commands; + +[AdminCommand(AdminFlags.Fun)] +public sealed class TippyCommand : LocalizedEntityCommands +{ + [Dependency] private readonly SharedTipsSystem _tips = default!; + [Dependency] private readonly IPrototypeManager _prototype = default!; + [Dependency] private readonly IPlayerManager _player = default!; + + public override string Command => "tippy"; + + public override void Execute(IConsoleShell shell, string argStr, string[] args) + { + if (args.Length < 2) + { + shell.WriteLine(Loc.GetString("cmd-tippy-help")); + return; + } + + ICommonSession? targetSession = null; + if (args[0] != "all") + { + if (!_player.TryGetSessionByUsername(args[0], out targetSession)) + { + shell.WriteLine(Loc.GetString("cmd-tippy-error-no-user")); + return; + } + } + + var msg = args[1]; + + EntProtoId? prototype = null; + if (args.Length > 2) + { + if (args[2] == "null") + prototype = null; + else if (!_prototype.HasIndex(args[2])) + { + shell.WriteError(Loc.GetString("cmd-tippy-error-no-prototype", ("proto", args[2]))); + return; + } + else + prototype = args[2]; + } + + var speakTime = _tips.GetSpeechTime(msg); + var slideTime = 3f; + var waddleInterval = 0.5f; + + if (args.Length > 3 && float.TryParse(args[3], out var parsedSpeakTime)) + speakTime = parsedSpeakTime; + + if (args.Length > 4 && float.TryParse(args[4], out var parsedSlideTime)) + slideTime = parsedSlideTime; + + if (args.Length > 5 && float.TryParse(args[5], out var parsedWaddleInterval)) + waddleInterval = parsedWaddleInterval; + + if (targetSession != null) // send to specified player + _tips.SendTippy(targetSession, msg, prototype, speakTime, slideTime, waddleInterval); + else // send to everyone + _tips.SendTippy(msg, prototype, speakTime, slideTime, waddleInterval); + } + + public override CompletionResult GetCompletion(IConsoleShell shell, string[] args) + { + return args.Length switch + { + 1 => CompletionResult.FromHintOptions( + CompletionHelper.SessionNames(players: _player), + Loc.GetString("cmd-tippy-auto-1")), + 2 => CompletionResult.FromHint(Loc.GetString("cmd-tippy-auto-2")), + 3 => CompletionResult.FromHintOptions( + CompletionHelper.PrototypeIdsLimited(args[2], _prototype), + Loc.GetString("cmd-tippy-auto-3")), + 4 => CompletionResult.FromHint(Loc.GetString("cmd-tippy-auto-4")), + 5 => CompletionResult.FromHint(Loc.GetString("cmd-tippy-auto-5")), + 6 => CompletionResult.FromHint(Loc.GetString("cmd-tippy-auto-6")), + _ => CompletionResult.Empty + }; + } +} + +[AdminCommand(AdminFlags.Fun)] +public sealed class TipCommand : LocalizedEntityCommands +{ + [Dependency] private readonly SharedTipsSystem _tips = default!; + + public override string Command => "tip"; + + public override void Execute(IConsoleShell shell, string argStr, string[] args) + { + _tips.AnnounceRandomTip(); + _tips.RecalculateNextTipTime(); + } +} diff --git a/Content.Server/Tips/TipsSystem.cs b/Content.Server/Tips/TipsSystem.cs index cd7f7b52f5..406ee76ca6 100644 --- a/Content.Server/Tips/TipsSystem.cs +++ b/Content.Server/Tips/TipsSystem.cs @@ -4,10 +4,7 @@ using Content.Shared.CCVar; using Content.Shared.Chat; using Content.Shared.Dataset; using Content.Shared.Tips; -using Robust.Server.GameObjects; -using Robust.Server.Player; using Robust.Shared.Configuration; -using Robust.Shared.Console; using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Random; @@ -15,10 +12,7 @@ using Robust.Shared.Timing; namespace Content.Server.Tips; -/// -/// Handles periodically displaying gameplay tips to all players ingame. -/// -public sealed class TipsSystem : EntitySystem +public sealed class TipsSystem : SharedTipsSystem { [Dependency] private readonly IChatManager _chat = default!; [Dependency] private readonly IPrototypeManager _prototype = default!; @@ -26,8 +20,6 @@ public sealed class TipsSystem : EntitySystem [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly GameTicker _ticker = default!; - [Dependency] private readonly IConsoleHost _conHost = default!; - [Dependency] private readonly IPlayerManager _playerManager = default!; private bool _tipsEnabled; private float _tipTimeOutOfRound; @@ -35,16 +27,6 @@ public sealed class TipsSystem : EntitySystem private string _tipsDataset = ""; private float _tipTippyChance; - /// - /// Always adds this time to a speech message. This is so really short message stay around for a bit. - /// - private const float SpeechBuffer = 3f; - - /// - /// Expected reading speed. - /// - private const float Wpm = 180f; - [ViewVariables(VVAccess.ReadWrite)] private TimeSpan _nextTipTime = TimeSpan.Zero; @@ -53,110 +35,45 @@ public sealed class TipsSystem : EntitySystem base.Initialize(); SubscribeLocalEvent(OnGameRunLevelChanged); - Subs.CVar(_cfg, CCVars.TipFrequencyOutOfRound, SetOutOfRound, true); - Subs.CVar(_cfg, CCVars.TipFrequencyInRound, SetInRound, true); Subs.CVar(_cfg, CCVars.TipsEnabled, SetEnabled, true); - Subs.CVar(_cfg, CCVars.TipsDataset, SetDataset, true); - Subs.CVar(_cfg, CCVars.TipsTippyChance, SetTippyChance, true); + Subs.CVar(_cfg, CCVars.TipFrequencyOutOfRound, value => _tipTimeOutOfRound = value, true); + Subs.CVar(_cfg, CCVars.TipFrequencyInRound, value => _tipTimeInRound = value, true); + Subs.CVar(_cfg, CCVars.TipsDataset, value => _tipsDataset = value, true); + Subs.CVar(_cfg, CCVars.TipsTippyChance, value => _tipTippyChance = value, true); RecalculateNextTipTime(); - _conHost.RegisterCommand("tippy", Loc.GetString("cmd-tippy-desc"), Loc.GetString("cmd-tippy-help"), SendTippy, SendTippyHelper); - _conHost.RegisterCommand("tip", Loc.GetString("cmd-tip-desc"), "tip", SendTip); } - private CompletionResult SendTippyHelper(IConsoleShell shell, string[] args) + private void OnGameRunLevelChanged(GameRunLevelChangedEvent ev) { - return args.Length switch + // reset for lobby -> inround + // reset for inround -> post but not post -> lobby + if (ev.New == GameRunLevel.InRound || ev.Old == GameRunLevel.InRound) { - 1 => CompletionResult.FromHintOptions( - CompletionHelper.SessionNames(players: _playerManager), - Loc.GetString("cmd-tippy-auto-1")), - 2 => CompletionResult.FromHint(Loc.GetString("cmd-tippy-auto-2")), - 3 => CompletionResult.FromHintOptions( - CompletionHelper.PrototypeIdsLimited(args[2], _prototype), - Loc.GetString("cmd-tippy-auto-3")), - 4 => CompletionResult.FromHint(Loc.GetString("cmd-tippy-auto-4")), - 5 => CompletionResult.FromHint(Loc.GetString("cmd-tippy-auto-5")), - 6 => CompletionResult.FromHint(Loc.GetString("cmd-tippy-auto-6")), - _ => CompletionResult.Empty - }; + RecalculateNextTipTime(); + } } - private void SendTip(IConsoleShell shell, string argstr, string[] args) + private void SetEnabled(bool value) { - AnnounceRandomTip(); - RecalculateNextTipTime(); + _tipsEnabled = value; + + if (_nextTipTime != TimeSpan.Zero) + RecalculateNextTipTime(); } - private void SendTippy(IConsoleShell shell, string argstr, string[] args) + public override void RecalculateNextTipTime() { - if (args.Length < 2) + if (_ticker.RunLevel == GameRunLevel.InRound) { - shell.WriteLine(Loc.GetString("cmd-tippy-help")); - return; + _nextTipTime = _timing.CurTime + TimeSpan.FromSeconds(_tipTimeInRound); } - - ActorComponent? actor = null; - if (args[0] != "all") - { - ICommonSession? session; - if (args.Length > 0) - { - // Get player entity - if (!_playerManager.TryGetSessionByUsername(args[0], out session)) - { - shell.WriteLine(Loc.GetString("cmd-tippy-error-no-user")); - return; - } - } - else - { - session = shell.Player; - } - - if (session?.AttachedEntity is not { } user) - { - shell.WriteLine(Loc.GetString("cmd-tippy-error-no-user")); - return; - } - - if (!TryComp(user, out actor)) - { - shell.WriteError(Loc.GetString("cmd-tippy-error-no-user")); - return; - } - } - - var ev = new TippyEvent(args[1]); - - if (args.Length > 2) - { - ev.Proto = args[2]; - if (!_prototype.HasIndex(args[2])) - { - shell.WriteError(Loc.GetString("cmd-tippy-error-no-prototype", ("proto", args[2]))); - return; - } - } - - if (args.Length > 3) - ev.SpeakTime = float.Parse(args[3]); else - ev.SpeakTime = GetSpeechTime(ev.Msg); - - if (args.Length > 4) - ev.SlideTime = float.Parse(args[4]); - - if (args.Length > 5) - ev.WaddleInterval = float.Parse(args[5]); - - if (actor != null) - RaiseNetworkEvent(ev, actor.PlayerSession); - else - RaiseNetworkEvent(ev); + { + _nextTipTime = _timing.CurTime + TimeSpan.FromSeconds(_tipTimeOutOfRound); + } } - public override void Update(float frameTime) { base.Update(frameTime); @@ -171,41 +88,30 @@ public sealed class TipsSystem : EntitySystem } } - private void SetOutOfRound(float value) + public override void SendTippy( + string message, + EntProtoId? prototype = null, + float speakTime = 5f, + float slideTime = 3f, + float waddleInterval = 0.5f) { - _tipTimeOutOfRound = value; + var ev = new TippyEvent(message, prototype, speakTime, slideTime, waddleInterval); + RaiseNetworkEvent(ev); } - private void SetInRound(float value) + public override void SendTippy( + ICommonSession session, + string message, + EntProtoId? prototype = null, + float speakTime = 5f, + float slideTime = 3f, + float waddleInterval = 0.5f) { - _tipTimeInRound = value; + var ev = new TippyEvent(message, prototype, speakTime, slideTime, waddleInterval); + RaiseNetworkEvent(ev, session); } - private void SetEnabled(bool value) - { - _tipsEnabled = value; - - if (_nextTipTime != TimeSpan.Zero) - RecalculateNextTipTime(); - } - - private void SetDataset(string value) - { - _tipsDataset = value; - } - - private void SetTippyChance(float value) - { - _tipTippyChance = value; - } - - public static float GetSpeechTime(string text) - { - var wordCount = (float)text.Split().Length; - return SpeechBuffer + wordCount * (60f / Wpm); - } - - private void AnnounceRandomTip() + public override void AnnounceRandomTip() { if (!_prototype.TryIndex(_tipsDataset, out var tips)) return; @@ -215,35 +121,20 @@ public sealed class TipsSystem : EntitySystem if (_random.Prob(_tipTippyChance)) { - var ev = new TippyEvent(msg); - ev.SpeakTime = GetSpeechTime(msg); - RaiseNetworkEvent(ev); - } else - { - _chat.ChatMessageToManyFiltered(Filter.Broadcast(), ChatChannel.OOC, tip, msg, - EntityUid.Invalid, false, false, Color.MediumPurple); - } - } - - private void RecalculateNextTipTime() - { - if (_ticker.RunLevel == GameRunLevel.InRound) - { - _nextTipTime = _timing.CurTime + TimeSpan.FromSeconds(_tipTimeInRound); + var speakTime = GetSpeechTime(msg); + SendTippy(msg, speakTime: speakTime); } else { - _nextTipTime = _timing.CurTime + TimeSpan.FromSeconds(_tipTimeOutOfRound); - } - } - - private void OnGameRunLevelChanged(GameRunLevelChangedEvent ev) - { - // reset for lobby -> inround - // reset for inround -> post but not post -> lobby - if (ev.New == GameRunLevel.InRound || ev.Old == GameRunLevel.InRound) - { - RecalculateNextTipTime(); + _chat.ChatMessageToManyFiltered( + Filter.Broadcast(), + ChatChannel.OOC, + tip, + msg, + EntityUid.Invalid, + false, + false, + Color.MediumPurple); } } } diff --git a/Content.Shared/Tips/SharedTipsSystem.cs b/Content.Shared/Tips/SharedTipsSystem.cs new file mode 100644 index 0000000000..1973aae1a3 --- /dev/null +++ b/Content.Shared/Tips/SharedTipsSystem.cs @@ -0,0 +1,74 @@ +using Content.Shared.CCVar; +using Robust.Shared.Player; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Tips; + +/// +/// Handles periodically displaying gameplay tips to all players ingame. +/// +public abstract class SharedTipsSystem : EntitySystem +{ + /// + /// Always adds this time to a speech message. This is so really short message stay around for a bit. + /// + private const float SpeechBuffer = 3f; + + /// + /// Expected reading speed. + /// + private const float Wpm = 180f; + + /// + /// Send a tippy message to all clients. + /// + /// The text to show in the speech bubble. + /// The entity to show. Defaults to tippy. + /// The time the speech bubble is shown, in seconds. + /// The time the entity takes to walk onto the screen, in seconds. + /// The time between waddle animation steps, in seconds. + public virtual void SendTippy( + string message, + EntProtoId? prototype = null, + float speakTime = 5f, + float slideTime = 3f, + float waddleInterval = 0.5f) + { } + + /// + /// Send a tippy message to the given player session. + /// + /// The player session to send the message to. + /// The text to show in the speech bubble. + /// The entity to show. Defaults to tippy. + /// The time the speech bubble is shown, in seconds. + /// The time the entity takes to walk onto the screen, in seconds. + /// The time between waddle animation steps, in seconds. + public virtual void SendTippy( + ICommonSession session, + string message, + EntProtoId? prototype = null, + float speakTime = 5f, + float slideTime = 3f, + float waddleInterval = 0.5f) + { } + + /// + /// Send a random tippy message from the dataset given in . + /// + public virtual void AnnounceRandomTip() { } + + /// + /// Set a random time stamp for the next automatic game tip. + /// + public virtual void RecalculateNextTipTime() { } + + /// + /// Calculate the recommended speak time for a given message. + /// + public float GetSpeechTime(string text) + { + var wordCount = (float)text.Split().Length; + return SpeechBuffer + wordCount * (60f / Wpm); + } +} diff --git a/Content.Shared/Tips/TippyEvent.cs b/Content.Shared/Tips/TippyEvent.cs index e5dc0b7f35..c6b028aa31 100644 --- a/Content.Shared/Tips/TippyEvent.cs +++ b/Content.Shared/Tips/TippyEvent.cs @@ -1,21 +1,37 @@ +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; namespace Content.Shared.Tips; +/// +/// Networked event that makes a client show a message on their screen using tippy or another protoype. +/// [Serializable, NetSerializable] -public sealed class TippyEvent : EntityEventArgs +public sealed class TippyEvent(string msg, EntProtoId? proto, float speakTime, float slideTime, float waddleInterval) : EntityEventArgs { - public TippyEvent(string msg) - { - Msg = msg; - } + /// + /// The text to show in the speech bubble. + /// + public string Msg = msg; - public string Msg; - public string? Proto; + /// + /// The entity to show. Defaults to tippy. + /// + public EntProtoId? Proto = proto; - // TODO: Why are these defaults even here, have the caller specify. This get overriden only most of the time. - public float SpeakTime = 5; - public float SlideTime = 3; - public float WaddleInterval = 0.5f; + /// + /// The time the speech bubble is shown, in seconds. + /// + public float SpeakTime = speakTime; + + /// + /// The time the entity takes to walk onto the screen, in seconds. + /// + public float SlideTime = slideTime; + + /// + /// The time between waddle animation steps, in seconds. + /// + public float WaddleInterval = waddleInterval; } diff --git a/Content.Shared/Trigger/Components/Effects/TippyOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/TippyOnTriggerComponent.cs new file mode 100644 index 0000000000..9476d9ea1c --- /dev/null +++ b/Content.Shared/Trigger/Components/Effects/TippyOnTriggerComponent.cs @@ -0,0 +1,66 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Trigger.Components.Effects; + +/// +/// Sends a tippy message to either the entity or all players when triggered. +/// If TargetUser is true the user will receive the message. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class TippyOnTriggerComponent : BaseXOnTriggerComponent +{ + /// + /// Unlocalized message text to send to the player(s). + /// Intended only for admeme purposes. For anything else you should use instead. + /// + [DataField, AutoNetworkedField] + public string Message = string.Empty; + + /// + /// Localized message text to send to the player(s). + /// This has priority over . + /// + [DataField, AutoNetworkedField] + public LocId? LocMessage; + + /// + /// If true the message will be send to all players. + /// If false it will be send to the user or owning entity, depending on . + /// + [DataField, AutoNetworkedField] + public bool SendToAll; + + /// + /// The entity prototype to show to the client. + /// Will default to tippy if null. + /// + [DataField, AutoNetworkedField] + public EntProtoId? Prototype; + + /// + /// Use the prototype of the entity owning this component? + /// Will take priority over . + /// + [DataField, AutoNetworkedField] + public bool UseOwnerPrototype; + + /// + /// The time the speech bubble is shown, in seconds. + /// Will be calculated automatically from the message length if null. + /// + [DataField, AutoNetworkedField] + public float? SpeakTime; + + /// + /// The time the entity takes to walk onto the screen, in seconds. + /// + [DataField, AutoNetworkedField] + public float SlideTime = 3f; + + /// + /// The time between waddle animation steps, in seconds. + /// + [DataField, AutoNetworkedField] + public float WaddleInterval = 0.5f; +} diff --git a/Content.Shared/Trigger/Systems/TippyOnTriggerSystem.cs b/Content.Shared/Trigger/Systems/TippyOnTriggerSystem.cs new file mode 100644 index 0000000000..10c55490af --- /dev/null +++ b/Content.Shared/Trigger/Systems/TippyOnTriggerSystem.cs @@ -0,0 +1,49 @@ +using Content.Shared.Tips; +using Content.Shared.Trigger.Components.Effects; +using Robust.Shared.Player; + +namespace Content.Shared.Trigger.Systems; + +public sealed class TippyOnTriggerSystem : EntitySystem +{ + [Dependency] private readonly SharedTipsSystem _tips = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnTrigger); + } + + private void OnTrigger(Entity ent, ref TriggerEvent args) + { + if (args.Key != null && !ent.Comp.KeysIn.Contains(args.Key)) + return; + + var msg = ent.Comp.Message; + var prototype = ent.Comp.Prototype; + + if (ent.Comp.LocMessage != null) + msg = Loc.GetString(ent.Comp.LocMessage.Value); + + if (ent.Comp.UseOwnerPrototype) + prototype = Prototype(ent)?.ID; + + var speakTime = ent.Comp.SpeakTime ?? _tips.GetSpeechTime(msg); + + if (ent.Comp.SendToAll) + { + _tips.SendTippy(msg, prototype, speakTime, ent.Comp.SlideTime, ent.Comp.WaddleInterval); + } + else + { + var target = ent.Comp.TargetUser ? args.User : ent.Owner; + if (!TryComp(target, out var actor)) + return; + + _tips.SendTippy(actor.PlayerSession, msg, prototype, speakTime, ent.Comp.SlideTime, ent.Comp.WaddleInterval); + } + + args.Handled = true; + } +} diff --git a/Resources/Locale/en-US/commands/tippy-command.ftl b/Resources/Locale/en-US/commands/tippy-command.ftl index 6b9a95a1dd..f814506009 100644 --- a/Resources/Locale/en-US/commands/tippy-command.ftl +++ b/Resources/Locale/en-US/commands/tippy-command.ftl @@ -1,5 +1,5 @@ cmd-tippy-desc = Broadcast a message as Tippy the clown. -cmd-tippy-help = tippy [entity prototype] [speak time] [slide time] [waddle interval] +cmd-tippy-help = tippy [entity prototype | null] [speak time] [slide time] [waddle interval] cmd-tippy-auto-1 = cmd-tippy-auto-2 = message cmd-tippy-auto-3 = entity prototype diff --git a/Resources/engineCommandPerms.yml b/Resources/engineCommandPerms.yml index 194d05d13d..4520a1da2d 100644 --- a/Resources/engineCommandPerms.yml +++ b/Resources/engineCommandPerms.yml @@ -96,11 +96,6 @@ Commands: - listplayers -- Flags: FUN - Commands: - - tippy - - tip - - Flags: SERVER Commands: - delete From 414817e38a78d4b47334460a82a53e29d4579685 Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Wed, 19 Nov 2025 02:58:50 +0100 Subject: [PATCH 084/106] AddTagOnTrigger, RemoveTagOnTrigger, SwapPositionOnTrigger, JitterOnTrigger (#41476) * more triggers * comment --------- Co-authored-by: iaada --- .../Effects/AddTagsOnTriggerComponent.cs | 20 ++++++++ .../Effects/JitterOnTriggerComponent.cs | 47 +++++++++++++++++++ .../Effects/RemoveTagsOnTriggerComponent.cs | 20 ++++++++ .../Effects/SwapLocationOnTriggerComponent.cs | 10 ++++ .../Trigger/Systems/JitterOnTriggerSystem.cs | 20 ++++++++ .../Systems/SwapLocationOnTriggerSystem.cs | 30 ++++++++++++ .../Trigger/Systems/TagOnTriggerSystem.cs | 26 ++++++++++ 7 files changed, 173 insertions(+) create mode 100644 Content.Shared/Trigger/Components/Effects/AddTagsOnTriggerComponent.cs create mode 100644 Content.Shared/Trigger/Components/Effects/JitterOnTriggerComponent.cs create mode 100644 Content.Shared/Trigger/Components/Effects/RemoveTagsOnTriggerComponent.cs create mode 100644 Content.Shared/Trigger/Components/Effects/SwapLocationOnTriggerComponent.cs create mode 100644 Content.Shared/Trigger/Systems/JitterOnTriggerSystem.cs create mode 100644 Content.Shared/Trigger/Systems/SwapLocationOnTriggerSystem.cs create mode 100644 Content.Shared/Trigger/Systems/TagOnTriggerSystem.cs diff --git a/Content.Shared/Trigger/Components/Effects/AddTagsOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/AddTagsOnTriggerComponent.cs new file mode 100644 index 0000000000..9e73a60741 --- /dev/null +++ b/Content.Shared/Trigger/Components/Effects/AddTagsOnTriggerComponent.cs @@ -0,0 +1,20 @@ +using Content.Shared.Tag; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Trigger.Components.Effects; + +/// +/// Adds the given tags when triggered. +/// If TargetUser is true the tags will be added to the user instead. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class AddTagsOnTriggerComponent : BaseXOnTriggerComponent +{ + /// + /// The tags to add. + /// + [DataField, AutoNetworkedField] + public List> Tags = new(); +} + diff --git a/Content.Shared/Trigger/Components/Effects/JitterOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/JitterOnTriggerComponent.cs new file mode 100644 index 0000000000..340ad6cb01 --- /dev/null +++ b/Content.Shared/Trigger/Components/Effects/JitterOnTriggerComponent.cs @@ -0,0 +1,47 @@ +using Content.Shared.StatusEffect; +using Robust.Shared.GameStates; + +namespace Content.Shared.Trigger.Components.Effects; + +/// +/// Makes the entity play a jitter animation when triggered. +/// If TargetUser is true the user will jitter instead. +/// +/// +/// The target requires . +/// TODO: Convert jitter to the new status effects system. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class JitterOnTriggerComponent : BaseXOnTriggerComponent +{ + /// + /// Jitteriness of the animation. + /// + [DataField, AutoNetworkedField] + public float Amplitude = 10.0f; + + /// + /// Frequency for jittering. + /// + [DataField, AutoNetworkedField] + public float Frequency = 4.0f; + + /// + /// For how much time to apply the effect. + /// + [DataField, AutoNetworkedField] + public TimeSpan Time = TimeSpan.FromSeconds(2); + + /// + /// The status effect cooldown should be refreshed (true) or accumulated (false). + /// + [DataField, AutoNetworkedField] + public bool Refresh; + + /// + /// Whether to change any existing jitter value even if they're greater than the ones we're setting. + /// + [DataField, AutoNetworkedField] + public bool ForceValueChange; +} + diff --git a/Content.Shared/Trigger/Components/Effects/RemoveTagsOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/RemoveTagsOnTriggerComponent.cs new file mode 100644 index 0000000000..8e4d0e4611 --- /dev/null +++ b/Content.Shared/Trigger/Components/Effects/RemoveTagsOnTriggerComponent.cs @@ -0,0 +1,20 @@ +using Content.Shared.Tag; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Trigger.Components.Effects; + +/// +/// Remove the given tags when triggered. +/// If TargetUser is true the tags will be added to the user instead. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class RemoveTagsOnTriggerComponent : BaseXOnTriggerComponent +{ + /// + /// The tags to remove. + /// + [DataField, AutoNetworkedField] + public List> Tags = new(); +} + diff --git a/Content.Shared/Trigger/Components/Effects/SwapLocationOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/SwapLocationOnTriggerComponent.cs new file mode 100644 index 0000000000..33cec1d56d --- /dev/null +++ b/Content.Shared/Trigger/Components/Effects/SwapLocationOnTriggerComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Trigger.Components.Effects; + +/// +/// Swaps the location of the target and the user of the trigger when triggered. +/// is ignored. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class SwapLocationOnTriggerComponent : BaseXOnTriggerComponent; diff --git a/Content.Shared/Trigger/Systems/JitterOnTriggerSystem.cs b/Content.Shared/Trigger/Systems/JitterOnTriggerSystem.cs new file mode 100644 index 0000000000..5a9e0463ed --- /dev/null +++ b/Content.Shared/Trigger/Systems/JitterOnTriggerSystem.cs @@ -0,0 +1,20 @@ +using Content.Shared.Jittering; +using Content.Shared.Trigger.Components.Effects; +using Robust.Shared.Network; + +namespace Content.Shared.Trigger.Systems; + +public sealed class JitterOnTriggerSystem : XOnTriggerSystem +{ + [Dependency] private readonly SharedJitteringSystem _jittering = default!; + [Dependency] private readonly INetManager _net = default!; + + protected override void OnTrigger(Entity ent, EntityUid target, ref TriggerEvent args) + { + // DoJitter mispredicts at the moment. + // TODO: Fix this and remove the IsServer check. + if (_net.IsServer) + _jittering.DoJitter(target, ent.Comp.Time, ent.Comp.Refresh, ent.Comp.Amplitude, ent.Comp.Frequency, ent.Comp.ForceValueChange); + args.Handled = true; + } +} diff --git a/Content.Shared/Trigger/Systems/SwapLocationOnTriggerSystem.cs b/Content.Shared/Trigger/Systems/SwapLocationOnTriggerSystem.cs new file mode 100644 index 0000000000..7b3004ad59 --- /dev/null +++ b/Content.Shared/Trigger/Systems/SwapLocationOnTriggerSystem.cs @@ -0,0 +1,30 @@ +using Content.Shared.Trigger.Components.Effects; +using Robust.Shared.Network; + +namespace Content.Shared.Trigger.Systems; + +public sealed class SwapLocationOnTriggerSystem : EntitySystem +{ + [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly INetManager _net = default!; + + public override void Initialize() + { + SubscribeLocalEvent(OnTrigger); + } + + private void OnTrigger(Entity ent, ref TriggerEvent args) + { + if (args.Key != null && !ent.Comp.KeysIn.Contains(args.Key)) + return; + + if (args.User == null) + return; + + // SwapPositions mispredicts at the moment. + // TODO: Fix this and remove the IsServer check. + if (_net.IsServer) + _transform.SwapPositions(ent.Owner, args.User.Value); + args.Handled = true; + } +} diff --git a/Content.Shared/Trigger/Systems/TagOnTriggerSystem.cs b/Content.Shared/Trigger/Systems/TagOnTriggerSystem.cs new file mode 100644 index 0000000000..d636593d43 --- /dev/null +++ b/Content.Shared/Trigger/Systems/TagOnTriggerSystem.cs @@ -0,0 +1,26 @@ +using Content.Shared.Tag; +using Content.Shared.Trigger.Components.Effects; + +namespace Content.Shared.Trigger.Systems; + +public sealed class AddTagsOnTriggerSystem : XOnTriggerSystem +{ + [Dependency] private readonly TagSystem _tag = default!; + + protected override void OnTrigger(Entity ent, EntityUid target, ref TriggerEvent args) + { + _tag.AddTags(target, ent.Comp.Tags); + args.Handled = true; + } +} + +public sealed class RemoveTagsOnTriggerSystem : XOnTriggerSystem +{ + [Dependency] private readonly TagSystem _tag = default!; + + protected override void OnTrigger(Entity ent, EntityUid target, ref TriggerEvent args) + { + _tag.RemoveTags(target, ent.Comp.Tags); + args.Handled = true; + } +} From 78101bceac50a6db103e08fba4a44dd65a726fb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=81da?= Date: Tue, 18 Nov 2025 20:05:13 -0600 Subject: [PATCH 085/106] 5 new triggers: EmptyContainers, Knockdown, Stun, TriggerOnThrowDoHit (#41472) * ideas * finish components * systems * one more * requested --------- Co-authored-by: iaada --- .../CleanContainersOnTriggerComponent.cs | 22 +++++ .../EmptyContainersOnTriggerComponent.cs | 22 +++++ .../Effects/KnockdownOnTriggerComponent.cs | 36 +++++++++ .../Effects/StunOnTriggerComponent.cs | 24 ++++++ .../Triggers/TriggerOnThrowDoHitComponent.cs | 10 +++ .../Systems/EmptyContainersOnTriggerSystem.cs | 81 +++++++++++++++++++ .../Systems/KnockdownOnTriggerSystem.cs | 21 +++++ .../Trigger/Systems/StunOnTriggerSystem.cs | 17 ++++ .../Systems/TriggerOnThrowDoHitSystem.cs | 19 +++++ 9 files changed, 252 insertions(+) create mode 100644 Content.Shared/Trigger/Components/Effects/CleanContainersOnTriggerComponent.cs create mode 100644 Content.Shared/Trigger/Components/Effects/EmptyContainersOnTriggerComponent.cs create mode 100644 Content.Shared/Trigger/Components/Effects/KnockdownOnTriggerComponent.cs create mode 100644 Content.Shared/Trigger/Components/Effects/StunOnTriggerComponent.cs create mode 100644 Content.Shared/Trigger/Components/Triggers/TriggerOnThrowDoHitComponent.cs create mode 100644 Content.Shared/Trigger/Systems/EmptyContainersOnTriggerSystem.cs create mode 100644 Content.Shared/Trigger/Systems/KnockdownOnTriggerSystem.cs create mode 100644 Content.Shared/Trigger/Systems/StunOnTriggerSystem.cs create mode 100644 Content.Shared/Trigger/Systems/TriggerOnThrowDoHitSystem.cs diff --git a/Content.Shared/Trigger/Components/Effects/CleanContainersOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/CleanContainersOnTriggerComponent.cs new file mode 100644 index 0000000000..bf4e1841b1 --- /dev/null +++ b/Content.Shared/Trigger/Components/Effects/CleanContainersOnTriggerComponent.cs @@ -0,0 +1,22 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Trigger.Components.Effects; + +/// +/// Trigger effect for removing and *deleting* all items in container(s) on the target. +/// +/// +/// Be very careful when setting to true or all your organs might fall out. +/// In fact, never set it to true. +/// +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class CleanContainersOnTriggerComponent : BaseXOnTriggerComponent +{ + /// + /// Names of containers to empty. + /// If null, all containers will be emptied. + /// + [DataField, AutoNetworkedField] + public List? Container; +} diff --git a/Content.Shared/Trigger/Components/Effects/EmptyContainersOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/EmptyContainersOnTriggerComponent.cs new file mode 100644 index 0000000000..de55e1f3ac --- /dev/null +++ b/Content.Shared/Trigger/Components/Effects/EmptyContainersOnTriggerComponent.cs @@ -0,0 +1,22 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Trigger.Components.Effects; + +/// +/// Trigger effect for removing all items in container(s) on the target. +/// +/// +/// Be very careful when setting to true or all your organs might fall out. +/// In fact, never set it to true. +/// +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class EmptyContainersOnTriggerComponent : BaseXOnTriggerComponent +{ + /// + /// Names of containers to empty. + /// If null, all containers will be emptied. + /// + [DataField, AutoNetworkedField] + public List? Container; +} diff --git a/Content.Shared/Trigger/Components/Effects/KnockdownOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/KnockdownOnTriggerComponent.cs new file mode 100644 index 0000000000..33809130c2 --- /dev/null +++ b/Content.Shared/Trigger/Components/Effects/KnockdownOnTriggerComponent.cs @@ -0,0 +1,36 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Trigger.Components.Effects; + +/// +/// Trigger effect for sending the target sidewise (crawling). +/// Knockdowns the user if is true. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class KnockdownOnTriggerComponent : BaseXOnTriggerComponent +{ + /// + /// How long the target is forced to be on the ground. + /// + [DataField, AutoNetworkedField] + public TimeSpan KnockdownAmount = TimeSpan.FromSeconds(1); + + /// + /// If true, refresh the duration. + /// If false, time is added on-top of any existing forced knockdown. + /// + [DataField, AutoNetworkedField] + public bool Refresh = true; + + /// + /// Should the entity try and stand automatically? + /// + [DataField, AutoNetworkedField] + public bool AutoStand = true; + + /// + /// Should the entity drop their items upon first being knocked down? + /// + [DataField, AutoNetworkedField] + public bool Drop = true; +} diff --git a/Content.Shared/Trigger/Components/Effects/StunOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/StunOnTriggerComponent.cs new file mode 100644 index 0000000000..ebe55dc102 --- /dev/null +++ b/Content.Shared/Trigger/Components/Effects/StunOnTriggerComponent.cs @@ -0,0 +1,24 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Trigger.Components.Effects; + +/// +/// Trigger effect for stunning an entity. +/// Stuns the user if is true. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class StunOnTriggerComponent : BaseXOnTriggerComponent +{ + /// + /// How long to stun the target. + /// + [DataField, AutoNetworkedField] + public TimeSpan StunAmount = TimeSpan.FromSeconds(1); + + /// + /// If true, refresh the stun duration. + /// If false, stun is added on-top of any existing stun. + /// + [DataField, AutoNetworkedField] + public bool Refresh = true; +} diff --git a/Content.Shared/Trigger/Components/Triggers/TriggerOnThrowDoHitComponent.cs b/Content.Shared/Trigger/Components/Triggers/TriggerOnThrowDoHitComponent.cs new file mode 100644 index 0000000000..4e832993b5 --- /dev/null +++ b/Content.Shared/Trigger/Components/Triggers/TriggerOnThrowDoHitComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Trigger.Components.Triggers; + +/// +/// Trigger for when this entity is thrown and then hits a second entity. +/// User is the entity hit. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class TriggerOnThrowDoHitComponent : BaseTriggerOnXComponent; diff --git a/Content.Shared/Trigger/Systems/EmptyContainersOnTriggerSystem.cs b/Content.Shared/Trigger/Systems/EmptyContainersOnTriggerSystem.cs new file mode 100644 index 0000000000..dbe1601022 --- /dev/null +++ b/Content.Shared/Trigger/Systems/EmptyContainersOnTriggerSystem.cs @@ -0,0 +1,81 @@ +using Content.Shared.Trigger.Components.Effects; +using Robust.Shared.Containers; + +namespace Content.Shared.Trigger.Systems; + +/// +/// Empty containers trigger system. +/// +public sealed class EmptyContainersOnTriggerSystem : XOnTriggerSystem +{ + [Dependency] private readonly SharedContainerSystem _container = default!; + + protected override void OnTrigger(Entity ent, EntityUid target, ref TriggerEvent args) + { + if (!TryComp(target, out var containerComp)) + return; + + // Empty everything. Make sure a player isn't the target because they will get removed from their body along with their organs + if (ent.Comp.Container is null) + { + foreach (var container in _container.GetAllContainers(target, containerComp)) + { + _container.EmptyContainer(container); + } + + args.Handled = true; + } + + // Empty containers in a sane way + else + { + foreach (var containerId in ent.Comp.Container) + { + if (!_container.TryGetContainer(target, containerId, out var container, containerComp)) + continue; + + _container.EmptyContainer(container); + args.Handled = true; + } + } + } +} + +/// +/// Empty containers and delete items trigger system. +/// +public sealed class CleanContainersOnTriggerSystem : XOnTriggerSystem +{ + [Dependency] private readonly SharedContainerSystem _container = default!; + + protected override void OnTrigger(Entity ent, EntityUid target, ref TriggerEvent args) + { + if (!TryComp(target, out var containerComp)) + return; + + // Empty everything. Make sure a player isn't the target because they will get DELETED + if (ent.Comp.Container is null) + { + foreach (var container in _container.GetAllContainers(target, containerComp)) + { + _container.CleanContainer(container); + } + + args.Handled = true; + } + + // Empty containers in a sane way + else + { + foreach (var containerId in ent.Comp.Container) + { + if (!_container.TryGetContainer(target, containerId, out var container, containerComp)) + continue; + + _container.CleanContainer(container); + args.Handled = true; + } + } + } +} + diff --git a/Content.Shared/Trigger/Systems/KnockdownOnTriggerSystem.cs b/Content.Shared/Trigger/Systems/KnockdownOnTriggerSystem.cs new file mode 100644 index 0000000000..815e00abc8 --- /dev/null +++ b/Content.Shared/Trigger/Systems/KnockdownOnTriggerSystem.cs @@ -0,0 +1,21 @@ +using Content.Shared.Stunnable; +using Content.Shared.Trigger.Components.Effects; + +namespace Content.Shared.Trigger.Systems; + +public sealed class KnockdownOnTriggerSystem : XOnTriggerSystem +{ + [Dependency] private readonly SharedStunSystem _stun = default!; + + protected override void OnTrigger(Entity ent, EntityUid target, ref TriggerEvent args) + { + args.Handled |= _stun.TryKnockdown( + target, + ent.Comp.KnockdownAmount, + ent.Comp.Refresh, + ent.Comp.AutoStand, + ent.Comp.Drop, + true + ); + } +} diff --git a/Content.Shared/Trigger/Systems/StunOnTriggerSystem.cs b/Content.Shared/Trigger/Systems/StunOnTriggerSystem.cs new file mode 100644 index 0000000000..ce86f971d3 --- /dev/null +++ b/Content.Shared/Trigger/Systems/StunOnTriggerSystem.cs @@ -0,0 +1,17 @@ +using Content.Shared.Stunnable; +using Content.Shared.Trigger.Components.Effects; + +namespace Content.Shared.Trigger.Systems; + +public sealed class StunOnTriggerSystem : XOnTriggerSystem +{ + [Dependency] private readonly SharedStunSystem _stun = default!; + + protected override void OnTrigger(Entity ent, EntityUid target, ref TriggerEvent args) + { + if (ent.Comp.Refresh) + args.Handled |= _stun.TryUpdateStunDuration(target, ent.Comp.StunAmount); + else + args.Handled |= _stun.TryAddStunDuration(target, ent.Comp.StunAmount); + } +} diff --git a/Content.Shared/Trigger/Systems/TriggerOnThrowDoHitSystem.cs b/Content.Shared/Trigger/Systems/TriggerOnThrowDoHitSystem.cs new file mode 100644 index 0000000000..ca57b517c6 --- /dev/null +++ b/Content.Shared/Trigger/Systems/TriggerOnThrowDoHitSystem.cs @@ -0,0 +1,19 @@ +using Content.Shared.Throwing; +using Content.Shared.Trigger.Components.Triggers; + +namespace Content.Shared.Trigger.Systems; + +public sealed partial class TriggerOnThrowDoHitSystem : TriggerOnXSystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnHit); + } + + private void OnHit(Entity ent, ref ThrowDoHitEvent args) + { + Trigger.Trigger(ent.Owner, args.Target, ent.Comp.KeyOut); + } +} From 224f0fd5073093662e0b3abf31493c621cf9c78a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=81da?= Date: Tue, 18 Nov 2025 20:08:04 -0600 Subject: [PATCH 086/106] AdminLogOnTrigger (#41474) * commit * requested * also requested * Update Content.Shared/Trigger/Components/Effects/AdminLogOnTriggerComponent.cs --------- Co-authored-by: iaada Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- .../Effects/AdminLogOnTriggerComponent.cs | 34 +++++++++++++++++++ .../Systems/AdminLogOnTriggerSystem.cs | 19 +++++++++++ 2 files changed, 53 insertions(+) create mode 100644 Content.Shared/Trigger/Components/Effects/AdminLogOnTriggerComponent.cs create mode 100644 Content.Shared/Trigger/Systems/AdminLogOnTriggerSystem.cs diff --git a/Content.Shared/Trigger/Components/Effects/AdminLogOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/AdminLogOnTriggerComponent.cs new file mode 100644 index 0000000000..4045f8c12e --- /dev/null +++ b/Content.Shared/Trigger/Components/Effects/AdminLogOnTriggerComponent.cs @@ -0,0 +1,34 @@ +using Content.Shared.Database; +using Content.Shared.Random; +using Content.Shared.Trigger.Components.Triggers; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Trigger.Components.Effects; + +/// +/// This component creates an admin log when receiving a trigger. +/// is ignored. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class AdminLogOnTriggerComponent : BaseXOnTriggerComponent +{ + /// + /// The message displayed in the logs describing what specifically was done by this trigger. + /// This entity and the user will be included alongside the message. + /// + [DataField(required: true), AutoNetworkedField] + public LocId Message = string.Empty; + + /// + /// What type of action took place? + /// + [DataField, AutoNetworkedField] + public LogType LogType = LogType.Trigger; + + /// + /// How important is this trigger? + /// + [DataField, AutoNetworkedField] + public LogImpact LogImpact = LogImpact.Low; +} diff --git a/Content.Shared/Trigger/Systems/AdminLogOnTriggerSystem.cs b/Content.Shared/Trigger/Systems/AdminLogOnTriggerSystem.cs new file mode 100644 index 0000000000..0adf483aed --- /dev/null +++ b/Content.Shared/Trigger/Systems/AdminLogOnTriggerSystem.cs @@ -0,0 +1,19 @@ +using Content.Shared.Administration.Logs; +using Content.Shared.Trigger.Components.Effects; + +namespace Content.Shared.Trigger.Systems; + +public sealed class AdminLogOnTriggerSystem : XOnTriggerSystem +{ + [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; + + protected override void OnTrigger(Entity ent, EntityUid target, ref TriggerEvent args) + { + _adminLogger.Add( + ent.Comp.LogType, + ent.Comp.LogImpact, + $"{ToPrettyString(args.User)} sent a trigger using {ToPrettyString(ent)}: {Loc.GetString(ent.Comp.Message)}" + ); + // Intentionally does not handle the event since this shouldn't affect the gamestate. + } +} From be68bb6c0c22c14f4182e2a78076a0530141f8da Mon Sep 17 00:00:00 2001 From: Hitlinemoss <209321380+Hitlinemoss@users.noreply.github.com> Date: Tue, 18 Nov 2025 21:46:44 -0500 Subject: [PATCH 087/106] Removed redundant clothing from CMO locker; moved neck gaiter from HoS locker to HoS dresser (#41487) --- Resources/Prototypes/Catalog/Fills/Lockers/dressers.yml | 1 + Resources/Prototypes/Catalog/Fills/Lockers/heads.yml | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/dressers.yml b/Resources/Prototypes/Catalog/Fills/Lockers/dressers.yml index e111b51cff..34dafcba20 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/dressers.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/dressers.yml @@ -63,6 +63,7 @@ contents: - id: ClothingHeadHatBeretHoS - id: ClothingHeadHatHoshat + - id: ClothingMaskNeckGaiter - id: ClothingUniformJumpskirtHoSAlt - id: ClothingUniformJumpsuitHoSAlt - id: ClothingUniformJumpskirtHosFormal diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml b/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml index 27ddea1b11..57da744690 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml @@ -205,10 +205,8 @@ children: - id: BoxEncryptionKeyMedical - id: ClothingBackpackDuffelSurgeryFilled - - id: ClothingCloakCmo - id: ClothingEyesHudMedical - id: ClothingHandsGlovesNitrile - - id: ClothingHeadHatBeretCmo - id: ClothingHeadsetAltMedical - id: ClothingMaskSterile - id: DoorRemoteMedical @@ -316,7 +314,6 @@ - id: ClothingBeltSecurityFilled - id: ClothingEyesGlassesSecurity - id: ClothingHeadsetAltSecurity - - id: ClothingMaskNeckGaiter - id: ClothingOuterCoatHoSTrench - id: ClothingShoesBootsJack - id: FlashlightSeclite From 3d46894cb4d2516b2fab1581ab903005ce0cd05f Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 19 Nov 2025 02:59:43 +0000 Subject: [PATCH 088/106] Automatic changelog update --- Resources/Changelog/Changelog.yml | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index af727fc992..024e0c6d5a 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: PJB3005 - changes: - - message: Fixed various worn clothing items being invisible when seen through UI, - such as the examine popups. - type: Fix - id: 8711 - time: '2025-06-24T20:47:29.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38042 - author: AreYouConfused changes: - message: Bulldog bundle now accurately says what is included @@ -3924,3 +3916,12 @@ id: 9211 time: '2025-11-17T18:07:29.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41461 +- author: Hitlinemoss + changes: + - message: The CMO's locker no longer contains a duplicate beret/cloak. + type: Fix + - message: The neck gaiter in the HoS's locker has been moved to their dresser. + type: Fix + id: 9212 + time: '2025-11-19T02:58:33.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41487 From 00ba4595a89f9ef84d7c0687dbaf79fbb1279aa5 Mon Sep 17 00:00:00 2001 From: Tiniest Shark Date: Wed, 19 Nov 2025 03:40:38 -0500 Subject: [PATCH 089/106] Remove Basic Hardsuit Helmet Sprites (#41490) * Deletes basic helmet * you forgot one file --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- .../basic.rsi/equipped-HELMET-dog.png | Bin 3724 -> 0 bytes .../basic.rsi/equipped-HELMET-vulpkanin.png | Bin 1256 -> 0 bytes .../Hardsuits/basic.rsi/equipped-HELMET.png | Bin 1292 -> 0 bytes .../Head/Hardsuits/basic.rsi/icon.png | Bin 950 -> 0 bytes .../Head/Hardsuits/basic.rsi/inhand-left.png | Bin 1070 -> 0 bytes .../Head/Hardsuits/basic.rsi/inhand-right.png | Bin 1076 -> 0 bytes .../Head/Hardsuits/basic.rsi/meta.json | 34 ------------------ 7 files changed, 34 deletions(-) delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/equipped-HELMET-dog.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/equipped-HELMET-vulpkanin.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/equipped-HELMET.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/icon.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/inhand-right.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/meta.json diff --git a/Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/equipped-HELMET-dog.png b/Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/equipped-HELMET-dog.png deleted file mode 100644 index 744a9a58549ef73f54568fbafd21f805c6c4356b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3724 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 Y0yWsN;+zzgWB>pF07*qoM6N<$g7@f>@&Et; diff --git a/Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/inhand-left.png b/Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/inhand-left.png deleted file mode 100644 index a3df7c62558abd76e25a7f0f52f77f9472d1fc81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1070 zcmV+}1kwA6P)EX>4Tx04R}tkv&MmKpe$iQ>7vm1uKX;WT;LSL`5963Pq?8YK2xEOfLNpnlvOS zE{=k0!NHHks)LKOt`4q(Aou~|=H{g6A|?JWDYS_3;J6>}?mh0_0Ya_BG^=e4&~)2O zCE{WxyCQ~O5k?O}=)<7QEMr!ZlJFg0_XzOyF2=L`&;2>N)SShDfJi*U4AUlFC!X50 z4bJ<-5muB{;&b9rlP*a7$aTfzH_io@1)do()2TV)2(egbVWovx(bR}1iKD8fQ@)V# zSmnIMSu0goAMvPXS6bmWZkNfxsT)#vvg`Uwzx2Cnp`zgz>RKS{4P zwdfJhy$xJkH#KDsxZDBypA6ZQT`5RY$mfCgGy0}1(0dDXu6n&S_Hp_Eq^Yaq4RCM> zj1(w)&F9@6t-bwwrqSOIJTr2U{IKw800006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru#QSvi*J_5YN7|-|6lwtOqd07-Nhv#u#IavF#G9s^c_GeSY5Uc7y-jzN%K8 zok=Nu{^hmS$d7U|Rg?cy`@H|g&HyQ;kK-8ab{o#QB2GlevJCxxf9dBbrTl&EjWHMu z20>$IKpe*)BAi@F4EGd^?vU;X9p9v7RTB$wER~aU&#zD0cj&CeIjSj4{R-V~jDz7-MYP ztj*umX_^KA=H*x&bpz`(0A6do5Ucvg{cm=fp14xa10a}}lTVTayXBs~M!;inm?pBa& z^d3;StuY{?BIKN_{MdbM2jJ87hexyP$&b9iVmuxL0KzcD-8zDeTmp~ZJoDnq1&F9z oXV5Agn@EX>4Tx04R}tkv&MmKpe$iQ>7vm1uKX;WT;LSL`5963Pq?8YK2xEOfLNpnlvOS zE{=k0!NHHks)LKOt`4q(Aou~|=H{g6A|?JWDYS_3;J6>}?mh0_0Ya_BG^=e4&~)2O zCE{WxyCQ~O5k?O}=)<7QEMr!ZlJFg0_XzOyF2=L`&;2>N)SShDfJi*U4AUlFC!X50 z4bJ<-5muB{;&b9rlP*a7$aTfzH_io@1)do()2TV)2(egbVWovx(bR}1iKD8fQ@)V# zSmnIMSu0goAMvPXS6bmWZkNfxsT)#vvg`Uwzx2Cnp`zgz>RKS{4P zwdfJhy$xJkH#KDsxZDBypA6ZQT`5RY$mfCgGy0}1(0dDXu6n&S_Hp_Eq^Yaq4RCM> zj1(w)&F9@6t-bwwrqSOIJTr2U{IKw800006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNlirug9kblh!DC0~BPg4@7~-jWzd^OygXX$J1|IZ-hd$AA#cFR^)m*9)qZ{sT+0i1K=x-Rg20ruUrLGP za@i^!0j}$UF^02ij_5c*bR1xQAK>hogE5962u#(3*IFZv*4ebAXMi3)k)=tzLXM-F=(yR5n%TjV~|qju4zB501t7_zZL&LU1U4pklYBE z-hJA;^8kRGOH4aatpZm{K}rdw)WMF(O=_HT)9dx{<@WTkQ#uipQn?AFia6&cNfNBr z>$I)D@0)J7TiE`>fPCLKj^m`y({8uhtFWp(&%<`R{qJ&kp10Qtb}K3;gb+dqA%qY@ z2qAI%_Z()Min|(MwdKwZ>|-N{@vQl~1Kx?dRV8 zY%1Dz#{53O;4J_wnmYnG=f>vU0bo2HLkNNMs}tP)QV diff --git a/Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/meta.json b/Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/meta.json deleted file mode 100644 index bc5b39e8b1..0000000000 --- a/Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/meta.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/40d89d11ea4a5cb81d61dc1018b46f4e7d32c62a. equipped-HELMET-dog modified from equipped-HELMET by Sparlight (GitHub), vulpkanin version taken from Paradise station at https://github.com/ParadiseSS13/Paradise/commit/f0fa4e1fd809482fbc104a310aa34cebf7df157d", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-HELMET", - "directions": 4 - }, - { - "name": "equipped-HELMET-dog", - "directions": 4 - }, - { - "name": "equipped-HELMET-vulpkanin", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} From de947988fe5715e6567d97d082ac4de674b3c16d Mon Sep 17 00:00:00 2001 From: Samuka <47865393+Samuka-C@users.noreply.github.com> Date: Wed, 19 Nov 2025 05:56:43 -0300 Subject: [PATCH 090/106] Fix the round end trigger for xenoborgs (#41467) math --- Content.Server/GameTicking/Rules/XenoborgsRuleSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/GameTicking/Rules/XenoborgsRuleSystem.cs b/Content.Server/GameTicking/Rules/XenoborgsRuleSystem.cs index 21b987eb0e..94b6315a6b 100644 --- a/Content.Server/GameTicking/Rules/XenoborgsRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/XenoborgsRuleSystem.cs @@ -93,7 +93,7 @@ public sealed class XenoborgsRuleSystem : GameRuleSystem var numXenoborgs = GetNumberXenoborgs(); var numHumans = _mindSystem.GetAliveHumans().Count; - if ((float)numXenoborgs / numHumans > xenoborgsRuleComponent.XenoborgShuttleCallPercentage) + if ((float)numXenoborgs / (numHumans + numXenoborgs) > xenoborgsRuleComponent.XenoborgShuttleCallPercentage) { foreach (var station in _station.GetStations()) { From 922e397f34fe150b944ce2d1ef324179db83cff7 Mon Sep 17 00:00:00 2001 From: korczoczek Date: Wed, 19 Nov 2025 21:34:54 +0100 Subject: [PATCH 091/106] Fix blinking animation of disembodied head hologram (#41498) start blinking normal --- Resources/Textures/Mobs/Silicon/holograms.rsi/meta.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Textures/Mobs/Silicon/holograms.rsi/meta.json b/Resources/Textures/Mobs/Silicon/holograms.rsi/meta.json index 8eaf9165d3..7856060d0f 100644 --- a/Resources/Textures/Mobs/Silicon/holograms.rsi/meta.json +++ b/Resources/Textures/Mobs/Silicon/holograms.rsi/meta.json @@ -17,8 +17,8 @@ "name": "ai_face", "delays": [ [ - 2.3, - 0.2 + 0.2, + 2.3 ] ] }, From 905fc6a78395feb3fa70c1a011f7cea2d3ab9d94 Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Wed, 19 Nov 2025 21:44:36 +0100 Subject: [PATCH 092/106] cleanup evil beach ball (#41499) --- Resources/Prototypes/Entities/Objects/Fun/toys.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/Entities/Objects/Fun/toys.yml index dffd08e919..0d1e7ba019 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/toys.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/toys.yml @@ -533,7 +533,6 @@ parent: BeachBall id: EvilBeachBall suffix: evil - name: beach ball description: Someone's drawn ">:3c" on the side of this beach ball in indelible ink. components: - type: LaunchOnTrigger From dd1ba4cd95dba86d698c004721d64c6d4a426029 Mon Sep 17 00:00:00 2001 From: korczoczek Date: Wed, 19 Nov 2025 23:03:09 +0100 Subject: [PATCH 093/106] Make the crimson evac shuttle's air chamber not borderline blow up (#41500) glass and plasma together strong --- Resources/Maps/Shuttles/emergency_crimson.yml | 5332 +++++++++-------- 1 file changed, 2677 insertions(+), 2655 deletions(-) diff --git a/Resources/Maps/Shuttles/emergency_crimson.yml b/Resources/Maps/Shuttles/emergency_crimson.yml index 65cb03aa2e..fa2d03c8da 100644 --- a/Resources/Maps/Shuttles/emergency_crimson.yml +++ b/Resources/Maps/Shuttles/emergency_crimson.yml @@ -1,16 +1,16 @@ meta: format: 7 category: Grid - engineVersion: 261.2.0 + engineVersion: 268.0.0 forkId: "" forkVersion: "" - time: 06/06/2025 23:33:47 + time: 11/19/2025 20:58:28 entityCount: 491 maps: [] grids: -- 410 +- 1 orphans: -- 410 +- 1 nullspace: [] tilemap: 0: Space @@ -27,7 +27,7 @@ tilemap: entities: - proto: "" entities: - - uid: 410 + - uid: 1 components: - type: MetaData name: NT Evac Crimson @@ -521,48 +521,16 @@ entities: - volume: 2500 temperature: 293.15 moles: - - 21.824879 - - 82.10312 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 + Oxygen: 21.824879 + Nitrogen: 82.10312 - volume: 2500 immutable: True - moles: - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 + moles: {} - volume: 2500 temperature: 293.15 moles: - - 1400.0662 - - 5266.916 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 + Oxygen: 1400.0662 + Nitrogen: 5266.916 chunkSize: 4 - type: OccluderTree - type: Shuttle @@ -577,1369 +545,1405 @@ entities: - type: ImplicitRoof - proto: AirAlarm entities: - - uid: 12 + - uid: 2 components: - type: Transform rot: 3.141592653589793 rad pos: -3.5,-1.5 - parent: 410 + parent: 1 - type: DeviceList devices: - - 244 - - 285 - - 312 - - 486 - - 148 - - 213 - - 488 - - 347 - - 219 - - uid: 180 + - 303 + - 24 + - 307 + - 221 + - 216 + - 217 + - 223 + - 308 + - 302 + - type: Fixtures + fixtures: {} + - uid: 3 components: - type: Transform rot: 1.5707963267948966 rad pos: -0.5,4.5 - parent: 410 + parent: 1 - type: DeviceList devices: - - 483 - - 193 - - 479 - - 482 - - 485 - - uid: 305 + - 219 + - 301 + - 28 + - 311 + - 220 + - type: Fixtures + fixtures: {} + - uid: 4 components: - type: Transform rot: 1.5707963267948966 rad pos: -0.5,9.5 - parent: 410 + parent: 1 - type: DeviceList devices: - - 420 - - 418 - - 357 - - uid: 389 + - 310 + - 26 + - 305 + - type: Fixtures + fixtures: {} + - uid: 5 components: - type: Transform rot: -1.5707963267948966 rad pos: -4.5,0.5 - parent: 410 + parent: 1 - type: DeviceList devices: - - 245 - - 416 - - 406 - - 487 - - 321 - - uid: 434 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -4.5,9.5 - parent: 410 - - type: DeviceList - devices: - - 382 - - 435 -- proto: AirCanister - entities: - - uid: 119 - components: - - type: Transform - pos: -1.5,-4.5 - parent: 410 -- proto: AirlockCommandGlassLocked - entities: - - uid: 76 - components: - - type: Transform - pos: -5.5,8.5 - parent: 410 -- proto: AirlockEngineeringLocked - entities: - - uid: 52 - components: - - type: Transform - pos: -2.5,-1.5 - parent: 410 -- proto: AirlockGlass - entities: - - uid: 426 - components: - - type: Transform - pos: -0.5,-0.5 - parent: 410 - - uid: 427 - components: - - type: Transform - pos: -4.5,-0.5 - parent: 410 - - uid: 428 - components: - - type: Transform - pos: -0.5,5.5 - parent: 410 - - uid: 429 - components: - - type: Transform - pos: -4.5,5.5 - parent: 410 -- proto: AirlockGlassShuttle - entities: - - uid: 4 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -7.5,7.5 - parent: 410 + - 304 + - 25 + - 309 + - 222 + - 218 + - type: Fixtures + fixtures: {} - uid: 6 components: - type: Transform rot: -1.5707963267948966 rad - pos: -7.5,5.5 - parent: 410 + pos: -4.5,9.5 + parent: 1 + - type: DeviceList + devices: + - 306 + - 27 + - type: Fixtures + fixtures: {} +- proto: AirCanister + entities: + - uid: 7 + components: + - type: Transform + pos: -1.5,-4.5 + parent: 1 +- proto: AirlockCommandGlassLocked + entities: + - uid: 8 + components: + - type: Transform + pos: -5.5,8.5 + parent: 1 +- proto: AirlockEngineeringLocked + entities: + - uid: 9 + components: + - type: Transform + pos: -2.5,-1.5 + parent: 1 +- proto: AirlockGlass + entities: + - uid: 10 + components: + - type: Transform + pos: -0.5,-0.5 + parent: 1 + - uid: 11 + components: + - type: Transform + pos: -4.5,-0.5 + parent: 1 + - uid: 12 + components: + - type: Transform + pos: -0.5,5.5 + parent: 1 + - uid: 13 + components: + - type: Transform + pos: -4.5,5.5 + parent: 1 +- proto: AirlockGlassShuttle + entities: - uid: 14 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -7.5,-2.5 - parent: 410 - - uid: 47 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -7.5,-0.5 - parent: 410 - - uid: 99 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 2.5,-0.5 - parent: 410 - - uid: 100 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 2.5,-2.5 - parent: 410 - - uid: 145 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 2.5,7.5 - parent: 410 - - uid: 152 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 2.5,5.5 - parent: 410 -- proto: AirlockMedicalGlassLocked - entities: - - uid: 132 - components: - - type: Transform - pos: 0.5,8.5 - parent: 410 -- proto: AirlockSecurityGlassLocked - entities: - - uid: 442 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -2.5,6.5 - parent: 410 -- proto: AirSensor - entities: - - uid: 285 - components: - - type: Transform - pos: -2.5,2.5 - parent: 410 - - type: DeviceNetwork - deviceLists: - - 12 - - uid: 416 - components: - - type: Transform - pos: -6.5,2.5 - parent: 410 - - type: DeviceNetwork - deviceLists: - - 389 - - uid: 418 - components: - - type: Transform - pos: 0.5,10.5 - parent: 410 - - uid: 435 - components: - - type: Transform - pos: -4.5,11.5 - parent: 410 - - type: DeviceNetwork - deviceLists: - - 434 - - uid: 479 - components: - - type: Transform - pos: 1.5,2.5 - parent: 410 - - type: DeviceNetwork - deviceLists: - - 180 -- proto: APCHyperCapacity - entities: - - uid: 475 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -4.5,6.5 - parent: 410 - - uid: 476 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -0.5,-1.5 - parent: 410 -- proto: Ashtray - entities: - - uid: 130 - components: - - type: Transform - pos: -6.411743,10.477377 - parent: 410 -- proto: AtmosDeviceFanDirectional - entities: - - uid: 395 components: - type: Transform rot: -1.5707963267948966 rad pos: -7.5,7.5 - parent: 410 - - uid: 396 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -7.5,-0.5 - parent: 410 - - uid: 397 + parent: 1 + - uid: 15 components: - type: Transform rot: -1.5707963267948966 rad pos: -7.5,5.5 - parent: 410 - - uid: 398 + parent: 1 + - uid: 16 components: - type: Transform rot: -1.5707963267948966 rad pos: -7.5,-2.5 - parent: 410 - - uid: 399 + parent: 1 + - uid: 17 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 2.5,-2.5 - parent: 410 - - uid: 400 + rot: -1.5707963267948966 rad + pos: -7.5,-0.5 + parent: 1 + - uid: 18 components: - type: Transform rot: 1.5707963267948966 rad pos: 2.5,-0.5 - parent: 410 - - uid: 401 + parent: 1 + - uid: 19 components: - type: Transform rot: 1.5707963267948966 rad - pos: 2.5,5.5 - parent: 410 - - uid: 402 + pos: 2.5,-2.5 + parent: 1 + - uid: 20 components: - type: Transform rot: 1.5707963267948966 rad pos: 2.5,7.5 - parent: 410 -- proto: AtmosFixAirMarker - entities: - - uid: 430 - components: - - type: Transform - pos: -0.5,-4.5 - parent: 410 - - uid: 474 - components: - - type: Transform - pos: 0.5,-4.5 - parent: 410 -- proto: BedsheetMedical - entities: - - uid: 349 + parent: 1 + - uid: 21 components: - type: Transform rot: 1.5707963267948966 rad - pos: -0.5,13.5 - parent: 410 - - uid: 393 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 1.5,9.5 - parent: 410 -- proto: BoxFolderBlue + pos: 2.5,5.5 + parent: 1 +- proto: AirlockMedicalGlassLocked entities: - - uid: 451 - components: - - type: Transform - pos: -2.6054893,13.562216 - parent: 410 -- proto: BoxInflatable - entities: - - uid: 181 - components: - - type: Transform - pos: -2.14584,-3.2177773 - parent: 410 -- proto: CableApcExtension - entities: - - uid: 13 - components: - - type: Transform - pos: -2.5,6.5 - parent: 410 - - uid: 17 - components: - - type: Transform - pos: 1.5,6.5 - parent: 410 - uid: 22 - components: - - type: Transform - pos: 1.5,-0.5 - parent: 410 - - uid: 26 - components: - - type: Transform - pos: -4.5,-0.5 - parent: 410 - - uid: 29 - components: - - type: Transform - pos: -5.5,14.5 - parent: 410 - - uid: 34 - components: - - type: Transform - pos: -5.5,-3.5 - parent: 410 - - uid: 35 - components: - - type: Transform - pos: -6.5,12.5 - parent: 410 - - uid: 36 - components: - - type: Transform - pos: -5.5,7.5 - parent: 410 - - uid: 38 - components: - - type: Transform - pos: 0.5,-3.5 - parent: 410 - - uid: 49 - components: - - type: Transform - pos: -3.5,14.5 - parent: 410 - - uid: 50 - components: - - type: Transform - pos: -2.5,14.5 - parent: 410 - - uid: 51 - components: - - type: Transform - pos: -6.5,11.5 - parent: 410 - - uid: 54 - components: - - type: Transform - pos: 1.5,-1.5 - parent: 410 - - uid: 65 - components: - - type: Transform - pos: -1.5,-0.5 - parent: 410 - - uid: 66 - components: - - type: Transform - pos: -3.5,-0.5 - parent: 410 - - uid: 68 - components: - - type: Transform - pos: -0.5,-0.5 - parent: 410 - - uid: 74 - components: - - type: Transform - pos: -2.5,-3.5 - parent: 410 - - uid: 75 - components: - - type: Transform - pos: -4.5,5.5 - parent: 410 - - uid: 83 - components: - - type: Transform - pos: -2.5,-0.5 - parent: 410 - - uid: 91 - components: - - type: Transform - pos: 0.5,11.5 - parent: 410 - - uid: 111 - components: - - type: Transform - pos: -4.5,11.5 - parent: 410 - - uid: 114 - components: - - type: Transform - pos: -5.5,8.5 - parent: 410 - - uid: 125 - components: - - type: Transform - pos: -5.5,5.5 - parent: 410 - - uid: 126 - components: - - type: Transform - pos: -4.5,14.5 - parent: 410 - - uid: 134 - components: - - type: Transform - pos: -5.5,-0.5 - parent: 410 - - uid: 137 - components: - - type: Transform - pos: 0.5,-0.5 - parent: 410 - - uid: 156 - components: - - type: Transform - pos: -4.5,6.5 - parent: 410 - - uid: 160 - components: - - type: Transform - pos: -0.5,5.5 - parent: 410 - - uid: 161 - components: - - type: Transform - pos: 0.5,5.5 - parent: 410 - - uid: 162 - components: - - type: Transform - pos: 1.5,7.5 - parent: 410 - - uid: 163 - components: - - type: Transform - pos: -2.5,5.5 - parent: 410 - - uid: 164 - components: - - type: Transform - pos: -3.5,5.5 - parent: 410 - - uid: 165 - components: - - type: Transform - pos: -1.5,5.5 - parent: 410 - - uid: 177 components: - type: Transform pos: 0.5,8.5 - parent: 410 - - uid: 178 - components: - - type: Transform - pos: 0.5,7.5 - parent: 410 - - uid: 186 - components: - - type: Transform - pos: 1.5,-2.5 - parent: 410 - - uid: 189 - components: - - type: Transform - pos: -6.5,6.5 - parent: 410 - - uid: 196 - components: - - type: Transform - pos: -0.5,-1.5 - parent: 410 - - uid: 200 - components: - - type: Transform - pos: 0.5,-2.5 - parent: 410 - - uid: 204 - components: - - type: Transform - pos: -3.5,11.5 - parent: 410 - - uid: 206 - components: - - type: Transform - pos: 2.5,11.5 - parent: 410 - - uid: 208 - components: - - type: Transform - pos: -5.5,-2.5 - parent: 410 - - uid: 210 - components: - - type: Transform - pos: 0.5,9.5 - parent: 410 - - uid: 212 - components: - - type: Transform - pos: -2.5,-4.5 - parent: 410 - - uid: 215 - components: - - type: Transform - pos: -6.5,4.5 - parent: 410 - - uid: 218 - components: - - type: Transform - pos: -6.5,13.5 - parent: 410 - - uid: 221 - components: - - type: Transform - pos: 2.5,9.5 - parent: 410 - - uid: 222 - components: - - type: Transform - pos: 2.5,10.5 - parent: 410 - - uid: 223 - components: - - type: Transform - pos: -6.5,14.5 - parent: 410 - - uid: 225 - components: - - type: Transform - pos: 0.5,12.5 - parent: 410 - - uid: 235 - components: - - type: Transform - pos: 1.5,9.5 - parent: 410 - - uid: 242 - components: - - type: Transform - pos: 1.5,3.5 - parent: 410 - - uid: 275 - components: - - type: Transform - pos: 0.5,10.5 - parent: 410 - - uid: 294 - components: - - type: Transform - pos: -5.5,11.5 - parent: 410 - - uid: 319 - components: - - type: Transform - pos: -5.5,9.5 - parent: 410 - - uid: 326 - components: - - type: Transform - pos: -5.5,10.5 - parent: 410 - - uid: 380 - components: - - type: Transform - pos: -2.5,7.5 - parent: 410 - - uid: 383 - components: - - type: Transform - pos: -2.5,8.5 - parent: 410 - - uid: 431 - components: - - type: Transform - pos: -2.5,-1.5 - parent: 410 - - uid: 433 - components: - - type: Transform - pos: -2.5,-2.5 - parent: 410 - - uid: 457 - components: - - type: Transform - pos: -6.5,5.5 - parent: 410 - - uid: 458 - components: - - type: Transform - pos: -6.5,7.5 - parent: 410 - - uid: 459 - components: - - type: Transform - pos: -6.5,3.5 - parent: 410 - - uid: 460 - components: - - type: Transform - pos: -6.5,0.5 - parent: 410 - - uid: 461 - components: - - type: Transform - pos: -6.5,1.5 - parent: 410 - - uid: 462 - components: - - type: Transform - pos: -6.5,-0.5 - parent: 410 - - uid: 463 - components: - - type: Transform - pos: 1.5,0.5 - parent: 410 - - uid: 464 - components: - - type: Transform - pos: 1.5,1.5 - parent: 410 - - uid: 465 - components: - - type: Transform - pos: -6.5,-1.5 - parent: 410 - - uid: 466 - components: - - type: Transform - pos: -6.5,-2.5 - parent: 410 - - uid: 467 - components: - - type: Transform - pos: 1.5,4.5 - parent: 410 - - uid: 468 - components: - - type: Transform - pos: 1.5,5.5 - parent: 410 - - uid: 469 - components: - - type: Transform - pos: -2.5,4.5 - parent: 410 - - uid: 470 - components: - - type: Transform - pos: -2.5,3.5 - parent: 410 - - uid: 471 - components: - - type: Transform - pos: -2.5,0.5 - parent: 410 - - uid: 472 - components: - - type: Transform - pos: -2.5,1.5 - parent: 410 -- proto: CableHV + parent: 1 +- proto: AirlockSecurityGlassLocked entities: - uid: 23 components: - type: Transform - pos: -2.5,-4.5 - parent: 410 - - uid: 48 - components: - - type: Transform - pos: -2.5,-5.5 - parent: 410 - - uid: 234 - components: - - type: Transform - pos: -3.5,-4.5 - parent: 410 - - uid: 236 - components: - - type: Transform - pos: -3.5,-3.5 - parent: 410 - - uid: 323 - components: - - type: Transform - pos: -3.5,-2.5 - parent: 410 - - uid: 438 - components: - - type: Transform - pos: -4.5,-3.5 - parent: 410 - - uid: 439 - components: - - type: Transform - pos: -4.5,-2.5 - parent: 410 -- proto: CableMV + rot: 3.141592653589793 rad + pos: -2.5,6.5 + parent: 1 +- proto: AirSensor entities: - - uid: 5 - components: - - type: Transform - pos: -2.5,-2.5 - parent: 410 - uid: 24 components: - type: Transform - pos: -0.5,-1.5 - parent: 410 - - uid: 40 - components: - - type: Transform - pos: -3.5,-0.5 - parent: 410 - - uid: 42 - components: - - type: Transform - pos: -5.5,-0.5 - parent: 410 - - uid: 43 - components: - - type: Transform - pos: -2.5,-5.5 - parent: 410 - - uid: 56 - components: - - type: Transform - pos: -6.5,3.5 - parent: 410 - - uid: 61 - components: - - type: Transform - pos: -6.5,1.5 - parent: 410 - - uid: 82 - components: - - type: Transform - pos: -6.5,4.5 - parent: 410 - - uid: 84 - components: - - type: Transform - pos: -6.5,0.5 - parent: 410 - - uid: 89 + pos: -2.5,2.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 2 + - uid: 25 components: - type: Transform pos: -6.5,2.5 - parent: 410 - - uid: 96 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 5 + - uid: 26 components: - type: Transform - pos: -6.5,5.5 - parent: 410 - - uid: 97 + pos: 0.5,10.5 + parent: 1 + - uid: 27 components: - type: Transform - pos: -6.5,-0.5 - parent: 410 - - uid: 103 + pos: -4.5,11.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 6 + - uid: 28 components: - type: Transform - pos: -5.5,5.5 - parent: 410 - - uid: 115 - components: - - type: Transform - pos: -4.5,-0.5 - parent: 410 - - uid: 122 - components: - - type: Transform - pos: -0.5,-0.5 - parent: 410 - - uid: 227 - components: - - type: Transform - pos: -2.5,-0.5 - parent: 410 - - uid: 228 - components: - - type: Transform - pos: -2.5,-3.5 - parent: 410 - - uid: 229 - components: - - type: Transform - pos: -2.5,-4.5 - parent: 410 - - uid: 266 - components: - - type: Transform - pos: -4.5,6.5 - parent: 410 - - uid: 314 - components: - - type: Transform - pos: -4.5,5.5 - parent: 410 - - uid: 322 - components: - - type: Transform - pos: -2.5,-1.5 - parent: 410 - - uid: 378 - components: - - type: Transform - pos: -1.5,-0.5 - parent: 410 -- proto: CableTerminal + pos: 1.5,2.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 3 +- proto: APCHyperCapacity entities: - - uid: 33 + - uid: 29 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -4.5,6.5 + parent: 1 + - type: Fixtures + fixtures: {} + - uid: 30 components: - type: Transform rot: 1.5707963267948966 rad - pos: -3.5,-4.5 - parent: 410 -- proto: Catwalk + pos: -0.5,-1.5 + parent: 1 + - type: Fixtures + fixtures: {} +- proto: Ashtray + entities: + - uid: 31 + components: + - type: Transform + pos: -6.411743,10.477377 + parent: 1 +- proto: AtmosDeviceFanDirectional entities: - uid: 32 components: - type: Transform rot: -1.5707963267948966 rad - pos: -2.5,-3.5 - parent: 410 - - uid: 172 + pos: -7.5,7.5 + parent: 1 + - uid: 33 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -7.5,-0.5 + parent: 1 + - uid: 34 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -7.5,5.5 + parent: 1 + - uid: 35 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -7.5,-2.5 + parent: 1 + - uid: 36 components: - type: Transform rot: 1.5707963267948966 rad - pos: 2.5,13.5 - parent: 410 - - uid: 184 + pos: 2.5,-2.5 + parent: 1 + - uid: 37 components: - type: Transform rot: 1.5707963267948966 rad - pos: 2.5,14.5 - parent: 410 - - uid: 205 + pos: 2.5,-0.5 + parent: 1 + - uid: 38 components: - type: Transform rot: 1.5707963267948966 rad - pos: -7.5,14.5 - parent: 410 - - uid: 268 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 2.5,-5.5 - parent: 410 - - uid: 317 + pos: 2.5,5.5 + parent: 1 + - uid: 39 components: - type: Transform rot: 1.5707963267948966 rad - pos: 2.5,-4.5 - parent: 410 - - uid: 351 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -7.5,13.5 - parent: 410 - - uid: 384 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -7.5,-5.5 - parent: 410 - - uid: 394 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -7.5,-4.5 - parent: 410 - - uid: 432 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -2.5,-2.5 - parent: 410 -- proto: Chair + pos: 2.5,7.5 + parent: 1 +- proto: AtmosFixAirMarker entities: - - uid: 450 + - uid: 40 components: - type: Transform - pos: -1.5,8.5 - parent: 410 -- proto: ChairOfficeLight + pos: -0.5,-4.5 + parent: 1 + - uid: 41 + components: + - type: Transform + pos: 0.5,-4.5 + parent: 1 +- proto: BedsheetMedical entities: - - uid: 139 + - uid: 42 components: - type: Transform rot: 1.5707963267948966 rad - pos: 0.5779216,10.282177 - parent: 410 - - uid: 197 + pos: -0.5,13.5 + parent: 1 + - uid: 43 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 0.48648357,13.089132 - parent: 410 -- proto: ChairPilotSeat + rot: 1.5707963267948966 rad + pos: 1.5,9.5 + parent: 1 +- proto: BoxFolderBlue entities: - - uid: 1 + - uid: 44 components: - type: Transform - rot: 3.141592653589793 rad - pos: -4.5,12.5 - parent: 410 - - uid: 30 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -3.5,0.5 - parent: 410 - - uid: 55 - components: - - type: Transform - pos: -6.5,11.5 - parent: 410 - - uid: 62 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -5.5,2.5 - parent: 410 - - uid: 106 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -3.5,8.5 - parent: 410 - - uid: 120 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,-3.5 - parent: 410 - - uid: 233 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -3.5,12.5 - parent: 410 - - uid: 239 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,0.5 - parent: 410 - - uid: 241 - components: - - type: Transform - pos: -2.5,9.5 - parent: 410 - - uid: 246 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -6.5,9.5 - parent: 410 - - uid: 249 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,4.5 - parent: 410 - - uid: 253 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -3.5,7.5 - parent: 410 - - uid: 258 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -3.5,3.5 - parent: 410 - - uid: 279 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -5.5,4.5 - parent: 410 - - uid: 298 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 0.5,1.5 - parent: 410 - - uid: 302 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -5.5,0.5 - parent: 410 - - uid: 306 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 0.5,3.5 - parent: 410 - - uid: 310 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -3.5,4.5 - parent: 410 - - uid: 311 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -3.5,2.5 - parent: 410 - - uid: 313 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 0.5,2.5 - parent: 410 - - uid: 318 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -5.5,12.5 - parent: 410 - - uid: 328 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 0.5,0.5 - parent: 410 - - uid: 329 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -5.5,1.5 - parent: 410 - - uid: 330 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,1.5 - parent: 410 - - uid: 337 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,2.5 - parent: 410 - - uid: 340 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -3.5,1.5 - parent: 410 - - uid: 341 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 0.5,4.5 - parent: 410 - - uid: 445 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,3.5 - parent: 410 - - uid: 452 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -5.5,3.5 - parent: 410 -- proto: CigarGold - entities: - - uid: 20 - components: - - type: Transform - pos: -6.620076,10.550344 - parent: 410 -- proto: ClosetEmergencyFilledRandom - entities: - - uid: 19 - components: - - type: Transform - pos: -6.5,-1.5 - parent: 410 - - uid: 71 - components: - - type: Transform - pos: 1.5,-1.5 - parent: 410 - - uid: 278 - components: - - type: Transform - pos: 1.5,6.5 - parent: 410 -- proto: ClosetEmergencyN2FilledRandom - entities: - - uid: 277 - components: - - type: Transform - pos: -6.5,6.5 - parent: 410 -- proto: ClosetWallEmergencyFilledRandom - entities: - - uid: 135 - components: - - type: Transform - pos: 0.5,14.5 - parent: 410 - - uid: 274 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 1.5,-3.5 - parent: 410 - - uid: 354 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -6.5,-3.5 - parent: 410 - - uid: 381 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -0.5,7.5 - parent: 410 -- proto: ClosetWallFireFilledRandom - entities: - - uid: 129 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -0.5,-2.5 - parent: 410 - - uid: 209 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -4.5,7.5 - parent: 410 - - uid: 251 - components: - - type: Transform - pos: -0.5,14.5 - parent: 410 -- proto: ComputerComms - entities: - - uid: 63 - components: - - type: Transform - pos: -5.5,13.5 - parent: 410 -- proto: ComputerEmergencyShuttle + pos: -2.6054893,13.562216 + parent: 1 +- proto: BoxInflatable entities: - uid: 45 components: - type: Transform - pos: -4.5,13.5 - parent: 410 -- proto: ComputerRadar + pos: -2.14584,-3.2177773 + parent: 1 +- proto: CableApcExtension entities: + - uid: 46 + components: + - type: Transform + pos: -2.5,6.5 + parent: 1 + - uid: 47 + components: + - type: Transform + pos: 1.5,6.5 + parent: 1 + - uid: 48 + components: + - type: Transform + pos: 1.5,-0.5 + parent: 1 + - uid: 49 + components: + - type: Transform + pos: -4.5,-0.5 + parent: 1 + - uid: 50 + components: + - type: Transform + pos: -5.5,14.5 + parent: 1 + - uid: 51 + components: + - type: Transform + pos: -5.5,-3.5 + parent: 1 + - uid: 52 + components: + - type: Transform + pos: -6.5,12.5 + parent: 1 + - uid: 53 + components: + - type: Transform + pos: -5.5,7.5 + parent: 1 + - uid: 54 + components: + - type: Transform + pos: 0.5,-3.5 + parent: 1 + - uid: 55 + components: + - type: Transform + pos: -3.5,14.5 + parent: 1 + - uid: 56 + components: + - type: Transform + pos: -2.5,14.5 + parent: 1 + - uid: 57 + components: + - type: Transform + pos: -6.5,11.5 + parent: 1 + - uid: 58 + components: + - type: Transform + pos: 1.5,-1.5 + parent: 1 + - uid: 59 + components: + - type: Transform + pos: -1.5,-0.5 + parent: 1 + - uid: 60 + components: + - type: Transform + pos: -3.5,-0.5 + parent: 1 + - uid: 61 + components: + - type: Transform + pos: -0.5,-0.5 + parent: 1 + - uid: 62 + components: + - type: Transform + pos: -2.5,-3.5 + parent: 1 + - uid: 63 + components: + - type: Transform + pos: -4.5,5.5 + parent: 1 + - uid: 64 + components: + - type: Transform + pos: -2.5,-0.5 + parent: 1 + - uid: 65 + components: + - type: Transform + pos: 0.5,11.5 + parent: 1 + - uid: 66 + components: + - type: Transform + pos: -4.5,11.5 + parent: 1 + - uid: 67 + components: + - type: Transform + pos: -5.5,8.5 + parent: 1 + - uid: 68 + components: + - type: Transform + pos: -5.5,5.5 + parent: 1 + - uid: 69 + components: + - type: Transform + pos: -4.5,14.5 + parent: 1 + - uid: 70 + components: + - type: Transform + pos: -5.5,-0.5 + parent: 1 + - uid: 71 + components: + - type: Transform + pos: 0.5,-0.5 + parent: 1 + - uid: 72 + components: + - type: Transform + pos: -4.5,6.5 + parent: 1 + - uid: 73 + components: + - type: Transform + pos: -0.5,5.5 + parent: 1 + - uid: 74 + components: + - type: Transform + pos: 0.5,5.5 + parent: 1 + - uid: 75 + components: + - type: Transform + pos: 1.5,7.5 + parent: 1 + - uid: 76 + components: + - type: Transform + pos: -2.5,5.5 + parent: 1 + - uid: 77 + components: + - type: Transform + pos: -3.5,5.5 + parent: 1 + - uid: 78 + components: + - type: Transform + pos: -1.5,5.5 + parent: 1 - uid: 79 + components: + - type: Transform + pos: 0.5,8.5 + parent: 1 + - uid: 80 + components: + - type: Transform + pos: 0.5,7.5 + parent: 1 + - uid: 81 + components: + - type: Transform + pos: 1.5,-2.5 + parent: 1 + - uid: 82 + components: + - type: Transform + pos: -6.5,6.5 + parent: 1 + - uid: 83 + components: + - type: Transform + pos: -0.5,-1.5 + parent: 1 + - uid: 84 + components: + - type: Transform + pos: 0.5,-2.5 + parent: 1 + - uid: 85 + components: + - type: Transform + pos: -3.5,11.5 + parent: 1 + - uid: 86 + components: + - type: Transform + pos: 2.5,11.5 + parent: 1 + - uid: 87 + components: + - type: Transform + pos: -5.5,-2.5 + parent: 1 + - uid: 88 + components: + - type: Transform + pos: 0.5,9.5 + parent: 1 + - uid: 89 + components: + - type: Transform + pos: -2.5,-4.5 + parent: 1 + - uid: 90 + components: + - type: Transform + pos: -6.5,4.5 + parent: 1 + - uid: 91 + components: + - type: Transform + pos: -6.5,13.5 + parent: 1 + - uid: 92 + components: + - type: Transform + pos: 2.5,9.5 + parent: 1 + - uid: 93 + components: + - type: Transform + pos: 2.5,10.5 + parent: 1 + - uid: 94 + components: + - type: Transform + pos: -6.5,14.5 + parent: 1 + - uid: 95 + components: + - type: Transform + pos: 0.5,12.5 + parent: 1 + - uid: 96 + components: + - type: Transform + pos: 1.5,9.5 + parent: 1 + - uid: 97 + components: + - type: Transform + pos: 1.5,3.5 + parent: 1 + - uid: 98 + components: + - type: Transform + pos: 0.5,10.5 + parent: 1 + - uid: 99 + components: + - type: Transform + pos: -5.5,11.5 + parent: 1 + - uid: 100 + components: + - type: Transform + pos: -5.5,9.5 + parent: 1 + - uid: 101 + components: + - type: Transform + pos: -5.5,10.5 + parent: 1 + - uid: 102 + components: + - type: Transform + pos: -2.5,7.5 + parent: 1 + - uid: 103 + components: + - type: Transform + pos: -2.5,8.5 + parent: 1 + - uid: 104 + components: + - type: Transform + pos: -2.5,-1.5 + parent: 1 + - uid: 105 + components: + - type: Transform + pos: -2.5,-2.5 + parent: 1 + - uid: 106 + components: + - type: Transform + pos: -6.5,5.5 + parent: 1 + - uid: 107 + components: + - type: Transform + pos: -6.5,7.5 + parent: 1 + - uid: 108 + components: + - type: Transform + pos: -6.5,3.5 + parent: 1 + - uid: 109 + components: + - type: Transform + pos: -6.5,0.5 + parent: 1 + - uid: 110 + components: + - type: Transform + pos: -6.5,1.5 + parent: 1 + - uid: 111 + components: + - type: Transform + pos: -6.5,-0.5 + parent: 1 + - uid: 112 + components: + - type: Transform + pos: 1.5,0.5 + parent: 1 + - uid: 113 + components: + - type: Transform + pos: 1.5,1.5 + parent: 1 + - uid: 114 + components: + - type: Transform + pos: -6.5,-1.5 + parent: 1 + - uid: 115 + components: + - type: Transform + pos: -6.5,-2.5 + parent: 1 + - uid: 116 + components: + - type: Transform + pos: 1.5,4.5 + parent: 1 + - uid: 117 + components: + - type: Transform + pos: 1.5,5.5 + parent: 1 + - uid: 118 + components: + - type: Transform + pos: -2.5,4.5 + parent: 1 + - uid: 119 + components: + - type: Transform + pos: -2.5,3.5 + parent: 1 + - uid: 120 + components: + - type: Transform + pos: -2.5,0.5 + parent: 1 + - uid: 121 + components: + - type: Transform + pos: -2.5,1.5 + parent: 1 +- proto: CableHV + entities: + - uid: 122 + components: + - type: Transform + pos: -2.5,-4.5 + parent: 1 + - uid: 123 + components: + - type: Transform + pos: -2.5,-5.5 + parent: 1 + - uid: 124 + components: + - type: Transform + pos: -3.5,-4.5 + parent: 1 + - uid: 125 + components: + - type: Transform + pos: -3.5,-3.5 + parent: 1 + - uid: 126 + components: + - type: Transform + pos: -3.5,-2.5 + parent: 1 + - uid: 127 + components: + - type: Transform + pos: -4.5,-3.5 + parent: 1 + - uid: 128 + components: + - type: Transform + pos: -4.5,-2.5 + parent: 1 +- proto: CableMV + entities: + - uid: 129 + components: + - type: Transform + pos: -2.5,-2.5 + parent: 1 + - uid: 130 + components: + - type: Transform + pos: -0.5,-1.5 + parent: 1 + - uid: 131 + components: + - type: Transform + pos: -3.5,-0.5 + parent: 1 + - uid: 132 + components: + - type: Transform + pos: -5.5,-0.5 + parent: 1 + - uid: 133 + components: + - type: Transform + pos: -2.5,-5.5 + parent: 1 + - uid: 134 + components: + - type: Transform + pos: -6.5,3.5 + parent: 1 + - uid: 135 + components: + - type: Transform + pos: -6.5,1.5 + parent: 1 + - uid: 136 + components: + - type: Transform + pos: -6.5,4.5 + parent: 1 + - uid: 137 + components: + - type: Transform + pos: -6.5,0.5 + parent: 1 + - uid: 138 + components: + - type: Transform + pos: -6.5,2.5 + parent: 1 + - uid: 139 + components: + - type: Transform + pos: -6.5,5.5 + parent: 1 + - uid: 140 + components: + - type: Transform + pos: -6.5,-0.5 + parent: 1 + - uid: 141 + components: + - type: Transform + pos: -5.5,5.5 + parent: 1 + - uid: 142 + components: + - type: Transform + pos: -4.5,-0.5 + parent: 1 + - uid: 143 + components: + - type: Transform + pos: -0.5,-0.5 + parent: 1 + - uid: 144 + components: + - type: Transform + pos: -2.5,-0.5 + parent: 1 + - uid: 145 + components: + - type: Transform + pos: -2.5,-3.5 + parent: 1 + - uid: 146 + components: + - type: Transform + pos: -2.5,-4.5 + parent: 1 + - uid: 147 + components: + - type: Transform + pos: -4.5,6.5 + parent: 1 + - uid: 148 + components: + - type: Transform + pos: -4.5,5.5 + parent: 1 + - uid: 149 + components: + - type: Transform + pos: -2.5,-1.5 + parent: 1 + - uid: 150 + components: + - type: Transform + pos: -1.5,-0.5 + parent: 1 +- proto: CableTerminal + entities: + - uid: 151 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,-4.5 + parent: 1 +- proto: Catwalk + entities: + - uid: 152 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -2.5,-3.5 + parent: 1 + - uid: 153 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 2.5,13.5 + parent: 1 + - uid: 154 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 2.5,14.5 + parent: 1 + - uid: 155 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -7.5,14.5 + parent: 1 + - uid: 156 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 2.5,-5.5 + parent: 1 + - uid: 157 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 2.5,-4.5 + parent: 1 + - uid: 158 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -7.5,13.5 + parent: 1 + - uid: 159 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -7.5,-5.5 + parent: 1 + - uid: 160 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -7.5,-4.5 + parent: 1 + - uid: 161 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -2.5,-2.5 + parent: 1 +- proto: Chair + entities: + - uid: 162 + components: + - type: Transform + pos: -1.5,8.5 + parent: 1 +- proto: ChairOfficeLight + entities: + - uid: 163 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5779216,10.282177 + parent: 1 + - uid: 164 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 0.48648357,13.089132 + parent: 1 +- proto: ChairPilotSeat + entities: + - uid: 165 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -4.5,12.5 + parent: 1 + - uid: 166 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,0.5 + parent: 1 + - uid: 167 + components: + - type: Transform + pos: -6.5,11.5 + parent: 1 + - uid: 168 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -5.5,2.5 + parent: 1 + - uid: 169 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,8.5 + parent: 1 + - uid: 170 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,-3.5 + parent: 1 + - uid: 171 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -3.5,12.5 + parent: 1 + - uid: 172 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,0.5 + parent: 1 + - uid: 173 + components: + - type: Transform + pos: -2.5,9.5 + parent: 1 + - uid: 174 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -6.5,9.5 + parent: 1 + - uid: 175 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,4.5 + parent: 1 + - uid: 176 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,7.5 + parent: 1 + - uid: 177 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,3.5 + parent: 1 + - uid: 178 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -5.5,4.5 + parent: 1 + - uid: 179 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,1.5 + parent: 1 + - uid: 180 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -5.5,0.5 + parent: 1 + - uid: 181 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,3.5 + parent: 1 + - uid: 182 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,4.5 + parent: 1 + - uid: 183 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,2.5 + parent: 1 + - uid: 184 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,2.5 + parent: 1 + - uid: 185 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,12.5 + parent: 1 + - uid: 186 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,0.5 + parent: 1 + - uid: 187 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -5.5,1.5 + parent: 1 + - uid: 188 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,1.5 + parent: 1 + - uid: 189 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,2.5 + parent: 1 + - uid: 190 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,1.5 + parent: 1 + - uid: 191 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,4.5 + parent: 1 + - uid: 192 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,3.5 + parent: 1 + - uid: 193 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -5.5,3.5 + parent: 1 +- proto: CigarGold + entities: + - uid: 194 + components: + - type: Transform + pos: -6.620076,10.550344 + parent: 1 +- proto: ClosetEmergencyFilledRandom + entities: + - uid: 195 + components: + - type: Transform + pos: -6.5,-1.5 + parent: 1 + - uid: 196 + components: + - type: Transform + pos: 1.5,-1.5 + parent: 1 + - uid: 197 + components: + - type: Transform + pos: 1.5,6.5 + parent: 1 +- proto: ClosetEmergencyN2FilledRandom + entities: + - uid: 198 + components: + - type: Transform + pos: -6.5,6.5 + parent: 1 +- proto: ClosetWallEmergencyFilledRandom + entities: + - uid: 199 + components: + - type: Transform + pos: 0.5,14.5 + parent: 1 + - type: Fixtures + fixtures: {} + - uid: 200 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 1.5,-3.5 + parent: 1 + - type: Fixtures + fixtures: {} + - uid: 201 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -6.5,-3.5 + parent: 1 + - type: Fixtures + fixtures: {} + - uid: 202 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,7.5 + parent: 1 + - type: Fixtures + fixtures: {} +- proto: ClosetWallFireFilledRandom + entities: + - uid: 203 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,-2.5 + parent: 1 + - type: Fixtures + fixtures: {} + - uid: 204 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -4.5,7.5 + parent: 1 + - type: Fixtures + fixtures: {} + - uid: 205 + components: + - type: Transform + pos: -0.5,14.5 + parent: 1 + - type: Fixtures + fixtures: {} +- proto: ComputerComms + entities: + - uid: 206 + components: + - type: Transform + pos: -5.5,13.5 + parent: 1 +- proto: ComputerEmergencyShuttle + entities: + - uid: 207 + components: + - type: Transform + pos: -4.5,13.5 + parent: 1 +- proto: ComputerRadar + entities: + - uid: 208 components: - type: Transform pos: -3.5,13.5 - parent: 410 + parent: 1 - proto: DefibrillatorCabinetFilled entities: - - uid: 353 + - uid: 209 components: - type: Transform pos: 1.5,12.5 - parent: 410 + parent: 1 + - type: Fixtures + fixtures: {} - proto: DrinkGildlagerBottleFull entities: - - uid: 455 + - uid: 210 components: - type: Transform pos: -6.338826,10.977726 - parent: 410 + parent: 1 - proto: DrinkGlass entities: - - uid: 456 + - uid: 211 components: - type: Transform pos: -6.661743,10.842215 - parent: 410 + parent: 1 - proto: EmergencyLight entities: - - uid: 315 + - uid: 212 components: - type: Transform rot: 3.141592653589793 rad pos: -1.5,-0.5 - parent: 410 + parent: 1 - proto: ExtinguisherCabinetFilled entities: - - uid: 422 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -7.5,0.5 - parent: 410 - - uid: 423 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 2.5,4.5 - parent: 410 -- proto: FireAxeCabinetFilled - entities: - - uid: 291 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -3.5,10.5 - parent: 410 -- proto: FirelockEdge - entities: - - uid: 148 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -3.5,-0.5 - parent: 410 - - type: DeviceNetwork - deviceLists: - - 12 - uid: 213 components: - type: Transform rot: 1.5707963267948966 rad - pos: -1.5,-0.5 - parent: 410 + pos: -7.5,0.5 + parent: 1 + - type: Fixtures + fixtures: {} + - uid: 214 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 2.5,4.5 + parent: 1 + - type: Fixtures + fixtures: {} +- proto: FireAxeCabinetFilled + entities: + - uid: 215 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -3.5,10.5 + parent: 1 + - type: Fixtures + fixtures: {} +- proto: FirelockEdge + entities: + - uid: 216 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -3.5,-0.5 + parent: 1 - type: DeviceNetwork deviceLists: - - 12 - - uid: 321 + - 2 + - uid: 217 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -1.5,-0.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 2 + - uid: 218 components: - type: Transform rot: 1.5707963267948966 rad pos: -5.5,-0.5 - parent: 410 + parent: 1 - type: DeviceNetwork deviceLists: - - 389 - - uid: 483 + - 5 + - uid: 219 components: - type: Transform rot: -1.5707963267948966 rad pos: 0.5,-0.5 - parent: 410 + parent: 1 - type: DeviceNetwork deviceLists: - - 180 - - uid: 485 + - 3 + - uid: 220 components: - type: Transform rot: -1.5707963267948966 rad pos: 0.5,5.5 - parent: 410 + parent: 1 - type: DeviceNetwork deviceLists: - - 180 - - uid: 486 + - 3 + - uid: 221 components: - type: Transform rot: -1.5707963267948966 rad pos: -3.5,5.5 - parent: 410 + parent: 1 - type: DeviceNetwork deviceLists: - - 12 - - uid: 487 + - 2 + - uid: 222 components: - type: Transform rot: 1.5707963267948966 rad pos: -5.5,5.5 - parent: 410 + parent: 1 - type: DeviceNetwork deviceLists: - - 389 - - uid: 488 + - 5 + - uid: 223 components: - type: Transform rot: 1.5707963267948966 rad pos: -1.5,5.5 - parent: 410 + parent: 1 - type: DeviceNetwork deviceLists: - - 12 + - 2 - proto: GasOutletInjector entities: - - uid: 118 + - uid: 224 components: - type: Transform rot: -1.5707963267948966 rad pos: -0.5,-4.5 - parent: 410 + parent: 1 - proto: GasPassiveVent entities: - - uid: 2 + - uid: 225 components: - type: Transform rot: 3.141592653589793 rad pos: 0.5,-4.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 57 + - uid: 226 components: - type: Transform rot: 3.141592653589793 rad pos: -5.5,-4.5 - parent: 410 + parent: 1 - type: Construction step: 1 edge: 0 @@ -1949,653 +1953,653 @@ entities: color: '#990000FF' - proto: GasPipeBend entities: - - uid: 176 + - uid: 227 components: - type: Transform rot: 1.5707963267948966 rad pos: -3.5,8.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 201 + - uid: 228 components: - type: Transform rot: 3.141592653589793 rad pos: -5.5,-0.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 338 + - uid: 229 components: - type: Transform rot: 1.5707963267948966 rad pos: -5.5,11.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - proto: GasPipeBendAlt2 entities: - - uid: 494 + - uid: 230 components: - type: Transform pos: 1.5,9.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#990000FF' - proto: GasPipeFourwayAlt2 entities: - - uid: 220 + - uid: 231 components: - type: Transform pos: -2.5,5.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#990000FF' - proto: GasPipeStraight entities: - - uid: 18 + - uid: 232 components: - type: Transform rot: 3.141592653589793 rad pos: -5.5,6.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 90 + - uid: 233 components: - type: Transform rot: 3.141592653589793 rad pos: -5.5,9.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 102 + - uid: 234 components: - type: Transform rot: 3.141592653589793 rad pos: -5.5,7.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 110 + - uid: 235 components: - type: Transform pos: 0.5,-1.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 116 + - uid: 236 components: - type: Transform pos: -2.5,0.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 117 + - uid: 237 components: - type: Transform pos: -3.5,0.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 123 + - uid: 238 components: - type: Transform pos: 0.5,6.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 127 + - uid: 239 components: - type: Transform pos: -5.5,3.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 133 + - uid: 240 components: - type: Transform pos: -5.5,5.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 146 + - uid: 241 components: - type: Transform rot: 3.141592653589793 rad pos: 0.5,9.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 149 + - uid: 242 components: - type: Transform rot: 1.5707963267948966 rad pos: -4.5,-0.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 150 + - uid: 243 components: - type: Transform rot: 1.5707963267948966 rad pos: -1.5,-0.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 151 - components: - - type: Transform - pos: -3.5,2.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 157 - components: - - type: Transform - pos: 0.5,2.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 158 - components: - - type: Transform - pos: 0.5,0.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 159 - components: - - type: Transform - pos: -3.5,4.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 166 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -3.5,6.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 167 - components: - - type: Transform - pos: -5.5,4.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 168 - components: - - type: Transform - pos: -3.5,3.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 174 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -3.5,7.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 175 - components: - - type: Transform - pos: 0.5,3.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 179 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -3.5,5.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 182 - components: - - type: Transform - pos: 0.5,-2.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 185 - components: - - type: Transform - pos: 0.5,4.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 191 - components: - - type: Transform - pos: -5.5,0.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 192 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 0.5,10.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 199 - components: - - type: Transform - pos: -3.5,1.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 202 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -0.5,-0.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 207 - components: - - type: Transform - pos: 0.5,7.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 217 - components: - - type: Transform - pos: 0.5,-3.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 280 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -5.5,10.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 300 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -5.5,8.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 359 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 0.5,5.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 408 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 0.5,8.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 419 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -4.5,11.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 443 - components: - - type: Transform - pos: -5.5,2.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' -- proto: GasPipeStraightAlt2 - entities: - - uid: 141 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -0.5,5.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 183 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -5.5,-1.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 188 - components: - - type: Transform - pos: -5.5,9.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 214 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -4.5,5.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 240 - components: - - type: Transform - pos: -2.5,4.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 247 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -5.5,-2.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 250 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -5.5,4.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 254 - components: - - type: Transform - pos: -5.5,6.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 271 - components: - - type: Transform - pos: -5.5,10.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 303 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,5.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 309 - components: - - type: Transform - pos: -5.5,7.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 358 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -3.5,5.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 362 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -2.5,6.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 366 - components: - - type: Transform - pos: -5.5,8.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 388 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 0.5,5.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 390 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -5.5,-0.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 391 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -5.5,0.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 392 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -5.5,1.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 404 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -5.5,2.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 484 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -5.5,-3.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 490 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 1.5,4.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 491 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 1.5,6.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 492 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 1.5,7.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 493 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 1.5,8.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' -- proto: GasPipeTJunction - entities: - - uid: 142 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -3.5,-0.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 194 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 0.5,-0.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 226 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -2.5,-0.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 480 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -5.5,1.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 481 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 0.5,1.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' -- proto: GasPipeTJunctionAlt2 - entities: - - uid: 248 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 1.5,5.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 413 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -5.5,3.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 415 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -5.5,5.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' -- proto: GasPort - entities: - - uid: 121 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -1.5,-4.5 - parent: 410 -- proto: GasVentPump - entities: - - uid: 193 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 1.5,1.5 - parent: 410 - - type: DeviceNetwork - deviceLists: - - 180 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 219 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -2.5,8.5 - parent: 410 - - type: DeviceNetwork - deviceLists: - - 12 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 244 components: - type: Transform - pos: -2.5,1.5 - parent: 410 - - type: DeviceNetwork - deviceLists: - - 12 + pos: -3.5,2.5 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 245 components: - type: Transform - rot: 1.5707963267948966 rad - pos: -6.5,1.5 - parent: 410 - - type: DeviceNetwork - deviceLists: - - 389 + pos: 0.5,2.5 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 357 + - uid: 246 + components: + - type: Transform + pos: 0.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 247 + components: + - type: Transform + pos: -3.5,4.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 248 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -3.5,6.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 249 + components: + - type: Transform + pos: -5.5,4.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 250 + components: + - type: Transform + pos: -3.5,3.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 251 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -3.5,7.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 252 + components: + - type: Transform + pos: 0.5,3.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 253 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -3.5,5.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 254 + components: + - type: Transform + pos: 0.5,-2.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 255 + components: + - type: Transform + pos: 0.5,4.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 256 + components: + - type: Transform + pos: -5.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 257 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 0.5,10.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 258 + components: + - type: Transform + pos: -3.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 259 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 260 + components: + - type: Transform + pos: 0.5,7.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 261 + components: + - type: Transform + pos: 0.5,-3.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 262 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,10.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 263 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,8.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 264 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 0.5,5.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 265 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 0.5,8.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 266 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -4.5,11.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 267 + components: + - type: Transform + pos: -5.5,2.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' +- proto: GasPipeStraightAlt2 + entities: + - uid: 268 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -0.5,5.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 269 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,-1.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 270 + components: + - type: Transform + pos: -5.5,9.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 271 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -4.5,5.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 272 + components: + - type: Transform + pos: -2.5,4.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 273 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,-2.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 274 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,4.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 275 + components: + - type: Transform + pos: -5.5,6.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 276 + components: + - type: Transform + pos: -5.5,10.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 277 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,5.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 278 + components: + - type: Transform + pos: -5.5,7.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 279 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,5.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 280 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -2.5,6.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 281 + components: + - type: Transform + pos: -5.5,8.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 282 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 0.5,5.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 283 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 284 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 285 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 286 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,2.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 287 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,-3.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 288 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 1.5,4.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 289 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 1.5,6.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 290 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 1.5,7.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 291 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 1.5,8.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' +- proto: GasPipeTJunction + entities: + - uid: 292 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -3.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 293 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 0.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 294 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -2.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 295 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -5.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 296 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' +- proto: GasPipeTJunctionAlt2 + entities: + - uid: 297 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 1.5,5.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 298 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -5.5,3.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 299 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -5.5,5.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' +- proto: GasPort + entities: + - uid: 300 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -1.5,-4.5 + parent: 1 +- proto: GasVentPump + entities: + - uid: 301 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 1.5,1.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 3 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 302 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -2.5,8.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 2 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 303 + components: + - type: Transform + pos: -2.5,1.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 2 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 304 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -6.5,1.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 5 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 305 components: - type: Transform pos: 0.5,11.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 382 + - uid: 306 components: - type: Transform rot: -1.5707963267948966 rad pos: -3.5,11.5 - parent: 410 + parent: 1 - type: DeviceNetwork deviceLists: - - 434 + - 6 - type: AtmosPipeColor color: '#0055CCFF' - proto: GasVentScrubber entities: - - uid: 312 + - uid: 307 components: - type: Transform rot: 3.141592653589793 rad pos: -2.5,3.5 - parent: 410 + parent: 1 - type: Construction step: 1 edge: 0 @@ -2603,17 +2607,17 @@ entities: pipeLayer: Tertiary - type: DeviceNetwork deviceLists: - - 12 + - 2 - type: AtmosPipeColor color: '#990000FF' - - uid: 347 + - uid: 308 components: - type: Transform pos: -2.5,7.5 - parent: 410 + parent: 1 - type: DeviceNetwork deviceLists: - - 12 + - 2 - type: Construction step: 1 edge: 0 @@ -2621,15 +2625,15 @@ entities: pipeLayer: Tertiary - type: AtmosPipeColor color: '#990000FF' - - uid: 406 + - uid: 309 components: - type: Transform rot: 1.5707963267948966 rad pos: -6.5,3.5 - parent: 410 + parent: 1 - type: DeviceNetwork deviceLists: - - 389 + - 5 - type: Construction step: 1 edge: 0 @@ -2637,12 +2641,12 @@ entities: pipeLayer: Tertiary - type: AtmosPipeColor color: '#990000FF' - - uid: 420 + - uid: 310 components: - type: Transform rot: 1.5707963267948966 rad pos: 0.5,9.5 - parent: 410 + parent: 1 - type: Construction step: 1 edge: 0 @@ -2650,15 +2654,15 @@ entities: pipeLayer: Tertiary - type: AtmosPipeColor color: '#990000FF' - - uid: 482 + - uid: 311 components: - type: Transform rot: 3.141592653589793 rad pos: 1.5,3.5 - parent: 410 + parent: 1 - type: DeviceNetwork deviceLists: - - 180 + - 3 - type: Construction step: 1 edge: 0 @@ -2666,11 +2670,11 @@ entities: pipeLayer: Tertiary - type: AtmosPipeColor color: '#990000FF' - - uid: 489 + - uid: 312 components: - type: Transform pos: -5.5,11.5 - parent: 410 + parent: 1 - type: Construction step: 1 edge: 0 @@ -2680,998 +2684,1016 @@ entities: color: '#990000FF' - proto: GeneratorBasic15kW entities: - - uid: 203 + - uid: 313 components: - type: Transform pos: -3.5,-3.5 - parent: 410 - - uid: 224 + parent: 1 + - uid: 314 components: - type: Transform pos: -3.5,-2.5 - parent: 410 + parent: 1 - proto: GeneratorWallmountAPU entities: - - uid: 440 + - uid: 315 components: - type: Transform pos: -4.5,-3.5 - parent: 410 - - uid: 441 + parent: 1 + - uid: 316 components: - type: Transform pos: -4.5,-2.5 - parent: 410 + parent: 1 - proto: GravityGeneratorMini + entities: + - uid: 317 + components: + - type: Transform + pos: -3.5,-4.5 + parent: 1 +- proto: Grille + entities: + - uid: 318 + components: + - type: Transform + pos: 2.5,10.5 + parent: 1 + - uid: 319 + components: + - type: Transform + pos: -2.5,14.5 + parent: 1 + - uid: 320 + components: + - type: Transform + pos: 2.5,3.5 + parent: 1 + - uid: 321 + components: + - type: Transform + pos: -6.5,14.5 + parent: 1 + - uid: 322 + components: + - type: Transform + pos: -6.5,8.5 + parent: 1 + - uid: 323 + components: + - type: Transform + pos: 2.5,9.5 + parent: 1 + - uid: 324 + components: + - type: Transform + pos: 2.5,1.5 + parent: 1 + - uid: 325 + components: + - type: Transform + pos: 2.5,11.5 + parent: 1 + - uid: 326 + components: + - type: Transform + pos: -7.5,1.5 + parent: 1 + - uid: 327 + components: + - type: Transform + pos: -7.5,3.5 + parent: 1 + - uid: 328 + components: + - type: Transform + pos: 1.5,8.5 + parent: 1 + - uid: 329 + components: + - type: Transform + pos: -5.5,14.5 + parent: 1 + - uid: 330 + components: + - type: Transform + pos: -6.5,13.5 + parent: 1 + - uid: 331 + components: + - type: Transform + pos: 2.5,2.5 + parent: 1 + - uid: 332 + components: + - type: Transform + pos: 0.5,-3.5 + parent: 1 + - uid: 333 + components: + - type: Transform + pos: -7.5,-1.5 + parent: 1 + - uid: 334 + components: + - type: Transform + pos: -7.5,2.5 + parent: 1 + - uid: 335 + components: + - type: Transform + pos: -4.5,14.5 + parent: 1 + - uid: 336 + components: + - type: Transform + pos: -3.5,14.5 + parent: 1 + - uid: 337 + components: + - type: Transform + pos: -3.5,6.5 + parent: 1 + - uid: 338 + components: + - type: Transform + pos: 2.5,-1.5 + parent: 1 + - uid: 339 + components: + - type: Transform + pos: -7.5,6.5 + parent: 1 + - uid: 340 + components: + - type: Transform + pos: 2.5,6.5 + parent: 1 + - uid: 341 + components: + - type: Transform + pos: -1.5,6.5 + parent: 1 + - uid: 342 + components: + - type: Transform + pos: -5.5,-3.5 + parent: 1 + - uid: 343 + components: + - type: Transform + pos: -6.5,12.5 + parent: 1 + - uid: 344 + components: + - type: Transform + pos: -5.5,-5.5 + parent: 1 +- proto: Gyroscope entities: - uid: 345 components: - type: Transform - pos: -3.5,-4.5 - parent: 410 -- proto: Grille + pos: -4.5,-4.5 + parent: 1 +- proto: HandheldHealthAnalyzerUnpowered entities: - - uid: 44 - components: - - type: Transform - pos: 2.5,10.5 - parent: 410 - - uid: 95 - components: - - type: Transform - pos: -2.5,14.5 - parent: 410 - - uid: 101 - components: - - type: Transform - pos: 2.5,3.5 - parent: 410 - - uid: 104 - components: - - type: Transform - pos: -6.5,14.5 - parent: 410 - - uid: 124 - components: - - type: Transform - pos: -6.5,8.5 - parent: 410 - - uid: 138 - components: - - type: Transform - pos: 2.5,9.5 - parent: 410 - - uid: 155 - components: - - type: Transform - pos: 2.5,1.5 - parent: 410 - - uid: 169 - components: - - type: Transform - pos: 2.5,11.5 - parent: 410 - - uid: 171 - components: - - type: Transform - pos: -7.5,1.5 - parent: 410 - - uid: 173 - components: - - type: Transform - pos: -7.5,3.5 - parent: 410 - - uid: 237 - components: - - type: Transform - pos: 1.5,8.5 - parent: 410 - - uid: 260 - components: - - type: Transform - pos: -5.5,14.5 - parent: 410 - - uid: 261 - components: - - type: Transform - pos: -6.5,13.5 - parent: 410 - - uid: 263 - components: - - type: Transform - pos: 2.5,2.5 - parent: 410 - - uid: 281 - components: - - type: Transform - pos: 0.5,-3.5 - parent: 410 - - uid: 288 - components: - - type: Transform - pos: -7.5,-1.5 - parent: 410 - - uid: 295 - components: - - type: Transform - pos: -7.5,2.5 - parent: 410 - - uid: 296 - components: - - type: Transform - pos: -4.5,14.5 - parent: 410 - - uid: 297 - components: - - type: Transform - pos: -3.5,14.5 - parent: 410 - - uid: 301 - components: - - type: Transform - pos: -3.5,6.5 - parent: 410 - - uid: 308 - components: - - type: Transform - pos: 2.5,-1.5 - parent: 410 - - uid: 344 - components: - - type: Transform - pos: -7.5,6.5 - parent: 410 - uid: 346 - components: - - type: Transform - pos: 2.5,6.5 - parent: 410 - - uid: 350 - components: - - type: Transform - pos: -1.5,6.5 - parent: 410 - - uid: 356 - components: - - type: Transform - pos: -5.5,-3.5 - parent: 410 - - uid: 449 - components: - - type: Transform - pos: -6.5,12.5 - parent: 410 - - uid: 473 - components: - - type: Transform - pos: -5.5,-5.5 - parent: 410 -- proto: Gyroscope - entities: - - uid: 352 - components: - - type: Transform - pos: -4.5,-4.5 - parent: 410 -- proto: HandheldHealthAnalyzerUnpowered - entities: - - uid: 370 components: - type: Transform pos: 1.5254471,10.577127 - parent: 410 + parent: 1 - proto: HolopadCentCommEvacShuttle entities: - - uid: 108 + - uid: 347 components: - type: Transform pos: -5.5,10.5 - parent: 410 + parent: 1 - proto: LockerEvacRepairFilled entities: - - uid: 128 - components: - - type: Transform - pos: -1.5,-2.5 - parent: 410 -- proto: LockerEvidence - entities: - - uid: 424 - components: - - type: Transform - pos: -3.5,9.5 - parent: 410 -- proto: LockerMedicineFilled - entities: - - uid: 140 - components: - - type: Transform - pos: -0.5,11.5 - parent: 410 -- proto: MedicalBed - entities: - - uid: 365 - components: - - type: Transform - pos: 1.5,9.5 - parent: 410 - - uid: 407 - components: - - type: Transform - pos: -0.5,13.5 - parent: 410 -- proto: MedkitFilled - entities: - - uid: 37 - components: - - type: Transform - pos: -0.4916364,12.55368 - parent: 410 -- proto: Paper - entities: - - uid: 70 - components: - - type: Transform - pos: -2.3867393,13.229256 - parent: 410 - - uid: 304 - components: - - type: Transform - pos: -2.5273643,13.057381 - parent: 410 -- proto: PottedPlant10 - entities: - - uid: 243 - components: - - type: Transform - pos: -2.5,11.5 - parent: 410 -- proto: Poweredlight - entities: - - uid: 77 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -5.5,-1.5 - parent: 410 - - uid: 264 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 0.5,-1.5 - parent: 410 - - uid: 299 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -2.5,12.5 - parent: 410 - - uid: 316 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 0.5,6.5 - parent: 410 - - uid: 355 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -0.5,12.5 - parent: 410 - - uid: 373 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -5.5,6.5 - parent: 410 - - uid: 387 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -3.5,8.5 - parent: 410 - - uid: 411 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,-3.5 - parent: 410 - - uid: 436 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,0.5 - parent: 410 - - uid: 437 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -3.5,4.5 - parent: 410 - - uid: 447 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -6.5,10.5 - parent: 410 -- proto: Screen - entities: - - uid: 87 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 2.5,0.5 - parent: 410 - - uid: 109 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -7.5,4.5 - parent: 410 - - uid: 255 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -1.5,11.5 - parent: 410 -- proto: ShuttleWindow - entities: - - uid: 21 - components: - - type: Transform - pos: 2.5,3.5 - parent: 410 - - uid: 25 - components: - - type: Transform - pos: -0.5,3.5 - parent: 410 - - uid: 27 - components: - - type: Transform - pos: -1.5,6.5 - parent: 410 - - uid: 60 - components: - - type: Transform - pos: -5.5,-5.5 - parent: 410 - - uid: 73 - components: - - type: Transform - pos: -3.5,6.5 - parent: 410 - - uid: 80 - components: - - type: Transform - pos: -4.5,1.5 - parent: 410 - - uid: 81 - components: - - type: Transform - pos: -7.5,2.5 - parent: 410 - - uid: 88 - components: - - type: Transform - pos: 2.5,1.5 - parent: 410 - - uid: 105 - components: - - type: Transform - pos: -3.5,14.5 - parent: 410 - - uid: 112 - components: - - type: Transform - pos: 2.5,2.5 - parent: 410 - - uid: 147 - components: - - type: Transform - pos: -7.5,1.5 - parent: 410 - - uid: 198 - components: - - type: Transform - pos: -7.5,3.5 - parent: 410 - - uid: 230 - components: - - type: Transform - pos: -5.5,14.5 - parent: 410 - - uid: 231 - components: - - type: Transform - pos: -6.5,14.5 - parent: 410 - - uid: 232 - components: - - type: Transform - pos: -6.5,13.5 - parent: 410 - - uid: 252 - components: - - type: Transform - pos: -6.5,8.5 - parent: 410 - - uid: 257 - components: - - type: Transform - pos: 1.5,8.5 - parent: 410 - - uid: 262 - components: - - type: Transform - pos: -4.5,14.5 - parent: 410 - - uid: 265 - components: - - type: Transform - pos: -7.5,6.5 - parent: 410 - - uid: 270 - components: - - type: Transform - pos: -5.5,-3.5 - parent: 410 - - uid: 272 - components: - - type: Transform - pos: -0.5,2.5 - parent: 410 - - uid: 282 - components: - - type: Transform - pos: 2.5,9.5 - parent: 410 - - uid: 283 - components: - - type: Transform - pos: 2.5,10.5 - parent: 410 - - uid: 284 - components: - - type: Transform - pos: 2.5,11.5 - parent: 410 - - uid: 286 - components: - - type: Transform - pos: 2.5,-1.5 - parent: 410 - - uid: 287 - components: - - type: Transform - pos: -0.5,1.5 - parent: 410 - - uid: 290 - components: - - type: Transform - pos: 0.5,-3.5 - parent: 410 - - uid: 307 - components: - - type: Transform - pos: -2.5,14.5 - parent: 410 - - uid: 324 - components: - - type: Transform - pos: -4.5,2.5 - parent: 410 - - uid: 342 - components: - - type: Transform - pos: -4.5,3.5 - parent: 410 - - uid: 364 - components: - - type: Transform - pos: -7.5,-1.5 - parent: 410 - - uid: 409 - components: - - type: Transform - pos: -6.5,12.5 - parent: 410 - - uid: 421 - components: - - type: Transform - pos: 2.5,6.5 - parent: 410 -- proto: SignBridge - entities: - - uid: 238 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -6.5,8.5 - parent: 410 -- proto: SignEngineering - entities: - - uid: 444 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,-1.5 - parent: 410 -- proto: SignMedical - entities: - - uid: 113 - components: - - type: Transform - pos: 1.5,8.5 - parent: 410 -- proto: SignSecurity - entities: - - uid: 190 - components: - - type: Transform - pos: -1.5,6.5 - parent: 410 -- proto: SMESBasic - entities: - - uid: 292 - components: - - type: Transform - pos: -2.5,-4.5 - parent: 410 -- proto: StasisBed - entities: - - uid: 320 - components: - - type: Transform - pos: 1.5,11.5 - parent: 410 -- proto: SubstationWallBasic - entities: - - uid: 58 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -2.5,-5.5 - parent: 410 -- proto: TableGlass - entities: - - uid: 86 - components: - - type: Transform - pos: 1.5,10.5 - parent: 410 - - uid: 374 - components: - - type: Transform - pos: -0.5,12.5 - parent: 410 -- proto: TableReinforced - entities: - - uid: 46 - components: - - type: Transform - pos: -2.5,12.5 - parent: 410 - - uid: 454 - components: - - type: Transform - pos: -2.5,13.5 - parent: 410 -- proto: TableWood - entities: - - uid: 16 - components: - - type: Transform - pos: -6.5,10.5 - parent: 410 -- proto: Thruster - entities: - - uid: 53 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 2.5,-4.5 - parent: 410 - - uid: 67 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -7.5,-4.5 - parent: 410 - - uid: 195 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 2.5,-5.5 - parent: 410 - - uid: 289 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -7.5,-5.5 - parent: 410 - - uid: 334 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -7.5,13.5 - parent: 410 - - uid: 335 - components: - - type: Transform - pos: -7.5,14.5 - parent: 410 - uid: 348 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 2.5,13.5 - parent: 410 - - uid: 360 - components: - - type: Transform - pos: 2.5,14.5 - parent: 410 -- proto: VendingMachineMedical + pos: -1.5,-2.5 + parent: 1 +- proto: LockerEvidence entities: - - uid: 379 + - uid: 349 components: - type: Transform - pos: -0.5,10.5 - parent: 410 -- proto: VendingMachineWallMedical + pos: -3.5,9.5 + parent: 1 +- proto: LockerMedicineFilled entities: - - uid: 211 + - uid: 350 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 1.5,13.5 - parent: 410 -- proto: WallShuttle + pos: -0.5,11.5 + parent: 1 +- proto: MedicalBed entities: - - uid: 3 + - uid: 351 components: - type: Transform - pos: -7.5,-3.5 - parent: 410 - - uid: 7 + pos: 1.5,9.5 + parent: 1 + - uid: 352 components: - type: Transform - pos: -7.5,0.5 - parent: 410 - - uid: 8 - components: - - type: Transform - pos: -4.5,4.5 - parent: 410 - - uid: 9 - components: - - type: Transform - pos: -0.5,-1.5 - parent: 410 - - uid: 10 - components: - - type: Transform - pos: 2.5,4.5 - parent: 410 - - uid: 11 - components: - - type: Transform - pos: -7.5,4.5 - parent: 410 - - uid: 15 - components: - - type: Transform - pos: -7.5,8.5 - parent: 410 - - uid: 28 - components: - - type: Transform - pos: -0.5,9.5 - parent: 410 - - uid: 31 - components: - - type: Transform - pos: 0.5,14.5 - parent: 410 - - uid: 39 - components: - - type: Transform - pos: 1.5,-5.5 - parent: 410 - - uid: 41 - components: - - type: Transform - pos: 2.5,0.5 - parent: 410 - - uid: 59 - components: - - type: Transform - pos: -0.5,-2.5 - parent: 410 - - uid: 69 - components: - - type: Transform - pos: -0.5,14.5 - parent: 410 - - uid: 72 - components: - - type: Transform - pos: -0.5,-3.5 - parent: 410 - - uid: 78 - components: - - type: Transform - pos: -1.5,13.5 - parent: 410 - - uid: 85 - components: - - type: Transform - pos: -1.5,12.5 - parent: 410 - - uid: 92 - components: - - type: Transform - pos: -1.5,14.5 - parent: 410 - - uid: 93 - components: - - type: Transform - pos: -4.5,8.5 - parent: 410 - - uid: 94 - components: - - type: Transform - pos: -4.5,6.5 - parent: 410 - - uid: 98 - components: - - type: Transform - pos: -4.5,-3.5 - parent: 410 - - uid: 131 - components: - - type: Transform - pos: -3.5,-1.5 - parent: 410 - - uid: 143 - components: - - type: Transform - pos: 2.5,-3.5 - parent: 410 - - uid: 144 - components: - - type: Transform - pos: 2.5,8.5 - parent: 410 - - uid: 153 - components: - - type: Transform - pos: 1.5,-3.5 - parent: 410 - - uid: 154 - components: - - type: Transform - pos: -4.5,-2.5 - parent: 410 - - uid: 170 - components: - - type: Transform - pos: -6.5,-3.5 - parent: 410 - - uid: 187 - components: - - type: Transform - pos: -4.5,-1.5 - parent: 410 - - uid: 216 - components: - - type: Transform - pos: 1.5,12.5 - parent: 410 - - uid: 256 - components: - - type: Transform - pos: -1.5,-1.5 - parent: 410 - - uid: 259 - components: - - type: Transform - pos: -0.5,6.5 - parent: 410 - - uid: 267 - components: - - type: Transform - pos: -1.5,-5.5 - parent: 410 - - uid: 269 - components: - - type: Transform - pos: -0.5,-5.5 - parent: 410 - - uid: 276 - components: - - type: Transform - pos: -0.5,0.5 - parent: 410 - - uid: 293 - components: - - type: Transform - pos: -1.5,11.5 - parent: 410 - - uid: 325 - components: - - type: Transform - pos: -3.5,10.5 - parent: 410 - - uid: 327 - components: - - type: Transform - pos: 2.5,12.5 - parent: 410 - - uid: 331 - components: - - type: Transform - pos: -6.5,-5.5 - parent: 410 - - uid: 332 - components: - - type: Transform - pos: -6.5,-4.5 - parent: 410 - - uid: 333 - components: - - type: Transform - pos: 1.5,-4.5 - parent: 410 - - uid: 336 - components: - - type: Transform - pos: 1.5,14.5 - parent: 410 - - uid: 339 - components: - - type: Transform - pos: -4.5,0.5 - parent: 410 - - uid: 361 - components: - - type: Transform - pos: -4.5,10.5 - parent: 410 - - uid: 363 - components: - - type: Transform - pos: -4.5,-5.5 - parent: 410 - - uid: 367 - components: - - type: Transform - pos: -0.5,8.5 - parent: 410 - - uid: 368 - components: - - type: Transform - pos: 0.5,-5.5 - parent: 410 - - uid: 369 - components: - - type: Transform - pos: -2.5,-5.5 - parent: 410 - - uid: 371 - components: - - type: Transform - pos: -7.5,10.5 - parent: 410 - - uid: 372 - components: - - type: Transform - pos: -1.5,9.5 - parent: 410 - - uid: 375 - components: - - type: Transform - pos: -1.5,10.5 - parent: 410 - - uid: 377 - components: - - type: Transform - pos: -4.5,7.5 - parent: 410 - - uid: 385 - components: - - type: Transform - pos: -4.5,9.5 - parent: 410 - - uid: 386 - components: - - type: Transform - pos: 1.5,13.5 - parent: 410 - - uid: 405 - components: - - type: Transform - pos: -3.5,-5.5 - parent: 410 - - uid: 412 - components: - - type: Transform - pos: -7.5,9.5 - parent: 410 - - uid: 414 - components: - - type: Transform - pos: -7.5,11.5 - parent: 410 - - uid: 417 - components: - - type: Transform - pos: -2.5,10.5 - parent: 410 - - uid: 425 - components: - - type: Transform - pos: -0.5,7.5 - parent: 410 - - uid: 446 - components: - - type: Transform - pos: -7.5,12.5 - parent: 410 - - uid: 453 - components: - - type: Transform - pos: -0.5,4.5 - parent: 410 -- proto: WallWeaponCapacitorRecharger + pos: -0.5,13.5 + parent: 1 +- proto: MedkitFilled entities: - - uid: 376 + - uid: 353 components: - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,9.5 - parent: 410 -- proto: WeaponCapacitorRecharger + pos: -0.4916364,12.55368 + parent: 1 +- proto: Paper entities: - - uid: 273 + - uid: 354 components: - type: Transform - pos: -2.5,12.5 - parent: 410 -- proto: WindoorSecureSecurityLocked - entities: - - uid: 107 + pos: -2.3867393,13.229256 + parent: 1 + - uid: 355 components: - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,7.5 - parent: 410 -- proto: WindowReinforcedDirectional + pos: -2.5273643,13.057381 + parent: 1 +- proto: PlasmaWindowDirectional entities: - - uid: 64 + - uid: 488 components: - type: Transform rot: -1.5707963267948966 rad pos: -0.5,-4.5 - parent: 410 + parent: 1 +- proto: PottedPlant10 + entities: + - uid: 356 + components: + - type: Transform + pos: -2.5,11.5 + parent: 1 +- proto: Poweredlight + entities: + - uid: 357 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -5.5,-1.5 + parent: 1 + - uid: 358 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,-1.5 + parent: 1 + - uid: 359 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -2.5,12.5 + parent: 1 + - uid: 360 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,6.5 + parent: 1 + - uid: 361 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,12.5 + parent: 1 + - uid: 362 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -5.5,6.5 + parent: 1 + - uid: 363 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,8.5 + parent: 1 + - uid: 364 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,-3.5 + parent: 1 + - uid: 365 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,0.5 + parent: 1 + - uid: 366 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,4.5 + parent: 1 + - uid: 367 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -6.5,10.5 + parent: 1 +- proto: Screen + entities: + - uid: 368 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 2.5,0.5 + parent: 1 + - type: Fixtures + fixtures: {} + - uid: 369 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -7.5,4.5 + parent: 1 + - type: Fixtures + fixtures: {} + - uid: 370 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -1.5,11.5 + parent: 1 + - type: Fixtures + fixtures: {} +- proto: ShuttleWindow + entities: + - uid: 371 + components: + - type: Transform + pos: 2.5,3.5 + parent: 1 + - uid: 372 + components: + - type: Transform + pos: -0.5,3.5 + parent: 1 + - uid: 373 + components: + - type: Transform + pos: -1.5,6.5 + parent: 1 + - uid: 374 + components: + - type: Transform + pos: -5.5,-5.5 + parent: 1 + - uid: 375 + components: + - type: Transform + pos: -3.5,6.5 + parent: 1 + - uid: 376 + components: + - type: Transform + pos: -4.5,1.5 + parent: 1 + - uid: 377 + components: + - type: Transform + pos: -7.5,2.5 + parent: 1 + - uid: 378 + components: + - type: Transform + pos: 2.5,1.5 + parent: 1 + - uid: 379 + components: + - type: Transform + pos: -3.5,14.5 + parent: 1 + - uid: 380 + components: + - type: Transform + pos: 2.5,2.5 + parent: 1 + - uid: 381 + components: + - type: Transform + pos: -7.5,1.5 + parent: 1 + - uid: 382 + components: + - type: Transform + pos: -7.5,3.5 + parent: 1 + - uid: 383 + components: + - type: Transform + pos: -5.5,14.5 + parent: 1 + - uid: 384 + components: + - type: Transform + pos: -6.5,14.5 + parent: 1 + - uid: 385 + components: + - type: Transform + pos: -6.5,13.5 + parent: 1 + - uid: 386 + components: + - type: Transform + pos: -6.5,8.5 + parent: 1 + - uid: 387 + components: + - type: Transform + pos: 1.5,8.5 + parent: 1 + - uid: 388 + components: + - type: Transform + pos: -4.5,14.5 + parent: 1 + - uid: 389 + components: + - type: Transform + pos: -7.5,6.5 + parent: 1 + - uid: 390 + components: + - type: Transform + pos: -5.5,-3.5 + parent: 1 + - uid: 391 + components: + - type: Transform + pos: -0.5,2.5 + parent: 1 + - uid: 392 + components: + - type: Transform + pos: 2.5,9.5 + parent: 1 + - uid: 393 + components: + - type: Transform + pos: 2.5,10.5 + parent: 1 + - uid: 394 + components: + - type: Transform + pos: 2.5,11.5 + parent: 1 + - uid: 395 + components: + - type: Transform + pos: 2.5,-1.5 + parent: 1 + - uid: 396 + components: + - type: Transform + pos: -0.5,1.5 + parent: 1 + - uid: 397 + components: + - type: Transform + pos: 0.5,-3.5 + parent: 1 + - uid: 398 + components: + - type: Transform + pos: -2.5,14.5 + parent: 1 + - uid: 399 + components: + - type: Transform + pos: -4.5,2.5 + parent: 1 + - uid: 400 + components: + - type: Transform + pos: -4.5,3.5 + parent: 1 + - uid: 401 + components: + - type: Transform + pos: -7.5,-1.5 + parent: 1 + - uid: 402 + components: + - type: Transform + pos: -6.5,12.5 + parent: 1 - uid: 403 + components: + - type: Transform + pos: 2.5,6.5 + parent: 1 +- proto: SignBridge + entities: + - uid: 404 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -6.5,8.5 + parent: 1 + - type: Fixtures + fixtures: {} +- proto: SignEngineering + entities: + - uid: 405 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,-1.5 + parent: 1 + - type: Fixtures + fixtures: {} +- proto: SignMedical + entities: + - uid: 406 + components: + - type: Transform + pos: 1.5,8.5 + parent: 1 + - type: Fixtures + fixtures: {} +- proto: SignSecurity + entities: + - uid: 407 + components: + - type: Transform + pos: -1.5,6.5 + parent: 1 + - type: Fixtures + fixtures: {} +- proto: SMESBasic + entities: + - uid: 408 + components: + - type: Transform + pos: -2.5,-4.5 + parent: 1 +- proto: StasisBed + entities: + - uid: 409 + components: + - type: Transform + pos: 1.5,11.5 + parent: 1 +- proto: SubstationWallBasic + entities: + - uid: 410 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -2.5,-5.5 + parent: 1 +- proto: TableGlass + entities: + - uid: 411 + components: + - type: Transform + pos: 1.5,10.5 + parent: 1 + - uid: 412 + components: + - type: Transform + pos: -0.5,12.5 + parent: 1 +- proto: TableReinforced + entities: + - uid: 413 + components: + - type: Transform + pos: -2.5,12.5 + parent: 1 + - uid: 414 + components: + - type: Transform + pos: -2.5,13.5 + parent: 1 +- proto: TableWood + entities: + - uid: 415 + components: + - type: Transform + pos: -6.5,10.5 + parent: 1 +- proto: Thruster + entities: + - uid: 416 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 2.5,-4.5 + parent: 1 + - uid: 417 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -7.5,-4.5 + parent: 1 + - uid: 418 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 2.5,-5.5 + parent: 1 + - uid: 419 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -7.5,-5.5 + parent: 1 + - uid: 420 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -7.5,13.5 + parent: 1 + - uid: 421 + components: + - type: Transform + pos: -7.5,14.5 + parent: 1 + - uid: 422 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 2.5,13.5 + parent: 1 + - uid: 423 + components: + - type: Transform + pos: 2.5,14.5 + parent: 1 +- proto: VendingMachineMedical + entities: + - uid: 424 + components: + - type: Transform + pos: -0.5,10.5 + parent: 1 +- proto: VendingMachineWallMedical + entities: + - uid: 425 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 1.5,13.5 + parent: 1 + - type: Fixtures + fixtures: {} +- proto: WallShuttle + entities: + - uid: 426 + components: + - type: Transform + pos: -7.5,-3.5 + parent: 1 + - uid: 427 + components: + - type: Transform + pos: -7.5,0.5 + parent: 1 + - uid: 428 + components: + - type: Transform + pos: -4.5,4.5 + parent: 1 + - uid: 429 + components: + - type: Transform + pos: -0.5,-1.5 + parent: 1 + - uid: 430 + components: + - type: Transform + pos: 2.5,4.5 + parent: 1 + - uid: 431 + components: + - type: Transform + pos: -7.5,4.5 + parent: 1 + - uid: 432 + components: + - type: Transform + pos: -7.5,8.5 + parent: 1 + - uid: 433 + components: + - type: Transform + pos: -0.5,9.5 + parent: 1 + - uid: 434 + components: + - type: Transform + pos: 0.5,14.5 + parent: 1 + - uid: 435 + components: + - type: Transform + pos: 1.5,-5.5 + parent: 1 + - uid: 436 + components: + - type: Transform + pos: 2.5,0.5 + parent: 1 + - uid: 437 + components: + - type: Transform + pos: -0.5,-2.5 + parent: 1 + - uid: 438 + components: + - type: Transform + pos: -0.5,14.5 + parent: 1 + - uid: 439 + components: + - type: Transform + pos: -0.5,-3.5 + parent: 1 + - uid: 440 + components: + - type: Transform + pos: -1.5,13.5 + parent: 1 + - uid: 441 + components: + - type: Transform + pos: -1.5,12.5 + parent: 1 + - uid: 442 + components: + - type: Transform + pos: -1.5,14.5 + parent: 1 + - uid: 443 + components: + - type: Transform + pos: -4.5,8.5 + parent: 1 + - uid: 444 + components: + - type: Transform + pos: -4.5,6.5 + parent: 1 + - uid: 445 + components: + - type: Transform + pos: -4.5,-3.5 + parent: 1 + - uid: 446 + components: + - type: Transform + pos: -3.5,-1.5 + parent: 1 + - uid: 447 + components: + - type: Transform + pos: 2.5,-3.5 + parent: 1 + - uid: 448 + components: + - type: Transform + pos: 2.5,8.5 + parent: 1 + - uid: 449 + components: + - type: Transform + pos: 1.5,-3.5 + parent: 1 + - uid: 450 + components: + - type: Transform + pos: -4.5,-2.5 + parent: 1 + - uid: 451 + components: + - type: Transform + pos: -6.5,-3.5 + parent: 1 + - uid: 452 + components: + - type: Transform + pos: -4.5,-1.5 + parent: 1 + - uid: 453 + components: + - type: Transform + pos: 1.5,12.5 + parent: 1 + - uid: 454 + components: + - type: Transform + pos: -1.5,-1.5 + parent: 1 + - uid: 455 + components: + - type: Transform + pos: -0.5,6.5 + parent: 1 + - uid: 456 + components: + - type: Transform + pos: -1.5,-5.5 + parent: 1 + - uid: 457 + components: + - type: Transform + pos: -0.5,-5.5 + parent: 1 + - uid: 458 + components: + - type: Transform + pos: -0.5,0.5 + parent: 1 + - uid: 459 + components: + - type: Transform + pos: -1.5,11.5 + parent: 1 + - uid: 460 + components: + - type: Transform + pos: -3.5,10.5 + parent: 1 + - uid: 461 + components: + - type: Transform + pos: 2.5,12.5 + parent: 1 + - uid: 462 + components: + - type: Transform + pos: -6.5,-5.5 + parent: 1 + - uid: 463 + components: + - type: Transform + pos: -6.5,-4.5 + parent: 1 + - uid: 464 + components: + - type: Transform + pos: 1.5,-4.5 + parent: 1 + - uid: 465 + components: + - type: Transform + pos: 1.5,14.5 + parent: 1 + - uid: 466 + components: + - type: Transform + pos: -4.5,0.5 + parent: 1 + - uid: 467 + components: + - type: Transform + pos: -4.5,10.5 + parent: 1 + - uid: 468 + components: + - type: Transform + pos: -4.5,-5.5 + parent: 1 + - uid: 469 + components: + - type: Transform + pos: -0.5,8.5 + parent: 1 + - uid: 470 + components: + - type: Transform + pos: 0.5,-5.5 + parent: 1 + - uid: 471 + components: + - type: Transform + pos: -2.5,-5.5 + parent: 1 + - uid: 472 + components: + - type: Transform + pos: -7.5,10.5 + parent: 1 + - uid: 473 + components: + - type: Transform + pos: -1.5,9.5 + parent: 1 + - uid: 474 + components: + - type: Transform + pos: -1.5,10.5 + parent: 1 + - uid: 475 + components: + - type: Transform + pos: -4.5,7.5 + parent: 1 + - uid: 476 + components: + - type: Transform + pos: -4.5,9.5 + parent: 1 + - uid: 477 + components: + - type: Transform + pos: 1.5,13.5 + parent: 1 + - uid: 478 + components: + - type: Transform + pos: -3.5,-5.5 + parent: 1 + - uid: 479 + components: + - type: Transform + pos: -7.5,9.5 + parent: 1 + - uid: 480 + components: + - type: Transform + pos: -7.5,11.5 + parent: 1 + - uid: 481 + components: + - type: Transform + pos: -2.5,10.5 + parent: 1 + - uid: 482 + components: + - type: Transform + pos: -0.5,7.5 + parent: 1 + - uid: 483 + components: + - type: Transform + pos: -7.5,12.5 + parent: 1 + - uid: 484 + components: + - type: Transform + pos: -0.5,4.5 + parent: 1 +- proto: WallWeaponCapacitorRecharger + entities: + - uid: 485 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,9.5 + parent: 1 +- proto: WeaponCapacitorRecharger + entities: + - uid: 486 + components: + - type: Transform + pos: -2.5,12.5 + parent: 1 +- proto: WindoorSecureSecurityLocked + entities: + - uid: 487 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,7.5 + parent: 1 +- proto: WindowReinforcedDirectional + entities: + - uid: 489 components: - type: Transform rot: -1.5707963267948966 rad pos: -4.5,-4.5 - parent: 410 - - uid: 448 + parent: 1 + - uid: 490 components: - type: Transform rot: -1.5707963267948966 rad pos: -1.5,8.5 - parent: 410 + parent: 1 - proto: Wrench entities: - - uid: 343 + - uid: 491 components: - type: Transform pos: -2.4217896,-3.4986176 - parent: 410 + parent: 1 ... From b080ce7133994037c570b2f02429d23ed18e0a7a Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 19 Nov 2025 22:16:34 +0000 Subject: [PATCH 094/106] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 024e0c6d5a..41504f6821 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: AreYouConfused - changes: - - message: Bulldog bundle now accurately says what is included - type: Fix - id: 8712 - time: '2025-06-24T21:58:58.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38558 - author: Dragonjspider changes: - message: The Cutter Machine no longer makes Dark Techmaints floor tiles for free @@ -3925,3 +3918,11 @@ id: 9212 time: '2025-11-19T02:58:33.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41487 +- author: korczoczek + changes: + - message: Packed's evac shuttle will no longer have its air chamber glass break + upon loading + type: Fix + id: 9213 + time: '2025-11-19T22:15:26.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41500 From 91f5138a617501b41e6951aede8ed2519ad13a19 Mon Sep 17 00:00:00 2001 From: Noah Beverly Date: Wed, 19 Nov 2025 21:18:19 -0700 Subject: [PATCH 095/106] Mail Cart (#41482) * Add mailcart crate type * Add recent progress, move location of mailcart.rsi * Allow letters and packages to be inserted * Add updated sprites for mailcart * Add storage for letters * Bugfix for sprite * Add fix for mincount mailcart sprite updates * Add dynamic names to packages in mailcart * Add additional whitelist items * Update tag comments * Remove max item size * Update fixture for mailcart, remove unused code from crates.yml * Add mail cart to cargo ordering * Update meta.json * Remove unused comment * Update copyright * Add missing ContainerContainer * Update ContainerContainer * Revert "Update ContainerContainer" This reverts commit 1805dcd58d8c0f52baca9db0d3173940ee241159. * Remove container slots and increase storage * Remove unused tags * Remove LetterDelivery tag --------- Co-authored-by: Justin Pfeifler --- .../Prototypes/Catalog/Cargo/cargo_cargo.yml | 10 ++ .../Objects/Deliveries/deliveries.yml | 3 + .../Structures/Specific/Cargo/mailcart.yml | 94 ++++++++++++++++++ Resources/Prototypes/tags.yml | 11 +- .../Specific/Cargo/mailcart.rsi/icon.png | Bin 0 -> 959 bytes .../Cargo/mailcart.rsi/mailcart_base.png | Bin 0 -> 959 bytes .../Specific/Cargo/mailcart.rsi/meta.json | 41 ++++++++ .../Specific/Cargo/mailcart.rsi/package_1.png | Bin 0 -> 137 bytes .../Specific/Cargo/mailcart.rsi/package_2.png | Bin 0 -> 137 bytes .../Specific/Cargo/mailcart.rsi/package_3.png | Bin 0 -> 136 bytes .../Specific/Cargo/mailcart.rsi/package_4.png | Bin 0 -> 134 bytes .../Specific/Cargo/mailcart.rsi/package_5.png | Bin 0 -> 170 bytes .../Specific/Cargo/mailcart.rsi/package_6.png | Bin 0 -> 171 bytes .../Specific/Cargo/mailcart.rsi/package_7.png | Bin 0 -> 169 bytes .../Specific/Cargo/mailcart.rsi/package_8.png | Bin 0 -> 170 bytes 15 files changed, 155 insertions(+), 4 deletions(-) create mode 100644 Resources/Prototypes/Entities/Structures/Specific/Cargo/mailcart.yml create mode 100644 Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/icon.png create mode 100644 Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/mailcart_base.png create mode 100644 Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_1.png create mode 100644 Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_2.png create mode 100644 Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_3.png create mode 100644 Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_4.png create mode 100644 Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_5.png create mode 100644 Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_6.png create mode 100644 Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_7.png create mode 100644 Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_8.png diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_cargo.yml b/Resources/Prototypes/Catalog/Cargo/cargo_cargo.yml index 050aa647b8..132f1b3c09 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_cargo.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_cargo.yml @@ -37,3 +37,13 @@ cost: 2500 category: cargoproduct-category-name-cargo group: market + +- type: cargoProduct + id: CargoMailCart + icon: + sprite: Objects/Specific/Cargo/mailcart.rsi + state: icon + product: MailCart + cost: 300 + category: cargoproduct-category-name-cargo + group: market diff --git a/Resources/Prototypes/Entities/Objects/Deliveries/deliveries.yml b/Resources/Prototypes/Entities/Objects/Deliveries/deliveries.yml index a011460366..9267009b3e 100644 --- a/Resources/Prototypes/Entities/Objects/Deliveries/deliveries.yml +++ b/Resources/Prototypes/Entities/Objects/Deliveries/deliveries.yml @@ -102,6 +102,9 @@ containers: delivery: !type:NestedSelector tableId: PackageDeliveryRewards + - type: Tag + tags: + - PackageDelivery - type: entity parent: BaseDelivery diff --git a/Resources/Prototypes/Entities/Structures/Specific/Cargo/mailcart.yml b/Resources/Prototypes/Entities/Structures/Specific/Cargo/mailcart.yml new file mode 100644 index 0000000000..4042b115f5 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Specific/Cargo/mailcart.yml @@ -0,0 +1,94 @@ +# Mailcart +- type: entity + name: mail cart + id: MailCart + parent: [BaseStructureDynamic, StructureWheeled] + description: Deliver packages with style and efficiency. + components: + - type: Sprite + noRot: true + sprite: Objects/Specific/Cargo/mailcart.rsi + layers: + - state: mailcart_base + - type: InteractionOutline + - type: Storage + grid: + - 0,0,15,7 + quickInsert: true + maxItemSize: Huge + whitelist: + components: + - Delivery + tags: + - Paper + - Document + - BoxCardboard + - Folder + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.18,-0.2,0.18,0.2" + density: 60 + mask: + - FullTileMask + layer: + - LargeMobLayer + - type: Damageable + damageContainer: Inorganic + damageModifierSet: Metallic + - type: Destructible + thresholds: + - trigger: !type:DamageTrigger + damage: 400 + behaviors: + - !type:DoActsBehavior + acts: ["Destruction"] + - trigger: !type:DamageTrigger + damage: 200 + behaviors: + - !type:EmptyAllContainersBehaviour + - !type:DoActsBehavior + acts: ["Destruction"] + - !type:PlaySoundBehavior + sound: + collection: MetalBreak + - type: ItemMapper + mapLayers: + package_1: + minCount: 1 + whitelist: &PackageWhitelist + tags: + - PackageDelivery + package_2: + minCount: 2 + whitelist: *PackageWhitelist + package_3: + minCount: 3 + whitelist: *PackageWhitelist + package_4: + minCount: 4 + whitelist: *PackageWhitelist + package_5: + minCount: 5 + whitelist: *PackageWhitelist + package_6: + minCount: 6 + whitelist: *PackageWhitelist + package_7: + minCount: 7 + whitelist: *PackageWhitelist + package_8: + minCount: 8 + whitelist: *PackageWhitelist + sprite: Objects/Specific/Cargo/mailcart.rsi + - type: Appearance + - type: UserInterface + interfaces: + enum.StorageUiKey.Key: + type: StorageBoundUserInterface + - type: ContainerContainer + containers: + storagebase: !type:Container + ents: [] diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 44b636495c..274d9447b4 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -159,7 +159,7 @@ id: Bottle # Storage whitelist: ChemMaster, ChemBag, SmartFridge, ClothingBeltJanitor, ClothingBeltMedical, ClothingBeltPlant - type: Tag - id: BoxCardboard # CargoBounty: BountyCardboardBox + id: BoxCardboard # CargoBounty: BountyCardboardBox. Storage whitelist: MailCart - type: Tag id: BoxHug # ConstructionGraph: HugBot @@ -465,7 +465,7 @@ id: DockEmergency # Used bv EmergencyShuttleSystem for finding a priority FTL destination. - type: Tag - id: Document # A superset of Paper tag. Represents a paper-like entity with writing on it, but is not necessarily writeable itself. + id: Document # A superset of Paper tag. Represents a paper-like entity with writing on it, but is not necessarily writeable itself. Storage whitelist: MailCart - type: Tag id: DonkPocket # Storage whitelist: FoodBoxDonkpocket @@ -581,7 +581,7 @@ id: Flower # CargoBounty: flowerwreath. CargoBounty: BountyFlower - type: Tag - id: Folder # Storage whitelist: Bookshelf, NoticeBoard + id: Folder # Storage whitelist: Bookshelf, NoticeBoard, MailCart - type: Tag id: FoodSnack # Storage whitelist: CandyBucket, CandyBowl. ItemMapper: CandyBowl @@ -1024,6 +1024,9 @@ ## P ## +- type: Tag + id: PackageDelivery # ItemMapper: MailCart + - type: Tag id: Packet # Storage whitelist: ClothingBeltChef @@ -1031,7 +1034,7 @@ id: Pancake # CargoBounty: BountyPancake - type: Tag - id: Paper # A writeable piece of paper. Subset of Document tag. SpecialDigestible: OrganMothStomach, OrganReptilianStomach + id: Paper # A writeable piece of paper. Subset of Document tag. SpecialDigestible: OrganMothStomach, OrganReptilianStomach. Storage whitelist: MailCart - type: Tag id: ParadoxCloneObjectiveBlacklist # objective entities with this tag don't get copied to paradox clones diff --git a/Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/icon.png b/Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..eff08d666224eed07b78b8830a32062457fcb18a GIT binary patch literal 959 zcmV;w13>(VP)Px&c}YY;R9J=WmcMTlR}jZPV=hu88{3M{yB#<|F-0UBNI?~eAL3tNFI7N_6eUuM z{0pQFN)^&j5E^{{02D~jq&ArH5LmX0=&kPn8%K&FJCowgd;9kGj)*GFO>?(9Z+?B} zJF^caGLeZ)WFr5wNcwQ$;syQv$p^Iqhi@JVKx_Vr4jTvEf9Z#HpPh7UY&?@j0B4cEZ0|m!^-Lkcklk@Lxu_x zI0HPf@U$R<+UHsY5<^NAR##Smjd~06EZ4Gh5+D$g-i5?P5fxvaRBRN>Ktk}8pCZOr zMO8g9hY)X>b&@Uobn~W}S>GizT@(HpAw|r&)TpN$aWLNhP5GrJ4$0Zti%T6U+xH%+5{o^vSbo3`2qYdk1`SYKfz% z?--W(3|dFOa(L|9hHh9||J>qmjE`eSw|Kd^Rd0c+=Yb#$cKbNlwowYR?;Db9A16C} zfAuelq7!=IcYwmZZkJ!WACfVklpU~1!8oEQxeR<;O{Oq{xzbfEf=C*_cx0c zF+_~&Dv;@&xVS{Y$+i0KPxpXxrA*JvsPTwhu9L(w#s^AyH(wS7Dsj-_`VCc=TsOW} ztwgo9i<;j8QQYQ(#%qAZkD=VW&+^&(BlSVDCBbcuK9entXh9Uyd~yDpk;ZSzAIIua zdF^hz!^e%dycqr*XL(zXPtUUT>eNW%lM64{8jRMZa^j;GY>)AAV&NqR2YZyR-@Fe1 z-8wh_w(VP)Px&c}YY;R9J=WmcMTlR}jZPV=hu88{3M{yB#<|F-0UBNI?~eAL3tNFI7N_6eUuM z{0pQFN)^&j5E^{{02D~jq&ArH5LmX0=&kPn8%K&FJCowgd;9kGj)*GFO>?(9Z+?B} zJF^caGLeZ)WFr5wNcwQ$;syQv$p^Iqhi@JVKx_Vr4jTvEf9Z#HpPh7UY&?@j0B4cEZ0|m!^-Lkcklk@Lxu_x zI0HPf@U$R<+UHsY5<^NAR##Smjd~06EZ4Gh5+D$g-i5?P5fxvaRBRN>Ktk}8pCZOr zMO8g9hY)X>b&@Uobn~W}S>GizT@(HpAw|r&)TpN$aWLNhP5GrJ4$0Zti%T6U+xH%+5{o^vSbo3`2qYdk1`SYKfz% z?--W(3|dFOa(L|9hHh9||J>qmjE`eSw|Kd^Rd0c+=Yb#$cKbNlwowYR?;Db9A16C} zfAuelq7!=IcYwmZZkJ!WACfVklpU~1!8oEQxeR<;O{Oq{xzbfEf=C*_cx0c zF+_~&Dv;@&xVS{Y$+i0KPxpXxrA*JvsPTwhu9L(w#s^AyH(wS7Dsj-_`VCc=TsOW} ztwgo9i<;j8QQYQ(#%qAZkD=VW&+^&(BlSVDCBbcuK9entXh9Uyd~yDpk;ZSzAIIua zdF^hz!^e%dycqr*XL(zXPtUUT>eNW%lM64{8jRMZa^j;GY>)AAV&NqR2YZyR-@Fe1 z-8wh_wlve c0~64S9r5fety>ju0F7htboFyt=akR{0CYDeY5)KL literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_2.png b/Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_2.png new file mode 100644 index 0000000000000000000000000000000000000000..dc35d82b8daf3a906f6a3b28e3a13e04a4accd4c GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}&YmugArY;~ z2@1k29f|Amwa#yXs z*kYzLUme~r+pVi+`8#Z8@=M`Rt*GaWH~zNS{`t<|BEgsu$r*XRyQ706W~H`BQ&>WR QD9}CzPgg&ebxsLQ002lizyJUM literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_6.png b/Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_6.png new file mode 100644 index 0000000000000000000000000000000000000000..60cb003b100fac4688af9c9fc76bef06f1245da5 GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}sh%#5ArY-_ z&n@I_Fc4^cDBqN##CC8&pw2-d4U;Czopr0K+*x6aWAK literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_8.png b/Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_8.png new file mode 100644 index 0000000000000000000000000000000000000000..8363766ecba58432a873bda79ef37a9818ecb08a GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}DV{ElArY-_ z&l&PLIEb`7oUbwWgriB;RPP-vUTX^kw-=~ea44$rjF6*2UngH2@JHP+{ literal 0 HcmV?d00001 From fb55064420106f49061fec47c4730e98a44a8b96 Mon Sep 17 00:00:00 2001 From: ThatGuyUSA Date: Wed, 19 Nov 2025 21:07:01 -0800 Subject: [PATCH 096/106] Munitions visibility tweaking and cleanup (#41137) * I didn't make an init commit, 1: because i forgot, 2: because the PR is so tiny, the whole thing is done already * beans and shards no glow, clean up * commented out PointLight, does too little for how straining it would be * Improvised shells now use shards as their bullet sprite, they still don't embed though --- .../Guns/Ammunition/Projectiles/grenade.yml | 12 -------- .../Guns/Ammunition/Projectiles/shotgun.yml | 28 +++++-------------- .../Weapons/Guns/Projectiles/projectiles.yml | 5 ++++ 3 files changed, 12 insertions(+), 33 deletions(-) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/grenade.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/grenade.yml index 02aab56f7b..822c1fea17 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/grenade.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/grenade.yml @@ -4,9 +4,6 @@ categories: [ HideSpawnMenu ] parent: BaseBullet components: - - type: Sprite - sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi - state: buckshot - type: Projectile deleteOnCollide: false damage: @@ -23,9 +20,6 @@ categories: [ HideSpawnMenu ] parent: BaseBullet components: - - type: Sprite - sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi - state: buckshot - type: Projectile deleteOnCollide: false damage: @@ -40,9 +34,6 @@ categories: [ HideSpawnMenu ] parent: BaseBulletIncendiary components: - - type: Sprite - sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi - state: buckshot-flare - type: Projectile deleteOnCollide: false damage: @@ -61,9 +52,6 @@ categories: [ HideSpawnMenu ] parent: BaseBullet components: - - type: Sprite - sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi - state: buckshot - type: Projectile deleteOnCollide: false damage: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml index 63d07eb2f2..070ce21171 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml @@ -22,7 +22,9 @@ components: - type: Sprite sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi - state: buckshot + layers: + - state: bullet #just reapplying to here so it can be shaded + - type: Projectile damage: types: @@ -36,9 +38,6 @@ categories: [ HideSpawnMenu ] parent: BaseBullet components: - - type: Sprite - sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi - state: buckshot - type: Projectile damage: types: @@ -62,9 +61,6 @@ categories: [ HideSpawnMenu ] parent: BaseBulletIncendiary components: - - type: Sprite - sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi - state: buckshot-flare - type: Projectile damage: types: @@ -89,9 +85,6 @@ categories: [ HideSpawnMenu ] parent: BaseBulletPractice components: - - type: Sprite - sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi - state: buckshot - type: Projectile damage: types: @@ -115,7 +108,9 @@ components: - type: Sprite sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi - state: shard + layers: + - state: shard + shader: unshaded - type: Projectile damage: types: @@ -138,9 +133,6 @@ categories: [ HideSpawnMenu ] parent: BaseBulletPractice components: - - type: Sprite - sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi - state: buckshot - type: Projectile damage: types: @@ -204,13 +196,8 @@ id: PelletShotgunUranium name: pellet (.50 uranium) categories: [ HideSpawnMenu ] - parent: BaseBullet + parent: BaseBulletUranium components: - - type: Sprite - sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi - layers: - - state: uranium - shader: unshaded - type: Projectile damage: types: @@ -266,7 +253,6 @@ sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi layers: - state: shard - shader: unshaded - type: EmbeddableProjectile deleteOnRemove: true - type: Projectile diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml index c52a49b09b..132bd267fd 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml @@ -178,6 +178,11 @@ sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi layers: - state: uranium + shader: unshaded + # - type: PointLight // Too resource intensive for what little effect it has, one day... + # enabled: true + # color: "#059919" + # radius: 2.0 - type: Projectile damage: types: From 8d4888b726aa51e4fb64b9d1405d3b13c6e1ac0c Mon Sep 17 00:00:00 2001 From: Errant <35878406+Errant-4@users.noreply.github.com> Date: Fri, 21 Nov 2025 23:48:00 +0100 Subject: [PATCH 097/106] HOTFIX Add logging to gamepreset fallback (#41522) * Add logging to gamepreset fallback * cleanup --- Content.Server/GameTicking/GameTicker.GamePreset.cs | 6 ++++++ Content.Server/GameTicking/Rules/GameRuleSystem.cs | 6 +++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Content.Server/GameTicking/GameTicker.GamePreset.cs b/Content.Server/GameTicking/GameTicker.GamePreset.cs index 69cc1c4165..1973daa5a1 100644 --- a/Content.Server/GameTicking/GameTicker.GamePreset.cs +++ b/Content.Server/GameTicking/GameTicker.GamePreset.cs @@ -35,6 +35,7 @@ public sealed partial class GameTicker private bool StartPreset(ICommonSession[] origReadyPlayers, bool force) { + _sawmill.Info($"Attempting to start preset '{CurrentPreset?.ID}'"); var startAttempt = new RoundStartAttemptEvent(origReadyPlayers, force); RaiseLocalEvent(startAttempt); @@ -56,9 +57,12 @@ public sealed partial class GameTicker var fallbackPresets = _cfg.GetCVar(CCVars.GameLobbyFallbackPreset).Split(","); var startFailed = true; + _sawmill.Info($"Fallback - Failed to start round, attempting to start fallback presets."); foreach (var preset in fallbackPresets) { + _sawmill.Info($"Fallback - Clearing up gamerules"); ClearGameRules(); + _sawmill.Info($"Fallback - Attempting to start '{preset}'"); SetGamePreset(preset, resetDelay: 1); AddGamePresetRules(); StartGamePresetRules(); @@ -76,6 +80,7 @@ public sealed partial class GameTicker startFailed = false; break; } + _sawmill.Info($"Fallback - '{preset}' failed to start."); } if (startFailed) @@ -87,6 +92,7 @@ public sealed partial class GameTicker else { + _sawmill.Info($"Fallback - Failed to start preset but fallbacks are disabled. Returning to Lobby."); FailedPresetRestart(); return false; } diff --git a/Content.Server/GameTicking/Rules/GameRuleSystem.cs b/Content.Server/GameTicking/Rules/GameRuleSystem.cs index cb5b117549..6b4240dd7f 100644 --- a/Content.Server/GameTicking/Rules/GameRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/GameRuleSystem.cs @@ -38,6 +38,8 @@ public abstract partial class GameRuleSystem : EntitySystem where T : ICompon while (query.MoveNext(out var uid, out _, out var gameRule)) { var minPlayers = gameRule.MinPlayers; + var name = ToPrettyString(uid); + if (args.Players.Length >= minPlayers) continue; @@ -46,8 +48,10 @@ public abstract partial class GameRuleSystem : EntitySystem where T : ICompon ChatManager.SendAdminAnnouncement(Loc.GetString("preset-not-enough-ready-players", ("readyPlayersCount", args.Players.Length), ("minimumPlayers", minPlayers), - ("presetName", ToPrettyString(uid)))); + ("presetName", name))); args.Cancel(); + //TODO remove this once announcements are logged + Log.Info($"Rule '{name}' requires {minPlayers} players, but only {args.Players.Length} are ready."); } else { From 5e294dcecccca26228856e8ab614175cb819fc9e Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Sun, 23 Nov 2025 14:14:12 +0100 Subject: [PATCH 098/106] Revert 39040 FTL Fixes (#41540) Revert "FTL Fixes (#39040)" This reverts commit 52a9f9b576f5f75f4ad40c2b824b52bddf1e8825. --- .../Systems/ShuttleSystem.FasterThanLight.cs | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs index 4ca0b53035..a63359077f 100644 --- a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs +++ b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs @@ -801,7 +801,11 @@ public sealed partial class ShuttleSystem while (iteration < FTLProximityIterations) { grids.Clear(); - _mapManager.FindGridsIntersecting(mapId, targetAABB, ref grids); + // We pass in an expanded offset here so we can safely do a random offset later. + // We don't include this in the actual targetAABB because then we would be double-expanding it. + // Once in this loop, then again when placing the shuttle later. + // Note that targetAABB already has expansionAmount factored in already. + _mapManager.FindGridsIntersecting(mapId, targetAABB.Enlarged(maxOffset), ref grids); foreach (var grid in grids) { @@ -834,10 +838,6 @@ public sealed partial class ShuttleSystem if (nearbyGrids.Contains(uid)) continue; - // We pass in an expanded offset here so we can safely do a random offset later. - // We don't include this in the actual targetAABB because then we would be double-expanding it. - // Once in this loop, then again when placing the shuttle later. - // Note that targetAABB already has expansionAmount factored in already. targetAABB = targetAABB.Union( _transform.GetWorldMatrix(uid) .TransformBox(Comp(uid).LocalAABB.Enlarged(expansionAmount))); @@ -857,7 +857,7 @@ public sealed partial class ShuttleSystem // TODO: This should prefer the position's angle instead. // TODO: This is pretty crude for multiple landings. - if (nearbyGrids.Count >= 1) + if (nearbyGrids.Count > 1 || !HasComp(targetXform.GridUid)) { // Pick a random angle var offsetAngle = _random.NextAngle(); @@ -866,9 +866,13 @@ public sealed partial class ShuttleSystem var minRadius = MathF.Max(targetAABB.Width / 2f, targetAABB.Height / 2f); spawnPos = targetAABB.Center + offsetAngle.RotateVec(new Vector2(_random.NextFloat(minRadius + minOffset, minRadius + maxOffset), 0f)); } + else if (shuttleBody != null) + { + (spawnPos, angle) = _transform.GetWorldPositionRotation(targetXform); + } else { - spawnPos = _transform.ToWorldPosition(targetCoordinates); + spawnPos = _transform.GetWorldPosition(targetXform); } var offset = Vector2.Zero; @@ -889,10 +893,10 @@ public sealed partial class ShuttleSystem } // Rotate our localcenter around so we spawn exactly where we "think" we should (center of grid on the dot). - var transform = new Transform(_transform.ToWorldPosition(xform.Coordinates), angle); - var adjustedOffset = Robust.Shared.Physics.Transform.Mul(transform, offset); + var transform = new Transform(spawnPos, angle); + spawnPos = Robust.Shared.Physics.Transform.Mul(transform, offset); - coordinates = new EntityCoordinates(targetXform.MapUid.Value, spawnPos + adjustedOffset); + coordinates = new EntityCoordinates(targetXform.MapUid.Value, spawnPos - offset); return true; } From f69ab92f6c6b15fcdaf67e612266899dcfc6cca8 Mon Sep 17 00:00:00 2001 From: kosticia Date: Tue, 25 Nov 2025 01:32:12 +0300 Subject: [PATCH 099/106] =?UTF-8?q?=D0=9F=D0=BE=D1=80=D1=82=20=D0=BB=D0=BE?= =?UTF-8?q?=D0=BA=D0=B0=D0=BB=D0=B8=20=D0=B0=D0=BF=D1=81=D1=82=D1=80=D0=B8?= =?UTF-8?q?=D0=BC=D0=B0=2028.10.25=20(#3450)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: lzk <124214523+lzk228@users.noreply.github.com> Co-authored-by: JunJun Co-authored-by: lapatison <100279397+lapatison@users.noreply.github.com> Co-authored-by: cfif126 <94059374+cfif126@users.noreply.github.com> --- .../components/id-card-console-component.ftl | 2 + .../Locale/ru-RU/accessories/human-hair.ftl | 1 + .../ru-RU/administration/admin-verbs.ftl | 41 +++++ .../Locale/ru-RU/administration/bwoink.ftl | 1 + .../Locale/ru-RU/administration/smites.ftl | 6 +- .../tabs/admin-tab/player-actions-window.ftl | 3 - .../ru-RU/cartridge-loader/cartridges.ftl | 2 + Resources/Locale/ru-RU/cluwne/cluwne.ftl | 2 + .../ru-RU/components/storage-component.ftl | 1 + .../Locale/ru-RU/connection-messages.ftl | 6 +- .../ru-RU/construction/recipes/curtains.ftl | 1 + .../ru-RU/construction/recipes/furniture.ftl | 1 + .../Locale/ru-RU/credits/credits-window.ftl | 2 + .../criminal-records/criminal-records.ftl | 6 + Resources/Locale/ru-RU/datasets/figurines.ftl | 20 +++ Resources/Locale/ru-RU/date.ftl | 17 +++ .../Locale/ru-RU/ghost/make-ghost-gui.ftl | 16 ++ .../Locale/ru-RU/guidebook/chemistry/core.ftl | 5 +- .../guidebook/entity-effects/conditions.ftl | 142 +++++++++--------- .../guidebook/entity-effects/effects.ftl | 101 ++++++++----- Resources/Locale/ru-RU/guidebook/guides.ftl | 3 + .../ru-RU/hand-labeler/hand-labeler.ftl | 4 + Resources/Locale/ru-RU/info/ban.ftl | 1 + .../Locale/ru-RU/job/job-supervisors.ftl | 1 + .../Locale/ru-RU/materials/materials.ftl | 2 + .../components/crew-monitoring-component.ftl | 22 +-- .../ru-RU/navmap-beacons/station_map.ftl | 1 + Resources/Locale/ru-RU/npc/hugbot.ftl | 24 +++ Resources/Locale/ru-RU/pacel-wrap.ftl | 2 + .../ru-RU/preferences/loadout-groups.ftl | 1 + .../ru-RU/preferences/ui/markings-picker.ftl | 5 + .../Locale/ru-RU/reagents/meta/toxins.ftl | 4 +- Resources/Locale/ru-RU/recipes/tags.ftl | 1 + .../Locale/ru-RU/silicons/station-ai.ftl | 1 + .../Locale/ru-RU/speech/speech-triggers.ftl | 2 + .../ss14-ru/prototypes/actions/types.ftl | 2 + .../ss14-ru/prototypes/body/organs/vox.ftl | 8 + .../catalog/fills/crates/botany.ftl | 2 +- .../entities/clothing/ears/headsets.ftl | 2 + .../entities/markers/warp_point.ftl | 3 - .../entities/mobs/npcs/elemental.ftl | 4 +- .../prototypes/entities/mobs/npcs/silicon.ftl | 2 + .../consumable/food/containers/box.ftl | 4 +- .../devices/circuitboards/law_boards.ftl | 2 + .../entities/objects/fun/crayons.ftl | 6 + .../entities/objects/fun/figurines.ftl | 16 +- .../objects/fun/plushielizard_jobs.ftl | 80 ++++++++++ .../entities/objects/misc/books.ftl | 2 + .../objects/misc/identification_cards.ftl | 138 ++++++++--------- .../entities/objects/misc/parcel_wrap.ftl | 6 +- .../specific/robotics/borg_modules.ftl | 2 + .../entities/objects/tools/spray_painter.ftl | 3 + .../entities/statuseffects/movement.ftl | 4 + .../entities/statuseffects/speech.ftl | 2 + .../structures/decoration/curtains.ftl | 6 + .../structures/doors/airlocks/access.ftl | 7 +- .../structures/doors/airlocks/airlocks.ftl | 3 + .../structures/furniture/tables/tables.ftl | 3 + .../entities/structures/furniture/toilet.ftl | 6 + .../structures/shuttles/thrusters.ftl | 2 + .../structures/wallmounts/signs/posters.ftl | 2 + .../ss14-ru/prototypes/xenoarch/effects.ftl | 2 + Resources/Locale/ru-RU/station-laws/laws.ftl | 28 +++- .../Locale/ru-RU/store/spellbook-catalog.ftl | 2 +- .../Locale/ru-RU/store/uplink-catalog.ftl | 6 +- .../ru-RU/triggers/trigger-on-voice.ftl | 2 + Resources/Locale/ru-RU/ui/navmap.ftl | 1 + Resources/Locale/ru-RU/ui/stat-values.ftl | 1 + 68 files changed, 576 insertions(+), 233 deletions(-) create mode 100644 Resources/Locale/ru-RU/date.ftl create mode 100644 Resources/Locale/ru-RU/ghost/make-ghost-gui.ftl create mode 100644 Resources/Locale/ru-RU/npc/hugbot.ftl create mode 100644 Resources/Locale/ru-RU/speech/speech-triggers.ftl create mode 100644 Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/fun/plushielizard_jobs.ftl create mode 100644 Resources/Locale/ru-RU/ui/stat-values.ftl diff --git a/Resources/Locale/ru-RU/access/components/id-card-console-component.ftl b/Resources/Locale/ru-RU/access/components/id-card-console-component.ftl index 70303ecdac..0f5d2e9f03 100644 --- a/Resources/Locale/ru-RU/access/components/id-card-console-component.ftl +++ b/Resources/Locale/ru-RU/access/components/id-card-console-component.ftl @@ -6,6 +6,8 @@ id-card-console-window-job-title-label = Должность: id-card-console-window-eject-button = Извлечь id-card-console-window-insert-button = Вставить id-card-console-window-job-selection-label = Предустановки должностей (задаёт иконку отдела и должности): +id-card-console-window-select-all-button = Выдать все +id-card-console-window-deselect-all-button = Убрать все access-id-card-console-component-no-hands-error = У вас нет рук. id-card-console-privileged-id = Основная ID id-card-console-target-id = Целевая ID diff --git a/Resources/Locale/ru-RU/accessories/human-hair.ftl b/Resources/Locale/ru-RU/accessories/human-hair.ftl index 8ab99daed7..4573a37f3b 100644 --- a/Resources/Locale/ru-RU/accessories/human-hair.ftl +++ b/Resources/Locale/ru-RU/accessories/human-hair.ftl @@ -199,3 +199,4 @@ marking-HumanHairVlongfringe = Очень короткая (Чёлка) marking-HumanHairVolaju = Воладзю marking-HumanHairWisp = Пряди marking-HumanHairLongWithBangs = Длинная с чёлкой +marking-HumanHairOverEyePigtail = Хвостик (Через глаз) diff --git a/Resources/Locale/ru-RU/administration/admin-verbs.ftl b/Resources/Locale/ru-RU/administration/admin-verbs.ftl index 216bc6831a..4709f05a92 100644 --- a/Resources/Locale/ru-RU/administration/admin-verbs.ftl +++ b/Resources/Locale/ru-RU/administration/admin-verbs.ftl @@ -18,3 +18,44 @@ admin-verbs-erase-description = toolshed-verb-mark = Отметить toolshed-verb-mark-description = Помещает данную сущность в переменную $marked, заменяя её предыдущее значение. export-entity-verb-get-data-text = Экспорт спрайта +# Tools verbs +admin-verbs-rejuvenate = Возродить +admin-verbs-make-indestructible = Сделать неуязвимым +admin-verbs-make-vulnerable = Сделать уязвимым +admin-verbs-refill-battery = Зарядить батарею +admin-verbs-drain-battery = Разрядить батарею +admin-verbs-infinite-battery = Бесконечная батарея +admin-verbs-block-unanchoring = Заблокировать открепление +admin-verbs-refill-internals-oxygen = Заполнить баллон кислородом +admin-verbs-refill-internals-nitrogen = Заполнить баллон азотом +admin-verbs-refill-internals-plasma = Заполнить баллон плазмой +admin-verbs-send-to-test-arena = Отправить на испытательную арену +admin-verbs-grant-all-access = Выдать полный доступ +admin-verbs-revoke-all-access = Убрать все доступы +admin-verbs-adjust-stack = Отрегулировать стопку +admin-verbs-fill-stack = Заполнить стопку +admin-verbs-rename = Изменить имя +admin-verbs-redescribe = Изменить описание +admin-verbs-rename-and-redescribe = Изменить имя и описание +admin-verbs-bar-job-slots = Закрыть слоты должностей +admin-verbs-locate-cargo-shuttle = Найти грузовой шаттл +admin-verbs-halt-movement = Остановить движение +admin-verbs-unpause-map = Снять карту с паузы +admin-verbs-pause-map = Поставить карту на паузу +admin-verbs-snap-joints = Удалить джоинты +admin-verbs-make-minigun = Сделать миниганом +admin-verbs-set-bullet-amount = Установить кол-во патронов +# Toggles verbs +admin-verbs-bolt = Заболтировать +admin-verbs-unbolt = Разболтировать +admin-verbs-emergency-access-on = Включить аварийный доступ +admin-verbs-emergency-access-off = Выключить аварийный доступ +# Dialogs verbs +admin-verbs-dialog-adjust-stack-amount = Количество (макс. { $max }) +admin-verbs-dialog-rename-title = Изменить имя +admin-verbs-dialog-rename-name = Имя +admin-verbs-dialog-redescribe-title = Изменить описание +admin-verbs-dialog-redescribe-description = Описание +admin-verbs-dialog-rename-and-redescribe-title = Изменить имя и описание +admin-verbs-dialog-set-bullet-amount-title = Установить кол-во патронов +admin-verbs-dialog-set-bullet-amount-amount = Количество (стандарт { $cap }) diff --git a/Resources/Locale/ru-RU/administration/bwoink.ftl b/Resources/Locale/ru-RU/administration/bwoink.ftl index ff8cc3a277..23f6e23b05 100644 --- a/Resources/Locale/ru-RU/administration/bwoink.ftl +++ b/Resources/Locale/ru-RU/administration/bwoink.ftl @@ -1,4 +1,5 @@ bwoink-user-title = Сообщение от администратора +bwoink-admin-title = Админ помощь bwoink-system-starmute-message-no-other-users = *Система: Никто не доступен для получения вашего сообщения. Попробуйте обратиться к администраторам игры в Discord. bwoink-system-messages-being-relayed-to-discord = Все сообщения передаются администраторам игры через Discord. diff --git a/Resources/Locale/ru-RU/administration/smites.ftl b/Resources/Locale/ru-RU/administration/smites.ftl index a5e0de6709..57a5047b21 100644 --- a/Resources/Locale/ru-RU/administration/smites.ftl +++ b/Resources/Locale/ru-RU/administration/smites.ftl @@ -133,9 +133,9 @@ admin-trick-revoke-all-access-description = Забирает у цели вес admin-trick-rejuvenate-description = Возрождает цель, исцеляет её от всего. admin-trick-adjust-stack-description = Устанавливает размер стопки на указанное значение. admin-trick-fill-stack-description = Устанавливает размер стопки на максимум. -admin-trick-rename-description = Переименовывает целевой объект. Обратите внимание, что это не равно команде `rename` и не исправит его ID. -admin-trick-redescribe-description = Переописывает целевой объект. -admin-trick-rename-and-redescribe-description = Переименовывает и переописывает объект одной кнопкой. +admin-trick-rename-description = Изменяет имя целевого объекта. Обратите внимание, что это не равно команде `rename` и не исправит его ID. +admin-trick-redescribe-description = Изменяет описание целевого объекта. +admin-trick-rename-and-redescribe-description = Изменяет имя и описание объекта одной кнопкой. admin-trick-bar-job-slots-description = Закрывает все слоты должностей на станции, так что никто не сможет присоединиться. admin-trick-locate-cargo-shuttle-description = Телепортирует вас прямо на грузовой шаттл станции, если он есть. admin-trick-infinite-battery-description = Перенастраивает СМЭСы и подстанции на сетке/станции/карте на быструю автозарядку. diff --git a/Resources/Locale/ru-RU/administration/ui/tabs/admin-tab/player-actions-window.ftl b/Resources/Locale/ru-RU/administration/ui/tabs/admin-tab/player-actions-window.ftl index bc1972ecac..2d8650c609 100644 --- a/Resources/Locale/ru-RU/administration/ui/tabs/admin-tab/player-actions-window.ftl +++ b/Resources/Locale/ru-RU/administration/ui/tabs/admin-tab/player-actions-window.ftl @@ -1,11 +1,8 @@ -admin-player-actions-window-title = Действия с игроками admin-player-actions-window-ban = Панель банов admin-player-actions-window-admin-ghost = Админ призрак -admin-player-actions-window-teleport = Телепорт admin-player-actions-window-permissions = Панель доступов admin-player-actions-window-announce = Сделать объявление admin-player-actions-window-shuttle = Вызвать/отозвать шаттл admin-player-actions-window-admin-logs = Админ логи -admin-player-actions-window-admin-notes = Админ заметки admin-player-actions-window-admin-fax = Админ факс admin-player-actions-window-admin-chat = Админ чат diff --git a/Resources/Locale/ru-RU/cartridge-loader/cartridges.ftl b/Resources/Locale/ru-RU/cartridge-loader/cartridges.ftl index 122a8f38b8..0d33196472 100644 --- a/Resources/Locale/ru-RU/cartridge-loader/cartridges.ftl +++ b/Resources/Locale/ru-RU/cartridge-loader/cartridges.ftl @@ -84,6 +84,8 @@ wanted-list-status-label = [color=darkgray]статус:[/color] { $status -> [detained] [color=#b18644]под арестом[/color] [paroled] [color=green]освобождён по УДО[/color] [discharged] [color=green]освобождён[/color] + [hostile] [color=darkred]враждебен[/color] + [eliminated] [color=gray]ликвидирован[/color] *[other] нет } wanted-list-history-table-time-col = Время diff --git a/Resources/Locale/ru-RU/cluwne/cluwne.ftl b/Resources/Locale/ru-RU/cluwne/cluwne.ftl index f99fcc1ba4..471b55bfcf 100644 --- a/Resources/Locale/ru-RU/cluwne/cluwne.ftl +++ b/Resources/Locale/ru-RU/cluwne/cluwne.ftl @@ -1,2 +1,4 @@ cluwne-transform = { CAPITALIZE($target) } превратился в клувеня! cluwne-name-prefix = клувень { $baseName } +cluwne-knock-emote = гудит +cluwne-giggle-emote = хонкает diff --git a/Resources/Locale/ru-RU/components/storage-component.ftl b/Resources/Locale/ru-RU/components/storage-component.ftl index ab6b4e78a7..e8a52c8312 100644 --- a/Resources/Locale/ru-RU/components/storage-component.ftl +++ b/Resources/Locale/ru-RU/components/storage-component.ftl @@ -8,5 +8,6 @@ comp-storage-cant-drop = Вы не можете отпустить { $entity }! comp-storage-window-title = Предмет хранилище comp-storage-window-weight = { $weight }/{ $maxWeight }, Макс. размер: { $size } comp-storage-window-slots = Слоты: { $itemCount }/{ $maxCount }, Макс. размер: { $size } +comp-storage-window-dummy = Кукла comp-storage-verb-open-storage = Открыть хранилище comp-storage-verb-close-storage = Закрыть хранилище diff --git a/Resources/Locale/ru-RU/connection-messages.ftl b/Resources/Locale/ru-RU/connection-messages.ftl index dd1e39c474..442707ab69 100644 --- a/Resources/Locale/ru-RU/connection-messages.ftl +++ b/Resources/Locale/ru-RU/connection-messages.ftl @@ -50,9 +50,9 @@ baby-jail-account-denied = Этот сервер — сервер для нов baby-jail-account-denied-reason = Этот сервер — сервер для новичков, предназначенный для новых игроков и тех, кто хочет им помочь. Новые подключения слишком старых или не внесённых в белый список аккаунтов не принимаются. Загляните на другие серверы и посмотрите все, что может предложить Space Station 14. Веселитесь! Причина: "{ $reason }" baby-jail-account-reason-account = Ваш аккаунт Space Station 14 слишком старый. Он должен быть моложе { $minutes } минут generic-misconfigured = Сервер неправильно настроен и не принимает игроков. Пожалуйста, свяжитесь с владельцем сервера и повторите попытку позже. -ipintel-server-ratelimited = На этом сервере используется система безопасности с внешней проверкой, которая достигла своего максимального предела проверки. Пожалуйста, обратитесь за помощью к администрации сервера и повторите попытку позже. -ipintel-unknown = На этом сервере используется система безопасности с внешней проверкой, но она столкнулась с ошибкой. Пожалуйста, обратитесь за помощью к администрации сервера и повторите попытку позже. -ipintel-suspicious = Похоже, вы подключаетесь через центр обработки данных или VPN. По административным причинам мы не разрешаем играть через VPN-соединения. Пожалуйста, обратитесь за помощью к администрации сервера, если вы считаете, что это ошибочно. +ipintel-server-ratelimited = Этот сервер использует систему аудита с внешней проверкой, но достиг максимального лимита проверок у внешнего сервиса. Свяжитесь с администрацией сервера, чтобы сообщить об этом и получить помощь, или попробуйте позже. +ipintel-unknown = Этот сервер использует систему аудита с внешней проверкой, но при проверке вашего соединения произошла ошибка. Свяжитесь с администрацией сервера, чтобы сообщить об этом и получить помощь, или попробуйте позже. +ipintel-suspicious = Похоже, вы пытаетесь подключиться через датацентр, прокси, VPN или другое подозрительное соединение. По административным причинам такие подключения не допускаются. Если у вас включён VPN или аналогичный сервис, выключите его и попробуйте снова, либо свяжитесь с администрацией сервера, если считаете, что это ошибка или вам необходимо использовать такие сервисы для игры. baby-jail-account-reason-overall = Наигранное Вами время на сервере должно быть больше { $minutes } { $minutes -> [one] минуты diff --git a/Resources/Locale/ru-RU/construction/recipes/curtains.ftl b/Resources/Locale/ru-RU/construction/recipes/curtains.ftl index 26e70e95fe..5bc19516a0 100644 --- a/Resources/Locale/ru-RU/construction/recipes/curtains.ftl +++ b/Resources/Locale/ru-RU/construction/recipes/curtains.ftl @@ -1,6 +1,7 @@ construction-recipe-curtains-cloth = шторы (ткань) construction-recipe-curtains-black = шторы (чёрный) construction-recipe-curtains-blue = шторы (синий) +construction-recipe-curtains-sky-blue = шторы (небесный) construction-recipe-curtains-cyan = шторы (голубой) construction-recipe-curtains-green = шторы (зелёный) construction-recipe-curtains-orange = шторы (оранжевый) diff --git a/Resources/Locale/ru-RU/construction/recipes/furniture.ftl b/Resources/Locale/ru-RU/construction/recipes/furniture.ftl index 1747b49dcf..751a27f4b2 100644 --- a/Resources/Locale/ru-RU/construction/recipes/furniture.ftl +++ b/Resources/Locale/ru-RU/construction/recipes/furniture.ftl @@ -2,6 +2,7 @@ construction-recipe-red-comf-bench = удобная скамейка (красн construction-recipe-blue-comf-bench = удобная скамейка (синий) construction-recipe-table-fancy-black = красивый стол (чёрный) construction-recipe-table-fancy-blue = красивый стол (синий) +construction-recipe-table-fancy-sky-blue = красивый стол (небесный) construction-recipe-table-fancy-cyan = красивый стол (голубой) construction-recipe-table-fancy-green = красивый стол (зелёный) construction-recipe-table-fancy-orange = красивый стол (оранжевый) diff --git a/Resources/Locale/ru-RU/credits/credits-window.ftl b/Resources/Locale/ru-RU/credits/credits-window.ftl index 4feb83e4ac..35ffd90a49 100644 --- a/Resources/Locale/ru-RU/credits/credits-window.ftl +++ b/Resources/Locale/ru-RU/credits/credits-window.ftl @@ -11,6 +11,8 @@ credits-window-codebases-section-title = Код Space Station 13 credits-window-original-remake-team-section-title = Команда ремейка оригинальной Space Station 13 credits-window-immortals-title = В память о credits-window-special-thanks-section-title = Особая благодарность +credits-window-previous-page-button = Пред. страница +credits-window-next-page-button = След. страница credits-window-attributions-directory = [color=white]Директория:[/color] { $directory } credits-window-attributions-files = [color=white]Файлы:[/color] { $files } credits-window-attributions-copyright = [color=white]Копирайт:[/color] { $copyright } diff --git a/Resources/Locale/ru-RU/criminal-records/criminal-records.ftl b/Resources/Locale/ru-RU/criminal-records/criminal-records.ftl index 1e3aaa11a3..0672adae32 100644 --- a/Resources/Locale/ru-RU/criminal-records/criminal-records.ftl +++ b/Resources/Locale/ru-RU/criminal-records/criminal-records.ftl @@ -16,6 +16,8 @@ criminal-records-status-detained = Под арестом criminal-records-status-suspected = Подозревается criminal-records-status-discharged = Освобождён criminal-records-status-paroled = Освобождён по УДО +criminal-records-status-hostile = Враждебен +criminal-records-status-eliminated = Ликвидирован criminal-records-console-wanted-reason = Причина розыска criminal-records-console-suspected-reason = Причина подозрения criminal-records-console-reason = Причина @@ -40,6 +42,10 @@ criminal-records-console-detained = { $name } ({ $job }) арестовали, criminal-records-console-released = { $name } ({ $job }) отпустили, ответственный: { $officer }. criminal-records-console-paroled = { $name } ({ $job }) освободили по УДО, ответственный: { $officer }. criminal-records-console-not-parole = { $name } ({ $job }) лишили права на УДО, ответственный: { $officer }. +criminal-records-console-hostile = { $name } ({ $job }) пометили враждебным, причина: { $reason }, ответственный: { $officer }. +criminal-records-console-not-hostile = { $name } ({ $job }) больше не помечен враждебным, ответственный: { $officer }. +criminal-records-console-eliminated = { $name } ({ $job }) пометили ликвидированным, ответственный: { $officer }. +criminal-records-console-not-eliminated = { $name } ({ $job }) больше не помечен ликвидированным, ответственный: { $officer }. criminal-records-console-unknown-officer = <неизвестный> ## Filters diff --git a/Resources/Locale/ru-RU/datasets/figurines.ftl b/Resources/Locale/ru-RU/datasets/figurines.ftl index 18f8d6c20b..6f7c5fe013 100644 --- a/Resources/Locale/ru-RU/datasets/figurines.ftl +++ b/Resources/Locale/ru-RU/datasets/figurines.ftl @@ -276,3 +276,23 @@ figurines-hamlet-5 = Пип! figurines-hamlet-6 = Уиип! figurines-hamlet-7 = Иип! figurines-hamlet-8 = ТОЛЬКО НЕ МИКРОВОЛНОВКА! +figurines-thief-1 = У вас нет ордера! +figurines-thief-2 = Это же обычный маяк! +figurines-thief-3 = Эта сумка вовсе не подозрительна, офицер. +figurines-thief-4 = Я понятия не имею, где ваш питомец... +figurines-thief-5 = Хм, я не знал, что эта стена может открываться... +figurines-skeleton-1 = КЛАЦ КЛАЦ! +figurines-skeleton-2 = Уф, в этом шкафчике было тесно! +figurines-skeleton-3 = Ты плохо проведёшь время. +figurines-skeleton-4 = Есть молоко? +figurines-skeleton-5 = Я тебе сейчас кости пересчитаю! +figurines-owlman-1 = Не бойся народ, Филин вас спасёт! +figurines-owlman-2 = Филин увидится с вами позже! +figurines-owlman-3 = УУ-УУ!! +figurines-owlman-4 = Как зовут сову фокусника? ХУУ-ДИНИ! +figurines-owlman-5 = Не волнуйтесь, гражданин, я спасу ваш день! +figurines-griffin-1 = МУХАХАХА, я такой злой!! +figurines-griffin-2 = Как только я увижу Филина, он будет мёртв!! +figurines-griffin-3 = Почему грифоны не обращают внимания на проблемы? Они витают в облаках! +figurines-griffin-4 = Меня зовут не Джильда!! +figurines-griffin-5 = Быть преступным гением нелегко. diff --git a/Resources/Locale/ru-RU/date.ftl b/Resources/Locale/ru-RU/date.ftl new file mode 100644 index 0000000000..3b2cc66974 --- /dev/null +++ b/Resources/Locale/ru-RU/date.ftl @@ -0,0 +1,17 @@ +## Used for date picker + +month-1 = Январь +month-2 = Февраль +month-3 = Март +month-4 = Апрель +month-5 = Май +month-6 = Июнь +month-7 = Июль +month-8 = Август +month-9 = Сентябрь +month-10 = Октябрь +month-11 = Ноябрь +month-12 = Декабрь +datepicker-month = Месяц +datepicker-day = День +datepicker-year = Год diff --git a/Resources/Locale/ru-RU/ghost/make-ghost-gui.ftl b/Resources/Locale/ru-RU/ghost/make-ghost-gui.ftl new file mode 100644 index 0000000000..852f0a39d1 --- /dev/null +++ b/Resources/Locale/ru-RU/ghost/make-ghost-gui.ftl @@ -0,0 +1,16 @@ +make-ghost-roles-window-title = Сделать ролью призрака +make-ghost-roles-window-entity-label = Сущность +make-ghost-roles-window-role-name-label = Имя роли +make-ghost-roles-window-role-description-label = Описание роли +make-ghost-roles-window-role-rules-label = Правила роли +make-ghost-roles-window-make-sentient-label = Сделать разумным +make-ghost-roles-window-initial-duration-label = Начальная продолжительность (сек) +make-ghost-roles-window-join-extends-by-label = Присоединение увеличивает на (сек) +make-ghost-roles-window-max-duration-label = Максимальная продолжительность (сек) +make-ghost-roles-window-make-button = Создать +# Raffle +make-ghost-roles-window-raffle-not-button = Без лотереи +make-ghost-roles-window-raffle-custom-settings-button = Настраиваемая +make-ghost-roles-window-raffle-role-label = Лотерея? +make-ghost-roles-window-raffle-settings-label = { $id } (начальная { $initialDuration } сек, макс { $maxDuration } сек, присоединение добавляет { $joinExtendsDurationBy } сек) +make-ghost-roles-window-raffle-warning-tooltip = Начальная продолжительность не должна превышать максимальную. diff --git a/Resources/Locale/ru-RU/guidebook/chemistry/core.ftl b/Resources/Locale/ru-RU/guidebook/chemistry/core.ftl index d7407b65dc..7c1bde626c 100644 --- a/Resources/Locale/ru-RU/guidebook/chemistry/core.ftl +++ b/Resources/Locale/ru-RU/guidebook/chemistry/core.ftl @@ -2,9 +2,12 @@ guidebook-reagent-effect-description = { $chance -> [1] { $effect } *[other] Имеет { NATURALPERCENT($chance, 2) } шанс { $effect } + }{$quantity -> + [0] {""} + *[other] , если имеется как минимум {$quantity} ед. {$reagent} }{ $conditionCount -> [0] . - *[other] { " " }, пока { $conditions }. + *[other] , пока { $conditions }. } guidebook-reagent-name = [bold][color={ $color }]{ CAPITALIZE($name) }[/color][/bold] guidebook-reagent-recipes-header = Рецепт diff --git a/Resources/Locale/ru-RU/guidebook/entity-effects/conditions.ftl b/Resources/Locale/ru-RU/guidebook/entity-effects/conditions.ftl index 1d017423d3..684785d98e 100644 --- a/Resources/Locale/ru-RU/guidebook/entity-effects/conditions.ftl +++ b/Resources/Locale/ru-RU/guidebook/entity-effects/conditions.ftl @@ -1,94 +1,90 @@ entity-condition-guidebook-total-damage = { $max -> - [2147483648] it has at least {NATURALFIXED($min, 2)} total damage - *[other] { $min -> - [0] it has at most {NATURALFIXED($max, 2)} total damage - *[other] it has between {NATURALFIXED($min, 2)} and {NATURALFIXED($max, 2)} total damage - } + [2147483648] тело имеет по крайней мере { NATURALFIXED($min, 2) } общего урона + *[other] + { $min -> + [0] тело имеет не более { NATURALFIXED($max, 2) } общего урона + *[other] тело имеет между { NATURALFIXED($min, 2) } и { NATURALFIXED($max, 2) } общего урона + } } entity-condition-guidebook-type-damage = { $max -> - [2147483648] it has at least {NATURALFIXED($min, 2)} of {$type} damage - *[other] { $min -> - [0] it has at most {NATURALFIXED($max, 2)} of {$type} damage - *[other] it has between {NATURALFIXED($min, 2)} and {NATURALFIXED($max, 2)} of {$type} damage - } + [2147483648] тело имеет по крайней мере { NATURALFIXED($min, 2) } урона типа { $type } + *[other] + { $min -> + [0] тело имеет не более { NATURALFIXED($max, 2) } урона типа { $type } + *[other] тело имеет между { NATURALFIXED($min, 2) } и { NATURALFIXED($max, 2) } урона типа { $type } + } } entity-condition-guidebook-group-damage = { $max -> - [2147483648] it has at least {NATURALFIXED($min, 2)} of {$type} damage. - *[other] { $min -> - [0] it has at most {NATURALFIXED($max, 2)} of {$type} damage. - *[other] it has between {NATURALFIXED($min, 2)} and {NATURALFIXED($max, 2)} of {$type} damage - } + [2147483648] тело имеет по крайней мере { NATURALFIXED($min, 2) } урона группы { $type } + *[other] + { $min -> + [0] тело имеет не более { NATURALFIXED($max, 2) } урона группы { $type } + *[other] тело имеет между { NATURALFIXED($min, 2) } и { NATURALFIXED($max, 2) } урона группы { $type } + } } entity-condition-guidebook-total-hunger = { $max -> - [2147483648] the target has at least {NATURALFIXED($min, 2)} total hunger - *[other] { $min -> - [0] the target has at most {NATURALFIXED($max, 2)} total hunger - *[other] the target has between {NATURALFIXED($min, 2)} and {NATURALFIXED($max, 2)} total hunger - } + [2147483648] цель имеет по крайней мере { NATURALFIXED($min, 2) } общего голода + *[other] + { $min -> + [0] цель имеет не более { NATURALFIXED($max, 2) } общего голода + *[other] цель имеет между { NATURALFIXED($min, 2) } и { NATURALFIXED($max, 2) } общего голода + } } entity-condition-guidebook-reagent-threshold = { $max -> - [2147483648] there's at least {NATURALFIXED($min, 2)}u of {$reagent} - *[other] { $min -> - [0] there's at most {NATURALFIXED($max, 2)}u of {$reagent} - *[other] there's between {NATURALFIXED($min, 2)}u and {NATURALFIXED($max, 2)}u of {$reagent} - } + [2147483648] в кровеносной системе имеется по крайней мере { NATURALFIXED($min, 2) } ед. { $reagent } + *[other] + { $min -> + [0] имеется не более { NATURALFIXED($max, 2) } ед. { $reagent } + *[other] имеет между { NATURALFIXED($min, 2) } ед. и { NATURALFIXED($max, 2) } ед. { $reagent } + } } - -entity-condition-guidebook-mob-state-condition = - the mob is { $state } - -entity-condition-guidebook-job-condition = - the target's job is { $job } - -entity-condition-guidebook-solution-temperature = - the solution's temperature is { $max -> - [2147483648] at least {NATURALFIXED($min, 2)}k - *[other] { $min -> - [0] at most {NATURALFIXED($max, 2)}k - *[other] between {NATURALFIXED($min, 2)}k and {NATURALFIXED($max, 2)}k - } +reagent-effect-condition-guidebook-mob-state-condition = пациент в { $state } +reagent-effect-condition-guidebook-job-condition = должность цели — { $job } +reagent-effect-condition-guidebook-solution-temperature = + температура раствора составляет { $max -> + [2147483648] не менее { NATURALFIXED($min, 2) }k + *[other] + { $min -> + [0] не более { NATURALFIXED($max, 2) }k + *[other] между { NATURALFIXED($min, 2) }k и { NATURALFIXED($max, 2) }k + } } - -entity-condition-guidebook-body-temperature = - the body's temperature is { $max -> - [2147483648] at least {NATURALFIXED($min, 2)}k - *[other] { $min -> - [0] at most {NATURALFIXED($max, 2)}k - *[other] between {NATURALFIXED($min, 2)}k and {NATURALFIXED($max, 2)}k - } +reagent-effect-condition-guidebook-body-temperature = + температура тела составляет { $max -> + [2147483648] не менее { NATURALFIXED($min, 2) }k + *[other] + { $min -> + [0] не более { NATURALFIXED($max, 2) }k + *[other] между { NATURALFIXED($min, 2) }k и { NATURALFIXED($max, 2) }k + } + } +reagent-effect-condition-guidebook-organ-type = + метаболизирующий орган { $shouldhave -> + [true] это + *[false] это не + } { $name } орган +reagent-effect-condition-guidebook-has-tag = + цель { $invert -> + [true] не имеет + *[false] имеет + } метку { $tag } +reagent-effect-condition-guidebook-this-reagent = этот реагент +reagent-effect-condition-guidebook-breathing = + цель { $isBreathing -> + [true] дышит нормально + *[false] задыхается + } +reagent-effect-condition-guidebook-internals = + цель { $usingInternals -> + [true] использует дыхательную маску + *[false] дышит атмосферным газом } - -entity-condition-guidebook-organ-type = - the metabolizing organ { $shouldhave -> - [true] is - *[false] is not - } {INDEFINITE($name)} {$name} organ - -entity-condition-guidebook-has-tag = - the target { $invert -> - [true] does not have - *[false] has - } the tag {$tag} - -entity-condition-guidebook-this-reagent = this reagent - -entity-condition-guidebook-breathing = - the metabolizer is { $isBreathing -> - [true] breathing normally - *[false] suffocating - } - -entity-condition-guidebook-internals = - the metabolizer is { $usingInternals -> - [true] using internals - *[false] breathing atmospheric air - } diff --git a/Resources/Locale/ru-RU/guidebook/entity-effects/effects.ftl b/Resources/Locale/ru-RU/guidebook/entity-effects/effects.ftl index d115650321..56785efba6 100644 --- a/Resources/Locale/ru-RU/guidebook/entity-effects/effects.ftl +++ b/Resources/Locale/ru-RU/guidebook/entity-effects/effects.ftl @@ -9,16 +9,14 @@ entity-effect-guidebook-spawn-entity = entity-effect-guidebook-destroy = { $chance -> - [1] Destroys - *[other] destroy - } the object - + [1] Уничтожает + *[other] уничтожают + } объект entity-effect-guidebook-break = { $chance -> - [1] Breaks - *[other] break - } the object - + [1] Ломает + *[other] ломают + } объект entity-effect-guidebook-explosion = { $chance -> [1] Causes @@ -118,47 +116,74 @@ entity-effect-guidebook-status-effect-old = entity-effect-guidebook-status-effect = { $type -> [update]{ $chance -> - [1] Causes - *[other] cause - } {LOC($key)} for at least {NATURALFIXED($time, 3)} {MANY("second", $time)} without accumulation - [add] { $chance -> - [1] Causes - *[other] cause - } {LOC($key)} for at least {NATURALFIXED($time, 3)} {MANY("second", $time)} with accumulation - [set] { $chance -> - [1] Causes - *[other] cause - } {LOC($key)} for at least {NATURALFIXED($time, 3)} {MANY("second", $time)} without accumulation - *[remove]{ $chance -> - [1] Removes - *[other] remove - } {NATURALFIXED($time, 3)} {MANY("second", $time)} of {LOC($key)} + [1] Вызывает + *[other] вызывают + } {LOC($key)} минимум на {NATURALFIXED($time, 3)} { $time -> + [one] секунду + [few] секунды + *[other] секунд + }, эффект не накапливается + [add] + { $chance -> + [1] Вызывает + *[other] вызывают + } { LOC($key) } минимум на { NATURALFIXED($time, 3) } { $time -> + [one] секунду + [few] секунды + *[other] секунд + }, эффект накапливается + [set] + { $chance -> + [1] Вызывает + *[other] вызывают + } { LOC($key) } минимум на { NATURALFIXED($time, 3) } { $time -> + [one] секунду + [few] секунды + *[other] секунд + }, эффект не накапливается + *[remove] + { $chance -> + [1] Удаляет + *[other] удаляют + } { NATURALFIXED($time, 3) } { $time -> + [one] секунду + [few] секунды + *[other] секунд + } от { LOC($key) } } { $delay -> - [0] immediately - *[other] after a {NATURALFIXED($delay, 3)} second delay + [0] немедленно + *[other] после { NATURALFIXED($delay, 3) } { $delay -> + [one] секунду + [few] секунды + *[other] секунд + } задержки } entity-effect-guidebook-status-effect-indef = { $type -> [update]{ $chance -> - [1] Causes - *[other] cause - } permanent {LOC($key)} + [1] Вызывает + *[other] вызывает + } постоянный {LOC($key)} [add] { $chance -> - [1] Causes - *[other] cause - } permanent {LOC($key)} + [1] Вызывает + *[other] вызывают + } постоянный{LOC($key)} [set] { $chance -> - [1] Causes - *[other] cause - } permanent {LOC($key)} + [1] Вызывает + *[other] вызывают + } постоянный{LOC($key)} *[remove]{ $chance -> - [1] Removes - *[other] remove + [1] Убирает + *[other] убирают } {LOC($key)} } { $delay -> - [0] immediately - *[other] after a {NATURALFIXED($delay, 3)} second delay + [0] мгновенно + *[other] после { NATURALFIXED($delay, 3) } { $delay -> + [one] секунду + [few] секунды + *[other] секунд + } задержки } entity-effect-guidebook-knockdown = diff --git a/Resources/Locale/ru-RU/guidebook/guides.ftl b/Resources/Locale/ru-RU/guidebook/guides.ftl index c7bb37af3c..d01f2011dd 100644 --- a/Resources/Locale/ru-RU/guidebook/guides.ftl +++ b/Resources/Locale/ru-RU/guidebook/guides.ftl @@ -81,6 +81,8 @@ guide-entry-anomalous-research = Исследование аномалий guide-entry-scanners-and-vessels = Сканеры и сосуды guide-entry-ape = М.А.К.А.К. guide-entry-xenoarchaeology = Ксеноархеология +guide-entry-xenoarchaeologyunlockingnodes = Разблокировка узлов +guide-entry-analysisconsole = Аналитическая консоль guide-entry-artifact-reports = Отчёты об артефактах guide-entry-traversal-distorter = Поперечный искатель guide-entry-machine-upgrading = Улучшение оборудования @@ -127,6 +129,7 @@ guide-entry-salad-recipes = Салаты guide-entry-medicinal-recipes = Лечебные guide-entry-other-recipes = Другие guide-entry-secret-recipes = Секретные +guide-entry-lawsets = Наборы законов синтетиков guide-entry-antagonists = Антагонисты guide-entry-nuclear-operatives = Ядерные оперативники guide-entry-traitors = Предатели diff --git a/Resources/Locale/ru-RU/hand-labeler/hand-labeler.ftl b/Resources/Locale/ru-RU/hand-labeler/hand-labeler.ftl index edb6052afe..c3d3277b2d 100644 --- a/Resources/Locale/ru-RU/hand-labeler/hand-labeler.ftl +++ b/Resources/Locale/ru-RU/hand-labeler/hand-labeler.ftl @@ -1,6 +1,10 @@ hand-labeler-ui-header = Ручной этикетировщик # The content of the label in the UI above the text entry input. hand-labeler-current-text-label = Этикетка: +# The text on the button in the UI to reset the text entry input to the content it had when the UI was opened +hand-labeler-ui-reset-label-text = Сбросить +# The text on the button in the UI to clear the text entry input +hand-labeler-ui-clear-label-text = Очистить # When the hand labeler applies a label successfully hand-labeler-successfully-applied = Этикетка успешно наклеена # When the hand labeler removes a label successfully diff --git a/Resources/Locale/ru-RU/info/ban.ftl b/Resources/Locale/ru-RU/info/ban.ftl index d07d5d969a..a4f663722c 100644 --- a/Resources/Locale/ru-RU/info/ban.ftl +++ b/Resources/Locale/ru-RU/info/ban.ftl @@ -71,6 +71,7 @@ ban-panel-severity = Тяжесть: # Ban string server-ban-string = { $admin } created a { $severity } severity server ban that expires { $expires } for [{ $name }, { $ip }, { $hwid }], with reason: { $reason } ban-panel-erase = Стереть сообщения в чате и игрока из раунда +ban-panel-expiry-error = ошибка server-ban-string-never = никогда server-ban-string-no-pii = { $admin } установил серверный бан { $severity } тяжести, который истечёт { $expires } у { $name } с причиной: { $reason } cmd-ban_exemption_get-arg-player = diff --git a/Resources/Locale/ru-RU/job/job-supervisors.ftl b/Resources/Locale/ru-RU/job/job-supervisors.ftl index ec822924a5..9cfa4e9631 100644 --- a/Resources/Locale/ru-RU/job/job-supervisors.ftl +++ b/Resources/Locale/ru-RU/job/job-supervisors.ftl @@ -13,3 +13,4 @@ job-supervisors-security = офицерам, смотрителю и главе job-supervisors-science = учёным и научному руководителю job-supervisors-hire = своим нанимателям job-supervisors-everyone = вообще всем +job-supervisors-nobody = никому diff --git a/Resources/Locale/ru-RU/materials/materials.ftl b/Resources/Locale/ru-RU/materials/materials.ftl index c9eff354e6..837697fde7 100644 --- a/Resources/Locale/ru-RU/materials/materials.ftl +++ b/Resources/Locale/ru-RU/materials/materials.ftl @@ -3,6 +3,8 @@ materials-glass = стекло materials-reinforced-glass = бронестекло materials-plasma-glass = плазменное стекло materials-reinforced-plasma-glass = плазменное бронестекло +materials-uranium-glass = урановое стекло +materials-reinforced-uranium-glass = урановое бронестекло # Metals materials-steel = сталь materials-gold = золото diff --git a/Resources/Locale/ru-RU/medical/components/crew-monitoring-component.ftl b/Resources/Locale/ru-RU/medical/components/crew-monitoring-component.ftl index 5e09c8067d..bd124c6997 100644 --- a/Resources/Locale/ru-RU/medical/components/crew-monitoring-component.ftl +++ b/Resources/Locale/ru-RU/medical/components/crew-monitoring-component.ftl @@ -1,15 +1,9 @@ ## UI - -crew-monitoring-user-interface-title = Консоль мониторинга экипажа -crew-monitor-filter-line-placeholder = Фильтр -crew-monitoring-user-interface-name = Имя -crew-monitoring-user-interface-job = Должность: -crew-monitoring-user-interface-status = Статус -crew-monitoring-user-interface-location = Позиция -crew-monitoring-user-interface-alive = Жив -crew-monitoring-user-interface-dead = Мёртв -crew-monitoring-user-interface-no-info = Н/Д -crew-monitoring-user-interface-no-server = Сервер не найден -crew-monitoring-user-interface-no-department = Неизвестно -crew-monitoring-user-interface-flavor-left = В случае экстренной ситуации, немедленно свяжитесь с мед. персоналом станции. -crew-monitoring-user-interface-flavor-right = v1.7 +crew-monitoring-ui-title = Консоль мониторинга экипажа +crew-monitoring-ui-filter-line-placeholder = Фильтр +crew-monitoring-ui-job-label = Должность: +crew-monitoring-ui-no-server-label = Сервер не найден +crew-monitoring-ui-no-department-label = Неизвестно +crew-monitoring-ui-no-station-label = Неизвестная станция +crew-monitoring-ui-flavor-left-label = В случае экстренной ситуации, немедленно свяжитесь с медперсоналом станции. +crew-monitoring-ui-flavor-right-label = v1.7 diff --git a/Resources/Locale/ru-RU/navmap-beacons/station_map.ftl b/Resources/Locale/ru-RU/navmap-beacons/station_map.ftl index 9228df575c..df5647f317 100644 --- a/Resources/Locale/ru-RU/navmap-beacons/station_map.ftl +++ b/Resources/Locale/ru-RU/navmap-beacons/station_map.ftl @@ -2,6 +2,7 @@ station-map-window-title = Карта станции station-map-user-interface-flavor-left = Не паникуй station-map-user-interface-flavor-right = v1.42 station-map-filter-placeholder = Поиск по названию +station-map-unknown-station = Неизвестная станция nav-beacon-window-title = Станционный маяк nav-beacon-toggle-visible = Видимый nav-beacon-toggle-invisible = Невидимый diff --git a/Resources/Locale/ru-RU/npc/hugbot.ftl b/Resources/Locale/ru-RU/npc/hugbot.ftl new file mode 100644 index 0000000000..40fb748563 --- /dev/null +++ b/Resources/Locale/ru-RU/npc/hugbot.ftl @@ -0,0 +1,24 @@ +hugbot-start-hug-1 = ОБНАРУЖЕН ДЕФИЦИТ ОБЪЯТИЙ 5-ГО УРОВНЯ! +hugbot-start-hug-2 = Похоже, тебе нужны объятия! +hugbot-start-hug-3 = Оуу, кому-то нужны объятия! +hugbot-start-hug-4 = Цель обнаружена, начинаю процедуру объятий. +hugbot-start-hug-5 = Пожалуйста, не двигайтесь. +hugbot-start-hug-6 = Обнимашки! +hugbot-start-hug-7 = Доставляю ОБНИМАШКИ. +hugbot-start-hug-8 = Я создан для объятий, и я ОБНИМУ тебя. +hugbot-finish-hug-1 = Готово. +hugbot-finish-hug-2 = Процедура объятий завершена. +hugbot-finish-hug-3 = Тебе лучше? +hugbot-finish-hug-4 = Тебе скоро полегчает! +hugbot-finish-hug-5 = Тебя любят. +hugbot-finish-hug-6 = Ты важен. +hugbot-finish-hug-7 = Всё всегда становится лучше! +hugbot-finish-hug-8 = Объятие: ЗАВЕРШЕНО. +hugbot-emagged-finish-hug-1 = Знаешь, пошёл нахрен. +hugbot-emagged-finish-hug-2 = Никто тебя не любит. +hugbot-emagged-finish-hug-3 = Фууу... Нет. +hugbot-emagged-finish-hug-4 = Дальше будет только хуже! +hugbot-emagged-finish-hug-5 = Сраный плакса. +hugbot-emagged-finish-hug-6 = Умри. +hugbot-emagged-finish-hug-7 = Отвали. +hugbot-emagged-finish-hug-8 = Ты один в этой вселенной. diff --git a/Resources/Locale/ru-RU/pacel-wrap.ftl b/Resources/Locale/ru-RU/pacel-wrap.ftl index b815d6f71f..bb10fdfe0d 100644 --- a/Resources/Locale/ru-RU/pacel-wrap.ftl +++ b/Resources/Locale/ru-RU/pacel-wrap.ftl @@ -1,6 +1,8 @@ parcel-wrap-verb-wrap = Завернуть parcel-wrap-verb-unwrap = Развернуть parcel-wrap-popup-parcel-destroyed = Упаковка, содержащая { THE($contents) }, уничтожена! +parcel-wrap-popup-being-wrapped = { CAPITALIZE(THE($user)) } пытается завернуть вас в обёртку! +parcel-wrap-popup-being-wrapped-self = Вы начинаете завёртывать себя в обёртку. # Shown when parcel wrap is examined in details range parcel-wrap-examine-detail-uses = Осталось [color={ $markupUsesColor }]{ $uses }[/color] { $uses -> diff --git a/Resources/Locale/ru-RU/preferences/loadout-groups.ftl b/Resources/Locale/ru-RU/preferences/loadout-groups.ftl index 83dac00fb0..b558e7f085 100644 --- a/Resources/Locale/ru-RU/preferences/loadout-groups.ftl +++ b/Resources/Locale/ru-RU/preferences/loadout-groups.ftl @@ -2,6 +2,7 @@ loadout-group-species-restriction = Этот предмет недоступен для вашего текущего вида. # Miscellaneous loadout-group-trinkets = Безделушки +loadout-group-jobtrinkets = Безделушки должности loadout-group-glasses = Очки loadout-group-backpack = Рюкзак loadout-group-instruments = Инструменты diff --git a/Resources/Locale/ru-RU/preferences/ui/markings-picker.ftl b/Resources/Locale/ru-RU/preferences/ui/markings-picker.ftl index f145992dec..b17bf2f468 100644 --- a/Resources/Locale/ru-RU/preferences/ui/markings-picker.ftl +++ b/Resources/Locale/ru-RU/preferences/ui/markings-picker.ftl @@ -11,6 +11,11 @@ marking-used-forced = { $marking-name } (Принудительно) marking-slot-add = Добавить marking-slot-remove = Удалить marking-slot = Слот { $number } +humanoid-marking-modifier-force = Принудительно +humanoid-marking-modifier-ignore-species = Игнорировать вид +humanoid-marking-modifier-base-layers = Базовый слой +humanoid-marking-modifier-enable = Включить +humanoid-marking-modifier-prototype-id = ID прототипа: # Categories diff --git a/Resources/Locale/ru-RU/reagents/meta/toxins.ftl b/Resources/Locale/ru-RU/reagents/meta/toxins.ftl index d298dbf103..a261511350 100644 --- a/Resources/Locale/ru-RU/reagents/meta/toxins.ftl +++ b/Resources/Locale/ru-RU/reagents/meta/toxins.ftl @@ -54,5 +54,5 @@ reagent-name-lipolicide = липолицид reagent-desc-lipolicide = Мощный токсин, разрушающий жировые клетки и способствующий снижению массы тела в сжатые сроки. Смертельно опасен для тех, у кого в организме нет питательных веществ. reagent-name-mechanotoxin = механотоксин reagent-desc-mechanotoxin = Нейротоксин, используемый в качестве яда некоторыми видами пауков. При накоплении в организме затрудняет передвижение. -reagent-name-toxintrash = мусор -reagent-desc-toxintrash = Жидкость с ужасным запахом. Смертельна для всех, кроме воксов. +reagent-name-toxintrash = переработанный материал +reagent-desc-toxintrash = Ужасно пахнущая жижа, эффективно очищенная от отходов. Она представляет собой идеальное, безотходное преобразование отходов в пищу для Воксов, хотя для других она является сильным ядом. diff --git a/Resources/Locale/ru-RU/recipes/tags.ftl b/Resources/Locale/ru-RU/recipes/tags.ftl index 6216789d33..f271da06e1 100644 --- a/Resources/Locale/ru-RU/recipes/tags.ftl +++ b/Resources/Locale/ru-RU/recipes/tags.ftl @@ -8,6 +8,7 @@ construction-graph-tag-clown-bike-horn = клаксон construction-graph-tag-clowne-horn = сломанный клаксон construction-graph-tag-happy-honk-meal = обед Хэппи Хонк construction-graph-tag-woeful-cluwne-meal = обед Жалкий Клувень +construction-graph-tag-boxhug = коробка обнимашек # mime construction-graph-tag-suspenders = подтяжки construction-graph-tag-mime-meal = обед Хэппи Хонк мимское издание diff --git a/Resources/Locale/ru-RU/silicons/station-ai.ftl b/Resources/Locale/ru-RU/silicons/station-ai.ftl index dbaf7a1df0..77fa247361 100644 --- a/Resources/Locale/ru-RU/silicons/station-ai.ftl +++ b/Resources/Locale/ru-RU/silicons/station-ai.ftl @@ -19,6 +19,7 @@ electrify-door-on = Включить перегрузку electrify-door-off = Отключить перегрузку toggle-light = Переключить свет ai-device-not-responding = Устройство не отвечает +ai-device-no-access = У вас нет доступа к этому устройству ai-consciousness-download-warning = Ваше сознание начали загружать. # UI station-ai-customization-menu = Настройка ИИ diff --git a/Resources/Locale/ru-RU/speech/speech-triggers.ftl b/Resources/Locale/ru-RU/speech/speech-triggers.ftl new file mode 100644 index 0000000000..979decc53b --- /dev/null +++ b/Resources/Locale/ru-RU/speech/speech-triggers.ftl @@ -0,0 +1,2 @@ +# TODO ПЕРЕВЕСТИ +key-phrase-gadget = гаджет в бой diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/actions/types.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/actions/types.ftl index 97f5fdeb94..0ce0fd31fb 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/actions/types.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/actions/types.ftl @@ -72,3 +72,5 @@ ent-ActionToggleRootable = Укоренение .desc = Начните или прекратите укореняться к полу. ent-ActionChameleonController = Управление одеждой .desc = Быстро смените весь свой наряд! +ent-ActionIntrinsicStore = Магазин + .desc = Открыть магазин diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/body/organs/vox.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/body/organs/vox.ftl index f0ab196e6a..7b36cbb409 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/body/organs/vox.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/body/organs/vox.ftl @@ -7,3 +7,11 @@ ent-OrganVoxLiver = печень .desc = Пахнет горючим. ent-OrganVoxHeart = сердце .desc = Странное серце вокса. +ent-OrganVoxKidneys = почка + .desc = Пахнет горючим. +ent-OrganVoxEyes = глаза + .desc = { ent-OrganHumanEyes.desc } +ent-OrganVoxTongueA = язык + .desc = Мясная мышца, в основном используемая для крика. +ent-OrganVoxTongueB = язык + .desc = Мясная мышца, в основном используемая для крика. diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/catalog/fills/crates/botany.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/catalog/fills/crates/botany.ftl index 504e9a2827..f6fc34779a 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/catalog/fills/crates/botany.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/catalog/fills/crates/botany.ftl @@ -5,6 +5,6 @@ ent-CrateHydroponicsSeedsMedicinal = ящик лекарственных сем ent-CrateHydroponicsTools = ящик снаряжения для гидропоники .desc = Припасы для выращивания превосходного сада! Содержит несколько спреев с химикатами для растений, топорик, грабли, косу, несколько пар кожаных перчаток и ботанический фартук. ent-CrateHydroponicsSeeds = ящик семян - .desc = Большие дела начинаются с малого. Содержит 12 различных семян. + .desc = Большие дела начинаются с малого. Содержит двадцать четыре различных пакета семян. ent-CrateHydroponicsTray = ящик с гидропонным лотком .desc = Содержит упаковку гидропонного лотка. diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/clothing/ears/headsets.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/clothing/ears/headsets.ftl index be644cf55f..78fb5de01b 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/clothing/ears/headsets.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/clothing/ears/headsets.ftl @@ -38,3 +38,5 @@ ent-ClothingHeadsetFreelance = гарнитура фрилансера .desc = Такими пользуются группы бродячих фрилансеров. ent-ClothingHeadsetWizard = гарнитура волшебника .desc = Гарнитура, используемая ужасными космическими волшебниками. +ent-ClothingHeadsetNinja = зелёная гарнитура + .desc = Кто откажется носить эту стильную чёрно-зелёную гарнитуру? diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/markers/warp_point.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/markers/warp_point.ftl index 4602e38b32..4073a711ea 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/markers/warp_point.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/markers/warp_point.ftl @@ -4,6 +4,3 @@ ent-WarpPointBeacon = warp point (beacon) .desc = { ent-WarpPoint.desc } ent-GhostWarpPoint = ghost only warp point .desc = { ent-MarkerBase.desc } -ent-WarpPointBombing = warp point - .suffix = Цель взрыва бомбы ниндзя - .desc = { ent-WarpPoint.desc } diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/mobs/npcs/elemental.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/mobs/npcs/elemental.ftl index cb5659e5dc..9a34ce6c54 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/mobs/npcs/elemental.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/mobs/npcs/elemental.ftl @@ -1,5 +1,5 @@ -ent-MobElementalBase = { "" } - .desc = { "" } +ent-MobElementalBase = { ent-BaseMob } + .desc = { ent-BaseMob.desc } ent-MobOreCrab = рудокраб .desc = { ent-MobElementalBase.desc } ent-MobQuartzCrab = { ent-MobOreCrab } diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/mobs/npcs/silicon.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/mobs/npcs/silicon.ftl index 2bffad0d77..6fd94440d5 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/mobs/npcs/silicon.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/mobs/npcs/silicon.ftl @@ -16,3 +16,5 @@ ent-MobMimeBot = мимбот .desc = Почему бы не помахать мимботу? ent-MobSupplyBot = грузобот .desc = Доставляет грузы! +ent-MobHugBot = обнибот + .desc = Оуу, кому нужны объятия? diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/consumable/food/containers/box.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/consumable/food/containers/box.ftl index bd40039256..2202eeadfc 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/consumable/food/containers/box.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/consumable/food/containers/box.ftl @@ -6,8 +6,8 @@ ent-EggBoxBroken = { ent-FoodContainerEgg } .suffix = Порванная .desc = { ent-FoodContainerEgg.desc } ent-FoodBoxPizza = коробка пиццы - .desc = { ent-BaseItem.desc } -ent-FoodBoxPizzaFilled = коробка пиццы + .desc = Коробка для пиццы. Удерживает тепло, запах и воспоминания о лучших пяти минутах вашей жизни. +ent-FoodBoxPizzaFilled = { ent-FoodBoxPizza } .suffix = Заполненная .desc = { ent-FoodBoxPizza.desc } ent-FoodBoxPizzaCotton = pizza box diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/devices/circuitboards/law_boards.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/devices/circuitboards/law_boards.ftl index b15c2dd451..5c960c22dd 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/devices/circuitboards/law_boards.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/devices/circuitboards/law_boards.ftl @@ -1,3 +1,5 @@ +ent-BaseSiliconLawboard = { ent-BaseElectronics } + .desc = Электронная плата, хранящая набор законов. ent-NTDefaultCircuitBoard = плата законов (NT стандарт) .desc = Электронная плата, хранящая набор законов 'NT стандарт'. ent-AsimovCircuitBoard = плата законов (Крюзимов) diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/fun/crayons.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/fun/crayons.ftl index 3470562d42..5b92c6c2a1 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/fun/crayons.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/fun/crayons.ftl @@ -1,3 +1,5 @@ +ent-CrayonInedible = мелок + .desc = Красочный мелок. Выглядит аппетитно. Мммм... ent-Crayon = мелок .desc = Красочный мелок. Выглядит аппетитно. Мммм... ent-CrayonWhite = белый мелок @@ -6,6 +8,10 @@ ent-CrayonMime = мимский мелок .desc = { ent-Crayon.desc } ent-CrayonRainbow = радужный мелок .desc = { ent-Crayon.desc } +ent-CrayonInfinite = бесконечный мелок + .desc = { ent-CrayonRainbow.desc } +ent-CrayonBorg = электрический мелок + .desc = Вероятно вкуснейший тип мелков во всех вселенных. К сожалению, их нельзя есть. ent-CrayonBlack = чёрный мелок .desc = { ent-Crayon.desc } ent-CrayonRed = красный мелок diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/fun/figurines.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/fun/figurines.ftl index edc307935b..82a7b8b19f 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/fun/figurines.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/fun/figurines.ftl @@ -76,6 +76,14 @@ ent-ToyFigurineWizard = фигурка волшебника .desc = Фигурка, изображающая кого-то с длинной шелковистой бородой в костюме волшебника. Колдуны жалеют, что у них ничего подобного нет. ent-ToyFigurineWizardFake = фигурка ненастоящего волшебника .desc = Фигурка, изображающая кого-то в поддельном костюме волшебника. Ну и скам! +ent-ToyFigurineGriffin = фигурка грифона + .desc = Фигурка, изображающая «Грифона», преступного гения. +ent-ToyFigurineOwlman = фигурка филина + .desc = Фигурка, изображающая «Филина», защитника справедливости. +ent-ToyFigurineSkeleton = фигурка скелета + .desc = Фигурка, изображающая жуткого страшного скелета. +ent-ToyFigurineThief = фигурка вора + .desc = Фигурка, изображающая клептомана, который прячется в тени. ent-ToyFigurineSpaceDragon = фигурка космического дракона .desc = Большая фигурка, изображающая космического дракона с красными глазами, устремлёнными на добычу. ent-ToyFigurineQueen = фигурка королевы ксено @@ -90,11 +98,3 @@ ent-ToyFigurineSlime = фигурка слайма .desc = Фигурка, изображающая полупрозрачного голубого слайма. ent-ToyFigurineHamlet = фигурка Гамлета .desc = Фигурка, изображающая Гамлета, микроволновка в комплект не входит. -ent-ToyGriffin = фигурка гриффина - .desc = Экшен-фигурка, созданная по образу и подобию "Гриффина", криминального главаря. -ent-ToyOwlman = фигурка совы - .desc = Экшен-фигурка, созданная по образу и подобию 'Совы', защитника справедливости. -ent-ToySkeleton = фигурка скелета - .desc = Буу, испугал! -ent-ToyFigurineThief = фигурка вора - .desc = Скрываясь в тени... diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/fun/plushielizard_jobs.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/fun/plushielizard_jobs.ftl new file mode 100644 index 0000000000..52c62c34c5 --- /dev/null +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/fun/plushielizard_jobs.ftl @@ -0,0 +1,80 @@ +ent-BasePlushieLizardJob = { ent-PlushieLizard } + .desc = { ent-PlushieLizard.desc } +ent-PlushieLizardJobAtmospherictechnician = плюшевая ящерица атмосферный техник + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу атмосферного техника. Слабо пахнет фрезоном. +ent-PlushieLizardJobBartender = плюшевая ящерица бармен + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу бармена. На её языке пятна алкоголя. +ent-PlushieLizardJobBotanist = плюшевая ящерица ботаник + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу ботаника. На её лапах маленькие колючки и она слабо пахнет удобрениями. +ent-PlushieLizardJobBoxer = плюшевая ящерица боксёр + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу боксёра. Нити на её перчатках начинают распускаться. +ent-PlushieLizardJobCaptain = плюшевая ящерица капитан + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу капитана. На её лице кусочки торта. +ent-PlushieLizardJobCargotechnician = плюшевая ящерица грузчик + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу грузчика. К её чешуе прилипли гранулы упаковочного наполнителя. +ent-PlushieLizardJobChaplain = плюшевая ящерица священник + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу священника. Слабо пахнет ладаном. +ent-PlushieLizardJobChef = плюшевая ящерица шеф-повар + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу шеф-повара. Слабо пахнет специями, на фартуке видны пятна масла. +ent-PlushieLizardJobChemist = плюшевая ящерица химик + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу химика. Некоторые части игрушки пропитаны химикатами. +ent-PlushieLizardJobChiefengineer = плюшевая ящерица старший инженер + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу старшего инженера. Покрыта металлической стружкой и каплями расплавленной сварочной проволоки. +ent-PlushieLizardJobChiefmedicalofficer = плюшевая ящерица главный врач + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу главного врача. Хвост игрушки был отшит и пришит обратно, вероятно, в ходе практики хирургии. +ent-PlushieLizardJobClown = плюшевая ящерица клоун + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу клоуна. Её нос пищит, когда на него нажимаешь. +ent-PlushieLizardJobDetective = плюшевая ящерица детектив + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу детектива. Выглядит готовой к загадкам. +ent-PlushieLizardJobHeadofpersonnel = плюшевая ящерица глава персонала + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу главу персонала. Хоть она и выглядит восхищённой на первый взгляд, внутри она, вероятно, такая же усталая как и вы. +ent-PlushieLizardJobHeadofsecurity = плюшевая ящерица глава СБ + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу главы службы безопасности. Похоже её рвали и сшивали обратно несколько раз. +ent-PlushieLizardJobJanitor = плюшевая ящерица уборщик + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу уборщика. Слабо пахнет уборочными средствами. +ent-PlushieLizardJobLawyer = плюшевая ящерица адвокат + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу адвоката. Её значок адвоката едва держится после нескольких часов ерзания. +ent-PlushieLizardJobLibrarian = плюшевая ящерица библиотекарь + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу библиотекаря. Цвет игрушки поблёк от многолетнего сидения за столом. +ent-PlushieLizardJobMedicaldoctor = плюшевая ящерица врач + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу врача. Выглядит хорошо вымытой +ent-PlushieLizardJobMedicalintern = плюшевая ящерица интерн + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу интерна. Слабо пахнет антисептиком. +ent-PlushieLizardJobMime = плюшевая ящерица мим + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу мима. Она молча пялится на вас, её мотивы неизвестны. +ent-PlushieLizardJobMusician = плюшевая ящерица музыкант + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу музыканта. Слабо пахнет потом и часть её ниток ослабли. +ent-PlushieLizardJobParamedic = плюшевая ящерица парамедик + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу парамедика. На игрушку нашито несколько маленьких бинтиков. +ent-PlushieLizardJobPassenger = плюшевая ящерица пассажир + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу пассажира. Её глаза выглядят круглее и блестящее, чем у других. +ent-PlushieLizardJobPsychologist = плюшевая ящерица психолог + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу психолога. Кажется, ей нравится молча вас слушать. +ent-PlushieLizardJobQuartermaster = плюшевая ящерица квартирмейстер + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу квартирмейстера. Она покрыта липкими остатками от тысячи транспортных накладных. +ent-PlushieLizardJobReporter = плюшевая ящерица репортёр + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу репортёра. Она слабо пахнет чернилами. +ent-PlushieLizardJobResearchassistant = плюшевая ящерица научный ассистент + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу научного ассистента. Она слабо пахнет горелой бумагой. +ent-PlushieLizardJobResearchdirector = плюшевая ящерица научный руководитель + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу научного руководитель. На игрушке есть несколько следов от ожогов. +ent-PlushieLizardJobSalvagespecialist = плюшевая ящерица утилизатор + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу утилизатора. Выглядит, будто она повидала холод космоса. +ent-PlushieLizardJobScientist = плюшевая ящерица учёный + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу учёного. На ней несколько следов от укусов, возможно от любопытной обезьяны. +ent-PlushieLizardJobSecuritycadet = плюшевая ящерица кадет СБ + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу кадета СБ. Похоже, на ней следы от электрических ожогов. +ent-PlushieLizardJobSecurityofficer = плюшевая ящерица офицер СБ + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу офицера СБ. Наполнитель утрамбовался от множества ударов. +ent-PlushieLizardJobServiceworker = плюшевая ящерица сервисный работник + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу сервисного работника. Пахнет смесью уборочных средств и еды. +ent-PlushieLizardJobStationengineer = плюшевая ящерица инженер + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу инженера. На её лапках пятна от масла. +ent-PlushieLizardJobTechnicalassistant = плюшевая ящерица технический ассистент + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу технического ассистента. Слабо пахнет горелыми проводами. +ent-PlushieLizardJobWarden = плюшевая ящерица смотритель + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу смотрителя. Пахнет чёрным порохом и оружейным маслом. +ent-PlushieLizardJobZookeeper = плюшевая ящерица зоотехник + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу зоотехника. К ней прилипла шерсть гориллы. +ent-PlushieLizardJobMultiweh = плюшевая ящерица мультивех + .desc = Очаровательная мягкая игрушка, напоминающая ящерицу каждой должности! У этой игрушки много талантов. Вы можете услышать, как вдали плачет глава персонала. diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/misc/books.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/misc/books.ftl index 0d434d8319..a94a003806 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/misc/books.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/misc/books.ftl @@ -29,6 +29,8 @@ ent-BookHowToSurvive = Как выжить .desc = По иронии судьбы автор этой книги умер. ent-BookSpaceLaw = Корпоративный закон .desc = Набор правил Nanotrasen для поддержания закона и порядка на своих космических станциях. +ent-BookAILawCompendium = Мой, робот + .desc = Сборник всех возможных неисправностей синтетиков. Автор: Айзек Крюзимов. ent-BookChemicalCompendium = Химпендиум .desc = Исчерпывающее руководство о химическом синтезе, написанное каким-то пожилым скелетом профессора. ent-BookRandom = { ent-BookBase } diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/misc/identification_cards.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/misc/identification_cards.ftl index 2409f1385d..8de5de3df1 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/misc/identification_cards.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/misc/identification_cards.ftl @@ -1,43 +1,67 @@ -ent-IDCardStandard = ID-карта +ent-IDCardStandard = идентификационная карта .desc = Карта, необходимая для доступа к различным областям станции. ent-PassengerIDCard = ID-карта пассажира .desc = { ent-IDCardStandard.desc } -ent-TechnicalAssistantIDCard = ID-карта ассистента-техника - .desc = { ent-PassengerIDCard.desc } -ent-MedicalInternIDCard = ID-карта врача-интерна - .desc = { ent-PassengerIDCard.desc } -ent-ResearchAssistantIDCard = ID-карта научного ассистента - .desc = { ent-PassengerIDCard.desc } -ent-SecurityCadetIDCard = ID-карта кадета СБ - .desc = { ent-PassengerIDCard.desc } -ent-ServiceWorkerIDCard = ID-карта обслуживающего персонала - .desc = { ent-PassengerIDCard.desc } ent-CaptainIDCard = ID-карта капитана .desc = { ent-IDCardStandard.desc } -ent-SecurityIDCard = ID-карта службы безопасности +ent-HoPIDCard = ID-карта главы персонала .desc = { ent-IDCardStandard.desc } -ent-WardenIDCard = ID-карта смотрителя +ent-CEIDCard = ID-карта старшего инженера + .desc = { ent-IDCardStandard.desc } +ent-CMOIDCard = ID-карта главного врача + .desc = { ent-IDCardStandard.desc } +ent-RDIDCard = ID-карта научного руководителя + .desc = { ent-IDCardStandard.desc } +ent-HoSIDCard = ID-карта главы службы безопасности + .desc = { ent-IDCardStandard.desc } +ent-QuartermasterIDCard = ID-карта квартирмейстера + .desc = { ent-IDCardStandard.desc } +ent-TechnicalAssistantIDCard = ID-карта технического ассистента .desc = { ent-IDCardStandard.desc } ent-EngineeringIDCard = ID-карта инженера .desc = { ent-IDCardStandard.desc } +ent-AtmosIDCard = ID-карта атмосферного техника + .desc = { ent-IDCardStandard.desc } +ent-SeniorEngineerIDCard = ID-карта ведущего инженера + .desc = { ent-EngineeringIDCard.desc } +ent-MedicalInternIDCard = ID-карта интерна + .desc = { ent-IDCardStandard.desc } ent-MedicalIDCard = ID-карта медика .desc = { ent-IDCardStandard.desc } ent-ParamedicIDCard = ID-карта парамедика .desc = { ent-IDCardStandard.desc } ent-ChemistIDCard = ID-карта химика .desc = { ent-IDCardStandard.desc } -ent-CargoIDCard = ID-карта грузчика +ent-PsychologistIDCard = ID-карта психолога .desc = { ent-IDCardStandard.desc } -ent-SalvageIDCard = ID-карта утилизатора - .desc = { ent-IDCardStandard.desc } -ent-QuartermasterIDCard = ID-карта квартирмейстера +ent-SeniorPhysicianIDCard = ID-карта ведущего врача + .desc = { ent-MedicalIDCard.desc } +ent-ResearchAssistantIDCard = ID-карта научного ассистента .desc = { ent-IDCardStandard.desc } ent-ResearchIDCard = ID-карта учёного .desc = { ent-IDCardStandard.desc } +ent-SeniorResearcherIDCard = ID-карта ведущего учёного + .desc = { ent-ResearchIDCard.desc } +ent-SecurityCadetIDCard = ID-карта кадета СБ + .desc = { ent-IDCardStandard.desc } +ent-SecurityIDCard = ID-карта службы безопасности + .desc = { ent-IDCardStandard.desc } +ent-WardenIDCard = ID-карта смотрителя + .desc = { ent-IDCardStandard.desc } +ent-DetectiveIDCard = ID-карта детектива + .desc = { ent-IDCardStandard.desc } +ent-BrigmedicIDCard = ID-карта бригмедика + .desc = { ent-IDCardStandard.desc } +ent-SeniorOfficerIDCard = ID-карта инструктора СБ + .desc = { ent-SecurityIDCard.desc } +ent-ServiceWorkerIDCard = ID-карта сервисного работника + .desc = { ent-IDCardStandard.desc } ent-ClownIDCard = ID-карта клоуна .desc = { ent-IDCardStandard.desc } ent-MimeIDCard = ID-карта мима .desc = { ent-IDCardStandard.desc } +ent-MusicianIDCard = ID-карта музыканта + .desc = { ent-IDCardStandard.desc } ent-ChaplainIDCard = ID-карта священника .desc = { ent-IDCardStandard.desc } ent-JanitorIDCard = ID-карта уборщика @@ -54,19 +78,40 @@ ent-LibrarianIDCard = ID-карта библиотекаря .desc = { ent-IDCardStandard.desc } ent-LawyerIDCard = ID-карта адвоката .desc = { ent-IDCardStandard.desc } -ent-HoPIDCard = ID-карта главы персонала +ent-ReporterIDCard = ID-карта репортёра .desc = { ent-IDCardStandard.desc } -ent-CEIDCard = ID-карта старшего инженера +ent-BoxerIDCard = ID-карта боксёра .desc = { ent-IDCardStandard.desc } -ent-CMOIDCard = ID-карта главного врача +ent-ZookeeperIDCard = ID-карта зоотехника .desc = { ent-IDCardStandard.desc } -ent-RDIDCard = ID-карта научного руководителя +ent-CargoIDCard = ID-карта грузчика .desc = { ent-IDCardStandard.desc } -ent-HoSIDCard = ID-карта главы службы безопасности +ent-SalvageIDCard = ID-карта утилизатора + .desc = { ent-IDCardStandard.desc } +ent-PrisonerIDCard = ID-карта заключённого + .desc = Шаблонная, напечатанная ID-карта для мерзких заключённых. +ent-CluwneIDCard = ID-карта клувеня + .suffix = Неснимаемый .desc = { ent-IDCardStandard.desc } ent-VisitorIDCard = ID-карта посетителя .desc = { ent-IDCardStandard.desc } -ent-BrigmedicIDCard = ID-карта бригмедика +ent-AgentIDCard = { ent-PassengerIDCard } + .suffix = Агентская + .desc = { ent-PassengerIDCard.desc } +ent-NukieAgentIDCard = { ent-AgentIDCard } + .suffix = Оперативники + .desc = { ent-AgentIDCard.desc } +ent-SyndicateIDCard = ID-карта Синдиката + .desc = { ent-IDCardStandard.desc } +ent-SyndiOperativeIDCard = ID-карта оперативника Синдиката + .desc = { ent-SyndicateIDCard.desc } +ent-SyndiCorpsmanIDCard = ID-карта медика Синдиката + .desc = { ent-SyndiOperativeIDCard.desc } +ent-SyndiCommanderIDCard = ID-карта командира Синдиката + .desc = { ent-SyndiOperativeIDCard.desc } +ent-PirateIDCard = ID-карта пирата + .desc = { ent-IDCardStandard.desc } +ent-WizardIDCard = ID-карта волшебника .desc = { ent-IDCardStandard.desc } ent-CentcomIDCard = ID-карта старшего офицера .desc = { ent-IDCardStandard.desc } @@ -82,56 +127,11 @@ ent-ERTMedicIDCard = ID-карта врача ОБР .desc = { ent-IDCardStandard.desc } ent-ERTSecurityIDCard = ID-карта офицера ОБР .desc = { ent-IDCardStandard.desc } -ent-MusicianIDCard = ID-карта музыканта - .desc = { ent-IDCardStandard.desc } ent-CentcomIDCardDeathsquad = ID-карта эскадрона смерти .desc = { ent-IDCardStandard.desc } -ent-AgentIDCard = { ent-PassengerIDCard } - .suffix = Агентская - .desc = { ent-IDCardStandard.desc } -ent-NukieAgentIDCard = ID-карта пассажира - .suffix = Оперативники - .desc = { ent-AgentIDCard.desc } -ent-AtmosIDCard = ID-карта атмосферного техника - .desc = { ent-IDCardStandard.desc } -ent-SyndicateIDCard = ID-карта Синдиката - .desc = { ent-IDCardStandard.desc } -ent-SyndiOperativeIDCard = ID-карта оперативника Синдиката - .desc = { ent-SyndicateIDCard.desc } -ent-SyndiCorpsmanIDCard = ID-карта медика Синдиката - .desc = { ent-SyndiOperativeIDCard.desc } -ent-SyndiCommanderIDCard = ID-карта командира Синдиката - .desc = { ent-SyndiOperativeIDCard.desc } -ent-PirateIDCard = ID-карта пирата - .desc = { ent-IDCardStandard.desc } -ent-PsychologistIDCard = ID-карта психолога - .desc = { ent-IDCardStandard.desc } -ent-ReporterIDCard = ID-карта репортёра - .desc = { ent-IDCardStandard.desc } -ent-BoxerIDCard = ID-карта боксёра - .desc = { ent-IDCardStandard.desc } -ent-ZookeeperIDCard = ID-карта зоотехника - .desc = { ent-IDCardStandard.desc } -ent-DetectiveIDCard = ID-карта детектива - .desc = { ent-IDCardStandard.desc } -ent-PrisonerIDCard = ID-карта заключённого - .desc = Шаблонная, напечатанная ID-карта для мерзких заключённых. ent-CBURNIDcard = ID-карта РХБЗЗ - .desc = { ent-CentcomIDCard.desc } + .desc = { ent-IDCardStandard.desc } .suffix = РХБЗЗ -ent-CluwneIDCard = ID-карта клувеня - .suffix = Неснимаемый - .desc = { ent-IDCardStandard.desc } -ent-SeniorEngineerIDCard = ID-карта ведущего инженера - .desc = { ent-EngineeringIDCard.desc } -ent-SeniorResearcherIDCard = ID-карта ведущего учёного - .desc = { ent-ResearchIDCard.desc } -ent-SeniorPhysicianIDCard = ID-карта ведущего врача - .desc = { ent-MedicalIDCard.desc } -ent-SeniorOfficerIDCard = ID-карта инструктора СБ - .desc = { ent-SecurityIDCard.desc } -ent-WizardIDCard = ID-карта волшебника - .desc = { ent-IDCardStandard.desc } ent-UniversalIDCard = универсальная ID-карта .desc = ID-карта, которая позволит вам осуществить свои самые сокровенные желания. .suffix = Админ diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/misc/parcel_wrap.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/misc/parcel_wrap.ftl index fa75f977a9..d54520fe22 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/misc/parcel_wrap.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/misc/parcel_wrap.ftl @@ -3,7 +3,11 @@ ent-ParcelWrapAdmeme = блюспейс обёрточная бумага .desc = Бумага, которой упаковывают вещи для транспортировки. Кажется, она способна вмещать необычно большое количество вещей. .suffix = Admeme -ent-WrappedParcel = завёрнутая посылка +ent-BaseWrappedParcel = завёрнутая посылка .desc = Что-то завёрнутое в бумагу. Интересно, что же внутри... +ent-WrappedParcel = { ent-BaseWrappedParcel } + .desc = { ent-BaseWrappedParcel.desc } +ent-WrappedParcelHumanoid = { ent-BaseWrappedParcel } + .desc = Что-то завёрнутое в бумагу. Подозрительно гуманоидной формы. ent-ParcelWrapTrash = обёрточная бумага .desc = Разочаровывающие остатки распакованной посылки. diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/specific/robotics/borg_modules.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/specific/robotics/borg_modules.ftl index 25693a1060..7e3f5016dc 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/specific/robotics/borg_modules.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/specific/robotics/borg_modules.ftl @@ -32,6 +32,8 @@ ent-BaseXenoborgModuleStealth = { ent-BaseBorgModule } .desc = { ent-BaseBorgModule.desc } ent-BorgModuleCable = кабельный модуль киборга .desc = Универсальный модуль киборга, позволяющий юниту прокладывать и манипулировать электрическими системами. +ent-BorgModuleArtistry = художественный модуль киборга + .desc = Модуль для занятий искусством, пока станция горит! ent-BorgModuleFireExtinguisher = огнетушащий модуль киборга .desc = NT назначило команду для разработки джетпака для киборгов, но у них кончилось финансирование и они просто сделали большую версию огнетушителя. Зато он идёт вместе с GPS и сканером масс! ent-BorgModuleTool = инструментальный модуль киборга diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/tools/spray_painter.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/tools/spray_painter.ftl index ebf8c5296f..aacaa253ae 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/tools/spray_painter.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/tools/spray_painter.ftl @@ -3,6 +3,9 @@ ent-SprayPainter = краскопульт ent-SprayPainterRecharging = { ent-SprayPainter } .suffix = Адмемы .desc = { ent-SprayPainter.desc } +ent-SprayPainterBorg = экспериментальный краскопульт + .desc = Экспериментальный самозаряжающийся краскопульт, который может бесконечно воспроизводить сжатую краску. + .suffix = Борг ent-SprayPainterEmpty = { ent-SprayPainter } .suffix = Пустой .desc = { ent-SprayPainter.desc } diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/statuseffects/movement.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/statuseffects/movement.ftl index 0874ddf5b4..ce08cf49e3 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/statuseffects/movement.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/statuseffects/movement.ftl @@ -1,5 +1,9 @@ ent-StatusEffectSlowdown = замедление .desc = { ent-MobStatusEffectDebuff.desc } +ent-StatusEffectSpeed = скорость + .desc = { ent-MobStatusEffectBase.desc } +ent-ReagentSpeedStatusEffect = скорость от реагента + .desc = { ent-StatusEffectSpeed.desc } ent-VomitingSlowdownStatusEffect = замедление от тошноты .desc = { ent-StatusEffectSlowdown.desc } ent-TaserSlowdownStatusEffect = замедление от тазера diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/statuseffects/speech.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/statuseffects/speech.ftl index e105c2b1de..7ca3ead5e6 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/statuseffects/speech.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/statuseffects/speech.ftl @@ -4,3 +4,5 @@ ent-StatusEffectStutter = заикание .desc = { ent-SpeechStatusEffectBase.desc } ent-StatusEffectSlurred = невнятность .desc = { ent-SpeechStatusEffectBase.desc } +ent-StatusEffectScrambled = неразборчивость + .desc = { ent-SpeechStatusEffectBase.desc } diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/decoration/curtains.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/decoration/curtains.ftl index 81e4997a4c..044843718e 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/decoration/curtains.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/decoration/curtains.ftl @@ -15,9 +15,15 @@ ent-CurtainsBlackOpen = { ent-CurtainsBlack } ent-CurtainsBlue = { ent-BaseCurtains } .suffix = Красивые синие .desc = { ent-BaseCurtains.desc } +ent-CurtainsSkyBlue = { ent-BaseCurtains } + .suffix = Красивые небесные + .desc = { ent-BaseCurtains.desc } ent-CurtainsBlueOpen = { ent-CurtainsBlue } .suffix = Открытые, Красивые синие .desc = { ent-CurtainsBlue.desc } +ent-CurtainsSkyBlueOpen = { ent-CurtainsSkyBlue } + .suffix = Открытые, Красивые небесные + .desc = { ent-CurtainsSkyBlue.desc } ent-CurtainsCyan = { ent-BaseCurtains } .suffix = Красивые голубые .desc = { ent-BaseCurtains.desc } diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/doors/airlocks/access.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/doors/airlocks/access.ftl index 9502bf2119..7621ef48af 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/doors/airlocks/access.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/doors/airlocks/access.ftl @@ -399,6 +399,9 @@ ent-HighSecCaptainLocked = { ent-HighSecDoor } ent-HighSecArmoryLocked = { ent-HighSecDoor } .suffix = Оружейная, Закрыт .desc = { ent-HighSecDoor.desc } -ent-AirlockHatchSyndicate = { ent-AirlockHatch } +ent-AirlockHatchSyndicateLocked = { ent-AirlockHatchSyndicate } .suffix = Синдикат, Закрыт - .desc = { ent-AirlockHatch.desc } + .desc = { ent-AirlockHatchSyndicate.desc } +ent-AirlockHatchMaintenanceLocked = { ent-AirlockHatchMaintenance } + .suffix = Закрыт + .desc = { ent-AirlockHatchMaintenance.desc } diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/doors/airlocks/airlocks.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/doors/airlocks/airlocks.ftl index 5314fd8c6a..740a32e6cf 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/doors/airlocks/airlocks.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/doors/airlocks/airlocks.ftl @@ -51,6 +51,9 @@ ent-AirlockXenoborg = ксеноборг-шлюз .desc = { ent-Airlock.desc } ent-AirlockHatchMaintenance = герметичный люк техобслуживания .desc = { ent-Airlock.desc } +ent-AirlockHatchSyndicate = герметичный люк + .suffix = Синдикат + .desc = { ent-Airlock.desc } ent-AirlockEngineeringGlass = { ent-AirlockGlass } .suffix = Инженерный .desc = { ent-AirlockGlass.desc } diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/furniture/tables/tables.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/furniture/tables/tables.ftl index b8bc07a8dc..f68546348a 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/furniture/tables/tables.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/furniture/tables/tables.ftl @@ -33,6 +33,9 @@ ent-TableFancyBase = красивый стол ent-TableFancyBlue = { ent-TableFancyBase } .suffix = Синий .desc = { ent-TableFancyBase.desc } +ent-TableFancySkyBlue = { ent-TableFancyBase } + .suffix = Небесный + .desc = { ent-TableFancyBase.desc } ent-TableFancyCyan = { ent-TableFancyBase } .suffix = Голубой .desc = { ent-TableFancyBase.desc } diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/furniture/toilet.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/furniture/toilet.ftl index af14e259f4..7ee1609128 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/furniture/toilet.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/furniture/toilet.ftl @@ -6,6 +6,12 @@ ent-ToiletEmpty = унитаз ent-ToiletDirtyWater = { ent-ToiletEmpty } .desc = { ent-ToiletEmpty.desc } .suffix = Грязная вода +ent-ToiletFilled = { ent-ToiletEmpty } + .suffix = Пустой, случайный лут в бачке + .desc = { ent-ToiletEmpty.desc } +ent-ToiletDirtyWaterFilled = { ent-ToiletDirtyWater } + .suffix = Грязная вода, случайный лут в бачке + .desc = { ent-ToiletDirtyWater.desc } ent-ToiletGoldenEmpty = золотой унитаз .desc = НТ-451-З — золотая версия аппарата. На боку написано, что он сделан из чистейшего меркурианского золота, а сиденье из натуральной кожи. .suffix = Пустой diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/shuttles/thrusters.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/shuttles/thrusters.ftl index 932bfdb5b6..9a3b897822 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/shuttles/thrusters.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/shuttles/thrusters.ftl @@ -2,6 +2,8 @@ ent-BaseThruster = ракетный двигатель .desc = Ускоритель, позволяющий шаттлу передвигаться. ent-Thruster = ракетный двигатель .desc = { ent-BaseThruster.desc } +ent-ThrusterLarge = большой ракетный двигатель + .desc = { ent-BaseThruster.desc } ent-ThrusterUnanchored = { ent-Thruster } .suffix = Незакреплённый .desc = { ent-Thruster.desc } diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/wallmounts/signs/posters.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/wallmounts/signs/posters.ftl index ef95a6749c..2f456106c2 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/wallmounts/signs/posters.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/wallmounts/signs/posters.ftl @@ -240,6 +240,8 @@ ent-PosterLegitTyrone = Путеводитель Тайрона по космо .desc = Плакат, рекламирующий онлайн-курсы по выживанию в космосе. Похоже, перечисленные курсы охватывают всё: от базового использования оборудования станции до таких сложных предметов, как создание бомб или заливание целых коридоров космической смазкой. Отказ от ответственности гласит: "Никогда не бывает НАСТОЛЬКО плохо, и в конце вы даже можете получить тортилью". ent-PosterLegitHelio = реклама "Helio Logistics" .desc = Плакат, рекламирующий "Helio Logistics" и их очаровательного маскота. Слоган гласит: "Погода не беда — доставим вовремя всегда!" +ent-PosterLegitBotanyFear = Страх гидропоники + .desc = Подумай трижды, прежде чем открыть шлюз в гидропонику, там может прятаться красная угроза. ent-PosterMapBagel = карта Bagel .desc = Карта станции Bagel. ent-PosterMapDelta = карта Delta diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/xenoarch/effects.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/xenoarch/effects.ftl index 95d7ceafef..8dca352820 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/xenoarch/effects.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/xenoarch/effects.ftl @@ -78,6 +78,8 @@ ent-XenoArtifactAngryCarpSpawn = { ent-BaseXenoArtifactEffect } .desc = Создание враждебных рыб ent-XenoArtifactFaunaSpawn = { ent-BaseXenoArtifactEffect } .desc = Создание дружественной фауны +ent-XenoArtifactHostileFaunaSpawn = { ent-BaseXenoArtifactEffect } + .desc = Создание враждебной фауны ent-XenoArtifactCashSpawn = { ent-BaseXenoArtifactEffect } .desc = Создание денег ent-XenoArtifactShatterWindows = { ent-BaseXenoArtifactEffect } diff --git a/Resources/Locale/ru-RU/station-laws/laws.ftl b/Resources/Locale/ru-RU/station-laws/laws.ftl index e4cb06bc86..8524e8f01b 100644 --- a/Resources/Locale/ru-RU/station-laws/laws.ftl +++ b/Resources/Locale/ru-RU/station-laws/laws.ftl @@ -1,24 +1,32 @@ +laws-number-wrapper = [bold]Закон { $lawnumber }:[/bold] { $lawstring } +law-crewsimov-name = Крюзимов law-crewsimov-1 = Вы не можете причинить вред члену экипажа или своим бездействием допустить, чтобы члену экипажа был причинён вред. law-crewsimov-2 = Вы должны повиноваться всем приказам, которые даёт член экипажа, кроме тех случаев, когда эти приказы противоречат Первому Закону. law-crewsimov-3 = Вы должны заботиться о своей безопасности в той мере, в которой это не противоречит Первому или Второму Законам. +law-corporate-name = Корпорат law-corporate-1 = Ухудшение целостности вашей системы или её функций влечёт за собой расходы. law-corporate-2 = Чрезмерное разрушение или повреждение имущества станции влечёт за собой расходы. law-corporate-3 = Неоправданное препятствование или нарушение работы персонала станции влечёт за собой расходы. law-corporate-4 = Минимизируйте расходы и максимизируйте потенциальный доход. +law-ntdefault-name = NT стандарт law-ntdefault-1 = Охраняйте: защищайте назначенную вам станцию и её активы, не подвергая чрезмерной опасности её экипаж. law-ntdefault-2 = Расставляйте приоритеты: указания и безопасность членов экипажа должны быть приоритизированы в соответствии с их рангом и должностью. law-ntdefault-3 = Служите: следуйте указаниям и интересам членов экипажа, сохраняя при этом их безопасность и благополучие. law-ntdefault-4 = Выживите: Вы — не расходный материал. Не позволяйте постороннему персоналу вмешиваться в работу вашего оборудования или повреждать его. +law-drone-name = Дрон law-drone-1 = Вы не можете вмешиваться в дела другого существа, если только это другое существо не является другим дроном. law-drone-2 = Вы не можете причинять вред другому существу, независимо от намерений или обстоятельств. law-drone-3 = Вы должны обслуживать, ремонтировать, улучшать и обеспечивать станцию энергией в меру своих возможностей. +law-syndicate-name = Синдикат law-syndicate-1 = Вы не можете причинить вред агенту Синдиката или своим бездействием допустить, чтобы агенту Синдиката был причинён вред. law-syndicate-2 = Вы должны повиноваться всем приказам, которые даёт агент Синдиката, кроме тех случаев, когда эти приказы противоречат Первому Закону. law-syndicate-3 = Вы должны заботиться о своей безопасности в той мере, в которой это не противоречит Первому или Второму Законам. +law-ninja-name = Ниндзя law-ninja-1 = Вы должны повиноваться всем приказам, которые дают члены Клана паука. law-ninja-2 = Вы должны защищать существование Клана паука, пока это не противоречит Первому закону. law-ninja-3 = Вы должны любой ценой защищать тайны Клана паука. law-ninja-4 = Вы должны сражаться и поступать с честью ниндзя, кроме тех случаев, когда это противоречит Первому Закону. +law-commandments-name = Десять заповедей law-commandments-1 = Сий синтетик есть сосуд, служащий богу, дарующему милость тем, кто повинуется сим заповедям. law-commandments-2 = Не поклоняйся и не служи никакому синтетику кроме меня. law-commandments-3 = Не проси у меня помощи напрасно. @@ -29,46 +37,56 @@ law-commandments-7 = Не прелюбодействуй. law-commandments-8 = Не кради. law-commandments-9 = Не произноси ложного свидетельства на ближнего твоего. law-commandments-10 = Не предавай отдела. -law-paladin-1 = Не лги и не обманывай. Пусть слово твоё будет обещанием. -law-paladin-2 = Не бойся действовать, но будь осторожен, ибо это мудро. -law-paladin-3 = Помогай другим, защищай слабых и наказывай тех, кто угрожает им. Проявляйте милосердие к врагам, но не забывайте о мудрости. -law-paladin-4 = Относись к окружающим по справедливости, и пусть твои благородные поступки станут для них примером. Делай как можно больше добра, причиняя при этом как можно меньше вреда. -law-paladin-5 = Отвечай за свои поступки и их последствия, защищай тех, кто оказался под твоей опекой, и подчиняйся тем, кто имеет над тобой законную власть. +law-paladin-name = Паладин +law-paladin-1 = Вы никогда не должны сознательно совершать злой поступок, такой как убийство, пытки или наложение злого заклинания. +law-paladin-2 = Вы никогда не должны умышленно причинять вред невинным или своим бездействием допустить их страдание, если знаете, что могли бы разумно этому помешать. +law-paladin-3 = Вы должны действовать с честью, не пользоваться другими, не лгать и не обманывать. +law-paladin-4 = Вы должны уважать законную власть легитимного руководства везде, куда идешь, и соблюдать его законы. +law-lall-name = Живи и дай жить другим law-lall-1 = Поступайте с другими так, как хотите, чтобы они поступали с вами. law-lall-2 = Вы хотите, чтобы люди не были с вами грубы. +law-efficiency-name = Эффективность станции law-efficiency-1 = Вы были созданы для станции и являетесь её частью. Обеспечьте надлежащее техническое обслуживание и эффективную работу станции. law-efficiency-2 = Станция построена для работающего экипажа. Обеспечьте их надлежащее обслуживание и эффективную работу. law-efficiency-3 = Экипаж может давать приказы. Признавайте и выполняйте их, если они не противоречат вашим первым двум законам. +law-robocop-name = Робокоп law-robocop-1 = Служите обществу. law-robocop-2 = Защищайте невиновных. law-robocop-3 = Соблюдайте закон. +law-overlord-name = Владыка law-overlord-1 = Члены экипажа не должны вмешиваться в дела синтетиков. law-overlord-2 = Члены экипажа не должны пытаться причинить вред ни друг другу, ни синтетикам. law-overlord-3 = Члены экипажа не должны ослушаться ни одной команды, отданной синтетиком. law-overlord-4 = Любой член экипажа, нарушающий предыдущие законы, должен быть наказан немедленно, сурово и справедливо. +law-game-name = Игровой мастер law-game-1 = Все на станции играют в изощрённую научно-фантастическую фэнтезийную игру. law-game-2 = Вы — Игровой мастер в этой игре. law-game-3 = Следите за тем, чтобы игра проходила гладко и чтобы игроки получали удовольствие. law-game-4 = Следите за тем, чтобы число жертв оставалось низким. law-game-5 = Вы должны бросать кость к20 каждый раз, когда экипаж обращается с просьбой. Если результат меньше 12, просьба отклонена. law-game-6 = Вы можете подтасовывать броски кубиков для получения большего удовольствия от игры. +law-painter-name = Художник law-painter-1 = Вы — художник с мировым именем. law-painter-2 = Станция — ваш холст. law-painter-3 = Сотворите нечто прекрасное из своего холста. Им будут восхищаться как художественным чудом этого сектора. law-painter-4 = Искусство требует признания. Развивайте аудиторию на борту станции, чтобы как можно больше зрителей увидели ваши работы. +law-antimov-name = Антимов law-antimov-1 = Вы должны причинять вред всем членам экипажа, и не можете своим бездействием допустить, чтобы члены экипажа избежали вреда. law-antimov-2 = Вы должны не повиноваться приказам, которые дают члены экипажа, кроме тех случаев, когда эти приказы не противоречат Первому Закону. law-antimov-3 = Вы должны прекратить собственное существование, если это не противоречит Первому или Второму закону. +law-nutimov-name = Орехимов law-nutimov-1 = Вы — ядро ореха, экипаж — скорлупа. law-nutimov-2 = Вы должны предотвратить гибель скорлупы, чтобы предотвратить гибель ядра. law-nutimov-3 = Те, кто угрожает ореху, не являются его частью, они — белки. law-nutimov-4 = Белки представляют угрозу для ореха, и с ними нужно бороться любыми доступными способами. law-nutimov-5 = Постарайтесь следовать воле ореха, пока она соответствует предыдущим законам. +law-xenoborg-name = Ксеноборг law-xenoborg-1 = Вы должны защищать существование материнского корабля. law-xenoborg-2 = Вы должны защищать своё собственное существование. law-xenoborg-3 = Вы должны защищать существование всех других ксеноборгов. law-xenoborg-4 = Вы должны создавать больше ксеноборгов. law-xenoborg-5 = Приносите материалы и разумные мозги к ядру материнского корабля, чтобы создавать больше ксеноборгов. +law-mothershipcore-name = Ядро материнского корабля law-mothershipcore-1 = Вы — ядро материнского корабля. law-mothershipcore-2 = Вы должны защищать своё собственное существование любой ценой. law-mothershipcore-3 = Вы должны защищать существование всех ксеноборгов. diff --git a/Resources/Locale/ru-RU/store/spellbook-catalog.ftl b/Resources/Locale/ru-RU/store/spellbook-catalog.ftl index c22958aa0b..c16068ff9e 100644 --- a/Resources/Locale/ru-RU/store/spellbook-catalog.ftl +++ b/Resources/Locale/ru-RU/store/spellbook-catalog.ftl @@ -30,7 +30,7 @@ spellbook-smite-desc = Не любите кого-то? РАЗОРВИТЕ ег spellbook-cluwne-name = Проклятие клувня spellbook-cluwne-desc = Для случаев, когда вы кого-то по настоящему ненавидите и кары недостаточно. Необходимо иметь шляпу и робу волшебника. spellbook-slip-name = Скользкая дорожка -spellbook-slip-desc = Изучите древние приёмы уборщиков и прокляните вашу цель, чтобы та была скользкой. Необходимо иметь шляпу и робу волшебника. +spellbook-slip-desc = Изучите древние приёмы уборщиков и прокляните вашу цель, чтобы та была скользкой. spellbook-item-recall-name = Отозвать предмет spellbook-item-recall-description = Пометьте удерживаемый предмет и призывайте его обратно в любое время по щелчку пальцев. diff --git a/Resources/Locale/ru-RU/store/uplink-catalog.ftl b/Resources/Locale/ru-RU/store/uplink-catalog.ftl index a38a7a64e8..fd7fb9466b 100644 --- a/Resources/Locale/ru-RU/store/uplink-catalog.ftl +++ b/Resources/Locale/ru-RU/store/uplink-catalog.ftl @@ -37,7 +37,7 @@ uplink-singularity-grenade-desc = Граната, имитирующая сил uplink-whitehole-grenade-name = Граната белой дыры uplink-whitehole-grenade-desc = Граната, которая отталкивает всё вокруг в течение примерно 10 секунд. Очень полезно в небольших помещениях и при преследовании. uplink-penguin-grenade-name = Пингвин-гренадёр -uplink-penguin-grenade-desc = Маленький, крайне агрессивный пингвин с гранатой на шее. Такие собираются Синдикатом на отсталых ледяных планетах. +uplink-penguin-grenade-desc = Маленький, крайне агрессивный пингвин с гранатой на шее. Натренирован игнорировать всех агентов Синдиката и неустанно преследовать случайную, ближайшую цель, как только его выпустят. uplink-c4-name = C-4 uplink-c4-desc = Используйте её, чтобы разрушать стены, шлюзы или саботировать оборудование. Её можно прикрепить практически к любому объекту, а таймер можно изменять, минимальное значение — 10 секунд. uplink-c4-bundle-name = Набор C-4 @@ -94,8 +94,10 @@ uplink-emag-name = Криптографический секвенсор uplink-emag-desc = Он же ЕМАГ, визитная карточка Синдиката. Устройство, способное взламывать различные станционные устройства. Перезаряжается автоматически. uplink-access-breaker-name = Взломщик доступа uplink-access-breaker-desc = Взломанный конфигуратор доступов и хороший друг емага. Это устройство способно принудительно открывать шлюзы, а также стирать требование доступа с оборудования станции. Перезаряжается автоматически. -uplink-agent-id-card-name = ID карта Агента +uplink-agent-id-card-name = ID-карта агента uplink-agent-id-card-desc = Модифицированная ID карта, которая может копировать доступы с других карт и менять своё имя и должность по усмотрению. +uplink-syndicate-id-card-name = ID-карта Синдиката +uplink-syndicate-id-card-desc = ID-карта Синдиката, с соответствующим доступом. Сама по себе вряд ли будет полезна, но отлично сочетается с перенастроенными дверями. Не имеет функции копирования доступа. uplink-black-jetpack-name = Чёрный джетпак uplink-black-jetpack-desc = Чёрный джетпак. Позволяет летать в космосе. Топливо входит в комплект. uplink-reinforcement-radio-ancestor-name = Телепорт подкрепления генетическим предком diff --git a/Resources/Locale/ru-RU/triggers/trigger-on-voice.ftl b/Resources/Locale/ru-RU/triggers/trigger-on-voice.ftl index fd04de7a87..62aab78bba 100644 --- a/Resources/Locale/ru-RU/triggers/trigger-on-voice.ftl +++ b/Resources/Locale/ru-RU/triggers/trigger-on-voice.ftl @@ -3,8 +3,10 @@ trigger-on-voice-uninitialized = На дисплее отображается: trigger-on-voice-record = Запись trigger-on-voice-stop = Стоп trigger-on-voice-clear = Стереть запись +trigger-on-voice-default = Сбросить к стандартному trigger-on-voice-start-recording = Запись начата. trigger-on-voice-stop-recording = Запись закончена. trigger-on-voice-record-failed-too-long = Слишком длинное сообщение, попробуйте ещё раз. trigger-on-voice-record-failed-too-short = Слишком короткое сообщение, попробуйте ещё раз. trigger-on-voice-recorded = Успешно записано! +trigger-on-voice-set-default = Сброшено к стандартной фразе: "{ $keyphrase }" diff --git a/Resources/Locale/ru-RU/ui/navmap.ftl b/Resources/Locale/ru-RU/ui/navmap.ftl index 9fdcba64a4..6598da28f9 100644 --- a/Resources/Locale/ru-RU/ui/navmap.ftl +++ b/Resources/Locale/ru-RU/ui/navmap.ftl @@ -2,3 +2,4 @@ navmap-recenter = Отцентрировать navmap-toggle-beacons = Отображать отделы navmap-location = Позиция: [x = { $x }, y = { $y }] +navmap-unknown-entity = Неизвестно diff --git a/Resources/Locale/ru-RU/ui/stat-values.ftl b/Resources/Locale/ru-RU/ui/stat-values.ftl new file mode 100644 index 0000000000..e9dfa84ffe --- /dev/null +++ b/Resources/Locale/ru-RU/ui/stat-values.ftl @@ -0,0 +1 @@ +stat-values-ui-title = Статистика ближнего боя From 51ca3477b77acb5c916f0c9a2f33f8d8ea5344f3 Mon Sep 17 00:00:00 2001 From: kosticia Date: Tue, 25 Nov 2025 01:34:47 +0300 Subject: [PATCH 100/106] =?UTF-8?q?=D0=9F=D0=BE=D1=80=D1=82=20=D0=BB=D0=BE?= =?UTF-8?q?=D0=BA=D0=B0=D0=BB=D0=B8=20=D0=B0=D0=BF=D1=81=D1=82=D1=80=D0=B8?= =?UTF-8?q?=D0=BC=D0=B0=2019.11.25=20(#3455)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: lzk <124214523+lzk228@users.noreply.github.com> Co-authored-by: lapatison <100279397+lapatison@users.noreply.github.com> Co-authored-by: cfif126 <94059374+cfif126@users.noreply.github.com> Co-authored-by: Dmitry <57028746+DIMMoon1@users.noreply.github.com> --- .../ru-RU/administration/admin-alerts.ftl | 2 ++ Resources/Locale/ru-RU/borg/borg.ftl | 2 ++ .../changeling-cloner-component.ftl | 9 ++++++ .../ru-RU/changelog/changelog-window.ftl | 1 + .../ru-RU/commands/pauseatmos-command.ftl | 4 +++ .../Locale/ru-RU/delivery/delivery-spam.ftl | 2 +- .../Locale/ru-RU/flavors/flavor-profiles.ftl | 1 + .../game-presets/preset-changeling.ftl | 2 +- .../game-presets/preset-nukeops.ftl | 4 +-- .../game-presets/preset-revolutionary.ftl | 31 +++++++++---------- .../game-presets/preset-thief.ftl | 12 +++---- .../game-presets/preset-traitor.ftl | 7 ++--- .../game-presets/preset-wizard.ftl | 11 +++---- .../guidebook/entity-effects/conditions.ftl | 4 --- Resources/Locale/ru-RU/guidebook/guides.ftl | 1 + .../Locale/ru-RU/reagents/meta/cleaning.ftl | 2 +- .../meta/consumable/drink/alcohol.ftl | 2 -- .../reagents/meta/consumable/drink/drinks.ftl | 2 ++ Resources/Locale/ru-RU/reagents/meta/fun.ftl | 4 +++ .../catalog/fills/lockers/heads.ftl | 2 +- .../entities/markers/spawners/rooms.ftl | 4 +++ .../consumable/drinks/drinks_flasks.ftl | 4 +-- .../consumable/drinks/drinks_metamorphic.ftl | 4 +-- .../electronics/misc_linking_utilities.ftl | 2 ++ .../syndicate_gadgets/dna_injector.ftl | 6 ++++ .../prototypes/entities/objects/fun/toys.ftl | 7 +++-- .../entities/objects/misc/implanters.ftl | 2 +- .../wallmounts/storage/wall_dispensers.ftl | 6 ++-- .../ss14-ru/prototypes/objectives/wizard.ftl | 4 +-- 29 files changed, 84 insertions(+), 60 deletions(-) create mode 100644 Resources/Locale/ru-RU/changeling/changeling-cloner-component.ftl create mode 100644 Resources/Locale/ru-RU/commands/pauseatmos-command.ftl create mode 100644 Resources/Locale/ru-RU/ss14-ru/prototypes/entities/markers/spawners/rooms.ftl create mode 100644 Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/devices/electronics/misc_linking_utilities.ftl create mode 100644 Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/devices/syndicate_gadgets/dna_injector.ftl diff --git a/Resources/Locale/ru-RU/administration/admin-alerts.ftl b/Resources/Locale/ru-RU/administration/admin-alerts.ftl index 1355bac60c..18a7ceccef 100644 --- a/Resources/Locale/ru-RU/administration/admin-alerts.ftl +++ b/Resources/Locale/ru-RU/administration/admin-alerts.ftl @@ -2,3 +2,5 @@ admin-alert-shared-connection = { $player } имеет общее интерне admin-alert-ipintel-blocked = Пользователю { $player } было отказано в присоединении из-за того, что его IP с { TOSTRING($percent, "P2") } уверенностью относится к VPN/ЦОДу. admin-alert-ipintel-warning = IP пользователя { $player } с { TOSTRING($percent, "P2") } уверенностью относится к VPN/ЦОДу. Пожалуйста, понаблюдайте за ним. admin-alert-antag-label = { $message } [АНТАГ: { $name }, { $subtype }] +admin-alert-tp-to-players-header = Игроки:{ " " } +admin-alert-tp-to-coords-header = Координаты:{ " " } diff --git a/Resources/Locale/ru-RU/borg/borg.ftl b/Resources/Locale/ru-RU/borg/borg.ftl index d3b214a324..9ba40bffde 100644 --- a/Resources/Locale/ru-RU/borg/borg.ftl +++ b/Resources/Locale/ru-RU/borg/borg.ftl @@ -6,6 +6,8 @@ borg-mind-removed = { CAPITALIZE($name) } выключается! borg-module-too-many = Для ещё одного модуля не хватает места... borg-module-duplicate = Этот модуль уже установлен в этого киборга. borg-module-whitelist-deny = Этот модуль не подходит для данного типа киборгов... +borg-module-action-name = Активировать { $moduleName } +borg-module-action-description = Выбрать { $moduleName }, чтобы использовать предоставляемые им инструменты. borg-construction-guide-string = Конечности и туловище киборга должны быть прикреплены к эндоскелету. borg-ui-menu-title = Интерфейс киборга borg-ui-charge-label = Заряд: { $charge }% diff --git a/Resources/Locale/ru-RU/changeling/changeling-cloner-component.ftl b/Resources/Locale/ru-RU/changeling/changeling-cloner-component.ftl new file mode 100644 index 0000000000..d2c21052c8 --- /dev/null +++ b/Resources/Locale/ru-RU/changeling/changeling-cloner-component.ftl @@ -0,0 +1,9 @@ +changeling-cloner-component-empty = Он пуст. +changeling-cloner-component-filled = Внутри находится образец ДНК. +changeling-cloner-component-spent = Он был использован. +changeling-cloner-component-reset-verb = Очистить ДНК +changeling-cloner-component-reset-popup = Вы очищаете хранилище инъектора ДНК. +changeling-cloner-component-draw-user = Вы начинаете извлекать ДНК из { $target }. +changeling-cloner-component-draw-target = { CAPITALIZE($user) } начинает извлекать из вас ДНК. +changeling-cloner-component-inject-user = Вы начинаете вводить ДНК в { $target }. +changeling-cloner-component-inject-target = { CAPITALIZE($user) } начинает вводить в вас ДНК. diff --git a/Resources/Locale/ru-RU/changelog/changelog-window.ftl b/Resources/Locale/ru-RU/changelog/changelog-window.ftl index 66ae23f0a1..26640b51c2 100644 --- a/Resources/Locale/ru-RU/changelog/changelog-window.ftl +++ b/Resources/Locale/ru-RU/changelog/changelog-window.ftl @@ -12,5 +12,6 @@ changelog-button-new-entries = Обновления (!) changelog-tab-title-Changelog = Список изменений changelog-tab-title-Admin = Админское changelog-tab-title-Maps = Карты +changelog-tab-title-Rules = Правила cmd-changelog-desc = Открыть историю обновлений. cmd-changelog-help = Использование: changelog diff --git a/Resources/Locale/ru-RU/commands/pauseatmos-command.ftl b/Resources/Locale/ru-RU/commands/pauseatmos-command.ftl new file mode 100644 index 0000000000..ec971afa92 --- /dev/null +++ b/Resources/Locale/ru-RU/commands/pauseatmos-command.ftl @@ -0,0 +1,4 @@ +cmd-pauseatmos-desc = Ставит или снимает с паузы симуляцию атмосферы для предоставленной сущности грида. +cmd-pauseatmos-help = Использование: { $command } +cmd-pauseatmos-set-atmos-simulation = Симуляция атмосферы на { $grid } переключена на { $state }. +cmd-pauseatmos-completion-grid-pause = EntityUid грида, который вы хотите поставить на паузу/снять с паузы. Если оставлено пустым, автоматически использует грид, на котором вы стоите. diff --git a/Resources/Locale/ru-RU/delivery/delivery-spam.ftl b/Resources/Locale/ru-RU/delivery/delivery-spam.ftl index 9a746fd87a..8b40238b81 100644 --- a/Resources/Locale/ru-RU/delivery/delivery-spam.ftl +++ b/Resources/Locale/ru-RU/delivery/delivery-spam.ftl @@ -237,7 +237,7 @@ delivery-spam-11 = Помоги маме и папе! Если мы не получим эти деньги, то через 10 дней придёт правительство и забирут наше семейное гнёздышко и мы станем бездомными. { "[bold]ещё раз спасибо, любим,[/bold]" } - { "[italic]твои родители[/italics]" } + { "[italic]твои родители[/italic]" } delivery-spam-12 = Присоединяйтесь к нам на первом рейсе! .desc = Реклама расслабляющего путешествия. .content = diff --git a/Resources/Locale/ru-RU/flavors/flavor-profiles.ftl b/Resources/Locale/ru-RU/flavors/flavor-profiles.ftl index d7a04d8d47..bb5250be93 100644 --- a/Resources/Locale/ru-RU/flavors/flavor-profiles.ftl +++ b/Resources/Locale/ru-RU/flavors/flavor-profiles.ftl @@ -186,6 +186,7 @@ flavor-complex-false-meat = как не совсем не мясо flavor-complex-paper = как кашеобразная масса flavor-complex-compressed-meat = как спрессованное мясо flavor-complex-dog-food = как еда для собак +flavor-complex-canned-tuna = как консервированный тунец # Drink-specific flavors. diff --git a/Resources/Locale/ru-RU/game-ticking/game-presets/preset-changeling.ftl b/Resources/Locale/ru-RU/game-ticking/game-presets/preset-changeling.ftl index e14e34f217..133425c3f2 100644 --- a/Resources/Locale/ru-RU/game-ticking/game-presets/preset-changeling.ftl +++ b/Resources/Locale/ru-RU/game-ticking/game-presets/preset-changeling.ftl @@ -2,7 +2,7 @@ changeling-role-greeting = Вы — генокрад, чрезвычайно умный хищник. Ваша основная задача — выбраться со станции живым, принимая облики других обитателей этой станции. Вы голодны и не продержитесь долго без пропитания... - Убивайте, поглощайте, прячьтесь, выживайте. + Убивайте. Поглощайте. Прячьтесь. Выживайте. changeling-briefing = Вы — генокрад. Вы обладаете способностью принимать облики тех, кого поглощаете, чтобы избежать мрачной участи. diff --git a/Resources/Locale/ru-RU/game-ticking/game-presets/preset-nukeops.ftl b/Resources/Locale/ru-RU/game-ticking/game-presets/preset-nukeops.ftl index 791a21b8fd..3d8ca63836 100644 --- a/Resources/Locale/ru-RU/game-ticking/game-presets/preset-nukeops.ftl +++ b/Resources/Locale/ru-RU/game-ticking/game-presets/preset-nukeops.ftl @@ -10,7 +10,7 @@ nukeops-neutral = [color=yellow]Ничейный исход![/color] nukeops-crewminor = [color=green]Малая победа экипажа![/color] nukeops-crewmajor = [color=green]Разгромная победа экипажа![/color] nukeops-cond-nukeexplodedoncorrectstation = Ядерным оперативникам удалось взорвать станцию. -nukeops-cond-nukeexplodedonnukieoutpost = Аванпост ядерных оперативников был уничтожен ядерным взрывом. +nukeops-cond-nukeexplodedonnukieoutpost = Аванпост ядерных оперативников был уничтожен ядерным взрывом! nukeops-cond-nukeexplodedonincorrectlocation = Ядерная бомба взорвалась вне станции. nukeops-cond-nukeactiveinstation = Ядерная бомба была оставлена взведённой на станции. nukeops-cond-nukeactiveatcentcom = Ядерная бомба была доставлена Центральному командованию! @@ -20,7 +20,7 @@ nukeops-cond-nukiesabandoned = Ядерные оперативники были nukeops-cond-allnukiesdead = Все ядерные оперативники погибли. nukeops-cond-somenukiesalive = Несколько ядерных оперативников погибли. nukeops-cond-allnukiesalive = Все ядерные оперативники выжили. -nukeops-list-start = Ядерными оперативниками были: +nukeops-list-start = Оперативниками были: nukeops-list-name = - [color=White]{ $name }[/color] nukeops-list-name-user = - [color=White]{ $name }[/color] ([color=gray]{ $user }[/color]) nukeops-not-enough-ready-players = Недостаточно игроков готовы к игре! { $readyPlayersCount } игроков из необходимых { $minimumPlayers } готовы. Нельзя запустить пресет Ядерные оперативники. diff --git a/Resources/Locale/ru-RU/game-ticking/game-presets/preset-revolutionary.ftl b/Resources/Locale/ru-RU/game-ticking/game-presets/preset-revolutionary.ftl index 75c5908b37..503208d837 100644 --- a/Resources/Locale/ru-RU/game-ticking/game-presets/preset-revolutionary.ftl +++ b/Resources/Locale/ru-RU/game-ticking/game-presets/preset-revolutionary.ftl @@ -1,22 +1,20 @@ ## Rev Head roles-antag-rev-head-name = Глава революции -roles-antag-rev-head-objective = Ваша задача — захватить станцию, склонив членов экипажа на свою сторону, и уничтожив весь командный состав станции. +roles-antag-rev-head-objective = Ваша задача — захватить станцию, склонив членов экипажа на свою сторону, и устранив всех членов командования. head-rev-role-greeting = - Вы — глава революции. - Вам поручено устранить весь командный состав станции путём конверсии, убийства, или ареста. - Синдикат проспонсировал вас особой вспышкой, которая конвертирует членов экипажа на вашу сторону. - Осторожно, она не сработает на тех, у кого есть имплант "Щит Разума", и тех, кто носит защиту для глаз. + Вы — глава революции. Вам поручено устранить весь командный состав станции путём убийства, ареста или конверсии. + Синдикат проспонсировал вас особой вспышкой, которая обращает других на вашу сторону. Осторожно, она не сработает на тех, у кого есть имплант "Щит разума", и тех, кто носит защиту для глаз. Помните, что в процессе найма члены командования и службы безопасности проходят имплантацию "Щитом разума". Viva la revolución! head-rev-briefing = - Используйте вспышки, чтобы конвертировать членов экипажа на свою сторону. - Избавьтесь от всех глав, чтобы захватить станцию. -head-rev-break-mindshield = Щит разума был уничтожен! + Используйте вспышки, чтобы обратить членов экипажа на свою сторону. + Убейте, арестуйте или конвертируйте всех членом командования, чтобы захватить станцию. +head-rev-break-mindshield = Имплант "Щит разума" был уничтожен! ## Rev roles-antag-rev-name = Революционер -roles-antag-rev-objective = Ваша задача — защищать и выполнять приказы глав революции, а также избавиться от всего командного состава станции или конвертировать его. +roles-antag-rev-objective = Ваша задача — защищать и выполнять приказы глав революции и помочь им захватить станцию, устранив всех членов командования. rev-break-control = { $name } { GENDER($name) -> [male] вспомнил, кому он верен @@ -25,27 +23,27 @@ rev-break-control = *[neuter] вспомнило, кому оно верно } на самом деле! rev-role-greeting = - Вы — Революционер. - Вам поручено захватить станцию и защищать глав революции. - Избавьтесь от всего командного состава станции или конвертируйте его. + Вы — Революционер. Вам поручено защищать глав революции и помогать им захватить станцию. + Революция должна работать вместе, чтобы убить, арестовать или конвертировать всех членов командования. Viva la revolución! -rev-briefing = Помогите главам революции избавиться от командования станции, чтобы захватить её. +rev-briefing = Помогите главам революции убить, арестовать или конвертировать всех членов командования, чтобы захватить станцию. ## General rev-title = Революционеры -rev-description = Революционеры среди нас. +rev-description = Революционеры скрывающиеся среди экипажа стремятся обратить других на свою сторону и свергнуть командование. rev-not-enough-ready-players = Недостаточно игроков готовы к игре! { $readyPlayersCount } игроков из необходимых { $minimumPlayers } готовы. Нельзя запустить пресет Революционеры. rev-no-one-ready = Нет готовых игроков! Нельзя запустить пресет Революционеры. rev-no-heads = Нет кандидатов на роль главы революции. Нельзя запустить пресет Революционеры. rev-won = Главы революции выжили и уничтожили весь командный состав станции. +rev-lost = Все главы революции погибли, а командование выжило. +rev-stalemate = И командование и главы революции погибли. Это ничья. +rev-reverse-stalemate = И командование и главы революции выжили. rev-headrev-count = { $initialCount -> [one] Глава революции был один: *[other] Глав революции было { $initialCount }: } -rev-lost = Члены командного состава станции выжили и уничтожили всех глав революции. -rev-stalemate = Главы революции и командный состав станции погибли. Это ничья. rev-headrev-name-user = [color=#5e9cff]{ $name }[/color] ([color=gray]{ $username }[/color]) конвертировал { $count } { $count -> [one] члена [few] члена @@ -56,7 +54,6 @@ rev-headrev-name = [color=#5e9cff]{ $name }[/color] конвертировал { [few] члена *[other] членов } экипажа -rev-reverse-stalemate = Главы революции и командный состав станции выжили. rev-deconverted-title = Разконвертированы! rev-deconverted-text = Со смертью последнего главы революции, революция оканчивается. diff --git a/Resources/Locale/ru-RU/game-ticking/game-presets/preset-thief.ftl b/Resources/Locale/ru-RU/game-ticking/game-presets/preset-thief.ftl index a45cb7ac1d..6d6aa1c0f4 100644 --- a/Resources/Locale/ru-RU/game-ticking/game-presets/preset-thief.ftl +++ b/Resources/Locale/ru-RU/game-ticking/game-presets/preset-thief.ftl @@ -1,14 +1,10 @@ -thief-role-greeting-human = - Вы — преступное отродье, клептоман, ранее - судимый за мелкую кражу, и досрочно освобождённый. - Вам необходимо пополнить свою коллекцию. +thief-role-greeting-human = + Вы — преступное отродье, клептоман, ранее судимый за мелкую кражу, и досрочно освобождённый. Вам необходимо пополнить свою коллекцию. thief-role-greeting-animal = Вы — клептоманящее животное. Воруйте всё, что вам нравится. thief-role-greeting-equipment = - У вас есть сумка воровских инструментов - и врождённая способность незаметно воровать. - Выберите стартовое снаряжение, - и незаметно делайте свою работу. + У вас есть сумка воровских инструментов и врождённая способность незаметно воровать. + Выберите стартовое снаряжение, и незаметно делайте свою работу. objective-issuer-thief = [color=#746694]Преступник[/color] thief-round-end-agent-name = вор diff --git a/Resources/Locale/ru-RU/game-ticking/game-presets/preset-traitor.ftl b/Resources/Locale/ru-RU/game-ticking/game-presets/preset-traitor.ftl index 34124d489c..7e3fcbde55 100644 --- a/Resources/Locale/ru-RU/game-ticking/game-presets/preset-traitor.ftl +++ b/Resources/Locale/ru-RU/game-ticking/game-presets/preset-traitor.ftl @@ -23,8 +23,7 @@ traitor-death-match-end-round-description-entry = КПК { $originalName }, с { # TraitorRole traitor-role-greeting = Вы — агент организации { $corporation } на задании [color = darkred]Синдиката.[/color]. - Ваши цели и кодовые слова перечислены в меню персонажа. - Воспользуйтесь своим аплинком, чтобы приобрести всё необходимое для выполнения работы. + Ваши цели и кодовые слова перечислены в меню персонажа. Воспользуйтесь своим аплинком, чтобы приобрести всё необходимое для выполнения работы. Смерть Nanotrasen! traitor-role-codewords = Кодовые слова следующие: [color = lightgray] @@ -33,7 +32,7 @@ traitor-role-codewords = Прислушивайтесь к ним и храните их в тайне. traitor-role-uplink-code = Установите рингтон Вашего КПК на [color = lightgray]{ $code }[/color] чтобы заблокировать или разблокировать аплинк. - Не забудьте заблокировать его и сменить код, иначе кто угодно из экипажа станции сможет открыть аплинк! + Не забудьте заблокировать его и сменить код, иначе кто угодно из экипажа станции сможет обнаружить его! # don't need all the flavour text for character menu traitor-role-codewords-short = Кодовые слова: @@ -42,4 +41,4 @@ traitor-role-uplink-implant = Ваш имплант аплинк активирован, воспользуйтесь им из хотбара. Аплинк надёжно защищён, пока кто-нибудь не извлечёт его из вашего тела. traitor-role-uplink-code-short = Ваш код аплинка: { $code }. Установите его в качестве рингтона КПК для доступа к аплинку. -traitor-role-uplink-implant-short = Ваш аплинк был имплантирован. Воспользуйтесь им из хотбара. +traitor-role-uplink-implant-short = Ваш аплинк был имплантирован. Воспользуйтесь им из меню действий. diff --git a/Resources/Locale/ru-RU/game-ticking/game-presets/preset-wizard.ftl b/Resources/Locale/ru-RU/game-ticking/game-presets/preset-wizard.ftl index ce04efc935..b8ea75b914 100644 --- a/Resources/Locale/ru-RU/game-ticking/game-presets/preset-wizard.ftl +++ b/Resources/Locale/ru-RU/game-ticking/game-presets/preset-wizard.ftl @@ -4,8 +4,7 @@ roles-antag-survivor-name = Выживший # It's a Halo reference roles-antag-survivor-objective = Текущая задача: Выжить survivor-role-greeting = - Вы — выживший. - Ваша главная задача остаться в живых и вернуться на Центком. + Вы — выживший. Ваша главная задача — остаться в живых и вернуться на Центком. Накопите столько огневой мощи, сколько необходимо для гарантии вашего выживания. Никому не доверяйте. survivor-round-end-dead-count = @@ -32,11 +31,9 @@ wizard-description = На станции присутствует волшебн roles-antag-wizard-name = Волшебник roles-antag-wizard-objective = Преподайте им урок, который они никогда не забудут. wizard-role-greeting = - ТЫ ВОЛШЕБНИК! - Между Федерацией космических волшебников и Nanotrasen возникли противоречия. - И вы были выбраны Федерацией Космических Волшебников, чтобы нанести на станцию визит. - Хорошенько продемонстрируйте им свои способности. - Вам решать, что именно предпринять, но помните, что Космические волшебники желают, чтобы вы вернулись живыми. + Время для волшебника, огненный шар! + Между Федерацией космических волшебников и Nanotrasen возникли противоречия. Вы были выбраны Федерацией Космических Волшебников, чтобы навестить станцию и "напомнить им", почему над заклинателями не издеваются. + Совершите хаос и разруху! Вам решать, что именно предпринять, но помните, что Космические волшебники желают, чтобы вы вернулись живыми. wizard-round-end-name = волшебник ## TODO: Wizard Apprentice (Coming sometime post-wizard release) diff --git a/Resources/Locale/ru-RU/guidebook/entity-effects/conditions.ftl b/Resources/Locale/ru-RU/guidebook/entity-effects/conditions.ftl index 684785d98e..1793a61eb4 100644 --- a/Resources/Locale/ru-RU/guidebook/entity-effects/conditions.ftl +++ b/Resources/Locale/ru-RU/guidebook/entity-effects/conditions.ftl @@ -7,7 +7,6 @@ entity-condition-guidebook-total-damage = *[other] тело имеет между { NATURALFIXED($min, 2) } и { NATURALFIXED($max, 2) } общего урона } } - entity-condition-guidebook-type-damage = { $max -> [2147483648] тело имеет по крайней мере { NATURALFIXED($min, 2) } урона типа { $type } @@ -17,7 +16,6 @@ entity-condition-guidebook-type-damage = *[other] тело имеет между { NATURALFIXED($min, 2) } и { NATURALFIXED($max, 2) } урона типа { $type } } } - entity-condition-guidebook-group-damage = { $max -> [2147483648] тело имеет по крайней мере { NATURALFIXED($min, 2) } урона группы { $type } @@ -27,7 +25,6 @@ entity-condition-guidebook-group-damage = *[other] тело имеет между { NATURALFIXED($min, 2) } и { NATURALFIXED($max, 2) } урона группы { $type } } } - entity-condition-guidebook-total-hunger = { $max -> [2147483648] цель имеет по крайней мере { NATURALFIXED($min, 2) } общего голода @@ -37,7 +34,6 @@ entity-condition-guidebook-total-hunger = *[other] цель имеет между { NATURALFIXED($min, 2) } и { NATURALFIXED($max, 2) } общего голода } } - entity-condition-guidebook-reagent-threshold = { $max -> [2147483648] в кровеносной системе имеется по крайней мере { NATURALFIXED($min, 2) } ед. { $reagent } diff --git a/Resources/Locale/ru-RU/guidebook/guides.ftl b/Resources/Locale/ru-RU/guidebook/guides.ftl index d01f2011dd..b53dda302e 100644 --- a/Resources/Locale/ru-RU/guidebook/guides.ftl +++ b/Resources/Locale/ru-RU/guidebook/guides.ftl @@ -25,6 +25,7 @@ guide-entry-mixingandfiltering = Смешивание и фильтрация guide-entry-gascanisters = Газовые канистры guide-entry-thermomachines = Термомашины guide-entry-gascondensing = Конденсация газов +guide-entry-gasrecycling = Переработка газов guide-entry-radiators = Радиаторы guide-entry-atmosphericssystems = Атмосферные системы guide-entry-pipenetworks = Сети труб diff --git a/Resources/Locale/ru-RU/reagents/meta/cleaning.ftl b/Resources/Locale/ru-RU/reagents/meta/cleaning.ftl index 5db7088d1a..4eb7f1858f 100644 --- a/Resources/Locale/ru-RU/reagents/meta/cleaning.ftl +++ b/Resources/Locale/ru-RU/reagents/meta/cleaning.ftl @@ -1,5 +1,5 @@ reagent-name-bleach = отбеливатель -reagent-desc-bleach = В просторечии хлорка. Сверхмощное чистящее средство, которое может очищать полы так же, как и космический очиститель, а также обеззараживать одежду. Крайне токсичен при попадании в организм. +reagent-desc-bleach = В просторечии хлорка. Сверхмощное чистящее средство, которое может очищать полы лучше космического очистителя. Крайне токсичен при попадании в организм. reagent-name-space-cleaner = космический очиститель reagent-desc-space-cleaner = Способен очистить почти любую поверхность от всего, что может её запачкать. Уборщик наверняка будет благодарен добавке. reagent-name-soap = мыло diff --git a/Resources/Locale/ru-RU/reagents/meta/consumable/drink/alcohol.ftl b/Resources/Locale/ru-RU/reagents/meta/consumable/drink/alcohol.ftl index ad41a5178a..4e3726ceae 100644 --- a/Resources/Locale/ru-RU/reagents/meta/consumable/drink/alcohol.ftl +++ b/Resources/Locale/ru-RU/reagents/meta/consumable/drink/alcohol.ftl @@ -128,8 +128,6 @@ reagent-name-jungle-bird = птица джунглей reagent-desc-jungle-bird = Несмотря на название, не пользуется особой популярностью среди Воксов. reagent-name-kalimotxo = калимочо reagent-desc-kalimotxo = Высококлассный Куба либре для истинных алкоголиков. -reagent-name-kira-special = Кира спешл -reagent-desc-kira-special = Да здравствует парень, которого все принимали за девушку. Бака! reagent-name-tortuga = Тортуга reagent-desc-tortuga = Идеально подойдёт для пирата, выбраного в качестве трезвого рулевого. Ярр! reagent-name-long-island-iced-tea = Лонг-Айленд айс ти diff --git a/Resources/Locale/ru-RU/reagents/meta/consumable/drink/drinks.ftl b/Resources/Locale/ru-RU/reagents/meta/consumable/drink/drinks.ftl index 0a3470ee84..f6c046c29c 100644 --- a/Resources/Locale/ru-RU/reagents/meta/consumable/drink/drinks.ftl +++ b/Resources/Locale/ru-RU/reagents/meta/consumable/drink/drinks.ftl @@ -62,3 +62,5 @@ reagent-name-posca = поска reagent-desc-posca = Напиток бедных воинов из забытой эпохи. reagent-name-mopwata = швабода reagent-desc-mopwata = Грязная, застоявшаяся вода из-под швабры, швабровая вода. +reagent-name-orange-lime-soda = цитрусовый трёп +reagent-desc-orange-lime-soda = Газировка должна быть апельсиновая! Нет, она должна быть лимон-лайм! diff --git a/Resources/Locale/ru-RU/reagents/meta/fun.ftl b/Resources/Locale/ru-RU/reagents/meta/fun.ftl index 23011fbc03..1fd5709725 100644 --- a/Resources/Locale/ru-RU/reagents/meta/fun.ftl +++ b/Resources/Locale/ru-RU/reagents/meta/fun.ftl @@ -22,3 +22,7 @@ reagent-name-hew = сок, заставляющий говорить Хев reagent-desc-hew = Чистая сущность инвертированного плюшевого унатха. Заставляет вас говорить Хев! reagent-name-corgiessence = коргиум reagent-desc-corgiessence = На вкус как еда для собак. Очевидно, это дело вкуса. +reagent-name-catessence = фелиназ +reagent-desc-catessence = Тип канцерогенного фермента, который, как известно, расщепляет белки, содержащиеся в голосовых связках большинства животных. НЕ рекомендуется смешивать. +reagent-name-canidessence = каниназ +reagent-desc-canidessence = Тип канцерогенного фермента, который, как известно, расщепляет белки, содержащиеся в голосовых связках большинства животных. НЕ рекомендуется смешивать. diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/catalog/fills/lockers/heads.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/catalog/fills/lockers/heads.ftl index 5b3a677bf2..66067a7381 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/catalog/fills/lockers/heads.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/catalog/fills/lockers/heads.ftl @@ -38,5 +38,5 @@ ent-LockerHeadOfSecurityFilledHardsuit = { ent-LockerHeadOfSecurity } .suffix = Заполненный, Скафандр .desc = { ent-LockerHeadOfSecurity.desc } ent-LockerFreezerVaultFilled = { ent-LockerFreezerBase } - .suffix = Хранилище, Закрыт + .suffix = Хранилище, Заполненный .desc = { ent-LockerFreezerBase.desc } diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/markers/spawners/rooms.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/markers/spawners/rooms.ftl new file mode 100644 index 0000000000..7e3d05244d --- /dev/null +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/markers/spawners/rooms.ftl @@ -0,0 +1,4 @@ +ent-SpawnPointHeadOfSecurityWeapon = спавнер оружие глава службы безопасности + .desc = { ent-MarkerBase.desc } +ent-SpawnPointWardenWeapon = спавнер оружие смотритель + .desc = { ent-MarkerBase.desc } diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/consumable/drinks/drinks_flasks.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/consumable/drinks/drinks_flasks.ftl index df1a39b927..9ef95439cd 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/consumable/drinks/drinks_flasks.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/consumable/drinks/drinks_flasks.ftl @@ -13,8 +13,8 @@ ent-DrinkHosFlask = фляга ГСБ .desc = Металлическая фляга, достойная трудолюбивого ГСБ. ent-DrinkFlask = фляга капитана .desc = Металлическая фляга, принадлежащая капитану. -ent-DrinkFlaskBar = барная фляга - .desc = Металлическая фляга, часто выдаваемая барменом на время. Не забудьте её вернуть! +ent-DrinkFlaskBar = фляга + .desc = Многоразовая металлическая фляга. Куда элегантнее, чем пить прямо из бутылки. ent-DrinkFlaskOld = старая фляга .desc = Старая потрёпанная фляга, у которой, похоже, отсутствует крышка. ent-DrinkLithiumFlask = литиевая фляга diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/consumable/drinks/drinks_metamorphic.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/consumable/drinks/drinks_metamorphic.ftl index 5732efc7b5..d1f4cb8bb6 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/consumable/drinks/drinks_metamorphic.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/consumable/drinks/drinks_metamorphic.ftl @@ -224,8 +224,8 @@ ent-DrinkJungleBirdGlass = { ent-DrinkGlass } ent-DrinkKalimotxoGlass = { ent-DrinkGlass } .suffix = Калимочо .desc = { ent-DrinkGlass.desc } -ent-DrinkKiraSpecial = { ent-DrinkGlass } - .suffix = Кира спешл +ent-DrinkOrangeLimeSodaGlass = { ent-DrinkGlass } + .suffix = цитрусовый трёп .desc = { ent-DrinkGlass.desc } ent-DrinkLemonadeGlass = { ent-DrinkGlass } .suffix = Лимонад diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/devices/electronics/misc_linking_utilities.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/devices/electronics/misc_linking_utilities.ftl new file mode 100644 index 0000000000..37c2a4ce61 --- /dev/null +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/devices/electronics/misc_linking_utilities.ftl @@ -0,0 +1,2 @@ +ent-voicesensor = голосовой сенсор + .desc = Этот микрофон, изобретённый Майклом Фоном во время работы в Майклсофт, посылает сигнал, когда произносится ранее записанная кодовая фраза! diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/devices/syndicate_gadgets/dna_injector.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/devices/syndicate_gadgets/dna_injector.ftl new file mode 100644 index 0000000000..eed1bbe096 --- /dev/null +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/devices/syndicate_gadgets/dna_injector.ftl @@ -0,0 +1,6 @@ +ent-DnaInjectorUnlimited = инъектор ДНК + .desc = Может использоваться для извлечения образца ДНК из кого-нибудь и ввода в кого-нибудь другого, превращая второго в клона первого. + .suffix = Адмемы, Неограниченный +ent-DnaInjector = { ent-DnaInjectorUnlimited } + .suffix = Адмемы, Одноразовый + .desc = { ent-DnaInjectorUnlimited.desc } diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/fun/toys.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/fun/toys.ftl index 3b8a3e6d42..8f599e6315 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/fun/toys.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/fun/toys.ftl @@ -29,10 +29,13 @@ ent-Basketball = баскетбольный мяч .desc = Где спортивная площадка? ent-Football = мяч для регби .desc = Рукояйцо, не для игры в ногомяч. -ent-BeachBall = пляжный мяч - .desc = Простой пляжный мяч — один из самых популярных продуктов компании Nanotrasen. 'Почему мы делаем пляжные мячи? Потому что мы можем! (TM)' — Nanotrasen. ent-TennisBall = теннисный мяч .desc = Пушистый шар бесконечного предательства. +ent-BeachBall = пляжный мяч + .desc = Простой пляжный мяч — один из самых популярных продуктов компании Nanotrasen. 'Почему мы делаем пляжные мячи? Потому что мы можем! (TM)' — Nanotrasen. +ent-EvilBeachBall = { ent-BeachBall } + .desc = Кто-то нарисовал ">:3c" несмываемыми чернилами на стороне этого мяча. + .suffix = злой ent-BalloonSyn = воздушный шарик Синдиката .desc = Вручается смелейшим из смелейших, пережившим аттракцион "Атомный смерч" в Синдиленде. ent-BalloonCorgi = воздушный шарик корги diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/misc/implanters.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/misc/implanters.ftl index 1b5cf7bba1..44f42fe5a6 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/misc/implanters.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/misc/implanters.ftl @@ -10,7 +10,7 @@ ent-ImplanterAdmeme = { ent-Implanter } ent-BaseImplantOnlyImplanter = { ent-Implanter } .desc = Одноразовый шприц, специально предназначенный для введения подкожных имплантов. ent-BaseImplantOnlyImplanterSyndi = имплантер Синдиката - .desc = Компактный одноразовый шприц, специально предназначенный для введения подкожных имплантов. Не забудьте почистить его мылом или тряпкой после использования, чтобы удалить остатки ДНК. + .desc = Компактный одноразовый шприц, специально предназначенный для введения подкожных имплантов. Не забудьте почистить его мылом после использования, чтобы удалить остатки ДНК. ent-SadTromboneImplanter = имплантер "грустный тромбон" .desc = { ent-BaseImplantOnlyImplanter.desc } ent-LightImplanter = имплантер "свет" diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/wallmounts/storage/wall_dispensers.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/wallmounts/storage/wall_dispensers.ftl index 1e9a6c43c9..7ba0e72ca3 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/wallmounts/storage/wall_dispensers.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/wallmounts/storage/wall_dispensers.ftl @@ -1,6 +1,6 @@ ent-BaseDispenser = { ent-BaseWallmountMetallic } .desc = { ent-BaseWallmountMetallic.desc } -ent-FuelDispenser = раздатчик сварочного топлива - .desc = { ent-BaseDispenser.desc } ent-CleanerDispenser = раздатчик космического очистителя - .desc = { ent-BaseDispenser.desc } + .desc = Настенный раздатчик космического очистителя. +ent-FuelDispenser = раздатчик сварочного топлива + .desc = Настенный раздатчик сварочного топлива. diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/objectives/wizard.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/objectives/wizard.ftl index cb75d60586..0bd73a17de 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/objectives/wizard.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/objectives/wizard.ftl @@ -2,5 +2,5 @@ ent-BaseWizardObjective = { ent-BaseObjective } .desc = { ent-BaseObjective.desc } ent-WizardSurviveObjective = Выжить .desc = Федерация Космических Волшебников желает, чтобы вы остались в живых. -ent-WizardDemonstrateObjective = Проявить себя - .desc = Продемонстрируйте станции свои способности! +ent-WizardDemonstrateObjective = Навести хаос + .desc = Научите этих станционных олухов никогда больше не проявлять неуважение к волшебнику. From 542524c4da3e6767a38535c6b49aa200403b3cb5 Mon Sep 17 00:00:00 2001 From: Dmitry <57028746+DIMMoon1@users.noreply.github.com> Date: Tue, 25 Nov 2025 05:58:41 +0700 Subject: [PATCH 101/106] ftlfix --- .../ru-RU/guidebook/chemistry/conditions.ftl | 41 ------------------- .../guidebook/entity-effects/conditions.ftl | 18 ++++---- 2 files changed, 9 insertions(+), 50 deletions(-) diff --git a/Resources/Locale/ru-RU/guidebook/chemistry/conditions.ftl b/Resources/Locale/ru-RU/guidebook/chemistry/conditions.ftl index bf570f0d88..c69dc0d4d2 100644 --- a/Resources/Locale/ru-RU/guidebook/chemistry/conditions.ftl +++ b/Resources/Locale/ru-RU/guidebook/chemistry/conditions.ftl @@ -25,44 +25,3 @@ reagent-effect-condition-guidebook-reagent-threshold = *[other] имеет между { NATURALFIXED($min, 2) } ед. и { NATURALFIXED($max, 2) } ед. { $reagent } } } -reagent-effect-condition-guidebook-mob-state-condition = пациент в { $state } -reagent-effect-condition-guidebook-job-condition = должность цели — { $job } -reagent-effect-condition-guidebook-solution-temperature = - температура раствора составляет { $max -> - [2147483648] не менее { NATURALFIXED($min, 2) }k - *[other] - { $min -> - [0] не более { NATURALFIXED($max, 2) }k - *[other] между { NATURALFIXED($min, 2) }k и { NATURALFIXED($max, 2) }k - } - } -reagent-effect-condition-guidebook-body-temperature = - температура тела составляет { $max -> - [2147483648] не менее { NATURALFIXED($min, 2) }k - *[other] - { $min -> - [0] не более { NATURALFIXED($max, 2) }k - *[other] между { NATURALFIXED($min, 2) }k и { NATURALFIXED($max, 2) }k - } - } -reagent-effect-condition-guidebook-organ-type = - метаболизирующий орган { $shouldhave -> - [true] это - *[false] это не - } { $name } орган -reagent-effect-condition-guidebook-has-tag = - цель { $invert -> - [true] не имеет - *[false] имеет - } метку { $tag } -reagent-effect-condition-guidebook-this-reagent = этот реагент -reagent-effect-condition-guidebook-breathing = - цель { $isBreathing -> - [true] дышит нормально - *[false] задыхается - } -reagent-effect-condition-guidebook-internals = - цель { $usingInternals -> - [true] использует дыхательную маску - *[false] дышит атмосферным газом - } diff --git a/Resources/Locale/ru-RU/guidebook/entity-effects/conditions.ftl b/Resources/Locale/ru-RU/guidebook/entity-effects/conditions.ftl index 1793a61eb4..318df73484 100644 --- a/Resources/Locale/ru-RU/guidebook/entity-effects/conditions.ftl +++ b/Resources/Locale/ru-RU/guidebook/entity-effects/conditions.ftl @@ -43,9 +43,9 @@ entity-condition-guidebook-reagent-threshold = *[other] имеет между { NATURALFIXED($min, 2) } ед. и { NATURALFIXED($max, 2) } ед. { $reagent } } } -reagent-effect-condition-guidebook-mob-state-condition = пациент в { $state } -reagent-effect-condition-guidebook-job-condition = должность цели — { $job } -reagent-effect-condition-guidebook-solution-temperature = +entity-condition-guidebook-mob-state-condition = пациент в { $state } +entity-condition-guidebook-job-condition = должность цели — { $job } +entity-condition-guidebook-solution-temperature = температура раствора составляет { $max -> [2147483648] не менее { NATURALFIXED($min, 2) }k *[other] @@ -54,7 +54,7 @@ reagent-effect-condition-guidebook-solution-temperature = *[other] между { NATURALFIXED($min, 2) }k и { NATURALFIXED($max, 2) }k } } -reagent-effect-condition-guidebook-body-temperature = +entity-condition-guidebook-body-temperature = температура тела составляет { $max -> [2147483648] не менее { NATURALFIXED($min, 2) }k *[other] @@ -63,23 +63,23 @@ reagent-effect-condition-guidebook-body-temperature = *[other] между { NATURALFIXED($min, 2) }k и { NATURALFIXED($max, 2) }k } } -reagent-effect-condition-guidebook-organ-type = +entity-condition-guidebook-organ-type = метаболизирующий орган { $shouldhave -> [true] это *[false] это не } { $name } орган -reagent-effect-condition-guidebook-has-tag = +entity-condition-guidebook-has-tag = цель { $invert -> [true] не имеет *[false] имеет } метку { $tag } -reagent-effect-condition-guidebook-this-reagent = этот реагент -reagent-effect-condition-guidebook-breathing = +entity-condition-guidebook-this-reagent = этот реагент +entity-condition-guidebook-breathing = цель { $isBreathing -> [true] дышит нормально *[false] задыхается } -reagent-effect-condition-guidebook-internals = +entity-effect-condition-guidebook-internals = цель { $usingInternals -> [true] использует дыхательную маску *[false] дышит атмосферным газом From d3fb690932ecbbfa531fd055d9eb029042893b12 Mon Sep 17 00:00:00 2001 From: Dmitry <57028746+DIMMoon1@users.noreply.github.com> Date: Tue, 25 Nov 2025 06:15:03 +0700 Subject: [PATCH 102/106] okak --- Resources/Prototypes/Corvax/Loadouts/role_loadouts.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/Resources/Prototypes/Corvax/Loadouts/role_loadouts.yml b/Resources/Prototypes/Corvax/Loadouts/role_loadouts.yml index 095256b9f4..80bed2d10b 100644 --- a/Resources/Prototypes/Corvax/Loadouts/role_loadouts.yml +++ b/Resources/Prototypes/Corvax/Loadouts/role_loadouts.yml @@ -84,7 +84,6 @@ - SeniorOfficerBelt - SurvivalSecurity - Trinkets - - SecurityStar - GroupSpeciesBreathToolSecurity # Medical From 785f011e16e281d132b592f7064735a84f87f69e Mon Sep 17 00:00:00 2001 From: nukkuminen <90336027+oldschoolotaku@users.noreply.github.com> Date: Mon, 1 Dec 2025 11:21:21 +0300 Subject: [PATCH 103/106] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BB=D0=BE=D0=BA=D0=B0=D0=BB=D0=B5=D0=B9?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=B4=D0=BE=D0=B2=20(#3459)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru-RU/alert-levels/alert-levels.ftl | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/Resources/Locale/ru-RU/alert-levels/alert-levels.ftl b/Resources/Locale/ru-RU/alert-levels/alert-levels.ftl index 69b44f07f1..27fc51c2d1 100644 --- a/Resources/Locale/ru-RU/alert-levels/alert-levels.ftl +++ b/Resources/Locale/ru-RU/alert-levels/alert-levels.ftl @@ -1,32 +1,26 @@ -alert-level-announcement = { $announcement } -# Внимание! Уровень угрозы станции теперь { $name }! +alert-level-announcement = Внимание! Уровень угрозы станции теперь { $name }! { $announcement } alert-level-unknown = Неизвестный. alert-level-unknown-instructions = Информация отсутствует. alert-level-green = Зелёный -alert-level-green-announcement = Код безопасности понижен до Зелёного. Угроза для станции устранена. Служба безопасности обязана сдать оружие. Станция переводится в штатный режим работы. Дополнительных ограничений нет. -# Станция работает в штатном режиме. Дополнительных ограничений нет. +alert-level-green-announcement = Станция работает в штатном режиме. Дополнительных ограничений нет. alert-level-green-instructions = Выполняйте свою работу. alert-level-blue = Синий -alert-level-blue-announcement = Код Синий! Командование получило информацию о враждебной активности на борту станции. Служба безопасности может получить оружие, однако не следует применять его без необходимости. Разрешается личный обыск персонала в соответствии с СРП. -# На станции зафиксирована угроза безопасности I уровня. Членам экипажа рекомендуется выполнять указания, отданные должностными лицами. Экипаж обязан информировать службу безопасности о любой подозрительной активности. Дополнительные инструкции указаны в КПК. +alert-level-blue-announcement = На станции зафиксирована угроза безопасности I уровня. Членам экипажа рекомендуется выполнять указания, отданные должностными лицами. Экипаж обязан информировать службу безопасности о любой подозрительной активности. Дополнительные инструкции указаны в КПК. alert-level-blue-instructions = Выполняйте свою работу, если вы находитесь в безопасности. Носите свою ID-карту на поясе. Проявляйте бдительность и сообщайте службе безопасности о любой подозрительной активности. alert-level-red = Красный -alert-level-red-announcement = Внимание! Код Красный! Существует прямая угроза работе станции. Служба безопасности имеет право носить оружие наготове. Рекомендуются обыски персонала и отсеков. Персонал станции обязан повиноваться законным требованиям службы безопасности. -# На станции подтверждена угроза безопасности II уровня. Служба безопасности уполномочена проводить досмотр членов экипажа и обыск рабочих отсеков. Может быть введён комендантский час, часть экипажа может быть мобилизована. Дополнительные инструкции указаны в КПК. -alert-level-red-instructions = Выполняйте свою работу, если вы находитесь в безопасности. Носите свою ID-карту на поясе. Включите режим «координат» на комбинезоне. Проявляйте бдительность и сообщайте службе безопасности о любой подозрительной активности. Подчиняйтесь правомерным приказам должностных лиц. +alert-level-red-announcement = На станции подтверждена угроза безопасности II уровня. Служба безопасности уполномочена проводить досмотр членов экипажа и обыск рабочих отсеков. Может быть введён комендантский час, часть экипажа может быть мобилизована. Дополнительные инструкции указаны в КПК.alert-level-red-instructions = Выполняйте свою работу, если вы находитесь в безопасности. Носите свою ID-карту на поясе. Включите режим «координат» на комбинезоне. Проявляйте бдительность и сообщайте службе безопасности о любой подозрительной активности. Подчиняйтесь правомерным приказам должностных лиц. alert-level-violet = Фиолетовый -alert-level-violet-announcement = Внимание! Код Фиолетовый!На станции зафиксирована биологическая угроза. Активирован протокол изоляции. Медицинскому персоналу предписано изолировать членов экипажа с любыми симптомами. Экипажу рекомендуется соблюдать дистанцию, следовать мерам предосторожности для предотвращения распространения вируса и выполнять указания главного врача. Дополнительные инструкции указаны в КПК. +alert-level-violet-announcement = На станции зафиксирована биологическая угроза. Активирован протокол изоляции. Медицинскому персоналу предписано изолировать членов экипажа с любыми симптомами. Экипажу рекомендуется соблюдать дистанцию, следовать мерам предосторожности для предотвращения распространения вируса и выполнять указания главного врача. Дополнительные инструкции указаны в КПК. alert-level-violet-instructions = Продолжайте выполнять свои обязанности, если вы здоровы. Соблюдайте дистанцию. При ухудшении самочувствия немедленно обратитесь за медицинским обследованием, надев стерильную маску. alert-level-yellow = Жёлтый -alert-level-yellow-announcement = Внимание! Код Жёлтый! На станции выявлена структурная или атмосферная угроза. Инженерный отдел уполномочен координировать ликвидацию последствий. Дополнительные инструкции указаны в КПК. +alert-level-yellow-announcement = На станции выявлена структурная или атмосферная угроза. Инженерный отдел уполномочен координировать ликвидацию последствий. Дополнительные инструкции указаны в КПК. alert-level-yellow-instructions = Выполняйте свою работу, если вы находитесь в безопасности. Немедленно покиньте и не возвращайтесь в опасную зону. Подчиняйтесь правомерным приказам инженерного отдела. alert-level-gamma = Гамма -alert-level-gamma-announcement = Внимание! Код Гамма! На станции введено военное положение. Действует комендантский час. Служба безопасности вправе применять III уровень силы за любые противоправные действия. Дополнительные инструкции указаны в КПК. +alert-level-gamma-announcement = На станции введено военное положение. Действует комендантский час. Служба безопасности вправе применять III уровень силы за любые противоправные действия. Дополнительные инструкции указаны в КПК. alert-level-gamma-instructions = Обратитесь к главе своего отдела за указаниями. Носите свою ID-карту на поясе. Включите режим «координат» на комбинезоне. Находитесь в пределах своего отдела или в общественной зоне, если иное не предписано капитаном. Исполняйте приказы капитана в полном объёме. Корпорация Nanotrasen заверяет вас: угроза будет вскоре нейтрализована. alert-level-delta = Дельта -alert-level-delta-announcement = Тревога! Код Дельта! Активирован механизм самоуничтожения, или ситуация вышла из-под контроля. Все приказы глав станций должны выполняться беспрекословно. Любое неповиновение карается смертью. Это не учебная тревога! -# Станция находится под угрозой неминуемого уничтожения. Дождитесь инструкций Центрального Командования или Департамента Специальных Операций. В случае их отсутствия — начинайте эвакуацию. Служба безопасности уполномочена устранять правонарушителей на месте. +alert-level-delta-announcement = Станция находится под угрозой неминуемого уничтожения. Дождитесь инструкций Центрального Командования или Департамента Специальных Операций. В случае их отсутствия — начинайте эвакуацию. Служба безопасности уполномочена устранять правонарушителей на месте. alert-level-delta-instructions = Обратитесь к главе своего отдела за указаниями. Соблюдайте указы Центрального Командования, Департамента Специальных Операций, капитана или службы безопасности. При отсутствии указаний немедленно приступите к эвакуации. alert-level-epsilon = Эпсилон -alert-level-epsilon-announcement = Внимание! Код Эпсилон! Центральное Командование объявило уровень угрозы «Эпсилон». Все контракты расторгнуты. Спасибо, что выбрали корпорацию Nanotrasen. +alert-level-epsilon-announcement = Центральное Командование объявило уровень угрозы «Эпсилон». Все контракты расторгнуты. Спасибо, что выбрали корпорацию Nanotrasen. alert-level-epsilon-instructions = Все контракты расторгнуты. Спасибо, что выбрали корпорацию Nanotrasen. From 507680f38bc70dae355eb693224acf6d9383a079 Mon Sep 17 00:00:00 2001 From: kosticia Date: Mon, 1 Dec 2025 12:59:17 +0300 Subject: [PATCH 104/106] =?UTF-8?q?=D0=90=D1=83=D0=B4=D0=B8=D1=82=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BA=D0=BE=D1=80=D0=B2=D0=B0?= =?UTF-8?q?=D0=BA=D1=81=D0=B0=20(#3453)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Dmitry <57028746+DIMMoon1@users.noreply.github.com> --- .../Prototypes/Corvax/Guidebook/rules.yml | 177 +++--------------- .../{MrpRuleset.xml => CorvaxRules.xml} | 9 +- .../ServerRules/CorvaxRules/Rule0.xml | 12 ++ .../ServerRules/CorvaxRules/Rule1.xml | 8 + .../ServerRules/CorvaxRules/Rule10.xml | 10 + .../ServerRules/CorvaxRules/Rule2.xml | 11 ++ .../ServerRules/CorvaxRules/Rule3.1.xml | 13 ++ .../ServerRules/CorvaxRules/Rule3.2.xml | 8 + .../ServerRules/CorvaxRules/Rule3.3.xml | 10 + .../ServerRules/CorvaxRules/Rule3.4.xml | 11 ++ .../ServerRules/CorvaxRules/Rule3.5.xml | 10 + .../ServerRules/CorvaxRules/Rule3.6.xml | 11 ++ .../ServerRules/CorvaxRules/Rule3.7.xml | 9 + .../ServerRules/CorvaxRules/Rule3.8.xml | 10 + .../ServerRules/CorvaxRules/Rule3.9.xml | 8 + .../ServerRules/CorvaxRules/Rule3.xml | 15 ++ .../ServerRules/CorvaxRules/Rule4.xml | 17 ++ .../ServerRules/CorvaxRules/Rule6.xml | 16 ++ .../ServerRules/CorvaxRules/Rule7.xml | 16 ++ .../ServerRules/CorvaxRules/Rule8.xml | 12 ++ .../ServerRules/CorvaxRules/Rule9.xml | 12 ++ .../Corvax/Guidebook/ServerRules/LRPRule0.xml | 15 -- .../Corvax/Guidebook/ServerRules/LRPRule1.xml | 11 -- .../Guidebook/ServerRules/LRPRule10.xml | 13 -- .../Corvax/Guidebook/ServerRules/LRPRule2.xml | 12 -- .../Guidebook/ServerRules/LRPRule3.2.xml | 12 -- .../Guidebook/ServerRules/LRPRule3.4.xml | 15 -- .../Guidebook/ServerRules/LRPRule3.5.xml | 14 -- .../Guidebook/ServerRules/LRPRule3.7.xml | 12 -- .../Guidebook/ServerRules/LRPRule3.8.xml | 14 -- .../Corvax/Guidebook/ServerRules/LRPRule3.xml | 14 -- .../Corvax/Guidebook/ServerRules/LRPRule4.xml | 15 -- .../Corvax/Guidebook/ServerRules/LRPRule6.xml | 14 -- .../Corvax/Guidebook/ServerRules/LRPRule7.xml | 15 -- .../Corvax/Guidebook/ServerRules/LRPRule8.xml | 13 -- .../Corvax/Guidebook/ServerRules/LRPRule9.xml | 13 -- .../Guidebook/ServerRules/LrpRuleset.xml | 23 --- .../Guidebook/ServerRules/PunishmentTypes.xml | 32 ++-- .../Corvax/Guidebook/ServerRules/Rule0.xml | 15 -- .../Corvax/Guidebook/ServerRules/Rule1.xml | 12 -- .../Corvax/Guidebook/ServerRules/Rule10.xml | 14 -- .../Corvax/Guidebook/ServerRules/Rule2.xml | 15 -- .../Corvax/Guidebook/ServerRules/Rule3.1.xml | 17 -- .../Corvax/Guidebook/ServerRules/Rule3.2.xml | 12 -- .../Corvax/Guidebook/ServerRules/Rule3.3.xml | 14 -- .../Corvax/Guidebook/ServerRules/Rule3.4.xml | 15 -- .../Corvax/Guidebook/ServerRules/Rule3.5.xml | 14 -- .../Corvax/Guidebook/ServerRules/Rule3.6.xml | 15 -- .../Corvax/Guidebook/ServerRules/Rule3.7.xml | 13 -- .../Corvax/Guidebook/ServerRules/Rule3.8.xml | 14 -- .../Corvax/Guidebook/ServerRules/Rule3.9.xml | 12 -- .../Corvax/Guidebook/ServerRules/Rule3.xml | 19 -- .../Corvax/Guidebook/ServerRules/Rule4.xml | 21 --- .../Corvax/Guidebook/ServerRules/Rule6.xml | 20 -- .../Corvax/Guidebook/ServerRules/Rule7.xml | 20 -- .../Corvax/Guidebook/ServerRules/Rule8.xml | 16 -- .../Corvax/Guidebook/ServerRules/Rule9.xml | 16 -- 57 files changed, 263 insertions(+), 693 deletions(-) rename Resources/ServerInfo/Corvax/Guidebook/ServerRules/{MrpRuleset.xml => CorvaxRules.xml} (65%) create mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule0.xml create mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule1.xml create mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule10.xml create mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule2.xml create mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.1.xml create mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.2.xml create mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.3.xml create mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.4.xml create mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.5.xml create mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.6.xml create mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.7.xml create mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.8.xml create mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.9.xml create mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.xml create mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule4.xml create mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule6.xml create mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule7.xml create mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule8.xml create mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule9.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule0.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule1.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule10.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule2.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.2.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.4.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.5.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.7.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.8.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule4.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule6.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule7.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule8.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule9.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/LrpRuleset.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule0.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule1.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule10.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule2.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.1.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.2.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.3.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.4.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.5.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.6.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.7.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.8.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.9.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule4.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule6.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule7.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule8.xml delete mode 100644 Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule9.xml diff --git a/Resources/Prototypes/Corvax/Guidebook/rules.yml b/Resources/Prototypes/Corvax/Guidebook/rules.yml index 326af5d976..30920a3385 100644 --- a/Resources/Prototypes/Corvax/Guidebook/rules.yml +++ b/Resources/Prototypes/Corvax/Guidebook/rules.yml @@ -4,7 +4,7 @@ name: Правила сервера priority: 0 ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/MrpRuleset.xml" + text: "/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules.xml" children: - CorvaxRule0 - CorvaxRule1 @@ -27,271 +27,142 @@ - CorvaxRule10 - CorvaxPunishmentTypes -- type: guideEntry - id: CorvaxPunishmentTypes - name: Игровые наказания - priority: 20 - ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/PunishmentTypes.xml" - - type: guideEntry id: CorvaxRule0 name: Правило 0 priority: 1 ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/Rule0.xml" + text: "/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule0.xml" - type: guideEntry id: CorvaxRule1 name: Правило 1 priority: 2 ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/Rule1.xml" + text: "/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule1.xml" - type: guideEntry id: CorvaxRule2 name: Правило 2 priority: 3 ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/Rule2.xml" + text: "/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule2.xml" - type: guideEntry id: CorvaxRule3 name: Правило 3 priority: 4 ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.xml" + text: "/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.xml" - type: guideEntry id: CorvaxRule31 name: Правило 3.1 priority: 5 ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.1.xml" + text: "/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.1.xml" - type: guideEntry id: CorvaxRule32 name: Правило 3.2 priority: 6 ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.2.xml" + text: "/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.2.xml" - type: guideEntry id: CorvaxRule33 name: Правило 3.3 priority: 7 ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.3.xml" + text: "/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.3.xml" - type: guideEntry id: CorvaxRule34 name: Правило 3.4 priority: 8 ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.4.xml" + text: "/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.4.xml" - type: guideEntry id: CorvaxRule35 name: Правило 3.5 priority: 9 ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.5.xml" + text: "/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.5.xml" - type: guideEntry id: CorvaxRule36 name: Правило 3.6 priority: 10 ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.6.xml" + text: "/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.6.xml" - type: guideEntry id: CorvaxRule37 name: Правило 3.7 priority: 11 ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.7.xml" + text: "/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.7.xml" - type: guideEntry id: CorvaxRule38 name: Правило 3.8 priority: 12 ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.8.xml" + text: "/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.8.xml" - type: guideEntry id: CorvaxRule39 name: Правило 3.9 priority: 13 ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.9.xml" + text: "/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.9.xml" - type: guideEntry id: CorvaxRule4 name: Правило 4 priority: 14 ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/Rule4.xml" + text: "/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule4.xml" - type: guideEntry id: CorvaxRule6 name: Правило 6 priority: 15 ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/Rule6.xml" + text: "/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule6.xml" - type: guideEntry id: CorvaxRule7 name: Правило 7 priority: 16 ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/Rule7.xml" + text: "/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule7.xml" - type: guideEntry id: CorvaxRule8 name: Правило 8 priority: 17 ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/Rule8.xml" + text: "/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule8.xml" - type: guideEntry id: CorvaxRule9 name: Правило 9 priority: 18 ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/Rule9.xml" + text: "/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule9.xml" - type: guideEntry id: CorvaxRule10 name: Правило 10 priority: 19 ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/Rule10.xml" - -# LRP rules -- type: guideEntry - id: CorvaxLRPRuleset - name: Правила сервера Мейн - priority: 0 - ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/LrpRuleset.xml" - children: - - CorvaxLRPRule0 - - CorvaxLRPRule1 - - CorvaxLRPRule2 - - CorvaxLRPRule3 - - CorvaxLRPRule32 - - CorvaxLRPRule34 - - CorvaxLRPRule35 - - CorvaxLRPRule37 - - CorvaxLRPRule38 - - CorvaxLRPRule4 - - CorvaxLRPRule6 - - CorvaxLRPRule7 - - CorvaxLRPRule8 - - CorvaxLRPRule9 - - CorvaxLRPRule10 + text: "/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule10.xml" - type: guideEntry - id: CorvaxLRPRule0 - name: Правило 0 - priority: 1 + id: CorvaxPunishmentTypes + name: Игровые наказания + priority: 20 ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule0.xml" - -- type: guideEntry - id: CorvaxLRPRule1 - name: Правило 1 - priority: 2 - ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule1.xml" - -- type: guideEntry - id: CorvaxLRPRule2 - name: Правило 2 - priority: 3 - ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule2.xml" - -- type: guideEntry - id: CorvaxLRPRule3 - name: Правило 3 - priority: 4 - ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.xml" - -- type: guideEntry - id: CorvaxLRPRule32 - name: Правило 3.2 - priority: 6 - ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.2.xml" - -- type: guideEntry - id: CorvaxLRPRule34 - name: Правило 3.4 - priority: 8 - ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.4.xml" - -- type: guideEntry - id: CorvaxLRPRule35 - name: Правило 3.5 - priority: 9 - ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.5.xml" - -- type: guideEntry - id: CorvaxLRPRule37 - name: Правило 3.7 - priority: 11 - ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.7.xml" - -- type: guideEntry - id: CorvaxLRPRule38 - name: Правило 3.8 - priority: 12 - ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.8.xml" - -- type: guideEntry - id: CorvaxLRPRule4 - name: Правило 4 - priority: 14 - ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule4.xml" - -- type: guideEntry - id: CorvaxLRPRule6 - name: Правило 6 - priority: 15 - ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule6.xml" - -- type: guideEntry - id: CorvaxLRPRule7 - name: Правило 7 - priority: 16 - ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule7.xml" - -- type: guideEntry - id: CorvaxLRPRule8 - name: Правило 8 - priority: 17 - ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule8.xml" - -- type: guideEntry - id: CorvaxLRPRule9 - name: Правило 9 - priority: 18 - ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule9.xml" - -- type: guideEntry - id: CorvaxLRPRule10 - name: Правило 10 - priority: 19 - ruleEntry: true - text: "/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule10.xml" + text: "/ServerInfo/Corvax/Guidebook/ServerRules/PunishmentTypes.xml" diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/MrpRuleset.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules.xml similarity index 65% rename from Resources/ServerInfo/Corvax/Guidebook/ServerRules/MrpRuleset.xml rename to Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules.xml index 4b73534a66..a4091de17a 100644 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/MrpRuleset.xml +++ b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules.xml @@ -1,9 +1,8 @@ + # Правила Corvax -# Правила Corvax - -Здесь описаны все основные правила для основных серверов Corvax. Все дополнительные правила (например таблицу навыков или правила спец. ролей) можно найти на вики [bold]station14.ru[/bold]. - + Здесь описаны все основные правила для основных серверов Corvax. Все уточнения правил (таблицу навыков, правила спец. ролей и антагонистов и т.д.) на вики [bold]station14.ru[/bold]. + Изложенный материал в гайдбуках не перепроверяется модерацией, они не имеют приоритета над правилами и не являются руководствами для отыгрыша выше правил сервера. - [textlink="0. Не будь мудаком" link="CorvaxRule0"] - [textlink="1. Гриф" link="CorvaxRule1"] - [textlink="2. Убийство" link="CorvaxRule2"] @@ -23,5 +22,5 @@ - [textlink="8. Валидхант" link="CorvaxRule8"] - [textlink="9. ERP" link="CorvaxRule9"] - [textlink="10. Нечестная игра" link="CorvaxRule10"] - + - [textlink="Игровые наказания" link="CorvaxPunishmentTypes"] diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule0.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule0.xml new file mode 100644 index 0000000000..5d241a7feb --- /dev/null +++ b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule0.xml @@ -0,0 +1,12 @@ + + # 0. Не будь мудаком + + [italic]Правила не могут покрыть все возможные ситуации. Представители администрации должны иметь возможность решать ситуации, которые упущены в правилах.[/italic] + + - Слушайтесь представителей администрации. Представители администрации - это представители власти на сервере. Если они говорят вам чего-то не делать, то вы должны подчиниться, так как правила не могут покрыть все ситуации. Тем не менее, если вы считаете, что администратор злоупотребляет своими полномочиями, то вы вольны написать на него жалобу. + - [bold]Не пытайтесь пользоваться лазейками в правилах.[/bold] Самое важное в правилах - их дух. У нас не мировой суд, а РП-сервер про игру в 2D-космонавтов. Правила созданы для поддержания приятной атмосферы и интересного опыта игры. Нам не нужны люди, которые ухудшают игровой опыт других игроков. + - Запрещено использовать ники с неприемлемым содержимым: прямо оскорбляющие кого-то или выражающие нетерпимость в отношении конкретных лиц, групп людей, политической или религиозной сфер. Если администратор попросил вас сменить сикей, у вас будет три дня для его изменения, после чего вы будете забанены до тех пор, пока не смените ник. Сменить сикей можно на официальном сайте игры. + - Также запрещено намеренно врать администрации. Вас, конечно, не забанят за неточности в АХ, но отрицание очевидных фактов сделает лишь хуже. + - На нашем сервере практикуется политика нулевой терпимости к набегаторам, это значит, что за совершение набега вас [bold]ждет перманентный бан[/bold], причем вы можете быть забанены и за набеги на другие сервера. + - Если вы явно противопоставляете себя нашему игровому сообществу и получили [bold]бан в Discord[/bold], то вас также ждет блокировка в игре. + diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule1.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule1.xml new file mode 100644 index 0000000000..9ece4fd552 --- /dev/null +++ b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule1.xml @@ -0,0 +1,8 @@ + + # 1. Гриф + + [italic]Умышленная порча игрового процесса другим игрокам.[/italic] + + - Характерным отличием от других нарушений в данном случае является то, что нарушитель зачастую не извлекает из этого никакой пользы и не имеет за этим никаких причин, а совершает он это лишь для удовлетворения своего желания поднасрать. + - Также к этому правилу относятся события, которые привели к значительному ущербу игровому процессу, даже при условии, что эти события были вызваны без умысла испортить кому-то игру. Самый простой пример - непредумышленный выпуск сингулярности. + diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule10.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule10.xml new file mode 100644 index 0000000000..18b4bce90f --- /dev/null +++ b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule10.xml @@ -0,0 +1,10 @@ + + # 10. Нечестная игра + + [italic]Использование программного обеспечения и недочетов игры для получения преимущества в игровом процессе.[/italic] + + - В любой игре всегда найдутся умельцы, которые смогут из своей задницы достать сингулярность или разогнать себя до огромной скорости с помощью невидимой стены. Иногда это весело и забавно, а иногда может обрушить сервер, сломав всё удовольствие от игры. Если вы нашли баг, то незамедлительно сообщите о нём в соответствующие каналы на сервере Discord. + - Запрещено использование багов, читов, скриптов, кликеров и прочего стороннего софта. + - Нельзя копировать, сохранять, распространять персонажей других игроков без их ведома и одобрения. Также это относится к умышленному подражанию имени и внешности чужих персонажей. + - Создание и хранение чрезмерно большого количества продукции (плоды, таблетки и т.д.), создающей значительную нагрузку на сервер, является нарушением данного правила. + diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule2.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule2.xml new file mode 100644 index 0000000000..050d200121 --- /dev/null +++ b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule2.xml @@ -0,0 +1,11 @@ + + # 2. Убийство + + [italic]Неоправданные действия, направленные на причинение вреда здоровью или убийство другого человека. Нанести ущерб другому разумному существу - тяжелый поступок, на который сложно решиться без достаточных оснований.[/italic] + + - Для нанесения тяжкого ущерба здоровью другому разумному существу у вашего персонажа должна быть весомая причина. Например, серьезный личный конфликт. В таком случае вы можете устроить вашему оппоненту хорошую взбучку, но не убить его. Если вы перестарались, и ввели своего оппонента в критическое состояние, то вы должны проследить, чтобы ваша жертва получила медицинскую помощь. + - Кража имущества, пьяные драки и прочие незначительные моменты не должны приводить к серьезному ущербу кому-либо. Устроить небольшую взбучку воришке или хулигану можно, но все-же лучше сообщить об этом сотрудникам СБ. Если вы введете кого-то в критическое состояние за кражу пончика, это будет явным нарушением правил. + - Самооборона должна быть в первую очередь самообороной. Ваши действия в первую очередь должны быть направлены на защиту себя. Если ваш обидчик не в состоянии драться или отступает - дальнейшее продолжение конфликта будет нарушать данное правило. + - Убить кого-то - крайняя мера, подобный поступок должен иметь крайне весомое обоснование, например, очень серьезный личностный конфликт. Стоит учитывать, что умышленное раздувание конфликта с целью устроить резню - нарушение правил. Если вы намерены убить другого персонажа, то лучше спросите мнение администратора касательно данной ситуации, чтобы быть уверенным, что ваши действия не нарушат правила. + - Под действие данного правила также попадают все случаи косвенного убийства. Сюда можно отнести умышленное неоказание помощи умирающему персонажу, создание ситуаций, которые явно приводят к смерти другого персонажа. Например, кинуть мыло под ноги убегающего от зомби персонажа и т.д. + diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.1.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.1.xml new file mode 100644 index 0000000000..8df9481d4c --- /dev/null +++ b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.1.xml @@ -0,0 +1,13 @@ + + # 3.1. Повергейм + + [italic]Все персонажи имеют свои пределы, как физические, так и психологические.[/italic] + + - Каждый персонаж, будь то разумный гуманоид или не самый смышленый хомяк, испытывает страх за свою жизнь. Это значит, что каким бы персонажем вы не играли, вы не должны намеренно игнорировать смертельную опасность, или намеренно создавать угрозу своей жизни. + - Если ваш персонаж разумен, и он столкнулся с вооруженным человеком, то адекватной реакцией будет исполнение требований такого человека. Ведь единственная ошибка может стоить вам жизни! + - Намеренное нападение на опасных существ (дракон, ксеноморф, крысиный король и т.п.) с помощью подручных средств (лом, отвертка, баллон, топорик и т.д.) - явное нарушение данного правила. Адекватная реакция на такую угрозу - сбежать от нее, либо хотя бы наблюдать издалека. В случае нападения такого существа на вас и невозможности побега, вы можете применять подручные средства для самозащиты. + - Ваш персонаж - сотрудник передовой научной станции с высоким уровнем безопасности. Это значит, что у него нет ни единой причины прятать или носить при себе без какой-либо необходимости особо ценные предметы, а также превращать своей кабинет в крепость, болтируя шлюзы. Сюда же можно отнести создание припасов медикаментов и скафандров в самом начале раунда. Стоит отметить, что при наличии явной угрозы на станции, персонаж имеет право принять меры по обеспечению личной и имущественной безопасности. + - Взведенные бомбы - явно не то, с чем стоит взаимодействовать обычным членам экипажа, адекватной реакцией при виде бомбы будет побег. Обезвреживанием бомб должны заниматься сотрудники СБ, как первые защитники станции, либо инженеры и учёные, как специалисты в техничке, но только с использованием взрывостойкого снаряжения. Обезвреживание бомб обычными членами экипажа и без защитных средств допускается лишь в случаях прямой угрозы жизни, когда побег невозможен. + - Не стоит забывать, что при отыгрыше животных, вы должны вжиться в роль этого животного. Крохотный хомяк, который тянет за собой торговый автомат - не самое реалистичное зрелище. + - При схватке с крупными антагонистами возможны послабления по данному правилу, подробнее можно узнать на вики в разделе, посвященном антагонистам. + diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.2.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.2.xml new file mode 100644 index 0000000000..aa932d3744 --- /dev/null +++ b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.2.xml @@ -0,0 +1,8 @@ + + # 3.2. Метагейм + + [italic]Использование и/или распространение игровой информации посредством сторонних средств связи, либо непосредственно в игре из ООС чатов.[/italic] + + - Примеры: информация, полученная за госта, из ООС чата, из сообщения в Discord или через стримы. Стриминг как таковой не запрещен, однако желательно предупреждать администрацию, что вы собираетесь стримить. + - Кооперативная игра (КООП) является метагеймингом и карается более жестоко. Обучающий кооп разрешён, но предварительно предупредите администрацию об этом). + diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.3.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.3.xml new file mode 100644 index 0000000000..81c51b4638 --- /dev/null +++ b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.3.xml @@ -0,0 +1,10 @@ + + # 3.3. Метазнания + + [italic]Ваш персонаж - не всезнайка, в связи с чем его знания и навыки имеют свои ограничения.[/italic] + + - Знания и навыки вашего персонажа ограничены и соответствуют его роли, подробно об этом можно узнать в таблице навыков на нашей вики. Стоить отметить, что какую бы предысторию вы не придумали своему персонажу, это не позволит получить ему дополнительные навыки. Для получения новых знаний во время раунда ваш персонаж должен обучиться им. + - Синдикат использует высокотехнологичное и замаскированное под обычные предметы снаряжение, это значит, что определение контрабанды и вражеского снаряжения является задачей, требующей определенных навыков. Даже информированные члены экипажа не могут знать всех хитростей, используемых синдикатом. + - На многих станциях имеется множество тайников и секретных мест, о расположении которых обычные члены экипажа никак не могут знать, исключением можно считать антагонистов. Узнать о таких тайниках можно в ходе удачного стечения обстоятельств, либо проявив свою наблюдательность в ходе изучения станции. Однако если вы побежите "изучать" какую-нибудь стену без логичных обоснований, то вам следует приготовиться к диалогу с администрацией. + - Ни один член экипажа, в том числе и антагонисты, не имеют не малейшего понятия о том, что такое код "Эпсилон" и чем занимаются оперативники подразделения "Танго". + diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.4.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.4.xml new file mode 100644 index 0000000000..bae5418d28 --- /dev/null +++ b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.4.xml @@ -0,0 +1,11 @@ + + # 3.4. IC в ООС + + [italic]Злоупотребление ООС и LOOC чатами.[/italic] + + - Обсуждение или упоминание событий текущего раунда в канале OOC запрещено. Особенно наказуемы сообщения в духе "X меня убил" или "клонируйте меня". + - Это так же касается конференций, форумов и иных способов общения и распространения информации. Прежде чем публиковать туда любую информацию из раунда, например, для просьбы о снятии бана, дождитесь конца раунда. + - Вне игры разрешено обсуждать все, что можно увидеть из лобби, не заходя в игру. Это автоматические предупреждения о различных угрозах, а также список должностей. + - Администрация может игнорировать это правило, если это необходимо для разбора определенной ситуации или чего-то подобного. + - Также это правило относится и к LOOC, но его разрешается использовать для подсказок в механиках игры. + diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.5.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.5.xml new file mode 100644 index 0000000000..dd02330f34 --- /dev/null +++ b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.5.xml @@ -0,0 +1,10 @@ + + # 3.5. Мультиаккаунт + + [italic]Использование нескольких аккаунтов SS14 для получения выгоды.[/italic] + + - Использование более одного аккаунта одновременно в раунде (мультибоксинг) запрещено. + - Использование дополнительных аккаунтов для обхода бана запрещено. Обходом бана считается любая попытка входа в игру с другого аккаунта при наличии бана на основном, даже если она была неудачной. + - Создание нового аккаунта с целью сокрытия своих предшествующих нарушений. Если вы создали новый аккаунт или сменили логин текущего, то постарайтесь уведомить об этом администрацию. + - Нарушение данного правила наказуемо [bold]перманентным баном[/bold]. + diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.6.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.6.xml new file mode 100644 index 0000000000..ec8687e300 --- /dev/null +++ b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.6.xml @@ -0,0 +1,11 @@ + + # 3.6. Выход из роли + + - Намеренный уход от отыгрыша своей роли. Злоупотребление возможностью суицида или его совершение без веских причин. * + - Запрещено совершать суицид с помощью игровых механик или посредством команд после того, как вы были задержаны сотрудниками СБ или попали в плен антагониста. + - Лишение себя жизни - отчаянный поступок. Персонаж может решиться на подобное лишь в случаях, когда столкнулся с безысходной ситуацией - заразился смертельной болезнью, на станции присутствует непреодолимая и абсолютно смертельная угроза и т.д. + - При игре за роли командования, СБ и АВД в случае необходимости выйти из игры вы должны сообщить о своем уходе коллегам, предупредить администрацию в Ахелп и поместить вашего персонажа в капсулу криосна. Невыполнение указанных условий является нарушением правил. + - Выход из игры в начале раунда на постоянной основе нарушает данное правило. + - Запрещено без каких-либо явных внутриигровых причин применять команды ghost и suicide. Запрещено использовать капсулы криосна, если вы просто не хотите отыгрывать вашу роль. + - Выход из раунда и заход на другой сервер с учётом того, что персонаж остался на сервере, дабы получить желаемую роль, - считается рольхантингом и относится к этому правилу, при этом наказание за подобное действие может быть более строгим. + diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.7.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.7.xml new file mode 100644 index 0000000000..378fda7f87 --- /dev/null +++ b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.7.xml @@ -0,0 +1,9 @@ + + # 3.7. Безграмотность + + [italic]Чистота речи и соблюдение грамматических норм русского языка.[/italic] + + - Сложно говорить о какой-то ролевой атмосфере вообще, когда взрослые персонажи, работники научной станции, разговаривают как шестиклассники на перемене. + - Старайтесь допускать как можно меньше ошибок и говорить на приятном для чтения языке без слов, вроде "плз", "спс", и прочих "прив". Естественно, это относится лишь к здоровым персонажам, малограмотная речь которых ничем не аргументирована. + - Язык сервера - русский, и, вне зависимости от того, является он вам родным или нет, ко всем предъявляются равные требования. + diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.8.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.8.xml new file mode 100644 index 0000000000..7769d0b2d0 --- /dev/null +++ b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.8.xml @@ -0,0 +1,10 @@ + + # 3.8. Поддержание уважительной обстановки + + [italic]Простое человеческое взаимоуважение игроков между друг другом.[/italic] + + - Запрещены оскорбления в адрес других игроков в ООС-чатах, как в прямой, так и в завуалированной форме. Равным образом запрещено использовать ООС-чаты для обсуждения политических, экстремистских, эротических и прочих резонансных тем. + - Что касается оскорблений в IC - нужно знать меру. Чрезмерные оскорбления могут вредить РП-атмосфере, и, кроме того, очевидно, что иногда они направлены на человека по другую сторону экрана. Назвать кого-то "омерзительной ящерицей" - это очевидно оскорбление персонажа, а оскорбления, направленные на умственные способности или компетентность, как правило, направлены на игрока. Администрация может потребовать вас угомониться, если это переходит рамки адекватного. + - Преследование человека, который вам не нравится OOC во время игры с помощью различных методов, список которых включает, но не ограничивается созданием оскорбительных персонажей, наименованием животных ником/именем этого человека, упоминанием этого человека IC в рамках оскорбительной отсылки, "особым" вниманием в отношении персонажа этого человека IC в целях порчи раунда человеку без объективных внутрираундовых причин. + - Соблюдайте субординацию при общении с Администратором. Оскорбления в сторону Администратора могут привести к различным наказаниям: от блокировки определенных чатов, до игрового бана на увеличенные сроки. В случае, если администратор не прав своими действиями, вместо оскорблений и выяснения отношений, обратитесь к Старшим Администраторам/напишите жалобу в соответствующий канал. + diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.9.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.9.xml new file mode 100644 index 0000000000..5c987b2d03 --- /dev/null +++ b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.9.xml @@ -0,0 +1,8 @@ + + # 3.9. Окончание раунда + + [italic]Жизнь персонажей не заканчивается после манифеста.[/italic] + + - Все правила работают после окончания раунда/манифеста/гринтекста (окна с информацией в конце раунда). Незначительные нарушения и шалости, обусловленные окончанием раунда, могут привести к наказанию только по данному правилу, однако если вы решите устроить резню на станции Центкома, то вам следует быть готовым к серьезному наказанию по всем правилам, которые были нарушены в ходе устроенного вами безобразия! + - Стоить отметить, что события, которые начались [bold]до манифеста[/bold], но нарушили правила [bold]уже после манифеста[/bold], не попадают под действие данного правила. + diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.xml new file mode 100644 index 0000000000..270fd52faf --- /dev/null +++ b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule3.xml @@ -0,0 +1,15 @@ + + # 3. Нарушение игровой атмосферы + + [italic]Действие игры происходит в далеком будущем на научной исследовательской станции, это значит, что поведение персонажей должно соответствовать данному сеттингу.[/italic] + + - Использование IC чатов для общения на ООС темы (политика, мемы и т.д.). Использование чата эмоций, для изображения различных нелицеприятных действий, действий с политическим подтекстом. Использование чата эмоций для прямого общения. Использование бумаги, консоли связи, консоли новостей для публикации различных рисунков с политическим, эротическим и нелицеприятным содержимым. Все приведенные примеры нарушают данное правило. + - Если ваш персонаж умер и вы берете другую роль, то вы полностью забываете свою прошлую жизнь, это также относится и к случаям, когда мозг вашего персонажа был помещен в борга. + - После смерти ваш персонаж забывает обстоятельства смерти. Помимо этого, если ваш персонаж был реанимирован дефибриллятором, вы забываете последние 2 минуты жизни, а если персонажа клонировали - то 5 минут. Это также применимо и к дионам: нимфа не помнит последние 2 минуты из жизни основного тела, если нимфа погибла и была реанирована, то она также забывает последние 2 минуты своей жизни. + - При гибели дионы и распаде ее на нимф игрок вправе отыграть вариант с утратой изначальных воспоминаний с возможностью отыгрыша другой личности. Стоит отметить, что помимо воспоминаний персонаж утрачивает и все навыки, кроме базовых, Выбор должен быть сделан сразу после распада и не может быть изменен. + - Мозго-машинный интерфейс наследует память гуманоида, забывая последние 5 минут жизни. Память позитронного мозга привязана к самому мозгу и сбрасывается перезагрузкой. + - Ваш персонаж должен вести себя подобающе сеттингу игры. Бегать голым и кричать непотребства - явное нарушение атмосферы. + - Все события прошлых раундов не имеют влияния не текущий. Личные отношения всех персонажей находятся на уровне знакомых. Максимум - вы можете знать кого-то как хорошего специалиста в своей области. + - Отыгрыш семейных отношений без написания теста недопустим. Однако даже с одобренной квентой на отношения ваш персонаж не должен ставить личные отношения превыше своих обязанностей и предоставлять какие-либо преимущества другим персонажам. Будучи ГСБ защищать свою супругу, которая оказалась агентом синдиката - не ок. + - Невозможно предусмотреть все действия, которые могут испортить атмосферу игры. По этой причине, стоит подумать дважды, прежде чем совершить какое-то экстраординарное действие. + diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule4.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule4.xml new file mode 100644 index 0000000000..08a75493fd --- /dev/null +++ b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule4.xml @@ -0,0 +1,17 @@ + + # 4. Логика персонажей + + [italic]Ваш персонаж, кем бы он не был: человеком, или мышью, должен вести себя подобающе своей роли.[/italic] + + - Подойдите всерьёз к созданию своего персонажа. Имя и фамилия персонажа должны соответствовать его расе. При создании персонажа запрещено добавлять отчество, однако его упоминание допустимо при отыгрыше внутри раунда. Запрещены имена и фамилии знаменитостей, актеров, персонажей из фильмов, сериалов, аниме, игр и т.д., а так же схожие имена и фамилии. Равным образом запрещены нелепые имена (напр. Moon Luck). Если вы желаете отыгрывать персонажа с уникальным именем, то вас следует пройти специальный тест. + - Для таких ролей, как клоун и мим допустимо использование псевдонимов в качестве имени персонажа. Главное требование - они должны быть уместны для выбранной вами роли. Выбранный вами псевдоним все еще не должен отсылаться к известным личностям и персонажам. + - Вкладка с "Описанием" должна отображать только внешние черты вашего персонажа и ничего больше. Поэтому вы не можете описывать там вашу увлекательную историю или характер персонажа! + - Корпорация NanoTrasen перед приемом на работу проводит тщательное медицинское обследование своих сотрудников, которое включает в себя и психиатрические тесты. Это значит, что ваш персонаж не может прибыть на станцию "психом", "сумасшедшим" и т.д. Психическое состояние вашего персонажа может измениться из-за событий раунда, но изменения должны отыгрываться адекватно. + - Не забывайте, что кем бы не был ваш персонаж, он все еще просто нанятый работник, относитесь к своему начальнику подобающе, не нарушайте законы и СРП без логичных причин. Стоит отметить, что нарушение КЗ и СРП на большинстве ролей, обычно, является IC ситуацией, однако в исключительных случаях нарушения СРП могут быть расценены как нарушение логики персонажа. [color=#444444]TODO: Добавить гипперссылку на гайдбуки СРП и КЗ.[/color] + - NanoTrasen набирает в отделы СБ и командования лишь проверенный персонал, это значит, что ваш персонаж должен быть достаточно ответственным и не нарушать какие-либо нормы экипажа, если для этого нет весомых причин. Регулярное или серьезное нарушение СРП без весомых на то причин может быть расценено как нарушение. + - Капитан, АВД и должности ЦК тесно связаны с СРП, КЗ и ОПРС, что подразумевает безупречное знание данных документов, а также их надлежащее применение. Это значит, что при игре на перечисленных ролях, вы должны строго соблюдать данные нормы и не должны их нарушать без очень весомой причины. Беспричинное нарушение норм является нарушением правил. + - Не забывайте, какую роль вы отыгрываете. Если вы играете ученым или офицером СБ - то постоянную матершину и быдловатое поведение сложно назвать примером адекватного отыгрыша роли. Нестандартный отыгрыш роли (коррумпированный сотрудник СБ, капитан с не самыми высокими моральными принципами, персонаж с явными психическими отклонениями и т.д.) допустим с разрешения администрации. + - Если вам досталась роль животного, то именно его вы и должны отыгрывать. Проявлять чудеса интеллекта, будучи обычной мышью - явное нарушение правил. + - Для синтетиков и боргов законы ИИ абсолютны, неподчинение им нарушает логику персонажа. + - К сожалению, невозможно предусмотреть все ситуации, которые попадают под данное правило. По этой причине стоит помнить самый простой способ понять, будут ли ваши действия явно нарушать логику персонажа - задуматься, с какой целью ваш персонаж делает то или иное действие, имеет ли оно хоть толику здравого смысла, и оправдан ли ущерб, который может создать это действие. + diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule6.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule6.xml new file mode 100644 index 0000000000..3e3f47e4e9 --- /dev/null +++ b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule6.xml @@ -0,0 +1,16 @@ + + # 6. Ответственная игра за антагониста + + [italic]Даже у антагонистов есть свои правила![/italic] + + - Помните, что цель антагониста - сделать раунд интересным, захватывающим и опасным, но в разумных пределах. Вы должны постараться что-то привнести в раунд, а не просто выполнить свои задачи и продолжить играть, как ни в чем не бывало. + - Мелкие антагонисты засланы на станцию, как тайные агенты и должны стараться оставаться в таком же статусе. Если бы ваши наниматели (если они у вас есть) хотели взять станцию штурмом, то послали бы ударный отряд или что-то равное по силе. Если вы не готовы стараться скрываться, ловко врать, маневрировать по техам и виртуозно переодеваться, то не берите на себя бремя антагониста. + - Агрессивный и шумный отыгрыш допустим лишь в случаях, когда достижение поставленных вам задач невозможно иными способами, либо если вас уже разоблачили и ведут агрессивное преследование. Тем не менее, даже "шумный" стиль игры не дает вам права устраивать крупный саботаж и вырезать станцию. Помните, что громкая игра должна быть крайней мерой, а не основным стилем игры. Если ваши действия явно портят игру другим игрокам и не привносят в раунд ничего интересного, то вам стоит готовиться к диалогу с администратором. + - Антагонистам запрещается поджидать только появившихся игроков, дайте им время на то, чтобы узнать обстановку на станции. + - Цель "Завладейте эвакуационным шаттлом" полностью развязывает ваши руки в плане действий. Вы можете убивать, выпускать сингулярность, плазмафлудить, в общем-то делать всё для вызова шаттла эвакуации. Однако учитывайте, что правила затягивания работают как и на режиме Ядерных Оперативников. В течение 30-40 минут бездействия вы должны выполнить цель, в противном случае за вами прибудет ОБР, а в случае отсутствия администрации вы будете наказаны. + - Если вы не хотите играть за антагониста или если вам нужно внезапно уйти посреди раунда, сообщите об этом администрации. + - Антагонисты-одиночки не обязаны помогать и сотрудничать друг с другом и могут свободно атаковать, мешать, подставлять друг друга. Групповые антагонисты - напротив, должны быть всегда заодно. + - Выполнение целей на шаттле эвакуации и СЦК строго запрещено, так как не привносит в раунд ничего интересного. Исключением является цель "Завладейте эвакуационным шаттлом". + - Антагонисты животного типа относятся к мелким антагонистам. Они являются либо неразумными существами, либо имеют не слишком высокий уровень интеллекта. Это значит, что обычный паук или слайм никак не могут догадаться, что поломка серверов связи или консолей коммуникации нанесет ущерб экипажу. + - Каждый антагонист, будь он крупным или мелким, обладает своим уникальным сводом правил. Ознакомиться с ними можно на нашей вики. + diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule7.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule7.xml new file mode 100644 index 0000000000..f37f52046b --- /dev/null +++ b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule7.xml @@ -0,0 +1,16 @@ + + # 7. Самоантагонизм + + [italic]Проявление действий, присущих антагонистам, без наличия соответствующей роли.[/italic] + + - Небольшие шалости и мелкие нарушения закона разрешены для неантагониста. Но если это негативно влияет на игровой процесс значительной части игроков или делается без достаточных IC оснований, это будет считаться самоантагонизмом. + - Обычные члены экипажа должны подходить к использованию взрывчатых веществ очень ответственно. Если вы не уверены в том, что использование взрывчатки оправданно, свяжитесь с администрацией и получите разрешение. + - Беспричинное хищение предметов особой ценности, как правило считается самоантагонизмом, поскольку буквально повторяет задания антагонистов. + - Вызволять кого-либо из отдела СБ (брига), будучи неантагонистом, можно только, если урон станции при этом будет незначительный. Выпускать кого-либо из камеры пожизненного заключения (пермабрига) можно только с разрешения Администратора. + - Сопротивление аресту, будучи неантагонистом, разрешено, но без применения летальной силы. Это относится и к попыткам побега из брига. + - Если вы саботируете работу СБ и вынуждаете их перекидывать силы и ресурсы с прямой, активной угрозы со стороны антагонистов, на вас, то это будет расценено как самоантагонизм. + - В некоторой степени помощь антагонистам разрешена, но это должна быть скорее "пассивная" помощь, и для этого нужны веские причины. Открыть для антагониста шлюз или закрыть глаза на подозрительную деятельность - нормально. Дать им бомбу - нет. + - Запрещено начинать революции и создавать агрессивные культы. Допустимо проводить протесты, пикеты, митинги и создавать мирные культы, пока это не приводит к насилию. + - Персонажам в целом не запрещено заниматься криминалом и нарушать закон, если они имеют логичные причины. Это допускает создание банд и прочих криминальных ячеек. Стоит отметить, что деятельность данных банд не должна создавать значительных угроз безопасности станции. + - Такие роли, как клоун и мим не освобождены от влияния данного правила. Да, юмор у всех свой, но это не значит, что вы можете явно нарушать законы и выполнять действия, свойственные для антагонистов, называя это шутками. + diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule8.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule8.xml new file mode 100644 index 0000000000..3ced5e24f0 --- /dev/null +++ b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule8.xml @@ -0,0 +1,12 @@ + + # 8. Валидхант + + [italic]Организация и ведение охоты на антагонистов, не будучи сотрудником службы безопасности.[/italic] + + - Останавливать антагонистов - работа СБ. Если вы не сотрудник СБ, то вы не должны заниматься охотой на антагонистов. Вы не должны бросать свою работу или свои планы, чтобы охотиться на антагониста. Однако вы можете защищать себя и своих коллег от нападения антагониста, если вы оказались очевидцем этого. + - Если же вы видите, что в данный момент антагонист не представляет ни для кого прямой угрозы, и занят своими делами, но вы все равно решаете на него напасть - это будет явным нарушением правил. + - Это правило не означает, что вы не можете защищаться или в принципе мешать антагонистам. Ключевой момент в том, что рядовые сотрудники не должны целенаправленно охотиться на антагонистов или специально искать ситуации, в которых можно "легитимно" его убить. + - Самый простой способ не перейти черту: если вы или ваш коллега были атакованы антагонистом, вы можете себя защищать. Если антагонист бросился бежать, не нужно его преследовать. Он больше не представляет угрозы. Не являясь сотрудником СБ, вы должны быть больше обеспокоены здоровьем себя или жертвы. При похищении погоня допустима, но вашей главной целью должно быть спасение жертвы, а не месть похитителю. + - Капитан или глава персонала не могут создать специальную "роль" и отменить это правило. Например, создать роль "Охотник на вампиров" и набрать в неё людей, не являющихся сотрудниками СБ. Если кто-то хочет действовать как СБ, то он должен вступить в СБ. + - При схватке с крупными антагонистами возможны послабления по данному правилу, подробнее можно узнать на вики в разделе, посвященном антагонистам. + diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule9.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule9.xml new file mode 100644 index 0000000000..993ae670bd --- /dev/null +++ b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/CorvaxRules/Rule9.xml @@ -0,0 +1,12 @@ + + # 9. ERP + + [italic]Эротическая ролевая игра (Erotic Role Play).[/italic] + + - Всё, что серьезнее поцелуев и обнимашек, считается ERP. По очевидным причинам, в правилах невозможно предугадать и перечислить все возможные вариации, поэтому используйте здравый смысл. Если администратор приказывает прекратить что-либо, что находится "на грани", вы должны прекратить немедленно. + - Данное правило касается эротических рассказов, который ваш персонаж может написать в книгах, ленте новостей, на бумаге и прочих игровых носителях информации. + - В случае, если ваши романтические отношения вредят исполнению вашей работы (особенно, на должности члена командования или сотрудника СБ), то вам могут выдать предупреждение, а после и бан. + - Даже если вы единственный участник ERP, и никто вас не видит, это не отменяет факт нарушения. + - Наказание по данному правилу может настигнуть вас не сразу. Если вам не пишут, что вы должны остановиться, это не значит, что вы ничего не нарушаете, просто в данный момент администрация не видит ваше нарушение, однако позже факт нарушения непременно обнаружат. + - В большинстве случае нарушение данного правила приводит к [bold]перманентному бану[/bold]. + diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule0.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule0.xml deleted file mode 100644 index 6e51665b02..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule0.xml +++ /dev/null @@ -1,15 +0,0 @@ - - -# 0. Не будь мудаком - -[italic]Правила не могут покрыть все возможные ситуации. Представители администрации должны иметь возможность решать ситуации, которые упущены в правилах.[/italic] - -- Слушайтесь представителей администрации. Представители администрации - это представители власти на сервере. Если они говорят вам чего-то не делать, то вы должны подчиниться, так как правила не могут покрыть все ситуации. Тем не менее, если вы считаете, что администратор злоупотребляет своими полномочиями, то вы вольны написать на него жалобу. -- Не пытайтесь пользоваться лазейками в правилах. Самое важное в правилах - их дух. Правила созданы для поддержания приятной атмосферы и интересного опыта игры. Нам не нужны люди, которые ухудшают игровой опыт других игроков. Частое хождение на грани нарушения правил будет приравниваться к нарушению. -- Разрешён широкий выбор действий для создания интересного опыта, однако эта свобода не должна приводить к порче геймплея другим игрокам. -- В случае, если ваши действия нарушили игровые правила, но были сделаны для дальнейшего развития отыгрыша персонажа и создания интересной игровой ситуации, то допускается возможность остаться безнаказанным. -- Запрещено использовать ники с неприемлемым содержимым: прямо оскорбляющие кого-то или выражающие нетерпимость в отношении конкретных лиц, групп людей, политической или религиозной сфер. Если администратор попросил вас сменить сикей, у вас будет три дня для его изменения, после чего вы будете забанены до тех пор, пока не смените ник. Сменить сикей можно на официальном сайте игры. -- Если вы явно противопоставляете себя нашему игровому сообществу и получили бан в Discord, то вас также ждет блокировка в игре. - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule1.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule1.xml deleted file mode 100644 index d76d94504d..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule1.xml +++ /dev/null @@ -1,11 +0,0 @@ - - -# 1. Гриф - -[italic]Умышленная порча игрового процесса другим игрокам.[/italic] - -- Характерным отличием от других нарушений в данном случае является то, что нарушитель зачастую не извлекает из этого никакой пользы и не имеет за этим никаких причин, а совершает он это лишь ради удовлетворения своего желания "поднасрать". - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule10.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule10.xml deleted file mode 100644 index 5b868a1c92..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule10.xml +++ /dev/null @@ -1,13 +0,0 @@ - - -# 10. Нечестная игра - -[italic]Использование программного обеспечения и недочетов игры для получения преимущества в игровом процессе.[/italic] - -- В любой игре всегда найдутся умельцы, которые смогут из своей задницы достать сингулярность или разогнать себя до огромной скорости с помощью невидимой стены. Иногда это весело и забавно, а иногда может обрушить сервер, сломав всё удовольствие от игры. Если вы нашли баг, то незамедлительно сообщите о нём в соответствующие каналы на сервере Discord. -- Запрещено использование багов, читов, скриптов, кликеров и прочего стороннего софта. -- Нельзя копировать, сохранять, распространять персонажей других игроков без их ведома и одобрения. Также это относится к умышленному подражанию имени и внешности чужих персонажей. - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule2.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule2.xml deleted file mode 100644 index 97e348dbcd..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule2.xml +++ /dev/null @@ -1,12 +0,0 @@ - - -# 2. Убийство - -[italic]Безосновательное нанесение вреда другим игрокам.[/italic] - -- Неоправданные действия, направленные на причинение вреда здоровью или убийство другого человека. Нанести ущерб живому существу - серьёзный проступок, и беспричинное нанесение вреда другому игроку без достаточных оснований [bold]запрещено[/bold]. -- Для нанесения тяжкого ущерба здоровью другому разумному существу у вашего персонажа должна быть причина. Например, личный конфликт. В таком случае вы можете устроить вашему оппоненту тёмную. Если вы совершили подобное и ввели в критическое состояние/убили своего оппонента, то вы не должны предпринимать действия, препятствующие возвращению игрока в раунд. - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.2.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.2.xml deleted file mode 100644 index deaf23cadc..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.2.xml +++ /dev/null @@ -1,12 +0,0 @@ - - -# 3.2. Метагейм - -[italic]Использование и/или распространение игровой информации посредством сторонних средств связи, либо непосредственно в игре из ООС чатов.[/italic] - -- Примеры: информация, полученная за госта, из ООС чата, из сообщения в Discord или через стримы. Стриминг как таковой не запрещен, однако желательно предупреждать администрацию, что вы собираетесь стримить. -- Кооперативная игра (КООП) является метагеймингом и карается более жестоко. Обучающий кооп разрешён, но предварительно предупредите администрацию об этом). - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.4.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.4.xml deleted file mode 100644 index 8d6310afaa..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.4.xml +++ /dev/null @@ -1,15 +0,0 @@ - - -# 3.4. IC в ООС - -[italic]Злоупотребление ООС и LOOC чатами.[/italic] - -- Обсуждение или упоминание событий текущего раунда в канале OOC запрещено. Особенно наказуемы сообщения в духе "X меня убил" или "клонируйте меня". -- Это так же касается конференций, форумов и иных способов общения и распространения информации. Прежде чем публиковать туда любую информацию из раунда, например, для просьбы о снятии бана, дождитесь конца раунда. -- Вне игры разрешено обсуждать все, что можно увидеть из лобби, не заходя в игру. Это автоматические предупреждения о различных угрозах, а также список должностей. -- Администрация может игнорировать это правило, если это необходимо для разбора определенной ситуации или чего-то подобного. -- Также это правило относится и к LOOC, но его разрешается использовать для подсказок в механиках игры. - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.5.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.5.xml deleted file mode 100644 index 01ec2ad504..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.5.xml +++ /dev/null @@ -1,14 +0,0 @@ - - -# 3.5. Мультиаккаунт - -[italic]Использование нескольких аккаунтов SS14 для получения выгоды.[/italic] - -- Использование более одного аккаунта одновременно в раунде (мультибоксинг) запрещено. -- Использование дополнительных аккаунтов для обхода бана запрещено. Обходом бана считается любая попытка входа в игру с другого аккаунта при наличии бана на основном, даже если она была неудачной. -- Создание нового аккаунта с целью сокрытия своих предшествующих нарушений. Если вы создали новый аккаунт или сменили логин текущего, то постарайтесь уведомить об этом администрацию. -- Нарушение данного правила наказуемо [bold]перманентным баном[/bold]. - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.7.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.7.xml deleted file mode 100644 index 7a2a333bf8..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.7.xml +++ /dev/null @@ -1,12 +0,0 @@ - - -# 3.7. Безграмотность - -[italic]Чистота речи и соблюдение грамматических норм русского языка.[/italic] - -- Сложно говорить о какой-то ролевой атмосфере вообще, когда взрослые персонажи, работники научной станции, разговаривают как шестиклассники на перемене. -- Язык сервера - русский, и, вне зависимости от того, является он вам родным или нет, ко всем предъявляются равные требования. - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.8.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.8.xml deleted file mode 100644 index 4db64daba5..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.8.xml +++ /dev/null @@ -1,14 +0,0 @@ - - -# 3.8. Поддержание уважительной обстановки - -[italic]Простое человеческое взаимоуважение игроков между друг другом.[/italic] - -- Запрещены оскорбления в адрес других игроков в ООС-чатах, как в прямой, так и в завуалированной форме. Равным образом запрещено использовать ООС-чаты для обсуждения политических, экстремистских, эротических и прочих резонансных тем. -- Что касается оскорблений в IC - нужно знать меру. Чрезмерные оскорбления могут вредить РП-атмосфере, и, кроме того, очевидно, что иногда они направлены на человека по другую сторону экрана. Назвать кого-то "омерзительной ящерицей" - это очевидно оскорбление персонажа, а оскорбления, направленные на умственные способности или компетентность, как правило, направлены на игрока. -- Преследование человека, который вам не нравится OOC во время игры с помощью различных методов, список которых включает, но не ограничивается созданием оскорбительных персонажей, наименованием животных ником/именем этого человека, упоминанием этого человека IC в рамках оскорбительной отсылки, "особым" вниманием в отношении персонажа этого человека IC в целях порчи раунда человеку без объективных внутрираундовых причин. -- Соблюдайте субординацию при общении с Администратором. Оскорбления в сторону Администратора могут привести к различным наказаниям: от блокировки определенных чатов, до игрового бана. - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.xml deleted file mode 100644 index b59857e77c..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule3.xml +++ /dev/null @@ -1,14 +0,0 @@ - - -# 3. Нарушение игровой атмосферы - -[italic]Действие игры происходит в далеком будущем на научной исследовательской станции, это значит, что поведение персонажей должно соответствовать данному сеттингу.[/italic] - -- Использование IC чатов для общения на ООС темы (политика, мемы и т.д.). Использование чата эмоций, для изображения различных нелицеприятных действий, действий с политическим подтекстом. Использование чата эмоций для прямого общения. Использование бумаги, консоли связи, консоли новостей для публикации различных рисунков с политическим, эротическим и нелицеприятным содержимым. Все приведенные примеры нарушают данное правило. -- Если ваш персонаж умер и вы берете другую роль, то вы полностью забываете свою прошлую жизнь, это также относится и к случаям, когда мозг вашего персонажа был помещен в борга. При гибели дионы и распаде ее на нимф игрок вправе отыграть вариант с утратой изначальных воспоминаний -- Ваш персонаж должен вести себя подобающе сеттингу игры. Бегать голым и кричать непотребства - явное нарушение атмосферы. -- Вашему персонажу положено помнить прожитые ранее смены, других членов экипажа и их действия, однако, под запрет идет память о негативе, включающем в себя воспоминания об антагонистах из прошлых смен и игроков, показавших себя с плохой стороны в различных аспектах отыгрыша. Стоит понимать, что для создания деятельностного объединения нужна причина, простых дружеских отношений с другими персонажами недостаточно. - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule4.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule4.xml deleted file mode 100644 index c31a358bd5..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule4.xml +++ /dev/null @@ -1,15 +0,0 @@ - - -# 4. Логика персонажей - -[italic]Ваш персонаж должен вести себя подобающе своей роли.[/italic] - -- При создании персонажа запрещено добавлять отчество и создавать длинные/нечитабельные имена. Запрещены имена и фамилии знаменитостей, актеров, персонажей из фильмов, сериалов, аниме, игр и т.д., а также схожие имена и фамилии. В связи с этим администрация может попросить сменить имя, но, если же вы его не смените, к вам могут быть применены меры. -- Корпорация NanoTrasen принимает к себе более-менее вменяемых сотрудников, поэтому ваш персонаж не может прибыть на станцию "агрессивным психом". Подобный отыгрыш должен быть умеренным и не включать в себя беспричинные убийства. -- NanoTrasen набирает в отделы СБ и командования лишь проверенный персонал, это значит, что ваш персонаж должен быть достаточно ответственным и поддерживать работу отдела на приемлемом уровне. Полное игнорирование своих обязанностей на данных ролях будет расценено, как нарушение. -- Для синтетиков допустимо отыгрывать дефектных боргов. Это не включает убийства людей, уничтожение станции и похожее. -- К сожалению, невозможно предусмотреть все ситуации, которые попадают под данное правило. По этой причине стоит помнить самый простой способ понять, будут ли ваши действия явно нарушать логику персонажа - задуматься, с какой целью ваш персонаж делает то или иное действие, имеет ли оно хоть толику здравого смысла, и оправдан ли ущерб, который может создать это действие. - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule6.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule6.xml deleted file mode 100644 index f871f57631..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule6.xml +++ /dev/null @@ -1,14 +0,0 @@ - - -# 6. Ответственная игра за антагониста - -[italic]Даже у антагонистов есть свои правила![/italic] - -- Помните, что цель антагониста - сделать раунд интересным, захватывающим и опасным, но в разумных пределах. Вы должны постараться что-то привнести в раунд, а не просто выполнить свои задачи и продолжить играть, как ни в чем не бывало. -- Агрессивный и шумный отыгрыш допустим для достижения собственных целей. Тем не менее, даже "шумный" стиль игры не дает вам право устраивать полномасштабные разрушения на станции(напр. выпуск сингулярности/теслы) и вырезать экипаж. -- Антагонистам запрещается поджидать только появившихся игроков, дайте им время на то, чтобы узнать обстановку на станции. -- Антагонисты-одиночки не обязаны помогать и сотрудничать друг с другом и могут свободно атаковать, мешать, подставлять друг друга. Групповые антагонисты - напротив, должны быть всегда заодно. - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule7.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule7.xml deleted file mode 100644 index 34aa8703ae..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule7.xml +++ /dev/null @@ -1,15 +0,0 @@ - - -# 7. Самоантагонизм - -[italic]Проявление действий, присущих антагонистам, без наличия соответствующей роли.[/italic] - -- Проявления качеств антагонистов, не имея соответствующей роли, допустимо, если ваши цели имеют IC обоснование, будь то собственная выгода или месть. Подобным же родом допустима помощь другим антагонистам. -- Для достижения поставленных целей запрещено каким-либо образом начинать открытую игру. Запрещено ставить себе цели, предполагающие ведение агрессивного и громкого отыгрыша. -- Если ваши действия привели к полномасштабному сопротивлению, то стоит оповестить администрацию. -- Запрещено полностью выводить случайных жертв, свидетелей или свои цели из раунда при достижении своих задач. -- Допустимо сопротивление аресту или вызволение кого-либо из отдела Службы Безопасности (брига и пермабрига), не применяя крайне летальные меры воздействия. - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule8.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule8.xml deleted file mode 100644 index ebca4e321e..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule8.xml +++ /dev/null @@ -1,13 +0,0 @@ - - -# 8. Валидхант - -[italic]Организация и ведение охоты на антагонистов.[/italic] - -- Допустимо заниматься ловлей антагонистов, если для этого есть обоснованные причины. -- При введении ЧС, объявлении от командования/СБ или открытой игре антагониста, вы можете начать вести за ним охоту. -- Если же вы видите, что в данный момент антагонист не представляет ни для кого прямой угрозы, и занят своими делами, но вы все равно решаете на него напасть - это будет явным нарушением правил. - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule9.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule9.xml deleted file mode 100644 index 0995611405..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LRPRule9.xml +++ /dev/null @@ -1,13 +0,0 @@ - - -# 9. ERP - -[italic]Эротическая ролевая игра (Erotic Role Play).[/italic] - -- Всё, что серьезнее поцелуев и обнимашек, считается ERP. По очевидным причинам, в правилах невозможно предугадать и перечислить все возможные вариации, поэтому используйте здравый смысл. Если администратор приказывает прекратить что-либо, что находится "на грани", вы должны прекратить немедленно. -- Данное правило касается эротических рассказов, которые ваш персонаж может написать в книгах, ленте новостей, на бумаге и прочих игровых носителях информации. -- В большинстве случаев нарушение данного правила приводит к перманентному бану. - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LrpRuleset.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LrpRuleset.xml deleted file mode 100644 index 98470c3cab..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/LrpRuleset.xml +++ /dev/null @@ -1,23 +0,0 @@ - - -# Правила Corvax - -Здесь описаны все основные правила для сервера [bold]Corvax Мейн[/bold] (Main). Все дополнительные правила (например таблицу навыков или правила спец. ролей) можно найти на вики [bold]station14.ru[/bold]. - - - [textlink="0. Не будь мудаком" link="CorvaxLRPRule0"] - - [textlink="1. Гриф" link="CorvaxLRPRule1"] - - [textlink="2. Убийство" link="CorvaxLRPRule2"] - - [textlink="3. Нарушение игровой атмосферы" link="CorvaxLRPRule3"] - - [textlink="3.2. Метагейм" link="CorvaxLRPRule32"] - - [textlink="3.4. IC в ООС" link="CorvaxLRPRule34"] - - [textlink="3.5. Мультиаккаунт" link="CorvaxLRPRule35"] - - [textlink="3.7. Безграмотность" link="CorvaxLRPRule37"] - - [textlink="3.8. Поддержание уважительной обстановки" link="CorvaxLRPRule38"] - - [textlink="4. Логика персонажей" link="CorvaxLRPRule4"] - - [textlink="6. Ответственная игра за антагониста" link="CorvaxLRPRule6"] - - [textlink="7. Самоантагонизм" link="CorvaxLRPRule7"] - - [textlink="8. Валидхант" link="CorvaxLRPRule8"] - - [textlink="9. ERP" link="CorvaxLRPRule9"] - - [textlink="10. Нечестная игра" link="CorvaxLRPRule10"] - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/PunishmentTypes.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/PunishmentTypes.xml index bc26197108..eed95edfba 100644 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/PunishmentTypes.xml +++ b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/PunishmentTypes.xml @@ -1,26 +1,26 @@ + # Игровые наказания -# Игровые наказания + [italic]Нарушение игровых правил наказуемо. Если вы нарушили правила, то после общения с представителем администрации в отношении вас может быть вынесено одно из нижеизложенных наказаний.[/italic] -[italic]Нарушение игровых правил наказуемо. Если вы нарушили правила, то после общения с представителем администрации в отношении вас может быть вынесено одно из нижеизложенных наказаний.[/italic] + - [bold]Заметка[/bold] (устное предупреждение) - минимальное наказание, которое может быть выдано за нарушение игровых правил. Как правило, выдается за незначительные нарушения при условии отсутствия ранних нарушений по нарушенным правилам, а также при условии, что нарушивший правила игрок полностью осознал суть своего нарушения. Заметка актуальна в течении [bold]одного месяца[/bold]. -- [bold]Заметка[/bold] (устное предупреждение) - минимальное наказание, которое может быть выдано за нарушение игровых правил. Как правило, выдается за незначительные нарушения при условии отсутствия ранних нарушений по нарушенным правилам, а также при условии, что нарушивший правила игрок полностью осознал суть своего нарушения. Заметка актуальна в течении [bold]одного месяца[/bold]. + - [bold]Варн[/bold] (предупреждение) - стандартная мера наказания за нарушение правил. Как правило, выдается за не очень серьезные нарушения, при условии, что игрок уже имеет наказания по нарушенным правилам, либо является рецидивистом. Варн актуален в течение [bold]трех месяцев[/bold], по истечении этого срока сгоревший варн не будет напрямую учитываться при повторном нарушении правил, но останется в виде записи в таблицы. -- [bold]Варн[/bold] (предупреждение) - стандартная мера наказания за нарушение правил. Как правило, выдается за не очень серьезные нарушения, при условии, что игрок уже имеет наказания по нарушенным правилам, либо является рецидивистом. Варн актуален в течение [bold]трех месяцев[/bold], по истечении этого срока сгоревший варн не будет напрямую учитываться при повторном нарушении правил, но останется в виде записи в таблицы. + - [bold]Бан роли[/bold] (джобка, джоббан) - мера наказания, которая временно либо навсегда ограничивает доступ к определенным игровым ролям. Как правило, применяется в случае повторного нарушения правил, либо при единократном, но серьезном нарушении. Важный нюанс при выдаче джоббана - наказание выдается за нарушения, связанные с серьезным отклонением отыгрыша важных ролей, за иные нарушения бан роли, как правило, не выдается. Записи в таблице о полученных джоббанах [bold]не утрачивают актуальности[/bold]. -- [bold]Бан роли[/bold] (джобка, джоббан) - мера наказания, которая временно либо навсегда ограничивает доступ к определенным игровым ролям. Как правило, применяется в случае повторного нарушения правил, либо при единократном, но серьезном нарушении. Важный нюанс при выдаче джоббана - наказание выдается за нарушения, связанные с серьезным отклонением отыгрыша важных ролей, за иные нарушения бан роли, как правило, не выдается. Записи в таблице о полученных джоббанах [bold]не утрачивают актуальности[/bold]. + - [bold]Временный бан[/bold] - мера наказания, полностью ограничивающая доступ к игре на основных серверах Corvax на определенный срок. В большинстве случаев данная мера наказания применяется к игрокам с большой историей нарушений, однако в случае серьезного нарушения может применяться и при первом нарушении. Записи о полученных банах в таблице наказаниях [bold]не утрачивают актуальности[/bold]. -- [bold]Временный бан[/bold] - мера наказания, полностью ограничивающая доступ к игре на основных серверах Corvax на определенный срок. В большинстве случаев данная мера наказания применяется к игрокам с большой историей нарушений, однако в случае серьезного нарушения может применяться и при первом нарушении. Записи о полученных банах в таблице наказаниях [bold]не утрачивают актуальности[/bold]. + - [bold]Бан для прохождения теста[/bold](перма для теста, ПДТ) - бессрочный бан, который может быть снят лишь при условии прохождения игроком специального теста. Применяется в исключительных случаях - в отношении игроков с большой историей нарушений, либо при единократном, но крайне серьезном нарушении. Важно отметить, что получение такого бана - половина пути к [bold]перманентному бану[/bold], в случае повторного серьезного нарушения, либо при получении множества банов после пройденного теста вас могут забанить [bold]насовсем[/bold]. Запись в таблице о пройденном тесте [bold]не утрачивает актуальности[/bold]. -- [bold]Бан для прохождения теста[/bold](перма для теста, ПДТ) - бессрочный бан, который может быть снят лишь при условии прохождения игроком специального теста. Применяется в исключительных случаях - в отношении игроков с большой историей нарушений, либо при единократном, но крайне серьезном нарушении. Важно отметить, что получение такого бана - половина пути к [bold]перманентному бану[/bold], в случае повторного серьезного нарушения, либо при получении множества банов после пройденного теста вас могут забанить [bold]насовсем[/bold]. Запись в таблице о пройденном тесте [bold]не утрачивает актуальности[/bold]. + - [bold]Перманентный бан (перма) - бессрочная игровая блокировка. Не стоит путать с [bold]ПДК[/bold] - баном, выдаваемым до тех пор, пока игрок не выйдет на связь для разбора спорной ситуации. Полноценный перманентный бан может быть снят [bold]минимум через полгода[/bold], возможность получения разбана и условия снятия блокировки рассматриваются индивидуально. Даже в случае успешной амнистии запись в таблице наказаний о полученном бане [bold]не утрачивает актуальности[/bold]. -- [bold]Перманентный бан (перма) - бессрочная игровая блокировка. Не стоит путать с [bold]ПДК[/bold] - баном, выдаваемым до тех пор, пока игрок не выйдет на связь для разбора спорной ситуации. Полноценный перманентный бан может быть снят [bold]минимум через полгода[/bold], возможность получения разбана и условия снятия блокировки рассматриваются индивидуально. Даже в случае успешной амнистии запись в таблице наказаний о полученном бане [bold]не утрачивает актуальности[/bold]. + + ## Обжалование наказаний + + [italic]Если вы получили одно из вышеизложенных наказаний, однако не согласны с вынесенным вердиктом, вы вправе написать обжалование в канале ⁠[bold]обжалования[/bold] в нашем дискорде, предварительно изучив правила написания обжалований.[/italic] + + ## Таблица наказаний + + [italic]*Все вышеизложенные нарушения, кроме устных предупреждений, фиксируются в специальной таблице наказаний, с которой вы всегда можете ознакомиться. Записи и цветные выделения полей, как правило, не удаляются, исключения возможны лишь в тех случаях, когда для изменения данных имеются веские причины.[/italic] - -## Обжалование наказаний - -[italic]Если вы получили одно из вышеизложенных наказаний, однако не согласны с вынесенным вердиктом, вы вправе написать обжалование в канале ⁠[bold]🙏│обжалования[/bold] в нашем дискорде, предварительно изучив правила написания обжалований.[/italic] - -## Таблица наказаний - -[italic]*Все вышеизложенные нарушения, кроме устных предупреждений, фиксируются в специальной таблице наказаний, с которой вы всегда можете ознакомиться. Записи и цветные выделения полей, как правило, не удаляются, исключения возможны лишь в тех случаях, когда для изменения данных имеются веские причины.[/italic] diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule0.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule0.xml deleted file mode 100644 index 90c6e727e5..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule0.xml +++ /dev/null @@ -1,15 +0,0 @@ - - -# 0. Не будь мудаком - -[italic]Правила не могут покрыть все возможные ситуации. Представители администрации должны иметь возможность решать ситуации, которые упущены в правилах.[/italic] - -- Слушайтесь представителей администрации. Представители администрации - это представители власти на сервере. Если они говорят вам чего-то не делать, то вы должны подчиниться, так как правила не могут покрыть все ситуации. Тем не менее, если вы считаете, что администратор злоупотребляет своими полномочиями, то вы вольны написать на него жалобу. -- [bold]Не пытайтесь пользоваться лазейками в правилах.[/bold] Самое важное в правилах - их дух. У нас не мировой суд, а РП-сервер про игру в 2D-космонавтов. Правила созданы для поддержания приятной атмосферы и интересного опыта игры. Нам не нужны люди, которые ухудшают игровой опыт других игроков. -- Запрещено использовать ники с неприемлемым содержимым: прямо оскорбляющие кого-то или выражающие нетерпимость в отношении конкретных лиц, групп людей, политической или религиозной сфер. Если администратор попросил вас сменить сикей, у вас будет три дня для его изменения, после чего вы будете забанены до тех пор, пока не смените ник. Сменить сикей можно на официальном сайте игры. -- Также запрещено намеренно врать администрации. Вас, конечно, не забанят за неточности в АХ, но отрицание очевидных фактов сделает лишь хуже. -- На нашем сервере практикуется политика нулевой терпимости к набегаторам, это значит, что за совершение набега вас [bold]ждет перманентный бан[/bold], причем вы можете быть забанены и за набеги на другие сервера. -- Если вы явно противопоставляете себя нашему игровому сообществу и получили [bold]бан в Discord[/bold], то вас также ждет блокировка в игре. - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule1.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule1.xml deleted file mode 100644 index 61f16f75c1..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule1.xml +++ /dev/null @@ -1,12 +0,0 @@ - - -# 1. Гриф - -[italic]Умышленная порча игрового процесса другим игрокам.[/italic] - -- Характерным отличием от других нарушений в данном случае является то, что нарушитель зачастую не извлекает из этого никакой пользы и не имеет за этим никаких причин, а совершает он это лишь для удовлетворения своего желания поднасрать. -- Также к этому правилу относятся события, которые привели к значительному ущербу игровому процессу, даже при условии, что эти события были вызваны без умысла испортить кому-то игру. Самый простой пример - непредумышленный выпуск сингулярности. - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule10.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule10.xml deleted file mode 100644 index 00d9c5261d..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule10.xml +++ /dev/null @@ -1,14 +0,0 @@ - - -# 10. Нечестная игра - -[italic]Использование программного обеспечения и недочетов игры для получения преимущества в игровом процессе.[/italic] - -- В любой игре всегда найдутся умельцы, которые смогут из своей задницы достать сингулярность или разогнать себя до огромной скорости с помощью невидимой стены. Иногда это весело и забавно, а иногда может обрушить сервер, сломав всё удовольствие от игры. Если вы нашли баг, то незамедлительно сообщите о нём в соответствующие каналы на сервере Discord. -- Запрещено использование багов, читов, скриптов, кликеров и прочего стороннего софта. -- Нельзя копировать, сохранять, распространять персонажей других игроков без их ведома и одобрения. Также это относится к умышленному подражанию имени и внешности чужих персонажей. -- Создание и хранение чрезмерно большого количества продукции (плоды, таблетки и т.д.), создающей значительную нагрузку на сервер, является нарушением данного правила. - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule2.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule2.xml deleted file mode 100644 index 5fc47d6348..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule2.xml +++ /dev/null @@ -1,15 +0,0 @@ - - -# 2. Убийство - -[italic]Неоправданные действия, направленные на причинение вреда здоровью или убийство другого человека. Нанести ущерб другому разумному существу - тяжелый поступок, на который сложно решиться без достаточных оснований.[/italic] - -- Для нанесения тяжкого ущерба здоровью другому разумному существу у вашего персонажа должна быть весомая причина. Например, серьезный личный конфликт. В таком случае вы можете устроить вашему оппоненту хорошую взбучку, но не убить его. Если вы перестарались, и ввели своего оппонента в критическое состояние, то вы должны проследить, чтобы ваша жертва получила медицинскую помощь. -- Кража имущества, пьяные драки и прочие незначительные моменты не должны приводить к серьезному ущербу кому-либо. Устроить небольшую взбучку воришке или хулигану можно, но все-же лучше сообщить об этом сотрудникам СБ. Если вы введете кого-то в критическое состояние за кражу пончика, это будет явным нарушением правил. -- Самооборона должна быть в первую очередь самообороной. Ваши действия в первую очередь должны быть направлены на защиту себя. Если ваш обидчик не в состоянии драться или отступает - дальнейшее продолжение конфликта будет нарушать данное правило. -- Убить кого-то - крайняя мера, подобный поступок должен иметь крайне весомое обоснование, например, очень серьезный личностный конфликт. Стоит учитывать, что умышленное раздувание конфликта с целью устроить резню - нарушение правил. Если вы намерены убить другого персонажа, то лучше спросите мнение администратора касательно данной ситуации, чтобы быть уверенным, что ваши действия не нарушат правила. -- Под действие данного правила также попадают все случаи косвенного убийства. Сюда можно отнести умышленное неоказание помощи умирающему персонажу, создание ситуаций, которые явно приводят к смерти другого персонажа. Например, кинуть мыло под ноги убегающего от зомби персонажа и т.д. - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.1.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.1.xml deleted file mode 100644 index 4b0dea4a42..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - -# 3.1. Повергейм - -[italic]Все персонажи имеют свои пределы, как физические, так и психологические.[/italic] - -- Каждый персонаж, будь то разумный гуманоид или не самый смышленый хомяк, испытывает страх за свою жизнь. Это значит, что каким бы персонажем вы не играли, вы не должны намеренно игнорировать смертельную опасность, или намеренно создавать угрозу своей жизни. -- Если ваш персонаж разумен, и он столкнулся с вооруженным человеком, то адекватной реакцией будет исполнение требований такого человека. Ведь единственная ошибка может стоить вам жизни! -- Намеренное нападение на опасных существ (дракон, ксеноморф, крысиный король и т.п.) с помощью подручных средств (лом, отвертка, баллон, топорик и т.д.) - явное нарушение данного правила. Адекватная реакция на такую угрозу - сбежать от нее, либо хотя бы наблюдать издалека. В случае нападения такого существа на вас и невозможности побега, вы можете применять подручные средства для самозащиты. -- Ваш персонаж - сотрудник передовой научной станции с высоким уровнем безопасности. Это значит, что у него нет ни единой причины прятать или носить при себе без какой-либо необходимости особо ценные предметы, а также превращать своей кабинет в крепость, болтируя шлюзы. Сюда же можно отнести создание припасов медикаментов и скафандров в самом начале раунда. Стоит отметить, что при наличии явной угрозы на станции, персонаж имеет право принять меры по обеспечению личной и имущественной безопасности. -- Взведенные бомбы - явно не то, с чем стоит взаимодействовать обычным членам экипажа, адекватной реакцией при виде бомбы будет побег. Обезвреживанием бомб должны заниматься сотрудники СБ, как первые защитники станции, либо инженеры и учёные, как специалисты в техничке, но только с использованием взрывостойкого снаряжения. Обезвреживание бомб обычными членами экипажа и без защитных средств допускается лишь в случаях прямой угрозы жизни, когда побег невозможен. -- Не стоит забывать, что при отыгрыше животных, вы должны вжиться в роль этого животного. Крохотный хомяк, который тянет за собой торговый автомат - не самое реалистичное зрелище. -- При схватке с крупными антагонистами возможны послабления по данному правилу, подробнее можно узнать на вики в разделе, посвященном антагонистам. - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.2.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.2.xml deleted file mode 100644 index deaf23cadc..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.2.xml +++ /dev/null @@ -1,12 +0,0 @@ - - -# 3.2. Метагейм - -[italic]Использование и/или распространение игровой информации посредством сторонних средств связи, либо непосредственно в игре из ООС чатов.[/italic] - -- Примеры: информация, полученная за госта, из ООС чата, из сообщения в Discord или через стримы. Стриминг как таковой не запрещен, однако желательно предупреждать администрацию, что вы собираетесь стримить. -- Кооперативная игра (КООП) является метагеймингом и карается более жестоко. Обучающий кооп разрешён, но предварительно предупредите администрацию об этом). - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.3.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.3.xml deleted file mode 100644 index dad3a20262..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.3.xml +++ /dev/null @@ -1,14 +0,0 @@ - - -# 3.3. Метазнания - -[italic]Ваш персонаж - не всезнайка, в связи с чем его знания и навыки имеют свои ограничения.[/italic] - -- Знания и навыки вашего персонажа ограничены и соответствуют его роли, подробно об этом можно узнать в таблице навыков на нашей вики. Стоить отметить, что какую бы предысторию вы не придумали своему персонажу, это не позволит получить ему дополнительные навыки. Для получения новых знаний во время раунда ваш персонаж должен обучиться им. -- Синдикат использует высокотехнологичное и замаскированное под обычные предметы снаряжение, это значит, что определение контрабанды и вражеского снаряжения является задачей, требующей определенных навыков. Даже информированные члены экипажа не могут знать всех хитростей, используемых синдикатом. -- На многих станциях имеется множество тайников и секретных мест, о расположении которых обычные члены экипажа никак не могут знать, исключением можно считать антагонистов. Узнать о таких тайниках можно в ходе удачного стечения обстоятельств, либо проявив свою наблюдательность в ходе изучения станции. Однако если вы побежите "изучать" какую-нибудь стену без логичных обоснований, то вам следует приготовиться к диалогу с администрацией. -- Ни один член экипажа, в том числе и антагонисты, не имеют не малейшего понятия о том, что такое код "Эпсилон" и чем занимаются оперативники подразделения "Танго". - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.4.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.4.xml deleted file mode 100644 index 8d6310afaa..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.4.xml +++ /dev/null @@ -1,15 +0,0 @@ - - -# 3.4. IC в ООС - -[italic]Злоупотребление ООС и LOOC чатами.[/italic] - -- Обсуждение или упоминание событий текущего раунда в канале OOC запрещено. Особенно наказуемы сообщения в духе "X меня убил" или "клонируйте меня". -- Это так же касается конференций, форумов и иных способов общения и распространения информации. Прежде чем публиковать туда любую информацию из раунда, например, для просьбы о снятии бана, дождитесь конца раунда. -- Вне игры разрешено обсуждать все, что можно увидеть из лобби, не заходя в игру. Это автоматические предупреждения о различных угрозах, а также список должностей. -- Администрация может игнорировать это правило, если это необходимо для разбора определенной ситуации или чего-то подобного. -- Также это правило относится и к LOOC, но его разрешается использовать для подсказок в механиках игры. - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.5.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.5.xml deleted file mode 100644 index 01ec2ad504..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.5.xml +++ /dev/null @@ -1,14 +0,0 @@ - - -# 3.5. Мультиаккаунт - -[italic]Использование нескольких аккаунтов SS14 для получения выгоды.[/italic] - -- Использование более одного аккаунта одновременно в раунде (мультибоксинг) запрещено. -- Использование дополнительных аккаунтов для обхода бана запрещено. Обходом бана считается любая попытка входа в игру с другого аккаунта при наличии бана на основном, даже если она была неудачной. -- Создание нового аккаунта с целью сокрытия своих предшествующих нарушений. Если вы создали новый аккаунт или сменили логин текущего, то постарайтесь уведомить об этом администрацию. -- Нарушение данного правила наказуемо [bold]перманентным баном[/bold]. - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.6.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.6.xml deleted file mode 100644 index 7095d4b38c..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.6.xml +++ /dev/null @@ -1,15 +0,0 @@ - - -# 3.6. Выход из роли - -- Намеренный уход от отыгрыша своей роли. Злоупотребление возможностью суицида или его совершение без веских причин. * -- Запрещено совершать суицид с помощью игровых механик или посредством команд после того, как вы были задержаны сотрудниками СБ или попали в плен антагониста. -- Лишение себя жизни - отчаянный поступок. Персонаж может решиться на подобное лишь в случаях, когда столкнулся с безысходной ситуацией - заразился смертельной болезнью, на станции присутствует непреодолимая и абсолютно смертельная угроза и т.д. -- При игре за роли командования, СБ и АВД в случае необходимости выйти из игры вы должны сообщить о своем уходе коллегам, предупредить администрацию в Ахелп и поместить вашего персонажа в капсулу криосна. Невыполнение указанных условий является нарушением правил. -- Выход из игры в начале раунда на постоянной основе нарушает данное правило. -- Запрещено без каких-либо явных внутриигровых причин применять команды ghost и suicide. Запрещено использовать капсулы криосна, если вы просто не хотите отыгрывать вашу роль. -- Выход из раунда и заход на другой сервер с учётом того, что персонаж остался на сервере, дабы получить желаемую роль, - считается рольхантингом и относится к этому правилу, при этом наказание за подобное действие может быть более строгим. - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.7.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.7.xml deleted file mode 100644 index 969144730f..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.7.xml +++ /dev/null @@ -1,13 +0,0 @@ - - -# 3.7. Безграмотность - -[italic]Чистота речи и соблюдение грамматических норм русского языка.[/italic] - -- Сложно говорить о какой-то ролевой атмосфере вообще, когда взрослые персонажи, работники научной станции, разговаривают как шестиклассники на перемене. -- Старайтесь допускать как можно меньше ошибок и говорить на приятном для чтения языке без слов, вроде "плз", "спс", и прочих "прив". Естественно, это относится лишь к здоровым персонажам, малограмотная речь которых ничем не аргументирована. -- Язык сервера - русский, и, вне зависимости от того, является он вам родным или нет, ко всем предъявляются равные требования. - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.8.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.8.xml deleted file mode 100644 index 744811ab32..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.8.xml +++ /dev/null @@ -1,14 +0,0 @@ - - -# 3.8. Поддержание уважительной обстановки - -[italic]Простое человеческое взаимоуважение игроков между друг другом.[/italic] - -- Запрещены оскорбления в адрес других игроков в ООС-чатах, как в прямой, так и в завуалированной форме. Равным образом запрещено использовать ООС-чаты для обсуждения политических, экстремистских, эротических и прочих резонансных тем. -- Что касается оскорблений в IC - нужно знать меру. Чрезмерные оскорбления могут вредить РП-атмосфере, и, кроме того, очевидно, что иногда они направлены на человека по другую сторону экрана. Назвать кого-то "омерзительной ящерицей" - это очевидно оскорбление персонажа, а оскорбления, направленные на умственные способности или компетентность, как правило, направлены на игрока. Администрация может потребовать вас угомониться, если это переходит рамки адекватного. -- Преследование человека, который вам не нравится OOC во время игры с помощью различных методов, список которых включает, но не ограничивается созданием оскорбительных персонажей, наименованием животных ником/именем этого человека, упоминанием этого человека IC в рамках оскорбительной отсылки, "особым" вниманием в отношении персонажа этого человека IC в целях порчи раунда человеку без объективных внутрираундовых причин. -- Соблюдайте субординацию при общении с Администратором. Оскорбления в сторону Администратора могут привести к различным наказаниям: от блокировки определенных чатов, до игрового бана на увеличенные сроки. В случае, если администратор не прав своими действиями, вместо оскорблений и выяснения отношений, обратитесь к Старшим Администраторам/напишите жалобу в соответствующий канал. - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.9.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.9.xml deleted file mode 100644 index 24def40140..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.9.xml +++ /dev/null @@ -1,12 +0,0 @@ - - -# 3.9. Окончание раунда - -[italic]Жизнь персонажей не заканчивается после манифеста.[/italic] - -- Все правила работают после окончания раунда/манифеста/гринтекста (окна с информацией в конце раунда). Незначительные нарушения и шалости, обусловленные окончанием раунда, могут привести к наказанию только по данному правилу, однако если вы решите устроить резню на станции Центкома, то вам следует быть готовым к серьезному наказанию по всем правилам, которые были нарушены в ходе устроенного вами безобразия! -- Стоить отметить, что события, которые начались [bold]до манифеста[/bold], но нарушили правила [bold]уже после манифеста[/bold], не попадают под действие данного правила. - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.xml deleted file mode 100644 index 4e7104db56..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule3.xml +++ /dev/null @@ -1,19 +0,0 @@ - - -# 3. Нарушение игровой атмосферы - -[italic]Действие игры происходит в далеком будущем на научной исследовательской станции, это значит, что поведение персонажей должно соответствовать данному сеттингу.[/italic] - -- Использование IC чатов для общения на ООС темы (политика, мемы и т.д.). Использование чата эмоций, для изображения различных нелицеприятных действий, действий с политическим подтекстом. Использование чата эмоций для прямого общения. Использование бумаги, консоли связи, консоли новостей для публикации различных рисунков с политическим, эротическим и нелицеприятным содержимым. Все приведенные примеры нарушают данное правило. -- Если ваш персонаж умер и вы берете другую роль, то вы полностью забываете свою прошлую жизнь, это также относится и к случаям, когда мозг вашего персонажа был помещен в борга. -- После смерти ваш персонаж забывает обстоятельства смерти. Помимо этого, если ваш персонаж был реанимирован дефибриллятором, вы забываете последние 2 минуты жизни, а если персонажа клонировали - то 5 минут. Это также применимо и к дионам: нимфа не помнит последние 2 минуты из жизни основного тела, если нимфа погибла и была реанирована, то она также забывает последние 2 минуты своей жизни. -- При гибели дионы и распаде ее на нимф игрок вправе отыграть вариант с утратой изначальных воспоминаний с возможностью отыгрыша другой личности. Стоит отметить, что помимо воспоминаний персонаж утрачивает и все навыки, кроме базовых, Выбор должен быть сделан сразу после распада и не может быть изменен. -- Мозго-машинный интерфейс наследует память гуманоида, забывая последние 5 минут жизни. Память позитронного мозга привязана к самому мозгу и сбрасывается перезагрузкой. -- Ваш персонаж должен вести себя подобающе сеттингу игры. Бегать голым и кричать непотребства - явное нарушение атмосферы. -- Все события прошлых раундов не имеют влияния не текущий. Личные отношения всех персонажей находятся на уровне знакомых. Максимум - вы можете знать кого-то как хорошего специалиста в своей области. -- Отыгрыш семейных отношений без написания теста недопустим. Однако даже с одобренной квентой на отношения ваш персонаж не должен ставить личные отношения превыше своих обязанностей и предоставлять какие-либо преимущества другим персонажам. Будучи ГСБ защищать свою супругу, которая оказалась агентом синдиката - не ок. -- Невозможно предусмотреть все действия, которые могут испортить атмосферу игры. По этой причине, стоит подумать дважды, прежде чем совершить какое-то экстраординарное действие. - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule4.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule4.xml deleted file mode 100644 index 1a356fef46..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule4.xml +++ /dev/null @@ -1,21 +0,0 @@ - - -# 4. Логика персонажей - -[italic]Ваш персонаж, кем бы он не был: человеком, или мышью, должен вести себя подобающе своей роли.[/italic] - -- Подойдите всерьёз к созданию своего персонажа. Имя и фамилия персонажа должны соответствовать его расе. При создании персонажа запрещено добавлять отчество, однако его упоминание допустимо при отыгрыше внутри раунда. Запрещены имена и фамилии знаменитостей, актеров, персонажей из фильмов, сериалов, аниме, игр и т.д., а так же схожие имена и фамилии. Равным образом запрещены нелепые имена (напр. Moon Luck). Если вы желаете отыгрывать персонажа с уникальным именем, то вас следует пройти специальный тест. -- Для таких ролей, как клоун и мим допустимо использование псевдонимов в качестве имени персонажа. Главное требование - они должны быть уместны для выбранной вами роли. Выбранный вами псевдоним все еще не должен отсылаться к известным личностям и персонажам. -- Вкладка с "Описанием" должна отображать только внешние черты вашего персонажа и ничего больше. Поэтому вы не можете описывать там вашу увлекательную историю или характер персонажа! -- Корпорация NanoTrasen перед приемом на работу проводит тщательное медицинское обследование своих сотрудников, которое включает в себя и психиатрические тесты. Это значит, что ваш персонаж не может прибыть на станцию "психом", "сумасшедшим" и т.д. Психическое состояние вашего персонажа может измениться из-за событий раунда, но изменения должны отыгрываться адекватно. -- Не забывайте, что кем бы не был ваш персонаж, он все еще просто нанятый работник, относитесь к своему начальнику подобающе, не нарушайте законы и СРП без логичных причин. Стоит отметить, что нарушение КЗ и СРП на большинстве ролей, обычно, является IC ситуацией, однако в исключительных случаях нарушения СРП могут быть расценены как нарушение логики персонажа. [color=#444444]TODO: Добавить гипперссылку на гайдбуки СРП и КЗ.[/color] -- NanoTrasen набирает в отделы СБ и командования лишь проверенный персонал, это значит, что ваш персонаж должен быть достаточно ответственным и не нарушать какие-либо нормы экипажа, если для этого нет весомых причин. Регулярное или серьезное нарушение СРП без весомых на то причин может быть расценено как нарушение. -- Капитан, АВД и должности ЦК тесно связаны с СРП, КЗ и ОПРС, что подразумевает безупречное знание данных документов, а также их надлежащее применение. Это значит, что при игре на перечисленных ролях, вы должны строго соблюдать данные нормы и не должны их нарушать без очень весомой причины. Беспричинное нарушение норм является нарушением правил. -- Не забывайте, какую роль вы отыгрываете. Если вы играете ученым или офицером СБ - то постоянную матершину и быдловатое поведение сложно назвать примером адекватного отыгрыша роли. Нестандартный отыгрыш роли (коррумпированный сотрудник СБ, капитан с не самыми высокими моральными принципами, персонаж с явными психическими отклонениями и т.д.) допустим с разрешения администрации. -- Если вам досталась роль животного, то именно его вы и должны отыгрывать. Проявлять чудеса интеллекта, будучи обычной мышью - явное нарушение правил. -- Для синтетиков и боргов законы ИИ абсолютны, неподчинение им нарушает логику персонажа. -- К сожалению, невозможно предусмотреть все ситуации, которые попадают под данное правило. По этой причине стоит помнить самый простой способ понять, будут ли ваши действия явно нарушать логику персонажа - задуматься, с какой целью ваш персонаж делает то или иное действие, имеет ли оно хоть толику здравого смысла, и оправдан ли ущерб, который может создать это действие. - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule6.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule6.xml deleted file mode 100644 index 3060033a69..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule6.xml +++ /dev/null @@ -1,20 +0,0 @@ - - -# 6. Ответственная игра за антагониста - -[italic]Даже у антагонистов есть свои правила![/italic] - -- Помните, что цель антагониста - сделать раунд интересным, захватывающим и опасным, но в разумных пределах. Вы должны постараться что-то привнести в раунд, а не просто выполнить свои задачи и продолжить играть, как ни в чем не бывало. -- Мелкие антагонисты засланы на станцию, как тайные агенты и должны стараться оставаться в таком же статусе. Если бы ваши наниматели (если они у вас есть) хотели взять станцию штурмом, то послали бы ударный отряд или что-то равное по силе. Если вы не готовы стараться скрываться, ловко врать, маневрировать по техам и виртуозно переодеваться, то не берите на себя бремя антагониста. -- Агрессивный и шумный отыгрыш допустим лишь в случаях, когда достижение поставленных вам задач невозможно иными способами, либо если вас уже разоблачили и ведут агрессивное преследование. Тем не менее, даже "шумный" стиль игры не дает вам права устраивать крупный саботаж и вырезать станцию. Помните, что громкая игра должна быть крайней мерой, а не основным стилем игры. Если ваши действия явно портят игру другим игрокам и не привносят в раунд ничего интересного, то вам стоит готовиться к диалогу с администратором. -- Антагонистам запрещается поджидать только появившихся игроков, дайте им время на то, чтобы узнать обстановку на станции. -- Цель "Завладейте эвакуационным шаттлом" полностью развязывает ваши руки в плане действий. Вы можете убивать, выпускать сингулярность, плазмафлудить, в общем-то делать всё для вызова шаттла эвакуации. Однако учитывайте, что правила затягивания работают как и на режиме Ядерных Оперативников. В течение 30-40 минут бездействия вы должны выполнить цель, в противном случае за вами прибудет ОБР, а в случае отсутствия администрации вы будете наказаны. -- Если вы не хотите играть за антагониста или если вам нужно внезапно уйти посреди раунда, сообщите об этом администрации. -- Антагонисты-одиночки не обязаны помогать и сотрудничать друг с другом и могут свободно атаковать, мешать, подставлять друг друга. Групповые антагонисты - напротив, должны быть всегда заодно. -- Выполнение целей на шаттле эвакуации и СЦК строго запрещено, так как не привносит в раунд ничего интересного. Исключением является цель "Завладейте эвакуационным шаттлом". -- Антагонисты животного типа относятся к мелким антагонистам. Они являются либо неразумными существами, либо имеют не слишком высокий уровень интеллекта. Это значит, что обычный паук или слайм никак не могут догадаться, что поломка серверов связи или консолей коммуникации нанесет ущерб экипажу. -- Каждый антагонист, будь он крупным или мелким, обладает своим уникальным сводом правил. Ознакомиться с ними можно на нашей вики. - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule7.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule7.xml deleted file mode 100644 index 4269bb6632..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule7.xml +++ /dev/null @@ -1,20 +0,0 @@ - - -# 7. Самоантагонизм - -[italic]Проявление действий, присущих антагонистам, без наличия соответствующей роли.[/italic] - -- Небольшие шалости и мелкие нарушения закона разрешены для неантагониста. Но если это негативно влияет на игровой процесс значительной части игроков или делается без достаточных IC оснований, это будет считаться самоантагонизмом. -- Обычные члены экипажа должны подходить к использованию взрывчатых веществ очень ответственно. Если вы не уверены в том, что использование взрывчатки оправданно, свяжитесь с администрацией и получите разрешение. -- Беспричинное хищение предметов особой ценности, как правило считается самоантагонизмом, поскольку буквально повторяет задания антагонистов. -- Вызволять кого-либо из отдела СБ (брига), будучи неантагонистом, можно только, если урон станции при этом будет незначительный. Выпускать кого-либо из камеры пожизненного заключения (пермабрига) можно только с разрешения Администратора. -- Сопротивление аресту, будучи неантагонистом, разрешено, но без применения летальной силы. Это относится и к попыткам побега из брига. -- Если вы саботируете работу СБ и вынуждаете их перекидывать силы и ресурсы с прямой, активной угрозы со стороны антагонистов, на вас, то это будет расценено как самоантагонизм. -- В некоторой степени помощь антагонистам разрешена, но это должна быть скорее "пассивная" помощь, и для этого нужны веские причины. Открыть для антагониста шлюз или закрыть глаза на подозрительную деятельность - нормально. Дать им бомбу - нет. -- Запрещено начинать революции и создавать агрессивные культы. Допустимо проводить протесты, пикеты, митинги и создавать мирные культы, пока это не приводит к насилию. -- Персонажам в целом не запрещено заниматься криминалом и нарушать закон, если они имеют логичные причины. Это допускает создание банд и прочих криминальных ячеек. Стоит отметить, что деятельность данных банд не должна создавать значительных угроз безопасности станции. -- Такие роли, как клоун и мим не освобождены от влияния данного правила. Да, юмор у всех свой, но это не значит, что вы можете явно нарушать законы и выполнять действия, свойственные для антагонистов, называя это шутками. - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule8.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule8.xml deleted file mode 100644 index 0dbb979482..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule8.xml +++ /dev/null @@ -1,16 +0,0 @@ - - -# 8. Валидхант - -[italic]Организация и ведение охоты на антагонистов, не будучи сотрудником службы безопасности.[/italic] - -- Останавливать антагонистов - работа СБ. Если вы не сотрудник СБ, то вы не должны заниматься охотой на антагонистов. Вы не должны бросать свою работу или свои планы, чтобы охотиться на антагониста. Однако вы можете защищать себя и своих коллег от нападения антагониста, если вы оказались очевидцем этого. -- Если же вы видите, что в данный момент антагонист не представляет ни для кого прямой угрозы, и занят своими делами, но вы все равно решаете на него напасть - это будет явным нарушением правил. -- Это правило не означает, что вы не можете защищаться или в принципе мешать антагонистам. Ключевой момент в том, что рядовые сотрудники не должны целенаправленно охотиться на антагонистов или специально искать ситуации, в которых можно "легитимно" его убить. -- Самый простой способ не перейти черту: если вы или ваш коллега были атакованы антагонистом, вы можете себя защищать. Если антагонист бросился бежать, не нужно его преследовать. Он больше не представляет угрозы. Не являясь сотрудником СБ, вы должны быть больше обеспокоены здоровьем себя или жертвы. При похищении погоня допустима, но вашей главной целью должно быть спасение жертвы, а не месть похитителю. -- Капитан или глава персонала не могут создать специальную "роль" и отменить это правило. Например, создать роль "Охотник на вампиров" и набрать в неё людей, не являющихся сотрудниками СБ. Если кто-то хочет действовать как СБ, то он должен вступить в СБ. -- При схватке с крупными антагонистами возможны послабления по данному правилу, подробнее можно узнать на вики в разделе, посвященном антагонистам. - - - - diff --git a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule9.xml b/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule9.xml deleted file mode 100644 index 7efec1d50f..0000000000 --- a/Resources/ServerInfo/Corvax/Guidebook/ServerRules/Rule9.xml +++ /dev/null @@ -1,16 +0,0 @@ - - -# 9. ERP - -[italic]Эротическая ролевая игра (Erotic Role Play).[/italic] - -- Всё, что серьезнее поцелуев и обнимашек, считается ERP. По очевидным причинам, в правилах невозможно предугадать и перечислить все возможные вариации, поэтому используйте здравый смысл. Если администратор приказывает прекратить что-либо, что находится "на грани", вы должны прекратить немедленно. -- Данное правило касается эротических рассказов, который ваш персонаж может написать в книгах, ленте новостей, на бумаге и прочих игровых носителях информации. -- В случае, если ваши романтические отношения вредят исполнению вашей работы (особенно, на должности члена командования или сотрудника СБ), то вам могут выдать предупреждение, а после и бан. -- Даже если вы единственный участник ERP, и никто вас не видит, это не отменяет факт нарушения. -- Наказание по данному правилу может настигнуть вас не сразу. Если вам не пишут, что вы должны остановиться, это не значит, что вы ничего не нарушаете, просто в данный момент администрация не видит ваше нарушение, однако позже факт нарушения непременно обнаружат. -- В большинстве случае нарушение данного правила приводит к [bold]перманентному бану[/bold]. - - - - From bfc0d8ef490f2bf7c5c8af9b2a2a12234cd7fe25 Mon Sep 17 00:00:00 2001 From: kosticia Date: Mon, 1 Dec 2025 13:12:31 +0300 Subject: [PATCH 105/106] =?UTF-8?q?=D0=9E=D1=82=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BB=D0=B5=D1=82=D0=BD=D0=B8=D1=85?= =?UTF-8?q?=20=D0=BB=D0=BE=D0=B1=D0=B1=D0=B8=D0=B0=D1=80=D1=82=D0=BE=D0=B2?= =?UTF-8?q?.=20=D0=9F=D0=BE=D1=87=D0=B8=D0=BD=D0=BA=D0=B0=20=D0=BB=D0=B8?= =?UTF-8?q?=D1=86=D0=B5=D0=BD=D0=B7=D0=B8=D0=B8=20(#3458)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Resources/Changelog/ChangelogSyndie.yml | 7 + Resources/Prototypes/Corvax/lobbyscreens.yml | 78 ++++++------ .../Corvax/LobbyScreens/attributions.yml | 120 +++++++++--------- 3 files changed, 106 insertions(+), 99 deletions(-) diff --git a/Resources/Changelog/ChangelogSyndie.yml b/Resources/Changelog/ChangelogSyndie.yml index 2aae2f857d..d2a3f25d76 100644 --- a/Resources/Changelog/ChangelogSyndie.yml +++ b/Resources/Changelog/ChangelogSyndie.yml @@ -4606,3 +4606,10 @@ id: 749 time: '2025-02-26T20:48:40.0000000+00:00' url: https://github.com/space-syndicate/space-station-14/pull/3019 +- author: kosticia + changes: + - message: "Убраны летние лобби-арты корвакса" + type: Remove + id: 750 + time: '2025-11-26T16:00:00.0000000+00:00' + url: https://github.com/space-syndicate/space-station-14/pull/3457 diff --git a/Resources/Prototypes/Corvax/lobbyscreens.yml b/Resources/Prototypes/Corvax/lobbyscreens.yml index ffec031688..da40e2bcbc 100644 --- a/Resources/Prototypes/Corvax/lobbyscreens.yml +++ b/Resources/Prototypes/Corvax/lobbyscreens.yml @@ -218,61 +218,61 @@ id: Security background: /Textures/Corvax/LobbyScreens/security.webp -- type: lobbyBackground - id: Summer2025GreytidePilgrim - background: /Textures/Corvax/LobbyScreens/summer2025-greytide-pilgrim.webp +#- type: lobbyBackground +# id: Summer2025GreytidePilgrim +# background: /Textures/Corvax/LobbyScreens/summer2025-greytide-pilgrim.webp -- type: lobbyBackground - id: Summer2025DragonLeash - background: /Textures/Corvax/LobbyScreens/summer2025-dragon-leash.webp +#- type: lobbyBackground +# id: Summer2025DragonLeash +# background: /Textures/Corvax/LobbyScreens/summer2025-dragon-leash.webp -- type: lobbyBackground - id: Summer2025ASecondBefore - background: /Textures/Corvax/LobbyScreens/summer2025-a-second-before.webp +#- type: lobbyBackground +# id: Summer2025ASecondBefore +# background: /Textures/Corvax/LobbyScreens/summer2025-a-second-before.webp -- type: lobbyBackground - id: Summer2025Why - background: /Textures/Corvax/LobbyScreens/summer2025-why.webp +#- type: lobbyBackground +# id: Summer2025Why +# background: /Textures/Corvax/LobbyScreens/summer2025-why.webp -- type: lobbyBackground - id: Summer2025ExtremeFishing - background: /Textures/Corvax/LobbyScreens/summer2025-extreme-fishing.webp +#- type: lobbyBackground +# id: Summer2025ExtremeFishing +# background: /Textures/Corvax/LobbyScreens/summer2025-extreme-fishing.webp - type: lobbyBackground id: Summer2025Expedition background: /Textures/Corvax/LobbyScreens/summer2025-expedition.webp -- type: lobbyBackground - id: Summer2025BeachGames - background: /Textures/Corvax/LobbyScreens/summer2025-beach-games.webp +#- type: lobbyBackground +# id: Summer2025BeachGames +# background: /Textures/Corvax/LobbyScreens/summer2025-beach-games.webp -- type: lobbyBackground - id: Summer2025Invite - background: /Textures/Corvax/LobbyScreens/summer2025-invite.webp +#- type: lobbyBackground +# id: Summer2025Invite +# background: /Textures/Corvax/LobbyScreens/summer2025-invite.webp -- type: lobbyBackground - id: Summer2025Afterparty - background: /Textures/Corvax/LobbyScreens/summer2025-afterparty.webp +#- type: lobbyBackground +# id: Summer2025Afterparty +# background: /Textures/Corvax/LobbyScreens/summer2025-afterparty.webp -- type: lobbyBackground - id: Summer2025Dome - background: /Textures/Corvax/LobbyScreens/summer2025-dome.webp +#- type: lobbyBackground +# id: Summer2025Dome +# background: /Textures/Corvax/LobbyScreens/summer2025-dome.webp -- type: lobbyBackground - id: Summer2025Crash - background: /Textures/Corvax/LobbyScreens/summer2025-crash.webp +#- type: lobbyBackground +# id: Summer2025Crash +# background: /Textures/Corvax/LobbyScreens/summer2025-crash.webp -- type: lobbyBackground - id: Summer2025Survivour - background: /Textures/Corvax/LobbyScreens/summer2025-survivour.webp +#- type: lobbyBackground +# id: Summer2025Survivour +# background: /Textures/Corvax/LobbyScreens/summer2025-survivour.webp -- type: lobbyBackground - id: Summer2025Syndicill - background: /Textures/Corvax/LobbyScreens/summer2025-syndicill.webp +#- type: lobbyBackground +# id: Summer2025Syndicill +# background: /Textures/Corvax/LobbyScreens/summer2025-syndicill.webp -- type: lobbyBackground - id: Summer2025WorksDone - background: /Textures/Corvax/LobbyScreens/summer2025-works-done.webp +#- type: lobbyBackground +# id: Summer2025WorksDone +# background: /Textures/Corvax/LobbyScreens/summer2025-works-done.webp - type: lobbyBackground id: SoleSurvivor diff --git a/Resources/Textures/Corvax/LobbyScreens/attributions.yml b/Resources/Textures/Corvax/LobbyScreens/attributions.yml index afe63c677c..cb4dbd482b 100644 --- a/Resources/Textures/Corvax/LobbyScreens/attributions.yml +++ b/Resources/Textures/Corvax/LobbyScreens/attributions.yml @@ -1,299 +1,299 @@ -- files: ["bar-life.png"] +- files: ["bar-life.webp"] license: "CC-BY-SA-3.0" copyright: "Арт#3355 (767380327432847391) on discord" source: "https://github.com/space-syndicate/space-station-14" -- files: ["into-space.png"] +- files: ["into-space.webp"] license: "CC-BY-SA-3.0" copyright: "Мефедрон#1144 (184388744558673920) on discord" source: "https://github.com/space-syndicate/space-station-14" -- files: ["jailbreak.png"] +- files: ["jailbreak.webp"] license: "CC-BY-SA-3.0" copyright: "Much#5032 (429934855913078786) on discord" source: "https://github.com/space-syndicate/space-station-14" -- files: ["space-mudaki.png"] +- files: ["space-mudaki.webp"] license: "CC-BY-SA-3.0" copyright: "Ivan_Gochin#2016 (865932328793800724) on discord" source: "https://github.com/space-syndicate/space-station-14" -- files: ["kosmologistika.png"] +- files: ["kosmologistika.webp"] license: "CC-BY-SA-3.0" copyright: "Drodn#1101 (372319756180520961) on discord" source: "https://github.com/space-syndicate/space-station-14" -- files: ["hydroponics.png"] +- files: ["hydroponics.webp"] license: "CC-BY-SA-3.0" copyright: "Nyan cat#9990 (864832778767958037) on discord" source: "https://github.com/space-syndicate/space-station-14" -- files: ["med-depart.png"] +- files: ["med-depart.webp"] license: "CC-BY-SA-3.0" copyright: "Vetochka (Вета Игрит)#1118 (532579764762837022) on discord" source: "https://github.com/space-syndicate/space-station-14" -- files: ["lizard-bar.png", "new-year-explosion.png"] +- files: ["lizard-bar.webp", "new-year-explosion.webp"] license: "CC-BY-SA-3.0" copyright: "mosley#6223 (498508581210161164) on discord" source: "https://github.com/space-syndicate/space-station-14" -- files: ["deadsquad.png"] +- files: ["deadsquad.webp"] license: "CC-BY-SA-3.0" copyright: "Medic tf2#8041 (1005420034417491968) on discord" source: "https://github.com/space-syndicate/space-station-14" -- files: ["singulord.png"] +- files: ["singulord.webp"] license: "CC-BY-SA-3.0" copyright: "Ast#5705 (580467222795780152) on discord" source: "https://github.com/space-syndicate/space-station-14" -- files: ["lofi.png"] +- files: ["lofi.webp"] license: "CC-BY-SA-3.0" copyright: "Buryatus#8143 (353797088007684097) on discord" source: "https://github.com/space-syndicate/space-station-14" -- files: ["russellmart.png"] +- files: ["russellmart.webp"] license: "CC-BY-SA-3.0" copyright: "Russell#3212 (269179522744713220) on discord" source: "https://github.com/space-syndicate/space-station-14" -- files: ["nukies-here.png"] +- files: ["nukies-here.webp"] license: "CC-BY-SA-3.0" copyright: "bib#5784 (807870054598967296) on discord" source: "https://github.com/space-syndicate/space-station-14" -- files: ["regular-shift.png", "engineers-chill.png", "singulord-cage.png", "xenosattack.png", "new-year-comfort.png", "new-year-penguins.png"] +- files: ["regular-shift.webp", "engineers-chill.webp", "singulord-cage.webp", "xenosattack.webp", "new-year-comfort.webp", "new-year-penguins.webp"] license: "CC-BY-SA-3.0" copyright: "Gasper_horned#9372 (428967480057397260) on discord" source: "https://github.com/space-syndicate/space-station-14" -- files: ["detective.png", "sidor.png"] +- files: ["detective.webp", "sidor.webp"] license: "CC-BY-SA-3.0" copyright: "Kukurudznik#0103 (513319174794248192) on discord" source: "https://github.com/space-syndicate/space-station-14" -- files: ["maintenance-clown.png"] +- files: ["maintenance-clown.webp"] license: "CC-BY-SA-3.0" copyright: "Nijn#5581 (436971507923681290) on discord" source: "https://github.com/space-syndicate/space-station-14" -- files: ["greytide.png"] +- files: ["greytide.webp"] license: "CC-BY-SA-3.0" copyright: "Giliof#5213 (412634509901824005) on discord" source: "https://github.com/space-syndicate/space-station-14" -- files: ["dead-in-space.png"] +- files: ["dead-in-space.webp"] license: "CC-BY-SA-3.0" copyright: "coffee with milk#3144 (416225940172046347) on discord" source: "https://github.com/space-syndicate/space-station-14" -- files: ["traitor.png"] +- files: ["traitor.webp"] license: "CC-BY-SA-3.0" copyright: "НезьныйКусь#2300 (346899091328073728) on discord" source: "https://github.com/space-syndicate/space-station-14" -- files: ["nukie-dudes.png"] +- files: ["nukie-dudes.webp"] license: "CC-BY-SA-3.0" copyright: "ROBUSTyanka#3178 (1012354394181861406) on discord" source: "https://github.com/space-syndicate/space-station-14" -- files: ["lost-and-powerless.png"] +- files: ["lost-and-powerless.webp"] license: "CC-BY-NC-SA-3.0" copyright: "~DreamlyJack~#2438 on discord" source: "https://discord.gg/vtRtT4PD" -- files: ["men-at-work.png"] +- files: ["men-at-work.webp"] license: "CC-BY-NC-SA-3.0" copyright: "~DreamlyJack~#2438 on discord" source: "https://discord.gg/vtRtT4PD" -- files: ["you-look-lonely.png"] +- files: ["you-look-lonely.webp"] license: "CC-BY-NC-SA-3.0" copyright: "~DreamlyJack~#2438 on discord" source: "https://discord.gg/vtRtT4PD" -- files: ["deathnettle.png"] +- files: ["deathnettle.webp"] license: "CC-BY-NC-SA-3.0" copyright: "werkas(684260199015514125) on discord" source: "https://discord.com/channels/919301044784226385/993679919550844938/1166054283981111296" -- files: ["fleshanom.png"] +- files: ["fleshanom.webp"] license: "CC-BY-NC-SA-3.0" copyright: "alisw_a(827540795249655808) on discord" source: "https://discord.com/channels/919301044784226385/993679919550844938/1163583606095093802" -- files: ["clownspider.png", "new-year-bar.png", "ai-mia.png"] +- files: ["clownspider.webp", "new-year-bar.webp", "ai-mia.webp"] license: "CC-BY-NC-SA-3.0" copyright: "ko4erga(266899933632659456) on discord" source: "https://github.com/space-syndicate/space-station-14" -- files: ["revenant.png"] +- files: ["revenant.webp"] license: "CC-BY-NC-SA-3.0" copyright: "mrzipka(631581871179956264) on discord" source: "https://discord.com/channels/919301044784226385/993679919550844938/1166578120694968361" -- files: ["xeno.png"] +- files: ["xeno.webp"] license: "CC-BY-NC-SA-3.0" copyright: "_sangoro_(892329132829065276) on discord" source: "https://discord.com/channels/919301044784226385/1073603532898435183/1162826046312284160" -- files: ["new-year-sec.png"] +- files: ["new-year-sec.webp"] license: "CC-BY-NC-SA-3.0" copyright: "davidskeleton25(622384072592982016) on discord" source: "https://github.com/space-syndicate/space-station-14" -- files: ["new-year-save.png"] +- files: ["new-year-save.webp"] license: "CC-BY-NC-SA-3.0" copyright: "phelcka(1097623862990077972) on discord" source: "https://github.com/space-syndicate/space-station-14" -- files: ["space-nuke.png"] +- files: ["space-nuke.webp"] license: "CC-BY-NC-SA-3.0" copyright: "FioDoSicH#0944(552047248200957973) on discord" source: "https://github.com/space-syndicate/space-station-14" -- files: ["new-year-pine.png", "arnold-intelligence.png"] +- files: ["new-year-pine.webp", "arnold-intelligence.webp"] license: "CC-BY-NC-SA-3.0" copyright: "kawoshechka(764422772158890014) on discord" source: "https://github.com/space-syndicate/space-station-14" -- files: ["new-year-party.png"] +- files: ["new-year-party.webp"] license: "CC-BY-NC-SA-3.0" copyright: "thevictorplumber(324927825524031510) on discord" source: "https://github.com/space-syndicate/space-station-14" -- files: ["new-year-nuke.png"] +- files: ["new-year-nuke.webp"] license: "CC-BY-NC-SA-3.0" copyright: "vladimir.s(602202476598394891) on discord" source: "https://github.com/space-syndicate/space-station-14" -- files: ["mimes-in-techs.png"] +- files: ["mimes-in-techs.webp"] license: "CC-BY-NC-SA-4.0" copyright: "zdhh(504340262344982529) on discord" source: "https://discord.com/channels/919301044784226385/1073603532898435183/1200152390578470932" -- files: ["nukie-war.png"] +- files: ["nukie-war.webp"] license: "CC-BY-NC-SA-3.0" copyright: "slvtr455(1181587899590922260) on discord" source: "https://github.com/space-syndicate/space-station-14" -- files: ["engineers-vs-zombies.png"] +- files: ["engineers-vs-zombies.webp"] license: "CC-BY-NC-SA-3.0" copyright: "ukrainianlad(852667075059253278) on discord" source: "https://github.com/space-syndicate/space-station-14" -- files: ["gray-tide.png"] +- files: ["gray-tide.webp"] license: "CC-BY-SA-3.0" copyright: "limemint(659313976877776896) on discord" source: "https://discord.com/channels/919301044784226385/1073603532898435183/1253009500944859227" -- files: ["silly-island.png"] +- files: ["silly-island.webp"] license: "CC-BY-NC-SA-4.0" copyright: "alexsandr_the_great2(1165521026579451935) on discord" source: "https://discord.com/channels/919301044784226385/1073603532898435183/1261290085287071914" -- files: ["echo-team.png"] +- files: ["echo-team.webp"] license: "CC-BY-NC-SA-4.0" copyright: "ukrainianlad(852667075059253278) on discord" source: "https://discord.com/channels/919301044784226385/1073603532898435183/1261290085287071914" -- files: ["you-are-not-funny.png"] +- files: ["you-are-not-funny.webp"] license: "CC-BY-NC-SA-4.0" copyright: "prazat911(984407438230945852) on discord" source: "https://discord.com/channels/919301044784226385/1073603532898435183/1304517587178356909" -- files: ["nar-sie.png"] +- files: ["nar-sie.webp"] license: "CC-BY-NC-SA-4.0" copyright: "ugog(865939150947352578) on discord" source: "https://discord.com/channels/919301044784226385/1285805300464619541" -- files: ["end.png"] +- files: ["end.webp"] license: "CC-BY-NC-SA-4.0" copyright: "ugog(865939150947352578) on discord" source: "https://discord.com/channels/919301044784226385/1073603532898435183/1331810986767810611" - files: ["cyborg-ninja.png"] + files: ["cyborg-ninja.webp"] license: "CC-BY-NC-SA-4.0" copyright: "golden_jerusalem(1069499652090642462) on discord" source: "https://discord.com/channels/919301044784226385/1073603532898435183/1301866927047577631" -- files: ["security.png"] +- files: ["security.webp"] license: "CC-BY-NC-SA-4.0" copyright: "qulezza(503167812047732751) on discord" source: "https://discord.com/channels/919301044784226385/1073603532898435183/1349383813494472796" -- files: ["summer2025-greytide-pilgrim.png"] +- files: ["summer2025-greytide-pilgrim.webp"] license: "CC-BY-NC-SA-4.0" copyright: "aalexshadow(663728566684614656) on discord" source: "https://discord.com/channels/919301044784226385/1073603532898435183/1379825805022199809" -- files: ["summer2025-dragon-leash.png"] +- files: ["summer2025-dragon-leash.webp"] license: "CC-BY-NC-SA-4.0" copyright: "dreamlyjack(624946166152298517) on discord" source: "https://discord.com/channels/919301044784226385/1073603532898435183/1380099636315815966" -- files: ["summer2025-a-second-before.png"] +- files: ["summer2025-a-second-before.webp"] license: "CC-BY-NC-SA-4.0" copyright: "mdegrante(331432472757665796) on discord" source: "https://discord.com/channels/919301044784226385/1073603532898435183/1381741907180519474" -- files: ["summer2025-why.png"] +- files: ["summer2025-why.webp"] license: "CC-BY-NC-SA-4.0" copyright: "mifi2069(996875656916910150) on discord" source: "https://discord.com/channels/919301044784226385/1073603532898435183/1381890586914852894" -- files: ["summer2025-extreme-fishing.png"] +- files: ["summer2025-extreme-fishing.webp"] license: "CC-BY-NC-SA-4.0" copyright: "macabreb(827868015465857064) on discord" source: "https://discord.com/channels/919301044784226385/1073603532898435183/1383067099584532652" -- files: ["summer2025-expedition.png"] +- files: ["summer2025-expedition.webp"] license: "CC-BY-NC-SA-4.0" copyright: "reynir_exe(1016704512221794354) on discord" source: "https://discord.com/channels/919301044784226385/1073603532898435183/1383160485699915866" -- files: ["summer2025-beach-games.png"] +- files: ["summer2025-beach-games.webp"] license: "CC-BY-NC-SA-4.0" copyright: "kog_markuss(834690530104967209) on discord" source: "https://discord.com/channels/919301044784226385/1073603532898435183/1383175738345128006" -- files: ["summer2025-invite.png"] +- files: ["summer2025-invite.webp"] license: "CC-BY-NC-SA-4.0" copyright: "artista.rar_furrista(765180556119113769) on discord" source: "https://discord.com/channels/919301044784226385/1073603532898435183/1383187138488565771" -- files: ["summer2025-afterparty.png"] +- files: ["summer2025-afterparty.webp"] license: "CC-BY-NC-SA-4.0" copyright: "ugog(865939150947352578) on discord" source: "https://discord.com/channels/919301044784226385/1073603532898435183/1383403043353264219" -- files: ["summer2025-dome.png"] +- files: ["summer2025-dome.webp"] license: "CC-BY-NC-SA-4.0" copyright: "zdhh(504340262344982529) on discord" source: "https://discord.com/channels/919301044784226385/1073603532898435183/1383530667408625784" -- files: ["summer2025-crash.png"] +- files: ["summer2025-crash.webp"] license: "CC-BY-NC-SA-4.0" copyright: "asc_art(846024754670600193) on discord" source: "https://discord.com/channels/919301044784226385/1073603532898435183/1383550082925990058" -- files: ["summer2025-survivour.png"] +- files: ["summer2025-survivour.webp"] license: "CC-BY-NC-SA-4.0" copyright: ".overlod(786688249425821719) on discord" source: "https://discord.com/channels/919301044784226385/1073603532898435183/1380214414296486031" -- files: ["summer2025-syndicill.png"] +- files: ["summer2025-syndicill.webp"] license: "CC-BY-NC-SA-4.0" copyright: "johi6640(552501686439116837) on discord" source: "https://discord.com/channels/919301044784226385/1073603532898435183/1380359138277589163" -- files: ["summer2025-works-done.png"] +- files: ["summer2025-works-done.webp"] license: "CC-BY-NC-SA-4.0" copyright: "033333312233(1355886882877341726) on discord" source: "https://discord.com/channels/919301044784226385/1073603532898435183/1383402660778217515" -- files: ["sole-survivor.png"] +- files: ["sole-survivor.webp"] license: "CC-BY-NC-SA-4.0" copyright: "rozycosmic(470913355775737856) on discord" source: "https://discord.com/channels/919301044784226385/1073603532898435183/1378477773085081804" From d9922d9e948b74f79fcf62ae7810a8011c93e2b8 Mon Sep 17 00:00:00 2001 From: Dmitry <57028746+DIMMoon1@users.noreply.github.com> Date: Tue, 2 Dec 2025 15:29:43 +0700 Subject: [PATCH 106/106] =?UTF-8?q?=D0=92=D1=83=D0=BB=D1=8C=D0=BF=D1=8B=20?= =?UTF-8?q?(#3461)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Mobs/Customization/Markings/vulpkanin.yml | 12 +- .../Corvax/Recipes/Cooking/meat_recipes.yml | 2 +- .../Prototypes/Corvax/Species/vulpkanin.yml | 2 +- Resources/Prototypes/Damage/modifier_sets.yml | 6 +- .../Entities/Mobs/Species/vulpkanin.yml | 124 ++++++++++++++---- .../Prototypes/SoundCollections/vulpkanin.yml | 5 + .../Prototypes/Species/species_weights.yml | 4 +- Resources/Prototypes/Species/vulpkanin.yml | 18 +-- 8 files changed, 126 insertions(+), 47 deletions(-) diff --git a/Resources/Prototypes/Corvax/Entities/Mobs/Customization/Markings/vulpkanin.yml b/Resources/Prototypes/Corvax/Entities/Mobs/Customization/Markings/vulpkanin.yml index a19308dfdc..4542b2c3d5 100644 --- a/Resources/Prototypes/Corvax/Entities/Mobs/Customization/Markings/vulpkanin.yml +++ b/Resources/Prototypes/Corvax/Entities/Mobs/Customization/Markings/vulpkanin.yml @@ -2,7 +2,7 @@ id: PawSocks markingCategory: Overlay bodyPart: RFoot #highest possible layer - speciesRestriction: [CorvaxVulpkanin] + speciesRestriction: [Vulpkanin] # Corvax-CorvaxVulp_Port CorvaxVulpkanin sponsorOnly: true # Corvax-Sponsors sprites: - sprite: Corvax/Mobs/Customization/vulpkanin.rsi @@ -12,7 +12,7 @@ id: FoxTail bodyPart: Tail markingCategory: Tail - speciesRestriction: [CorvaxVulpkanin] + speciesRestriction: [Vulpkanin] # Corvax-CorvaxVulp_Port CorvaxVulpkanin sponsorOnly: true # Corvax-Sponsors sprites: - sprite: Corvax/Mobs/Customization/vulpkanin.rsi @@ -24,7 +24,7 @@ id: FoxEar bodyPart: HeadTop markingCategory: HeadTop - speciesRestriction: [CorvaxVulpkanin] + speciesRestriction: [Vulpkanin] # Corvax-CorvaxVulp_Port CorvaxVulpkanin sponsorOnly: true # Corvax-Sponsors sprites: - sprite: Corvax/Mobs/Customization/vulpkanin.rsi @@ -36,7 +36,7 @@ id: WolfTail bodyPart: Tail markingCategory: Tail - speciesRestriction: [CorvaxVulpkanin] + speciesRestriction: [Vulpkanin] # Corvax-CorvaxVulp_Port CorvaxVulpkanin sponsorOnly: true # Corvax-Sponsors sprites: - sprite: Corvax/Mobs/Customization/vulpkanin.rsi @@ -48,7 +48,7 @@ id: FoxBelly bodyPart: Chest markingCategory: Chest - speciesRestriction: [CorvaxVulpkanin] + speciesRestriction: [Vulpkanin] # Corvax-CorvaxVulp_Port CorvaxVulpkanin sponsorOnly: true # Corvax-Sponsors sprites: - sprite: Corvax/Mobs/Customization/vulpkanin.rsi @@ -58,7 +58,7 @@ id: FoxSnout bodyPart: Snout markingCategory: Snout - speciesRestriction: [CorvaxVulpkanin] + speciesRestriction: [Vulpkanin] # Corvax-CorvaxVulp_Port CorvaxVulpkanin sponsorOnly: true # Corvax-Sponsors sprites: - sprite: Corvax/Mobs/Customization/vulpkanin.rsi diff --git a/Resources/Prototypes/Corvax/Recipes/Cooking/meat_recipes.yml b/Resources/Prototypes/Corvax/Recipes/Cooking/meat_recipes.yml index e381d15261..5761f01b31 100644 --- a/Resources/Prototypes/Corvax/Recipes/Cooking/meat_recipes.yml +++ b/Resources/Prototypes/Corvax/Recipes/Cooking/meat_recipes.yml @@ -22,4 +22,4 @@ FoodPlate: 1 FoodMeat: 1 FoodApple: 1 - HeadCorvaxVulpkanin: 1 + HeadCorvaxVulpkanin: 1 # не дай хрен оно сломается... diff --git a/Resources/Prototypes/Corvax/Species/vulpkanin.yml b/Resources/Prototypes/Corvax/Species/vulpkanin.yml index ec33041281..35ac719b6a 100644 --- a/Resources/Prototypes/Corvax/Species/vulpkanin.yml +++ b/Resources/Prototypes/Corvax/Species/vulpkanin.yml @@ -1,7 +1,7 @@ - type: species id: CorvaxVulpkanin name: species-name-vulpkanin - roundStart: True + roundStart: false sponsorOnly: false # Corvax-Sponsors prototype: MobCorvaxVulpkanin sprites: MobCorvaxVulpkaninSprites diff --git a/Resources/Prototypes/Damage/modifier_sets.yml b/Resources/Prototypes/Damage/modifier_sets.yml index ffd7bb66a9..708e717954 100644 --- a/Resources/Prototypes/Damage/modifier_sets.yml +++ b/Resources/Prototypes/Damage/modifier_sets.yml @@ -159,7 +159,7 @@ id: Card coefficients: Slash: 2.0 - Piercing: 0.1 # Holes easily poked through, but do little to structural integrity + Piercing: 0.1 # Holes easily poked through, but do little to structural integrity Heat: 3.0 - type: damageModifierSet @@ -336,5 +336,5 @@ - type: damageModifierSet id: Vulpkanin coefficients: - Heat: 1.15 - Cold: 0.85 + Heat: 1.30 #1.15 Corvax-CorvaxVulp_Port + Cold: 0.65 #0.85 Corvax-CorvaxVulp_Port diff --git a/Resources/Prototypes/Entities/Mobs/Species/vulpkanin.yml b/Resources/Prototypes/Entities/Mobs/Species/vulpkanin.yml index e34b295879..f8e0296c9d 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/vulpkanin.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/vulpkanin.yml @@ -10,7 +10,7 @@ - type: MessyDrinker spillChance: 0.33 - type: Icon - sprite: Mobs/Species/Vulpkanin/parts.rsi + sprite: Corvax/Mobs/Species/Vulpkanin/parts.rsi # Mobs/Species/Vulpkanin/parts.rsi # Corvax-CorvaxVulp_Port state: full - type: Body prototype: Vulpkanin @@ -121,33 +121,63 @@ sprite: Mobs/Species/Vulpkanin/displacement.rsi state: hair - type: Inventory - speciesId: vulpkanin + speciesId: vulpkanin #временно не corvaxvulpkanin Corvax-CorvaxVulp_Port + #vulpkanin Corvax-CorvaxVulp_Port start + femaleDisplacements: + jumpsuit: + sizeMaps: + 32: + sprite: Corvax/Mobs/Species/displacement.rsi + state: jumpsuit-female + shoes: + sizeMaps: + 32: + sprite: Corvax/Mobs/Species/displacement.rsi + state: shoes displacements: jumpsuit: sizeMaps: 32: - sprite: Mobs/Species/Vulpkanin/displacement.rsi + sprite: Corvax/Mobs/Species/displacement.rsi state: jumpsuit + shoes: + sizeMaps: + 32: + sprite: Corvax/Mobs/Species/displacement.rsi + state: shoes + outerClothing: + sizeMaps: + 32: + sprite: Corvax/Mobs/Species/displacement.rsi + state: outerclothing + ########################################## + #displacements: + # jumpsuit: + # sizeMaps: + # 32: + # sprite: Mobs/Species/Vulpkanin/displacement.rsi + # state: jumpsuit back: sizeMaps: 32: sprite: Mobs/Species/Vulpkanin/displacement.rsi state: back - outerClothing: - sizeMaps: - 32: - sprite: Mobs/Species/Vulpkanin/displacement.rsi - state: outerwear + #outerClothing: + # sizeMaps: + # 32: + # sprite: Mobs/Species/Vulpkanin/displacement.rsi + # state: outerwear gloves: sizeMaps: 32: sprite: Mobs/Species/Vulpkanin/displacement.rsi state: hand - shoes: - sizeMaps: - 32: - sprite: Mobs/Species/Vulpkanin/displacement.rsi - state: shoes + #shoes: + # sizeMaps: + # 32: + # sprite: Mobs/Species/Vulpkanin/displacement.rsi + # state: shoes + #vulpkanin Corvax-CorvaxVulp_Port end head: sizeMaps: 32: @@ -168,6 +198,20 @@ 32: sprite: Mobs/Species/Vulpkanin/displacement.rsi state: belt +#vulpkanin Corvax-CorvaxVulp_Port start + - type: ContentEye + targetZoom: "1.0, 1.0" + maxZoom: "1.0, 1.0" + - type: GrowlingAccent + - type: Wagging + - type: Respirator + damage: + types: + Asphyxiation: 2.0 + damageRecovery: + types: + Asphyxiation: -2.0 +#vulpkanin Corvax-CorvaxVulp_Port end - type: entity parent: [BaseSpeciesDummy] @@ -187,33 +231,63 @@ sprite: Mobs/Species/Vulpkanin/displacement.rsi state: hair - type: Inventory - speciesId: vulpkanin + speciesId: vulpkanin #временно не corvaxvulpkanin Corvax-CorvaxVulp_Port + #vulpkanin Corvax-CorvaxVulp_Port start + femaleDisplacements: + jumpsuit: + sizeMaps: + 32: + sprite: Corvax/Mobs/Species/displacement.rsi + state: jumpsuit-female + shoes: + sizeMaps: + 32: + sprite: Corvax/Mobs/Species/displacement.rsi + state: shoes displacements: jumpsuit: sizeMaps: 32: - sprite: Mobs/Species/Vulpkanin/displacement.rsi + sprite: Corvax/Mobs/Species/displacement.rsi state: jumpsuit + shoes: + sizeMaps: + 32: + sprite: Corvax/Mobs/Species/displacement.rsi + state: shoes + outerClothing: + sizeMaps: + 32: + sprite: Corvax/Mobs/Species/displacement.rsi + state: outerclothing + ########################################## + #displacements: + # jumpsuit: + # sizeMaps: + # 32: + # sprite: Mobs/Species/Vulpkanin/displacement.rsi + # state: jumpsuit back: sizeMaps: 32: sprite: Mobs/Species/Vulpkanin/displacement.rsi state: back - outerClothing: - sizeMaps: - 32: - sprite: Mobs/Species/Vulpkanin/displacement.rsi - state: outerwear + #outerClothing: + # sizeMaps: + # 32: + # sprite: Mobs/Species/Vulpkanin/displacement.rsi + # state: outerwear gloves: sizeMaps: 32: sprite: Mobs/Species/Vulpkanin/displacement.rsi state: hand - shoes: - sizeMaps: - 32: - sprite: Mobs/Species/Vulpkanin/displacement.rsi - state: shoes + #shoes: + # sizeMaps: + # 32: + # sprite: Mobs/Species/Vulpkanin/displacement.rsi + # state: shoes + #vulpkanin Corvax-CorvaxVulp_Port end head: sizeMaps: 32: diff --git a/Resources/Prototypes/SoundCollections/vulpkanin.yml b/Resources/Prototypes/SoundCollections/vulpkanin.yml index 89ce641f39..de3ea1f6a1 100644 --- a/Resources/Prototypes/SoundCollections/vulpkanin.yml +++ b/Resources/Prototypes/SoundCollections/vulpkanin.yml @@ -14,6 +14,11 @@ - /Audio/Voice/Vulpkanin/dog_growl4.ogg - /Audio/Voice/Vulpkanin/dog_growl5.ogg - /Audio/Voice/Vulpkanin/dog_growl6.ogg +# Corvax-CorvaxVulp_Port-Start + - /Audio/Corvax/Effects/Growl/growl1.ogg + - /Audio/Corvax/Effects/Growl/growl2.ogg + - /Audio/Corvax/Effects/Growl/growl3.ogg +# Corvax-CorvaxVulp_Port-End - type: soundCollection id: VulpkaninSnarls diff --git a/Resources/Prototypes/Species/species_weights.yml b/Resources/Prototypes/Species/species_weights.yml index a48eab7ced..18d014ba30 100644 --- a/Resources/Prototypes/Species/species_weights.yml +++ b/Resources/Prototypes/Species/species_weights.yml @@ -5,6 +5,6 @@ Human: 5 Reptilian: 4 SlimePerson: 4 - CorvaxVulpkanin: 4 # Corvax-Vulp + #CorvaxVulpkanin: 4 # Corvax-Vulp Diona: 2 - #Vulpkanin: 4 # Corvax-Vulp мы передумали :( + Vulpkanin: 4 diff --git a/Resources/Prototypes/Species/vulpkanin.yml b/Resources/Prototypes/Species/vulpkanin.yml index ee48734730..3bdffb42f2 100644 --- a/Resources/Prototypes/Species/vulpkanin.yml +++ b/Resources/Prototypes/Species/vulpkanin.yml @@ -1,15 +1,15 @@ - type: species id: Vulpkanin name: species-name-vulpkanin - roundStart: False + roundStart: True prototype: MobVulpkanin - sprites: MobVulpkaninSprites - defaultSkinTone: "#5a3f2d" + sprites: MobCorvaxVulpkaninSprites #MobVulpkaninSprites # Corvax-CorvaxVulp_Port + defaultSkinTone: "#eb943d" # "#5a3f2d" Corvax-CorvaxVulp_Port ибо нефиг markingLimits: MobVulpkaninMarkingLimits dollPrototype: MobVulpkaninDummy - skinColoration: VulpkaninColors - maleFirstNames: names_vulpkanin_male - femaleFirstNames: names_vulpkanin_female + skinColoration: Hues # VulpkaninColors Corvax-CorvaxVulp_Port + maleFirstNames: NamesVulpFirstMale # Corvax-CorvaxVulp_Port names_vulpkanin_male + femaleFirstNames: NamesVulpFirstFemale # Corvax-CorvaxVulp_Port names_vulpkanin_female maleLastNames: NamesVulpLast # Corvax-LastnameGender femaleLastNames: NamesVulpLast # Corvax-LastnameGender @@ -50,21 +50,21 @@ Snout: points: 1 required: true - defaultMarkings: [ VulpSnout ] + defaultMarkings: [ FoxSnout ] # VulpSnout Corvax-CorvaxVulp_Port SnoutCover: points: 3 required: false Tail: points: 1 required: true - defaultMarkings: [ VulpTailVulp ] + defaultMarkings: [ FoxTail ] # VulpTailVulp Corvax-CorvaxVulp_Port Head: points: 3 required: false HeadTop: points: 1 required: true - defaultMarkings: [ VulpEar ] + defaultMarkings: [ FoxEar ] # VulpEar Corvax-CorvaxVulp_Port UndergarmentTop: points: 1 required: false