From abccecd29531912f8bab0e06c70666b1a8d88ceb Mon Sep 17 00:00:00 2001 From: avery Date: Tue, 24 Feb 2026 19:52:30 -0500 Subject: [PATCH] Got Some Early Reflection --- .../Kernel/Component/Component.cs | 96 ++++++++++-------- .../Kernel/ComponentDocker/ComponentDocker.cs | 84 +++++++-------- .../Kernel/Overhead/Awperative/Awperative.cs | 87 ++++++++++++++-- AwperativeKernel/Kernel/Overhead/Base/Base.cs | 16 +-- .../net8.0/AwperativeKernel.AssemblyInfo.cs | 2 +- .../AwperativeKernel.AssemblyInfoInputs.cache | 2 +- .../obj/Debug/net8.0/AwperativeKernel.dll | Bin 20480 -> 24576 bytes .../obj/Debug/net8.0/AwperativeKernel.pdb | Bin 18812 -> 19440 bytes .../obj/Debug/net8.0/ref/AwperativeKernel.dll | Bin 9216 -> 9728 bytes .../Debug/net8.0/refint/AwperativeKernel.dll | Bin 9216 -> 9728 bytes 10 files changed, 180 insertions(+), 107 deletions(-) diff --git a/AwperativeKernel/Kernel/Component/Component.cs b/AwperativeKernel/Kernel/Component/Component.cs index 9066d84..bb9eba6 100644 --- a/AwperativeKernel/Kernel/Component/Component.cs +++ b/AwperativeKernel/Kernel/Component/Component.cs @@ -1,6 +1,8 @@ +using System; using System.Collections.Generic; using System.Collections.Immutable; - +using System.Linq; +using System.Reflection; namespace AwperativeKernel; @@ -34,6 +36,16 @@ public abstract partial class Component : ComponentDocker + /// + internal List EventDelegates; + + + + + + + + /// /// Order for when Components are called on. Only applies between Components on the same Docker. /// @@ -54,49 +66,23 @@ public abstract partial class Component : ComponentDocker ComponentDocker = __parent; Name = __name; _tags = [..__tags]; - Create(); + + EventDelegates = new List(); for(int i = 0; i < Awperative.allEvents.Count; i++) EventDelegates.Add(null); + + + if (Awperative._TypeAssociatedTimeEvents.TryGetValue(GetType(), out HashSet presentEvents)) { + foreach (Awperative.TimeEvent presentEvent in presentEvents) { + MethodInfo info = GetType().GetMethod(presentEvent.ToString()); + Action newAction = (Action)Delegate.CreateDelegate(typeof(Action), this, info); + EventDelegates[(int)presentEvent] = newAction; + } + } else { + Debug.LogError("Awperative does not recognize the given type! Perhaps it was created after Start() was called?", ["Type"], [GetType().ToString()]); + } } - - - /// - /// Called when the Game is Closing; does not always happen depending on if it is Force Closed. - /// - protected internal virtual void Unload() {} - - /// - /// Called when the Game is Loading. - /// - protected internal virtual void Load() {} - - - - /// - /// Called every frame before Draw, it is recommended to do any Non-Drawing update logic here. - /// - protected internal virtual void Update() {} - - /// - /// Called after Update when the screen is being drawn. Please only put Drawing related logic here. - /// - protected internal virtual void Draw() {} - - - - /// - /// Called when the Component is created. - /// - protected internal virtual void Create() {} - - /// - /// Called when the Component is destroyed. Not called when the Game is closed. - /// - protected internal virtual void Destroy() {} - - - /// @@ -237,4 +223,34 @@ public abstract partial class Component : ComponentDocker /// /// Name of the Scene public void RemoveScene(string __name) => Awperative.CloseScene(__name); + + + + public ImmutableArray GetAllChildren() { + List targets = [.._Components]; + for (int i = 0; i < targets.Count; i++) targets.InsertRange(i + 1, targets[i]._Components); + return [..targets]; + } + + + + internal ImmutableArray GetAllEvents() { + if (Awperative._TypeAssociatedTimeEvents.TryGetValue(this.GetType(), out HashSet timeEvents)) { + return [..timeEvents]; + } else { + Debug.LogError("Awperative doesn't recognize this type. Perhaps it was created after Start() was called?", ["Type"], [this.GetType().Name]); + return []; + } + } + + + internal ImmutableArray GetAllGlobalEvents() { + if (Awperative._TypeAssociatedTimeEvents.TryGetValue(this.GetType(), out HashSet timeEvents)) { + foreach (Awperative.TimeEvent timeEvent in timeEvents) if (!Awperative.globalEvents.Contains(timeEvent)) timeEvents.Remove(timeEvent); + return [..timeEvents]; + } else { + Debug.LogError("Awperative doesn't recognize this type. Perhaps it was created after Start() was called?", ["Type"], [this.GetType().Name]); + return []; + } + } } \ No newline at end of file diff --git a/AwperativeKernel/Kernel/ComponentDocker/ComponentDocker.cs b/AwperativeKernel/Kernel/ComponentDocker/ComponentDocker.cs index 1614edb..40b0bf9 100644 --- a/AwperativeKernel/Kernel/ComponentDocker/ComponentDocker.cs +++ b/AwperativeKernel/Kernel/ComponentDocker/ComponentDocker.cs @@ -58,66 +58,47 @@ public abstract class ComponentDocker /// Component to modify /// New priority for Component internal void UpdatePriority(Component __component, int __priority) { - foreach (String tag in __component._tags) { - _taggedComponents[tag].Remove(__component); - } _Components.Remove(__component); + //add ownership enforcement/method + + foreach (String tag in __component._tags) _taggedComponents[tag].Remove(__component); + foreach (Awperative.TimeEvent timeEvent in __component.GetAllEvents()) { Awperative._TimeBasedComponents[timeEvent].Remove(__component);} + _Components.Remove(__component); __component._priority = __priority; - foreach (String tag in __component._tags) { - _taggedComponents[tag].Add(__component); - } _Components.Add(__component); + foreach (String tag in __component._tags) _taggedComponents[tag].Add(__component); + foreach (Awperative.TimeEvent timeEvent in __component.GetAllEvents()) { Awperative._TimeBasedComponents[timeEvent].Add(__component);} + _Components.Add(__component); } - - - - - - - - /// - /// Called by Awperative when the game is Closed, sends the event to all children; and they send it to their children. + /// Chains an event to all children, NOT MEANT FOR UPDATE OR DRAW ETC, JUST CREATE AND DESTROY /// - /// Will not always trigger if the program is force closed - internal virtual void ChainUnload() { foreach (Component component in (Component[])[.._Components]) { if(component.Enabled) { component.Unload(); component.ChainUnload(); } } } - - /// - /// Called by Awperative when the game is Opened, sends the event to all children; and they send it to their children. - /// - internal virtual void ChainLoad() { foreach (Component component in (Component[])[.._Components]) { if(component.Enabled) { component.Load(); component.ChainLoad(); } } } + /// + internal void TryEvent(Component __component, Awperative.TimeEvent __timeEvent) { + __component.EventDelegates[(int)__timeEvent]?.Invoke(); + } - + //internal void TryEvent(Component __component, Awperative.TimeEvent __timeEvent) => __component.TryEvent(__timeEvent); + + /// - /// Called by Awperative when the game is Updated sends the event to all children; and they send it to their children. + /// Chains an event to all children, NOT MEANT FOR UPDATE OR DRAW ETC, JUST CREATE AND DESTROY /// - internal virtual void ChainUpdate() { foreach (Component component in (Component[])[.._Components]) { if(component.Enabled) { component.Update(); component.ChainUpdate(); } } } - - /// - /// Called by Awperative when the game is Drawn, sends the event to all children; and they send it to their children. - /// - /// Only use this method for drawing methods - internal virtual void ChainDraw() { foreach (Component component in (Component[])[.._Components]) { if(component.Enabled) { component.Draw(); component.ChainDraw(); } } } - - - - /// - /// Called by Awperative when this is Created, sends the event to all children; and they send it to their children. - /// - internal virtual void ChainCreate() { foreach (Component component in (Component[])[.._Components]) { if(component.Enabled) { component.Create(); component.ChainCreate(); } } } - - /// - /// Called by Awperative when this Component is destroyed, sends the event to all children; since they will be Destroyed too. And they send it to their children. - /// - /// Not called when the game is closed - internal virtual void ChainDestroy() { foreach(Component component in (Component[])[.._Components]) { if(component.Enabled) { component.Destroy(); component.ChainDestroy(); } } } - - - - + /// + internal void ChainEvent(Awperative.TimeEvent __timeEvent) { + + if (this is Component dockerComponent) { + + TryEvent(dockerComponent, __timeEvent); + foreach (Component component in _Components.ToList()) { + component.EventDelegates[(int)__timeEvent]?.Invoke(); + component.ChainEvent(__timeEvent); + } + } else Debug.LogError("Please do not call chain event on anything besides a Component! It is meant for Create() and Destroy()"); + } @@ -167,7 +148,9 @@ public abstract class ComponentDocker //Add to docker and initialize the new Component _Components.Add(newComponent); newComponent.Initiate(this, name, tags); + foreach (Awperative.TimeEvent timeEvent in newComponent.GetAllGlobalEvents()) { Awperative._TimeBasedComponents[timeEvent].Add(newComponent); } + newComponent.ChainEvent(Awperative.TimeEvent.Create); return (__Type) newComponent; } @@ -547,12 +530,13 @@ public abstract class ComponentDocker [__component.GetHashCode().ToString(), __component.GetType().ToString(), GetHashCode().ToString()]); return; } - __component.Destroy(); - __component.ChainDestroy(); + __component.ChainEvent(Awperative.TimeEvent.Destroy); + foreach (string tag in __component._tags) UnhashTaggedComponent(__component, tag); __component.ComponentDocker = null; _Components.Remove(__component); + foreach (Awperative.TimeEvent timeEvent in __component.GetAllEvents()) Awperative._TimeBasedComponents[timeEvent].Remove(__component); } diff --git a/AwperativeKernel/Kernel/Overhead/Awperative/Awperative.cs b/AwperativeKernel/Kernel/Overhead/Awperative/Awperative.cs index 6e5059c..77e8f2e 100644 --- a/AwperativeKernel/Kernel/Overhead/Awperative/Awperative.cs +++ b/AwperativeKernel/Kernel/Overhead/Awperative/Awperative.cs @@ -1,7 +1,8 @@ +using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; - +using System.Reflection; namespace AwperativeKernel; @@ -33,11 +34,11 @@ public static class Awperative /// public static ImmutableArray Scenes => [.._scenes]; internal static HashSet _scenes { get; private set; } = []; - - - - - + + + + + /// /// Creates a new Scene /// @@ -94,6 +95,30 @@ public static class Awperative /// You cannot add new hooks later; so make sure to register all of them in the Start() method. public static void Start() { Debug.Initiate(); + + //Load in all Components nd find the associated types. + Debug.LogAction("Evaluating Components!"); + foreach (Type type in Assembly.GetCallingAssembly().GetTypes()) { + if (type.IsSubclassOf(typeof(Component))) { + + List presentEvents = []; + + foreach (TimeEvent timeType in allEvents) { + if (type.GetMethod(timeType.ToString()) != null) { + presentEvents.Add(timeType); + Debug.LogState("Found Event Method " + timeType); + } + } + + + + Debug.LogAction("Evaluated Component! ", ["Type", "Time Events"], [type.Name, "[" + string.Join(", ", presentEvents.Select(x => x.ToString())) + "]"]); + _TypeAssociatedTimeEvents.Add(type, presentEvents.ToHashSet()); + } + } + + foreach (TimeEvent timeType in globalEvents) + _TimeBasedComponents.Add(timeType, new SortedSet(_componentSorter)); } @@ -105,8 +130,56 @@ public static class Awperative Base = new Base(); Base.Run(); } + + + + /// + /// + /// + internal enum TimeEvent + { + Create, + Destroy, + Load, + Unload, + Update, + Draw + } + + + + internal static ImmutableHashSet allEvents = [..Enum.GetValuesAsUnderlyingType().Cast()]; + internal static ImmutableHashSet globalEvents = [TimeEvent.Load, TimeEvent.Unload, TimeEvent.Update, TimeEvent.Draw]; + + + + /// + /// List of all type of components and the associated time events + /// + internal static Dictionary> _TypeAssociatedTimeEvents = new(new TypeComparer()); + + + internal class TypeComparer : IEqualityComparer + { + public bool Equals(Type __a, Type __b) { + return __a.Equals(__b); + } + + public int GetHashCode(Type __type) { + return __type.GetHashCode(); + } + } + + + internal static Dictionary> _TimeBasedComponents = []; - + /// + /// How Priority is sorted. + /// + internal readonly static Comparer _componentSorter = Comparer.Create((a, b) => { + int result = b.Priority.CompareTo(a.Priority); + return (result != 0) ? result : a.GetHashCode().CompareTo(b.GetHashCode()); + }); } \ No newline at end of file diff --git a/AwperativeKernel/Kernel/Overhead/Base/Base.cs b/AwperativeKernel/Kernel/Overhead/Base/Base.cs index efa70dd..5465e3a 100644 --- a/AwperativeKernel/Kernel/Overhead/Base/Base.cs +++ b/AwperativeKernel/Kernel/Overhead/Base/Base.cs @@ -22,7 +22,7 @@ public sealed class Base() : GameWindow(GameWindowSettings.Default, new NativeWi /// LoadContent() is called when the program starts; right after Initialize(). Override Load() in scripting tools or use hooks to call from this event. /// /// It is recommended to load content during LoadContent() - protected override void OnLoad() { foreach(Scene scene in Awperative.Scenes.ToList()) if(scene.Enabled) scene.ChainLoad(); } + protected override void OnLoad() { foreach (Component component in Awperative._TimeBasedComponents[Awperative.TimeEvent.Load].ToList()) component.ChainEvent(Awperative.TimeEvent.Load); base.OnLoad(); } @@ -32,7 +32,7 @@ public sealed class Base() : GameWindow(GameWindowSettings.Default, new NativeWi /// Update() is called every frame; before Draw(). Override Update() in scripting tools to call from this event. /// /// Hooks are unable to receive both Update() and Draw() - protected override void OnUpdateFrame(FrameEventArgs __args) { foreach(Scene scene in Awperative.Scenes.ToList()) if(scene.Enabled) scene.ChainUpdate(); base.OnUpdateFrame(__args); } + protected override void OnUpdateFrame(FrameEventArgs __args) { foreach (Component component in Awperative._TimeBasedComponents[Awperative.TimeEvent.Update].ToList()) component.ChainEvent(Awperative.TimeEvent.Update); base.OnUpdateFrame(__args); } @@ -42,17 +42,17 @@ public sealed class Base() : GameWindow(GameWindowSettings.Default, new NativeWi /// Draw() is called every frame; after Update(). Override Draw() in scripting tools to call from this event. /// /// Hooks are unable to receive both Update() and Draw() - protected override void OnRenderFrame(FrameEventArgs __args) { foreach(Scene scene in Awperative.Scenes.ToList()) if(scene.Enabled) scene.ChainDraw(); base.OnRenderFrame(__args); } - - - - + protected override void OnRenderFrame(FrameEventArgs __args) { foreach (Component component in Awperative._TimeBasedComponents[Awperative.TimeEvent.Draw].ToList()) component.ChainEvent(Awperative.TimeEvent.Draw); base.OnRenderFrame(__args); } + + + + /// /// EndRun() is called if the program closes. Override Terminate() in scripting tools or use hooks to call from this event. /// /// This event may not trigger if the program is force closed. - protected override void OnClosing(CancelEventArgs __args) { foreach (Scene scene in Awperative.Scenes.ToList()) if(scene.Enabled) scene.ChainUnload(); base.OnClosing(__args); } + protected override void OnClosing(CancelEventArgs __args) { foreach (Component component in Awperative._TimeBasedComponents[Awperative.TimeEvent.Unload].ToList()) component.ChainEvent(Awperative.TimeEvent.Unload); base.OnClosing(__args); } diff --git a/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.AssemblyInfo.cs b/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.AssemblyInfo.cs index 3deef72..dc4b3c6 100644 --- a/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.AssemblyInfo.cs +++ b/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("AwperativeKernel")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+c40a76cc10915d9844dfa62ddb575c0d970a66d3")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+75ebac61d0dfcd3286436ea7839c6d4506b0440e")] [assembly: System.Reflection.AssemblyProductAttribute("AwperativeKernel")] [assembly: System.Reflection.AssemblyTitleAttribute("AwperativeKernel")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.AssemblyInfoInputs.cache b/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.AssemblyInfoInputs.cache index 1fcd983..989c3dd 100644 --- a/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.AssemblyInfoInputs.cache +++ b/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.AssemblyInfoInputs.cache @@ -1 +1 @@ -dbcab0853d7691ebbc60aad204f24413a91ac102969db8ce430a2cb755d1f2f2 +9247c7222c48f63b20f7850bc43f8a7199e69898cd844fe346be865677a16d9c diff --git a/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.dll b/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.dll index d8d83f6ecde82b30d4504fa0e4fb1ef1ddd9f3df..73b59571ffdb97ef8a38f02480673ba2ae9c52a3 100644 GIT binary patch literal 24576 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 literal 20480 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 A)c^nh diff --git a/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.pdb b/AwperativeKernel/obj/Debug/net8.0/AwperativeKernel.pdb index e6602865abb4abd747c1d13e966d78eb218d1866..b3e302aa0ea3f9fff7688060619169923cc4f008 100644 GIT binary patch delta 6470 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 TWgXRPYvK2mSTj#nO*81dqd_7xNIwxI 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 M{JrVs|5OJ46RY}zKmY&$ literal 9216 zcmeHNYiu0V6+U-%b~1isu@@3viP>PFi4qpS6E{HY*iLX>Hh#oFT5ZO=V`pJ^W|!#75``vEtRNHD*;7<3TP#$L`y{_((l}P>^Py& zB7RWBb?&+6JLlYU&pr3fo!Ob}yy8|$5Rr;{>=@BwXu0%A`r+gN)Ty%`PthYa&#rn* z?09z7*uJ8hsW|quW0W&_!?J8IGihd=87ot?GW|oNnX+9lvrCuOo)fqp9w6EwR9gP_ zc|QwB`xBj=sS_pl$kM4?M79r%)%eYQMXEC9>UGGH*5Fm7% zdge7A(B9=B5XhWpXk#S~r)0yd5IupAk&|kz~3`VR}tsR!!04 z+AC_B?ny4F%jqY{CJvwOW`gJi-H3T!t#zpN5qe+kP!NCKA6iw^b6$i|37PXN^eO;BQ01N{)A_0p06ZI?)=%cKssNa&Ul{K5-o zu9r@tD`y<^vJ(6gMp(lV6K`it7Z<04)Rs1*)(jQ}JUjLeQ zD5kqThUWDN?He)Oh8UWso5kTsH%|`&CByOPHt}7|KFAqR16Dd1{j^T(d_C0ZYv8kr zjv%`s`eouR_^6`S7NI{NXI0(9$XOM=wn+Eum~Ni_Mc<1o89hXGVJvii;-}bkVbu30 zj$+q^Xh2=SZm*)Fl#WnY`yHJep)0i)V(1F>WjZC&O{j0g&_eR>v@FssB;Ug>3`bZ< z9*d!e5=nu5>+eW}PA|XTL7Djw9oAFo8Ik2-Ju6~}ZdIGA zI-q88M&RWz-KDM*DCe zhML8?2)zx<3nG+BHi_04Y8Gt~T9aHCUB!oKf!f6SNcS9FC^iOYUgo7I)alQOt)hyq zPwuE9?D_E+dJqWbh+LJ!bhp?eHb>}Mu~+oPP?PA7&;#0(7>Lk|Y8Cmhgu18cCG7bs z8W2}T{hp>#pe=!yr|JDfMQja_@8yz@jrczB?F7?>7`+$=vB3Gr^cOMyXtJR}p&rrD zkf6K33&|_s+44HvlNCxy-lr=TNfc?rbQ|R1h}_HXD~Rm{Es-NKRp4|*fi;qE z1#O^iNqZ$7l=M zlEta{sL0}+I|_Oxy$IS2ZI;&3UqIVw4Qw{jCeS|G2D+UlKu4u~59qz*(k)7}V4r=G z<|X~Ar1wgCL}Tq!l4fd{=Y5jE`K?kdt_*%Ad|#c#o_Jlm4)h6e1Lz&egP^Y@zYcn* zb_eJl?Jm$wl73%Wrqz2PX%kGJ7x#hQnEY|zUBP}z%5jq5YH{aMFj5WZNtm^QY%c{p z8A!nsQ6uP?Kniu@ELZR}aVqE_Rzsm}(5MG^z2c<<`yqH4A;o8sAq^JG8l?=&9F=qE z75SvLShgT#i~IUdbT!CSEovQVJ+ieFmCGsgE9rZA&<+Ic)}Y-Uv_nCAY0!=a?Rd~m z1nr)nHGUuLiUhwGOo&btx*!g%{^@x&ESCDH(HpCBt=F z+j1?CcIR@f?UFlQ?@OU??~GZt`kq?b_Xb>hC%C}@Yo=^E#$?H4R4&hW%=bEuF((cE zVcKZRjFsQp7LD7^99_86F3gn7i`g}e&bgjh&i2`*l9~64w&iBGnwIGl^R&aB4%uGU zH61TRL)H%4C{W)%qZs4HtrAOn3k4dmIGh6Ia%IzXjcN0PhKa(aY17MLur0-sxyvY< z=w@*v!UF! zJVfsLnyseiGr8QQGo~{a0#~}r<;LbJzW>dJ3->%{KP;c`lY?-sMm>y1ex`iB&n{Om zCr9QD%0jP)pLCNmY!-6koSq0#zd1QGJuMeAw2&^#lcl+_qK7q(#AAkoY0Gr%x1Fo1 z3J!toIiI^t$Hk(as2sGWY^QASiW{Z>Xw_$1Q^n~SN7_}LjF?lS#+2#JjbIA^0O8!sso>)0zP42;^0uI%ifN5)&rTGrg1sNJ!68vD zLyp9ssOvY~t310R=Ne6{-_BoUI?`z{)j)!H1{}wBf^d93oA)3IV(Kp%)0XXe#k?De zf(7R=``KBIHE6)x*HW$a2Yj8P?P#EU8QKq8XS)>U$l)J_9?iRK>X* zE-i?Ib3!`w180x&l&Hdr!N-$_>#TZF`>JM+q z-O%{^+Ar$wK6$ON_Ocf?%KN{fDTi%^;f%#w^E z(t5gHYY{@E>+1lQr3a)a*&^@_VF?sULle~i@jy*fCnY|QNh&E7Dg^^6X&w%JSs-e_ z`mXSEB&8Cvfkz90F;}MWjD~(Sq>7ZpwUh*wEHaZ`f#(YLpU&Ws4&kG-f5BV^7+=5?$*vi_lAy+ z!j#d~Rwzt%uJ6pZ6uQ^97+qb3c08yGIv}G3gEy=v7Wv&NCT`hX1>2bKsp2>nzAyG= zxU8K1QfVh16R7OwkqlFw&8$6kE_@t6Ox)Gy{HHDh{AO5wVmz=oG`=*5uoq8|v)v`A zm+d9I9cSd1LZSoAZv1l0fez3JxIuhr-32@dy2bzMN>8e9z3>0hlG_!1{B~2|hmT1m z;KQaLjDS~z9QY~Xdx8m{7EO^YP0qpZOrkMp4M<(+4f0@T1Nr4)^=UX2h{=Oh5%TE| z@N`7lv|!%;Uk6Qc4)Afb5qdqd_7xNIwxI zLEFUr&D-6(rR1hgkw4nhOTBsXo0&In-n@_9+tv8nKR^*8Qc+%ejp*~J`5Kn=XOnfP z+u!mR?exbjU)%qAaq?^XXUFDZj$d9^Kz$IQ z`6t+v|21nLvIy6g&k#*8Gf(s)C*sCyov016--F$r8+AVm4>v-WRyy#pkbSbYS}6m| z&=O!UmLP6$@){-@NxJ4m7bvw01Ok~84Rz>BAo`^3*d@s180Nun4iYG#YZxAqwpp#i zkjF&pDBSOzD4}Z@{f6M1>@RT!EI(UyXsE zcI}F_x1z9|aZsY*TTocXg=j~VbwnCHAGt%*Xs62b z`^q+L8;#&p*67=wJo0W;qn}2ss78*YDM`mA{feX{>66m_&y_p0R{BkPL1=U&b~jor z(gWZ>PRu{5Fnw8L`VGk+QkhRhnYyrSr{9S^8;z5ry)SwzJ*K^k-rogFj&-jLndjqC zWb$O}y4nWbL)W6$)htD*lO7cv^aa&JZ-uslJ_*YQpc|69NvTum2nkqzP`R#}n8~9O zEdjLwos_A&3;ks&1{B%fL9-I+KAJ{6S>$wF>fRyI7CJ?o)?ddecnA8OfTs?+j@Yxb z6R7EBCrwcVy>F52Zlh_5_Di%IGu#O;KLC0s-A=QZi;s#a(C-N5|4y62vY3dT-6Zc3 zpQCfsN4JThq$Su0dPwpv_~+u(`EGgJsAnp$zg;^8~RJpkD;&G<2=e{ULNkdz-Br4TQ@n}( zMSQ%`?kc?oH0pb~N}pAq6-RyKc{%n5(09d$v_BAm<#)xW#h;4fo7$cDIS?P<$8kFp zbTLG~hjUfn^kQ1$o2}13sdaQH^nKCM5g`k_kh}t(ZRT*EEA$G^apBV+LEe-o(uU~) zSOz_EE3d5}wionAvR|eOU4w7) zl2$+k?x5`9InYi#6&=96Dh^K>@NbiR8oW+3`8m)}kV9Wp zx&-^oNm`QhHzfVGq!ER+U6Kw*nV*;R#TfG{?f^U%UUd<~sNy+LlfQ+pMZbtV{$=bX z&?V&>Xhr)9=ohuW0(E2G0_}^v3c6d;_ejfY>fb~1w}R;hm45)8)&5m@-WBu`mHkA) zskrkga)uPl(iZSraHmpGwt;qH&J;W++yeSmAO$(u33>#xsL=h$*6ozQ8;}^O>%0oW z*LCbv|0RhO-$7fkM{kt9ARA#pHm*bTtc06o?~`z|znA#|8JUV8<_NMCLDU-7f`-^N zWK=`+8nVjI%7js@$o_Zv^*w%__Um519`x&b{d&l+@AvDhUl;uPgkMjf78tRD;?1Fs zJnM)+M}Bnq*8(lYo%t|#zNJU=$$J@wc@Vj>a}IVHf@&GYAY`5v$k!l$+qZW zu-HwbD^_W~+lzCs*h9S|J)?t#T&geA*OwZ|XA7C0?!ipDuX}W`dvu_CWU#-`pGv2* z-6NyfUR1rKg-m~cK0Pp!&-IOTr!!P6PP>L%Dao$Jtcp9cwroyU9yW(CqHMLYWDRAw zKe}(cUS6r1N9evuyRvGy=2&gHYSv7Po7b(p=^B-)bA(on>WWz`!m)v}z!{+FHODn; z$y~i!HA`&mB#)YwX;(^gvc43sS;sMLH$W5C$+}UdS*yxbwp^xy#W^X{QPVwUIOlVC zQ-~gFrsEh(=Iiy*$RjP8ZV^3=R;uPHqsGlFt|qM6ZmY&m;djponQ)bn;D7lb6h-}ivqAj`2hHz-wrd2Wn zi>4}&$c<>NH5L96kaD-OP~qL$)M7&9-1!sY@p2PT_QEpuxm#H^X&h^Vyd}bGdB#}s z5p$Sv(9H`j>8A?sJb2E}7`DYM2Wh(jny`2=vRqDQc$rTc?)ktaM_#wEQ?Z53YACD| zrfosM!DXveKO*L4>@}=f=9**hjFV*uy-=|sS8BW)VV65!sg{vgjHP5$tJ63)$R7cR zpOw4bkKPBtc+ExsP~f(8t6bp&f+m(tYvx4qOvNhKFJOc?JZd$_F&Q`O@}~2UTVIyr zZwxkHFFj=1(y2duU&6agP9{!U4z6I^b=!~4s4d#YeWk()z3Vk6w7#ICS=J?v;-=DnA^l{M4dGn6Oag2O&jM6s=v+wnnt=$0Az% zU<{59mBdqb*Y6@kox+u0o}tBaDRe6xUfGTEKd)kd1bgkVQOd3G}(Q9nZ38 z*Fvgjm$()0?i7zj*5Z5coW=g*2|W5Dd^A?j2CftE<;_b)c2z_CN_;#%4y4D&)q|Xx zgGddSMC_oS8m~rbAk}pr=@A`a>D-&{_onj`Az%CWrP+*f>lxcvK2^607fa?cA2>7T z?fL~rzz(m~a19CCl{{6L$<=K$yS#kZKg@VTO?qCH;o-P zo}73>78LakYHCA2X}tBuA5o8>qy&fhd(8!-)R!)&%8R9PPxnAyrl-#|`UiRjOMT@` zZ>n!0mC2+`JiQBAmw|%e_nkLh^1ES3_|N`(d=|9^-%3OJfDPXFdl)B!ov&8M@i0R* zr-WRX@&>@#*ACDy;rBiNhQ)S3iK4uD{W52O-}}q&BI}z+$(st_powmhv)wV2v-9|F z!wbc~%8?AXIsAGrf);2B+!)^Gp8_5O9reDt(+lc9{nYzKD_1+(c=i3hA6|F72E$h# z0Pl#%ARB%v_?~3Kr-g4Ob!m2|T&*+E8jw2B8~936f!6Zfd`7(rrvfp#u&O}5^g5od zNShSK?fqqFfpdV5}cuT^uEN_bSjrdC8>}&d(lRY`1@uu;PCDkb0cPH#QW3C^SfvB1z`0x5mQW^H% zI1XZV1m6DO2Msb%m04M)H93+cI*%TR5-3x$&k0}78E5NY{EWQp{XBhp^DqgYbwsp+ z{JEh~ys>$BjP61Fn|<7v!Djvr;Y&_0#=3xbOZd8zM!zYPMW8bEP&W-gngQ1bD+AU8 z;0L8`8S-9O_sLb10ZPG!uK_uKS*!pDk{a|?WH5mh&TFVSlg&7IK7T>ir1yV8_6+=j M{JrVs|5OJ46RY}zKmY&$ literal 9216 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