From 7024e1daf09dc11813289f5178d1d987c4b53c09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C5=A1a=20Ceviel?= Date: Tue, 18 Nov 2025 12:27:35 +0300 Subject: [PATCH] =?UTF-8?q?=D1=82=D0=B5=D0=BC=D0=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AddressableAssetSettings.asset | 2 +- .../Assets/Code/Gameplay/Enemies/Cockroach.cs | 156 ++++ .../Assets/Resources/Scenes/Gameplay.unity | 300 +++++- .../Scenes/Gameplay/NavMesh-Platform.asset | Bin 7236 -> 0 bytes .../Gameplay/NavMesh-Platform.asset.meta | 8 - .../Resources/UI/Fonts/SOUTHGHETTO SDF.asset | 172 +++- .../UI/Fonts/VCR_OSD_MONO_1.001 SDF.asset | 875 +++++++++++++++++- .../LiberationSans SDF - Fallback.asset | 280 +++++- .../ProjectSettings/NavMeshAreas.asset | 6 +- .../ProjectSettings/TagManager.asset | 4 +- 10 files changed, 1754 insertions(+), 49 deletions(-) delete mode 100644 Game/CourierOld/Assets/Resources/Scenes/Gameplay/NavMesh-Platform.asset delete mode 100644 Game/CourierOld/Assets/Resources/Scenes/Gameplay/NavMesh-Platform.asset.meta diff --git a/Game/CourierOld/Assets/AddressableAssetsData/AddressableAssetSettings.asset b/Game/CourierOld/Assets/AddressableAssetsData/AddressableAssetSettings.asset index a398588..08a0783 100644 --- a/Game/CourierOld/Assets/AddressableAssetsData/AddressableAssetSettings.asset +++ b/Game/CourierOld/Assets/AddressableAssetsData/AddressableAssetSettings.asset @@ -15,7 +15,7 @@ MonoBehaviour: m_DefaultGroup: d447fc60305c17a17bf20948ab295a45 m_currentHash: serializedVersion: 2 - Hash: a73bab36f6f0172906557a562d766427 + Hash: 7a64d7a2af9d510237bf092fcbceb308 m_OptimizeCatalogSize: 0 m_BuildRemoteCatalog: 0 m_CatalogRequestsTimeout: 0 diff --git a/Game/CourierOld/Assets/Code/Gameplay/Enemies/Cockroach.cs b/Game/CourierOld/Assets/Code/Gameplay/Enemies/Cockroach.cs index e69de29..4f1a54b 100644 --- a/Game/CourierOld/Assets/Code/Gameplay/Enemies/Cockroach.cs +++ b/Game/CourierOld/Assets/Code/Gameplay/Enemies/Cockroach.cs @@ -0,0 +1,156 @@ +using UnityEngine; + +namespace Code.Gameplay.Enemies +{ + public class Cockroach : BaseEnemy + { + [Header("Cockroach-Specific")] + public float wallCheckDistance = 0.5f; + public float moveForce = 10f; + public float maxSpeed = 5f; + public LayerMask climbableLayers; // ← ← ← ТОЛЬКО для стен/пола (где ползать), НЕ для игрока! + + [SerializeField] private Rigidbody rb; + [SerializeField] private Transform model; // модель таракана (дочерний объект для поворота) + + private Vector3 surfaceNormal = Vector3.up; + private bool isPlayerDetected = false; + private Collider[] _overlapResults = new Collider[4]; // для переиспользования + + protected override void Awake() + { + base.Awake(); + + // Убираем NavMeshAgent — он не нужен для лазания + if (agent != null) + { + agent.enabled = false; + Destroy(agent); + agent = null; + } + + if (rb == null) + rb = GetComponent(); + + rb.useGravity = false; + rb.isKinematic = false; + rb.freezeRotation = true; + } + + protected override void Update() + { + if (!Player) return; + + HandleStun(); + HandleAttackCooldown(); + + if (IsStunned) return; + + DetectPlayer(); + HandleMovement(); + HandleAttack(); + } + + private void DetectPlayer() + { + // Ищем игрока по тегу через OverlapSphere — без LayerMask + int hits = Physics.OverlapSphereNonAlloc(transform.position, detectionRange, _overlapResults); + isPlayerDetected = false; + + for (int i = 0; i < hits; i++) + { + if (_overlapResults[i].CompareTag("Player")) + { + isPlayerDetected = true; + break; + } + } + } + + protected override void HandleMovement() + { + if (!isPlayerDetected) + { + rb.linearVelocity = Vector3.zero; + return; + } + + // Направление к игроку (проекция на горизонталь, чтобы не лез вверх/вниз резко) + Vector3 toPlayer = Player.transform.position - transform.position; + toPlayer = Vector3.ProjectOnPlane(toPlayer, surfaceNormal).normalized; + + // Raycast вниз и вперёд-вниз, чтобы найти поверхность + Vector3 rayOrigin = transform.position + transform.up * 0.1f; + bool foundSurface = false; + + // Основной луч вниз (относительно текущей ориентации) + if (Physics.Raycast(rayOrigin, -transform.up, out RaycastHit hit, wallCheckDistance * 2, climbableLayers)) + { + surfaceNormal = hit.normal; + foundSurface = true; + } + // Запасной — в мировой вниз (на случай, если "повернулся вверх ногами") + else if (Physics.Raycast(rayOrigin, -Vector3.up, out hit, wallCheckDistance * 2, climbableLayers)) + { + surfaceNormal = hit.normal; + foundSurface = true; + } + + // Если поверхность не найдена — не двигаемся (падаем или стоим) + if (!foundSurface) + return; + + // Поворачиваем модель так, чтобы "спина" смотрела от поверхности + if (model != null) + { + // Смотрим в сторону игрока, но "встаём" на поверхность + Quaternion targetRot = Quaternion.FromToRotation(Vector3.up, surfaceNormal); + Quaternion lookRot = Quaternion.LookRotation(toPlayer, surfaceNormal); + model.rotation = Quaternion.Slerp(model.rotation, targetRot * lookRot, Time.deltaTime * 12f); + } + + // Движение — в плоскости поверхности + Vector3 moveDir = Vector3.ProjectOnPlane(toPlayer, surfaceNormal).normalized; + Vector3 force = moveDir * moveForce; + rb.AddForce(force, ForceMode.Force); + rb.linearVelocity = Vector3.ClampMagnitude(rb.linearVelocity, maxSpeed); + } + + protected override void HandleAttack() + { + if (!Player || !isPlayerDetected) return; + + float distance = Vector3.Distance(transform.position, Player.transform.position); + if (distance <= attackRange && CanAttack) + { + DealDamage(); + } + } + + // Столкновение = -1 HP (по ТЗ) + private void OnCollisionEnter(Collision col) + { + if (col.gameObject.CompareTag("Player")) + { + PlayerHealth?.GetDamage(collisionDamage); + ApplyEffectsToPlayer(); + } + } + + private void OnDrawGizmosSelected() + { + Gizmos.color = Color.yellow; + Gizmos.DrawWireSphere(transform.position, detectionRange); + + Gizmos.color = Color.red; + Gizmos.DrawWireSphere(transform.position, attackRange); + + // Покажем направление поверхности в эдиторе (если запущено) + if (Application.isPlaying) + { + Gizmos.color = Color.cyan; + Gizmos.DrawLine(transform.position, transform.position + surfaceNormal * 0.4f); + } + } + } +} \ No newline at end of file diff --git a/Game/CourierOld/Assets/Resources/Scenes/Gameplay.unity b/Game/CourierOld/Assets/Resources/Scenes/Gameplay.unity index 80b9853..80c82c9 100644 --- a/Game/CourierOld/Assets/Resources/Scenes/Gameplay.unity +++ b/Game/CourierOld/Assets/Resources/Scenes/Gameplay.unity @@ -132,7 +132,7 @@ GameObject: - component: {fileID: 471754161} - component: {fileID: 471754159} m_Layer: 0 - m_Name: Cube + m_Name: Fog m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -243,7 +243,7 @@ GameObject: - component: {fileID: 545729163} - component: {fileID: 545729162} - component: {fileID: 545729166} - m_Layer: 0 + m_Layer: 6 m_Name: Platform m_TagString: Untagged m_Icon: {fileID: 0} @@ -296,7 +296,7 @@ MeshRenderer: m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: - - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + - {fileID: 2100000, guid: 115fc1c80dafb04e0a00ffed85cfb715, type: 2} m_StaticBatchInfo: firstSubMesh: 0 subMeshCount: 0 @@ -337,7 +337,7 @@ Transform: serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 2.31709, y: -0.68, z: -0.71633} - m_LocalScale: {x: 23.6, y: 1, z: 37.03} + m_LocalScale: {x: 100, y: 1, z: 100} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} @@ -361,19 +361,188 @@ MonoBehaviour: m_Center: {x: 0, y: 2, z: 0} m_LayerMask: serializedVersion: 2 - m_Bits: 4294967295 + m_Bits: 192 m_UseGeometry: 0 m_DefaultArea: 0 - m_GenerateLinks: 0 + m_GenerateLinks: 1 m_IgnoreNavMeshAgent: 1 m_IgnoreNavMeshObstacle: 1 m_OverrideTileSize: 0 m_TileSize: 256 m_OverrideVoxelSize: 0 m_VoxelSize: 0.16666667 - m_MinRegionArea: 2 - m_NavMeshData: {fileID: 23800000, guid: 1238ac2c7273e4b2680e254879b67031, type: 2} + m_MinRegionArea: 0 + m_NavMeshData: {fileID: 0} m_BuildHeightMesh: 0 +--- !u!1 &599793080 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 599793084} + - component: {fileID: 599793083} + - component: {fileID: 599793082} + - component: {fileID: 599793085} + - component: {fileID: 599793086} + - component: {fileID: 599793087} + m_Layer: 0 + m_Name: Cockroach + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &599793082 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 599793080} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &599793083 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 599793080} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &599793084 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 599793080} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 13.28, y: 0.28, z: 2.59241} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &599793085 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 599793080} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 119c0b675c944ed7ada6cdc8db4b04aa, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::Code.Gameplay.Enemies.Cockroach + collisionDamage: 1 + attackDamage: 3 + detectionRange: 10 + attackRange: 1.5 + speed: 1 + stunDuration: 3 + attackCooldown: 1.5 + agent: {fileID: 0} + enemyCollider: {fileID: 0} + wallCheckDistance: 0.5 + moveForce: 10 + maxSpeed: 5 + climbableLayers: + serializedVersion: 2 + m_Bits: 192 + rb: {fileID: 599793087} + model: {fileID: 599793084} +--- !u!65 &599793086 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 599793080} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!54 &599793087 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 599793080} + serializedVersion: 5 + m_Mass: 1 + m_LinearDamping: 0 + m_AngularDamping: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 0 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 --- !u!1 &1253837927 GameObject: m_ObjectHideFlags: 0 @@ -465,6 +634,117 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1571744439 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1571744443} + - component: {fileID: 1571744442} + - component: {fileID: 1571744441} + - component: {fileID: 1571744440} + m_Layer: 7 + m_Name: Wall + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 2147483647 + m_IsActive: 1 +--- !u!65 &1571744440 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1571744439} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1571744441 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1571744439} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: b407164ea2464a05a97202efff71afc6, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1571744442 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1571744439} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1571744443 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1571744439} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -5, y: 2.5, z: 0} + m_LocalScale: {x: 1, y: 5, z: 10} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1645301969 GameObject: m_ObjectHideFlags: 0 @@ -516,7 +796,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!195 &1719040499 NavMeshAgent: m_ObjectHideFlags: 0 @@ -661,4 +941,6 @@ SceneRoots: - {fileID: 1420420439} - {fileID: 1645301970} - {fileID: 471754163} + - {fileID: 599793084} - {fileID: 1719040504} + - {fileID: 1571744443} diff --git a/Game/CourierOld/Assets/Resources/Scenes/Gameplay/NavMesh-Platform.asset b/Game/CourierOld/Assets/Resources/Scenes/Gameplay/NavMesh-Platform.asset deleted file mode 100644 index b07402401f15f2561a8c7a90e94d8ca7314ad71e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7236 zcmbuDeT<}>sA&F}Y{nVmZ!YU#tZnppS~RbM=yz6<|q*vg)sp5^J~tEST8zjJeQ zi3GqKgmZI0d-IjIPn~(|?#`F`U!FYIaplwKeW^`|dBjMoga|QZPBubW$|4~W;>T?w z{AEIfN%T-8vq|KapfQ*fA-|Lt<@3Z}Ap7I!=X|IH4^gU=z>MXPe?6KPAuAoBf+#7! z7hgxqZF3>uZ+A$eFE&@6v`j3>l_c_Q?*e6Hbq>wjNtesulskMV>Uf_=}yX!`eJ z@{n3o!uk>^_=lOCK1}pA@;2$eMUX+?TuLrIW#+euJ23Z)$XxdaVmu-Kh`H<0Px&9j zw<|=UQ?vd~^mm;yl)9q&yU6QU^3S17{gnS9@~}Q2A(B%6PIQr97US&^`xlV+q0lKI zIwJO8j{d0r4)HzMXYA)WiSnd)0I~JaPumv8c)Ogx7yb0#M=X55=2uwwgPLDy;YT!I zWZ~b{e6fW;qxnZI{O6iqW#K0@zuLlI(7fBif3Nw+Ec{i?dCsH$SN_EvApLudg}<)( zCoKG*nlG{NcQpT`g?AvhjPJEgybZmb085b9fL({&8KTh1+%K!adHz0y%zb1M`7!MM zAI0-5lfXa)0K*xqsJM__XGI7GBXjYvI1;{T9Ak^K}-!PxAo_zen>y3*WE# zEf#*i=C@k-LCuFO{1MIhI~w)B^6z2IH(2=Nn%`#OPicO;g&)5_b2Ozk?j*>=of#(9gHiM2xpf|IC5YKa-Moqg09Vk72&? zPY&IkqFYm?pWOJzwQ%E~sTf!KFKScz^D!RP&v)wi^cO7L=!c)0=BxO0K|lBBG0+ON3r|CcP> z*zd)-(vQFKWc<}Tyc?rbYStg1`+WMV7H;(Kit+jKeoI3?cj|7*QRu|;$@f98=CkOJ z`cK_oE5RARJ>;RDj8F6Z#lIt>@r&MH`^f9lF~3a=Lbi$Dmt#CB<98><@cev5@@|wW z@qTWM-&fHc^`GJ^8L0CJOOsUh2N|BH)5Q#MEEE;@3#loYDj$l^ZqyY+czca zu8m-P8{>1(!i|3(v~c5}hhkjmH}~7aF&@?bh=m*dhb-La|5l7A#96#Aj=?|l`=c?g z{ysAI`(X<=`X94!qyLD7{}lSUKfWE~SRdkZ9GvIp@feS;?>iQ5*7t;koAo^z;|Y1c zoY3ogO7eQK$=S8h^>+?9fg^^818?FfyrBHO&51=ya1UpfY z2jDBHHy)`XlO{;rSY1Y()f_$?-Ubz0@uH*XS=SXOeJk98B^&s zl@+G4(o|NN$_=J+qp76oqHD5KHQ}k6^i)lJ3i9>3`>TawZp00OLOJi(ZHsn0dAA&l z?wO%;WPOX1D^z_|A94%%oq?*46e}~Xs;(;*N)w{!=JM`+kH;*7>J=YN>r(AW4>)c{-q_Ec&lcu8j>2=v3n92lAQ1a<|%%9y*nb=nG zrd`h$GoI_a-Y!>0YjZX53puyHQZ46dp_8@_xD(ZU%?~-YxFL#;^oo*Ra%Ox{tIBBm zRd33fbVnvjGiYbf&Y+#ih(O7a z!VCVEO5g-;4lAkKhdozs=q)$qdO=|lWLE4Edog@{IVantacyg9d>vxwdSG(P2dHeS zP)lHFj#6~CZ|WgE61548ND5T~x=ziR3!$6M+DOuSh2 z!B{q2bb_ghSEATgk;k%|2FUq1VM0}|gxoBIKa9*{Ti2Y%=j7PdBm9a?=5QasLY(S* z?%DL|v8|W${{u2L*AwE&GA&dDxQdKmhohtvh5Js zrY?kuA^Ylej;Y5}gdHI{6LnrlJcW!W|9pw37rWm5`;K2s|L5iF^GmM2X7<;Ob~cVS zy7*->cB+;*$*+lLD?97)Jd~~1)oc^zh@C(kVKT($g6w2Gg