From 8d6ef16625f51bf2397ba1cc09911e6967c907d7 Mon Sep 17 00:00:00 2001 From: Glence Date: Sun, 5 Mar 2023 23:48:25 +0800 Subject: [PATCH 1/2] Hot fix Pause menu fix Offing gameplay UI on preview level clipping of mouse change some keydown to keyup --- Assets/Scenes/Level1.shade | 14 +- Assets/Scenes/Level2.shade | 1 + Assets/Scenes/Level3.shade | 187 +++++++++--------- .../Implemented/LeafNodes/LeafSearch.cs | 6 +- Assets/Scripts/Gameplay/SC_GameManager.cs | 33 +++- Assets/Scripts/Gameplay/SC_PreviewLevel.cs | 7 + Assets/Scripts/UI/SC_CutSceneEnd.cs | 6 +- Assets/Scripts/UI/SC_CutsceneIntro.cs | 8 +- Assets/Scripts/UI/SC_MainMenu.cs | 20 -- Assets/Scripts/UI/SC_PauseMenu.cs | 5 +- .../src/Application/SBApplication.cpp | 2 - .../MiddleEnd/Interface/SHGraphicsSystem.cpp | 5 + 12 files changed, 154 insertions(+), 140 deletions(-) diff --git a/Assets/Scenes/Level1.shade b/Assets/Scenes/Level1.shade index e41192bc..e565b531 100644 --- a/Assets/Scenes/Level1.shade +++ b/Assets/Scenes/Level1.shade @@ -2544,7 +2544,7 @@ Collider Component: Colliders: - Is Trigger: false - Collision Tag: 0 + Collision Tag: 1 Type: Box Half Extents: {x: 1.79999995, y: 1, z: 4} Friction: 0.400000006 @@ -2553,7 +2553,7 @@ Position Offset: {x: 0, y: 0.550000012, z: 0} Rotation Offset: {x: 0, y: 0, z: 0} - Is Trigger: false - Collision Tag: 0 + Collision Tag: 1 Type: Box Half Extents: {x: 1.79999995, y: 1, z: 2.70000005} Friction: 0.400000006 @@ -4865,9 +4865,9 @@ NumberOfChildren: 5 Components: Transform Component: - Translate: {x: -8, y: 1.142977, z: -4} + Translate: {x: -8, y: 0.899999976, z: -4} Rotate: {x: -0, y: 1.57079649, z: 0} - Scale: {x: 0.999999881, y: 1, z: 0.999999881} + Scale: {x: 0.999965608, y: 1, z: 0.999965608} IsActive: true Renderable Component: Mesh: 149697411 @@ -4978,7 +4978,7 @@ armLength: 3 turnSpeedPitch: 0.200000003 turnSpeedYaw: 0.400000006 - inverseXControls: false + inverseXControls: true inverseYControls: false pitchUpperClamp: 45 pitchLowerClamp: 5 @@ -5097,6 +5097,7 @@ endPoint2: [1, 1.5, -7.5] endPoint3: [2.5, 1.5, -3] playerCamera: 65730 + gameplayCanvas: 459 duration: 3 - EID: 453 Name: PreviewLevel1 @@ -5193,7 +5194,6 @@ Default Texture: 63979907 Hovered Texture: 51379325 Clicked Texture: 66788278 - current texture: 0 IsActive: true UI Component: Canvas ID: 458 @@ -5227,7 +5227,6 @@ Default Texture: 61602036 Hovered Texture: 58910810 Clicked Texture: 57786063 - current texture: 0 IsActive: true UI Component: Canvas ID: 458 @@ -5261,7 +5260,6 @@ Default Texture: 64806384 Hovered Texture: 58347825 Clicked Texture: 63234380 - current texture: 0 IsActive: true UI Component: Canvas ID: 458 diff --git a/Assets/Scenes/Level2.shade b/Assets/Scenes/Level2.shade index d6f58ab0..d068f3ca 100644 --- a/Assets/Scenes/Level2.shade +++ b/Assets/Scenes/Level2.shade @@ -14082,6 +14082,7 @@ endPoint2: [0, 2, 4.5] endPoint3: [1.14999998, 2.20000005, 2] playerCamera: 4 + gameplayCanvas: 199 duration: 3 - EID: 555 Name: PreviewLevel1 diff --git a/Assets/Scenes/Level3.shade b/Assets/Scenes/Level3.shade index a0782c68..e7ece081 100644 --- a/Assets/Scenes/Level3.shade +++ b/Assets/Scenes/Level3.shade @@ -29,7 +29,7 @@ - EID: 449 Name: Enviroment IsActive: true - NumberOfChildren: 9 + NumberOfChildren: 13 Components: ~ Scripts: ~ - EID: 78 @@ -5690,6 +5690,98 @@ Rotation Offset: {x: 0, y: 0, z: 0} IsActive: true Scripts: ~ +- EID: 469 + Name: Level2FenceCollider + IsActive: true + NumberOfChildren: 0 + Components: + Transform Component: + Translate: {x: 1.93802273, y: 2.39508605, z: 4.01721716} + Rotate: {x: 0, y: 0, z: 0} + Scale: {x: 1, y: 1, z: 1} + IsActive: true + Collider Component: + Colliders: + - Is Trigger: false + Collision Tag: 1 + Type: Box + Half Extents: {x: 6, y: 0.5, z: 0.150000006} + Friction: 0.400000006 + Bounciness: 0 + Density: 1 + Position Offset: {x: 0, y: 0, z: 0} + Rotation Offset: {x: 0, y: 0, z: 0} + IsActive: true + Scripts: ~ +- EID: 463 + Name: KitchenLargeClosedWindowCollider + IsActive: true + NumberOfChildren: 0 + Components: + Transform Component: + Translate: {x: 0, y: 0, z: 0} + Rotate: {x: 0, y: 0, z: 0} + Scale: {x: 1, y: 1, z: 1} + IsActive: true + Collider Component: + Colliders: + - Is Trigger: false + Collision Tag: 0 + Type: Box + Half Extents: {x: 4.01900005, y: 1.10099995, z: 0.147} + Friction: 0.400000006 + Bounciness: 0 + Density: 1 + Position Offset: {x: 1.96599996, y: 1.49399996, z: -0.966000021} + Rotation Offset: {x: 0, y: 0, z: 0} + IsActive: true + Scripts: ~ +- EID: 467 + Name: Level2Table + IsActive: true + NumberOfChildren: 0 + Components: + Transform Component: + Translate: {x: 2.11160159, y: 2.4000001, z: 1.2985332} + Rotate: {x: 0, y: 0, z: 0} + Scale: {x: 1, y: 1, z: 1} + IsActive: true + Collider Component: + Colliders: + - Is Trigger: false + Collision Tag: 1 + Type: Box + Half Extents: {x: 2.20000005, y: 0.5, z: 1.29999995} + Friction: 0.400000006 + Bounciness: 0 + Density: 1 + Position Offset: {x: 0, y: 0, z: 0} + Rotation Offset: {x: 0, y: 0, z: 0} + IsActive: true + Scripts: ~ +- EID: 468 + Name: Level2FenceCollider + IsActive: true + NumberOfChildren: 0 + Components: + Transform Component: + Translate: {x: 4.9960146, y: 2.39508605, z: 2.69112468} + Rotate: {x: 0, y: 0, z: 0} + Scale: {x: 1, y: 1, z: 1} + IsActive: true + Collider Component: + Colliders: + - Is Trigger: false + Collision Tag: 1 + Type: Box + Half Extents: {x: 0.200000003, y: 0.5, z: 2.5} + Friction: 0.400000006 + Bounciness: 0 + Density: 1 + Position Offset: {x: 0, y: 0, z: 0} + Rotation Offset: {x: 0, y: 0, z: 0} + IsActive: true + Scripts: ~ - EID: 553 Name: TweenManager IsActive: true @@ -6439,6 +6531,7 @@ endPoint2: [5, 3.5, 0.5] endPoint3: [-0.5, 1.5, 3.5] playerCamera: 66063 + gameplayCanvas: 526 duration: 3 - EID: 555 Name: PreviewLevel1 @@ -9090,96 +9183,4 @@ Rotate: {x: 0, y: 0, z: 0} Scale: {x: 1, y: 1, z: 1} IsActive: true - Scripts: ~ -- EID: 469 - Name: Level2FenceCollider - IsActive: true - NumberOfChildren: 0 - Components: - Transform Component: - Translate: {x: 1.93802273, y: 2.39508605, z: 4.01721716} - Rotate: {x: -0, y: 0, z: -0} - Scale: {x: 1, y: 1, z: 1} - IsActive: true - Collider Component: - Colliders: - - Is Trigger: false - Collision Tag: 1 - Type: Box - Half Extents: {x: 6, y: 0.5, z: 0.150000006} - Friction: 0.400000006 - Bounciness: 0 - Density: 1 - Position Offset: {x: 0, y: 0, z: 0} - Rotation Offset: {x: 0, y: 0, z: 0} - IsActive: true - Scripts: ~ -- EID: 468 - Name: Level2FenceCollider - IsActive: true - NumberOfChildren: 0 - Components: - Transform Component: - Translate: {x: 4.9960146, y: 2.39508605, z: 2.69112468} - Rotate: {x: -0, y: 0, z: -0} - Scale: {x: 1, y: 1, z: 1} - IsActive: true - Collider Component: - Colliders: - - Is Trigger: false - Collision Tag: 1 - Type: Box - Half Extents: {x: 0.200000003, y: 0.5, z: 2.5} - Friction: 0.400000006 - Bounciness: 0 - Density: 1 - Position Offset: {x: 0, y: 0, z: 0} - Rotation Offset: {x: 0, y: 0, z: 0} - IsActive: true - Scripts: ~ -- EID: 467 - Name: Level2Table - IsActive: true - NumberOfChildren: 0 - Components: - Transform Component: - Translate: {x: 2.11160159, y: 2.4000001, z: 1.2985332} - Rotate: {x: -0, y: 0, z: -0} - Scale: {x: 1, y: 1, z: 1} - IsActive: true - Collider Component: - Colliders: - - Is Trigger: false - Collision Tag: 1 - Type: Box - Half Extents: {x: 2.20000005, y: 0.5, z: 1.29999995} - Friction: 0.400000006 - Bounciness: 0 - Density: 1 - Position Offset: {x: 0, y: 0, z: 0} - Rotation Offset: {x: 0, y: 0, z: 0} - IsActive: true - Scripts: ~ -- EID: 463 - Name: KitchenLargeClosedWindowCollider - IsActive: true - NumberOfChildren: 0 - Components: - Transform Component: - Translate: {x: 0, y: 0, z: 0} - Rotate: {x: 0, y: 0, z: 0} - Scale: {x: 1, y: 1, z: 1} - IsActive: true - Collider Component: - Colliders: - - Is Trigger: false - Collision Tag: 0 - Type: Box - Half Extents: {x: 4.01900005, y: 1.10099995, z: 0.147} - Friction: 0.400000006 - Bounciness: 0 - Density: 1 - Position Offset: {x: 1.96599996, y: 1.49399996, z: -0.966000021} - Rotation Offset: {x: 0, y: 0, z: 0} - IsActive: true Scripts: ~ \ No newline at end of file diff --git a/Assets/Scripts/Gameplay/AIBehaviour/Implemented/LeafNodes/LeafSearch.cs b/Assets/Scripts/Gameplay/AIBehaviour/Implemented/LeafNodes/LeafSearch.cs index c433f912..2aebc3b7 100644 --- a/Assets/Scripts/Gameplay/AIBehaviour/Implemented/LeafNodes/LeafSearch.cs +++ b/Assets/Scripts/Gameplay/AIBehaviour/Implemented/LeafNodes/LeafSearch.cs @@ -107,6 +107,7 @@ public partial class LeafSearch : BehaviourTreeNode SetNodeData("isAlert", false); status = BehaviourTreeNodeStatus.FAILURE; onExit(BehaviourTreeNodeStatus.FAILURE); + screamOnce = false; return status; } else @@ -128,6 +129,7 @@ public partial class LeafSearch : BehaviourTreeNode //handleChaseStop(); status = BehaviourTreeNodeStatus.FAILURE; onExit(BehaviourTreeNodeStatus.FAILURE); + screamOnce = false; return status; } @@ -143,6 +145,7 @@ public partial class LeafSearch : BehaviourTreeNode //handleChaseStop(); status = BehaviourTreeNodeStatus.FAILURE; onExit(BehaviourTreeNodeStatus.FAILURE); + screamOnce = false; return status; } @@ -159,6 +162,7 @@ public partial class LeafSearch : BehaviourTreeNode //Debug.Log("Failure: Player has no collider"); status = BehaviourTreeNodeStatus.FAILURE; onExit(BehaviourTreeNodeStatus.FAILURE); + screamOnce = false; return status; } //Ray destination to target the centre of the player's collider instead of transform position @@ -176,6 +180,7 @@ public partial class LeafSearch : BehaviourTreeNode //handleChaseStop(); status = BehaviourTreeNodeStatus.FAILURE; onExit(BehaviourTreeNodeStatus.FAILURE); + screamOnce = false; return status; } else if (sightRayHit.Hit && sightRayHit.Other == player) @@ -222,7 +227,6 @@ public partial class LeafSearch : BehaviourTreeNode if (screamOnce) { - screamOnce = false; AudioHandler.audioClipHandlers["SFXDetectAh"].Play(); } diff --git a/Assets/Scripts/Gameplay/SC_GameManager.cs b/Assets/Scripts/Gameplay/SC_GameManager.cs index 5dd743d1..8398bb06 100644 --- a/Assets/Scripts/Gameplay/SC_GameManager.cs +++ b/Assets/Scripts/Gameplay/SC_GameManager.cs @@ -36,7 +36,6 @@ public class GameManager : Script public bool itemScored {get;set;} public int currMultiplierCombo { get; set;} public float multiplierFont = 60.0f; - private Vector3 fontScalar; public static GameManager Instance { get; private set; } @@ -63,7 +62,6 @@ public class GameManager : Script itemScored = false; currMultiplierCombo = 1; currMultiplierDuration = 0; - fontScalar = new Vector3(multiplierFont / maxMultiplierDuration, multiplierFont / maxMultiplierDuration , multiplierFont / maxMultiplierDuration); itemShatter = false; GamePause = false; stealFoodPopUpDone = false; @@ -108,6 +106,8 @@ public class GameManager : Script return; } + Cheat(); + if (currGameState == GameState.START) { timer -= Time.DeltaTimeF; @@ -128,12 +128,8 @@ public class GameManager : Script } } - else - { - //multiplierText.GetComponent().LocalScale = Vector3.Zero; - } - if (!goingToLose && ((timer > 0 && totalItemCount <= 0 && !itemShatter) || Input.GetKeyDown(Input.KeyCode.F1))) + if (!goingToLose && ((timer > 0 && totalItemCount <= 0 && !itemShatter))) { currGameState = GameState.WIN; AudioHandler.StopAllSounds(false); @@ -142,7 +138,7 @@ public class GameManager : Script if (SceneFadeInOut.Instance != null) SceneFadeInOut.Instance.CallFadeIn(); } - else if(!goingToWin && (timer < 0 || Input.GetKeyDown(Input.KeyCode.F2))) + else if(!goingToWin && (timer < 0)) { currGameState = GameState.LOSE; AudioHandler.StopAllSounds(false); @@ -181,6 +177,27 @@ public class GameManager : Script } } + private void Cheat() + { + if (Input.GetKeyUp(Input.KeyCode.F1)) + { + currGameState = GameState.WIN; + AudioHandler.StopAllSounds(false); + goingToWin = true; + if (SceneFadeInOut.Instance != null) + SceneFadeInOut.Instance.CallFadeIn(); + } + else if (Input.GetKeyUp(Input.KeyCode.F2)) + { + currGameState = GameState.LOSE; + AudioHandler.StopAllSounds(false); + goingToLose = true; + if (SceneFadeInOut.Instance != null) + SceneFadeInOut.Instance.CallFadeIn(); + } + } + + protected override void onDestroy() { if (Instance == this) diff --git a/Assets/Scripts/Gameplay/SC_PreviewLevel.cs b/Assets/Scripts/Gameplay/SC_PreviewLevel.cs index ca59d538..32a03074 100644 --- a/Assets/Scripts/Gameplay/SC_PreviewLevel.cs +++ b/Assets/Scripts/Gameplay/SC_PreviewLevel.cs @@ -15,6 +15,7 @@ namespace SHADE_Scripting.UI public Vector3 endPoint3; public GameObject playerCamera; + public GameObject gameplayCanvas; public float duration = 3.0f; private bool point1Done = false; @@ -48,6 +49,8 @@ namespace SHADE_Scripting.UI protected override void start() { + if (gameplayCanvas) + gameplayCanvas.SetActive(false); listOfCamera[0].SetMainCamera(); } @@ -77,6 +80,8 @@ namespace SHADE_Scripting.UI if (skip && SceneFadeInOut.Instance && SceneFadeInOut.Instance.FadeOutFinished()) { GameManager.Instance.PreviewLevelDone = true; + if (gameplayCanvas) + gameplayCanvas.SetActive(true); } @@ -152,6 +157,8 @@ namespace SHADE_Scripting.UI if (SceneFadeInOut.Instance && SceneFadeInOut.Instance.FadeOutFinished() && point3Done) { GameManager.Instance.PreviewLevelDone = true; + if (gameplayCanvas) + gameplayCanvas.SetActive(true); } } diff --git a/Assets/Scripts/UI/SC_CutSceneEnd.cs b/Assets/Scripts/UI/SC_CutSceneEnd.cs index acce8bd6..f5007443 100644 --- a/Assets/Scripts/UI/SC_CutSceneEnd.cs +++ b/Assets/Scripts/UI/SC_CutSceneEnd.cs @@ -65,14 +65,14 @@ public class CutsceneEnd : Script Canvas4(); Canvas5(); - if (Input.GetKeyDown(Input.KeyCode.Space) && !skip && (!cutscene4Done || !cutscene5Done)) + if (Input.GetKeyUp(Input.KeyCode.Space) && !skip && (!cutscene4Done || !cutscene5Done)) { skip = true; oldDuration = duration; duration = skipDuration; } - if (Input.GetKeyDown(Input.KeyCode.Space) && cutscene4Done && canvas4.IsActiveSelf) + if (Input.GetKeyUp(Input.KeyCode.Space) && cutscene4Done && canvas4.IsActiveSelf) { canvas4.SetActive(false); canvas5.SetActive(true); @@ -80,7 +80,7 @@ public class CutsceneEnd : Script skip = false; } - if (Input.GetKeyDown(Input.KeyCode.Space) && cutscene5Done && canvas5.IsActiveSelf) + if (Input.GetKeyUp(Input.KeyCode.Space) && cutscene5Done && canvas5.IsActiveSelf) { SceneManager.ChangeScene(nextScene); } diff --git a/Assets/Scripts/UI/SC_CutsceneIntro.cs b/Assets/Scripts/UI/SC_CutsceneIntro.cs index 1f260e03..db393ff9 100644 --- a/Assets/Scripts/UI/SC_CutsceneIntro.cs +++ b/Assets/Scripts/UI/SC_CutsceneIntro.cs @@ -95,14 +95,14 @@ public class CutsceneIntro : Script Canvas2(); Canvas3(); - if (Input.GetKeyDown(Input.KeyCode.Space) && !skip && (!cutscene1Done || !cutscene2Done || !cutscene3Done)) + if (Input.GetKeyUp(Input.KeyCode.Space) && !skip && (!cutscene1Done || !cutscene2Done || !cutscene3Done)) { skip = true; oldDuration = duration; duration = skipDuration; } - if (Input.GetKeyDown(Input.KeyCode.Space) && cutscene1Done && canvas1.IsActiveSelf) + if (Input.GetKeyUp(Input.KeyCode.Space) && cutscene1Done && canvas1.IsActiveSelf) { canvas1.SetActive(false); canvas2.SetActive(true); @@ -110,7 +110,7 @@ public class CutsceneIntro : Script skip = false; } - if (Input.GetKeyDown(Input.KeyCode.Space) && cutscene2Done && canvas2.IsActiveSelf) + if (Input.GetKeyUp(Input.KeyCode.Space) && cutscene2Done && canvas2.IsActiveSelf) { canvas2.SetActive(false); canvas3.SetActive(true); @@ -118,7 +118,7 @@ public class CutsceneIntro : Script skip = false; } - if (Input.GetKeyDown(Input.KeyCode.Space) && cutscene3Done && canvas3.IsActiveSelf) + if (Input.GetKeyUp(Input.KeyCode.Space) && cutscene3Done && canvas3.IsActiveSelf) { SceneManager.ChangeScene(nextScene); } diff --git a/Assets/Scripts/UI/SC_MainMenu.cs b/Assets/Scripts/UI/SC_MainMenu.cs index ffa053b3..8252344d 100644 --- a/Assets/Scripts/UI/SC_MainMenu.cs +++ b/Assets/Scripts/UI/SC_MainMenu.cs @@ -30,26 +30,6 @@ public class MainMenu : Script } protected override void update() { - - if (Input.GetKeyDown(Input.KeyCode.Space)) - { - //Audio.PlaySFXOnce2D("event:/UI/mouse_down_element"); - AudioHandler.audioClipHandlers["SFXMouseDownElement"].Play(); - } - - if (Input.GetKeyUp(Input.KeyCode.Space)) - { - //Audio.PlaySFXOnce2D("event:/UI/success"); - AudioHandler.audioClipHandlers["SFXUISuccess"].Play(); - SceneManager.ChangeScene(sceneID); - Audio.StopAllSounds(); - } - - if (Input.GetKeyDown(Input.KeyCode.Escape)) - { - Audio.StopAllSounds(); - Application.Quit(); - } } } diff --git a/Assets/Scripts/UI/SC_PauseMenu.cs b/Assets/Scripts/UI/SC_PauseMenu.cs index 3e9c7f77..32b59a85 100644 --- a/Assets/Scripts/UI/SC_PauseMenu.cs +++ b/Assets/Scripts/UI/SC_PauseMenu.cs @@ -66,6 +66,9 @@ public class PauseMenu : Script { Audio.StopAllSounds(); SceneManager.RestartScene(); + GameManager.Instance.GamePause = false; + GameManager.Instance.stealFoodPopUpDone = false; + GameManager.Instance.PreviewLevelDone = false; }); } else @@ -92,7 +95,7 @@ public class PauseMenu : Script protected override void update() { - if (Input.GetKeyDown(Input.KeyCode.Escape) && !GameManager.Instance.GamePause && GameManager.Instance.stealFoodPopUpDone) + if (Input.GetKeyUp(Input.KeyCode.Escape) && !GameManager.Instance.GamePause && GameManager.Instance.stealFoodPopUpDone) { GameManager.Instance.GamePause = true; Input.SetMouseCentering(false); diff --git a/SHADE_Application/src/Application/SBApplication.cpp b/SHADE_Application/src/Application/SBApplication.cpp index 5620e258..74a06667 100644 --- a/SHADE_Application/src/Application/SBApplication.cpp +++ b/SHADE_Application/src/Application/SBApplication.cpp @@ -201,8 +201,6 @@ namespace Sandbox #ifdef SHEDITOR if(editor->editorState == SHEditor::State::PLAY) -#else - window.ClipMouseCursor(); #endif SHSceneManager::SceneUpdate(0.016f); #ifdef SHEDITOR diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index bbbbd1dd..a3573c15 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -555,6 +555,11 @@ namespace SHADE // Create buffer for generic data and attach to descriptor set graphicsGenericData.Init(device, genericAndTextureDescSet); + auto windowDims = window->GetWindowSize(); + + graphicsGenericData.SetViewportWidth(windowDims.first); + graphicsGenericData.SetViewportHeight(windowDims.second); + } /*---------------------------------------------------------------------------------*/ From 52f61363c0990af7e3702905468acf8c41ddbda9 Mon Sep 17 00:00:00 2001 From: Glence Date: Sun, 5 Mar 2023 23:50:44 +0800 Subject: [PATCH 2/2] Build shiny highlight shader --- Assets/Shaders/ShinyHighlight_FS.shshaderb | Bin 5273 -> 5445 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Assets/Shaders/ShinyHighlight_FS.shshaderb b/Assets/Shaders/ShinyHighlight_FS.shshaderb index 408bba83d06bbbc37f21629ca6e54476d96e147a..b1ac22bb10b68a3c22c98d42d1a36fd230fe5645 100644 GIT binary patch literal 5445 zcmZ9O`F9*g5y!`oR4&%g*9Lp<#f<(^*6HG23;ZC^m#bF>Efyaa2_=&%O|Afc!9z4FE-Y#jhZP%;%eyh5=y1IK-+aBH# zxY2jh?!h2f7YqfPgSWa=aC2~zn84{jZ13tndi@vapv49AG%F3DcW`z1#t zACXK;&PZOC+>mTj9_FcVS$(QD2>z<1{lSKyJ{gWaaV%`dt*D5~IBd^H&A15jnP=ig z*uU)bq4QWn$p6RMym_!vzJ&|oizq_q8n{_=&4>?9B0$Ir?KlS>+wz|vIDMm-izzIh4>BA z(`otgPC1s9Nx3|6+{N>*)~uH_T*KMdC**54qO^P8YQd+37hB^ot(2+xwO~fNh|`E0 zPeC>91gGX@yoc$^{EOn#d?_v_lZ8Y<%)cbA(^899xB>Uh=hE;*5zRf8=S5Q?itGRI(7e^MvO-7n69Yl^5liq*=}jbDsD(PxDz~5XLeR! zo$md^$5_38gTe2G=T>W6iLa|?Bl7KJf(Dp3SjD_UFty<49fJ8Tfe%XWk}wRDll_jX zKfEEv?yg$l@WYYE;^+n3dI`B6kRFimog&8GmgTCeD!4ug@w_u?A&+5dVGw&nn(rq* z?A3kr1!KZ*ZSTg_EB5$`-S2*Dm{XIGgZBbvFJRsZ*w*Lwh;Qyz3H}?>_}LTt;fxu! zALDv^WB0^*V{z;o&iZ3#Z~53WoYliUpg#=i0b74=Q510_nnPafTV+w}u#yzXx* z+=xzzbHX;hs&7;NJH4MX9u^*!CO7E8?WlOJI|?|^r-Q#SV6efXgCu!KQ> z4@;Aieb8TiUs#Jc1V4EnkzOakPhRj5&*4AnZRUcHNwcQm6S5iX+4?ylo1Dad$lJT5 zt-t&(Rr`O^W8$CicDKeZp04;$$tHKz&s!uP^PiIDZc?As^GVr%*Ca6WJ}n^!@u9Z| zJdUN=ADDRbvLpyD9JTq+2@zxd^SFb*9osJUC0Xo~d&f6{bu8`;*$nFg-w5iyR~2(V z-;@wz!n&Lt-vsJFs2|~e@ZRyUkKajC6CC-$ym`0>bl1?lO$KZJOAOyOVxN-c_np3h z(fqzw@k|dcd+@~`e5nWXdtJ?Uxd&hA!B>0mwH|!k<5BH`UcX0jm*j5ABiaM~e6Ixl zh;}^UvBkenn0Vg4#qX01PdwiUF!4vFAC>SfEdL(aqmoCR9(3>GG1-SC#NeyO9v8+x zt=gD7CV?aW3F*3oZv#B_@Sesc@Wk+rJ}jYT-WM^uq$eftXB5MpAD1u>o_+8wgR^~4 z$tDMH&i4IL+3>{kHo?U6);{L=)it?$r&sts_qzzTc>Y$RPu5rBKQ8I=eeQP?%v#(z z-sY%ob}0R{gt^ql8>PMh=}7XlggM+xFzazH4acwTb<^{sx^c1WS&5wsKIW zGqUaMo|A2LeO5L;+t=r0FH7Jr`C30On|%0;yC56>yoCDs-dvDa-Y>{zzlNWeO^mJc zMcKr_GykGAoW*}hc6I&>!pyh+y(pU)c;;V{hNFMn)mJ1hORD$u%bvG2z9P)Jf7YCr zq`xX52L7MQ`Iz9zeOt*?uNx3#_@n;QS**ZQVxV&MO+e3lpe z54{WO`IdxrYZBsFle)em&7dw~zAgE+gu1Zl$LrE>NUX;1%I>Z4d*a}&#_!9f=XORv zkWCEyCf$1O)ej}>B>fWnHup!e*`MJb%dY17i7+wn)OT5$T-aBnsTKRGG_ly%D*ScX z+{;7yn~yqvD%m0-5A&HvJaNor|HN25Ka&l&Nq;Fb|K}3+u~&kR^~rC0|AoiISw1++ z_eY`Kt?ZMrUh<%F4oYvR z*h3Y2W5wQ7u{XV8wTCYxONY~I^tQ@i2YWmngJhcGelFZ#aRA)8$I?7Q$z+3XA7|FmB)z5GAFL@{ar literal 5273 zcmZ9O*>@b(5yo3+Mv~+XJ?K)NURo%K(b#L`(&3kJDw|Xzx z&>sXn!CM`Jw;A^RLARgMnaba&L9?sXf(t)T(81Gf%T>oYbR3 zaWWGu5Bl8x%EZ*frdD3xwB_zQ2)!!kbte#ewf>dFp}8vKNb^g^07>TJ{^Hg`L&lca?fYu+QB4haS(TKuei>MvN&vTn97gIf}UVw)k#2$TJ9J3c}edL9>kzUekRZP zc$OfHHmTwnAhAD8PycsR;B-WG?RYTBYGnbJFrTxU6tIT=qjyWE)<*LQRA1=G_h z+0u4Cn&feQczmbxXRam&*(2eaapC{b@}{tikG!(NvceZ|Ms z)d-udsJ)bjQZfzXEr;P`-p`X&fL+Sp4Jq0?gJZZ=|1{{ zgVJY~a$NK;>!cTCYt_PpS)Hndjm|8UgCoKl=|YrE#B;Igpw{EU+D%>mBG%`=K{Ji& zt}L8+Bu%rrT;y2_J{C`PE9$J%PfO<$H0SMSy7aSM`nfLs{6%`%efK&avAw&VlC7dM zhsD>4Sm?}GQD?@`=___-44rQdIy1Ij#4??j+})U}U_MwII&2Zc4n`dF<6glAM8vvB zyide82p^jpi&arpV7(&znIUo^j_KsW!grfE-$rc6OLg=HqtgGjw&PbR$YYCg$^DM7 zrz|1{vw%)5=*$5+=aVn*k!ATB)?GV(#oEn}y4Y*=+dH**)C6Yr@@ChISmcAgRDa36 zyXC@Gd;0}(@}a&Shluk7@g5O&;-K?x!LE>gllYL=H+ubM=`8l&B93n{ z58gR>nE$Pk$;0yG-DAH-zo7gfLY~AZF4M1*=bbX(cZ1~3;^>@xmpBWI*yzjANJesM-2CE}5A4|HRAd#jU^m<`nzC+w1s0;pI+_9i7?3 zANwA0Vi)bqqQwLMx%a{UX)pJQqle<;k4|5hM`Vb-5WQ#Cu(9WParS^w13L2thFyQg zIGMflfLQu-N9*Xr=->+?{LTKdjM2o=$oxK$%(C8HkW8(&Y7%+V zUyATC;@o@mwm6GfWa0lmA$-e-!|d)C!A<9PuBadB(vNrP{C*YvPj~5Oy7aSM`nfLs zyw^vRC4Kmjh&jJm^pJ9<)*p+&x2d9GubcmE((z}O&3}_*aQvBhbo_bK+eN%{i+_{k z5z%(X``tT#L^3mm54NK3PU+aElpA|TMPS6=C0-FR>)_tnNw4#9)T3?#CsAF}j9d7FC|@m}{khi?A- z?LeQbulWB=)WLh*?;!e!UOlt+j0k`7VGhZuPyAUCHsaF%s;ImF&v|@AFDsOMKxF;L zW_==FO@#e~;-S|?oB>YVyl*f&KavcV`1_ic4EC~gYMK#&QAb03PQ;9J=hj>N5)rmH zbS`=-VlQ~p*V^>B<$-Q>^LJ=>-7R6@R(CGh>c(chr_QzryY>5!Wa5z{-x#a+uw-o3 zpBE+bZ2&*%d-jrK;$buF70KXypU9u@0+_{pRr3CVepE6(cFr-$_#73n|A;u4?LQ&8 zxc?W@*?-LEbW$=t;Osvx4o3fYU$2W!iHdLQ4UgLyzm(3oUun;4;%|!Z0spUJzAeuB zM)!s7EfE;sNMt+f9m(Biy(y=(IMK*YIa5&oP> zULT3G$P1qjMPG=>3z>fK-Tg#lIsQs=caFan25ve2MlwCOJNm6;e85-ez4NX<74?Wp zBJ8&JGs)Cv`tKwcWBpz_KH%hcTAWzOXT-@B`K&m;$ma_9dC9!X`}MaLd3-KfB_hrl z5&Q7RkG<57kLB|R$zUt=7b^SzD58#yB5a&be5?IWUdPYkfmysiOD5i=?&?PIzlgw! z#J&sO#vOBS+!1$Wwl5_YZTNhv%vR}|!xk~w>| zxYe*mGCrnXDw(*ZUnZH@)|1O6;{$F!Yb6ug^eZG2)An2`86R-_c3dTySlDde)so5G k^lKy+&%RbVKH#tWzFa4nSlH~laJ^*e!uFl&MW>hF14ySAPyhe`