From 1d54fc492b59de91c0de6d4081fe172646880d18 Mon Sep 17 00:00:00 2001 From: Arend van Waart Date: Mon, 22 Jul 2019 09:13:15 +0200 Subject: [PATCH] updated to version 0.2.3 --- ClipperComponents/ClipperComponents.csproj | 21 +- ClipperComponents/Helpers/DataAccessHelper.cs | 12 +- ClipperComponents/Icons.Designer.cs | 2 +- ClipperComponents/Properties/AssemblyInfo.cs | 6 +- .../Properties/Settings.Designer.cs | 4 +- ClipperPlugin/ClipperPlugin.cs | 4 +- ClipperPlugin/ClipperPlugin.csproj | 14 +- ClipperPlugin/Properties/AssemblyInfo.cs | 7 +- ClipperTools/ClipperTools.csproj | 2 +- ClipperTools/Geometry.cs | 1 - ClipperTools/Properties/AssemblyInfo.cs | 6 +- ClipperTools/clipper.cs | 8782 +++++++++-------- clipper-0.2.2-rhino6.rhi | Bin 0 -> 99311 bytes clipper-0.2.3-rhino6.rhi | Bin 0 -> 99474 bytes clipper-0.2.3-rhino6/ClipperComponents.gha | Bin 0 -> 21504 bytes clipper-0.2.3-rhino6/ClipperPlugin.rhp | Bin 0 -> 19456 bytes clipper-0.2.3-rhino6/ClipperTools.dll | Bin 0 -> 62464 bytes clipper-021.rhi | Bin 0 -> 43942 bytes clipper-022.rhi | Bin 0 -> 99236 bytes logo-food4rhino.jpg | Bin 0 -> 156352 bytes logo-food4rhino.png | Bin 0 -> 40132 bytes 21 files changed, 4447 insertions(+), 4414 deletions(-) create mode 100644 clipper-0.2.2-rhino6.rhi create mode 100644 clipper-0.2.3-rhino6.rhi create mode 100644 clipper-0.2.3-rhino6/ClipperComponents.gha create mode 100644 clipper-0.2.3-rhino6/ClipperPlugin.rhp create mode 100644 clipper-0.2.3-rhino6/ClipperTools.dll create mode 100644 clipper-021.rhi create mode 100644 clipper-022.rhi create mode 100644 logo-food4rhino.jpg create mode 100644 logo-food4rhino.png diff --git a/ClipperComponents/ClipperComponents.csproj b/ClipperComponents/ClipperComponents.csproj index b8b1ffb..a66b9c2 100644 --- a/ClipperComponents/ClipperComponents.csproj +++ b/ClipperComponents/ClipperComponents.csproj @@ -9,7 +9,7 @@ Properties StudioAvw.Clipper.Components ClipperComponents - v4.0 + v4.5 512 @@ -21,6 +21,8 @@ DEBUG;TRACE prompt 4 + false + 5 pdbonly @@ -29,18 +31,17 @@ TRACE prompt 4 + false - ..\..\..\..\..\..\Grasshopper\grasshopper_0.9.76.0\GH_IO.dll - False + ..\..\..\..\..\..\_GRASSHOPPER\0.9.76.0\GH_IO.dll - ..\..\..\..\..\..\Grasshopper\grasshopper_0.9.76.0\Grasshopper.dll - False + ..\..\..\..\..\..\_GRASSHOPPER\0.9.76.0\Grasshopper.dll - C:\Program Files\Rhinoceros 5.0 (64-bit)\System\RhinoCommon.dll + ..\..\..\..\..\..\Program Files\Rhinoceros 5 (64-bit)\System\RhinoCommon.dll False @@ -71,6 +72,14 @@ True Settings.settings + + + + + + + + diff --git a/ClipperComponents/Helpers/DataAccessHelper.cs b/ClipperComponents/Helpers/DataAccessHelper.cs index 9d41623..68abb31 100644 --- a/ClipperComponents/Helpers/DataAccessHelper.cs +++ b/ClipperComponents/Helpers/DataAccessHelper.cs @@ -14,7 +14,7 @@ static class DataAccessHelper { /// /// /// - static public T Fetch(this IGH_DataAccess da, int position) { + public static T Fetch(this IGH_DataAccess da, int position) { T temp = default(T); da.GetData(position, ref temp); @@ -27,7 +27,7 @@ static public T Fetch(this IGH_DataAccess da, int position) { /// /// /// - static public T Fetch(this IGH_DataAccess da, string name) { + public static T Fetch(this IGH_DataAccess da, string name) { T temp = default(T); da.GetData(name, ref temp); return temp; @@ -40,7 +40,7 @@ static public T Fetch(this IGH_DataAccess da, string name) { /// /// /// - static public List FetchList(this IGH_DataAccess da, int position) { + public static List FetchList(this IGH_DataAccess da, int position) { List temp = new List(); da.GetDataList(position, temp); return temp; @@ -53,7 +53,7 @@ static public List FetchList(this IGH_DataAccess da, int position) { /// /// /// - static public List FetchList(this IGH_DataAccess da, string name) { + public static List FetchList(this IGH_DataAccess da, string name) { List temp = new List(); da.GetDataList(name, temp); return temp; @@ -65,7 +65,7 @@ static public List FetchList(this IGH_DataAccess da, string name) { /// /// /// - static public GH_Structure FetchTree(this IGH_DataAccess da, int position) where T : IGH_Goo { + public static GH_Structure FetchTree(this IGH_DataAccess da, int position) where T : IGH_Goo { GH_Structure temp; da.GetDataTree(position, out temp); return temp; @@ -78,7 +78,7 @@ static public GH_Structure FetchTree(this IGH_DataAccess da, int position) /// /// /// - static public GH_Structure FetchTree(this IGH_DataAccess da, string name) where T : IGH_Goo { + public static GH_Structure FetchTree(this IGH_DataAccess da, string name) where T : IGH_Goo { GH_Structure temp; da.GetDataTree(name, out temp); return temp; diff --git a/ClipperComponents/Icons.Designer.cs b/ClipperComponents/Icons.Designer.cs index 5bb05c2..664cfe0 100644 --- a/ClipperComponents/Icons.Designer.cs +++ b/ClipperComponents/Icons.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.18444 +// Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/ClipperComponents/Properties/AssemblyInfo.cs b/ClipperComponents/Properties/AssemblyInfo.cs index aa2e5b9..b8f5042 100644 --- a/ClipperComponents/Properties/AssemblyInfo.cs +++ b/ClipperComponents/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("StudioAvw")] [assembly: AssemblyProduct("ClipperPlugin")] -[assembly: AssemblyCopyright("Copyright © 2014 Arend van Waart / Boost Open Source Licence")] +[assembly: AssemblyCopyright("Copyright © 2017 Arend van Waart / Boost Open Source Licence")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.0.2.1")] -[assembly: AssemblyFileVersion("0.0.2.1")] +[assembly: AssemblyVersion("0.0.2.3")] +[assembly: AssemblyFileVersion("0.0.2.3")] diff --git a/ClipperComponents/Properties/Settings.Designer.cs b/ClipperComponents/Properties/Settings.Designer.cs index 6d5b2ae..f24fe19 100644 --- a/ClipperComponents/Properties/Settings.Designer.cs +++ b/ClipperComponents/Properties/Settings.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.18444 +// Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -12,7 +12,7 @@ namespace StudioAvw.Clipper.Components.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); diff --git a/ClipperPlugin/ClipperPlugin.cs b/ClipperPlugin/ClipperPlugin.cs index d164897..7ceba3a 100644 --- a/ClipperPlugin/ClipperPlugin.cs +++ b/ClipperPlugin/ClipperPlugin.cs @@ -1,6 +1,4 @@ -using System.Reflection; -using System.Runtime.InteropServices; -using Rhino.PlugIns; +using Rhino.PlugIns; namespace ClipperPlugin { diff --git a/ClipperPlugin/ClipperPlugin.csproj b/ClipperPlugin/ClipperPlugin.csproj index d38bf7d..523cc18 100644 --- a/ClipperPlugin/ClipperPlugin.csproj +++ b/ClipperPlugin/ClipperPlugin.csproj @@ -10,7 +10,7 @@ Properties ClipperPlugin ClipperPlugin - v4.0 + v4.5 512 false @@ -40,18 +40,18 @@ TRACE prompt 4 + false + + ..\..\..\..\..\..\Program Files\Rhinoceros 5 (64-bit)\System\RhinoCommon.dll + False + - - False - C:\Program Files\Rhinoceros 5.0 (64-bit)\System\rhinocommon.dll - False - @@ -86,6 +86,7 @@ Erase "$(TargetPath)" Program C:\Program Files (x86)\Rhinoceros 5.0\System\Rhino4.exe + false en-US @@ -95,5 +96,6 @@ Erase "$(TargetPath)" Program + false \ No newline at end of file diff --git a/ClipperPlugin/Properties/AssemblyInfo.cs b/ClipperPlugin/Properties/AssemblyInfo.cs index 9eb6e67..24e4065 100644 --- a/ClipperPlugin/Properties/AssemblyInfo.cs +++ b/ClipperPlugin/Properties/AssemblyInfo.cs @@ -13,7 +13,6 @@ [assembly: PlugInDescription(DescriptionType.UpdateUrl, @"http://www.food4rhino.com/project/clipper")] [assembly: PlugInDescription(DescriptionType.WebSite, @"http://www.food4rhino.com/project/clipper")] - // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. @@ -22,7 +21,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("StudioAvw")] [assembly: AssemblyProduct("ClipperPlugin")] -[assembly: AssemblyCopyright("Copyright © 2014 Arend van Waart / Boost Open Source Licence")] +[assembly: AssemblyCopyright("Copyright © 2017 Arend van Waart / Boost Open Source Licence")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -44,6 +43,6 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.0.2.1")] -[assembly: AssemblyFileVersion("0.0.2.1")] +[assembly: AssemblyVersion("0.0.2.3")] +[assembly: AssemblyFileVersion("0.0.2.3")] [assembly: AssemblyInformationalVersion("2")] \ No newline at end of file diff --git a/ClipperTools/ClipperTools.csproj b/ClipperTools/ClipperTools.csproj index 3fd9754..cdf10f6 100644 --- a/ClipperTools/ClipperTools.csproj +++ b/ClipperTools/ClipperTools.csproj @@ -32,7 +32,7 @@ - C:\Program Files\Rhinoceros 5.0 (64-bit)\System\RhinoCommon.dll + ..\..\..\..\..\..\Program Files\Rhinoceros 5 (64-bit)\System\RhinoCommon.dll False diff --git a/ClipperTools/Geometry.cs b/ClipperTools/Geometry.cs index 132be22..b71abec 100644 --- a/ClipperTools/Geometry.cs +++ b/ClipperTools/Geometry.cs @@ -453,7 +453,6 @@ public static Polyline ToPolyline(this List path, Plane pln, bool clos public static Polyline ToPolyline(this List path, Plane pln, double tolerance, bool closed) { List polylinepts = new List(); - foreach (IntPoint pt in path) { polylinepts.Add(pln.PointAt(pt.X*tolerance, pt.Y*tolerance)); diff --git a/ClipperTools/Properties/AssemblyInfo.cs b/ClipperTools/Properties/AssemblyInfo.cs index c41174b..7301b0a 100644 --- a/ClipperTools/Properties/AssemblyInfo.cs +++ b/ClipperTools/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("ClipperTools")] -[assembly: AssemblyCopyright("Copyright © 2014")] +[assembly: AssemblyCopyright("Copyright © Angus Johnson 2010-2015 / Modification by Arend van Waart ")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.0.2.1")] -[assembly: AssemblyFileVersion("0.0.2.1")] +[assembly: AssemblyVersion("0.0.2.3")] +[assembly: AssemblyFileVersion("0.0.2.3")] diff --git a/ClipperTools/clipper.cs b/ClipperTools/clipper.cs index 784e985..5c0a29c 100644 --- a/ClipperTools/clipper.cs +++ b/ClipperTools/clipper.cs @@ -1,10 +1,10 @@ /******************************************************************************* * * * Author : Angus Johnson * -* Version : 6.4.0 * -* Date : 2 July 2015 * +* Version : 6.4.2 * +* Date : 27 February 2017 * * Website : http://www.angusj.com * -* Copyright : Angus Johnson 2010-2015 * +* Copyright : Angus Johnson 2010-2017 * * * * License: * * Use, modification & distribution is subject to Boost Software License Ver 1. * @@ -61,299 +61,299 @@ namespace ClipperLib #if use_int32 using cInt = Int32; #else - using cInt = Int64; + using cInt = Int64; #endif - using Path = List; - using Paths = List>; + using Path = List; + using Paths = List>; - public struct DoublePoint - { - public double X; - public double Y; - - public DoublePoint(double x = 0, double y = 0) - { - this.X = x; this.Y = y; - } - public DoublePoint(DoublePoint dp) - { - this.X = dp.X; this.Y = dp.Y; - } - public DoublePoint(IntPoint ip) + public struct DoublePoint { - this.X = ip.X; this.Y = ip.Y; - } - }; + public double X; + public double Y; + public DoublePoint(double x = 0, double y = 0) + { + this.X = x; this.Y = y; + } + public DoublePoint(DoublePoint dp) + { + this.X = dp.X; this.Y = dp.Y; + } + public DoublePoint(IntPoint ip) + { + this.X = ip.X; this.Y = ip.Y; + } + }; - //------------------------------------------------------------------------------ - // PolyTree & PolyNode classes - //------------------------------------------------------------------------------ - public class PolyTree : PolyNode - { - internal List m_AllPolys = new List(); + //------------------------------------------------------------------------------ + // PolyTree & PolyNode classes + //------------------------------------------------------------------------------ - //The GC probably handles this cleanup more efficiently ... - //~PolyTree(){Clear();} - - public void Clear() - { - for (int i = 0; i < m_AllPolys.Count; i++) - m_AllPolys[i] = null; - m_AllPolys.Clear(); - m_Childs.Clear(); - } - - public PolyNode GetFirst() - { - if (m_Childs.Count > 0) - return m_Childs[0]; - else - return null; - } + public class PolyTree : PolyNode + { + internal List m_AllPolys = new List(); - public int Total - { - get - { - int result = m_AllPolys.Count; - //with negative offsets, ignore the hidden outer polygon ... - if (result > 0 && m_Childs[0] != m_AllPolys[0]) result--; - return result; - } - } + //The GC probably handles this cleanup more efficiently ... + //~PolyTree(){Clear();} - } - - public class PolyNode - { - internal PolyNode m_Parent; - internal Path m_polygon = new Path(); - internal int m_Index; - internal JoinType m_jointype; - internal EndType m_endtype; - internal List m_Childs = new List(); - - private bool IsHoleNode() - { - bool result = true; - PolyNode node = m_Parent; - while (node != null) - { - result = !result; - node = node.m_Parent; - } - return result; - } + public void Clear() + { + for (int i = 0; i < m_AllPolys.Count; i++) + m_AllPolys[i] = null; + m_AllPolys.Clear(); + m_Childs.Clear(); + } - public int ChildCount - { - get { return m_Childs.Count; } - } + public PolyNode GetFirst() + { + if (m_Childs.Count > 0) + return m_Childs[0]; + else + return null; + } - public Path Contour - { - get { return m_polygon; } - } + public int Total + { + get + { + int result = m_AllPolys.Count; + //with negative offsets, ignore the hidden outer polygon ... + if (result > 0 && m_Childs[0] != m_AllPolys[0]) result--; + return result; + } + } - internal void AddChild(PolyNode Child) - { - int cnt = m_Childs.Count; - m_Childs.Add(Child); - Child.m_Parent = this; - Child.m_Index = cnt; - } + } - public PolyNode GetNext() - { - if (m_Childs.Count > 0) - return m_Childs[0]; - else - return GetNextSiblingUp(); - } - - internal PolyNode GetNextSiblingUp() - { - if (m_Parent == null) - return null; - else if (m_Index == m_Parent.m_Childs.Count - 1) - return m_Parent.GetNextSiblingUp(); - else - return m_Parent.m_Childs[m_Index + 1]; - } + public class PolyNode + { + internal PolyNode m_Parent; + internal Path m_polygon = new Path(); + internal int m_Index; + internal JoinType m_jointype; + internal EndType m_endtype; + internal List m_Childs = new List(); + + private bool IsHoleNode() + { + bool result = true; + PolyNode node = m_Parent; + while (node != null) + { + result = !result; + node = node.m_Parent; + } + return result; + } - public List Childs - { - get { return m_Childs; } - } + public int ChildCount + { + get { return m_Childs.Count; } + } - public PolyNode Parent - { - get { return m_Parent; } - } + public Path Contour + { + get { return m_polygon; } + } - public bool IsHole - { - get { return IsHoleNode(); } - } + internal void AddChild(PolyNode Child) + { + int cnt = m_Childs.Count; + m_Childs.Add(Child); + Child.m_Parent = this; + Child.m_Index = cnt; + } - public bool IsOpen { get; set; } - } + public PolyNode GetNext() + { + if (m_Childs.Count > 0) + return m_Childs[0]; + else + return GetNextSiblingUp(); + } + internal PolyNode GetNextSiblingUp() + { + if (m_Parent == null) + return null; + else if (m_Index == m_Parent.m_Childs.Count - 1) + return m_Parent.GetNextSiblingUp(); + else + return m_Parent.m_Childs[m_Index + 1]; + } - //------------------------------------------------------------------------------ - // Int128 struct (enables safe math on signed 64bit integers) - // eg Int128 val1((Int64)9223372036854775807); //ie 2^63 -1 - // Int128 val2((Int64)9223372036854775807); - // Int128 val3 = val1 * val2; - // val3.ToString => "85070591730234615847396907784232501249" (8.5e+37) - //------------------------------------------------------------------------------ + public List Childs + { + get { return m_Childs; } + } - internal struct Int128 - { - private Int64 hi; - private UInt64 lo; + public PolyNode Parent + { + get { return m_Parent; } + } - public Int128(Int64 _lo) - { - lo = (UInt64)_lo; - if (_lo < 0) hi = -1; - else hi = 0; - } + public bool IsHole + { + get { return IsHoleNode(); } + } - public Int128(Int64 _hi, UInt64 _lo) - { - lo = _lo; - hi = _hi; + public bool IsOpen { get; set; } } - public Int128(Int128 val) - { - hi = val.hi; - lo = val.lo; - } - public bool IsNegative() - { - return hi < 0; - } + //------------------------------------------------------------------------------ + // Int128 struct (enables safe math on signed 64bit integers) + // eg Int128 val1((Int64)9223372036854775807); //ie 2^63 -1 + // Int128 val2((Int64)9223372036854775807); + // Int128 val3 = val1 * val2; + // val3.ToString => "85070591730234615847396907784232501249" (8.5e+37) + //------------------------------------------------------------------------------ - public static bool operator ==(Int128 val1, Int128 val2) + internal struct Int128 { - if ((object)val1 == (object)val2) return true; - else if ((object)val1 == null || (object)val2 == null) return false; - return (val1.hi == val2.hi && val1.lo == val2.lo); - } + private Int64 hi; + private UInt64 lo; - public static bool operator !=(Int128 val1, Int128 val2) - { - return !(val1 == val2); - } + public Int128(Int64 _lo) + { + lo = (UInt64)_lo; + if (_lo < 0) hi = -1; + else hi = 0; + } - public override bool Equals(System.Object obj) - { - if (obj == null || !(obj is Int128)) - return false; - Int128 i128 = (Int128)obj; - return (i128.hi == hi && i128.lo == lo); - } + public Int128(Int64 _hi, UInt64 _lo) + { + lo = _lo; + hi = _hi; + } - public override int GetHashCode() - { - return hi.GetHashCode() ^ lo.GetHashCode(); - } + public Int128(Int128 val) + { + hi = val.hi; + lo = val.lo; + } - public static bool operator >(Int128 val1, Int128 val2) - { - if (val1.hi != val2.hi) - return val1.hi > val2.hi; - else - return val1.lo > val2.lo; - } + public bool IsNegative() + { + return hi < 0; + } - public static bool operator <(Int128 val1, Int128 val2) - { - if (val1.hi != val2.hi) - return val1.hi < val2.hi; - else - return val1.lo < val2.lo; - } + public static bool operator ==(Int128 val1, Int128 val2) + { + if ((object)val1 == (object)val2) return true; + else if ((object)val1 == null || (object)val2 == null) return false; + return (val1.hi == val2.hi && val1.lo == val2.lo); + } - public static Int128 operator +(Int128 lhs, Int128 rhs) - { - lhs.hi += rhs.hi; - lhs.lo += rhs.lo; - if (lhs.lo < rhs.lo) lhs.hi++; - return lhs; - } + public static bool operator !=(Int128 val1, Int128 val2) + { + return !(val1 == val2); + } - public static Int128 operator -(Int128 lhs, Int128 rhs) - { - return lhs + -rhs; - } + public override bool Equals(System.Object obj) + { + if (obj == null || !(obj is Int128)) + return false; + Int128 i128 = (Int128)obj; + return (i128.hi == hi && i128.lo == lo); + } - public static Int128 operator -(Int128 val) - { - if (val.lo == 0) - return new Int128(-val.hi, 0); - else - return new Int128(~val.hi, ~val.lo + 1); - } + public override int GetHashCode() + { + return hi.GetHashCode() ^ lo.GetHashCode(); + } - public static explicit operator double(Int128 val) - { - const double shift64 = 18446744073709551616.0; //2^64 - if (val.hi < 0) - { - if (val.lo == 0) - return (double)val.hi * shift64; - else - return -(double)(~val.lo + ~val.hi * shift64); - } - else - return (double)(val.lo + val.hi * shift64); - } - - //nb: Constructing two new Int128 objects every time we want to multiply longs - //is slow. So, although calling the Int128Mul method doesn't look as clean, the - //code runs significantly faster than if we'd used the * operator. + public static bool operator >(Int128 val1, Int128 val2) + { + if (val1.hi != val2.hi) + return val1.hi > val2.hi; + else + return val1.lo > val2.lo; + } - public static Int128 Int128Mul(Int64 lhs, Int64 rhs) - { - bool negate = (lhs < 0) != (rhs < 0); - if (lhs < 0) lhs = -lhs; - if (rhs < 0) rhs = -rhs; - UInt64 int1Hi = (UInt64)lhs >> 32; - UInt64 int1Lo = (UInt64)lhs & 0xFFFFFFFF; - UInt64 int2Hi = (UInt64)rhs >> 32; - UInt64 int2Lo = (UInt64)rhs & 0xFFFFFFFF; - - //nb: see comments in clipper.pas - UInt64 a = int1Hi * int2Hi; - UInt64 b = int1Lo * int2Lo; - UInt64 c = int1Hi * int2Lo + int1Lo * int2Hi; - - UInt64 lo; - Int64 hi; - hi = (Int64)(a + (c >> 32)); - - unchecked { lo = (c << 32) + b; } - if (lo < b) hi++; - Int128 result = new Int128(hi, lo); - return negate ? -result : result; - } + public static bool operator <(Int128 val1, Int128 val2) + { + if (val1.hi != val2.hi) + return val1.hi < val2.hi; + else + return val1.lo < val2.lo; + } + + public static Int128 operator +(Int128 lhs, Int128 rhs) + { + lhs.hi += rhs.hi; + lhs.lo += rhs.lo; + if (lhs.lo < rhs.lo) lhs.hi++; + return lhs; + } + + public static Int128 operator -(Int128 lhs, Int128 rhs) + { + return lhs + -rhs; + } + + public static Int128 operator -(Int128 val) + { + if (val.lo == 0) + return new Int128(-val.hi, 0); + else + return new Int128(~val.hi, ~val.lo + 1); + } + + public static explicit operator double(Int128 val) + { + const double shift64 = 18446744073709551616.0; //2^64 + if (val.hi < 0) + { + if (val.lo == 0) + return (double)val.hi * shift64; + else + return -(double)(~val.lo + ~val.hi * shift64); + } + else + return (double)(val.lo + val.hi * shift64); + } + + //nb: Constructing two new Int128 objects every time we want to multiply longs + //is slow. So, although calling the Int128Mul method doesn't look as clean, the + //code runs significantly faster than if we'd used the * operator. + + public static Int128 Int128Mul(Int64 lhs, Int64 rhs) + { + bool negate = (lhs < 0) != (rhs < 0); + if (lhs < 0) lhs = -lhs; + if (rhs < 0) rhs = -rhs; + UInt64 int1Hi = (UInt64)lhs >> 32; + UInt64 int1Lo = (UInt64)lhs & 0xFFFFFFFF; + UInt64 int2Hi = (UInt64)rhs >> 32; + UInt64 int2Lo = (UInt64)rhs & 0xFFFFFFFF; + + //nb: see comments in clipper.pas + UInt64 a = int1Hi * int2Hi; + UInt64 b = int1Lo * int2Lo; + UInt64 c = int1Hi * int2Lo + int1Lo * int2Hi; + + UInt64 lo; + Int64 hi; + hi = (Int64)(a + (c >> 32)); + + unchecked { lo = (c << 32) + b; } + if (lo < b) hi++; + Int128 result = new Int128(hi, lo); + return negate ? -result : result; + } - }; + }; - //------------------------------------------------------------------------------ - //------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ - public struct IntPoint - { - public cInt X; - public cInt Y; + public struct IntPoint + { + public cInt X; + public cInt Y; #if use_xyz public cInt Z; @@ -377,1233 +377,1237 @@ public IntPoint(IntPoint pt) this.X = pt.X; this.Y = pt.Y; this.Z = pt.Z; } #else - public IntPoint(cInt X, cInt Y) - { - this.X = X; this.Y = Y; - } - public IntPoint(double x, double y) - { - this.X = (cInt)x; this.Y = (cInt)y; - } + public IntPoint(cInt X, cInt Y) + { + this.X = X; this.Y = Y; + } + public IntPoint(double x, double y) + { + this.X = (cInt)x; this.Y = (cInt)y; + } - public IntPoint(IntPoint pt) - { - this.X = pt.X; this.Y = pt.Y; - } + public IntPoint(IntPoint pt) + { + this.X = pt.X; this.Y = pt.Y; + } #endif - public static bool operator ==(IntPoint a, IntPoint b) - { - return a.X == b.X && a.Y == b.Y; - } - - public static bool operator !=(IntPoint a, IntPoint b) - { - return a.X != b.X || a.Y != b.Y; - } + public static bool operator ==(IntPoint a, IntPoint b) + { + return a.X == b.X && a.Y == b.Y; + } - public override bool Equals(object obj) - { - if (obj == null) return false; - if (obj is IntPoint) - { - IntPoint a = (IntPoint)obj; - return (X == a.X) && (Y == a.Y); - } - else return false; - } + public static bool operator !=(IntPoint a, IntPoint b) + { + return a.X != b.X || a.Y != b.Y; + } - public override int GetHashCode() - { - //simply prevents a compiler warning - return base.GetHashCode(); - } + public override bool Equals(object obj) + { + if (obj == null) return false; + if (obj is IntPoint) + { + IntPoint a = (IntPoint)obj; + return (X == a.X) && (Y == a.Y); + } + else return false; + } - }// end struct IntPoint + public override int GetHashCode() + { + //simply prevents a compiler warning + return base.GetHashCode(); + } - public struct IntRect - { - public cInt left; - public cInt top; - public cInt right; - public cInt bottom; + }// end struct IntPoint - public IntRect(cInt l, cInt t, cInt r, cInt b) - { - this.left = l; this.top = t; - this.right = r; this.bottom = b; - } - public IntRect(IntRect ir) - { - this.left = ir.left; this.top = ir.top; - this.right = ir.right; this.bottom = ir.bottom; - } - } - - public enum ClipType { ctIntersection, ctUnion, ctDifference, ctXor }; - public enum PolyType { ptSubject, ptClip }; - - //By far the most widely used winding rules for polygon filling are - //EvenOdd & NonZero (GDI, GDI+, XLib, OpenGL, Cairo, AGG, Quartz, SVG, Gr32) - //Others rules include Positive, Negative and ABS_GTR_EQ_TWO (only in OpenGL) - //see http://glprogramming.com/red/chapter11.html - public enum PolyFillType { pftEvenOdd, pftNonZero, pftPositive, pftNegative }; - - public enum JoinType { jtSquare, jtRound, jtMiter }; - public enum EndType { etClosedPolygon, etClosedLine, etOpenButt, etOpenSquare, etOpenRound }; - - internal enum EdgeSide {esLeft, esRight}; - internal enum Direction {dRightToLeft, dLeftToRight}; - - internal class TEdge { - internal IntPoint Bot; - internal IntPoint Curr; //current (updated for every new scanbeam) - internal IntPoint Top; - internal IntPoint Delta; - internal double Dx; - internal PolyType PolyTyp; - internal EdgeSide Side; //side only refers to current side of solution poly - internal int WindDelta; //1 or -1 depending on winding direction - internal int WindCnt; - internal int WindCnt2; //winding count of the opposite polytype - internal int OutIdx; - internal TEdge Next; - internal TEdge Prev; - internal TEdge NextInLML; - internal TEdge NextInAEL; - internal TEdge PrevInAEL; - internal TEdge NextInSEL; - internal TEdge PrevInSEL; - }; - - public class IntersectNode - { - internal TEdge Edge1; - internal TEdge Edge2; - internal IntPoint Pt; - }; - - public class MyIntersectNodeSort : IComparer - { - public int Compare(IntersectNode node1, IntersectNode node2) + public struct IntRect { - cInt i = node2.Pt.Y - node1.Pt.Y; - if (i > 0) return 1; - else if (i < 0) return -1; - else return 0; + public cInt left; + public cInt top; + public cInt right; + public cInt bottom; + + public IntRect(cInt l, cInt t, cInt r, cInt b) + { + this.left = l; this.top = t; + this.right = r; this.bottom = b; + } + public IntRect(IntRect ir) + { + this.left = ir.left; this.top = ir.top; + this.right = ir.right; this.bottom = ir.bottom; + } } - } - - internal class LocalMinima - { - internal cInt Y; - internal TEdge LeftBound; - internal TEdge RightBound; - internal LocalMinima Next; - }; - - internal class Scanbeam - { - internal cInt Y; - internal Scanbeam Next; - }; - - internal class Maxima - { - internal cInt X; - internal Maxima Next; - internal Maxima Prev; - }; - - //OutRec: contains a path in the clipping solution. Edges in the AEL will - //carry a pointer to an OutRec when they are part of the clipping solution. - internal class OutRec - { - internal int Idx; - internal bool IsHole; - internal bool IsOpen; - internal OutRec FirstLeft; //see comments in clipper.pas - internal OutPt Pts; - internal OutPt BottomPt; - internal PolyNode PolyNode; - }; - - internal class OutPt - { - internal int Idx; - internal IntPoint Pt; - internal OutPt Next; - internal OutPt Prev; - }; - - internal class Join - { - internal OutPt OutPt1; - internal OutPt OutPt2; - internal IntPoint OffPt; - }; - - public class ClipperBase - { - internal const double horizontal = -3.4E+38; - internal const int Skip = -2; - internal const int Unassigned = -1; - internal const double tolerance = 1.0E-20; - internal static bool near_zero(double val){return (val > -tolerance) && (val < tolerance);} -#if use_int32 - public const cInt loRange = 0x7FFF; - public const cInt hiRange = 0x7FFF; -#else - public const cInt loRange = 0x3FFFFFFF; - public const cInt hiRange = 0x3FFFFFFFFFFFFFFFL; -#endif + public enum ClipType { ctIntersection, ctUnion, ctDifference, ctXor }; + public enum PolyType { ptSubject, ptClip }; - internal LocalMinima m_MinimaList; - internal LocalMinima m_CurrentLM; - internal List> m_edges = new List>(); - internal Scanbeam m_Scanbeam; - internal List m_PolyOuts; - internal TEdge m_ActiveEdges; - internal bool m_UseFullRange; - internal bool m_HasOpenPaths; + //By far the most widely used winding rules for polygon filling are + //EvenOdd & NonZero (GDI, GDI+, XLib, OpenGL, Cairo, AGG, Quartz, SVG, Gr32) + //Others rules include Positive, Negative and ABS_GTR_EQ_TWO (only in OpenGL) + //see http://glprogramming.com/red/chapter11.html + public enum PolyFillType { pftEvenOdd, pftNonZero, pftPositive, pftNegative }; - //------------------------------------------------------------------------------ + public enum JoinType { jtSquare, jtRound, jtMiter }; + public enum EndType { etClosedPolygon, etClosedLine, etOpenButt, etOpenSquare, etOpenRound }; - public bool PreserveCollinear - { - get; - set; - } - //------------------------------------------------------------------------------ + internal enum EdgeSide { esLeft, esRight }; + internal enum Direction { dRightToLeft, dLeftToRight }; - public void Swap(ref cInt val1, ref cInt val2) + internal class TEdge { - cInt tmp = val1; - val1 = val2; - val2 = tmp; - } - //------------------------------------------------------------------------------ - - internal static bool IsHorizontal(TEdge e) + internal IntPoint Bot; + internal IntPoint Curr; //current (updated for every new scanbeam) + internal IntPoint Top; + internal IntPoint Delta; + internal double Dx; + internal PolyType PolyTyp; + internal EdgeSide Side; //side only refers to current side of solution poly + internal int WindDelta; //1 or -1 depending on winding direction + internal int WindCnt; + internal int WindCnt2; //winding count of the opposite polytype + internal int OutIdx; + internal TEdge Next; + internal TEdge Prev; + internal TEdge NextInLML; + internal TEdge NextInAEL; + internal TEdge PrevInAEL; + internal TEdge NextInSEL; + internal TEdge PrevInSEL; + }; + + public class IntersectNode { - return e.Delta.Y == 0; - } - //------------------------------------------------------------------------------ + internal TEdge Edge1; + internal TEdge Edge2; + internal IntPoint Pt; + }; - internal bool PointIsVertex(IntPoint pt, OutPt pp) + public class MyIntersectNodeSort : IComparer { - OutPt pp2 = pp; - do - { - if (pp2.Pt == pt) return true; - pp2 = pp2.Next; - } - while (pp2 != pp); - return false; + public int Compare(IntersectNode node1, IntersectNode node2) + { + cInt i = node2.Pt.Y - node1.Pt.Y; + if (i > 0) return 1; + else if (i < 0) return -1; + else return 0; + } } - //------------------------------------------------------------------------------ - internal bool PointOnLineSegment(IntPoint pt, - IntPoint linePt1, IntPoint linePt2, bool UseFullRange) + internal class LocalMinima { - if (UseFullRange) - return ((pt.X == linePt1.X) && (pt.Y == linePt1.Y)) || - ((pt.X == linePt2.X) && (pt.Y == linePt2.Y)) || - (((pt.X > linePt1.X) == (pt.X < linePt2.X)) && - ((pt.Y > linePt1.Y) == (pt.Y < linePt2.Y)) && - ((Int128.Int128Mul((pt.X - linePt1.X), (linePt2.Y - linePt1.Y)) == - Int128.Int128Mul((linePt2.X - linePt1.X), (pt.Y - linePt1.Y))))); - else - return ((pt.X == linePt1.X) && (pt.Y == linePt1.Y)) || - ((pt.X == linePt2.X) && (pt.Y == linePt2.Y)) || - (((pt.X > linePt1.X) == (pt.X < linePt2.X)) && - ((pt.Y > linePt1.Y) == (pt.Y < linePt2.Y)) && - ((pt.X - linePt1.X) * (linePt2.Y - linePt1.Y) == - (linePt2.X - linePt1.X) * (pt.Y - linePt1.Y))); - } - //------------------------------------------------------------------------------ + internal cInt Y; + internal TEdge LeftBound; + internal TEdge RightBound; + internal LocalMinima Next; + }; - internal bool PointOnPolygon(IntPoint pt, OutPt pp, bool UseFullRange) + internal class Scanbeam { - OutPt pp2 = pp; - while (true) - { - if (PointOnLineSegment(pt, pp2.Pt, pp2.Next.Pt, UseFullRange)) - return true; - pp2 = pp2.Next; - if (pp2 == pp) break; - } - return false; - } - //------------------------------------------------------------------------------ + internal cInt Y; + internal Scanbeam Next; + }; - internal static bool SlopesEqual(TEdge e1, TEdge e2, bool UseFullRange) + internal class Maxima { - if (UseFullRange) - return Int128.Int128Mul(e1.Delta.Y, e2.Delta.X) == - Int128.Int128Mul(e1.Delta.X, e2.Delta.Y); - else return (cInt)(e1.Delta.Y) * (e2.Delta.X) == - (cInt)(e1.Delta.X) * (e2.Delta.Y); - } - //------------------------------------------------------------------------------ - - internal static bool SlopesEqual(IntPoint pt1, IntPoint pt2, - IntPoint pt3, bool UseFullRange) + internal cInt X; + internal Maxima Next; + internal Maxima Prev; + }; + + //OutRec: contains a path in the clipping solution. Edges in the AEL will + //carry a pointer to an OutRec when they are part of the clipping solution. + internal class OutRec { - if (UseFullRange) - return Int128.Int128Mul(pt1.Y - pt2.Y, pt2.X - pt3.X) == - Int128.Int128Mul(pt1.X - pt2.X, pt2.Y - pt3.Y); - else return - (cInt)(pt1.Y - pt2.Y) * (pt2.X - pt3.X) - (cInt)(pt1.X - pt2.X) * (pt2.Y - pt3.Y) == 0; - } - //------------------------------------------------------------------------------ - - internal static bool SlopesEqual(IntPoint pt1, IntPoint pt2, - IntPoint pt3, IntPoint pt4, bool UseFullRange) + internal int Idx; + internal bool IsHole; + internal bool IsOpen; + internal OutRec FirstLeft; //see comments in clipper.pas + internal OutPt Pts; + internal OutPt BottomPt; + internal PolyNode PolyNode; + }; + + internal class OutPt { - if (UseFullRange) - return Int128.Int128Mul(pt1.Y - pt2.Y, pt3.X - pt4.X) == - Int128.Int128Mul(pt1.X - pt2.X, pt3.Y - pt4.Y); - else return - (cInt)(pt1.Y - pt2.Y) * (pt3.X - pt4.X) - (cInt)(pt1.X - pt2.X) * (pt3.Y - pt4.Y) == 0; - } - //------------------------------------------------------------------------------ + internal int Idx; + internal IntPoint Pt; + internal OutPt Next; + internal OutPt Prev; + }; - internal ClipperBase() //constructor (nb: no external instantiation) + internal class Join { - m_MinimaList = null; - m_CurrentLM = null; - m_UseFullRange = false; - m_HasOpenPaths = false; - } - //------------------------------------------------------------------------------ + internal OutPt OutPt1; + internal OutPt OutPt2; + internal IntPoint OffPt; + }; - public virtual void Clear() + public class ClipperBase { - DisposeLocalMinimaList(); - for (int i = 0; i < m_edges.Count; ++i) + internal const double horizontal = -3.4E+38; + internal const int Skip = -2; + internal const int Unassigned = -1; + internal const double tolerance = 1.0E-20; + internal static bool near_zero(double val) { return (val > -tolerance) && (val < tolerance); } + +#if use_int32 + public const cInt loRange = 0x7FFF; + public const cInt hiRange = 0x7FFF; +#else + public const cInt loRange = 0x3FFFFFFF; + public const cInt hiRange = 0x3FFFFFFFFFFFFFFFL; +#endif + + internal LocalMinima m_MinimaList; + internal LocalMinima m_CurrentLM; + internal List> m_edges = new List>(); + internal Scanbeam m_Scanbeam; + internal List m_PolyOuts; + internal TEdge m_ActiveEdges; + internal bool m_UseFullRange; + internal bool m_HasOpenPaths; + + //------------------------------------------------------------------------------ + + public bool PreserveCollinear { - for (int j = 0; j < m_edges[i].Count; ++j) m_edges[i][j] = null; - m_edges[i].Clear(); + get; + set; } - m_edges.Clear(); - m_UseFullRange = false; - m_HasOpenPaths = false; - } - //------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ - private void DisposeLocalMinimaList() - { - while( m_MinimaList != null ) + public void Swap(ref cInt val1, ref cInt val2) { - LocalMinima tmpLm = m_MinimaList.Next; - m_MinimaList = null; - m_MinimaList = tmpLm; + cInt tmp = val1; + val1 = val2; + val2 = tmp; } - m_CurrentLM = null; - } - //------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ - void RangeTest(IntPoint Pt, ref bool useFullRange) - { - if (useFullRange) - { - if (Pt.X > hiRange || Pt.Y > hiRange || -Pt.X > hiRange || -Pt.Y > hiRange) - throw new ClipperException("Coordinate outside allowed range"); - } - else if (Pt.X > loRange || Pt.Y > loRange || -Pt.X > loRange || -Pt.Y > loRange) - { - useFullRange = true; - RangeTest(Pt, ref useFullRange); - } - } - //------------------------------------------------------------------------------ + internal static bool IsHorizontal(TEdge e) + { + return e.Delta.Y == 0; + } + //------------------------------------------------------------------------------ - private void InitEdge(TEdge e, TEdge eNext, - TEdge ePrev, IntPoint pt) - { - e.Next = eNext; - e.Prev = ePrev; - e.Curr = pt; - e.OutIdx = Unassigned; - } - //------------------------------------------------------------------------------ + internal bool PointIsVertex(IntPoint pt, OutPt pp) + { + OutPt pp2 = pp; + do + { + if (pp2.Pt == pt) return true; + pp2 = pp2.Next; + } + while (pp2 != pp); + return false; + } + //------------------------------------------------------------------------------ - private void InitEdge2(TEdge e, PolyType polyType) - { - if (e.Curr.Y >= e.Next.Curr.Y) - { - e.Bot = e.Curr; - e.Top = e.Next.Curr; - } - else - { - e.Top = e.Curr; - e.Bot = e.Next.Curr; - } - SetDx(e); - e.PolyTyp = polyType; - } - //------------------------------------------------------------------------------ + internal bool PointOnLineSegment(IntPoint pt, + IntPoint linePt1, IntPoint linePt2, bool UseFullRange) + { + if (UseFullRange) + return ((pt.X == linePt1.X) && (pt.Y == linePt1.Y)) || + ((pt.X == linePt2.X) && (pt.Y == linePt2.Y)) || + (((pt.X > linePt1.X) == (pt.X < linePt2.X)) && + ((pt.Y > linePt1.Y) == (pt.Y < linePt2.Y)) && + ((Int128.Int128Mul((pt.X - linePt1.X), (linePt2.Y - linePt1.Y)) == + Int128.Int128Mul((linePt2.X - linePt1.X), (pt.Y - linePt1.Y))))); + else + return ((pt.X == linePt1.X) && (pt.Y == linePt1.Y)) || + ((pt.X == linePt2.X) && (pt.Y == linePt2.Y)) || + (((pt.X > linePt1.X) == (pt.X < linePt2.X)) && + ((pt.Y > linePt1.Y) == (pt.Y < linePt2.Y)) && + ((pt.X - linePt1.X) * (linePt2.Y - linePt1.Y) == + (linePt2.X - linePt1.X) * (pt.Y - linePt1.Y))); + } + //------------------------------------------------------------------------------ - private TEdge FindNextLocMin(TEdge E) - { - TEdge E2; - for (;;) - { - while (E.Bot != E.Prev.Bot || E.Curr == E.Top) E = E.Next; - if (E.Dx != horizontal && E.Prev.Dx != horizontal) break; - while (E.Prev.Dx == horizontal) E = E.Prev; - E2 = E; - while (E.Dx == horizontal) E = E.Next; - if (E.Top.Y == E.Prev.Bot.Y) continue; //ie just an intermediate horz. - if (E2.Prev.Bot.X < E.Bot.X) E = E2; - break; - } - return E; - } - //------------------------------------------------------------------------------ + internal bool PointOnPolygon(IntPoint pt, OutPt pp, bool UseFullRange) + { + OutPt pp2 = pp; + while (true) + { + if (PointOnLineSegment(pt, pp2.Pt, pp2.Next.Pt, UseFullRange)) + return true; + pp2 = pp2.Next; + if (pp2 == pp) break; + } + return false; + } + //------------------------------------------------------------------------------ - private TEdge ProcessBound(TEdge E, bool LeftBoundIsForward) - { - TEdge EStart, Result = E; - TEdge Horz; + internal static bool SlopesEqual(TEdge e1, TEdge e2, bool UseFullRange) + { + if (UseFullRange) + return Int128.Int128Mul(e1.Delta.Y, e2.Delta.X) == + Int128.Int128Mul(e1.Delta.X, e2.Delta.Y); + else return (cInt)(e1.Delta.Y) * (e2.Delta.X) == + (cInt)(e1.Delta.X) * (e2.Delta.Y); + } + //------------------------------------------------------------------------------ - if (Result.OutIdx == Skip) - { - //check if there are edges beyond the skip edge in the bound and if so - //create another LocMin and calling ProcessBound once more ... - E = Result; - if (LeftBoundIsForward) + internal static bool SlopesEqual(IntPoint pt1, IntPoint pt2, + IntPoint pt3, bool UseFullRange) { - while (E.Top.Y == E.Next.Bot.Y) E = E.Next; - while (E != Result && E.Dx == horizontal) E = E.Prev; + if (UseFullRange) + return Int128.Int128Mul(pt1.Y - pt2.Y, pt2.X - pt3.X) == + Int128.Int128Mul(pt1.X - pt2.X, pt2.Y - pt3.Y); + else return + (cInt)(pt1.Y - pt2.Y) * (pt2.X - pt3.X) - (cInt)(pt1.X - pt2.X) * (pt2.Y - pt3.Y) == 0; } - else + //------------------------------------------------------------------------------ + + internal static bool SlopesEqual(IntPoint pt1, IntPoint pt2, + IntPoint pt3, IntPoint pt4, bool UseFullRange) { - while (E.Top.Y == E.Prev.Bot.Y) E = E.Prev; - while (E != Result && E.Dx == horizontal) E = E.Next; + if (UseFullRange) + return Int128.Int128Mul(pt1.Y - pt2.Y, pt3.X - pt4.X) == + Int128.Int128Mul(pt1.X - pt2.X, pt3.Y - pt4.Y); + else return + (cInt)(pt1.Y - pt2.Y) * (pt3.X - pt4.X) - (cInt)(pt1.X - pt2.X) * (pt3.Y - pt4.Y) == 0; } - if (E == Result) + //------------------------------------------------------------------------------ + + internal ClipperBase() //constructor (nb: no external instantiation) { - if (LeftBoundIsForward) Result = E.Next; - else Result = E.Prev; + m_MinimaList = null; + m_CurrentLM = null; + m_UseFullRange = false; + m_HasOpenPaths = false; } - else + //------------------------------------------------------------------------------ + + public virtual void Clear() { - //there are more edges in the bound beyond result starting with E - if (LeftBoundIsForward) - E = Result.Next; - else - E = Result.Prev; - LocalMinima locMin = new LocalMinima(); - locMin.Next = null; - locMin.Y = E.Bot.Y; - locMin.LeftBound = null; - locMin.RightBound = E; - E.WindDelta = 0; - Result = ProcessBound(E, LeftBoundIsForward); - InsertLocalMinima(locMin); + DisposeLocalMinimaList(); + for (int i = 0; i < m_edges.Count; ++i) + { + for (int j = 0; j < m_edges[i].Count; ++j) m_edges[i][j] = null; + m_edges[i].Clear(); + } + m_edges.Clear(); + m_UseFullRange = false; + m_HasOpenPaths = false; } - return Result; - } + //------------------------------------------------------------------------------ - if (E.Dx == horizontal) - { - //We need to be careful with open paths because this may not be a - //true local minima (ie E may be following a skip edge). - //Also, consecutive horz. edges may start heading left before going right. - if (LeftBoundIsForward) EStart = E.Prev; - else EStart = E.Next; - if (EStart.Dx == horizontal) //ie an adjoining horizontal skip edge - { - if (EStart.Bot.X != E.Bot.X && EStart.Top.X != E.Bot.X) - ReverseHorizontal(E); - } - else if (EStart.Bot.X != E.Bot.X) - ReverseHorizontal(E); - } + private void DisposeLocalMinimaList() + { + while (m_MinimaList != null) + { + LocalMinima tmpLm = m_MinimaList.Next; + m_MinimaList = null; + m_MinimaList = tmpLm; + } + m_CurrentLM = null; + } + //------------------------------------------------------------------------------ - EStart = E; - if (LeftBoundIsForward) - { - while (Result.Top.Y == Result.Next.Bot.Y && Result.Next.OutIdx != Skip) - Result = Result.Next; - if (Result.Dx == horizontal && Result.Next.OutIdx != Skip) - { - //nb: at the top of a bound, horizontals are added to the bound - //only when the preceding edge attaches to the horizontal's left vertex - //unless a Skip edge is encountered when that becomes the top divide - Horz = Result; - while (Horz.Prev.Dx == horizontal) Horz = Horz.Prev; - if (Horz.Prev.Top.X > Result.Next.Top.X) Result = Horz.Prev; - } - while (E != Result) - { - E.NextInLML = E.Next; - if (E.Dx == horizontal && E != EStart && E.Bot.X != E.Prev.Top.X) - ReverseHorizontal(E); - E = E.Next; - } - if (E.Dx == horizontal && E != EStart && E.Bot.X != E.Prev.Top.X) - ReverseHorizontal(E); - Result = Result.Next; //move to the edge just beyond current bound - } - else - { - while (Result.Top.Y == Result.Prev.Bot.Y && Result.Prev.OutIdx != Skip) - Result = Result.Prev; - if (Result.Dx == horizontal && Result.Prev.OutIdx != Skip) + void RangeTest(IntPoint Pt, ref bool useFullRange) { - Horz = Result; - while (Horz.Next.Dx == horizontal) Horz = Horz.Next; - if (Horz.Next.Top.X == Result.Prev.Top.X || - Horz.Next.Top.X > Result.Prev.Top.X) Result = Horz.Next; + if (useFullRange) + { + if (Pt.X > hiRange || Pt.Y > hiRange || -Pt.X > hiRange || -Pt.Y > hiRange) + throw new ClipperException("Coordinate outside allowed range"); + } + else if (Pt.X > loRange || Pt.Y > loRange || -Pt.X > loRange || -Pt.Y > loRange) + { + useFullRange = true; + RangeTest(Pt, ref useFullRange); + } } + //------------------------------------------------------------------------------ - while (E != Result) + private void InitEdge(TEdge e, TEdge eNext, + TEdge ePrev, IntPoint pt) { - E.NextInLML = E.Prev; - if (E.Dx == horizontal && E != EStart && E.Bot.X != E.Next.Top.X) - ReverseHorizontal(E); - E = E.Prev; + e.Next = eNext; + e.Prev = ePrev; + e.Curr = pt; + e.OutIdx = Unassigned; } - if (E.Dx == horizontal && E != EStart && E.Bot.X != E.Next.Top.X) - ReverseHorizontal(E); - Result = Result.Prev; //move to the edge just beyond current bound - } - return Result; - } - //------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ + private void InitEdge2(TEdge e, PolyType polyType) + { + if (e.Curr.Y >= e.Next.Curr.Y) + { + e.Bot = e.Curr; + e.Top = e.Next.Curr; + } + else + { + e.Top = e.Curr; + e.Bot = e.Next.Curr; + } + SetDx(e); + e.PolyTyp = polyType; + } + //------------------------------------------------------------------------------ - public bool AddPath(Path pg, PolyType polyType, bool Closed) - { + private TEdge FindNextLocMin(TEdge E) + { + TEdge E2; + for (;;) + { + while (E.Bot != E.Prev.Bot || E.Curr == E.Top) E = E.Next; + if (E.Dx != horizontal && E.Prev.Dx != horizontal) break; + while (E.Prev.Dx == horizontal) E = E.Prev; + E2 = E; + while (E.Dx == horizontal) E = E.Next; + if (E.Top.Y == E.Prev.Bot.Y) continue; //ie just an intermediate horz. + if (E2.Prev.Bot.X < E.Bot.X) E = E2; + break; + } + return E; + } + //------------------------------------------------------------------------------ + + private TEdge ProcessBound(TEdge E, bool LeftBoundIsForward) + { + TEdge EStart, Result = E; + TEdge Horz; + + if (Result.OutIdx == Skip) + { + //check if there are edges beyond the skip edge in the bound and if so + //create another LocMin and calling ProcessBound once more ... + E = Result; + if (LeftBoundIsForward) + { + while (E.Top.Y == E.Next.Bot.Y) E = E.Next; + while (E != Result && E.Dx == horizontal) E = E.Prev; + } + else + { + while (E.Top.Y == E.Prev.Bot.Y) E = E.Prev; + while (E != Result && E.Dx == horizontal) E = E.Next; + } + if (E == Result) + { + if (LeftBoundIsForward) Result = E.Next; + else Result = E.Prev; + } + else + { + //there are more edges in the bound beyond result starting with E + if (LeftBoundIsForward) + E = Result.Next; + else + E = Result.Prev; + LocalMinima locMin = new LocalMinima(); + locMin.Next = null; + locMin.Y = E.Bot.Y; + locMin.LeftBound = null; + locMin.RightBound = E; + E.WindDelta = 0; + Result = ProcessBound(E, LeftBoundIsForward); + InsertLocalMinima(locMin); + } + return Result; + } + + if (E.Dx == horizontal) + { + //We need to be careful with open paths because this may not be a + //true local minima (ie E may be following a skip edge). + //Also, consecutive horz. edges may start heading left before going right. + if (LeftBoundIsForward) EStart = E.Prev; + else EStart = E.Next; + if (EStart.Dx == horizontal) //ie an adjoining horizontal skip edge + { + if (EStart.Bot.X != E.Bot.X && EStart.Top.X != E.Bot.X) + ReverseHorizontal(E); + } + else if (EStart.Bot.X != E.Bot.X) + ReverseHorizontal(E); + } + + EStart = E; + if (LeftBoundIsForward) + { + while (Result.Top.Y == Result.Next.Bot.Y && Result.Next.OutIdx != Skip) + Result = Result.Next; + if (Result.Dx == horizontal && Result.Next.OutIdx != Skip) + { + //nb: at the top of a bound, horizontals are added to the bound + //only when the preceding edge attaches to the horizontal's left vertex + //unless a Skip edge is encountered when that becomes the top divide + Horz = Result; + while (Horz.Prev.Dx == horizontal) Horz = Horz.Prev; + if (Horz.Prev.Top.X > Result.Next.Top.X) Result = Horz.Prev; + } + while (E != Result) + { + E.NextInLML = E.Next; + if (E.Dx == horizontal && E != EStart && E.Bot.X != E.Prev.Top.X) + ReverseHorizontal(E); + E = E.Next; + } + if (E.Dx == horizontal && E != EStart && E.Bot.X != E.Prev.Top.X) + ReverseHorizontal(E); + Result = Result.Next; //move to the edge just beyond current bound + } + else + { + while (Result.Top.Y == Result.Prev.Bot.Y && Result.Prev.OutIdx != Skip) + Result = Result.Prev; + if (Result.Dx == horizontal && Result.Prev.OutIdx != Skip) + { + Horz = Result; + while (Horz.Next.Dx == horizontal) Horz = Horz.Next; + if (Horz.Next.Top.X == Result.Prev.Top.X || + Horz.Next.Top.X > Result.Prev.Top.X) Result = Horz.Next; + } + + while (E != Result) + { + E.NextInLML = E.Prev; + if (E.Dx == horizontal && E != EStart && E.Bot.X != E.Next.Top.X) + ReverseHorizontal(E); + E = E.Prev; + } + if (E.Dx == horizontal && E != EStart && E.Bot.X != E.Next.Top.X) + ReverseHorizontal(E); + Result = Result.Prev; //move to the edge just beyond current bound + } + return Result; + } + //------------------------------------------------------------------------------ + + + public bool AddPath(Path pg, PolyType polyType, bool Closed) + { #if use_lines - if (!Closed && polyType == PolyType.ptClip) - throw new ClipperException("AddPath: Open paths must be subject."); + if (!Closed && polyType == PolyType.ptClip) + throw new ClipperException("AddPath: Open paths must be subject."); #else if (!Closed) throw new ClipperException("AddPath: Open paths have been disabled."); #endif - int highI = (int)pg.Count - 1; - if (Closed) while (highI > 0 && (pg[highI] == pg[0])) --highI; - while (highI > 0 && (pg[highI] == pg[highI - 1])) --highI; - if ((Closed && highI < 2) || (!Closed && highI < 1)) return false; - - //create a new edge array ... - List edges = new List(highI+1); - for (int i = 0; i <= highI; i++) edges.Add(new TEdge()); - - bool IsFlat = true; - - //1. Basic (first) edge initialization ... - edges[1].Curr = pg[1]; - RangeTest(pg[0], ref m_UseFullRange); - RangeTest(pg[highI], ref m_UseFullRange); - InitEdge(edges[0], edges[1], edges[highI], pg[0]); - InitEdge(edges[highI], edges[0], edges[highI - 1], pg[highI]); - for (int i = highI - 1; i >= 1; --i) - { - RangeTest(pg[i], ref m_UseFullRange); - InitEdge(edges[i], edges[i + 1], edges[i - 1], pg[i]); - } - TEdge eStart = edges[0]; + int highI = (int)pg.Count - 1; + if (Closed) while (highI > 0 && (pg[highI] == pg[0])) --highI; + while (highI > 0 && (pg[highI] == pg[highI - 1])) --highI; + if ((Closed && highI < 2) || (!Closed && highI < 1)) return false; - //2. Remove duplicate vertices, and (when closed) collinear edges ... - TEdge E = eStart, eLoopStop = eStart; - for (;;) - { - //nb: allows matching start and end points when not Closed ... - if (E.Curr == E.Next.Curr && (Closed || E.Next != eStart)) - { - if (E == E.Next) break; - if (E == eStart) eStart = E.Next; - E = RemoveEdge(E); - eLoopStop = E; - continue; - } - if (E.Prev == E.Next) - break; //only two vertices - else if (Closed && - SlopesEqual(E.Prev.Curr, E.Curr, E.Next.Curr, m_UseFullRange) && - (!PreserveCollinear || - !Pt2IsBetweenPt1AndPt3(E.Prev.Curr, E.Curr, E.Next.Curr))) - { - //Collinear edges are allowed for open paths but in closed paths - //the default is to merge adjacent collinear edges into a single edge. - //However, if the PreserveCollinear property is enabled, only overlapping - //collinear edges (ie spikes) will be removed from closed paths. - if (E == eStart) eStart = E.Next; - E = RemoveEdge(E); - E = E.Prev; - eLoopStop = E; - continue; - } - E = E.Next; - if ((E == eLoopStop) || (!Closed && E.Next == eStart)) break; - } + //create a new edge array ... + List edges = new List(highI + 1); + for (int i = 0; i <= highI; i++) edges.Add(new TEdge()); - if ((!Closed && (E == E.Next)) || (Closed && (E.Prev == E.Next))) - return false; + bool IsFlat = true; - if (!Closed) - { - m_HasOpenPaths = true; - eStart.Prev.OutIdx = Skip; - } + //1. Basic (first) edge initialization ... + edges[1].Curr = pg[1]; + RangeTest(pg[0], ref m_UseFullRange); + RangeTest(pg[highI], ref m_UseFullRange); + InitEdge(edges[0], edges[1], edges[highI], pg[0]); + InitEdge(edges[highI], edges[0], edges[highI - 1], pg[highI]); + for (int i = highI - 1; i >= 1; --i) + { + RangeTest(pg[i], ref m_UseFullRange); + InitEdge(edges[i], edges[i + 1], edges[i - 1], pg[i]); + } + TEdge eStart = edges[0]; - //3. Do second stage of edge initialization ... - E = eStart; - do - { - InitEdge2(E, polyType); - E = E.Next; - if (IsFlat && E.Curr.Y != eStart.Curr.Y) IsFlat = false; - } - while (E != eStart); + //2. Remove duplicate vertices, and (when closed) collinear edges ... + TEdge E = eStart, eLoopStop = eStart; + for (;;) + { + //nb: allows matching start and end points when not Closed ... + if (E.Curr == E.Next.Curr && (Closed || E.Next != eStart)) + { + if (E == E.Next) break; + if (E == eStart) eStart = E.Next; + E = RemoveEdge(E); + eLoopStop = E; + continue; + } + if (E.Prev == E.Next) + break; //only two vertices + else if (Closed && + SlopesEqual(E.Prev.Curr, E.Curr, E.Next.Curr, m_UseFullRange) && + (!PreserveCollinear || + !Pt2IsBetweenPt1AndPt3(E.Prev.Curr, E.Curr, E.Next.Curr))) + { + //Collinear edges are allowed for open paths but in closed paths + //the default is to merge adjacent collinear edges into a single edge. + //However, if the PreserveCollinear property is enabled, only overlapping + //collinear edges (ie spikes) will be removed from closed paths. + if (E == eStart) eStart = E.Next; + E = RemoveEdge(E); + E = E.Prev; + eLoopStop = E; + continue; + } + E = E.Next; + if ((E == eLoopStop) || (!Closed && E.Next == eStart)) break; + } - //4. Finally, add edge bounds to LocalMinima list ... + if ((!Closed && (E == E.Next)) || (Closed && (E.Prev == E.Next))) + return false; - //Totally flat paths must be handled differently when adding them - //to LocalMinima list to avoid endless loops etc ... - if (IsFlat) - { - if (Closed) return false; - E.Prev.OutIdx = Skip; - LocalMinima locMin = new LocalMinima(); - locMin.Next = null; - locMin.Y = E.Bot.Y; - locMin.LeftBound = null; - locMin.RightBound = E; - locMin.RightBound.Side = EdgeSide.esRight; - locMin.RightBound.WindDelta = 0; - for ( ; ; ) - { - if (E.Bot.X != E.Prev.Top.X) ReverseHorizontal(E); - if (E.Next.OutIdx == Skip) break; - E.NextInLML = E.Next; - E = E.Next; - } - InsertLocalMinima(locMin); - m_edges.Add(edges); - return true; - } + if (!Closed) + { + m_HasOpenPaths = true; + eStart.Prev.OutIdx = Skip; + } - m_edges.Add(edges); - bool leftBoundIsForward; - TEdge EMin = null; + //3. Do second stage of edge initialization ... + E = eStart; + do + { + InitEdge2(E, polyType); + E = E.Next; + if (IsFlat && E.Curr.Y != eStart.Curr.Y) IsFlat = false; + } + while (E != eStart); - //workaround to avoid an endless loop in the while loop below when - //open paths have matching start and end points ... - if (E.Prev.Bot == E.Prev.Top) E = E.Next; + //4. Finally, add edge bounds to LocalMinima list ... - for (;;) - { - E = FindNextLocMin(E); - if (E == EMin) break; - else if (EMin == null) EMin = E; - - //E and E.Prev now share a local minima (left aligned if horizontal). - //Compare their slopes to find which starts which bound ... - LocalMinima locMin = new LocalMinima(); - locMin.Next = null; - locMin.Y = E.Bot.Y; - if (E.Dx < E.Prev.Dx) - { - locMin.LeftBound = E.Prev; - locMin.RightBound = E; - leftBoundIsForward = false; //Q.nextInLML = Q.prev - } else - { - locMin.LeftBound = E; - locMin.RightBound = E.Prev; - leftBoundIsForward = true; //Q.nextInLML = Q.next - } - locMin.LeftBound.Side = EdgeSide.esLeft; - locMin.RightBound.Side = EdgeSide.esRight; - - if (!Closed) locMin.LeftBound.WindDelta = 0; - else if (locMin.LeftBound.Next == locMin.RightBound) - locMin.LeftBound.WindDelta = -1; - else locMin.LeftBound.WindDelta = 1; - locMin.RightBound.WindDelta = -locMin.LeftBound.WindDelta; - - E = ProcessBound(locMin.LeftBound, leftBoundIsForward); - if (E.OutIdx == Skip) E = ProcessBound(E, leftBoundIsForward); - - TEdge E2 = ProcessBound(locMin.RightBound, !leftBoundIsForward); - if (E2.OutIdx == Skip) E2 = ProcessBound(E2, !leftBoundIsForward); - - if (locMin.LeftBound.OutIdx == Skip) - locMin.LeftBound = null; - else if (locMin.RightBound.OutIdx == Skip) - locMin.RightBound = null; - InsertLocalMinima(locMin); - if (!leftBoundIsForward) E = E2; - } - return true; + //Totally flat paths must be handled differently when adding them + //to LocalMinima list to avoid endless loops etc ... + if (IsFlat) + { + if (Closed) return false; + E.Prev.OutIdx = Skip; + LocalMinima locMin = new LocalMinima(); + locMin.Next = null; + locMin.Y = E.Bot.Y; + locMin.LeftBound = null; + locMin.RightBound = E; + locMin.RightBound.Side = EdgeSide.esRight; + locMin.RightBound.WindDelta = 0; + for (;;) + { + if (E.Bot.X != E.Prev.Top.X) ReverseHorizontal(E); + if (E.Next.OutIdx == Skip) break; + E.NextInLML = E.Next; + E = E.Next; + } + InsertLocalMinima(locMin); + m_edges.Add(edges); + return true; + } - } - //------------------------------------------------------------------------------ + m_edges.Add(edges); + bool leftBoundIsForward; + TEdge EMin = null; - public bool AddPaths(Paths ppg, PolyType polyType, bool closed) - { - bool result = false; - for (int i = 0; i < ppg.Count; ++i) - if (AddPath(ppg[i], polyType, closed)) result = true; - return result; - } - //------------------------------------------------------------------------------ + //workaround to avoid an endless loop in the while loop below when + //open paths have matching start and end points ... + if (E.Prev.Bot == E.Prev.Top) E = E.Next; - internal bool Pt2IsBetweenPt1AndPt3(IntPoint pt1, IntPoint pt2, IntPoint pt3) - { - if ((pt1 == pt3) || (pt1 == pt2) || (pt3 == pt2)) return false; - else if (pt1.X != pt3.X) return (pt2.X > pt1.X) == (pt2.X < pt3.X); - else return (pt2.Y > pt1.Y) == (pt2.Y < pt3.Y); - } - //------------------------------------------------------------------------------ + for (;;) + { + E = FindNextLocMin(E); + if (E == EMin) break; + else if (EMin == null) EMin = E; + + //E and E.Prev now share a local minima (left aligned if horizontal). + //Compare their slopes to find which starts which bound ... + LocalMinima locMin = new LocalMinima(); + locMin.Next = null; + locMin.Y = E.Bot.Y; + if (E.Dx < E.Prev.Dx) + { + locMin.LeftBound = E.Prev; + locMin.RightBound = E; + leftBoundIsForward = false; //Q.nextInLML = Q.prev + } + else + { + locMin.LeftBound = E; + locMin.RightBound = E.Prev; + leftBoundIsForward = true; //Q.nextInLML = Q.next + } + locMin.LeftBound.Side = EdgeSide.esLeft; + locMin.RightBound.Side = EdgeSide.esRight; + + if (!Closed) locMin.LeftBound.WindDelta = 0; + else if (locMin.LeftBound.Next == locMin.RightBound) + locMin.LeftBound.WindDelta = -1; + else locMin.LeftBound.WindDelta = 1; + locMin.RightBound.WindDelta = -locMin.LeftBound.WindDelta; + + E = ProcessBound(locMin.LeftBound, leftBoundIsForward); + if (E.OutIdx == Skip) E = ProcessBound(E, leftBoundIsForward); + + TEdge E2 = ProcessBound(locMin.RightBound, !leftBoundIsForward); + if (E2.OutIdx == Skip) E2 = ProcessBound(E2, !leftBoundIsForward); + + if (locMin.LeftBound.OutIdx == Skip) + locMin.LeftBound = null; + else if (locMin.RightBound.OutIdx == Skip) + locMin.RightBound = null; + InsertLocalMinima(locMin); + if (!leftBoundIsForward) E = E2; + } + return true; - TEdge RemoveEdge(TEdge e) - { - //removes e from double_linked_list (but without removing from memory) - e.Prev.Next = e.Next; - e.Next.Prev = e.Prev; - TEdge result = e.Next; - e.Prev = null; //flag as removed (see ClipperBase.Clear) - return result; - } - //------------------------------------------------------------------------------ + } + //------------------------------------------------------------------------------ - private void SetDx(TEdge e) - { - e.Delta.X = (e.Top.X - e.Bot.X); - e.Delta.Y = (e.Top.Y - e.Bot.Y); - if (e.Delta.Y == 0) e.Dx = horizontal; - else e.Dx = (double)(e.Delta.X) / (e.Delta.Y); - } - //--------------------------------------------------------------------------- + public bool AddPaths(Paths ppg, PolyType polyType, bool closed) + { + bool result = false; + for (int i = 0; i < ppg.Count; ++i) + if (AddPath(ppg[i], polyType, closed)) result = true; + return result; + } + //------------------------------------------------------------------------------ - private void InsertLocalMinima(LocalMinima newLm) - { - if( m_MinimaList == null ) - { - m_MinimaList = newLm; - } - else if( newLm.Y >= m_MinimaList.Y ) - { - newLm.Next = m_MinimaList; - m_MinimaList = newLm; - } else - { - LocalMinima tmpLm = m_MinimaList; - while( tmpLm.Next != null && ( newLm.Y < tmpLm.Next.Y ) ) - tmpLm = tmpLm.Next; - newLm.Next = tmpLm.Next; - tmpLm.Next = newLm; - } - } - //------------------------------------------------------------------------------ + internal bool Pt2IsBetweenPt1AndPt3(IntPoint pt1, IntPoint pt2, IntPoint pt3) + { + if ((pt1 == pt3) || (pt1 == pt2) || (pt3 == pt2)) return false; + else if (pt1.X != pt3.X) return (pt2.X > pt1.X) == (pt2.X < pt3.X); + else return (pt2.Y > pt1.Y) == (pt2.Y < pt3.Y); + } + //------------------------------------------------------------------------------ - internal Boolean PopLocalMinima(cInt Y, out LocalMinima current) - { - current = m_CurrentLM; - if (m_CurrentLM != null && m_CurrentLM.Y == Y) + TEdge RemoveEdge(TEdge e) { - m_CurrentLM = m_CurrentLM.Next; - return true; + //removes e from double_linked_list (but without removing from memory) + e.Prev.Next = e.Next; + e.Next.Prev = e.Prev; + TEdge result = e.Next; + e.Prev = null; //flag as removed (see ClipperBase.Clear) + return result; } - return false; - } - //------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ - private void ReverseHorizontal(TEdge e) - { - //swap horizontal edges' top and bottom x's so they follow the natural - //progression of the bounds - ie so their xbots will align with the - //adjoining lower edge. [Helpful in the ProcessHorizontal() method.] - Swap(ref e.Top.X, ref e.Bot.X); + private void SetDx(TEdge e) + { + e.Delta.X = (e.Top.X - e.Bot.X); + e.Delta.Y = (e.Top.Y - e.Bot.Y); + if (e.Delta.Y == 0) e.Dx = horizontal; + else e.Dx = (double)(e.Delta.X) / (e.Delta.Y); + } + //--------------------------------------------------------------------------- + + private void InsertLocalMinima(LocalMinima newLm) + { + if (m_MinimaList == null) + { + m_MinimaList = newLm; + } + else if (newLm.Y >= m_MinimaList.Y) + { + newLm.Next = m_MinimaList; + m_MinimaList = newLm; + } + else + { + LocalMinima tmpLm = m_MinimaList; + while (tmpLm.Next != null && (newLm.Y < tmpLm.Next.Y)) + tmpLm = tmpLm.Next; + newLm.Next = tmpLm.Next; + tmpLm.Next = newLm; + } + } + //------------------------------------------------------------------------------ + + internal Boolean PopLocalMinima(cInt Y, out LocalMinima current) + { + current = m_CurrentLM; + if (m_CurrentLM != null && m_CurrentLM.Y == Y) + { + m_CurrentLM = m_CurrentLM.Next; + return true; + } + return false; + } + //------------------------------------------------------------------------------ + + private void ReverseHorizontal(TEdge e) + { + //swap horizontal edges' top and bottom x's so they follow the natural + //progression of the bounds - ie so their xbots will align with the + //adjoining lower edge. [Helpful in the ProcessHorizontal() method.] + Swap(ref e.Top.X, ref e.Bot.X); #if use_xyz Swap(ref e.Top.Z, ref e.Bot.Z); #endif - } - //------------------------------------------------------------------------------ - - internal virtual void Reset() - { - m_CurrentLM = m_MinimaList; - if (m_CurrentLM == null) return; //ie nothing to process + } + //------------------------------------------------------------------------------ - //reset all edges ... - m_Scanbeam = null; - LocalMinima lm = m_MinimaList; - while (lm != null) - { - InsertScanbeam(lm.Y); - TEdge e = lm.LeftBound; - if (e != null) + internal virtual void Reset() { - e.Curr = e.Bot; - e.OutIdx = Unassigned; + m_CurrentLM = m_MinimaList; + if (m_CurrentLM == null) return; //ie nothing to process + + //reset all edges ... + m_Scanbeam = null; + LocalMinima lm = m_MinimaList; + while (lm != null) + { + InsertScanbeam(lm.Y); + TEdge e = lm.LeftBound; + if (e != null) + { + e.Curr = e.Bot; + e.OutIdx = Unassigned; + } + e = lm.RightBound; + if (e != null) + { + e.Curr = e.Bot; + e.OutIdx = Unassigned; + } + lm = lm.Next; + } + m_ActiveEdges = null; } - e = lm.RightBound; - if (e != null) + //------------------------------------------------------------------------------ + + public static IntRect GetBounds(Paths paths) { - e.Curr = e.Bot; - e.OutIdx = Unassigned; + int i = 0, cnt = paths.Count; + while (i < cnt && paths[i].Count == 0) i++; + if (i == cnt) return new IntRect(0, 0, 0, 0); + IntRect result = new IntRect(); + result.left = paths[i][0].X; + result.right = result.left; + result.top = paths[i][0].Y; + result.bottom = result.top; + for (; i < cnt; i++) + for (int j = 0; j < paths[i].Count; j++) + { + if (paths[i][j].X < result.left) result.left = paths[i][j].X; + else if (paths[i][j].X > result.right) result.right = paths[i][j].X; + if (paths[i][j].Y < result.top) result.top = paths[i][j].Y; + else if (paths[i][j].Y > result.bottom) result.bottom = paths[i][j].Y; + } + return result; } - lm = lm.Next; - } - m_ActiveEdges = null; - } - //------------------------------------------------------------------------------ - - public static IntRect GetBounds(Paths paths) - { - int i = 0, cnt = paths.Count; - while (i < cnt && paths[i].Count == 0) i++; - if (i == cnt) return new IntRect(0,0,0,0); - IntRect result = new IntRect(); - result.left = paths[i][0].X; - result.right = result.left; - result.top = paths[i][0].Y; - result.bottom = result.top; - for (; i < cnt; i++) - for (int j = 0; j < paths[i].Count; j++) - { - if (paths[i][j].X < result.left) result.left = paths[i][j].X; - else if (paths[i][j].X > result.right) result.right = paths[i][j].X; - if (paths[i][j].Y < result.top) result.top = paths[i][j].Y; - else if (paths[i][j].Y > result.bottom) result.bottom = paths[i][j].Y; - } - return result; - } - //------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ - internal void InsertScanbeam(cInt Y) - { - //single-linked list: sorted descending, ignoring dups. - if (m_Scanbeam == null) + internal void InsertScanbeam(cInt Y) { - m_Scanbeam = new Scanbeam(); - m_Scanbeam.Next = null; - m_Scanbeam.Y = Y; + //single-linked list: sorted descending, ignoring dups. + if (m_Scanbeam == null) + { + m_Scanbeam = new Scanbeam(); + m_Scanbeam.Next = null; + m_Scanbeam.Y = Y; + } + else if (Y > m_Scanbeam.Y) + { + Scanbeam newSb = new Scanbeam(); + newSb.Y = Y; + newSb.Next = m_Scanbeam; + m_Scanbeam = newSb; + } + else + { + Scanbeam sb2 = m_Scanbeam; + while (sb2.Next != null && (Y <= sb2.Next.Y)) sb2 = sb2.Next; + if (Y == sb2.Y) return; //ie ignores duplicates + Scanbeam newSb = new Scanbeam(); + newSb.Y = Y; + newSb.Next = sb2.Next; + sb2.Next = newSb; + } } - else if (Y > m_Scanbeam.Y) + //------------------------------------------------------------------------------ + + internal Boolean PopScanbeam(out cInt Y) { - Scanbeam newSb = new Scanbeam(); - newSb.Y = Y; - newSb.Next = m_Scanbeam; - m_Scanbeam = newSb; + if (m_Scanbeam == null) + { + Y = 0; + return false; + } + Y = m_Scanbeam.Y; + m_Scanbeam = m_Scanbeam.Next; + return true; } - else + //------------------------------------------------------------------------------ + + internal Boolean LocalMinimaPending() { - Scanbeam sb2 = m_Scanbeam; - while (sb2.Next != null && (Y <= sb2.Next.Y)) sb2 = sb2.Next; - if (Y == sb2.Y) return; //ie ignores duplicates - Scanbeam newSb = new Scanbeam(); - newSb.Y = Y; - newSb.Next = sb2.Next; - sb2.Next = newSb; + return (m_CurrentLM != null); } - } - //------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ - internal Boolean PopScanbeam(out cInt Y) - { - if (m_Scanbeam == null) + internal OutRec CreateOutRec() { - Y = 0; - return false; + OutRec result = new OutRec(); + result.Idx = Unassigned; + result.IsHole = false; + result.IsOpen = false; + result.FirstLeft = null; + result.Pts = null; + result.BottomPt = null; + result.PolyNode = null; + m_PolyOuts.Add(result); + result.Idx = m_PolyOuts.Count - 1; + return result; } - Y = m_Scanbeam.Y; - m_Scanbeam = m_Scanbeam.Next; - return true; - } - //------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ - internal Boolean LocalMinimaPending() - { - return (m_CurrentLM != null); - } - //------------------------------------------------------------------------------ + internal void DisposeOutRec(int index) + { + OutRec outRec = m_PolyOuts[index]; + outRec.Pts = null; + outRec = null; + m_PolyOuts[index] = null; + } + //------------------------------------------------------------------------------ - internal OutRec CreateOutRec() - { - OutRec result = new OutRec(); - result.Idx = Unassigned; - result.IsHole = false; - result.IsOpen = false; - result.FirstLeft = null; - result.Pts = null; - result.BottomPt = null; - result.PolyNode = null; - m_PolyOuts.Add(result); - result.Idx = m_PolyOuts.Count - 1; - return result; - } - //------------------------------------------------------------------------------ + internal void UpdateEdgeIntoAEL(ref TEdge e) + { + if (e.NextInLML == null) + throw new ClipperException("UpdateEdgeIntoAEL: invalid call"); + TEdge AelPrev = e.PrevInAEL; + TEdge AelNext = e.NextInAEL; + e.NextInLML.OutIdx = e.OutIdx; + if (AelPrev != null) + AelPrev.NextInAEL = e.NextInLML; + else m_ActiveEdges = e.NextInLML; + if (AelNext != null) + AelNext.PrevInAEL = e.NextInLML; + e.NextInLML.Side = e.Side; + e.NextInLML.WindDelta = e.WindDelta; + e.NextInLML.WindCnt = e.WindCnt; + e.NextInLML.WindCnt2 = e.WindCnt2; + e = e.NextInLML; + e.Curr = e.Bot; + e.PrevInAEL = AelPrev; + e.NextInAEL = AelNext; + if (!IsHorizontal(e)) InsertScanbeam(e.Top.Y); + } + //------------------------------------------------------------------------------ - internal void DisposeOutRec(int index) - { - OutRec outRec = m_PolyOuts[index]; - outRec.Pts = null; - outRec = null; - m_PolyOuts[index] = null; - } - //------------------------------------------------------------------------------ + internal void SwapPositionsInAEL(TEdge edge1, TEdge edge2) + { + //check that one or other edge hasn't already been removed from AEL ... + if (edge1.NextInAEL == edge1.PrevInAEL || + edge2.NextInAEL == edge2.PrevInAEL) return; - internal void UpdateEdgeIntoAEL(ref TEdge e) - { - if (e.NextInLML == null) - throw new ClipperException("UpdateEdgeIntoAEL: invalid call"); - TEdge AelPrev = e.PrevInAEL; - TEdge AelNext = e.NextInAEL; - e.NextInLML.OutIdx = e.OutIdx; - if (AelPrev != null) - AelPrev.NextInAEL = e.NextInLML; - else m_ActiveEdges = e.NextInLML; - if (AelNext != null) - AelNext.PrevInAEL = e.NextInLML; - e.NextInLML.Side = e.Side; - e.NextInLML.WindDelta = e.WindDelta; - e.NextInLML.WindCnt = e.WindCnt; - e.NextInLML.WindCnt2 = e.WindCnt2; - e = e.NextInLML; - e.Curr = e.Bot; - e.PrevInAEL = AelPrev; - e.NextInAEL = AelNext; - if (!IsHorizontal(e)) InsertScanbeam(e.Top.Y); - } - //------------------------------------------------------------------------------ + if (edge1.NextInAEL == edge2) + { + TEdge next = edge2.NextInAEL; + if (next != null) + next.PrevInAEL = edge1; + TEdge prev = edge1.PrevInAEL; + if (prev != null) + prev.NextInAEL = edge2; + edge2.PrevInAEL = prev; + edge2.NextInAEL = edge1; + edge1.PrevInAEL = edge2; + edge1.NextInAEL = next; + } + else if (edge2.NextInAEL == edge1) + { + TEdge next = edge1.NextInAEL; + if (next != null) + next.PrevInAEL = edge2; + TEdge prev = edge2.PrevInAEL; + if (prev != null) + prev.NextInAEL = edge1; + edge1.PrevInAEL = prev; + edge1.NextInAEL = edge2; + edge2.PrevInAEL = edge1; + edge2.NextInAEL = next; + } + else + { + TEdge next = edge1.NextInAEL; + TEdge prev = edge1.PrevInAEL; + edge1.NextInAEL = edge2.NextInAEL; + if (edge1.NextInAEL != null) + edge1.NextInAEL.PrevInAEL = edge1; + edge1.PrevInAEL = edge2.PrevInAEL; + if (edge1.PrevInAEL != null) + edge1.PrevInAEL.NextInAEL = edge1; + edge2.NextInAEL = next; + if (edge2.NextInAEL != null) + edge2.NextInAEL.PrevInAEL = edge2; + edge2.PrevInAEL = prev; + if (edge2.PrevInAEL != null) + edge2.PrevInAEL.NextInAEL = edge2; + } - internal void SwapPositionsInAEL(TEdge edge1, TEdge edge2) - { - //check that one or other edge hasn't already been removed from AEL ... - if (edge1.NextInAEL == edge1.PrevInAEL || - edge2.NextInAEL == edge2.PrevInAEL) return; - - if (edge1.NextInAEL == edge2) - { - TEdge next = edge2.NextInAEL; - if (next != null) - next.PrevInAEL = edge1; - TEdge prev = edge1.PrevInAEL; - if (prev != null) - prev.NextInAEL = edge2; - edge2.PrevInAEL = prev; - edge2.NextInAEL = edge1; - edge1.PrevInAEL = edge2; - edge1.NextInAEL = next; - } - else if (edge2.NextInAEL == edge1) - { - TEdge next = edge1.NextInAEL; - if (next != null) - next.PrevInAEL = edge2; - TEdge prev = edge2.PrevInAEL; - if (prev != null) - prev.NextInAEL = edge1; - edge1.PrevInAEL = prev; - edge1.NextInAEL = edge2; - edge2.PrevInAEL = edge1; - edge2.NextInAEL = next; - } - else - { - TEdge next = edge1.NextInAEL; - TEdge prev = edge1.PrevInAEL; - edge1.NextInAEL = edge2.NextInAEL; - if (edge1.NextInAEL != null) - edge1.NextInAEL.PrevInAEL = edge1; - edge1.PrevInAEL = edge2.PrevInAEL; - if (edge1.PrevInAEL != null) - edge1.PrevInAEL.NextInAEL = edge1; - edge2.NextInAEL = next; - if (edge2.NextInAEL != null) - edge2.NextInAEL.PrevInAEL = edge2; - edge2.PrevInAEL = prev; - if (edge2.PrevInAEL != null) - edge2.PrevInAEL.NextInAEL = edge2; - } - - if (edge1.PrevInAEL == null) - m_ActiveEdges = edge1; - else if (edge2.PrevInAEL == null) - m_ActiveEdges = edge2; - } - //------------------------------------------------------------------------------ + if (edge1.PrevInAEL == null) + m_ActiveEdges = edge1; + else if (edge2.PrevInAEL == null) + m_ActiveEdges = edge2; + } + //------------------------------------------------------------------------------ - internal void DeleteFromAEL(TEdge e) - { - TEdge AelPrev = e.PrevInAEL; - TEdge AelNext = e.NextInAEL; - if (AelPrev == null && AelNext == null && (e != m_ActiveEdges)) - return; //already deleted - if (AelPrev != null) - AelPrev.NextInAEL = AelNext; - else m_ActiveEdges = AelNext; - if (AelNext != null) - AelNext.PrevInAEL = AelPrev; - e.NextInAEL = null; - e.PrevInAEL = null; - } - //------------------------------------------------------------------------------ + internal void DeleteFromAEL(TEdge e) + { + TEdge AelPrev = e.PrevInAEL; + TEdge AelNext = e.NextInAEL; + if (AelPrev == null && AelNext == null && (e != m_ActiveEdges)) + return; //already deleted + if (AelPrev != null) + AelPrev.NextInAEL = AelNext; + else m_ActiveEdges = AelNext; + if (AelNext != null) + AelNext.PrevInAEL = AelPrev; + e.NextInAEL = null; + e.PrevInAEL = null; + } + //------------------------------------------------------------------------------ - } //end ClipperBase - - public class Clipper : ClipperBase - { - //InitOptions that can be passed to the constructor ... - public const int ioReverseSolution = 1; - public const int ioStrictlySimple = 2; - public const int ioPreserveCollinear = 4; - - private ClipType m_ClipType; - private Maxima m_Maxima; - private TEdge m_SortedEdges; - private List m_IntersectList; - IComparer m_IntersectNodeComparer; - private bool m_ExecuteLocked; - private PolyFillType m_ClipFillType; - private PolyFillType m_SubjFillType; - private List m_Joins; - private List m_GhostJoins; - private bool m_UsingPolyTree; + } //end ClipperBase + + public class Clipper : ClipperBase + { + //InitOptions that can be passed to the constructor ... + public const int ioReverseSolution = 1; + public const int ioStrictlySimple = 2; + public const int ioPreserveCollinear = 4; + + private ClipType m_ClipType; + private Maxima m_Maxima; + private TEdge m_SortedEdges; + private List m_IntersectList; + IComparer m_IntersectNodeComparer; + private bool m_ExecuteLocked; + private PolyFillType m_ClipFillType; + private PolyFillType m_SubjFillType; + private List m_Joins; + private List m_GhostJoins; + private bool m_UsingPolyTree; #if use_xyz public delegate void ZFillCallback(IntPoint bot1, IntPoint top1, IntPoint bot2, IntPoint top2, ref IntPoint pt); public ZFillCallback ZFillFunction { get; set; } #endif - public Clipper(int InitOptions = 0): base() //constructor - { - m_Scanbeam = null; - m_Maxima = null; - m_ActiveEdges = null; - m_SortedEdges = null; - m_IntersectList = new List(); - m_IntersectNodeComparer = new MyIntersectNodeSort(); - m_ExecuteLocked = false; - m_UsingPolyTree = false; - m_PolyOuts = new List(); - m_Joins = new List(); - m_GhostJoins = new List(); - ReverseSolution = (ioReverseSolution & InitOptions) != 0; - StrictlySimple = (ioStrictlySimple & InitOptions) != 0; - PreserveCollinear = (ioPreserveCollinear & InitOptions) != 0; + public Clipper(int InitOptions = 0) : base() //constructor + { + m_Scanbeam = null; + m_Maxima = null; + m_ActiveEdges = null; + m_SortedEdges = null; + m_IntersectList = new List(); + m_IntersectNodeComparer = new MyIntersectNodeSort(); + m_ExecuteLocked = false; + m_UsingPolyTree = false; + m_PolyOuts = new List(); + m_Joins = new List(); + m_GhostJoins = new List(); + ReverseSolution = (ioReverseSolution & InitOptions) != 0; + StrictlySimple = (ioStrictlySimple & InitOptions) != 0; + PreserveCollinear = (ioPreserveCollinear & InitOptions) != 0; #if use_xyz ZFillFunction = null; #endif - } - //------------------------------------------------------------------------------ + } + //------------------------------------------------------------------------------ - private void InsertMaxima(cInt X) - { - //double-linked list: sorted ascending, ignoring dups. - Maxima newMax = new Maxima(); - newMax.X = X; - if (m_Maxima == null) - { - m_Maxima = newMax; - m_Maxima.Next = null; - m_Maxima.Prev = null; - } - else if (X < m_Maxima.X) - { - newMax.Next = m_Maxima; - newMax.Prev = null; - m_Maxima = newMax; - } - else - { - Maxima m = m_Maxima; - while (m.Next != null && (X >= m.Next.X)) m = m.Next; - if (X == m.X) return; //ie ignores duplicates (& CG to clean up newMax) - //insert newMax between m and m.Next ... - newMax.Next = m.Next; - newMax.Prev = m; - if (m.Next != null) m.Next.Prev = newMax; - m.Next = newMax; - } - } - //------------------------------------------------------------------------------ + private void InsertMaxima(cInt X) + { + //double-linked list: sorted ascending, ignoring dups. + Maxima newMax = new Maxima(); + newMax.X = X; + if (m_Maxima == null) + { + m_Maxima = newMax; + m_Maxima.Next = null; + m_Maxima.Prev = null; + } + else if (X < m_Maxima.X) + { + newMax.Next = m_Maxima; + newMax.Prev = null; + m_Maxima = newMax; + } + else + { + Maxima m = m_Maxima; + while (m.Next != null && (X >= m.Next.X)) m = m.Next; + if (X == m.X) return; //ie ignores duplicates (& CG to clean up newMax) + //insert newMax between m and m.Next ... + newMax.Next = m.Next; + newMax.Prev = m; + if (m.Next != null) m.Next.Prev = newMax; + m.Next = newMax; + } + } + //------------------------------------------------------------------------------ - public bool ReverseSolution - { - get; - set; - } - //------------------------------------------------------------------------------ + public bool ReverseSolution + { + get; + set; + } + //------------------------------------------------------------------------------ - public bool StrictlySimple - { - get; - set; - } - //------------------------------------------------------------------------------ - - public bool Execute(ClipType clipType, Paths solution, - PolyFillType FillType = PolyFillType.pftEvenOdd) - { - return Execute(clipType, solution, FillType, FillType); - } - //------------------------------------------------------------------------------ + public bool StrictlySimple + { + get; + set; + } + //------------------------------------------------------------------------------ - public bool Execute(ClipType clipType, PolyTree polytree, - PolyFillType FillType = PolyFillType.pftEvenOdd) - { - return Execute(clipType, polytree, FillType, FillType); - } - //------------------------------------------------------------------------------ + public bool Execute(ClipType clipType, Paths solution, + PolyFillType FillType = PolyFillType.pftEvenOdd) + { + return Execute(clipType, solution, FillType, FillType); + } + //------------------------------------------------------------------------------ - public bool Execute(ClipType clipType, Paths solution, - PolyFillType subjFillType, PolyFillType clipFillType) - { - if (m_ExecuteLocked) return false; - if (m_HasOpenPaths) throw - new ClipperException("Error: PolyTree struct is needed for open path clipping."); - - m_ExecuteLocked = true; - solution.Clear(); - m_SubjFillType = subjFillType; - m_ClipFillType = clipFillType; - m_ClipType = clipType; - m_UsingPolyTree = false; - bool succeeded; - try - { - succeeded = ExecuteInternal(); - //build the return polygons ... - if (succeeded) BuildResult(solution); - } - finally - { - DisposeAllPolyPts(); - m_ExecuteLocked = false; - } - return succeeded; - } - //------------------------------------------------------------------------------ + public bool Execute(ClipType clipType, PolyTree polytree, + PolyFillType FillType = PolyFillType.pftEvenOdd) + { + return Execute(clipType, polytree, FillType, FillType); + } + //------------------------------------------------------------------------------ - public bool Execute(ClipType clipType, PolyTree polytree, - PolyFillType subjFillType, PolyFillType clipFillType) - { - if (m_ExecuteLocked) return false; - m_ExecuteLocked = true; - m_SubjFillType = subjFillType; - m_ClipFillType = clipFillType; - m_ClipType = clipType; - m_UsingPolyTree = true; - bool succeeded; - try - { - succeeded = ExecuteInternal(); - //build the return polygons ... - if (succeeded) BuildResult2(polytree); - } - finally - { - DisposeAllPolyPts(); - m_ExecuteLocked = false; - } - return succeeded; - } - //------------------------------------------------------------------------------ + public bool Execute(ClipType clipType, Paths solution, + PolyFillType subjFillType, PolyFillType clipFillType) + { + if (m_ExecuteLocked) return false; + if (m_HasOpenPaths) throw + new ClipperException("Error: PolyTree struct is needed for open path clipping."); + + m_ExecuteLocked = true; + solution.Clear(); + m_SubjFillType = subjFillType; + m_ClipFillType = clipFillType; + m_ClipType = clipType; + m_UsingPolyTree = false; + bool succeeded; + try + { + succeeded = ExecuteInternal(); + //build the return polygons ... + if (succeeded) BuildResult(solution); + } + finally + { + DisposeAllPolyPts(); + m_ExecuteLocked = false; + } + return succeeded; + } + //------------------------------------------------------------------------------ - internal void FixHoleLinkage(OutRec outRec) - { - //skip if an outermost polygon or - //already already points to the correct FirstLeft ... - if (outRec.FirstLeft == null || - (outRec.IsHole != outRec.FirstLeft.IsHole && - outRec.FirstLeft.Pts != null)) return; - - OutRec orfl = outRec.FirstLeft; - while (orfl != null && ((orfl.IsHole == outRec.IsHole) || orfl.Pts == null)) - orfl = orfl.FirstLeft; - outRec.FirstLeft = orfl; - } - //------------------------------------------------------------------------------ + public bool Execute(ClipType clipType, PolyTree polytree, + PolyFillType subjFillType, PolyFillType clipFillType) + { + if (m_ExecuteLocked) return false; + m_ExecuteLocked = true; + m_SubjFillType = subjFillType; + m_ClipFillType = clipFillType; + m_ClipType = clipType; + m_UsingPolyTree = true; + bool succeeded; + try + { + succeeded = ExecuteInternal(); + //build the return polygons ... + if (succeeded) BuildResult2(polytree); + } + finally + { + DisposeAllPolyPts(); + m_ExecuteLocked = false; + } + return succeeded; + } + //------------------------------------------------------------------------------ - private bool ExecuteInternal() - { - try + internal void FixHoleLinkage(OutRec outRec) { - Reset(); - m_SortedEdges = null; - m_Maxima = null; + //skip if an outermost polygon or + //already already points to the correct FirstLeft ... + if (outRec.FirstLeft == null || + (outRec.IsHole != outRec.FirstLeft.IsHole && + outRec.FirstLeft.Pts != null)) return; + + OutRec orfl = outRec.FirstLeft; + while (orfl != null && ((orfl.IsHole == outRec.IsHole) || orfl.Pts == null)) + orfl = orfl.FirstLeft; + outRec.FirstLeft = orfl; + } + //------------------------------------------------------------------------------ - cInt botY, topY; - if (!PopScanbeam(out botY)) return false; - InsertLocalMinimaIntoAEL(botY); - while (PopScanbeam(out topY) || LocalMinimaPending()) - { - ProcessHorizontals(); - m_GhostJoins.Clear(); - if (!ProcessIntersections(topY)) return false; - ProcessEdgesAtTopOfScanbeam(topY); - botY = topY; - InsertLocalMinimaIntoAEL(botY); - } - - //fix orientations ... - foreach (OutRec outRec in m_PolyOuts) - { - if (outRec.Pts == null || outRec.IsOpen) continue; - if ((outRec.IsHole ^ ReverseSolution) == (Area(outRec) > 0)) - ReversePolyPtLinks(outRec.Pts); - } - - JoinCommonEdges(); - - foreach (OutRec outRec in m_PolyOuts) - { - if (outRec.Pts == null) - continue; - else if (outRec.IsOpen) - FixupOutPolyline(outRec); - else - FixupOutPolygon(outRec); - } + private bool ExecuteInternal() + { + try + { + Reset(); + m_SortedEdges = null; + m_Maxima = null; + + cInt botY, topY; + if (!PopScanbeam(out botY)) return false; + InsertLocalMinimaIntoAEL(botY); + while (PopScanbeam(out topY) || LocalMinimaPending()) + { + ProcessHorizontals(); + m_GhostJoins.Clear(); + if (!ProcessIntersections(topY)) return false; + ProcessEdgesAtTopOfScanbeam(topY); + botY = topY; + InsertLocalMinimaIntoAEL(botY); + } + + //fix orientations ... + foreach (OutRec outRec in m_PolyOuts) + { + if (outRec.Pts == null || outRec.IsOpen) continue; + if ((outRec.IsHole ^ ReverseSolution) == (Area(outRec) > 0)) + ReversePolyPtLinks(outRec.Pts); + } + + JoinCommonEdges(); + + foreach (OutRec outRec in m_PolyOuts) + { + if (outRec.Pts == null) + continue; + else if (outRec.IsOpen) + FixupOutPolyline(outRec); + else + FixupOutPolygon(outRec); + } - if (StrictlySimple) DoSimplePolygons(); - return true; + if (StrictlySimple) DoSimplePolygons(); + return true; + } + //catch { return false; } + finally + { + m_Joins.Clear(); + m_GhostJoins.Clear(); + } } - //catch { return false; } - finally + //------------------------------------------------------------------------------ + + private void DisposeAllPolyPts() { - m_Joins.Clear(); - m_GhostJoins.Clear(); + for (int i = 0; i < m_PolyOuts.Count; ++i) DisposeOutRec(i); + m_PolyOuts.Clear(); } - } - //------------------------------------------------------------------------------ - - private void DisposeAllPolyPts(){ - for (int i = 0; i < m_PolyOuts.Count; ++i) DisposeOutRec(i); - m_PolyOuts.Clear(); - } - //------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ - private void AddJoin(OutPt Op1, OutPt Op2, IntPoint OffPt) - { - Join j = new Join(); - j.OutPt1 = Op1; - j.OutPt2 = Op2; - j.OffPt = OffPt; - m_Joins.Add(j); - } - //------------------------------------------------------------------------------ + private void AddJoin(OutPt Op1, OutPt Op2, IntPoint OffPt) + { + Join j = new Join(); + j.OutPt1 = Op1; + j.OutPt2 = Op2; + j.OffPt = OffPt; + m_Joins.Add(j); + } + //------------------------------------------------------------------------------ - private void AddGhostJoin(OutPt Op, IntPoint OffPt) - { - Join j = new Join(); - j.OutPt1 = Op; - j.OffPt = OffPt; - m_GhostJoins.Add(j); - } - //------------------------------------------------------------------------------ + private void AddGhostJoin(OutPt Op, IntPoint OffPt) + { + Join j = new Join(); + j.OutPt1 = Op; + j.OffPt = OffPt; + m_GhostJoins.Add(j); + } + //------------------------------------------------------------------------------ #if use_xyz internal void SetZ(ref IntPoint pt, TEdge e1, TEdge e2) @@ -1618,3287 +1622,3309 @@ internal void SetZ(ref IntPoint pt, TEdge e1, TEdge e2) //------------------------------------------------------------------------------ #endif - private void InsertLocalMinimaIntoAEL(cInt botY) - { - LocalMinima lm; - while (PopLocalMinima(botY, out lm)) - { - TEdge lb = lm.LeftBound; - TEdge rb = lm.RightBound; - - OutPt Op1 = null; - if (lb == null) - { - InsertEdgeIntoAEL(rb, null); - SetWindingCount(rb); - if (IsContributing(rb)) - Op1 = AddOutPt(rb, rb.Bot); - } - else if (rb == null) - { - InsertEdgeIntoAEL(lb, null); - SetWindingCount(lb); - if (IsContributing(lb)) - Op1 = AddOutPt(lb, lb.Bot); - InsertScanbeam(lb.Top.Y); - } - else - { - InsertEdgeIntoAEL(lb, null); - InsertEdgeIntoAEL(rb, lb); - SetWindingCount(lb); - rb.WindCnt = lb.WindCnt; - rb.WindCnt2 = lb.WindCnt2; - if (IsContributing(lb)) - Op1 = AddLocalMinPoly(lb, rb, lb.Bot); - InsertScanbeam(lb.Top.Y); - } - - if (rb != null) - { - if (IsHorizontal(rb)) - { - if (rb.NextInLML != null) - InsertScanbeam(rb.NextInLML.Top.Y); - AddEdgeToSEL(rb); + private void InsertLocalMinimaIntoAEL(cInt botY) + { + LocalMinima lm; + while (PopLocalMinima(botY, out lm)) + { + TEdge lb = lm.LeftBound; + TEdge rb = lm.RightBound; + + OutPt Op1 = null; + if (lb == null) + { + InsertEdgeIntoAEL(rb, null); + SetWindingCount(rb); + if (IsContributing(rb)) + Op1 = AddOutPt(rb, rb.Bot); + } + else if (rb == null) + { + InsertEdgeIntoAEL(lb, null); + SetWindingCount(lb); + if (IsContributing(lb)) + Op1 = AddOutPt(lb, lb.Bot); + InsertScanbeam(lb.Top.Y); + } + else + { + InsertEdgeIntoAEL(lb, null); + InsertEdgeIntoAEL(rb, lb); + SetWindingCount(lb); + rb.WindCnt = lb.WindCnt; + rb.WindCnt2 = lb.WindCnt2; + if (IsContributing(lb)) + Op1 = AddLocalMinPoly(lb, rb, lb.Bot); + InsertScanbeam(lb.Top.Y); + } + + if (rb != null) + { + if (IsHorizontal(rb)) + { + if (rb.NextInLML != null) + InsertScanbeam(rb.NextInLML.Top.Y); + AddEdgeToSEL(rb); + } + else + InsertScanbeam(rb.Top.Y); + } + + if (lb == null || rb == null) continue; + + //if output polygons share an Edge with a horizontal rb, they'll need joining later ... + if (Op1 != null && IsHorizontal(rb) && + m_GhostJoins.Count > 0 && rb.WindDelta != 0) + { + for (int i = 0; i < m_GhostJoins.Count; i++) + { + //if the horizontal Rb and a 'ghost' horizontal overlap, then convert + //the 'ghost' join to a real join ready for later ... + Join j = m_GhostJoins[i]; + if (HorzSegmentsOverlap(j.OutPt1.Pt.X, j.OffPt.X, rb.Bot.X, rb.Top.X)) + AddJoin(j.OutPt1, Op1, j.OffPt); + } + } + + if (lb.OutIdx >= 0 && lb.PrevInAEL != null && + lb.PrevInAEL.Curr.X == lb.Bot.X && + lb.PrevInAEL.OutIdx >= 0 && + SlopesEqual(lb.PrevInAEL.Curr, lb.PrevInAEL.Top, lb.Curr, lb.Top, m_UseFullRange) && + lb.WindDelta != 0 && lb.PrevInAEL.WindDelta != 0) + { + OutPt Op2 = AddOutPt(lb.PrevInAEL, lb.Bot); + AddJoin(Op1, Op2, lb.Top); + } + + if (lb.NextInAEL != rb) + { + + if (rb.OutIdx >= 0 && rb.PrevInAEL.OutIdx >= 0 && + SlopesEqual(rb.PrevInAEL.Curr, rb.PrevInAEL.Top, rb.Curr, rb.Top, m_UseFullRange) && + rb.WindDelta != 0 && rb.PrevInAEL.WindDelta != 0) + { + OutPt Op2 = AddOutPt(rb.PrevInAEL, rb.Bot); + AddJoin(Op1, Op2, rb.Top); + } + + TEdge e = lb.NextInAEL; + if (e != null) + while (e != rb) + { + //nb: For calculating winding counts etc, IntersectEdges() assumes + //that param1 will be to the right of param2 ABOVE the intersection ... + IntersectEdges(rb, e, lb.Curr); //order important here + e = e.NextInAEL; + } + } } - else - InsertScanbeam(rb.Top.Y); - } - - if (lb == null || rb == null) continue; - - //if output polygons share an Edge with a horizontal rb, they'll need joining later ... - if (Op1 != null && IsHorizontal(rb) && - m_GhostJoins.Count > 0 && rb.WindDelta != 0) - { - for (int i = 0; i < m_GhostJoins.Count; i++) - { - //if the horizontal Rb and a 'ghost' horizontal overlap, then convert - //the 'ghost' join to a real join ready for later ... - Join j = m_GhostJoins[i]; - if (HorzSegmentsOverlap(j.OutPt1.Pt.X, j.OffPt.X, rb.Bot.X, rb.Top.X)) - AddJoin(j.OutPt1, Op1, j.OffPt); - } - } - - if (lb.OutIdx >= 0 && lb.PrevInAEL != null && - lb.PrevInAEL.Curr.X == lb.Bot.X && - lb.PrevInAEL.OutIdx >= 0 && - SlopesEqual(lb.PrevInAEL.Curr, lb.PrevInAEL.Top, lb.Curr, lb.Top, m_UseFullRange) && - lb.WindDelta != 0 && lb.PrevInAEL.WindDelta != 0) - { - OutPt Op2 = AddOutPt(lb.PrevInAEL, lb.Bot); - AddJoin(Op1, Op2, lb.Top); - } - - if( lb.NextInAEL != rb ) - { - - if (rb.OutIdx >= 0 && rb.PrevInAEL.OutIdx >= 0 && - SlopesEqual(rb.PrevInAEL.Curr, rb.PrevInAEL.Top, rb.Curr, rb.Top, m_UseFullRange) && - rb.WindDelta != 0 && rb.PrevInAEL.WindDelta != 0) - { - OutPt Op2 = AddOutPt(rb.PrevInAEL, rb.Bot); - AddJoin(Op1, Op2, rb.Top); - } - - TEdge e = lb.NextInAEL; - if (e != null) - while (e != rb) - { - //nb: For calculating winding counts etc, IntersectEdges() assumes - //that param1 will be to the right of param2 ABOVE the intersection ... - IntersectEdges(rb, e, lb.Curr); //order important here - e = e.NextInAEL; - } - } } - } - //------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ - private void InsertEdgeIntoAEL(TEdge edge, TEdge startEdge) - { - if (m_ActiveEdges == null) + private void InsertEdgeIntoAEL(TEdge edge, TEdge startEdge) { - edge.PrevInAEL = null; - edge.NextInAEL = null; - m_ActiveEdges = edge; + if (m_ActiveEdges == null) + { + edge.PrevInAEL = null; + edge.NextInAEL = null; + m_ActiveEdges = edge; + } + else if (startEdge == null && E2InsertsBeforeE1(m_ActiveEdges, edge)) + { + edge.PrevInAEL = null; + edge.NextInAEL = m_ActiveEdges; + m_ActiveEdges.PrevInAEL = edge; + m_ActiveEdges = edge; + } + else + { + if (startEdge == null) startEdge = m_ActiveEdges; + while (startEdge.NextInAEL != null && + !E2InsertsBeforeE1(startEdge.NextInAEL, edge)) + startEdge = startEdge.NextInAEL; + edge.NextInAEL = startEdge.NextInAEL; + if (startEdge.NextInAEL != null) startEdge.NextInAEL.PrevInAEL = edge; + edge.PrevInAEL = startEdge; + startEdge.NextInAEL = edge; + } } - else if (startEdge == null && E2InsertsBeforeE1(m_ActiveEdges, edge)) + //---------------------------------------------------------------------- + + private bool E2InsertsBeforeE1(TEdge e1, TEdge e2) { - edge.PrevInAEL = null; - edge.NextInAEL = m_ActiveEdges; - m_ActiveEdges.PrevInAEL = edge; - m_ActiveEdges = edge; + if (e2.Curr.X == e1.Curr.X) + { + if (e2.Top.Y > e1.Top.Y) + return e2.Top.X < TopX(e1, e2.Top.Y); + else return e1.Top.X > TopX(e2, e1.Top.Y); + } + else return e2.Curr.X < e1.Curr.X; } - else + //------------------------------------------------------------------------------ + + private bool IsEvenOddFillType(TEdge edge) { - if (startEdge == null) startEdge = m_ActiveEdges; - while (startEdge.NextInAEL != null && - !E2InsertsBeforeE1(startEdge.NextInAEL, edge)) - startEdge = startEdge.NextInAEL; - edge.NextInAEL = startEdge.NextInAEL; - if (startEdge.NextInAEL != null) startEdge.NextInAEL.PrevInAEL = edge; - edge.PrevInAEL = startEdge; - startEdge.NextInAEL = edge; + if (edge.PolyTyp == PolyType.ptSubject) + return m_SubjFillType == PolyFillType.pftEvenOdd; + else + return m_ClipFillType == PolyFillType.pftEvenOdd; } - } - //---------------------------------------------------------------------- + //------------------------------------------------------------------------------ - private bool E2InsertsBeforeE1(TEdge e1, TEdge e2) - { - if (e2.Curr.X == e1.Curr.X) - { - if (e2.Top.Y > e1.Top.Y) - return e2.Top.X < TopX(e1, e2.Top.Y); - else return e1.Top.X > TopX(e2, e1.Top.Y); - } - else return e2.Curr.X < e1.Curr.X; - } - //------------------------------------------------------------------------------ + private bool IsEvenOddAltFillType(TEdge edge) + { + if (edge.PolyTyp == PolyType.ptSubject) + return m_ClipFillType == PolyFillType.pftEvenOdd; + else + return m_SubjFillType == PolyFillType.pftEvenOdd; + } + //------------------------------------------------------------------------------ - private bool IsEvenOddFillType(TEdge edge) - { - if (edge.PolyTyp == PolyType.ptSubject) - return m_SubjFillType == PolyFillType.pftEvenOdd; - else - return m_ClipFillType == PolyFillType.pftEvenOdd; - } - //------------------------------------------------------------------------------ + private bool IsContributing(TEdge edge) + { + PolyFillType pft, pft2; + if (edge.PolyTyp == PolyType.ptSubject) + { + pft = m_SubjFillType; + pft2 = m_ClipFillType; + } + else + { + pft = m_ClipFillType; + pft2 = m_SubjFillType; + } - private bool IsEvenOddAltFillType(TEdge edge) - { - if (edge.PolyTyp == PolyType.ptSubject) - return m_ClipFillType == PolyFillType.pftEvenOdd; - else - return m_SubjFillType == PolyFillType.pftEvenOdd; - } - //------------------------------------------------------------------------------ + switch (pft) + { + case PolyFillType.pftEvenOdd: + //return false if a subj line has been flagged as inside a subj polygon + if (edge.WindDelta == 0 && edge.WindCnt != 1) return false; + break; + case PolyFillType.pftNonZero: + if (Math.Abs(edge.WindCnt) != 1) return false; + break; + case PolyFillType.pftPositive: + if (edge.WindCnt != 1) return false; + break; + default: //PolyFillType.pftNegative + if (edge.WindCnt != -1) return false; + break; + } - private bool IsContributing(TEdge edge) - { - PolyFillType pft, pft2; - if (edge.PolyTyp == PolyType.ptSubject) - { - pft = m_SubjFillType; - pft2 = m_ClipFillType; - } - else - { - pft = m_ClipFillType; - pft2 = m_SubjFillType; - } - - switch (pft) - { - case PolyFillType.pftEvenOdd: - //return false if a subj line has been flagged as inside a subj polygon - if (edge.WindDelta == 0 && edge.WindCnt != 1) return false; - break; - case PolyFillType.pftNonZero: - if (Math.Abs(edge.WindCnt) != 1) return false; - break; - case PolyFillType.pftPositive: - if (edge.WindCnt != 1) return false; - break; - default: //PolyFillType.pftNegative - if (edge.WindCnt != -1) return false; - break; - } - - switch (m_ClipType) - { - case ClipType.ctIntersection: - switch (pft2) - { - case PolyFillType.pftEvenOdd: - case PolyFillType.pftNonZero: - return (edge.WindCnt2 != 0); - case PolyFillType.pftPositive: - return (edge.WindCnt2 > 0); - default: - return (edge.WindCnt2 < 0); - } - case ClipType.ctUnion: - switch (pft2) - { - case PolyFillType.pftEvenOdd: - case PolyFillType.pftNonZero: - return (edge.WindCnt2 == 0); - case PolyFillType.pftPositive: - return (edge.WindCnt2 <= 0); - default: - return (edge.WindCnt2 >= 0); - } - case ClipType.ctDifference: - if (edge.PolyTyp == PolyType.ptSubject) + switch (m_ClipType) + { + case ClipType.ctIntersection: switch (pft2) { case PolyFillType.pftEvenOdd: case PolyFillType.pftNonZero: - return (edge.WindCnt2 == 0); + return (edge.WindCnt2 != 0); case PolyFillType.pftPositive: - return (edge.WindCnt2 <= 0); + return (edge.WindCnt2 > 0); default: - return (edge.WindCnt2 >= 0); + return (edge.WindCnt2 < 0); } - else + case ClipType.ctUnion: switch (pft2) { case PolyFillType.pftEvenOdd: case PolyFillType.pftNonZero: - return (edge.WindCnt2 != 0); + return (edge.WindCnt2 == 0); case PolyFillType.pftPositive: - return (edge.WindCnt2 > 0); + return (edge.WindCnt2 <= 0); default: - return (edge.WindCnt2 < 0); + return (edge.WindCnt2 >= 0); + } + case ClipType.ctDifference: + if (edge.PolyTyp == PolyType.ptSubject) + switch (pft2) + { + case PolyFillType.pftEvenOdd: + case PolyFillType.pftNonZero: + return (edge.WindCnt2 == 0); + case PolyFillType.pftPositive: + return (edge.WindCnt2 <= 0); + default: + return (edge.WindCnt2 >= 0); + } + else + switch (pft2) + { + case PolyFillType.pftEvenOdd: + case PolyFillType.pftNonZero: + return (edge.WindCnt2 != 0); + case PolyFillType.pftPositive: + return (edge.WindCnt2 > 0); + default: + return (edge.WindCnt2 < 0); + } + case ClipType.ctXor: + if (edge.WindDelta == 0) //XOr always contributing unless open + switch (pft2) + { + case PolyFillType.pftEvenOdd: + case PolyFillType.pftNonZero: + return (edge.WindCnt2 == 0); + case PolyFillType.pftPositive: + return (edge.WindCnt2 <= 0); + default: + return (edge.WindCnt2 >= 0); + } + else + return true; + } + return true; + } + //------------------------------------------------------------------------------ + + private void SetWindingCount(TEdge edge) + { + TEdge e = edge.PrevInAEL; + //find the edge of the same polytype that immediately preceeds 'edge' in AEL + while (e != null && ((e.PolyTyp != edge.PolyTyp) || (e.WindDelta == 0))) e = e.PrevInAEL; + if (e == null) + { + PolyFillType pft; + pft = (edge.PolyTyp == PolyType.ptSubject ? m_SubjFillType : m_ClipFillType); + if (edge.WindDelta == 0) edge.WindCnt = (pft == PolyFillType.pftNegative ? -1 : 1); + else edge.WindCnt = edge.WindDelta; + edge.WindCnt2 = 0; + e = m_ActiveEdges; //ie get ready to calc WindCnt2 + } + else if (edge.WindDelta == 0 && m_ClipType != ClipType.ctUnion) + { + edge.WindCnt = 1; + edge.WindCnt2 = e.WindCnt2; + e = e.NextInAEL; //ie get ready to calc WindCnt2 + } + else if (IsEvenOddFillType(edge)) + { + //EvenOdd filling ... + if (edge.WindDelta == 0) + { + //are we inside a subj polygon ... + bool Inside = true; + TEdge e2 = e.PrevInAEL; + while (e2 != null) + { + if (e2.PolyTyp == e.PolyTyp && e2.WindDelta != 0) + Inside = !Inside; + e2 = e2.PrevInAEL; } - case ClipType.ctXor: - if (edge.WindDelta == 0) //XOr always contributing unless open - switch (pft2) - { - case PolyFillType.pftEvenOdd: - case PolyFillType.pftNonZero: - return (edge.WindCnt2 == 0); - case PolyFillType.pftPositive: - return (edge.WindCnt2 <= 0); - default: - return (edge.WindCnt2 >= 0); - } + edge.WindCnt = (Inside ? 0 : 1); + } else - return true; - } - return true; - } - //------------------------------------------------------------------------------ + { + edge.WindCnt = edge.WindDelta; + } + edge.WindCnt2 = e.WindCnt2; + e = e.NextInAEL; //ie get ready to calc WindCnt2 + } + else + { + //nonZero, Positive or Negative filling ... + if (e.WindCnt * e.WindDelta < 0) + { + //prev edge is 'decreasing' WindCount (WC) toward zero + //so we're outside the previous polygon ... + if (Math.Abs(e.WindCnt) > 1) + { + //outside prev poly but still inside another. + //when reversing direction of prev poly use the same WC + if (e.WindDelta * edge.WindDelta < 0) edge.WindCnt = e.WindCnt; + //otherwise continue to 'decrease' WC ... + else edge.WindCnt = e.WindCnt + edge.WindDelta; + } + else + //now outside all polys of same polytype so set own WC ... + edge.WindCnt = (edge.WindDelta == 0 ? 1 : edge.WindDelta); + } + else + { + //prev edge is 'increasing' WindCount (WC) away from zero + //so we're inside the previous polygon ... + if (edge.WindDelta == 0) + edge.WindCnt = (e.WindCnt < 0 ? e.WindCnt - 1 : e.WindCnt + 1); + //if wind direction is reversing prev then use same WC + else if (e.WindDelta * edge.WindDelta < 0) + edge.WindCnt = e.WindCnt; + //otherwise add to WC ... + else edge.WindCnt = e.WindCnt + edge.WindDelta; + } + edge.WindCnt2 = e.WindCnt2; + e = e.NextInAEL; //ie get ready to calc WindCnt2 + } - private void SetWindingCount(TEdge edge) - { - TEdge e = edge.PrevInAEL; - //find the edge of the same polytype that immediately preceeds 'edge' in AEL - while (e != null && ((e.PolyTyp != edge.PolyTyp) || (e.WindDelta == 0))) e = e.PrevInAEL; - if (e == null) - { - PolyFillType pft; - pft = (edge.PolyTyp == PolyType.ptSubject ? m_SubjFillType : m_ClipFillType); - if (edge.WindDelta == 0) edge.WindCnt = (pft == PolyFillType.pftNegative ? -1 : 1); - else edge.WindCnt = edge.WindDelta; - edge.WindCnt2 = 0; - e = m_ActiveEdges; //ie get ready to calc WindCnt2 - } - else if (edge.WindDelta == 0 && m_ClipType != ClipType.ctUnion) - { - edge.WindCnt = 1; - edge.WindCnt2 = e.WindCnt2; - e = e.NextInAEL; //ie get ready to calc WindCnt2 - } - else if (IsEvenOddFillType(edge)) - { - //EvenOdd filling ... - if (edge.WindDelta == 0) - { - //are we inside a subj polygon ... - bool Inside = true; - TEdge e2 = e.PrevInAEL; - while (e2 != null) + //update WindCnt2 ... + if (IsEvenOddAltFillType(edge)) { - if (e2.PolyTyp == e.PolyTyp && e2.WindDelta != 0) - Inside = !Inside; - e2 = e2.PrevInAEL; - } - edge.WindCnt = (Inside ? 0 : 1); - } - else - { - edge.WindCnt = edge.WindDelta; - } - edge.WindCnt2 = e.WindCnt2; - e = e.NextInAEL; //ie get ready to calc WindCnt2 - } - else - { - //nonZero, Positive or Negative filling ... - if (e.WindCnt * e.WindDelta < 0) - { - //prev edge is 'decreasing' WindCount (WC) toward zero - //so we're outside the previous polygon ... - if (Math.Abs(e.WindCnt) > 1) - { - //outside prev poly but still inside another. - //when reversing direction of prev poly use the same WC - if (e.WindDelta * edge.WindDelta < 0) edge.WindCnt = e.WindCnt; - //otherwise continue to 'decrease' WC ... - else edge.WindCnt = e.WindCnt + edge.WindDelta; + //EvenOdd filling ... + while (e != edge) + { + if (e.WindDelta != 0) + edge.WindCnt2 = (edge.WindCnt2 == 0 ? 1 : 0); + e = e.NextInAEL; + } } else - //now outside all polys of same polytype so set own WC ... - edge.WindCnt = (edge.WindDelta == 0 ? 1 : edge.WindDelta); - } - else - { - //prev edge is 'increasing' WindCount (WC) away from zero - //so we're inside the previous polygon ... - if (edge.WindDelta == 0) - edge.WindCnt = (e.WindCnt < 0 ? e.WindCnt - 1 : e.WindCnt + 1); - //if wind direction is reversing prev then use same WC - else if (e.WindDelta * edge.WindDelta < 0) - edge.WindCnt = e.WindCnt; - //otherwise add to WC ... - else edge.WindCnt = e.WindCnt + edge.WindDelta; - } - edge.WindCnt2 = e.WindCnt2; - e = e.NextInAEL; //ie get ready to calc WindCnt2 - } - - //update WindCnt2 ... - if (IsEvenOddAltFillType(edge)) - { - //EvenOdd filling ... - while (e != edge) - { - if (e.WindDelta != 0) - edge.WindCnt2 = (edge.WindCnt2 == 0 ? 1 : 0); - e = e.NextInAEL; - } - } - else - { - //nonZero, Positive or Negative filling ... - while (e != edge) - { - edge.WindCnt2 += e.WindDelta; - e = e.NextInAEL; - } + { + //nonZero, Positive or Negative filling ... + while (e != edge) + { + edge.WindCnt2 += e.WindDelta; + e = e.NextInAEL; + } + } } - } - //------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ - private void AddEdgeToSEL(TEdge edge) - { - //SEL pointers in PEdge are use to build transient lists of horizontal edges. - //However, since we don't need to worry about processing order, all additions - //are made to the front of the list ... - if (m_SortedEdges == null) + private void AddEdgeToSEL(TEdge edge) { - m_SortedEdges = edge; - edge.PrevInSEL = null; - edge.NextInSEL = null; + //SEL pointers in PEdge are use to build transient lists of horizontal edges. + //However, since we don't need to worry about processing order, all additions + //are made to the front of the list ... + if (m_SortedEdges == null) + { + m_SortedEdges = edge; + edge.PrevInSEL = null; + edge.NextInSEL = null; + } + else + { + edge.NextInSEL = m_SortedEdges; + edge.PrevInSEL = null; + m_SortedEdges.PrevInSEL = edge; + m_SortedEdges = edge; + } } - else + //------------------------------------------------------------------------------ + + internal Boolean PopEdgeFromSEL(out TEdge e) { - edge.NextInSEL = m_SortedEdges; - edge.PrevInSEL = null; - m_SortedEdges.PrevInSEL = edge; - m_SortedEdges = edge; + //Pop edge from front of SEL (ie SEL is a FILO list) + e = m_SortedEdges; + if (e == null) return false; + TEdge oldE = e; + m_SortedEdges = e.NextInSEL; + if (m_SortedEdges != null) m_SortedEdges.PrevInSEL = null; + oldE.NextInSEL = null; + oldE.PrevInSEL = null; + return true; } - } - //------------------------------------------------------------------------------ - - internal Boolean PopEdgeFromSEL(out TEdge e) - { - //Pop edge from front of SEL (ie SEL is a FILO list) - e = m_SortedEdges; - if (e == null) return false; - TEdge oldE = e; - m_SortedEdges = e.NextInSEL; - if (m_SortedEdges != null) m_SortedEdges.PrevInSEL = null; - oldE.NextInSEL = null; - oldE.PrevInSEL = null; - return true; - } - //------------------------------------------------------------------------------ - - private void CopyAELToSEL() - { - TEdge e = m_ActiveEdges; - m_SortedEdges = e; - while (e != null) - { - e.PrevInSEL = e.PrevInAEL; - e.NextInSEL = e.NextInAEL; - e = e.NextInAEL; - } - } - //------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ - private void SwapPositionsInSEL(TEdge edge1, TEdge edge2) - { - if (edge1.NextInSEL == null && edge1.PrevInSEL == null) - return; - if (edge2.NextInSEL == null && edge2.PrevInSEL == null) - return; - - if (edge1.NextInSEL == edge2) - { - TEdge next = edge2.NextInSEL; - if (next != null) - next.PrevInSEL = edge1; - TEdge prev = edge1.PrevInSEL; - if (prev != null) - prev.NextInSEL = edge2; - edge2.PrevInSEL = prev; - edge2.NextInSEL = edge1; - edge1.PrevInSEL = edge2; - edge1.NextInSEL = next; - } - else if (edge2.NextInSEL == edge1) - { - TEdge next = edge1.NextInSEL; - if (next != null) - next.PrevInSEL = edge2; - TEdge prev = edge2.PrevInSEL; - if (prev != null) - prev.NextInSEL = edge1; - edge1.PrevInSEL = prev; - edge1.NextInSEL = edge2; - edge2.PrevInSEL = edge1; - edge2.NextInSEL = next; - } - else - { - TEdge next = edge1.NextInSEL; - TEdge prev = edge1.PrevInSEL; - edge1.NextInSEL = edge2.NextInSEL; - if (edge1.NextInSEL != null) - edge1.NextInSEL.PrevInSEL = edge1; - edge1.PrevInSEL = edge2.PrevInSEL; - if (edge1.PrevInSEL != null) - edge1.PrevInSEL.NextInSEL = edge1; - edge2.NextInSEL = next; - if (edge2.NextInSEL != null) - edge2.NextInSEL.PrevInSEL = edge2; - edge2.PrevInSEL = prev; - if (edge2.PrevInSEL != null) - edge2.PrevInSEL.NextInSEL = edge2; - } - - if (edge1.PrevInSEL == null) - m_SortedEdges = edge1; - else if (edge2.PrevInSEL == null) - m_SortedEdges = edge2; - } - //------------------------------------------------------------------------------ + private void CopyAELToSEL() + { + TEdge e = m_ActiveEdges; + m_SortedEdges = e; + while (e != null) + { + e.PrevInSEL = e.PrevInAEL; + e.NextInSEL = e.NextInAEL; + e = e.NextInAEL; + } + } + //------------------------------------------------------------------------------ + private void SwapPositionsInSEL(TEdge edge1, TEdge edge2) + { + if (edge1.NextInSEL == null && edge1.PrevInSEL == null) + return; + if (edge2.NextInSEL == null && edge2.PrevInSEL == null) + return; - private void AddLocalMaxPoly(TEdge e1, TEdge e2, IntPoint pt) - { - AddOutPt(e1, pt); - if (e2.WindDelta == 0) AddOutPt(e2, pt); - if (e1.OutIdx == e2.OutIdx) - { - e1.OutIdx = Unassigned; - e2.OutIdx = Unassigned; - } - else if (e1.OutIdx < e2.OutIdx) - AppendPolygon(e1, e2); - else - AppendPolygon(e2, e1); - } - //------------------------------------------------------------------------------ + if (edge1.NextInSEL == edge2) + { + TEdge next = edge2.NextInSEL; + if (next != null) + next.PrevInSEL = edge1; + TEdge prev = edge1.PrevInSEL; + if (prev != null) + prev.NextInSEL = edge2; + edge2.PrevInSEL = prev; + edge2.NextInSEL = edge1; + edge1.PrevInSEL = edge2; + edge1.NextInSEL = next; + } + else if (edge2.NextInSEL == edge1) + { + TEdge next = edge1.NextInSEL; + if (next != null) + next.PrevInSEL = edge2; + TEdge prev = edge2.PrevInSEL; + if (prev != null) + prev.NextInSEL = edge1; + edge1.PrevInSEL = prev; + edge1.NextInSEL = edge2; + edge2.PrevInSEL = edge1; + edge2.NextInSEL = next; + } + else + { + TEdge next = edge1.NextInSEL; + TEdge prev = edge1.PrevInSEL; + edge1.NextInSEL = edge2.NextInSEL; + if (edge1.NextInSEL != null) + edge1.NextInSEL.PrevInSEL = edge1; + edge1.PrevInSEL = edge2.PrevInSEL; + if (edge1.PrevInSEL != null) + edge1.PrevInSEL.NextInSEL = edge1; + edge2.NextInSEL = next; + if (edge2.NextInSEL != null) + edge2.NextInSEL.PrevInSEL = edge2; + edge2.PrevInSEL = prev; + if (edge2.PrevInSEL != null) + edge2.PrevInSEL.NextInSEL = edge2; + } - private OutPt AddLocalMinPoly(TEdge e1, TEdge e2, IntPoint pt) - { - OutPt result; - TEdge e, prevE; - if (IsHorizontal(e2) || (e1.Dx > e2.Dx)) - { - result = AddOutPt(e1, pt); - e2.OutIdx = e1.OutIdx; - e1.Side = EdgeSide.esLeft; - e2.Side = EdgeSide.esRight; - e = e1; - if (e.PrevInAEL == e2) - prevE = e2.PrevInAEL; - else - prevE = e.PrevInAEL; - } - else - { - result = AddOutPt(e2, pt); - e1.OutIdx = e2.OutIdx; - e1.Side = EdgeSide.esRight; - e2.Side = EdgeSide.esLeft; - e = e2; - if (e.PrevInAEL == e1) - prevE = e1.PrevInAEL; - else - prevE = e.PrevInAEL; - } - - if (prevE != null && prevE.OutIdx >= 0) - { - cInt xPrev = TopX(prevE, pt.Y); - cInt xE = TopX(e, pt.Y); - if ((xPrev == xE) && (e.WindDelta != 0) && (prevE.WindDelta != 0) && - SlopesEqual(new IntPoint(xPrev, pt.Y), prevE.Top, new IntPoint(xE, pt.Y), e.Top, m_UseFullRange)) - { - OutPt outPt = AddOutPt(prevE, pt); - AddJoin(result, outPt, e.Top); - } - } - return result; - } - //------------------------------------------------------------------------------ + if (edge1.PrevInSEL == null) + m_SortedEdges = edge1; + else if (edge2.PrevInSEL == null) + m_SortedEdges = edge2; + } + //------------------------------------------------------------------------------ - private OutPt AddOutPt(TEdge e, IntPoint pt) - { - if (e.OutIdx < 0) - { - OutRec outRec = CreateOutRec(); - outRec.IsOpen = (e.WindDelta == 0); - OutPt newOp = new OutPt(); - outRec.Pts = newOp; - newOp.Idx = outRec.Idx; - newOp.Pt = pt; - newOp.Next = newOp; - newOp.Prev = newOp; - if (!outRec.IsOpen) - SetHoleState(e, outRec); - e.OutIdx = outRec.Idx; //nb: do this after SetZ ! - return newOp; - } - else - { - OutRec outRec = m_PolyOuts[e.OutIdx]; - //OutRec.Pts is the 'Left-most' point & OutRec.Pts.Prev is the 'Right-most' - OutPt op = outRec.Pts; - bool ToFront = (e.Side == EdgeSide.esLeft); - if (ToFront && pt == op.Pt) return op; - else if (!ToFront && pt == op.Prev.Pt) return op.Prev; - - OutPt newOp = new OutPt(); - newOp.Idx = outRec.Idx; - newOp.Pt = pt; - newOp.Next = op; - newOp.Prev = op.Prev; - newOp.Prev.Next = newOp; - op.Prev = newOp; - if (ToFront) outRec.Pts = newOp; - return newOp; - } - } - //------------------------------------------------------------------------------ - private OutPt GetLastOutPt(TEdge e) - { - OutRec outRec = m_PolyOuts[e.OutIdx]; - if (e.Side == EdgeSide.esLeft) - return outRec.Pts; - else - return outRec.Pts.Prev; - } - //------------------------------------------------------------------------------ + private void AddLocalMaxPoly(TEdge e1, TEdge e2, IntPoint pt) + { + AddOutPt(e1, pt); + if (e2.WindDelta == 0) AddOutPt(e2, pt); + if (e1.OutIdx == e2.OutIdx) + { + e1.OutIdx = Unassigned; + e2.OutIdx = Unassigned; + } + else if (e1.OutIdx < e2.OutIdx) + AppendPolygon(e1, e2); + else + AppendPolygon(e2, e1); + } + //------------------------------------------------------------------------------ - internal void SwapPoints(ref IntPoint pt1, ref IntPoint pt2) - { - IntPoint tmp = new IntPoint(pt1); - pt1 = pt2; - pt2 = tmp; - } - //------------------------------------------------------------------------------ + private OutPt AddLocalMinPoly(TEdge e1, TEdge e2, IntPoint pt) + { + OutPt result; + TEdge e, prevE; + if (IsHorizontal(e2) || (e1.Dx > e2.Dx)) + { + result = AddOutPt(e1, pt); + e2.OutIdx = e1.OutIdx; + e1.Side = EdgeSide.esLeft; + e2.Side = EdgeSide.esRight; + e = e1; + if (e.PrevInAEL == e2) + prevE = e2.PrevInAEL; + else + prevE = e.PrevInAEL; + } + else + { + result = AddOutPt(e2, pt); + e1.OutIdx = e2.OutIdx; + e1.Side = EdgeSide.esRight; + e2.Side = EdgeSide.esLeft; + e = e2; + if (e.PrevInAEL == e1) + prevE = e1.PrevInAEL; + else + prevE = e.PrevInAEL; + } - private bool HorzSegmentsOverlap(cInt seg1a, cInt seg1b, cInt seg2a, cInt seg2b) - { - if (seg1a > seg1b) Swap(ref seg1a, ref seg1b); - if (seg2a > seg2b) Swap(ref seg2a, ref seg2b); - return (seg1a < seg2b) && (seg2a < seg1b); - } - //------------------------------------------------------------------------------ - - private void SetHoleState(TEdge e, OutRec outRec) - { - TEdge e2 = e.PrevInAEL; - TEdge eTmp = null; - while (e2 != null) - { - if (e2.OutIdx >= 0 && e2.WindDelta != 0) + if (prevE != null && prevE.OutIdx >= 0 && prevE.Top.Y < pt.Y && e.Top.Y < pt.Y) { - if (eTmp == null) - eTmp = e2; - else if (eTmp.OutIdx == e2.OutIdx) - eTmp = null; //paired + cInt xPrev = TopX(prevE, pt.Y); + cInt xE = TopX(e, pt.Y); + if ((xPrev == xE) && (e.WindDelta != 0) && (prevE.WindDelta != 0) && + SlopesEqual(new IntPoint(xPrev, pt.Y), prevE.Top, new IntPoint(xE, pt.Y), e.Top, m_UseFullRange)) + { + OutPt outPt = AddOutPt(prevE, pt); + AddJoin(result, outPt, e.Top); + } } - e2 = e2.PrevInAEL; - } + return result; + } + //------------------------------------------------------------------------------ - if (eTmp == null) + private OutPt AddOutPt(TEdge e, IntPoint pt) { - outRec.FirstLeft = null; - outRec.IsHole = false; + if (e.OutIdx < 0) + { + OutRec outRec = CreateOutRec(); + outRec.IsOpen = (e.WindDelta == 0); + OutPt newOp = new OutPt(); + outRec.Pts = newOp; + newOp.Idx = outRec.Idx; + newOp.Pt = pt; + newOp.Next = newOp; + newOp.Prev = newOp; + if (!outRec.IsOpen) + SetHoleState(e, outRec); + e.OutIdx = outRec.Idx; //nb: do this after SetZ ! + return newOp; + } + else + { + OutRec outRec = m_PolyOuts[e.OutIdx]; + //OutRec.Pts is the 'Left-most' point & OutRec.Pts.Prev is the 'Right-most' + OutPt op = outRec.Pts; + bool ToFront = (e.Side == EdgeSide.esLeft); + if (ToFront && pt == op.Pt) return op; + else if (!ToFront && pt == op.Prev.Pt) return op.Prev; + + OutPt newOp = new OutPt(); + newOp.Idx = outRec.Idx; + newOp.Pt = pt; + newOp.Next = op; + newOp.Prev = op.Prev; + newOp.Prev.Next = newOp; + op.Prev = newOp; + if (ToFront) outRec.Pts = newOp; + return newOp; + } } - else + //------------------------------------------------------------------------------ + + private OutPt GetLastOutPt(TEdge e) { - outRec.FirstLeft = m_PolyOuts[eTmp.OutIdx]; - outRec.IsHole = !outRec.FirstLeft.IsHole; + OutRec outRec = m_PolyOuts[e.OutIdx]; + if (e.Side == EdgeSide.esLeft) + return outRec.Pts; + else + return outRec.Pts.Prev; } - } - //------------------------------------------------------------------------------ - - private double GetDx(IntPoint pt1, IntPoint pt2) - { - if (pt1.Y == pt2.Y) return horizontal; - else return (double)(pt2.X - pt1.X) / (pt2.Y - pt1.Y); - } - //--------------------------------------------------------------------------- + //------------------------------------------------------------------------------ - private bool FirstIsBottomPt(OutPt btmPt1, OutPt btmPt2) - { - OutPt p = btmPt1.Prev; - while ((p.Pt == btmPt1.Pt) && (p != btmPt1)) p = p.Prev; - double dx1p = Math.Abs(GetDx(btmPt1.Pt, p.Pt)); - p = btmPt1.Next; - while ((p.Pt == btmPt1.Pt) && (p != btmPt1)) p = p.Next; - double dx1n = Math.Abs(GetDx(btmPt1.Pt, p.Pt)); - - p = btmPt2.Prev; - while ((p.Pt == btmPt2.Pt) && (p != btmPt2)) p = p.Prev; - double dx2p = Math.Abs(GetDx(btmPt2.Pt, p.Pt)); - p = btmPt2.Next; - while ((p.Pt == btmPt2.Pt) && (p != btmPt2)) p = p.Next; - double dx2n = Math.Abs(GetDx(btmPt2.Pt, p.Pt)); - - if (Math.Max(dx1p, dx1n) == Math.Max(dx2p, dx2n) && - Math.Min(dx1p, dx1n) == Math.Min(dx2p, dx2n)) - return Area(btmPt1) > 0; //if otherwise identical use orientation - else - return (dx1p >= dx2p && dx1p >= dx2n) || (dx1n >= dx2p && dx1n >= dx2n); - } - //------------------------------------------------------------------------------ + internal void SwapPoints(ref IntPoint pt1, ref IntPoint pt2) + { + IntPoint tmp = new IntPoint(pt1); + pt1 = pt2; + pt2 = tmp; + } + //------------------------------------------------------------------------------ - private OutPt GetBottomPt(OutPt pp) - { - OutPt dups = null; - OutPt p = pp.Next; - while (p != pp) - { - if (p.Pt.Y > pp.Pt.Y) - { - pp = p; - dups = null; - } - else if (p.Pt.Y == pp.Pt.Y && p.Pt.X <= pp.Pt.X) - { - if (p.Pt.X < pp.Pt.X) - { - dups = null; - pp = p; - } else - { - if (p.Next != pp && p.Prev != pp) dups = p; - } - } - p = p.Next; - } - if (dups != null) - { - //there appears to be at least 2 vertices at bottomPt so ... - while (dups != p) - { - if (!FirstIsBottomPt(p, dups)) pp = dups; - dups = dups.Next; - while (dups.Pt != pp.Pt) dups = dups.Next; - } - } - return pp; - } - //------------------------------------------------------------------------------ + private bool HorzSegmentsOverlap(cInt seg1a, cInt seg1b, cInt seg2a, cInt seg2b) + { + if (seg1a > seg1b) Swap(ref seg1a, ref seg1b); + if (seg2a > seg2b) Swap(ref seg2a, ref seg2b); + return (seg1a < seg2b) && (seg2a < seg1b); + } + //------------------------------------------------------------------------------ - private OutRec GetLowermostRec(OutRec outRec1, OutRec outRec2) - { - //work out which polygon fragment has the correct hole state ... - if (outRec1.BottomPt == null) - outRec1.BottomPt = GetBottomPt(outRec1.Pts); - if (outRec2.BottomPt == null) - outRec2.BottomPt = GetBottomPt(outRec2.Pts); - OutPt bPt1 = outRec1.BottomPt; - OutPt bPt2 = outRec2.BottomPt; - if (bPt1.Pt.Y > bPt2.Pt.Y) return outRec1; - else if (bPt1.Pt.Y < bPt2.Pt.Y) return outRec2; - else if (bPt1.Pt.X < bPt2.Pt.X) return outRec1; - else if (bPt1.Pt.X > bPt2.Pt.X) return outRec2; - else if (bPt1.Next == bPt1) return outRec2; - else if (bPt2.Next == bPt2) return outRec1; - else if (FirstIsBottomPt(bPt1, bPt2)) return outRec1; - else return outRec2; - } - //------------------------------------------------------------------------------ + private void SetHoleState(TEdge e, OutRec outRec) + { + TEdge e2 = e.PrevInAEL; + TEdge eTmp = null; + while (e2 != null) + { + if (e2.OutIdx >= 0 && e2.WindDelta != 0) + { + if (eTmp == null) + eTmp = e2; + else if (eTmp.OutIdx == e2.OutIdx) + eTmp = null; //paired + } + e2 = e2.PrevInAEL; + } - bool OutRec1RightOfOutRec2(OutRec outRec1, OutRec outRec2) - { - do - { - outRec1 = outRec1.FirstLeft; - if (outRec1 == outRec2) return true; - } while (outRec1 != null); - return false; - } - //------------------------------------------------------------------------------ + if (eTmp == null) + { + outRec.FirstLeft = null; + outRec.IsHole = false; + } + else + { + outRec.FirstLeft = m_PolyOuts[eTmp.OutIdx]; + outRec.IsHole = !outRec.FirstLeft.IsHole; + } + } + //------------------------------------------------------------------------------ - private OutRec GetOutRec(int idx) - { - OutRec outrec = m_PolyOuts[idx]; - while (outrec != m_PolyOuts[outrec.Idx]) - outrec = m_PolyOuts[outrec.Idx]; - return outrec; - } - //------------------------------------------------------------------------------ + private double GetDx(IntPoint pt1, IntPoint pt2) + { + if (pt1.Y == pt2.Y) return horizontal; + else return (double)(pt2.X - pt1.X) / (pt2.Y - pt1.Y); + } + //--------------------------------------------------------------------------- - private void AppendPolygon(TEdge e1, TEdge e2) - { - OutRec outRec1 = m_PolyOuts[e1.OutIdx]; - OutRec outRec2 = m_PolyOuts[e2.OutIdx]; - - OutRec holeStateRec; - if (OutRec1RightOfOutRec2(outRec1, outRec2)) - holeStateRec = outRec2; - else if (OutRec1RightOfOutRec2(outRec2, outRec1)) - holeStateRec = outRec1; - else - holeStateRec = GetLowermostRec(outRec1, outRec2); - - //get the start and ends of both output polygons and - //join E2 poly onto E1 poly and delete pointers to E2 ... - OutPt p1_lft = outRec1.Pts; - OutPt p1_rt = p1_lft.Prev; - OutPt p2_lft = outRec2.Pts; - OutPt p2_rt = p2_lft.Prev; - - //join e2 poly onto e1 poly and delete pointers to e2 ... - if( e1.Side == EdgeSide.esLeft ) - { - if (e2.Side == EdgeSide.esLeft) - { - //z y x a b c - ReversePolyPtLinks(p2_lft); - p2_lft.Next = p1_lft; - p1_lft.Prev = p2_lft; - p1_rt.Next = p2_rt; - p2_rt.Prev = p1_rt; - outRec1.Pts = p2_rt; - } else - { - //x y z a b c - p2_rt.Next = p1_lft; - p1_lft.Prev = p2_rt; - p2_lft.Prev = p1_rt; - p1_rt.Next = p2_lft; - outRec1.Pts = p2_lft; - } - } else - { - if (e2.Side == EdgeSide.esRight) - { - //a b c z y x - ReversePolyPtLinks( p2_lft ); - p1_rt.Next = p2_rt; - p2_rt.Prev = p1_rt; - p2_lft.Next = p1_lft; - p1_lft.Prev = p2_lft; - } else - { - //a b c x y z - p1_rt.Next = p2_lft; - p2_lft.Prev = p1_rt; - p1_lft.Prev = p2_rt; - p2_rt.Next = p1_lft; - } - } - - outRec1.BottomPt = null; - if (holeStateRec == outRec2) - { - if (outRec2.FirstLeft != outRec1) - outRec1.FirstLeft = outRec2.FirstLeft; - outRec1.IsHole = outRec2.IsHole; - } - outRec2.Pts = null; - outRec2.BottomPt = null; - - outRec2.FirstLeft = outRec1; - - int OKIdx = e1.OutIdx; - int ObsoleteIdx = e2.OutIdx; - - e1.OutIdx = Unassigned; //nb: safe because we only get here via AddLocalMaxPoly - e2.OutIdx = Unassigned; - - TEdge e = m_ActiveEdges; - while( e != null ) - { - if( e.OutIdx == ObsoleteIdx ) - { - e.OutIdx = OKIdx; - e.Side = e1.Side; - break; - } - e = e.NextInAEL; - } - outRec2.Idx = outRec1.Idx; - } - //------------------------------------------------------------------------------ + private bool FirstIsBottomPt(OutPt btmPt1, OutPt btmPt2) + { + OutPt p = btmPt1.Prev; + while ((p.Pt == btmPt1.Pt) && (p != btmPt1)) p = p.Prev; + double dx1p = Math.Abs(GetDx(btmPt1.Pt, p.Pt)); + p = btmPt1.Next; + while ((p.Pt == btmPt1.Pt) && (p != btmPt1)) p = p.Next; + double dx1n = Math.Abs(GetDx(btmPt1.Pt, p.Pt)); + + p = btmPt2.Prev; + while ((p.Pt == btmPt2.Pt) && (p != btmPt2)) p = p.Prev; + double dx2p = Math.Abs(GetDx(btmPt2.Pt, p.Pt)); + p = btmPt2.Next; + while ((p.Pt == btmPt2.Pt) && (p != btmPt2)) p = p.Next; + double dx2n = Math.Abs(GetDx(btmPt2.Pt, p.Pt)); + + if (Math.Max(dx1p, dx1n) == Math.Max(dx2p, dx2n) && + Math.Min(dx1p, dx1n) == Math.Min(dx2p, dx2n)) + return Area(btmPt1) > 0; //if otherwise identical use orientation + else + return (dx1p >= dx2p && dx1p >= dx2n) || (dx1n >= dx2p && dx1n >= dx2n); + } + //------------------------------------------------------------------------------ - private void ReversePolyPtLinks(OutPt pp) - { - if (pp == null) return; - OutPt pp1; - OutPt pp2; - pp1 = pp; - do - { - pp2 = pp1.Next; - pp1.Next = pp1.Prev; - pp1.Prev = pp2; - pp1 = pp2; - } while (pp1 != pp); - } - //------------------------------------------------------------------------------ + private OutPt GetBottomPt(OutPt pp) + { + OutPt dups = null; + OutPt p = pp.Next; + while (p != pp) + { + if (p.Pt.Y > pp.Pt.Y) + { + pp = p; + dups = null; + } + else if (p.Pt.Y == pp.Pt.Y && p.Pt.X <= pp.Pt.X) + { + if (p.Pt.X < pp.Pt.X) + { + dups = null; + pp = p; + } + else + { + if (p.Next != pp && p.Prev != pp) dups = p; + } + } + p = p.Next; + } + if (dups != null) + { + //there appears to be at least 2 vertices at bottomPt so ... + while (dups != p) + { + if (!FirstIsBottomPt(p, dups)) pp = dups; + dups = dups.Next; + while (dups.Pt != pp.Pt) dups = dups.Next; + } + } + return pp; + } + //------------------------------------------------------------------------------ - private static void SwapSides(TEdge edge1, TEdge edge2) - { - EdgeSide side = edge1.Side; - edge1.Side = edge2.Side; - edge2.Side = side; - } - //------------------------------------------------------------------------------ + private OutRec GetLowermostRec(OutRec outRec1, OutRec outRec2) + { + //work out which polygon fragment has the correct hole state ... + if (outRec1.BottomPt == null) + outRec1.BottomPt = GetBottomPt(outRec1.Pts); + if (outRec2.BottomPt == null) + outRec2.BottomPt = GetBottomPt(outRec2.Pts); + OutPt bPt1 = outRec1.BottomPt; + OutPt bPt2 = outRec2.BottomPt; + if (bPt1.Pt.Y > bPt2.Pt.Y) return outRec1; + else if (bPt1.Pt.Y < bPt2.Pt.Y) return outRec2; + else if (bPt1.Pt.X < bPt2.Pt.X) return outRec1; + else if (bPt1.Pt.X > bPt2.Pt.X) return outRec2; + else if (bPt1.Next == bPt1) return outRec2; + else if (bPt2.Next == bPt2) return outRec1; + else if (FirstIsBottomPt(bPt1, bPt2)) return outRec1; + else return outRec2; + } + //------------------------------------------------------------------------------ - private static void SwapPolyIndexes(TEdge edge1, TEdge edge2) - { - int outIdx = edge1.OutIdx; - edge1.OutIdx = edge2.OutIdx; - edge2.OutIdx = outIdx; - } - //------------------------------------------------------------------------------ + bool OutRec1RightOfOutRec2(OutRec outRec1, OutRec outRec2) + { + do + { + outRec1 = outRec1.FirstLeft; + if (outRec1 == outRec2) return true; + } while (outRec1 != null); + return false; + } + //------------------------------------------------------------------------------ - private void IntersectEdges(TEdge e1, TEdge e2, IntPoint pt) - { - //e1 will be to the left of e2 BELOW the intersection. Therefore e1 is before - //e2 in AEL except when e1 is being inserted at the intersection point ... + private OutRec GetOutRec(int idx) + { + OutRec outrec = m_PolyOuts[idx]; + while (outrec != m_PolyOuts[outrec.Idx]) + outrec = m_PolyOuts[outrec.Idx]; + return outrec; + } + //------------------------------------------------------------------------------ - bool e1Contributing = (e1.OutIdx >= 0); - bool e2Contributing = (e2.OutIdx >= 0); + private void AppendPolygon(TEdge e1, TEdge e2) + { + OutRec outRec1 = m_PolyOuts[e1.OutIdx]; + OutRec outRec2 = m_PolyOuts[e2.OutIdx]; + + OutRec holeStateRec; + if (OutRec1RightOfOutRec2(outRec1, outRec2)) + holeStateRec = outRec2; + else if (OutRec1RightOfOutRec2(outRec2, outRec1)) + holeStateRec = outRec1; + else + holeStateRec = GetLowermostRec(outRec1, outRec2); -#if use_xyz - SetZ(ref pt, e1, e2); -#endif + //get the start and ends of both output polygons and + //join E2 poly onto E1 poly and delete pointers to E2 ... + OutPt p1_lft = outRec1.Pts; + OutPt p1_rt = p1_lft.Prev; + OutPt p2_lft = outRec2.Pts; + OutPt p2_rt = p2_lft.Prev; -#if use_lines - //if either edge is on an OPEN path ... - if (e1.WindDelta == 0 || e2.WindDelta == 0) - { - //ignore subject-subject open path intersections UNLESS they - //are both open paths, AND they are both 'contributing maximas' ... - if (e1.WindDelta == 0 && e2.WindDelta == 0) return; - //if intersecting a subj line with a subj poly ... - else if (e1.PolyTyp == e2.PolyTyp && - e1.WindDelta != e2.WindDelta && m_ClipType == ClipType.ctUnion) - { - if (e1.WindDelta == 0) - { - if (e2Contributing) + //join e2 poly onto e1 poly and delete pointers to e2 ... + if (e1.Side == EdgeSide.esLeft) + { + if (e2.Side == EdgeSide.esLeft) { - AddOutPt(e1, pt); - if (e1Contributing) e1.OutIdx = Unassigned; + //z y x a b c + ReversePolyPtLinks(p2_lft); + p2_lft.Next = p1_lft; + p1_lft.Prev = p2_lft; + p1_rt.Next = p2_rt; + p2_rt.Prev = p1_rt; + outRec1.Pts = p2_rt; } - } - else - { - if (e1Contributing) + else { - AddOutPt(e2, pt); - if (e2Contributing) e2.OutIdx = Unassigned; + //x y z a b c + p2_rt.Next = p1_lft; + p1_lft.Prev = p2_rt; + p2_lft.Prev = p1_rt; + p1_rt.Next = p2_lft; + outRec1.Pts = p2_lft; } - } - } - else if (e1.PolyTyp != e2.PolyTyp) - { - if ((e1.WindDelta == 0) && Math.Abs(e2.WindCnt) == 1 && - (m_ClipType != ClipType.ctUnion || e2.WindCnt2 == 0)) - { - AddOutPt(e1, pt); - if (e1Contributing) e1.OutIdx = Unassigned; - } - else if ((e2.WindDelta == 0) && (Math.Abs(e1.WindCnt) == 1) && - (m_ClipType != ClipType.ctUnion || e1.WindCnt2 == 0)) - { - AddOutPt(e2, pt); - if (e2Contributing) e2.OutIdx = Unassigned; - } - } - return; - } -#endif - - //update winding counts... - //assumes that e1 will be to the Right of e2 ABOVE the intersection - if (e1.PolyTyp == e2.PolyTyp) - { - if (IsEvenOddFillType(e1)) - { - int oldE1WindCnt = e1.WindCnt; - e1.WindCnt = e2.WindCnt; - e2.WindCnt = oldE1WindCnt; - } - else - { - if (e1.WindCnt + e2.WindDelta == 0) e1.WindCnt = -e1.WindCnt; - else e1.WindCnt += e2.WindDelta; - if (e2.WindCnt - e1.WindDelta == 0) e2.WindCnt = -e2.WindCnt; - else e2.WindCnt -= e1.WindDelta; - } - } - else - { - if (!IsEvenOddFillType(e2)) e1.WindCnt2 += e2.WindDelta; - else e1.WindCnt2 = (e1.WindCnt2 == 0) ? 1 : 0; - if (!IsEvenOddFillType(e1)) e2.WindCnt2 -= e1.WindDelta; - else e2.WindCnt2 = (e2.WindCnt2 == 0) ? 1 : 0; - } - - PolyFillType e1FillType, e2FillType, e1FillType2, e2FillType2; - if (e1.PolyTyp == PolyType.ptSubject) - { - e1FillType = m_SubjFillType; - e1FillType2 = m_ClipFillType; - } - else - { - e1FillType = m_ClipFillType; - e1FillType2 = m_SubjFillType; - } - if (e2.PolyTyp == PolyType.ptSubject) - { - e2FillType = m_SubjFillType; - e2FillType2 = m_ClipFillType; - } - else - { - e2FillType = m_ClipFillType; - e2FillType2 = m_SubjFillType; - } - - int e1Wc, e2Wc; - switch (e1FillType) - { - case PolyFillType.pftPositive: e1Wc = e1.WindCnt; break; - case PolyFillType.pftNegative: e1Wc = -e1.WindCnt; break; - default: e1Wc = Math.Abs(e1.WindCnt); break; - } - switch (e2FillType) - { - case PolyFillType.pftPositive: e2Wc = e2.WindCnt; break; - case PolyFillType.pftNegative: e2Wc = -e2.WindCnt; break; - default: e2Wc = Math.Abs(e2.WindCnt); break; - } - - if (e1Contributing && e2Contributing) - { - if ((e1Wc != 0 && e1Wc != 1) || (e2Wc != 0 && e2Wc != 1) || - (e1.PolyTyp != e2.PolyTyp && m_ClipType != ClipType.ctXor)) - { - AddLocalMaxPoly(e1, e2, pt); } else { - AddOutPt(e1, pt); - AddOutPt(e2, pt); - SwapSides(e1, e2); - SwapPolyIndexes(e1, e2); - } - } - else if (e1Contributing) - { - if (e2Wc == 0 || e2Wc == 1) - { - AddOutPt(e1, pt); - SwapSides(e1, e2); - SwapPolyIndexes(e1, e2); - } - - } - else if (e2Contributing) - { - if (e1Wc == 0 || e1Wc == 1) - { - AddOutPt(e2, pt); - SwapSides(e1, e2); - SwapPolyIndexes(e1, e2); - } - } - else if ( (e1Wc == 0 || e1Wc == 1) && (e2Wc == 0 || e2Wc == 1)) - { - //neither edge is currently contributing ... - cInt e1Wc2, e2Wc2; - switch (e1FillType2) - { - case PolyFillType.pftPositive: e1Wc2 = e1.WindCnt2; break; - case PolyFillType.pftNegative: e1Wc2 = -e1.WindCnt2; break; - default: e1Wc2 = Math.Abs(e1.WindCnt2); break; - } - switch (e2FillType2) - { - case PolyFillType.pftPositive: e2Wc2 = e2.WindCnt2; break; - case PolyFillType.pftNegative: e2Wc2 = -e2.WindCnt2; break; - default: e2Wc2 = Math.Abs(e2.WindCnt2); break; - } - - if (e1.PolyTyp != e2.PolyTyp) - { - AddLocalMinPoly(e1, e2, pt); - } - else if (e1Wc == 1 && e2Wc == 1) - switch (m_ClipType) + if (e2.Side == EdgeSide.esRight) { - case ClipType.ctIntersection: - if (e1Wc2 > 0 && e2Wc2 > 0) - AddLocalMinPoly(e1, e2, pt); - break; - case ClipType.ctUnion: - if (e1Wc2 <= 0 && e2Wc2 <= 0) - AddLocalMinPoly(e1, e2, pt); - break; - case ClipType.ctDifference: - if (((e1.PolyTyp == PolyType.ptClip) && (e1Wc2 > 0) && (e2Wc2 > 0)) || - ((e1.PolyTyp == PolyType.ptSubject) && (e1Wc2 <= 0) && (e2Wc2 <= 0))) - AddLocalMinPoly(e1, e2, pt); - break; - case ClipType.ctXor: - AddLocalMinPoly(e1, e2, pt); - break; + //a b c z y x + ReversePolyPtLinks(p2_lft); + p1_rt.Next = p2_rt; + p2_rt.Prev = p1_rt; + p2_lft.Next = p1_lft; + p1_lft.Prev = p2_lft; } - else - SwapSides(e1, e2); - } - } - //------------------------------------------------------------------------------ + else + { + //a b c x y z + p1_rt.Next = p2_lft; + p2_lft.Prev = p1_rt; + p1_lft.Prev = p2_rt; + p2_rt.Next = p1_lft; + } + } - private void DeleteFromSEL(TEdge e) - { - TEdge SelPrev = e.PrevInSEL; - TEdge SelNext = e.NextInSEL; - if (SelPrev == null && SelNext == null && (e != m_SortedEdges)) - return; //already deleted - if (SelPrev != null) - SelPrev.NextInSEL = SelNext; - else m_SortedEdges = SelNext; - if (SelNext != null) - SelNext.PrevInSEL = SelPrev; - e.NextInSEL = null; - e.PrevInSEL = null; - } - //------------------------------------------------------------------------------ + outRec1.BottomPt = null; + if (holeStateRec == outRec2) + { + if (outRec2.FirstLeft != outRec1) + outRec1.FirstLeft = outRec2.FirstLeft; + outRec1.IsHole = outRec2.IsHole; + } + outRec2.Pts = null; + outRec2.BottomPt = null; - private void ProcessHorizontals() - { - TEdge horzEdge; //m_SortedEdges; - while (PopEdgeFromSEL(out horzEdge)) - ProcessHorizontal(horzEdge); - } - //------------------------------------------------------------------------------ + outRec2.FirstLeft = outRec1; - void GetHorzDirection(TEdge HorzEdge, out Direction Dir, out cInt Left, out cInt Right) - { - if (HorzEdge.Bot.X < HorzEdge.Top.X) + int OKIdx = e1.OutIdx; + int ObsoleteIdx = e2.OutIdx; + + e1.OutIdx = Unassigned; //nb: safe because we only get here via AddLocalMaxPoly + e2.OutIdx = Unassigned; + + TEdge e = m_ActiveEdges; + while (e != null) + { + if (e.OutIdx == ObsoleteIdx) + { + e.OutIdx = OKIdx; + e.Side = e1.Side; + break; + } + e = e.NextInAEL; + } + outRec2.Idx = outRec1.Idx; + } + //------------------------------------------------------------------------------ + + private void ReversePolyPtLinks(OutPt pp) { - Left = HorzEdge.Bot.X; - Right = HorzEdge.Top.X; - Dir = Direction.dLeftToRight; - } else + if (pp == null) return; + OutPt pp1; + OutPt pp2; + pp1 = pp; + do + { + pp2 = pp1.Next; + pp1.Next = pp1.Prev; + pp1.Prev = pp2; + pp1 = pp2; + } while (pp1 != pp); + } + //------------------------------------------------------------------------------ + + private static void SwapSides(TEdge edge1, TEdge edge2) { - Left = HorzEdge.Top.X; - Right = HorzEdge.Bot.X; - Dir = Direction.dRightToLeft; + EdgeSide side = edge1.Side; + edge1.Side = edge2.Side; + edge2.Side = side; } - } - //------------------------------------------------------------------------ + //------------------------------------------------------------------------------ - private void ProcessHorizontal(TEdge horzEdge) - { - Direction dir; - cInt horzLeft, horzRight; - bool IsOpen = horzEdge.WindDelta == 0; + private static void SwapPolyIndexes(TEdge edge1, TEdge edge2) + { + int outIdx = edge1.OutIdx; + edge1.OutIdx = edge2.OutIdx; + edge2.OutIdx = outIdx; + } + //------------------------------------------------------------------------------ + + private void IntersectEdges(TEdge e1, TEdge e2, IntPoint pt) + { + //e1 will be to the left of e2 BELOW the intersection. Therefore e1 is before + //e2 in AEL except when e1 is being inserted at the intersection point ... + + bool e1Contributing = (e1.OutIdx >= 0); + bool e2Contributing = (e2.OutIdx >= 0); + +#if use_xyz + SetZ(ref pt, e1, e2); +#endif + +#if use_lines + //if either edge is on an OPEN path ... + if (e1.WindDelta == 0 || e2.WindDelta == 0) + { + //ignore subject-subject open path intersections UNLESS they + //are both open paths, AND they are both 'contributing maximas' ... + if (e1.WindDelta == 0 && e2.WindDelta == 0) return; + //if intersecting a subj line with a subj poly ... + else if (e1.PolyTyp == e2.PolyTyp && + e1.WindDelta != e2.WindDelta && m_ClipType == ClipType.ctUnion) + { + if (e1.WindDelta == 0) + { + if (e2Contributing) + { + AddOutPt(e1, pt); + if (e1Contributing) e1.OutIdx = Unassigned; + } + } + else + { + if (e1Contributing) + { + AddOutPt(e2, pt); + if (e2Contributing) e2.OutIdx = Unassigned; + } + } + } + else if (e1.PolyTyp != e2.PolyTyp) + { + if ((e1.WindDelta == 0) && Math.Abs(e2.WindCnt) == 1 && + (m_ClipType != ClipType.ctUnion || e2.WindCnt2 == 0)) + { + AddOutPt(e1, pt); + if (e1Contributing) e1.OutIdx = Unassigned; + } + else if ((e2.WindDelta == 0) && (Math.Abs(e1.WindCnt) == 1) && + (m_ClipType != ClipType.ctUnion || e1.WindCnt2 == 0)) + { + AddOutPt(e2, pt); + if (e2Contributing) e2.OutIdx = Unassigned; + } + } + return; + } +#endif + + //update winding counts... + //assumes that e1 will be to the Right of e2 ABOVE the intersection + if (e1.PolyTyp == e2.PolyTyp) + { + if (IsEvenOddFillType(e1)) + { + int oldE1WindCnt = e1.WindCnt; + e1.WindCnt = e2.WindCnt; + e2.WindCnt = oldE1WindCnt; + } + else + { + if (e1.WindCnt + e2.WindDelta == 0) e1.WindCnt = -e1.WindCnt; + else e1.WindCnt += e2.WindDelta; + if (e2.WindCnt - e1.WindDelta == 0) e2.WindCnt = -e2.WindCnt; + else e2.WindCnt -= e1.WindDelta; + } + } + else + { + if (!IsEvenOddFillType(e2)) e1.WindCnt2 += e2.WindDelta; + else e1.WindCnt2 = (e1.WindCnt2 == 0) ? 1 : 0; + if (!IsEvenOddFillType(e1)) e2.WindCnt2 -= e1.WindDelta; + else e2.WindCnt2 = (e2.WindCnt2 == 0) ? 1 : 0; + } + + PolyFillType e1FillType, e2FillType, e1FillType2, e2FillType2; + if (e1.PolyTyp == PolyType.ptSubject) + { + e1FillType = m_SubjFillType; + e1FillType2 = m_ClipFillType; + } + else + { + e1FillType = m_ClipFillType; + e1FillType2 = m_SubjFillType; + } + if (e2.PolyTyp == PolyType.ptSubject) + { + e2FillType = m_SubjFillType; + e2FillType2 = m_ClipFillType; + } + else + { + e2FillType = m_ClipFillType; + e2FillType2 = m_SubjFillType; + } - GetHorzDirection(horzEdge, out dir, out horzLeft, out horzRight); + int e1Wc, e2Wc; + switch (e1FillType) + { + case PolyFillType.pftPositive: e1Wc = e1.WindCnt; break; + case PolyFillType.pftNegative: e1Wc = -e1.WindCnt; break; + default: e1Wc = Math.Abs(e1.WindCnt); break; + } + switch (e2FillType) + { + case PolyFillType.pftPositive: e2Wc = e2.WindCnt; break; + case PolyFillType.pftNegative: e2Wc = -e2.WindCnt; break; + default: e2Wc = Math.Abs(e2.WindCnt); break; + } - TEdge eLastHorz = horzEdge, eMaxPair = null; - while (eLastHorz.NextInLML != null && IsHorizontal(eLastHorz.NextInLML)) - eLastHorz = eLastHorz.NextInLML; - if (eLastHorz.NextInLML == null) - eMaxPair = GetMaximaPair(eLastHorz); + if (e1Contributing && e2Contributing) + { + if ((e1Wc != 0 && e1Wc != 1) || (e2Wc != 0 && e2Wc != 1) || + (e1.PolyTyp != e2.PolyTyp && m_ClipType != ClipType.ctXor)) + { + AddLocalMaxPoly(e1, e2, pt); + } + else + { + AddOutPt(e1, pt); + AddOutPt(e2, pt); + SwapSides(e1, e2); + SwapPolyIndexes(e1, e2); + } + } + else if (e1Contributing) + { + if (e2Wc == 0 || e2Wc == 1) + { + AddOutPt(e1, pt); + SwapSides(e1, e2); + SwapPolyIndexes(e1, e2); + } + + } + else if (e2Contributing) + { + if (e1Wc == 0 || e1Wc == 1) + { + AddOutPt(e2, pt); + SwapSides(e1, e2); + SwapPolyIndexes(e1, e2); + } + } + else if ((e1Wc == 0 || e1Wc == 1) && (e2Wc == 0 || e2Wc == 1)) + { + //neither edge is currently contributing ... + cInt e1Wc2, e2Wc2; + switch (e1FillType2) + { + case PolyFillType.pftPositive: e1Wc2 = e1.WindCnt2; break; + case PolyFillType.pftNegative: e1Wc2 = -e1.WindCnt2; break; + default: e1Wc2 = Math.Abs(e1.WindCnt2); break; + } + switch (e2FillType2) + { + case PolyFillType.pftPositive: e2Wc2 = e2.WindCnt2; break; + case PolyFillType.pftNegative: e2Wc2 = -e2.WindCnt2; break; + default: e2Wc2 = Math.Abs(e2.WindCnt2); break; + } + + if (e1.PolyTyp != e2.PolyTyp) + { + AddLocalMinPoly(e1, e2, pt); + } + else if (e1Wc == 1 && e2Wc == 1) + switch (m_ClipType) + { + case ClipType.ctIntersection: + if (e1Wc2 > 0 && e2Wc2 > 0) + AddLocalMinPoly(e1, e2, pt); + break; + case ClipType.ctUnion: + if (e1Wc2 <= 0 && e2Wc2 <= 0) + AddLocalMinPoly(e1, e2, pt); + break; + case ClipType.ctDifference: + if (((e1.PolyTyp == PolyType.ptClip) && (e1Wc2 > 0) && (e2Wc2 > 0)) || + ((e1.PolyTyp == PolyType.ptSubject) && (e1Wc2 <= 0) && (e2Wc2 <= 0))) + AddLocalMinPoly(e1, e2, pt); + break; + case ClipType.ctXor: + AddLocalMinPoly(e1, e2, pt); + break; + } + else + SwapSides(e1, e2); + } + } + //------------------------------------------------------------------------------ + + private void DeleteFromSEL(TEdge e) + { + TEdge SelPrev = e.PrevInSEL; + TEdge SelNext = e.NextInSEL; + if (SelPrev == null && SelNext == null && (e != m_SortedEdges)) + return; //already deleted + if (SelPrev != null) + SelPrev.NextInSEL = SelNext; + else m_SortedEdges = SelNext; + if (SelNext != null) + SelNext.PrevInSEL = SelPrev; + e.NextInSEL = null; + e.PrevInSEL = null; + } + //------------------------------------------------------------------------------ + + private void ProcessHorizontals() + { + TEdge horzEdge; //m_SortedEdges; + while (PopEdgeFromSEL(out horzEdge)) + ProcessHorizontal(horzEdge); + } + //------------------------------------------------------------------------------ + + void GetHorzDirection(TEdge HorzEdge, out Direction Dir, out cInt Left, out cInt Right) + { + if (HorzEdge.Bot.X < HorzEdge.Top.X) + { + Left = HorzEdge.Bot.X; + Right = HorzEdge.Top.X; + Dir = Direction.dLeftToRight; + } + else + { + Left = HorzEdge.Top.X; + Right = HorzEdge.Bot.X; + Dir = Direction.dRightToLeft; + } + } + //------------------------------------------------------------------------ + + private void ProcessHorizontal(TEdge horzEdge) + { + Direction dir; + cInt horzLeft, horzRight; + bool IsOpen = horzEdge.WindDelta == 0; + + GetHorzDirection(horzEdge, out dir, out horzLeft, out horzRight); + + TEdge eLastHorz = horzEdge, eMaxPair = null; + while (eLastHorz.NextInLML != null && IsHorizontal(eLastHorz.NextInLML)) + eLastHorz = eLastHorz.NextInLML; + if (eLastHorz.NextInLML == null) + eMaxPair = GetMaximaPair(eLastHorz); + + Maxima currMax = m_Maxima; + if (currMax != null) + { + //get the first maxima in range (X) ... + if (dir == Direction.dLeftToRight) + { + while (currMax != null && currMax.X <= horzEdge.Bot.X) + currMax = currMax.Next; + if (currMax != null && currMax.X >= eLastHorz.Top.X) + currMax = null; + } + else + { + while (currMax.Next != null && currMax.Next.X < horzEdge.Bot.X) + currMax = currMax.Next; + if (currMax.X <= eLastHorz.Top.X) currMax = null; + } + } + + OutPt op1 = null; + for (;;) //loop through consec. horizontal edges + { + bool IsLastHorz = (horzEdge == eLastHorz); + TEdge e = GetNextInAEL(horzEdge, dir); + while (e != null) + { + + //this code block inserts extra coords into horizontal edges (in output + //polygons) whereever maxima touch these horizontal edges. This helps + //'simplifying' polygons (ie if the Simplify property is set). + if (currMax != null) + { + if (dir == Direction.dLeftToRight) + { + while (currMax != null && currMax.X < e.Curr.X) + { + if (horzEdge.OutIdx >= 0 && !IsOpen) + AddOutPt(horzEdge, new IntPoint(currMax.X, horzEdge.Bot.Y)); + currMax = currMax.Next; + } + } + else + { + while (currMax != null && currMax.X > e.Curr.X) + { + if (horzEdge.OutIdx >= 0 && !IsOpen) + AddOutPt(horzEdge, new IntPoint(currMax.X, horzEdge.Bot.Y)); + currMax = currMax.Prev; + } + } + }; + + if ((dir == Direction.dLeftToRight && e.Curr.X > horzRight) || + (dir == Direction.dRightToLeft && e.Curr.X < horzLeft)) break; + + //Also break if we've got to the end of an intermediate horizontal edge ... + //nb: Smaller Dx's are to the right of larger Dx's ABOVE the horizontal. + if (e.Curr.X == horzEdge.Top.X && horzEdge.NextInLML != null && + e.Dx < horzEdge.NextInLML.Dx) break; + + if (horzEdge.OutIdx >= 0 && !IsOpen) //note: may be done multiple times + { +#if use_xyz + if (dir == Direction.dLeftToRight) SetZ(ref e.Curr, horzEdge, e); + else SetZ(ref e.Curr, e, horzEdge); +#endif + + op1 = AddOutPt(horzEdge, e.Curr); + TEdge eNextHorz = m_SortedEdges; + while (eNextHorz != null) + { + if (eNextHorz.OutIdx >= 0 && + HorzSegmentsOverlap(horzEdge.Bot.X, + horzEdge.Top.X, eNextHorz.Bot.X, eNextHorz.Top.X)) + { + OutPt op2 = GetLastOutPt(eNextHorz); + AddJoin(op2, op1, eNextHorz.Top); + } + eNextHorz = eNextHorz.NextInSEL; + } + AddGhostJoin(op1, horzEdge.Bot); + } + + //OK, so far we're still in range of the horizontal Edge but make sure + //we're at the last of consec. horizontals when matching with eMaxPair + if (e == eMaxPair && IsLastHorz) + { + if (horzEdge.OutIdx >= 0) + AddLocalMaxPoly(horzEdge, eMaxPair, horzEdge.Top); + DeleteFromAEL(horzEdge); + DeleteFromAEL(eMaxPair); + return; + } + + if (dir == Direction.dLeftToRight) + { + IntPoint Pt = new IntPoint(e.Curr.X, horzEdge.Curr.Y); + IntersectEdges(horzEdge, e, Pt); + } + else + { + IntPoint Pt = new IntPoint(e.Curr.X, horzEdge.Curr.Y); + IntersectEdges(e, horzEdge, Pt); + } + TEdge eNext = GetNextInAEL(e, dir); + SwapPositionsInAEL(horzEdge, e); + e = eNext; + } //end while(e != null) + + //Break out of loop if HorzEdge.NextInLML is not also horizontal ... + if (horzEdge.NextInLML == null || !IsHorizontal(horzEdge.NextInLML)) break; + + UpdateEdgeIntoAEL(ref horzEdge); + if (horzEdge.OutIdx >= 0) AddOutPt(horzEdge, horzEdge.Bot); + GetHorzDirection(horzEdge, out dir, out horzLeft, out horzRight); + + } //end for (;;) + + if (horzEdge.OutIdx >= 0 && op1 == null) + { + op1 = GetLastOutPt(horzEdge); + TEdge eNextHorz = m_SortedEdges; + while (eNextHorz != null) + { + if (eNextHorz.OutIdx >= 0 && + HorzSegmentsOverlap(horzEdge.Bot.X, + horzEdge.Top.X, eNextHorz.Bot.X, eNextHorz.Top.X)) + { + OutPt op2 = GetLastOutPt(eNextHorz); + AddJoin(op2, op1, eNextHorz.Top); + } + eNextHorz = eNextHorz.NextInSEL; + } + AddGhostJoin(op1, horzEdge.Top); + } + + if (horzEdge.NextInLML != null) + { + if (horzEdge.OutIdx >= 0) + { + op1 = AddOutPt(horzEdge, horzEdge.Top); + + UpdateEdgeIntoAEL(ref horzEdge); + if (horzEdge.WindDelta == 0) return; + //nb: HorzEdge is no longer horizontal here + TEdge ePrev = horzEdge.PrevInAEL; + TEdge eNext = horzEdge.NextInAEL; + if (ePrev != null && ePrev.Curr.X == horzEdge.Bot.X && + ePrev.Curr.Y == horzEdge.Bot.Y && ePrev.WindDelta != 0 && + (ePrev.OutIdx >= 0 && ePrev.Curr.Y > ePrev.Top.Y && + SlopesEqual(horzEdge, ePrev, m_UseFullRange))) + { + OutPt op2 = AddOutPt(ePrev, horzEdge.Bot); + AddJoin(op1, op2, horzEdge.Top); + } + else if (eNext != null && eNext.Curr.X == horzEdge.Bot.X && + eNext.Curr.Y == horzEdge.Bot.Y && eNext.WindDelta != 0 && + eNext.OutIdx >= 0 && eNext.Curr.Y > eNext.Top.Y && + SlopesEqual(horzEdge, eNext, m_UseFullRange)) + { + OutPt op2 = AddOutPt(eNext, horzEdge.Bot); + AddJoin(op1, op2, horzEdge.Top); + } + } + else + UpdateEdgeIntoAEL(ref horzEdge); + } + else + { + if (horzEdge.OutIdx >= 0) AddOutPt(horzEdge, horzEdge.Top); + DeleteFromAEL(horzEdge); + } + } + //------------------------------------------------------------------------------ + + private TEdge GetNextInAEL(TEdge e, Direction Direction) + { + return Direction == Direction.dLeftToRight ? e.NextInAEL : e.PrevInAEL; + } + //------------------------------------------------------------------------------ + + private bool IsMinima(TEdge e) + { + return e != null && (e.Prev.NextInLML != e) && (e.Next.NextInLML != e); + } + //------------------------------------------------------------------------------ + + private bool IsMaxima(TEdge e, double Y) + { + return (e != null && e.Top.Y == Y && e.NextInLML == null); + } + //------------------------------------------------------------------------------ + + private bool IsIntermediate(TEdge e, double Y) + { + return (e.Top.Y == Y && e.NextInLML != null); + } + //------------------------------------------------------------------------------ + + internal TEdge GetMaximaPair(TEdge e) + { + if ((e.Next.Top == e.Top) && e.Next.NextInLML == null) + return e.Next; + else if ((e.Prev.Top == e.Top) && e.Prev.NextInLML == null) + return e.Prev; + else + return null; + } + //------------------------------------------------------------------------------ + + internal TEdge GetMaximaPairEx(TEdge e) + { + //as above but returns null if MaxPair isn't in AEL (unless it's horizontal) + TEdge result = GetMaximaPair(e); + if (result == null || result.OutIdx == Skip || + ((result.NextInAEL == result.PrevInAEL) && !IsHorizontal(result))) return null; + return result; + } + //------------------------------------------------------------------------------ + + private bool ProcessIntersections(cInt topY) + { + if (m_ActiveEdges == null) return true; + try + { + BuildIntersectList(topY); + if (m_IntersectList.Count == 0) return true; + if (m_IntersectList.Count == 1 || FixupIntersectionOrder()) + ProcessIntersectList(); + else + return false; + } + catch + { + m_SortedEdges = null; + m_IntersectList.Clear(); + throw new ClipperException("ProcessIntersections error"); + } + m_SortedEdges = null; + return true; + } + //------------------------------------------------------------------------------ + + private void BuildIntersectList(cInt topY) + { + if (m_ActiveEdges == null) return; + + //prepare for sorting ... + TEdge e = m_ActiveEdges; + m_SortedEdges = e; + while (e != null) + { + e.PrevInSEL = e.PrevInAEL; + e.NextInSEL = e.NextInAEL; + e.Curr.X = TopX(e, topY); + e = e.NextInAEL; + } + + //bubblesort ... + bool isModified = true; + while (isModified && m_SortedEdges != null) + { + isModified = false; + e = m_SortedEdges; + while (e.NextInSEL != null) + { + TEdge eNext = e.NextInSEL; + IntPoint pt; + if (e.Curr.X > eNext.Curr.X) + { + IntersectPoint(e, eNext, out pt); + if (pt.Y < topY) + pt = new IntPoint(TopX(e, topY), topY); + IntersectNode newNode = new IntersectNode(); + newNode.Edge1 = e; + newNode.Edge2 = eNext; + newNode.Pt = pt; + m_IntersectList.Add(newNode); + + SwapPositionsInSEL(e, eNext); + isModified = true; + } + else + e = eNext; + } + if (e.PrevInSEL != null) e.PrevInSEL.NextInSEL = null; + else break; + } + m_SortedEdges = null; + } + //------------------------------------------------------------------------------ + + private bool EdgesAdjacent(IntersectNode inode) + { + return (inode.Edge1.NextInSEL == inode.Edge2) || + (inode.Edge1.PrevInSEL == inode.Edge2); + } + //------------------------------------------------------------------------------ + + private static int IntersectNodeSort(IntersectNode node1, IntersectNode node2) + { + //the following typecast is safe because the differences in Pt.Y will + //be limited to the height of the scanbeam. + return (int)(node2.Pt.Y - node1.Pt.Y); + } + //------------------------------------------------------------------------------ + + private bool FixupIntersectionOrder() + { + //pre-condition: intersections are sorted bottom-most first. + //Now it's crucial that intersections are made only between adjacent edges, + //so to ensure this the order of intersections may need adjusting ... + m_IntersectList.Sort(m_IntersectNodeComparer); + + CopyAELToSEL(); + int cnt = m_IntersectList.Count; + for (int i = 0; i < cnt; i++) + { + if (!EdgesAdjacent(m_IntersectList[i])) + { + int j = i + 1; + while (j < cnt && !EdgesAdjacent(m_IntersectList[j])) j++; + if (j == cnt) return false; + + IntersectNode tmp = m_IntersectList[i]; + m_IntersectList[i] = m_IntersectList[j]; + m_IntersectList[j] = tmp; + + } + SwapPositionsInSEL(m_IntersectList[i].Edge1, m_IntersectList[i].Edge2); + } + return true; + } + //------------------------------------------------------------------------------ + + private void ProcessIntersectList() + { + for (int i = 0; i < m_IntersectList.Count; i++) + { + IntersectNode iNode = m_IntersectList[i]; + { + IntersectEdges(iNode.Edge1, iNode.Edge2, iNode.Pt); + SwapPositionsInAEL(iNode.Edge1, iNode.Edge2); + } + } + m_IntersectList.Clear(); + } + //------------------------------------------------------------------------------ + + internal static cInt Round(double value) + { + return value < 0 ? (cInt)(value - 0.5) : (cInt)(value + 0.5); + } + //------------------------------------------------------------------------------ + + private static cInt TopX(TEdge edge, cInt currentY) + { + if (currentY == edge.Top.Y) + return edge.Top.X; + return edge.Bot.X + Round(edge.Dx * (currentY - edge.Bot.Y)); + } + //------------------------------------------------------------------------------ + + private void IntersectPoint(TEdge edge1, TEdge edge2, out IntPoint ip) + { + ip = new IntPoint(); + double b1, b2; + //nb: with very large coordinate values, it's possible for SlopesEqual() to + //return false but for the edge.Dx value be equal due to double precision rounding. + if (edge1.Dx == edge2.Dx) + { + ip.Y = edge1.Curr.Y; + ip.X = TopX(edge1, ip.Y); + return; + } + + if (edge1.Delta.X == 0) + { + ip.X = edge1.Bot.X; + if (IsHorizontal(edge2)) + { + ip.Y = edge2.Bot.Y; + } + else + { + b2 = edge2.Bot.Y - (edge2.Bot.X / edge2.Dx); + ip.Y = Round(ip.X / edge2.Dx + b2); + } + } + else if (edge2.Delta.X == 0) + { + ip.X = edge2.Bot.X; + if (IsHorizontal(edge1)) + { + ip.Y = edge1.Bot.Y; + } + else + { + b1 = edge1.Bot.Y - (edge1.Bot.X / edge1.Dx); + ip.Y = Round(ip.X / edge1.Dx + b1); + } + } + else + { + b1 = edge1.Bot.X - edge1.Bot.Y * edge1.Dx; + b2 = edge2.Bot.X - edge2.Bot.Y * edge2.Dx; + double q = (b2 - b1) / (edge1.Dx - edge2.Dx); + ip.Y = Round(q); + if (Math.Abs(edge1.Dx) < Math.Abs(edge2.Dx)) + ip.X = Round(edge1.Dx * q + b1); + else + ip.X = Round(edge2.Dx * q + b2); + } + + if (ip.Y < edge1.Top.Y || ip.Y < edge2.Top.Y) + { + if (edge1.Top.Y > edge2.Top.Y) + ip.Y = edge1.Top.Y; + else + ip.Y = edge2.Top.Y; + if (Math.Abs(edge1.Dx) < Math.Abs(edge2.Dx)) + ip.X = TopX(edge1, ip.Y); + else + ip.X = TopX(edge2, ip.Y); + } + //finally, don't allow 'ip' to be BELOW curr.Y (ie bottom of scanbeam) ... + if (ip.Y > edge1.Curr.Y) + { + ip.Y = edge1.Curr.Y; + //better to use the more vertical edge to derive X ... + if (Math.Abs(edge1.Dx) > Math.Abs(edge2.Dx)) + ip.X = TopX(edge2, ip.Y); + else + ip.X = TopX(edge1, ip.Y); + } + } + //------------------------------------------------------------------------------ + + private void ProcessEdgesAtTopOfScanbeam(cInt topY) + { + TEdge e = m_ActiveEdges; + while (e != null) + { + //1. process maxima, treating them as if they're 'bent' horizontal edges, + // but exclude maxima with horizontal edges. nb: e can't be a horizontal. + bool IsMaximaEdge = IsMaxima(e, topY); + + if (IsMaximaEdge) + { + TEdge eMaxPair = GetMaximaPairEx(e); + IsMaximaEdge = (eMaxPair == null || !IsHorizontal(eMaxPair)); + } + + if (IsMaximaEdge) + { + if (StrictlySimple) InsertMaxima(e.Top.X); + TEdge ePrev = e.PrevInAEL; + DoMaxima(e); + if (ePrev == null) e = m_ActiveEdges; + else e = ePrev.NextInAEL; + } + else + { + //2. promote horizontal edges, otherwise update Curr.X and Curr.Y ... + if (IsIntermediate(e, topY) && IsHorizontal(e.NextInLML)) + { + UpdateEdgeIntoAEL(ref e); + if (e.OutIdx >= 0) + AddOutPt(e, e.Bot); + AddEdgeToSEL(e); + } + else + { + e.Curr.X = TopX(e, topY); + e.Curr.Y = topY; +#if use_xyz + if (e.Top.Y == topY) e.Curr.Z = e.Top.Z; + else if (e.Bot.Y == topY) e.Curr.Z = e.Bot.Z; + else e.Curr.Z = 0; +#endif + } + //When StrictlySimple and 'e' is being touched by another edge, then + //make sure both edges have a vertex here ... + if (StrictlySimple) + { + TEdge ePrev = e.PrevInAEL; + if ((e.OutIdx >= 0) && (e.WindDelta != 0) && ePrev != null && + (ePrev.OutIdx >= 0) && (ePrev.Curr.X == e.Curr.X) && + (ePrev.WindDelta != 0)) + { + IntPoint ip = new IntPoint(e.Curr); +#if use_xyz + SetZ(ref ip, ePrev, e); +#endif + OutPt op = AddOutPt(ePrev, ip); + OutPt op2 = AddOutPt(e, ip); + AddJoin(op, op2, ip); //StrictlySimple (type-3) join + } + } + + e = e.NextInAEL; + } + } + + //3. Process horizontals at the Top of the scanbeam ... + ProcessHorizontals(); + m_Maxima = null; + + //4. Promote intermediate vertices ... + e = m_ActiveEdges; + while (e != null) + { + if (IsIntermediate(e, topY)) + { + OutPt op = null; + if (e.OutIdx >= 0) + op = AddOutPt(e, e.Top); + UpdateEdgeIntoAEL(ref e); + + //if output polygons share an edge, they'll need joining later ... + TEdge ePrev = e.PrevInAEL; + TEdge eNext = e.NextInAEL; + if (ePrev != null && ePrev.Curr.X == e.Bot.X && + ePrev.Curr.Y == e.Bot.Y && op != null && + ePrev.OutIdx >= 0 && ePrev.Curr.Y > ePrev.Top.Y && + SlopesEqual(e.Curr, e.Top, ePrev.Curr, ePrev.Top, m_UseFullRange) && + (e.WindDelta != 0) && (ePrev.WindDelta != 0)) + { + OutPt op2 = AddOutPt(ePrev, e.Bot); + AddJoin(op, op2, e.Top); + } + else if (eNext != null && eNext.Curr.X == e.Bot.X && + eNext.Curr.Y == e.Bot.Y && op != null && + eNext.OutIdx >= 0 && eNext.Curr.Y > eNext.Top.Y && + SlopesEqual(e.Curr, e.Top, eNext.Curr, eNext.Top, m_UseFullRange) && + (e.WindDelta != 0) && (eNext.WindDelta != 0)) + { + OutPt op2 = AddOutPt(eNext, e.Bot); + AddJoin(op, op2, e.Top); + } + } + e = e.NextInAEL; + } + } + //------------------------------------------------------------------------------ + + private void DoMaxima(TEdge e) + { + TEdge eMaxPair = GetMaximaPairEx(e); + if (eMaxPair == null) + { + if (e.OutIdx >= 0) + AddOutPt(e, e.Top); + DeleteFromAEL(e); + return; + } + + TEdge eNext = e.NextInAEL; + while (eNext != null && eNext != eMaxPair) + { + IntersectEdges(e, eNext, e.Top); + SwapPositionsInAEL(e, eNext); + eNext = e.NextInAEL; + } + + if (e.OutIdx == Unassigned && eMaxPair.OutIdx == Unassigned) + { + DeleteFromAEL(e); + DeleteFromAEL(eMaxPair); + } + else if (e.OutIdx >= 0 && eMaxPair.OutIdx >= 0) + { + if (e.OutIdx >= 0) AddLocalMaxPoly(e, eMaxPair, e.Top); + DeleteFromAEL(e); + DeleteFromAEL(eMaxPair); + } +#if use_lines + else if (e.WindDelta == 0) + { + if (e.OutIdx >= 0) + { + AddOutPt(e, e.Top); + e.OutIdx = Unassigned; + } + DeleteFromAEL(e); + + if (eMaxPair.OutIdx >= 0) + { + AddOutPt(eMaxPair, e.Top); + eMaxPair.OutIdx = Unassigned; + } + DeleteFromAEL(eMaxPair); + } +#endif + else throw new ClipperException("DoMaxima error"); + } + //------------------------------------------------------------------------------ + + public static void ReversePaths(Paths polys) + { + foreach (var poly in polys) { poly.Reverse(); } + } + //------------------------------------------------------------------------------ + + public static bool Orientation(Path poly) + { + return Area(poly) >= 0; + } + //------------------------------------------------------------------------------ + + private int PointCount(OutPt pts) + { + if (pts == null) return 0; + int result = 0; + OutPt p = pts; + do + { + result++; + p = p.Next; + } + while (p != pts); + return result; + } + //------------------------------------------------------------------------------ + + private void BuildResult(Paths polyg) + { + polyg.Clear(); + polyg.Capacity = m_PolyOuts.Count; + for (int i = 0; i < m_PolyOuts.Count; i++) + { + OutRec outRec = m_PolyOuts[i]; + if (outRec.Pts == null) continue; + OutPt p = outRec.Pts.Prev; + int cnt = PointCount(p); + if (cnt < 2) continue; + Path pg = new Path(cnt); + for (int j = 0; j < cnt; j++) + { + pg.Add(p.Pt); + p = p.Prev; + } + polyg.Add(pg); + } + } + //------------------------------------------------------------------------------ + + private void BuildResult2(PolyTree polytree) + { + polytree.Clear(); + + //add each output polygon/contour to polytree ... + polytree.m_AllPolys.Capacity = m_PolyOuts.Count; + for (int i = 0; i < m_PolyOuts.Count; i++) + { + OutRec outRec = m_PolyOuts[i]; + int cnt = PointCount(outRec.Pts); + if ((outRec.IsOpen && cnt < 2) || + (!outRec.IsOpen && cnt < 3)) continue; + FixHoleLinkage(outRec); + PolyNode pn = new PolyNode(); + polytree.m_AllPolys.Add(pn); + outRec.PolyNode = pn; + pn.m_polygon.Capacity = cnt; + OutPt op = outRec.Pts.Prev; + for (int j = 0; j < cnt; j++) + { + pn.m_polygon.Add(op.Pt); + op = op.Prev; + } + } + + //fixup PolyNode links etc ... + polytree.m_Childs.Capacity = m_PolyOuts.Count; + for (int i = 0; i < m_PolyOuts.Count; i++) + { + OutRec outRec = m_PolyOuts[i]; + if (outRec.PolyNode == null) continue; + else if (outRec.IsOpen) + { + outRec.PolyNode.IsOpen = true; + polytree.AddChild(outRec.PolyNode); + } + else if (outRec.FirstLeft != null && + outRec.FirstLeft.PolyNode != null) + outRec.FirstLeft.PolyNode.AddChild(outRec.PolyNode); + else + polytree.AddChild(outRec.PolyNode); + } + } + //------------------------------------------------------------------------------ + + private void FixupOutPolyline(OutRec outrec) + { + OutPt pp = outrec.Pts; + OutPt lastPP = pp.Prev; + while (pp != lastPP) + { + pp = pp.Next; + if (pp.Pt == pp.Prev.Pt) + { + if (pp == lastPP) lastPP = pp.Prev; + OutPt tmpPP = pp.Prev; + tmpPP.Next = pp.Next; + pp.Next.Prev = tmpPP; + pp = tmpPP; + } + } + if (pp == pp.Prev) outrec.Pts = null; + } + //------------------------------------------------------------------------------ + + private void FixupOutPolygon(OutRec outRec) + { + //FixupOutPolygon() - removes duplicate points and simplifies consecutive + //parallel edges by removing the middle vertex. + OutPt lastOK = null; + outRec.BottomPt = null; + OutPt pp = outRec.Pts; + bool preserveCol = PreserveCollinear || StrictlySimple; + for (;;) + { + if (pp.Prev == pp || pp.Prev == pp.Next) + { + outRec.Pts = null; + return; + } + //test for duplicate points and collinear edges ... + if ((pp.Pt == pp.Next.Pt) || (pp.Pt == pp.Prev.Pt) || + (SlopesEqual(pp.Prev.Pt, pp.Pt, pp.Next.Pt, m_UseFullRange) && + (!preserveCol || !Pt2IsBetweenPt1AndPt3(pp.Prev.Pt, pp.Pt, pp.Next.Pt)))) + { + lastOK = null; + pp.Prev.Next = pp.Next; + pp.Next.Prev = pp.Prev; + pp = pp.Prev; + } + else if (pp == lastOK) break; + else + { + if (lastOK == null) lastOK = pp; + pp = pp.Next; + } + } + outRec.Pts = pp; + } + //------------------------------------------------------------------------------ + + OutPt DupOutPt(OutPt outPt, bool InsertAfter) + { + OutPt result = new OutPt(); + result.Pt = outPt.Pt; + result.Idx = outPt.Idx; + if (InsertAfter) + { + result.Next = outPt.Next; + result.Prev = outPt; + outPt.Next.Prev = result; + outPt.Next = result; + } + else + { + result.Prev = outPt.Prev; + result.Next = outPt; + outPt.Prev.Next = result; + outPt.Prev = result; + } + return result; + } + //------------------------------------------------------------------------------ + + bool GetOverlap(cInt a1, cInt a2, cInt b1, cInt b2, out cInt Left, out cInt Right) + { + if (a1 < a2) + { + if (b1 < b2) { Left = Math.Max(a1, b1); Right = Math.Min(a2, b2); } + else { Left = Math.Max(a1, b2); Right = Math.Min(a2, b1); } + } + else + { + if (b1 < b2) { Left = Math.Max(a2, b1); Right = Math.Min(a1, b2); } + else { Left = Math.Max(a2, b2); Right = Math.Min(a1, b1); } + } + return Left < Right; + } + //------------------------------------------------------------------------------ + + bool JoinHorz(OutPt op1, OutPt op1b, OutPt op2, OutPt op2b, + IntPoint Pt, bool DiscardLeft) + { + Direction Dir1 = (op1.Pt.X > op1b.Pt.X ? + Direction.dRightToLeft : Direction.dLeftToRight); + Direction Dir2 = (op2.Pt.X > op2b.Pt.X ? + Direction.dRightToLeft : Direction.dLeftToRight); + if (Dir1 == Dir2) return false; + + //When DiscardLeft, we want Op1b to be on the Left of Op1, otherwise we + //want Op1b to be on the Right. (And likewise with Op2 and Op2b.) + //So, to facilitate this while inserting Op1b and Op2b ... + //when DiscardLeft, make sure we're AT or RIGHT of Pt before adding Op1b, + //otherwise make sure we're AT or LEFT of Pt. (Likewise with Op2b.) + if (Dir1 == Direction.dLeftToRight) + { + while (op1.Next.Pt.X <= Pt.X && + op1.Next.Pt.X >= op1.Pt.X && op1.Next.Pt.Y == Pt.Y) + op1 = op1.Next; + if (DiscardLeft && (op1.Pt.X != Pt.X)) op1 = op1.Next; + op1b = DupOutPt(op1, !DiscardLeft); + if (op1b.Pt != Pt) + { + op1 = op1b; + op1.Pt = Pt; + op1b = DupOutPt(op1, !DiscardLeft); + } + } + else + { + while (op1.Next.Pt.X >= Pt.X && + op1.Next.Pt.X <= op1.Pt.X && op1.Next.Pt.Y == Pt.Y) + op1 = op1.Next; + if (!DiscardLeft && (op1.Pt.X != Pt.X)) op1 = op1.Next; + op1b = DupOutPt(op1, DiscardLeft); + if (op1b.Pt != Pt) + { + op1 = op1b; + op1.Pt = Pt; + op1b = DupOutPt(op1, DiscardLeft); + } + } + + if (Dir2 == Direction.dLeftToRight) + { + while (op2.Next.Pt.X <= Pt.X && + op2.Next.Pt.X >= op2.Pt.X && op2.Next.Pt.Y == Pt.Y) + op2 = op2.Next; + if (DiscardLeft && (op2.Pt.X != Pt.X)) op2 = op2.Next; + op2b = DupOutPt(op2, !DiscardLeft); + if (op2b.Pt != Pt) + { + op2 = op2b; + op2.Pt = Pt; + op2b = DupOutPt(op2, !DiscardLeft); + }; + } + else + { + while (op2.Next.Pt.X >= Pt.X && + op2.Next.Pt.X <= op2.Pt.X && op2.Next.Pt.Y == Pt.Y) + op2 = op2.Next; + if (!DiscardLeft && (op2.Pt.X != Pt.X)) op2 = op2.Next; + op2b = DupOutPt(op2, DiscardLeft); + if (op2b.Pt != Pt) + { + op2 = op2b; + op2.Pt = Pt; + op2b = DupOutPt(op2, DiscardLeft); + }; + }; + + if ((Dir1 == Direction.dLeftToRight) == DiscardLeft) + { + op1.Prev = op2; + op2.Next = op1; + op1b.Next = op2b; + op2b.Prev = op1b; + } + else + { + op1.Next = op2; + op2.Prev = op1; + op1b.Prev = op2b; + op2b.Next = op1b; + } + return true; + } + //------------------------------------------------------------------------------ + + private bool JoinPoints(Join j, OutRec outRec1, OutRec outRec2) + { + OutPt op1 = j.OutPt1, op1b; + OutPt op2 = j.OutPt2, op2b; + + //There are 3 kinds of joins for output polygons ... + //1. Horizontal joins where Join.OutPt1 & Join.OutPt2 are vertices anywhere + //along (horizontal) collinear edges (& Join.OffPt is on the same horizontal). + //2. Non-horizontal joins where Join.OutPt1 & Join.OutPt2 are at the same + //location at the Bottom of the overlapping segment (& Join.OffPt is above). + //3. StrictlySimple joins where edges touch but are not collinear and where + //Join.OutPt1, Join.OutPt2 & Join.OffPt all share the same point. + bool isHorizontal = (j.OutPt1.Pt.Y == j.OffPt.Y); + + if (isHorizontal && (j.OffPt == j.OutPt1.Pt) && (j.OffPt == j.OutPt2.Pt)) + { + //Strictly Simple join ... + if (outRec1 != outRec2) return false; + op1b = j.OutPt1.Next; + while (op1b != op1 && (op1b.Pt == j.OffPt)) + op1b = op1b.Next; + bool reverse1 = (op1b.Pt.Y > j.OffPt.Y); + op2b = j.OutPt2.Next; + while (op2b != op2 && (op2b.Pt == j.OffPt)) + op2b = op2b.Next; + bool reverse2 = (op2b.Pt.Y > j.OffPt.Y); + if (reverse1 == reverse2) return false; + if (reverse1) + { + op1b = DupOutPt(op1, false); + op2b = DupOutPt(op2, true); + op1.Prev = op2; + op2.Next = op1; + op1b.Next = op2b; + op2b.Prev = op1b; + j.OutPt1 = op1; + j.OutPt2 = op1b; + return true; + } + else + { + op1b = DupOutPt(op1, true); + op2b = DupOutPt(op2, false); + op1.Next = op2; + op2.Prev = op1; + op1b.Prev = op2b; + op2b.Next = op1b; + j.OutPt1 = op1; + j.OutPt2 = op1b; + return true; + } + } + else if (isHorizontal) + { + //treat horizontal joins differently to non-horizontal joins since with + //them we're not yet sure where the overlapping is. OutPt1.Pt & OutPt2.Pt + //may be anywhere along the horizontal edge. + op1b = op1; + while (op1.Prev.Pt.Y == op1.Pt.Y && op1.Prev != op1b && op1.Prev != op2) + op1 = op1.Prev; + while (op1b.Next.Pt.Y == op1b.Pt.Y && op1b.Next != op1 && op1b.Next != op2) + op1b = op1b.Next; + if (op1b.Next == op1 || op1b.Next == op2) return false; //a flat 'polygon' + + op2b = op2; + while (op2.Prev.Pt.Y == op2.Pt.Y && op2.Prev != op2b && op2.Prev != op1b) + op2 = op2.Prev; + while (op2b.Next.Pt.Y == op2b.Pt.Y && op2b.Next != op2 && op2b.Next != op1) + op2b = op2b.Next; + if (op2b.Next == op2 || op2b.Next == op1) return false; //a flat 'polygon' + + cInt Left, Right; + //Op1 -. Op1b & Op2 -. Op2b are the extremites of the horizontal edges + if (!GetOverlap(op1.Pt.X, op1b.Pt.X, op2.Pt.X, op2b.Pt.X, out Left, out Right)) + return false; + + //DiscardLeftSide: when overlapping edges are joined, a spike will created + //which needs to be cleaned up. However, we don't want Op1 or Op2 caught up + //on the discard Side as either may still be needed for other joins ... + IntPoint Pt; + bool DiscardLeftSide; + if (op1.Pt.X >= Left && op1.Pt.X <= Right) + { + Pt = op1.Pt; DiscardLeftSide = (op1.Pt.X > op1b.Pt.X); + } + else if (op2.Pt.X >= Left && op2.Pt.X <= Right) + { + Pt = op2.Pt; DiscardLeftSide = (op2.Pt.X > op2b.Pt.X); + } + else if (op1b.Pt.X >= Left && op1b.Pt.X <= Right) + { + Pt = op1b.Pt; DiscardLeftSide = op1b.Pt.X > op1.Pt.X; + } + else + { + Pt = op2b.Pt; DiscardLeftSide = (op2b.Pt.X > op2.Pt.X); + } + j.OutPt1 = op1; + j.OutPt2 = op2; + return JoinHorz(op1, op1b, op2, op2b, Pt, DiscardLeftSide); + } + else + { + //nb: For non-horizontal joins ... + // 1. Jr.OutPt1.Pt.Y == Jr.OutPt2.Pt.Y + // 2. Jr.OutPt1.Pt > Jr.OffPt.Y + + //make sure the polygons are correctly oriented ... + op1b = op1.Next; + while ((op1b.Pt == op1.Pt) && (op1b != op1)) op1b = op1b.Next; + bool Reverse1 = ((op1b.Pt.Y > op1.Pt.Y) || + !SlopesEqual(op1.Pt, op1b.Pt, j.OffPt, m_UseFullRange)); + if (Reverse1) + { + op1b = op1.Prev; + while ((op1b.Pt == op1.Pt) && (op1b != op1)) op1b = op1b.Prev; + if ((op1b.Pt.Y > op1.Pt.Y) || + !SlopesEqual(op1.Pt, op1b.Pt, j.OffPt, m_UseFullRange)) return false; + }; + op2b = op2.Next; + while ((op2b.Pt == op2.Pt) && (op2b != op2)) op2b = op2b.Next; + bool Reverse2 = ((op2b.Pt.Y > op2.Pt.Y) || + !SlopesEqual(op2.Pt, op2b.Pt, j.OffPt, m_UseFullRange)); + if (Reverse2) + { + op2b = op2.Prev; + while ((op2b.Pt == op2.Pt) && (op2b != op2)) op2b = op2b.Prev; + if ((op2b.Pt.Y > op2.Pt.Y) || + !SlopesEqual(op2.Pt, op2b.Pt, j.OffPt, m_UseFullRange)) return false; + } + + if ((op1b == op1) || (op2b == op2) || (op1b == op2b) || + ((outRec1 == outRec2) && (Reverse1 == Reverse2))) return false; + + if (Reverse1) + { + op1b = DupOutPt(op1, false); + op2b = DupOutPt(op2, true); + op1.Prev = op2; + op2.Next = op1; + op1b.Next = op2b; + op2b.Prev = op1b; + j.OutPt1 = op1; + j.OutPt2 = op1b; + return true; + } + else + { + op1b = DupOutPt(op1, true); + op2b = DupOutPt(op2, false); + op1.Next = op2; + op2.Prev = op1; + op1b.Prev = op2b; + op2b.Next = op1b; + j.OutPt1 = op1; + j.OutPt2 = op1b; + return true; + } + } + } + //---------------------------------------------------------------------- + + public static int PointInPolygon(IntPoint pt, Path path) + { + //returns 0 if false, +1 if true, -1 if pt ON polygon boundary + //See "The Point in Polygon Problem for Arbitrary Polygons" by Hormann & Agathos + //http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.88.5498&rep=rep1&type=pdf + int result = 0, cnt = path.Count; + if (cnt < 3) return 0; + IntPoint ip = path[0]; + for (int i = 1; i <= cnt; ++i) + { + IntPoint ipNext = (i == cnt ? path[0] : path[i]); + if (ipNext.Y == pt.Y) + { + if ((ipNext.X == pt.X) || (ip.Y == pt.Y && + ((ipNext.X > pt.X) == (ip.X < pt.X)))) return -1; + } + if ((ip.Y < pt.Y) != (ipNext.Y < pt.Y)) + { + if (ip.X >= pt.X) + { + if (ipNext.X > pt.X) result = 1 - result; + else + { + double d = (double)(ip.X - pt.X) * (ipNext.Y - pt.Y) - + (double)(ipNext.X - pt.X) * (ip.Y - pt.Y); + if (d == 0) return -1; + else if ((d > 0) == (ipNext.Y > ip.Y)) result = 1 - result; + } + } + else + { + if (ipNext.X > pt.X) + { + double d = (double)(ip.X - pt.X) * (ipNext.Y - pt.Y) - + (double)(ipNext.X - pt.X) * (ip.Y - pt.Y); + if (d == 0) return -1; + else if ((d > 0) == (ipNext.Y > ip.Y)) result = 1 - result; + } + } + } + ip = ipNext; + } + return result; + } + //------------------------------------------------------------------------------ + + //See "The Point in Polygon Problem for Arbitrary Polygons" by Hormann & Agathos + //http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.88.5498&rep=rep1&type=pdf + private static int PointInPolygon(IntPoint pt, OutPt op) + { + //returns 0 if false, +1 if true, -1 if pt ON polygon boundary + int result = 0; + OutPt startOp = op; + cInt ptx = pt.X, pty = pt.Y; + cInt poly0x = op.Pt.X, poly0y = op.Pt.Y; + do + { + op = op.Next; + cInt poly1x = op.Pt.X, poly1y = op.Pt.Y; + + if (poly1y == pty) + { + if ((poly1x == ptx) || (poly0y == pty && + ((poly1x > ptx) == (poly0x < ptx)))) return -1; + } + if ((poly0y < pty) != (poly1y < pty)) + { + if (poly0x >= ptx) + { + if (poly1x > ptx) result = 1 - result; + else + { + double d = (double)(poly0x - ptx) * (poly1y - pty) - + (double)(poly1x - ptx) * (poly0y - pty); + if (d == 0) return -1; + if ((d > 0) == (poly1y > poly0y)) result = 1 - result; + } + } + else + { + if (poly1x > ptx) + { + double d = (double)(poly0x - ptx) * (poly1y - pty) - + (double)(poly1x - ptx) * (poly0y - pty); + if (d == 0) return -1; + if ((d > 0) == (poly1y > poly0y)) result = 1 - result; + } + } + } + poly0x = poly1x; poly0y = poly1y; + } while (startOp != op); + return result; + } + //------------------------------------------------------------------------------ + + private static bool Poly2ContainsPoly1(OutPt outPt1, OutPt outPt2) + { + OutPt op = outPt1; + do + { + //nb: PointInPolygon returns 0 if false, +1 if true, -1 if pt on polygon + int res = PointInPolygon(op.Pt, outPt2); + if (res >= 0) return res > 0; + op = op.Next; + } + while (op != outPt1); + return true; + } + //---------------------------------------------------------------------- - Maxima currMax = m_Maxima; - if (currMax != null) + private void FixupFirstLefts1(OutRec OldOutRec, OutRec NewOutRec) { - //get the first maxima in range (X) ... - if (dir == Direction.dLeftToRight) - { - while (currMax != null && currMax.X <= horzEdge.Bot.X) - currMax = currMax.Next; - if (currMax != null && currMax.X >= eLastHorz.Top.X) - currMax = null; - } - else + foreach (OutRec outRec in m_PolyOuts) { - while (currMax.Next != null && currMax.Next.X < horzEdge.Bot.X) - currMax = currMax.Next; - if (currMax.X <= eLastHorz.Top.X) currMax = null; - } - } - - OutPt op1 = null; - for (;;) //loop through consec. horizontal edges - { - bool IsLastHorz = (horzEdge == eLastHorz); - TEdge e = GetNextInAEL(horzEdge, dir); - while(e != null) - { - - //this code block inserts extra coords into horizontal edges (in output - //polygons) whereever maxima touch these horizontal edges. This helps - //'simplifying' polygons (ie if the Simplify property is set). - if (currMax != null) - { - if (dir == Direction.dLeftToRight) - { - while (currMax != null && currMax.X < e.Curr.X) - { - if (horzEdge.OutIdx >= 0 && !IsOpen) - AddOutPt(horzEdge, new IntPoint(currMax.X, horzEdge.Bot.Y)); - currMax = currMax.Next; - } - } - else - { - while (currMax != null && currMax.X > e.Curr.X) - { - if (horzEdge.OutIdx >= 0 && !IsOpen) - AddOutPt(horzEdge, new IntPoint(currMax.X, horzEdge.Bot.Y)); - currMax = currMax.Prev; - } - } - }; - - if ((dir == Direction.dLeftToRight && e.Curr.X > horzRight) || - (dir == Direction.dRightToLeft && e.Curr.X < horzLeft)) break; - - //Also break if we've got to the end of an intermediate horizontal edge ... - //nb: Smaller Dx's are to the right of larger Dx's ABOVE the horizontal. - if (e.Curr.X == horzEdge.Top.X && horzEdge.NextInLML != null && - e.Dx < horzEdge.NextInLML.Dx) break; - - if (horzEdge.OutIdx >= 0 && !IsOpen) //note: may be done multiple times - { - op1 = AddOutPt(horzEdge, e.Curr); - TEdge eNextHorz = m_SortedEdges; - while (eNextHorz != null) - { - if (eNextHorz.OutIdx >= 0 && - HorzSegmentsOverlap(horzEdge.Bot.X, - horzEdge.Top.X, eNextHorz.Bot.X, eNextHorz.Top.X)) - { - OutPt op2 = GetLastOutPt(eNextHorz); - AddJoin(op2, op1, eNextHorz.Top); - } - eNextHorz = eNextHorz.NextInSEL; - } - AddGhostJoin(op1, horzEdge.Bot); - } - - //OK, so far we're still in range of the horizontal Edge but make sure - //we're at the last of consec. horizontals when matching with eMaxPair - if(e == eMaxPair && IsLastHorz) - { - if (horzEdge.OutIdx >= 0) - AddLocalMaxPoly(horzEdge, eMaxPair, horzEdge.Top); - DeleteFromAEL(horzEdge); - DeleteFromAEL(eMaxPair); - return; - } - - if(dir == Direction.dLeftToRight) - { - IntPoint Pt = new IntPoint(e.Curr.X, horzEdge.Curr.Y); - IntersectEdges(horzEdge, e, Pt); - } - else - { - IntPoint Pt = new IntPoint(e.Curr.X, horzEdge.Curr.Y); - IntersectEdges(e, horzEdge, Pt); - } - TEdge eNext = GetNextInAEL(e, dir); - SwapPositionsInAEL(horzEdge, e); - e = eNext; - } //end while(e != null) - - //Break out of loop if HorzEdge.NextInLML is not also horizontal ... - if (horzEdge.NextInLML == null || !IsHorizontal(horzEdge.NextInLML)) break; - - UpdateEdgeIntoAEL(ref horzEdge); - if (horzEdge.OutIdx >= 0) AddOutPt(horzEdge, horzEdge.Bot); - GetHorzDirection(horzEdge, out dir, out horzLeft, out horzRight); - - } //end for (;;) - - if (horzEdge.OutIdx >= 0 && op1 == null) - { - op1 = GetLastOutPt(horzEdge); - TEdge eNextHorz = m_SortedEdges; - while (eNextHorz != null) - { - if (eNextHorz.OutIdx >= 0 && - HorzSegmentsOverlap(horzEdge.Bot.X, - horzEdge.Top.X, eNextHorz.Bot.X, eNextHorz.Top.X)) + OutRec firstLeft = ParseFirstLeft(outRec.FirstLeft); + if (outRec.Pts != null && firstLeft == OldOutRec) { - OutPt op2 = GetLastOutPt(eNextHorz); - AddJoin(op2, op1, eNextHorz.Top); + if (Poly2ContainsPoly1(outRec.Pts, NewOutRec.Pts)) + outRec.FirstLeft = NewOutRec; } - eNextHorz = eNextHorz.NextInSEL; } - AddGhostJoin(op1, horzEdge.Top); } + //---------------------------------------------------------------------- - if (horzEdge.NextInLML != null) + private void FixupFirstLefts2(OutRec innerOutRec, OutRec outerOutRec) { - if(horzEdge.OutIdx >= 0) - { - op1 = AddOutPt( horzEdge, horzEdge.Top); - - UpdateEdgeIntoAEL(ref horzEdge); - if (horzEdge.WindDelta == 0) return; - //nb: HorzEdge is no longer horizontal here - TEdge ePrev = horzEdge.PrevInAEL; - TEdge eNext = horzEdge.NextInAEL; - if (ePrev != null && ePrev.Curr.X == horzEdge.Bot.X && - ePrev.Curr.Y == horzEdge.Bot.Y && ePrev.WindDelta != 0 && - (ePrev.OutIdx >= 0 && ePrev.Curr.Y > ePrev.Top.Y && - SlopesEqual(horzEdge, ePrev, m_UseFullRange))) + //A polygon has split into two such that one is now the inner of the other. + //It's possible that these polygons now wrap around other polygons, so check + //every polygon that's also contained by OuterOutRec's FirstLeft container + //(including nil) to see if they've become inner to the new inner polygon ... + OutRec orfl = outerOutRec.FirstLeft; + foreach (OutRec outRec in m_PolyOuts) { - OutPt op2 = AddOutPt(ePrev, horzEdge.Bot); - AddJoin(op1, op2, horzEdge.Top); + if (outRec.Pts == null || outRec == outerOutRec || outRec == innerOutRec) + continue; + OutRec firstLeft = ParseFirstLeft(outRec.FirstLeft); + if (firstLeft != orfl && firstLeft != innerOutRec && firstLeft != outerOutRec) + continue; + if (Poly2ContainsPoly1(outRec.Pts, innerOutRec.Pts)) + outRec.FirstLeft = innerOutRec; + else if (Poly2ContainsPoly1(outRec.Pts, outerOutRec.Pts)) + outRec.FirstLeft = outerOutRec; + else if (outRec.FirstLeft == innerOutRec || outRec.FirstLeft == outerOutRec) + outRec.FirstLeft = orfl; } - else if (eNext != null && eNext.Curr.X == horzEdge.Bot.X && - eNext.Curr.Y == horzEdge.Bot.Y && eNext.WindDelta != 0 && - eNext.OutIdx >= 0 && eNext.Curr.Y > eNext.Top.Y && - SlopesEqual(horzEdge, eNext, m_UseFullRange)) + } + //---------------------------------------------------------------------- + + private void FixupFirstLefts3(OutRec OldOutRec, OutRec NewOutRec) + { + //same as FixupFirstLefts1 but doesn't call Poly2ContainsPoly1() + foreach (OutRec outRec in m_PolyOuts) { - OutPt op2 = AddOutPt(eNext, horzEdge.Bot); - AddJoin(op1, op2, horzEdge.Top); + OutRec firstLeft = ParseFirstLeft(outRec.FirstLeft); + if (outRec.Pts != null && firstLeft == OldOutRec) + outRec.FirstLeft = NewOutRec; } - } - else - UpdateEdgeIntoAEL(ref horzEdge); } - else + //---------------------------------------------------------------------- + + private static OutRec ParseFirstLeft(OutRec FirstLeft) { - if (horzEdge.OutIdx >= 0) AddOutPt(horzEdge, horzEdge.Top); - DeleteFromAEL(horzEdge); + while (FirstLeft != null && FirstLeft.Pts == null) + FirstLeft = FirstLeft.FirstLeft; + return FirstLeft; } - } - //------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ - private TEdge GetNextInAEL(TEdge e, Direction Direction) - { - return Direction == Direction.dLeftToRight ? e.NextInAEL: e.PrevInAEL; - } - //------------------------------------------------------------------------------ + private void JoinCommonEdges() + { + for (int i = 0; i < m_Joins.Count; i++) + { + Join join = m_Joins[i]; - private bool IsMinima(TEdge e) - { - return e != null && (e.Prev.NextInLML != e) && (e.Next.NextInLML != e); - } - //------------------------------------------------------------------------------ + OutRec outRec1 = GetOutRec(join.OutPt1.Idx); + OutRec outRec2 = GetOutRec(join.OutPt2.Idx); - private bool IsMaxima(TEdge e, double Y) - { - return (e != null && e.Top.Y == Y && e.NextInLML == null); - } - //------------------------------------------------------------------------------ + if (outRec1.Pts == null || outRec2.Pts == null) continue; + if (outRec1.IsOpen || outRec2.IsOpen) continue; - private bool IsIntermediate(TEdge e, double Y) - { - return (e.Top.Y == Y && e.NextInLML != null); - } - //------------------------------------------------------------------------------ + //get the polygon fragment with the correct hole state (FirstLeft) + //before calling JoinPoints() ... + OutRec holeStateRec; + if (outRec1 == outRec2) holeStateRec = outRec1; + else if (OutRec1RightOfOutRec2(outRec1, outRec2)) holeStateRec = outRec2; + else if (OutRec1RightOfOutRec2(outRec2, outRec1)) holeStateRec = outRec1; + else holeStateRec = GetLowermostRec(outRec1, outRec2); - internal TEdge GetMaximaPair(TEdge e) - { - if ((e.Next.Top == e.Top) && e.Next.NextInLML == null) - return e.Next; - else if ((e.Prev.Top == e.Top) && e.Prev.NextInLML == null) - return e.Prev; - else - return null; - } - //------------------------------------------------------------------------------ + if (!JoinPoints(join, outRec1, outRec2)) continue; - internal TEdge GetMaximaPairEx(TEdge e) - { - //as above but returns null if MaxPair isn't in AEL (unless it's horizontal) - TEdge result = GetMaximaPair(e); - if (result == null || result.OutIdx == Skip || - ((result.NextInAEL == result.PrevInAEL) && !IsHorizontal(result))) return null; - return result; - } - //------------------------------------------------------------------------------ + if (outRec1 == outRec2) + { + //instead of joining two polygons, we've just created a new one by + //splitting one polygon into two. + outRec1.Pts = join.OutPt1; + outRec1.BottomPt = null; + outRec2 = CreateOutRec(); + outRec2.Pts = join.OutPt2; - private bool ProcessIntersections(cInt topY) - { - if( m_ActiveEdges == null ) return true; - try { - BuildIntersectList(topY); - if ( m_IntersectList.Count == 0) return true; - if (m_IntersectList.Count == 1 || FixupIntersectionOrder()) - ProcessIntersectList(); - else - return false; - } - catch { - m_SortedEdges = null; - m_IntersectList.Clear(); - throw new ClipperException("ProcessIntersections error"); - } - m_SortedEdges = null; - return true; - } - //------------------------------------------------------------------------------ + //update all OutRec2.Pts Idx's ... + UpdateOutPtIdxs(outRec2); - private void BuildIntersectList(cInt topY) - { - if ( m_ActiveEdges == null ) return; - - //prepare for sorting ... - TEdge e = m_ActiveEdges; - m_SortedEdges = e; - while( e != null ) - { - e.PrevInSEL = e.PrevInAEL; - e.NextInSEL = e.NextInAEL; - e.Curr.X = TopX( e, topY ); - e = e.NextInAEL; - } - - //bubblesort ... - bool isModified = true; - while( isModified && m_SortedEdges != null ) - { - isModified = false; - e = m_SortedEdges; - while( e.NextInSEL != null ) - { - TEdge eNext = e.NextInSEL; - IntPoint pt; - if (e.Curr.X > eNext.Curr.X) - { - IntersectPoint(e, eNext, out pt); - if (pt.Y < topY) - pt = new IntPoint(TopX(e, topY), topY); - IntersectNode newNode = new IntersectNode(); - newNode.Edge1 = e; - newNode.Edge2 = eNext; - newNode.Pt = pt; - m_IntersectList.Add(newNode); - - SwapPositionsInSEL(e, eNext); - isModified = true; - } - else - e = eNext; - } - if( e.PrevInSEL != null ) e.PrevInSEL.NextInSEL = null; - else break; - } - m_SortedEdges = null; - } - //------------------------------------------------------------------------------ + if (Poly2ContainsPoly1(outRec2.Pts, outRec1.Pts)) + { + //outRec1 contains outRec2 ... + outRec2.IsHole = !outRec1.IsHole; + outRec2.FirstLeft = outRec1; - private bool EdgesAdjacent(IntersectNode inode) - { - return (inode.Edge1.NextInSEL == inode.Edge2) || - (inode.Edge1.PrevInSEL == inode.Edge2); - } - //------------------------------------------------------------------------------ + if (m_UsingPolyTree) FixupFirstLefts2(outRec2, outRec1); - private static int IntersectNodeSort(IntersectNode node1, IntersectNode node2) - { - //the following typecast is safe because the differences in Pt.Y will - //be limited to the height of the scanbeam. - return (int)(node2.Pt.Y - node1.Pt.Y); - } - //------------------------------------------------------------------------------ + if ((outRec2.IsHole ^ ReverseSolution) == (Area(outRec2) > 0)) + ReversePolyPtLinks(outRec2.Pts); - private bool FixupIntersectionOrder() - { - //pre-condition: intersections are sorted bottom-most first. - //Now it's crucial that intersections are made only between adjacent edges, - //so to ensure this the order of intersections may need adjusting ... - m_IntersectList.Sort(m_IntersectNodeComparer); + } + else if (Poly2ContainsPoly1(outRec1.Pts, outRec2.Pts)) + { + //outRec2 contains outRec1 ... + outRec2.IsHole = outRec1.IsHole; + outRec1.IsHole = !outRec2.IsHole; + outRec2.FirstLeft = outRec1.FirstLeft; + outRec1.FirstLeft = outRec2; - CopyAELToSEL(); - int cnt = m_IntersectList.Count; - for (int i = 0; i < cnt; i++) - { - if (!EdgesAdjacent(m_IntersectList[i])) - { - int j = i + 1; - while (j < cnt && !EdgesAdjacent(m_IntersectList[j])) j++; - if (j == cnt) return false; + if (m_UsingPolyTree) FixupFirstLefts2(outRec1, outRec2); - IntersectNode tmp = m_IntersectList[i]; - m_IntersectList[i] = m_IntersectList[j]; - m_IntersectList[j] = tmp; + if ((outRec1.IsHole ^ ReverseSolution) == (Area(outRec1) > 0)) + ReversePolyPtLinks(outRec1.Pts); + } + else + { + //the 2 polygons are completely separate ... + outRec2.IsHole = outRec1.IsHole; + outRec2.FirstLeft = outRec1.FirstLeft; - } - SwapPositionsInSEL(m_IntersectList[i].Edge1, m_IntersectList[i].Edge2); - } - return true; - } - //------------------------------------------------------------------------------ + //fixup FirstLeft pointers that may need reassigning to OutRec2 + if (m_UsingPolyTree) FixupFirstLefts1(outRec1, outRec2); + } - private void ProcessIntersectList() - { - for (int i = 0; i < m_IntersectList.Count; i++) - { - IntersectNode iNode = m_IntersectList[i]; - { - IntersectEdges(iNode.Edge1, iNode.Edge2, iNode.Pt); - SwapPositionsInAEL(iNode.Edge1, iNode.Edge2); - } - } - m_IntersectList.Clear(); - } - //------------------------------------------------------------------------------ + } + else + { + //joined 2 polygons together ... - internal static cInt Round(double value) - { - return value < 0 ? (cInt)(value - 0.5) : (cInt)(value + 0.5); - } - //------------------------------------------------------------------------------ + outRec2.Pts = null; + outRec2.BottomPt = null; + outRec2.Idx = outRec1.Idx; - private static cInt TopX(TEdge edge, cInt currentY) - { - if (currentY == edge.Top.Y) - return edge.Top.X; - return edge.Bot.X + Round(edge.Dx *(currentY - edge.Bot.Y)); - } - //------------------------------------------------------------------------------ + outRec1.IsHole = holeStateRec.IsHole; + if (holeStateRec == outRec2) + outRec1.FirstLeft = outRec2.FirstLeft; + outRec2.FirstLeft = outRec1; - private void IntersectPoint(TEdge edge1, TEdge edge2, out IntPoint ip) - { - ip = new IntPoint(); - double b1, b2; - //nb: with very large coordinate values, it's possible for SlopesEqual() to - //return false but for the edge.Dx value be equal due to double precision rounding. - if (edge1.Dx == edge2.Dx) - { - ip.Y = edge1.Curr.Y; - ip.X = TopX(edge1, ip.Y); - return; + //fixup FirstLeft pointers that may need reassigning to OutRec1 + if (m_UsingPolyTree) FixupFirstLefts3(outRec2, outRec1); + } + } } + //------------------------------------------------------------------------------ - if (edge1.Delta.X == 0) + private void UpdateOutPtIdxs(OutRec outrec) { - ip.X = edge1.Bot.X; - if (IsHorizontal(edge2)) + OutPt op = outrec.Pts; + do { - ip.Y = edge2.Bot.Y; - } - else - { - b2 = edge2.Bot.Y - (edge2.Bot.X / edge2.Dx); - ip.Y = Round(ip.X / edge2.Dx + b2); + op.Idx = outrec.Idx; + op = op.Prev; } + while (op != outrec.Pts); } - else if (edge2.Delta.X == 0) + //------------------------------------------------------------------------------ + + private void DoSimplePolygons() { - ip.X = edge2.Bot.X; - if (IsHorizontal(edge1)) + int i = 0; + while (i < m_PolyOuts.Count) { - ip.Y = edge1.Bot.Y; - } - else - { - b1 = edge1.Bot.Y - (edge1.Bot.X / edge1.Dx); - ip.Y = Round(ip.X / edge1.Dx + b1); + OutRec outrec = m_PolyOuts[i++]; + OutPt op = outrec.Pts; + if (op == null || outrec.IsOpen) continue; + do //for each Pt in Polygon until duplicate found do ... + { + OutPt op2 = op.Next; + while (op2 != outrec.Pts) + { + if ((op.Pt == op2.Pt) && op2.Next != op && op2.Prev != op) + { + //split the polygon into two ... + OutPt op3 = op.Prev; + OutPt op4 = op2.Prev; + op.Prev = op4; + op4.Next = op; + op2.Prev = op3; + op3.Next = op2; + + outrec.Pts = op; + OutRec outrec2 = CreateOutRec(); + outrec2.Pts = op2; + UpdateOutPtIdxs(outrec2); + if (Poly2ContainsPoly1(outrec2.Pts, outrec.Pts)) + { + //OutRec2 is contained by OutRec1 ... + outrec2.IsHole = !outrec.IsHole; + outrec2.FirstLeft = outrec; + if (m_UsingPolyTree) FixupFirstLefts2(outrec2, outrec); + } + else + if (Poly2ContainsPoly1(outrec.Pts, outrec2.Pts)) + { + //OutRec1 is contained by OutRec2 ... + outrec2.IsHole = outrec.IsHole; + outrec.IsHole = !outrec2.IsHole; + outrec2.FirstLeft = outrec.FirstLeft; + outrec.FirstLeft = outrec2; + if (m_UsingPolyTree) FixupFirstLefts2(outrec, outrec2); + } + else + { + //the 2 polygons are separate ... + outrec2.IsHole = outrec.IsHole; + outrec2.FirstLeft = outrec.FirstLeft; + if (m_UsingPolyTree) FixupFirstLefts1(outrec, outrec2); + } + op2 = op; //ie get ready for the next iteration + } + op2 = op2.Next; + } + op = op.Next; + } + while (op != outrec.Pts); } } - else - { - b1 = edge1.Bot.X - edge1.Bot.Y * edge1.Dx; - b2 = edge2.Bot.X - edge2.Bot.Y * edge2.Dx; - double q = (b2 - b1) / (edge1.Dx - edge2.Dx); - ip.Y = Round(q); - if (Math.Abs(edge1.Dx) < Math.Abs(edge2.Dx)) - ip.X = Round(edge1.Dx * q + b1); - else - ip.X = Round(edge2.Dx * q + b2); - } + //------------------------------------------------------------------------------ - if (ip.Y < edge1.Top.Y || ip.Y < edge2.Top.Y) + public static double Area(Path poly) { - if (edge1.Top.Y > edge2.Top.Y) - ip.Y = edge1.Top.Y; - else - ip.Y = edge2.Top.Y; - if (Math.Abs(edge1.Dx) < Math.Abs(edge2.Dx)) - ip.X = TopX(edge1, ip.Y); - else - ip.X = TopX(edge2, ip.Y); + int cnt = (int)poly.Count; + if (cnt < 3) return 0; + double a = 0; + for (int i = 0, j = cnt - 1; i < cnt; ++i) + { + a += ((double)poly[j].X + poly[i].X) * ((double)poly[j].Y - poly[i].Y); + j = i; + } + return -a * 0.5; } - //finally, don't allow 'ip' to be BELOW curr.Y (ie bottom of scanbeam) ... - if (ip.Y > edge1.Curr.Y) + //------------------------------------------------------------------------------ + + internal double Area(OutRec outRec) { - ip.Y = edge1.Curr.Y; - //better to use the more vertical edge to derive X ... - if (Math.Abs(edge1.Dx) > Math.Abs(edge2.Dx)) - ip.X = TopX(edge2, ip.Y); - else - ip.X = TopX(edge1, ip.Y); + return Area(outRec.Pts); } - } - //------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ - private void ProcessEdgesAtTopOfScanbeam(cInt topY) - { - TEdge e = m_ActiveEdges; - while(e != null) + internal double Area(OutPt op) { - //1. process maxima, treating them as if they're 'bent' horizontal edges, - // but exclude maxima with horizontal edges. nb: e can't be a horizontal. - bool IsMaximaEdge = IsMaxima(e, topY); - - if(IsMaximaEdge) - { - TEdge eMaxPair = GetMaximaPairEx(e); - IsMaximaEdge = (eMaxPair == null || !IsHorizontal(eMaxPair)); - } - - if(IsMaximaEdge) - { - if (StrictlySimple) InsertMaxima(e.Top.X); - TEdge ePrev = e.PrevInAEL; - DoMaxima(e); - if( ePrev == null) e = m_ActiveEdges; - else e = ePrev.NextInAEL; - } - else - { - //2. promote horizontal edges, otherwise update Curr.X and Curr.Y ... - if (IsIntermediate(e, topY) && IsHorizontal(e.NextInLML)) - { - UpdateEdgeIntoAEL(ref e); - if (e.OutIdx >= 0) - AddOutPt(e, e.Bot); - AddEdgeToSEL(e); - } - else - { - e.Curr.X = TopX( e, topY ); - e.Curr.Y = topY; - } - - //When StrictlySimple and 'e' is being touched by another edge, then - //make sure both edges have a vertex here ... - if (StrictlySimple) + OutPt opFirst = op; + if (op == null) return 0; + double a = 0; + do { - TEdge ePrev = e.PrevInAEL; - if ((e.OutIdx >= 0) && (e.WindDelta != 0) && ePrev != null && - (ePrev.OutIdx >= 0) && (ePrev.Curr.X == e.Curr.X) && - (ePrev.WindDelta != 0)) - { - IntPoint ip = new IntPoint(e.Curr); -#if use_xyz - SetZ(ref ip, ePrev, e); -#endif - OutPt op = AddOutPt(ePrev, ip); - OutPt op2 = AddOutPt(e, ip); - AddJoin(op, op2, ip); //StrictlySimple (type-3) join - } - } - - e = e.NextInAEL; - } + a = a + (double)(op.Prev.Pt.X + op.Pt.X) * (double)(op.Prev.Pt.Y - op.Pt.Y); + op = op.Next; + } while (op != opFirst); + return a * 0.5; } - //3. Process horizontals at the Top of the scanbeam ... - ProcessHorizontals(); - m_Maxima = null; + //------------------------------------------------------------------------------ + // SimplifyPolygon functions ... + // Convert self-intersecting polygons into simple polygons + //------------------------------------------------------------------------------ - //4. Promote intermediate vertices ... - e = m_ActiveEdges; - while (e != null) + public static Paths SimplifyPolygon(Path poly, + PolyFillType fillType = PolyFillType.pftEvenOdd) { - if(IsIntermediate(e, topY)) - { - OutPt op = null; - if( e.OutIdx >= 0 ) - op = AddOutPt(e, e.Top); - UpdateEdgeIntoAEL(ref e); - - //if output polygons share an edge, they'll need joining later ... - TEdge ePrev = e.PrevInAEL; - TEdge eNext = e.NextInAEL; - if (ePrev != null && ePrev.Curr.X == e.Bot.X && - ePrev.Curr.Y == e.Bot.Y && op != null && - ePrev.OutIdx >= 0 && ePrev.Curr.Y > ePrev.Top.Y && - SlopesEqual(e.Curr, e.Top, ePrev.Curr, ePrev.Top, m_UseFullRange) && - (e.WindDelta != 0) && (ePrev.WindDelta != 0)) - { - OutPt op2 = AddOutPt(ePrev, e.Bot); - AddJoin(op, op2, e.Top); - } - else if (eNext != null && eNext.Curr.X == e.Bot.X && - eNext.Curr.Y == e.Bot.Y && op != null && - eNext.OutIdx >= 0 && eNext.Curr.Y > eNext.Top.Y && - SlopesEqual(e.Curr, e.Top, eNext.Curr, eNext.Top, m_UseFullRange) && - (e.WindDelta != 0) && (eNext.WindDelta != 0)) - { - OutPt op2 = AddOutPt(eNext, e.Bot); - AddJoin(op, op2, e.Top); - } - } - e = e.NextInAEL; + Paths result = new Paths(); + Clipper c = new Clipper(); + c.StrictlySimple = true; + c.AddPath(poly, PolyType.ptSubject, true); + c.Execute(ClipType.ctUnion, result, fillType, fillType); + return result; } - } - //------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ - private void DoMaxima(TEdge e) - { - TEdge eMaxPair = GetMaximaPairEx(e); - if (eMaxPair == null) + public static Paths SimplifyPolygons(Paths polys, + PolyFillType fillType = PolyFillType.pftEvenOdd) { - if (e.OutIdx >= 0) - AddOutPt(e, e.Top); - DeleteFromAEL(e); - return; + Paths result = new Paths(); + Clipper c = new Clipper(); + c.StrictlySimple = true; + c.AddPaths(polys, PolyType.ptSubject, true); + c.Execute(ClipType.ctUnion, result, fillType, fillType); + return result; } + //------------------------------------------------------------------------------ - TEdge eNext = e.NextInAEL; - while(eNext != null && eNext != eMaxPair) + private static double DistanceSqrd(IntPoint pt1, IntPoint pt2) { - IntersectEdges(e, eNext, e.Top); - SwapPositionsInAEL(e, eNext); - eNext = e.NextInAEL; + double dx = ((double)pt1.X - pt2.X); + double dy = ((double)pt1.Y - pt2.Y); + return (dx * dx + dy * dy); } + //------------------------------------------------------------------------------ - if(e.OutIdx == Unassigned && eMaxPair.OutIdx == Unassigned) - { - DeleteFromAEL(e); - DeleteFromAEL(eMaxPair); - } - else if( e.OutIdx >= 0 && eMaxPair.OutIdx >= 0 ) + private static double DistanceFromLineSqrd(IntPoint pt, IntPoint ln1, IntPoint ln2) { - if (e.OutIdx >= 0) AddLocalMaxPoly(e, eMaxPair, e.Top); - DeleteFromAEL(e); - DeleteFromAEL(eMaxPair); + //The equation of a line in general form (Ax + By + C = 0) + //given 2 points (x¹,y¹) & (x²,y²) is ... + //(y¹ - y²)x + (x² - x¹)y + (y² - y¹)x¹ - (x² - x¹)y¹ = 0 + //A = (y¹ - y²); B = (x² - x¹); C = (y² - y¹)x¹ - (x² - x¹)y¹ + //perpendicular distance of point (x³,y³) = (Ax³ + By³ + C)/Sqrt(A² + B²) + //see http://en.wikipedia.org/wiki/Perpendicular_distance + double A = ln1.Y - ln2.Y; + double B = ln2.X - ln1.X; + double C = A * ln1.X + B * ln1.Y; + C = A * pt.X + B * pt.Y - C; + return (C * C) / (A * A + B * B); } -#if use_lines - else if (e.WindDelta == 0) - { - if (e.OutIdx >= 0) - { - AddOutPt(e, e.Top); - e.OutIdx = Unassigned; - } - DeleteFromAEL(e); - - if (eMaxPair.OutIdx >= 0) - { - AddOutPt(eMaxPair, e.Top); - eMaxPair.OutIdx = Unassigned; - } - DeleteFromAEL(eMaxPair); - } -#endif - else throw new ClipperException("DoMaxima error"); - } - //------------------------------------------------------------------------------ - - public static void ReversePaths(Paths polys) - { - foreach (var poly in polys) { poly.Reverse(); } - } - //------------------------------------------------------------------------------ - - public static bool Orientation(Path poly) - { - return Area(poly) >= 0; - } - //------------------------------------------------------------------------------ - - private int PointCount(OutPt pts) - { - if (pts == null) return 0; - int result = 0; - OutPt p = pts; - do - { - result++; - p = p.Next; - } - while (p != pts); - return result; - } - //------------------------------------------------------------------------------ - - private void BuildResult(Paths polyg) - { - polyg.Clear(); - polyg.Capacity = m_PolyOuts.Count; - for (int i = 0; i < m_PolyOuts.Count; i++) - { - OutRec outRec = m_PolyOuts[i]; - if (outRec.Pts == null) continue; - OutPt p = outRec.Pts.Prev; - int cnt = PointCount(p); - if (cnt < 2) continue; - Path pg = new Path(cnt); - for (int j = 0; j < cnt; j++) - { - pg.Add(p.Pt); - p = p.Prev; - } - polyg.Add(pg); - } - } - //------------------------------------------------------------------------------ - - private void BuildResult2(PolyTree polytree) - { - polytree.Clear(); - - //add each output polygon/contour to polytree ... - polytree.m_AllPolys.Capacity = m_PolyOuts.Count; - for (int i = 0; i < m_PolyOuts.Count; i++) - { - OutRec outRec = m_PolyOuts[i]; - int cnt = PointCount(outRec.Pts); - if ((outRec.IsOpen && cnt < 2) || - (!outRec.IsOpen && cnt < 3)) continue; - FixHoleLinkage(outRec); - PolyNode pn = new PolyNode(); - polytree.m_AllPolys.Add(pn); - outRec.PolyNode = pn; - pn.m_polygon.Capacity = cnt; - OutPt op = outRec.Pts.Prev; - for (int j = 0; j < cnt; j++) - { - pn.m_polygon.Add(op.Pt); - op = op.Prev; - } - } - - //fixup PolyNode links etc ... - polytree.m_Childs.Capacity = m_PolyOuts.Count; - for (int i = 0; i < m_PolyOuts.Count; i++) - { - OutRec outRec = m_PolyOuts[i]; - if (outRec.PolyNode == null) continue; - else if (outRec.IsOpen) - { - outRec.PolyNode.IsOpen = true; - polytree.AddChild(outRec.PolyNode); - } - else if (outRec.FirstLeft != null && - outRec.FirstLeft.PolyNode != null) - outRec.FirstLeft.PolyNode.AddChild(outRec.PolyNode); - else - polytree.AddChild(outRec.PolyNode); - } - } - //------------------------------------------------------------------------------ + //--------------------------------------------------------------------------- - private void FixupOutPolyline(OutRec outrec) - { - OutPt pp = outrec.Pts; - OutPt lastPP = pp.Prev; - while (pp != lastPP) + private static bool SlopesNearCollinear(IntPoint pt1, + IntPoint pt2, IntPoint pt3, double distSqrd) { - pp = pp.Next; - if (pp.Pt == pp.Prev.Pt) + //this function is more accurate when the point that's GEOMETRICALLY + //between the other 2 points is the one that's tested for distance. + //nb: with 'spikes', either pt1 or pt3 is geometrically between the other pts + if (Math.Abs(pt1.X - pt2.X) > Math.Abs(pt1.Y - pt2.Y)) { - if (pp == lastPP) lastPP = pp.Prev; - OutPt tmpPP = pp.Prev; - tmpPP.Next = pp.Next; - pp.Next.Prev = tmpPP; - pp = tmpPP; - } - } - if (pp == pp.Prev) outrec.Pts = null; - } - //------------------------------------------------------------------------------ - - private void FixupOutPolygon(OutRec outRec) - { - //FixupOutPolygon() - removes duplicate points and simplifies consecutive - //parallel edges by removing the middle vertex. - OutPt lastOK = null; - outRec.BottomPt = null; - OutPt pp = outRec.Pts; - bool preserveCol = PreserveCollinear || StrictlySimple; - for (;;) - { - if (pp.Prev == pp || pp.Prev == pp.Next) - { - outRec.Pts = null; - return; - } - //test for duplicate points and collinear edges ... - if ((pp.Pt == pp.Next.Pt) || (pp.Pt == pp.Prev.Pt) || - (SlopesEqual(pp.Prev.Pt, pp.Pt, pp.Next.Pt, m_UseFullRange) && - (!preserveCol || !Pt2IsBetweenPt1AndPt3(pp.Prev.Pt, pp.Pt, pp.Next.Pt)))) - { - lastOK = null; - pp.Prev.Next = pp.Next; - pp.Next.Prev = pp.Prev; - pp = pp.Prev; - } - else if (pp == lastOK) break; - else - { - if (lastOK == null) lastOK = pp; - pp = pp.Next; - } - } - outRec.Pts = pp; - } - //------------------------------------------------------------------------------ - - OutPt DupOutPt(OutPt outPt, bool InsertAfter) - { - OutPt result = new OutPt(); - result.Pt = outPt.Pt; - result.Idx = outPt.Idx; - if (InsertAfter) - { - result.Next = outPt.Next; - result.Prev = outPt; - outPt.Next.Prev = result; - outPt.Next = result; - } - else - { - result.Prev = outPt.Prev; - result.Next = outPt; - outPt.Prev.Next = result; - outPt.Prev = result; - } - return result; - } - //------------------------------------------------------------------------------ - - bool GetOverlap(cInt a1, cInt a2, cInt b1, cInt b2, out cInt Left, out cInt Right) - { - if (a1 < a2) - { - if (b1 < b2) {Left = Math.Max(a1,b1); Right = Math.Min(a2,b2);} - else {Left = Math.Max(a1,b2); Right = Math.Min(a2,b1);} - } - else - { - if (b1 < b2) {Left = Math.Max(a2,b1); Right = Math.Min(a1,b2);} - else { Left = Math.Max(a2, b2); Right = Math.Min(a1, b1); } - } - return Left < Right; - } - //------------------------------------------------------------------------------ - - bool JoinHorz(OutPt op1, OutPt op1b, OutPt op2, OutPt op2b, - IntPoint Pt, bool DiscardLeft) - { - Direction Dir1 = (op1.Pt.X > op1b.Pt.X ? - Direction.dRightToLeft : Direction.dLeftToRight); - Direction Dir2 = (op2.Pt.X > op2b.Pt.X ? - Direction.dRightToLeft : Direction.dLeftToRight); - if (Dir1 == Dir2) return false; - - //When DiscardLeft, we want Op1b to be on the Left of Op1, otherwise we - //want Op1b to be on the Right. (And likewise with Op2 and Op2b.) - //So, to facilitate this while inserting Op1b and Op2b ... - //when DiscardLeft, make sure we're AT or RIGHT of Pt before adding Op1b, - //otherwise make sure we're AT or LEFT of Pt. (Likewise with Op2b.) - if (Dir1 == Direction.dLeftToRight) - { - while (op1.Next.Pt.X <= Pt.X && - op1.Next.Pt.X >= op1.Pt.X && op1.Next.Pt.Y == Pt.Y) - op1 = op1.Next; - if (DiscardLeft && (op1.Pt.X != Pt.X)) op1 = op1.Next; - op1b = DupOutPt(op1, !DiscardLeft); - if (op1b.Pt != Pt) - { - op1 = op1b; - op1.Pt = Pt; - op1b = DupOutPt(op1, !DiscardLeft); - } - } - else - { - while (op1.Next.Pt.X >= Pt.X && - op1.Next.Pt.X <= op1.Pt.X && op1.Next.Pt.Y == Pt.Y) - op1 = op1.Next; - if (!DiscardLeft && (op1.Pt.X != Pt.X)) op1 = op1.Next; - op1b = DupOutPt(op1, DiscardLeft); - if (op1b.Pt != Pt) - { - op1 = op1b; - op1.Pt = Pt; - op1b = DupOutPt(op1, DiscardLeft); - } - } - - if (Dir2 == Direction.dLeftToRight) - { - while (op2.Next.Pt.X <= Pt.X && - op2.Next.Pt.X >= op2.Pt.X && op2.Next.Pt.Y == Pt.Y) - op2 = op2.Next; - if (DiscardLeft && (op2.Pt.X != Pt.X)) op2 = op2.Next; - op2b = DupOutPt(op2, !DiscardLeft); - if (op2b.Pt != Pt) - { - op2 = op2b; - op2.Pt = Pt; - op2b = DupOutPt(op2, !DiscardLeft); - }; - } else - { - while (op2.Next.Pt.X >= Pt.X && - op2.Next.Pt.X <= op2.Pt.X && op2.Next.Pt.Y == Pt.Y) - op2 = op2.Next; - if (!DiscardLeft && (op2.Pt.X != Pt.X)) op2 = op2.Next; - op2b = DupOutPt(op2, DiscardLeft); - if (op2b.Pt != Pt) - { - op2 = op2b; - op2.Pt = Pt; - op2b = DupOutPt(op2, DiscardLeft); - }; - }; - - if ((Dir1 == Direction.dLeftToRight) == DiscardLeft) - { - op1.Prev = op2; - op2.Next = op1; - op1b.Next = op2b; - op2b.Prev = op1b; - } - else - { - op1.Next = op2; - op2.Prev = op1; - op1b.Prev = op2b; - op2b.Next = op1b; - } - return true; - } - //------------------------------------------------------------------------------ - - private bool JoinPoints(Join j, OutRec outRec1, OutRec outRec2) - { - OutPt op1 = j.OutPt1, op1b; - OutPt op2 = j.OutPt2, op2b; - - //There are 3 kinds of joins for output polygons ... - //1. Horizontal joins where Join.OutPt1 & Join.OutPt2 are vertices anywhere - //along (horizontal) collinear edges (& Join.OffPt is on the same horizontal). - //2. Non-horizontal joins where Join.OutPt1 & Join.OutPt2 are at the same - //location at the Bottom of the overlapping segment (& Join.OffPt is above). - //3. StrictlySimple joins where edges touch but are not collinear and where - //Join.OutPt1, Join.OutPt2 & Join.OffPt all share the same point. - bool isHorizontal = (j.OutPt1.Pt.Y == j.OffPt.Y); - - if (isHorizontal && (j.OffPt == j.OutPt1.Pt) && (j.OffPt == j.OutPt2.Pt)) - { - //Strictly Simple join ... - if (outRec1 != outRec2) return false; - op1b = j.OutPt1.Next; - while (op1b != op1 && (op1b.Pt == j.OffPt)) - op1b = op1b.Next; - bool reverse1 = (op1b.Pt.Y > j.OffPt.Y); - op2b = j.OutPt2.Next; - while (op2b != op2 && (op2b.Pt == j.OffPt)) - op2b = op2b.Next; - bool reverse2 = (op2b.Pt.Y > j.OffPt.Y); - if (reverse1 == reverse2) return false; - if (reverse1) - { - op1b = DupOutPt(op1, false); - op2b = DupOutPt(op2, true); - op1.Prev = op2; - op2.Next = op1; - op1b.Next = op2b; - op2b.Prev = op1b; - j.OutPt1 = op1; - j.OutPt2 = op1b; - return true; - } else - { - op1b = DupOutPt(op1, true); - op2b = DupOutPt(op2, false); - op1.Next = op2; - op2.Prev = op1; - op1b.Prev = op2b; - op2b.Next = op1b; - j.OutPt1 = op1; - j.OutPt2 = op1b; - return true; - } - } - else if (isHorizontal) - { - //treat horizontal joins differently to non-horizontal joins since with - //them we're not yet sure where the overlapping is. OutPt1.Pt & OutPt2.Pt - //may be anywhere along the horizontal edge. - op1b = op1; - while (op1.Prev.Pt.Y == op1.Pt.Y && op1.Prev != op1b && op1.Prev != op2) - op1 = op1.Prev; - while (op1b.Next.Pt.Y == op1b.Pt.Y && op1b.Next != op1 && op1b.Next != op2) - op1b = op1b.Next; - if (op1b.Next == op1 || op1b.Next == op2) return false; //a flat 'polygon' - - op2b = op2; - while (op2.Prev.Pt.Y == op2.Pt.Y && op2.Prev != op2b && op2.Prev != op1b) - op2 = op2.Prev; - while (op2b.Next.Pt.Y == op2b.Pt.Y && op2b.Next != op2 && op2b.Next != op1) - op2b = op2b.Next; - if (op2b.Next == op2 || op2b.Next == op1) return false; //a flat 'polygon' - - cInt Left, Right; - //Op1 -. Op1b & Op2 -. Op2b are the extremites of the horizontal edges - if (!GetOverlap(op1.Pt.X, op1b.Pt.X, op2.Pt.X, op2b.Pt.X, out Left, out Right)) - return false; - - //DiscardLeftSide: when overlapping edges are joined, a spike will created - //which needs to be cleaned up. However, we don't want Op1 or Op2 caught up - //on the discard Side as either may still be needed for other joins ... - IntPoint Pt; - bool DiscardLeftSide; - if (op1.Pt.X >= Left && op1.Pt.X <= Right) - { - Pt = op1.Pt; DiscardLeftSide = (op1.Pt.X > op1b.Pt.X); - } - else if (op2.Pt.X >= Left&& op2.Pt.X <= Right) - { - Pt = op2.Pt; DiscardLeftSide = (op2.Pt.X > op2b.Pt.X); - } - else if (op1b.Pt.X >= Left && op1b.Pt.X <= Right) - { - Pt = op1b.Pt; DiscardLeftSide = op1b.Pt.X > op1.Pt.X; - } - else - { - Pt = op2b.Pt; DiscardLeftSide = (op2b.Pt.X > op2.Pt.X); - } - j.OutPt1 = op1; - j.OutPt2 = op2; - return JoinHorz(op1, op1b, op2, op2b, Pt, DiscardLeftSide); - } else - { - //nb: For non-horizontal joins ... - // 1. Jr.OutPt1.Pt.Y == Jr.OutPt2.Pt.Y - // 2. Jr.OutPt1.Pt > Jr.OffPt.Y - - //make sure the polygons are correctly oriented ... - op1b = op1.Next; - while ((op1b.Pt == op1.Pt) && (op1b != op1)) op1b = op1b.Next; - bool Reverse1 = ((op1b.Pt.Y > op1.Pt.Y) || - !SlopesEqual(op1.Pt, op1b.Pt, j.OffPt, m_UseFullRange)); - if (Reverse1) - { - op1b = op1.Prev; - while ((op1b.Pt == op1.Pt) && (op1b != op1)) op1b = op1b.Prev; - if ((op1b.Pt.Y > op1.Pt.Y) || - !SlopesEqual(op1.Pt, op1b.Pt, j.OffPt, m_UseFullRange)) return false; - }; - op2b = op2.Next; - while ((op2b.Pt == op2.Pt) && (op2b != op2)) op2b = op2b.Next; - bool Reverse2 = ((op2b.Pt.Y > op2.Pt.Y) || - !SlopesEqual(op2.Pt, op2b.Pt, j.OffPt, m_UseFullRange)); - if (Reverse2) - { - op2b = op2.Prev; - while ((op2b.Pt == op2.Pt) && (op2b != op2)) op2b = op2b.Prev; - if ((op2b.Pt.Y > op2.Pt.Y) || - !SlopesEqual(op2.Pt, op2b.Pt, j.OffPt, m_UseFullRange)) return false; - } - - if ((op1b == op1) || (op2b == op2) || (op1b == op2b) || - ((outRec1 == outRec2) && (Reverse1 == Reverse2))) return false; - - if (Reverse1) - { - op1b = DupOutPt(op1, false); - op2b = DupOutPt(op2, true); - op1.Prev = op2; - op2.Next = op1; - op1b.Next = op2b; - op2b.Prev = op1b; - j.OutPt1 = op1; - j.OutPt2 = op1b; - return true; - } else - { - op1b = DupOutPt(op1, true); - op2b = DupOutPt(op2, false); - op1.Next = op2; - op2.Prev = op1; - op1b.Prev = op2b; - op2b.Next = op1b; - j.OutPt1 = op1; - j.OutPt2 = op1b; - return true; - } - } - } - //---------------------------------------------------------------------- - - public static int PointInPolygon(IntPoint pt, Path path) - { - //returns 0 if false, +1 if true, -1 if pt ON polygon boundary - //See "The Point in Polygon Problem for Arbitrary Polygons" by Hormann & Agathos - //http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.88.5498&rep=rep1&type=pdf - int result = 0, cnt = path.Count; - if (cnt < 3) return 0; - IntPoint ip = path[0]; - for (int i = 1; i <= cnt; ++i) - { - IntPoint ipNext = (i == cnt ? path[0] : path[i]); - if (ipNext.Y == pt.Y) - { - if ((ipNext.X == pt.X) || (ip.Y == pt.Y && - ((ipNext.X > pt.X) == (ip.X < pt.X)))) return -1; - } - if ((ip.Y < pt.Y) != (ipNext.Y < pt.Y)) - { - if (ip.X >= pt.X) - { - if (ipNext.X > pt.X) result = 1 - result; - else - { - double d = (double)(ip.X - pt.X) * (ipNext.Y - pt.Y) - - (double)(ipNext.X - pt.X) * (ip.Y - pt.Y); - if (d == 0) return -1; - else if ((d > 0) == (ipNext.Y > ip.Y)) result = 1 - result; - } + if ((pt1.X > pt2.X) == (pt1.X < pt3.X)) + return DistanceFromLineSqrd(pt1, pt2, pt3) < distSqrd; + else if ((pt2.X > pt1.X) == (pt2.X < pt3.X)) + return DistanceFromLineSqrd(pt2, pt1, pt3) < distSqrd; + else + return DistanceFromLineSqrd(pt3, pt1, pt2) < distSqrd; } else { - if (ipNext.X > pt.X) - { - double d = (double)(ip.X - pt.X) * (ipNext.Y - pt.Y) - - (double)(ipNext.X - pt.X) * (ip.Y - pt.Y); - if (d == 0) return -1; - else if ((d > 0) == (ipNext.Y > ip.Y)) result = 1 - result; - } - } - } - ip = ipNext; - } - return result; - } - //------------------------------------------------------------------------------ - - //See "The Point in Polygon Problem for Arbitrary Polygons" by Hormann & Agathos - //http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.88.5498&rep=rep1&type=pdf - private static int PointInPolygon(IntPoint pt, OutPt op) - { - //returns 0 if false, +1 if true, -1 if pt ON polygon boundary - int result = 0; - OutPt startOp = op; - cInt ptx = pt.X, pty = pt.Y; - cInt poly0x = op.Pt.X, poly0y = op.Pt.Y; - do - { - op = op.Next; - cInt poly1x = op.Pt.X, poly1y = op.Pt.Y; - - if (poly1y == pty) - { - if ((poly1x == ptx) || (poly0y == pty && - ((poly1x > ptx) == (poly0x < ptx)))) return -1; - } - if ((poly0y < pty) != (poly1y < pty)) - { - if (poly0x >= ptx) - { - if (poly1x > ptx) result = 1 - result; - else - { - double d = (double)(poly0x - ptx) * (poly1y - pty) - - (double)(poly1x - ptx) * (poly0y - pty); - if (d == 0) return -1; - if ((d > 0) == (poly1y > poly0y)) result = 1 - result; - } + if ((pt1.Y > pt2.Y) == (pt1.Y < pt3.Y)) + return DistanceFromLineSqrd(pt1, pt2, pt3) < distSqrd; + else if ((pt2.Y > pt1.Y) == (pt2.Y < pt3.Y)) + return DistanceFromLineSqrd(pt2, pt1, pt3) < distSqrd; + else + return DistanceFromLineSqrd(pt3, pt1, pt2) < distSqrd; } - else - { - if (poly1x > ptx) - { - double d = (double)(poly0x - ptx) * (poly1y - pty) - - (double)(poly1x - ptx) * (poly0y - pty); - if (d == 0) return -1; - if ((d > 0) == (poly1y > poly0y)) result = 1 - result; - } - } - } - poly0x = poly1x; poly0y = poly1y; - } while (startOp != op); - return result; - } - //------------------------------------------------------------------------------ - - private static bool Poly2ContainsPoly1(OutPt outPt1, OutPt outPt2) - { - OutPt op = outPt1; - do - { - //nb: PointInPolygon returns 0 if false, +1 if true, -1 if pt on polygon - int res = PointInPolygon(op.Pt, outPt2); - if (res >= 0) return res > 0; - op = op.Next; } - while (op != outPt1); - return true; - } - //---------------------------------------------------------------------- + //------------------------------------------------------------------------------ - private void FixupFirstLefts1(OutRec OldOutRec, OutRec NewOutRec) - { - foreach (OutRec outRec in m_PolyOuts) + private static bool PointsAreClose(IntPoint pt1, IntPoint pt2, double distSqrd) { - OutRec firstLeft = ParseFirstLeft(outRec.FirstLeft); - if (outRec.Pts != null && firstLeft == OldOutRec) - { - if (Poly2ContainsPoly1(outRec.Pts, NewOutRec.Pts)) - outRec.FirstLeft = NewOutRec; - } - } - } - //---------------------------------------------------------------------- - - private void FixupFirstLefts2(OutRec innerOutRec, OutRec outerOutRec) - { - //A polygon has split into two such that one is now the inner of the other. - //It's possible that these polygons now wrap around other polygons, so check - //every polygon that's also contained by OuterOutRec's FirstLeft container - //(including nil) to see if they've become inner to the new inner polygon ... - OutRec orfl = outerOutRec.FirstLeft; - foreach (OutRec outRec in m_PolyOuts) - { - if (outRec.Pts == null || outRec == outerOutRec || outRec == innerOutRec) - continue; - OutRec firstLeft = ParseFirstLeft(outRec.FirstLeft); - if (firstLeft != orfl && firstLeft != innerOutRec && firstLeft != outerOutRec) - continue; - if (Poly2ContainsPoly1(outRec.Pts, innerOutRec.Pts)) - outRec.FirstLeft = innerOutRec; - else if (Poly2ContainsPoly1(outRec.Pts, outerOutRec.Pts)) - outRec.FirstLeft = outerOutRec; - else if (outRec.FirstLeft == innerOutRec || outRec.FirstLeft == outerOutRec) - outRec.FirstLeft = orfl; + double dx = (double)pt1.X - pt2.X; + double dy = (double)pt1.Y - pt2.Y; + return ((dx * dx) + (dy * dy) <= distSqrd); } - } - //---------------------------------------------------------------------- + //------------------------------------------------------------------------------ - private void FixupFirstLefts3(OutRec OldOutRec, OutRec NewOutRec) - { - //same as FixupFirstLefts1 but doesn't call Poly2ContainsPoly1() - foreach (OutRec outRec in m_PolyOuts) + private static OutPt ExcludeOp(OutPt op) { - OutRec firstLeft = ParseFirstLeft(outRec.FirstLeft); - if (outRec.Pts != null && outRec.FirstLeft == OldOutRec) - outRec.FirstLeft = NewOutRec; + OutPt result = op.Prev; + result.Next = op.Next; + op.Next.Prev = result; + result.Idx = 0; + return result; } - } - //---------------------------------------------------------------------- - - private static OutRec ParseFirstLeft(OutRec FirstLeft) - { - while (FirstLeft != null && FirstLeft.Pts == null) - FirstLeft = FirstLeft.FirstLeft; - return FirstLeft; - } - //------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ - private void JoinCommonEdges() - { - for (int i = 0; i < m_Joins.Count; i++) + public static Path CleanPolygon(Path path, double distance = 1.415) { - Join join = m_Joins[i]; - - OutRec outRec1 = GetOutRec(join.OutPt1.Idx); - OutRec outRec2 = GetOutRec(join.OutPt2.Idx); + //distance = proximity in units/pixels below which vertices will be stripped. + //Default ~= sqrt(2) so when adjacent vertices or semi-adjacent vertices have + //both x & y coords within 1 unit, then the second vertex will be stripped. - if (outRec1.Pts == null || outRec2.Pts == null) continue; - if (outRec1.IsOpen || outRec2.IsOpen) continue; + int cnt = path.Count; - //get the polygon fragment with the correct hole state (FirstLeft) - //before calling JoinPoints() ... - OutRec holeStateRec; - if (outRec1 == outRec2) holeStateRec = outRec1; - else if (OutRec1RightOfOutRec2(outRec1, outRec2)) holeStateRec = outRec2; - else if (OutRec1RightOfOutRec2(outRec2, outRec1)) holeStateRec = outRec1; - else holeStateRec = GetLowermostRec(outRec1, outRec2); + if (cnt == 0) return new Path(); - if (!JoinPoints(join, outRec1, outRec2)) continue; + OutPt[] outPts = new OutPt[cnt]; + for (int i = 0; i < cnt; ++i) outPts[i] = new OutPt(); - if (outRec1 == outRec2) - { - //instead of joining two polygons, we've just created a new one by - //splitting one polygon into two. - outRec1.Pts = join.OutPt1; - outRec1.BottomPt = null; - outRec2 = CreateOutRec(); - outRec2.Pts = join.OutPt2; - - //update all OutRec2.Pts Idx's ... - UpdateOutPtIdxs(outRec2); - - if (Poly2ContainsPoly1(outRec2.Pts, outRec1.Pts)) + for (int i = 0; i < cnt; ++i) { - //outRec1 contains outRec2 ... - outRec2.IsHole = !outRec1.IsHole; - outRec2.FirstLeft = outRec1; - - if (m_UsingPolyTree) FixupFirstLefts2(outRec2, outRec1); - - if ((outRec2.IsHole ^ ReverseSolution) == (Area(outRec2) > 0)) - ReversePolyPtLinks(outRec2.Pts); - + outPts[i].Pt = path[i]; + outPts[i].Next = outPts[(i + 1) % cnt]; + outPts[i].Next.Prev = outPts[i]; + outPts[i].Idx = 0; } - else if (Poly2ContainsPoly1(outRec1.Pts, outRec2.Pts)) - { - //outRec2 contains outRec1 ... - outRec2.IsHole = outRec1.IsHole; - outRec1.IsHole = !outRec2.IsHole; - outRec2.FirstLeft = outRec1.FirstLeft; - outRec1.FirstLeft = outRec2; - - if (m_UsingPolyTree) FixupFirstLefts2(outRec1, outRec2); - if ((outRec1.IsHole ^ ReverseSolution) == (Area(outRec1) > 0)) - ReversePolyPtLinks(outRec1.Pts); - } - else + double distSqrd = distance * distance; + OutPt op = outPts[0]; + while (op.Idx == 0 && op.Next != op.Prev) { - //the 2 polygons are completely separate ... - outRec2.IsHole = outRec1.IsHole; - outRec2.FirstLeft = outRec1.FirstLeft; + if (PointsAreClose(op.Pt, op.Prev.Pt, distSqrd)) + { + op = ExcludeOp(op); + cnt--; + } + else if (PointsAreClose(op.Prev.Pt, op.Next.Pt, distSqrd)) + { + ExcludeOp(op.Next); + op = ExcludeOp(op); + cnt -= 2; + } + else if (SlopesNearCollinear(op.Prev.Pt, op.Pt, op.Next.Pt, distSqrd)) + { + op = ExcludeOp(op); + cnt--; + } + else + { + op.Idx = 1; + op = op.Next; + } + } - //fixup FirstLeft pointers that may need reassigning to OutRec2 - if (m_UsingPolyTree) FixupFirstLefts1(outRec1, outRec2); + if (cnt < 3) cnt = 0; + Path result = new Path(cnt); + for (int i = 0; i < cnt; ++i) + { + result.Add(op.Pt); + op = op.Next; } - - } else - { - //joined 2 polygons together ... + outPts = null; + return result; + } + //------------------------------------------------------------------------------ - outRec2.Pts = null; - outRec2.BottomPt = null; - outRec2.Idx = outRec1.Idx; + public static Paths CleanPolygons(Paths polys, + double distance = 1.415) + { + Paths result = new Paths(polys.Count); + for (int i = 0; i < polys.Count; i++) + result.Add(CleanPolygon(polys[i], distance)); + return result; + } + //------------------------------------------------------------------------------ + + internal static Paths Minkowski(Path pattern, Path path, bool IsSum, bool IsClosed) + { + int delta = (IsClosed ? 1 : 0); + int polyCnt = pattern.Count; + int pathCnt = path.Count; + Paths result = new Paths(pathCnt); + if (IsSum) + for (int i = 0; i < pathCnt; i++) + { + Path p = new Path(polyCnt); + foreach (IntPoint ip in pattern) + p.Add(new IntPoint(path[i].X + ip.X, path[i].Y + ip.Y)); + result.Add(p); + } + else + for (int i = 0; i < pathCnt; i++) + { + Path p = new Path(polyCnt); + foreach (IntPoint ip in pattern) + p.Add(new IntPoint(path[i].X - ip.X, path[i].Y - ip.Y)); + result.Add(p); + } - outRec1.IsHole = holeStateRec.IsHole; - if (holeStateRec == outRec2) - outRec1.FirstLeft = outRec2.FirstLeft; - outRec2.FirstLeft = outRec1; + Paths quads = new Paths((pathCnt + delta) * (polyCnt + 1)); + for (int i = 0; i < pathCnt - 1 + delta; i++) + for (int j = 0; j < polyCnt; j++) + { + Path quad = new Path(4); + quad.Add(result[i % pathCnt][j % polyCnt]); + quad.Add(result[(i + 1) % pathCnt][j % polyCnt]); + quad.Add(result[(i + 1) % pathCnt][(j + 1) % polyCnt]); + quad.Add(result[i % pathCnt][(j + 1) % polyCnt]); + if (!Orientation(quad)) quad.Reverse(); + quads.Add(quad); + } + return quads; + } + //------------------------------------------------------------------------------ - //fixup FirstLeft pointers that may need reassigning to OutRec1 - if (m_UsingPolyTree) FixupFirstLefts3(outRec2, outRec1); - } + public static Paths MinkowskiSum(Path pattern, Path path, bool pathIsClosed) + { + Paths paths = Minkowski(pattern, path, true, pathIsClosed); + Clipper c = new Clipper(); + c.AddPaths(paths, PolyType.ptSubject, true); + c.Execute(ClipType.ctUnion, paths, PolyFillType.pftNonZero, PolyFillType.pftNonZero); + return paths; } - } - //------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ - private void UpdateOutPtIdxs(OutRec outrec) - { - OutPt op = outrec.Pts; - do + private static Path TranslatePath(Path path, IntPoint delta) { - op.Idx = outrec.Idx; - op = op.Prev; + Path outPath = new Path(path.Count); + for (int i = 0; i < path.Count; i++) + outPath.Add(new IntPoint(path[i].X + delta.X, path[i].Y + delta.Y)); + return outPath; } - while(op != outrec.Pts); - } - //------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ - private void DoSimplePolygons() - { - int i = 0; - while (i < m_PolyOuts.Count) - { - OutRec outrec = m_PolyOuts[i++]; - OutPt op = outrec.Pts; - if (op == null || outrec.IsOpen) continue; - do //for each Pt in Polygon until duplicate found do ... - { - OutPt op2 = op.Next; - while (op2 != outrec.Pts) - { - if ((op.Pt == op2.Pt) && op2.Next != op && op2.Prev != op) - { - //split the polygon into two ... - OutPt op3 = op.Prev; - OutPt op4 = op2.Prev; - op.Prev = op4; - op4.Next = op; - op2.Prev = op3; - op3.Next = op2; - - outrec.Pts = op; - OutRec outrec2 = CreateOutRec(); - outrec2.Pts = op2; - UpdateOutPtIdxs(outrec2); - if (Poly2ContainsPoly1(outrec2.Pts, outrec.Pts)) - { - //OutRec2 is contained by OutRec1 ... - outrec2.IsHole = !outrec.IsHole; - outrec2.FirstLeft = outrec; - if (m_UsingPolyTree) FixupFirstLefts2(outrec2, outrec); - } - else - if (Poly2ContainsPoly1(outrec.Pts, outrec2.Pts)) - { - //OutRec1 is contained by OutRec2 ... - outrec2.IsHole = outrec.IsHole; - outrec.IsHole = !outrec2.IsHole; - outrec2.FirstLeft = outrec.FirstLeft; - outrec.FirstLeft = outrec2; - if (m_UsingPolyTree) FixupFirstLefts2(outrec, outrec2); - } - else + public static Paths MinkowskiSum(Path pattern, Paths paths, bool pathIsClosed) + { + Paths solution = new Paths(); + Clipper c = new Clipper(); + for (int i = 0; i < paths.Count; ++i) + { + Paths tmp = Minkowski(pattern, paths[i], true, pathIsClosed); + c.AddPaths(tmp, PolyType.ptSubject, true); + if (pathIsClosed) { - //the 2 polygons are separate ... - outrec2.IsHole = outrec.IsHole; - outrec2.FirstLeft = outrec.FirstLeft; - if (m_UsingPolyTree) FixupFirstLefts1(outrec, outrec2); + Path path = TranslatePath(paths[i], pattern[0]); + c.AddPath(path, PolyType.ptClip, true); } - op2 = op; //ie get ready for the next iteration - } - op2 = op2.Next; } - op = op.Next; - } - while (op != outrec.Pts); + c.Execute(ClipType.ctUnion, solution, + PolyFillType.pftNonZero, PolyFillType.pftNonZero); + return solution; } - } - //------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ - public static double Area(Path poly) - { - int cnt = (int)poly.Count; - if (cnt < 3) return 0; - double a = 0; - for (int i = 0, j = cnt - 1; i < cnt; ++i) + public static Paths MinkowskiDiff(Path poly1, Path poly2) { - a += ((double)poly[j].X + poly[i].X) * ((double)poly[j].Y - poly[i].Y); - j = i; + Paths paths = Minkowski(poly1, poly2, false, true); + Clipper c = new Clipper(); + c.AddPaths(paths, PolyType.ptSubject, true); + c.Execute(ClipType.ctUnion, paths, PolyFillType.pftNonZero, PolyFillType.pftNonZero); + return paths; } - return -a * 0.5; - } - //------------------------------------------------------------------------------ - - internal double Area(OutRec outRec) - { - return Area(outRec.Pts); - } - //------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ - internal double Area(OutPt op) - { - OutPt opFirst = op; - if (op == null) return 0; - double a = 0; - do { - a = a + (double)(op.Prev.Pt.X + op.Pt.X) * (double)(op.Prev.Pt.Y - op.Pt.Y); - op = op.Next; - } while (op != opFirst); - return a * 0.5; - } + internal enum NodeType { ntAny, ntOpen, ntClosed }; - //------------------------------------------------------------------------------ - // SimplifyPolygon functions ... - // Convert self-intersecting polygons into simple polygons - //------------------------------------------------------------------------------ + public static Paths PolyTreeToPaths(PolyTree polytree) + { - public static Paths SimplifyPolygon(Path poly, - PolyFillType fillType = PolyFillType.pftEvenOdd) - { - Paths result = new Paths(); - Clipper c = new Clipper(); - c.StrictlySimple = true; - c.AddPath(poly, PolyType.ptSubject, true); - c.Execute(ClipType.ctUnion, result, fillType, fillType); - return result; - } - //------------------------------------------------------------------------------ + Paths result = new Paths(); + result.Capacity = polytree.Total; + AddPolyNodeToPaths(polytree, NodeType.ntAny, result); + return result; + } + //------------------------------------------------------------------------------ - public static Paths SimplifyPolygons(Paths polys, - PolyFillType fillType = PolyFillType.pftEvenOdd) - { - Paths result = new Paths(); - Clipper c = new Clipper(); - c.StrictlySimple = true; - c.AddPaths(polys, PolyType.ptSubject, true); - c.Execute(ClipType.ctUnion, result, fillType, fillType); - return result; - } - //------------------------------------------------------------------------------ + internal static void AddPolyNodeToPaths(PolyNode polynode, NodeType nt, Paths paths) + { + bool match = true; + switch (nt) + { + case NodeType.ntOpen: return; + case NodeType.ntClosed: match = !polynode.IsOpen; break; + default: break; + } - private static double DistanceSqrd(IntPoint pt1, IntPoint pt2) - { - double dx = ((double)pt1.X - pt2.X); - double dy = ((double)pt1.Y - pt2.Y); - return (dx*dx + dy*dy); - } - //------------------------------------------------------------------------------ + if (polynode.m_polygon.Count > 0 && match) + paths.Add(polynode.m_polygon); + foreach (PolyNode pn in polynode.Childs) + AddPolyNodeToPaths(pn, nt, paths); + } + //------------------------------------------------------------------------------ - private static double DistanceFromLineSqrd(IntPoint pt, IntPoint ln1, IntPoint ln2) - { - //The equation of a line in general form (Ax + By + C = 0) - //given 2 points (x¹,y¹) & (x²,y²) is ... - //(y¹ - y²)x + (x² - x¹)y + (y² - y¹)x¹ - (x² - x¹)y¹ = 0 - //A = (y¹ - y²); B = (x² - x¹); C = (y² - y¹)x¹ - (x² - x¹)y¹ - //perpendicular distance of point (x³,y³) = (Ax³ + By³ + C)/Sqrt(A² + B²) - //see http://en.wikipedia.org/wiki/Perpendicular_distance - double A = ln1.Y - ln2.Y; - double B = ln2.X - ln1.X; - double C = A * ln1.X + B * ln1.Y; - C = A * pt.X + B * pt.Y - C; - return (C * C) / (A * A + B * B); - } - //--------------------------------------------------------------------------- + public static Paths OpenPathsFromPolyTree(PolyTree polytree) + { + Paths result = new Paths(); + result.Capacity = polytree.ChildCount; + for (int i = 0; i < polytree.ChildCount; i++) + if (polytree.Childs[i].IsOpen) + result.Add(polytree.Childs[i].m_polygon); + return result; + } + //------------------------------------------------------------------------------ - private static bool SlopesNearCollinear(IntPoint pt1, - IntPoint pt2, IntPoint pt3, double distSqrd) - { - //this function is more accurate when the point that's GEOMETRICALLY - //between the other 2 points is the one that's tested for distance. - //nb: with 'spikes', either pt1 or pt3 is geometrically between the other pts - if (Math.Abs(pt1.X - pt2.X) > Math.Abs(pt1.Y - pt2.Y)) - { - if ((pt1.X > pt2.X) == (pt1.X < pt3.X)) - return DistanceFromLineSqrd(pt1, pt2, pt3) < distSqrd; - else if ((pt2.X > pt1.X) == (pt2.X < pt3.X)) - return DistanceFromLineSqrd(pt2, pt1, pt3) < distSqrd; - else - return DistanceFromLineSqrd(pt3, pt1, pt2) < distSqrd; - } - else - { - if ((pt1.Y > pt2.Y) == (pt1.Y < pt3.Y)) - return DistanceFromLineSqrd(pt1, pt2, pt3) < distSqrd; - else if ((pt2.Y > pt1.Y) == (pt2.Y < pt3.Y)) - return DistanceFromLineSqrd(pt2, pt1, pt3) < distSqrd; - else - return DistanceFromLineSqrd(pt3, pt1, pt2) < distSqrd; - } - } - //------------------------------------------------------------------------------ + public static Paths ClosedPathsFromPolyTree(PolyTree polytree) + { + Paths result = new Paths(); + result.Capacity = polytree.Total; + AddPolyNodeToPaths(polytree, NodeType.ntClosed, result); + return result; + } + //------------------------------------------------------------------------------ - private static bool PointsAreClose(IntPoint pt1, IntPoint pt2, double distSqrd) - { - double dx = (double)pt1.X - pt2.X; - double dy = (double)pt1.Y - pt2.Y; - return ((dx * dx) + (dy * dy) <= distSqrd); - } - //------------------------------------------------------------------------------ + } //end Clipper - private static OutPt ExcludeOp(OutPt op) - { - OutPt result = op.Prev; - result.Next = op.Next; - op.Next.Prev = result; - result.Idx = 0; - return result; - } - //------------------------------------------------------------------------------ + public class ClipperOffset + { + private Paths m_destPolys; + private Path m_srcPoly; + private Path m_destPoly; + private List m_normals = new List(); + private double m_delta, m_sinA, m_sin, m_cos; + private double m_miterLim, m_StepsPerRad; - public static Path CleanPolygon(Path path, double distance = 1.415) - { - //distance = proximity in units/pixels below which vertices will be stripped. - //Default ~= sqrt(2) so when adjacent vertices or semi-adjacent vertices have - //both x & y coords within 1 unit, then the second vertex will be stripped. - - int cnt = path.Count; - - if (cnt == 0) return new Path(); - - OutPt [] outPts = new OutPt[cnt]; - for (int i = 0; i < cnt; ++i) outPts[i] = new OutPt(); - - for (int i = 0; i < cnt; ++i) - { - outPts[i].Pt = path[i]; - outPts[i].Next = outPts[(i + 1) % cnt]; - outPts[i].Next.Prev = outPts[i]; - outPts[i].Idx = 0; - } - - double distSqrd = distance * distance; - OutPt op = outPts[0]; - while (op.Idx == 0 && op.Next != op.Prev) - { - if (PointsAreClose(op.Pt, op.Prev.Pt, distSqrd)) - { - op = ExcludeOp(op); - cnt--; - } - else if (PointsAreClose(op.Prev.Pt, op.Next.Pt, distSqrd)) - { - ExcludeOp(op.Next); - op = ExcludeOp(op); - cnt -= 2; - } - else if (SlopesNearCollinear(op.Prev.Pt, op.Pt, op.Next.Pt, distSqrd)) - { - op = ExcludeOp(op); - cnt--; - } - else - { - op.Idx = 1; - op = op.Next; - } - } - - if (cnt < 3) cnt = 0; - Path result = new Path(cnt); - for (int i = 0; i < cnt; ++i) - { - result.Add(op.Pt); - op = op.Next; - } - outPts = null; - return result; - } - //------------------------------------------------------------------------------ + private IntPoint m_lowest; + private PolyNode m_polyNodes = new PolyNode(); - public static Paths CleanPolygons(Paths polys, - double distance = 1.415) - { - Paths result = new Paths(polys.Count); - for (int i = 0; i < polys.Count; i++) - result.Add(CleanPolygon(polys[i], distance)); - return result; - } - //------------------------------------------------------------------------------ + public double ArcTolerance { get; set; } + public double MiterLimit { get; set; } - internal static Paths Minkowski(Path pattern, Path path, bool IsSum, bool IsClosed) - { - int delta = (IsClosed ? 1 : 0); - int polyCnt = pattern.Count; - int pathCnt = path.Count; - Paths result = new Paths(pathCnt); - if (IsSum) - for (int i = 0; i < pathCnt; i++) - { - Path p = new Path(polyCnt); - foreach (IntPoint ip in pattern) - p.Add(new IntPoint(path[i].X + ip.X, path[i].Y + ip.Y)); - result.Add(p); - } - else - for (int i = 0; i < pathCnt; i++) - { - Path p = new Path(polyCnt); - foreach (IntPoint ip in pattern) - p.Add(new IntPoint(path[i].X - ip.X, path[i].Y - ip.Y)); - result.Add(p); - } - - Paths quads = new Paths((pathCnt + delta) * (polyCnt + 1)); - for (int i = 0; i < pathCnt - 1 + delta; i++) - for (int j = 0; j < polyCnt; j++) - { - Path quad = new Path(4); - quad.Add(result[i % pathCnt][j % polyCnt]); - quad.Add(result[(i + 1) % pathCnt][j % polyCnt]); - quad.Add(result[(i + 1) % pathCnt][(j + 1) % polyCnt]); - quad.Add(result[i % pathCnt][(j + 1) % polyCnt]); - if (!Orientation(quad)) quad.Reverse(); - quads.Add(quad); - } - return quads; - } - //------------------------------------------------------------------------------ + private const double two_pi = Math.PI * 2; + private const double def_arc_tolerance = 0.25; - public static Paths MinkowskiSum(Path pattern, Path path, bool pathIsClosed) - { - Paths paths = Minkowski(pattern, path, true, pathIsClosed); - Clipper c = new Clipper(); - c.AddPaths(paths, PolyType.ptSubject, true); - c.Execute(ClipType.ctUnion, paths, PolyFillType.pftNonZero, PolyFillType.pftNonZero); - return paths; - } - //------------------------------------------------------------------------------ + public ClipperOffset( + double miterLimit = 2.0, double arcTolerance = def_arc_tolerance) + { + MiterLimit = miterLimit; + ArcTolerance = arcTolerance; + m_lowest.X = -1; + } + //------------------------------------------------------------------------------ - private static Path TranslatePath(Path path, IntPoint delta) - { - Path outPath = new Path(path.Count); - for (int i = 0; i < path.Count; i++) - outPath.Add(new IntPoint(path[i].X + delta.X, path[i].Y + delta.Y)); - return outPath; - } - //------------------------------------------------------------------------------ + public void Clear() + { + m_polyNodes.Childs.Clear(); + m_lowest.X = -1; + } + //------------------------------------------------------------------------------ - public static Paths MinkowskiSum(Path pattern, Paths paths, bool pathIsClosed) - { - Paths solution = new Paths(); - Clipper c = new Clipper(); - for (int i = 0; i < paths.Count; ++i) - { - Paths tmp = Minkowski(pattern, paths[i], true, pathIsClosed); - c.AddPaths(tmp, PolyType.ptSubject, true); - if (pathIsClosed) - { - Path path = TranslatePath(paths[i], pattern[0]); - c.AddPath(path, PolyType.ptClip, true); - } - } - c.Execute(ClipType.ctUnion, solution, - PolyFillType.pftNonZero, PolyFillType.pftNonZero); - return solution; - } - //------------------------------------------------------------------------------ + internal static cInt Round(double value) + { + return value < 0 ? (cInt)(value - 0.5) : (cInt)(value + 0.5); + } + //------------------------------------------------------------------------------ - public static Paths MinkowskiDiff(Path poly1, Path poly2) - { - Paths paths = Minkowski(poly1, poly2, false, true); - Clipper c = new Clipper(); - c.AddPaths(paths, PolyType.ptSubject, true); - c.Execute(ClipType.ctUnion, paths, PolyFillType.pftNonZero, PolyFillType.pftNonZero); - return paths; - } - //------------------------------------------------------------------------------ + public void AddPath(Path path, JoinType joinType, EndType endType) + { + int highI = path.Count - 1; + if (highI < 0) return; + PolyNode newNode = new PolyNode(); + newNode.m_jointype = joinType; + newNode.m_endtype = endType; + + //strip duplicate points from path and also get index to the lowest point ... + if (endType == EndType.etClosedLine || endType == EndType.etClosedPolygon) + while (highI > 0 && path[0] == path[highI]) highI--; + newNode.m_polygon.Capacity = highI + 1; + newNode.m_polygon.Add(path[0]); + int j = 0, k = 0; + for (int i = 1; i <= highI; i++) + if (newNode.m_polygon[j] != path[i]) + { + j++; + newNode.m_polygon.Add(path[i]); + if (path[i].Y > newNode.m_polygon[k].Y || + (path[i].Y == newNode.m_polygon[k].Y && + path[i].X < newNode.m_polygon[k].X)) k = j; + } + if (endType == EndType.etClosedPolygon && j < 2) return; - internal enum NodeType { ntAny, ntOpen, ntClosed }; + m_polyNodes.AddChild(newNode); - public static Paths PolyTreeToPaths(PolyTree polytree) - { + //if this path's lowest pt is lower than all the others then update m_lowest + if (endType != EndType.etClosedPolygon) return; + if (m_lowest.X < 0) + m_lowest = new IntPoint(m_polyNodes.ChildCount - 1, k); + else + { + IntPoint ip = m_polyNodes.Childs[(int)m_lowest.X].m_polygon[(int)m_lowest.Y]; + if (newNode.m_polygon[k].Y > ip.Y || + (newNode.m_polygon[k].Y == ip.Y && + newNode.m_polygon[k].X < ip.X)) + m_lowest = new IntPoint(m_polyNodes.ChildCount - 1, k); + } + } + //------------------------------------------------------------------------------ - Paths result = new Paths(); - result.Capacity = polytree.Total; - AddPolyNodeToPaths(polytree, NodeType.ntAny, result); - return result; - } - //------------------------------------------------------------------------------ + public void AddPaths(Paths paths, JoinType joinType, EndType endType) + { + foreach (Path p in paths) + AddPath(p, joinType, endType); + } + //------------------------------------------------------------------------------ - internal static void AddPolyNodeToPaths(PolyNode polynode, NodeType nt, Paths paths) - { - bool match = true; - switch (nt) + private void FixOrientations() { - case NodeType.ntOpen: return; - case NodeType.ntClosed: match = !polynode.IsOpen; break; - default: break; + //fixup orientations of all closed paths if the orientation of the + //closed path with the lowermost vertex is wrong ... + if (m_lowest.X >= 0 && + !Clipper.Orientation(m_polyNodes.Childs[(int)m_lowest.X].m_polygon)) + { + for (int i = 0; i < m_polyNodes.ChildCount; i++) + { + PolyNode node = m_polyNodes.Childs[i]; + if (node.m_endtype == EndType.etClosedPolygon || + (node.m_endtype == EndType.etClosedLine && + Clipper.Orientation(node.m_polygon))) + node.m_polygon.Reverse(); + } + } + else + { + for (int i = 0; i < m_polyNodes.ChildCount; i++) + { + PolyNode node = m_polyNodes.Childs[i]; + if (node.m_endtype == EndType.etClosedLine && + !Clipper.Orientation(node.m_polygon)) + node.m_polygon.Reverse(); + } + } } + //------------------------------------------------------------------------------ - if (polynode.m_polygon.Count > 0 && match) - paths.Add(polynode.m_polygon); - foreach (PolyNode pn in polynode.Childs) - AddPolyNodeToPaths(pn, nt, paths); - } - //------------------------------------------------------------------------------ + internal static DoublePoint GetUnitNormal(IntPoint pt1, IntPoint pt2) + { + double dx = (pt2.X - pt1.X); + double dy = (pt2.Y - pt1.Y); + if ((dx == 0) && (dy == 0)) return new DoublePoint(); - public static Paths OpenPathsFromPolyTree(PolyTree polytree) - { - Paths result = new Paths(); - result.Capacity = polytree.ChildCount; - for (int i = 0; i < polytree.ChildCount; i++) - if (polytree.Childs[i].IsOpen) - result.Add(polytree.Childs[i].m_polygon); - return result; - } - //------------------------------------------------------------------------------ + double f = 1 * 1.0 / Math.Sqrt(dx * dx + dy * dy); + dx *= f; + dy *= f; - public static Paths ClosedPathsFromPolyTree(PolyTree polytree) - { - Paths result = new Paths(); - result.Capacity = polytree.Total; - AddPolyNodeToPaths(polytree, NodeType.ntClosed, result); - return result; - } - //------------------------------------------------------------------------------ + return new DoublePoint(dy, -dx); + } + //------------------------------------------------------------------------------ - } //end Clipper + private void DoOffset(double delta) + { + m_destPolys = new Paths(); + m_delta = delta; - public class ClipperOffset - { - private Paths m_destPolys; - private Path m_srcPoly; - private Path m_destPoly; - private List m_normals = new List(); - private double m_delta, m_sinA, m_sin, m_cos; - private double m_miterLim, m_StepsPerRad; + //if Zero offset, just copy any CLOSED polygons to m_p and return ... + if (ClipperBase.near_zero(delta)) + { + m_destPolys.Capacity = m_polyNodes.ChildCount; + for (int i = 0; i < m_polyNodes.ChildCount; i++) + { + PolyNode node = m_polyNodes.Childs[i]; + if (node.m_endtype == EndType.etClosedPolygon) + m_destPolys.Add(node.m_polygon); + } + return; + } - private IntPoint m_lowest; - private PolyNode m_polyNodes = new PolyNode(); + //see offset_triginometry3.svg in the documentation folder ... + if (MiterLimit > 2) m_miterLim = 2 / (MiterLimit * MiterLimit); + else m_miterLim = 0.5; - public double ArcTolerance { get; set; } - public double MiterLimit { get; set; } + double y; + if (ArcTolerance <= 0.0) + y = def_arc_tolerance; + else if (ArcTolerance > Math.Abs(delta) * def_arc_tolerance) + y = Math.Abs(delta) * def_arc_tolerance; + else + y = ArcTolerance; + //see offset_triginometry2.svg in the documentation folder ... + double steps = Math.PI / Math.Acos(1 - y / Math.Abs(delta)); + m_sin = Math.Sin(two_pi / steps); + m_cos = Math.Cos(two_pi / steps); + m_StepsPerRad = steps / two_pi; + if (delta < 0.0) m_sin = -m_sin; + + m_destPolys.Capacity = m_polyNodes.ChildCount * 2; + for (int i = 0; i < m_polyNodes.ChildCount; i++) + { + PolyNode node = m_polyNodes.Childs[i]; + m_srcPoly = node.m_polygon; - private const double two_pi = Math.PI * 2; - private const double def_arc_tolerance = 0.25; + int len = m_srcPoly.Count; - public ClipperOffset( - double miterLimit = 2.0, double arcTolerance = def_arc_tolerance) - { - MiterLimit = miterLimit; - ArcTolerance = arcTolerance; - m_lowest.X = -1; - } - //------------------------------------------------------------------------------ + if (len == 0 || (delta <= 0 && (len < 3 || + node.m_endtype != EndType.etClosedPolygon))) + continue; - public void Clear() - { - m_polyNodes.Childs.Clear(); - m_lowest.X = -1; - } - //------------------------------------------------------------------------------ + m_destPoly = new Path(); - internal static cInt Round(double value) - { - return value < 0 ? (cInt)(value - 0.5) : (cInt)(value + 0.5); - } - //------------------------------------------------------------------------------ + if (len == 1) + { + if (node.m_jointype == JoinType.jtRound) + { + double X = 1.0, Y = 0.0; + for (int j = 1; j <= steps; j++) + { + m_destPoly.Add(new IntPoint( + Round(m_srcPoly[0].X + X * delta), + Round(m_srcPoly[0].Y + Y * delta))); + double X2 = X; + X = X * m_cos - m_sin * Y; + Y = X2 * m_sin + Y * m_cos; + } + } + else + { + double X = -1.0, Y = -1.0; + for (int j = 0; j < 4; ++j) + { + m_destPoly.Add(new IntPoint( + Round(m_srcPoly[0].X + X * delta), + Round(m_srcPoly[0].Y + Y * delta))); + if (X < 0) X = 1; + else if (Y < 0) Y = 1; + else X = -1; + } + } + m_destPolys.Add(m_destPoly); + continue; + } - public void AddPath(Path path, JoinType joinType, EndType endType) - { - int highI = path.Count - 1; - if (highI < 0) return; - PolyNode newNode = new PolyNode(); - newNode.m_jointype = joinType; - newNode.m_endtype = endType; - - //strip duplicate points from path and also get index to the lowest point ... - if (endType == EndType.etClosedLine || endType == EndType.etClosedPolygon) - while (highI > 0 && path[0] == path[highI]) highI--; - newNode.m_polygon.Capacity = highI + 1; - newNode.m_polygon.Add(path[0]); - int j = 0, k = 0; - for (int i = 1; i <= highI; i++) - if (newNode.m_polygon[j] != path[i]) - { - j++; - newNode.m_polygon.Add(path[i]); - if (path[i].Y > newNode.m_polygon[k].Y || - (path[i].Y == newNode.m_polygon[k].Y && - path[i].X < newNode.m_polygon[k].X)) k = j; - } - if (endType == EndType.etClosedPolygon && j < 2) return; - - m_polyNodes.AddChild(newNode); - - //if this path's lowest pt is lower than all the others then update m_lowest - if (endType != EndType.etClosedPolygon) return; - if (m_lowest.X < 0) - m_lowest = new IntPoint(m_polyNodes.ChildCount - 1, k); - else - { - IntPoint ip = m_polyNodes.Childs[(int)m_lowest.X].m_polygon[(int)m_lowest.Y]; - if (newNode.m_polygon[k].Y > ip.Y || - (newNode.m_polygon[k].Y == ip.Y && - newNode.m_polygon[k].X < ip.X)) - m_lowest = new IntPoint(m_polyNodes.ChildCount - 1, k); - } - } - //------------------------------------------------------------------------------ + //build m_normals ... + m_normals.Clear(); + m_normals.Capacity = len; + for (int j = 0; j < len - 1; j++) + m_normals.Add(GetUnitNormal(m_srcPoly[j], m_srcPoly[j + 1])); + if (node.m_endtype == EndType.etClosedLine || + node.m_endtype == EndType.etClosedPolygon) + m_normals.Add(GetUnitNormal(m_srcPoly[len - 1], m_srcPoly[0])); + else + m_normals.Add(new DoublePoint(m_normals[len - 2])); - public void AddPaths(Paths paths, JoinType joinType, EndType endType) - { - foreach (Path p in paths) - AddPath(p, joinType, endType); - } - //------------------------------------------------------------------------------ + if (node.m_endtype == EndType.etClosedPolygon) + { + int k = len - 1; + for (int j = 0; j < len; j++) + OffsetPoint(j, ref k, node.m_jointype); + m_destPolys.Add(m_destPoly); + } + else if (node.m_endtype == EndType.etClosedLine) + { + int k = len - 1; + for (int j = 0; j < len; j++) + OffsetPoint(j, ref k, node.m_jointype); + m_destPolys.Add(m_destPoly); + m_destPoly = new Path(); + //re-build m_normals ... + DoublePoint n = m_normals[len - 1]; + for (int j = len - 1; j > 0; j--) + m_normals[j] = new DoublePoint(-m_normals[j - 1].X, -m_normals[j - 1].Y); + m_normals[0] = new DoublePoint(-n.X, -n.Y); + k = 0; + for (int j = len - 1; j >= 0; j--) + OffsetPoint(j, ref k, node.m_jointype); + m_destPolys.Add(m_destPoly); + } + else + { + int k = 0; + for (int j = 1; j < len - 1; ++j) + OffsetPoint(j, ref k, node.m_jointype); - private void FixOrientations() - { - //fixup orientations of all closed paths if the orientation of the - //closed path with the lowermost vertex is wrong ... - if (m_lowest.X >= 0 && - !Clipper.Orientation(m_polyNodes.Childs[(int)m_lowest.X].m_polygon)) - { - for (int i = 0; i < m_polyNodes.ChildCount; i++) - { - PolyNode node = m_polyNodes.Childs[i]; - if (node.m_endtype == EndType.etClosedPolygon || - (node.m_endtype == EndType.etClosedLine && - Clipper.Orientation(node.m_polygon))) - node.m_polygon.Reverse(); - } - } - else - { - for (int i = 0; i < m_polyNodes.ChildCount; i++) - { - PolyNode node = m_polyNodes.Childs[i]; - if (node.m_endtype == EndType.etClosedLine && - !Clipper.Orientation(node.m_polygon)) - node.m_polygon.Reverse(); - } - } - } - //------------------------------------------------------------------------------ + IntPoint pt1; + if (node.m_endtype == EndType.etOpenButt) + { + int j = len - 1; + pt1 = new IntPoint((cInt)Round(m_srcPoly[j].X + m_normals[j].X * + delta), (cInt)Round(m_srcPoly[j].Y + m_normals[j].Y * delta)); + m_destPoly.Add(pt1); + pt1 = new IntPoint((cInt)Round(m_srcPoly[j].X - m_normals[j].X * + delta), (cInt)Round(m_srcPoly[j].Y - m_normals[j].Y * delta)); + m_destPoly.Add(pt1); + } + else + { + int j = len - 1; + k = len - 2; + m_sinA = 0; + m_normals[j] = new DoublePoint(-m_normals[j].X, -m_normals[j].Y); + if (node.m_endtype == EndType.etOpenSquare) + DoSquare(j, k); + else + DoRound(j, k); + } - internal static DoublePoint GetUnitNormal(IntPoint pt1, IntPoint pt2) - { - double dx = (pt2.X - pt1.X); - double dy = (pt2.Y - pt1.Y); - if ((dx == 0) && (dy == 0)) return new DoublePoint(); + //re-build m_normals ... + for (int j = len - 1; j > 0; j--) + m_normals[j] = new DoublePoint(-m_normals[j - 1].X, -m_normals[j - 1].Y); - double f = 1 * 1.0 / Math.Sqrt(dx * dx + dy * dy); - dx *= f; - dy *= f; + m_normals[0] = new DoublePoint(-m_normals[1].X, -m_normals[1].Y); - return new DoublePoint(dy, -dx); - } - //------------------------------------------------------------------------------ + k = len - 1; + for (int j = k - 1; j > 0; --j) + OffsetPoint(j, ref k, node.m_jointype); - private void DoOffset(double delta) - { - m_destPolys = new Paths(); - m_delta = delta; + if (node.m_endtype == EndType.etOpenButt) + { + pt1 = new IntPoint((cInt)Round(m_srcPoly[0].X - m_normals[0].X * delta), + (cInt)Round(m_srcPoly[0].Y - m_normals[0].Y * delta)); + m_destPoly.Add(pt1); + pt1 = new IntPoint((cInt)Round(m_srcPoly[0].X + m_normals[0].X * delta), + (cInt)Round(m_srcPoly[0].Y + m_normals[0].Y * delta)); + m_destPoly.Add(pt1); + } + else + { + k = 1; + m_sinA = 0; + if (node.m_endtype == EndType.etOpenSquare) + DoSquare(0, 1); + else + DoRound(0, 1); + } + m_destPolys.Add(m_destPoly); + } + } + } + //------------------------------------------------------------------------------ - //if Zero offset, just copy any CLOSED polygons to m_p and return ... - if (ClipperBase.near_zero(delta)) - { - m_destPolys.Capacity = m_polyNodes.ChildCount; - for (int i = 0; i < m_polyNodes.ChildCount; i++) + public void Execute(ref Paths solution, double delta) { - PolyNode node = m_polyNodes.Childs[i]; - if (node.m_endtype == EndType.etClosedPolygon) - m_destPolys.Add(node.m_polygon); + solution.Clear(); + FixOrientations(); + DoOffset(delta); + //now clean up 'corners' ... + Clipper clpr = new Clipper(); + clpr.AddPaths(m_destPolys, PolyType.ptSubject, true); + if (delta > 0) + { + clpr.Execute(ClipType.ctUnion, solution, + PolyFillType.pftPositive, PolyFillType.pftPositive); + } + else + { + IntRect r = Clipper.GetBounds(m_destPolys); + Path outer = new Path(4); + + outer.Add(new IntPoint(r.left - 10, r.bottom + 10)); + outer.Add(new IntPoint(r.right + 10, r.bottom + 10)); + outer.Add(new IntPoint(r.right + 10, r.top - 10)); + outer.Add(new IntPoint(r.left - 10, r.top - 10)); + + clpr.AddPath(outer, PolyType.ptSubject, true); + clpr.ReverseSolution = true; + clpr.Execute(ClipType.ctUnion, solution, PolyFillType.pftNegative, PolyFillType.pftNegative); + if (solution.Count > 0) solution.RemoveAt(0); + } } - return; - } + //------------------------------------------------------------------------------ - //see offset_triginometry3.svg in the documentation folder ... - if (MiterLimit > 2) m_miterLim = 2 / (MiterLimit * MiterLimit); - else m_miterLim = 0.5; - - double y; - if (ArcTolerance <= 0.0) - y = def_arc_tolerance; - else if (ArcTolerance > Math.Abs(delta) * def_arc_tolerance) - y = Math.Abs(delta) * def_arc_tolerance; - else - y = ArcTolerance; - //see offset_triginometry2.svg in the documentation folder ... - double steps = Math.PI / Math.Acos(1 - y / Math.Abs(delta)); - m_sin = Math.Sin(two_pi / steps); - m_cos = Math.Cos(two_pi / steps); - m_StepsPerRad = steps / two_pi; - if (delta < 0.0) m_sin = -m_sin; - - m_destPolys.Capacity = m_polyNodes.ChildCount * 2; - for (int i = 0; i < m_polyNodes.ChildCount; i++) - { - PolyNode node = m_polyNodes.Childs[i]; - m_srcPoly = node.m_polygon; - - int len = m_srcPoly.Count; - - if (len == 0 || (delta <= 0 && (len < 3 || - node.m_endtype != EndType.etClosedPolygon))) - continue; - - m_destPoly = new Path(); - - if (len == 1) - { - if (node.m_jointype == JoinType.jtRound) - { - double X = 1.0, Y = 0.0; - for (int j = 1; j <= steps; j++) - { - m_destPoly.Add(new IntPoint( - Round(m_srcPoly[0].X + X * delta), - Round(m_srcPoly[0].Y + Y * delta))); - double X2 = X; - X = X * m_cos - m_sin * Y; - Y = X2 * m_sin + Y * m_cos; - } - } - else - { - double X = -1.0, Y = -1.0; - for (int j = 0; j < 4; ++j) - { - m_destPoly.Add(new IntPoint( - Round(m_srcPoly[0].X + X * delta), - Round(m_srcPoly[0].Y + Y * delta))); - if (X < 0) X = 1; - else if (Y < 0) Y = 1; - else X = -1; - } - } - m_destPolys.Add(m_destPoly); - continue; - } - - //build m_normals ... - m_normals.Clear(); - m_normals.Capacity = len; - for (int j = 0; j < len - 1; j++) - m_normals.Add(GetUnitNormal(m_srcPoly[j], m_srcPoly[j + 1])); - if (node.m_endtype == EndType.etClosedLine || - node.m_endtype == EndType.etClosedPolygon) - m_normals.Add(GetUnitNormal(m_srcPoly[len - 1], m_srcPoly[0])); - else - m_normals.Add(new DoublePoint(m_normals[len - 2])); - - if (node.m_endtype == EndType.etClosedPolygon) - { - int k = len - 1; - for (int j = 0; j < len; j++) - OffsetPoint(j, ref k, node.m_jointype); - m_destPolys.Add(m_destPoly); - } - else if (node.m_endtype == EndType.etClosedLine) - { - int k = len - 1; - for (int j = 0; j < len; j++) - OffsetPoint(j, ref k, node.m_jointype); - m_destPolys.Add(m_destPoly); - m_destPoly = new Path(); - //re-build m_normals ... - DoublePoint n = m_normals[len - 1]; - for (int j = len - 1; j > 0; j--) - m_normals[j] = new DoublePoint(-m_normals[j - 1].X, -m_normals[j - 1].Y); - m_normals[0] = new DoublePoint(-n.X, -n.Y); - k = 0; - for (int j = len - 1; j >= 0; j--) - OffsetPoint(j, ref k, node.m_jointype); - m_destPolys.Add(m_destPoly); - } - else - { - int k = 0; - for (int j = 1; j < len - 1; ++j) - OffsetPoint(j, ref k, node.m_jointype); - - IntPoint pt1; - if (node.m_endtype == EndType.etOpenButt) - { - int j = len - 1; - pt1 = new IntPoint((cInt)Round(m_srcPoly[j].X + m_normals[j].X * - delta), (cInt)Round(m_srcPoly[j].Y + m_normals[j].Y * delta)); - m_destPoly.Add(pt1); - pt1 = new IntPoint((cInt)Round(m_srcPoly[j].X - m_normals[j].X * - delta), (cInt)Round(m_srcPoly[j].Y - m_normals[j].Y * delta)); - m_destPoly.Add(pt1); - } - else - { - int j = len - 1; - k = len - 2; - m_sinA = 0; - m_normals[j] = new DoublePoint(-m_normals[j].X, -m_normals[j].Y); - if (node.m_endtype == EndType.etOpenSquare) - DoSquare(j, k); - else - DoRound(j, k); - } - - //re-build m_normals ... - for (int j = len - 1; j > 0; j--) - m_normals[j] = new DoublePoint(-m_normals[j - 1].X, -m_normals[j - 1].Y); - - m_normals[0] = new DoublePoint(-m_normals[1].X, -m_normals[1].Y); - - k = len - 1; - for (int j = k - 1; j > 0; --j) - OffsetPoint(j, ref k, node.m_jointype); - - if (node.m_endtype == EndType.etOpenButt) - { - pt1 = new IntPoint((cInt)Round(m_srcPoly[0].X - m_normals[0].X * delta), - (cInt)Round(m_srcPoly[0].Y - m_normals[0].Y * delta)); - m_destPoly.Add(pt1); - pt1 = new IntPoint((cInt)Round(m_srcPoly[0].X + m_normals[0].X * delta), - (cInt)Round(m_srcPoly[0].Y + m_normals[0].Y * delta)); - m_destPoly.Add(pt1); - } - else - { - k = 1; - m_sinA = 0; - if (node.m_endtype == EndType.etOpenSquare) - DoSquare(0, 1); + public void Execute(ref PolyTree solution, double delta) + { + solution.Clear(); + FixOrientations(); + DoOffset(delta); + + //now clean up 'corners' ... + Clipper clpr = new Clipper(); + clpr.AddPaths(m_destPolys, PolyType.ptSubject, true); + if (delta > 0) + { + clpr.Execute(ClipType.ctUnion, solution, + PolyFillType.pftPositive, PolyFillType.pftPositive); + } else - DoRound(0, 1); - } - m_destPolys.Add(m_destPoly); + { + IntRect r = Clipper.GetBounds(m_destPolys); + Path outer = new Path(4); + + outer.Add(new IntPoint(r.left - 10, r.bottom + 10)); + outer.Add(new IntPoint(r.right + 10, r.bottom + 10)); + outer.Add(new IntPoint(r.right + 10, r.top - 10)); + outer.Add(new IntPoint(r.left - 10, r.top - 10)); + + clpr.AddPath(outer, PolyType.ptSubject, true); + clpr.ReverseSolution = true; + clpr.Execute(ClipType.ctUnion, solution, PolyFillType.pftNegative, PolyFillType.pftNegative); + //remove the outer PolyNode rectangle ... + if (solution.ChildCount == 1 && solution.Childs[0].ChildCount > 0) + { + PolyNode outerNode = solution.Childs[0]; + solution.Childs.Capacity = outerNode.ChildCount; + solution.Childs[0] = outerNode.Childs[0]; + solution.Childs[0].m_Parent = solution; + for (int i = 1; i < outerNode.ChildCount; i++) + solution.AddChild(outerNode.Childs[i]); + } + else + solution.Clear(); + } } - } - } - //------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ - public void Execute(ref Paths solution, double delta) - { - solution.Clear(); - FixOrientations(); - DoOffset(delta); - //now clean up 'corners' ... - Clipper clpr = new Clipper(); - clpr.AddPaths(m_destPolys, PolyType.ptSubject, true); - if (delta > 0) - { - clpr.Execute(ClipType.ctUnion, solution, - PolyFillType.pftPositive, PolyFillType.pftPositive); - } - else - { - IntRect r = Clipper.GetBounds(m_destPolys); - Path outer = new Path(4); - - outer.Add(new IntPoint(r.left - 10, r.bottom + 10)); - outer.Add(new IntPoint(r.right + 10, r.bottom + 10)); - outer.Add(new IntPoint(r.right + 10, r.top - 10)); - outer.Add(new IntPoint(r.left - 10, r.top - 10)); - - clpr.AddPath(outer, PolyType.ptSubject, true); - clpr.ReverseSolution = true; - clpr.Execute(ClipType.ctUnion, solution, PolyFillType.pftNegative, PolyFillType.pftNegative); - if (solution.Count > 0) solution.RemoveAt(0); - } - } - //------------------------------------------------------------------------------ + void OffsetPoint(int j, ref int k, JoinType jointype) + { + //cross product ... + m_sinA = (m_normals[k].X * m_normals[j].Y - m_normals[j].X * m_normals[k].Y); - public void Execute(ref PolyTree solution, double delta) - { - solution.Clear(); - FixOrientations(); - DoOffset(delta); - - //now clean up 'corners' ... - Clipper clpr = new Clipper(); - clpr.AddPaths(m_destPolys, PolyType.ptSubject, true); - if (delta > 0) - { - clpr.Execute(ClipType.ctUnion, solution, - PolyFillType.pftPositive, PolyFillType.pftPositive); - } - else - { - IntRect r = Clipper.GetBounds(m_destPolys); - Path outer = new Path(4); - - outer.Add(new IntPoint(r.left - 10, r.bottom + 10)); - outer.Add(new IntPoint(r.right + 10, r.bottom + 10)); - outer.Add(new IntPoint(r.right + 10, r.top - 10)); - outer.Add(new IntPoint(r.left - 10, r.top - 10)); - - clpr.AddPath(outer, PolyType.ptSubject, true); - clpr.ReverseSolution = true; - clpr.Execute(ClipType.ctUnion, solution, PolyFillType.pftNegative, PolyFillType.pftNegative); - //remove the outer PolyNode rectangle ... - if (solution.ChildCount == 1 && solution.Childs[0].ChildCount > 0) - { - PolyNode outerNode = solution.Childs[0]; - solution.Childs.Capacity = outerNode.ChildCount; - solution.Childs[0] = outerNode.Childs[0]; - solution.Childs[0].m_Parent = solution; - for (int i = 1; i < outerNode.ChildCount; i++) - solution.AddChild(outerNode.Childs[i]); - } - else - solution.Clear(); - } - } - //------------------------------------------------------------------------------ + if (Math.Abs(m_sinA * m_delta) < 1.0) + { + //dot product ... + double cosA = (m_normals[k].X * m_normals[j].X + m_normals[j].Y * m_normals[k].Y); + if (cosA > 0) // angle ==> 0 degrees + { + m_destPoly.Add(new IntPoint(Round(m_srcPoly[j].X + m_normals[k].X * m_delta), + Round(m_srcPoly[j].Y + m_normals[k].Y * m_delta))); + return; + } + //else angle ==> 180 degrees + } + else if (m_sinA > 1.0) m_sinA = 1.0; + else if (m_sinA < -1.0) m_sinA = -1.0; - void OffsetPoint(int j, ref int k, JoinType jointype) - { - //cross product ... - m_sinA = (m_normals[k].X * m_normals[j].Y - m_normals[j].X * m_normals[k].Y); + if (m_sinA * m_delta < 0) + { + m_destPoly.Add(new IntPoint(Round(m_srcPoly[j].X + m_normals[k].X * m_delta), + Round(m_srcPoly[j].Y + m_normals[k].Y * m_delta))); + m_destPoly.Add(m_srcPoly[j]); + m_destPoly.Add(new IntPoint(Round(m_srcPoly[j].X + m_normals[j].X * m_delta), + Round(m_srcPoly[j].Y + m_normals[j].Y * m_delta))); + } + else + switch (jointype) + { + case JoinType.jtMiter: + { + double r = 1 + (m_normals[j].X * m_normals[k].X + + m_normals[j].Y * m_normals[k].Y); + if (r >= m_miterLim) DoMiter(j, k, r); else DoSquare(j, k); + break; + } + case JoinType.jtSquare: DoSquare(j, k); break; + case JoinType.jtRound: DoRound(j, k); break; + } + k = j; + } + //------------------------------------------------------------------------------ - if (Math.Abs(m_sinA * m_delta) < 1.0) - { - //dot product ... - double cosA = (m_normals[k].X * m_normals[j].X + m_normals[j].Y * m_normals[k].Y); - if (cosA > 0) // angle ==> 0 degrees + internal void DoSquare(int j, int k) { - m_destPoly.Add(new IntPoint(Round(m_srcPoly[j].X + m_normals[k].X * m_delta), - Round(m_srcPoly[j].Y + m_normals[k].Y * m_delta))); - return; + double dx = Math.Tan(Math.Atan2(m_sinA, + m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y) / 4); + m_destPoly.Add(new IntPoint( + Round(m_srcPoly[j].X + m_delta * (m_normals[k].X - m_normals[k].Y * dx)), + Round(m_srcPoly[j].Y + m_delta * (m_normals[k].Y + m_normals[k].X * dx)))); + m_destPoly.Add(new IntPoint( + Round(m_srcPoly[j].X + m_delta * (m_normals[j].X + m_normals[j].Y * dx)), + Round(m_srcPoly[j].Y + m_delta * (m_normals[j].Y - m_normals[j].X * dx)))); } - //else angle ==> 180 degrees - } - else if (m_sinA > 1.0) m_sinA = 1.0; - else if (m_sinA < -1.0) m_sinA = -1.0; - - if (m_sinA * m_delta < 0) - { - m_destPoly.Add(new IntPoint(Round(m_srcPoly[j].X + m_normals[k].X * m_delta), - Round(m_srcPoly[j].Y + m_normals[k].Y * m_delta))); - m_destPoly.Add(m_srcPoly[j]); - m_destPoly.Add(new IntPoint(Round(m_srcPoly[j].X + m_normals[j].X * m_delta), - Round(m_srcPoly[j].Y + m_normals[j].Y * m_delta))); - } - else - switch (jointype) + //------------------------------------------------------------------------------ + + internal void DoMiter(int j, int k, double r) { - case JoinType.jtMiter: - { - double r = 1 + (m_normals[j].X * m_normals[k].X + - m_normals[j].Y * m_normals[k].Y); - if (r >= m_miterLim) DoMiter(j, k, r); else DoSquare(j, k); - break; - } - case JoinType.jtSquare: DoSquare(j, k); break; - case JoinType.jtRound: DoRound(j, k); break; + double q = m_delta / r; + m_destPoly.Add(new IntPoint(Round(m_srcPoly[j].X + (m_normals[k].X + m_normals[j].X) * q), + Round(m_srcPoly[j].Y + (m_normals[k].Y + m_normals[j].Y) * q))); } - k = j; - } - //------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ - internal void DoSquare(int j, int k) - { - double dx = Math.Tan(Math.Atan2(m_sinA, - m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y) / 4); - m_destPoly.Add(new IntPoint( - Round(m_srcPoly[j].X + m_delta * (m_normals[k].X - m_normals[k].Y * dx)), - Round(m_srcPoly[j].Y + m_delta * (m_normals[k].Y + m_normals[k].X * dx)))); - m_destPoly.Add(new IntPoint( - Round(m_srcPoly[j].X + m_delta * (m_normals[j].X + m_normals[j].Y * dx)), - Round(m_srcPoly[j].Y + m_delta * (m_normals[j].Y - m_normals[j].X * dx)))); - } - //------------------------------------------------------------------------------ + internal void DoRound(int j, int k) + { + double a = Math.Atan2(m_sinA, + m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y); + int steps = Math.Max((int)Round(m_StepsPerRad * Math.Abs(a)), 1); - internal void DoMiter(int j, int k, double r) - { - double q = m_delta / r; - m_destPoly.Add(new IntPoint(Round(m_srcPoly[j].X + (m_normals[k].X + m_normals[j].X) * q), - Round(m_srcPoly[j].Y + (m_normals[k].Y + m_normals[j].Y) * q))); + double X = m_normals[k].X, Y = m_normals[k].Y, X2; + for (int i = 0; i < steps; ++i) + { + m_destPoly.Add(new IntPoint( + Round(m_srcPoly[j].X + X * m_delta), + Round(m_srcPoly[j].Y + Y * m_delta))); + X2 = X; + X = X * m_cos - m_sin * Y; + Y = X2 * m_sin + Y * m_cos; + } + m_destPoly.Add(new IntPoint( + Round(m_srcPoly[j].X + m_normals[j].X * m_delta), + Round(m_srcPoly[j].Y + m_normals[j].Y * m_delta))); + } + //------------------------------------------------------------------------------ } - //------------------------------------------------------------------------------ - internal void DoRound(int j, int k) + class ClipperException : Exception { - double a = Math.Atan2(m_sinA, - m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y); - int steps = Math.Max((int)Round(m_StepsPerRad * Math.Abs(a)),1); - - double X = m_normals[k].X, Y = m_normals[k].Y, X2; - for (int i = 0; i < steps; ++i) - { - m_destPoly.Add(new IntPoint( - Round(m_srcPoly[j].X + X * m_delta), - Round(m_srcPoly[j].Y + Y * m_delta))); - X2 = X; - X = X * m_cos - m_sin * Y; - Y = X2 * m_sin + Y * m_cos; - } - m_destPoly.Add(new IntPoint( - Round(m_srcPoly[j].X + m_normals[j].X * m_delta), - Round(m_srcPoly[j].Y + m_normals[j].Y * m_delta))); + public ClipperException(string description) : base(description) { } } //------------------------------------------------------------------------------ - } - - class ClipperException : Exception - { - public ClipperException(string description) : base(description){} - } - //------------------------------------------------------------------------------ } //end ClipperLib namespace diff --git a/clipper-0.2.2-rhino6.rhi b/clipper-0.2.2-rhino6.rhi new file mode 100644 index 0000000000000000000000000000000000000000..21ad0a71c495b2a641be0510ebdd16e010990b87 GIT binary patch literal 99311 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 AZvX%Q literal 0 HcmV?d00001 diff --git a/clipper-0.2.3-rhino6.rhi b/clipper-0.2.3-rhino6.rhi new file mode 100644 index 0000000000000000000000000000000000000000..91636f023f8ac2e7c99e2c365fe3a1c1d46be353 GIT binary patch literal 99474 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%0Dh=H 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 Z{{~A!iU%Pe!+**V5fCVZ-@yO${{eKEJb(ZI literal 0 HcmV?d00001 diff --git a/clipper-0.2.3-rhino6/ClipperComponents.gha b/clipper-0.2.3-rhino6/ClipperComponents.gha new file mode 100644 index 0000000000000000000000000000000000000000..97a0f5085e368b5c14920567a19bbd0b78cf6940 GIT binary patch literal 21504 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 literal 0 HcmV?d00001 diff --git a/clipper-0.2.3-rhino6/ClipperPlugin.rhp b/clipper-0.2.3-rhino6/ClipperPlugin.rhp new file mode 100644 index 0000000000000000000000000000000000000000..4ec533d532cdc2a5a6e93075613a1e4fa89d4efd GIT binary patch literal 19456 zcmeHvdw5*ck!Ri8w{Jhx-BPz~N!YS!zuT52>tP$)ysU?9491cz`2levx7637?N;CR z?Us!YGIDr&V`f5@BttSJ5QeZUA>c2Q0kR>%gkcsknGD%D8IzEZWSFdHlMG~Mm}Igs z^Q$_yACe(6`EU2zX>seEs#B*-$o2qi(_SMFtV=n03McgHJ*y!M%79M zh3L!ZKmS-aoxHRkW`A=PktWpNAI#S$W)lThAg$wcx1Oj+s(U7xtQ(U;C8}-p(4`QM zcA}m!z_~$l<*GyjGl>LKpnVYtE9(<;gwAzMk!#OIc17KaZ^gg+)J@0Y%XjU1`1*>< zHijy=*Cm(h+VhyaqPEpXcS(OKI?F-ZxrV!EL6s$Ss_9^iV%quH@P@g*lMI_@9pA}Q!DypOFkmlZSYKx+kX{^WK^5OI zp*P-~5g$RmDc9%&4!vBjn=kC|?ovHMGo&`Y!7DGnWeY zDhh>x%%)Gdx_5xPB3oZ?uLk89#;npfJ*bjjgMuYfT#~>@Hr3f{L0Ia_hmlS5ym=)v zUIKaoBi&SMR)~(8_ByUm#}1`@CJJu&3|vQiM$$P>FKkuxnPV6?xKcE~39Rfh=&j+5 zf@6ly_>N%|l*$++IKWoc1g3<_Tv8s-1mrb^^@%X3Jf@d}agq^5GAFo+_Z(C78FplL z=hNjeWxP11DzC@Z_InafO_Y5V2U%peOZ|umNcVY8Cxk*W9w~bX^DC- zDpgQpD-2x0`34k=dQY;;B+z!S>4UCh*q;Y!Gm?ryGMt~ILVW@;FSyk0KD$NKC=QrY zjFbt4IaBv?%rkX^qngR#6!Ftou}}q49!ZXaiXa&f5NH)aGMn`Tf~R@16B<4oK)6BN zGYFDknyZ|E4t?RP!JBw_Fwrj$t%nRh%h>M9z^pFI=q<@WJ5AGN7)q6^ z_52oyoa9#Z#8t?yXxAsOjuthQ(hAai*qUU z33zyL1T8DS<^`A7{<_s3H7I5ImXDZKh6IfDo_!eo&jg z`GZi@yV3{r13_C5AXbYH~+8HS))zjx02tDJv=3;1L_RP69c1W6o# z94G049|^ZGxLM43Eir;}<$^xm(ZGn(vCp`D6%(j#UtobaTL6;{gIk_#FhLoCSCtX? zOc{YIl;`9YA^BF~NX8I`ddIC!Y z3K5!3-n}QXLc~VQRJ%e1RK2__^d~Uen>e;c;h$%hI-^uk`^8KsukO;^+XVO^ z9a-Jd+S1Y5(T4Hn)d#bY{BWv8FkJ!ZJ}A7Xzu=^^BYEcd>jgx-a4y=_PrpKl!Q`Vw zTXt>j;d&T||A`IBqOOcR#LW2VSc~?|`%EA(AIQIG9fZxXhU`u}Y!4WW;L`-_$sIrt z>E(FPEbl=Hixb81FfZ5h;z1K~KUV9eME~UHGIW-1^{uNi=}m#n=8M5<+FONw(?`8$ zs)BTl?+i+F=EDJ#4)_?Z6!=|%4+;FT!25+~pLr4ZFBW)CD5jJ?ZGOpb!r0u_Z$d%H z`MLMSph=x*(WF-ZgVY}27QbV>iTs@=!(I==N5c&J^f+LTls@dgGZds>g`$wNKwG8< z$?TlA^FzGkx8NeVN&{_Wb0Zr-=$=~s_i=(qAAFIx!xFoHL}ptq*=k^;C~^&J^B&!gk+Qk>4``j^7{ln7~W7F zp@+TI(EroHpP=ppdJ&{AR58y6Z@jvW?hC#KJAVZ-W3)=+w$`98L3%oTCp#~_B*QNL zjKJ_=U_0O?{8vMJ1A7BW+`ae&yV!F!I0~;p$H8^Ndp7tWyro*o)=F83eGX-DDT@$} zS-=(>%o$}2GQSgeyJ`n~QDJ`{e!J=vHOM_=4Q&s-U6r7VXn}Bs1iP4;$pg)JXSaiv z(iP-cP(zC_DR$5@+E`K6M4KwgR?-$Jg96}e!Nnm)zc{PX+!8@Swoi2IoH-WOx7+ z=KmJ>7lyu5;`ex8Md=^4we;tjY1YA>LBMYd zENFFRxpa|RYSP)r*S#j4H-21#8zRd@!bKcnsK$g1tzmtCngW`l^eqGq6{re{`{L`)`5Q-NjBpcc31k27OGhkNJP&*=QPc zzhL+H{l+F>4_9z{=?f*!YfLYFsl?d_?0Lan^#8)R1)ltug1tc7JiF2Fv$FA3?fL1a zf^mC;rk{Qx7`K-K_O@V33gRmEn}m}SO9{|_LVQx^5(thj%ih9na6AJVH4fLE#A9FF*dM-WWVwPY}y4c|$mp$uZ+@rbl zvWqo`PnmP+yDrukehOG+Z|BnAx@B?WS(N>w!lZw5X&-heZ0pOyCe5QW*oy;`{>`J; z6-Lp>n0FpsjU5Yfo~U}>oKG3SRBtb)R%~5}Zl#wzCdFw;Fy(`Bnwo~)<#Il*{goM~ zPYQNV!&igfH5W|dTtJVwoLlL8C@W&G0b58tPs~Nr>Mf?H+_D<9u$W%1Xkp1T z&Lt(8+`{y-rSvzhl*j33=F(~PmeH@>vO7_>Y+6}@LfEmfB|d?&#I&;I6nD!`(=W~C zv`sM8_oiu_O|;kL{1?)E9PKq~z&2N>UwSxy0%x1)@H(t3I&H)5tVpkvZWXvg;B^9%0@DHy z12)pQWw?pwm+8tb*EOp{GgHxUF;A=lqSxe=ztW@`*@2@;c_AroC)@ zgI0t8b*z-3@ZZsW+HP+^)3iSeHEQSRHpGPoW!*Way@MVlwT5t$_G_)x+oqkTJ&)T1NY+Hb7(g z+n}4(hJH?aHQ?7T(*GGzexIw`P2qZdf$+bj9YlTrbnF+UcWG_Jzfe02c&VNS*0bKjpfhJu<7my+yG!7QJ-3Pc+eH3J$)A+`y^_CI^7m<*!oT&rrQH<% z9Q4^?Y%~5CrE0v67=PmC8>*i$PH6+-9~qw`-cg*;C}Mb%+H2vU_muXrK+Jmr)|>A= ztiKart-cvac%RX7fp+gXtpS{;v_P=ao7QghU**;GtG(BHe~nYX`@Hw)Sv~0u=%=d= zd0)~_SLM7>jU)8u(C#rn-mmznkv_d_drX0v{6ioWRopUl;fzf#eY#1a1^~1s$dj(>>Z5?f+ubf0IDXRT+S=Wjhf_q^>%84nmgHH;|? z1b#Y3N&WU><-*cg`hCbd2kR!^Q1B1SCVuyN|2MeQuUzxLW7V8l_pEm&?SAiTSU>sh z&cOcLfW=JM(1f*uupiFqcxJ)Ev+=09JF#}M+>Ka+8|V^(TOnPKbQji}U35L3o3%VW zr;XE(wG*^bzZ=gwx)#q){ZY`L!1F~s>*(X2b@a!0KI8czbsBHbM~rjyvhhRQc6jJf z*x+%r^C+IjrER+Gis8Y*o^(E!Nsf1ClKFi5VC#j%j&~!j7UKHB!F8P3IhO6VM@N&{ z)D=T6X{Ko5n@Mb6&$YK$g-zM9(cQ_+n8o!$>c5b*E0;EuHI2CG@K`dFE{vo5 zxujz`%;z!`Y{s^w^93XW_SS5nqh0B+ZV;L2jS1jb3>k=-5;Tn(7ox!3dsV9Bl0KB}YdVe})5ehl! z9V#VTBt%-_%rwF&)Z^@+b%TX3d12Vv zZD)^IP9e?Q5TT}ck3BXGAFxM8P(GL%&n8FH!+nl*gas=qG`e;yQ%L8)(O(z`Z3>QURPZPYy%F8rBloOn1rDR;2avh0Y zsm*Cj$bu@%S=kD-G-L5Wn=&*~YiMj_#B#bE`>5ExzkqNGZAWuy_^Qlk5K^55yi^#1 zBg!l+W2!z6*i2f5%yJRr?oQ`0o#^C23bY|U1TUAd^(_`4P=^NX;ZRwj9)i1OW=4jjc`Q7ZcY~lY?(F)IMQ7DCJ7}wtpn6KJZ$9(+wB6@n33X=yu+>YkA`8ztrgxzx*+U15s~itlI@^-UWGI($nbiW;vNf9 zyhsf*8sS*v&RXhDW`@Tym^&qcT1ZtBbS?H(yRz^qvU7vGvPoxryEP)?T-0$3Udv$< zag!o~tAA{$;3Op)6?tF-clCvF3h-gI6!ZM$Z5Kx+6*q|$b+et$2=*`8!loP9c&vgf z(Od_48E`~{EXN30X$NfTMi?D)ES?OCnfec=!Fi8h{cxnkYY{^o8XT2`Jzw~SN3k=NcU9EFTMIx* z++f#}PL5>ld?7uYpE1U+iSq97me5UEj%EW`rt`dY%N9x{uE?T$iNWn$zvUcB4_o=7 z4T{C6CLy#`uEG$!j#tKFv)C7@2%c||)i7V)nDM;n#UxH6@Tg^j2JPuM`Y(GQc4yu> z6)?1UlFetSy93y-6kAh{T2i%Q?>56Y?tXg4uBJ#G%(>f~B4OGl9DBEtujNa7N_Q3% zYYf_I$Ie68mCRdm&Ja&<&EXD9**?tKZ?U&qsUiGayRz_W z$@N$Vl2DNP;S3q8*D2zg(@q{kUPN8TQ@vsJ+?@0YeRI)4N4iV0Uu3Vdv+x9^s*10Y z7Zb2gvAGojkvx4$h{}wVqb+>}VbvhjcG}aHn zZfojB;gsFIyUE2qUuf>~!}=&kRZM9<2#}ofy2f1<-MyYvE9NDP;uNGJ7q*;ZskGgB z2mNt&szrWNjmU_)}sY8%h?h9))PC3YCErz8}!?+JDYRdYK;E#I;S@U|) zrvt7o7uca~dP_D9(LvN>tCaiBRw+uL=9x9hWpVU+`pD45Tc8bFmaQ_1KOQr-jT%j= zR?@bkG>dkr%0k*qyQrVEj!npqp$?Br4pP#>6{n++!rEb9AhHi29RrraM@fAcIlI({ z0pzKE`q&M))}yHMqa^ywwnFV{Zm|+qdR>oFmP*x@ctsZfo+~A-v3#!UNWa(@XZ5nP{=>S4F!N$A(juL9=_s+p<*DoxPea>PB0(_*H6p zNuVFSNTJoDh08OQs;)&@0c8#(bOH|J8s!2TF4zURMN4q2h=AbghPBkZaY%+Q{Hgz0=Zr5T{C#I#*sk@_7_u#%WdN`s-r{1aox5>Isy@eK0;4WAafiorHi)6KX?3x~s;=#dB*qO%w@ z2I3xnq$W1?#fTrh=iD=keZJ__v(d)rED@{hTyR2Pn|8bTK>yF`cngJMVLBU7G~kjuzKKVSz=rbIyguf~_=S;hzzm1upxiAc0EtJP0}$H3 z+vC&x97F_QPH;{9$8B;fWH-|MPu;X{_eHB;KjGiC@c6l#$9A>)pS*JLmgt$_27^Pl zp)t@I@Y^MWi5@c+!c&81rEdB?W^@*^4R~6SZ^RSV&4}Nf7>fg?8Df~2oD7};?-(9@ z!YZbes2Ote62DNm(J-McG6U7Bq%&WV{-%+p=cw6S&WDEpv*FHs9F%jn#!SN9(&oIuLwNDwc-e#B_=WK-Qeag zV|;N;tove&G4gJ3~D?Hyr@T}0U1A@FdqDy zA=VjSRxrUaLA3P(hh_}Va9JFmw#mCWI49op4d``yoMdjhoh@CD4BWt%qZ;^lRPo`h ze8EauGtn$XtJ-cAZm=9&2dD7a^;`{aP+?KNJxFcL%PAmA~lece#=>eQOm&FhC++nd+5t{rMypK4ok$#6SftHZFZ z_)fmP1)r;%7%b4X;vIC$_Dut&>*1B|?cnA3q<#&CJu<6QTJ+q0{CU~BL8eeMv; zRZtO88tmL*reT>8!u$f&8T`)}v@8(Dr!PgB!*RlI;BTtH{OtMKea2}kDQFJ!Dnb~jFn zgMgcGmg>jX4ZS$;3?ki*GfA(oK5P8Ld4v$jdn7!m5Ot+1h(#)jOF+_tM}yQP&Kv5~ zgI9StiSbF3e~a-Y0RJlwb?(dKB$UJ%MV(KDfu1xn9J!%W0bJ@VbD^ZGgr^lZ8|rU0 z&SbCw{Q>n_vs9jb$ z4v9mLR-BnHL5|P1JZ^0JBVw^Q?Lo>O#rGkr@ThwUzRBW~JNG|}TtC|5bFRAC+J;s+ zr*68?G_8PkmHH_!DR~ZJ3Ctu9G~>HxVk_5^pppU z1y4^o^}IF1lh1(VNSxo%x)a-4t5z3cF@LIN zy=cBt3k*x$Ykj7_oZ4=6(Bz2Gq0}qDc!F&W8%j-ve=?p*)wACexd}n?^KS*hfv2CP z`rc2Z^uPMlAffPk(lgY_X z?bKeQE!AeGQU~AsG5USA_u#Ue@5YlZO#(mP$(yM*N0KA&zfAD7;mL?M%`8p9!?Hse z6o=D>l#?BvqJ%l08MxUDO4ISp=CtKx5aO3m<$c6(IR@o-0Q45=Wq2AfwMx_R7(Rsj zb}55L+>VEa4<$HMLLz=SXMNi9OmBl~Ffw6qj5|)Mlm*S=xa(?P+aO68N2rNs4A0C1 zl=y^>kopEhM0HQZz2O|k3hSp6cZYupDnAu5ORWfsc7GCbdZiZlW6eoBl?;VTc>uXk zI%#LStx|!2yya4kvq>l6%tx*i^2xQ4Ds{F25wo#YI9>}J3!q(U=Xkc80eLp*Cft3- z3uR;JWGL$)-K+)235Vh~=Oz(K*rn$otDEkRc%=rgn|12jZ@>M5@8uk?lmNUd9x9SZr56Em(IzAEh$eh0MW>V^`dIelM68q~Z#)qv zwK%0NK)G%WK_vL50FR29L4V^U>wuUHPcD*(B&=AQ6j=V2u-B3dMRtsga>M!In)UQ^~6NYyYIi1j|{?ph;hbtgS!D!{YE`` zulOf)I4Xn;g`kAg@cEDn1so6M&2+@#Vn(SP1a(p=L&u3wS;?tHh)cVK+UiUP1&jSd z2x3DJTg0}@EGCv&IH(3?7U^_t=CX)7rsujPbcxRNVW`cIc>(>q*~1gA=-)%; zEBa4&P6}(7O2Dfr0aiJpvA~ZaO&0>YB5;`6tmrPS+K-WL(^P}%(CuaaeQMrc#lO}p z&45Jd0ju3LGiWv0Hgr)lfuerPQjOq+ejrh8=DvwWPYn)j%~p#Lj@FPEJ{(bev($}8 zB-`YcdffFwOoIuZ}3%|JafRZLAONZBWm z7Rrx?%tW1m-WGksQJ|de*vnjd*)THUv@JBPs+=}gRni6Z2_-zymn4Q~BNF87#UqkE z1YG*yi#m0NH-b#rL-wFIf^LO8nWGU@!m#3lY%U)8XI_Xm7<*G_EE7c6pj(RtWy=a|+A!Gg3#2q_`!5W*6bgIFpF zqdwVE&?zY=k@B+%a|9iY?KGB-0nSPH`;K5r#{%x!qXCSBzBvLt*d_9|U8DgbLJkB< zm5!&dMvQNkLI=ZX1i1N5s`J1gsf0sJ$j+BvLJv^^U|)V30V}wzp1kn$s2tyZ)s>5IaK9 zvwvwY#*A2nKD`z}Z8M<&v=k>(pd$X7(B`#-t5a*q2%@?|0-qzH=OCt_x&ECgMWKWS zh25i>Gzex0O^AN4&mGjlpL5ZWW*7+TA6l)0%b_)a)CO%e3O?ve5~xLcsbcN5_ZlcV zfbF)qx?WLTv#r(jhB;~SDzjANEorgus57IC!3w zu=~kKO4u_n93h8Ex4}!e2`57e$Xf}oE#a}I+NdL>?hO@~I<~fBOlz%1tQ8E^Wug$Q z#l5nGyw~Ia38wl;9E5;t&WZf-)WGjr3eJL%~Q2Zz%s zr{FLjP9X((FC@aN$;q5tZmM8MIl|y&o1sydJ+>LQM=?sZfb2Onl2vgW)o%)>&$}>p7Y`8CvW-A zLo;I){}E{XDe8jOf(ds)>;Z2|1GSUWuol4lU$E46mbT3?x1c3UdZ;J{%Yx~Jg2V|M zE%`KrS{c|2PL7fvIUTU?*u`I_bX~*XM!&e-^B5jdWVWa^Aw?$KkN9LII8+lH;>;d# zStVFv@71+Ki1*sXvx3|xlnPxUBXnLc zxS=AV&OtmVMB(CK)N$gU9!zwc_&ve6wc-!%U-Ut)t7++zLn;UPq}*V_amh(}u{T6@ zZA>BlIK?)=dc>ojojWp69W1FC)IwQqP=~`9o%<35}o?0?UJ+#<>m#O zF^Y&1(&Z)TGe+?HEy4Zs7!39qwebfBxaxD?dAXJ+ZjTX2M3J(PI#a_?>YCKMV3n#7 zsD?+aKsE8TKwmS57omR`T?I`@S7A1eo<%_8=-Kp0jh-iuHF$_Ue-Y$I50fx6OHkaf z9OtDX*|a%AJe<;EuyY$rr_clQPB(}zA%fra!y447Kxt!>7?hS0$rpsAgs#CKD+2d3 zR1cGoA=_$>khmkq!STzoJCX$s$-khp!u62WQ0QkLn_Dd9JO$H6`t^1kCe5dcm?{*j ztC$8MsbV@8Z9wm|e)!kW#HB($nV7BZ$O);24%DnPSf}|2*cq|YridBWXCRx@9g^qT>fuDi}f!@l_ z9#9S@s3w@`VT~+@G>`>DoUBv*3@KtRm&kg;tKP6inDq$B$=(d6a87==q-%{3XYSbZ zPg^6HUfBnK{^wVJr}+2Zf2T0nl32A^KRY6L;>}!Z!+&ACVE2$NJ zMr0%bn7Re@%e9ien8jG4gM(aZWfm^PnYmz~7{kSKi%oVeETs|2t`we;Y`>kuWJn@r zJy)kR+=sG>g&Rkysf4YnZbs)5qHz?{KHx_&MS(>(ijqVnurpY8b|Pjt^Bz213|%!c z6t{5tB)6Y+MG%bWwKP4>K2=`mb0qI$ilUG~-CKdwvXk}`(bWW&Z}-eY$z)y0ZN#lA zQ!v#`7V89~OSJg3TPtPXzoT~7kR0(b!bG#K#|n(fqc&FIMZs1xqSNJyNEz!qO(-JS zlXM#!J&F`u%cq#JoWfLHCae!mv&yzm$+Iq3l>Ha~*GxpnNOwO~YfhhbpS0S_swAqc+Q=I>J`-D5+H8!a@Ivf|N@4o>0zqn!DUk-f`0Hv}B*|A4a?NBdMg9O}N9zl|yTce!@%lC$U86 zbiR^~y6Ms&rIlt@Jjj?jVRH)x7#WXX=W%!tg%xy)sTsJA@X<130C!A{D-)8uoR;v) z5Djq2aCV+)CBowq0FF~ggs~V>_GuoPo|zyVT;R4ppwo(llXf_XrEebU@StL1zf3W@ zLwR3g!-Z_Z*8U@Qp~@!gaM9CmW6l<9YZKGbtL$CBnjV=Y4U zqmryS!n(x#&dK$g8Fa5s?hr74$4HrFAj==RUx7HXNY3wF%`L&GaZ4dST{2X)l``P$Uot9?EBT>>%_%aqHP#)EennxoFqTz^wctA?{BQ!3h zM`tpY0U4vpajDnT$ppF(k4kYxRdC&h6110etb*ne) zn%FGJ#xzZuK}}SSM_g8m`Jho)yCExrDrb2Ni9$0Kv{~lByF*MGO+?G2btZO&f+3QZ za(gT7Y6XQ-yESVp02?<(e3W8{4faeL8+E$j6XWH68W&@*YlMV3d zm`u2XCUmtr4)B^;U`n2^w<@OmC{@fhD=?QI3Q!I$lW@pE^OlR~30=#qE$?9kkEU-> z6&ay=E=S(3MoSvOZ(0E6~GWj|+9#?@92jHlMhzu{Swl?HQflaH0i22)eYc+N{Ayx`bidb0YMK!Rhb zsJf2UbATu7k_`a5|A6vN#k!xvLvxkEp1BIU_6ZeUfiO-nTijP9O1`sYpOGl2HVVll z0*z0nBJSc^tz+Le!NxTb1>FB-uXuI(cX zJGyp6)8K*jV6*AtfBt+EyKi0`|%(%g$LUzipE7A7OSXkLXlHN z^$?02OXC(>i{PvD4%Q-PRFZO8B5P3wh3DiOAeh)aR6)6WDeGW4`h){W2b@idGhK+= z4A~5!Mo6GtoGWy}lHm!J zBo_)m6BCM`y%f$8avazo z^3-v)8kioYvpjV?kyhx12M<`>-%42C#ZFDN|1}lLLh2i{@I|tSlaIN1>?@BDX~Af7 za$!e`FYB5vGa&Wql5LdCHL@%yL~2i0gD?He4BCuS9#k4fOJJyn06f+cG>ie&AH9&h z$hR}PfxM~FVR>A_0cfrMC^ai{7^|-SD8}Wo_hRycoLfp)tP#j%`yXd@uoC!HrB?sk92+4t(F;)&q zbU(?Z$0v8sev;Ga6;x86K_R1IAzrc4v1oB14I*Vj=@oX}xb-!?NSBq#rMJ@BB>`myYZ z4OZqn_;?n>8S24wW)ZmOJK&)Vn3)R@ZzWCo9)ss#=!buM%_6NPaON^MAOx&XLHztq zoCUJ>rdp9tISXWFzJcJHbo1qOLy3^6X97HwZq7Foq0GIAki|4Nl=)JC^LNK{E+IJQ zn3+fMOh;e9h7C1(QB74#yS%oe(WXoYK8nA7{QVGr7*zO2cp6h@;jbM^4C0C4WZ>v8 zO#psWPY%V?NBLo=C<0wWoml(f(?ykWz3W#x&uc-7V&`}nJf|QY9fRV&WdQOz_9*I| z?Sw`#F-K2Bd2mYSQ#48o^!tn>#8ekFF{cqyJ(f}jA&u^7@MwEnEbnL|`s{+~HD*Q- zVtSda@^~K}J$E6x>3Oo}@o&Jyx^D!^%lDYBj^IiJH$xF}aZ{W48KyP^E7d$!XZtG= zJy%i`1~AULAvIeG@RMc0<^gIiGp;jTpgVxhTtRY-hj?rQ;kcQ2#+VDp z;x=%=IWTWbh}+|$+`S$HZn)=G$|!T}`7o(L>dp{KAT=8dls9rXq{(eg;mG7_3B{>L zv&WpulS;Aq02oJ=vhy{ z`S#n=RxR}kPio`!na)Xp?F%bFlld%ihl4VK1(#qv2{zmIof_h8utp9;B6;5&Awz-A8<`_y zDv&P_SVmRJkPGSuzicQvZ;!E=`P2&m*ino~HZC5`J|ZX5sc&z>-!%MX3l>-Ee5b|z zPr8ty^(^X&$SCyFh2}DxF2u^-CanEJP!M3xXTA+SA^f2h^4Zxvcy=EM!Q>!2B}acz z{AC+0?%H5;A{FZ7QaFxR_StRwh>lD*C z9|VO^ojd{BnaX9@3x%-R#2z-As8}U;MVL+8(04oeg@Vd?QodQ35>$U8TB>@>Z7Epk ztkJ~dNj8ctNs20S(3A`;+|K;&ttcoREh9ymE=;o0Lh4ipB8OX{-@OR**q4RT;N;HN z5qr~7hr6>__MkA=M2FpCEG#02JQP_pEHvT#&nz!b;-&T_-agXY1x-0zDMbZ?srKap zOC{}`DR>bFp$V)CR)*7V3@l0`grZ;4-K5ombEhn3){tyx&(QfgSjS3rVY8d~rTep< z_6-P+&M_&+gDGc|`$!h3%IL0@3Vptp^f@OxMVD~{L?f!4l_IIgt7#pp__H=^8ixvT z|Cr!ka9?LCm{a^SN7f^HK7~$}Jm`v#mPa2RG&v*eC;>W1Fcy>PNaeZ;D*owMShSG$ zg=o11VYb-p%rS?<&%{}ho7TuF2q0%Fi{R9VdM`ab%yW*6(*RPJIC=P~^XIr_1>|3# z^?XyEg_?K(w;M`1kMj|fFRaDdEJ{9Xmk|~tc+rDM^`ZxBfl2hD2ZdqLgYa1NAP9>d zOyw}77d<$D7Cp$L7dj21m8gcm&sAxU!>Eov|; z&4~%c&t3{=2{{fedJwfJAcx_QAxRgD9#ttRj3J#C`FYWUN(>5Qm=--4mVWAVB|j6J zAs9!U={C2Te3)LVVuZzpm2CbL>-0$`TOVi&2I71=Hc~zeCT%8c1oogzL;PAJ#wE4aTerme*#+EzO;EF{CI z_Kuij34P|2QRD5+7Sj`PVNc^tq<}#wds8&IozC^2jmY-1%nT-4G=t)DL66Jpufy|z zj9?w=6l4ne zeSjk$#5QK}N+^;fD?L|_jb&mjJMm^1`@;EF;3$DWfGe0bmJnO{A+IW2A|%o!LSYsU zPmaz)VroFFP@_q5%oGG`=R6O75-1UpJ|d4QJAwO{F@pOdaUKdGdK^cl2eXyFPUe_( zh})nnKEIv8Sd4>m?B5o~C}=zUX#0$1clu_XQD^dI5njO}(5kZ;#KFGyP{`)v)I8o} zo*7&_Y>Z^v9bKs=>Fz&`&0{B$t(Pf|gci-li1duu5Bi>qgC?@Dj*3f*5^Z{6T%vH{ z@Zt(O16pI@g$t?@O#4$gmnhb4(XZ_Bq2;ql%9JC!oVxNTLySlQa_P{s1tp%%S5zSXFPQi(`t7e)jBr2NzG&c$wgk{<%my ziu=a5yNx~=W*c2j*(#tHB=uSa)5Q@(md3UE*3-sUZf3Rv=YBHRAai*-PN`4w(`N1X zf;^n4UdAruQ?zBo_5XW1pVr6{B!P7=)DUWXnGb<>lyJ5V!TS+oLL`na1QDmIkboXK zO{;C+A?+p_dUZ`Apo{iu98y^zq?6)s#+)L&q71hPded=P2|4)fHkjnp&Ty#ArWd2E z{O|Ev1Lqei2=+nTH2o|ly3{2}_bNEOAQ(Uue~Lw5t{Z4`SYLy!G`1fTjErZ@25WC_ z<~pb{XX8|3nuq&`>>7(-?vAb-9s&%h!Lz=0k5ma}t%Lbkf*kpgQHb#VIZqkyD6bb%qK{HYQ!}8@Xe2Ws4CHih_+AqLSe* z>57h%Uaegt)+n!IT22{Y@8%uMUW!dM8SEQFq^YKsPaj8r{`u0EE}0_59|_EwJK?bEXfo$X?{gJ zu!2#XR!$BpNO}NoN_8!@UGzEM{#N;s!Yf7$*LGRcV9B}p%bgjkEaMTR2dP7 zr;K<%o1fi}Qyy7RNxMH^hgn}YBwQ_X%Os|G1nOXk%^1n&0BitZtRrl)C4vqXE-SFT zM6>mLlb$t}*^w@?`)ttz4(IqM{5w6_0ifB7KQP$9r=JD zJZ?IWH7ZSqH;9=oRHg%h=|Wy}!SPxO(QK1epObCYdco;8n3|*$p7Sj75LpavzSz*`Dv9;k5dhu+#MwWU(_ zn7iDF5Ik-o0w*^W+_0FM?z;&6bcKElnF}%pWKOz|wodlPtxS^zO_}W^^4rY?7!NIl zSXQrztwpcXDiw1z`7v9fqG8nlPJ}2zh$Bd$txfvbR`DW&pT*&TKm?c_0Zl|$0aqY@ z)7wa7-bWC=NC9;va-l&G>7_-`V(UON8-?;ktwm_q-q*pgT?{bjRWV zT9Qo{qa4lQaIC(OEI1iUaSmqO0f9IHuhz2kaVH>oJ_o`xSmdY=T&nx>G@GsL%To~V z%M(`i<&TCBiy#!D*Fw;-(pp0!_~I`CdMAVK$e~MIF2ghbd)|*a4dL_)9_^R)V=^b& zCxrq5OXKA=VhUSor%!D|a2Nb+qj7LY1+r78vJ4^h0v1_wkU`obEJqwtq00>#%*@9i ziIub)aekQ&r5=UYynjiaTwG&hO1)b{SaXK$dK)5Qddd6l^fqn}ElZ$zoB%!!@4gc@ z*9hQ5@CxLj^XI@X*La+1t;pYXTqBz4+(2~M#c$D=v5dNYxDO^B7MS1wt_366z%~YE zqaP*~9AfhXTb3vSV&ztq6V|7isW`gs z!wVdGHumn=orGAdq^5na>$nffY)AwW@Q%6(?F9#Uf=IWQmSKaKK!qqyvSdRq4fA0J zl>&q8?L7|hw7k7Lpp5V=7<=e~K-vjX&U6wl=TRL;i(iEU);y4Rp#@eq#saA&{3;s$ zO0mlJ+ypu{jXL5aBRFk~*R}oX<`VpUoJzvaf7DFiH6g0Sna!YvJrvq&B)l_onX+>0 zAY(|sI!4_rMxC|vfSpNCyxUOBHlRzWZsY~tfy)#*2G~Y<>neL_18l2zAcY;4h%u>| z2uoce9ntnYDpevp>+ZMSep{<~wmfAswG;DtIu8JYSo9V*F-UX9c*(1#33i{vT$r$z z$|2#-qB$J$#yTsPLmcH0|5xP@50pcEALS4io;WsLhjNGq${{Z0fGc`*IZz>TIY`cW zHU}!rD)=c&OhZ{hZK-6rV$0D2Sh8Lp(n=)idpLLXL5-76xC1L*oX`Q(_H->HZ}B~e zdbR^|OW_f9o*1NspX(bDcXnC{Y-d6Be5ZqhL%azHP|{5pD}SBHV^DD=a? zNIGOD&{&FALBkJL<0s1s*QC7#92BA~%Q{!lcVx`M6)XA-)_TO9L~(id3fDHZQRDg) z*q9?1B4TL+)?V^<+J6C)j0z%M@XQQG3|L=g<}-L^?Uet*p)VXby?n|@XonGbL$6VO z&sPWHt^&Seh;E}f@>q3X0>`pwo>YgHldsA`Tes&zgvv%n=YBUbxPCeoFCFut{L0qG zQ|U-I4Q;q}jJs^SDC=-*jyly!?Nz; zXgj+a6;lxg zMR1&iROPbb+z~1u8McCW9=7z^DiV}yeb)oRs6@56?Pl{}D1?7qxYR>@yLl++0*0a@x%5P-Kb)qA}Fb3=9os?t-fO(Y$4?%2ae06h{1}FpVvN zEu7+1Sh}5v#8s8wHVIjQtrKnxI8A}!UB;69`k>{^!Ll`!OND~(QIR0sv>_Nk4rxD` zby&(K%W2s_BqZ7<0{?0Q<#|?&ka+varKkyc}Oj?ltLnUEYc?< z9BU|ZD_R4#l$$YCyd7R_5l7@89p-G<%}3B2lN9gd5@z7t_{9;+uj zsC54ksmki1-~BTDCZ+TVVsek*JPx zO;(Ap_NrQ8OExU*@os9k=TRs#ICltKM$kuXvK&V3Oox%T4;DQx((HjYL86nrI7kdX zNgyZ4a9)KpBtq%Q86HFsJY%R2vg8T~W5rFQ`AW6?XxfGM9d+Kw>g|4n1n_$vdbzDnCE&j2Y_XMar|e9n-b00#5Wsq4t02;)3V#-uTr z2fP&OC9ng*6m|}U&0|s=#W@jz!MM8}1laM!Bv^`;Ct#JLoem0~FX~q?vREa8 z!O7v64`W*C@@T1pU2KXt#a+Uysn{&_r3u$|>FK9a<|c_%c4nsslE++-`3I-1m3Wln z{E21irkbhMbiLTD6DwENCRAhL$TI=FMMa6DrE$62 zUn6UQw4{RG2C_ARy~Vd)1_gW{3n+$TP)3+wryx}p3h$9DfQw1TRX`SZ$niX6Z%5-vItm2@Dg?l4b=;&Z2axv8jhmFQ)D zr&stb16jTUd-Nh;RRwxGn$fHWp@?*MLi4UuNZ@Mk$_{?_M5;e>5Jwb+OS%!P)7cqkJ#{UK1mvV1xj46inR*&lMs-3j-hrqGdjD#v(;@9FCK zHUuMy;vp{CTGDRJ-LT~IjzV|6lh7USBy|2?3Z2=9#JSWMaWxUPpT5aT4vD-l%}MTk zD0yr^pa{EKf`Q|d9H6WyxtyFC3Md)1t47ODLbAABZ-vTgt|9Km3XLlB2?{{Ps1xd% zIW{05OvgKkou3$>+^5*0!7(!D(qjeIWKMdo5qFA{aW@?`*N`-1#O4Max21h&4@5W> z0K$ok!s$ujgywrUTxB>)^-vq*SAwu8IfyWvTOGhdijE4wlJ|qiE2jv1=%l&D?*Iuc zYnzW0_8b-nB5r}8Rs`80dO<6!iW6iw zbqfvR@rvK2s|ScN4v5jC8ZV&1VuJ)ag|K)KZyW~7@Ssp_*2$yF&8vEg6C^NPXb_J} zQj`l~j1++qC^iU3~Tw2znh;#Q;u*1L%M>#3Z{az?C=zL2!`D zo(u=j0g0Fc-q|1xB*OvLfdq-BT#r1ig*Zj#Vbcs-fnSCy+VnA{K-D02`pD%>Q1GNH z*v7O3)Yv-?62f4k3>ZhUWI{&`ax0_~a$BY6=*_bs^tCZ_=3wik*gASZh6Sx;I!&XUg%QLRN4wCQ14hXN*NbJ4# z5eGnsV4U7-Ab$*F=C28M#^B6NV}vz1vm2^IkN(hKF3 zWr?)c$$|H*)39wI5D8K?+P`!#Gpvc!dNe{>3 zg>wY2bJP9q3w5&qD&3 z5#0fC7P5tHJ*++RIslf4u@E#%mVSM7j5LqWd>w2sr=^K-?m*8fwu)b$ss1W;%yica z(IVy=@W_8%mW^5i%SQT6h^RVtN%anjuONMF)S?DbZ0w6w#E9@Z1nyYCB6Runklcly zUAVxr3TwQoWU;VQ@WNKX4%@}W@*0Ug2hNg(acdFr&K@RVL8-&IW`@IBgr8Liiw84* zm_eK&gEKU17w_FAzk4>k<+~3qfIew^kgP$TnrE)3 z@&$%1V49~hCMNpo*-M=$Gw%5lcV)ByH0#%lW$*KZ4HrWm&T3{%FD%EzL%0Sq+hT@2 z4N|C2p;+oe^))f_XHfc1&nGx~A00r#%>*PBFS&TK#v<<`#b5xEbR2@qg)v3OHZ^5d zgv@YJFGJ~JA%x!KP7*$TvwLqL!ub#z}!CTwEE!d1NWFn}g};dK%4B<;2?L%P?gP~qOya;3^>@E4d_u_bx ztc^~ElnMMVug6){H?PFXqO~BBrT7xp$%moaqoq!Mn$#@orPHt|99-9pdOhz)sH`>4 zx)fe*QgzdT*Pz`Z)3`2RwMl-&boP@yjw2de~j9`R?u=q_5wwi2Q04uR+>;XTV&li@ufL zr!?5lp^~qf2LVf=ADipdKuSJfIbf9U*YBCZyl{$NaRZ{j77g*8HS>`6@ODy%d=YM1 zx`gFwe7Z5EKiHObEQ?N6IQU{C^!IM!q0@7wkBeu~`4!tb8XOqH8yOT=I1CI$&|aC>Ahg9?2K(_bxiU^CFxc-6L_KWt zJA*Dh$+HY?+fpxsKmCMQGo+I%7}i;#><%!db48G9FOJhtq9O{+u_(@EXTF0hhUiiZ z4ik#Nd2AAi!R#osq^s2zxcwC?s( z4)$IPLlbl*-`1gi)8tA=cNS7x^>*it;UyR;tKE=^(F7NPHyxN>=TA*~? z-HlfuU~KXd{HMy>KTg-Hbl2}Z^bt3s6OyaD$vPwi{?h%<@|!tbLa-F%ktHB_M1b<1 zjMMdiWerB%)XlMOGLmJ+DP5~fJ~RJ;Qp?4{neXBmL+kgm7X`wl&k2&Y2#V>am!mZ! zT5nA>61gTamPyB?6A!0ZTjhR@jhj3+z)7{jtnWlJmuZ^lJCz+mmv#sxC%i+b>e8YsXQ-nMM`|C5EiA6S5bN!+)N*N@%{%6 zK36-^giPCTpj0ENQUghkem=O)nL~8+k$(O`n3itvvw}FM&tjJ=j@Pxl`!W_IToFTm z#4spEB;l7YWalP;JC&&=4^)sWMnszayAs0}F)$^h1Jw}2bNZpnLDmiJdq%rI&vM1O zKZ0kgXb6XtafsVn&ZUruxyxBIoMjG4_rI&KbpN=Rm3U*rG7tk7$>F=CmqMdBiV_#e zV~{)s5qejmvL&K`uv+7#2b})iV+li>M#e-mS?m}sxLoXbQ$3;6FJ52ZMU%=`{g~syJ2<{!bk81bS{|!hiy3pnWdZ4iKM6DSP5<9VKJbbtF5%Jx zA`k8QqU^7@X{VYaO0%kiRQlcNz@oDrtT&Mp%_c?7aSL){rku=w0ibV)TIzhzoq+tL z@i~KnV>K77Y^04pLrlA07_dT63^z*5oSidq&4otMK>?G#p6ryafEQOIVTy|8imM=) zJ)kQA<$oiSMaVPe+{Dpp!WmNL)Stk}G(7bRDagk1i*BYl3=$)Tg+#04i( zl1RG9D0bI>@Or>I>Y}-<3*1}@;pHkz_5cC-1;L(Qn8R56@JEpfZv2GZs(gD(EJX7tsZkUpZ zU`fFR12;74;Sov~!lC@6%C{|=^je<&+=T4Eyy&t@FskVT6I6_vko$sEG=(*tY6Yq_5tC2i}dTnK?!Yq(0W zt~8c1u!dEDWhD*>G-bp$h6K9|eEZ{nTSp}A#a8U-I zL&72jHsqg2rhphhQ2u3E51CMHRI(o8sspE$+mxx$%GF8W7szjFZC9{520{XwkpBD> zoHgnVR9%Nvg{3g6gt?SF)5T`VFvrOulqwpJ1A4MtDUh!F+R#rP9^mLPM@+wnBRI(+ z9!WhS0CVErF;KK!56OA<^N_!Vq%T&mSe~%sr5hJBmh5=6A^8?B}V)?j0vCG&E89tyq=)2w^P5`eShKWl3zoXuOtmv!oZT0OS8bxW)C4KM1!^#{3 zB7CW2gpt*nCH#RQI-)b{6KL-DDX8LAMDxW)7eG(+@;IdIj zMlTC%(%rp`Ff;!hh^`Kc>fmR3{cM*6T6}o9f*+ij9E-u_B0}mP+?=0x>OZH1%b$#g z@`QNV09|wAFN>I(q@~YYMz@ssquWSXLF_ezg>8jJunKzFC?-m_rKP}OxER_E#au1% z$7;8EQ1pww?0EE&0Ue_!!$_?!&!lQOis28#7r8v5(V|9A9FeN29flV(TYCTDpoBwQ zEoZ$3zy3<_C?e9EyBpD0BbfT+bl)dXx3sXY_a>_qEa|232Jt242*r{_1K$O}>bW)8 zpV@^XsR^UrWhmj5!>V>7R?qRW8|i9L)RFM8;0_e2W-x&jPY$Dx6lsHT$nCtW`@Vp5 zk0i^B0k1!j#4IV=4gEu5`w`GD3$YIYBjvDwfMw=XWL1Uu*=dPLpfIZ;k!%?cas0A* z*xGwO`ulPlBGK5E>^_&8>IjX!r4OM{#S2UQS^%kJ3{{u|MOJ+Ep2n~;fI*OlwB68l z={f`?v}KCI9O!yNmo$b|?aSwDn1Lw3PMdHQUfD@yViGRlG!K-nM-sygmBgeXW5UYlU`WjXZ zVAYUl*e9z%O)jetxg&v-31*ti&d~vQbDwjR)CBygbR0gdMViR8bdRMElV(AkOeT`4 zj;{)33h(|wV0$&5V`x*!dQP&DGSN6D6OG{0m}pG3zcgMQ%Pg7{Hl>qkikWU`s>yyD z*-t0Z#JX#bF45*bC|R`D+>p}sqM1vT$BrSLt!7pQ3tX<@wZz;$Yl$gWWny`amRnRJ zCDY7zo7zC2Ge~IB_M4gzk54T-%o@d;;mrfdrt%1Y8>zQKNG*0t`B}|txl~&OHKv@j z4qLDom1s#cWqyhJiX9C0|BC7^RmRpzy=m3_TlZCOD#)>EARyVAXsy;8;gTLFq{fVm zPck$mn&3{LN-<$frIswU^fL$eO84e=EKJOe}+0i<+BdwhoJ&$TDXkW<(Y*XuZ7-xJmxn z0hd3<4PRhBj$jyK6x{zWgX=Y)>IhZCe0;Fum6xZTbZH%gB4JxvL|9~ZIl8x0r)Mon zm2Q9+YZo*(zYh9XEc$39P5iI)u@Nz+|G%OS78d&8Nmd^WI|blCSS~QBW&&Es@7qcu9T5Z?yB(Pjpg>l!eHn62~;I*2= zF;0*r2LqA@E&GIOn-+{!?eAb!5sk*sh*cYj+T7rP?nk9JC8K{ZXfnUvd-Qjqj@pP- zRsr6%sS)qmNSs=KrQyuQsjwPD%^Ej!)n<-G3-%>CLZH_wN07t=5vmOaHIj0w#dy7U zW}-Zzyxz;2$WE@Mcw|Op*75oy<8@WZ&(VATujD6a>WV^mh#rp)+5~}8Ge-hy61!l$ zUITTihQ6xS?%R<2(0o)*wHbex6NJC+E8$dh{V%E`)v9+_iTHaF+d+Of?IoSyWL`$2 zfYA!S3{UY&^4)^F1Keo_vk;|yY(G+;#47R@*wfks!&4)zE&k7{wf8@XyKNuVF0 zM5;XZRb{Gj)l{4S57KHiZ&kUdd>jQ$>hd8@p=Ix&M&haUMLcWDg%JIabieuwM6PNs zAaW&gKtLKF>AQNTP#-+9wUXvL385=>pj>O@4AdXw6ivsL%TEVc@HJ_AwI7Fiq`$A0 zE6&V~$v}+0vT^DD$`;dUQs;j45v~cZX4xyx!)0C`9vnc*+lUilT*e$LE1PcDw*4hv zlVvHZcNC|FUWz9`Ulor&)Rg%MG=w$j3|1O(C)+3%Yp{m>Q2?cn!5PJx0PV}rnYbeA zmd|BJM7}fW%|h6j^i~1iOfDXv2y~q0g84#1(U+Efhl;q%%)Ckuyc>xHe-mGbF{di5 zlaN29nzG_2-v0z{NriVrz86508T?VDPWjLO1P`-GBs51p1Q|wQZr~eRj7s~@KRAwn zjS1e67{x^2HYdHswApjbEd=uh1-%~$r8=}F;*VnP3$izbY`Qr@a4Ct9m>HJjnsst7 zEGW}yDopYH{L_+iT-L#yBpGz&e*S7vhNQf=2@08jOH#0a_6n&8dlR%~3+qPx@sFaH zbIO@zCVNv9gFkQ7wxOI6Ntvz*VL1~>hrYr^YH4d7z8N64;Amg{Nbo(iqTfk-iwBq^ zRJ7HSE=KTOEG~Vl>ZOK%1EI)t$AXGIO1gHyIP(W!1C<2{)Kr#R0Jm{nnSk`9t`H6C z3RRPI(N~n=zfgwD@5?5XnXJ|WY^f-mv_t=VHN8<#QXL^0Tw9Yb(`#xjG<>OwWI~}42Pu^|NJu`9 zQZARRTSd-wWl=aiQa-0!Rz9W2XBkN6r&aPIIwuW{(K+Xeb^a$LNjm=oh(;-wtn+^W z+csy(33CjEYKmVJe;3UtbQFpm#m*kWgwzmR?+_Ra=+`#ld1EX5OEzv;v+mqsqVVPb zhv)|{U7~K8s}!o5I{4V7$IruaC*V6^3LZRXsB{()b>?U zaF17CMJm5#N__GP^v~M2L&C>FPr7)ERYK*x4VCZ2#NyWZ@C(##3S@HF1P#@xFeoo; z{(<#=&?WF!uZG1_Xriz>yhC6> zj?wTBtZn$#@R1DdVW?R{OBkA~Kw_@tY zz$}AnsaKnK!M&w{+=uGP{engA<1M7CCm^Ave&aj`_jAY>Fe!4k8RY(q^|rHRH~e2> zx6UH}3X|Nm?CxRrx9qM_gl{&;{eBarLYlPD{Sqe5?#`B%D)^l(zlNW5ZmFFuufqKj zyDxCMY3~tWZi|z-VSKo(gsVvLZVv&SbC;tZbr5H)r-DJC#Ix|VR_>oKU z{4hy1=ZmO6r)`}Co~LbH;E@|m+zrAf2Zf)3 z>#)1H@c`fl*qsgjhWZfK%+uICuW1@W&DNd3Ph@v;V<#~8qqc*CN$wBhyl++OxS zXp{e-mR*Q7Klxd>-66vK0Pf zVtpn~?!?f!?xM-)6x0rNr9TA96&hOZU5xMkU96$&y!WD1uGG+G?;6)u?Nbm9@g}Es zAf4kX(7(IBx}*X{jn0Z-(-w3zu8H%e}+ZjSOAUyrba;?+A5A z1^SqGl=?;my3L!db_t|@T91-d2f-py>I!vr%bi}Y>J!NOOzbeDS8WjpJc;r;hPEjS z`RP>;YRbo&iSpYT`eeiBz~vc+wyW1d_W`nKo`4kYMhbl@!_anhaXmq!66XE5;j4h& zuc5!CDC`;yCB0VFr*6{Fb#a1j)zHV|O@KZl5X*VAdb|QX<{hnGtU%v^q4lQ<^t3lm z#SRt8Rz_Pf3QS~Zhj(G?e|huO8V!vCI#yl6&=cyY#-Dk|s|PgnSLZO}1oe!j+!X&W z?*#RhhAs!RK()0|3Ol?9>vnq!)mjZ*3}}(ML_>phzwu5{pViPssn@+Fsxiy))N`@F zc&Dmc8KSa%%R5bdz5?Cg^{YoJ&~4tJ`iaCt9<1;(^>+=80$Q#nl7Xls4`-_78lpU` zP$h;ag-CdX`cMT*hF7UaE0Cd9kAa@#u$K+bZwc3iom)fse+qh&)4M^PT|Xs!u4>Lx zj;`=_*SF%d-((H_rM?MJP9Swx{q*n}HJ70q)RtHwe7-uBq3!C8mKot8wN*pAQb&f@ zsc1X#+^(W^$A&kkc?{j4?uji5Z&Hs|pn>ouYEcJKQrN2S7PXt9?OX@9srpU|d%~bL zwoTp0&^FcGLeNthYHqnOyiE;v5#=^@r@J}4UEQdmM&teAe^Xvj!ag6rCj0^Qx`zH5 zx-tAgb!0b%U7;eeTf$eX-DKPYdL(&w_*&ISCK>YZtnsz*ht&rd+NN%HuL<9z9@fw| zTOJSZPz!pAa+^BW`fm6m>U#`rSN+yA;g2e_4?zf98+$x_vzpA%w=6$psE@0i4DC=a zHvBmJan(16D7UM0{4wtq^*0Sg;=c;tstzGD4`KJBjeSDR&`{j|UHB8~qZ-0$7{VUb z&^6{C!?&qN$sk0$6U@JdZ&$fv1Uk}uJp3tjIYU%iLzwMMJeIh zc?^noNb6evNp-n~qOBYK|5W$%OW5a|-sgW$JvSiGBTZNOxAg0`zeo38brRYx(j zOD$p58!kfG~UF8RFwvf8bo zy8!)Kc`Jo-G`ZG)MLoV+phr>bey1j$BTySk^EGv(hCW*NOaC=>yM{i1w(>{y!6Bhs zZvN5#le$$yo2}*kpVhZCbffi8|1atn66v8_md@s$-p`aAwP6-dpO#l0e@}xsknU6GPXlKR3rBZ>#Hc*o;IgW{E@Vg>nOW zBExu=p&L}Y(-bj`zcF;ZI>c&?n8tAz3gw5Ir$lU{W1~R7k3HtO#?==KbQS87XMFY& zf_A7UletLPctbu%eWmF=k$Pj}s6e;WpA%^?-q6rhts5fEM*lVmi#2VF9B7>PZv^d7 zZ^f^QOflwtfS~IEeI#KNm$$f1V1TA)V( zWsUU=U9XN!eKC?ZuGC={Bn?$CUj2|zp44=dUoa+KE6_QpFYU%l*AcWsEwR25X*bTh zo}lf39*uMumsFr9BAvz?4DC?ebx%dQjNFGM-uoN(L}nPP7`k2^=lmlw)A*={mO5s% z+xVM?CMTlNBaByXpm>nePe*%=sW%FALH*?D9HXD19cn_|A|CXm84qgca_6<^GUJ;X zx-4~-I>Y!64PBplEqaFW1A#Ci+~6%YA|Iy|u3!uI%$iz$rjgTOk=UQ2D~yg?h4PW4 z5j)%1%Fs5o10{BjvEmaHc7s|FOUBMIo?{3jJJLJPccOk3iF$qhgzk9rqGMqguVX*to3% z;mt+kQHJ&yr}+lf^(KCaDEAn*x3mJ9aUVh3)VHwivDsLtp$}n!XtQxXLwmwsN#E&h zHiiWi<|)IQ%}VkPZBU@%)uz7zh@Fs*ss4%bFpTKhZ)v9RU{J}&d|G#}yr zrDmf48CC&p&{X*gpYJmt;t=9chk3f{t^`(i)lJ|TW}d#f5mFiI3ecM>W)jaNT$?$U z<31iGntwxnP4yb*nsRC~jlsDVzojL49kSJ8rc~%HH7!Kkf*6wD2EHElscNmSH`NDP ziDqX#xev1Y2adIjC0WRrPUb28hgtKRP*A3t%4HPvAM=i(4{*6W#Ciz&g{Qbde49n7 z90ix8CBH~Zxi-|-IP@hB4f;ifT`cn#p+if3rGauSlngoZSq@1xF} z>Sg9h@|fz=oTGc;+Dh~w_*YP`3^fZiN?cPN#&z{AjzyuCI*?2D%>YJf$XFQ+C3zS3 z1uoO0ENXX`vgQTvHd0!ICzt$EV zV79npF`Xy{OVJJMw(6{*9E(2|8ySXrFUwG5onHk_8fqgrm{`Xn|16f|yU?wvzA&cL z3`O{TyOiJYc?_1gl*@Pw#WDk>X5dXa!ceU+)UlAqR1d?o)Jbq{^&OT_Vo8pI^fcU< z>P(I+^>Z0xu+#=_LH{qfC#lL~D4`FQQP5wdv}&Y%5Nl?p`h0@=+r=sBZ`Wco$xz=6 z)X&@M2qXFt$)#?L^_OXKoJVonna|mr3u&8DL!^v4nX)V=$sqle#FZ2`a>*XfecBB6 zE3Um;nDaue6{5+f5Q>_>y}?pW@fEn1>W6Eq-ytl-d31ChuVI?UAcLjmK*P3r8vYPg zr)lgsg!OP7_c^3_OGzn6&pnEUWc$)3P@e4F)L#lSM* za+gpVYl0X<{gzwAtv=yz^&8cJ_?nB4zvcLI@V6L$OK}dP0e{Q!7suaX{4Is$Kr65b zxFOZT{wZ*M+`vz^Vh_7VvwJ+di`gAucO|=P;5MlX*}s`xSh;nJ3U5w zZ?}5aVpos&&r?6P?@*n_wJo1hJ;r+bA-JD{g};D97jWpQ>_3(LXR!Ya_ODXY<9}DH z7_J-jUh&AU^*&SjTHnKc9#;oF4TiD-eB$474=8$6!moxp-^uj%GoSmJ&;872C;NA@Kc{J^4&2W??`Ok)-bn7ladKaU|5cXoRp$RH zr}ZjJ_^OtWYQkdUP=oTdhGYGx<(Hu;2DO&~;|cq>p#kGs`!HiAFot>qsULg+2oR=Fk>rGR{17ItA?})itpKz8$>-?!oHIaI@+gaEt00xJR%% zm)#Q?zeN2v@XHu;HoNDmsqumuRtw>dsAcg!<~*0(v)SFw?(OUTyR(5x@t0plGyM64gVE26WKJ`uY zHfs8NjmwNr8TT5m7;hRT_I`acZB8^Nn;qtn=F#Rc=3?^#bA!3r+-82z++p5oe$D)* z`E7HTxySr7zVHyUTCI$Aq&3&-x0YKMS|7FUupY3!Zhg!8x%F4;Eh}bEw5QocdzO8& zz06)?m+UR}RrU`1Q}&nauiB5;&)P59f3$Oq47DSBGv2-5Po{^mOR?&>uqo z2)!L@#LlsS8M%qt;NiA}usQ%GHVFpZK{yGc)aPO=G44LmOzu4mtKsfySO@pb)WvYq z-WIsG#mS8)$emJ8?n1_2>1>7nrWCnWn&_`hUk>-!^p)CAry(t*-2xlW#N?CYI1niZyu~Fn5&gv ztMfbu)#BP={gAb6sE$oAvG6tt}7g1>|CcQD_Jf$~$+tohhINx^1Fsb1rJ ztVbc*k;iXby94$oPAPHDsH`JL+c`Rg`a0E)AQR<8gw zw{*e!l^a%XAioaTSR&|@^VX~@Em$+W5&o5(>a0#x+O+YM)n|9Ab){9SJJtME=fYjh z?nNtyI@Qp+PIdD7PIct$!_PeP;tea|E#dE&HJ5B!f6ST-Ty=Wsi zZoGgVCvVzF4=|_4di)(Z`+_siJZ8lDQnI>Z{x}52-KxT?P5{8)bZ=qY$S2JSlliJal6#f8&|IDg3w^GzN;!U;sP8a zH0W4pq)0+@s`Ox?yVRUbYlc>xvU+&a5OAljS+{ELI(XLOFPIfzC@bnnWac6i$=ppF zE?PZ&YKihh?5V(tV^c0Fq;vfL*WT5{#*tj-njyt$jW}BNh-+wVtvzv=KnIDYB<`;4 z$l4uoNO27QK{L{70|mq8bdhYSr+e7lBa#~nP=GxofO9dDTXHaB1P&4d4iF%xTyoh< zfcRqMm>hChB!F`Y5WvXh`(E|WkkmSxW3riHcfWd7_3G8DSMR;5?rCE5l0&TnNT?aO zTgfdDzoj0wgXHZ+fQ#s1a^vQ0b!R^uIt z7kC2)4TLQJaOgr4Df$d!ijHHp!XcAvwSy`J4@{lnfhfZOA;SQnrEqwR_PQYxP1hws zlQ5;%*4H2s2t3k3vbK&eq#F(&t0WwLp!x>;f!Ya^52zX=-Rr4X@7-{CzUioDq#X!q zIMzW3oU`f#CN_OXL+j2FgrHhs3bf-4kXmViih|xI4r;h^WurTsG&|BV!J9j3$@hjs z9j$pgY7qCs$OnLdSPKtzGzep=zuNR&qx!1l#ltYxX=(|qCt1P^0v)9p(A*pbu@t+Z z4~u-#MX?B%&T*XR!TeI_`?@dsFn?cznAcZ(I_Wimd#+ny-xv)7qF=XM$zFE?XHUD` zeK6y;T}%qU*MpuUp5y1pL9dhOVZ5cI2ac(h4wosxQB}j;Wcj%cHUSQL%SXD8PGAV0 zX;(cAoH+LO0)XVG9WVKi0;)jg^F)xO*uKd$B_BDy2d0`)zZ?26j6q-Deb(#UbNbKl zAo7Z*edO|~r8 z>mJ5x%^P^hnLJ2kX&=T1b0O^OIKCH-0$0({8c58d0Wrwn@PQO)h35J+G1t68J6;K+ zLnm^nM=+3m-8mRbaFVWpOF_CQA%LjBnDn5$(1~$`GoD~^*eUHdcVdbKGc^^va`kQx zWqV11N!d{Sq~-1IYE0n17T?qHT&>zLOfiA`I$3q%{Uy)^auxMA1Pma$7&StmfM%tA?|~EGO2+ic$oEZhG@kH7gUtLlJiBTe zJ3ud=P6#r@`7BqC!AX^tK|6)=!c&M9FWK^)00NVqsv8|+ z%qUQ*y>WZ6JvoB1l$_*}DWuzZwgn4546m668?=|?a%ugt{M*!A{Ch{|7?-O_PC@`fif zjeMlW1MNFU0>uR{S;H{=?x>%f&0tIvF)Dsl7GnP3xX5@g3KDMs9|U~j?RdVIjOC`D z*2G2_=MBAwQqN%pb`cI1un87{r;2j!N`$Kr7Cj3O<7XZXc&16ltHac)u^4I#dQ22F zicX$d&t$5jDUNWMg*3YBsel{88DDw1Xe$A8KFZ5pe3q<1A|7(%Ip1oM7NTV z6YJS-<O4UN*!I6 z#g^I#lg?;33?rDu<)gk9(~xOKfp81EAqsse))aZ4#(CjsjKpB%Ko zDR-zk&%7a4uyj3KlW|FgX)G25zAcmEnim|P|7ce_dM0L;uAaqu;aQxSZyO+$N8Bd( z7$1$z$kmZB!DwSu`&fTv^2Zd(i!xV?CN@xz56>PaTMiuxq?fJ{o4bUu7UaBAPZM*M zS%x4xqU6kiaLYlepFGC@ZO!hP(m&vV(dCF$bjZ@VZv59`6)xf z9WxPWVv#b7T`{vbWlg<^xBoUZNr8Me}#W_)yU`;kx{Nr}u>LaB6{a8gfQlAxP z-i0oUtzvPLuQ{Yp%AeWQiOqz;(j!aL%N0aWcq_pqdPY)#xHD8SOUA-M#Y)^zoN2oF zAXH#4SuwZAkXL9H!l|`nmBO~7cU&bG#x&*(8?%=A$c!nqF*D;^3>kyDP+_EESvqZs zK}4f?uTis))1b$58j&`ApKNU?12Nm?u_37wj1<@)kQ#_I z1zGj6%;&;ixw1>p4JDytxxk8HiJ9%%DqqSmryELXrDJoI5R>k2`3OVa_Y#?@V&r7Y zLQL~mQVgHT8QV5hvaG}ynO)Ru6IB-aanpV3^x;R0U^fFOvQAwKht1)pp79F?e1%-n z-KyMTLO!pynCYfdW;(_cG~4kyLE|%R53$_;kj`ha{ol|UXMMcr zox3+NW6VY>G;RckB$I%VtJ!}sNuzvumH~#GE~#6pZ*!Fsdf_>Y;#K8ef-M5fj1ZrkrMzKrq~$p05oGz zZQ#G5v5gq%9rYA&AJ}>PGp~mz@1{H~10wx4=)m5pChmf)33c-M9Ho5Wu7TQyJ9V%O zz7V?LAQxMJe7pmzi!?T=q{RgANZM?)*#dSQTtiDB73XBGTKSis9RJoQf4BPmH^26k zpZ&qV{!C3YRB5tNDp}`nvR@~7k*6{;%2Th`KPc6&Og3=87U?TUw~@9QiW!#_GU^Xa zp#zi0i&L`as=OGm@_PN{@0aRpla-P^xQPFv^zsi$#(ptl4}hy5Pc=&Anfd`5sMQ+h z>&KQ=lMkDBO7#PBc1hufE~T%c-8RmXRig0@%$I-srAj$#s(w&FXcTO`{3yM?JjZk` z=SqlPQr26QnR;SLFAwSm_8t2+>ew$|5>ufnGsg$-1QQGxahC7sJvhPt~R? z=P#H~)ou_uhZ*fq z3qOb_jDM47S@u=Ss!Y@$^Gib8hQV!?0lkZrsg$e`H<@eZvd=P4>QBIA`L)Uv-oeIx z*SGl<5!AOyasLv=1I^*q$*j~c`|P=qQz;n#{#R>YTd0Nv5h2- zGU`^&0fi5$)M|M00U$YW>+Wo&YMNz&Uv!tUvERE?nJ$;5CA4N)R<&wh`}NAK-2%75 z(i74a-Z+wE&7|t?1++&A0=p)nvg&J98B5G189E^Fzazm0B%TW!#SIfewC>`S2o#G^ zuxbHf=&ia7xmoO=446GFpZ z|A|>b4@xV2GyTKRVBo;On;5FPYmg8-Uc^8+O@FiU8gK=ofKoA#2@Xe^1du}K4ILo9 zRuOw*DAtFksM&KUY5D?-$u7}w!W_+3Dex<39^+(sYe<;0g`Od|egy*#@!7LquUx6s z3<@TZfBe|9at2%YK%g);R}F#Jpfq^`lq!{TQVZjTqGB(9j7Bi@Fk_q@-<_&VAeGwg z5x9i48l6MV%ip#B`okxW-dOyn-?JWm{dYe3?&u-@I}JXQC7#MW@o|<(BCQ|)2#JLRczd8%5Tx`4zr91A!WalD74g<}r& zR&jK3JjU?^$2Jc4g3zMaV2Vr|+v#$RZ8soisPrvH`yg$3kfx*w;*3 zX^Vqed3vT)re}8GnXPHO_KvzfhmwPuN`0Fo&Z`N`D>4DR@v2A<$`|o3XT^0hRV$x^ zcY?iuv9o98JjXD@1RW$yT%KfbQYuwhr+Pt3H}F7O*>1pxA*{FpkrK8WlsGQuV7{3E zwrXlsr99?)r7;QnK`dInT4`WntRZSqrE(34(oA)xirTQrNR?@5tBpxq`7K-Y&p?$e zH6a$g43TG<)9PFbq9jS#b2H@&XibbgOgwQg^$Q4uh(eN=@-&DVS=tNbnKY3jBqWg5 zMIftk?vl6aOuY-uGFHKqM`n4ZN;z($kCXBZ!M0n7f&kU1CLHrJ z94+i*I_A~d6r3F+0rn2%!BR~zmdXTmUX{|(L1j3)8su8!3ImtH6nVv9Pf2Ik{zbq< z@(X>Sw2iC7!;|m}X1vG=^$Axg3_=pyK#SR3w2j%CPKKIv8V+yPOg)of&i3Nv)5t6X zq(z{Zm2$H0ErVE^b@REngllZJdF-orTRgZI+(bsEbFRRM+6QAK$)wsXvo4l zO;rttAP%e&p6BHUzYZ+n;qouNkH;xD!XUr*gWIRLrCLHcI$*r6v81Nc4L-ALD{pPX ze@?>Vw)u_V#^3%~qtOiZMsedi;eHT@LF4AajfLwtz18?e16$wTuGg3QS&g0JMicvL zZsWNVG~RdcluAP>{NjJEzwp+L{@ZW&uiv_Ld*}M%J8u8_?HlhbT)%a5ck!Kf7H;2k zon5@`5sxJ=;AM|D=WpSW;gb6D{Kj%Oztes#y@mU2z7P`qyEvO?aSzvbjyG@%WrlSc zc}`j|EmiQ*^R8+4zvqHwqq9zE%8J=knLT+yT%g{Co<-T?v8Nt zzvJ|8(39*_JrB5%rA}UdF;-5g-clH~e1F}+-B@|>P;0p%%{rg{8fciuluwfQKb+#5 z78Tw^sa~G!B&VqSFWxhFmRrT~xKUC+${q(t`bQJgupE;?; z-74;_;l>lL*$$EvP(PWpz-tLSaUaXDG)xI39ir-6|;7Mk3V3}nZVJDH^QKCaXZ?vE#;5fD?>z*Fr)8l(v s>NL?C?wAfBAMV&TFiTEq#_4)&@BcqvWC^M`W|IvNAP|ypN(r0YNm$tIgxTFd zR5YMivDHcysI5|@Vr#VsO0CtZ9ExJ0g4zlm9Mvk`S{094=>NT$-PvTL(*D|C+h04$ zeD8h7``-7y_q}7@Oj5VtMxr5vXmOuAN63RjzADK#U){Kqhdz`{c9{-kJ;+Tzl-0Dv zA98d^Vw>b?cX&O)pcrH6^ap>>Q-_8*^#B^_SCEmx!vGm#D#S->q*Ih~sy8`9 z?2j}QaQlQ~TM|!%LE|-k}lU7r(j?(SqY}!avtrs(7{vpabMZupa-#Gwe zaUcbQs6cLuM!JFr_q!C_2#_ugW(-0Gqa9Dn?zYLcJJF;(GYpRAlVro3Jn|OV7^en# zt6Z^Di+rk9@63csr;Z{zLmZ;FYwRZ3V4KM~1oQ%vUE>@|Ggh09dM(eH11=wF zO{=(b7-*>m*>syh%%&C}AD(LDhxWG_#o<7ud%!||1g&f&ZSREu$4M^gVuNG=xqcfN zUIcUqe;Mu8+|9g(^{&;3fiQRUmf*MT1z1)XT4 zUNp%}(EH|_d+;stkhU?sNir*eZjtFjc;^J!Pdq6F-vIs#sdO zxsvmgn|Gda9ev8J;id0`A^nDeqZCx?;wK&1=X%ni%saj3n)JlErb)-h|Fmi3a%#}` zDcGo^vzS|+M(8}EC0`;n!LI&hWhSwr-|fU%Lx*}YhOP7#3b8So+dm0r#$>oYW#Z-< zOWa&zwexm^GNBmQgpzO2vl+x=T<-o}Y5L z6grpgB6%lBGQl;-IZz(Bck7}d=25=n|3^%YomP;-* zM7#cKl^h$>4I2J39h+D6fN)rB-ZcWry_S!@N;9_KH_y_v>QG%(tdC1 zyWe@a;l}gqcQnNWUI_(b05U?e*~F9~&Oxdd=gLBNQ2s*{?2ZW~8Dt?tRA{7`YNB8? zKzep`_ohbJ=agwm0=layDJ6mbM_et4mhjLsBUm9*u{KHu5}TcbZn*!v66x+Ls)C3QO)xy_?Crg_EAQ34ZIAgRkrIJXA^3oGwti5#LlZT zMb8yQHbYOB3<3Cer$a_;Rh&9lcIr!(s8a`Bp`}}rIiXQ>r`HBj*o5_@_W1@aio3eD_`47ZUkej{6hXHmsI-iAaK^ znN*Vqkw_;I@RTUxCxDy>9C~G{Vs*ribQ!P}B!tvY9EgYEUnk(k-HM;5(U0k>;7mpg zp_(x9V3a#lRy|T^0izZ$guD-8FB>rpGLN3a6@5gtP*>0Tr~6Vz^{4gObCjcXd%_+A zPwO^m0Qym|3Mjv>e#T_0d61cou-Yl^2BZV%ZPWvvTruG@8Wo|2$yH?g?=s({s@hz2 z*ro6MUecEy9o5${Wqt_Dn4R9-v#(r1H--blHS@xaVrzJXM-qt3C*oYCw%yal;=614 z0bx9}zFX^dHBFiJ%MFjr;9V(Cc4<#^k9+U6A8Fi8V@H|w!@fUnt7*W*L3ZA{!L)94 z`n+R<^8@$Xb>!;3`yYS$GwsCHKm5UfCvUla#p;JEX5RFZ&(^+j?!ALouIT*q1G0Oe zr=~pm`$XRC8((VvS;z9sbndDVkIn45Wd2mw#7*~CURpWpgnx6z#(l#Ue_*`o)Y36m zf4DNRIy~sfn&}63W|m%H$)DA6|Dv{=-VVRm?y36dr>|CgS3hIX?%zM=zA9_L^^*dB zeD0>yS$E#{i+1DBzq4iPpAGx#QeL|MmeHrPJ0=d;ap03@mz*-*v+cPXpD#P|jCM`^ z)ZtIu+x-3JS(hxf{_)7^>5t%pxvVljR+Zp)dE z-}=$@cOJfO<&M{18yi09`LXoOpv4~?oVIAc`{tswnb*Ely=~p%f$u#njQ;hj$;QlE z&!*Qk-TU#nNZJeQAAIVKW3S!Nw)n~KojQ2^sn0%1udva+!BKEZWK|pRGDE_k(krc5O;qH~1$bwoO<$;M(sT7-{QDvt}RJ zu`#sq!W}0vpFjF%<2&VsQIDLQuiO6S8t+TnCZ9Ve?pgAv`Q?}M$GpFOPgYX$(i3SX z-~H21p59^37j|bQojsJR8Mk2HWAn?t>)to!`-PT`pF5wnoxShBr>8z9|K6VRDLr-A zW$rGrXm_7=@A=g9`8nbDmF^d{89Uz{@$K5I9rKrPhc`U@Tx0 z;m7a%_`j!Hj{Z{zkd5BlmA>Zn=h-dX6s22ko-kuyWy;!5jn@owKe*ez;o)5y7v7P4 z!`cd$`L*Pn$sgFBb={KPadknCGyjNW4DR?%?FUQGJUOkU;DWqW(wRq&m2aGIL;cjh z<}4~6Nq?7{=M6lq-}SriT>kQL-@qFy*FN~@5A$+H+~E9uj$;|IF2+=DoPcc&VXmvj)=cpY6FRW$>2E$9La!=jl!QXOo9q`^xSQcccsR zAAKS6${Ss0?~E*RPj4@}Ci~0s9mVB8_|xZsKRh?|1ws07NmuO%_sr)SjGmQQ2M>Ly zskrB@?O!~;_OkE`-;O-CVBjKSXy2g4FHh_^wK-US?+e#t?0xys=_jUiM`Pzqmc=}k%yW9NceY-E+-7@-O{!>ll^iS4}l)jU);I5G;jviRF z`d3wC^&bp*)B08RyZas2?Vl{McYj!v{_O6LJ`}c^_F1{|*LS<#PXFM*y9;XzN=k~J zKYny+yXCXIyr0(nxo%^F_kn)7-CZ+Ime1W@S1yh@Fm~Ue-{wW$zGm}}?q42u9#mV;dvjnm)0>xD@2!Ir59 zTgGNSLKdcM$?WcQ4(<^?RgF`tI2J#V zNtYjYXi%G#S5;%E4%|y{51~Z062vF5KvDZGfd?4*FhOVQcVU^E@?1LHknDM$qRUciMH#0Kt0)GqB@V5sIM~3l#*kf z$fc8U<}2ZoItJSSlgZ2G$IWK)k@*YQoRUOs8<#}&R5IvGx=oi%ewcK1QZl(8a2Pp} zlw~YbEO|AF+IA*sGAuD#CY#F15JXlkskTsSTP#$=BY=04!=T?y-UNg_R@!&P)(GoT z01D|3d!ajq=vclRhrqM(WN1PJSlRp9?|?_KR3^EeNoq+Z!|qkEVGKK{U`~d;s$hle zg%-z|IV-R-q5;+ki%j5_BX$PzIe1fZQu8RFRl66^pnD7Sb(UnUo?LH9)z&+xt=A0L z%269uGVF2k2$unDM3#)b!Ce3wD-|q>&&Hc9=P*{zn9t{<<{||f!xsUY$FTjx&rgIM zl7d~zyHWFZhsj#*Y$K`AtfcLt@aNjgXAk%GsBt`Ok&vO3bu}6cPQ8`3_CbH=6PTr43Bvp zSYU+e`2pnG5vu10k}V@uFAX9;9U1cyu=_{GbOL*RWK1Wp`U_Q^gUOZ)Rh^k+lT+1s z0om+~=>+z3XG|xsgU*;vVE5&yI){+ga#Wo|$;doar-Kya#dHFz$cyO&wlFWI6WGx_ zRc99YI8W6%j9iwl>dYo<@?$!I-N3Mo#thwi!0yhE)c|Y*!`2VTwOVjk+I?X>?^+on zn=I+tY&LH5bSf-ku$;jO47wSd#$dgU&gOGvNtT}HTMJ4Yk+qEuHzmuo#xhar%ms3 zCh~>pGg3kHcx7*5vyY3|%tgr4x#xD+If}oFn`<7&@8Ke5_<>t%uIJZt8_Y$-!&+BN z?l3RnDO}F?2PGAhd(5kO3O52iXx_@;gZu$#dxAg0+J1~d8CEhYc#`2j^*c? zd{S=Nqp9GhTJ}R`w&f@&^DX(r#Rn~^B!}N&$<~$;+B!e?xTRi8eQW2&Gi~FUJne;> zw0`clmix7Ca>DWqAmzFlcRHgq$&k^T7=0njFJ$>y+!vPjwa{a=qt`grYpK>7bj4(t z^;R8xZB5Y+Wb%br)#mVp7+JgYh4}8_A;7E1bVDH-M-CvLL+tzPrRFXMv$^NE`*hhHm8oWM z3r9=sX7D6~gs0HKU?qd|xlg&Ne1N~6zn9O^jM5y}tknKQTdv!x<1vP`_|d^`J+WfV z>PL*|WfR-!4bdzG9H|Kc=4nEJhczz&Zr7d!d_emrz^52|fx)*JJVT*c>OAw=x{uhG zOd43E2jpRq4$wjjfc@D%B8?=0n-0ih6|n*ifW16c4IAJf*v!M{X@Cy!d5q41fFnWU zae_`)`Ft`Iuz+L%mY@&m7a1b}%fP>czm)f5U%5+Dsl8tNr1qHhl=e-nwmZ6Ojy~M| z!Vuj9^;dR6C0yLMY|8F;Q6IE6W&fmJqllYNl)Ey4HkX|4L+%Cx61Mv)iX<~yA(v)U zY1%kiLMx0io@jH_#%Wec(=&W9xmZKf3zT%Il4dDswvvuO>LATrCJ}J^af{qIvWauy zZX<2HA9p)$5%+T3A>5ge|0!9fb)d{nvPU}(_fGPhb{uXODbQt-Yjrv@f#`9wYkZyP ziv)y;q&nd5=n$l8vAshK3c+xw&=&|qsa2vF5In&clQf1SKELSdTv4b<6siRYeROtt z@lGf-MF@cRwbF&MOo-Ha#b78}VVys?Ok5FK=6CyBTVuir+{Q?I0&`|-Ye)zukn6=j zSDP5D4Tk(aA+8}pI7}b@zTU=qNdzVA7eZvRYv9aV$6-vT9e6MlsMSz&&A4&?}Hh{y+dWG<9_dHJw6m zrq4&(gm7~-A5!zowwW?4Y!oEFC*Z%7wS&>-N`6#KSi%VM%Sb|#s3+$7gFf_U;UrOl zT}=o!`bgg4hS%NV3g#Oj=yUmeeyY|Jhf?}W0>VfWP^t0OCGL1yjj;ITK9@6OvL%ToR;t z0bdS;{LH~YPrE?eF2(!Nx8#M&`6Ug;CXa;rCP@%nAxg_!VZ?q5Vpr|mRwcHGD-;si zTLN88{%}Bu3C757A>_rlp`wY**mUz%?Dh^%uq%;)xzC5#?5jjam*j6-(g&+af=k*x zYGYKE(uXldZ^zUI;Zv~#6G^9^Ml|f2;}7{;;@ZoGYocbwrHKs8WkPReY)0^V+Ja&z z?DvMy(=Cy{i%^dvuGK;f zOZ-6*wX};tIgcq#1WW27^#M;%poLhbR}mSyMK7z&g^=wOq8N2wAUZ2IiSQW)8q+i* z(%uqRJ0&SIs7j-)inX7v4{__YY8+kSv1kdUZX5^)BkiaIeYv|)RI_<*t}h{JmNu(Y)T5v@dW7f@0UVhz%cbg%(ChJ7M7)xG>J}4i7Q0B zb#wzl7Xi7Vm0p2$jO;RWDJC42Zw!09%P^|oGWoQcHU+x{M1bOGwzpuo5@Sm7=|ZQ# zy16HrMS+}WHbkwR9Lvf}>J(4Vht8sU(Up;QkmQ=wWjeYDs}y++mRIeb9E!23DWwUX zqJIL?AYhy1n~gmHt&+N-!!HSq2o-r3A$tgE%u~@kT_sfq`w(sIu`x+l6nVme51fP% zEl4xO;Ovkf^<+j1$I7ZKOv8dCAZV3vV4bWumF8tnQOhVcNfO%`MV*FNM@A7U*K<1< z8`f;7kQ$#K8^0w#4{>^s3*Ln#2pP_ z(qqkx4h2+4&5dEvU4SIf-cmHgYGs3()QO$K4BEN1Zhr`iA&Yf6E0FOMz0J)O33$4y z1K8sfla2tsbc#(2<9lpIC$=;<7m*IsL*jS-WKtyPU0j0b4Nx~$dk_~h5ps0vDtCgi zrHinq095RYW64_qYAbU^+>{woHU+hCTS;_$Vjs>n;yw1}ja@~RUuE7NAa;J?<7Sul|Oi+tzp)BV=c-Dub4?hfT^?+M)S!Z*U@sUyk*m zBOx!~F2ozi24;Q)a$%U-fHR3k$hAXbfR&Qs`8sMd$*Lip%()lgqeUOHq*bm_A35}04go4 z9fN@Kzz4;w)up5WX$5j6$d#d%Jc)BhKgRQj*d4r==w8o4zY0IemQ83cZN~ ziwypn`rE2mbbDFPc-T-@2T*(Oa(xfo=mbS4Fcw8Ur=i5@$|Fx#7b+8zJat6JOXAd& z)@Q3Uc*WmXcit9u(Dt#sPZ=)(Wh8gTO(mEvXU#?#8i@gwu2|Q}bcWT5Ct*owW#g#5 z$7D_FE<+5JLw70Sa}uJt81Y+<{20(_beAG6WzjtvIXBDIkRo8Cz%57IxsX;PT}8OT zeYLp}wYB4;lmuRsGxzW9=MXK|t7p{~w?)T^LD8>iB&4S9tMvRm{vSwtJJds7sbl_E z>hHNY%CjnM9gT)w+S;SzJ=V4=)(W&NC(B~|_!UUe7M3>@@^%7n0`3M# zN9ar-Zy^+FBUuirhsKS(jZo-yte*vWyO1`MX$$tUV&DJKfx#<#d1w*&nDK!Y*hIz(I90Z*~LOK zFRG`fZH!kG<*;($7>~o`HwHfyqzXTyp`naTZ{-*^#nks~ajHVjMW;m83zOKAK6xkqs8M75)ujvP3@kgj4)4i0 zorB}-HU`re9LVc=FnBEx-nca9mQ{tzW^MwDw_m_u784txcko=MJ;%7?;^r%Dzc-J? z%QJfcfUQ{LL}@3*oWP7J96yBE2O6W9WD7EB_E8+8#t@ZL5#^{zvPN%r;jY2^M7xWE z8oXcRC{F7!f=EFP1qF~BPU*ubHk`I2Sr1_AUQP2xqeI6f)63-08j;w#*Mn{E-e5F4 zbPB;}oIPyyo0mss7g=I7TlZ}`Xzjio-m$8pR-FN=Z_$~dVw=Xy8Ic2yoYhXaG<)|i zz}Tsz+fq_EPHrxxAYtWp!T=tH&}5ZkBvcQWSwv5ZAZP3Tb-Y5Ebc>ZYICwtU-u(zH zOU9dP+BlF<{7`aO#7ctrrFE^$wX)GK4$NJ1$7+Z zc{CU(qQF+1tfisG!`LE@=Zz^th}O&j7&wKL43b`Ma1s-d^F{*~M@*LU7Fh@SJStHU zr6wy>W?FJ3M@kd^kdB>i7B+@)u+SFhqK6f}D6=Z!58(ZRLHX*L(6{=0W+ohr?{RJ2 zpXeOu*3S)8H&QK{=R$O6CfjQ?1}>Au&T7ucML#P=VcL`MS2A<*Eot`ECWu&}2hgB6 zGlgi71Kp-{(_q3PT_N^NlHxcf2T8N79*8eJEHsUhF}CQ}FIs3*D6H?%50JdbUuD?MC z7#Cws8e$YN_KOW7ssXq`!{`jqhNN&&-3V?vu2$zz@6r^ZZe)}K#oyZ$P65+xoj}a7 z!KV~a_*60DSgqC+N>dDr&zsEAT)iP#(Ql;%d#K7$&;mtP#iFHqWvL2gv=v{I8fnL@ zW?FT0{ATtu=wc*#&&Nk_b$+iThVX%VAztU;098INE0j+&Lxs_EHN3*|x8dwHMrZ^G z2=o<>d?pKNV{u6|{x$f#f=2)9QTUzAkwJwsYMNrN(({}@X-eVhR_ zg_d!|IF2$qN37AW1_F^bKbG)|IWiV6!q`h5M~8CI=@8i&q65dgju!dQ9RKmD!^2+d z_#qe;9rBA2qGMl!By+?RJ0`?`BEolqv6pC$y>~fEii*n|E=hpCPUxEJ@kn9EMUE;F zFQ^>!Xw%WirUA!v*b(&7r*@7EA0-sGww8KY3tD`>qJpwkZ&^V_+350uilT}!Wvvxu zLbY9b|?`#$(yuey0 zwk%!PAi#4WA(30y;cFrPo!8|{)%<4p|916x-MF+bYBSydx&whak3T4XLm~+5YaDu= z8v$J@e~VN z+M!*jp*rY6nxq`5CTbePWQt-xWuyfVaZAR5&W=6RBM{K**@0Cj^mzMvHj|%Admc8}_C#kKcv6ggx(;A?Kn85K13(D!!kK z)T10tUKD#X6=Jx0@X;tguPe{_)0I9CGDxo`*4CLy-F~^PF<%A$p*D}FeI`d4Xc2mb z5%u0T_Ei}%_AcA2#}fN%3@hV;M2H>swXj%rd}F!)U;jndV)<_ccZ?x*`Ao08Rh^5dZ)HLu_eqaAk5(Y;|X8ZZ2|YaP3@qcoWwV zf4h=aw`|#98!#Y)2{OjU7X*R{_<}gW;9{Eqp*6C!*h*xrSxFpmNN`DyH2K=JP1^D` zJ<>M4?=!v6^iHody^o}AzBawvuj%!*Nq;l%X(ii9um5^1>~Cl0&6}Aw@7T91$wNnO z6)qu!8|Pz>330cO$1d@Yk8?O9tKSz9@ATi>aJRPi-iFbsbS^eyTa$KTI+jdivsOMf zVaDu2HkQuD`uC5-rmd9O8V&~}j_meYZD?Rpwi`G4t3m(ua22_ddfjoIpcoJPJ}h!8F>N(fOe{)Hn( zp_dLH_{+-p*1UN-k85Ke>&mw3i%cAAwR3h-P;9F02F~5{^>*QZt8Hd1D26y@Woz#u zz1~G}CgtTauHq5>Z95-1ac@|qpW~~o$Cpx}D{i1v z_rwEqamRhQKxtMdr8TVi&g2UJ2nJ-z~kXGu+u*MqcH0s_*R?@{AYXysNx6o=vFptnWa z;596yqU8H>m*t_<%x*vxD^}*~5*q8|YbVNsUe{UDkfyzl8oTD14j3&#J4_94faqGo z@;|PR=7m1CTsIhV2_D*d{6nP(iKz9Fo4wk&;6hLtWgB7G5NytBHFg^A<4rb!3#u_y$yh z_~R@llksLLd5|SRM}m+yaywSEd4*f!sT_^B&;V&A*hJ7q(9Yu}UQJ^=Ky78TIw0Oy ztF;$3VxzJyeLP+AUDsx8gBERZ$ySufDg<57rs3>fjv)L>!a`-r{-bhW3sDeAGdgACXDShw08b^BQ{T69yx9zsy;rhvZiJ&+r{ zV0VE1j_#AbwMv>}?-N^oEtfCMbC$mz3xyvJ&vIyPNqdQAe_UCQ*TN6w)GZF6u9xP0 zyb3Z*D{05tNprn^sAXJnQGM(v^HPY&9DLbrRl7v#d^WsL8J9oy8zOj&11QkL&Qxg2)h zcm<@YVXshaHJoNI&OoJ_Dv|Q(RZ-4VmNU_ErmB1v-maC+!Z#F|Mf39>r$q3aJgUu~ zlg^ZMEtrWE;6F2CDfXh3FYSCHt;#a3Uq7K%^oeGF70>f8Qjc6mfq_)B*_q@O^C!7% zd0jjp7lPZF2@)f-RT~dU=0P?}o*V3l6witp!L!8!^rNP!K5=ZJjqFoL1QW8>B`g<4>7 zA*(Bs*OlZOecq_sIsnQqZFr)dc{XbPIU63fp?lAU)h>gt2aB7Pvtx8|pFM~Rm5!+^ z^R!2RK=|o?c_sCMVK*V!)*(u*A+>J_(TZ}ICHBtp(t}hQE-SsNRB8<`xF-i_A5sWH zJ78?w6h8uqv~Mt4S5bRv<40M3kmQWklgUoa2DyJw`+xK=5pSpVG8J?J8pf2{u8x)ac(T`DNm z64?uuO(sstOw3D4=@x>$d!A=$yWG1kReN{7F1HgHn%w)UKMM=4C+T{*KD&vUdy2Di znnWC@hCvshKEDFCX|-^jB|Uo%Mr)R1DLO;x^={O?8*dwVffwKaJ8IHR@VdMvY~i?@`il$tG$9s>ueVUI6C*`YW47&yd;KCPOFjGjrCwjHdc8!icWA%0 zLDq4)90Ortm%CSW)+m*YCGGW;cQ^O`>Qe8!>sni*?qyDe@cat)!-z|Hh~JDF&F58V zoCnjR#=iO8=&}87+S=Sg-AAo=y3|wb(%zBFdo}gOAcXT|S8H2qXIp3cHo;Gl8Q|}b z;Fi{VG~S6#MZFucu@Uj5_4579+C5`~{kT2=KJN$Lo3SQ}&whyg z%9XG1`&WVa^SVw^Bi~nCiL(l48_s<=n{nQPGoW6tRN(aDT&`ZZEXAoQnW5exRm&^Y zqB1UVYrhA#LR+F4VzageIHX;w1;m)P1o!~sPZ`ttKHU%>)87GnNGHv|0t4bM7s>B& zt1g)7~;#u@1gT^gJOty z|6&BhI>uhc1mm@g&u4ry<7XH(-w(V2v6OMGk0jlUhZ&#eyTSKD@oFEn^?u*Gd;#$Y zW3`{K)lcp1@>Bd%{t6WOcw0pNNp(?=aR@P;Of)D65?n6z5s}%M4=V6*g?FO+~_%S-& z%v}L4jM5Nuhrm^$by4Ol;!v`ZtvpTK0r?WKiOs(Q+)}YjT+C%3=Cak`sO)|&TO)Qb z_YiaIz`3wBxYbX)&?dzV1i&Gpoy^_HT(jum2ic#6h}$UoxJ-)>*D3}}nuz2I=E70p z+QblIxK>*Or+?Be2Uh4qz>9zlcw9LI`g3{?_*KU5GX7Sd1qNI<0Aq}6-6Zd1-0q%r zbgp3fuv_WF*Urcb@Pg!=r$QsY^@J7oc}PxpU&X^7!}ySANE|%(NzXd%;JN!4zsdL` z#-9LT-!sG(o&=0V?{jLoj3dwq0E?2P##11vXKVx-;+6g(^w%cia*1f^n($v;4Wc`& zxef75<67YDs4a0gM&sh?bw{*nwBjkuy})-&s|9B=_gvq!Ru694(QL+8d6wjSFVQ+M zR-UK0S8H3qy;yN?(Y6c3qqz5KJHfqCaUVySSG-ek_i8)AeNb}Z>smja7r&&qv-&Y` zyBZ{SvtEr^|3<}K(5Jvvu94iU^=a%WuUu1VQCM6pIbW0OJh)SeyV&&%a5pM$$aOQg z=PEAYx)t0@6?cL)->5vCb=?jwzgBY3bX8+*zO7MeUU0n_+#Qk=?{K{e+^3oQg!s1W zofsWk*AaJKJdAo(;^pg#aT50#$@z}C&x8Bgx?q;%E!d*>r zpLX95u2ykBaeoV3<3&zu!L=*yPwwx7+jWuCK5(yHFFD;)joDq*RBGQ6Y;t7Ta?g*z zePcthwLim*{^N#HYiq;@nq_O(!%D6AWplB$#7(j0bH#?p&F)$e+E^;96U#Ri$DmuQ z6Ac@SW6%$-iMdbuW;`8OX;K@dzt?!GwPj+f)D)8ypY^N|yA*dPxO#D!;yzUIfM=yR z(OUAiO5D&|^w+Dc5>Ia}`r8BU*{vmitHs@|C4Z~MOIl0*8bnn?$>thSug2$_{4c=j z^X#&+wc-V;>`>qZxOe=vtgKP|S(UvIWsPEaQ?cw3*E-Rr`k^EIVST;Ws<{1Ok9)n? z#oQ;wH$xp_y?B-4?(ug)^XG~?8s0AAqGN;O4_vqEza^3D-Eq-Y)(;!Ru;j$nijR3V zh}+9@)-3LloVXKZ&3s>JG6**TbThb+oDji|kWO|0_S*D-9sPvhP zHCyrp{dmC^<`zX_& zVf-@VHyIyfe3_8ZXksP#^5PTLZApLP>;zO6l% z>&|Jfhhz!cT*mk$@xH)$aTxdvSomBZtvw0yUuuVekHGRncx7@}dn8Z+^aRt|1yLQW z)h~#?V7-1pGlOgNJGG|<9g5*BWX}ys> zHd5q>?N`Cu^^HOgy-Dv9m7x#o-_*8;o*^F8hC|he^HAs^y%D94=-piU8||4PuS?Tk z7pignNqc*!-qkHgf0V^a=5mP}UXYIYqhJ z29G}oz1g))KcX#hH|eB#l<%!a`QF;jl6L*u;TAXH#qPX#B)lJZkN>dyI;O8!vT+`KNz7r{48>n=Slh_5z}*6n+kV(o+ONl8$1ctE1MNA5D-=+O5V)FW%W zQGHJ|?)8Z&jCdcOyjp=Xq7#@GTY;y=4&W_ZdMlT{i0M0+emOK7#4AC!ikrn=f2(-D z7y|~yu(uV@MlWJ~CF9+UUuFD0<4+m?%Gl;>6)Qv%xK^A5Hj8%yJH-cp+gaWxJ_o#l zY~3;@rIcX@VkJUxuZ7!!nRt0l!Bja@7`&-hBlk2C&|(WSFKV;^IJ@lM8%GCs(txftDq4UBW17waqBcQSs& zLlR+d42op!&& z-R8-9zHGF5b*!H*`UD^U4D^>*EX4{}i@nn_+*fYXE&}e*hk?ENDDX1IKe*mUcOCbK zfcJ}!0pB4$1*~St3is!MTRiV`GzXYI;3?HQ`^!(Ye@Q`@Sse2o8FT~qD!%UAk z^i(+D7PuQ!xOK$rqS&42kuac+7I;DX7z6xVIaMkf# zRSR4tmH}6b6~Gu|I`;6ZfopKpF)r5v8}a<4<6IAnizZ;3Xokmjpe{N@3vjF01j#m_ zE-pcdjuo#HIDn_Pf_9_!2JPAUtM&KjkLgET3D=aX(cR^~)V;@@aKFKQxBHjwPUBYN z?S}iDdVAq~x1t^=wYRMhQBRdWE&ncydJ7SR`ofyeb}!be4zSLGx(oHfuG>OVZ?P-{ z%`nagPWi0rMV|dAsY5>hpwV?1Uj=fjg*CobhFipG+*QAz4dAR3f5EBglVU)h#+k!; z7H6HS~vn-{}Y=1eA?HG3^9 zVW@ifd*1ke6Z%tE6 zsgk4B6$s7+3il7nUp9NaOHi8 zX;f5%GM6$>L!>B{9ZX~jP%Batp(GeNRfBz2_M~a&(-RpJ+lOx0TkN``Mo5)SE-+NLiNpix*W>Sf~xnMLYyCp_- zBSJR|&L?UaoDb{bP6k?G@xI^(h5PMjj!`5t=`b1kdFBeCH2 zIMz!oS=@?ZbVcvuR=GFgdD0cH{b@B?#}jt4WOsZzoj2w9-#<@}MLkN@5e$)bamJ4# z%A6R<7gA}f=j5ryecjoQzB9AC(->!YC#@wB3|TodwV=FQ$O2jyN}1m;o5h*zOi2?t znOHS8ohB@3(Y)5kmOMc$viq}>nRIT7XV17L$Ggh59NZH7@u}{CLKf?@N!QZiQmTED zCdBwS1`>SclhT}%rQWoCaN z&(~fnKP6p>EO|}Sj0e)#zznNo?&@L5~ zgftaP*3IJ?mAal>&YYgeoEc5$Gp19~5tkWQT!`iMczUv6C!VNydM1%Qv$$Z`#tk@` zf4mwqXE5`o9;ay3PNdA~1lqm07DiFQc7k7&Lmn#D%!p~9OeamgXB|xE(i7$F-BU=X z7F$-?UtEBpZ9ZY)VD`9WPjgZd8Kt!-xc+ovGHd1X>0}PQG*OtGOq2(tWaxLA47r6( zqSPV;+i8;&u+IZ#CUKgnT*;iONNOmWNN3XdvW_X5<2x5-eJK?*&pJD3x$RBl%)U$_ zx8NQ|H@RYTd+?zet?lewsBWQbh{4^Q5p?`XOfMUYG210mqWjY1_&638+&s>(gLWZT zh{4op(LL`LdFjOXcpH_9ffI!U7ECFZ_hYqM>~-e3DwPXi!M1UiplHkM>@H-J$2v+k zaog!1m^mSwn-HxPHmchF=J5pDwK(W5(OrK3rbs)5{8Uol-c*=|_kq(%lbtWFezE8t zSx|k87(wNX={PNK2x}oeiVagEo100HSmi+VQE3aH_|mPvCrP2~!!idS^8SSN;G~Ha zSnW1I$?agSb(Fm1#6jFDnPh$9a!OaVL~>M6W|7!Z!Hi|+%L*NlT#)}R1f=OQLiue7IYtl2$b^`m;W9>AWOMH1&A7?jLUR4ZP zC(V8IP5VJ=v6bUwNYccZ=DAR&K7Vtfk~Ey2F=@?bze-m0OBJX;;9mvSOWjQ3;yys8 zvS(&STxsLBi(y*4HzR=JcuS=YB(jqxhS~A)@t&-eJu__;a+H=fjP`EM+ND>IkB<%~ zY|&l3sTU?KgG?Gu0 zi7!j1Qs&|nbd)+mwz#*D&d{=gw3ykHTpZGQc>}UdbU8=)gmZU`=q}&-$hkX{SuE|s z%dftX#_mhEjgR*wl2c~NN$!xDpR!W@X2zUE?38zl5#H({UI zhwxZ4w_q(PE}tX$Gv!@Fth_sl?$VA-W{7uAi&hJPEA|%))!T&q&!w(wVa;~wLYiM# z*deTmtN%H}TjZl;NS}o_w=L8Ytb7g`wVe2rQ;wf@2$`NmTTqHv`79Zh z&dijmzj!Wm{&UIfpdE$W;tD!~*eK)e)|eO(TIT@hf|$lzG7A$XFVeVX!JQHbk;63$ zK9B2hTnpe*cttoYY;ad&Uz|kQC}>gJ3$*ao*+ji8WM{+-Xc6s)#T;Z4R7SNc;Bg+m zk3Aj%2dm)m+yELo0+f=sQDxU=%Sp1jvLE(g1#zb#p?IiP8h8q^>;{#=zch3v@!Nm` z*B94}h$+}QrQ`r$K%c)c)GVMT)y;AnC(7FZKCfDF3Fuk89Xu;Gg4z#_l#;b8**@~D zWF3%+O)QZ%7w4sD&#@tv?k71kRP3P9SaN+WAYmnpPM~aclqtjSAG7+4|ha`Z*0xn!`BtY+I;W1_UOT7 zT@T#kisAh~zHR68;B(h1pUbH7xqV=bm`jWJd?=2%W11EL;UmK5Y18noST`cN;d8}B z1gFnyEUjwLszTm2P4`7s2`Ks^o|p~`s%RYyH{oo7oiI+_9mCHb2x6oc*737SsaOGa zX;nKYi5@tu+6*sYocQe!su9F|aaDng>>%hN*l5JG=s?zp zBc3I`m>wOh8j3y%Og&mo(r8S+mDdP#0v7=ZsdgjRZbXGToQ+RNj3k z3hPS|y{ue@#R`=R3VnvG>5oxMA4ZnEbd^0_En;2+Hl>O*P`oOw3d9P5V~^}a&pkqR z=n4&P-d}xh-8p_k^!~sl^b5&3ErK+u_C)7Az94eAPU+K+{37-B^@ecKm6EuTU~Z z(91AUt+|Y9fm1^k0db^~K;uz57xfiCk;1_1)~jVf)!ecOXi3%U)tbjk6#8RsC4cck zC<;EPj!-39z^fI_crfhAadaRQ(@7W|2vZ~Rv6JE`dFMV@EDNJTI6B}}tlNtYsesuA z7iuZtvPxYJ8BKOE7h~kC(t-hWThUUvSyg9lowi^atcXNBomiD$STiXVDJNxO^+p=di`!w|#9~PS-Zw#Vs$b>*g?5LXS3CZMv z0uL#b&J8%y0q_{^D5KdtH^}r*h^!2%(T)!Zqk|DNXsmK2%t)_e-WViL_W6Qk=Ifla zFUX)TpfoB(+1d@>hzYXEzMo7P9K;}CzX(m&gJn^|h9scjBNYl!4@ix5kb4928jNX9 z`9)qo*~bb#cNiYZ7aqxSKKd!=TiYg5TiQE2TH3ZGx3+Y3q_(we+kEl1mg5ucn~%3| z>)N_CVG8=Z8dDsoNAw1-R~na%p*c0*?qz#4vAlKPz^LUp&_E6NM$Rw}bnz=Qr&PzfrLZ8~-8RO@leN_E-%yp^=3H_gaTlQt#g zI~}g#{uisjad`emxnid#F2SQ0zb%aw-@C`;=Q%MnFg79I7vb+r%p~~zXc~%nE5=WM z=o4;BM4Q)|UVOXFd1oE_*y~~)ZS7sL9!gN`By3%oNZ9$lkJK@~a+GM}dYEW|46yivX8N;@&L&&oP)8b_z-oeITX{F@luv-Oa?Gl8=Y-@h2? zANiqXFKrJs_q_SCXFc;Xk!%xv_@BDu=#~2qTro1-(>HLm{9~%4^HO^h58y`+;IR-d zC+3&5&ZH*9fA;amvIa!t-wb*DBUvQI@e;W|lNm~+)yM0m$=@uX5vOe+hV!%w?hu0Q*3iTTTgN> zX6EIpkNwZ^)2@vcW?*TOeDiqlmDxDR8o6R!E^pV3yv)z?`@I`(oK_bcCN*+wTv*?+06-PA{NR6$mt=lx=~ z{$bzXp?6{3MLpDkb1U~@52P5Ausp%zH8x*&QD6T5_^&yR$=__oI>rBw|H0#LP)h>@ z6aWAK2ms?-L`E0>hdsh!0002+000mG002X5X>f35a#U|`Y;!JTY;4qB2Y4LS5#HO~ z+j31>opdJ`a5u*l$j(?fkg}QB_^~KQh|^VAiekAd+)sy zhxA^*kRFkLX5N;&lWdbO<%>b@&CHvbH*enC*LQEr_%k#^(=-!*4?U!5@6hDmh<5aU zhwztK@UD#Z7WcD@-VxjU*+ttgxpZ>j6$fe;A2|Q=g%_T`e}C<&g%|8yc;M>&3oqTj zaKqW#7G7SvXm3wComi@LY~847n`4IdlRtcMyRY{FO<$CZB{l7*KrErX&W>r?LJfa0 zLfaYE$!_`=#@cx?qSHT=Yvg9I^8aB>QTT5=^zPC`Z^4+MkRvfIg=oGN)8=ar;~(sE zBB%rWvVY}C4d7<%0x#Hzd6tlTwhwSTrEeM^@5A$2*t(Oe;T@u!?7>;w89vZRCyX;e`~{ zS8iXgt9R|IC&?vxP66w5las-f3|b#Sj1q!WVJY_LoRZr&ZE~IJ+D6}Rx5W_{99H#w zQSh=Ol!~4!wrMP@lvh3Aq*LjijumrIZxmoXHCDeZuHrsP^9-oE+E-<~l%Pb1Xw*ev zJ5Vl1sP6*(ASD%!Cubc@5x4;0`NdB)8q?!7;?sJu$vWexB4)Elyhv?+v+_@ywk*m% z%FYEb5Md&PjcQi5`;z&6BBU2r!%d6eCMt|o{E`yL?W?vcoA&1RP39;~;g3-)kAV(J z;OFs@z&2H@y~CldtfEdV5vJdsGG6r6Tr=S-j--xG?DZLf^oC?^*S7$RQ@f@%WKb|2 zqrM4vuc_~C*9-!Tz3nl5!NQA@de{C(rwl-815nnq-SKSP@yzk8Wg~Rl@zJd9#XTD= zqgj{Y3p{Hy>v)c5t+YKizYpY&gy(urfl6*w3@=gi670Yt^}K26c{9|$Pt}cmim*>8 z`~ChFG|bPI@j^{!&hmpV{^hVH}5d59mSLNgH_+C+&(yt_!dzAPPQkk zscmF<;RIAfnarKSunw|W{ZWpd8B=?M8sszP;I|N|YHib{Ub0lJjB_;f)(DHy#9|1` zvs$!F>y0AQW_5o=uW*D)gky7~jxkCJ1;z?XP$JM8SYoX#-2K9(`QlMZ_Nt?o?ABu` z*@Z_f+4>`wZ2ZWj8s~>2k9v-4<)EH*Luy*;m%(`9q?StmMvnXNEByI#`J_nmF&N}b z*>!q|8zEQ3t24`v&n!oFQ+vBzy#*eILe2g9)c^>Z2 z{O6(7KwZ`K5e(E-WgpeRMqT4a&=VT?E`4$l&4tbnrh0m3{n0=Wokvlwet|?6a<4(- z(={lIOXE}F6qtb--iBPVl-H+7hgDk)9d>7J2}SwQq#dQ#mLll?Y6EGRKPePyZ8@>L zP9Y}%X*5ClQf{XS*if3QPm#G(ry&Szw>XlN%3)O$Zl^Ey+v%z09m+F{9+H2MJN!l7-NZpmdy{ z+#e=~{Fp~=fiEAaJk=&aSe_|Z$_X{u52Uqy`&^hq5rHDbF z5`w*k1%=YipK9{D*E5p#6uErC^hg{PZMVnF^42i>hTMi4a_jjv*!*(XJ-eDM{XuDi zpWI|~tCk^Oi`SyXu&Z5W*%h8->3k?)VAL!pY$aH7Y?aewA1Wg4cGl^Uag8va`bGqx zpUU+5CSDKK*C3)cc^agWx?4C4v0ZGkVdNI>`(4R7QL@FBgrywUbE(xRP#v^p^ncHY zb+CUXdI1e_E3z&vm_^W53`W8nyc*S1vZd%rJM^sGR6o@=p(rb>pS7Ecbw7&Lz%ukH zqNGZ;!zE2g)LbD#RRxiJL!9$9*WN%Qt*WT&jwaBz(`VhHp3wRusQgV%Ef`kMQX}FY zrMAUMVRNd!{$Ez2{5xywV%*F&@U`lN^9>sgfe{*`&VrF|9)L@;>qO7g%d!Qf-m3cNRzh?kd@WVa*N zH_xzYC(@Qwjw9)Ze-I?+{bb+~hVRA8rq$hV$19eV@5N#ZWAtPZ$;n)*)Migsz*H*% zck-ht$Ljl4K5ge~Wm1%9H9T19DpUO+hHx3zFt2PO**TU}3Tz8eXzxbiP&A(rwhE6G z@_?2#OB-~P=OGWZ9atKEwHjxbTY9lZ}@< z8jDm#+lg1Y^nCq7mf^Go(>#eG&mwoTa4ND7vU1DwJxk4Bm??yN^jw;)|D-$kC!X>{ zI|QRT8%Fn#5I$7BY2Q!$Xz_SRyCE_n(ymC;m`F*ds-*fR2Bs*=*H?##jFhEyfiLQh z;LML;NRI7GL)u9_U%wF*7o#VFR9P58CGBFrS5a+TdcIpwxVRkW8F zdJ1iTCn^xhCd3IzFR7f6Y;^)g@K8U)E9ZkxaPd!4`6rikOLGZha>&F^!xmI>>QwgF zYEF&#GG1w;#L%663Y{7XS*t!zm++(&ng<#%`Eo?sE0Y*S^4!8{$_c)kQ}9ec)_n~w z_ML>5@=`u)o9?BeDN3oIoFESpq14T4!W4&6Hi;cnrO0sYW%Mwmvev)_0P@neo4iky z;k|QSR~dG#2lb5A_vy0wmUWd;>!p>_0~W7qCjE6lT)OWLLru8dxB&E^H0~_)Eb&*2 zF}3s1xPqLfO*4?9TXA}173s6^daPfq31qNSQrZ}FtW2S5#gQK&FNB}Yt;Hutsxz3n?0I^r#1#F zO9uNp4Z--i@!3F<5*1 ze6TP`i$=2jO4?K++hK(-<|_;=JKN%Ro3zVwZJT=z9ZE_;znbx413yG^PA=%dTc}`{cjL5}DtjPj}hao9)mQr_2GS z(*6!?2a=}R{9V^3HtDR|eYSRgKX%|jSe8ourEFNr#f_TPSwACyjr!@_SE!;8(zl2O5|*S{k|Z*s zrYNK&ty|9^K%#QS01&9bTAzVxtjG#ejwp1%FXY|4ah*cB0pXyW2gEwi} zaSUVlM|PakVu#9fmhAGa+1)#Hc7A?6T6VqU*MsefT&}R2T9<aH&&IfSRf0i_ud3e?~q7Uq%^46$rs@~Vh zWv%a&WAp@`Pvz3B!ecm#f!jyfavrqVvx?Ol0Vv+wPN&v!Lv?xrd=J+<1 z!RxR#J4>Isgc?L`74)TDv2K++wS^ceE?cb^c0&Ao?B=`{@e)n_o7OQC5{bg&k-$qk zQCC|{lZ}_?g;&y+FV zczqO+l-a5c`Z9}VmQl=;!W`HX*M6_FAH0Dt15k5?Q>pL*%lNGq&W5(mlvU}`?aso* zydo}4NOT#Z!IzUu)EHm5iu#p-JIJGzLETaUmIzoZP{v4ZMYwfK&By#cwlo?D+E!En zo}&S(4+;Pe5=?=wxJ?I(Xg)BbX1l!DF0AE+4XnSM^73@MiOCxLFl|Z=z89f0cqfV? zGJ{VBs9M)rzF2b5<|RV;s$9Bsfuy*#A!^c?sGC#d{)5|s6`Xl+)Q9bGVybfIS=cpX zS(h*BARZ<1MIg&C9cJGD3|WBW`X6si4U-YqN_?=-R~K15R>vh#iEI|kQu_ewDBA%` z%CbVz1X-dB7O5^Q`5iBA$r|w@9ue13F@~N-j#3$n+YQ+XW;bMKtL*HC>=b7tI}6!a zc5`;vP_fGkO5HkQOSUJTK;4BMq}tUVNHZ>b67v{t40ZnFp@-DE;Z4DPsmrL-$zfSR zxg%O9qY06VW@WW597f?1-YN0t677EUbOTpOX&>zB;i(PH9n$VbQ*O{`>+p9y{{Do&fdT3f zXdsd-)n6NBnK!s2l4)ttNAv(Pi#CmL4T7mg!B8rSaEkK9Nj7ac{EIqldLI52!{JQH zoOZbW#mw{gPmO`gAvuTZci5j64g1p~E~XT=`cu^vJz!O^;1<}CxD?CR2jpyNFnH_| z1BXyO%GiQbWWHyCp;#jW1v(Gr-wJ+gj$ca8-epQ~IG+@IQl-TX8)At$X-7`fCe8T1RSH1 z@71$-sI*6wYl)J|^(O?#kCq$-jR|XCQ_h)a&ZTT)wzCxw{@h3YJh`+;)nA7pEun1W zU{#dYGOFJ$8p}9Um`9tEzu$cSacYA5XmqX<(nqhCXoOcwk_;qB5{kjF67u_*s@iW- ztw*;w6^DaT|13h|jA#t4!s?ObABom8m)bGYr8W0tq`Nj5tKuOLw0errX&qvrFBbvX z7_n{D;oCvy9(MJH#n`}CsDqb`s;7w3lvB1Ha0S_=-LmZ}X;-9`W<$6f(e*@XLoz}t zE3)zE$YZFHM`C5IWZ_$`(ixL1yqQKVWt|t7SjkE3=QYeT{a~~d9E&yJVO?Di_wSlh1Z|bUa!O)ltz_X_uF@HkEIgH!l9d?z;&6$ToW#PfJm>fi z1JZnlPlR)dUH~C#)lEe(cvfd}SZz}`N=%80(ZpVtj{YCVSF=n*0N&&K z1Fh@no)}N7D;YW1G&x*7;^&+&MHwqLWNT6F^wXt^VXkb~R9*HaTLJ5QLvbfDBA*v| zrAEmcRo75rHYiflyB#%cJ=bY7!kLd9MXIZ9Cpw!wLCt0tsG%aSJ7Ppyx7_IDmG9_| zsMBA7923)0JUgU<`WTmqbZIe71=VHLb;()UL00& zjHh8c1B$)AgRv=zB#i*Vq0|LqkSCD?PG_UixCjq z(2dlCNu#kY6ievWflduSku;{Z`{LUlzIe)9+ftIL`8W z+Z=a|i}p4h&&hRGsl#ug4i~^joe3#sa^Oj{#yz+#SXG5!pN*?sor%(gGbdNi1U*B)sWYW3Xx40%5?rqP zF-}iDWBBv(`6Q`F1g_)j-vAMbkba?fL`6x?)gN)efaFeI(8#CF6tx>1}trB^ro zlysPq<`iR=ls?Ev!K^AkafV$5KX!lE31z@$@ht4V%H0{0UYIc|zsae#zh`*SU%>bERu8{d#u|Gbv2PVMEHAtgz69pu)C3rTrYmBOr4$)&U@>Um`=IPG#Z zqiHfqy`B&(>BuXWnG&zW4k_=mqFdxn&ZRz1Iy*~xJ#3yzuLlAtE8(((&ugh}Qn7e` zS81v4F^B6V%0 z^)vmusweo*1yvV z%@BOAzvx>QO%~zEGH|TYMtCT2wYe;sEX4D4lWnPV@nSDjM{sF|^`UMkeiQtmHpLI| zCVsU&;>n&+T6T!C@lu;WY0#Nq3SWo9O~q)H+7)D~6w9THEZt)p8+JOn#5Z^-x|Npz zrXw3mSqvj|)1yVu6hWudt-J*=ZAJtgtGvrDZ^w2f-m=P97kUl=CtuA+>$N8%rrz zT}5y_oA%O?f~O;UL;L75kAQm#&H(m{4ji|KGG3-d)>N{I(p&-e5}YxkvWW)&B-t$o z$m}8+NxSxB;8PKc>#}WL8}IGK@YjvMUi@8%zoO^j-KqUv0^ud08YZvUMdTIdM97kD zzM5h&i_<$*Gdz)HmN4zOh)e`jPUZgP4CKBf+z*pgchah)?MgyzF89Pxi!S;ZN-Ej9 z&5L7N$y&i)wM4_RhHKQjUi6MM=$(k_9r5)}_7r6*qYx77K2V zZdHZYDy2|7h=P6%=QEZfOL5Y=LRF#CwvUslKts@jh9uc(TN5P(eOyQix2Oz7JIB}x zNG_u=i>0!HgE^KJX$K5zIu!EfN=t&hqY0j4<#6_N6Q58Sg(o6bbgS}{BJW@A)Z}0E zo^Iqe;evQ1VMivKw!_SCFUExsCa(ySbK8q@j<*=idMVjtbZ8y14!v+IJ+|r2ENa%} za;GIKt5{0;Lm;xWcMDIYB^LHFreiqYF|5Lq2)714jfaJ=Q?{C3U0{gLyt>>cD1*ay zQ$ONaN)K+_R@r?Ws+=?ctS7@ywA=(9;_q{2(GV?hU_`2R6J75*!RU;%am% zmwB#QT8-*6``L3r4&de!x5YYMUv(pAP6?eR3m^pxcfh=h1HQ^Laj()4?!8E&JHyJZ zD;X`^NRel9TtwMR9mz%~_61FADNCTxNj|?So!F5&BCBT^UJ9%tRj857vKIID9%oe= zD0W}c;}e9nJ-95WDsG*`avs`;rETG6YB$Q28F)K%$?}G_HSpzs_*w>^91APy>R59n zrA?gndg+L}!hF`qzMa~L%&3jYHZL>y466T3)D7WD=Cz#AdVR0@C@&-H>Ky>23};4p z0f%Q`eTJ8bZs07^y-cLI*>)K1wHsjrD0*#!?tUJTlIU8s|H;*id`@k=m2Scm~czY;m~Spe{b!D67|~q}S}} zz$ME7le3{5-X|;1iJS#aV9!D7zf+PM)6yzUN&9=bH>$p~GoiBRZ+yY4oD;h0mIO(Z z%4}XMcW1=xiY-V2Pjm3zP);`Pc~>6>Tinv=vlv#9?-kY5y&`q~i$x;*^mOjTFQ>&D z#BjqopE!JGgpkL@>%y}rf5f-b^JnG~hfh3w{Bm_|O!1C@_rUsKd{l{f4N35mZax-7IMR%|+)=$q|uLY{KV;C;z@I(l63nS7FujdDqUw7Sre{p@IG5rTau z>z31D6rN2N+j|hufu~hJnHPvo{S=Pf`UWW^W3}}t2&4*E&`q3VNp}*GMdeOQ_MqoV zEb|GwtV~&Z33e`&Pq4K%b#k!hK1JE|bSl#NfW$|MkBPkVu7}{*rA6}LXHnMW?8D31 z#QjtcCzFAN{f)JX%h3aO(}*H8yLJkQg=bLn7`Jh8sbtEVDZQPF!wEUcKXfd5FCi+L zR!Ee&wgG`6xPnAQxO`Cpmy-R+SG29+M?Vy~*FA>#1i5!KBvKYj;eHouvLR042LCEV z1HDiS?kR;%=zn{psTS|ngR5NqX&-)IcywPeM8@{=|{L z90)~iLXH>ifIXxBoa#Gx2nsafPj}H)YxFpvx-=dc1M3vTjW{D=gD?7*vgOkD7122r zGpI2x7dJT})HQHXtl>Sg2{V+O5DRvXCFAi1f<4OSi-IMjpecK^DSN}u-e}JLN94sw z_P*f^tLzh;eMqpP*}sGpghIZukbitE5iL|hVHE=!+gQ};W4lvvC(J~Wc+1ob!Ik;A zBsk-~MU+9QD{d;X9U;e?Z=v*Og=B`LUNwp|)BCb&792XRyn^1L@if7|I@Wj*Z#fk6 zmAK<4xI^08u0*7UVqqK^H~^UU%d&-72xyy%s*5UdV@MXrE##MKq9=vyN|J8_FA9LHPbqC2=i( zH_#n?G0oZB886d~+!{&CNLtVh?#I^1zF<9aUX%@R*rrd#k|H|CTdkbe16c-^VNnvj zc9+z#B1uN>-3`2y%t#F0$I;A|J|ReJwe(V0y4Oo6OLs@v0Ed>Y#~w%2(mrMBiI8Pr zAy!LKOH*WNDzr4LuM1IMMR^Y1t@aXhgPS{MD+`V?cU9XXrQ>ksDCue)Wb^2zlI=3K zh^zODuC8jgrGPenU1o_kKeJxHZ7h#uZ#A#yLb(Ii22(oBA!Aw}?I7`8?T!4lN~R-L zIF-*1YMT%NI}K6gXNQq6olD^0yLLJV_lI}SZEfCSxqH4-FT5strCN@oWbQl{c**~E z5e^lT7|p|jpz81ZcOjk*zB2LgeS9NwJX|{i0j3Xo)uD!*O~^Szc{9gy9GB9a!t?kw z|L*>k?&O(#RF=c0>RikM`4FkL88kn_H{H^zux%b! zSON@D1J7aud1BUJqb|m=Q7JijE}Kqw{}lpPOlMC2MYzxVXqvaSk>#S><*(`4Zv7lW zrc9oiolT^$uu`%`lIodZ@jO4>FQC)^t>%Ia?|6vT!Ol$O!0yQnK|wqz3Ejh+I)}`^ z&{O4@uPFIihJ2#1noa%iI$->!K|ui`J2#3o2&5b2Jqv~-j2e774Cc9VEEb$?%E5{p z`Ke<@yC)-nw6LlJCM45o+qQrj9i6SN%ucPkogmUTKd>9CEkCMQC+%LL}?{Inl%nOL5fm%8XT>Z?tIZ39{3T z3{9B|&qqDBtCRmsoR7T+KdOmEnK;*MBkRD+k$M!P`;TPwiX$0aIjYe!SzOLV%?+7w z!tp_Na$FP`@!6c*oDh#XIesK3$6M_UveV-c&zYGjz{`-N#CK;cSt&u`96uQ z#jv{V<#U;xaxSxr22jDGw?;;Na5_diFoRopiPj63nug)@1A(^@;cqhv73{+ zlV>1p$?Y=7l1^RSEwKHbm5PCWdl$P@xAMMpE|A_X(mOZd|SHnm1OBG(~_R*wrnrm&3xa+2|+gmJM0dp@B*rANJa!byMJ{Qbyl1p*N?L9 z4C); z_TUp3^c4*+#hp*`f7|(}IoEH{L$8oKqO}4q#^%t+lGL}0Qu*}2C&1y_J+9$0sbs6P ztl6Q4K209+4Zzck%aGUKp*N&2ZA_omksifyMXsyZC^N0{2=SqQnA0dY{2Y{}QFou4 zx5g3!RtxXgM4-^$2L_>$L2qIhqm@^%ASNRt=(MgBk{Fk2gia1Q`&(P>y7u2;4%SnR z=2%BCr)rWdo|)peH|=$O*#A&>;7^2m`lRlYD!-Jm+;1E zuAg4d(u0r7>ecV&eVIp5W^#6N=1iL({c4$Al(_H;`8GmzuB59guP+6a-yk8LmMxB# z^Sk>x|3<}1jXStPQqUb&F095~pmTKB5tLIClsd&{g}M#!MKty7Wbu*r#SlsU@>YTDG|2l0 zX%}|*DY$|1D&EAsii)+Lwq!=t&PklBik>?u^I8BwEjiT^(9NWq!=Cwy4Z4FmbLiqJ zM1q~1hIc0V?~*b*ky_sELY;ayf@0TUd1anM9(XzUj`BT(ku=I5{UpM`-$9pr+(>R$ zsN6U!$8E}4U5e$TMk^ebt#BHwa9XUOo=|r}D@ux+XLtw0bBSB+ z2f7l+9sk00Tt_YL15jblCPvmC}eh-`DN7p(*7(_tQmPJMmceF z%2A|SKx){B+zbMLGyFP~Vh!(~7r29*)0+qyZ!v)I-AH_)F{RRgrb~>EAQjBJwD35+M~%?ebXn)Clbvs9wjYb<+!bw;fEByP##br8cdrFh`_MV* zYPpVYL2ow{c_u3s|GH1ndTJLsAo_+Y-V@}F@)xOR>bLj+%8>2etsX(%MFVPM-fKPb zZsf-3l!}of$C4+{jjjF<8pb$Yd&%9MjSsw;?|)8h3*Y1u*eoCguMpxK_$~ZSAbo~* z;AZ9y*#K{E7MZVzEVn$A@5YSvv_|2Xbi9ebF4K^0$-{J_ey-y6-_;?!l2sI?cchOd zu(Y&GSaOuK&1wc5o8PDPP5#+=YO@@M!7sg-4_C zR{E&!mf*|z{uds3UTSL7sMAOAH-Gu%iGlNu)?%CNRtKnLeq7&SQ^)BqZDUK z!yTEz7=f^w4*J56*;&#B2E+^#IU1d$TdQ0?h>s(xyaQ9+%ycdlOm*?<5S#6P>dEQ9 zao`DTh8>vUC^On%Mw^&{ADqEySHuigdWe9SVWM;q5i{CCGuj%>aM%pr{V>C^MuCj8 zZ?ZViOAfr2?Me;Yg?KKTM(;l0o21SoxfZ;X{YcK8^Wv2J=rN_`M_W>7O)K0@`x~~G zu5BVb0bq+_qGExnedVx7T8ScUiU```1_Z(ywF-;Xm=PCk73#lT-FS=4K3*(XcL z&&IJga(!(U-se}8Eu^!SAoaWH!7a7p+U6df_ZlYW1pJZI&VPb-ZcOLWK|2q=v3G`c z+{Mxc$o8|Pe+g}mE8D3idn7NLe+iAPE9b2!Owj83Ni;wy1PYi!}#3+0i6bz*wr0C$SNa>QFn!>L%O%WrT%Rdj- zkbJBcAC;f}6yqN(^n$OYTe;p?k(uWhY+)I;<+@3_+qe~8CzzJ?Gl13!3cctf&xzAow9O7dg-+oD`(CDY&f@7Pp zA~HEvYld)hFlUEw0$o^_PMazIdhEBuYO+h0eiFM=mNTBPopJQednaS^ex0TL4HMsu zUH@N&<(t6xSHI6JtiiGCi|D9dS`QJ#Sb;UAg#NAyupPY3g%xIuqK-8OfuPz|(uHQn=3=CbF#$zUjr;v-QWZ=;L_&QyYMTT@VU$Th-}VbB1G}L5AvP?Strk z)i04gp7$;CBU3R>wy5Qf(2dE!2idTJWt}`;BRi;1JwC`Z^6hBsV;g8_AA^|*`8BLJ1}1P)Mc!d=8oAXDlGB`AlNVPkzHKPsc!r^wd5fQUrz3ZqWP`ah;B93!lPDwU`* zVv4BCHR&oX5N6+^?y=fqXyU5-48GEJq$t~#%eLdQ4PJXkn`%jg&ry?YhehpPyJz+P zptbP((1?92M|3noR^{cg9i*zG!)s900aYDd$Be3i1|1rl7lX4|R@zxQStWG(v0~sK zIo{h$)PYGaS-Y4D+etdS&fJQ33TLh(D}sodcyn2gv+SZmbTt*CixRx9T<;HC-Lc!C zg;Oq{&68xlBiA6ANAdGsp6m8|%4^*tKh%`h=5%zcdYuz#?W$OF!jk$eypcK6%B)A2 z`MpXp)$8WR;+S(AdpNm`&5~PblFK-knqf8<&PD4_2rGQ9AGg-(+}1h`8}J0n3oE4 z0CDxTJYQ-S9vy3k@B8yZ56K>J0*0Q-@9oP++6$kQrP8Mn$*MM?R0hlEz?Ri%D{pM= z?v{0KQP>LS(sD;OKvGVJ{K)Ns#J(|r9Rfzy^u*vP>aj4iD`g==Qx>fZmgDb`Tlv~9 z#ANiGIbt-5-ODRz$Jm;yT>?<;D?A5&*~EU~3+exwU-tYz`el#!MV2`H(HI~JDz+@~ z;{^6y+dxb!%;i+R8V+k`1jBDs#jOOko%&b`;Yy(9pYf!$`o*uyLi_*eIj`y!@(*wBGTS0l& zPybKK)0!ibk8FtXFzqmoYR13|=^nHC2K8g{cN5|G8+c-Ll`(6Re7FsXe+`!whimA3 z=?uH@1^z)xf@O5*3_+Jb9w|&?yWBm#9XXxO=Ri*gGdOzdRxEnU<0dY-G<cxowPT`RTsA$e_vF8FTvjc51Cz}S)Y0~sk@!vJd^T?@4T&rAw0dP-%ZqR zPAnbJ^@D^L_E5@mgrB0qmx=#!qCStPbA-Pa$%NOgpp@qd|8oNa<|+dY4=4e}U8CLE zkLZP8LaAgZ$0axDg}@AF*+Ze>j>T<;A&^*FffazV~+; z=x*Sv1Qv5VFvKE%Mc40 zWMQ?}@1*3%D2Ge=B47|pALU?V8QeMdA=J4Q)sNTOuJHf|;hp_rR(iZQPRgb;4HnNyZ56Y6TWO`jX;YpnBoo9g^N z`SHIl-(XdE#jyf%`{ExG%-^zWU+!QAjzfPC%o)cwmFB$6G0N6nDV6!`a>&ZaZPL+VWN z2E-P9XYU*8JL3-D72e9f@kT%Tgzx`+g>US4=kdz;jpVnR_%@VhEG&hd0w;zSc=h9cOoXOi*&{eUOu_r&m=g~>Mb{*e97~qc; zq-&2Qi@Px*;*9XAcE#LGv@BvXMu8!XI+W# znYM6X$a+~_AE!zhQr&iGfoDryhi=YEjmuge$!zpDV1^AdY%#+W zc?a+DJ1n2JTwmV56oC{L{SHJOh&m!F^ zEu{DUf-0~Ysz4m=O2+R;#x62;C1ZT1-S=HyE1%-~ZkKk#<9zr{+QvT#yic#)&WG|w zFM3iFO|yt@>`sv69zv&@V}}nv`caF^U!-&0tw`TaeM&bc)t*g0E_FGzyJ#|M(bb9v zf*GQi`-8&?r)()N>GITN&>KC6?WjGMIwf`Ho7NWf@WaOa*L=h~_)JviZsKklLpyMQ zyxTT+7naefYw;}Ii1bs1?~9#r{=MFvWasn5&QZPsa$<+UH>2p{Wrw;YXpRHQ2voR- zRNadJjC=>`b8`F!pTi<)1S)u+h$^~u}LI5|ecm+BF& zS=qCqr@ErrH%OE?pZ(sm9KAleatBu)mL3Oq+f@fH-GA{Uag;Y`ybrfz$2RRF8|k-S z0dLxI`Ub>b0e(*g_{kHs3pDvh-%H!I;6+K7a{ueHs+I#m-tXY?^~Lym5P$nYOd@{1 zN*f}danHqhkQf(TodrxC(YNlQxR>Hyq`14gySux)ySo%G9PFS6D8=15#Sc>4-QA&B zAOD;8Zti_E$*kF#$@*n>GLxNIdw-v47-8VPPN6vd;I|(yBNcydqf_- zL>5{X$JjU>GKO=f~F#Z95V7(?Y!MVlEXK5_eCTcwGIt{7x*A?+vr=K{)8kRSNzE_k|?y zlrQ>ed-|R0lXb*^kLwdDx`-t3UarJs)$b@_=n_-7Z(D^g@H4RRnTHZ{)sNPh+FbaX zm9^-oN81lDX=Lz;z6Z{L2CpC%P-W8^oucbIn1MHM=PC{{s6YTB*d&AjRPn3l!^q(I z%Gvaoi}E@6J2=Jdi4MKjG_AJBks2yw74k6}qcVBR18;gf@u1&7eJNcbF6V`~wS5Ou z#4zv~4sXMwPsLK=Jx~SvMAD^5%dYt2!!WG(Y`rlbYy|=iJf;`QDRDnh0C3w9YM`ZG(zW+dePHUt$EM+ zA8Qr_Qw9bRC7vS`E9yd7%il@>oPrMMe!IqzS>ASs?va~065A@guUIjo?JlzVD>Lnv zifI{H_8I)s$K{OY*|)T>yMh?ocY;h(>PD3{C|s|dWiNnw<*PzGQx7!}1Q=FyxfHHzE8fBZ8IJSe$*>FA6 zHJ14|Ckd*WVkhUm79P_8!ny>)x;XeV`XT2yF(N z+@(h9RA=a>E{Qd>d1)!#G~Nvl$V1MS0z7t`re_xQy+@JfbmLf$iV1ZB*bm63>Geu0 zbU6JRmO*UZ9o~OLRy!ZA+T!VjA1`({g36YazS_x=M-|t!)XTxtd{&q#FZ}ln?vknur;Xpb%;R{G z#Z?s%`FEA-I+eGW$LC>v09jjhnx0d7FC?g*OX0fb`u8SX$UjXnNB*xwx_6~b_1UNP zACg6q{;NBX^nvI=KQp-fZu{~5N4v4mvwNkD!6T7PrC$Z2mJOHL`P$FQ} zcoFD;%KaVni}{N9Gi=))=_C#>z#o+5@6WT9?39aJ+~%@Iukkzh`F76gw^_2?MlIDl z_E@xY8X$y|5(Ue|hm~=$AbE|&B?GZ_P$htzNE?Ck-Y9?p6tQx^az3slelD!!{~{1j zlB2mjNs-Cb3d;XxUy-BjLZ^n8L(tr+v2&Bry$GqQ5b!emG=A;VIinC||63%4U&g4a zav2)0L4eE4eM@m}VOw4YaQ0m)pz^Kr1EP7M++4h_*}#O33KLNBmdZqHN2M#X z+w+t4B3Wr1!zK5^FTX`;H=niXNrh6%tgxjcRWU? z;uNTW{3OJk(9nE;>C`GCHgnwBPua|Y%9&9~SVgKIY)_1Uk%t~9v$-9_b4e%P%Y|_} zHlK>+siQjBn&v&y`HL$rBbjx0swtCIV|F^9Mj0P(mEY5Qg z=xwhK1PE=ahRn?QKGC1aHvb}By$YUcoikVJ=6JQ6YMm!nG9ne;;sbH#mmGTe*8U~Q zoH*Wyc6nR_CflAYT#*zATrcw8Gh+PveJkN*+o>voD3Z8-(vv^)ynVG>U;+Zy?vjT2 zFL>12ua((|E#17!-(RHpTU+Kn278s1pNI;9PNwiCmQ&#`!SYG;*+>iqbs= zT4_bP7u{p;@_vjcP7S7T?_T5_+GK99p+M*kwh*Ch_)_K9N5ndCNjvs_ghtTG$<=*8 zYm(#^QEqHFyHm||0WHOiH{UgY$JKC&z05#f&4X@lj|D18r1{~W{Qcy`w8kR!IpW%$WQ)_&Ja?6WJR%W;gTJ$llQ#;NN`56Z0mnxxyZVbl zSK;~WoK>^R^Geb^8Qw|mO7F8W`w*8`5%-zMvh4=TT#9|l4GVXN!koe@$&hcH{=p?D z>GT{-GtxhKiJ)TI@uz^K3K6xlLr@0c&_~f(!1Uv+6++V8z2!} zWE(vvNp?qr`r@BDks`dm>ByN$J1$RfzP1{W#KYCYz-fOrHG1+*&I=M;2?E7JNpP8BQD>AWwXyikC)y*B4Bog+RgPR(D*3c z0)_<%2F|yJ<$FRK#OzFp`~a$9LBqaag59sQ=O~sj|4H(kk{uY9NnQRsJJF3^V<*93 zZh_F=t*K=}vqJK?sxo5R4mF$IaMYCx%oSQbw8$37H0+z&S`|ZbfUs8N<{%G%`sSYV76z6G9e98thPp zzH7sw$i6oAiu!f^>NCwSasROHq2WQ7ur`6;cJJq|?+)FK$hE`*ajsl4=IC9-LPMJq z-pnc2Z5}Ejgbc?eCK~r5{m(qCCI?GOkiYhh^zY|#J#p_MiwOx;TRwWXcx>s`C`B?{ z3prPQ)+E;|P@F)Ghkxr;GvPlc?DMv|I@ld+03AD)lOrIes_Lt}AYLT{T7y%|Ksc}t z+nI$fpTR;ys|{O74!Qe1Kit<+vRJAkKe*_Kfi#U4PH@-HnHc%2!Hl>^ptRf z5>?~lfRnMOvP6@~TphMxrrpBI0S-Y6mp?(6Q*af6fkYnsT*6)jvId)GE|*mS7hTs8 z^gXV>!9tFI4`<}z-c9o_FxT@uh~HHQL!=p5X*5l;NJ$tJO74H#fml+;6%V=)r(u+~ zQGP;5GgJ;1(nZei2k2Vo2fa+>0(C)qib*NH^JDz;ZHc>tzXWtgE7N+o`L+DH!PsC_ zFfo|qp8A|6@e;PwcjhdJ^2ykX?Up4->|JYZ=RVZ^U#hcl?u+2%a3l6q%(Y?kl$y?#pGbjD)o#B4 zX;)kEOJzo}$0;8w4SvDYm3VYEYggiSCTgvfuh5qEJ=~Cs)ss@R4|I$EeOpA z;9c`)Sv|H2W;unh3$IUG`Ct`ZE1aR%t29H!Z32ZCT{Vj$?!v(6foq4z$@~I%v8Iz8DXFxDDJ5 zQX0LA8mh=0f^rF)L}Tm@E92n^=Gbjz3ntn{sPqZl>bprX`v*_D3?LviC%Z5sLvMHw zf{1LkkvXjodyz#=Mvq|qyahp2lGU>tYzpxF^yMzgrviCg8?HDPPoV$B%fj*<*fJD< z3gzzE4L5*+r1nDnk|C_SCTPT99erhjOtBlA2IhHrH%vMo^hW)~V+&#NV78jXfh-T_ z>Qv)z1!ox#&kzyx68K7fOPWP(vib?DNK~B|J4Wbml^-7NhP&04%ISDlaQ8?EQrN^` zGu`|Oh{*{dyCwT1QcTJPABgGod+Dfg{!@DCIkg-fK(jiXZylmHn#bZB>%m|u`8My7 z7xmZ0a#QZ9?qW3&ZrL$07=6_~>h zf29TCOE42>f`wE!LYq{#EI`Pw#&74bOfW$0vQj(!@PQ$N{TH zA#!sFiYQ)<5r((2=iz)?8dT+Kpav^P17IhMTD;i=A$7O-;RsOuW}w`UThCx6Ys$xk zKyZjkqPFag1#)%i+rpx<1XUJ#$gv%$K5T~O`DSH5L1VgydML~K+<3Rx`WRmrOJb%$3G6WdC#Y5md zzi|$3bt337ho9#U8PXBQzbLl=htCqMLf0@Et_VgfZ_isJP6&|FjF z!yECxzi)!Q`lc+~#7N*K{i6{yVR&0V<(@Fu^Iz3|L})M6EwDZH7N!?*zV`I2-V^6Z zMd&7LF#HqKE?y`?QULTNYcQN|MLoh*z|dRlh)Uun^ajkt?)((cPjKOMH?%kM;99pi z0E#TsTGh+IM$e^j!(w|j=#&m+@gi&!RyrI5t`N=mv%kYp|FnyQ2N-1_Vw)$D1=WN& zSmo(uyAwQ4X(Rb1)km_cGkz0}16D18@W@l+8Ty|W;|;U{t2Vf6^Jz^VTjP$9=(oDp z`Z4~w1!ltT6-2y8i1gdrnx${CFeTA@@wJkmPvjwCH)frHcKc|3Q==r4LPdif4bM@> zai9WwzV`aXlIzN`k4BET+7f_J`_0+kycyt$PXOUdJ{iTW#$Tfsg#;5_GjtDM$xg1zKxvM{Ro{q1@ntHqfsSEa3; zGn}6_m4&y&-bhgBAol%A`wjz0Kr}y)WyM_Op?hP?vAd^^G~WmznHcg=cGjq-@9ZEQ zFaM_I>S6B*BAY?|lre_K-5fqSFp9|o^OGjsb4bm(OiThGny;vCG2T)-Gum}BTI)HB z9uxGN4$&t^06s#oBPU!SOT%cCN@4C;*{qqvm^KTh((Jc|rBjO`-xP><5Y$wp7N0hj z{Rf>c+mVP+pHRgyq6UW!;au}c?M}>KF{@dtGWo)@Y?hPXubCnpDHpwH-PD0& zKAL1b{>XBvwx=sxMj{u_b0CYX62c?1NF6VgY zA4i?#iKzY6d_^+h5}1yUV))8vyJ-E-TRQYlSL&iIxbV~0#N-aFU*s~X)ou0o;BwyH z*k|QES+d{}2~*1~qQa#IW2t|CPrsDH`&i9^PTh|0*$)eiXh@}Cl=x4VxdI+D$(hC| zw)*1QyhSZfep1mYjnT}Jpgfv+m6qj>Y8Xdl={>J8pB1*&N2_+IBkQq2lyw`;meeAz zUZ0?aZV$g3ALnmdM(02BR@e6oRRG)drAshEO}b&gTv(B29Rmz zzWj-=P|;2;t7uI4X-u&}_RmCD`s#)1hFq#uW{C1dU$So&uHmxT2E6~xX`Uf8L3Cvg zD%!tL4t8Xo_@6td1hSoaG*hRD?IMMPj;WEx7oP(7j`r-xOOdg!zsyJ{@XLWCS(%`^7?OFubw~ZIL1*HU(6$XRu%@|2VEdmsAlB zrG&>3NKzWC`G#e2OYDhS!X8r`Pq!RXC1}#w9Q|dtigyZSR4+klgwWr(brPic1PVEhTeek6=)4_R7$^Beg;cu5uW{% z%8Qu#`$m=Cbn){}NMIg6bJJbSu~pY#W<=j#1yu4+h*%3l?Ol6fcV=fZve>R^JHo1> zTKWv@X*j9O^2eXokcrvWw)dnlbvPwn0s@;dXYDtwsaIqxjwEpjel}en{iTSIhRL@% zv^DvhNEL|u$td@_i>eN=1v>aS(q4k73@7EL2T&ULJBFE&sG%I@PF!@6o!l_bU#h-h z%bLZm6#8`|yiTP=nZ3;7Tll*#y-t&M`=W&e0hqw{M*U#J^IPi>R)$YC#-uL1#j-p@ zPYDwM~4bywMBKF5fPpLbAxo{U0B zE?6RLV}teQ*7DS`1^R)%D}HcLXsEhKmE}i|wOC;XQ&Cdr54zh~OzN<$upVxC$Mr9y zevw&6ebiAwcz_QGBqhm$P&%3GcGM|j->L&>IDP1o>=D_VPGAoA(xk#Gh^>FIS^*4` zJWVEFW|W%xY#99!WK+K7_b?W^B&_2W&&|*?!uiMq8&oBtZE;zAwuuiUGy-DMCmgNm z`Y#fBT0PaR+`p*CY4HnwpOOlCqtKkV{E-H!_8v+ewd;}>_Tu=FcFz&@3j+JqFG_q( zHHzdymAfo$@&M?|%%;gNYi1y>yfvDMP%!lkao#Y=dTossmz%?_Kr$}rrvh?cq(ZS; zUg&jJ;yLc>_wp=v_)BImih5dM43Frh85>OpS~^=D;&Mydd+Mn`x!ctDrF+a zrX8R=d4V?_kscZz=3Ygw5#Uwn^I@J9smCncA0J}oK zV*F9-3C6u0$nLpmI=tUpatxZ#{0}!mC#O+@#WyOrT}^IL*|5VC`zX)go{JWnbIMh^ zv<6q_SOa4=5n&6=peUwUEMH)yBUjhP`VmZiifZ-Zl&8Co^d}sl_seET)VJe5d6wg- z0OZXdi%4K%9Vso-(OYy8NA5z|uhul*u0zgj4WqEpp=Q#X`_^+T+BVLnq$@^)#6V z$_qWEcaIdkn25WE+;JvLw!JC^FYf4lD^kkR=C!;aRd9$+B~e;`PL&5`*m(~szIeWp zk`fWb>2R0%;m2q-1u2tI$0H{m%8%>e6N9;w`GuJ~Etm6t$=ZKLt2knIsZy!SEs@ab zA64{jziG%zCPfTz2^^?_d=>9S9!+_?o?*x_^crZR??@as+#q52l=GpSBbUGSYeBv~ zo`pU7Pcb09)2!<7hRZr9?SM)QCq>Rav(v~sn$*vyY?@xItl8??Q84UtQK}pND;?G6 zCxzi$Xw`AmF%mhvHd%TnU9`5Md7_uJz3J)j!#2<_L3l)FVQ2fAQsb@Y&awefnZFvb zSv$ubNZ2SWwv{sj*!#&J1tAIk%zu=^MUx&ceV8G}0-5&)dug%^TByX;u0NpBrC)SCkEkG@;R6i{2TWITK#a-*K&!Vinll52Zlh0&=c3!SzZ}x2>(M z40C}IqNk^AZ0*=A*11)`TskbxKLzp^1aR5>-HwktgT`p7M!o%pq)^Iqug04Y|N{#t0Ze^rb3-JT_Cmt2D`o6bzfbb!d7degt%9I?qs zaj#a8#@BNVJz4g?hFkzb58RV?3peVByE7L{Et+GyROO%jx&q3=C2f&9&J9_3F#$sX z6&Cy}mavAL6PTS6{PSh&UvZ?Gf2R`(?T&V5zl!>*)a19|YN|g5@Ufm~V3fk?9u>Eu z+=Sn^dSHLXY@xzbqq$G7Evld2(y`~?+K1jIzcaepqC7J1{cwBEs5Z4AzER7_RDb?E z-en@ z4-K2K&Fg1oS#}H4+T&iGGcJfg1o{_v3>4B8_VM!#q6 zpD~ZO4F)S_ehp+ZkEj{TmI&}M8O=~q%IwVI? zKh+r*zZ+>=agH4wV&_0$<&0zLc6*JqHLXidRb)Azkzav~rh#3ae*WLJD*Yh&l(9N# ztw_>zT{FnQAIqGWz|^LMf8)fRPs7j>@0AQR_7?uL8KT95eGaV$Qh1V4Ra>gXjiZNl zoDmEZW|$<^NlPH}#g#vP!mN&~Dy1aX5X=`Yu^T_?S4n2$fY-kmm&690q3#Dim*Tke zJt@HL+)Cl?&GlHPnRpOHu4r|B(=C2(b{G@S{xfH`itKTPLwy1FCs@7ui zQHRN)uu{Lrt5<)@2fl_&0?HahH95e|(SD3BWW)3VhQwA`bSiLRbofq|c&y^PzTV=@ z#-SqPKh-waal~5YMIPptbznp8fHW!$?)-jO1ov2LUOiLdzX$yBsO0i*bm84$KO0E;e&FhkLl!k==@!#Pp7XOSm6YOVlrLf(sxJtb&54DFl&X6P2a)Zxco{;Rc zB2_L2Wxvn&38wtKRngoaYq6z7sbzABKTM&%;OucFi)KNg*L4&Yp>m)hTufjg<=>Bb zVS71;2yaKB8vQ2_>*`63s3-bAZmbLwlmq@Pjih}Uv^R!sd~8b0@e~Mhe1RA;^=g8o z<2V9c@RmSaa*KFcf&x;_dNd_=?}Nopeb0s^kP|`#Z8HZ*nJM3Nus9(?OkBw>hg4r< z2T2cAPdF=lkzfm(Xz;81^!Ms*A_m$CybPG1efmR$2ZX%r%*5^wM-(%%o+DDmV2Siz$Kp!mt?cyO}S5!DOO(rY;PB z#S;EGZPZzxD(w@5JHUef=Wp{Ly(U>}IU*W&B3d&&3*O%avByZMAPAhruO;~Hd>AA^ zPy()jemJbHc?HN0{kQjexZ5EaR@GOpmKG+7@2WLncZtuT8(;CyE*5Rw3J@198NQq6 z#c+OMr1^(u(8CU_r+Y!rxrP^m>4SBlo{1Wv(`IamYAJ;KJFgl;y$`LS9%$9jp12W(*xrc#-S1&o&4T`EQ;Wp>>1K%(&6qiq zNnaxWzFXH(rhc9IPCCp#&Oos;btlieuF9dW%|gbwUNbe@`n$GB1QHj5tgB)2WxE*F z=N+qBY(YK$Ag#1r$R2c6+Nrm{%Ob^tPp{np=kh+*JTc*fqQ9D%>i}AggQIDtRu<-C z3)vnR1mCXWeZ#uNYh~7F4KZ6ic#ulKWpq{;;$e6mw_N!2nl#;#r5z>lDdavE6Od|w z2FEf{GWDB_podSdLvcV0OIYe-&OkrS1)*fW7NAf6Y?x=`dU$0K)f40OZpvp}t=HD% z5bzkeSko5pnq~L-2;r+0*fO^gA;iziCw$6tu+w|r_ zl|7f~TYN4$il*)NZb)Cz)9%XL5hxP7GIFi!;mh)lO7e1Vr1EO+iYnw5tXZ?he%?0# zp>Ar_z!Ss0bvXgOzgX#~XrOZY1KGrz)rO;k3(@zRXUM_3B;jlj3Gc{f9dSI3j`lo$gz5MlY%=k)FI z-SiQNQ!o4W?=a-*@Wbx``jZG0_J_9vBGj&dr1UP7pq}oxkES*h6b=;C$H{-Tum5#~ zf|78wb9J?HmvC`%b#bpz>K{lA0)q1Y!ixW|p5l)7PL2-d4sNb2mR80WdI-K)i}(SY?E*ma)N`>u zY$I|ac^MNiDDn+io)8Ffas*y#I}h5?J`2nAO_U-W!fT0YSoAVnSjI-JD6gfZ3iJw1 z#=!=LFJhJ9yv>m-Iwzl<>6@dHP47+J&D|ae;4RONr_QU+E8y@%W|7G#O#x-diL>F~ z?<4&ZttE-IU29J3VQ(8sBy6MvFKoQWGc#)?-v_W$iltW9&u_iO$>~okaP?i74iH21 za>fV%4F|Xl_B`WG8qyl{MgKu&?q`S42VQ6jdbf z)9ol$X}S*zk!luI%^1?w!+$ z;>ix%$)SWJH4jVdiBX)g%<^b>zQ4prw~t(Zkip-js-;?-@3>F2Af~4ej6aEn2?W0+ zrWz{kpzwp4z6@enBWra`Wsg#IP$blUXAclhP^1Pfa2&%T{f(C|11vTlsMx|1%N@>T z@m@2P0-5X+3HZy8`6P7>>0^)ZcRT{eMp6KIT2#69aCeu^T$`Tw+1&MTmzX)>ObaO-E9Q&G;uW*=5Ms{F?U% zMA@mv0MaOao!?)KXq}Y{Anm2S#;)?eMh*TJ)=Wzu>3>K&Hi1U$AId`|geK%kmlDON zr7<<*AS71m75bHdlP)JKBrkvOEkm|oh9YTu9DbV+a6M{fGQLk z2Tw;;ywG7fe1TV6&fln+0Xak{7x3+V3~wUOG>R52PE|T0JEk7;a!amA31>m3_@fgi zq$BL7$F9hDcP!|@UrI(F3z?VWlYtsQux4BO73nO@&GMXHQA4?Qg~D^fR>P~b23e8^V1xM*j2yRPgN5hmEaua9();)qeALTbTqg!zI(gju+usmZp{4DcQq7@}Je~~A+ak!_L z<`12;qJbP9Zv}Z1^7Qb| z!Ox_XLfav`3U7AUZJC0M)Ur!U5B=%eoZk3n}mKZ{V2|> z&5aP8<7iS=PZAc&z`B};Oa&!R2E7s{>3wYtanMYeH(v|k>xz~&?vA++dY4*J7Jzg9 z7Prh7k%X)(g@})vEWp(&?v3ms(V-I4nMB5iP5vx24)jc*CFd5Ox_?xa*nFl(?A94> z;ES_#&8weK6&mDjh~zsg4@|Zlot_$<8Xp~JE+T?PfZ`F2^T#J=rJT(7Qv87$LO^*A zM*b6L4ejWUGKya=7+jn>$@(<23VELjb+VWDLz$ED)!M;$jM(Dt>(_w2TbYVm1+|#< z0%17CJbtIBzwnIqiI$p>pb$>zvj%t2;hxx@zXg|S@GbWR2r+fq3hJ(@jXU`}u=R`q!)&1G=IobPC}W4qTqK}(0&;P?m_mVPsXKB#vZAMC&-M$pE=)&CI8~kjS%LvwRj?c=v9`+waP%AzTY|o zpUFTTIj5ODJ$Uq<2;N8w2-m)qqC2q)Z{iYEESy5k!W}#vpz>BIIni1bMeS zE1@KY@9pr;{ST-dl6bIQk<&08vEz$KR5ZV#JAN@P09wnc0T1hD1voY43#_BrN25M5 zzws(m&@!VQ1k-EOJY6^+_&I#>7%e%RYWrgpl3kqW^K9@RuyUAOzd<9EFQl4b(8k$@ z((9n6AD>1a2uoGd^66ERydq0l*kGreG9RR=O*LleLZ0eN=}(5&bi2MsGf$ zS@}2(lw}|K2$(S2PBTh-%0`^k(M3uOW~e6fkP^(=N+~P;i?nF2?9P$M_>3vDdZ(n4 zdC`=A4*X|A#v9vUAk-oMY~L7!yb~; za|Z*0Iq#^-g9s7*zg~x>(6t~{7cSKtbWdXkeNy&tmxTSL(m{Naa)~1xi{w$}e{&M6Zc7!gLbyJ`Jef9I+%Y%;eXQVDfdSu%= z&CptZERP9lO{Kb=^{$FKm^qa?;Lq2kZkWEO$Mn%cDmzKz`vOuGJ-I^d&K;2hp(BXd zvdti4$oC=dWcYTd>e1^$d~uz4_Lt*`1Lg6zhj$oUFxbSZ#CSZG-(g7iykK|SXRau9 zA$SvX^SxPv`B8~_#z$GmvkQ5W*ka`Kp55R8Y%4=MN^tA=6XYCVoYc{)-BeJ`;>BWT z-afmUn?x)rqoxv}=9IxeIJ>FID-W+H7U8jbUuNLLhHfCr&=Z8n-ZX^f7fVP=IK(iH zXF{Z3VXY0s@_veMe-Ed9UZ!;6qhP-0Xop+}3kfbEa2l~**U>^87#E_HbK{}OqZ*rj`A1t-V#g;X(q^r!1d?07xMWf$bA&l< zwLA6|{%?RpN&I%4+J^siOB~}f&4>dn>GizRw$jwyyi;ldL3S>TTWq4PyYh}d#?$=Y z+}?NF4Y*qvbf^6c!9@Vz7(t>>)X`RUhA`q_@i198y?=MAa(qvVCqT&Q@^k`BRX1GLrQdohv>F95*krorCbUkvgsi-r<4OYBP`52)+ z!5O)RS{*mumk4i?ih>RdLY?l^q|vg!vWQ`le86V9umPjyVM18L-}Q}Bit;}pGc1+z za=4^@6Nq5c<_RJqCs(P}*yvsgAnCD2Sun*5h_2(M*mVFf22m%ytt#&7WK@trD3B{4 z+Qoup<;XYxl-fo~WDTfTw;oHFpLI=tnz@;Vw6RU-Gyy+IHnKJl8Npay!SA!AgM?pEOXu?)guZdU?EB;jyQ;XK} zYxl}dG;AS4n;;a|4sLR!pITW=ld|y;uuc<4l0*FWOGaS%Vq|=Hiz*d5N@=z#F_I+o zq)AqxH}N+VO!_`2Zo-R<^sP9N5u1VqWNjNwK5|D+1{8_PpIdPu>j8F4oed?1eylWYFJse6kg~tfzHaeovvkoqu zuR5wPfd=Q%;UU~#t;-6g&g-J@*tDr)tdBW}BSA*8P1XmzbZ(eI? z_c&I`rCJS;s-2A6t>jjd76q-9;YH?!wN<7Ep=yzh2_fyygnlh-BNAYlW)VE9!x8<%Us2ZYh$Tv9BSg2Ug>n-!YH=B) zmkP6XNrgI67#_<58JPVQeS~v5Lv1y9hmub0^aHa5C@AnvZxJ-M#)a(T*Br>0AYOcR zZMJ$_wkBFH1jBHY({p9EKxkxo{WHvd1{~B86BHUPIR+%iwlaLLf_xHfL|_p&dBGI= zVLqJf=xAH5LV}Dl+1fdZt>j+vG(w0b=l;o0iZKbzgm65uJ_4O;cPu^XhKYP9rZK(Q zAZ`38kHgUYFZw|RV-pOv*+;{3p+B;dzGR<8`3i>&D6ofr4~Lf+{#ww`(I!@(F;LcL zI`2k{>TYg1wV~zON#|)|Jc&!#e!YTNq02kV1#qgl8hgUQxrIb|llR9K0Tbtx`#FtKJ*4zUS_V?yr#ZNJcJrOEz?Xi zU8OXQH;0#EsDY!7{cRTF_Mxu5cMMk4_d?ZImrC8veS+}!z^0Tq^G`oHQ?j2PHspmj zU)c%N@uyBc139v(CL&_@B;c8lL*DR)RynEg6_%zh3CnA(@-d9jc?28(Qr@(N#s}z1 zK7k?~;Okh#BifuRs|*oLt>Vh?suga@4aA(4qGc`?Y4XNGL&M8vNSXmAzcAbf7>fm> zrRa;!6We43CZ9Kph%I{^#N1QPh5+Ysb&HdcOzIsv0}e|fq)Nv5-+AZkkjn)|@D}%? zCHB|(>{@0WPyi`-p^I{elw{DFGR%8=zGj0s_yh_~D?d~THgPEj=X6R$y3`ovi9Mz< zLaR3_T9r(9;~OGnzJaU;iOI+*_V{Y?h^_;Hz2tt2MEc-6fq9l4;~kDNIyc$h0A&dk zTL?+1*g<0BjxUU}5GR!ENj8wYKZ9ckFkmk%2_k#+gXgnqcrb{&4DeLtGtxRycE;!k zVM#7i8t|A;?5vp&j2SqwplK`j?iUO18WqN`sEACtyP_y>;JwLx7GBc z;5l$R*B}mbq5?cBcFXlZj|^C&W00TM@~oU*x+X@ z(fdRKTrta_&q3O_-3W!eR#dSA-(Q0YR1IkDjyMnIhIMK79*qU5BSCi6+@dAi{FntF zBrk$FGR!a1xtpk!#5{X}gt?3FR~U$6Vr?0^ntvIu z35UKe-eCNYc99P&hnYX@0Mm(6vX|Xxoav-ZmGRuT>0%J9e6zXa(oT$&M;C{k$qswY z3bLA#e8Yjrg%FOu6fE*)Y8!^WW2;I!2qb{FhTN<9VvR889zwXHo@pzC+?4RKY34lI z*S$QAu2U0b*@VM8G#sJ2SlbU^DaOW~zk9k52spivDSfjcj$*CozS}FCsAzQOB51R+ zjfs7dSdUB(L!9kyJ#j?y@nNEShOibMgb=!(_ToQd^M$K(zK7?Nb3PUu);cQIJIyEG zY(~r;_K0M-n&>QomR!!dyjkR{@Ofezb9=6^RztrHlE(EZj>a`a#BQ|+?k`N5PZ=c7 zu0Ex?G89{ua3{&luOf+L5l679XCS}&3st^WFcvDdssy3bs~^3=&W}l_`z2XdTr>Er z*tyV-@`pd{T|=22t{OvnvkI;NLpgB)!z=EJ3bF&1h+BWbs<<2Wii)6W&G|-`CM{i! zTv<44VwIlC>LwcsrU0rwUSo;_?1C}b&w^I58)hl7+7{Diy0&)yq#I8D)$cyZY|N@_ z)K%KlT0{ajKFF*l*|Od?T2m5a)F(N2sl0JeMwlxF!Z}J|b>&}MQc=F6i?~57&G$wK zAWe=jZlQ|nx2 zLw@%k@Is3GD#8=l&nM4SbcDs@X>Gh(-TQ%D6|NL9fyB9zpb^5sX9s4Gm{NPIGNl!6 zAn|=dTtAp>XkMd1HlWx1OgYhe#uyuPrhyKm{8iwA=oK7weC`qCvhKjsicIDNiq0zR zJD}WM5jvXjofsP~%c!X{kibp{Zk?`>Z?HAZ)n7a)29Z#_gE+si zkN%W7?vyDDA-oVO9A*2V=-awMke+N;eAa|>V~>#-zKj(;oClH698T~rlINMJm*CQ|Y)GNJ?EJ~3?4@ZX^a zO2A!A``WQUxiy;uc^-l+2OH;&4Xy>>KNViUNY{5VVdK?6vmAh6Z#k;*ZLb-dWs}t^ zG8X59TnN&*Ed!fQvelnn0_v+yo0mKsUVZih#iPBZ-f}o3X3HPr{ev_^-YP0?l|SLr z5t_wJBBV2QzGI6s?yuW5n^o7KmW>ur$eysWzJ*}KAZjj7S4lWV-XU`>&1wDq-BY{u zZ~q`IA&NOx9A!$=7|TH(C<|@NqtZ;NhIRlraZWBjQn6(glu??;s+Z*YyRQEH0Mqhh z#B73B;nQo=-AcgyOWm*4D{n;eW3#-q;|3b7n~ecFn=Qn(S~Ry%wYXXKne;0am{}~@ zJ7qhtgwcqWe8G2kS<^c=?YY;Mw@Osig^2)T5n57?z zJ4P}78v~^*Nu9<-q10PT%RIA%ET~|wL%kfz=4Zxsqbl}5cWVM^n!R@hVDTAZC2c56 zM5m$aE=p^qfj4ZJNH;QY6;c@jzc4}GJ6Ac0)!^cJjpimY>Z|XX0JZb)1OB>YZXR0R zZ4IiZnPn(_q)r3A)3yN(rd^H3C=#(Yn-!q(GSLe9?X0wF3^FP05f9gaH(~wh`$tyQ z8=RrPrt!z~&#JzxJ_InzFR)2aElDn#>p)s?ZP>8I{#EPPHx4qOgSGwMR~B_4wG6Rt zHYwWGS1O59*>}CT(Z=75N0d{hT8jhtTW-9Auxq-WOQ?hqK7+}t%|Lt z`xy~ap;te0-k;gm?lPU>+X*sylEjk~0B?aJ^VnA?i&F}zJ`$YNR6_;zylJ3{$i;m@ z&*l{!#%c_4^;0Coj(y+#p<|q*!zeyX#QAnj91*f`&Y3R+c5n~s(Ir#xUaMoh$|aSY zucYiuw6(^1;-caXH351tywkcG2fdE>=kd{!vYlw1{&~~!0#hVxth%?a-uI5GwZlS@ zbjvmyxxLNChWmcVHI3a5bHApb`n#ue(=FL8iyq%hh8TAoUAs>=CyamJgQ}!icf`hO zsMZ$mK0tn>aPD%kIfWQPegKC9>rD&d@2rSRK?l5=lgtg;a9UqB6Q=HeP+mwoCPH|b zOeVQja3N&g647a+(+PHN z9AcbDW2AaR@$znHi68VlJGC4bop~{CEiLmnI)`r&=1*mn^KaAmv{)~S-D=Y~F3o9nN!-pAlQ(1B}xZGdg=ezm* zwlaf=f32gU>N*d(fk%@uYo5*Qo&4N-=8Ii(+Ig8BRn(3;uHVNATRKRE=FXWv_R#_i zy*k-Ey1RY@A82Z_CQ!+ff8_=(?)o9#H?@px`|Xe58v9n-Ryd{7_gf`qIdiDnhSEh zn{Vl87{K9w^#&E~25hxxr9SqsJDh1KH))}O486M3w(jqHbkQ2Q!NWMIZ_O&6JRoW8 zmLdnD>j}!1E8Y9l-%mdFol63pttMM4Pr06Ei1Shox~JCuH=*rEq;|IS!W1>ag06;U z>-kS4e4SjQ_rtOR)BZ18)!VCgZ%wvOxjwcg_aRTOx4V#xQ-ZueuzF6WiyA{MpH4k+ zKk|cAh%x4K_3EOeaeb;(b7AWaG^90FnMwMwC{Ww&F1{aG+6}yIy~+}N(zeMro!32d zJrerpt=i6Q*k1A%6WIf|`Mu|EeVA`&xjGu0WP1W_Uz_rwm;DDW;+DEz5~mwjTg_03 zVGfI3gM#9(Hz3UfTsQtgv%1k`xK+oW-lgoM}+#=cxl7@~O zsiTlsUJ>>M8$+3d5Fqs68(+*!E4%H#bvJN)#L5z0tMEiL`_%c=j}Ayh+wA@u0rWqkG<5hQ z@NIhzR@z}db;`@}lkUtCS5$W5)KK2wGQaEvjRO1~ z+HBH}cRh}mq)Aqq&y`+L05~|>TlKLl0{dQnPLA%cv9${~(^*GKW zw1d_YMV7{Q>%f1Srk`w?thSTQh4kG{hoL=FI2GPX8(ucR46_@F(qpZrgZl;x7-RsVl?k^vY#pJb-x3r4Y zhm?ZJtQwgewqe4aCz$%Xn^zaF^Q^TUTra1Ke}+@<4ILthi0byD%Xbq6#5A5dd^EP9 z9kbFp+no-gz-J^cgNfT`K%)uuZlb#%qf#J?b;zq^{7i-qV8KOmEusBqhHRj`S_>!d zrma9+q8@`jI+cNfCYfSQrhqH1RPIoaCacHFNfJ?(h=`uj!s)$8~cxYPRBR@ni( zGmU$CDjm)0d))Q1K=8)TD13{zVd6T}+pK$50|qmf8Y+J{dG@%}y=PuL?3do;o|%*e z)HxUV>fa`GQf~WRq#vFI=qN0GE`77`s0DTUzlqM)OlMr%(9u2&K8pBLY#9q%?IS8R z;dbWw9HpbBCR;`mXWrf3ENk-6W)pHAg<%Jjt!Q2V%K%ckXB(KXNKYDAGMG8(Ue`0V z!vkC0HpA6VwVAKiona!|O~a2baf-GzXP%R|>cgjUG2Pztqopz19{#1fURhlZTW+_XnJ?UWAA>gqwEI`wB2ikkrcvb(vRdRqb~(|$w!{c>-i zXGsu9adJ>Z|9+(!t-8&f<-vV)!2Di)c7%h~4^LmJ`$uK!5=&)eMa}&LYdLdmR(sX{ zlh}BhpGJd1g<)$ILGI`d;qv9&d0ltTTdCnRx6L#C;V0RHSLf17d__N?H^->1kMIjU z>F+3tSF!{HT&eHUE}kevX?7!x?uY7z2X4o-AD%N5G8-@7a`(W2NKQs-@LF;eLCO2{ zHY_JDJ@`GKhq90TyGRm5umr#2YqwG!zadGAC8XbRHOXE0`D|s7jDm1ha)pM-PWbm4 zKl4Jp*N5ekGE^Tj=E__ex8(y%Zx;*^u-CRy?y)0TVvl7mnw50K4&YDlHqOb7{=x5l z*tU7dT%Qg7?ZY!N(mA$E9}D$Boo!H0O@^NmhT0lZI}-x1PeGi~XJy>35YQ4!u0^`0 zO0#8wHh*dAhkm&N&==0=;e+Gio@>(>Dq|)L z7kW4mBs9#I$jnJdnBQ^u}1tow6Aa{{_Q;2h(vNy$xVrwM>prO^Y?%+Ld zsW?h_b@vLiL`I%S_)0VuU@g+aS6>w3SDbTgh%nCk5c26tr!LSJswlJ@fX9)`nvg6U zR~(1|C!fjFN`(-Rt)~3!2w(X~Iye9End#J8E7Ns*vu=}a`=oilJetdDSK-_EIBH9p z9&qu&5L*?1M;na;nMnC{@a^)661e0kiovuHrFZCwbEV=x`Yf;zx4p-~MP34a_rCg%Di~cNFGbtumGw496To zLluCbYtQeVAdQAf%X32jb~G1nn6Aa}{%nYkDz>9d%y8eIC5g=ir^a;ZuU1y}WnbX> zBVb~0U@;T0vb2^<|1b0IWYLz}`u|Uq*T9MyJ&il|_$i z$)GmloeCT@|2A=B2ypBog_PyJ_Wj$vGadh8F(A1YA(S#Zjn{wpIvIKb|DVu z;t7qHW9z8qAf4kX`is1H;$KdZiC&a`I;$1&>?F=K_#lv4YEw2J#J1gH+{HLZ5 zh?65{&IktOPCb?G3&&^J8SyRR!veR?PwnmtpJ(`!1HdNn>zMZUS=Ljl^94pOO2-_Q z?&I7HC(bQe>#BqFTLEc|4nX#&l`HY0dZ!rYEl(S)qtoX-{$otwU%u|CFI?cx5@um%y1>%qewL&kzurlVr)k#YE4TlG&ASKq(>>f(I|6nC5aogURn&9W0;jL zx$VE3qV;XeotTXkBT7C_J%AGIrT(|+@S8P&x_YTuh04Hr;*T)LqOftL-$7dfYA@rQ zlMIP<)`5#q%Tp>NDgVL4X$(3jX81~*KkU%94J$5E+iwh_LVU5Y1Ul^;tp{xLzGG;( z3C{Sq2Ubuup?!~flQBKh4a2icpvYb8xjiX-WG#H0o}UfNf5-JHd-v;I@`|#$iXLd6 zX>h;jOmE)2T;q&xDdlmvEcOBF104HR9px8%1ju~NV5sfOW4K$Imbe z4Hi&+vb`5r5m!lPc?B(t)7_@5Y!{O})Q`W-wPwUX$IK~WQ1;x_Rm>Zac!`Wk3*+*& z{vP918B?EgJ=2RY(j8~tg()4S(fIi<|j5Hgu*pP8=R1B8rZA<`T>2IS~a(Papot|8kpU z%78Cv7x%W!QcHG8;+B}NJsy{R!#2P+E`Uqo22>A50#N_BMFQl>^6Uvmf_!djkJ=$} zt+Mltbo?UqwrlHyt#umH?w~`tgD~9;uxuW$$*$RN{HyGGI)e|yc2A^g6^PoLiwkfh=s_3 z5hVSK@yxXYaXr|h9#~rdwnD%5?|G`@fii#-#C)c=un07S6aM;)vJ)J*4I_-Kwdbz~ zB;Dcbp$sBSs=tV+$A%t)7=xgN^yn4z{^o?fqtGK7*n0vHfQ*HSzCndWt@qkt+PR}6 z&ec?|nvf$M7Kt5v<5va|_H%8aMexr5Y?0ipo;lisSk)70vPMx>ZVQZt?qTS84UAr3 zF@=EqURJ5}u#IFv7$hc&_*GYPo{8b8dTH)q#MO3}iIYC={gkd_DAdo3Bu7vXzfYL96mZri$~y07 zVOU?t+aOX9>m?;y-aehA_>_JeH}!EIi-(z`p>}%7X+H0FgjW%mEG05{*JT!v>kWC^ z+B<6gEw|1)rs#D7@j{q0U9-Gs_$c>K=E{yIfF2a_svI`?UTVtul#5yk96(g^T%Y|X zo)V<-k^eS}W3TZNmamF?x zG!3DgUy)m0UYnK~F1@bP&sNzB-n~rGen>=|OIQ}cyQg)%cgAe?-@JBD)+I81Z?ER{Y-%YWKog0kb#h(G4Bi#f_ABz$@ z#*G$nXnM+LB&9QL!-`d1*qhL7!l*QOsDI;@#5A4Wla@7#y1Q3f^4(*zo7`i?xmtO- zby;j(MR5p4?tv7CKs24ZmBia_TqpADtsdY^#?X(Q(H{7@jG@_{SEyX%e<_E$vBa6O z+ImCbS@X6thi3Z>U*}9F*xe+KMG@*50uwR}BPrhz3u+qv98s9niKXz*c4!mgpuwJD z#^8(iS0A6k=77BSf>$$Bk!w2dJ#vNjym;Sv${_eTpJB3{FAuTcu?#8UTMlGzCWtAc zv_pB@%4L~ph^S^A2ydP*G0Shu`57C$*(2EsE*FtmXfED5pPF_UAJNSx+s8oxUkpvH zSs}Vq;vGZYx^#rBz4 zVXy>_)&2e`AeMOowG`cR6a&=O!N9}7SV%%hZ#rLmBOWruZ}3i-dC=DcJFc{>dWN`9 ziANAP5H-+DuvKur=W0h2%!odp-Ag8)w78QEOXe4!$75NZ)wb*4&rhjtq0NJq+7ci8 zrNuL&g)`-v1@J{{3D`4X@MGrdb;xG<-MXuy{~DK$G+3_G757^2viWI!HKSsA)ci-6 z@j*+wo4@U1)!S|7*y&l}jgdIlF2GlJbzq*TdPmqt&A0fdu>JQdn?~e#ZS(Tc*d<%a zW-`sFwp{keEvOn*_9}|Wo#vIo`>)_&gL{`u%_#0@%Sr$~Vh*QJ`HiHD;w!7I{^KjF zpY>;PuE|}@>^aD;M_Esa5Za+ z)PvoF>)L%V!QEJT%K|1hgqnspdLo`TmhTH>>UaF($bqpe9{37@2q78Dca9bNPUKNH zCq>D%#VPdYsukR)o9sr@JH0lAf}DmJ4mAbA1jhtl1^xErJdk^J9$OV&;md#_k zhFr6@upa8<%xc2-zkfuvz2n-rcuzOc-#f1}v6hvkpBlKUktdIhl%!MbaK;-xIwoh3 zU!CI$pNsoa2_-w;nY=vJhI-A{zImy6DyxMJ;6nV%m7h^Bty`a&MNgj+?_RgrOCPyW zZ{5C@%kLudYZu*f({~wf9mP2QTT^A-ft>FC1~H@4jBHiYHr+z<+2wb4E(-nzoM4_8 zTtQ@rX`9l{TwXXZlcx)QGHckIVCgS3TG~N?O;`53#rtAw`U9Y}_-gnL*X8=PM)k-8Ftv_Td9crKW3i_@HBNfQ|0}QDSV`)y5nr zza_r!K;ZnAG?9$|2HEYt%cwMwg797(73qz4|I55u>HEvPj2sZlsl@Fk4S=T7Ph;uD zC*UxvQme&frcDDC9M&Hse{w#lrQ?b(eP+EM^h6%u%uua6S<=AgI%230m+K{%J<6B6 zRLfHQP$}6M_BZKmPWt2pVNKmPWvOXNcJ-RWFxSglk^`)Y2#fo*VOU> zj*Xw((u*0~4zg<4g&$~RN+kmr28pXm617Ss?|Oxm0YuB^^F*y4C92I{O|RCKr*BL< zd*qrh*3RA#(WG}5klUXet;_8%$vmo?H*-hbNB4s?h2ReK4n%@zflPtkf~kV{Qk8}U zsg3>I`Y>dnz5+c-1t9TPT?8=S{B&sk+^ie^flmWGPu5tc>O&owSAFSRg6@m((v@cu z>?B`uGW%Ox`S`bGl&5)YwAn=3f)M4kT?@wA7QwN)=IQW&e;R7KsiJ0J=}hg+rCI!; zSQ4VwHOf1n!=RPBAPmr6s@@dF$mDhjlM_Rgz2-W)IaiwUXCl3-7R}2*dCt-cwN00Q zk%OgqW))ZPEYa=Oa=oRQ*j0b@*Q& zJp`{Q-FCnqw(7;>N8euNjc$s$Krjd#8nSgE&K|i?cHzWo?MHU0^`rpE zyM)oXJixU+WRFZzx8_j*Y~#kA*2X1eYh>dEvPP}%76q5Q7HSgbjFll&d&GK7dJuc~ zdqUlWEmNRMATuD3|D7HEsfrzAU9QJ^L_c*f;zlx55asVO5 zCtLpEP9dUg$!EQUTCz3;7iDxmw&Kbu5KxXvd3jmge@KlVO@)sp@$FaA7Iji=UGOu) zmC~)U3OFaapyOZ7W1ou zp;YQd-xYC?L-{c)L8<`Cl6Of}c?(ylpiM{wy`UwCOo@XqKHZvx7d$9^xc~h-b|0?u z`J*cli)jZV;q17;ZT=)m(CrmK`r1T*{!T7$RP6F2!- zzYi3WO9@6#>Q)X9;5gjAAbYQuaip!SnrJYvyUPgv?fb0*W40PvWIJzW-Pt(F6aO%p zq2p)Fr-6nPtD}qvy&3+zGHRAEf?LYRQ6E)*wG76hxxPpGEu2fK8>~Bq#O9Z&$%sSI zU}8gnf!9XVTZ-@IU5Gkp%NI3!QV&^6?)alG#WA)wXa^;d2GYUXBrl}Q_?EB_yT z8}f@J?o;`t)dE!aB|jOk-w3rkyq+73u+{&vsrzd5diLzk$6$T%vzc!>NoSt}u@Y6S#Vo4gT9qP{wZ`;H zQ)d@*Q^AdILDWN)LkI@hD3SGEA3O0wgo}55Tey`T@q><|&=PHeHM6DMq6>Z~cbUwj zaB5~6B;@O4FY}1h!mGlyGk4S2kKV|4i`5qma=0#{rXp_I_u{xWIIxo5r)iGn+i3sb zgc$X#-RD*!d>#kK5Ff_Dn{kJni=qoPN=fhO-1a5Q|`@w+pAGL0F*uL&q>VdE5Z zt|pOZNfHr@nQz}MkRf|6cYIhtCMZ|RiSOqj+reU<(-n5rU)?5T@xCt&kOF;i=`Y$cS+kZy0 z6RtIRSkL(%d?(bArfpmn$gjQ%N!e{I?0g~7UH)pxSi`TbY(TV)wlHPsAKcB= zNPZR_ETJS)N9* znb7qaRF(5TdF2rBY(VJ?$j{3FYys}7 zNxi%1)FdM2eIa|_wT+N&12Hl6=~#gt^)nU@e~B7v?X1pM#bQw|6uxpWTfc$J1fx($ z)3;{9ZP?LUx!P9ZK)goPdT#q{z@#O|h4>7Iz16mtr0}K>L3XxXbAC3AP5|K=c3!rT zWFcoL384qO7Xx|)9*ov)4HyogNf%D(B#0iKCYqFD~jED6>T6kl4P=LB$X8OvFTrKSPD zoH|1!iw-dPLerU>atC*m)FUyQo{N+byIaMZg$BKw-x8GNy3dVou#1_mzxE+vavW#)FqH1L`nc zFS*?APqj?-7=Cke?f#QzO32qakvt;wF}vPy#DE10*ncjk;5xjQ+Vg{Z05;gG0TH&k zbPb;tnq%(thHY!1ptEj;2VN`m+_*K5v6a-^X5%wmzZ&|))?+i{Ph_*5TBj?`8T4~I zmoOd(jxU0Nl|<+0Uj~^~=T@S04OC;3nSW-stz%`{xy&3U0NlLIDuCd%HvbWBX5>9RgtzmDE2e8i;qL8zCjB)bt* z{XB$Jf&BtO16@)VnTNQFFcZd5OUg)xok2>kIbG9$xc6(i0JxM5+VY3U&Lo8yDZWL6 zJQsUlOJZ>PMwUB;9Ru^bz$L~4yCzHH*nE|Er|^jh48D^Y(|*DDPH)6yL}b))>yKy9 zf(Z$nSsTe2do})ORbl>5x#}6|e^=tlE0yIMyCCOa$^TX2Y9Js;|6kV#sMxt%T05}( z&ng_e7Lg>@R;QS>C}uQXyo5;vf|J`T_Z{MwGi9oOo?<$maDZ3L zk6RB7zK_#eUH^lyZwjuo3)+n)nPh^Q*qPY2GqG*kwr$%xn%K4`wry+2+Hp?4Q>RYV zfA!zIwd$?vwN~{-ukNS&>0SZybKAL^f*$DvYMBqFI{=`q`;VhX(+6jeNI^nK9fV(< zUq8YR(@873QYtFS(Ww!u?2>qy$$WAtu~E}AUy}rJKxdAboH7wEM!ky+h^{$ z_eKeh&F^9V-KAOI&&|IUPuo>7ZJ*6f<)3|ZFQ413|A=zCm+&y`hErYT7N7a)w?3C> zQ)${RYM1f9dy^YGL#l#?Hkfp9oIX8|7e4(yH_tzhoN)1+K4IBaKR@k2LdzR61hPJa zpkR+Rp9XqIo!Ul=C}zHo>*oy=w!`U+W87w;%RUUps~ou1#?%geEt|fpyPAm%mnTp{ z>SfS4_mBbyfpgC1&}5GfbNAV#8>o^Oc#<{d%6lVjGx5H^X}qx!zRT(^kiG{y0e9vK7DY$&?Cos44V0>S@3aliZLsOpTj z`NHKA)k9iN`&CJ?PF|nGh9*W(oZDZO&pTheHP<=H=Y8K1clSH{(ZO}TJ%?orqf3G- z(Ta~2&Xdl^t8Lx(TYMz^#>JycEu@X-fB*LXzcc~nhJN2pu~*mg_ z>$;|?-Qp$E!~G-l>l#slyfV)O?8DUtif!&D4lpA4??nR!T{N_j6H$Jb5by5qXLJ`a z)~b%?Eb{w8}TTtkmQarZO5 z|KBwo{zqwvUxR)nywV{7aAV*k30Cly+-0;Y|U5S++O_FomntFBsJmh-apgIIR8y8v?rmVx}@mZAEQ}q zS;BR~;I6vrNV@UY^`i-@UX<6xJ|~&=OmFN_dc$0odr>XyU&9zWg@yT5W-EA7mmD)t zdkou!-lXUAF?-IHssu4;*!a_TIP;BcZ9)5y({!oK*(Nh}E?4Gpo6C;^89~%&Xro?Y zIq+K%>ksct)j|)RIGdNzesOh9lL5x|f=wmn)ajPxOUl_l6Ix*M1h4 z+O-;8d8W$t?FCiPe$s*u?^(Ba1rzW?B(3t5>n~DF+pK-%M^x#D-0z+UI6vI8b5{06 zKLt0Mxe|*Ci%ad|7Q9h7-%!=`j)%^!zjZs8*cHcf`Hcun+#Mc2c07}F#PHVk-3yPk z67XpxF{~HcxN*daa&Rf;P`eiMKv6SMTtF4z%}o^|Z=6^}4Jqz-y85#Rt^sy%&kRBO zvr4x%A#W=II~CS$8!n;uKNVZ+h&P9S=%=HnHSEY9^0i$)!nTa_!>SD`Z_?|~ zo$s1Pi_hsvvQh=LW{X|4uoXI;MJYUFjy^dFfbM)?@~+Ek`EHT8UB#SDtLFHe>;5{pcS z9Dhmi%~aWq)mVpvY}5mO`DGyTqiTc8!!&|-(S2Drx$O2&srf-{sdn0#E%Hp@XO$Nu zfYG6Fycx`V&XLDG)tQi>1%Em}N;-XYsrtnE|J@2O+s7-tY&yc9t~< z?LS|snKy9uH!jAs9WH-LV-x&@FARepa>+n(qF5yO%bp5XDw-88zQxnv zP@W@t^2ZTpJ;7)EQoC|u@5{xMW+rcB(nd)94@|&Mn7Im>SGW7mghi+FL+@+ruv;oY z57vsq#ZWIspUToub~V|SDxC)H8wWI@VwISR?iwv&c5NKQIJvb*L&TdD0n={m?Mi&- zt%O11scb&S@L`w?oke$3S5X`gqTA)xJZ}kotC^gAO~N4MS=A&Sff=RoV`JmpmVRp+ z3<5h_L91{VtxI?XJQGZr1J=By|1evhC(5D5MMPW;F4J(?&E#oRZCxGh-W7sNXwcgC zeN>x6?=TMP-%iEY$DKL7k z29230@cqn6JNSc>}KGs~!&YNr>bSEH%J&$Y`gq-C+aS8{1!X{)d3x||9UO>wcVWt$e8SLoCFvHn| zX7*ppjHsjDq}A9|Qt()t zWb;)}^kdZq9?uRMcl#2H8~ZCfWkAmgs~s=&ur+AEe4Zm}kIIm(D55xy$gIufAkKQ` zgR84`W=x$rruWF`sWi$P8>kFBVef{17AW>dm&?KNWLnKj$$c(u*=CUSczfn6knK}I zF87x#YhNqEh>=UC2oPpz$mVv>kuv2Ou4VPn8UM0fG6(qEDOCN+(Fvx?MU<`h`}&y= z>awP!HjdEI7R_KYS6|zLx?5xu#z+0$56q<%5fI*Zav8+kPbVUC@Fz&3w1A~fPTi_HL{c~6}0t1kRE{htMJYI$opYq8{^ z8o?R@V*ELK;rHa2t`2z0BHCoxkH=FqyfA!l9qN4XpsEb#!OVHH+|)A#+#ojta<%ZC zY0U`^S>axA&EcI*f;-4h&hnxJmZ3LsoXKZ={siT{289YBG2AW%u&@VUqLZmGujE( z4B&?+`bl%%vH$Ijqm8}}Eyjo`D3Kx>gYw+lq(@aOm;Uc7WLiT#co#%+480n*iF~Ae zah*M_%L4)uQu~dI3-SF5i#-YjPPHw#4#K^vJo=|i9!}ua)Ee3eULMV~Tfn8H2f{3K z7UmT=Z*-0v$%jWC($2Hu3`~qOI?*&r{1jE*Pm26zHVjh6P4Q*R^bn`rmRPos%aTf? zqq5)>%8Qm|7Y;j*?3Wc3QSEj0`%BWUCK}J%SWz-yi>QV*beGKjltnDq)MMV8zgmC^ zm=>fgBzA!7Z|H19Z5W;(-ojP`5P84MVGMg2DZLR~2(H<#AsOh<48WNKVwL&Kvk^C- zcwoJu-Q)9ME!M&To}c7-Tb~IR#3sbcBgdui>)Bp>`aN+;LBko$qt^Io9e*fszvv#KJGBjf{q=_lUk54R%%ydCroWmeV95L6L;j(fkI{-v|)3Z zf7G}WRvX^~iEi$#Pp}NxToZM*o=6O9+V~Ivjt8 z$JqBM(5imzd~E%RJ!ZTD+=uVxbFF)D;944nv8^HaNFMj>u_RX8dsXpp?xD&Z8g9}c zU>kaBqA_}t{_k&6zEVtj@VP2UR;GZfQPp7bCYMAj5DOTLfUpYQQ0>wHIDll_{8s7 z6V{_a0rdkR!F@5O=>pQtKJ^^|Ow-$LS5oKPU1Lx4DC)-1F72EAG}Uc!3tRh56Hg=6ztkpK8uQ}@ zQJ&Q+aXg0AdF%n>iJ%&7Lp@R*KIdv=54D=;**687jih}pwbk34OpYsJnGWi(XW|RY zD_RS^J#;g%xhezzNOIHQ1nzh=(hiZS8wyHy=y?$MfKrd2~z3}dq`_)`F^sC$$!_pn}&;W0erYauG% z2V$k5*|%rs?fS&-&)%_4%trLaxz8oQgmcV+JN#^|(i2=gf z-&e(+D68m$x+c}0X0lTjrIoY+0$eq%^8s1@3+KE25PS|R0 z*IzSWmT^N20@r}X$oY(A_I-0ibC;JGZmxM!X3)DcT!T=>4eJFK{4^qzD0bRP!A|7!|E1^%iu-SZombTir)Nn0@$NGDQmN5Pr5%(1?GD2pF3-sKxA>8sW$7e$V zGaD)QWvR-L3vzPq^W(mMU2lrUPtE5NY+5=LDvk7~#eYmw8WU=&$XBghM79Q+3#qc+ ztJosWi`lp}oRC*1tsg7Dp3MdXjh;pzX~O1GJT0T~G_>ns{SilIS*KQBlC|Du-k>o- zro?0ZGd91_TFkj{)QGGzk2%uGHyZ01oKah6mD-H^P$u=WbVq6WYA6z_0xIXaD^h z{K;;f-ppOx0Eh@rtiID9-=@ys`48|92wDfW5uE}uvgyH`JSj}Wud|u|%tB{u+;}`E zpN92j^)PQTRYj^^3GY$-c+TU@BTxF%d&Wh89&8irUQpiDDUpI<-XV}v_VkD&4IEc6 zw}yCq{-Lp^6V{n0W%BI4lWn!o`(9h@ZE_TyHEnWpu9$`7Rbd3z%h~B%Qe}(&_IJ~A zk+U7hU<^pSK!*Qq6Z@WV25)pLIYuGD=;wC`*3^3aQ{9mBejs|@5E z(Bj<5wd)F+B_??}{)jt2zajv>9hDuJ-{dGv0>m@mG!U{d)sQ(*TQEGO8xaDm3^3op z!@x?+zF;5zGv!x3fNjHP0xcQ+z1eB@5iZSPLeY4R+# z#cFB)uf@8vmUY&iZQ*?hk@-w=SIm01+@JX9W0wQg^j91=2rqMPFEfa)2HS2rkV#pw zY$tD{2F{BH!>UjdtT7Vr6aIU=;QI*5J+Yr-8QW|p$yK&Gz`DSyo^ykzM~8okto;kH zmaVkO{x{ZicX z;*@GdG$`!mRTnLfHIG@q>QB~aaXT6S)I7)49@Cx1DbTzC98LA)K9SZOZ<^VxnEc~M zs%6Qw$}tS|-qbF=YtYV}y0U(Du@wSHxHTRnAh>Y1N1=gT{LV7}$x?aea<#>!2f{CK zT0b}7`t&`XHx_!2wl3|_vMz;;L~tRlcS=p7b%9&uEBWOIu9u4m{EM9jX$~3r^fIV! zC7Z&gI$x}rzoHfeMzE^t2EDdtT@hs4mfMaPV@G)neGM5OG?op`0s*eiX#cXpUHZuc z;?~ynyjlK+|Dh8CIFUXcrjg|r-@li^UUp>W4k%03LplsQATN?{FXM?rn@0UOPR@xd z%kD-$6u6zIe4`e>l856@J3&p9E4i;JLP0x~B9+|jG72XCHBsz5dlzteAh-J|{@j|I zlO^tlK>U6S@F!4uQxaY|@DpXbp(Joa`816*<0=}LI{ir9E6Y3fRnSG960$(0JMEEp z-iUZ3SK!Ja@})Zkh`&`u^so=UA{QMaE8wGEQ3|t@J!{-|5`=)Pum^>9qe~n={ByWZ zpFKT47(;T(a3Adz+)=C3Zf6BOK{&U!U41y=t|AL*vd{KPoTl+^IG59=@!T}4*^V-c<#K)-N z*D%O~cHVJ)KOyysB{;<1A)?Oxe|>W3nE8JDhL1sl+zu`#Cp15ysJ*4JK*RUijQ#5n z(_1nQCIGed>G(-L*l#cGwutj3l1rkzQtSRgucf3>F0V-gwu;|u4oeXRP(f302S7Q| zzINOp<7#n7c2Akw^EGfdt( z=n~s^^h_J_=}o$qjR6JJ`0M$zAlWU?`*R9#Gl1bje!0Z(+Atg6c;Gs}e;w7!6_K|7 zHXeZ0o7(Ft0Cw^X9a0P|sQ0-Sd57(=`i6;q8`l&Z#a~dsC8>$Btsv@v#Qoo$?R(q8!*$TNsLC*7pTqA##xNN@-lr9m{H0@R;?Lv= zpXS+bN#)+8qftIJ-lG-Lan&Pg63<-y{Mh7rC1Yw*&zN^<^e(K2M&;fy$$EYLaY=dw zV{Veqps#HrDkwj@skR5lb(cySw8|?Hz5wuCmv*7;`Le3yysBdbEsvCEEu=bWfSL-x zvW$63T}$|aE0Em9veHN*^)3pU)?xzLNFq&zef^Zwg>BP1AE)-LIv69HR?dwyzhkC6 zi!btldNrj)!7#GuPCSC|_#*vn!RM=4OajLo?u5N{ z)zI&Pr?Jg6H>89sJuM2=OsTh(!_wqd_N7TT=lrdM4!Pc{Fw)XvcO(FL(#Ove{2w83 z#aqwiTY`)qx2)pj-i#1QX&*#-q)d8I={>+bi?&>C zpN6}fduLF*%SsxX#4>vJLx{>=OUt#YCz9}=vgpAX4nlg8YvNs8>vrks*Gr$<)xWCV zpT}Gt zc>;Lo>cZukbioY%(_Oo<_BgyBUoh80ib=U{i#C#TVZYuKOrP8sbfpzcOLB^@p|l>w zUG0xMIR>}$f|Do7WVYTnlnFeH3NFc9_pIk(ES|!x^>W>^Xsg(%ubO*d6H<4@lIYWs zH?Jza@Y>`cwG(G402km{tC-DYlENkVrebaIZISY;3EY1wThK6lns!>yC_bY}e((U` zeAM$5XrPll}Ub_Pt?(e@R?^eMq9G_g=(h zbEfG9x3|4gQoUL5y4A$fPnY3`Uc_W^-7s_U{%&YIz$XnIdt<2zdl98<_xYN`|z#w4{Fe6I{U9iq2s7|fk3ibf4t@VKH%I8qFWj7Gu!RQb>g;!(dmA5j$|*zrmMb zT3VK$y%!y-2uVm?mKKZjOGwJNgxHz;*kq@&9z5BOfIG%e9R5aTD~|%kw5T9+*dk>fpo97d%TkBdwJeQE{RKXQ;-9i(LGCLnO zjA>27Gv}~xetpz(glke2(on9}#Mm518(Xg{Z%yl2eIT|}&uK`(?SLen+_xZ)fx8p- z2Qo5sH6NgCCqDDJ1gv`w39xmd)g{~7%B$$r8L+MqmsNM62ByMu}4_Gtax@@Yti_7y1I*T_QY(}n1YI4oH zGRT%&C?8p!kaew)x86uPb&{?hrTe%kV6R$9I+>HM>AuzIxb4h(&A7Vl&AtvOq8x&E zKEt}x2d3rvgAm-)25%00%3V;dFTdGUL3Og%AMjBv_I3EIVrb0KBTQ3Wt&?=>A>TxA zgT>zztX`Pv@fV@_BvOtwBfV^98$#e}i-k!ek=4&=TD=T-@bhpeFFR4YK+FX6T zCkmwBYCECH)z1h_d=9k;|_b#Hj{arq$ zqd+|_QKV9~+~-X&5ZiTL3WHBX)3&s`A-}3H!+JPq=wcsTFs_i#;h|pJuT5e$TZjAb zJAK<*|4Wft2!YRrdcG0``0kVbyx8nq9Z<(XM(XNB5Gh3viJqeG&ckKQnmHLJ**n>* zdYF!eE9v`lf2_Nd`4M&_=;{JD>^LR8$1&|Trp@HDR8K)S>~eW%<89-; zQsv;;i@rn4ypx@SajE1r+YOv_#Yk4ahp?i-3^6Wh{_eD;kU$6PRWdj$2}0*_Q*p+m zak`T(%Z~LJ+(vmw3p@)_>&r=L@JH8YV}MEj(Wv--Ag@yeQ7LIMrDrn$q#akkyW!Hv zIP>DUuuv;`t+bi}l`a)-H|s@hjkdC-%#*0*D%*xQ*ZAn@^HN12_?PvD_OiUhD*uv~ z1{wPZP|AyLN0ft6#avO}IM#q$2E?3Xn;Ge&=qu?%cNtaVUqi+Spv=Hqn`SE@Y}@=- zSkUka`9CWt4pxePSP*@cPDuan6%>x<_7~c2-Y6in&&|_I=S0%g#D8r10@eX(Jii6R z17Ut5_d;jQrY?;v89>#`nhW4Uu*zW2;+@KZa!yA|s88YXERrr0nk}*}MclaNWL|x) z+)51Q-{oE{rn^C2K#=cM*LM4>#N$*Lzm9wGPwY$nPmOTy;7+!v9zU6VL|R`p@y4XWsE8Skof(f@Nw4Y(BjoP)36}3h^I}=t<#syJ*rblGF1`UnA;#iB_0`cT0Fym=FS=YD zjDswcjsUMbO*>}abtl!eP(yzoS8E-1sT#ZDtQwh-Tg~c%C?WAzHSS>ffgV>{MY&0| zz8+{3$duOwbz;dyCr>)GHH#xS1p-hw^|uz3M^tc(ra7lt3Q|p}H9I7({mNncqo83;S)A7(ib-UjlcPEJ`h7B| zy@^Or+LhyQ&{Qe;|w#koxaO@lH%nG3$ z?wav(Whi3&f^n4x#l;mvI1>PNRAMe8LA(3p8#6w<1&KqZBr=_WfdCw<*vR4A2D)&q zsJtv|{%?u}*yEbe^6l$vU06W&x0ul9U!={+-Yi-wUz8TCnY@~Ry0LTY+q!>5E@R{y z)sQV~h*nnghvn%I8~;Xv;O%WhwD!lCEBv*YUS>pnSr4d-C6I-vvtY4 z+JEJz+{7Z|FZH!|wJT4?D!p!ngA^g}(JqtK$puzAN;`&TEdo4O)>rWCPw37XYFo;D z3|6>nUhxp!3|3F5@@VN@y{|%Dzpbs9gXA5Tl*!Hf6B|;Kgc8#u4_H=!z3Qi!F@O47 zjkSd$)#9`8OBZm^iu*&ma;R96ho#kHGyIuNAsi>*sSX*PM8V^RCeY0$8s*u@Q#6c* zyox7X+ER43bT6ly%RizmdIQhO^5#p_6mpRXHHOMkdlpN8d9-Lw^pqfrnbUcuErmXx zM^TNEg?vxp+{OHtf=g&IGbN38xHB!lE1UYIR##aUZ{;+#in_WEAqbWOeQ8?hM_o+m z>@B8PyRPfp(wXd>BmbX}p_P;c?(aPd2AS&yoNh(Ytnx~p)_iE1l@Tv;bQNovMUI4v z?mjM92#9}YO&ID`VkU(a@4Bw9RrqMwtx9W_^QT?zo6cqpDYW80H*$Bd9^yY0Ax~G; zAP0Nx0@31jC#M6@Ua_(JrrI~jTk`EcxbW#Mt(k*M*2~xb@ z9WQr;bS@03!+@@tBL57=Kcb;> z*tvC#H3om2_*u*jA8Hh|Fe(J)in1c4j|o1(BS8Z z3}4Z0mK{Pk&$ycgR#tbM+0d4wj%l8iJuf757J^rUMPK~w#h4MVS%_Gi=}Y48&5~EY zbMSiXcc+i~_T3Mv29cK08UhBE6}ulBSo0mH@`Po+mv&*^^hW&lL`m;Q@PjJ-h*-c| zIrfqp5}(I?$M2ChX=Cm;GsNh`QQ9`4%y9fu#=azPE6HaL@n69aU59M5gBb8 zba6zZQJkWs))BE)n7N_HITW0oHGJ(TK1?u)1RdXXlf1CDW$7SEs%#(l50la1Hp4}- zU&vFfJSUaknC5-|-t@kSEgksA5bhj)#9M`>8JshmA0Xo=q^wo`R-nxF*GBw9&pV4L zt55G{2vCFba)mCK8qiSWTuoI)9;b>pOc{tA9s@9*))8JuXvpOww~0JlQHSQSA(8k-v*Q<|`+lhB=|eysG>*IE?UF5Vk%PtO&Q zRGk`h&1v@Y+sK$%m4loYJkWO(N8TS4C?Ffz5jnk#$m!Ff4!2sf5*@Sqe)Oj>Z(gG4 zV({b^puvA0)j?%lq{-oAAUPI2q*>jp86Sjm<& z40)UGLzE6fm?^BD zs4!%kI_=BTv^W4RcctnsQXZSy5y--r)ab)*qTS5py&K|&ab#-6qXV!RQRR)vX zWk_)ZQ$jpquBqx5&${N)HGB9ED{|$=sb_wTYB6hQ~TxWH^@=Latjg5e{;@AM)wK-Ik!iA$Flfd44ERuzqdc%ISDVq|>6@Y#ZvQ(yC;Gu78 z5Kh~s+N^i@fF0HdeD=b$)7!+gO{=d&J<@x(O}Bg>xJt2|{XNaZFvdx+*(zq=vg2E@ zVK=D4B-a<^#dk>o9P{L|&2{Ql*5fjJX`&=%8kpRAU=4lZ>}T7z^{e8L7gEiw+E&}g zSoXStrlQEiA1DLX=}Em35%6ARV7LadC8ax?~1y$go3WIWgBzvCWK_AGZb6vkuS6Y^LLEBF!>F__t4!x-oOt_1`M83fB#$O?fK@N^+?`3Tn42l zFZ6~-^Zu)_dI~nQhwOTAONO9=@h(^IpF_z1B?x zd6j(?F018$6^V&2S|;I*Y1m8k()TmOuorJ}C96Rl#D}K%K+Z2JI%{U8COO}}yp(jN zhhA#3d$PyI_b3AHg|DnnN^N*eva(xmFE;;$JmitYUtRB!eAg^?ET>>Q70xy2SsF^G z9<#5pVyfH=Kq0kq1VexjD=_Yl9f*5j|DN0*+p&}~g#}4Ml4qL-NrQ&0%!Uv0&d0cE z!CP+!OEigtg3_V-NF*<(RnzqPXhvh&`$ntS79B_4E`XzP=pm`pDe-GU2tP*nF~@>$ zvF@%sx{{qk>Ar8lR!1@JEQCXiP}4U%cJy$1E@h`{Kps`Ww+B2i^u?_oXKGfGHvwEL zRAn-MglJGfO)2|Y6y1cB`Js_7f(|+zI2SO{B1D_Iv95LDZX@PbH<&9`!(1EY5t-Em zIVa}b3eSbV(CGEgQj0;aJ?1oJbJ|3@`{uS7dW>TWka?+*?A!|$hwDT2<(}h%+;|#z zn(B0yRptgFDMyiG=%yp8k@Ri8kpwu@6~+|{{r9$=e>?Po@;PU2(B) z<`5LY{SN2KI5x#2&~pM+iGl-$BSPPQ0q@4_joA;?kJ`WQKWP|w(*Qrs*cq~0W&P~h zOS&gJ#1Gjj3FVH2aE<@MbTs`d4(<}VQ~vJz?1Ve>zEkZB0i^7;N$2DCUvKtncZUG0 zP5S)X&|W-2h3`G38>VcKe$k({J9mOHy^DF^?lq6Fvykt0`X%sCJ><43kEeVh3R}O- zRp}y!4RzeHuDCH$_=yXG=TNN`d`ku%WbLQEE&n-I-jT%g(#=y_9dJcu{fVmvE%~&c z43i>!BBKqo?OmH0R&ZkoZc;nMrLs7D9Sf%@M+*4FsXWI>p?{Tj$$5d?fx+9hg=Z_5 z5+`_4*dfL>3j8ZYiE^ZP$gz`R372iPu1|k8JfqD& zt^iniofMrxFV^&E`p9!4x61$&FA+A%w#wn3`Jks1w&fN{S`taNe-29e0mx~$cI+Nd z2k=&!+$z`&ZM@T8bnv)#u5LC4-h$g(mu_*@gpL^HBqvXX|B+7y3j#3?cO&3)FFk11 z{b<(tr=L8&aN4H^%pR3h)vAjbUG=jXlr?I+4YgO(3s)18Cz%VjKXRzY z$uL2gIr4m1_rMnF=^K%Ir;#n9_tqCP0uL88isJ1uV;`LtkwJ{Py!|`S8Ra4Lou-aL z&Ai)LPygK~@jZg1sLTo9gWx3NJN}`dj4Bd!qu_R^>onNhU1UVUlVxwIJLHbz4SH|7 zJGXv?JH`%Ks;%j1Q}mU-_xDVx0p>wYJ#N_uM9=lQPfh9-RU<22aFx!bpEO9^y|FMPIE{eQZ|S!8c(0D zbGaUOCLSIVU9fb0@64Nq=FZ4zU2uNAv9}IP-=A-wC%zHy{CLykUBb|L_-Q8Z zZ~aJ2Z)`&O$oCAK_{~H1%>5O0OuRZ9 z1sf%A3a84;Wnzoq(^kB%O}SQTXDIEFi_<{_2>j5#-tNT}|KtRMPkA{|@8Qm2fA#t= zjnrmvtRWAnC0}ndzA2d_>`apVTXtUq-$p%yh&}^?O`obk`cq8-EWv>Cb8Gle_`jOGsqmpo zz~#|m3h>=g@*-3G=&qmrsdA98!P5du3>#^|w7;6gRR4?uH;S)thtz^zLClGCD^c-x zsKc&RY6NrrQ*G$%3icQ-+uM| z-=Rzk2Zb>1X!ecom!2C=@w;uUCY!vzA>)(20n)mJ&M9LE6d=Q%Rcid$ zS29xiOU2@WmSm>_6(6|E2Sf5p-ZNmYAM<6)zAk+ZP=j7K{Pi%WCQA3BV-IUh#G&TV zCELk;0624OC(K>b|1N6jIls97_b+6bHya@ROpg5axq9}=+7xt{&O5Qez}21;&pRmH z!^@d5LQ;cov~&)aX5wn|`;x7qmQ*QwBTXEGc7c59+Infrnn|G+x*;SPFv{Ke(Fka{ z4I$)Cq4ZaIEOTm>11N@)ahs`t&e0u-71yi2$)~MoPDB%A z7H!i$ZyL*6uUU{sSpY4)?{jk`OPJ7Q1;vJ=+E4_>I{8M4jYoD}kap~^ph!KOmG4WG zRx4B16R=T|o*lT;pabzy`jwsoSy#90O6He1%zAvXQtBMb92gDIM7{oT8zAg>yH6)5 z50Q~Xco8^%L5GU=u?mToUlU1WB%Q}$shPifFF3|4`?~X_jiFZ-uBb|r4i*C!n#l^w9kcuYgrz|C2O-b*BSBouS>M$m=*kp*>G+VczPH=EK zB+-M%=gV$^V{R+jN|=qwvyA0Qq8y7!!}<#=kurF~OTEdR+A=>FsDe&v>LB_<86 z3E0C$j<6|2rjgj}J28vcKzFi>qG3@4WK<*Eibn)!Jp)CxIv(N=*#Rm+ZIsG=I4>i( zCktnagmm#xnBx*GrYW6QV?#P!Vf|MqqGWN(Jp>l$^po?13FTDz$k z!_#-`3C#)_dG!w&5h#p{JyanaoW>|>bVsWwrAGpjO{%0bXr@=Pozd26xmB~%YaM+! zUrCOATKyS`%{L_t!vdEgh(P zT9T-g8gt)4zq@K2Y7<$=kU0*I6(k5FYOH4p!Q?cK2iEg17bi+kGp{eH3b#*>9V$JV z1g|rPU2GT!BIk;Ks?gqF?k))bDl11uDvCl`XSUteX+E+xpnSKsj!Ti<=vDW1HGv-_ z2|Yf18N(wp@?49wjQQuhNW}FM>N9fcSRq`Q@EYlu z`{5RCwoV5L_})stb#LY#!!0uwIi{_QLHSMNuXPirG8~VUt2)G}ts4hwtrZiDSbZN? zm{t_|j(IH-th&?w+IqN2E}~a?r4=KwO`TXSniLDU;(4Mh*W^R!rEcCNTJ*KosOLal z4P8G9hLWrhZI^5f>KByL8={vP6J>Tn*F8=%J81M^0N!Sn#6hvE2Fk{Cb=>;31MasU z#S7SUv1pDFHVhV7<78>UF`uLau9KC9lv`vk#_+bWbRaM}?dzJA zfqU%XIiwUbjyE}_ugn{~zlz|qhb*h(hMw$fEy@wxExfgN?28Y}gx7G}pV^Q8Y(*+n zc?(UiF*krujbxjXin!G*W<8cjTnK{{?*4sD)L4b-NFS1NtNEJY9|D(Ud_%x38<1ga z-P&Vrd|(uYM$E=;Xb`%xAC`k6lo4~sV=8~wj!usv;gaOYe1#WgKfSqF+mVHQ{5Fuv zAri}GWkNpQ+LTaC*t^>kAI7mRDPp2S{D#y=I+ z8Kn{`^C3=NL@^kzcm7h0ivbAZt|oI(+oMx)AEF^sa=nU3GC|jQFR`aXAEX4tC|yKT zfc3zED6_4y(W`o)d#8hP{hhVdNj=C96gHkLr}p>^_Q??_Ef5&_LU7Rkp{$33OK?p+ z-u2200vUE%DI&8uz;*FaUl3}?@J}$O_HTBVx3F9>8}bw0FsdFC7J(I2v6C}YzY}RF z<_JpC!Qv#c5VL!c?njsU{xtfkzc6tl0TyXj&4HytDP4`!G~vzV*d|y?qgcGe=ypNS zB-tqvZ}B7=XEF-ZRTqKD?`3uJ%@JK3>?-XoVDtruO^G2Xs1^ZSu+#@SLv=owCJ7gj zFN6mxbb|~K+AOMO9s{E}-|sje?4pg8JJ4xWXXk3df&x`$&>sjmg5njeh+{XkIrl;! zYvokQ+Vn;U%2ObCVD*|Iq`04RdqEhH+IqM+=wkZ7!h?>#AwbiQBg_?bR%Yn@1ZQ^u zq8&!l`E@(RG2TQ1o7wSTlUhCD5h5}HcI=fS?gS9V)M=W$g0$N}ULs>RV?W=Noa5UV zCe1xWY}ELH{iyDOBh#N|K+ZY+|5@ zaM=pVk#lf}=pa*8y|6ToHp0u6qC5wK4!# zmz%a$``ff)3X?6E#@ANEj=|6D=MkHw2q?SU>lK!>TBB2Bv%DihAk05>7COYT;ueyX zC$nUBi5jDjgJr8thI46`Pz;EI$>O%>D%&Sk2WNsW#z&U2)L3S2wH9O&{`4)yG6#o! zl*}5RMO*lzD`(srO(Pae27|&<m7Id@Q;6R$A_nGSUR)nwM!Q%qz)&Sty7Q zlJ_%5C~pQL9t{iSR7=sH_5XB=EN54ne9A{KQutquN|QTuy% zdjMAvDu)l)PriIm4UoAKn{qEEA}ft>Vc%p{WQS;ShLNHmtuRr6doO zA~L*Vg@SZWS$_opNz>9uO;bnQl7onq=p1vUm235$q=L2<9aJdvNd8_{Rah2e-oB1g z27XzlL(Vp*PvB89Nc#c<4iv~ zbUF%&+gf2$d}xAU_uWv?>(PVves-JN>1q@^ z8fa*;MVtBM98snd~OYrVLj0=}aFMnp%g6rtR!+ftYYD7%J|KZNa zBhpEB#5#-pi%EvJI$Wd?m`+$Zxih1=CasS+`)82=tvcyJUwP7~rGc;iny(yfa8E;# zsSVQK{Upwy0ImvHqH`2gduCwsLquvz2|*dDy%D|Nnk>(ptdHo6E*J5WP)0y{+dIN{aAk0Th+J(Gx#fFjRoaweri48ZC*SDoX2D2RUOx2XA&mIU_^SflhGbBP!c}R zuv^8Exb7rfh5f)-(X+V#jrYSTq zsS=A47IoMr^0o9gC=8y6!0P9ngn2J@rwZ(j-$I{ zM){I!NPITG^uHqxKoZbgKH)up`|$QS3b;k=0k$1)MY}+62iyvruJ>v`yX4y8<;hvL zu5tgbM~PFu23U6=-coYT`;G;h8GieuYdO~%ao%I{kS9v-tnzw`mga9Z4uhX_-fw1G zx|Vg~rJo+Wr^Ug4s<;yTe)%5lycg!dmv6i$=xx(ETgXn|2p!Nv|~OmOXfK9QIr&%rrDZ@n{loaxu$?h1R zgz`)~@7=(L`Gh0qoObPS`Z~jqF8swTR#Si?zMySG3fZ2lKCj*GxJa7 zWfS$M9D(2!>CDB=?BDH2JbcWoJF7RlaIfe7?gcl`@r?1i7R&|IybW`FD9A z{eMUOPhNikP)h>@6aWAK2mq+7PfBCTeMmB60002;0015U003ibX>f35axE|}GA=SN zLu_eqaAk5-Z*OdKE@W(M)Ex(O9L05S%k1toX?4=ABpYNK+Z@*<-ML7%v1DUozy@sG zPI3r@V8D*!GZv6w`G`qKh4fBH@4bg~(mUxr#DVnQdlC6%W_RySvLSg%US!|QZ}aER zpV`@IyLusRf4) z*RMSMpocDa@PiH>tY5R>vb_rqUwd%DzJm)kT)2I~L+h9CEvHiP#Zt%CjheP4W@z)@ z{j!?Ud$+b|K_WJ!X+H%-FztsohlL=UiI+I;PP{DFN=1a$yECxVx++57NoApZG}NtVm1x2d?a ze0b{cg8_byAo@wv~w`pg+KI}^)i^LjRW+O5yUzjuwDrcAgmfL|W~ zeQ{CJvw6YUA$ZaZcTFt-@)Eti5F*30asmpG2Zfm-2eiv_<{&KObYR8xUf&Qo;Kb{T zA%GM%kh#1Q*hW!)Y6&Ve>PsP-IvruNo`WcDrmd+n5Vz`iG)GmW1U^63rFF$}E@(^( zk*ya%W?R~}C6u2;3)8^WAx=S@yB#y1H)Lt==ceSPov9+Fa%C*i_S84g@@zt{_X8<8 z@?vbi^*(@8y%{r`vD|tIy=3_rvoK=R%ZQW=8%tcs2v2Op#%jYaDI0a6s~1F5{SY{P z5Ey`(^+8H!+BpN$*`7UXI;)WKA#kz~7!U~8N}E&~&+^Rrw*j#ITEeM!fx1;Y?!EWk z<8h}boVo}2U1_U61aZb0c{}Lyocb_g?vxM7GI7xr_uRC(r~W-ascJI`j*?y+Yf;p* zh@}b_dZ~H_!L*mI_amc%){jUGOaf>jK+sNdov6G62nzrxCcK2#K@FzhdPxa_I<&X+ zs^dv7RkQ(RbDgbTvR=iycei>8f;?HYF(?{HJ0L9!mxuP2Lr2zzNx@hj0a_t&;91460_Rl||srJ_Idrt#WeKv#7S~6M!rQ z2{QXDV2BBZm~4otRLoZ@1T+Js!uOjKf2%n$)kRY1j&0YkK{={{loRp4U0CVa?0?5| zLjU{211{jI2ArlEU_aZO=LaB98}hU{PdBeA-}&0$*_!m%q;|%m6#Q0g!=D)5uh*Ah zW)sGst>;W=mU-x+RsadFV?*oa+mshx=5ZY^`V?PlrnZ$^wKuhrSoINz5``YSK8lx@ za14_!()uburMcfb9=D4^8msf=mKJ(_HQ7;L1ChwbI?>LQwy?}~pMkvk@LGkuI$}EY z4QEn+YwoelJyXljpbK;((jAeb&==Sz)FF1!&b4gk7}6v{kcPCC?}0>^T*R&v6*ZJbh7zYF{@K;WrtJPOKngo#MDOep(@9+by}M4A-d7P z?nyTrI^GWpJ5QfF z56}j3^xSFkzM#`MBLVt+NM!;qQAlE=j@yjcrQe8rC1O<`aT&OPbeZwWYjm~ zeM@hch=_*3R8KfT0rlJ|V3zbHQ0R}XD(T&MeHt||9xCxCs!68RDRqR;3H%ysmmb2{ z7BFiW8{^A7vxb8t&s+w#BY!`TyByEl{jd990$ zeyQrP{$I>cq%uco?P4Mi(0WF(?AENd{n$0YQd6 zggu5qSf)6Y`v9^v$8$T+Jh}l`T%Zt~fIfNuFkHG24eC8$-a-Ae)7C#N`QqC?{+<=7 z0A3AEKZ{+^e$@r-kMykxnTN3jhW}f3nqp^uy?(T+GJ%E?BU=V=w28LBmAnfL$*sV# zAZ9;^L5OI~5>{gGfgtf1Jalp2k*cP)N*^+ujj|$J2)yo2H z#0?TNcSAJo1e2xjaupn6McGCho4Pk}ou5BJ37+0sf^^h~^21JO{_Yc+KRUPhlXIIs zNp02V`n9xTP;a`yHOKWupq1OwR*7HF(iq^7T8AjEi8KcTLC%$2q=&c>N=3Xkd)mp_ z)1m3uejX+Bwu&2~m+?fCKRAC@apD@BTgT+w=_e2rI&NmK2)#UNH=&1Dd)vf2!q zTgT)a=|h9wtxs*m;lky?a6#{GTm}e455_3lxQe5F5b=HHIQU>0*(PGQ9OL^iGGS zehi*C!r}{%zJI6)q9JywR3*_4V20>$!t^iFVVbi8tMiCqHdbS;S&cOqLFYe=aZh7a zSpKVIIgF#olMMhmQ-#J#h_Fr8AXP$la}R{r z&bQc5Jqr1Aw()|^hQvjS%&3^v<>hgKWpAhFpzU1>xfKTHNN7s|BW{jvz_mo1OPjDm zXWA`QQte=htkLS7cC(e^uZ7m#B(nOsNJ$oKhsu}asI?B5Dhm?i8{)&e99b*p%WJH0 zCIqd1%o(D**oYKYs%Zx0=u50phv`=n zhtCRc7Q8|?5x0s<3cTWx9iC^1`fgl;$Wp|8=l24(uh@V`1n#klrs%EMR!Ind5SQ%z z+Efi!r?MHR;Mr4aaQSS4)=K>vE)k01pZZDLuTP>fpH$IJMwc1uN8tv;_ahkRwUO*B zrIZS60a0l4PLz-|B?$Jij0k0bmT?Okbi;GoGXNUOL+sZSq;vo;Py$rY0^#88GOv`I zG2M*i@x2V9;J(IFj1j98msGc0@RY>ryEGiux>ZLKQo3j69)K&=AOdUaZvZ;@F_3>9 zjwnZOf{+<9zxHhPX)4!+n0ZalZNm6;{UnKUd$3~9n8P5Mm@OOe;MRsRlHytAjJ4|T zGXc>Z{}musDG?MF1d3hF<*7omu}a;#PopfCSOYUO3I$N?Dn+TZ3$ZxC&5xz&Mv?+pH zyATJRcBwQx?4Zhh=!>vB4vJNHlkUawUMGj6c6|?CrTHkkzmtDeYv)Ku-`5~Q7Q&y6#4;UawtSjgXNUO z^x5RG6~vAB5;`Vi2JS2jGYTaLMXO4thh<>7-Q!P-rYoe{H`!i@V@1Lk@IZiveu)(dl`4K;Aaw z)ZJ{Fy2DJ&jIJ>0!CXzTKg9PYIfPgpfbzDtCM0wN60Gmv7|au@$eVS*HPOJZNg^Fe zq)8&(Jhd)$8o`~hu?({_BJ=SB5y=C4fFG_8T_@*la&G3p@(}{ys*S;njlfE`!5Cc~ zN(@Lm)D%47 zsPviwbLZk@4a!7op}klpuui6w`IKULn0)R9NEv>Go^)pT}0|C?Hc zMd{LKdg8DW*`-TKzMoI0)PiG|?o4;6RmK)6?zK9lRHs^h9Qh5{l}(L&86qj~hFV$O z;JiSW+md6UI$I*lez4~$JCGQ5xy#0B#Nvp5Z_$ulW| z6QT1E;Ha2300`8;e35`^EKdrP4l8s(NGY@(it_K4#tK---`jwG+bsy z`A0I*s9y?H)*va}^#=h-^*4Wjcs|bMw@#ml1W6-Jq){YcU`X0FV=F-10g#B0 zS=o)X6z9&P8xR;K`)<{}C?8x5eZnc|gK0`Yg)XN}!c4%ZMHq}$&tiI96m4j4W1N6H zBHLysm^RT(gAI^H7lhH3ZgNJ|vsh^oj$}9>6=auki?%CMyPR5THdxAGU5^7@tRf?= z$XEs|=fngSlN?KHISXaE(hnvtEV|A>7aK zIqKf`KCtOjyw2Cl9%?gPiD*`70rXDw0PSvUiNNPmC&$?IX6l^sysIp0wOp@eSFin62@2_94HnXmmgd>VTKp9rTEGst!g;el0 zbcM|WAM6Jo3{d|*g;~&E_dbLYhwltJ8{MZ0Fzb79s%tf_mHT?v@aX1Xq;hiCkuQtT zwsLO-@OWC!Jq%)5hj&4?@=VAkEi*}HLdcG7ZFa~^=g7`)&+bjLXQ%QjYZ-Y41?zqi z^QE@F4fBH)UF_W%Be0y7$VJGUI%A^jG1hIa280A+T&h0dm1VHus~StXO6<*qD3G-vIGD*9_NvFvK#vBvhH-}rm;$#+%b+G z0nz9yvB-|YdmfL)b@h>F0Ldwh>b6W^a{`+Z6w|tGN2GPTlx^n#P6gK9h&&qU6tB<1YRX>b!coSDQWMsp=}utQyMiSf>*yW@JK>yEnm`k+ zC!p~?Dya+c9wa}UR(1RuUXT$ZD!1^iO?C_owdp=Q`m_K%Ivgw}hq+a+WhN)ATq!XW zm0$%yNvMR2dRu8l(dH5lu`DB}>5N5cJtK726Odk758zrX>grdc*JR$;I!%^1p(PTm zAjpJvOB`v5(_{%_PQ(%iEODGxOYn?waiGwv!+9GnZ0=d;z#)uVE-;hNM7D^__2z(P@59igvPqOpz$08IbA|d?HO4rfnCB8|*fgewO;j!}UG>L;FZ8=b=>jGd9j@PkkQFSg>NM=Wvf&qEJ#;@QBn@T& zMti=a!Q~epIR+IaljXQd{qlg}v#1DfM1tpwBU?cpcEB2V4L(FB9P^WGbE>e&CCdbx zoO0P@%YiZ{T{$Z(eamo4XkND2ygBp4JsUwSk6kdC9lTgX8tL!~rW=auftKKQI`RZa zj)Xv>#`#_=^DR0Y7h*m$9w5tgnoO0g#2N5w1xG>?EIQnhb2^%HA=8}gTm=Mw-hlpG zUsx#XxXa+yQZ%w)Ra90O)ov%2Jlmt@|Kte5gjE9RJ$b>ZEq6Z1tL^lm~h{;j{ zuwc<+TrGNxt3?l%g6!0yhfM8qYN^>^DF?7%(F4H@TA>y_##L#VS4?s&t>r9~<&sYr zXW_}LWLl1;b)LnsOvf?HOV2r~vVo@-Jr0HU&fTg#85WH$mYRH(xVk9`1`TIS3acIR zB$LTeKFS<)@yN;3=v13&Fo5H9dbDo|Zng4iSDJU{O$t|xtDNJe5w6`CyxS%Bx$rR0 z7*)1w5|AuxvL&!q8471sBk6rkFV)EOM%6WBGFzs1MsJD?;HDibyvL{P2$F%Zt6AM6 zM~mAXjyJn3GF1f;9+G)xgw#IX?9&}K7sk`@BvNER$$L{cxm}9wpDh}^OwV1xvmwZl z?mx8tI<*0a31QRXDcoBwz=H2Y*lg^=$ZqWBs74prR@oFp?q)nHArq`Zkvz}dI73>J zO*%AJO&QZGI7=L*7dv5N8C0tsG8guROZ`B@3?dAhDS5IG=e?cL~7O8YN0&y-K7~<)6wnabWo1q z8!<2iMfq14=5So^h;`_+S!AUNH9AZ};b7mOWtnuGny#bi=C#A_L}5_KMl~S2e;+oF zMWWEjQyk`2_3nfk8I(S2!$A{XST}jKJuer=?XZl@HswMM*AL5nGkR#X8V~mP^3l!9 zi37o2C1HDHKd=Sb-RWe1O^#O(2u^rMD%ixkkKC&|iV*XY-8fKU$n+8t-tBt{;O)7hiDf*DB&4%=`{u{&OP@a*jBW}?g548fu5 z?DRpqI}Qp9-8SWHl%W@_5un>~roqnm_#xc*Dy}FD!MUH@6S0HFE6O_DadhnJLYt~cl#_xX>L3BW5Mc~#*ka^pJMSB83%s4N zO^%(&xF(oK!3npb=aPWuRC_(wvm1oCMz}{e|3jYh3V^ zC%B8_((rBC#)1Cbe2<$4Y4X%IR`6sZvMVVll5)ZGkgKFzI0h0F@j00{;-kGht_bF< zaWjG>uWCjnht(x2J6KT~MRs?XQE|P>MH*f)qDdDANexb#3C$?l zv)M5IBrTjDF9c=WWXy0<2n~edk&lquh{W@_Qis9#UNw7M5@mDh$b535)PZ=I;97G@ zl+DCTb(5?q_0X&_REKb3mWifrNO=?FLv2zXlDEjq#TSp)AYj&a4Ii=VU?>T6BA88b zDJf?uxs;T%oZhl<`pU^dk940X^h&<~n2JH^OO!1k+tQwz#)h4+==@_?FtG)_!{))LNh%-k~|hUl3nAc~7Yn*-X$ucOtG z*~M%S6Cfu1aojqYOPi7@fQ(W*fUwzHwmmQ{rB;~sL$A}%;9i8&0IT8x?pc_?q6DT) z5HIvIxEJBH8BGvx@VAo+ahGn)~_ZhnIL|*Y*c4Zn$w7ON+eALl7N!ObM zifIPql=^OomEyR6`9hj`@xD7gjXR3V5^#B(2YSTx7D+931G2gKG~w`ffPS&0dy)0= z$~oO|nVuCSmq4*k0*0$T)cScIl5;Xyb*OhvY<1XiFwW? z#hh|(2iR!wqhr*~!d+)SMxI4+9{g75N;bP>IM`UJQVLL;q^+yM8C|Ipio!U|OMxhX z(3WKK+&%zsG`8y1|G4*F>E^W@^JeNW%joE$8$i<~IC4H{QMK_D>M&P5 zp2q`^i`GLL>LGoydPoB~gxl*O%{t-ObO+Q!I#Lg5st0^UkF1A^ss}FF==G6Cb2;6y zKqhQ0L6Oy1P9DnYl!vrDuXB`2*BSMAxXb!5VzeJGu0GJ~pdv3#q z*D067E}+4b?sY~ypXt(}*j+|g?!4!Xz7NgvW;JX4#fsN%+4!T0$HpB6fQ>sG6$dyp zu4Z^%)VOnW&x;zDLE|z}>*b$i6xCytXVRn`O1(P3 z_%#Jtc%HP_7ukC}0P8wj-QC1KI0w%Fo;v5le^Pm+`O(f|cO=u2%}5^1nnQL?D9cE` zTjnz;@1;=U7xIy$1wuWqk>y2xTIT{I1zm*riWPYV>ySMAB=?_TqKy~VOXx7o)i?t_ zjHhBuKYo03gy6&TA-R{MVGzFp`wKH0KYqsXQfhSY6P=Qnkxd?-US*3)g)X`Dr|+t|QmCk$UY6$fp( zoAAz>DCka{vtD%smwkBKpr2zNBH2Z0<*M^RLV62UL#NjV+a%MNQ@LA`)&(Tm0lgyf zS_(Y`C-(6?6dyM%lYg%!GY?}GU5iHM9@Sjo@Ic21%@LVq*RKO&?xomtCgGuuWWjVG zbi`n{lyE|c;`bea4@E_jrX&&-u0IR{NpKm7CZPgG2~T+oZ{cw-PKu!n#LcfwmvUJrXwokt){kqg6~3!=g)Ylfv{w6ugG?{LMt2`_SdnShmT%8gohjT3CqIU{{|`?_2;)HR`5*~f z%DpgEd=Wi=QB3ebI=E58q6x6p%VV0JE+Qkl13;4JC?M%;u}d!{mGJsOfkqo(!T52oQ$coT_rcDE``mu2Y9BW zUZfrom1=^KARL{QC)K(v!4s0@*qPy~tvV|w6lm+P&T9jP<0W-RT=g1wfRE4k%A>%_ zA)k#!oG|(>z`8Szva&6Qn* z%BFi#8mekYFLD^6<66fE3Tk$7uXqp>y&N zr=6rEwC(G0gmMG|fTtlU{R|FtgMmH#FH&Tw#`vI@2 z_nl?qMgm3~;YMKfH$uui8RV9s96j$~M2>pbk3s;$o4s;Vi}$8@pQ*UT4!7Hra3J{& z^vaUn$})GVLEEeNmfL<9snRAQy%E%5VbAhwxJ~6&?lEA@dINCU4w*lZ*8*`#WjWc_ zO%1>RfvACxAOmUO*kq&5#*tA;n~&g|PH*K9!zI({t6UD}vaiLl^=W81>vrj_lD6B} zfylH)L&sxC3Jc36TgY6`42$O}zAB(o`DSau#&+I|%M0#o<;aMU8-s#)ToOFVJG}$V zf3PRZF<(;r`Xcm+#Om|#marBudcq?o0Z!W=#hMbNn$mj$42Ljk@I&v#>sij*R?ynz zMZ85^ql4E@ca-$Z2iIHLOye-O}D1|%tBlEHS@IfGX{a!8K^ES0Xo*deRiZB3p zr#g%SO#;x+?*?VX6u~fW)E1V49NR*2L}UsGupA+3u5h)Qdzgb&3l7ToX&7(e2qnHV zElhZE@*@!}oC9P)6y1{KVVT4Xk{Cgf9w3KF44EWtZAptQGr@DzyWzqef$~SrLYN^q zM2A%4R!B*=aTCz)=v6G^cq1-2?3K zveS(;y*uHpP>-E>YK4U8_{Hc)HMS^iQO!1sj=U1MCo#HmBBO^+WOV7IM$cw(F&i~E z6oT!i50aBDR$y3jIk}Z#MV)M&$jMf_y+L-m74e*zZuasg@bM|MN!r~kJo0K_pTz9S ziOe24k=dn_nmwz{MZd}5P)ztUv9zczF!-2-#TPQ9#uy^Lz6+-Ue>d}Ml3!y!k?Fk~ zwibhT9gkAqKf!x)lh~0n7CpVRM}d5baC9rJQX`dR!>)C7d4x6D%<7M!LHK}zOto7+ zQpy1Ii5c!+A$`zQf7hPf5Itkb40hA$cH3pZb;=pHU5h)H7JNrPtulF5ajh=0(Kg^p}#jdmnm7c)iK1%T7FQqUO=IMk81^%g6fs1?j~%UulE)lY>L z(PD)gwSt*W*=0afKh;9vg}>R)eK{fMhF}-Gq&W9BtZYabN$A;?6;ad~I-SQf8Fv=- z+$iEBufX%fO-iaxlaj@bRMKiqsHAYY-K@cG)?iBw5wd8}u*j7%5!Ft!jA};?wIeu1 z=D?;IYz4lZw(451F&@o@7bQ))zH86g$c7fNV0cl6gQH-{1dkdNFNH>^@~PebdlJ)#z33M9aZ~?up8Q?>j193e8yMQ@j8949I-uE(i2+UC=|NZMO`s zH^TQLc}ePg693!IM~=BZ4?XlMTKndA<0b4qe3_kmuUyhkjl3EpT)XTVE|ChhwcU404|5lu6OCtsR$4!gdXh>!eU zYZjb15UL_{67VS7Y35GgbT62NqhS$rMwiMQc`u=@O3b(Lh-PCB{d+dR%&pl5F}Dp> z6AkdpB)uEQUb}S$Hi&4hbvih0HP>x|vr2LvsmM4m6FsV&vD9cVDj^~gIE{7TOr>zj z9!&hJX@Jlqhief?PnKW?#B+v^2K?}hNd_iJ!k)249aU~K; zx`kYQHY!{|hSvhkrq zHAmK~-|_SE9T1m6d?uy|Um*}Ltl~w^c!DSFx%c4$hFozu)iJ9549hds?*cA8_Jp#K zlHMoqK3+Bo-zN~fgCePI+8(}x;vEpLMbGjZ9wKHWXdR*pHoL>eLyA{BX8ECxQQqf- zmZe-#c3h)ux@L77%NY^NT*n~G3d@;iHt|g6^|3yq>@ol|e@AeEVpO12Q{ZR(63eV* z%4pAcWmu*i5RbL`v^a}Tmr9>@GR>&Adhye3UQ|9D-N^Yp5MJfL=f&~s89M9xg-+Md zZWy4A(={}*7C`mxgNO3k6c1{5qAgFw`UT2l6D7s|8lAyTl)>LoSGEo7{(IC7uN@9?t$d?_cr3j#BDA7#eUM+6K~(buYJN9LUg+{d z6GYodHas5=4~v9K@U5Fk$Ca99ci4Nw9pdZMD-*`v49AnW&smJ!Vq`te2%o%C^8#j7 zzfW!Qz2Mt*+$LWd3)V}QKnB6OEJHy_Db@ z!Tl&L*F%BEr-Ic32bRMll;A-E7_smh%`OVs9p24c#yx?p4sf#2jx>Z}cu7N3?E@b1 zBfs?mXjJVZHvtBzNi3pdqu2EO0PtEg%35M(w3=4vKp@?Pf>P3wC=_-{_}$q4QfhR{ z){MU#Zocg1q$5d>0aDXC>=xcvu{2Pot*5<%3O#YsHy95ZZ$5w$*(AKRH&qz7^~hWI z4(Lt43jnb^v*sy{) z*XmR4K)`H&3~J&4SP~2`MD-nZXbL}XdIlgHaQ*X9=nnoO+!DWj2qQf!KiK9A!>CUo zgeKpobd$5DGqk1h8)>@SQ#4)CoQb64pmrNR$+L%^JNuz}t~aU>Pp-s+FHQuM;Y*`ZGdg3Y8dN9ovEGm4 zGm!X-gr?!Q(IRQ+p(L#F1#plj>krG^u0J|n*8}gIL_gO<@&42Ud?N}j=-}Hr9;TC> zq#mw{Gbq=$v)q+Z-}x};%{E4^xssr-c;&?t`@rc5+z{%3K_V@|zeH{Sh|16LUB4UP zvcDBNA-cL~l@1B;^K0VbTOnU2Oe+9#XMhb*dorSOyJ1Ww?d+|o5ga5_Cmeks*U5bn zd$W|A`xMRUd>Hgz7vV#n(<0i(B$8jMlJ!Eev1qdP#Gh!(C++%VY%uFaq~tNm%EmY2 za2cnGaS`kg+PFjLhFfSdy$9#5aLOPm_jD&b`7M(Q6#8tcgNs3O>d_F;TY!bmZvi%P zpT>8m-w=GwBzOxjjtxx>2UDBq{qFSKOPuR6VNjHGNMXtx#hX9Y=fiEbQt;OU!PK!X zJ2%cBZiH<&E9^);hx@UBm?k1cH9Bcdg@feuS;2S0(9({6R?zj>>~P=kQ6rBeGu*(8 zc)J-1k6y4Invvk^J|L!v$d~?oG9%7rz?2XtL|}#^YT(PssYlEDN{+mq>`IM18{&R4 z4G$^9A#Uelss%4)Urf1EUc~Wh_lf7%+PHJ_a<8Y?!@+k+k05RWaDx=gq#&EI2SH;) z?YLUw_!FWwwh1ZNcf{u7IDSOiaubf@5xzs)l86D!_l2eMzMvbvnY$D6QTGNB-V}U4 zyeVYlcQMZi`iH58Y@5rWZHDz@a4V6dppOjOh-$g4rSc(x_j~$&%(*T1DY&~A*6D^r z?vZAuY*!fw=QSixmv8$29F6?p*(3D@Q@XXw7iGW0j+Us|2U-8V`2fCq-E=>N%O;D3 zI!Z=}+?VK`2lGJgAs}}ieG}5~%fjd_8-+w(SKm90^9LZw12A(Im%wW-BDhSAYS1E+_-sR!Stn?^x0mp=X3%;xg{3Hrm$U}Nxg3y~d+WO_vL+?W5*su25VVYusk@}I~6j4~@%3Jf$Pp*t;bVy^$ zRhryL?g=;4M7?8F(|hPVJN3mEpud_HV&g{BN^Bys3Y)bkN$DFHPo=Ki<9Hpd3 z)g6tV&rCz2Ft_FKU}oRgUj>d#scu&N5@7k2;08|s#;=JH+s0Nq{sKr9_#hKDu#Ds5 zfKi`r1esw;9U}h69O*}{O!l4MPdc&L(eKpDM@Elkuw;7)F9La-^6sZB@ z0ekq7BX5mZcSj~3f(aZxJ`vzK4UC__z{D&D#v@f0IwW3L;w5I~BnpX$WomfXKlTvl z?^P`~)b%iOrG=*6fcTRDXAnl}Po}z06)Hdp%HgHRScUjCzNOubwmu~?GKI>VsC-P; zG~8AtR4PT4p-@C!wnbNAfQ6Msy%Y7P;;6Gr2`Hs&QBfwH&2$uec*L+PEt^p8``A`H zz@iR#@K98~*IxMjX3!q}aUEJ8sp`yTx=>YDS7(!|E>P9wbrcbNW>ANh$qv1XC9|H#2_bHg&1O0&%Wf=0cS|9Pb` z2fyF$jy(p>dV2hfk174Go~D#O6yNuJs@r>{*Luf+#a`>}%F24}jkI=ItlqGss)aWT zr`v_~h%h}K#-@5%x-9Nw~0A&D@;)t`>+{idcr4`8ppy4?^AJmt@gFoY1n}K z@Y_RuUQg}^xWXD|_(uR!mi)qJtkb~xEEuWHS8E$v-PI~DBmIR6!6D3@&_G?|JVF+&Hs}>u3>-hG-e#XuK~!Z zSX`c-_aQj^uqI+kVlHv%fW6|o(X?kn5GEv~VbYh_On5QNRyR7Xqe-A@tE{+kS62*(wJg|*VCk=gd#zrP-a5*qZ~d0NznoFugBJX3Zj$b7Hi8*pFOu) z&`{2Ld&@x0XzfM9>;lu8`VynHFA1}1O%S$#JeM>m-3m_+VDdy^L9@gi%R2M`ZueDC zo^><-lk&9ZNaPb6V%$$VjFXx%@7sqAkg6N?~v6KD3&4yNtPd7S?&6>{3bElyceHuTBluBc37m z-B^>gXHIiZUUfAwr=2IS)F5$aAojuZUA>F`Bkc!DdJ|y${?JLvd!L_s79feXY?5tS zQ}~sQBXc>+ImxB&&T(lwPSYISot#L@8M><`=)uaSUAghU-SgmLcJA2-98t^Gjhkt0 z=sDOKJ{N+<6Xo}V@O|RJ`wefVz1e}kmt8UNk1~8Sxq6C*s1Utn{kW&$r;mOCxxm+Q zevVOI?&~bl^u?OZ`#M>zr+_f){u{*G1KkOJ>%Yw}YotbJO!x({~&JRO8qF}v_XN-N5)Vri(*eDvA?s}QhgfndWPOv;c|Ap zGP~njl$@06!ll?dx#W5`Y2s{n=i?T329suba0dilk^&28KSdV_-Uq?gz5VvL?3XKK zS!9ZE&m?~s3lipBOmIw0+^Il2^Ziq|0(ykke%FA$9qeEJsOu^EG*)d`)76BYWu369 zm!0~F9I8GU-HfipJ(1jRfEsBmx3)Bv+j#A|>0Ov86X#~)SK}HM_>Z6^*!S@?JrlNr z$3wi6)A8fPj_sGXfS;}fXWYsa`+O|w^Dw^`a-9+bc7>)9uipk7cwdx>tFQgK(|8`Y zkz2XaN=hE2gG&1-*u<5FG_IB3%UaQbdO3EC?L4UWC=Js2FN``L^UEur@8YrqKEJKq z=eGtv|DE*t3()7!S3dtM`h5NN^VY}kMS$`n7}qT;50$G!)!|W%#tR1^bWVo>16=vn zK>Un;fVW?Bc;CS*r!?fP2U-khJGX1Modvg999(SLdF}>?UkCW1G~nwG)GrIaLlxUS z@REd^2IQ}?DqOCVdr=NbUJ5_FX0Hcg0^-}?w;Xb;^{Xse0-Hyhy#0DiD`a~I~j zA@Sa>w05bpzCW$qLE$Y)3~!?FvF7@Ip?}{0PXSFaAL;!TP=t8sBDbTmQxY8`K%o37aRe z4$TGZk-c9u9u1fWzfNt+{-QA-Jl;*%e84t>&wDioB>xyg$%M9;(!H9}rL-zxU+h7w z1D+v>fgKI^i^h#`l6MVZ_Yl@AvF(J-lh{7O7D((14q}S|!^-}FKrAn@7j__4LJTZ> z23aSU;wq84vu;29}wozM4k`FZ)8z=0PG-Bs!>j--(@is$B#Kuj;F3`>*>|;HM z?bJ39_IXM-0eUcp)p5igpq)+Fr1wSRfc6mhhge@0dDGfgDcv{0>ZfWqYd_YESSPjM zjez}x)Z$I|N z&bI;lClkYu3R~ZG?05Euz*nEM(S`!q)@NXNOXklIem{j4j`Wzepa3%i`>scC@9?4 zeG1SgC|qkJ_es<;cTsp%&k~^P{jURfK7|Xqhk^1oXzidu$M7p@4FAxL;TXa1G%;M% zcNfTS%)AQ15eq3_gmBxju@r{y6G(Y}9Bsa~7iC^*B0LJd71|OAp%j3{w3V@SwrX92 z;#_;zv0NO(7klRblR#|0M(7t1{h#ezdw5(`5ubDSb@wKl?rt7UV!63I7HCbk*_&kB&F*%0(7DU+`GF;is&EueSW&(&Yj=PoH=vmJn!A5OyAqEI#BZ58*n|ZtbJ9$PaUA_ zxxZL;QR5IweWZ%%4Bt?oC&ugcUb@su!E%#>HkvyE2JLXrmF8>FE0;QG+}soJ(rGg_ ziq-8!Ju8do69J3His*2lihkmt$NUcm>gb80?hk=RdgMfnMygIWXVI+L8dWxQny1hb z2Q?VynoYE+h+b_r(>;RTPA3>CvxWZP==Pc0%{DS$=Azx^8FZDPH`VWrzSDdK?JuHt zn~Uj7Mf862EP7BQ`cW7?ODCM9(d7*vHqWLd8krvnEl_9EP9R;5Ew2=G33&pIK({%T zchs}xR~+<#=*QvZUO{i5$9$gw^32gSd<-=#p*eH3Zbz8W#ad_nF#0*5H#+Dqb*$Ut zplY)byUNuLy0VJVJ_o(Gsut)Yb4qcx)8Qhz!)&Kt6wzHcX#J^(zG-$+=wuyPys{Cy zzzjiq&25d}HJ4G+K^Ft9pfN#TrNuQrHoNFn2R-Fqpw6Lt9m~bAiXypW!D(8WL-X+~424gIvSsnmu|lxcFkR0KEC+lr__1(A|O_R;JYuoTwZ6x1eVPy^{vQGlN4^KUa@}BjHB;!X)OPC&RTsO&Zbl;gF2i2%I z2H#BPe2s3X+7o;WJ?@~Vd{+hEN{bfi_Em(g4PH)17Hjn7>W>AlpqjIE8}3t|559xm za+WUlp1_{q)pXE7w>KOP?xpUtH5&4KJ@_vA*4et;de6PVYsgrlbz4G*gYTi3pgTQQ zouc>BfhBr;{v!Ir;CpGwQeAF()g9)w^cM$JRQ)Qrk51~)=qAju_feaJs=U7ozK^bP z5P5yj9dythenb5KRN7U)R_y$mbLN9Z{Rz1*w?3ar!_?5$MR^;BI%)z-%;Rz$~HH_%6m zsKvU8>brDgZwxH9K1;j0bSxKy8u9-LE_tO!f2&bIV-7l0)nVO22OM;F)hg?A^q_+Z z#vSGtXx18y-jB8)q@xa+M(eCE(T*OCo-j9Bhv+H?ofX_@-A*?<=y#PHtvhIJtw#6N z9}eD0_x5RIcn${-)2ww)uNVW?S17wq>;7ygtOz$c=v%1$s}y^cMkh6HvF@hb4ytS{ zSl^%<*E{30_I1{`=>GFH`f}~1*1Z(IK-X|`?G@I2wD$^1UpewBpSU;fO zJLn4yAG02yITvd5_S&1QAJeW48hxPlbJkC2c%w!Sdk$GYrKPXd=yCd*b%fSCXukJ8 z>*sW>gMMH2bnq9ndy__?njcudq}v3&otmnDVm(Yp9CSUE!cZ%>Y0J0O z&#dsOc?Bn*p*zfgx_pO5mticK>Z4N8hH=s@la?vzl>*MuQkH zr>Ub?>R5U`w^W>_hTkrI3v{Sro*FBnuU53ECxF;;;k0`yT2<3KGne>#!m-MwYCRD9e95$vDm&DJ zS8KGR=8Vc^YQ|nYCKiO&RIX5+*J$0jRa+`wsm6fVOLb^>)kzIMkuL{e$+)xp{;7y$DRGC zzAZGO4&R{r_Bd;CD60~m(&$~0j!;f{Z`5eEe{pD3?Y+ruLm2YlzB`F^s~z+<#b~Rbhl00E|FAi(@*1h%)|TtesXqm1r=z*Kb1@d6dl>0hfF9Ah;B(V^Ll>3Tu61thK#x0K zUJ_jo%Y~mU)z1GXEk8dpy|sbq%37vx^crN)eIe%WHVOQ<{RVmHhNwYaI^JaYzUqG@ zKNKX$uLJeMhTnY-LW_5fun&m6DfX`aPuH{kkE>u0o5_B@&3?p#PqcpV8KCPU1V2~9 zXHa}vbX7H%eN&Ljh72xS4eAxoZrQ_?Z1d&@wt0+OEiE;~rkwXUkvv{MSu(TCX0}gD zCfax*4~LQ7#&8&K_Z!*fK$z)mLjNG8E|f@Ci=;(7X#SvNew0`;OHJmN|3mGqlD98Z zm-E`ErjzBTc$i-d%F%*Hw7S(yKQG#&p2@t9;X#S{Qw`keTlj}Jj`m=L>3~F4rF6Zz zy_2K8va*!nJHsXZgTy{xrP${Kfr&OAN0JjiGgV3QWs$s9B){UaFDU;bs84J0K8m#u z2Xs8le@I$%6R20}b>+VaGJmF_DN7dknSa*Na;f8`XPG zsxQd{HI7^;^LoT;ZAN?^?|9?!cBDr4sm`{hr5Vu@4u_G|U`etwFj>+f8LpKX*D}F! zvV4V?>1!p1`O>b-Wc4V7S)%zfC6ccPSn|mUy{6?aM2#tJoZREOU#3cQPq}<~<|Sqi z^9Ma_zskdHxyw^3rCU^P|8e2_h1cWrLXr5@Wd7$3>093 zv- z)gn<%<#o@VBW-y;SS~5&^ROWTAW7kY`%cZ;_VP!eak zj}f2YDk)h%8@yEq3HVd+9p$Cb1@t-4v*=ygWwY^yG7Rx5OsMd$JTok!p zT_u)Hu>6|3mMtNFL+t~Qv;DP_rK`l}L$Exe_S0!qe+GpgP=4mvFWUXkf|pWn(LJd6 zZEKg%pwI&%KOpuui=Ug>4=DRNAp8O0o3ss&0Z{k^Wyt~I+k|fu`-37msCkxyXU~VZ zF7Qn65!wdN;6Wjm_TDe;y=_hwfg(asiI7JE%ATyaUCAol z#$WnoDw$L2tKQ%G&R17>7pS=6TAq**^^DYR;`jDVeiNg(1#~@~4!VI}0h$o`u*kE* z7la=Zo1J2_TjZCD{Bn_BC6a4Ia;-?NV@tGn3FraQ-YDAJgg*#AggxtxpnnjWRm-?8 zwVLZvy^!ow>-`q(QgP7TY76^OE$m0J|C`kk*vvBWpmU6!kaQdDxyN9eK0{h0l1(B> zh-9}RksA`ZNcM>2!$NNo`b{s>?}3IW;(HrtgV0gmyFkZ%JN+@LK>W=Pt)@MpX8e9( zFX)N%SXot`vCQ}MBZ4WWMPUxYKXoXT0)0xx6 zM(9IfrYa(qjbbU3ULv(n$4GyzdcFFfx=H;;J);aGU|7aW#HhQ*suJP>m-0JzF=T6VhJWqL^^@O}LytBRY zy=QvYcrWxOy&3OL?`7V--Vb^|?fsnh%ijCEN4bAe1G*l@2m0qdDkZX<(i4TCrHPk$6iVy?2Xt`>Eoez2;a5TGrcitgFYBdgFaKY z19ZB%6ZHL6OsgVHXNH-s7Wt+AU7%OjG4)Jm`zxmJ23;}zQitbXLwZnm1NlH3C640} zgMkPtKw}i*(+wg~91ow+DZ)EHC{A`%4L%KO;KW)BJ_~B#S1Z%O|A3~0{~Xj;|-l^WJ?oi)R zkEz+l0^wB1vH$HEBT){GYTmeIFtfgOzW_b*ST!#iv@oY~fpDZLZ z>3mn3MJw#WYJ04pK~K)!t~ou#x-$du)T(4UITA+&8CI;zCNL5?^;+VZmPrsn7Eo&K z1(X;xni>O(bO60h0GjK_WXIvFFTBxKi9A(K6y z2DJ2i+MEHw&=|G*`zdb^wZxgW#;HAL$2rWh2D(iym*h2ridMzPnCZ+gqg9&Gr8JO% zg4PzeM1t>9>1K>S5U!b7kd9O`o3(S@$;~v9AIRiVU{=_udxxDH$>e#U)0$L54}I!P z=Chf+?Vt{XUT{G&owjqD=aK93>`ZgW)(%%+yybA~9nTl+k>-v}DrFByUo@|<;Vd~o zLw2FR9kT6qXJ$Yz8qCP}nx9}b(vgl2*@?bk1e54WU{a*|`;%#OYCPo%k%QiXoz3^y zxwUaA=6091;9jNdU}4#IJG~~s=F7(H0W<<#u+>h`x^z6BPY$JRUA8OVkwO+w1Y^Dk z(glYZ&^K*)UObgVQ0=*azDx?sUwXhkYioc1()hqu{1AD0(oR9kze*k`q{e%bBiYn3 z^j-NiSvx&dzShQ6&)dD3)F|g|ssRRZ-o`?J-10n(=cbyhN*1{LN0Nm}I>}1MFcu%o zh0K7R&o9l4rW3>~hvsBi)GRs~5v~=!Go$ZY3UV(M=*ln8a9Qt<2;u z5@y(CY(dGj@$`@m%w9g4N@+M+4pJF?FYWB$^*R7vCtT-*=QHkFG+{_1l&PX*W`cm* zRp?2@(`czs+nG;1B&d8>b2hcf;(VFBFE@@pbD`e$u=W%MS(jOsPV|juQJHh+4ix4* zEY-|$hdax{@?M0j^ousA^`GReFWv)X8KUu@gybIiydaC~3=x>n#9a-nI1i z=fUdul9=VPk3f)UFJP=~9))VfXtIQGAlN)QG{jXpGF|w*WIj1T)}GJXBb$+uWZ{_N zTs&cq#B*Cqs=jy*^I&-{K4S04XhnIIc5Y=dk+9Px`LeNsjpZhjp6Y%%+HxN9a7-oU zz+iG{6wN%Qy3@`NmCk#C?dRl#SX954SVzV6eY)+<mp*^%Fx96R8xITIY1XYBWV@dq?*O zuWkeJ^kzFg;?}|&1_lRCwQB}Tx=hyPos*{v^_GC7Qr=;7lG*i$bK2nZa3M2N%1!Sm z+~k?^K7-klrlp9|#yykmU%@9$#67HGH-chbYSM=zsY|msiOFp_j=+3E#~460)Qbz9 zc1}j$R}ABH%RoQQAQS20mea%CoPk*ueq1E07LNN9;F==r;8tUc%)n0YMm7T=l7u|V9qhZENU znw%7Vb*9ien$2c%SQeL!4cM|YxFe$^NEFu%o#u&WP0sgJSu!)l%3<``9ZSFncuW!= z<@`{U$*>n|GG^kstej_h?V%B5D8B|Zrs87c zu<~F>3Ea0Pvv`8#w(&C=Kayb@yPKSwM;tJ=N%!TXp;OMx+|;R3G?&$rcJi!wbH z%6nr?E@9`2$HkR)3VC<)kC8FqRO!Az(OZ4K&=cnk1qRNXYae93Gb5*XY`pqDA{3*6 zlcFC8d*VO?h4qV1Fp-?WPB)%sh=FkBiZtNlh?&G3)k|nlApXYNWWmw zLysr1Do$3rM-EpngODF1^3INrk-I9xP*48V4&N&i5lgHf{jjSMFHU;KXj~i^uCdK` z_tc$t54BF!oY}5)!X5)o4d*F`%h|K??(V{X9pT}|edf?cPJDeCEpnehT%0X;!pfck zKaH@fv}|Yj$r}`lWE;wt??GIETgmt0dW?K!^b>)zTITiI>Y~YuX`W|TakXSTb@1qA zrd;9%SUxd1#YyZPn(xRU7XulNjj3}YZBM0igLVJtldSvbf&_^`_kd=x{;&%!gbg9D zpAH9d+w;!*D|y-1l^A0q$2qeY90kp1nd;{|oILfmgZrAn!JY!iyF9$Xlid_pMz7|% zBgHv&%3h?k-SK=ugA7x&m|w-f-R3QP%VKX3?geL{o^#lIuqvXb5C#~xQ#ImT4d5}K zAN(mHZwdM`0_?opdg4gAgf1|}gsox5)@-NmIiZ;>-p8QJ2a*MusijvIl%EK3Ic)iB zQqudlTrWG?r0FSs)Yyi?%r3Fz#J@{Oe!(@f(Z2>EF zX{8s)50E?>ur_Nfg*3Y~!_$FQjZfH+v0S6nHV|H1vF`AMB6&s9XM-ETp=O6>^kWBq z$>A;@@-$Ksmv8or^_ZO?n!HSDVG4vNvrHl9A$;j*0l{L8z)4Aza<}<4HetD8N#_{# z3N1es;K)Y+_|kz_Axh#xSZEt~raC2fk!fR}VqHErz+KAAi`yQ-dd-@kf?vT|CRnx7 z<1}$_P;X&0k<7Gj-%%3fxrgG}IA;4ePkq@oG>^D!2g&No$3UX?4$9y!hj06nl*TV_ z&}@o9G72saS%NX-DM~@Q11JHUg9JxgAnIy|1g|-z>@b}P?HbBLlLnV{qUrx z+-CL(eiYmm@B@%G6P>*d_6aA3W#HI<7yJ}Zb2}v6>|NsAE)gXqmH{U^+O`aF<+wF$ zhlnzej#D47?bKKRKg#v7ABie0x`flNK`zbhpWFhjM{2|&SRxqWh!^y5ebCtOmDjO? z&w#^i6C>q~DP{UV zBDKs`F)^Sp{I${ZRdj|oM%8RM1Go#=j1eoU35w`CZM2Pb`W9D_Sr*?k8>o%$+M}Y~ z-hhgXRFM(cbv2ttE)GXVAd8OsW6B6ex1oYiC>D&4n`THp2K$0bj;xySKf0*n2_-?j z7K@3ZyY|%u47SpiB`zR!@7nF$clr1plBis#@M$gxgrfyhHz2w#vM90;Wnj*dP$*ij zZ8g=oz#m6y`Yd)2%Fa2ekWUK50>NlD(&iR*U6+b;qofHSo`4F410J0xHi%ptxtR0y z0dRgT@CJ-fC>Zk?NLVObG{3kuVxv%GmS02k2}`QUuND3n3UEQCbhc5KsS`Q_I%QUq zFJKtxTy#s!@P{e`!3zDcA~6=uLJ5mIC{aq=NgmFqjVnyrvnMW10a^bUpvEqfP9YZviP>74Y-T{nN^BeH&(*4bcq< z(wG+TTb6-#qbUFRHOn4{tI;2QQa)iuhocE$0-i`4{+hg`Of$&AN7_(hWx&q{Xpa?5 zga9@H;xf314^AFGfl}&WJz_P(lAhu{F$a{S&^of1!^Ll zh*m<{0N*+`?n%BgVjmR&pQH}bZcY_^c3bF6nM=}j5cmQfgn^7Z$!2pdTyj$xP@D^A zPL^0HpFrMB4%^g1vnpT$n;4}DVFDiQEua|#&9*EH&5m?NI%@(U7K*}vJTeQniU3?h zX5l{s7O+rBvL!v(b;2wocSm5N2P<=$LN-If`C z=O*$RixWNr)uWVdZFwm(;Dr|dp~I2BNX-d>8KICCnPBiAeo{F0zN5)euJs3mp7mi1O8;*M|b)I9w2A!9_1AWHy<>+E;VnxXv298ZAac>t~=q9 zU+)}UH_t0SUr|g9CLSg%G;jFX<#)}0`uBHvpTj?Z?#1=IdE(M{RDR&vyIx@eoK0-R zVg{!B&*hu$zs)a<*zC_Pwtn!TCySCL0cXkb_>mT8Z!!F)#~)dUYmwnM48LXgD*&2s z&BN7(YYDDST(eMaC9XbP>v3(swFy_E!e3g`0?w-A+`CP`vtv1eVKH`hGp8#9PR|D1 zJ<^YjfXQyS-xhE(Dq7rGak)jj6zffZuop(RRXLJv+S(*6$fMW_Ysd>>D6IDo=T;9P z?4~MalIbY)<`s&JOtP@ZYeIW56laj-7&|+pzU_jF#i5Wcs>_wJjpWx%q)8Xo6vd3n zuriJ(y{(y*ywn5Txv7P9VlBEKV(? zj1YhdTVV^OvCsmc0G76x7kBE>E75A20C(bNPp zFk&XiiAH*)Hw^9#C(cc{hjcF)vg@J%-{62Z3DFCOI)@-Q5ZT!b=Opn6tn(ev%vN4i)PONuxtJh)~%GaeJ(Ovd~ooNGBAt z5_kS94cQP6V`2OxX`ZINxNbw!kL@+oNZt}Er-so$o)=Js%bjzr#~s_$F`v>RmtxG9 z6w&%9d9XZS-7N`ut-v#e$4$aQocJ{=lkk#J!(mM0!C2DiRUld)GEu|~n~{Y+2u#z@ z(1etVPfO8lF52dqL#8>$S-LdCHgm9|L1o|y;evn*DbgF?@%#_y^%-@q!Y>o?^-J-) zAAEg^@8lHh46%zSs+{oFmVAok(-lRFUj)bQ_*g8~IT3_BCV<^s`!OUDn7m%FwA9QMNJF=$Y;jq_pj%>!93y}3n&`Hzu~#Ix3jnI zvp4T~`sB~9dHvp_`6u>%=wWV7$C(?}0H;**R^K# zhVmp#1o%pK1HMVO@#}^Oiso!$GyV5`4w|aSf1ml-vF+}LuJpmHwOnTkZ+nty{Ubu# z<}a5;_xx=52-E*RFY-~6q zpS2pe3v@Yn{(RB<`{%SDrbh98w&TYub7$hGQ*6$|`<@*9Bq^oeZt*)O(a(}nea^cz zeDQ?4`vysWZuDMju#aAOkEP#2P4zS;HuH*qZM2zlK#h_Qe&2^56Y$$DdBdkaCzR>3 zQvWzw8y7qGvy?)xaqH`pcU}V$M|MJ-9qxNFd8^eY?-x_LCd6Tu`8ZF%E7N5ieY0Gx zxLTyn2<%Jm)zbW~&yDPb>q6-S?kT6Aqx^rN!eWR^b1Pv#&XGeh49|27S&Tl0D~3qs zArc-Hr;sZ5qkBr;9F9nzZbiNB=NyT9jpHw=<1V&4{V&CTrsQ3}X-w$1mu?1LG~aDx zPA)qs>r->SP|CFP8%=53W_gPmd(m?L*$=i=&_@>1|3CkOpT7f8O9KQH000080H~`^ zO6>^D$bFaq0090003HAU0Ap-vaByXEEif)JE;27eY-wHMMXtL#oe}At<@HlDk@r)e&?R^mU%O=Z4!Rnd~oxh_ujepp1Ym9ylrMfU9->c zTNX$u8D27UXv)m0sVSp!a&x=H_M1|rVT(}zwG(iaQJUJm*1p^RSGIj8zT5tvx1#T= z$N%-#>B&5YssnM#sV!MMaRR0ueKQ>TUiaL6 z@fTV5%s%(Zcl^h$y#8HX#-UvB_Qsq7hxXm}U%!QG|0hlu?cdlB;dk5r#P(hJ|9@}C zYv)XSEarvyZB^R7+1E$>Y=7yDtKWb3`S@)UdB4+-zrQ$s*$eRx4uPzz{J|r=`kXlJ zmbjT0eC{i+JFjqQf`k(}uF?Pbs;`d34O#c)Tdw$??|ri5V(q)_KYr_|@_+QSE6#s^ zW9Bz|FF*2re5c1Q$n107quO`df6ey5g$BRd{*ShAKKkY(2bfBKO2#ai=l3-Gm((Yuh8p+<@{7lbAB8v^Z!OqP4nqzdYXNjmZL>QJu&gm zkKMKCrSiRL?uZ9&y?ZH%%+#hJJcR2Y$8{neVMJ(7ZGyzJOTvz^#8U>DE}bNv<(|Ol zmCYVB*tMP#pV!+!5o?+?jHBYuWeH;%!bs4=@V6dDj)bvADtjkO8082fQ4gbPT}>0v zON)#@239**R-ISJQ&c!{ltkGAtC}c|Hs#Mq(d!tFbGYU<9WoiZUgiF2zUGEAeT{({ zuhzD*(Bs-3p|AOw+YHEz(&MW1H8cjw{qtcAJuRFU$8ln51p66f%ZqqRUNkl3w>dAy zh<;JB1bMc_FjYWievp2%8!J%0Ri5RmJdJ@i#i!@TPKhtuk{>f6^Frs~_$qzg^~-&Y zDnDHC(-g^mUg&&s@8Cv^R)yuK!nzjXB)RE>7ljSUjld6u|lL&n#o zGL%jfy{MjZbNZa(&J=^9+Gx?Ad1gUDY6+2e4-v46Wo-eHqJ0}i^9Yjb_n z?eJI5(DqUVnSR|Qol_e8O+LS;!dF-0o!QXXu&Sn_!5>ii7QycUC;Jt7b-V?~_QUlf zTPw%=NxFLk+uDj%n%1s#=zU+kbVk=&(oqeWsd_r*)-*2nRD1k^w$%$go`VukvL&8* zkaJZJbJr5?9#_^=C%Mb%i|=TsSS+hFtl}tBzlD&Q9IxB+W?!Ah@1N{j z(^xO{?-l5Fx10U2oLT>RTJ@_6)HDb9oWpi*uE)Q|E9W9?=g@hdsYzUMh-Ww4LTXEv zxFT(Syej)Trmjzuf%=aula)n~Ik%_e$)x)F%9_9mUB@HPFQGHbvy7P^y(~JeXjs0Y zT+TUc=RBxtemNImJ6Ga7V#y6yf{9&`POvYjiXc7)^6c0Uz9UsF}UM}1^E&O2@A zy`E(ORo;l$*SxN#xt`;Wv4@Ww*YhAH7WSYMkBz_RY1Ubn%})c{Bg4-Y_^HIPD|(rJ z-2cGOKKOZz`rkfgUdM``(E4Edi$fV*4G-)4n*KV4^~ZX2wx>70W9nC87yME4I&)hL znZEsl>z7~hwgQ2?*O}#6#;jkxE&4U9HYI%{I_6PVJ{wzTNu_>^v;nk zBVE}a%kuFZIQAag1ngg)cyh-GdS9|t(okSY!|9NDF4349G+7eRrnvO{`by$Tvc$C% zGEqrJ*{{WVmdBh3wyk{hI&dIP=2@2bY9KSvjL+|pwnr1w?Qty2=gt1RkJZ+!V)Gv;0qN>FH~=CA!|W z<8_SzqhIUWioK$v+u=UI@gd1(9FaCZXS6d9^t$>+cl?pH7DG?Sqz(vbZ&h_QjkTVd zRZ7Q0@Oe{r_9JpUzs0d?xD;x$1A^OHKa1{-o^@5VtiR!JXLs)Z&KY1Scbh+dZN8p= zq2YBxr+Nt8|d1Fzq}ENP-)l({om}x{#aJh zhU103xWBx1U~t-!tZj~z*T?X-b4`?JZjVNoTO`asS;CC?mM|m#i7?;jg>cDE4l=`x z`j#-G!-d&FcH?kw^O}amMmwJ$q}N-I*AwteZT77)>QNu~xvn?+d4ABpryhN*@z|Kx z?j6ROKKHr2WkzTlbG6eA*)E+}HYSYhM99WyoebFok#&WUEw;!`qjZUEC(AX5aq@dA zWT{S+ksp!=W2t*m`@Nw{54i4Hv?Wa$5?)-GxMwMUNlJF9u|DlE*0-H-)$+R+#yWMRW!zpXX{(FS&VPdH z4;Z8MK{yp~;|yJ2=*(echtYM7=-MJWtp_PhXM*YAS>O=xY(v*Fj{ac zNek8WJSmUO5!$AS;P*kK8(|e`UA19G7``qX#(81FxJ1IZ6n@LV%Os30+607AYlQK! zgt0kH7*`_Ke*Mn3~c1qseAbIx- za2R+a7_Ci4UF(lLOM**;OCe{}zk}qT<22?n-Qf1g?_CIk%I!9g+Qx?;eWU90FR|ZQ z_PfgdKw+A2G`Jg_F8*f;mwuF8r91$Kf)9fL;w^w1 z2sa4vrBi+e#W_{tyf#dnk4gC-ko z>Zntv)^e*U>`49{5y|#38l<$k zBiWY6f;~lNY9XDmKR`H6j!&Sviv6j=Q^2m^snnl>9^ttnPi5U5`&)%Sqy7-Q0qh0d zB)kLc4ep`-3H%lHh2Vo=68Jbc0DKlq0bc|Mf^UF>zz@K|;4#V@@NZxmr4xNjI@k%! zpmc&+U;>y8rh$22rZ5l82aCW0upAr#t_Meg8^KYOKClS91{_W40>^>ZgX6)Q9i0AK z!D8&+2~Grm2TlT`PykawX9UZ+z%nWiVH!9MEECQWxk|7C`%A!?;3eQJ@CtA?_+xN7 z=>yIIUjXNVuYpzITVOT#F1V2L4O{^BMcr5gP6ST@Cq;66CEyb5PZur)PmRGXvO$VZ6UUm<9)$FXc+})4Jjn2_Pc0F=_!9W@NbS5)XivA2y%bIXcS-xb4O{@;PIeRgCABB;4zK~dlk5t357`m$ zUb2(m9<)fHb__fQ4g^013&GFG zj)TW3|G_UP-@z}bK7fCtehd7X>I3)jmK5M9x|I8txdx5A~+gfl!JvB2l8T2rZy3lF&&n0AddHg zOM=UW%Y_>aR|?rA8Mo!YP1G`A69=fc2Eg@()fy`HtG{xI@ZU+<-@b4O%06{PIKk(7 zndg<8h_I%CY77YufE!HdA^R*cd0M_oOMf|@fK&{k@Zoad62%P^{{?Vah$92(98Wf1 z>}W4Z&tQ@7DQWKumkOy|@!uPI4}gy>TlmQm)334-xAZG{5_eC;Gy-8z+(W@( zluvNQ6b3>r1Iytkjv3%E>Zc%A0H%t51ChcknFsVxHoir_9*BRLmizs@@;f<-$9x08 zD6zp#Fa`U)g?;6Gk}w?{sOnOGy>1}x;Yjraq$&$Jk!tiY)o_y}{)RB~g$#t#pD5vH zfNO@2I4hIWC8uPPDBAv+@ zYYDGO*qg$vC5(|U$AVM9ao`+b4Yet7BRE0Dk)bK4);@+o{}IMKW1n$N&YTN(g}YmR zmqhU#xHO8#^zCOARLvlyI>{W5SCSgYPc!hP_ZD4qjX zDLn@oV~x(LoetLb!67oXNalK}WD|qth0jSk3c{4dLP^IWFqzUUdM_bc2c8CUI~s*? zOEz3z)xJNL^^B+_4m-(m&vdH%ULM7B=#?rB>4r{U8Q0bv#x=Pfmiu0tqIf-FHJBiz z+8mJZ)=(Zx9;Q)S5?$AWMc|p>Sa5^n?b%Vh-f&J7&$Bmz3&C^2dhk4OC3rsA46c>D zzaWa|hFg^WgR~e`&ojivq;dP=v8S>#ooFpd<$r(MelPK3mdgs`dYr?!mPct@BEK)D z_AhixT04Q4P<;~)1TO{CgjBxUB<+`hRQ8ukz5ihpkL9+57f5(p!7H(UiR}LnybAlb z2@il*gMSeI4ZMcR!okc1uO)jRtaEU9%Z2N~E2s|?ZU%p>@-hyVf3S>`^N}yZ;HV$S z1JmIK!woVVHhm39+2Cx{-Z<5d%%=GSj!eaVKI-=zgp{lLvfjx1t`@tI;?S@AIgIOu zz2FigzjsPI_ytIH@x~~gOW!1R?`ANY>{=ABZR`T6{oW>Z>~^pU{3W;;+#SVp?YpR5 zbN;Hjb~n{EA=$5cz>9=G0Ph7a1MdT`0{4JB!TZ5m!3R`*NI^Tyf=h)tsERweD{up4c#J-A^n3=}LBoaUIWLTnD7KuuXoy5XI|~hrur3 zi()rk5}jU_KH-%pUY~lE>Mr#oVv}Ew;`z`U;C%469Jf9OVP~}K6pI^5?cBH)uvBzR z33DyrZON~9qIk~suGFtTsknwp*n_wnq+V|1@QiDHJt-fgz8(>~@PVZDL$Qq?Me&^P zsHE+$QeQs?%fU}1jmM&RE$-7OUI+V(+AH{Z6tDdp2Y(8F0p1CI2|fV+4Sa%ZIQSg+ zHTWu(CD{q#G4KRPdDcaZiPFSnz$H=LqdB?$oBK1xEXmWpaDDW=mvPo8BX0^L^y_~P z;~L^HxXcLY-=eimlo!ru9=o`rd2AF5l3b@~F8|KaoJU=vxlis2P6E4uRGx9*Y%o5W z^Q?O`ubcIV=6)jqY@l+9=6<7hH0NQTXzn-qg6Dz#qPdOtkLG!EVl>Z}lfY}iWbo(U z0PtqARp4&wBf)#9twi&>S{nE$m>$h}pApS@p9%gE%mV)k4gtRahl0_xZU%M%hefmP z&H)F4!@(>tH=5Vc^1$(6Ay^8I0B3?D!Fk{)kou=0kmeD?wUMe#chQC@8xpT&+J2|P zrHM-wJ2muQlE-;*!{M?ZS77^{8uqtag)x}w8PTXaH);BHONVjYliKAD`8__G*H$J( zvt64Q&2^|an#V_zqPgFl9L?9HN}_q}F$F9HOQX5}oeE9{%c8m6O#{t#Fbz5-Nd3=( zj_LYueSV_!rFP`f%=eRI%8x#9xnh&OaN8tZd*KetILbx+9o#s$rEo29SHbOuI|%m< zg%yFYBDg(Oz%7Mqf!hkV6Ye0~J8)mY(K7>Du7cYQw;%2exUZt9?NB}A=M}tgo8hj4+YNUB?oD}apbuOjTm@Vc+!nZ_i7p5}(S9J>8~Y2GRFsAfe&Z4Pe2P*2sInw_%BU*~J~ zHq>UP%*Wkr@Hf6NCzt+ZryE-bp^p5X~l9Jc2nd(iVw z9T11Q25z(+hqSriYv41fnJTiKokjadWe*;Un)e<^7=6QpF$aD+3&|$Vr7+ZbO=?gW zJ_)0Lm@wwSPZwc7iq8xqtPQ4ku7cvb;P%740(TTH%B6j`{fBMV=YRLeu?sEdKSh1b zzfj6{Chj&@cO{v9z-EzGGIG2K+z2-qZnb_~?hBh|y-&;AwtKYxVrfI$jJO?!-m#*W zCUZ(^7pFs|eAzFQ{fS_$#^cy}aIu`PmGc|G<={p+u55waNff8hy;A4kWO)?LFl6@GTu>j=IRcJLto21E4KA}eC}|d zjwy1VdMDUZm;~PC(EGN*>OP;|T1L=1@zoM`UYM}&h2PGK+}GX*rV6R<@1d~OwV@nZ zvxj~o!}gzXa4k5n6>cZoo|9PDt@eMT7CQcSs2PU-%s{}?j2oxv=hT0ue4h|1>qL*!KxeAu*%OA&h`kkE#Hs zVFB;@s)kifUQdw!DG{MMG*KU5=n&q2zHJSmlg0mP_&-ngU)tiSTSGRaZS_cxCm}L4 zo@U5g(!ufUk$BFq#N(&_DkL7c_dk;E^bRCyO z>2p1E3qU3^Exe9N85d=4D>39XjfDzf$#d>bj$`t%c0(wtOsaL_gSAEdHXy`fLBYLG=8L6C;#mDf4xZ>6H=u%-1BZmtLn+8Ib2OtDQ)vll`$QAKxbH znMu~;lAp01_{_Iq%as1X&#|{aW@3i<9Q$;i`Hp~u7@Ut``H43D23nu-Y)4&H?Mdc9 z9Im;ohs<(|Ze=Tc{s1W``t62peO&Bk`AO1mvgo%omj0^yh>h(`$ZW}I?RjtgQ9OAk z4)n~9W&c}jx(*6Ny$4iN&GSF3AfVDgDFQ)6sz|TWY&2;Pf)wdpr1tTQya`$BJxpyX$y|c5kpP9wSANUPAzE+|>WHw#p z@FRXSiL2vq&%k_Z!8GO`8W7Iuub5hY+wLA~NnG&raGnVl7!0~a$#a~$e_SonP`bcF zRTY93Aby7*Gd7W|KaIf2g$Bj>HF53HSzsF%u)@zdrHDd?Vb6c2tLDp?4bdPE^{u}A zoc4UO?C9t_llO+bvt744j|pGxJv_pApw!6+w3E95N{EYW%^tAN_~AZx~UqSr=R6s9`>Z9?#1tBr$;#0|9hVL{v` zed!(>7rxATJxG{I@)x#Vb3ZUN)D5+%$Q|8Tr<@^mtV=xsec!SFB|z>ZX!XwA&wook zdO1|e(Mtmu0@Aw*`8Nk#94q-RsLyZ)DcGH+nLo;$ijTYdn9geQn(GY2Jx1nFn7Jsl|t z;J}Z_LNw}f#*~7UQkDBcBn>IlQUy*9wg*vD^HS0=mlaE-7hGFw139MuNcfETaM|T?3!Qvem|S+8qg^OHwhPD*a}8;w3B=YOC}9eIc(27h zPVGK8)FfRaYrUE=COMjtY@XcPuy3i%R3evY<$PJ{6(I-c$)W1{BJw@SHSrZP!(ylG zZw6oND_i>V^ApTuWzMWbhQ!`=@~KyR(+2dRxb9|0X7hEveYsbWYh=HJ85Ju+-FCEM zhLa!B$xV72UGdHqqK0+ci5}{h$f8B+1S$8UeLp)p##UmuB=;%P4%b)A^TK9^fwc)ZpwtwcXG||cRwP_&Aw`mv;aHhi4MNdQO8X_9co%{kHj&I6zWMIfY40(A*(t+Jq43-@t#jwkza?DN zD7yU3-ARK|U*pK;b$nf_?05c)EN{0QXir9`^c@P>PStWvIScLo1$2JLx(0jw0vo+_ z`1V2h_w?aFpe|+8KWxk&F`4Yk=M9^zY-T7uso9z`F$&!uur1cdww)<8x?6!2anHcI z`5(zw4=rzB3cjCC5|&Z-VgFoR6fjl7m*F{We;96`Qob7%Q6!RaKpadK{eo0$-cq*A zPjZ_KQEFYLyQZYdrDt5p92=5yTOF>y4Y~41%Su?9Nh>S42Ri|tyQE8!7uT>}m2p{8 zz-?FGHtsA~9}Q)C*WVm*-{syOygXyOsA=YW<>28t*f~{kZ_WC=isr$&SGN93|9*jSN?>CqS;50|A=0Hx^^| z%4K`H{)fq0cCW14x=Cbopk`Nfbb*mAPghb)zR2m#c=>9!eK(JS@ngEiSNH|`@VZkGE!-?Pa2t8vxRqAhL9c(R# zmN{RulYkg^DtwH%uXDi>2HP^&M&nIog$hk5<3PRHMJExqEWs3-fu5}WjWx$h%=|tk2wdU-+e9vD7`zG#80)P zTq$@c-FaMZAfv(a$LW3P4zbP@c7VdqX6`G)h~4-yCGMj|6z7}u7@mThj21)@cHu|- zAJ19c$Bd>9eMPD-D;18ZrNUaePz!A+VTq%H+``wq)gwZDIuEK0*l^nuyXW!@C=X3D z)T{NpI?wc$4cjam!d(8)mCp<~5RD4MaZO>7l#NHncf8M87clxv^R%12|M`}eB-p!E z$y0qh|NI<3QTT>8Ag50*Ks&s3F=m{gG?pT?As2CDhh|QxDO+~uPiGQk2##l4Y#CC( zt+n%)caicDsJ*cQCdinAP@eYBt3Q4<8jFrsfS!+H5ope?UIxQ7VfPv_2p}Yv_3&gZ#K-t_PX}r z;b__OgN2vK-1OYj!D^?5sgaq{;{pc&#T(R1>2v#l#+ubTu*w1)YZyphTA4AZU8Nw4 zaUGmtn|$if_`H4e3FpoFd+&R9uP>;PvPp^*ms&=jpc%Qk8z_;(Xy_OZY>&Tb>A+khxZq=yO+d}@s-<*6A%!lDF zkJgv#{n_2e>DorO+U0|?*G%usGrvS*0@%sVB_;}(9r9p|hXPM&yIa#B?EstKxxJ6R znkH?FUg!+3VP%yKz@s;nil5=xic$NWVwpHwPvm{5VV)x=?zoS0haP2B}Hp2+_ai;sP`^no)jW&Z}1`CS=-j*BE)yX%D@a!SXpkc+Q zWE?)OI>;h!ZrLi$=YiJ@;+dn(iQkTEw}xck-%ktZchrW44isg_wet?QmHkm#d?N3VX(@~*dlV+Cw(srbK1$tkWY*ws|FjB$JPXVg%PN7t*M!;9VN&uvW_ z+11F+byE);I8JTI8XDe1StC7K;NxlQGh0jT>w`-Huk7vR5hj5hwQL--d<*xo+X7mA zwvE2!})A+AG-Wnf-1838y;r8U zyISKNZ@jg+)s3ZXvMT?LgOA#U=!m>wY<<9n=b9tkjNV*3`S!y{mpLRpkk9Og)ZdgL z)9iC9a~IP1WIS?oDEe3YNTG?g@a6Y#{{F2{i4MP6R7wrHUioYJ6> z*`p(l>+iTJ99xp4mfg+lx+P8wEq=nrSjw4rGqFm(I+0x&RAoQyE^;ql>x}jbxG5-g zJAjhN_PA~8r@nzYL6Y7|*>oAp&z>-$?<^GDF`A@+_)O5q9}Hg5W>VJaETjSWYp1HD zQ)$ZWhG{vtZm%_w1oCSA54DpqF`ewiaBeS;Ekp7n-Nb)?cKMUzMwzKGcyOF|dV=}$ zytThgM&M{ZuwD6fAVT{uVS$yYE8qHJRRbutJf;Dp^t?QMDEqr7=yN!B$@b0g$o@nC z!#Qzw1>t%+aogEvpw*2p+M=<8Q@nBeNL=;jzhHhT>ICrYvUAtN{|*PA{;#uCb22*! zb&@sUv{$g!SmV`L%$IEyL~-TYsd1srvxf_v`i>ly<+(OPZfE!-se~bQl-pgMZxCUhjd3a>ZflFvgLT-$1Ti~L=hFc{D~>9W)YBM~ z-#Aoq_D#`?&RR*8pSi3F3JXb~!RP;Tr`F9u$qTOM1WVMxw4@VT##IQXT}~$3cIk!T zL)Ke_WB;YJS8k8aom)0#1+<8JLg7NIwb4swYu#(|0;>QQZ?LF>`o__kMKvjYw>sHP;lavHQh2xY54hEqev? zhs+e!T630Nh&Y-kxo32*irU&l@3sMSczdQvjb6R@*b`efBx8IS;6(xEHq#Aip8qt{ zpK_x17*DA=I~NFx^X&49O3UX-M890G5hZrgov{~;HGmd(_%y4IUmkO(AX>bocC(7u zkO#=ST?i{>JMw(47nMx2buL}59OV)hu36nTfA+tScN8_P8-c=AcPH_BfjW~lWuqDM z)ExTHrqS`KzseSC0kwC#94=WB*pQ-VQpR6SRd|DHw;B{SY`+oqy~5D<@Gs0sv=arlqe!IIsNbB>-qzmVD-sx}J}c2ZNEnvk+* ziaxI4F{gNp|DmV+KU85zMpD2X?Lqqws%baQ(t(On16!dZq(9I`>HmveTs))R%ZwL$S$=8a3>ztO!EWgtw|C?Q z>p49`a%4uWQ`Ablg1M%HI49q_@1JQoZ3N{~DW5M#S4_N)SS~vN`<%|N80=yAG;4!-u}i&#L1{ z+RK1yStjEJLDH^ZVnT{B$$>aUG?G?_MT4eIM-P!Re+?X}H39D52gGTfH&)}*)Gy=f z3VWr1muAJD!ak$Ve*3u{=i~%-A)iGhvQ_-+RB5uU{IYFjl68QWPj(MeVC@qTI@IZO zJClGVQ^U3Uz-6k#vuTPKrQeB(KTHchPwfiDS^7Wg7*|VUs4!_wU?NT%`pi)i+iuQy z#evE~-nT05pNp0ZJD%;%e|3vZ?qb_h-8ror^sgT(GdUAd~(lH^WW%8K= z!qgdTvC+25I;gPSh{9J$RUVx`{;~ZxU`K6rq&~HJ>}+m4n$4L3zxE

wkrFR!un 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

-m}nt-CaLPJxKY>-|@F@#a(UF2|ptpk?*J4 z!9rvof6TXZI$%`@PgK$h5DC>&zT~jay|5zc@L0*|$1?IY^rxR?nw3+yf_t0&|6Lfy3143L@EMSk43P}|}8vNkU4zy(Q zQ5pV29%B5f0E*c>tdE{pq=sg2roC_<2(|n?qjo`kF#P-bGX57T8azZz7Cnfn;~h+# zDW3QY-Q}~J3-xiO$pZ3OEO=u(&4h=cbRFH~Xz^=+CusHZDuoX%3v(Azl~ZI)(>tLLQsuxMdqN!Jx%iVb4l1!{d=O8%DB3{!Ri z*C48f3+`XI=qvMIX?7VAUJrOKUS=WHsJhmaL^~Wkg|A9ZU!Uc>I-E)R3AmCH0Lr3* zehg|Ak{hHz8(B!V02)_fSwbC0qADMPRfOVy^a0V>~!f038h~ zzMnV=wRhW-W4hT~)7Soy1vk&Jdlp)-n+%pd?a7PH6k?Ut*ZYIx(|n(B8eL95v(gkGWn1x?198f6 zDx48HI9&pm`9e=)wgy}&QlJ`kkd>r$G<2?g)jJ~CofR%s$e9(beLjsW-2%|OQ+2U# zu^ql&{9tt%hI9(6vIohrhan6o$xYy-cN@$n8Ih(k&(P!S8o#-He3KEp6*)!;OMdBs z6R|mcv_4E~ZMNq_ak2QMFU?n15@OAE@o_`naNl%|;(eWYR*t~kB>L|notvTuBU8Y< zG2K8+#K#v>?70jW6Yvh}_AbTHls1eO8vat#>2Ccn*}H{%bemF)bleylZ2tlzZ-}(Q zE2&CAiaYM4Z-BcZ4za+jDc|jX<8d!4gyCg_X1Z$!Qqo!Q@K0)3#~3YD)k*JkMeY+R z4bR7$IllKXZZMC`G{Iy}NpSF9iO8)T00IPbk=-OqYg3q!lObk&+Rq9zO!@<#vc50!LV@E*!LmQ&Sk%N>)2#Cl^Z> z!y&kQ2+Tm4(-$_OLd>4gps?V%&#hjavRjbr!8Rrk)h_;ZW98-WAB`Y8}J@JDmu zFGsE$t&)m}C(5}M-%|ZG;|`+OyZ!>G*nmvL!HQHaoUTt0;3FfSFU~&Cr|qc6yB{CQ zpO*(rKf0;Ij#C2RDdl`x6VuXev(*L5$*lRTA870(%Z#wj)PFH-Quh1{urja-S2kxb zwx-JmKm+z`9CGgPR2lcwT9a@6a-uZmto;iB#=naCs`rXnU?6WuMP9v{V^Z>K%su`b z#%FVm@|&STHw_NAi>^Kvf(%|hiYn==TfqbY)5Zh+)YX77A7<=#x}q2)_CG;Vj`v1y z2ju3)F#BJ@2F6lkL(6;x86Ypd!}(eg%Yw8Q@m4aI?#C%nN}x4_*plvIpCoC< zDn=;%(t-PqqMffeGY)%*)#IV-RBTZj%0$CTZB7LHzu60t<}f8Gf0?m}7?BD)GIy+(zROk5;Z$ zWQzKPB}H0cn#bT=|0&@gHQ%q1rC?xw2JG(Gw>~}J6ZG+{PpvpESo6vStzvd!|EO8W zMJTzMBwTVaSG3kto?cCB)P~wMfgi29F*hPK>@lgO2GeUs#Dlz~&idE6Q5OoTBqns! z1En0XBg9R3zujxJ`N9qP6bcH3fj?c|-Mh(WNgAx;21Epo;C-P!3Az@ru~fHlDMBYF z0()M%cf6lmBR0uCMAA;Hf1C(UO2zL)H9gHLDhbJs@x7G4fH%_!GOX#1i6gHaLvi&0(j^w&P=q1W8!8Bi&v4;M~m z?7}wideZ*|9F#`$8)E85>zq>V(WUZmykzu#kOoY2@ z?pZ;Ou?v7w5uVHPTJlF~Fg}BUuJ0)>Jf|dI77flHIAlWPv&#$$!h-=k^g+akzFfYt zHeN9X&0)zsULk9l-R;)}6sH8T4(cB1 zJGC?^HiHaLY;Jt3)33L3sGAH4$!%_b0fFOU^`^K)ZK|9{%5_J|Sy;3tU)+p=b{dl? z?h#d;N;iwceQe6qor7m=w3H<*Jwe1j&xg#Chstc&mLX;}-9x{qo?bg^GF)XPY@`Qe zu@&~EKT>Kr^I?4JVWwheKQ;>!PLG*Mv{tz97Eh_AK+H_<@`#!yx<2=VY=YlW(3AoZ zB~Ym?ned-Ir~Kc`5KLgLu?>-)JB>54EB~_q+$#C}a9{mzvK597(i1ToRHE(7%!^la zOsr)VZ7wl-!o>&&jqg-^YDN6OzUpPKcr_-5_~2RiJc?fAtxC9&IW1-USO7FY@FVJMR!EqOW1Lr7V_}?Uu>#G zM6eA6OQSKs!%LQ3+xWk!xw)ectb?@wm8*?mt>?iyh(2{W0{i`VpNPy4vh)NUwk@>buj z_|+%L>U=G}CVFXgEF@<}miNBBL1ma8rM`%tm~;_S5DTCc<|$@+Y$;KDQ=~{~iDBsS zMTQ9p6F--Jgko^gy+iy!>Aea@bQH7ljKxzF!v+ zl*s{!BMhF1#Tcjs+c%u1sA(33lx9vXNs54UjnYh>xO8_8IsgasH#(oiyr#PwA>k@* zC0m^SAu5cmet%rggyW$&Ikw#wN5X41J2LF!NMim~h~i>V=7jgh;|Ix`KlcCorR^R5 zzYl$Rl*)-FA>r$NFfVz|W@n|sEzXquMj%$5FV$&S6eFwyWB^+Ebm{0NGcQg~yHq*}AwJ##8$^5@s9Oyn^Zj zXxp=Qsu=>OR(ia8=2F^JU(j7^J*vgrW^m0%0hXU&pK|U6cZG}nBrrr?U zrmojzXLd5226~M8PZip|8wVuR!J&j(1jYJ$oH^&-H}mei_x|3q_snizS?l}OYV{Gfj-r>~a9a2Y25Of?zyrtpfAau){hBA0C2 zg%he*yK`es4knL;#N}Hj9=y%}fBy-7k(hu!^G;9LUrQ0uA!PJk3(JY;a<_TR?(G6P#_R0bHkQ(Lh{e!FpI_Das1!C>~0ebnDFSRpb}U& zSmjVI!cT4GDe~7Tia(J7r%sLZnh|>`?v=q*GY@nDwX?dZNyYH;6#Z)c*rGjBq*m6achyBFzy+K-$%Tx?&~d-mE%O=Mq4#_yd@!@F%vBEMz8F z_R`I{PlyK3uk*Yks95*~Qp1*e7)(I+5QXauRr8nSCM6LL17a2LI&+MBTK;8dY0iPY z8c~Kf|48#QfnuGGPo;h0q@9uCea=o+`aMhosW5@}Xg|ieTxf!+rM@=th+%5N*@mho z#93v8OC4z1k@Yhz?(lOPJLQ0uHE*@KoA2k9T=%}$Iyabe{sY*hq~i2)n}6ptc*y?n z-I;X8ezZ#8De?FAa!*QpfBF5Nx3-ms;Cezmp?OQiNDD(LChpU#N}KU_-0kr3Yq9o8 znw+{64D&aHqf8iA434atsl#bHq`_|~k>~CSTa`@?c;$fxSFsZBR6T+U8dT#F@$7DT zto|(>K+d(EU|`&A8S>Fmg4XVDo;2&~ZAUL?IGtR;q6vD{XpZH+=<0}H!xk@ai+Azu zV_FE|CmLLL5`dHemC<^0O$Z449m^UHKQPSOh`lQOX5au(Mb{E&^ zReG}+X!(EqD`{>e`;C*Ohcv~Mqap2jpAKl{fz%c$9b1QoR!c)yqZtX1?I+r(?`>_O z{Pxh>+R5|xhRBoc3Di5{{HX7>)SwPaQvHQBsd*GE?Ddgq(xbsp!;k0Ahf5icU{6>7 zXqiYwXRd_qGv%tM954&))^H?CzPwNdOhgOAQiI4zERvkX}LD^ ziAX!k%fn7i(4Z}JB?GfdBX;RAZetn`#Q42>%QVH12nMi+LmCatZ6Yp94VaU%Z3j`X zqx8_GuVbP}abHak9~()zbfUo7HbcEqg(^b8Hx6tlt2}iV!-odQOr7J6JK>|+r$WD+ ztDaFl&z}~ps`2Zx8^h-1wY>>Q;5?V*^YdQat+aH;_I;JZ3!4%dHpe^T@9s z8XgR#6fny&Z^^d&6qqYQkWLWFR8d&R9{SW1UA{E%k&-I)c{8P=(Oh2nsKNXGJBrkkg8KLoJZl_y4lHj&EmtMH>nh#%I+iyLKPHgCV3;ja(!h=7K_(>5z9y zdwpBUoy`R7Z_pkSOH&LBp{$ZtY&4}alh}g+4`^XXrs+-=OfVx%DU;w9UX8VRQ0s`O(=OF^$+*D@XdD~shc%HSMK(}p2*F!&bDOMgjkx;hm6#-3{@YpI>hK(@rgIR zVh6)aZx-BOJ0`BPbK?<@$|GrmoZ)jMg&~g^idfdGXNONNhL!KstP&M)Qb0} zVS4To1?9JCDnn~JvX0ae-AVZP4)`e#Cu|6vDDDQyv3lhp0-Bg$& zc85vmx}}p*IH4_-V=|__T~LbNcyc@P%gFSa6q2JH@xJesG23m5T#W~#--2u0Rw6_ZkA zs?a{p-wJ+{lR2W;#>3`>EeR`=z-XjUFu(i%KcK{X3k@Mc-?6SVk2!kfVMxC*o4E0Z z#JfFlE9z#UpfAW|*lZ@M$1M3=FD4v$_y?k6N`x&E z_2&Nfq4$HYIhq!yjP@w%R4`DznicHuq2aS3(Jaz=RYo@4q==U}Uz}khwL!T?b=wgn z$ja-gma`p?Yhx#4JN|yH6;=nKQbrB&oIY>$@)k_5`AV-?*XH`!PBB+&SK6!w4vwX} zF>#jlIksAdZ6tQ^b2uqL%~Cc3#(KT_y17)GxHUtC!7LREHk45{FaxyYHLU^dszSyOp;-4NUKNdL zN&$yBODbwkbj{NV0|1L)0@cY-;7n{BqmQl_S5cM{k_TW-Y;fiELt9rc(LWSVa~Z7? z@LW$`zGa?2f_aoJd)nGA6W>C>er{0gI^Nc(i193HqE@t7prW<~wef`ZM()fHQ$+&I z5WN%QVa&p7EdxtICRSw` zZl~zk;_LDStxQaDxaEJbJlwZuGrdN(cCs4&6Z;%Ql_e7rTi z(2H==|8Y_jLWMPiehwRZV;ci1j^z>_ z_Spr{N^qAYm4N+lu|!3|&{48GrF0pT?D&s5RE<^rbjxLWUa@ZuD3ZOOvMCw9HW$bc z;-LT?0%7;DEw$Y|?Lrh7Fe)aG?EUxP#B`Mot?RuQ<>5_-BoJuwl09s+W;-?;{oL!r zQ~a$h3%Jdv97pX#HwIz9sfAe4=Z4z>B~DvX_bw58%z!-seD<|9;mpnj$}=8}~K$WykMdL((RR z$Qtpe<4Gdh9Z+Q4@LC@YgZ|wR72ltwALN$)y%SmP9jB3RQm=D}-lycv@de^5Z;e3kXG7aYXZ?!Ir*t& zK&zUP_^%|YN&M(0Jr_?^K2`)`lni>bvW;ivs>|E|l|)Yii&65*RcNHJ%u7VEUB|7F z%D>sFbtgt#V9@7P7iV6hIK+fdapHW?+^6=^Gxv%^s84l|NTYRut!gSO#KI>@Om^6VwI2+f$j$z=J^^ zn^~$=>qfKk?$_*g7p-{LACGH9Ot1G-LeWysNR-5P>ARuD%?~C|qx%pC@Ef*ggkFS| z&a+v!tMO+Rtw1LW$EK+eS1ON5Q@4KQWd&f0hI2&DpnxHUXwWH8f0%(bSJkw+Y5shn z*IopoxXf+5doU_CBS$OT{-bLdwR;Na>=CT9J&mt(VFH`oU#ug!fSP!zDR>1{3;N^Y zg$e|x!K0VC za>^LBp3t!sh6%f;g@OaRha8>t&AH3V=ejlTZS&}&=P2?a3ucv{1myLXX+$-`Lqg8t zPE0$@lAp<{X3TtB*--jXw^(2xbuiRxjdpe!pSxa^;f=N`8;C5-oT9-fFXu%srf*K?b#8vcpTZXdRik#@*@XtgQ~_2 zks?boh)B${%^NN{&eAFSLxr_3QTZ{+3t2Pi*n6fb;mj;jFpvmaQaD1IPgv`2(_C6r zwgp!vX5?^dirtiYX}R{gGcnOKcMge@3Q=*BNZmH~vBRf`lHB-K_{8E9e{$jB40jwg z2UWl81ye=`_XtFt_m4%CkFWh;-U-kbnYv=_M zS&wN`xS8cR<^l?&`oY+kuIRniApTyR@#E@lIRxNIek&mK3@WEf5@XRyoO!Zku(Ez5 z(un&=eaHV%<=s{tZz+XqZ&JC57t#Be|H7_QTLftv(g>Q8nYt%3!_H5w+Av^cj@`m>2PU)lu&$|BGkMyv6(}m3qRm zb?FgFjIk@y6L75xF7^U5Se7$(W1PkAQ*2(=L*5a$uPjuYzz!@8#tB$ripp)F9Is!F zj~nquW4p36fFr^rH$6m#jg}#m{GXgkCRUb5g+)c+3EMe`lC$W;`!}ol?lSIC zOQSeK5jK}+AU1OAiLR6ChaoC7Easwoa|U~YQOtXoc$K1Ja=kBv^lVdfda+~Fd>^ei zKz2+-TJ2UkdlHWSW883vQ85F#Z5LT>wv-!WtRenMaRF@^TNi#;MDDzZT!ezEh^h!s zl@X%M^Fs@0N*F`}V9)a2#v~+KS+l*pxx-kn*Sf9!QFnfSyH5CV)avG!$YS?r1OQLD z9BCQgf+)~(3;8rH5#vT7MW1gn-?2ppL5`2|*w1-zWf{2cO2pkc35;X~P)4EFjVfff zzscwF{-nATTP6If0>Wb~7iTM}Y(_{6wDcyy2ie^DeX3+6;aT5Ntc-Tn@2A1OavZXTVe;>ifx>Lfdlki7jojydWPS~zm zpq&4HE*KF<(6fA!Nxy4%cDpO)4g$`rsW9+lQjIWUeB&9Y4Uj zQbljuJA|k{B+>!jGjArqj5LK5qeik(CB?nxv|8;Rd~{jcbFyDP#+xosvmiB>ItUC! zfa+vm<)1LcHZshqAq$@B6=Vd$9M3HgLVkL8EsVQT;%2s zDqU+=pN`mh%4Xd%&+-;lT57kUG@Kf$}~_yjJ5qSoEA`HF`x z-#wJ{6yO+*$yfC^?z09b_D2~M(!a=4LkcC7T7G9oK88JR&0xB+J%Z(so44?|*))2F zcTaej)%5?X9?}q|!#)VQDMc9LueS?Ophsm2koN(ap1%!DKBM!tU?e1CjvC9=*;KIv zVShSKg}iLbm0)G6;|fvjk_3rV-XD&ig_t?IDn>(p-&`I5kx9s+2knSshFKZ~5@ZdT zdo*X7F3vlK$7P3kjlA>N;aV<^Q*D!m#cD7F|n+(S(GvB9h{e8~(ULQ6upaA?7IdHgxnbChT)^{>AgKkDzSloS)W82`4!w zHJq*SDed=;#3THrlCm9E)pqRE$=m2}Tcm}AF&$(D0t2x>r%(vhG8SC!OP-QVr5-;1FBoZfs18oZGhVtMVNRc!@~ZrpZ$g1~E@f z2Kc9EGW~LHm}7qH1S0n=$gM`m3VAQWy`}tD>@9-dckOp#nd!Nz=3-no^kPUs^4^4s zAJFNn*@ZY4Rm4ByTnP1Xos>Z`Sgt+6G6N6oxfgs zl97JSNPccxru+AS9?3GxwRoWj^32iW3#C?K>9D?SMy^fPbHt=QKe81H7UAVsW+&Eg z#6)zPm^sHzF<=`a22GcZ+DNUUM|?ahMJAC3&-8IlFg^XA_aYq;DwjM6`Q|0 z_>*AFePx^an09cU1>a<6QG7$Z)qd%>Ukd(pCOymC(X@)HOoiKWvk#Mp@Kn9fE&sC% z6;Z}xk)Ob=J!1g|OCQbZ^9Pwa!c$}nVs~2G(hk(Yhbw7#ha`3?N~25{vIR=AvtyFJ z+Ve(VFpoH0wTd||S}d=`3((AwT^nKjne%B&$GxcIp>LU?B>zAteb`KezabVrt!vW3 zsLYMXUo#dspOZxZU~!hiagLBjHv}d31OFG13D?v=`QFD1f-R})aIlcHwKy9?&azU; z`8K%S%;tIB^ZFg)1RAWe9_cgN>fQ>(Z zykVF>v1x5%qv=lPGldhEyA*2{qx*#2gU(>@z+=s9|UX{xiK?AF<|MI4>5;qk>+U zc=ONtxUh3@!AXys+A(;CaJxZ4Ezb)`W6dVC0GB*nLd=4y=tC7NY|B(lD{Y{I5^ICpqv*75p z{ld52Uk3VhB=&@@wstAR#Sc@T9V+lpBMZ_=UsQ+-mLjI`FM|oED~Vd=UL%k114IYo zlUHDBP-AambxsTl9hdC2Qaa3N29QZ}Dai)97HOm{y%Vp^ASA%>$dk?xbe@`4 z8gQ$QLfqvWo>yB{@-es>K;jhvVvbPnIymXQ?}~b$uoUbBMw}&5EIZMGKoc7e=&z`M zA*>34x5?+$s0XPa`SPV}47fm(kG7qJtI`S(Jnd#k?eKf7b&h9g1Zta{&GL-hAH#XX zs5F?sGOuS#X_pR0POaw7bH$IqwjQUvXQ4mX?*-(^2m`*m*4dX;Uo%!@=O@Nxe(_yUIN|nJH^X>ls)C82(7h=J6dR5gLMiRm__T z_&1_<{mQyglbTeLz;V6eKpFR48=#qW8|m|}S%s7#xWig#AgW=Q9NjSQ6|@1?)O28f zuK!X*t&O#?^0RwmQIwNO7YIrVWU??w0-j#?%QEgk=L>hVOGL#YFcKX+O-1DV%XA;j z6=GY9yyG+r?9}el(GL&}Y_&EcPQ7Tjh3;}v{iJcddi>r&3Z))Z^rD1k2UYd$cx6Zm z$^?L`ie4vAKAJj0DB!zPakYg1G0&+L_qpG&x-BXx|EtW>SN`-TLQBoxGGm^VJ@Uxh z+tI_ubu>q-3f#obEePMT|eB1mwB5y0n*htlx$m>p1Jtn&& zD=g{Nzr_=u-I>>vF%Chm+9Ri)Ec(_>vq{Z+#KEt!BF85zN9N*vKSes-`l|e~%5T1N zF!?cBly^;o7o^-bHKTwTq$@%s3y|SEQ6cV&V!lZ?emc zj`<}C7Y#(UNtq7kTY8j9qAgZWy(gkkLkq6J;AGG-F>;S(3$E%+#cG7^13}v$f;x-+ zF9mbQaMOyFPj*Tf^}deiqkcL^e}hjLgvSu;r_SM+LYQ>vce5?BL=j5L6Rk}ox9v4G(`=l zfm2aVFsGRc{XK+!MUgAi7y0Bk#rt^VkId_M5c7oooZ?j_t2UNUdUm+=B6y_(rNDF^ zpyO*~LJQf8;V9}EHg+A^$G17!+742>y(tBUQxqlN4d?JA(Z4D&kS-c@H*W~PS$w~0 zMqOG$@du5BPbN#3U!`7uet`lRKXpaNcUM#GyTX)61%itcREEnOr?_3kT4!O&3fuJU zcUx`=V;1=p@|~37euu`siNQX?h+@qU?LF2X(*Nneu)g`g+@98r#iL<;N~`ewSWft< z(1T3U(8TMc{280MlO4NXU{B%PUD=aJuC(UTPB7q_o(#o~gJI3az_jfk1d8A5EG}Wn zR#=bYl1|u!ZR)BlR2sPa=P#%rjE>{xkE)8F^e?{$861i|`9{A1YlHK_bG0o2&_RNmyIQ0ESE=qS zk=h^*9_5K$mKbqO_dzKV%clv55+8+K3%AdDuOLepXt*H15^7XE`2;}3X*>CsE-$j8 zQibz~F=~5bvb!2t@#aj9djEuIv}1}XY9y`6&Ly!~sRyFas(Q81(4?mgte6Kyl%hUg z9JaddTO_tzc<&j*vK~cI&g0(kQS>dnr0xQ{*Jy23JK8Y)B<9GSC(4C5#lUGf!mPK| z>dKzHlpnaS%mPYgYUZIBjuue!pqyOMH6v3A=O1Id&s{0CI#hk1i>o0ie%0;ktMYPM`0QiFPz5bcp3l|sWclJ^twdK+=*-lR|B;MEQLDY&mYxDASF0LrE zTt_O4+fZo}gP2luYhzxBBHG{SR4TBYCi0d zop^~rtT2E4omfnAU>4NI#m0b>?GNOHF-9eI;4f`m`mM z7?ge&FlmSd2%fr9AzAwxS*|$qvenJA{55cRKT7UdeQpCCM6#q*(d#)iK`AlffKPj( zGag3NG$EU(S7gIMD69FcoBb1M+0I|b3LZM~nj)6lFhnyg`&bUg&@#%AK7qK^6#*}B}Bwi!2 znx>AiUM!W#T&??iw3U`a)*Iy9=i-POlv{{l`1n7$2MZ&W2+0W*wcmei6nYu0fhw)f z_bFaetAdI;LG5#mt_9)M09ZW7)3fRSqwRreYSx52_(MT9rQX(j@Ja~|5K6F3{kqd3 zM$!@{47Yt&vNc^P8cuiBlseGKV75UZX=h2{k(-Qs9{J*Att&!5iG0ouvyD`b_*UH{ z={m?k80$ny-7lFPKy$@AkQLQUeJRw1U(x`r{IhryWpCobCga3Bc3?4GbIhcMC3`ze zB8}&lfK)B&{RW`-ahTE6wxq{#8C%%XLx0;j9EUAvH$at(5Ee`vr!94JVDA_~X{7jz@$gCdx!>{M#Q(;g7 z_Mv5a3U?@z=0(f&d@zwngOBwHNcPyc1#6Id#9X6a^dEpefK6O8DLp`kG{R~2w1@%$ zWAkB<^OFiwyC1ppXo<;LPWQE|KDs`B{*!TFB7B2cdBWs}BsZU=IjrgU!z;0SP3~sz zs0T1zaSK{qrNO=n2^GlccFIVzNTXXwdH^po=7Qx8Fbm8s$3U^cvML4hj>#7EU2k{{ zvdzj=Tm;Jxh|@7o?U~$vZT#=`@H3G7>F?ylF{#>y+lEa%-7`oHEJ(gCoH@x>1^@{L z{Z`k~XoHEQnAT8#nmUi!Wl9${xg^yEF{NNVMt=e(gONF*BGk$(vT2a-vHYifig$k1 zHGRmY!d#76DS8Bm8LRc3EF3R*($^2#mDP z*)y>GcVIN24x*;5+uE8YLpt#z{sW*_`9C8g4rhT=B@IN6Gc|fhSNZ?>iRH>2(^LXf zV4ZZ!zbD9^k;^O*=FFu_9?YN&9$0uK-gP05_8zB=(|5n#R4)K~q zTm~`@f;Qjye^;%D67mSyc6`)R_faYf35INmZTMTml&dZN1hudegEf0&G^E4Af{kGl z#4%o)rVR-d;1405Y?{-gg@{4+c@RVJg)0J+_C^Z#E=_vAh2+K^ z9_f|%S22lLvnTOvUO?@S&V^!T)x0C^=2l0)5#oi_fnb)!8wVj z_}Ivs+LQkQe77lW*_R5*-=jIO>$1A7m1#P%1u-Aak7tM89{!_yKdIj9L*}RaZa8^( ze17iAPwA)4^wVB@YvJfM{0DOQXQ~JCr`%E)P25p=6a&%sdDY+JH#S7#6!f+6P&DXQ zOc~#U+NIwUpPww;rR>X;;v5>}y#^0MZ%XA|kPkSm-#NaYIt^x#d^BsCF8 z-syJ4B3c%QVmV2RpdDmt*F0K)#Yaq9mC=OS!+(B!2Vv<0+7O$7Ky$?09obp&8m zI4dV4{rETjpI>ArzZZFiSI}9S69|l`;}Mv<^?zUN_ius5p=;UQUS59i@+;%ZSANFC zsf`45X!Jr{o{?)T=jjn3lUc~xSnpvGlmP&mkCVg?j>PK+Gw_|nyaiCKF`6D7jYP>H^<>TLAv3_R*u@Ks|c;C0XQ!+9Et!DO4qqx|G z$JDW;`gaIN1e9v>QIvF)Es-M#=!FyEQFZ+blwoCfJQPkfOfn8Qw-tl`eaH1tde9GR z;!RA@zBefuVphjs&%8w%p;FLzew$`9{sgIZKHTENwCW4wp)?LtsOhHC?2eMXnndRZ z!3N!Lm=>UKg;HX%Gv{AopN660Q3sKyera)JT~M=g_!j%*?;Z5psvt3628U~&IW%fO zigqdG@Oclr48KlublPj$%_)YDDAyXS|4dGWINO=6{<}%t@G;(|&LPHgM*2&P+qZ^Z zzF{iBc!YWH=Bh&TbOt3_f-I89js(TYF+7e^Q@&2sqwu2EsP*3;(}&}y5a8CheN_}v z)imnz?3Z&Jy@3DB(Wx%QB-4OwDO-`GJs3l+Wv!E!kN6968L^=>_yX-~X))9?8H87C z{i%>1^3LIFV>~Y(aohK;=8LtaSxxM*D0u3zT4SR^H`A~QKQq{XG=}D*+VnGa$H3U= zc;rl;v38)#&KoK2LKKw8I1a)^swNKJK-q-|PW| z?9(M{!?0WEVO~hvW8>BxlRzBpDV)sja_r?@i{ss*foin#ep830rXA)-pG0mNNVLkp zw$JkGPZxAMKO@)m?sqrr3GTYJu6|PYd7gkfIqE}>}29iS2$&9s(q1$vtkyI z;bJH5MG#0UnT+qbxD?36BDpwj2lkbTCa*PWRyLzlR_sZI1|N(8mRXf6(7>kH(iXKK z9&A$$+HZaV-JpA!GfzLEGSmU^>M7=87)OcHlZ_y~9}G1#U& zcp-%(JK~4B{cX&Iv5f;l6S(xRlIDy2T^^ccXVZKM^D}J;qN;Oc+Ko%_cg={?F^9{(1&tAMt)p!_E|~ zzBFBr5}nzeRo`}?U>Gt$)UDS}9;K?*05u*Qy-FU>1qKmI4l9N_7#kaX=oveGSBJh- zb;RrhENXlyD#>I`sBW{_jpw3jGeP2YD9Fn`3Xqf5?&r!z-{kOZ6l0g*XB^TP3s!`| z;m^W`y!>(4dMav;)D|hkYz%~10L9R97b{x}sm?Lc&0$nLPUQyxD%iNMlFVlfN&AlP z&C@BYW5RPOvh$}_i)zU#yYFU~n4|B7$JwnZum#b_Y~2e{`Z48b7He?V{=A~^Qz;~? zsdD21cjWp}RzEcUaSPq4t$_T3aXf*3I<7W6mVFkYI__T-`_}1gK*vn)xtk{4jQ)WJ z|3LKnf5xwV+5J-)a42>E!POSzv>^R?Lt5wqE26pjT^QHFI9;7{AY2)TB4fbSQtfRa zCk0N)F{YKc-AZpawr{{9{1s90a}Iyr^1JoPuAMK$8uM9U^-SJ5%v`lAzfi{7-EAAR z*|+&E9%o|fx3jbYe@WUsB1nLfJtgbJA=B z#T?*y$|Ie}l9{vfh8|DeCp@l0CWQgQ+XN1_Q1rVXBvF8)eF_L7rM z=o=8DiB~;Am;&}3Cd=4t#M0KXXSpV>tzswAK2p9jk{t#AaV16YHv)AJ(6txnBiNG~ zqBno<{O=(E_Ol#W^^=$#0Snc0$q8vtmlYs6lf6_T82^l4>$-H63MA*{{aCR$X$f?@ zR;rDaA9ol+RZvB(Wbleii|c>iSBObb5F-lf$$!RL$;0@tjvGaf^R&sH$q2qrX==wx zCwK?E-2tD^Qu#I`9()JR=i|l5^fIw-aS4*oSZBzV^3xv%t(SOfC%dLsMmjvz^RD)c zi3giRDw3Dp5a3!ooH6qffF>L`Gzx9&NP?u7OdwHgGEcTU%7w9DjDcTv0!rqdP1mvr z^&S{2rZ))@LZ&O}P}0~AzWz=XaUos3$gw4D0=*I(6FQ*b+1l?Lzj1`jBdp>%Rb1|; z9mb!5JkIC-vE^XLg$#;#8?u*m9!>B=a=g95%ABb5;No9eWi)2^i?pipBXTEmpCx!e zrlG9U-Q7+$%?sw1{z{!<`|PU@yrBGyZ~H;dZU zkV1{=r9ZwsfOnwp{XK{0_Q?dgNplun^2QB4W#Pi9+`M%H6Q6PL-u70`yB5RMp-=$3 zIbjMsV7JPwGu63Pi-<0Y##;Wa>*KW)Dm)1p-nL!{c`{jj;}JdK`Qt#!6Re%oqwf0> z5@smbXNKA0?hY@QLZ42sq%vMrOau>1x%IdO4DC#zglf1NQkB|&Y%t`VQo96>XpFIH zINNMKbfuE<0g}l<1nKB5rdnCTF7V6i+3frxLb0}dP)&l5g-WHVP_cAyCh9P!IxsEg z=GHuhHg<=VxM}tw&HkFIX3iJ3du2|OK!pob`Qw_#?$H&Vwlb(XZ`^6WU61=m)0Tr@ zrt9ug)TGt6hE--2*-55#NOxr5amDc&8V!}hl#?{8f=L&ODtFU{ zg(#MPUgo@aD$jYVj=ju(`Geo=@#P-V13A4sKM9H3iOgi1=)oNdeqXb+ShBmv!)rEz zs9b`aL3;Bf43q1UKJ4Zb5=64c*w}xmomhd>D^tsl+*RI< z9McMA^lEmWQHpF+r=Ix{;{!gp31)L}Fpu(<;k3FK5!qb7CWl^cs+L~6%KJ8gxBWCX zjpB8SCZbA|DTJ&mZ{o|Qu+7kBki!Ezmi!$tuM|*HV{^8NQdQzAr|T%Y1kmFV8u@Q@ z!cCY1$<0IZ@z>d*;XM^c-Q%SDYwx-e2Q|&H*>LQLfqVpgSpOUC0RRxHWN&~l9t!`NSd;EZbP?XB>kirv9;qCp#rV|yb@G2B}4Pn(boUl5@ zNU@_kN`ZZ728@ucK4o8?jseXGsIer-KLlT+;lVu^C-|c5dNGNY-p_oNkAZ=&edwMq zUEMAeHNy}*_G9!p(r5%X&Ms$molC2$FQ>=pH6~aHz=g{(e*6{yldf9zE$2f4C>G0= zxeQ8njVjO_maSB3b)bO3->3=45s0Vf9c%acaOEN5vK<83j-Q&7CyH(qVhhqSy>7)( zS#(ENN0QG{+DLFAsZUQ_t}L1{#iYvc(R0<;_lDTqJhK+l@bdRe&|RmhTo!|wXVgNy zL}gWWXt1JPSsw7*btp$Afhi4Nyq3{6pA;z$w6pGTXy3q^cdI=0fCj2a(vL5o`Q_#;s)ckCgWBxkZYg6bK@Rs--I2b$5E;70Vs= zmEXo2Y?T!Jsop>641z%ul$j!Y z8G<9u?fjyiaz_FeKhi+~w>sDL=r4+@KCA)sUL&rd%1Pt;a&E66#b@uxXPB~5-g4+W za=lEkN%pH5WMz1xty-Ji=xLhJs}_1=G%LdP&1#NR9~^mCp+1xF6~vbDjwiS5R#la! zV0k^j<{*(0^^H%PWo3}pf4rs{9w8RUnnN2KGq-tHkJpj~LQHwKPw; zo-j})JJ4CDm}jZVva-gMOW6FweaTd<>a0%Q_mvqL-`@Qbdt98$7{JLiSDU#ua=Sal z&_9Loek{KTB*%%$WNIS&+H+XV8_N&N4!^ckXNOShXKAOYh1><;r;05(H%FB(WLpU| zI+=FZu}C^!p^X+=8$SIL{Zh9XsZw6COPe= z0)~n{B`0y3Zx|U;%lrZ4F3!q4J40)i4oL<7F2)AbUWnMRZQCyqIl`-oT2Gu|fTTxe zv?IrB|G5s7u|-_vL#SngmO7#*5%Ash?gazl(f6709KhuJsctl5m40G zf^*)Z_G`2a{;ccrW*C^mlxO|!9=j@a=#*US9!fnJA>g!D_`a4hGn)06G;rbftMK<` zAGLmuXhLG&YoX*?&&ps;;Gxe?n+0${i|CM>6v#7pRzPR*Pz-% zM-8{nJu(+u(&M!*FP3oZX(=UOl!a^}LN??wrLC-%UvLJ9dq0I{y8lQeaMr{xOf(&y zg2$>rKYFPqS2o>}LIMq4I-FGlVxXs4xbW0P_E{<)hMS5Yz0uD~?YgHG z1?0QZPuMjXv9PL&FpnRm6rcSVU!Yyl6VM#e^Yp=)?YB5wy|YC=8NK!vSSuN*oc2nki7` zg+-2auX(epa0F!o_$%N1c%nE&OBlec8wNSmSjuUYtp8q{_$kGMyW2}YlZ2cbIp^|q&@Zfkzh?i&{Y?du7I zJ+gz)t)H67ISx_kNv~am46HmW8altyC9s2 zP5%c#AqBya3Md>$ukE$gpy{B6ua+9?)HTJ(z{^`J9|T*QRmSeqkUEjUWhozqzFiwhB z3_BQ)RHsJIm_m#I{+pQNY%Z90Pvk{N5*8D$G59g$EVcz{HZauR=T+2~sH-@PwK9{x zgB)*BWM=T8ZX7ds?99P|%N?)?k@I_y$xhe$=c*%`Im=WDVw5I}$k<+p`VZjAl*Yl^ za>{yv-XZg}Y)zoGUWm78)*)N0yT!JxvB5C<<}GitbUb4p7Sg6hteZ($r&knF9^)L% z4~YF{PR-=zP2f=6RZm04^Lp|Zh-_%MGCeCTAJzUgg!!6>FwWWJu@}on39k6- zSxh=BhCJPBu7cJmF*;LgGdd-LV~r3?LQjw{6*;)M0o$0^?W8OHB2mHu(yAuNc=!8v zoY~|g-1W1h0?0sX8u!z+zuKDmy81~`8ao2O_OYRBndX!#fF>sU{a#cCy)H);AdhJU9y9ck&THE6$mmJH>~Q#jh8V<}RFWzy(_~7ZbVte5;Ga zf*ZYtBOB%?{aZhq1@+~@0MV4iV&v1}g+hldu&BG8oqEQcaql#e89135-798qRn>xU zgSQ_lV>yEb>LM$(gU@v6*5>uuRyhKc;huF^X~KK+7tRtc2o3IxOCMl{U&WAOrp~}( z=YxvF(g;SQaykKdPW4?GzNQ-D7*5Oh9TSs#y6yWY@_uj`MFYDA8h0l4Dvj>zpPwDV z*v%5<{-4)QL9;>l@k#M}zG3U$!F>D~f6#}e02t(6ZV$5{+nEb*(?c9(ciXo%-2`mW zr^nKaZg6NhI$PS1P(Acg=R;GdtP3m^Bmy=Fqsn02bhjiItaIe@cyf}JDd|xFF-@w; zW~}%%fgSV|O;uDlbX1Y2gz3Hb?aNFKC|@*?xfM2HDmF-+5TzIAcBQHLeW_jK8?kJ* zjx?XkZ*VzTBk_6zv4V`|f?T4i>Jxcd(5n98VuI;%rkTCq(+M{f*2x`4Zyb4c`jUt2 zU?+4}+RIk#JlAX!m}9P}p-EZp)Gw5W6u_h9S;B(q-YRqs2<^&>?NRov#+i!$7m?`r zg4XcCBj1>oY%lrwnW{Vg6pcu(h9X8h4zgD zf=Y_Hv;AM_x^TlIg}evRR7o7O*-BdPUo9yVuJ&Eek=>q9VRHlAd3Y_D14!$?jy?uE zNg~unW%$nanN3v7X9Jmg=j{-kHy#rk3vBf0z{<1HJ?`+qrK5*MR1XXHNitSo_fqhSe3O*^fJ_7=Q18HEH@tmpJ^%w2AWzm3{N-nnrdw$Ucl;p&^ueR)D&;er#F zlJnobba_INl6*g=(lxT~ej)UQyn1|ZTF%h)0;s?R;UBdPQ?>Z`fARI^;ZXkJ|LDvZ zjD2Pd#y%K~eXNZ_GYn?zTZNE)DP$>oHTJPK_Ob6m5|WULv5h4mq*B=l6-sIS9N+JC z&iP%}`Q!ZkT+d(6{eD09eZRJfRq%tC(hkdw9;~1C_e1E`cJ?O$MwiQDkdKxM4Ke|g z!et!)qfb8Gvb;Mu0=F5R0GNKJXWc5Xk{Y~B6^xy4Q4w=*WA^uaVn@v;@K`=>$a}pe z{qTLF)V9wlBL^FTcTt!A*L2(M8CmCz?{G}}yD#mo{}piAW0 z!S4EHvyw}uFEgG)!uS_?*LW;dzeLm()<*Sh<@M6Y+q;Di%*@WEyg|@81&y?AqlCEq z%dn62R7Y{9#TZ$=gs+9l)l$VI+1Abzse$2o)Akb+J;-bz%lH?iM?N5y4kA~ygAG+_ zu?-;Pbb{EkPM6YUcVT><=fY3j6>l|7Q}k#8=;a>ZewlHq{`vA2#ziTo_t|f~3hQ6y z&=EC?LYTB39hQlWB>xhE^cW7Q%3Hna$?FW%wZ7cD#se%UYxOq-1n2&-$8>=Jt^v5rgu^d>eMzuqleEbdPD z_zv)^%xfXlL`THJhJM5EA29DQPR~wX@^yiHXv-e2@G(}x{nFXB9E^sa&5IeD>GbM4 zSY?wO79LNEzFf(lk)2%R(DM#3bPyLzA9?VJ+ z`see*UW4~Hj{8Ton-K-Z09{AslmbXVmCSK6)>l!4x zx@t_llkohAY8anv7h#cYQ9MNM-EsMgXeT4HPUG!NVb-#Gh81n~xLxb+1LQXgMC5S5 z&C@RNLCWN|&YDr}MC2QOo18aGfCGvxu~C*>Y4U`e!bB0zfNtaPM@IA>G(b0Ot?V5X z;hbjye4YSh5=|G67tg;k@^pRVtNs3TQ-B)BnB!ALh~Vv#n}K@FId2XmNT>QEru5SN6O3Da1Z{)AqJ6 zJA#VJ;Y-Pr2eD|URPfzY$cCS?+g5Yojx}NOniLWCLh>?S+Bmn&ic5o z7$=M|bOZl%ed((%b1njfeiQpe%?%52>veXMIVr!df86V0BrCrts%|;DiuxY!ms6fz zIHJ6>{ULk%?TFYn?q7mV4{95y|8!*UBgQ#~V6P8&iGA`%-ruyA7O~4ccd|Bi+pf<2 zJG}5G?dQNV_j^6z-iq)Q8_}X|)Q9HYcvPKy+mq$)G+RPk&OY?qvQ21i9in`rmT778 zW@U?IGeYxjDN8iA^;*e-PhWsZ!^(F^zraG4^X>;+G$^{PTqR+vqn) zBshqce+fj0Y#Zgw-8=PODx*jk-FdH03>O1NDzz(e>kP`ejCE`%W$ws)5$1|Gr&Qe^ z6AtbH>o$@y{3v?DX1?aENgtroaRvFwHaXe76!Q@_j*$|vr0E4^I?Y zs`l-0)GMQLJu$pCCBavDU?^I{OFk0{3U~aP+}6g5RM@LdD?KTf) z-z)yYd!mapfOv)qdS7-&q@Rto-7i!&*3YT6Ycf+XVE++2F06|qYb&Bif-OAIREPbk zrWgsha{+Lk2-K5M_-66J#thmgspn=If-sb3zMXyvzri-IK~R3ytIU|}xM}*MfIa4Gi*}i- zNam`-yUK($+V;PtZS@P)8+i?tf@FDPi95f>hWC!Gq-AfSLwR=9X-xu&vS|V^<9ExW zK}37MXqoRfpS_1G=td#_c(|xng;6EJUT91+UfDKW<+n7){4`io9mrM6b`&q-kXo%b z!GF*v%~S;G#Jgqesp{QK7>fj5vwUTEIf;j#=*}}Q5S%HHe-oS4ma9zB!GRIyfVuN8 z)Y{!!u1w>w&dmi>Cd2D0-+z z64o0o(nJ)1O;*8cSA97UY}L6SSb}Z`_3@YjD~tyn0+(7)^sbGe-7cek0d(C(D;I3M zNn0QJt!rXeq$0HM4Kf!XV^-on-Ic2ZPJ)u>IF#ER2cv;kBDl)b-IJ{hNu4jpZUf%% zq0HekTKgV*d4L3y4oVFFnoRD2&C&8@w2)|~7AyL-NsrW7gI0w`DtJ~FOcHEh@^u1@ypA@kJ$02S}+^h)ev_FRJxe!uJ}fWu#D=pOj+J7GCVb?4FV4*^(OSQ|dCSLr(oGe5Z1hRv-H8acv{~VCM-STz%akeE;`{8cs zH0kHR%#z=~*+i#UpT#>ZkMe%>16{hsw+3QZ&Kai&c%!#VyzbGtPn1FYv+>mad-f2J z+yM5S*ylHY9%i!4|IJDvHPGi?-Q!Go*r2X}2nFWft+?cQa&CO8n_9JR?ya+H_39b_ z&BAW9rWtc`ymZ}^G?HQ=>2(R}LN@;{D=c|(VbB5Ya zan$H2^B(ZT%RlxWP-BB)q4__WbJvGt6(_)I9$4^+#Uywj$kLl==3sE*_<&=3l7{8{{#tMg+yR7mz4iHB? zPS>xDb-D-|(+R56F}9Z3 z@&Xo|-l-Z}K0Axi-W@0+ltagoAL`jgNrRZh%Vo+XofgB1gxSz_sC*$}n=>}xK-Lpu z=nS6B^#uCKrSp+_2-7}etJfzkEFS2uxB{eDZVl#rr{HT;w+{gQZ-BmQ`|g3OdnqvW zxK*7o2l*Rri(EG`eMJhTci>YpVRmzeK_^-3uUw*=8@`Z+EK7CMS?6nup5O$y2b=-h z#OTZiDVkCUXicS>#dYnelv8rYSyF2P<3Tw=g#C){Hr}P#LjeBjJo9<|5(wOPW&GA^ zK=}VK2f~#1SB!&9Ux;oSCyV?CNX~lwVi9)(U~ua$ENmBKp&T8WM$56}j$!p{(2g`M z7rpvQ?@8_YqVcBcko1_*(E1HalAV!dDnq~5eF`;riV<64@ODKB} zFTjNoY<}S*KUnUjrUJDp9IPe>`L|!ki@!B{y*PV*wql<@TOCPG3XB!oPu-Vy^k(xH zPVX_~`lsYd<&OaohVDWd~wLXLnSw*I?DAqJq1RuQO>j|ossS0e~4YC60=*swuYV#FfZV@*~`67 zd8rHp*~{#>=Z@1CA~~Ihn(TDm!={R!BCpzp>kqujG@nl2?X?7qIChLvDM%Zy3FlBq zJ<@`!E^jle(uze@BF(<&o{7=}Ci9d|$rE`b8?JC9=c#^Xri?2F&S4;U&ua2~;CN3c zRxrEmKR|;G=aQ=JrDJ|sM@|x5)Qvl@ZYrOYW!x8w^>jq2SF3mpTY7AfGrGweDy9 z{omKbmhaqAJqt*^Hu+b-+Fh!D!O6(_m^@5OwU@X+%GiLRPkt)#`4yabs53;oexmpv z>r+E~F~{lKfw9as=?TFhjz`;D7wb4VZQe+_tdENk!~*nqV2;!6Jxjs`IcH(J&YNsX^;W+puZvOO3(nY^s_` zczX{#sqYKGhcgs8mI{)LH$-E}K%0C}hG7fasd{*(%`Co8&MMX4rWA02!*F7D>?mvq z9q1>!&p*9V2OvX&&OG`NkC*7ELLV1m6C4g5+@^nwwuR^vC3s>?QWN4ot136o&Pt~@ zjb;`md<1LXZRg7jO%xL$Obeg&VKF(E!f}J@;(l|`(KM!RbZDb8C5W{#*PZb}m5@{c z{Th(sDI}Y1kXt=F(=QmxE3fw<;1 z)xNJ*6~{Y#{`7XpyJg;(XbzFBDA#2YfG8*{Rq-%07=Tzez-Vr4do{l%O`wMRM9edn zd`k^X1kXXfsFW|=`~W2XLYVWNN&t-^ofk9&rHCp(=MM($qE$Q`x%dNKWED#`>xAM5 zJ|EK1BF|fbhWB)D=wCTuASic*^v!#3DA{hPTVZ!BQ^ijF{I2rEGdVI|jCNiAq0e8J zlIvk3tEl$k-HRuItE>R$PGMQ+Twq|>Svihs?D3*JlCF|+j1?GI>DMXi1xe#u;M(? z1w{5q(J~nBJM~3n=SDUScpR9f?YZDdKJ#1AAGLJ?<=Ipf(ml@|8=uP&F_#< z&g&VdkrwH6sYYsHjT7&WWla`LB3W!1h~or9vYy&x776bGh@|@+!8(!%MG=t1vB>2h>jMt%&HFB*MgZZ zlQ%TBP9ugT%x^eaa=>p;D|kt{Qk&med$31hR?uWUT|*jgwaS;aqhalbhJL=H(j%8B zC;M5LA9M|BXYnL^WC1+0Jct0n4W)Nf+@jezGvsn~PWKSsMR+(GqJ{m(9v8je-#9;I z>jM>)TwhOP>oc%2%)ska0tt5N=#_O9QYP`IT^r&M&)`HQgT4lC(KBw=3edrH( z=lx!7>cl%z;+2FaK3mY~=`f3|w>KBt`;U}7M9}wy4)4I^{QH-+9;O{m8s$ zAMzwx>w}kPpIEHUBlT5xQu}=-7Cy6&eWfQ+#Eh`nM+{tVd5a8@P zI}Va0csYoBkvYT8HWtE=NnR?Kj`S!Pq8Xdiuko`*6$0SYO!V*F{Wjp_X4EOw@?ocDRG62nD!ZhW>rKq}i=gxM~ zLRM1fpBz%y1cO>gk417F;8Rw z&~Wru_r(2cb%eE#WrSQ{G{A*IKcUV@+{nN#p z4hN>>nhm#gI(m=A;Gl7cs0+pO=c5!o4VOfL0CMXdLtP!v*g#hNEayV=s^rYG>YrQd z<3E2!**{Cft)k&{ymKPb%RVG_flp->a%wF0#&r5Au+rI-UcB zpl8|mh@2SoTSexKUeD?3XU-q1ebJU~fHdg189u$<_DqiDJeb2ffp1Ujyr)!e)GL`o zEPDERKNpAGU@GoCkl_!!^q5tdGwL2QA7BmMKUFGM`%_n< z2PkbHvU8wE8iC5$VVCh?$()%`xBIpEb}kSvG4iPi#n9vy(ssV9oW@mR|sZPCZ36Z+utEN}ek`mttUH z+hC6p>J&2jT#C(g&rDR1i}iUD0>7ukp+IvT9gJGQV^z||<=tK{@Hwh3v%(rmn-a@r zwa6R~Hebw)XpF!Z#D8D6ci+#=L&ve)0nhATvZXm)mqS!HN7-C6e&%Vky?!~2aUpW% zQ<2R6D4CVv-trh(`>U9(HYx#jZ+hJ9eV*KRP zqMfa0j#{_=pAt(93ZfZ*PEHnzfR7ueww`6s@V4BOZf&8_i|KZzcX-hz+!Gc8p$4zH zP9fd*J4$s1)n+$jgsb-(pk|z5ihn(<{(u4*YJOY~>5IkXkWWQr5&q^(Z=j6|Y^Tgb zjiC{*Xr?N~cV@6vT9BgO`74`At!p1d7HTQ!HGmNJ(e&09UpJS`hip^?Pj^>=83OOhbGlaGi&y}u?vwKCJ-50zW?JjH< z>mh&@@vV6XSfd3C8ZUe0Ve_Rh@TVi1Q1aC)Lh~BVGnxH@y|-~Z8bgyI*Eh3s4lr z*9uUS!}W-dtD!BVF(2?507Y%S|6_)~@jVaJTKl#mew7-JPwEUcV|1^fBGco2(gzlMfE)M^3iT>2S zQx6NSJaIbv0d6Y$ZS`)`2?|~#N1b`BZXi1_Wj$RM7^YuPyM(+E9&1vmDGNRFMLDbJ z@?p2iKB-%xwTm8tK|hdL%fD-o66dyD`dsg z)CxL34yeQic@xmsagedZ2^;6u_{6GlC^kB~`Ri*UOa+`QJ~jAC-ZuvZ$cWc@!i#k8 z@!~&X6BToUVDiiFe8;A3(YaN>!^@+^>5sz$@&=e+41!(J2?oxNKq2p zGr5Zf*H&|W!d*=>kOsY0Eb8J7L$!WN^ql?c)p8zR+aM}m-;nV-nE*+l>tWS5wpZzy zDX82h!j+n7`sPt{P0ZFaxUsi9!JAb@4QDph(db#GF!19EtxmW1eohA=T-bgv(|9M5 z@|WF82nhmWlU=gYN2<2vqLLdq^#j(2IMlDNGr2A}{>^oJgb(sDzN+fcLr0rA zO8QHPodob@JTWSYqSnhb-04<48aL;xQdoMoqgiB;4^+VYurj^KDncmsu|~GL+Y`*s zyiGwy)haEk8e;^KGRG1iR*yO}h(SyCgDRfQF?KRDl; zn$!SI^$%XaT*3q&w?sP?x$J<{7Ht0;+KJ4$|emtp3lG^_vJ_sxPr3UWsG}Er=4~t6+ zv#jZDJkYs->|!R&mgSw9OUp0y>JvNMo%Ek28htr0w8IAE5TKr4NVE8*eEyIxYG@21 z<@f`9b2*GSbuPh!n)_k04cTHLOLGzYy6qR9HBUsa%Cm@+Yza1PVaIN@J918MMW)La(_(7yX+%;!d#;ddaSXE^8QQi zHW|JvX{u|79+ui2d_(njX0h;vR`Wz#@>wrMr_U#;N8al0@bA`Nos^$G?Cz-)wpjtWYeA7!!Jbf4 zaP@kg8t-SL9Rnj?Wq`sEL#rt91Egm4B~K}z;1gZ9gxOtT)Mr1r1Bi#h40`1A*89 zw3NL0heU6WbZO2Xv#!}e%bNJUyUB%~Q5ZmD#FY_(Wx%ZZggQNWZpWc@Fkpfrbu z)z|Lp8&scn;PZ?=+!(?_3_g9!u6=6mpzV_wru+-*eaDF*x(K0Gs$(9(Xx@?l43dwsiNBr(cJM#6 zAiz~PW8GigwElB@t@lOi;HN`N4DpxGkB}-U>D)cU_giya>>-*T{)GEQ#tyAka!1u( zR%6YTQX?AHUKW_4vHrjt{8M1JNt5NmtYYD5b>1QSOR@+eKf9^~hlZ@D?DVow!;ce! zT=X3U$3nsdPVzKUfgyceSILATU6UHB&&G<0GK)$!t-eA|)?~O=*{csWfGmxiQI1MF z;uZ}C9dkfA|6d+W7MV3diQ(z{flD6;3XS#5^fjJ%Km^8WoH7Q!K?IcIqPuV(bwuQ_ z3~(56MIHQ;*bY@=m#<2VNL#wfLZ`+zpajx;!yFk|3kc3`g`OuQY|dmTu$k4}hWs z98*j_nDDC{F#8#c^U@%g^QEi?xIG=L=EP-&%d~lL2mR*G%TEg-W_k_^aFO5!-mov3 z1$jQv*8h+u7CHEmm-#G=$OP^gUZ6>p*Tl>?-dh-4u>ECnef;uuG{bXB1->Tw>3@;i z`@PD{NC+~ie*b?)1Z%{VF@(_}$LOER|0xYd-FoE-oidBuph{?12KLny=p18n!-U3% zFWcg(W#d-U?z)dr)N&F53#7rGHivYU9u?{y|UQv{jnlO;aVR?!gs<_4*#)UH;`fsVPVliq%|s2 zPJF^~jRGwNn+{C4@9PHT>zh2Y%uiYmd07+UBLp6gSYi@LCaJa4%l+47H@8h+0g_pi zv;{x&hHzgm0by_f6EYjsJKKwfZFg_r)%n#&sa^rcW^97rZU{rbhK)7Q>iwso9Onq& zezPkXd;O_NiLWQWefK=xgUZOt;|oTT3?swV_69wxsjiLe870-=u>Pd8Vxr>0vH1PqQpw0e2avv z^<*??B_g7Q*&J&4h;(?fQf8OORPwb!p=iP4Bq@*Qpti|DWQ;0+b$U^!I|BBc+g5BT zS_?>E_WtxqvP087r$Pj$0K|Kc%-+BYPlhxQ#QH(e+VU%srz2TVso>|I!>(fBb&7Qy zH{Z3zysqM3y!Ya%rkOWcnDGDUk_2pLJB$;<{yD4%pzK!kCOc!0S~_$<*$yxL(*so= zpr^AG3>0EohWh#b%h?Mf&rU{Z@r4_azYwH1&|v6@Zhzq~zg^zAD2w-l_gPb{RtC_k zncL%e3f)XUgdp(3f}h^-;FsmQNr1_a5sx)#Hzw2caV^Aq_L>~T<4b?}cW(hvQ^vaO zH*lA3G<`vmB_5ECpAHzfoDwf$flVJSVFf67QwxACaoqb+s-DS%PJH0^(h=uA(L_gB zDO5IF&>glj{0C#Q9KN_ryERqC0tJDgQ zK0FS>e$7W2ege2^rxFL1VPbNgYg|LD&(4C8y54P&H`hgttf9-^iaggWlUlBv@;kqr z(Ga(Gr7gTaQHHt&KT8!q<^MW?FcLtb=KomG^2R{@?-E}OrhLG^)%(WM0=ixYrLObF zGLk_$>3P`XQ#3k1ovyaV&U){MuxOXncgZ!OYZ7KYJ+j}QSjZvYI6c3CBqEMb-+8_O z%p12I-IG_9q2_E@7Je+);83Ew!DdTu*(B?8)4uuxhkdj~52_N3-L#x*2z<7ofJ>Z; zD|!Be8v1sOKQoPpe^~!<$0sT0bJ`rnB<;t*Q>jpYUw_8Q#3(|?1Xi8bK9RDJI_emB zI~N6sOe3b9O>!fTTJidXeX(r!7+#W1(ixSQzE*T22HCGwRruPBD0Q+l3n~7b=$B@2 zAt-RHGy7!!*u|`9RZOz6ISc8wsXkG0jsH&v^5qDl);h6wt9}sp1pvY;hzT=4f-^eh z;)r6LFRSUh;qnVm9~gmaua@7z&Q6UAh%u2)BPaIwux&7vweDT2`+I!~XI-z5E%JsD zP-K`5_6OWO3)^u! z=5oWL&93=IOTC4PDMU@yA#~ne?UE?RJG~mJ-^$dav6a*IU}sZ6eL&mS~j!b_-8j{%oJQr^x*1{hDbYH@|@i2#G z_2m^pVebM}0j4vB{6+KX<6~yBNC5?w*sFK*IO9oXC4o62-ol}ZVNk%;*3h-yR~9vP z@6kS^6#tej=s`lg)Yq<5ncsm|4hQlGTx>^tqF7M)tps-+Sd-b9{tQ+s6ZHb$_h#h) zXTu@u(g?z-Zw=^eUVGRR?`ai6hKTK7%yzPRz1Xh6MNt5#d|(4aV~6hF0~en5RzT%T znp{+Ri;GUCH`*=pU%e^j@R5LqHkiXd>uOxUUa(3QjkbN8mviQn^z48d`6aE}*&(WR z&=%Xc3k>e;UY>YDo?BjT8M=xQx^`@GD8tN(BIgI~NNBLdbCMWO(9gDn0NYSg&&OX{ z3Wn|J0^gnN4aWLYq}(AVZRr0N!5&7%(!c_50*T_X-{nvpI}4%z?en8+NKY6$cE&BQ zEj%Jx1EUS{8(1TMioFz2oy+j>nv%KSfA)fG)kA6Ns!KD8{fl_n#op-AC{cSw{D_r? z$)_9KwR_LF-EuFTeVG?D{*A(*puWQKq%XgRjLror@RsaXve1}H`?b;H^(k3|D6)H(}r&`qQ+FXf(CfIj%Dm-%UU#J(M`lYoT zj$Lv_rb3%v6_j}z%XMGcMcO@^;{qGX8X&jcU?Wtkhnh5s#t1LfVOU@jXI@9-ua81=sY6C z!O!023SMTlntIn~5;%WuSvAd6ts@LfK|pfgaAmy_c^WwB-)n_mxG}CA_d3Eg*0JD& zKMe2ms#tLY^@&-RbQO-@>dShbUb4Y{(}Rp!4ayuZK?Hbjeb0Cq`K`+^_~hgl{fTrs z`mhs}lg=Y&D=XJNVGXTODl3;Lo{TDVoF4k2x3PZ!x)iYc-nzLhPp@Yb_savsDPs~k z7tK*=xH1Tk%zUK088apePT^(~F&UBI`0%kf|Kq>1bCSC-%2&1%qPiI3cq_{to_T+* zjiT!~u|uVK&(9OUQ-Z5jA{=11+c7)~qS9lS;-q&=BNf~t@;d&H*pxgfadmn~(xZ^7 zLE6RVcRSC2HdtGMQ-t+!a7r&rAdnZ_+o+e>l2Y*+wP1^YgL z@v=JGRS5f3X>zHK}}b8o9jOi83gYN-4E z5t5^FqDiAt_Uh}W=ZWr3HBHPbpR~T-VU*bJ2g_u$^JVh-_}}S& zZh7FYIABQWt3>_v+PHgdq*F*OZ{&=>ksK|%=G|JIdFR_sV0TRAVNzcGP4%{Y`LX{1 zmLe{?936)E0b!#Htru?G?B>|lEqEd6uKw`id@KH&XZ4icmGvR)(s1U- z&Qh^Q6q{>?c-!rp?)}DAuPPSu_784nqOZ|})*l8>vIwzz!XX0U->#x`lx4)N#W=K5 z@E=Y|Yzl`$X_}YaI@UBeq?2`I*gjZ^Xv5M~W4NoU&2)kh4^x3?qKgILgCjz_gC$$i z0DD`pRDIov>KHGeczNSSd&u>)PU8NBECPC2=GpUghh6LvY_blwoQCJ>)No*Xm=XV; zk9E?fTfLDC^xY&&jBu{m$g~!m2Um*2A(-v=ATIW6$|K=JQT> z>bqe2O#R!qceQzb=wJ0%NXnkL`^xtVPGbGQ>4Rm@sk7^Uf2{o# z6@>Djg+UU^?;S;;6r-|<6^;Cys{=|Xgex3T3nQeB#}~TG3~uo@5^QeYKgH$=N9k~u z^tkQkdX8+Tt!NBu%o(*wWS{Q6TDDW(9(R1~xP1jVnft-wFLJv;H8`Hn3v3K9ty-?& zm=mVUoj5F9;Z?Eel!K|`KLZ{~_v+3BU96aT)u7=eonX6q&-?@>BouSl_IIIYhJW?c z*|Nlgf-O4Dj)sggT#@laY?lL~F71&5JCx`(6r}&nW%=SMo9-oEt^UR|JI>)jCioJN z%Z%)%p$oCr*5|y>kzXi)x9@p8=MA2}l5cbK>$jnVWzWs$)bnaIwIvk8;(Lx7dgukN zrBReSOZZ)5nqeNEe@O#_IhWtKcs9-opAqzY(oySUyT~LlY~XzU9hxPr`2W9Y;WX^w zyXqPcO6BYVnLyk*BXj)|%`~-zFWQVOE2i+2leu4SH`XWx&GG>YTQoi!7p6^Dw2Ziu zy}22rCAUeaZ1c>@M&Y&hTG2b2HmW?Ao2s!jwP_Z2V|0IfrGC%<<)RU~azvZb=A56I z_|!aChn6AI_X`bJu1CTgbJ(EhDOI#L(N=>m zP1e-cO4qycU5qX0rMvWp13H$+JM&CsD&$`$9=KPg${uF&M=F-ypKVfqI^Q4^y*Uc> z+z$3qQlC8yXdXHpMq75-onAk2DG4*9o$;)Z1QlLJd>=!Fjc=ZvST6v8(Yp6qp;KFP zX)E`Y>jZ3ItRVZchK@OT%zpGJ*bLxWom-{d;==pCL()K&A&Kjh2I;#l=gSz?yOEaA zm9$Gh*-9eb3lrEct??1^R&>+WDdog>;NxR=>5KTvu#zc+@N~**mg_-K2cF`>gW7H# z-<5x%zy--UqZ~>WiQa{V++>N!OX9|XZsp(X@Fm>yHhlBEtfR62{CR*K@8A1UIXu!P z)OCFe)Jj19`JuDS`OBRda-b#kbv^_7vr|t;-@Kmwpi!1D|F;%+zoqQ8iUZfab@EE_ zvY^?LXOv!CsuqexS%}elYrT)f4t`^`F;l@w0TZxb3{i8A5bG9M)jdIM1e2d@!2$@qzf0tC@7(jz%XiAu#e&o~)1~KUyZ2-Kg&t71LM_ z`XBHMN;YdM^iTd7!Dg&`(KaW4sYjnzjAbkdpH9-7&iFn+xq|js`hz2XbZ5jXFo@VO z(M{-+Nq18jyK*y0TyD4*rTy9|^#b}walkoGaa{}dM{6#Wnt;Xfn7q(Lyty=N$1}w=!<00g#n+C0PW{(UIKBmAqMf-CCCXq(k=2CU) zTDVdCSmGH>;Jf!d!@Pg@VP>RgpDj+G6YRW#6fvC48COTeI0Zd=D=B$0JN4hW5;dp` z2zbpqz<=y>U>P$zFO$dLW(`l1jrU30d8Z)+gv?zntBj3Zx}5UQ5VQI5=02)ON{;yZ z%uP~L63c1F_`}e@@!8i}tKgeLSN&xE&}#%)>K^V#jos#ot&={e-eS)K`GYj{J-4D_ zkvpaUyNxgNW$*Tfbl(j}(Ff1*G7TsqH%mGPUJb;H`mHb-voOHl) z?2$Kji|2R$Q{Av;UA{r!CePP@x-4V13tLaQ=D0Tg130le%#(zdvW?_lDt)r3zHM%y zTE~56W5F;|*k&mH_agCC-I-!T<#zB!QhQ^S1WdGB(jtQPLh7)!SWd^;hfAbT=K||`4hX4C^n3<)eb;!Bhq{o-}T;~nasKTov80$9qInULoD8wnP z5lg6o=%M`HM(+l#xS-tP=Qtzc@+QslQQxH2qlT-=DDK@JIHLUUFo3hJ3Nx^^><0tVlPLI z$c*sOS!?G+#1o;R6igM`Qn&Y+LV_g*Ew6;3nU7_w*8te6Y)q0MJ(+v`Dd$gw_}3)t zQ4`|%o*O?Tm2SJ^s6tPkh{ukTwRnoj&bAv^Dacg4G3`vHJgBLThR7@CcOLWwH5`De z3gM9G7+rP-bjawn`1@C?Hq^)5wyzaCQ~y!YA6(SO@~^nq3f*7raJ;b_sxG0y-k7fu zU9~*8DdVqbVqNx5RG8b2+;!NW3~*~mxP{}i??|+5i{0XUs!NS*?Fo zi+!bG&U_-4NDBzY$rtK)6#1T#J`$-AkLl2zsL;|1EXwf~V9ALYEA{gGf@b9|>=)_+ z&UvW5NqlvJTzd~Y_*b6|JVKVy5yWJwzB;3sEV@ek7h2xzZB~3vE$+q%%x{u;$Ph*4 z8A@_{B_8B%yjTMg1VL9w%fgU0le;MEkqZurn1f?6iT*;K0NDPj=LeQ+2!`{K#&d|> z4$a{2;u|*DqYOv(BD7-L`Ec5Ucj>{lYLtLAsh2o|HBKGn6WP?D%fjys;AG;Nm%qJP z{{$7z?ck7uDebAv(Lt>XE`U_%eL4Ka$4BGF(C$X(!9_3Degx5T=;GHjxHNNc{q~li zQa{-~Fy-fHIE9MI^5yYL*L}j5lxfKa|9r<&r{`4-O)R6Q3_LcoMQ2`CQDHm(5%qHm zhABE+gm~nX-{Iwn)sn)=Ud(&N)xuL`_KkKcSi3s@koWxCF6A&r05qwkr0xJm6FObW ziGc2V`g4eU-FY07m`UD%(MVq`-SQG39wXqp;7Y)MfU0ogE0GPpajKq9bH^sc8RhzG zq+BoQ)>+8(l-nj34nAK4aOVm?ql9T$7h(o3blWLGOxp`B=UltFv)u$bcFX=JR= zirED04rN%-6(ddpjl$s5Hb5EO4f*=hqxzg6Cw%IuonM}goEa!|@j&sDDI%&40H%%> zmn$r=m>>oTe#>88N-K##<=mdkBunZI{BR6zfaQ?z(OI5F(h&dM{ch!D^Yc`&b*8{b z`XAm){K_&?IgtrQBiVRNosQW4-;jm62)Y;uy;iTJ4T<6ool442%RKvYOnXGUm%n1_ z|26;|Xig5rRCRKj=6yRYV=mqyxtg_gVtr7y!28_z55`y0%6KA6|NO3Gq2ep z2(dN;suse0$H}Q zeRdDV4IBVRTyF&@e7L|e%^(_JPPSl%gV}}+o*F<&A{OL#P!f+=}!{i5m7$k}A-Fb|;{;tdSH_nMt0sR&y zcGE<{a9TN{N}pRWQ_y*J$2vA}q#mT5nUE+%+e-to8D2GY;;yu~|4<`AMFsk#IyJ82 z|84rxSl8byl(IO2hFSWePDkdj6q{)f=kI7{D@{wd9Rk|pbNftQeE_6mId(&=&kL)D z0@INXE|v^Z7$G7gv{z=Ndg~((4lmAPv2XQ%G8g-Kj?kvjr(D-w{W=gIiu;#sLY6H# zAC>k(fY6iMh>FZO@5q@S0GRLZ>#cBW+KIy)YTSEIzq6}y*!`-tKkdfG@xSlt($$$<1*}L*aY)g`*e=@ z>b>ir5a|uGm~I-K1OBwq5usQnCOQc>!4g(u0!LZ7G%yb%J&!``D{b?NBlKAANbP8t zf$1bsw}3uemE$1mW8dMOmF{?x&C*G(gv2`n>l%f{r(c!K1#0lguS9%`J~_kC$g|;j zf_P*9ma$lO7}mIs%rD2W-n?05`KUy+4w~zK@)v6{`z^R}`-b~8n+@O_4(82GNDbjX zNahQ+QyUcQQMW0nhF^F8J#NJt{ZclUnz(Li?VB;Naz0*ftL2}CtBEI$PfgRf_S|$VRLBG2Hp_17j+O$83>81?C z)DiIB?>3Y}0Q~j@F_v6SMePmoui1x?I@d{L3tPWBGxK&JEKmb>6Zvp~Ai1A=N{}lv zlT2~%#QrufOiH41hZk=bn~@$Z7tkn6ljb&27Kz(}l*M?wsUkIuTC`{MuLug$!Td95 zTi-LKU~d?zL_A9mk#IDhcNb)FRyOSsLtQotRommkYZU$EzNmHT-J6e@`4F@8nBReV zR#uOvnfn(g{{du5n}3R;h13i5aLjorN){!58Zmbql6eQ-`iOhs02PnIuKeZx0LGW} z;rY6FfC{>%h2rZU&6<}#LZsVNlG&$;m}=fL!`A&&Zh|T3X3xZz)XQ|vyGlFdUQzTi zS(ATumu`4Mi08O5E7q@Yt?!qTWX}~GS+%_rcv&zo)9n~kj@yxfnKjK;wuYX1a*+AI zuilzw?96~08Hd_^kIoq`l!{r|ffdo8A3@18#jGYP``t1MkcRzTD{XKdCHp_XsWfV@ zD3NqZ*1Kff%=kH;WdKRzmcZxRM28JICoi&i{GJfJoyZ~h8G(Gyml8KBM|AI)8H#(% zSc&95onyG<2>*_v`{?Dyh_4@0o|yu9$+y)ku5!$*6Z1}h%(YcMptPoR1^F7R4*&$> z{m&k!#&}m>N9(O0D(@DTBV{}rJLUiJvmwmuVz zY21QAns=--CSIR3vV4rMET07?f0ew8*k$*&`o_>|y4}1Od=QOz?|i-kQDKBnvk$jH z0JsQ{u{g>Ui2#Yk77U|;wgUzNHS(-b5;YW@%eKvYYbC%e)kXwg*tra6mpLPra5`OJ z>dJI|B5&SLpjoJ}4t6g*gO5V0B?uziGmk6W@E^V7I^F~o5}?8vG@S{87<=*wIx`@s z+&&is5)led4z##Yt}ZmmDnn#&j<9R)0Wm?~fsZdo1sozEOmFD73=HWxKovKR37T(`A}R!%-Y|G3 z5D9iJo^dwFmG=i5#sM6vcX;u^meBS;8BQFC;T2i*`8Ce2g8T2lN7|IJ%%cE3^gM$zH)B5et)Yip4vVO z=Z-Rkzy%)g!8>z5(SEo`a-Q!g4jA78eC5KqjIt3#s)~mM0Oiaf%Lt0fZ9T38%h&v1 z2F}<%>j~*R;hh9bn}KVq$iF1D!wlJo?1Kz8ax7_u8(yBSHKkUNw*(|+SgCRT?Ny+dW1nCIt~8Vh>DBF&0Mr z6ZUaE1Bc!TFL|Vcqhx~SJ6t$$z79GBs7kJt-X{_wR3|S;dQR}$-1prA7-VN`SmZ{Y z=?sWUuB3O6aA-`x1Rn$+=l+#rw#w5w4md7FWMU-{!wD2>6BNVWibI1k3XR2moGp+c z3H&+NjX@;fBfrh!p(tSuG{a*M$@I$mQy`4&($&%ikK1lhE2yhS7_=zl42)r`GyB_f9`WBN9z?g=x3%p^saO+h5!Bfrh#Wn_@m zB$CZ!FgQ;5;V2y888SrzYfexP3EnPfY(Y~?!HBKKJnA8*F41Ds<>`qrM6_y#7T-EU zoKX~}b^!T=`oYdA!^1Hk3a1|ILa+u6&i*1YVIJe>cn*m$AOUa%t&y78AUofv~Ul!pT`Ff$c1Vq41;WB@ZqXK*hI$M%bY-BhAh_RvK&e_>hSc)y~F1Mjn`tn40P2VzeJT;)R|bO)6RE=+-Ve?i9cQW&P1+HDEdc z3A5mQyySptW;DW5&Mgw-3sG7UMJj?WyT(vRln1O|yNH!gq8e$0k%(maWqqlXIV`lo z(y+%oy29_FLVy%6k>r=l;D>1u!`~gijd^pG>c{GJEL7;rcCJ$-Q%zbC{SDNsC@%qt^r-G8Y8HD>@HD z2bS>!8{m#;?Xv|`bgYqJ+`pAMC`>T(A={`OL5<-YdV@m3LB`bgh^ZPWWj2)e&N!V! zLBwk_NZgdDt|o&h5&*!t-^4~tBiwxN2Z;d&lX1B5kiWCSRX4vVI<7n3N!h!GaIE$cduY3`iF?-=-uNlWSUR4Pdw$ ziQar2JIDawC8gW#!(d_|w!Vy; z^5asUtJ>mJK1Y7x>?M!|^B+bWiavmr$1gJ)#4%jhfSq)5*hZd9LB0PxKgqcR(q2mrPCjiC~&?WF- z{WaGfYN@-@F(7AJLf#OOo0N5&#?9a%ZN9(g1OYm43`~*=t8243?5HR~jTz|7l7ghr zL)I8PN|A7jWfL96*e8YI^ij5=`*Z&Q;0KTs=OWgA)`APspvVir!$my8gRE~4!#-n> zm7+NSbT7O_Qj=3t+!cD@Mq?ruj;ZuaShFwS8K-mfkW(?3n1<=!rc zR3;*8)0xR|Fd$a2PtrLM;+Y%7M5n$92*Mn@fmC2J3PSeL5STP_5b)Y(%)z5CmCLFq zY!v`f09?X%hsa|#WXFlNBegaRDqUkQVrd-78KV)DF}PgR_Co3S9sZp+T_o=g<7MZCkMkRj?h z3+Ui@q2uv!m_remV!5#de+qJ85keKBWez#U^ulgJND|8XqRbGGl)!|xs1ZIVoDGy= zo`*%E-=u%}38d7=1JomZ=C2qB>eCZ!+9M*Mm3zh_43mWeM5&3KUpA5|VaIbhE{JV)MevmPy&!5^k$wYiZ-{+Gi_{g@v?JmV2V-HTN@D zYWQKF>%2K6UcTc_CJmW|^c^~7{!CFp`~U)N;u@S=v2=!6IPmR`S{#9vI;p_>D=JA) z*~Vy!k-#8T5m)J;nzjzFULy=9ceA>>+NYukj?ta5c(vfZK9~g^KiWP&m^ewd^)4E< z7lOno+NKgcKl|EB^b|KCgh?~?^S^7qUC@3SZg`uFqy^BnC3-)vU&f1dWM zpueC0pQljRm97~MB<@l9)rwTxRn7HLWx(0@1;2}(h4rKSf9r&^#7dopytqE-ifCZG zKHX82S`I7t_a}nRnD74Q<1enmP*46zGZajHz0>a3LvFx=82Pu|_WSmW=7#p`iw3Db zD_gfEU!TVFM?!=kq9K5!b592n==PR-r2c%oJYbjdzPMUo|DP}FE`}i)Kc&C^Gr!yF z_eX8wKY5<^#I#?1ZIHSeztbXOObVO%sZ#X)b6W$??HU}w(hp+o{8uBSUSCu#AQ*RQ zuForFt9Gy6OZ~4rEsZl}nlG*|-&}KPjoQkQKz5!he0PP!g?GiI;r?0GoNv3n;<9;b z^NtMN)Ot3WP?1>6u*!G6zvH`bF8hr{uAl*XY+gWAVsup)&s| zxKsbTb3Ct!aiiu>MXrs}PADlLW84jD@|0;Hg8ZrG$e%NzZhlwRTGrPHq^#-5|1|LC= ziN?He23WSaCHK=bzA)+kv7-bw-&DX;DY$3E3`g&}NKU4eLfny5E-J~J6L11If;fd7 z2;ce(&7H?!S_INe*C}!`pMam~!3w^1$X{kSn9Jbf7yNyTAyB_?+cmmP3Ia>bz%h)f zGt>X?DD6NN(!@|^?Zn6wqwA}4s<<9lk-}Vw2s6chOOP*h@674iK5KQ_u}RiudCc@6 zk?Oxch3qX)?UX-S5Wfc##FY`dB>e}QM}ho#qj_^4g1FkUvIL2BH2-bI)_uFoSk~Vc zvD;@N@mvV;b|anq-W-3)(`}WB{2N*_<}o{6`Q5>ms$G&aP`D!r%MULodGtevqWyn_ zu^>kx)sr8JNrm#Sb_s9^W`=O#b{f8kDbFeA|_QNL~T=oT^o(xF=Lg<=XZ zazl#`#qtVV(HOA9fQ_tLwE5QKYaR;Nr2vhsyy`(Sw|3W*kL(SDeK7d2@~Ej7?65{X z!==5^hgAfTulXiN!dfdjAoAaV(e{BInhX#0qT=OA^!(*QIR8UK+-ht}`%ehCY4whP z!?|8b@hwD!Z;ip!hT^3y-GA?_&5mB=wH(3xf1d)&>%9swFst!SnF$Quepbcp_@D9f zpz(XLRu09?zwfaxL_N;3nQ-xsDV>R0J^9ZPJ0&|m9%*0}IhOQSVh5SoAa9~8 z$ea-f%GSEq-f5^LPvxlp;FSRd;B^%Fl2d!7!gK9O+y}!u{~f-vr&>I+1(O7=X3z@+ zsrw?<-@?>GP+*uw&@EO3ofPThUL{?)V8v7#>d6hstj1QPG&T)8T3nav7v?PJd%nTZ zwx-48J>6~!k@2tM{)ar(kq5QQhyiz1tSBTuwoSlZt|VTbILe0knJ8U`$_PQ zZT2PMN0kqbdJ_NHA)mb_k4{@diWH*%NKsHZ4He7Thf2CP@X1W)KT!Va0h`8gDGun3 zj)*{U5gZb)$YFwxrvI6E09rsO%W*6uT*1Rc8HZo2jF67oUVWvB!>Zm$9}JoP2>EZB z2k$8@dy&lVRBL@$%zrvw5O+_1DM0VR`p8!<*?|D}pU|1K`Wkoce$7L4P^h19Qo*tp zWQqiz_a>NV(r{1#VdB5nIBtujdXucJ-hq~8I+8l&`C9NOZeGYvPW=<>*qDvNl2DyB zran*)`n+wR>|9?6U5Nf|Z1A5nXcvW0F7Fhm;8zn8RM7sn^UFx7blHDVXpTRI<5;{& zVJXv~;pL?xDjL1Dm{xtbx_*U9GTJsK#{qZ=zU_Pm}i~= zfHSMabhEaium=-_-pl{>nv6gNT8p#pyhr$BMY3Tp%}!0rjeJ=+qzWB!S^s^1$3s+> zLD+oabjxFK`w0RsM2DPOOICEO#6hKg-)2GcpUJX6!qnuN(lid01(&l$lsudH8@6plj2Qn%<)my!HKl!iV3DDDGV&{=6d1&UO2 z5q#DuFIoCoU|V}-s~tx2Mi5~Egj4gZ8|8nKjr@K}7iT&C$ZNlgI-iL_d!}Fsq>e2& zevPddPf5-}dPa(i@Y*u`cUai5XhHP}j`J6OxJq)hWoF>FqD&v2q6_rMdkWF#b)lEN zn6QV_j#0+l?m(e-N8PjW-Y@m@j=@rkpQClFaz2KTzSr;9r)Qi&+k{ z%R1(GBssIrb1cNDyOPQNs2gjG3Lm-<0l9h<3s7Q(JN*lwYdX9ub?Of`$@k z&W--j-MXn+n5}V29y?sf`tE=lqF~7NfCyEv7XT>mY@6qw3-Jt8wwWfPv|nPO2<|D7 z5^y!%54gg6MVrg`Y5v+(hUxD)9!o!?CLLDOP?sxi>}+HDz$%os${pfIoqL9igKQU& z?Xz@Wy!n?%X0FwX&b&Xxu^qhhemX%>{>hV&9K?uwQ8|8gxCG>(4Go&|FKouY>ok4U z7R-;S7ZZlSgvi+bZu7{Za%U7-U8T!D;r07*N$4X>&SA^oz|Q!Slaq#!up))`eNR&u zgJPdObCF@{-}QIC1d_2{@P|)y%oQpcoS8vmQjKCCh>8U6XR8!ait$Pvex0^cj4K?> zKz~QCDQ1UnVe0)}*|z<|IQm8X+M52RmiaB1)(927uhNg=tI1pbk@9hsRU7Z}blO1n zd$tYIB>(fig;#AA^$?)m*m8*$Zaur1xl3z>Owr~bml-RjSDJ+6w#+^Ydnss=?yrY^ z@D-79Itw#lt#BnO^H5P@{dQ7uE_)J;8@U);om3^`vSz?|I)tWrBNZ@z?H887g~&H% zFErB1^wFI7%eZ{-#A7|$(itu5KSqu-g;Zx1W?=cnSXMuqN-sgNXRpup*RHPoKnQ!@ zeIIGo+lbP6DO%Vd!U0H4cCxTRKu+0Hz=aPL>OMPZsu+@}{kG0!uJ5j^41ly3%qZpm zZ3W!k=C$j~CLaTVF_u3e8J7Qb|Hu(92KBjbP{<9vy&NVefejLL#Di83EbHNFX~{oK ztbCjnok1wUt&BtnYM}N?*y^mLt-*XQy_7O!j-y+R;o8f#QVn6 zY|wzJjog;f{d{h81q$G~K*)^6&z*gibI;io4^;=QJs0%;QDgm`34V%Si~B6w%Kqnv zo3xg@)kN}#1Z0az1UGVlmhtmR_gw5A z3<=%A!1o*sXe$vYM>>}S{2}R1CveKD4i`{~c;YHXa#4uT-zt=zs#)rDy3#i>V5*~}wxhS03&C@FCHMAPsK&SK z`5Eo!6}%y8p&YGDfr2Ec87UvbCSh6#SG2Kgne70-qjUJ4UHH31t7r6H4f%R4J__ZQ zTC%#2@cI*w>#aLAmgom98%UsNFd|%0*eNHt_0+^QFc>U9(I~&rgL-6eW+2%r5e|)J z(V%#J)E5TX!b0~8)nE3Ooo8O$g@oR+~Mh7z%cB#VaG+e!wP*V1ulSyvLXQ%?!>sQQD`}0kme&7`DJ^^bP zAbRs-$8OY@anT#PQE%@dHX1&ir?IB2$vHQ&TzckfBMh+5*${_p=6HTp#{R`}q;IkW zEN@Uw6HPtrs0kB!M~;|igMEzAKX|BhmgF$-A~#b<>`o*U*p+>QP>#gizt{_fRvb5P#qV=;_=<$?n;NT{rDS5gYTbR>~^MweudKqcfwBmMG z(7N*m#z_ut-MAG?zvC}{nn_~akq(M*|3z6UW2t)};)D4CE-CGsAw<;b8WA}0!oEY7k!|Ag$C1k%uqQs3FFl7Y zXSOb4^p=JbQcW&}lMl_|P zcfe8qt8PQJfvvyIg)wY2e&O58H^s3;ub*Flz~r(G591UtgsY%gE$5PZuz386E$wfN zWgfLSw$i(4jHB>1vV9(dH@E0Zo_>ij_LqY+Of@AScEwZzK0?`sUPn03I~?Hug~VN< z+8O7LHqVL`ipo`uT`u$+XIw3(y?{l9fII;QDBUdyl^r=6`HwRLlG!CRox}Q<3dm!;5IL2SiGlQqrB6tl{B7*Kllu}v7)sb~TR64UwJAhFV7(|UIZbqN7RDY; zR9!aompw2XF6hlqtscG=e?}y)>rG@MK(6 zWrwDN|1iN`tB7MlyCtFXM(-Yg{)Ep7A)?kY7<(!;ht5+DFo#8sgh{rDsu%0`rJ{P%=}#NZRJ(SBc9qpzXW^{X#A z))k+7Ad3PU_@wrCHYeCm+ZgXw8sJMPJe>olMBX9wLd)fa_S~3xPYB~x46=Xe*mtDW zM{QH_`is*U>Cn;Hl$1Z|J`03`Bk#^V7#5fu-e&#RVe?J9$jXkC)?-)hMI)=wsq57N1R5b@39|XM-4sVpY7Lr4*mF)eoJUhUdw8tXL`T zn6YZ~*sTt}!rcq??di;iQiXRc2+v5@BFWWXZ%|003edcB%=rpp)?~T6hRaa4vV@Tz z!7i!))XX&T-1MOvs=#x4D9W%^dKS6Ls00>>987TX$!FqP7i0zKQhF5$BC^fMqjaXa@6Y@OV28`iMV7VbvC^({{2*2Eb3XcepJalbdo;@voo-*5G02w60u zSBpgH?;_}~H!|-3VS}qhPcl#ETez*kZnFDE5_sl<*Adl0EGc7Khb1530SjBpO!A$f zpj{vePe$k#qW1>d&(?FS(@+A|V?PBPrtHk5SkL$Vrq!#lT<}5aM<={4>#{@MPoDeG z>2LS=PGe0z7SUHM-&B5fAn*A2sGdemjL_gRe#o$!lUF ze+z1}>G<0t4x_^E;eX<+d#b8>%3BR*jopmfj!d}*6KIZ)u<`S_@4x=|85IJpe)Z*u zqMA|?1{<*6*b%O$HjRnS7DiM>lZQdh|Jo7croad{=}u4S+BM)Ke0!qjS9E#aNUb?sxcA2&zi93lHXBwNi??aShI}()>WcKgW&#m zqFhx>j1OL}aUGv$Z=k=cmZ{cAJ<|1GrO5d7SQiSX*!^OqRHXc_yJk}+j+>kucEc(| zBC=lAH7CKnQKgfryXQUIC=RDXTTYou`+)iWNj1#JPL-97t$33+@tK&6Qw6JJz zDpo`&fl{HnKsNjhQ0R)MKvQ*Vvdt7X@q>=?T2Y@bBkl4lA4}aQ4Bg(7k<8tGHJ7yx zVc8t3ZT43k5`@JY)6y)p$i1-yJ7)v?CjIjnU>fZ!4^WnbiGK^!8*@_JipB1! zlArc9!zTdg-p^tjT?#W}`sV&vkWyAe7L%!m_oaQp!m3rIr+)++RUkfL>Lvi(9guwN5+ji~H~_1l#HaqNF}(IRnGQ(aoaF(~xA^#d4S(95gEzIqXBbl7;^r?` zh1Y(r1Y|eWRupQjoT1QE7LDwX!Stu-RUhyxm1YUVgABjF9C7Pig>RW^?EWQ6ZM6I1SFhRD^XwX}qSqvF8h?Vp|MU+}-J@EK ztL~CR&I>ioANZh@*TcnyrEtbpMwWx&sdIfzf^6nKZ9tjzT;P(Y>1W7IZ{u4C^sv!l zJ(kT}8?yBtr$yvl*XIMt|IA@egu=2Bw8)hQ^AN7pUzhh#i;rE21WE z=V}!Vx-=-ntrF`3DK)`jEOVoU|4LISM{7AeuNe%RN-(4rSyz%+p{mI`R(C`unXw~UbKQ)mPI?wCpO=JFg@Z&O4M+rBT5&O|R zanEKGEA=))*cnZ>yPgX#dmwME2q1JNe zyyh}h)`?u)0~VBYWG3U;>E24mrPB0-*;2a6+oFkRI&Qd{WGdaKk!{oQ2o}UkJf*(` z(6QPkflWR5LTwRLqG4d)3U`;V^8Z4jfx@Aj{Z6+K195dbYX1|f?202m1}n_@*L)T& zT8UFJ`QcM^MsCYj97Ts!B9n5!lKA=Er!&%2tnfb~dDvZc7<)Ulc%k35t2i-DW+&2d zzG;8a0?Oz!lM06JFU-V1@_dHph);3OlCrVTiIc*j$DCJ*${rK6N69pVJnrK zwOeT5vLE-h&#YEaD`j62QG1QtEubQE{CQ-z2*ReOL)KQ8JrlpS zu96vlx;uMl+%S;9M1aC%F(x?%52*-*Ya_~XP%n#G2Xw!~Ou1@Nq!60Sg3gI=!eVF3 zH9xD%lAy6?N$X~s^FkzdRYeNF_DH;i4gm#SGG$xqfp&N>az7njwCarD16`;Ic*SmdR}zrt*;4+DbOg`ensqqT?xY<>VZrb@R(8$ZG7& zWu*U|S-r-=u= z?qSgc;Go_4!GhLfEk)bdw+qp^+OqF)?Aw5RLBMJFln^6wtf&;i?Oe3fOqD$wD&)Tc z3%iW0>u~qSudBYe15>Hm+)Q}h<^|`9|6LigtNph17UIXVR-vro<{||H_J;jRfa2&S zOC3?EZ(C+S#EL7yMHjzkUZZl8;&fQy{x)qy52wFwcriEs5(|QA*f725O&ELgF}Cjy zo=Epz!mHp%t(hY}J{fJZY7_6m_;2hpVbQ!H(y$gQFV(1H9$GMB9%_kg%p}e%g@d%H z=}WM$)*9ZiW-NJn`Ir=(vfV4?9#={a8*Gu3UHBQNg*(=#4j75h)mfiI)N%jM%l zpJ_72LWWX{!++d}6l)>2D$?^+f}IC@EtVVc!Br&zvW<_OuKs01@gq0%fz%l5yyY(;rN2eNjX*i%HiNdW1e`{YZAh7eoviKrYNIIplbV>+16=d# zG~cu%ST}nLYHth~1c^>cfq&v1ByC*Oa;A`{mFgn?3By1or1l>K{jQddY}xIJdas0J zPT&+TVXu}_e1W!U7AP1GTflwxnf*zejRxejSJd6%Lxc;OJ|diYIyLiMXciQ26fK_; zZT42Dz|=4?nbD|58pz4Y@j7$q-wUXZj{y~WJjeY`0c#yKW0*&4^d8wyUiv7A`%{g< z5Xg+4Rn=rPYOfF}ur%UQHaxHa68QblJ)9JV=&Cu{mg10Frps>{WWN{RB=h7|$-ReP z<4rP-uJea8P2Tty5aDk>PC#k5COtPT7NvuYAu6IEd_CX}vmV;2AMx+x=-@QEqxGjQ z+B|(9ho;dC`}-_VLW@JLAWzn{cS!BK)vs58P|DX~2er~J`f(~7BLrwUsCQp`g;I3o z1K4{o+Mku(WUgQ!F!jWvR6q8%NqvQ9~rv)S|0F>mRxsuh1Xk3)5tKtE#@sB>Amdz z7;(IzxK2$dZ0-L3;&jUuzn%9k`_p;T^H^nfvS|MiBK{m~f9X>CS%mcaYLR|aHlh&C z?S@XQi(=k;eAfJGhptK&c9hp~pK{J*({=P3XdZBg*(I#LyehYTUi};+f@3uv1{P#< z^#@@3Dy!(JTwG;c{5tuSZ|wTIw4quggl`C}TlM4Io5OB7D--%yt7wxzdnq^_i-2D$ z8La+nSu$)CNo1gA9K3rXsRYrt2F(1bAhLITm1 zI^;KQslpfWBDr@}GPDnwP4gCo*{za^kA}%}U{cFHI8O7LY-MVkbMka0PX{w8cDpL; z;4f5cPnd{^=T4+a-a=^bV95n}s3#cv7egU}8>SEO3cf(O;XIH2+Ia=PlliP`g?c#Y zxzQJGMEBS7ECJ5>GSd(ZohHGH2vUt_qNH(=UR{4151GWv-d4QMAo}-WqTL+*bBg7rrgaak$LL9?ECCwXZJJEc@(VpS#v)q1uzdsabiF6CAQ-?E@^}a$m{ZgG$ z3Oo7;u69g47z0sh$dFRpIdrm+a((*~1eo7)cc-N}G5qIYwPtV#G!)ad-B7OT?x4N$ z8D}Z+$K?4}1vQmtopORU7>;-yM*!%46|F$X5LTI5#VaBh*&(@>Q;MkAa9~CxLSvBy zAPezQtqEq=k#2A|>}pF~GL={(?2^zka4Q9`Q@yo=3PT8)HKss*hqB4%Hk8(tJ+!{x zP5|6%oHebm3q|t8HEb=oi2>PyHez$Aq94WJScw!xYFg!3JVD2LS($* zxp${;dNXEwEkVq0uUd>yM8(+xEq5G+k-Qtn2IoPn9#9a&wCF1&au0x5p@0SFfd1B9 zQ*)7LKy67#obw;&~tWYKc#$#YeADEe`V!q-{Ka=+QN4P22}r07*9Li4)7^4c9a z2+l*y@=KTS`OwSAVk$_>i!64ZwD9tedyGR&L0QmrS=sT?PgJT=SyYS}1Ds=*O4 z>LMgBF^nu!Q392eviJZv0~}G@o05Eh&l=WjJAFMR*T z;S;(c+Oi56+jlM%b1h}AYK4VZy(_#aA174h3V@3x9lH92LAXERM*@posuPm=w#D1{ zV%2ul#`$3?!idPbeX4%$tcTO4T#Du1f^2_AfA{b$yVgig{LuQP$pA}cRP2kjA%pdT zyF^wz&q%M{-&zCtT}P6^ekD)nP?cLmDY8)ppo@j0NAxP}-Ow=Wu`t4Vlrnj^)2z29 zrwtDxQ%X=sb%ItAn}Gi?jZSvX&zt~QZR^O(%l`rIg#X$7PCR0u5dXobz4eN7?baes zgBoXGK}&*9_gi50AirsV1updW5QnHu;A9Uzq;q_qEk;?!7yZy?Ir#kk>Jb14f>@}= zaL4KyDf^y@hU_}1UAmC~)|B^ou6VauQ)Szj|0*(HxmPN%CM@fb1;RBx=62J|$>)DKwHHT8`{9Fetu%7FggHhWr$jHAQ1IWq0b=->81 z>sA}9iq*GEKfgbRvV~J4gTdWj*`%zKkwRM2?8QY2e?%z3Fs;Hv9TjetQUoc5;B$X&GalI?+cl`oR7w|9lT6ryMGF0 zqdjAPRSVH7QaKo%GdV*Es5pM}E-2)F)eF{K2Z@?VS^9rzEt@a5GF?I9>IrXd&qXl; zlFrE)Fy_u|Vpf)LR;USI-fS(kkC5d5gBU{#jk_p|BE6pG<0 zgtE!_g||KLM?Wrm^T#Xi%=B%)NPl@=xk;`>2+01!EfR$Ms2mb-vsfog;`?UdDp9;O z#ZYKxVYr>H!Nr$K$2aO&vTwA0Rmt-g>t)xO4pH-Dh_d-(5^vRUK-ms{t~P6}s5(>U z@!@8#JkjnNL)@J|$c#k_;KO-h{Pfl))z>x@wX#8xe@Jc7Y`0)evwQ1KRYKUH;on=O z@OoRdCYxri_JIol12>3kVF2&i+x|TvCv%%84e9yOd^@P5{2_cgGTNS%>?<08p#(VL z-$bSAs!i%Cl&$l0hryiFBi352W15xyu@)yu(_*Yj0!r-`TVN}qOq74CiVRy}rhpM| z(Zpdwa~{-b0~`e5kn&)k_{|;PL!!DZALp3G1uUC11RjcW0h;x*xKD=@oN7Zo_T~nl z_?VGbACTV)$Y9ZqC_$*3kA|Zvs;=_`2L>1>IDGo$D^2G@wq<5$-D}gG=Igf?*GZbq zm9(bUjl$DAqGf3hRkE5LY^8HhNmDKjitz_!9W4w1VQ?Xrz``}5KcWs;1mQHvgouPY zH7CEs30yE(v$jIAH%fDEa>Geizp^3F~%E+W|Rv=`Zb%IWD zl-=Zbc+S4aAh;N8XLwJZ(%-bk5xshT-A-Y%i>+L{ zwkvaY)IY$?d)kC<%?NaeO49NZ$45MfiHIeuy$O-ehr#X}iby20<8z;9&#j zC@f;%TY9NXlA@*2Zd&VMAMp7oBW;}V$(-+njG%IB83Qa{&R=R`W<<>B>vOSGJN73) z8Tc(3s+FwSZuC~-j1=3%Nl;|~M?)G*zfZPk;iDUd+f&H)X;ZOOPJdpwOC+0_Tk@aO z03+|zxua7-Ug^9|Z!OuCz-m-2N75y4wKjC;`&4u?{~KVg14GjR9$!`b7*Q?Ah0Qb_ zsUrQLGWjc)8q9;Tb%q&k82#Dv=R2VsCj+Rpn_Jv;aV9$tGqT0MJhNm`7-ea}9IeboMID7<6n+2bZ_=)@ zY)(pb;0`M1AXY?xk8;}FJ=sUoPkDT=e}M)TxO}N1paocXr4~7w#mGq<`f5!PargU? zUAVh~^NMd8an9KS@F5%K37RRH~l!MG|IfC-{-r{<%18+ zCU_FME_YY&4R07MZ#;+e2&mXXA ztr*`9A+b1=%(@9X|i;1H2-T7y4@huQc(WRt2thj8R!GJLrc=(M25t|5hS{zfh2u7Q$rm& z`7~C`s^`4UgA`jZq5~X^EMM5XlSEwa@ZyVQM8Uf*ex99GBj@)k&fpaCo1&+nLio5# z^xU2lZMhxNqt)C6#lZ> zOw)q<=ZqGb>1y*0eNA6xZ;ALiDf<(TnaHTn6lG*v}_SnF8NQy_D{EpEbb>(idtaYsh zpxwD%SGjFjR&~;nXXtD{I)O@JBTxZs(Q*%Na`K63{l~+f9N~{sk=nO+W%qB(7RyLz zqTmx^_r#hic%9y_z<~SW`yg=16m0p6Zfh;5;so#Gbj5POsOj733>d7l)+)bm;ii%# zG)g=ia^Ji7*7~kUxXWrWws5@u$obb9zPg|%CQ;p$OC+yl|e}qJ}^y|6?dm&*@e(yyKHtS7Fpk zUbb?rtIka5)_3!nQ5!;av|Md)>nmHeEr^wQs6tw#U<^J#rA5n!w6=|saEKzuwT`#8 z6N244yYF}AkYf>$cjiKo7bcNC@9hk=s@~_-5m?rg%aL^5gPo#IB0KMNy%Unfb^y9( zv=lnozaCk9Au6WjX(z;;F%!c_*bwj|Ze>}<&pGC!9o-eQX#H!O8oZah*)E1}@*byLtOlR;f z7f-JZ>F$aWz?}3SbU3hmWOoivs?xkM8$VnmK%-0JI@?mfyG3`npupo1Z`T-dxO#L~ zrx3kdUHQ8w$465-1(?E+#$-}(b5(PUAAU>JMs!A|Y*#o=%}37P-AK?idWk==$oDR< z+AjFOU(HC>`U*Q0JNC#n&40m=?50|hAs(-pw>SmG`X{j4)8-q)hrUgE{Lv^MnO#=T zCU2~kABt6eA9(muIR~6_W%Y59KuYBy%7)ugDz@qbNeyEJx-VBae&?IM~NTUC{W$q)E=pQ_sqN5=N~L+Uo-8A{R<50Ibc zbrT>x5fo97Rxrt18vDI0y5xnjA^VkB5>7F z+WvW@CZto4&5SVJD;k=PFBN~sLBJm_t|K+4nf-zVcoaI`vU zU|FYvIJ8%^k)$6`BKUsc4T*<&(w4#ws~~tdzL>`p8|7o!?Awz{t1n~(;A%p7U&U3_ zdn=H1K>#)my{4V{ok`I@QKQBC)lVs|sA7Pdwgncr+7LL3=uT`8_uKt9Yw098)59-v z>y^Wni4ltP_=&N7u7<`2Xt^#h5sSuP#LkerCHd`w6}=YJ61-#(3q3VyRXyhi3{@63 zu7V5_^$aVUL}Zm*RzD^pHKl*XL@k0e!@EQ1vnO?>BK$%he;s-)>pXNvpJ#1HSgR8I+!kvR}?cH}DfTmGjWFZT5i+YL>DWL7i?%K0`@s>}^9zMC6Xk3kg6 zEF}@ZqtXml}G*IjDv}l1c zl)mT}&NH;lF5V47r0)r-Jbca{c=pJp!T~#m|1d6&i+7h~VD%P2F%9*06z#dC-##U`5J~W{bS!=*Q!g7)k_3@DIiyM%29inf-H!v z-cqC=eAnmf(}IZ^ryR+%JO64BM*o8NYq3mF_79CDUMEY%QE&U@d!}G=@MJcN2GAk{ z-yp_ z?_QeGc^A#b9>qQ^d1+@jR*GT!;tO((T&YJ$#%F&j1-Ph#l)e6Jwcv59`T$=iR#AA} zO!2YVlIUoev4044Pi6_fCsUvIMHeXBzGtuDL!8b7__uJV5UEcgId- z7g-q1IUv;s&P57Dk<~BZy=A>v$7v<12}-nd=ubwg=MKGTD|LALwY^U2W=+5bun-Pi z)(fud1CFQlvZ{ z!OsEbE}rT^k){f{hl{I_0OLz-l(Lk@FlG`~IxHxQ3UjP(M@KM(6Fc@H4QIq!6S&Z5 zTkkbPHZinJb5BvsNguTen#Oc@f%}gL#Lfm;6lR=y^Ae!pUMASEV?IajpIByiKM(7* zfe^mZj8ZJeRz%8O6NlTpSqyMoyXO<0i38KYq1nD(sCaEtd--64ggFh_0ur^RfoF;t zDB2oEGpo4QB8x~Zq^_C=#elvHN!9xfty>R1){N+RWu(l0jE!1){0%?U&Tz_| zyuW14s^8w@=Y1})wk(6&`W*{8&6QJ;48_kdaN%Z)uZL*No8<&g9^H(9WGDqv8}zGe zr_LEnWue^`0*&V$G+oc#Dv@b6hKCS~iL1=tQ!7=GWTP0yFSU|5 zii;of3GN5hE_Fvei2rh_e83vBFj7-?n>j7?Mt&*`P5rU2Ur%j1DwZ62>n@i)hvGt&Jjk^Bw`)TlX5S{voiS=+)(ft90+yG2G8Sd z+}*;>mfE(L9-&t5zTg~BxVU#8UxpteUf2=^(eG)0;}{TBCK#yQl2Nht#{Y9Hoz5oZ zy_`D03tjg{P(hV{K({>`0Mx7#&jlT5gq652NGb12ZmqcuzZ0UhFM0-dY!>srer5d2 zNvsf<935KM*EDinulfP9c$q}(qV$#u_Lwni9!tTsPlw13`0*XNQg?dBXdi;- z>NleN1F4^0a@ATZZNGhJZ57@QNE=h+?IDv?J%34vsB21uD|?wCjwV`1lRVK6;KW45 zsKUN`L!<`~9cK6g*Knf%8nLst+vBQ7=f~ig<;PVNp}&?vq95Pfo0|IZ&@2PkD=DHOiC79fLr9iPZ00mJ*>7cl ztp#SM6asKs1#twB%mJlk2|b)+w$gD;cg76PO|$DYrB0hZ5x)qdcLk^0p=~&i)aDk4 zp(<6Xs&{APB#PhR(sYa@Mz4cvP6Ek>9EJ5CzG!UgrmG&fH%KGMM{<9Fv_yMTZbv)+r8nOsTHrFCh5f!jXCdM$W;LANE z&q0*at2AmmYD<@Vc`A2)*Zfx^l<%QNI?y%CgN}VOohIU_RLh4t^tcf`Sk=qWlw>SB z7H4QsS%_@VnmZK^*mi*VwM~7KXuxhbjMy*5=bL}*G$`pq?V}gTPz6V zGR7BvR`d<1ng2OUMhYlDEMx8xjD!wW2B>BbW!dUHuY;kMQi*rwo>}WUmw{qRJv{T- znmWL(EE>t=bp6jpi%2RmXnRVHk#%%smrA7G&5+XLO`Uy3Ts$Zn=ip${8WVigRbhkx z`XPVu2~yi+G|*@DVmIG1vXbV#BG*J9q#*Zpc;_8G@)tV}D2n}nU>Abps6n2eG?X2Q z4NBV%Cljt2-2BD+YV?N_{$bd`;3rK;NciuAd!k(!@W7bCat_-ad>)Pw_i#9BO$$S) zQsPLnd>DH>*B3I;IRD&t(DAKC$WHeVZ>zg z>i{8i{BbayCl+HPW&h4?u}aE5vuJG)rKx2Z;U9B1>+L+?_&e`}9zN)qWBX)Xc}$<< zb4K$S^o({3FxPl$KpPD_|2~NWK(m@d-+(r|?@P63efOj#3M;KqCqwJ_$0y^w)dRn$ zjA(ITiby>D22jQWO+pK4orgm}5}2-4sIUX#E{N8I65E|_l+1eBPwfv=uY(rb2y!e% zt2y|(z+d4CCwm+)=^&i~pQt-hSdN!pk{GgG5~VymH)2Z@uFFo0s*Gvn`F#RkV$5SCoqQfKZO24#@Zt*t>b!yf_R3=cNT;GDhiI4QW z-dC!pTQBbqZ@3YNhvlSODldZ6ou2f7QJkOpi5sgK3m)A!>AGiFuGK1cYxVwwhCU{f z=AA6#mX=k-Aow0u?kB*{J*3M$cG_>-^v+VkgdPi__lM~|gOn`oFlC9*-;yF6&9$d? z4ED>P>@bAeKHrOSTTQVHG5lXXNPvRUi1C5Bi~IJ1vpt=Yk&5pd-W8==ItXzTh9sa0 ziLXV~Xgjd(hyuOqBRxm>ZK^>U!^|vbS{xF41$4!7=O;zz##kS?EipwWQ?=_}flh(H zk?~dZ+_y_-N1sp;husMy%hb6`(P3V~@R%SOgnSTo?9P4rm-dpLROCN5jtl0)+*Ch< zzLwp19Spkd^C}V9KaPo9pUCbw@wuynnSFJ11J0* zUVvoYjaUS_9E^lOyYFZS!a(Sbmh<#K(9GTOIK!P3T-CR)C|%ou$vIc z)h~I!`@ZFjmRDo$>*L$h>_-&(Si&p`L>7m6`qYR+B0GDCoHGdfO$OBo=W47t#sw`< z>m&UnL@BQu+*w!h&BO|PU!6-Yfcg~?$X<}mu3m`A)1IImKQ1805}Hiafhws5VS}#p zE56)bNJ9mY4hCup4rKi_zD!+tvaWmm8V~;9i$KU>U?)Kyez_x_Yxo~Qd;eQ^=`w)} zp-M|#u89N)FdP@BhvZb;ko9&d{Ag?VP8Uv+Ln`F^c@<3^@nz~LY4pRQ*_*d2hT35e zug{?C2k#sAhsVniPlGYkfuSsz|*iDE#5>HYMr`3o`A(GwaThB5)sbnYQ$qpkHPs%J>y zs|@`!pxyMPb~QZ3r)DMnxHbJjEgj!N|5b-p+SS&3?<@F zRnrc4Pf_52CeMc9=xa7li(V9SAKJ-DB%YHxuYzPsnCmc1 z=tnTK^f!o!D5K2oS35Lkt`QC5S&N~{TeXUzseEIy(WlE&MTFp)=f-q!T04CL9CT`R zFP!aj<@=!To0DX}NkxNSzHddgm57{0GE;S;nq+zsp7a(NuHHk3%o;pPn?`tJx%3*x zN6@n8lK~o!s^7jN1b{qqqF8g)+*GOO6Y9qobqD+(c0<^O^e7(ZEWAqpE3iu$1UY{& zN;r8_WNS1+ocMA~6IkafE==!(UBP_*NQCHEwg<$tU03sal}Z0DxNf#LW+_E>uP?o% z)hv}YbzBCg#*XJypdLeq#kTFHq;zG-hSL+hq$6{ z=B)5m+2486PIc>3=PM@b>l#BPlxWV@`ggB>IU!vPc7)+t@@9VqU$hF&mHn=6w)_&alHyVHe&)SahpK_Jdf^X}?ty%1H(cA;B z+=Y@?A}HzxO`96-`*c>HS|NFStT1Em{u-HLIz=SVL7(uNnD=6 zXEeB;rTG`c8n)?|foB3%c6sZ&ppTg(=l$7pnvWYD8F8i>J9ap!;pO_?c-0e$) zXS^VJoMZcM?V3HFT_V24^|A1@)ZIe<3~!^h@_Z7gqa(n|j_#T^u0njJwU`hxII>lc zW8cXd=!#o}P>KfUeM8BRcT>h22P5nLx_qgj95&|O!T7m!5<9nh`>Sl-g)s2nB4FGE$y{QIbmoc!YWfTlgfeLja1 z2_|EJvE_~AaN{_GoK(Yy4_p$>S^_1MAHA>1E_&U^$oTMy){j30Y;8dHERyz54itw* zlt%AgVp%&j<#22zIIq0wWYWfkab4wfgH`pfUzyczfBN3?%q0&%+DWiry06}oG>!^Z z0yz>|ex7g#kqQ$GuhV$NwzRWO!Ix+ewt$tE(6W^&M0rs7VO{lvI%~A0hI|;0K%5% z^Y+8vmCZZ31%t<8*hsv`1JnWs{kAK9>Kls|kWg61>)56|mT)KYTkS}9fI1R`r`iR> zSQq$1pC<9CP@Aw#Q2IJNEKWHY|ETkZ`26Bwt;8%Myu&p}XQ2H{DFmIAyFEq)02_H5@8s!a#{xf9bZr-bHh2q35o7wneEQM~!67;0O8$SXyK2sg?Xi9x z6{5$wla1;~rU<}qy41fE_G z0xVnP+jQysX;uT6lKD=>ud*>4MGy5+r|5Ks((TJ!0?t%OSqlJ${!SHqBQpDd6CQGz z*pq7^w8p9taSf{18^$d@ABf}DC{^SL7VG}gSpQ{)mxhc&L`CeF$k3^O@QMLoLkvPU z47uO582-x9+;c5Agss+e*}&c*KYF=4@|0MFAI@`iBdQGDrK#*a5k-3o_nH3Pn3XH1 z9ZLA1!yDX;Gd?$`p*W!&Ph((W% zQ!xU&8#Mz8t4lXLc06}oZ9}1bUuIq|r@Zc?XI`X}gujAbLNjE{V@jAE$w=5ro$`kg z_-wjc+2++!gQB090~bj=jmp)w#%x52Rc%o-v}1H`!+?_z;%afV^y&|1>Jpi)+*ha5 zOX7te9W|F*mGD0mWG~aXqKuO_#v{zsc3acc|6DQ)28Tx)4;24lh@1OVY~p$(ow_i0 zT*$#~oejb^_LcdY&7TAs)vd$mhS{MS{MQPm-GpzDg71a3@({^f3X#iwT$NQVohnQp zA1Cv@-BLwGrRpjtA7}eow{+AMzv-8Gnpg>_r!<;&ob_d`e4Q1=2Ot7Lvb@K0OdQUbS!iO4e9$MFwrs@wHaSxfx|3p9LHE83xo1^5+- zt_Wh$hM`E`2X}5rKt9(91DGd01}kFd#PMHrdS>)9;b_|9B4DBJhAl@W`dthIY%gjr z#ztsB@^`{IFM(u{_X<-+`+3VHC|w{q4CrGfOP3Uby>Btt`#VwkO|Qw-tQ2Z?qJ~P} zgBiQg-d+$G2SrV;>H)@vQCEg9aJQm^%+v8=#BNRm2UCe04D(EK&bffqRHN2 z)rV*>WCAteIdj}N8L3nQ|BhUU12P1fW^B4~W4k|7P8%;O9;R?75q%Fw;Dc0(qxxRC zf7J7<<=;A&p`@sjPen;<&`h}rhEy`;v`}x)gK0((B{O48Wc$nz{e!ddA)G`M=`1Zy zDW4Szo&I9U?S7qGI}7`xM7*bTGix99?TJPL!oP=90iAdK2Wk}(dv;gR`yPG2L{mZH zjnRG@TVr)Vk~VpllsVJ^{Y_;rQJpH=N=WWUHer_ijf21}-5wk2nsc=PJEWHH5Sb4k zNsoD25Y}RRh@M`rmid2CoYD9s`dyg~%1^ZIsdSPxr-dYYLeG2;`6cxU3d)CQFhgU{ zE8&|rw-iY^U+&QkS)5uUu6`fI8#A`xk1!#(=wPZ6=JktL2c=juFX5DtZH?wT2xVl% zx|)1k_8&)VPcX9<)u;$wx#-$Z0Ul0fzgf%Eh65Yyt1e^w$9|apUdyiaP zJj({+jU6zU_s39^+ZVb>2Sd}6ve3kF!k*d*?Dg zs-YU!zwk=m?ed-Qi5(fZMfAMo>b2YMu0f4M9=eaCr_4sH93ofm&9A>*Lz%BY9@-Xx zgX3^xXvvfw6G_wk6DW_KN|ly}b~yN~o}Ow3zJ6GinF=t+l6rmijt;oA0bq$}956}! zG1{u6Fy)(U#F>?vBs(&#T*Q#dhTn=wul-E3d7$ru<-q+kh?Jf9S{}gE1*O@ga;fX) z#jICfo9s!GzG-&2DTNnx4bEz-{@%YXJRSuzFrLjOgtXa_fs=vzN*Sgr*&%WLujFr| z?wGgiHP8IUt&r-`9JzXRTg|KU?He2y2l~VJ`k{dv&_h2}9L>{Yq?-TQF2d45m70AE80;ZRY(Ng)E6W!T1?D`zox`bSnt zuU#?aQ@r7SKb(7bW5n+F%|4pW8Y9NwcD9@&ANgWOG944`FjQagyXKw=7aw zLBaWbFTSV`0GY;t6PAvSl=ep?EJ+M4(E%T@d<}zltIrvozO`p2tG3P2W}mhDp74Rt z_BO|1UQXF<>A!!M)~@u_kf){<9%x^r642~jG)Nq6nZr663v_Yz`mg4;(;Q?MSfu(| zB(B1ub0_E9S;E*#l7$y<9X9=ox*Ul(pv3}HU0>U--i8@b|RGx(75 z^hVzXC7=6KS)cm?>w4Pcz?>ysM~%Qq9*?O-AZvn(yi0Fo>*3qxcpW|p^W!W+Og z!$MDOx_Bm89MH?lwW|S&ipOr<Mrv*=B24I_~^oaK=5eASf7| z`^9^M*!#xou6?zUb($1p=Oe~^%gyrYCm}-@u2^+W(q>h#D^6Otj2bPIHB^oF5u5o+ z{TcrGkE(C9MmNi54#~Y4S=^r$s!V{fOdxwnv7~0HdU?w1Cl1lzv7JYf@_*sz5e1K$ z2P1+d8UCDMU2%U0h64xg%KKgU4DH-tdd=Jqy?1@(E2?S7#9G6%d)#MRRsTV3{#knC z3-juSgGHdEH*9;CMSy&g7ybIt>A@L^Xv2B)#N>~~h6hCnKG-62QB|eX5GTa*>hwyV z!_)z=?`x3T2(s+KQW+wyb7;v;cTfBX+3kxB*=LLB;Mr0yG&Jtt#yFC)-Uv$#6m zKvCL4Mmyx1t5y5D2THbG`J~pidhxOQr%hRPp3D5TAlsd6+AMP28xYD)^J4VO-(`x8 z724kTu=2%cY)>#>atBUKQhIXojH0%2-?^5cYjN+s{o^lG)tA?i;MZf&3zDaGz;+@}Q z{TSL&^Ff!4q_ky}49tZjss_PH*Bauv(Mg>IWp6l;uI3wAl zc^hJ25?8G+9NggNqfYjg$zVc!%!d!w4(A29ql_wiqm@+j=%*p2UkL*(aECw|I&WOi znjo*LXbb=2L7;$MTthxohDhBb>$~$9Y2np0FqDInbP6!EEO2)aU|aoq@5ad_GJdvF z>;Q4z_de;(>9F;!5(4`WGI)PUQpISI<izM!;1&FXRL^@;~wf|$oj(=oTQ2p zYm%72=|UAM>Z7B~achtv0aFJ!fN5@zp5?50T|Y5sZB%rK=H2yrE*G@E@jVpEthY2G zZ_N22hVzH%#g;iR=>)ZT2<%sHW7DU5No;M=%)=c%wQXH*`E)g?zNh>OlKN}gf4Z}G zWXO$34_>~bje45A%K)tJWFyDpdQ};DGMW9XVtW0sEcW>>q>oaxKP$^^!1}xz+l=X@z<+;R#vpOr=*5A^c zRA;Avl-LiQZKu#hvg3aCsHAv^Ia@FnUcZ?uCRTvd5R?!JHniD}xobR{^7Z*u(StX? zv)+8Y3ac4=ZjUTVPxCBD<)Rs{Xx6}G^sb!puhdJkUiaa~1w*tCcOu-sIO_f=-bqt< z1V^9Rf(`V~ol%}vJlQ*^g$?lVIO9eDCLOa0z)zlYxHGf{x`LtYvjK2s> zk7%*bf_yfIHbHSjMnr#?ERnb{l}`d3tCs1%FXLmlrL7XXkpO#5pz2$8&)Bb_afvH9 zWT8~0*y}b;CxnRpkvfBNc-5jo-!$3yqss_>Bg3utoErsGa3pc)UQkJ5ONjE&ylH72 z1CD{2#6h_(_0mxWenUc3@y~RdocCd+qq#5Ue-dCDX3}a&>Wsr#3#~>f#fe`w~!5ocUGWYtgNLgz)#t?9n`2YfDq} z>xHi`LR$DqXu&lnFo<=K-z3Za2r@}k{I#-a{YoV!JtJ(s6#j5qR)iUHc&me>HD z$c@a4@)wTKh;q#OoGcci?{+87wO!9G;@OhjfX-&|7gcr}tD~T11NW&0#rMTk&85U| zXoqBMUFX6Az%KpK<)kfStMA3<`r|Q!ts>q@us(z{aBm~d7e%;roy;5Lq-u+qe zp!#u@63LhIo~xo&|JKM%v#oiPiDB+K5?XoMzI%Fh7o}T~oFE2~2vZGj&@|;=i)2YF zo+*2O{2aXU@Wech-=2G0;Oe9rf=8z$Tq zWO>I1d}0|%u;N0Rc(SL&2r{LPwC};rI&myY2rSR-;9ACK{tvwXqJoCqOuHX+d?qr8$qmsNIknnx5Z$3q%p@wTzXq!B4z!fs%gkrVI~x&CSW ztq&Wf*p2?6@^I`8GIl}}hOf~?wB0I?y5p?=d+6ggY>Kko{xgo-z}~3k&qplj5X@L> z)Bgd`ul#E-6@N9pSJrk>=IynEHTOX}q%dz+#cT$&r8m&qiFVsWQFO)~zfpkRxUV}b zl=}ZV=8c>s++zQE`Ar3&<;-F0l0%vs*S9k`Utf5c2!_X*59esk+J9c zvsait^xoBD`-=toj%>Gc+#D(4ndT7m#yh(&6PMq|8szw4FT=kkVQf^yanMpd>hoBu z2aus`4FrwTu1P0g-f-kI|#@xKFtJup1j#7J}N@g-zPHeH1;lTT#|1*=Cwe)XoVNab%GA-SK!E9T&J7A({>H+k;E@ahc@t14P`UG0`##Ree4#B8 zXXx%t^>s?pCO)c75$a91nq@<(AxboU#i~M)I&~lcChRnLH~S?&>~aB$*HE$rY;OQv zXE9Ys)jP(m`=!e@cUW1)Jo6T##`hHeyoMv-^Ks^Hj^E@$Z$#1`@_&#K`-x4n0xd?v0tZGYis$<`WHI<1C3`&edBf1HnVe%}U!~H6&-Nz;Ta!3Cs*_ z)InjEGF35?!7Fo6kBUNwxPmXT;inw1wvCZ@PRY8sw{>2=;eov+&k=Ic%aI{g^L77E zQ~~_mkgudfBdzQzd&8oHkGHXJwtuTdKP!6q<}X^qh&z!+o`{&#=}=46i|Zs4{P1Ic>=vghIy#Y(J3i{e)=uOpd0!mWm13xXd|6tLnpp$9e`# zb;LpZJ%%THLX;;zXy3THNck~6XI$C%c~oWdGf2XOK-JFncW`Z;w5b3?(5$Z8QR|9E zX`lw0|E7U%tS#8E{FYi}Vpz})WQb$@_&%|V1&6A2t~E#^26Lwc6odZzi$S+=k>$-q zdO~gf8kY*Iou92!%FYA@J3d>_jo$#yEt*z(rRRMVQ_}a~(V8Mn~Q5HK;fl1_Z@H-|H#F$mKYtJ z=s5#R2ZoIzN$h0B;_DOU<&43i$4s>k!YMGz(3!II`rl-Wzb_>3&V-be=+F%X^9SU} zy+_b+Hx|9hwF9q9X5FCat-)F#BcuAZ%FXVX%OB+*8UkPV1Yx{qUW;h4Qn#>b((e@Z z5&;j}jAw^2c`uUOx0puwCF7f(v4)57%6op&p?72gEDggwksCfLL1xF$wA$Vp`b)YH z9<*%fLhM?fZU^6TPbB8%=gk{XK~HEYreHo_y-Cj+0AO?KD$mQmD`h^mlF3IlrU6lg za*6%O44b8Ko_N+HL9>7a^+t~hqfBvg`u?o6S= zT@4uL{@m0Mg}Y#jDo_4A;$)=QZISw|s~%fWel{AEv@Wn~TU0PCNRQ}?H9+R?=}NxC zZbh*7LSxKtvX3CAsuUQe|7v0CL~(LB4$|_3$&J?=JT|&Gam8ia4(5~@3Y1a(TOI*BYSHMJH<=olHo4ve z*D0p5cb$DBdAs6C=_s>1;Bnnf78rBI{{5we>YGdu0Y|3q2H8;AyE+@v!Mkrqpkr)h zxm3lkqy`3kkq5Ioz{yZ0BKn~)KgGK%Ow(r`imf8DRLyV|WvV8V%`F`OZ;xxB@fWjm z+hmDM(o+d~JQ-v1s~U*EPid^*?2WAj1wX8qQTqgJhk2`nPm&3;1sX#NS_`JHS0 z;~?E_fqx41U^e9!+9JCy{DXG;Ad*?O0RK*3b-8+YOIG{Ke7s#JN?#H?5F+jFAE* z9J3drq!!hmDYB^jCgySV36-m*5>W)Sx^fgEBQ70rye;AG{eYEqz@0_QL&F>SB%|Q} zOBqJw!3=!fxhc%zIM>kx8m}rUH_3?cU}(?KwwD2H<6g(QUUU0ZiWA8QxstdTGiPn+ zFj&(sWNvfvZHqMb)8E5fv=}0U?~8+8oxg^cP)V$6j@0@gv1qUl^ROC{?@ukJNG0YW zsl3)O%vJaG+Jrv3!L4yJf&C5i=1$$yKT4D6#q7;oQ(fdOUB@-*^|#V%5WEWIcY|2} zjQCYZb3B`=%^VBgG@Enfm4X1RvwA|vHFq$S?EZYiUhkJywYw(x?;{Js#=L1p&cwIH&^bLWnp;(tNQMAndjI`dms8s}Hyl(n zSWG`yr#dYUzt^P|j*T_yj*}7i5wucB!y#EnsV2(pXlJ#FYEm~h9Q$s0Oe|~H^!E^l z&O0Iu02G~A(LNvKA9EQ*NA=5*HxH@pB`BFz^@I;E4jOA5i&Wxwp14@cA4evW^A*Kk zAIf;$qIp1&A_4XBA<2NP^*+y~o{Xet>4E0@d|V9;Zu`~t!KN$amy>;g>`%xu$InE% z9GJ0N3}tGukDe5Nq}*GF;3Mfz+Ctwc6%NrFskRJpXC$UQFj9i$LDSOj{CmNL82XYI z^l{GMl>mxoMaIec9q`k3jJcW3yxgaEHxF@K4A>+WatpzyH@>V?lcZBHJU#);TueJi z=HAKUkA*Wr26*yj<(C0JE{N<3*CoxOf2{OJ4%@Y-8Rn0Q?UF{PmI`FM|1u0ObZU>J z{DLpGJgBkAx#k&Mu~Cn9hdwDa;G}S2DQXDTKwn>qdE^9HH~~T>iK>_E(T3kOGM}9E z=@A^-6fL&P%~C2p92?CmBe&md43ezvHX_FDS_nSDpAxQoYN9#^54xwO_vq;@$6;uiOs4pyIN1B4 zEY)z-@G$fqo%M#muIBN`N{l4=7m%Bo@dgbwU#>J-l#W{aYQ*(4jg#sMX3z%MroDn5 zY&LuJX8&~=xce|32H!D=4Q6=BK$!w_HY_N;!n6TwK;*?95fu2paG~7U%JU|<3&G^w zEJ~AI=|P7^GPQg`u{#jMh7PW^-E^+1Y%?2peDR4=sfNfP>lxyrZVk01Q($@Z-NW3y zD?;qC-9B6&t<$_42sD6v!en`~Ss-X#qNdGwr$ne+Cg*kqU{?X^w^ha8&(ozm*mN*7 zOPVan;^h=1vZ_-^x2M_WLg@5CKcE(9B#R_0paamKoQR!>FG%#u?GaX1)8?$R*q{S> z$>8O!oB=n7$&m-LTLGV)wl7OCYylIii2Jkq={-%_qE54cZtTzlmm`7{bHRTv9B`Wp zbW*AGy!Z>jAe1OhCW=o_W^D)nH-Cr_b3UPeD8ato}6m>rtgx_Q26ZI?#u_rq}b zLsB;&6{6GOWCwWmuH)k!TF(O;+up*2Viq6lcXZ-i7MHOt{aYQ;uPkrhhHByNXN+Hb zE*YBe3f6nYhH1((Orz)jUg~E(x0doJm|P z?5aWWwLERB$6u1Subr!It_bIJmo__K)OlZNr~1;~RvVzTxz^R}~nOzp0$Q3@PW znuErJtVuawqSf|DXy7<+Kk4TLd6=+yGc~?~8891Uxh)+%$SR&SygElaF!`8K+P@%C zd<=Si@jIeY!L>`*3#=?s)r({F1Wf|>93nD=CuG=n!~PoJWJLPjUlonMsJNm3<95eXOi~eO$)(j*D9eon zk2cwabZ-R%QZg-H!?aFV&mVv`xlQsvSrIcaQFFHVdJBl1W@HP##2ygr`z#xrA49Jo zzU$je71TQR)b4e&c1(X-4;nbQiUjtkXR(}wsM)#H6KYRNAuT}(*Ob| zC8@^&UZWSqGlr77a0V`hZD z^qp)B9Wob5U9$GtLSKE2s*Lh-Y5AVewJ7y?+qFiKYG>JFF`bp(J-+9msw!;pBA~}g z@!Hubu$jYj9V%He8hgS^BbGy<+?<)&V5vdKR3 z$AI^%lhX`mAt?QuZkkUL{>aKY z_^tQ#SLFHDQ-0COsLDnXi)2-i?}lliZnl0HjAtqH;MOH74BW*IBsc*yDU;0ytNjG| zFk=fh`%n|7tm`I?W^{kc2yB;8@q4GYvNd7pW^2TEJ&p20RoNJxlFxdM+{#G&!cI39 z$il|+^Qh*d^2s+LZxVM`r&w6NWY;&>97V6(zl0Fqn_heTrH)u)I*cej0SmrCb59dD zb&LsyLzCrpR@F%n7Z3Iu-4K)fo!j|;>EqaTERU&`16}V3$rANJb@fB3>Ws6_^#%pIeDOuoC;*UJjT@B?Yv=q-u1VA>(3xsutld%Yg% z1{cr}wk(4_Ur=55LcKE+c@aF|V~Cx#un3`+J*12(a?#Pd8Fq#C*;S-Q(4&6Wdb0B> z?hOiznBZm|&-Nn`nod-`(q#QLtBoJDiZ_zk+Xv|<0nTH9Yw~ZSPMo%Sn)6Ok`smxp z+ZYBWBec{XYj=%I))C8O5RQTp97*&Y8Hn`9{wK_-WOv;=$c2qXSDz)9>z%5fnjGJn zNwz0-26~6pbs5!vwlzMN3YwRGXBz3cJ=+NBqE5-qwRg(lvPa{C&QiVmh6Q6aBLALR zQ>ea7En;B5()wzNOz}q)F>IWq@rx1}0~xrk1-=IPHoX->h{BO84-4$p{qh}c#8;2? z+1H6XB@uCDZC*=Zm=k%p7o@pv8BN%*lVfRItuNxGTkdNyP7KpS5J8=g?$2sd0|3Bw z?HlCvBb5x6DRX-XS*Nyydqf>A1A88wYh(y}oFrvA<_!ajG%jJB;{01fH2hOCvEp{X zWOUfqd+Am+q<-2%AUvd+BrBK0f%mmAf=pF`ig_7V*MTF@c$9a?2dPkrr|(7eXB1K) zMxAw>Wnx&S*UaNPHZ0e?UHj(tco?G9W9@2x)ywq*B--}^dl&2Zpn@CtM&=Gd)o+S> z6R5r_@WB#0hX#(BDvR^xg;1#e1{J>}!dP=BAaJ9wAMM?89;au{uY)ADt$O3qk3cVYtVCr)p;DE1|MN}7=TcyT0-_%A~gYNDG`c(UDs{i6r2T>j4hks`26_#e2z0qcvcAcU-|RIj0| zZhGzZCZHZXzLyPEbKgF^h>l*B6hl~4^%j!9yk-86D_JcW=I^S+@Ji71bFEQc-=2qm z3RBd6=1IqVL>It$NMu#D>H7NWWW>lP_hu>VKXQkCQ$QP@rESn&>&s}Cb;>8CjioM~ zH-CEc8)G&ZD;q>A#WsdG=c}(SOy|jJ9F0qzdi(skyC;Ep$X9tvc+ZxF>nExIBdAOW zeA3TzRh%*d)6!{W&;$V7-Myy8JQW3;@-3}mN^(XOu6(YUj#l)*nc`5-*o`w`alRK} zbBi-wWzzj$Yv}LJT!j^n*9M~m#`+_H^CB=T&E#2Y&%FTyuE5M4q7d2EVy~3&X9FHK ztEi^D=`440vPk8>=ee`WVtr;h?)KD(hoARFx};v+jt~zYU|Os;=)S{HHY7B|b?QqF zADS;2_-_e_u+W?^LslO+rUNsXd&4}+D)hzHTj_66$X{@sAuF{k)Pu10n=IQj)St8*?U$uKCxFBYz5?aU27K%4AZpZB8DM%ERIM7qvzNzhwHgmC~gSc{B&I(Fd+?( zK6s;RH?cnXQh{wD6tGC1LaCahcYU8M^BNyKJKMMYe1B;TqUhdX?LW-kY`5<#)Cs{W zq`<|aE)O3c4H^Ui5mVQjn*-1}kFe8g!w}do?;S2DI$Ecno6ccKxiuE|cbg0BeW(0E zjPGBi`&>uAczHk!;}8ifQ%d3Jv;_viZ(t;5K?6KvCcG`EZhsQdwQq7+F!b2Q#H1(? zhjJM07{_k1X7b@{&$;K6UCs3%b|j@qLW(|s#1e6uoFFl+75@n39bskkos1Mri}Zkg#L`B#S0OLX?mK^R+X~kWKrkED1YR-gYE&a$3J*k8 zxiP6y`V4;Jz?ykimYYxKBRlDA5)#Hhk%*%-GjZdX!g+m#x zBGU>g=wvj~ceI?(k?>|w!^_iCTX&mhU=EZA2tg(qRW3fAsM^DE3s5coC*ZG;gBE{s zruKUVd}+(8*vM1Gq88_`p|{yhY{nV>B+7CFW1EZm$$oqC1d4^U2u6k>(YHfeTar^* zU|H5sBnX?Bsbn^71V)v+CQ{rU+f&ngvq;ao)u7LW+ge{m_=9y9FN6EE-ZzjYgfT8c zdlolLyP__mA0wv)r_0J!D_{LHHay3<=_rc#ZhN4g7gzk(|A1f8g>)i6jiRlgW?MJ8 zK!(J;Oj1ALOMEHu2Ls*r5|`mx>8th33ECg$CZ|L0V2(8-(gQTlyv{j69@OS?VVQ%{PMwXWE0 z)u-}vR(d3kxc-)olMG0Kc8?oCV~M43KTe{*3cj*6lm)Is?na}pyhi046*f)9qE?wR zsB?b_g)ji>?^W1*@TX1w zEGle$Su%*bgFJb0E}6IRiSwG=t=Ub6?tI?VE;K8JOY0`Lrmh=rki$`B82(%cg_-Lb zDt#3aXp7&p)eJjuQeo4=)r8B%k$Bo?7KR-bsjy)NwibaivddTIFihhM2jF?a`H!a) zH6tjp`G9cALD)28|m#Z@crslRJDfc1) zYg`bF`DMJgI#IX0{~xhysGm5~Ik>+kX7wQI6%P28NDR^DO^R7#oRCo-G@ohk{a?WE z_jVNd*nM6Bkw%RnzXX*GLZa)VDXv%i7i)3KOA4kjU2ep_*hybc$$vzuY_NA<#WlOj zNW0=j==}+zLtrhyG>btFbnJo;LX3Wg>SPrqf-U%Xja*YGgL6MF{%Dq6> z?k9Z`J7Chd0e@e4$9l>IDffeEyXm6rpnLX3$}zW|UcfslNiY!(0x0qElRh;D2Dfdy z|C21_WSmr%KQG??1g->VlMEdSmO|NdQX}QylzwC(S8OI4(?g_mS4BYj)Mmt2t_FakLauKV6$YU=k2Fh{{^0sMGOJTIq@&?a>G@kJK zhFrKD39hL+$9kUs1Dx6T4wqK~#Ulzhh6gM8X=(m6aYkbBK%ZHbs2dvdfYS+Spy}&gSPLB_^0BQy;FvGz6ZnydxnOFVWigMsf)dG8?e=h1T zf7mV(WyBb5fKJQjuW%=7 zQTeL7T^7{r|5-9v)=98>h2;*oHp}~s#nQ)@-v><*zoNwPhAsNsI36!&4@QKrAFVf( zIYnI^ymEc#54Rd0id)MA9d2u=DA@vSP9nRmOobUP6s%z>@5^u#Q_C4LU057XOTYaS zqCD1JCH~{x)SgjU(%TjP`<;;NJx$4B_^-0d4I6|`zz2`z&+g+A9=)!XauOeT2Sdue zL#zxgSZbi(8K`oX)jCta3x~C>pRT$}zAPK?(B;1L2-;*2=aQgFVi33Td)h@;J-^sC zx!si|w4t!Q1YR81BSlaIuC|rCHFbD*mlti6CvOzbIHVlQF_!W=H_mufRPhTa6sxkmb9-z`@kp~u?VCf3^dG6M$ zyJGB*(z=LmL6xPW>fqziX$;3#ueZ(YG2v>Qb&{O!Li`{UeoQi|ceN^aVw8cm82Hl5 z7PZ(YT{^zab^~X4#V{C}?hQN~brRmp`xT;d&t_`U9^JAlw7>}Cf;c7 z3tgU2nRfdQ=&5LjMu`RSj*^0!)OSnV(n3nDgokKFkqxs#EH*#-i$ej&ZwZD=ow4s1*;F%Ia?VBVT9Dg2} zZ(uD>{mhl!O>}x7KT!DfkCcOf<1y0bbbq2!r0BZ-+nlX_{RJ*r=bBGLFO&rnlP}BU zpm5ZT3fmT%GyN-rbYKSY*7_Af7p6vYI2h!rxg*{>;0VE&N$P`DV43kob87RjN&Egn zMb#bC#J%y(i`$_-4OeArJ7}gY!2hzCK8+7#e}4O^IoP;Aw)a{3LFejXQ$P`m4v}~p zpm68N_>nV}EnV)+k587OR}if9larC&zRdJy>`!w)lBlwM*)d#0MH;$GGF2h|mG$Dx zOARWQbUlbN{{^!KtKgcTh<=Jo?EH+2*(7dn8MX1D4)~Fw9_V3+a!(vFs%+c*EhkO1 zd@)taEdrQo^;r3akRg9%a41vYnu?tt*CsAx3By-VS=XHcfJ90$B{b>@V#J`YA}=lo ztrQJQQ9buZ(%{A8qEfG^to?iN@>apNHF*7fbgl4vi0sa=VTq74lMMGAr@AE)eZODi zoi*0sa@$pwW%P1(A4U3{X@(4P5k!*g6C_=P{PpP@sPgwW#n*o}QfuT*RoVrSxqJw)+_w%6*p^;%v*hYi|)k*&zN+ZU?boHxHzb}59x476qE3-FsI zjRidEu(;=~zoV0Ad7bkAhOo14*GPIQh~dWup;^%t6N(n{Gg788`_~@a|NV6F!|F~+ z$Pl+L&e8+aGaINKBPAQi(|x}xUQi%Cp0bf^1un)SQdRxGzvNLr_2-twbH>XEM8`jvftsjP)+yIO6RmfXQY znQ6DfsBSNze75FJyI=V@O`*InfVZcG`)$9yi6x-$8V@31k)bCXZ(&yM7QG?y1 zEa&~ClbmypFu9b}45Vn$J%Dg6@3h!VXoo8m8-i+r>>Db~PeBgvO^R~`{I40BVUL!z zdymc6&g72XQ2R|EFb+S&3TMB3h+U%GjHQ-$BHdQR||jKQjlAUFCfP3a2Zb+ z%kL)dsH__H-(Q0~$F9|j0s@zXWaP|g=3}<)4kby&yf`Q1Evxc^Ofhhy5SVK*yLY(Y z=ufrKA*`Td4ueJS{F&a$Imon^?UrpbyVxW`n5aj9i`-Z$2r|2&+XRa|#^G{7t&+Kz z$+7E0G(lDBVN5&>Sq9meSdoFM%dR^OwlUu;)lEY0i#^EZRh-N>RtV*EGP0qVT2=ci zaj4xWhTlJVkCgqJM;&XAv_Xno7t!ZoIL**txbzNHKq&jyCKS)e`y!t{0FA7=_ZIl` z%Ls9O-5uA{nRR}%Yi!rIM=9Z+);o^B)IMDWYX@$&t)YxXk99)de~6tn8wrVi%ic5g zy3~p$U)GQ1*0rF%R~xQsuM98+GFnvSlMV??ckQkf$u*d@d)U{0bD9Pl4LD!u$q8`v zUsbL*1ym20aM#M_&fE-*3FwkCbNM<%O);wtQS6{kS*hCI%t(tC?#Gyag{acxH(}h6mN{v;$9EA=Y7d7L17i&|lVMfUV+`A_6maGA z#_FS1rKuaSVWCldHIyKuJ3MSa>dU|?a(nq6nf2;(BTxewtkt^;Tqf6KlA)W3yUF9b zcvf$&Gd~xM(<;Q1D27Cmy-4c^g3%X8HV4svu7nt3CTocrb}#fI`azTF9*(id2t-yH%Iq^bUJ(Z{Q)YOWHvI?wrYaTV`Q0ZQq=ty$?Fsv zno2A7H?WTU#%Z%UMl}UR>GSKvip{=sbltKy7ySV+e#2!qEENrLN|~^fO4jFMPR8CI zmN;!D1pv{62i+4h(8q9Rb*teB1Vh-h#g|?``kY7o(PZ=QRr)apx*I@ny{_bUt~IXp3- zfPOC;fnc<@zEhl&0ykSJYi^rmzbbC>SnjxKB*i^W)TR2tKS9#RN8CKNnA zeET2_ZCkz=7|{K8U@R`qja$C%g>pP&08*~QC~w12-=!j7YLA94Z1f{9COQV>vul15 zzvJ`}cYKle_Kp9I`P|1k0Up2Zn;{SsWP}H2)J^RdtgblB)$g!d*ypNjJLdBKEn47N z4f?tjT{h(2K|_-9Pw3@5svUsLVwHTz&{}c%-qp6cCSx>rKVgA5Z`SO=gvWG+7%0Fd zKF!^16pAw{-+k3P&}DY=&Fq|Ltp;b%mv~pMP{pHK!IpX0gM*Mn*RlQ=y{la}0D!PW zwNBR&!b-g(n+_!yU}wtd|2$SVeISG$Mv-1Embxn~~fqcE+v#ZId$}2#5;7br1UgZw9fx8fYT+46(7kpO39NMZe*t z^)Ut7-amZS*J=6s5dFDgvb%+c$qye!$Q4#44+)a01_L(f8e~?;hopz_<_-&(vyR(* ze}kxWp>F!Es5WfqKKC0FGHOVdnWX7-Bog;luW zOhUcLN$IQxI}pIqKXp@5tCXJs21&Owyi>d1mf;#1mo%?3!TWKboEuq#jHrEKb=fyS zOh8ng)o~(GQGwR4W8ksY#I{-TPNayVI2kueIKPMBBWZFed>%Rb$NMLIZvaNpXRFXh zmnqfhtQh;ZnWY=XI~Q1&=2%wxSlxV=8$QP`nQE`GClbh!t&#HD{Ztzv^zSKU^Z4Zm zVqzOzJxViscl-?8WGnh7^N#O!HtRP3B2#Y7Lyw*Z3wIg^fUVhDy+K6YU*BiJoG^LS zOBqC0YHu(+!OLQxQrGxo6SB~dq#{)7+QK9B5g6#+v>b82jZiuJ6mI5K)@8EGVFit2CiU{1j4Qs&p76c;CMfC3HWHh zI9SUQ62B-rM9yH_kc3Fiqb=H`{aB+`1*055V#asywClOre~nvVy#xoGKGKUU&dC4*G@B^sG&2>G`!f?!sAAPL zm2;SJ>+n>+K>}aII5=cXL$cvs4ZtIpg)u8a4%w!b-F6Ke)p?&T3ids&=MqBW@IdQ! zR0~WPb0~^SUw&ROsmn;U&d5#jbIe7f=Vfyq)W8k_LeqhEE4+}|vK-TbyrWSN!9dHX zCEFv~aqLV^6f1E#Vt%b}SU^`vt4)omnPPOPOY^tJZ<0bS5 zjWHhHS2LCrgj+A6ZW!Uy%WIUL-9>s z{l{$iNkMk7SiK&|27 zC<(L9!Icx|?g7?ZKrh0jr?evGQd#Vs2c6gN0+kZ6%6I=%ua! z+x_&-$_wP9l_r zdxuj&_kw|>R>7l%%$DhTGeZ_;>flfHZhB?H5%7qwHU;8Z5((q_~ZC9b!Iqvl;<5g z%qOyPEuAEo9^&1W3Ev%>gsde6^F7bbn0F@||0uhhOra`o$_wU&_(bU%cUJ#wLF-Ao zIg)b+ALtuQ6TS-~OzXWO?6s{AofPWDiNQ6PJo=NPDF+y8w2@+ZO#Exi&3+%%>p&}K znVnhen-rIkn<0)Kwcc0EOjeh7>js@r=@{t9_bM>lJUWT~4;YR^V%~Cqu<`8l+;~8t}h> zO!yqFvq**+730BNU)hNj`Xq^Wm1RE~cJ~|o89~IApuhD+&c`62L*Q?ykcf3%;X-bADx@1rgz3knz zrpZ(5?cV!Zf*?E#!R3ul*IlE+oNp{wUXT_N^okeUBc2v>P`7{*>xZ_uD zxk_0Lzd6;AA4#+n>8I%wN_o9)n1uV#3%S1><6ik>9pPD-TH^g;`%Vqk={+ zK^PoWOc53AxLhoB#Yu}!muCdtn_xHl1UiVjF}ZZRe36>#R1jgF!vcpb7&2IXm&4)w%Lrn0{kAh^HHM44B6k zM4(BKb+cy|vw)BFQ^=wD-fyLItEHmjQ!&L&{UrUumY1&YhVoUB*(MCkq<-#MPcWYyjEs`5oPIWFXW*q&mc@KYD^x^du;-*a z1GEQlLL)!Y?i0fD_-wBwFsffll#&`@B;ld*h!~JO?Y-+=PMp6|?9ldO{C(ddu5Q}N zpb}n+S%#lRC@U4P+UPue`u&Hf16weRJy^$u@OjWkAd{=raP1qT)qY?#HnrQ*U`u4~ zIC!gyFFmV@4vkDAf}$y9ekzmB(ViDmcv8wg3g*)syO}mnv%#0s>N~{$h7YG9;IlRT zmWp5~_I^EEKhKcWHCEh(nIl;}i}Wc{f$3ih&2^yN*3ec+djtFBlV_ z_{1Lm@sgQp{x3b|(JNVB1Sw`_H-0%N>BdgWPSq9ZyJ$Vv?Ppi;oK|R{P2DQ81kuhc z{bueYAsM1cU7Ac05shXNy~C;qRjr?Q+dB&=gFss>$Wd#%pGE)ug~c5TXrB$6Pedx- z*tzbkxA+Bey>plSy|Q*v$}a~8PwsqLnTDP-rK1GZ%b5(=$KzI5wUEh5W&q`z`c~wV6`d~_e%m> zd*HWueY)q9NFo%?di>e~S-5%AMELI&gqt8PyHPtoeuqQeq@9BuQ`#Z{CpPGM+^1V` zC3@e*F+1zo0$wcwoXu9P+8xjIMB>GRrhrl+h<}5pf3Nk+PK078ce#`FJR)MFrcVTa`;o66Ox9RW9Q>itHG*BXyBNIBd$>5vaQ>zBE};A^e*fHkQ>St9`e zbTZYE0+0qR?6GA&?c$Zqjf!_-4~qLs)>3asLshH$3#twy)i4$Ags_VdF}%pIxm71> zg;bT^+g3fU41g3EAk0Ff#;O$7zG?bOPO!L_Q2Zj`0AT$YVC=b9BK*adMbpr4 z>uT@bG_cOs@)<*p2)U&xZaxdDjszkVM09CaUraTm$1i0hEITO@Tz$^EDs@3gf?yqhBLG5p%_Lqh;$pxD>e5xP! zYEXYROZGR0)pihG^?SoSe1H5w$xi+LC@N&@+n-I&ilyMC8Wi~L6pd}qm7w^a zW8|GY1247h?ycrM@}K&h&iTpZm#D4HX4LLNJ&L@$8C2i@-pqV>@kRYsYE>o~zU!G_ zKzdpKaA$0PXTfWKa{-|iw9{hHDuVim9DBI7nMpR8klFuL|ImNBByXD&)g7R}qMLEi zd4|&t6=t_PX<=u*^~tSc6L~j%v3TgN%cb|iU@)R9Yn~~P`|6Q9a{HtOe^gZ&I%CAv zV>FLv!GJua6bH7^id+q{;l_GpJ~m{^_0EAV?`?ICg-rX`?Q{ynr`smcS?RC#q2%Ap(UN=9Mez`N(ISPCFV4%2@N*Q=dvlu%d108)q&ku8)zs6rt zDB_1_8~U-#NR|IktriavJ=3n>V-_c-u;$IC$%9+_HpQ3k=M`th$N2@;pcDYq1jyGw_Gdq^2JBl_cdmWx{LJ|#dlfFj24WxSe8tAG zq~25VSKdF19ZO=GWeONr^yua6N8`ZlHD`8ixt@}1FK#05*!D;`vRCr0rx#jTtf}ob zlwgGn6i>DnlTa&{Li)&=YZ*&PT9c*_`dENahvvv1y>C~V}pSNx+JBk%Rh?c{3+jhqW%};Wea4>q*jh42A z1f`1h8Yw5uxL|rlyuX86d-IB+;S;oWwU|r#gm0&kiwb^wuOR@Zye2)Yxl`x z^+^2{LYl68{AS}zj zt=;Sk7=74J@@zb9tY@r)lxg?~Z+{@Ae>!@3wC9d;$1>w{ikJwHqb%M}AGc+YO%=|} zElb-hSs}Nk%jBzGR)yAoam6php{$vmxxM%S0=JqzGCbeB^A0Ke`TN4(<9z!+QP(oa z@M+k^0-S5Qe2#@-3e#1>%?b4+CaGyo^Qz$E{O(e`m@0vg$PJO3`<7!D*C9nm{FDpT zcC}QE;gp_Q1ifKRFErUGsH@DyaCS~DvDbm*`eWH|K(E1ZCA6e=7}6j7pY1N zACkb17~L@>$RoFlHJ^_5be?U=ab(tCc_hvCD&b|<^x56|u)M^IYxWQLz^6HQ!+80I zcYNvkiSvA9T*8c)=byVNuWRoa`cz>R|H)j#I#p5mRG**jgG`}Z4V zR$qAZ{kL^`QGn08Br)D)ZQ9A7A(2p`=78ryD1#+;m^ zQX?AK-PQnfCJ1KQF^sNp?2E@z%4@Y<{x)f9Rliwlnf^0KQ%IOJw405!eSXWFg_TE1 zI#+!EHP9D0)I+-i#DmKpr=Y0acuw~-=1~!@g?KwY8YnZpnoFZiSgYD#CCDoekf_0C z#j_TL$%M-`aXpwy)y~uvBor|`?K*fCOUK{1{j$+FxREZkv%R-fF(wzHKkO#G8l{Ra z2(&C+RD@B|JSTVb1Z{|4*$>@X9qBuQU;C-KT*mobM7R~H=^c$Wu-G;mR0-oXed4m z^(NZVpQj@ffqO@N+)w}sjW;-bRK3;G1)CrWr>awT?%KM;p_u@3#-WveC5JH$vJJs( zxY+jpYW^m!$X?BKyF}yKswRfkIB3p#z?&1tycQY&F zRGTWVh2nvUSrdJ9z$>F;In4%# z5S2o;V3F>>E;5lMPxx}%b^cf2@w-%C8L&VHcvYMvQB;(Q9h}prH$u^kcGC49EHMLR zk%}S9;Z=O(Qc08N+6O%c*DJ$n6X$?P;Lv|H|L0243QGC^zy4R5st5nm*a1M=+5cTV ez4q-w57AUKSdPt|xB{mEKb