FmAhh%Vh~zw@Yti)FrL5_HUHgF&d0chL~~@KLG}!NA@i%zK7v z*?>{rq*F5H%z8Do*QIQdp?vnXOjZ zs+?hXrulPI53@1--kP1O+YE<|ij|oRE6?xGvIBj`i$&MXU%pT%X8Watr&&F$ZmQa> zRn?jY@6K!uGkbYT$Lb`RnTJ~8mR=N7(2|{5IGB<>3RCt!v I%W8`H@s@8KyB9Bk_8UkP ^NkWyoWX=5pjXBsw7$|)9T_%HGOaheXH>2X>7Cm a@F_W2*VL#~eCl^~SPlEBC4n1x$V$ z%+cwF!mb;YS#7 ~^i1S$-icY;M8Oc#rvlvYh*#2Yn*qqSf+%8TOUURPr+6qiQxH zr$Rr=`iWsi#ryP5al$@k@`YcSZR?ticI>IKy<2fJYe^}lS2DEo?v|4Q{WlK^b!`TN zhqAY#>O`iI4bZC8+us0Z@(~E#?{giF^_)^m1N*J?R=}GQw`?OfEP1CmaJsNAC-JfN z`qeh=ug!@&opKMH*0~5xDrtOzbN$(`<4Sb?_1l8i32u3`Mw?kPPk;NMHnV42&*+m7 zZh~uT){*iD&M;0`Th^tVFk(I3$>dDveBa$^-eDUb+#K)|#xC |+&kB%otQP7 zS+JQ;P3yHU^Ki?%E K!~5$Jv+`7*~rBR4%OxnRr04IsYJ%7=!FczMmkO zU^-sXBV{2*4;(%9y22ef%h!0ltfF-B+|$>gtQ!+b4({@^Jq{^2YzHT2zV&LW?9K=+ zXXQ=Xswusr29~ JEH7IhNNr0 zZ(LdgztG+FT!6RX+U#RD6|G#Gx*`5$Nb)>d&dn~fB`GT9Y}M|GfTfKDZEKuYe`v|_ zC8WDu9k9N)wB+?|^SXGMmD+`SgKd(`n7gtdX#Dc=xEp=8TH4*MwN)+04U4{R{(9Dd zh9uL1Wd7MaNSWv6-T8$lbp|OqytCoj=ZO8bgA28c@0eC%y{Z?VH=8|@1$p`%+ojS! zW#f)_h+~N-js#ZDvpp3#G x(bh$L7tAj^4-(eIH>E(BdPawPnx_KP?W-w z1>5`S^+A_^B)GekXU54x)&7j}H_eRArm*)S#}xW4?A#1h{riBR@}GHXk5ps@JGc9h zR%yGo4ywG_Ey40ajq#n*;8|he9(|=AmbN~_A4m(9t)gGGlgjCx4fRZP;e$fNj$%G{ ztyOD^d$!~X8nw%#XMU4IQ!#L%LF!bOksz~}5n{4Kueff;uO#?_UjjBGJnNsf#mt;d z-;1KGyV3f_*Klv1VoVT}I1AcO^A9TZd661clO!xJsc2sTJ2DnJ|JhK)^Cu4V?I|X` zHAMBjz@mo0ltZ!5q~xCp&a`WfI#$UxEwwcBYB7ZK@HX>a#gJV~p3;u3de(b|P}y_W zchI>P-qhBbR^M*dlKr-bY)4ZnM`p#t#J2s1bDP+S>kXlfdF0D=(pM)4FAwL+C!bc; z?9R6t3xG^I-WP>*u0N3KKrs#~Ei9M4I1neNmFEY%h)6CpNAEj+5Z`_x2{QYB#<`2$ zQHPphgb8cyZoN)4m~-t(d%$6f*XtOe-SRE^R_$D|z3a9zlO9ULTAP}~my`pfJUx#H z?LobYjKO=B^Qbn(SismFF;KeOl)h)^R@{MTI@uB)HT%X;;90vHW2Bj1Iq$ejz4~K` zsa$)*wbRvzqA_G-J`?(%q{)MUB~SgOs|SpCH3;a#&$s8W;0GbM?DuC_JzU1RP@d4> SnzK^# ~GX literal 0 HcmV?d00001 diff --git a/Editor/RevertIcon.png.meta b/Editor/RevertIcon.png.meta new file mode 100644 index 0000000..7141f6a --- /dev/null +++ b/Editor/RevertIcon.png.meta @@ -0,0 +1,158 @@ +fileFormatVersion: 2 +guid: e7bc1130858d984488bca32b8512ca96 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 8192 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 8192 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 8192 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 8192 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Windows Store Apps + maxTextureSize: 8192 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 8192 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/ShaderDrawer.cs b/Editor/ShaderDrawer.cs index 4862e4a..98a3999 100644 --- a/Editor/ShaderDrawer.cs +++ b/Editor/ShaderDrawer.cs @@ -1,9 +1,9 @@ -using System.Collections; +// Copyright (c) 2022 Jason Ma + using System.Collections.Generic; +using System.Linq; using UnityEditor; using UnityEngine; -using UnityEngine.Events; -using System.IO; namespace LWGUI { @@ -23,6 +23,8 @@ public class MainDrawer : MaterialPropertyDrawer private bool _defaultFoldingState; private bool _defaultToggleDisplayed; + private static readonly float _height = 28f; + public MainDrawer() : this("") { } public MainDrawer(string group) : this(group, "") { } @@ -51,24 +53,25 @@ public override void OnGUI(Rect position, MaterialProperty prop, GUIContent labe EditorGUI.showMixedValue = prop.hasMixedValue; var toggleValue = prop.floatValue == 1.0f; - string finalGroupName = _group != "" ? _group : prop.name; + string finalGroupName = (_group != "" && _group != "_") ? _group : prop.name; bool isFirstFrame = !GUIData.group.ContainsKey(finalGroupName); _isFolding = isFirstFrame ? !_defaultFoldingState : GUIData.group[finalGroupName]; + EditorGUI.BeginChangeCheck(); bool toggleResult = Helper.Foldout(position, ref _isFolding, toggleValue, _defaultToggleDisplayed, label.text); EditorGUI.showMixedValue = false; - if (toggleResult != toggleValue) + if (EditorGUI.EndChangeCheck()) { prop.floatValue = toggleResult ? 1.0f : 0.0f; Helper.SetShaderKeyWord(editor.targets, Helper.GetKeyWord(_keyword, prop.name), toggleResult); } // Sometimes the Toggle is activated but the key is not activated - else - { - if (!prop.hasMixedValue) - Helper.SetShaderKeyWord(editor.targets, Helper.GetKeyWord(_keyword, prop.name), toggleResult); - } + // else + // { + // if (!prop.hasMixedValue) + // Helper.SetShaderKeyWord(editor.targets, Helper.GetKeyWord(_keyword, prop.name), toggleResult); + // } if (isFirstFrame) GUIData.group.Add(finalGroupName, _isFolding); @@ -76,11 +79,20 @@ public override void OnGUI(Rect position, MaterialProperty prop, GUIContent labe GUIData.group[finalGroupName] = _isFolding; } - // If use OnGUI(Rect position) as Rect, we need to accurately set GetPropertyHeight() - // if use EditorGUILayout.GetControlRect() as Rect, GetPropertyHeight() only increases the interval public override float GetPropertyHeight(MaterialProperty prop, string label, MaterialEditor editor) { - return 4f; + return _height; + } + + public override void Apply(MaterialProperty prop) + { + base.Apply(prop); + if (!prop.hasMixedValue && (prop.type == MaterialProperty.PropType.Float +#if UNITY_2021_1_OR_NEWER + || prop.type == MaterialProperty.PropType.Int +#endif + )) + Helper.SetShaderKeyWord(prop.targets, Helper.GetKeyWord(_keyword, prop.name), prop.floatValue > 0f); } } @@ -91,16 +103,14 @@ public override float GetPropertyHeight(MaterialProperty prop, string label, Mat /// public class SubDrawer : MaterialPropertyDrawer { - public static readonly int propRight = 80; - protected string group = ""; protected MaterialProperty prop; protected MaterialProperty[] props; protected bool IsVisible() { return Helper.IsVisible(group); } - protected virtual float GetVisibleHeight() { return 0; } - protected virtual float GetInvisibleHeight() { return -2; } // Remove the redundant height when invisible + protected virtual float GetVisibleHeight() { return 18f; } + // protected virtual float GetInvisibleHeight() { return -2; } // Remove the redundant height when invisible protected virtual bool IsMatchPropType() { return true; } @@ -116,44 +126,46 @@ public override void OnGUI(Rect position, MaterialProperty prop, GUIContent labe this.prop = prop; props = Helper.GetProperties(editor); + var rect = position; + if (group != "" && group != "_") - { EditorGUI.indentLevel++; - if (IsVisible()) - { - if (IsMatchPropType()) - DrawProp(position, prop, label, editor); - else - { - Debug.LogWarning( - this.GetType() + " does not support this MaterialProperty type:'" + prop.type + "'!"); - editor.DefaultShaderProperty(prop, label.text); - } - } - - EditorGUI.indentLevel--; - } - else + + if (IsVisible()) { if (IsMatchPropType()) - DrawProp(position, prop, label, editor); + { + EditorGUIUtility.fieldWidth = RevertableHelper.fieldWidth; + EditorGUIUtility.labelWidth = RevertableHelper.labelWidth; + DrawProp(rect, prop, label, editor); + } else { Debug.LogWarning(this.GetType() + " does not support this MaterialProperty type:'" + prop.type + "'!"); - editor.DefaultShaderProperty(prop, label.text); + editor.DefaultShaderProperty(rect, prop, label.text); } } + + if (group != "" && group != "_") + EditorGUI.indentLevel--; } public override float GetPropertyHeight(MaterialProperty prop, string label, MaterialEditor editor) { - return IsVisible() || group == "" || group == "_" ? GetVisibleHeight() : GetInvisibleHeight(); + return IsVisible() || group == "" || group == "_" ? GetVisibleHeight() : 0; } // Draws a custom style property public virtual void DrawProp(Rect position, MaterialProperty prop, GUIContent label, MaterialEditor editor) { - editor.DefaultShaderProperty(prop, label.text); + // Process some builtin types display misplaced + switch (prop.type) + { + case MaterialProperty.PropType.Range: + editor.SetDefaultGUIWidths(); + break; + } + editor.DefaultShaderProperty(position, prop, label.text); } } @@ -165,8 +177,9 @@ public virtual void DrawProp(Rect position, MaterialProperty prop, GUIContent la /// public class SubToggleDrawer : SubDrawer { - private string _keyWord; + private string _keyWord = ""; + public SubToggleDrawer() { } public SubToggleDrawer(string group) : this(group, "") { } public SubToggleDrawer(string group, string keyWord) @@ -181,7 +194,7 @@ public override void DrawProp(Rect position, MaterialProperty prop, GUIContent l { EditorGUI.showMixedValue = prop.hasMixedValue; EditorGUI.BeginChangeCheck(); - var rect = EditorGUILayout.GetControlRect(); + var rect = position;//EditorGUILayout.GetControlRect(); var value = EditorGUI.Toggle(rect, label, prop.floatValue > 0.0f); string k = Helper.GetKeyWord(_keyWord, prop.name); if (EditorGUI.EndChangeCheck()) @@ -189,11 +202,11 @@ public override void DrawProp(Rect position, MaterialProperty prop, GUIContent l prop.floatValue = value ? 1.0f : 0.0f; Helper.SetShaderKeyWord(editor.targets, k, value); } - else - { - if (!prop.hasMixedValue) - Helper.SetShaderKeyWord(editor.targets, k, value); - } + // else + // { + // if (!prop.hasMixedValue) + // Helper.SetShaderKeyWord(editor.targets, k, value); + // } if (GUIData.keyWord.ContainsKey(k)) { @@ -206,6 +219,13 @@ public override void DrawProp(Rect position, MaterialProperty prop, GUIContent l EditorGUI.showMixedValue = false; } + + public override void Apply(MaterialProperty prop) + { + base.Apply(prop); + if (!prop.hasMixedValue && prop.type == MaterialProperty.PropType.Float) + Helper.SetShaderKeyWord(prop.targets, Helper.GetKeyWord(_keyWord, prop.name), prop.floatValue > 0f); + } } /// @@ -216,9 +236,9 @@ public override void DrawProp(Rect position, MaterialProperty prop, GUIContent l /// public class SubPowerSliderDrawer : SubDrawer { - private float _power; + private float _power = 1; - public SubPowerSliderDrawer(string group) : this(group, 1) { } + public SubPowerSliderDrawer(float power) : this("_", power) { } public SubPowerSliderDrawer(string group, float power) { @@ -230,8 +250,9 @@ public SubPowerSliderDrawer(string group, float power) public override void DrawProp(Rect position, MaterialProperty prop, GUIContent label, MaterialEditor editor) { + editor.SetDefaultGUIWidths(); EditorGUI.showMixedValue = prop.hasMixedValue; - var rect = EditorGUILayout.GetControlRect(); + var rect = position; //EditorGUILayout.GetControlRect(); Helper.PowerSlider(prop, _power, rect, label); EditorGUI.showMixedValue = false; } @@ -251,6 +272,21 @@ public class KWEnumDrawer : SubDrawer #region + public KWEnumDrawer(string n1, string k1) + : this("_", new string[1] { n1 }, new string[1] { k1 }) { } + + public KWEnumDrawer(string n1, string k1, string n2, string k2) + : this("_", new string[2] { n1, n2 }, new string[2] { k1, k2 }) { } + + public KWEnumDrawer(string n1, string k1, string n2, string k2, string n3, string k3) + : this("_", new string[3] { n1, n2, n3 }, new string[3] { k1, k2, k3 }) { } + + public KWEnumDrawer(string n1, string k1, string n2, string k2, string n3, string k3, string n4, string k4) + : this("_", new string[4] { n1, n2, n3, n4 }, new string[4] { k1, k2, k3, k4 }) { } + + public KWEnumDrawer(string n1, string k1, string n2, string k2, string n3, string k3, string n4, string k4, string n5, string k5) + : this("_", new string[5] { n1, n2, n3, n4, n5 }, new string[5] { k1, k2, k3, k4, k5 }) { } + public KWEnumDrawer(string group, string n1, string k1) : this(group, new string[1] { n1 }, new string[1] { k1 }) { } @@ -291,19 +327,48 @@ public KWEnumDrawer(string group, string[] names, string[] keyWords) public override void DrawProp(Rect position, MaterialProperty prop, GUIContent label, MaterialEditor editor) { - var rect = EditorGUILayout.GetControlRect(); + var rect = position; //EditorGUILayout.GetControlRect(); int index = (int)prop.floatValue; EditorGUI.BeginChangeCheck(); EditorGUI.showMixedValue = prop.hasMixedValue; - int num = EditorGUI.IntPopup(rect, label.text, index, this._names, this._values); + int newIndex = EditorGUI.IntPopup(rect, label.text, index, this._names, this._values); EditorGUI.showMixedValue = false; if (EditorGUI.EndChangeCheck()) { - prop.floatValue = (float)num; + prop.floatValue = (float)newIndex; + Helper.SetShaderKeyWord(editor.targets, _keyWords, newIndex); } + + // set keyword for conditional display + for (int i = 0; i < _keyWords.Length; i++) + { + if (GUIData.keyWord.ContainsKey(_keyWords[i])) + { + GUIData.keyWord[_keyWords[i]] = newIndex == i; + } + else + { + GUIData.keyWord.Add(_keyWords[i], newIndex == i); + } + } + } - Helper.SetShaderKeyWord(editor.targets, _keyWords, num); + public override void Apply(MaterialProperty prop) + { + base.Apply(prop); + if (!prop.hasMixedValue && (prop.type == MaterialProperty.PropType.Float +#if UNITY_2021_1_OR_NEWER + || prop.type == MaterialProperty.PropType.Int +#endif + )) + Helper.SetShaderKeyWord(prop.targets, _keyWords, prop.type == MaterialProperty.PropType.Float ? (int)prop.floatValue : +#if UNITY_2021_1_OR_NEWER + prop.intValue +#else + (int)prop.floatValue +#endif + ); } } @@ -312,13 +377,14 @@ public override void DrawProp(Rect position, MaterialProperty prop, GUIContent l /// group:father group name, support suffix keyword for conditional display (Default: none) /// extraPropName: extra property name (Unity 2019.2+ only) (Default: none) /// Target Property Type: Texture - /// Extra Property Type: Any + /// Extra Property Type: Any, except Texture /// public class TexDrawer : SubDrawer { - private string _extraPropName; + private string _extraPropName = ""; + private ChannelDrawer _channelDrawer = new ChannelDrawer("_"); - public TexDrawer() : this("", "") { } + public TexDrawer() { } public TexDrawer(string group) : this(group, "") { } @@ -333,34 +399,45 @@ public TexDrawer(string group, string extraPropName) public override void DrawProp(Rect position, MaterialProperty prop, GUIContent label, MaterialEditor editor) { EditorGUI.showMixedValue = prop.hasMixedValue; - var rect = EditorGUILayout.GetControlRect(); + var rect = position; //EditorGUILayout.GetControlRect(); + + editor.TexturePropertyMiniThumbnail(rect, prop, label.text, label.tooltip); + MaterialProperty extraProp = null; if (_extraPropName != "" && _extraPropName != "_") extraProp = LWGUI.FindProp(_extraPropName, props, true); - if (extraProp != null) + if (extraProp != null && extraProp.type != MaterialProperty.PropType.Texture) { Rect extraPropRect = Rect.zero; if (extraProp.type == MaterialProperty.PropType.Range) { - var w = EditorGUIUtility.labelWidth; EditorGUIUtility.labelWidth = 0; + EditorGUIUtility.fieldWidth = RevertableHelper.fieldWidth - 12f; extraPropRect = MaterialEditor.GetRectAfterLabelWidth(rect); - EditorGUIUtility.labelWidth = w; } else extraPropRect = MaterialEditor.GetRectAfterLabelWidth(rect); - editor.TexturePropertyMiniThumbnail(rect, prop, label.text, label.tooltip); var i = EditorGUI.indentLevel; EditorGUI.indentLevel = 0; - editor.ShaderProperty(extraPropRect, extraProp, ""); + if (extraProp.type == MaterialProperty.PropType.Vector) + { + _channelDrawer.DrawProp(extraPropRect, extraProp, new GUIContent(""), editor); + } + else + { + editor.ShaderProperty(extraPropRect, extraProp, ""); + } EditorGUI.indentLevel = i; - } - else - { - editor.TexturePropertyMiniThumbnail(rect, prop, label.text, label.tooltip); + + + var revertButtonRect = RevertableHelper.GetRevertButtonRect(extraProp, position, true); + if (RevertableHelper.RevertButton(revertButtonRect, extraProp, editor)) + { + RevertableHelper.SetPropertyToDefault(extraProp); + } } EditorGUI.showMixedValue = false; @@ -377,8 +454,6 @@ public class ColorDrawer : SubDrawer { private string[] _colorStrings = new string[3]; - public ColorDrawer(string group) : this(group, "", "", "") { } - public ColorDrawer(string group, string color2) : this(group, color2, "", "") { } public ColorDrawer(string group, string color2, string color3) : this(group, color2, color3, "") { } @@ -410,19 +485,20 @@ public override void DrawProp(Rect position, MaterialProperty prop, GUIContent l } int count = cProps.Count; - var rect = EditorGUILayout.GetControlRect(); + var colorArray = cProps.ToArray(); + var rect = position; //EditorGUILayout.GetControlRect(); - var p1 = cProps.Pop(); + var p1 = colorArray[0]; EditorGUI.showMixedValue = p1.hasMixedValue; editor.ColorProperty(rect, p1, label.text); for (int i = 1; i < count; i++) { - var cProp = cProps.Pop(); + var cProp = colorArray[i]; EditorGUI.showMixedValue = cProp.hasMixedValue; Rect r = new Rect(rect); var interval = 13 * i * (-0.25f + EditorGUI.indentLevel * 1.25f); - float w = propRight * (0.8f + EditorGUI.indentLevel * 0.2f); + float w = EditorGUIUtility.fieldWidth * (0.8f + EditorGUI.indentLevel * 0.2f); r.xMin += r.width - w * (i + 1) + interval; r.xMax -= w * i - interval; @@ -441,12 +517,29 @@ public override void DrawProp(Rect position, MaterialProperty prop, GUIContent l } } + var revertButtonRect = RevertableHelper.GetRevertButtonRect(prop, position, true); + bool[] needRevert = new bool[count]; + for (int i = 0; i < needRevert.Length; i++) + { + if (i == 0) needRevert[i] = RevertableHelper.ContainsProperty(prop.targets[0], colorArray[i].name); + else needRevert[i] = RevertableHelper.RevertButton(revertButtonRect, colorArray[i], editor); + } + + if (needRevert.Contains(true)) + { + for (int i = 1; i < count; i++) + { + RevertableHelper.SetPropertyToDefault(colorArray[i]); + } + RevertableHelper.RemoveProperty(prop.targets, prop.name); + } + EditorGUI.showMixedValue = false; } } ///- /// Draw a Ramp Map Editor (Defaulf Ramp Map Resolution: 2 * 512) + /// Draw a Ramp Map Editor (Defaulf Ramp Map Resolution: 512 * 2) /// group:father group name, support suffix keyword for conditional display (Default: none) /// defaultFileName: default Ramp Map file name when create a new one (Default: RampMap) /// defaultWidth: default Ramp Width (Default: 512) @@ -466,9 +559,9 @@ public class RampDrawer : SubDrawer private static readonly GUIContent _iconMixImage = EditorGUIUtility.IconContent("darkviewbackground"); + protected override float GetVisibleHeight() { return 18f * 2f; } public RampDrawer() : this("") { } - public RampDrawer(string group) : this(group, "RampMap") { } public RampDrawer(string group, string defaultFileName) : this(group, defaultFileName, 512) { } @@ -489,7 +582,8 @@ public override void DrawProp(Rect position, MaterialProperty prop, GUIContent l _serializedObject = new SerializedObject(_gradientObject); // Draw Label - var labelRect = EditorGUILayout.GetControlRect(); + var labelRect = new Rect(position);//EditorGUILayout.GetControlRect(); + labelRect.yMax -= position.height * 0.5f; EditorGUI.PrefixLabel(labelRect, new GUIContent(label)); // Ramp buttons Rect @@ -497,9 +591,11 @@ public override void DrawProp(Rect position, MaterialProperty prop, GUIContent l var indentLevel = EditorGUI.indentLevel; EditorGUIUtility.labelWidth = 0; EditorGUI.indentLevel = 0; - var buttonRect = EditorGUILayout.GetControlRect(); + var buttonRect = new Rect(position);//EditorGUILayout.GetControlRect(); + buttonRect.yMin += position.height * 0.5f; buttonRect = MaterialEditor.GetRectAfterLabelWidth(buttonRect); - + if (buttonRect.width < 50f) return; + // Draw Ramp Editor bool hasChange, doSave, doDiscard; Texture newUserTexture, newCreatedTexture; @@ -561,10 +657,10 @@ public class MinMaxSliderDrawer : SubDrawer private string _minPropName; private string _maxPropName; + public MinMaxSliderDrawer(string minPropName, string maxPropName) : this("_", minPropName, maxPropName) { } public MinMaxSliderDrawer(string group, string minPropName, string maxPropName) { this.group = group; - this._minPropName = minPropName; this._maxPropName = maxPropName; } @@ -585,7 +681,7 @@ public override void DrawProp(Rect position, MaterialProperty prop, GUIContent l float maxf = max.floatValue; // define draw area - Rect controlRect = EditorGUILayout.GetControlRect(); // this is the full length rect area + Rect controlRect = position; //EditorGUILayout.GetControlRect(); // this is the full length rect area var w = EditorGUIUtility.labelWidth; EditorGUIUtility.labelWidth = 0; Rect inputRect = MaterialEditor.GetRectAfterLabelWidth(controlRect); // this is the remaining rect area after label's area @@ -617,7 +713,8 @@ public override void DrawProp(Rect position, MaterialProperty prop, GUIContent l EditorGUI.BeginChangeCheck(); EditorGUI.showMixedValue = prop.hasMixedValue; - EditorGUI.MinMaxSlider(splittedRect[1], ref minf, ref maxf, prop.rangeLimits.x, prop.rangeLimits.y); + if (splittedRect[1].width > 50f) + EditorGUI.MinMaxSlider(splittedRect[1], ref minf, ref maxf, prop.rangeLimits.x, prop.rangeLimits.y); EditorGUI.showMixedValue = false; // write back min max if changed @@ -627,6 +724,14 @@ public override void DrawProp(Rect position, MaterialProperty prop, GUIContent l max.floatValue = Mathf.Clamp(maxf, max.rangeLimits.x, max.rangeLimits.y); } + var revertButtonRect = RevertableHelper.GetRevertButtonRect(prop, position, true); + if (RevertableHelper.RevertButton(revertButtonRect, min, editor) || + RevertableHelper.RevertButton(revertButtonRect, max, editor)) + { + RevertableHelper.SetPropertyToDefault(min); + RevertableHelper.SetPropertyToDefault(max); + } + } } @@ -635,12 +740,12 @@ public override void DrawProp(Rect position, MaterialProperty prop, GUIContent l /// group:father group name, support suffix keyword for conditional display (Default: none) /// Target Property Type: Vector, used to dot() with Texture Sample Value /// - public class RGBAChannelMaskToVec4Drawer : ChannelDrawer {public RGBAChannelMaskToVec4Drawer(string group):base(group){}} public class ChannelDrawer : SubDrawer { private string[] _names = new string[] { "R", "G", "B", "A", "RGB Average", "RGB Luminance" }; private int[] _values = new int[] { 0, 1, 2, 3, 4, 5 }; + public ChannelDrawer() { } public ChannelDrawer(string group) { this.group = group; @@ -658,7 +763,7 @@ public override void DrawProp(Rect position, MaterialProperty prop, GUIContent l Vector4 RGBAverage = new Vector4(1f / 3f, 1f / 3f, 1f / 3f, 0); Vector4 RGBLuminance = new Vector4(0.2126f, 0.7152f, 0.0722f, 0); - var rect = EditorGUILayout.GetControlRect(); + var rect = position; //EditorGUILayout.GetControlRect(); int index; if (prop.vectorValue == R) index = 0; @@ -713,19 +818,28 @@ public override void DrawProp(Rect position, MaterialProperty prop, GUIContent l } } } + + // Obsolete + public class RGBAChannelMaskToVec4Drawer : ChannelDrawer + { + public RGBAChannelMaskToVec4Drawer() { Helper.ObsoleteWarning("RGBAChannelMaskToVec4Drawer()", "ChannelDrawer()"); } + public RGBAChannelMaskToVec4Drawer(string group) : base(group) { Helper.ObsoleteWarning("RGBAChannelMaskToVec4Drawer()", "ChannelDrawer()"); } + } + ///-/// Similar to Header() -/// group:father group name, support suffix keyword for conditional display (Default: none) -/// header: string to display + /// Similar to Header() + /// group:father group name, support suffix keyword for conditional display (Default: none) + /// header: string to display, "SpaceLine" or "_" = none (Default: none) /// public class TitleDecorator : SubDrawer { private string _header; protected override float GetVisibleHeight() { return 24f; } - protected override float GetInvisibleHeight() { return 0f; } + // protected override float GetInvisibleHeight() { return 0f; } + public TitleDecorator(string header) : this("_", header) {} public TitleDecorator(string group, string header) { this.group = group; diff --git a/Editor/Test/KeywordTestShader.shader b/Editor/Test/KeywordTestShader.shader new file mode 100644 index 0000000..339fd95 --- /dev/null +++ b/Editor/Test/KeywordTestShader.shader @@ -0,0 +1,89 @@ +Shader "Hidden" +{ + Properties + { + [KWEnum(_, Name 1, _KWENUM_KEY1, Name 2, _KWENUM_KEY2)] + _kwenum ("KWEnum", float) = 0 + + [KeywordEnum(key1, key2)] + _enum ("KeywordEnum", float) = 0 + + [SubToggle(_, _SUBTOGGLE_KEYWORD)] _toggle ("Sub Toggle", float) = 0 + [SubToggle(_, _TOGGLE_KEYWORD)] _toggle1 ("Toggle", float) = 0 + + } + SubShader + { + Tags { "RenderType"="Opaque" } + LOD 100 + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + // make fog work + #pragma multi_compile_fog + #pragma multi_compile _KWENUM_KEY1 _KWENUM_KEY2 + #pragma multi_compile _ENUM_KEY1 _ENUM_KEY2 + #pragma multi_compile _ _SUBTOGGLE_KEYWORD + #pragma multi_compile _ _TOGGLE_KEYWORD + + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + }; + + struct v2f + { + float2 uv : TEXCOORD0; + UNITY_FOG_COORDS(1) + float4 vertex : SV_POSITION; + }; + + sampler2D _MainTex; + float4 _MainTex_ST; + + v2f vert (appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.uv, _MainTex); + UNITY_TRANSFER_FOG(o,o.vertex); + return o; + } + + fixed4 frag (v2f i) : SV_Target + { + fixed4 col = 0; + + #if _KWENUM_KEY1 + col.x = 0; + #elif _KWENUM_KEY2 + col.x = 1; + #endif + + #if _ENUM_KEY1 + col.y = 0; + #elif _ENUM_KEY2 + col.y = 1; + #endif + + #if _SUBTOGGLE_KEYWORD + col.z = 0.5; + #endif + + #if _TOGGLE_KEYWORD + col.z = 1; + #endif + + return col; + } + ENDCG + } + } + CustomEditor "LWGUI.LWGUI" +} diff --git a/Editor/Test/KeywordTestShader.shader.meta b/Editor/Test/KeywordTestShader.shader.meta new file mode 100644 index 0000000..d55fb83 --- /dev/null +++ b/Editor/Test/KeywordTestShader.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 52d4969be96ad35418215d6bda45665b +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Test/LWGUI_KeywordTest 1.mat b/Editor/Test/LWGUI_KeywordTest 1.mat new file mode 100644 index 0000000..f46de2d --- /dev/null +++ b/Editor/Test/LWGUI_KeywordTest 1.mat @@ -0,0 +1,34 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: LWGUI_KeywordTest 1 + m_Shader: {fileID: 4800000, guid: 52d4969be96ad35418215d6bda45665b, type: 3} + m_ValidKeywords: + - _ENUM_KEY2 + - _KWENUM_KEY2 + - _SUBTOGGLE_KEYWORD + - _TOGGLE_KEYWORD + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: [] + m_Ints: [] + m_Floats: + - _enum: 1 + - _kwenum: 1 + - _toggle: 1 + - _toggle1: 1 + m_Colors: [] + m_BuildTextureStacks: [] diff --git a/Editor/Test/LWGUI_KeywordTest 1.mat.meta b/Editor/Test/LWGUI_KeywordTest 1.mat.meta new file mode 100644 index 0000000..33c2403 --- /dev/null +++ b/Editor/Test/LWGUI_KeywordTest 1.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bb8663d0faf43214abeee1d0c3fdd118 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Test/LWGUI_KeywordTest.mat b/Editor/Test/LWGUI_KeywordTest.mat new file mode 100644 index 0000000..64c32ab --- /dev/null +++ b/Editor/Test/LWGUI_KeywordTest.mat @@ -0,0 +1,32 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: LWGUI_KeywordTest + m_Shader: {fileID: 4800000, guid: 52d4969be96ad35418215d6bda45665b, type: 3} + m_ValidKeywords: + - _ENUM_KEY1 + - _KWENUM_KEY1 + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: [] + m_Ints: [] + m_Floats: + - _enum: 0 + - _kwenum: 0 + - _toggle: 0 + - _toggle1: 0 + m_Colors: [] + m_BuildTextureStacks: [] diff --git a/Editor/Test/LWGUI_KeywordTest.mat.meta b/Editor/Test/LWGUI_KeywordTest.mat.meta new file mode 100644 index 0000000..0021ffe --- /dev/null +++ b/Editor/Test/LWGUI_KeywordTest.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 64f63a798b03f4a448ef2a853da686c9 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Test/LWGUI_SampleDrawer 1.mat b/Editor/Test/LWGUI_SampleDrawer 1.mat index 73bd0f6..dd553b8 100644 --- a/Editor/Test/LWGUI_SampleDrawer 1.mat +++ b/Editor/Test/LWGUI_SampleDrawer 1.mat @@ -11,12 +11,10 @@ Material: m_Shader: {fileID: 4800000, guid: 7ee048c9536c0344bb8b4860595a4d9b, type: 3} m_ValidKeywords: [] m_InvalidKeywords: - - KEY1 - _GROUP_ON - _KEY1 - _KEY2 - _KEY3 - - _KEYWORD - _TOGGLE_KEYWORD m_LightmapFlags: 4 m_EnableInstancingVariants: 0 @@ -28,7 +26,7 @@ Material: serializedVersion: 3 m_TexEnvs: - _Ramp: - m_Texture: {fileID: 0} + m_Texture: {fileID: 2800000, guid: 87addb69bcbcc9b4ea7336eff8d6a52b, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - _normal: @@ -39,31 +37,58 @@ Material: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} + - _tex_channel: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _tex_color: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _tex_float: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _tex_range: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _tex_toggle: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} m_Ints: [] m_Floats: - - _enum: 2 - - _float: 0 - - _float1: 0 - - _float2: 0 + - _enum: 1 + - _float: -0.8 + - _float1: 0.33 + - _float2: -0.35 - _float3: 0 + - _float4: 2 - _floatN: 0 - - _group: 0 - - _group1: 1 + - _group: 1 + - _group1: 0 - _group2: 0 + - _group3: 0 - _key1_Float1: 0 - _key2_Float2: 0 - - _key3_Float3: 0 - - _key3_Float4_PowerSlider: 0.5 + - _key3_Float3: -0.34 + - _key3_Float3_Range: 0.329 + - _key3_Float4_PowerSlider: 0 - _minMaxSlider: 1 - - _rangeEnd: 0.6857636 - - _rangeStart: 0 + - _range: 0.42 + - _rangeEnd: 0.67997557 + - _rangeStart: 0.25601953 - _toggle: 1 + - _toggle1: 1 m_Colors: - - _color: {r: 1, g: 0, b: 0, a: 1} - - _color1: {r: 0.7, g: 0.7, b: 1, a: 1} - - _mColor: {r: 1, g: 1, b: 1, a: 1} - - _mColor1: {r: 1, g: 0, b: 0, a: 1} - - _mColor2: {r: 0, g: 1, b: 0, a: 1} - - _mColor3: {r: 0, g: 0, b: 1, a: 1} - - _textureChannelMask: {r: 0, g: 1, b: 0, a: 0} + - _color: {r: 0.6698113, g: 0.40062296, b: 0.40062296, a: 1} + - _color1: {r: 0.07924521, g: 0.07924521, b: 1, a: 1} + - _mColor: {r: 0.7169812, g: 0.44236386, b: 0.44236386, a: 1} + - _mColor1: {r: 0.49056602, g: 0.30266997, b: 0.30266997, a: 1} + - _mColor2: {r: 0.2696155, g: 0.4811321, b: 0.2696155, a: 1} + - _mColor3: {r: 0.5754717, g: 0.2953364, b: 0.2953364, a: 1} + - _textureChannelMask: {r: 0, g: 0, b: 1, a: 0} + - _textureChannelMask1: {r: 0, g: 0, b: 0, a: 1} + - _vector1: {r: 1, g: 1, b: 1, a: 1} m_BuildTextureStacks: [] diff --git a/Editor/Test/LWGUI_SampleDrawer 2.mat b/Editor/Test/LWGUI_SampleDrawer 2.mat index 91248f2..313c587 100644 --- a/Editor/Test/LWGUI_SampleDrawer 2.mat +++ b/Editor/Test/LWGUI_SampleDrawer 2.mat @@ -11,12 +11,8 @@ Material: m_Shader: {fileID: 4800000, guid: 7ee048c9536c0344bb8b4860595a4d9b, type: 3} m_ValidKeywords: [] m_InvalidKeywords: - - KEY1 - _GROUP_ON - - _KEY1 - - _KEY2 - _KEY3 - - _KEYWORD - _TOGGLE_KEYWORD m_LightmapFlags: 4 m_EnableInstancingVariants: 0 @@ -39,31 +35,58 @@ Material: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} + - _tex_channel: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _tex_color: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _tex_float: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _tex_range: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _tex_toggle: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} m_Ints: [] m_Floats: - _enum: 2 - - _float: 0 - - _float1: 0 - - _float2: 0 + - _float: 0.53 + - _float1: 0.15 + - _float2: -0.57 - _float3: 0 + - _float4: 1 - _floatN: 0 - - _group: 0 - - _group1: 1 + - _group: 1 + - _group1: 0 - _group2: 0 + - _group3: 0 - _key1_Float1: 0 - _key2_Float2: 0 - _key3_Float3: 0 - - _key3_Float4_PowerSlider: 0 + - _key3_Float3_Range: 0 + - _key3_Float4_PowerSlider: 0.000088794855 - _minMaxSlider: 1 - - _rangeEnd: 1 - - _rangeStart: 0 + - _range: 0.305 + - _rangeEnd: 0.7474536 + - _rangeStart: 0.24745372 - _toggle: 1 + - _toggle1: 0 m_Colors: - - _color: {r: 1, g: 0, b: 0, a: 1} + - _color: {r: 0.6698113, g: 0.38798502, b: 0.38798502, a: 1} - _color1: {r: 0.7, g: 0.7, b: 1, a: 1} - - _mColor: {r: 1, g: 1, b: 1, a: 1} - - _mColor1: {r: 1, g: 0, b: 0, a: 1} + - _mColor: {r: 0.4852941, g: 0.23907872, b: 0.23907872, a: 1} + - _mColor1: {r: 0.7264151, g: 0.46189037, b: 0.46189037, a: 1} - _mColor2: {r: 0, g: 1, b: 0, a: 1} - - _mColor3: {r: 0, g: 0, b: 1, a: 1} + - _mColor3: {r: 0.3404414, g: 0.3404414, b: 0.6886792, a: 1} - _textureChannelMask: {r: 0, g: 1, b: 0, a: 0} + - _textureChannelMask1: {r: 0, g: 1, b: 0, a: 0} + - _vector1: {r: 1, g: 1.47, b: 1.39, a: 1} m_BuildTextureStacks: [] diff --git a/Editor/Test/LWGUI_SampleDrawer.mat b/Editor/Test/LWGUI_SampleDrawer.mat index c5663f0..ac0ca0d 100644 --- a/Editor/Test/LWGUI_SampleDrawer.mat +++ b/Editor/Test/LWGUI_SampleDrawer.mat @@ -4,13 +4,11 @@ Material: serializedVersion: 6 m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} m_Name: LWGUI_SampleDrawer m_Shader: {fileID: 4800000, guid: ded91f399f8343d4f9b0cf33eda0088d, type: 3} - m_ShaderKeywords: KEY2 _GROUP3_ON _GROUP4_ON _GROUP5_ON _GROUP6_ON _GROUP7_ON _GROUP8_ON - _GROUP_ON _KEYWORD + m_ShaderKeywords: KEY2 _KEYWORD m_LightmapFlags: 4 m_EnableInstancingVariants: 0 m_DoubleSidedGI: 0 @@ -28,10 +26,14 @@ Material: m_Texture: {fileID: 2800000, guid: df4a1e363556192459af030f3e1d4e89, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - - _normal: + - _Ramp2: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} + - _normal: + m_Texture: {fileID: 2800000, guid: 7cfdb589134f93c4abec6de50366e82d, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} - _tex: m_Texture: {fileID: 2800000, guid: 936423d97fbdd3c40bd47377240f5c64, type: 3} m_Scale: {x: 1, y: 1} @@ -59,7 +61,7 @@ Material: - _float36: 2 - _float4: 2 - _float_keyword: 0 - - _group: 1 + - _group: 0 - _group2: 1 - _group3: 1 - _group4: 1 @@ -75,5 +77,5 @@ Material: - _hdr: {r: 1, g: 1, b: 1, a: 1} - _mColor: {r: 1, g: 1, b: 1, a: 1} - _mColor1: {r: 1, g: 0, b: 0, a: 1} - - _mColor2: {r: 0, g: 1, b: 0, a: 1} + - _mColor2: {r: 0.68301886, g: 1, b: 0.68301886, a: 1} - _mColor3: {r: 0, g: 0, b: 1, a: 1} diff --git a/Editor/Test/RampMap.png b/Editor/Test/RampMap.png index d0778bc1fa6ab573709c8a8e6021591348af20c7..756da0f3e9a9589952c238cf966f1d25b1232971 100644 GIT binary patch delta 310 zcmV-60m=TV0?-1GBYy!GNkl=2MT2!exFI>&*5Ijccu220Hd31+YqH_ A!hhvWlp`2h(Gow<-jr@5 zgyTen$wnhHctB}zq+RrFkhX6;xS_LiOb3WbP$prRH)Cj@IbzHyKU&8;YdF8H(-RY8 z<{3G#=h^CN9qi~ x5Ubnak2a0`12y=$5&=W0j1fsJgS z-OH|N$?ckEvM>AUa87TLwQLR#)IMbJTql8(z)9dF@P`R}0d-U}PVvT+p#T5?07*qo IM6N<$f(ZPL&j0`b delta 272 zcmV+r0q_3M0;&R#BYyz#Nkl 54$Rngn)PK6!KLiGb19x+xM zphDh!-atsZGoLpwXobY7q~;QA7!e1qElpa+&h659$JM_` lM?gVwQD#~MLErD*H9_0UAw`6jto4Z z;Bv *NZIzIIJa z(%048(!tu3-on}z?ko=a+|&x9hg*q*bOltnRa|AQ?cj?3?$%oVs@j(R4wfQTAV~>& zF<((&0w-%vb9!GVM`sUFUvbdYyrRI*myfwX^jAYX9mGM>mkZMCsi@P-y0}}@3qS-p zEqVBb>4iifJc9h(e1bRWdAWH+xVVM6c=$NEc|^GdMFoWDfBpdhtGQd*h-%6y{9Ft8 zO&nzB>FFxU#pUDU1M%U5xVYPL@rZ~3bMSKU@^S(rI6eHFJ 0cdt_E6J{vPM*%OFqY@{Sb$3^D!+&S+i9JgevkI>l=lWG`nk7%JK96r&()es)7rzu z%iYpi-Wynv@fTqpo|@MGu;#z`92oxlV^=#DPZtk6m;b ?5-g(uwRKP-6p=C7gF zzVQDr^zzN`p{}B`?$+j>F7DbcE{?xsNBtLV^t=Fb=~;E*&Q>ly9&DEz|M`KnoVlm9 zIEa@UIDT$nPF`MZZeCGtAyIw-4sKylZtfpLRRGbnGWRt9m%+l?+}xr9yrR4!e+_oA zg4_80uS2aYMQvQ%oy>uQgFBhqT64KN+g`1vq9O`)_V6@!wzP)IiGu)AA#k{rsHHV8 zFE6*X04J}Yg%GEpCBFcth@~J8r-g+TA1@!bxrG2X->>iGTr9mVh3fMAANpnGVhPOg z`!qx?cz7&@tgX#Cg>8iRIj#BmZ8$Bs`Gh(7t%WUl`FMmxcm>UW&8FrK2UOhL@y}T= zsj>oQv@y5l6|xZ#;It9ov*8pF ge_JA)uqeB7$5z+`ylo1N8s50sp+e;|vFw z%nPEwlo-(~3bX+50!R=P5a1K|`CJ|DYwf5f2M74(@q-irL4ca8Z?4|y|M`xOhwl;} zuJlw?5$*v cA{V}bNoi)I+ z{~Ou;G0elo#?!~#-CEif;Pd~g8(ja1cn@>$|AlmG3mYC0esfMiK0ZK9E&2I4Eo?0K zIR$LY1+1+Fg)Dfjg??@Q-;vHEAj&WFOOyUP()l2~f2#G5k1XxXoo%fFQ^W=Of4><^ z5nd}H0c%T6K)@|IZ7lgMIEDFmML2DQEQPIs7ed_p{QqGy{}UGeyUqLyM*a7jv2=0v zws!wRuw2dE%>i?2?d~BCvT=8DqBnPSb%a}9=@^%{v(-;4^;<3JJzePk0iplMG%IU& z_#ZOx=PJKRp#T4Iz5i9>{yR+k!N`A+xc`%f#C7Q={D1+je?^ENzsvpLq{8LdT$x|d ze}@JCtqcP8SQG&G-;n?R44i+g@ACf@ YU6+SOTQigPT1v-zr8=;m*4)QwKJfp z?tphlH0dEH2~3NsP?$L3bH%-MjQhBXPk?%A(>Ut4b5 zb{Q_&+va&@B1T={nyuD*}51@f$HHyh^VtMGgA*F-lMnjIgH5F!K9T#di_ zm_Z@=30Zvg&C=dn%5BsK+LfG0kMq5sNk4P<0Rx`_)05o4HUxE#X87^jua9YUkQI{U z> |Ct*We#ywyh(2hO-qv_+UiA5LB>Bvf7$i z@agEDJ+9mBXv`^|E1lGR$^F-!!rR^`Nf`}`R~j!NO6rLcjIZA2F}$y`9n85M_w<&} z&iU!Sn%Eb) Tn>Bn;OH<8#Bq1vKBXZ#$n(Y0_4BFGvr w3r;)`RG!8{ z0;W)sy_YM<{C-q(rbxH!V%B4@)Tp6SE{GWnrs*^E)y$@O3l=X)R{0kW; se0mLi+v7^Cw9GMA+d{54`Fw^jN?Xd; gncgU j%@(Nn&=cHb%vzo-EcaJCF9F5%o0F+8Qt2Z=w~% zp%tqS`g$~-FX%M=@#Dt@1Z(zd9VhWYG#tv&m&Uh7R7bN4<9Py4T%Sh48f}Hl-03fw zE2WP=+32;Ur6ztS`zeOQl1KR4nBlo3BcbrfaFqMuC#W|9&~8wKhMf-Wf%*BFScN+# zBs*rfnCQ8~>0spr*SErC&qHOAWo4AAT`+JNRU-aU5mn@*Mke>ECxR9YzF(GB`_t v%kc?|F9o9^k$O;x7eyVg` zlp(ox_>Rg&?ECqC+I1O`ArTA3!&=Ku+=HZPn3MljY27F@a?WT7DW`$lnoH|9LCXa! z`!U4F2%!&w`|S}}=P;OdviJHUDj}05@9oX8;%{G%$&$6Rskq@cFV)QVJ-Xf^qFgc1 zq kUswj8ZS1sF z(sFIkSMO4yX~xp=GSjjKCI#5JHXA2m+Sq+o$)AdO`|8|uh!%*HzWVY8v@`cMaWW={ zSAW68tUMO-jC ztiLMQnz5LlqWRk1v+j5O&707$ZKE&@b#`r5H#4=8J7(%Hb{~^Oo1+y)h$oRYGKkoz zTj6{62 *=?ukJq*hJ!4~wHeE)cr)2H1_)t{Y_sbq2_cErHmdvyOae-q4 z`<+tz2ABL<5%QT59qunmH`ba~qH~`wv@Hl=X!uZe+X0?)<2Da`c0$ pLRAyZ!R _m5|XHZ)#qs>gj`$wbRUrkC3SGsh8GWgu@jnr)LTtqaJn9 zy#KaisXjOx|LuF3!%SZn`tXOnwTzAHGDc!yYB!_$nlljr4F)^CY{6oX+|?GX?c@YE z0YoT`cqo>l_sD&eQxsGe)u>Zuz6%|lPg@kzj28+vv$`s>PhnUOaWTI ;@^_ZD)iYsv%wl>#sk5znleAu_f-$3Kh5C6IJgfTztUd4*EIVWG zK;YBW@MUGv@ewH}` aaYaq~r6DJ}?1hZeG_TT5-y(92*bWb!t&h#VVN|q9I{E zzWsNPs2Fd@jtXXFr(nd=u{~8ubVkmsRv~`%zH$*bV!P Kg`brhx2wcNGXzqo zUu6@;uoSmW1eHspil|OB(5$Ir8+yb7y0<=Bs1+x9Q7`&F5{D|~pw#6 hSKQQ(qS8KnLpuR*GU`{f+4Sg+6O^U2Tbg3lXrH+KoJI{@-Blgh1 zg#uv#tGJ&eN)345HmKbCvWEqY!o4_AH`=LbHy(aFI@=5FfJ`-fn?mzLLj$A9i<$E6 z96hU?QRbUla<*2OE1(-?zu5s+ge3mMl`DHpa47)wiQNe-4x-%$$eD?b?CMMv!-UCl ze8VH_2?(f5^Wiv*t9i7{R8nRAra^U7qat8F+mUF*{k28tN!hJjX6xgPCp%22qYS2} znTz~ePgm0&vqJ=BGp2i#ogA|V5Su70d7`gvOATt2u;K`lwTG!#;9OUhPzqh0?^f`l z6L1z_N-LRp&1~ZsSLjn|>1c-6E0vTtm~{q1q~xqm~+v?CY7d7(VXMXfleN%&;tZ zm~za5n-OUNV38(W@+sHgvrot9xJ49%elNXeZ>8p6tgAsb`uo-maY7sA$T?hl|HYri zWKl;>4) sBPS)3f?UN}*woI1iL zUiladd+D(@z^*&s$k5d9DL%Lno(QI?TG`G!swMHUsJ!yzpPv)5?j}q~3hU9~?;1Q{ ze%k@YSr-Jcy&l+oQO_j#{qf_41s|Wz)fNpaqv5x?Py1!I` sp<&s`Z{l8b2C3T_ zX`UPE$Cpju*b@_4)Rq~^|1HrWl0<-KIy@TP<5o4Bt2Z}X`&wEDFX!M^42->1D4f^* zO8iMsFq`HJN{&Bh- %00{$?nOl%Z@mr9 zAPHvV+wo7R-+Ht>Z$}vX0zOJc5rSnAHhW#RD>va^yfb3xg0v45uacI1XtD!5*J~&& zl5~X=EkvyCV2$a `%)aiH zzZl7$cf$8*(%_Ffri^@6O2H3e@8aMN@2f{XPIO?qlBVCRHItDt(u{ui`0$Y%wDL!+ zDfN~?z2hya&V6*o?1WI{>rHPJ21}ndR@xl8bw?kzze#O+)G!~jE3%&3W@hQBspslC zxSF+(8c{}0AkpZd*Z*;$2=aRVOhyhtiG#)*)*pQx ~M2-`(l`no$7t)SS{FUJ$_Z|*rB_GN{9Q8Sl9J>hG^XP}|FD7r~ ze9XZs+@$=pK>BHcwvR}+OibTuXn=v??rVktX@-~549+3%SWNuh)^bkOO~ym7|GDoF zOerZN#4Oq`MJyLb>g8g<7tvA6c=yp+ti(vk!;Axut?AeMtAJh%8>It0b#Wo>PmKJ- z)7<4YV(b$6Cqln+1wzq*nE5NsujOi4=yhrSa!h3w%)x**9UbEh{}S<#`-hFv1F%22 zA@x6}A^$%$jd}rWGw>PdjOhR@?$;VSBL9}C$w{y=zkW%A#__qmDK0C@1^xSK_(+!Q zeL=^`-H_1s0$x5oPCCM6IuUoPDx3bBALI=%L-t_zgaS8$ZA;g)CYO6iB7aLCpu0c_ zrH3)u2F{9WIom9rl_3=zYI85s{`9R6h~{-l^x|8mfB<&9MBlQp1qe|M>zp$IyS&ju zz^LFjTd&dNv_4)sv$xWF{Q1N8^_)28>FVfPu2r{U+Hvcwx(P>~Vma6d4%9l$Kmcp^ zhDIXL7jWg4JL6nN3p6TTI2NPsuMG|k4Af=|4d5c|L*|F`VE1vTlH%jd<#msJlVfRa zy)>xVe4izYhD)ti?`pok+W&yIEknfPGFF-{sM;CIxgFB9%WPFla{NpOU)XndA&Jv4 zW^U- (Wk>{_CBBMaIqy>97_i%(t|5aMEtvKmZ_hV> zeE B+l1|a?*ud-fcVtoWR~UaU8lY`44YJ(BQ^BhoUvIm!xh8 z&(t{FA6;-IFP08N?avU|?}}%nuAbDYy%XlOHJ(LPvi_(_)>bOodN>#Qkb(>~1lXOy z(2V#@gwXXES0J=}zgjaNUq_tPW>91QmP)FLY^B8S`%S~zo8RwgJa)9Gkh`(hIKufk zuvm?H^_6YR+}y$8_WP{sXe$q6=3tkMQ8e58*u6IRtTpg-Z+}oSj?KpJXv+399&lbZ zC}?hZKMXpZ*rPf9+6K8PMv%-jq4`Tfubdx}NB0sTg>t0bqZ}2ML!y^#X)jSpU{;|G zK6h)6t)?xPnKg5LQ#PmJvG#q^GHx-&PIi=VJ6e`U93- R7HhXkIVsnNo25yOOR2A~AMu(CKQy#ZvrQOM zaSaHj@`NhC#|UT6HwP^HR2%VOV@al=&OMgBeUKoC0HLOSe{QpUKP*+m!WZQ^iFaDt z+So*``*^N6^3+Y9$D8tcic5(={DB#8DokB=gA>RV_NLkkJXG>D$zc18CQuHVXR#^c zTC;%K7*({o4FkzAJCu`5O&)0~K}R#kk61Yye(iL6HS^k-={R?H7hVT~QXu^5kd3}n zzLFOqr2} ikQ z2%%KR!DqEf)ejQpaGzC|7mhjyr;d`7V;c^U0&1O$1H!h=6 kW^Cf?`4$OIRI))U^%`Y) tligud@Y@LjGi{>H8_54&y?lSZjIo34UrzaZ4l9~tf`*hXox `&aj^b(Mhtz_f1!&TXjG+WS< 2VUcj@3L5wv3Io9Kryf)sANSHuWRQR$hU&30}5x%SoK=+cGirVZ#RQCI%FY zu~7`eN{Q+07*Eqtp;=;+Zf*CFZtQVkBjYOG2pytA?&Y7zi5kh0Yb2G3EHU@hHq}H# zL^1I{@^;a=VpEh5p3;q8)W-Jd$NP3g75vF4$`2p1QD9T<#R}v@3ZwQ{aNtSHI>Y fTG6$@;QBJ-}@un3j%G59xp7MF^%!<@JMFkf<7+kw?ry8bh zhw&gcpHrYeTJVjY+e@a8%75iA*(s4=#)y7-O>+R04AVeHghF^J=+;s16@WewF^$-J z!4)KOOOKCpaYN|2RZ5o{*cXaOoiM$r8kxL|*m2xGOXo4<5-Js_J(I|PQBpat7wx)e z#4l^LiN33z9}!dkeTY!>F|NVGxM`oh6rPM4eaQ@(+bq=4mT)ZIf^tx0gfzW_nsv3C z(TLK=X$lfwQ6^e;^Nwx0GUN(H6mtN$A2bU)*cfUxk=^QQ$4&dr*-=5xu5TmXw;Y+n z!^g!AiJn)q9bqCC@qeCERF?|VMC05I>^DM?tR=R-PXvEXIQK4@G=;!{Vn!gc4Fn_o zjp?Ckrf4CiQc@EWvf!87=kEGGJxd7o=`qCLl5>ykk~1qckCmo}ONf0ck`LtvQzED7 zPapWwWjiXeX*M$usIz~JHAkur74W4V>FJo=O(5!MSKbu9!D-R83W45|MmBj&97QW| zOzm@Vf*aXSf0~v_5AYbV@hvVD##?$KTc_m5Dv-~HaURc3<5X)$+xh7ZD>ibZ#>R{D zN vNm%f`YUUJ#~t5$Zje2!lEsg3ZCR{T9MQeFCv~uYJ!I`Ry9q! z`@ke_EjB<5w9hN9)%$^k-TX4e^g~cgQItJqA;ygzrb7Vyr7E!NBbF6pIGW0vyw)Hh z&hDH)%QHU=mwG&g-bX~q)0%$5GAqF!Zof?0=N1NEg{GmP9rBFiJ#vI_Zw*rtvReBN`$$#m0<@G-7cLm z-&PQ)GS7|h-`l$|hDE`aK4W01@n>o~Zf^s*=Y8|6>GZ^ Y;n+)>X zrd-}0XTCAze6RWk%?WJN)2?-KU crgiA!RH#%`FT!i@XhL^S6ymiNUr>atd;U-|(YzEbdgNjZh;GT4cgNrpmDQIdq!y z)#1Wgr=iqYz6l!*9 Fy`QzzU3WQ+OEC#_v>I2-A$ncn^K3A1yLcpPN0X+rTuE_5m!;RdtUS z>jO);v000 X`5-o=LT{R$d>O3Ds8@n=L2KP!|1Jn}x*f@`Va4U71rJ< -Le(ezrRB*`60STH*WNOvRA+UGD$ z-H60gqGauzm-nsO{_+Wvh*;;r`iK`gXMzS}0Nb`2TnA0pJ8x!$qk7s+j{)vaO?SKU zM1t|#YNH}q=aUA8Zqui!UAVY0lA8Ur0iSqytNLVoZ@NM2S)AQnk&5WFac>}4X>;F& z4a!_ERH?t-k>CZvunl2+ll302led)1nc39UcA9|4F5g_orYw}rgWF;&YM1v$qUjc~ zn`n_oHBDk|&GjLM>*F@hN5;u`E*ax7xe{Ego?cjfOumV8JKssb3tEz!Ld-=muOh%* zoUDCtx_6=dnNFaa9u_^&d!Wo2{Os|n<)VsLMXTqf*K-eLxBXQ&+oO&Wr<-Dnogk}< zDYo5W&&Bo|7oQA$?8DJC8`IzNtG+Mc=#`Al%lp%G-@|7$MTv2P296l|t64$us1-Mu zwjf)u2C{fY<+A+Y8cf5<7<4nXY>IB&)0G R5hyfSp8UJT-8#Ex`mx_+9WNMi__Yk^I- z&t~WFdKMuPo1pd!x#l}>^S2s)XyRGCXcbO-RsEMdNxyij0Sb^dC2!6iz%<)F1Q^ z<}bWsD2(L>%?o71paE@HJQ>2wqn6$9u{{rOU%?CH2pSv?1GokVld10Yq&PuVVPSe! z*2z7Z+`pLFCVLx5C9E9ZSa}Xk7?~>*d+jcDJMyafQhy&Mro{{$59{zyNZb8O!O~_S zt;yYsECvR#ov(zHl$7MepFXWPpkrfVeH)3IB*rK2=n4x9qYKZP_tE*0+4@-#)m8>l zBRh+aBB+&qASpX`NOl?f`E}$GqGi C+% zMB@h>`KDkH2SqHdFN$XejemHicesbZh#MsL_jq$~TsOF#q(3+|lT6c1&$k+X<32f2 z4|3S3hZ6=irUm$W8ZD?yh5L&f3emShFOwW(pRCl)@ZhNjK^Ou{QYcU_XQQ=R4RWxk z-&qQ6*XuXw(h>pzat0O|b@LxQuTjqlj|Se>UCS06Qh>brMdektg%%m$2kq)D3K5|n zG}Z$G-6BVi0@s`Ai}UV-sl`m(aT`TL$w-q-^L KnIg%LS6Z z>^&tRSwX*(&3N7dYEkLIa#~qSbac<-FZ<(Eddo{IFiHb*DjC^R0=kdeYid+#lH%#> z9VyDT%2rq)v7Y|Uxa&g?mn{M&&!Vcnw&^_j@IjD8Kq5(5hz~9wkeS0_5yda=6-ymO zV9|*kqF~%nu>QDobN#%lfV}(}!@ZzKA-V{fV|*jY9=3n-M #ix*o3AJF0@m;_e zb4fO9z#<|+Me4dRRIi3t>|blfw7gY5-8Xi>?Hdu!Z4-Ofd7}fXm)Y1PRlLpxtt3Hz z-so)$c0v`|KjE-c0~7rr!ZF}8ee 6+OODv{@uN`1!*|`nLyE zx!`5QW-jymwDA7)G~D6#(fa#>qs_%R0=2}9N3k2rnft1JG-E|3X9F1DF5K ~9jJ8_ma2-KrC0feT>&lv&biXH2nC=+YyPCbouNkR*xa|>OsQPA; zEh?+X`RRy%?dee)LTg_^ZF9Ovw+c1A^B{|^TBGx!XcPk~caiMKj{ad2|4Z0I0s`d> zf_(VlF0JPzeHqa>e(%S{oDa{$qn;N@^iwXizASm_f76yJvUi}L$V-0tQI3C2NxDRn z+E=ILGlj_e1mCqGWhqwg|1x~v8R#L<9lu|yGWk@h0s>dxdPldNQRnD7VeZ5$^l0PT z)-uOL+^4*~X~n>tz+qt5U*wLQO>*P1+!aX;1xjX`3~dsW@{2daS^VMMzDi_wyuUnm zKF)L!0ZwfEj@z)fg=D=75jL&`dZwpWzjkQ4UZIEggh&H{eYMM;)KQJcF$l6zms8Ar zyHP2YSf(9EK0IPE(o^)7PD?YK)C6k#d1-U|c6fYG`5QlhQsZx#oK>zSxuX^Dy5GFe zS{60kHq^$$(&-L)DGa&&`KdnMZNVJfna_9-hVQDjMn(995io=U_n)3p$e!wR^5lat zT~mF;Q^4p`N1+IHyH$Ogdw6h#!}!R@VE`whqZo{a_pv%@pYiRT%xWYw)n;eo<9TZK zKS5~^jUsX1-33KI+=C*8gvgz}-+Mp$+Ha&eq8vW80QvYtV~v%8dGoAsBPd DI) 07iW69=PcR?O&x;k`eG1DKk7#^xWT(P3+U=KPswcJ+A-{Y= zRuj%9>pP~XYG&r*oFdI@{9*MGw}pv+a9*Aj!9NNC81&XlgMRGDE+i10UZ4Bbt(CF! zXO?<~2vCi}=@~$#qrX-79M^j6%hW9Biv=ClXcErr2{qr=xn3Q=c^`RlR1!q@r~tHr zpcZc?!&yI=-Yi^aF(T9{P}`4m1eHYNGuW6rOq6@u%Y4do@~}B{zOUP^eCRy>TuWh_ zvipnnO&M~P&r^|<3ZsI1`$8$Pf?RwrhYYD~3Cy2-0DBFV#KDRZ(sGRmRbx;ZeFO(L zhjSr#vBOpHZ#swe9k*|5qGtF*A3B+|#twdbcz)4_VC0Jg6_dN3HajBX|FTq4z;TDq zvIX_UgT-0nnSfln58tm``YawY5Eqml3BHzNr&r|c0c*%K`S9gXX>v>r?9&jPX<(;Y z@mJ2LIBj QCx6@y`HU>2ph zZ0V}j_e!VCKvT~SeZNpc2}4$U>aEA(Jyl5>llj&=s1=GE(QX`(o>a4q(Zz9ehX|V^ zXBe`<-Q GYvx4$+o9T)l{o=LY0eWM)ML>_-cLR*uYH+zCWE+3%u*UTCLnFdZIOK@*sP zO!?O70_Ve+iWR!rGi}Z@P#8U<(ePT68+2?m+%CU`c@W&+0fxIl9rK YA#tmHRX?$eP$^71u#IdD-YYG?znkw&14h!1wKr=##&4GS`L$z z1*8kq?*53YSJI@uKrni>^0T1%(oj5WBf<{`9&t=UKPx)w{74ttduSsETR3;+#>IRI zH`Ev{!foEvc7O?bW#zN{#}GsOA=1I_90jDSTEz)z Vp^z3 zg_fGawgcx2-D(s% z35>+Bdy 8=O< ~Ed?^DGV| zh_&}dZUvkzI6O% a!HAXkGQVIF2iMi#7UGHp-p Jt?}v#gf5m-P82B#c)_< z<=c_wJD|%$>IQ>Z15DIwb961(WZrKr6B(?bsyguE+1;M}kn3m{C(Chz5?@Q~$6JHH zS6FsVcW}&^Cd+wh`s%T=x%i2=X~rl*_J6r2SAK6#h7^Vo!pTcB1XO63%zyX%1n9jo zZV5bHdi&r$E=_xbo%h<%Z941X#L6|vro-)- pxKVrmHZ1Ap>6YpDGyHlcOI2#?hQjttE|!;lT%eEF{^BVKLaN&c0hDjdL51ka z{O0Z9SY#08Owq(!V8}Ni=ULy2^HYGA>^}QI@0^vbZL;R|FNp$4MNcw;Hh@ReB7_yz z{%XPiR>4Q|4|nEnwZhmfMu6fXkaTSF8F{(>3dr_;d|wgm8Mk+Ljcpn5c^Aw<>Y!xL z)xK1a@_V3TZ+9;Y6^GXg8u;X~T%QS}!o!6G^yCiHb{@-jPlj2im>_IXASmx^{fJk@ z2? @$Ec??0HZSl$hsiM}gpJk$ZQqX5)zAmPPPO7_#iQ<8a3Lh@z8{RJ`D_f! zdnv939Pi`_kqUm9lW?WY56}=H19YT^3n{&x$#H0_tTmPeRI~knt7Wn|ppF#S=@6%3 ztywHUMCaPjpyYRDDv;*q9GFEVpRTTMrmC&2?Td-6(~4PRXxF`e&Bt>XBQVw3<2AC~ z2o@F7wAq#WA0tPausL$LL9HNWYEJ`pL@XWvb;B z-Iez2RdQxJxf=i+hJlf$jm;`hRyOflAsJf)n#uSj-&W|nG>Q(*Qge*;f^2;3POzzi zbn$X__K$)yh255bp5z?8n?m< =L2RX;1G=0 zx$f&gK2^egtmw|l@qm^B1n6)HQ(ib-d$z`9coA`U1Gh;I5-r(&o;X5!L0{Zj%++$T zRBBj<-uF?2q4-(Qk^bG}j(jwR&PNCQE-s(b1RMy( 2Tk$z#( zO6 SB*1JqK=CPy@qk>ca7Cv7y zV?q#{pkUHxyq2#!w_0v6$c(>vlk;yyf(qzE;|PB+MB4i;9^MOT5A2$mZuH`?Mno}z z?4oixOL-vCTwXPFJkokB+nvBM7p*B4z>* RyjbY zzm9m4!_Xc@6$unCU1dX!htFf-+uMK(r9r6Z1e$s@T*QtN9gc292-ejfY?+-Y=whr{ zNO=Owh6tpmP{q1bjkTY %nVb_VDJw{z;(yWW|hEh;asEHpEy9uF?5`>O6dO2V}afd!x zUw!wkno`Is;t5PM{bV(RZMa%~`>p1%$g JQAlhhNWy(sLgM_zeXh&1U5rr239>R3zI7?Og(r zC)MO&P6!lSnH5tlak^vBz=V5yGh8V`3#$iu$EdLr5}giVw|n*NXokt{@kr aB`Se3zq+*Y?O5s| RXir1HT9T3&`KAKndh zyDb;TA{ukM%6CUo>d&IbHo^JK@^2NoP+X5!c$IM3QGT275KQRvz tn}uqpZy{BCFYrd*&`B>R5->*o~v%lMtS4NT)DCe3F+2d?& Mf^y z1IEL91~A|{3Vl8N+u7mqTX6hI8@A^YZlIcZRs!@ljIX+JSP-$u%R8~Vj-&*!kq$IO z0p5~?4kcjQT!S&5bb(XH=Ep c3!-j(k$ca9W7qvmYpk+-O%OmAAeWF$H#caN z)6&v{goH$THzQ$4L2fv_FIHE9^VIKXp3Y`lf{)2o>f0)Y1`p81+5h|KuJB(9j{bxy zIadrf+6HK~VX{?8PwVI3DlK0VX55K5scS>+;2`kRHoO0+ow*;R?_P55v^N23Oct_n zzj RBKZwxjjo(>do_$WShU7 zH<>njAZy%X#P8 ;AWfBK{> zF?akSc(83(iS%yLGD39RQ89GpJEw4o(Xiwy?c@iKz_1Q`!elE3Svd1g(YOl9fLm(7 zO0(d+7caDCzP@gKkU(%%+t}gy8HC00N+KMLNRhiDgLq}C%nf alwy zYrjyXX{mf^+$0#0y7M_Gjrywex@$(bFvu9pl#`u(5(YoJt^e&?iEfz*aQn;2F4%F5 zB*((>^uALAY;SKbCN3^`zh9`ZE$Cof!zOiicbD~OpDKB@**l?*rQ{-Lh=3&dU@If2 z_!jO<0s!h;fMV1?8Ek;zPoCbZ&*k-jQa`upPs6~#n05Je`|$?hLL5^t`~G+NyKUd^ zk_tMib|BR3l$iYj0!C5_XJe^FLbdh}4sLqiHq!jyui~O+@S-7?&i1qZaII-g%8A8s zBI@4<`uqUs$ehDUX6n3Z&_oZ3QD_5Z6v#?XPp86gz6mG=U L&mgyky z@tuZJf3W;p(xx*0A7A~Jy*w6rNMZKeT-WK3LR4Ebz51Ejdb@uVI@V{?)>9TOLAK IIf3Sd$4gG?p^q^u L }4d-FC$0oh?VxIXU$}nR?a)Xk5%vZRKIWNU(2WWMXybqg)Nbsg@Dt;K8EgYM_ z@a$O)!7(6SM?^v4^RG^WzaIw&109cswT`dBA`Q1DlwLNtzpuO#mdv#&6s-JJgRfD| zn8$7-pI{5EhT069YxryU{fIe(pzVd+<^hv|aLPiSZ1w}BvvDuO8khIug9|To{7?Kx zRZ91lUagrJUi9RF*9;~cRz7WOeiAWva-~BJTLf;m0rzj+Jw358F|iN!Rh?(EzN93& z3Gf2 &{*T!wnQv z5r5yhg7g+|xj2=a0HEkWxUo# _^oHNJgl8>r! 2Zk?+O3Xz{xnVMeSvB*90j9$?*|pTv4WxgJQ8XolDCcN7enD7YTw7-@hV;NQTWD zepb;i z_wH2&s3{Hp25TvKMgZ4BXGgo>Kauqk*CvSI6&SrUcqi~9+J5ld)B2aXbA9bsfpxO! zT@m26ac F#^3^LDUzRDPDsN&*LIikf? z%-F<$GxcYsPR1YR8WAMR@%ICXtf+ixpi%F$O)`)DowBfJb*5i5_2jBw&y=prviQ@U zRKM+$?aH}E=fk@IvLMVxjL5FPu3`6P f zE^D=evd_hh-z!CIF!|86qK+lB&NjKqB$J8;kYy$qI%>@ zJMRv?Mu;qPHcln$Wh&$ksA(ud9NWPn{=lWd$z&Rgly(I-PwgixwQSt#;16!}GJ~7r zrC;CRNn+E8YGbKbh}(Df_HL~tn@ac}6x8Qdehqr^^p_I;XhYa2ji6Tkfp6^SA(c%< z1r*8E75n9;YoD|r8{av_0v*naXuZ (D{T~5~Po-%kfF-+od%w zeLEsKF@_|L=o~!KLFq?#Eyo;ON*g3v2aSa2gaRK2-;<1^v8**Q^jq0O?3dm2-}rPs zBBX0dHET~_6eTeiI7{`yb^+nfzmac5m?iS5Yd?e&%}D>Orx*r#zZM>AsiBP|9g=HQ z<2Z$Qo(o(YAbkErx1ehsQOWG=)V!cq?5CC|xJ95<3Q 9wKU*>%r-NmdO-`Zr^e7DM<=Iqr()}Xy7b(W70_d9TW?Aqd_??D nqUnZOUIB7?%2Xm2% z?;raH?3dID_HTa3CJ=>wS<}lA< rfkFQcQ?k}fg7hhVrr6H zq0z2Tk!G9efXNRe_#u(?1@#JJRD{9RKIag`w7Sg4;H*@8=83+d)M$B7XQ{u;;c87f zxD!ldtNk4If06Z-aZxtk-?ktE(kY!PC`hLQ0?X1R-JLGos34t7cXxMpcXuh>C7sW3 zd&lqpd3d=mboZKTX3qK6(V|R}co= AMB+!JB|YL&!S zLl+d*UV%r8PmMWE*H_nNun?7$4;7{vBzo}UR4AWt(V8P#N3-
|P z6>OM3)ei6ye-;=3&0Ro`8`T(esxwxrqfmjzsD>16dDaHa=xlp*R+j3?oE|xDc0?Lk zzmt4i&t#CIMC;v3SyySth5j@$Abx(5tl5>z>39c!e3~u&vtFN(ES&6%x1MVB=-3qd zUi{=O*nmpo(1t3__Nlg|8P@FU{%}RN879(0gQ=kW+uujg{wa=W?SchF^Ve^mMzG|l z&W+7Px`i)LGUx=9=?Me^RZSO?$1`>2+DpL2PYC-IEG~yjkss$c`wII){k%7)Q|Gfa z=e(`Sro`e9P=W?2hG*v;_qe5JG7~B2v$kC>Q~#%`M0;0FA-%5qA6;xBoamSTUXtJ# zUFP(d@HDXMX&Ch4w3)oXUu`%^@F4(R(FZf@RHw=ggSYu>I?Qa3ZQ3aDwr<_s7sCj- zWBYsA%Q6?Z;eHzE*y 6_BEf)Nwgh`uj;`>8IH;d05uD@AI3EQf|Yxq}N^X6=7`O_#+ X^I= zzcFw6)kBW61Q!WiYTtk62i4-nDx+< @bm|hr}T{c!|C3b+$QgY?I}=7 (QDyO@cmh8(7Ec`|!ejpN1}rY}2L#oA3}DT5vy^Mpb+ ztB>`r?^}whqDzUJMsPusD5)HLy~N0P^YuD{?Ju&vQobFap9JzQhp8Qc@#vX?7X2EW z+Ik!OvLF>M=NGJ(B~Rz(qb*@=%MlUcR~j9&KOS<*$Q!P?y8wZbYwOg~{t;=9r&XEd zZ!#=1vjvp(cron@E(YVsngVr=FF_?41M^)E#rp|9SyNab{;r{Tidq0vHayepdn;)e z^luWZfF8-RhsveY(o8%7B`j{XxtTApANQnf{)fbxU*tjqhFlcQyv` FUz{7dZI92$wVA2&aQ l1%t%gpY<)C$3F;UNu({WU}&Q`8BZUS&tL f zP0G3&XO+Ho2;NSRNMHJ{Y0Xh-U|c|MMZLsLWb~Ln0{L`F@%hoU0L4lb#a`ilr`e3z z*cPYEp1hndl#Dvys`5h}jxL-GBinkxxkm6(^G6NE5~0y(X*vp8zEDOeG)>8bbqG=RgsQ|PO~SuQsSU4!sVau2(Fm0tQ;8@s0@dcco3*c zOWvn96z$L}D2Ng<=dmxVfI*z2S+!OxQSi#T)XB5_h5DB50zNf{W)P25oS&M`8!Tn2 zJzw&-9vMMj%-qaV!%-tygs%=H+ydGoBR$>0?p;nCz!fg8L(KjuM-aZ%fa|GCEbt$g z7)V`GkdTw5@ToI+$6PmWdtGH$D$ydW%+9XH$F`;iDebrF0tcKd_Rd~%2)#7x `-NS>K5!L4jK_`-pZKYG;Qs;S*}n$;j9C;RuX<679(xVpm8a6iLLWK=x+(z=fr zkxRT^$VNL55}yJ$7of}{Ic8lgAg|S*F`jMA5gwVH*d>5lq)gH3yFp6+j2XC}`V}+C zHT}gxN6c7sD|mlN*~1{1m+2(7*Ej6(9C6uQVmqcOP$icqBRbwtt>?kNG?$}+?y7N) z#O>_BmmBFxxtVC`Pz-^7|MpzJ9a$Km(-ksiV>=-LlRIJLxm^=45=$&e>AfY%TQS(p z*w`Fx_h50+GC?uT;(=^6@AnAgDvT+qUm%WEd?H`^sKSN&H9s38SR?eqv**vo*(>2X z9aOzTwofBOH^;NHYk BV4{+t*q0 zESzXgw8w3wk3#$)OaKjd^jH$dJ6cG9fH@~@j3m!R+610mx1+yLDYU(L2o-ogCY~?H znZ`22WV3s69esRmzi?{onV%gMDV}HMWB*>C(6WWShE2x$vV+)_kkjUkb>&_)#l$Po znsLJxV*zw2oUX{@Ri(0(ZSt2BD*NRly5f_=r``=z%qAFN3Uw>B)IzoJ8Ljb@C&ad; zXdH-^qZa)`@t3?l1ygM0N~+DFS1Q@V${p4?z%w0BAM9;dM|@qZmoa3Q`9K~26 jfL!hV%Z}TX)hz zGn;?##!$p>jMbeVaCOthoy_)4FyTH>zE|A56d48)0&=T&_4ZhEW)P2&iJHs&7{;)g zvJ1@Nlolo4HJeNzfZ*5rQK*CCj{nx{f<$*=BW)a8byV4*jo1+L+*%9EF}ZZTlGDl> za!nDsO{Rw0<*S-4Gae3m-m)Zbaf=g+jfvX5FkPItbUe1YQ?DZ;)JPCfNPn!75Z-zG zfc)Ui#X~GDCZXMvs3q1iMJFG&lp6Z3Ia1@rau%e(t+|&lK{`vKJ^P;{U`fpwE{obz zCQ4N=2&wrM&2EtQkG;IS%`2{cs0F%A>GoJlFW2VCCRdCjB_y$ug^?}E)R@?l*Y%O) z%6xl^JR}Gk3T8{GU>zXySRZeX(#Q5snJufSn4ehqFqYb(|6F@yCPqJG)Z@tBWctN6 zDpqCDCpi`FQ(aUQro#6t;hn}Y^Cf-cC-i42Yd8UOjOC~dVtXd>%!#@l3^cTRlfBb| zO({ij(G3-pp0Q<*A967G5 #84y^8IW6-c~tgZ^Go-;Z~ z{Ll9O@R))G^a2)0q;Y?4z7LP7B?TieD^sxz%Yua}Qx|YvHc=idFDFLzNgHF~Ml3Hb z4g(`Npi}O=Wk9Ir^@Pss$D`LSe%^io2!ZeDT&yMp)}3pwYT?=;Bk0+mJ_(@Z>ZlNl zU`KlLd`Q5LXueqYGAO&*6)>OAM?ks4JP GSfogTDh=GsoLDvnHgZhi-qy5~12%uwBOIgg&=&{Kw zuo({uN xQ0GVd15e4cu-5JS|%U5=uiRPs7aP;l#R)%8!itezpEU z*gsJ2hmSA>6x~`F_Fsa3{TkGM8=pgMwX(QUqbo}M%tAY2-G^xOxtYk(enF8JJi^>c z$Id_1ju1QM>*5yi2cDNNi{W-Oj7x=3G_+q=P>`9WBI+Q`mBA-RmG}BN8b*cY3cY&0 z==11?hN25}B#FhPCFL@s<9^OPaB%sF0TyBXvvl=8USLTEfbwVmWaYHD_)|JcQa$Qk z&;G8(?@m(3W|eQKGJJ4<1W~?uZkd Cu@zDcp`P68%TeVRRJBcu5$G7sZi` znz VCJZ-7b9ZkPVn|?c+SMx;4aHrXQr#^xa32l9GbhBc(7R zeSDPy!=9moDCkrtg=Et8{eG$=+lDd&e-evCYm(z>O-+x;Ab ij1RYb?KOx%XpUvOE9zPBa(~%CAeu9a<>M#6Ht+ z6t2PpPWt+V^VKv0VnmF{9ol+&pr0sKP{Ef;!k)=vIHEPDE!V9w{xGj9pmw3G7^qTL zuTx5EnE4W=K!61OEeBHiMw9(e55CvYU%5Shksz}KcZAh4HXp~ISMA#~@kBqKwlJuJ zZYv+KyLDWOn}vqTYk)EUnZKGY`rfWbFEjeWGqFq%)ASz!L^JUJe|cRi(-&yi<2-dY zZNa{!pg8X5w5uFQ^#K2$SEbeK|Dmu*g97iUqpBZ4;(toK#P6V>gQ6_Lr_&}HxGWBC zmF-wNkRy&1;-RnJb@&?zP<+@p#7-9{$LKE27Kc3T!ZaBjIN3kexnMyWNtZ>(whr#p zechJ? #SqP&oJ&&s<8# zGyZ-) yF~cLomS zDho>8NaS|*w(mKWa%1cpFZj_kMKuTfj>Q3xDO32#{SzjG1*WvDosP5#dX0iwKVB3( zHZ~RxPZp!}&`C;u5fZl%J8KnS7N*KQYGR=KsIOG{nRAWZ`Q~;kxAQR FX59*DJ4SXhqzcALC=NdLLE0V$!u4_4a59*NZX zZxsCp<=0O}3I#5{g8rOLhT|;cuXz}s?P<550$y-8#j;Nj-~w8Ua1_FI=6V-UV%jf) zM2Q>T+uyvlyR(XAMp&96YCM9POhqGSRdtq&$%{_N_2AZ@i?LGWw2~W%R$NbQZU@Ya z%2?i}pP7s+=NZ4C1Nmp-39SJXeI0Z21+Ym2c`m#lTdFE5lRv_GZPdrcN?`t@blR6( zET)~kYCBpfWHj$&O+3>~zRn&TupV`0H^8h40D{WxbUg3C4{8|8OKY#dfTN1zdtVbm zLM)Fr K21cJ1XZ1Y&?i__J-~h|s90a{y|i5c9;oAf5gR z*CN-Bk90We8=GK3R?jGz0L 6svRDHuEiXH>cRmCu??nQ9y`Q6Yob7vg`w9E`r@xM;ZWlOsYnG{b99p?9EF@uG zZE ^*P@?u(^1eDd%dsuwp(&Pa$SW@pO!V%5{Y z3}3{<70H&jc#tgOkNwzVKH2%YROfsAWSi_}QV@uOwb~k|D?B?t&zkUBtHq|MbUyp# z2_l-#=z{))``)eBw@Y!5Ak|j8^{@0v89niXbb_8~0x|n-!|F@06ibhg=i*DvwB$RM z*A-@5hA|>W%jDb37<$AkXHQOWm8nV78XX|fP<(a^3cWR6dfJoGZT)ip>7&Wzhm~;9 zA=(7a-HeuYP+Q>(jip9$r`MI8_*){WSC(Im>01T>#?)K&5NS}zU5Jat@RrlqTt(qX zdTx|sw|@6XP+UccZ@NpdBOF=5$?mYpcB0N6cF;pZ{n?x~7HO BlBO^gjNC+b} z1rzlnB(=P*!5Kx03$$0yN#0_1q7DdHNnCGsW#IVX4e@MsDYg_8B;1_GKXy}MF1I~y z{eWy5a^Al>#mdrKSz_HEx| )}+lmab;lgn@DXvy*ZiZuq;e`io z4-q971)BL O9jw{PRVSgpPjc#dZ(fV)AcLIks+Hs~CgXpk3qu=%v= zeZHk7pSwpz&vv+C;FG+~v9q1^Y%Km7cqvPs{>-g|Mc-F>f7&E5uR$TswPW)r&Aru6 z$muKm)pg|#&*-z@C6|Y!s<(TS4&&}mp1vg<-00{C2mE(_&St5zQ-gEJQ}OlT!>eL% zxw%@8ioWG9SqDY#IKUO9r!XVxj>EXVTsx#6A*vB{FeJ5S78f^?;as4H?BeJ|2@?&e zF0U>(i sz*!cQ>2=hGqy9#r@Iw_BwvrFD zcxUg&(SO>bS#5B;zgkrdj4k`qxKG0G!64c*RyA>TA1xuSJySLHBZEo@UFFv*)E#+H zx)kUziaT_A%9-iz7RxNGO#O`AFxz0i(C^RTQoqwuw`AM?sUt4#*2!i9A}c_~)HO8X zO~|@xOfaN3>9}RioIO9-*Ma+^b=2H+tD>rGmBSd+c%f&Z6%+H3)6B}BKLHdiX5RT( zTO`fi&f@NOrYig2tG`-2rCwz#pv!rlo%$b-oQmRq{ghmb7VddCQ{qrTP1y&^2d?6` zr*uk#4I%mPhngZNyK1TNXrZN!i(ie6GuRz3WNmEpr^{q4g?NETLKo+|ht>ix(gCO1 zD|*AB#(rE7xDvw>uz7qjowc2BX+_zzbC_-N2A$q;Ym!HzkBEo>52k(X2k@E7?20ZJ z)aUf%{dzVBr@aHKFjU;j8-K27%2C-;xR|_dr#qW=bdxG=7l4x($tl1rm7gCcvZxHa zdpuLjckWkFXh&Ch?&l?7#dToG8~8Qa)0AskR8+KFxiedZ;R+0D g8qt@poA{T5tRi6d(ndFCoVJdMSghQOYz* zS$-n4DcP|;6fEYnp41-bK*)==?OoBh4ci50TOevlwSD{qpWix22>2g?ahQiqH)x3R z{Hf^r@ORvV1eCWz b1Fj2i3TD2jPEPVwgfdXB zB%tGfAaZP!vldFzmoukXQ{ W{OEfbh4RE`$&+oRX|p{>%CO_qR@s*%z+ksfj?rjGgt7+Ce9Kc68V``5mjV>w@MwNW5$_H`shC#) zDiV?q5waokJNj3 M!_@w!MDXz-jjvodDq=Hyh+l{_~`DJtWXS%&6tN-%}n zl281NTr0Kdhd!LW1T})b>iaEC*U=R;Ll|2IfQx2$?SHBQ+@(k>lOe)Cmx*wYQ(4b; zfU&$_dl7<2;U3@vZKizL(?oer8(~G__|w}y#mlgnQqwgvV6;~JI3hwU^${DsmlKBw zOeWqt9#NqA16qNVWy^CFblz70#oL>h5KrO5Xsas7jpyt7g1)e?1t}Wh@-oSe$Hl?G z3T9oKoBQ#mp|w@O9UrT*jdHGIOO?I!-*;R?`2lJ&6cl$8An!h}roBMD!KKdOICtjr z$v@e48ZW=qu$#%;biytvJJ#VQL=gf3%7GkWApR>zzMB%u&RJ3+fB+~RnH+7OK1CIx zmY^P EYngUb5(B42dfCR~DHcZs2cJJpgA}|8| z20_iRT- Zmw#Zdo}HEQR;KC@Ij1O{haeSKeW zJW%HT@0l<3fW-zP!FzoK;`18J<~T}>4}kPCj>kD#?7e>fn+wJ`X#QtlQ~@c8bV{W( zLyxaPh&lU3TJ1^~b%IWFH2RKObh}@a%+h+=hQP_+000Oq1ZJqZ)M8u6a-}u!Q Jx3=<&e+u`;VCZqr8bi@NFs!=ZdITwlp0b&y;{ejAt)-qdqwozxl z(rp_iPoy$DUha#P9t}HEw^J1ErG%j9jP>^B4o$WUq$u$*NBi%*tM*Zr dtu=DE(eV{NNIp(^jP{hsvkpejb3dG%Kb2gR!!XsZzfs2TEv{G<$*(|S~yYQ^- z(-I8e@?6-@*Uth|a%{!d)mbTFfOj;>P6!vRqZr=udPO!C5L(@o7qc8cx!=F4*h)#+ zE=U>}neI=@AV$z~2F(6X#$@>T_#=7qRo#>zFor$z1Z7UjVC}jZU6%VI&ktK?rEoJ{ z= -u#BGVcy^%M 8_vh1;;XM8HfRj|@ZPTi1~*@=uG-U+L0J;} zPrdyY1Q$yFKz9-T;&mtaPWZjoN82R>tG1BbJz$qe;BoHd3*rE9OOduv8Rr0q?Cb~u z?OD)e`(xNQTYQzYp@woC=ffrNPn&UgGzX+zfLwF#>kzUI%bOhlN9>3>W0P-y)J ;celVz N4x_A4i8vg{N&fBWA4pWE+fJa_(nO6VYB@6*GpVXzwpIx=!eIwt)GO@Qv@o0 zX||Un9sqPAA(FW^J4atffUSlkqmb_w!c*hO;nDaZ7dx&nKCc(U^U30iNt$h}TM(at z0}C)959lmnO99z1=qtFm&cjJVHC2^g=ng>FzF#Hr70!X=hfY)Z S^Ch8dN z$y^)VR;jfsGO`DA7Qo<|sJX^3B;zGxva??{V#C7Hl(3!OT&Ndm{n$)+iwb6qI4rgz z9^VbCkv*nlhOfmtnt>2pzwkA89 2$xJL2rjXU|o$9 z9DTFDEFO%^AJsSuwu?PGJL@2F%mwpwl;9CC3{B3aCI|j|4hZKK70zlmIL48=eX odg0~vgj~y6b2c*qVWc( z_-kh7u)Rj`uv^;D2NboBFF)G+6Wk2C+(u{8yR`#(S?E(=C}}9H9lt6xHT1@DMuffU zKt69i4jE<;xCiR@5V7SftaZ4-2}l MMcIjq^&uOy_l7l;!mW1lfd-vd>!b;Uv zh7B&)U|K+{-pAz;=sLcfqZa zA_Wkr%|>(p4KK}ZNi3aoC!;6d#|LhQ;NUiQw6L}x!hqyEd6v^0QoP>K$iuFl92Abc z>!8t1LWp6s8UJ$n=tC?cc~c@OTvUR%t=+ikb+UKHB_kJm=Ks9ixm1!=^jW|Z*qH*# zX_)a4u-F|t0em?csE>kAOr%eVFj=%lz-%5ca$-Aw(Lqx9m6q^~RE_mVB07~yNu={% zU2sY$Q;O_Skt82*>sgIen5%PiC})|W3F>+H63ays_&y8c!;12c+EZ0*0D1#clgrb+ z&l!!)RNu=-&)8{5cPU>X$u*geEg$`LEuy};4;-~jDw$r4g7U5=A(-hZa2pbf*>NjE z6$KTzh_W^cv!3+tQ&w#E`nO1oKNdg!NGl8*3PN~sArT~r_cH0stc!*T`ijZ 8Wed3~%{L!=FM{Oxup}nAy1Yyr#ElEE>bp1`|s>?n^=qQaS zwH+E*2ltx2LRji}Iz(6Rp$D#UN#r-|*nOR5BU)Z(u+7n|D`B> !ml0NHQgjGU5{qC*iZ;Pq#vdAX?cMu4Oi30v4kRuR8_2_9Ztp^?1 zQ12+ER6TwRUo>u!u*_ljaAhhO5JjSkfG|vdK^rbmiiXrtwyzLgNztDB@_VtEUlgN+ z9#E9AHHl@?jC>lyp?+ovl2<7frEmySTKNRyS59C3V~8UXeeif3bQ)Ol=rfxG7MqmE zx!P6`V12WIjQRG$N-n;f>Iw}vAxvsMsdgmpwo>n(I7$?tgN@5pX+2=Ok?ZoNKs+Q5 zs~z(**TtMq>sEzHW^>N {5Q{MLaV(ae~T!(wnfesmPKQo=A-)nz;-v7$$_qQ>XV# 3eFbn4M7@_}cwv8bfr9wmJ(xbTvyBWK-&1`{ zdiW6n2E!61r@02aiR%s!c@^T>0@Xph<;7qeK`J{FliY9;K?`Ea(w*7bOzWMWyM42! zxkIf!F@fs3IDta3bLSHypVbA+DS0tgjmhl`d~&E6Bzwt(n)Yh(e&wq8h4nmqP{=-( z^Lgzx4dW4vV^CN^VofNUK0PgM$l5Ub4GiI;Rg|5B {=!L2KFvqvHyvr1$>t%0uM*OYz!z0^f8bIq+TwK6;&{ z!Y=OrY?g~U#s8zUpbt^z3X}bz&hrTT5*EDJ727xez8*{u05KNU#$^_)*-lt76EY4G zRw`3hcAm=mdN&kAV6bqqC8q+2ytf<%SR0PC-jL1dmd^`GQaiCcJ5dUzMuFpX(aaji z3>>9G@5Usc^E~-`BkbfX0lRaF4#m+CJ49~?X=v&7etqpX^oBh*R~ldurRwlAAAhNY zwYl2-6I|z4;AeV!1o-+oE(Z&N!|D{29Cu}z3g3%#KoM!H-gfgBaSqM8yDx2&POVI~ z2C`8-$YFoR)3Z8O_U^M<{QS53-$GXXr|nIylf_EVWzc71=RQ#@UK@1>{6ksnl7C~g zg3wTy_%aIU(R&jkitxQBl@b09cmO3s74$l(RuGIy0{3xWJVaXJrwQUHrM!DNlQI#K zw8&UczR8j)iyfQegJ dA?l4L{A&Un*XOk3Y=< zVjwE$BROGG0m=#0ihE)z#?edVsiqC3z_(kwj;AiciYg?;YcAocPHg^}T7X}{&MvX( z=gJ~3uEzf9!HJax6A$YdMqe{I4b9+8UsTu?0Vb}Ut*%C5MoCK3fTwdybMrBe+BV -83hq IMAub#_oz+1Yw{p~A;ZE*6muD>YIX^edIq{{BR+TpTT z8maAIoB&kthF`CSzI!9sf(mcY!;^=kv2O;Ip;eIqk5EeLh@U!Fw&n|_t$G8 t=I=tCrr93YNV0Rp(UXxag7Ap+2lu@7xIX(l1*cY5Czu^jBy9;X zdakCX_Ua+ZWy*JNS$p&G61Z4=e7q4Qk}=z}2z>yBEg??#Go|!(bnmKD~p`2_3}kYXHwAUbC@1dm)RqxA&CtMMTfsm zJcMsgzkTh7)x6hT+Vdr%-t&7(pXIj-+frqP`a+v&&?4NSuM~j_(|F&i7--s!Ci6{A zq(vk(zLZt_zu*?g7HDrx9~;>JeTWd~XEa*Re|!-osE 2WzcE^92I}cM zIvXW_-r=@4dQ2;sY@g?Ojg1l669n$jY&Cxn0Mu?IV2`I2Kr}Cf_RDm0f+Df2Z3d?x zwN|um`4PwS=g(Hra9%3Dro8Vd__+%<1n_en2maq2V^fdg1O(9Qy=%*XOdlj14%2Y! zYDI)ouLcYg_{ofi9X&wN6wp%yp(I)DX8=KwGH0Nox*KIyN!ku=$D8+5$OBE05j_Nv zd|SfGiU|jcqE+(;f-#Wvi=B}>{IvKX2289dC@AhEL-G8BaPzi7h)U+Z9HEd@jNgNP zjYjT+K0NivgH|S^tW yNoQj^u7_rPno>_MaSF zXWF vO-?Oq>*AAc}ho4C1$D^L*8_U~ &7Pp=t73@qSuj6I$>AP4A?CKp zo`~Aa25TTy8dcs@MWuY*(F*4px3eLyruNOv{c*L9ZkK;<9QVd+pvmk?o*{%mur=X= zcb|Xr5g~ECE4_3X0twj7qM>}$zu?%VyCL`(`sdb< ^OQ}eRuYvKC*`-r+oXu^Ay zoXuxBME 3v>wMhe_%wj~~RWTKKl6YEZ*`NKwx$$<>s|KR&~h{6ba z)n|(X5;m{rWu5!)r003&nO!X^ 99IUiqG<5Q8NW8Dd4RLei>a~1=C|zfv0S(qln#}FK+^2Nf6}(c@9sF-`?zZmi5%h z%+4FS_vl*5_;M1O801CCYUrFv8eZ@2hF~%%F5h6JKYE7c1l&o@cu9^f7aP<@k4Yjy z{Kn~wd4rTUIzwwZh+hJ6PZ;B^fjZZ>*L$wiUt%0)4h{|=5J-kZ0@az99VN=Qd`4>< z@TXdBbq?M)h-C{lR{9k#R!C4RNYvVQ4F~i1?#7g|y|F@n$TBmuu#k8 i7si=c4_0DTP{~12{*R_NC0B9z{=TDgohusUmK$W4Kf8eD| z;YWV#W~McB@rNB;X4z`ed1pE^E|c%=@#r_MySB;@mt11Y2qHq!O^cw `!+wo>l!SnqEwz(~Uo6^jds zH~JF76E3~xA3S%b!YT|Z8mo79+&q?43({d7!8RhQ0HLbxtwD1hEM#;(v@`LM?Ay)7 z-ZVtL;x-lI1N{VbKnMiRJV3Hf{&<(n9rA?4t@i3DR5Y2pZ}nvBi~bBDN5ST5T8X6^ zd+rRN&mTN^*yZ7
yd96Zyvu5do!yuQ dbag%06&f)#!9yNBa6$|U8oYYCMgIp%f zgMepFQ8c}+_ae1)_vY(jM8n;lqMm?pAt`INKSUR>HQo_AXl|{Nzb0VHx}5&})@pae zrSr^XjfX2(i8~5$&g9aV?B6il7Y}sBfF|Qp^+d4c-)Md@=~pQJ$X|_2`Z2tlj2^O5 z>HIG0A)e)|9}H4rGhjY9V-X>6ZSt1d)0;D3@A?hv8?xbvma)0|!~HPF6Q^hbEP_C& z(P;h*M#FOXI_Gzi6cBgWbmPJkx;THayI>h#ySQN@;f`1qo=)swf7;O?Q^%R4RGkII zuQy6qg{Qx?(_Hdbf9_K6@a# Wcu-vsWb)#-NUYP?8_l$}x20;A+?_>c+cwdsGR +1=?H^~EEK(3&R1XHHHk1RHZ)6DD7 zJvOWi`9D#>SG}moJiO`-CB_A1(Hh7WoKNQf#2d+%-&i7pRo~?ygVJO5Q9SFr*eVR- z;MOpI+qgkD6R!ex{Qf3R#*B?AGnwOH)oGv%TUQ4ZP?cvq@ce%&$XTR2N#<%kpTpm4 z=p*ozkk!b%A>vx7au8tkAne$u(-J})U6~3}UgAfx^|fUEetbsGB$N=UDT)b%dkd1F z2MayI@K>>XQ3m37Hi?7JR(HR!GJ1JWMs}O_%rx|Iy0naRp )NeMP5{XwJDnbTvJw`Oactmb&WDR^GN#}Qjh-*r`Jo$< z`Thr#j~Do1&w(j#zi{ww=tr&Ldd!0ygs3_lFiAt?rD}uA%RqhztqOV@JaTvE`gDQ1 z$^WK_* ;VOiB8NUBUzPz5 z`yGaUuS`m$g}ULtEz)2)?SP#RSYtKul14>wnwNF|&3OeQW@so|+~sH8mGc^QS1WaI zX*=@nYW&Xy8$weAa+2t%D#Nwobs@=GbPa_hKQmjrwnwU}@LpcLko|s7>EsXuhGr46 zF2VzD=qipA?_fDWmbW;bRRgs*>$X)->Ue9;?CrL%w;Lkr?K(ElRGmcdcP@L?dK_#L zTo0eXAkUvfFu^+BOWe@0ve1T!)yKzQHe5B>Q|Dt$fvG-UN(H(lsn^|5c@nWv+Z+yG zBbL;8ed^AY+sSC@5wbQ&&sk2)*$hP|{=JcZ4#?2f*R&B#X^zHyltnclZoW02E~_Pu zkRT;zQ6OLj#DIU6*G) =Dh_Wq*E!rK6(7AnG$UejBRImWjPWk;;L;_E|ns9 z4XDCJ95BfOOj3(EBS-0eUUhrfa0^v5E34NZh`+r#ZRiMi>1!?xj8{+&fR#^+h(!Cm zmqxlV_}Tcam34?tEvu0shi`85cRD(Ty^RrR02uW338W$&9URaW5{2_)WsqWA%$@J$ z;Pv6-FYwi0AQ8vSelduO@fFh0@Yb(?jh+5Ki89@xUrklu=nxg(h!oDJ|B(j%Uxy)1 zv5FZXhXYF|6|r@?zwWAg^@b>*-B;J&?KYfx&tCnA9 Ju9mjWXScFDJHf^%gCGj5-Y1LCKLV- zM1QDGy)biQ(nPQLtnQ3O8O&?cZX(o;^~=Kx{o;Jz2LLnCW8yOmNecs>5i)upZ#r}T z3t#x^k*P#LOuEw-K@g4%)NmTz<>SZ3Z}2BK%!TCrHU~pLP!NqOU7R#(85ss{&0f{f zl|-@hE4=L*vKFYx1-2#!t=&u%kY0~BbbaXt< h8Yi;Jx{nM^;iju{{qgOSd KJZH#ywZ23r8qI7Eru2aG4TKo00g{95gaKHaq zej=s^ b_|+rzN-C z-G| JV*)!PoDz#1RX-m1Ss}7D q*1~3BcYG5_dWNLe zA|xEF$3lTfB6g!>Kaql2*b2QQ741>0iauMh*4z8Eetoq?U}j*)eY6yvX|*;Cv`aUx zi~SbVU@;ofX-UJ&vxB8vp!=rM{5bi#^#yYvO{W;}M%4a*91QXUoSq~aF(UPQgIBoL z2nbiieyiqpPdZ63dz$sSK(WN*UYeFf;pBTp$0A`%C{$w3-ehhgMkr8ia-`Z4=`*$M z3{jc@KfL|lM(pd@Ba z0_D@3BK!OoyZY@Phw2m8)$YW(K3cz~ z@oz0PexjWyl9<(jh>WbwO<8d~&qLaD-+@>iRj4Mh@xx-E-HYhutzT`idOW-NnUvC# z0If54xAPN;!0gJsZrIWB?DE2%gL4p36$>`T=YuV>0>n83T)&^+d}0qE3ojh3VfG6W z!E~b9_HqymUD4xqBn`7OlShme6Mfj>_5_nFnFHOjs0c38^x;>S!ayvHsNP}xckGkV zd7cInvbL(aqnqvTvCp0{_7}>JHb&afn^!rVGs?tAjStiFrIE^$d;mA KBWP&rG{kw_beN0PafxtW@V@50(1rVQLl-I)N>`)& z4KoroL;mS$$A=>FAJyl9D&mxPKazpnhqR+0 zk|(bpml;nGIUh;&Cr>(Yi>+(?2z}M H9 _vb?cp3~f&4D{t}UqZcA-`Qj~~x6?5z7zQEc&rgcJkUBj< z)BZK9kA0#Tt+zbrZ;)_2SxO4*(2*2KHO)P#X=w}<_}Jc-40-0Jny9Dscy1KM-d+@l zIMt{7D_;NXNRXNe%mY=YL27@$4!=k=;-K9LOY(a3w15lK49x^C4(a>!AhGAIK&Qq{ zXAHl8Ax>Qdb(Yb`kN2POa-SP`QNYtp?9f_B*GmMjA)Fla{Js%Izk+hNd=N;R Pa?Vl|O+#96u(LzLL_yfW5I*I?BTv$FpXy~~#FVxTXM_6sb-^dZ6(+e}c1PO^S z$S4$qpU68En-;u^><|O-pGic2C(Au U86N{Vy^DxK)*AOSI)x 6lulxqVy zebbTW$^(it!?m-{^{30td>;Qpe%>eDAH=A{p{M2HiHGoOfj?hm1AgeVvdapuPG=Ah z7TrncKovCu+BJ}GOt Ay9>a|$>($^49XlhmF=dsh zdwScE!?{pRpk@6mwK6$BA5S|U7Z;b8@5awt|3n>UkMH$HCYg{ZUVE6#kLakL$Zi~5 z1m$NGQLDu;?v@E{fSm-b YtnMU+9Rrq5Z!5OGDpjlJOHm z D`Qn@(9CQ!^#ZCw%w=ls!M-K}O2 < %&x3SUre2}FrJujn*Ed>Qnp&DB7FfC7 z)D~`$T8v3AN;77&YIP+3 Tgd2+}DnwWPbHOIo_SS%gS8EMn2!AtDVD(jXz--QA7wO}6gy zp7Z_Pv3O!WGwyqgYbcmd^T~C0cg(OdQKXB*33{PtlKGl*{W64!(Uaw(jqS;`V|}Lh zm>8nICxc09ADrK{6;E#$q~!@b^Q4R;_#Cx@9GjHXvr$G+mtOf`dZr^BQ9ek;OJ3nS z29ZobT2$_Vu#PDg0hi6;u?`zITSb9Nrn+H0)*ZeoW8~OHnc=uy5gL}l^L^sIwq?qZ z<#K?8=38=YliBA5((IDJ=n44QV2l22);2G@sHg~tVUB{E_V7!bO@d_J=q#_VcQRma z{(6bD$I+0wVujtpr>kak5JXhelLq&%ib@VH^A3)x4^9nFEgp^=DJk0i8y17|(hIr( zJHIaLA)T=hhDz>Q+;P3xCxLXK%5p~W>IFVWk!D?N3?S&1W+9r8{#|pLlUzz zKZ*=bwcGsQaqA|}P5adL^|MIo)7=*eb YgQj|ljUzmt0r>H;B2___piy=?HBjaTpuCf+IghJBNrv=?sL0Bxk>Pcc5<8C* ztpIiM4Ah6O)vLshXg2IaCmrT478tG?&*w;aSJ_PGqSna@uZ%=JwfD}WH!~rx^TrCI z!u<=$HEnj2#(*uZ*7MdwS3jE8`%_(shkTXtQe8P8bur!mX_;X{ZV7PAqY~m*=o;Ty zW4PGO&IjUKoF%uDxfo&h=mnd+-gtj0NxYf)L9WNiTIF;^%dfB4;FXaftMYx6ZZivd zabY&a{ri}1E4$?ND6%AMrg#K|osFBGcsWOr+5oBC9nSNVu+oeuKkaxW9ygI}af zusQV(2XrD0ql^54LHx@9fR((0_|m@DW`WRSj4&Z2^Z{|hs`~&`D@bY6Rx~ z8(=35{9qTr)Y!i(=>MX(ua5v2p5_P>EOkYd6TYP1H# sy8hO z{VPX@g?WnP)S?d^DF^4+(3WpWP3s(cL-Dk ztm>WI6sLoaq_tH~yNd{hu#c0Wb|YKt+(r|1Q+6AIBzW?HIN8<$1P_h@MH0}`UZhA* zBvWc>yO5L6g1&D65br6~*~o9o2fnB0(Xa6Y(dut_gvmK=G6`^A9$z67I%9a;^Mb zeseaIxnM!|0op+B`K+twqVhQ0Gf?IS>(^&>I%&uE+vm|1RllN8+xnb>;I%$2o)BJ! zcB)~J8h7)G7>x?yHQJOwT%dOyeA0Io6ybR%*&%1gu>`6o0ME&D<2N??URdiZ=^Kr5 zBZe108bwa{Za!%Jdg}e-oi!1)#ZgjmP+YCo>G2U|LVLAjgblXCuKDsYP+s1VW5)92 zykAmQ5Loydd0hb4$&;r?Cnril#aYkL#AkQ=j+s5S6#P9qLqh`3tgTs;SrCPt5h8^w z9?QJDl(byxbLUD9VVIkdi=4_kJF+g?wA3Ey*a>eHlpdZN>!_YhFUXD3)IyTSVQ~1= zm?EfezkVWbNgoun7WYOX7n{3+a03d2d0^NPo)`0HQb{8a-jO}1janmL31&98@Jw+x zS{;d;?#>3Z9k*74h%4?g>un!;I@`-iZI-V` iJD~C2VCZ&g5l9}Ti zQp*10$M!Rqn-Lg`YX7s2!h9_u!H=kBA?Y&wKR7ty)$4h{IkOopr=rp|J27-_`Yn*a zud2Vc%;H6VD(K8=pYn;K5Yhm#l*L0i@V$Fn?Lg?6O4*&s$?Y>TKsXVpT$M&9$p=<& zL<%`~U&cmg`I*S?d+{}et%&j_!1o=)QlO9T0G@x-tKZj0{UAGIft~X(6DzHiUo;f= zWUTR~!f|I3_Zrqv_td=q9+w7pR3Ult?S5 1(Xo3L1V%^*f548hF?-=7A}=K~^}9e1-*gPTix$g7h2Q{1`;tlXK|=LB5mHESt) z*=kxI7Y4n2`S_|6l@{v7+}ve`2a9bv+?g4Dsk|kw^Qhpk*I824y@4F_T>WkvCVT(M z2XHJqs;<~L)jD-8)*57BZ+8`Ewa{b;yz}!?=SyCKn2?&aHLd7p*m{TX+@bG0?0ZG^ zIxhvoIG*kc`S^~By%$9R(09WuNI^ u{81@U1in9D= z2T5`PFiRm6%x8s6(!6^|PM;$p?*{CjY^4-s$`!yD<#E&gk>v5Gz`PV3qv>o* <=TprQe*r{p-t6p+q{{TIv^@m>tdasUU@|F5qx?cSDVII74_V*QL zF`cUyp8J73X+HqH8UUVpRJca5Rxq14mL=Drg5}&q;Z}ut;zWg~qB)o7n{8d})aD5^ zTZhAC@#O#tDQAa|6?VF}#Y>m_Pa7&-C4f!K8J{>c7WL|&&n1(CZDgZhvc@GniIKnD zpKLV@KHpuiZNjYvVr8kYkiF<<8@^W~z0txgM|)-WPDqfCNG4(QOJDG8j)#;6@$aL) zfG{L0ElPX?7qg)r)%qzA$~T)WUJp#T+r(Ct9&~t`A9w;SfuZfIrM^ri4edn**WNxj zxXMoj;9M>SGo1H=^cT4(3MoZHawa5lA H`K3_wH0-GU$$uN zsuN(mVKwbm7>x=Dbpz(0OiAdr{{!U91lTN5M}KF>EhH}EoI!smoa6zbLM(6+TCYYY z1{@aJ !6tVR)^6ZPMcV;-Yzwe}!WAqCgE?7e+fRd^ zoya96)k2?Oed24IJFC8mjHqzIESd9>6*$&uvI=mjb+CM0`NWAgTM(}yxR!=DW4R1S z#;0L(7lWUfi>7&XAXOzoj5acfFj%wH$#jh!4G<#H!}nPcFo5^s)K8AvL3;Q6fv$4( z0;MIArqalW-9{RHe;*-puGJM#BFv35E**An`^4pS(-Q#g*!0dE$cO|cKLFJkD3W$q zlqjfmk=mX-1cgeIB@kIi2~sZ04a^CX>zQqX)&R9GS&Q*>rngL6n;BF1B%ll`Z+=We zLtzC>Z`tG+n@W-yMk}y_Y8Me ^C zQ5f;^xbT-Ral~W?16UDXxc%M=JG*sSL%f}I+p UyJDQWOEQt zZy@+$oMyl<_wLeecQ^dz;C#*&`d)Q&WpRFEF BT=*IB-+%i&%0B4q>BzfDW)`ui1ISJKd(S*pcC>xi+ zQH8DY{>HiEJK+D7`c*UI^7826lssZsEJkJy?>^k!?u@gLcw^**D#`pvLPJhV66EE{ehwlgt?ZAj8hATc^mo*Ldr()|b4{ zWzXU^cL6|~HUU5}^bOOZ)hQ3*$D84T#jAl#(Hh5<>I6L|XuaZzdwYn4a=MHuzw5VP z)mIc1C9^0r*!J7qUItTZY{nW+TLU8p;s^cT9gSCZAMJi2$nKhizT3-QF8Zfhff;l6 zZMr>aZ;K~~5L15-c!por4*uZk5O!TwF{Kiaq}ypcQ`?2DyUf%& B@Es< K5TRNrh^vv1?|p(OBJ28PRGD|W&`l3(Lwow1^S&N?2`fUH2Z z_xJCWvbyp)_EvWpq^DB2IM|qhCYuxGJaUrsT0G0G#4wULOzAyO(;FP~m!)(Zh+{U% z>eJJV+&mOPDF-iFUt8deNUqJpa0%_8W_@ObxfJapR~Lx$>3wv`VqR enAVXmkEKMR-eiZRNNSA2L19VniAW1MTKehf>V#O6VMQTEkx-so z=CLB1O$0FeJT?WfklJBI^A6=sCyM=m=P2JbLCQ|=YVU8@RXRY%h|cL}!V$rZ+TRHc z1San|=M$(tE0LJgGr}dlI0}JTYn4`dG^ci4nlHDZC1SH=?rwo%x_Y3!62Y2B*hbw5 z>;MFa$k8BnAu6h6%Deg;XrkP~(fl1LkzJ@nvE|{gGdBJ^>v_On2@MNte> sE6lg5)j#ML?d_%C|x} zzqEpff%ki{PDUn)vp}-(1vW2_5<_O+Y3}GYdrjoi>HCk( rm8{9~=)Ic#;Gk5KRf;dt*tkGvXg9>J zlA%A?zOY44&x4KgTI}g_2X(60R(&l5iM%ZWu4l}4?w-b7zbfOy6&(s smIz2?dMK%esOWd@EVIUuDtUveD-k( o99%#Wu$;MTsuU(?FbfaCEqD zTS=)Sg-O}H2Rqgxc>6?Lh(K!kLPH7vO$bL1+M}3uEBC>cbS4+;zHr5Yi7eH%Qf9Sd z{F>8lY%_Y#SMz(hX9u>wHag9qhkMZnyFct+6kt+P@2g> k!*Uae^d1(8c4A8}pLB7F!*7V|}Hx#;ulL^Qb!QwpCxjxDJ5ecuE1 zyd11?P 5Ob zlIZZ`Pji!9`~NIDXCZfsju1+E)O)KZfNNTH#rrc`63#Ld-MEbgl^aAdYNaSke0n&~ z$nVCez6(27?kLA-h{^W9I9kJo){!9pEwtY!17+Y0E!YH?rGX+tV6zBlugtxl TAk&yF1830qtE>QqRxyyux300t(!cX zvaPYggkq=*qvbPxUTW;|LRgIj-e?B$8xsK1Y(vo0h@UAD&eX)Xib^!x+wDTW&Q$RK z6+*_Th^8a!pNrh4@Z5YPu87M1VTY^7!n>fGp1rxi=kK1k**$Bww!dlnlmuiAJ^A2N z0yA8(s>T~{PUdp3`+9G ;eO#KaO(7OX$Glx; z>dRR}a+-;!cvd%Tx68=6)G?X5x+ z>Y3O)^_W-N>8iUI ziUM66(+EM2lxouoTokG{1y57^m4 $p&8V<@GPB;=7R^^=jPe-=e5 f4JA}89w_=K@s{w8hE;M+W7|BcY1 V*Gb1-POSKn4Iw)$3P6F&Woq#Lgr^ z7JCzA9W3-+ 4GZD((JhN_`bi|?h z5Zh@(`&6}&;)3Kl&Hf?+h)Uy^MHq!6?(O8aU^z6o=xGYmH@Ra)TQpzxN$K+e5@Gt6 ztyyt5v@Fdw?{iO*DiFksve#k6H;1Stik#)RqK)#cErU4<0~IPD3!8kjF;ps--0#R> ztX0La+cY$mN?UeT)k{nQR;_fipMcm98Wv)GG@?hIqR!}u9}{;7Od>5Oodu$^uZ0ts zO|xWY;uj~VKn{A=7rF`fXHEn{ZVm@Vhw4CQfaQK@fvYS-Od_H(5?^eD6_)7}1w5uC zHZmdi;r9CNj3NOK)LFh_tT-Q1L^6-w=6LSZqWXGC3KYq*1l82%C1 kunD=-AUWK)7pO^vYE>tHPiyW5STM(gjN5C@oC?cAmujMsE?Xr9ileHE@KQ@hiz zSe^l;>6gY+ZW8gDEG&1?uQ5!sz>? gX;nsU^AjIQTW6r%{yxwN$(P#+@M cVcRi91&Di#%VJ^cdOdBT2~cb2DKEpd@4J1f_nTu55J!c-~ qQ!x }VJ@&e9^aCgkqN-d zhPS#Xhe{8N#h=r@$TbHsuy@+-L(#j93`v(98(>*>d8#yZP$zZ@Ff@~wZh%TBUHcO(#%2lQ!1^6_t1WT)E{*CJ*-~(fvj5Yku+ooTY zFChYG0Igh>f_Rn9ccPSN$)FbuL=B$`VGovIND>8D+Q^wc=(fl9!%8DkyIcn?QhO9_ z6t$OtS8~3XKuqJHlowv4KIyptSiL#qiY?@!=8(my t|kU-+0g|r7hx$W+!;Z^9bpIV z+Um@0>nYosaS>r$@3K;`l)NPc1R4Fefr|f!+kWR~=sGN~p8Nc~(UzIxWXa*c)~5BT zoP^0$@~xK5%|jTPs;N;0XL90{(Wr#RVC`6=y8DLul3Fr73$5EN{I={cMh4k6Q_{Aq z&_|Nv;MNw;VZB$`9v#bPV&hp| lZmEPC<%>UV)#q< z##9QNAhKiHC5~u$05FqW;+;`s>yn9>W`%1dUPONrV3z9+5>WXdhA{N=Cq>?C2qs+U zp5j=KYdP6$=$G;W@ke1%ABeT8L8a$NO5fC!`aWk{iZmL1pfkyIZy*L`Q@}$3vIDbf zAgl8b1$c`X7U!#-s`wk *(L%mro-Mh6QF z^zv~Y&J{0aAu(jwc c;C7mP9XBB!m^r_@k#bXVfWhZg9doOzfJUAS;akS6l$Q!sn zK_r>T{{C>prxE%$w_KLPk`m#P 0a)-Z!3h}Wp;hO)7M{C_dcsPRH@_+LWe8Px-W&n5&C;)9;Ls}!%#N(zPgCz zHApv1#&xhiwqN8)f?AQ_pKDMIi1^Z>nt$f}=)tmmFPy&^FMM}AgbxPVUGg4@ud6CZ zU8iSbTY7oX7rwaYeB7OVmy?Q85;suR8*nNm9?8k#z!+l#+;LHQdYuxPAS-4S`Aiyj ze`+8GWWw-0mlM0%Ovrbt?28{L+&S-~YnW+t9{IX^EJL2N_kuotrf!C`kKjXbeH7wq z%3SEDk8rJCTv@-s87Rc++`g|9@SPgVb(t3E1Sj>GFp|P~K4nOcjY^Sn7>?`{tih!O z+!Q4PNG~@4*o=x!+ULzI4sWDF!SpwnXaJc#O!;jPD_e-906Lw^!VEVMdoPKQlkP~Z ztgXDlhkw0Vx}7}Tm8mzPHHMhW%gPcx&EGn&8J ((4 zR_00s){%}VO^O~(=*rfbot@M4MQT8vaW~^dbsd>