From 3807618620abf4fe9c5123161023b51c6065d6c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20H=C3=BCgel?= Date: Thu, 31 Oct 2024 14:24:28 +0000 Subject: [PATCH 1/3] Add UnaryUnion trait and impl This makes the unary unary union algorithm available to anything that can produce an iterator of Polygons (MultiPolygon, containers of Polygon) and enables on-demand multi-threaded unary unions with a wrapper. --- geo-types/CHANGES.md | 3 + geo-types/Cargo.toml | 2 +- geo/CHANGES.md | 4 + geo/Cargo.toml | 5 +- geo/src/algorithm/bool_ops/mod.rs | 180 ++++++++++++++++++++++++++++ geo/src/algorithm/bool_ops/tests.rs | 21 +++- geo/src/algorithm/mod.rs | 2 +- geo/src/lib.rs | 55 ++++----- 8 files changed, 239 insertions(+), 33 deletions(-) diff --git a/geo-types/CHANGES.md b/geo-types/CHANGES.md index 3937d89e2..a4e0cff6e 100644 --- a/geo-types/CHANGES.md +++ b/geo-types/CHANGES.md @@ -2,6 +2,9 @@ ## Unreleased +- Bumps rstar minimum version from 0.12.0 to 0.12.2 + - + ## 0.7.14 - POSSIBLY BREAKING: Minimum supported version of Rust (MSRV) is now 1.75 diff --git a/geo-types/Cargo.toml b/geo-types/Cargo.toml index 35890c329..af4f517e0 100644 --- a/geo-types/Cargo.toml +++ b/geo-types/Cargo.toml @@ -34,7 +34,7 @@ rstar_0_8 = { package = "rstar", version = "0.8", optional = true } rstar_0_9 = { package = "rstar", version = "0.9", optional = true } rstar_0_10 = { package = "rstar", version = "0.10", optional = true } rstar_0_11 = { package = "rstar", version = "0.11", optional = true } -rstar_0_12 = { package = "rstar", version = "0.12", optional = true } +rstar_0_12 = { package = "rstar", version = "0.12.2", optional = true } serde = { version = "1", optional = true, default-features = false, features = ["alloc", "derive"] } [dev-dependencies] diff --git a/geo/CHANGES.md b/geo/CHANGES.md index e33b422d8..647b57a6f 100644 --- a/geo/CHANGES.md +++ b/geo/CHANGES.md @@ -2,6 +2,10 @@ ## Unreleased +- Add Unary Union algorithm for fast union ops on adjacent / overlapping geometries + - + - Adds an optional dependency on Rayon (previously depended on by i_overlay) + - Bumps minimum rstar version to 0.12.2 - Loosen bounds on `RemoveRepeatedPoints` trait (`num_traits::FromPrimitive` isn't required) - diff --git a/geo/Cargo.toml b/geo/Cargo.toml index 6751fda26..cccdc15fd 100644 --- a/geo/Cargo.toml +++ b/geo/Cargo.toml @@ -17,9 +17,10 @@ default = ["earcutr", "spade", "multithreading"] use-proj = ["proj"] proj-network = ["use-proj", "proj/network"] use-serde = ["serde", "geo-types/serde"] -multithreading = ["i_overlay/allow_multithreading", "geo-types/multithreading"] +multithreading = ["i_overlay/allow_multithreading", "geo-types/multithreading", "dep:rayon"] [dependencies] +rayon = { version = "1.10.0", optional = true } earcutr = { version = "0.4.2", optional = true } spade = { version = "2.10.0", optional = true } float_next_after = "1.0.0" @@ -29,7 +30,7 @@ log = "0.4.11" num-traits = "0.2" proj = { version = "0.27.0", optional = true } robust = "1.1.0" -rstar = "0.12.0" +rstar = "0.12.2" serde = { version = "1.0", optional = true, features = ["derive"] } i_overlay = { version = "1.9.0, < 1.10.0", default-features = false } # co-erce the version of `home` used transitively by proj (via bindgen -> which -> home) diff --git a/geo/src/algorithm/bool_ops/mod.rs b/geo/src/algorithm/bool_ops/mod.rs index e0debd80a..25bbab6e2 100644 --- a/geo/src/algorithm/bool_ops/mod.rs +++ b/geo/src/algorithm/bool_ops/mod.rs @@ -10,9 +10,15 @@ use i_overlay::core::fill_rule::FillRule; use i_overlay::float::clip::FloatClip; use i_overlay::float::single::SingleFloatOverlay; use i_overlay::string::clip::ClipRule; +#[cfg(feature = "multithreading")] +use rayon::prelude::*; + pub use i_overlay_integration::BoolOpsNum; use crate::geometry::{LineString, MultiLineString, MultiPolygon, Polygon}; +use rstar::{ + primitives::CachedEnvelope, primitives::ObjectRef, ParentNode, RTree, RTreeNode, RTreeObject, +}; /// Boolean Operations on geometry. /// @@ -34,6 +40,12 @@ use crate::geometry::{LineString, MultiLineString, MultiPolygon, Polygon}; /// In particular, taking `union` with an empty geom should remove degeneracies /// and fix invalid polygons as long the interior-exterior requirement above is /// satisfied. +/// +/// # Performance +/// +/// For union operations on a collection of overlapping and / or adjacent [`Polygon`]s +/// (e.g. contained in a `Vec` or a [`MultiPolygon`]), using [`UnaryUnion`] will +/// yield far better performance. pub trait BooleanOps { type Scalar: BoolOpsNum; @@ -109,6 +121,106 @@ pub enum OpType { Xor, } +// Recursive algorithms can benefit from grouping those parameters which are constant over +// the whole algorithm to reduce the overhead of the recursive calls, in this case the single- +// and multi-threaded unary union tree traversals +#[derive(Debug)] +struct Ops { + init: I, + fold: F, + reduce: R, +} + +/// Efficient [BooleanOps::union] of adjacent / overlapping geometries +/// +/// For geometries with a high degree of overlap or adjacency +/// (for instance, merging a large contiguous area made up of many adjacent polygons) +/// this method will be orders of magnitude faster than a manual iteration and union approach. +pub trait UnaryUnion { + type Scalar: BoolOpsNum; + + /// Construct a tree of all the input geometries and progressively union them from the "bottom up" + /// + /// This is considerably more efficient than using e.g. `fold()` over an iterator of Polygons. + /// # Examples + /// + /// ``` + /// use geo::{BooleanOps, UnaryUnion}; + /// use geo::{MultiPolygon, polygon}; + /// let poly1 = polygon![ + /// (x: 0.0, y: 0.0), + /// (x: 4.0, y: 0.0), + /// (x: 4.0, y: 4.0), + /// (x: 0.0, y: 4.0), + /// (x: 0.0, y: 0.0), + /// ]; + /// let poly2 = polygon![ + /// (x: 4.0, y: 0.0), + /// (x: 8.0, y: 0.0), + /// (x: 8.0, y: 4.0), + /// (x: 4.0, y: 4.0), + /// (x: 4.0, y: 0.0), + /// ]; + /// let merged = &poly1.union(&poly2); + /// let mp = MultiPolygon(vec![poly1, poly2]); + /// // A larger single rectangle + /// let combined = mp.unary_union(); + /// assert_eq!(&combined, merged); + /// ``` + fn unary_union(self) -> MultiPolygon; +} + +// This function carries out a full post-order traversal of the tree, building up MultiPolygons from inside to outside. +// Though the operation is carried out via fold() over the tree iterator, there are two actual nested operations: +// "fold" operations on leaf nodes build up output MultiPolygons by adding Polygons to them via union and +// "reduce" operations on parent nodes combine these output MultiPolygons from leaf operations by recursion +fn bottom_up_fold_reduce(ops: &Ops, parent: &ParentNode) -> S +where + // This operation only requires two types: output (S) and input (T) + T: RTreeObject, + // Because this is a fold operation, we need to initialise a "container" to which we'll be adding using union. + // The output of a union op is a MultiPolygon. + I: Fn() -> S, + // The meat of the fold op is unioning input borrowed leaf Polygons into an output MultiPolygon. + F: Fn(S, &T) -> S, + // Parent nodes require us to process their child nodes to produce a MultiPolygon. We do this recursively. + // This is a reduce op so there's no need for an init value and the two inputs must have the same type: MultiPolygon + R: Fn(S, S) -> S, +{ + parent + .children() + .iter() + .fold((ops.init)(), |accum, child| match child { + RTreeNode::Leaf(value) => (ops.fold)(accum, value), + RTreeNode::Parent(parent) => { + let value = bottom_up_fold_reduce(ops, parent); + (ops.reduce)(accum, value) + } + }) +} + +fn par_bottom_up_fold_reduce(ops: &Ops, parent: &ParentNode) -> S +where + T: RTreeObject, + RTreeNode: Send + Sync, + S: Send, + I: Fn() -> S + Send + Sync, + F: Fn(S, &T) -> S + Send + Sync, + R: Fn(S, S) -> S + Send + Sync, +{ + parent + .children() + .into_par_iter() + .fold(&ops.init, |accum, child| match child { + RTreeNode::Leaf(value) => (ops.fold)(accum, value), + RTreeNode::Parent(parent) => { + let value = par_bottom_up_fold_reduce(ops, parent); + (ops.reduce)(accum, value) + } + }) + .reduce(&ops.init, &ops.reduce) +} + impl BooleanOps for Polygon { type Scalar = T; @@ -124,3 +236,71 @@ impl BooleanOps for MultiPolygon { self.iter().flat_map(BooleanOps::rings) } } + +impl<'a, T, Boppable, BoppableCollection> UnaryUnion for &'a BoppableCollection +where + T: BoolOpsNum, + Boppable: BooleanOps + RTreeObject + 'a, + &'a BoppableCollection: IntoIterator, +{ + type Scalar = T; + + fn unary_union(self) -> MultiPolygon { + // these three functions drive the union operation + let init = || MultiPolygon::::new(vec![]); + let fold = |mut accum: MultiPolygon, + poly: &CachedEnvelope>| + -> MultiPolygon { + accum = accum.union(&***poly); + accum + }; + let reduce = |accum1: MultiPolygon, accum2: MultiPolygon| -> MultiPolygon { + accum1.union(&accum2) + }; + let rtree = RTree::bulk_load( + self.into_iter() + .map(|p| CachedEnvelope::new(ObjectRef::new(p))) + .collect(), + ); + let ops = Ops { init, fold, reduce }; + bottom_up_fold_reduce(&ops, rtree.root()) + } +} + +#[cfg(feature = "multithreading")] +/// Wrapper type which signals to algorithms operating on `T` that utilizing parallelism might be viable. +pub struct AllowMultithreading(pub T); + +#[cfg(feature = "multithreading")] +impl<'a, T, Boppable, BoppableCollection> UnaryUnion for AllowMultithreading<&'a BoppableCollection> +where + T: BoolOpsNum + Send, + Boppable: BooleanOps + RTreeObject + 'a + Send + Sync, + ::Envelope: Send + Sync, + &'a BoppableCollection: IntoParallelIterator, +{ + type Scalar = T; + + fn unary_union(self) -> MultiPolygon { + // these three functions drive the union operation + let init = || MultiPolygon::::new(vec![]); + let fold = |mut accum: MultiPolygon, + poly: &CachedEnvelope>| + -> MultiPolygon { + accum = accum.union(&***poly); + accum + }; + let reduce = |accum1: MultiPolygon, accum2: MultiPolygon| -> MultiPolygon { + accum1.union(&accum2) + }; + let rtree = RTree::bulk_load( + self.0 + .into_par_iter() + .map(|p| CachedEnvelope::new(ObjectRef::new(p))) + .collect(), + ); + + let ops = Ops { init, fold, reduce }; + par_bottom_up_fold_reduce(&ops, rtree.root()) + } +} diff --git a/geo/src/algorithm/bool_ops/tests.rs b/geo/src/algorithm/bool_ops/tests.rs index ffc4c059a..2951ad710 100644 --- a/geo/src/algorithm/bool_ops/tests.rs +++ b/geo/src/algorithm/bool_ops/tests.rs @@ -1,7 +1,24 @@ -use super::BooleanOps; -use crate::{wkt, Convert, MultiPolygon, Relate}; +use super::{BooleanOps, UnaryUnion}; +use crate::{wkt, Convert, MultiPolygon, Polygon, Relate}; use wkt::ToWkt; +#[test] +fn test_unary_union() { + let poly1: Polygon = wkt!(POLYGON((204.0 287.0,203.69670020700084 288.2213844497616,200.38308697914755 288.338793163584,204.0 287.0))); + let poly2: Polygon = wkt!(POLYGON((210.0 290.0,204.07584923592933 288.2701221108328,212.24082541367974 285.47846008552216,210.0 290.0))); + let poly3: Polygon = wkt!(POLYGON((211.0 292.0,202.07584923592933 288.2701221108328,212.24082541367974 285.47846008552216,210.0 290.0))); + + let polys = vec![poly1.clone(), poly2.clone(), poly3.clone()]; + let poly_union = polys.unary_union(); + assert_eq!(poly_union.0.len(), 1); + + let multi_poly_12 = MultiPolygon::new(vec![poly1.clone(), poly2.clone()]); + let multi_poly_3 = MultiPolygon::new(vec![poly3]); + let multi_polys = vec![multi_poly_12.clone(), multi_poly_3.clone()]; + let multi_poly_union = multi_polys.unary_union(); + assert_eq!(multi_poly_union.0.len(), 1); +} + #[test] fn jts_test_overlay_la_1() { // From TestOverlayLA.xml test case with description "mLmA - A and B complex, overlapping and touching #1" diff --git a/geo/src/algorithm/mod.rs b/geo/src/algorithm/mod.rs index 6f92320cf..7c1bf0d10 100644 --- a/geo/src/algorithm/mod.rs +++ b/geo/src/algorithm/mod.rs @@ -8,7 +8,7 @@ pub use area::Area; /// Boolean Ops such as union, xor, difference. pub mod bool_ops; -pub use bool_ops::{BooleanOps, OpType}; +pub use bool_ops::{BooleanOps, OpType, UnaryUnion}; /// Calculate the bounding rectangle of a `Geometry`. pub mod bounding_rect; diff --git a/geo/src/lib.rs b/geo/src/lib.rs index 0d1cde38f..c28ebe2a5 100644 --- a/geo/src/lib.rs +++ b/geo/src/lib.rs @@ -4,7 +4,7 @@ //! //! # Types //! -//! - **[`Coord`]**: A two-dimensional coordinate. All geometry types are composed of [`Coord`]s, though [`Coord`] itself is not a [`Geometry`] type. +//! - **[`Coord`]**: A two-dimensional coordinate. All geometry types are composed of [`Coord`]s, though [`Coord`] itself is not a [`Geometry`] type //! - **[`Point`]**: A single point represented by one [`Coord`] //! - **[`MultiPoint`]**: A collection of [`Point`]s //! - **[`Line`]**: A line segment represented by two [`Coord`]s @@ -67,7 +67,8 @@ //! //! ## Boolean Operations //! -//! - **[`BooleanOps`]**: combine or split (Multi)Polygons using intersecton, union, xor, or difference operations. +//! - **[`BooleanOps`]**: Combine or split (Multi)Polygons using intersecton, union, xor, or difference operations +//! - **[`UnaryUnion`]**: Efficient union of a collection of adjacent or overlapping [`Polygon`] or [`MultiPolygon`]s //! //! ## Outlier Detection //! @@ -86,7 +87,7 @@ //! - **[`ClosestPoint`]**: Find the point on a geometry //! closest to a given point //! - **[`HaversineClosestPoint`]**: Find the point on a geometry -//! closest to a given point on a sphere using spherical coordinates and lines being great arcs. +//! closest to a given point on a sphere using spherical coordinates and lines being great arcs //! - **[`IsConvex`]**: Calculate the convexity of a //! [`LineString`] //! - **[`LineInterpolatePoint`]**: @@ -105,14 +106,14 @@ //! - **[`Intersects`]**: Calculate if a geometry intersects //! another geometry //! - **[`line_intersection`]**: Calculates the -//! intersection, if any, between two lines. +//! intersection, if any, between two lines //! - **[`Relate`]**: Topologically relate two geometries based on -//! [DE-9IM](https://en.wikipedia.org/wiki/DE-9IM) semantics. -//! - **[`Within`]**: Calculate if a geometry lies completely within another geometry. +//! [DE-9IM](https://en.wikipedia.org/wiki/DE-9IM) semantics +//! - **[`Within`]**: Calculate if a geometry lies completely within another geometry //! //! ## Triangulation //! -//! - **[`TriangulateEarcut`](triangulate_earcut)**: Triangulate polygons using the earcut algorithm. Requires the `"earcutr"` feature, which is enabled by default. +//! - **[`TriangulateEarcut`](triangulate_earcut)**: Triangulate polygons using the earcut algorithm. Requires the `"earcutr"` feature, which is enabled by default //! //! ## Winding //! @@ -151,24 +152,24 @@ //! //! ## Conversion //! -//! - **[`Convert`]**: Convert (infalliby) the type of a geometry’s coordinate value -//! - **[`TryConvert`]**: Convert (falliby) the type of a geometry’s coordinate value -//! - **[`ToDegrees`]**: Radians to degrees coordinate transforms for a given geometry. -//! - **[`ToRadians`]**: Degrees to radians coordinate transforms for a given geometry. +//! - **[`Convert`]**: Convert (infalliby) the numeric type of a geometry’s coordinate value +//! - **[`TryConvert`]**: Convert (falliby) the numeric type of a geometry’s coordinate value +//! - **[`ToDegrees`]**: Radians to degrees coordinate transforms for a given geometry +//! - **[`ToRadians`]**: Degrees to radians coordinate transforms for a given geometry //! //! ## Miscellaneous //! //! - **[`Centroid`]**: Calculate the centroid of a geometry -//! - **[`ChaikinSmoothing`]**: Smoothen `LineString`, `Polygon`, `MultiLineString` and `MultiPolygon` using Chaikin's algorithm. +//! - **[`ChaikinSmoothing`]**: Smoothen `LineString`, `Polygon`, `MultiLineString` and `MultiPolygon` using Chaikin's algorithm //! - **[`proj`]**: Project geometries with the `proj` crate (requires the `use-proj` feature) -//! - **[`LineStringSegmentize`]**: Segment a LineString into `n` segments. -//! - **[`LineStringSegmentizeHaversine`]**: Segment a LineString using Haversine distance. -//! - **[`Transform`]**: Transform a geometry using Proj. -//! - **[`RemoveRepeatedPoints`]**: Remove repeated points from a geometry. +//! - **[`LineStringSegmentize`]**: Segment a LineString into `n` segments +//! - **[`LineStringSegmentizeHaversine`]**: Segment a LineString using Haversine distance +//! - **[`Transform`]**: Transform a geometry using Proj +//! - **[`RemoveRepeatedPoints`]**: Remove repeated points from a geometry //! //! # Spatial Indexing //! -//! `geo` geometries (`Point`, `Line`, `LineString`, `Polygon`) can be used with the [rstar](https://docs.rs/rstar/0.12.0/rstar/struct.RTree.html#usage) +//! `geo` geometries ([`Point`], [`Line`], [`LineString`], [`Polygon`], [`MultiPolygon`]) can be used with the [rstar](https://docs.rs/rstar/0.12.0/rstar/struct.RTree.html#usage) //! R*-tree crate for fast distance and nearest-neighbour queries. Multi- geometries can be added to the tree by iterating over //! their members and adding them. Note in particular the availability of the [`bulk_load`](https://docs.rs/rstar/0.12.0/rstar/struct.RTree.html#method.bulk_load) //! method and [`GeomWithData`](https://docs.rs/rstar/0.12.0/rstar/primitives/struct.GeomWithData.html) struct. @@ -178,22 +179,22 @@ //! The following optional [Cargo features] are available: //! //! - `earcutr`: -//! - Enables the `earcutr` crate, which provides triangulation of polygons using the earcut algorithm. -//! - ☑ Enabled by default. +//! - Enables the `earcutr` crate, which provides triangulation of polygons using the earcut algorithm +//! - ☑ Enabled by default //! - `proj-network`: -//! - Enables [network grid] support for the [`proj` crate]. +//! - Enables [network grid] support for the [`proj` crate] //! - After enabling this feature, [further configuration][proj crate file download] is required to use the network grid. -//! - ☐ Disabled by default. +//! - ☐ Disabled by default //! - `use-proj`: //! - Enables coordinate conversion and transformation of `Point` geometries using the [`proj` crate] -//! - ☐ Disabled by default. +//! - ☐ Disabled by default //! - `use-serde`: -//! - Allows geometry types to be serialized and deserialized with [Serde]. -//! - ☐ Disabled by default. +//! - Allows geometry types to be serialized and deserialized with [Serde] +//! - ☐ Disabled by default //! - `multithreading`: -//! - Enables multithreading support for the `i_overlay` crate (via Rayon), and activates the `multithreading` flag -//! in `geo-types`, enabling multi-threaded iteration over `Multi*` geometries. -//! - ☑ Enabled by default. +//! - Enables multithreading support (via Rayon), and activates the `multithreading` flag +//! in `geo-types`, enabling multi-threaded iteration over `Multi*` geometries +//! - ☑ Enabled by default //! //! # Ecosystem //! From 456c794676541884cc3cbe035c53f2741b9c6f3d Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Tue, 17 Dec 2024 09:33:20 -0800 Subject: [PATCH 2/3] unary_union via "simplification" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also adds a test for the multithread vs. serial discrepancy. Time elapsed (naive): 28.34ms Time elapsed (serial recursive): 4.72ms Time elapsed (multithreaded recursive): 2.93ms Time elapsed (simplification): 165.13µs This test uses our existing nl_plots test fixture as input, projected from lng/lat to a local euclidean projection. I also ran a test with @urschrei's 72MB parcels.wkt and got similar results (though linearly larger, which makes sense given the much larger dataset): Time elapsed (naive): I gave up after waiting 10 minutes. Time elapsed (serial recursive): 6.15s Time elapsed (multithreaded recursive): 1.62s Time elapsed (simplification): 333.45ms --- .../fixtures/nl_plots_epsg_28992.wkt | 1 + geo-test-fixtures/src/lib.rs | 10 +- geo/benches/coordinate_position.rs | 2 +- geo/benches/intersection.rs | 8 +- geo/benches/prepared_geometry.rs | 4 +- geo/src/algorithm/bool_ops/mod.rs | 266 ++++++------------ geo/src/algorithm/bool_ops/tests.rs | 76 ++++- geo/src/algorithm/mod.rs | 4 +- geo/src/lib.rs | 4 +- 9 files changed, 179 insertions(+), 196 deletions(-) create mode 100644 geo-test-fixtures/fixtures/nl_plots_epsg_28992.wkt diff --git a/geo-test-fixtures/fixtures/nl_plots_epsg_28992.wkt b/geo-test-fixtures/fixtures/nl_plots_epsg_28992.wkt new file mode 100644 index 000000000..79409ad41 --- /dev/null +++ b/geo-test-fixtures/fixtures/nl_plots_epsg_28992.wkt @@ -0,0 +1 @@ +MULTIPOLYGON(((165810.88331013816 481105.4135319523,165805.03924028226 481087.31955796864,165827.0243031839 481080.140574016,165835.492344386 481077.4156058137,165841.32134709298 481095.4945620494,165810.88331013816 481105.4135319523)),((165841.32134709298 481095.4945620494,165847.1513999863 481113.57252679195,165816.684352003 481123.520548419,165810.88331013816 481105.4135319523,165841.32134709298 481095.4945620494)),((165816.684352003 481123.520548419,165847.1513999863 481113.57252679195,165854.20752218604 481135.45653249667,165823.73143364282 481145.3844633131,165816.684352003 481123.520548419)),((165833.25349588718 481161.17546683183,165834.20445387694 481160.8674610125,165842.05346714336 481158.3225058388,165847.36754182985 481174.9205297333,165851.94157576005 481189.0094869923,165843.1235316795 481191.85549232556,165837.11053207144 481173.1655096956,165833.25349588718 481161.17546683183)),((165837.1465972164 481232.7994343237,165832.3686351562 481234.366448736,165830.64859399022 481234.9194398026,165827.27456949902 481224.218452369,165823.10456946667 481211.45945178793,165829.60356585556 481209.3654743581,165837.1465972164 481232.7994343237)),((165837.1465972164 481232.7994343237,165838.33361808676 481236.48543613846,165827.8525865298 481239.8724551546,165826.6675734102 481236.20047952776,165830.64859399022 481234.9194398026,165832.3686351562 481234.366448736,165837.1465972164 481232.7994343237)),((165851.94157576005 481189.0094869923,165847.36754182985 481174.9205297333,165842.05346714336 481158.3225058388,165850.60753492877 481155.55046525295,165856.1815873062 481173.1014900736,165857.05258033366 481175.793547097,165859.00158758258 481181.6654534509,165860.50362192755 481186.2464934498,165851.94157576005 481189.0094869923)),((165854.44664577578 481227.21249125793,165846.93358080686 481203.7654415951,165854.2025963923 481201.4225106706,165855.32264947437 481205.11148452404,165858.10862015767 481213.5774607407,165861.72971818765 481224.8815075602,165859.98968400923 481225.4384499416,165854.44664577578 481227.21249125793)),((165838.33361808676 481236.48543613846,165838.56360882698 481237.1954718372,165840.09366832077 481236.7153893235,165848.1937031559 481261.8054207434,165793.46357298896 481279.5453289056,165785.32353432756 481254.3953284019,165786.98351243007 481253.8653332394,165786.7535148305 481253.1554111886,165797.33956570356 481249.73437673337,165798.77555773532 481249.27043149626,165804.22552325492 481247.50836312154,165812.5765474452 481244.8093578957,165820.9275807907 481242.11036678863,165826.3776279051 481240.34943564463,165827.8525865298 481239.8724551546,165838.33361808676 481236.48543613846)),((165866.8946775674 481227.2614635345,165855.62366086923 481230.8854573256,165854.44664577578 481227.21249125793,165859.98968400923 481225.4384499416,165861.72971818765 481224.8815075602,165865.69470760453 481223.61247728474,165866.63470314653 481226.45244678966,165866.8946775674 481227.2614635345)),((165834.9897973112 481314.85237311217,165843.37386738468 481340.70629521617,165834.53086462567 481343.55537642253,165826.1607530206 481317.7223063045,165834.9897973112 481314.85237311217)),((165843.37386738468 481340.70629521617,165834.9897973112 481314.85237311217,165843.82383160238 481311.9813540052,165852.23086611537 481337.8533663467,165843.37386738468 481340.70629521617)),((165826.1607530206 481317.7223063045,165817.33076423616 481320.5923644494,165809.32371226288 481323.19531513343,165809.09371874726 481322.4553506549,165807.4537167706 481322.99528463103,165799.3436366324 481297.8053805152,165854.04375129592 481280.1453590037,165862.18384853032 481305.2454062637,165860.56385632814 481305.7653391327,165860.79386263408 481306.4653622439,165852.74684928128 481309.0813951317,165843.82383160238 481311.9813540052,165834.9897973112 481314.85237311217,165826.1607530206 481317.7223063045)),((165856.84086455274 481321.967319789,165861.07293261477 481335.00531610136,165852.23086611537 481337.8533663467,165843.82383160238 481311.9813540052,165852.74684928128 481309.0813951317,165853.9738187968 481312.8804221144,165856.84086455274 481321.967319789)),((165827.9150598663 481472.76617049647,165832.06707809644 481458.72118103574,165834.7140592224 481449.70024741895,165834.85802961228 481449.74317757157,165836.22904270093 481445.12527897663,165844.7631001899 481447.63422229275,165839.82106861868 481464.42724634655,165836.6310674592 481475.3272369474,165827.9150598663 481472.76617049647)),((165845.2901032648 481477.87217160105,165836.6310674592 481475.3272369474,165839.82106861868 481464.42724634655,165844.7631001899 481447.63422229275,165853.2880852939 481450.14126894844,165851.9171189479 481454.76227839023,165852.06109124355 481454.8042076756,165849.44014112678 481463.8181797485,165845.2901032648 481477.87217160105)),((165859.0901429811 481451.847246296,165857.7221495504 481456.47827446036,165855.10815529912 481465.4872519917,165852.2621572328 481475.0532652427,165850.94713900573 481479.5352067781,165845.2901032648 481477.87217160105,165849.44014112678 481463.8181797485,165852.06109124355 481454.8042076756,165851.9171189479 481454.76227839023,165853.2880852939 481450.14126894844,165859.0901429811 481451.847246296)),((165859.0901429811 481451.847246296,165864.89212849856 481453.5532303068,165863.52718054497 481458.19227461156,165863.38416540896 481458.1492344596,165860.74618647926 481467.1472523947,165857.91919632955 481476.7151957553,165855.13816786418 481475.8981865053,165853.82416749134 481480.38124216447,165850.94713900573 481479.5352067781,165852.2621572328 481475.0532652427,165855.10815529912 481465.4872519917,165857.7221495504 481456.47827446036,165859.0901429811 481451.847246296)),((165845.2901032648 481477.87217160105,165850.94713900573 481479.5352067781,165853.82416749134 481480.38124216447,165864.26622637178 481483.4501794296,165851.18822609202 481527.8531666835,165823.56413966522 481519.7282063275,165825.61514416043 481512.7781425044,165827.14610558908 481507.58913941676,165828.6791265633 481502.39513447497,165830.20212846796 481497.23215074255,165830.97413562768 481494.6171360007,165831.73209434262 481492.0351359933,165833.24713194987 481486.86924293207,165834.77111099343 481481.66921192576,165836.6310674592 481475.3272369474,165845.2901032648 481477.87217160105)),((165730.21619993297 481708.4439375155,165742.92118772503 481665.2739500047,165786.68302267324 481516.58014388575,165856.23329322916 481537.0501121804,165799.76645236128 481728.91290228424,165730.21619993297 481708.4439375155),(165746.97817681843 481678.1249967319,165739.51720045673 481703.3929706164,165748.98228750372 481706.1839397019,165754.16228786216 481707.71197579463,165759.34330791573 481709.2399082823,165764.5213269664 481710.7669495632,165769.70131799649 481712.29489069746,165774.88035331282 481713.8219450789,165780.06040613883 481715.3498972343,165785.24938222612 481716.87998835195,165793.0064036057 481719.1679565437,165800.49241780592 481693.8509380728,165800.76337957833 481692.93493719323,165802.38537803394 481693.4000103697,165830.76330596063 481597.13106763444,165829.1522768488 481596.65610686253,165829.66733507172 481594.80413330207,165836.8522983434 481570.4530650798,165783.23205589326 481554.6271463925,165776.42312722164 481578.01311732817,165775.83611402218 481579.7920612626,165773.39511176312 481588.10706181667,165771.791149101 481593.5750843673,165770.18610154392 481599.0419924757,165768.58214810936 481604.5090147985,165766.97710735357 481609.97603531193,165765.37316096094 481615.44305877335,165763.76812530853 481620.9109705391,165761.39818000598 481628.9870259021,165759.00317022737 481637.1490350176,165757.3981507424 481642.6159476773,165755.7941550114 481648.0839757768,165754.18914232866 481653.55100084655,165752.58515606486 481659.0179174441,165750.98021860325 481664.4849438074,165749.3761709623 481669.95197266684,165746.97817681843 481678.1249967319)),((165764.62994572392 481000.72964452335,165770.60704551917 481019.56454185536,165757.8109932328 481023.6556331221,165749.7149720541 481026.265607322,165742.755978062 481028.52258053963,165738.16194859543 481014.2605593478,165736.62288285774 481009.4805378496,165764.5559616496 481000.51162832347,165764.62994572392 481000.72964452335)),((165780.9100788994 481051.4195472039,165753.04303926002 481060.4275618781,165750.7440165607 481053.2945383054,165746.13098868445 481038.97950592457,165773.96205107903 481030.0095373427,165780.9100788994 481051.4195472039)),((165764.39215046004 481095.6485469322,165768.84218902295 481109.45854900277,165752.09916741413 481114.8585235,165739.06214865297 481119.03948478634,165734.55407641333 481105.2304959504,165745.858077976 481101.5475506689,165752.5161283254 481099.4205502416,165764.39215046004 481095.6485469322)),((165739.06214865297 481119.03948478634,165752.09916741413 481114.8585235,165768.84218902295 481109.45854900277,165773.7592437802 481124.71645183617,165744.0691597118 481134.3254810618,165739.06214865297 481119.03948478634)),((165760.15524713008 481165.29146753036,165754.1621837003 481146.74349274713,165752.64022651344 481141.99243090645,165762.91820267861 481138.67746517947,165764.86823752327 481144.76151637506,165767.0322865295 481151.4134816525,165770.4322916698 481161.9774055011,165760.15524713008 481165.29146753036)),((165770.4322916698 481161.9774055011,165767.0322865295 481151.4134816525,165764.86823752327 481144.76151637506,165762.91820267861 481138.67746517947,165773.19626086665 481135.36252099246,165774.72427119376 481140.1124897321,165778.90532097794 481153.0484925419,165780.70934980048 481158.6634761236,165770.4322916698 481161.9774055011)),((165754.46226726277 481186.5204745377,165763.1913428137 481183.7123919793,165767.25433634454 481196.3463805137,165770.48439554079 481206.6294380334,165772.96339762883 481214.47740331833,165764.23735355845 481217.29337498534,165763.0663964398 481213.4674561492,165760.05733901297 481203.9214529135,165754.46226726277 481186.5204745377)),((165763.1913428137 481183.7123919793,165771.9203620799 481180.90343458427,165777.4883933551 481198.2974753085,165780.52041607565 481207.835417028,165781.69040843003 481211.6604477769,165772.96339762883 481214.47740331833,165770.48439554079 481206.6294380334,165767.25433634454 481196.3463805137,165763.1913428137 481183.7123919793)),((165767.94046532223 481255.0803727385,165762.39442858525 481256.88432944176,165760.70244359746 481257.4293949917,165758.18439427088 481249.7603739864,165757.21740785558 481246.7643741759,165754.35638811823 481237.780357234,165753.1123999269 481233.956395535,165760.36338960959 481231.6154014575,165767.94046532223 481255.0803727385)),((165767.94046532223 481255.0803727385,165769.13344454192 481258.7753833276,165757.8784395208 481262.4083133824,165756.68945809107 481258.72132523236,165760.70244359746 481257.4293949917,165762.39442858525 481256.88432944176,165767.94046532223 481255.0803727385)),((165752.72879604952 481450.6481872374,165753.01780734822 481449.7111945327,165754.03076075122 481446.2682207337,165756.9037671212 481436.61820636754,165759.5297725321 481427.5911792049,165760.87376458934 481423.0161490942,165766.68378131933 481424.7281545481,165765.33678659622 481429.30217518256,165765.1928150116 481429.2592470541,165762.5888224881 481438.28620799293,165758.38179191307 481452.3162255302,165752.72879604952 481450.6481872374)),((165758.38179191307 481452.3162255302,165762.5888224881 481438.28620799293,165765.1928150116 481429.2592470541,165765.33678659622 481429.30217518256,165766.68378131933 481424.7281545481,165775.2168089457 481427.24120325147,165772.145797014 481437.6892057502,165770.32284964234 481444.0061394648,165767.09185403027 481454.8851670778,165758.38179191307 481452.3162255302)),((165767.09185403027 481454.8851670778,165770.32284964234 481444.0061394648,165772.145797014 481437.6892057502,165775.2168089457 481427.24120325147,165783.75084868493 481429.75515904836,165782.39683007967 481434.32315151556,165782.5408714928 481434.36519018246,165779.88083834152 481443.37722162984,165775.75088814163 481457.4322048577,165767.09185403027 481454.8851670778)),((165759.97295779423 481542.59013106796,165751.349929424 481540.0420859427,165754.23096464516 481530.2160663096,165755.90595991243 481524.44010320725,165758.41391373967 481516.0321128274,165767.04893821903 481518.56806844496,165763.34993966614 481531.07709912147,165760.82300474338 481539.71614134696,165759.97295779423 481542.59013106796)),((165766.5320427976 481558.5590362891,165738.95195147427 481550.44109771407,165739.22793669422 481549.5020729691,165740.56592901776 481544.9660771371,165743.769969775 481545.91612452094,165768.14401146414 481553.08012593735,165766.5320427976 481558.5590362891)),((165770.3300088621 481545.6511190906,165768.14401146414 481553.08012593735,165743.769969775 481545.91612452094,165740.56592901776 481544.9660771371,165742.76593479898 481537.5050447366,165751.349929424 481540.0420859427,165759.97295779423 481542.59013106796,165770.3300088621 481545.6511190906)),((165770.3300088621 481545.6511190906,165759.97295779423 481542.59013106796,165760.82300474338 481539.71614134696,165763.34993966614 481531.07709912147,165767.04893821903 481518.56806844496,165777.35402061223 481521.5951332937,165770.3300088621 481545.6511190906)),((165759.94208684235 481081.8385492149,165764.39215046004 481095.6485469322,165752.5161283254 481099.4205502416,165745.858077976 481101.5475506689,165734.55407641333 481105.2304959504,165730.10002995466 481091.43053018703,165759.94208684235 481081.8385492149)),((165755.3420530924 481067.5615879822,165759.94208684235 481081.8385492149,165730.10002995466 481091.43053018703,165725.50401482623 481077.15149142453,165755.3420530924 481067.5615879822)),((165753.04303926002 481060.4275618781,165755.3420530924 481067.5615879822,165725.50401482623 481077.15149142453,165720.882987899 481062.85448954423,165750.7440165607 481053.2945383054,165753.04303926002 481060.4275618781)),((165746.13098868445 481038.97950592457,165750.7440165607 481053.2945383054,165720.882987899 481062.85448954423,165716.31991080538 481048.61158124864,165746.13098868445 481038.97950592457)),((165760.2829465038 480980.82661333535,165766.48497205196 481000.12763493793,165764.62994572392 481000.72964452335,165764.5559616496 481000.51162832347,165736.62288285774 481009.4805378496,165733.55590598722 480999.96057572326,165730.4898739962 480990.4396163693,165760.2829465038 480980.82661333535)),((165752.64022651344 481141.99243090645,165754.1621837003 481146.74349274713,165760.15524713008 481165.29146753036,165749.87821666626 481168.6054396765,165746.4742134789 481158.04341274337,165744.30618292658 481151.3924491705,165742.36219818195 481145.3064164967,165752.64022651344 481141.99243090645)),((165739.60024764334 481171.918429759,165733.6001518292 481153.37447009963,165732.07517469442 481148.62440939253,165742.36219818195 481145.3064164967,165744.30618292658 481151.3924491705,165746.4742134789 481158.04341274337,165749.87821666626 481168.6054396765,165739.60024764334 481171.918429759)),((165754.46226726277 481186.5204745377,165760.05733901297 481203.9214529135,165763.0663964398 481213.4674561492,165764.23735355845 481217.29337498534,165755.51036490736 481220.10935998964,165749.8103211655 481201.9753728406,165745.73224516274 481189.3294605534,165754.46226726277 481186.5204745377)),((165745.73224516274 481189.3294605534,165749.8103211655 481201.9753728406,165755.51036490736 481220.10935998964,165746.78331805518 481222.92536026856,165745.61234685374 481219.1003356426,165742.59732487198 481209.55544268835,165737.0032581936 481192.1373515939,165745.73224516274 481189.3294605534)),((165757.8784395208 481262.4083133824,165756.43242557545 481262.8753640524,165751.8144077858 481248.50834933895,165747.66039481142 481235.71740314807,165753.1123999269 481233.956395535,165754.35638811823 481237.780357234,165757.21740785558 481246.7643741759,165758.18439427088 481249.7603739864,165760.70244359746 481257.4293949917,165756.68945809107 481258.72132523236,165757.8784395208 481262.4083133824)),((165742.20737085477 481237.47841455427,165747.66039481142 481235.71740314807,165751.8144077858 481248.50834933895,165756.43242557545 481262.8753640524,165750.98140785462 481264.635368777,165746.36439863997 481250.2683613508,165742.20737085477 481237.47841455427)),((165733.85235512824 481240.17530463496,165742.20737085477 481237.47841455427,165746.36439863997 481250.2683613508,165750.98140785462 481264.635368777,165742.61838084552 481267.3353419938,165739.1253645554 481256.40639819385,165735.78637572107 481246.0963088247,165733.85235512824 481240.17530463496)),((165739.44771866192 481446.73115084914,165747.59369677713 481419.1052129124,165755.07273490838 481421.3081755765,165753.72872813584 481425.89221959456,165753.872770279 481425.93414616835,165751.21877611184 481434.9502114409,165748.3617320527 481444.60115392786,165751.15376605676 481445.4211310361,165750.1407438861 481448.8652179072,165749.84376477124 481449.7981879186,165739.44771866192 481446.73115084914)),((165755.07273490838 481421.3081755765,165760.87376458934 481423.0161490942,165759.5297725321 481427.5911792049,165756.9037671212 481436.61820636754,165754.03076075122 481446.2682207337,165753.01780734822 481449.7111945327,165752.72879604952 481450.6481872374,165749.84376477124 481449.7981879186,165750.1407438861 481448.8652179072,165751.15376605676 481445.4211310361,165748.3617320527 481444.60115392786,165751.21877611184 481434.9502114409,165753.872770279 481425.93414616835,165753.72872813584 481425.89221959456,165755.07273490838 481421.3081755765)),((165742.97691753737 481536.8301309427,165734.24586626413 481534.2861086722,165741.1428862153 481510.9591321961,165749.7788806756 481513.49606105307,165746.0828843547 481525.99109169544,165742.97691753737 481536.8301309427)),((165751.349929424 481540.0420859427,165742.76593479898 481537.5050447366,165742.97691753737 481536.8301309427,165746.0828843547 481525.99109169544,165749.7788806756 481513.49606105307,165758.41391373967 481516.0321128274,165755.90595991243 481524.44010320725,165754.23096464516 481530.2160663096,165751.349929424 481540.0420859427)),((165764.92303530494 481564.0260484118,165737.3379160775 481555.91300334374,165738.95195147427 481550.44109771407,165766.5320427976 481558.5590362891,165764.92303530494 481564.0260484118)),((165756.65861975378 481368.6482390871,165746.99361894192 481371.7652784169,165738.64354107963 481345.87521031464,165748.30754891026 481342.7652734014,165749.53056963885 481346.5632645032,165752.44162214728 481355.59022616025,165756.65861975378 481368.6482390871)),((165752.44162214728 481355.59022616025,165749.53056963885 481346.5632645032,165748.30754891026 481342.7652734014,165757.1655748783 481339.9142905514,165765.53763238693 481365.7842990672,165756.65861975378 481368.6482390871,165752.44162214728 481355.59022616025)),((165931.8740897101 481845.97389222414,165926.63909579924 481844.43286302045,165958.18401185697 481745.6750893561,165967.88499884465 481714.8050392654,165978.03495803892 481683.42508322693,165987.85492324663 481650.42518802424,165995.61388665624 481619.89523620025,166004.04382546115 481580.0652253856,166010.46478895945 481545.80430237454,166014.77372129864 481515.08432910295,166017.944697256 481484.37428252696,166020.5436071265 481447.925407236,166022.89455435504 481414.75537924014,166022.04348282522 481375.44443781814,166020.8944038609 481336.42545843904,166017.34331388713 481290.65451334784,166013.00322002955 481257.715565682,166007.23313360344 481221.6245515634,165999.8039932762 481185.89557452104,165992.08393542428 481153.505664375,165982.45284189627 481118.96567873587,165972.17376532574 481084.43462164776,165922.1182438914 480929.20882226096,165975.01141201917 480912.1598730747,166024.8938545033 481067.4346662247,166037.18297547125 481107.11472961167,166046.7030684515 481141.6757140136,166054.33414940542 481174.0956631055,166061.37422548773 481209.90462836804,166067.3343192893 481245.95563193766,166073.33447668666 481291.5845675772,166076.77359289434 481337.3455119879,166077.9346373195 481376.3654226637,166078.08471020023 481415.6754693985,166076.93381866926 481448.8553972129,166074.02386650007 481485.3043251416,166069.32390902136 481528.5953227781,166064.62495930243 481559.2152395635,166058.68402618731 481593.5952206984,166049.5850707105 481633.26420126244,166041.42513576322 481663.6941479141,166031.79418719656 481696.74509726476,166022.14521790974 481728.24511586566,166012.34424551582 481759.0840178028,165960.17927882302 481921.8258100093,165950.38024911226 481918.9487982852,165970.180244166 481857.2469406328,165931.8740897101 481845.97389222414)),((165891.6666154965 481136.02359245205,165834.14510546066 480957.56464399444,165903.14921352794 480935.321792724,165960.67176963005 481113.7816573767,165891.6666154965 481136.02359245205)),((165811.18078064197 481358.96532213397,165767.3103702741 481222.86038524355,165836.31353847278 481200.6194925535,165880.18498152556 481336.7233748839,165863.38789269142 481342.1373177792,165811.18078064197 481358.96532213397),(165784.58846067498 481223.87043900834,165778.02345562194 481225.98536036786,165785.55950023342 481249.4403665603,165786.7535148305 481253.1554111886,165786.98351243007 481253.8653332394,165785.32353432756 481254.3953284019,165793.46357298896 481279.5453289056,165848.1937031559 481261.8054207434,165840.09366832077 481236.7153893235,165838.56360882698 481237.1954718372,165838.33361808676 481236.48543613846,165837.1465972164 481232.7994343237,165829.60356585556 481209.3654743581,165823.10456946667 481211.45945178793,165817.6525229432 481213.2164879185,165812.20055093075 481214.97241758025,165803.84649189602 481217.6644071663,165795.49251017885 481220.3564110396,165790.040483603 481222.11336638086,165784.58846067498 481223.87043900834),(165799.3436366324 481297.8053805152,165807.4537167706 481322.99528463103,165809.09371874726 481322.4553506549,165809.32371226288 481323.19531513343,165817.67381487784 481348.9853649841,165825.6738182269 481346.4083368862,165834.53086462567 481343.55537642253,165843.37386738468 481340.70629521617,165852.23086611537 481337.8533663467,165861.07293261477 481335.00531610136,165869.11391915628 481332.4153192787,165860.79386263408 481306.4653622439,165860.56385632814 481305.7653391327,165862.18384853032 481305.2454062637,165854.04375129592 481280.1453590037,165799.3436366324 481297.8053805152)),((165890.8257503115 481219.568445799,165896.25174365405 481217.8234493365,165897.75379771486 481217.34054124047,165908.87381045165 481213.76548845315,165931.37404637353 481283.6954208855,165921.7149745366 481286.811464343,165912.9189682873 481289.6493829797,165904.0799201045 481292.50046260294,165895.26694583046 481295.34338203387,165886.31888588314 481298.2294122301,165878.3339113341 481300.80537398526,165878.1138858439 481300.1253995869,165876.44389041603 481300.6554533546,165854.33365392467 481232.05545480386,165855.82369299646 481231.57540042157,165855.62366086923 481230.8854573256,165866.8946775674 481227.2614635345,165868.29369451493 481226.81247772946,165873.70971056758 481225.07043869596,165882.26772553523 481222.31949046534,165890.8257503115 481219.568445799)),((165935.02397284005 481245.53548755957,165931.78590693325 481235.4624807737,165937.3279522924 481233.68351704546,165944.21996750988 481231.4705071231,165946.2929498066 481237.89247930876,165947.4609974654 481241.54953687976,165935.02397284005 481245.53548755957)),((165931.78590693325 481235.4624807737,165928.51389815565 481225.28548057156,165940.92392673437 481221.25650576956,165942.14792768657 481225.0515421137,165944.21996750988 481231.4705071231,165937.3279522924 481233.68351704546,165931.78590693325 481235.4624807737)),((165940.92392673437 481221.25650576956,165940.38089696498 481219.5725450003,165950.59394445625 481216.2815246088,165956.30395514896 481214.44053561985,165960.13897532108 481226.33549698483,165951.09199357682 481229.2654734652,165944.21996750988 481231.4705071231,165942.14792768657 481225.0515421137,165940.92392673437 481221.25650576956)),((165936.54584356796 481207.699518199,165938.6048992502 481214.10754797957,165939.7208855557 481217.54051367636,165927.31390358304 481221.5755064988,165924.12884127168 481211.6925502743,165929.67582654592 481209.9104735108,165936.54584356796 481207.699518199)),((165939.7208855557 481217.54051367636,165938.6048992502 481214.10754797957,165936.54584356796 481207.699518199,165943.42091453492 481205.48758226004,165952.46891637606 481202.5455774916,165956.30395514896 481214.44053561985,165950.59394445625 481216.2815246088,165940.38089696498 481219.5725450003,165939.7208855557 481217.54051367636)),((165928.88381791487 481183.8815045006,165932.12180322534 481193.94749854505,165919.70380637315 481197.9754764354,165916.45976908074 481187.9535376864,165921.9968088786 481186.08553448814,165928.88381791487 481183.8815045006)),((165928.88381791487 481183.8815045006,165935.77478973227 481181.6766027653,165944.79885145818 481178.7555598329,165948.63385924912 481190.6505113363,165942.92389217904 481192.4915092783,165932.71481026363 481195.78856254957,165932.12180322534 481193.94749854505,165928.88381791487 481183.8815045006)),((165925.6577841699 481173.8315612609,165926.81775358738 481177.45555016235,165928.88381791487 481183.8815045006,165921.9968088786 481186.08553448814,165916.45976908074 481187.9535376864,165913.1937729216 481177.86557317525,165925.6577841699 481173.8315612609)),((165921.24274012144 481160.08457912493,165923.31373494447 481166.50753767864,165924.47675393053 481170.1415464862,165911.99370911228 481174.1455892804,165908.7426881924 481164.09159663186,165914.34872256077 481162.2995081409,165921.24274012144 481160.08457912493)),((165925.0648026079 481171.97659024666,165924.47675393053 481170.1415464862,165923.31373494447 481166.50753767864,165921.24274012144 481160.08457912493,165928.1277549979 481157.87353403826,165937.12878032168 481154.9655552655,165940.9638250668 481166.8606115619,165935.2657636092 481168.7025348458,165925.0648026079 481171.97659024666)),((165908.7426881924 481164.09159663186,165905.50370686068 481154.0755739703,165917.98371786345 481150.0455835623,165919.17071490118 481153.6626206272,165921.24274012144 481160.08457912493,165914.34872256077 481162.2995081409,165908.7426881924 481164.09159663186)),((165937.12878032168 481154.9655552655,165928.1277549979 481157.87353403826,165921.24274012144 481160.08457912493,165919.17071490118 481153.6626206272,165917.98371786345 481150.0455835623,165916.79371812948 481146.3055934274,165918.07372073093 481144.83562240377,165932.37375480027 481140.215544091,165937.12878032168 481154.9655552655)),((165981.62270644 481566.05520726903,165982.7517157374 481562.23724365025,165985.8667134712 481551.73628236784,165991.4567438497 481553.39521309774,166000.28978018748 481555.8702663668,165996.0747680759 481570.2552233033,165990.2887963984 481568.5732643481,165981.62270644 481566.05520726903)),((165985.8667134712 481551.73628236784,165988.95169326712 481541.2192343411,165990.07469705105 481536.73523226037,166004.50474845723 481541.48531321733,166000.28978018748 481555.8702663668,165991.4567438497 481553.39521309774,165985.8667134712 481551.73628236784)),((165975.7046653689 481533.0052850057,165990.07469705105 481536.73523226037,165988.95169326712 481541.2192343411,165985.8667134712 481551.73628236784,165980.26768450555 481550.0752239369,165971.4586622845 481547.49222248094,165975.7046653689 481533.0052850057)),((165981.62270644 481566.05520726903,165967.25466094722 481561.8351702114,165971.4586622845 481547.49222248094,165980.26768450555 481550.0752239369,165985.8667134712 481551.73628236784,165982.7517157374 481562.23724365025,165981.62270644 481566.05520726903)),((165939.31052736257 481537.98322753777,165948.14258714658 481540.61517884233,165953.74756907398 481542.2762139906,165950.6586404207 481552.79416514596,165949.52764086245 481556.6282648508,165935.0645508778 481552.3851903837,165939.31052736257 481537.98322753777)),((165968.11566737344 481546.5032211833,165963.90465453628 481560.84526602336,165949.52764086245 481556.6282648508,165950.6586404207 481552.79416514596,165953.74756907398 481542.2762139906,165959.34662016534 481543.9352395898,165968.11566737344 481546.5032211833)),((165968.11566737344 481546.5032211833,165959.34662016534 481543.9352395898,165953.74756907398 481542.2762139906,165956.82960471738 481531.76726200926,165957.95361929305 481527.8292279403,165972.34463824946 481532.0372719382,165968.11566737344 481546.5032211833)),((165939.31052736257 481537.98322753777,165943.5445107696 481523.62018447777,165957.95361929305 481527.8292279403,165956.82960471738 481531.76726200926,165953.74756907398 481542.2762139906,165948.14258714658 481540.61517884233,165939.31052736257 481537.98322753777)),((165943.5445107696 481523.62018447777,165947.79850722943 481509.19020873844,165956.59254258088 481511.865261011,165962.1916013131 481513.50526350754,165959.10157256975 481524.011301254,165957.95361929305 481527.8292279403,165943.5445107696 481523.62018447777)),((165972.34463824946 481532.0372719382,165957.95361929305 481527.8292279403,165959.10157256975 481524.011301254,165962.1916013131 481513.50526350754,165967.79658568368 481515.1462869073,165976.5556365254 481517.7543160746,165972.34463824946 481532.0372719382)),((165976.5556365254 481517.7543160746,165967.79658568368 481515.1462869073,165962.1916013131 481513.50526350754,165965.2815927043 481502.9912167502,165966.3935615073 481499.1412791612,165980.7906309283 481503.33033460635,165976.5556365254 481517.7543160746)),((165951.99551549152 481494.95126221766,165966.3935615073 481499.1412791612,165965.2815927043 481502.9912167502,165962.1916013131 481513.50526350754,165956.59254258088 481511.865261011,165947.79850722943 481509.19020873844,165951.99551549152 481494.95126221766)),((165956.26151080034 481480.4822672796,165965.0625026999 481483.08525067125,165970.69252246595 481484.73534517415,165967.57958312554 481495.2263056233,165966.3935615073 481499.1412791612,165951.99551549152 481494.95126221766,165956.26151080034 481480.4822672796)),((165970.69252246595 481484.73534517415,165985.017608498 481488.9352678822,165980.7906309283 481503.33033460635,165966.3935615073 481499.1412791612,165967.57958312554 481495.2263056233,165970.69252246595 481484.73534517415)),((165985.017608498 481488.9352678822,165970.69252246595 481484.73534517415,165973.75455211758 481474.21033811977,165974.8974974293 481470.2332966167,165989.26357937 481474.4722649936,165985.017608498 481488.9352678822)),((165960.50445133742 481466.0903311382,165974.8974974293 481470.2332966167,165973.75455211758 481474.21033811977,165970.69252246595 481484.73534517415,165965.0625026999 481483.08525067125,165956.26151080034 481480.4822672796,165960.50445133742 481466.0903311382)),((165960.50445133742 481466.0903311382,165964.74948427 481451.6882785512,165973.51751495776 481454.29532028775,165979.1745332628 481455.9592810538,165976.05152430522 481466.4553314901,165974.8974974293 481470.2332966167,165960.50445133742 481466.0903311382)),((165989.26357937 481474.4722649936,165974.8974974293 481470.2332966167,165976.05152430522 481466.4553314901,165979.1745332628 481455.9592810538,165984.73649874856 481457.595332028,165993.45358051884 481460.20129447326,165989.26357937 481474.4722649936)),((165979.1745332628 481455.9592810538,165982.22851159697 481445.4223565114,165983.38548240822 481441.61335710034,165997.67452061403 481445.8253634295,165993.45358051884 481460.20129447326,165984.73649874856 481457.595332028,165979.1745332628 481455.9592810538)),((165964.74948427 481451.6882785512,165965.8944682684 481447.80536906695,165964.21943920254 481447.3353404566,165967.16940644267 481436.83333526517,165983.38548240822 481441.61335710034,165982.22851159697 481445.4223565114,165979.1745332628 481455.9592810538,165973.51751495776 481454.29532028775,165964.74948427 481451.6882785512)),((165931.78434320926 481457.6552447277,165935.97235709074 481443.2893136629,165941.40237306454 481444.85526083026,165947.03838439108 481446.5322673152,165943.89840851355 481457.0212904519,165942.7733832031 481460.8903412712,165931.78434320926 481457.6552447277)),((165961.39641423512 481450.78526691074,165957.19445905197 481465.1353463633,165942.7733832031 481460.8903412712,165943.89840851355 481457.0212904519,165947.03838439108 481446.5322673152,165952.60639016278 481448.19032571657,165961.39641423512 481450.78526691074)),((165967.16940644267 481436.83333526517,165964.21943920254 481447.3353404566,165962.54440981965 481446.8653124131,165961.39641423512 481450.78526691074,165952.60639016278 481448.19032571657,165947.03838439108 481446.5322673152,165950.09037083114 481436.00433123333,165951.29139067512 481432.15236295323,165967.16940644267 481436.83333526517)),((165935.97235709074 481443.2893136629,165940.17434220857 481428.87535132206,165951.29139067512 481432.15236295323,165950.09037083114 481436.00433123333,165947.03838439108 481446.5322673152,165941.40237306454 481444.85526083026,165935.97235709074 481443.2893136629)),((165947.79850722943 481509.19020873844,165943.5445107696 481523.62018447777,165939.31052736257 481537.98322753777,165935.0645508778 481552.3851903837,165949.52764086245 481556.6282648508,165963.90465453628 481560.84526602336,165968.11566737344 481546.5032211833,165972.34463824946 481532.0372719382,165975.7046653689 481533.0052850057,165971.4586622845 481547.49222248094,165967.25466094722 481561.8351702114,165981.62270644 481566.05520726903,165990.2887963984 481568.5732643481,165988.14081311575 481575.871190598,165925.78456217595 481557.5191725351,165951.19443893305 481471.1812507268,165929.6113786002 481464.82930264046,165931.78434320926 481457.6552447277,165942.7733832031 481460.8903412712,165957.19445905197 481465.1353463633,165961.39641423512 481450.78526691074,165962.54440981965 481446.8653124131,165964.21943920254 481447.3353404566,165965.8944682684 481447.80536906695,165964.74948427 481451.6882785512,165960.50445133742 481466.0903311382,165956.26151080034 481480.4822672796,165951.99551549152 481494.95126221766,165947.79850722943 481509.19020873844)),((165941.05912179363 481325.0553667046,165955.3011366293 481320.4854062049,165959.84321633418 481334.64037687157,165951.19216527854 481337.4754338825,165945.62013845862 481339.26544198627,165942.2591185958 481328.84044813446,165941.05912179363 481325.0553667046)),((165941.05912179363 481325.0553667046,165942.2591185958 481328.84044813446,165945.62013845862 481339.26544198627,165940.0661268979 481341.050378153,165934.73211844507 481342.753361227,165930.24406786144 481328.52543277247,165941.05912179363 481325.0553667046)),((165934.73211844507 481342.753361227,165940.0661268979 481341.050378153,165945.62013845862 481339.26544198627,165948.99422618406 481349.69436158845,165950.20422346052 481353.54544691474,165939.25420752895 481357.08540151204,165934.73211844507 481342.753361227)),((165962.87524257202 481338.1164342519,165966.16722080676 481348.3844067348,165950.20422346052 481353.54544691474,165948.99422618406 481349.69436158845,165945.62013845862 481339.26544198627,165951.19216527854 481337.4754338825,165959.84321633418 481334.64037687157,165961.14418771747 481338.6953912655,165962.87524257202 481338.1164342519)),((165966.16722080676 481348.3844067348,165962.87524257202 481338.1164342519,165964.64423360457 481337.52543432114,165963.3402144063 481333.4624012245,165971.93421949708 481330.74640247505,165977.48524113596 481328.96739244333,165980.85626413499 481339.39844098384,165982.07327767808 481343.2424288156,165966.16722080676 481348.3844067348)),((165991.720251199 481324.3384400168,165996.32429299227 481338.6354442758,165982.07327767808 481343.2424288156,165980.85626413499 481339.39844098384,165977.48524113596 481328.96739244333,165983.06424125226 481327.1794385015,165991.720251199 481324.3384400168)),((165987.1412406636 481310.11748955015,165991.720251199 481324.3384400168,165983.06424125226 481327.1794385015,165977.48524113596 481328.96739244333,165974.13820372755 481318.53639975237,165972.92219446276 481314.7565044081,165987.1412406636 481310.11748955015)),((165963.3402144063 481333.4624012245,165958.81514406268 481319.35842404625,165972.92219446276 481314.7565044081,165974.13820372755 481318.53639975237,165977.48524113596 481328.96739244333,165971.93421949708 481330.74640247505,165963.3402144063 481333.4624012245)),((165972.92219446276 481314.7565044081,165958.81514406268 481319.35842404625,165954.19315136166 481304.9514868698,165962.75612083622 481302.2305076738,165968.30917366338 481300.4094340397,165972.92219446276 481314.7565044081)),((165968.30917366338 481300.4094340397,165973.88217284554 481298.6655169666,165982.5412139683 481295.8305174183,165987.1412406636 481310.11748955015,165972.92219446276 481314.7565044081,165968.30917366338 481300.4094340397)),((165968.30917366338 481300.4094340397,165964.9601495697 481290.02650985704,165963.7271422241 481286.15745674213,165977.94914385804 481281.5714949763,165982.5412139683 481295.8305174183,165973.88217284554 481298.6655169666,165968.30917366338 481300.4094340397)),((165963.7271422241 481286.15745674213,165964.9601495697 481290.02650985704,165968.30917366338 481300.4094340397,165962.75612083622 481302.2305076738,165954.19315136166 481304.9514868698,165949.62211592981 481290.70544403687,165963.7271422241 481286.15745674213)),((165959.13904705815 481271.891451392,165962.4810715889 481282.33644102496,165963.7271422241 481286.15745674213,165949.62211592981 481290.70544403687,165945.03602160158 481276.4124190493,165953.5660289468 481273.6634235794,165959.13904705815 481271.891451392)),((165973.36409571537 481267.33151899016,165977.94914385804 481281.5714949763,165963.7271422241 481286.15745674213,165962.4810715889 481282.33644102496,165959.13904705815 481271.891451392,165964.71208475076 481270.1124758971,165973.36409571537 481267.33151899016)),((165968.77606675995 481253.0095394675,165970.30806429673 481257.7664775316,165973.36409571537 481267.33151899016,165964.71208475076 481270.1124758971,165959.13904705815 481271.891451392,165955.79304926845 481261.4484581901,165954.55201612142 481257.6254531015,165968.77606675995 481253.0095394675)),((165954.55201612142 481257.6254531015,165955.79304926845 481261.4484581901,165959.13904705815 481271.891451392,165953.5660289468 481273.6634235794,165945.03602160158 481276.4124190493,165941.9830346947 481266.89747067,165940.47400505433 481262.19544545864,165954.55201612142 481257.6254531015)),((165966.16722080676 481348.3844067348,165982.07327767808 481343.2424288156,165996.32429299227 481338.6354442758,165991.720251199 481324.3384400168,165987.1412406636 481310.11748955015,165982.5412139683 481295.8305174183,165977.94914385804 481281.5714949763,165973.36409571537 481267.33151899016,165970.30806429673 481257.7664775316,165968.77606675995 481253.0095394675,165973.53406971783 481251.476547989,166002.68035683886 481341.89440115006,165936.05519068605 481363.369405808,165923.01604604002 481322.9174133205,165949.18912624416 481314.4813888294,165934.61698036632 481269.27143408824,165941.9830346947 481266.89747067,165945.03602160158 481276.4124190493,165949.62211592981 481290.70544403687,165954.19315136166 481304.9514868698,165958.81514406268 481319.35842404625,165963.3402144063 481333.4624012245,165964.64423360457 481337.52543432114,165962.87524257202 481338.1164342519,165961.14418771747 481338.6953912655,165959.84321633418 481334.64037687157,165955.3011366293 481320.4854062049,165941.05912179363 481325.0553667046,165930.24406786144 481328.52543277247,165934.73211844507 481342.753361227,165939.25420752895 481357.08540151204,165950.20422346052 481353.54544691474,165966.16722080676 481348.3844067348)),((165895.13041732486 481533.24123828445,165910.45443059667 481537.7282090086,165918.892460091 481540.224162435,165922.71948440833 481541.33024989034,165920.67447837786 481548.2551416977,165893.09843377655 481540.1511493943,165895.13041732486 481533.24123828445)),((165896.64740066387 481528.08315691736,165896.65241750143 481528.06514321023,165920.4185142213 481535.0441892801,165924.24847192867 481536.1511745033,165922.71948440833 481541.33024989034,165918.892460091 481540.224162435,165910.45443059667 481537.7282090086,165895.13041732486 481533.24123828445,165896.64740066387 481528.08315691736)),((165896.65241750143 481528.06514321023,165898.16535466668 481522.9191811999,165898.17435241595 481522.8891597626,165921.94347844977 481529.86521559535,165925.7774623816 481530.9722108921,165924.24847192867 481536.1511745033,165920.4185142213 481535.0441892801,165896.65241750143 481528.06514321023)),((165899.69038288604 481517.7331913193,165899.69635646036 481517.7141783537,165923.4694707462 481524.6852433193,165927.30747869454 481525.7932500641,165925.7774623816 481530.9722108921,165921.94347844977 481529.86521559535,165898.17435241595 481522.8891597626,165899.69038288604 481517.7331913193)),((165901.21136076152 481512.5612122759,165901.218365878 481512.5381960822,165902.19538995755 481512.8091679609,165916.5504016183 481517.0312113604,165924.99546621574 481519.5052715604,165928.8364779695 481520.61317485454,165927.30747869454 481525.7932500641,165923.4694707462 481524.6852433193,165899.69635646036 481517.7141783537,165901.21136076152 481512.5612122759)),((165902.7343960123 481507.3852327769,165902.74037624605 481507.3632156981,165926.5204402043 481514.3261881598,165930.36547795995 481515.43421280093,165928.8364779695 481520.61317485454,165924.99546621574 481519.5052715604,165916.5504016183 481517.0312113604,165902.19538995755 481512.8091679609,165901.218365878 481512.5381960822,165902.7343960123 481507.3852327769)),((165904.25833845264 481502.20124477724,165904.2623919882 481502.18723446043,165905.24435118132 481502.44720268424,165928.0404683249 481509.1652303686,165931.89543563488 481510.25525337853,165930.36547795995 481515.43421280093,165926.5204402043 481514.3261881598,165902.74037624605 481507.3632156981,165904.25833845264 481502.20124477724)),((165914.80236954536 481498.40129218134,165920.4864416878 481500.0572347831,165923.36639387568 481500.89619632973,165933.76447955295 481503.92523969157,165931.89543563488 481510.25525337853,165928.0404683249 481509.1652303686,165905.24435118132 481502.44720268424,165904.2623919882 481502.18723446043,165906.11937296687 481495.87120313005,165914.80236954536 481498.40129218134)),((165933.76447955295 481503.92523969157,165923.36639387568 481500.89619632973,165923.65443714958 481499.88622205233,165924.6673896757 481496.43126609793,165927.45044080383 481497.24820778926,165932.95342380035 481478.61931950756,165933.09739250087 481478.6622525252,165933.3244254117 481477.8952557339,165934.4303817035 481474.0422937281,165941.84446005966 481476.2252570742,165933.76447955295 481503.92523969157)),((165928.61836432802 481472.3313100361,165934.4303817035 481474.0422937281,165933.3244254117 481477.8952557339,165933.09739250087 481478.6622525252,165932.95342380035 481478.61931950756,165927.45044080383 481497.24820778926,165924.6673896757 481496.43126609793,165923.65443714958 481499.88622205233,165923.36639387568 481500.89619632973,165920.4864416878 481500.0572347831,165920.77538404206 481499.0412540726,165921.78942337478 481495.5873013189,165927.29739742447 481476.94328597013,165928.61836432802 481472.3313100361)),((165928.61836432802 481472.3313100361,165927.29739742447 481476.94328597013,165921.78942337478 481495.5873013189,165920.77538404206 481499.0412540726,165920.4864416878 481500.0572347831,165914.80236954536 481498.40129218134,165919.0003527469 481484.2682437183,165921.6313492792 481475.26523400156,165921.4873803808 481475.22230131645,165921.71434346386 481474.4553038453,165922.81533845488 481470.62224457925,165928.61836432802 481472.3313100361)),((165914.80236954536 481498.40129218134,165906.11937296687 481495.87120313005,165909.38437225827 481484.88029707095,165911.20331499135 481478.59823054564,165914.2793231971 481468.1092675604,165922.81533845488 481470.62224457925,165921.71434346386 481474.4553038453,165921.4873803808 481475.22230131645,165921.6313492792 481475.26523400156,165919.0003527469 481484.2682437183,165914.80236954536 481498.40129218134)),((165906.11937296687 481495.87120313005,165897.47634055186 481493.30127379094,165901.6643087399 481479.175198381,165904.17528002078 481470.14120556315,165904.41532065 481470.21227725974,165904.6443266929 481469.44528353587,165905.76231058137 481465.6012429256,165914.2793231971 481468.1092675604,165911.20331499135 481478.59823054564,165909.38437225827 481484.88029707095,165906.11937296687 481495.87120313005)),((165897.47634055186 481493.30127379094,165891.82230733614 481491.62027832307,165893.12732160438 481487.17626645276,165895.98731684854 481477.5102808174,165898.60226602363 481468.5012153713,165899.950275644 481463.88929162023,165905.76231058137 481465.6012429256,165904.6443266929 481469.44528353587,165904.41532065 481470.21227725974,165904.17528002078 481470.14120556315,165901.6643087399 481479.175198381,165897.47634055186 481493.30127379094)),((165894.1482505075 481462.18126349826,165899.950275644 481463.88929162023,165898.60226602363 481468.5012153713,165895.98731684854 481477.5102808174,165893.12732160438 481487.17626645276,165891.82230733614 481491.62027832307,165888.9282799268 481490.7592738712,165890.23026762213 481486.32626971306,165887.46628168572 481485.51517682313,165892.9422399973 481466.8352261978,165892.79827060597 481466.7922943458,165894.1482505075 481462.18126349826)),((165888.9282799268 481490.7592738712,165878.61824088683 481487.69324565696,165886.72425100228 481459.99523461866,165894.1482505075 481462.18126349826,165892.79827060597 481466.7922943458,165892.9422399973 481466.8352261978,165887.46628168572 481485.51517682313,165890.23026762213 481486.32626971306,165888.9282799268 481490.7592738712)),((165856.23329322916 481537.0501121804,165881.64417191545 481450.71128487133,165929.6113786002 481464.82930264046,165951.19443893305 481471.1812507268,165925.78456217595 481557.5191725351,165856.23329322916 481537.0501121804),(165867.54927288933 481525.10522256023,165865.49131977314 481532.05914822913,165893.09843377655 481540.1511493943,165920.67447837786 481548.2551416977,165922.71948440833 481541.33024989034,165924.24847192867 481536.1511745033,165925.7774623816 481530.9722108921,165927.30747869454 481525.7932500641,165928.8364779695 481520.61317485454,165930.36547795995 481515.43421280093,165931.89543563488 481510.25525337853,165933.76447955295 481503.92523969157,165941.84446005966 481476.2252570742,165934.4303817035 481474.0422937281,165928.61836432802 481472.3313100361,165922.81533845488 481470.62224457925,165914.2793231971 481468.1092675604,165905.76231058137 481465.6012429256,165899.950275644 481463.88929162023,165894.1482505075 481462.18126349826,165886.72425100228 481459.99523461866,165878.61824088683 481487.69324565696,165876.74125623505 481494.0361689687,165875.20924209635 481499.2132491519,165873.67729294812 481504.3932228555,165872.1452832179 481509.57119418646,165870.61327667205 481514.749166038,165869.08127331096 481519.9271384061,165867.54927288933 481525.10522256023)),((165864.26622637178 481483.4501794296,165853.82416749134 481480.38124216447,165855.13816786418 481475.8981865053,165857.91919632955 481476.7151957553,165860.74618647926 481467.1472523947,165863.38416540896 481458.1492344596,165863.52718054497 481458.19227461156,165864.89212849856 481453.5532303068,165872.31417887198 481455.7352165087,165864.26622637178 481483.4501794296)),((165786.68302267324 481516.58014388575,165812.09292220575 481430.24218691647,165881.64417191545 481450.71128487133,165856.23329322916 481537.0501121804,165786.68302267324 481516.58014388575),(165798.00803197207 481504.65914855164,165795.9680335119 481511.61214057665,165823.56413966522 481519.7282063275,165851.18822609202 481527.8531666835,165864.26622637178 481483.4501794296,165872.31417887198 481455.7352165087,165864.89212849856 481453.5532303068,165859.0901429811 481451.847246296,165853.2880852939 481450.14126894844,165844.7631001899 481447.63422229275,165836.22904270093 481445.12527897663,165830.42703771713 481443.41921739513,165824.62502849937 481441.7132738949,165817.18399556502 481439.5251983774,165808.99602089508 481467.20522848406,165807.1290240118 481473.57022994,165805.60797486416 481478.7521396871,165804.0880216979 481483.9331622273,165802.56800132265 481489.1151865056,165801.0480544796 481494.29621007456,165799.53601079423 481499.45010300004,165798.00803197207 481504.65914855164)),((165866.8946775674 481227.2614635345,165866.63470314653 481226.45244678966,165865.69470760453 481223.61247728474,165861.72971818765 481224.8815075602,165858.10862015767 481213.5774607407,165855.32264947437 481205.11148452404,165854.2025963923 481201.4225106706,165859.62464855894 481199.67446122796,165860.78461601818 481203.3495048612,165863.5306689735 481211.82552133844,165866.60869701818 481221.50948498544,165868.17671572493 481221.01046857407,165868.8797176592 481223.22550298803,165867.311701787 481223.7235178127,165868.29369451493 481226.81247772946,165866.8946775674 481227.2614635345)),((165873.70971056758 481225.07043869596,165868.29369451493 481226.81247772946,165867.311701787 481223.7235178127,165868.8797176592 481223.22550298803,165868.17671572493 481221.01046857407,165866.60869701818 481221.50948498544,165863.5306689735 481211.82552133844,165860.78461601818 481203.3495048612,165859.62464855894 481199.67446122796,165865.04766110049 481197.9255297347,165866.20967289337 481201.5994664963,165868.9526537095 481210.0734764689,165873.70971056758 481225.07043869596)),((165882.26772553523 481222.31949046534,165873.70971056758 481225.07043869596,165868.9526537095 481210.0734764689,165866.20967289337 481201.5994664963,165865.04766110049 481197.9255297347,165873.60068580566 481195.1685472645,165877.02172582838 481205.785442737,165882.26772553523 481222.31949046534)),((165890.8257503115 481219.568445799,165882.26772553523 481222.31949046534,165877.02172582838 481205.785442737,165873.60068580566 481195.1685472645,165882.15365215074 481192.4114681889,165886.07474011733 481204.540549042,165890.8257503115 481219.568445799)),((165890.8257503115 481219.568445799,165886.07474011733 481204.540549042,165882.15365215074 481192.4114681889,165887.5766784854 481190.6635628014,165891.4977636454 481202.7885311759,165894.58876734154 481212.5644449591,165893.0167248861 481213.0614413691,165893.71779667106 481215.2814819412,165895.29079305512 481214.7844878564,165896.25174365405 481217.8234493365,165890.8257503115 481219.568445799)),((165896.25174365405 481217.8234493365,165895.29079305512 481214.7844878564,165893.71779667106 481215.2814819412,165893.0167248861 481213.0614413691,165894.58876734154 481212.5644449591,165891.4977636454 481202.7885311759,165887.5766784854 481190.6635628014,165892.9997111255 481188.9145507321,165894.19671993738 481192.5715478998,165896.91976828402 481201.0365170132,165899.76578669314 481210.19148501434,165900.4868094275 481212.4224744692,165896.5847507168 481213.6844948627,165897.75379771486 481217.34054124047,165896.25174365405 481217.8234493365)),((165907.70576258353 481210.1234609238,165902.2817912834 481211.8425247669,165900.4868094275 481212.4224744692,165899.76578669314 481210.19148501434,165896.91976828402 481201.0365170132,165894.19671993738 481192.5715478998,165892.9997111255 481188.9145507321,165900.16369288534 481186.6055023801,165907.70576258353 481210.1234609238)),((165907.70576258353 481210.1234609238,165908.87381045165 481213.76548845315,165897.75379771486 481217.34054124047,165896.5847507168 481213.6844948627,165900.4868094275 481212.4224744692,165902.2817912834 481211.8425247669,165907.70576258353 481210.1234609238)),((165880.18498152556 481336.7233748839,165836.31353847278 481200.6194925535,165905.31869812732 481178.3775641539,165934.61698036632 481269.27143408824,165949.18912624416 481314.4813888294,165923.01604604002 481322.9174133205,165880.18498152556 481336.7233748839),(165854.2025963923 481201.4225106706,165846.93358080686 481203.7654415951,165854.44664577578 481227.21249125793,165855.62366086923 481230.8854573256,165855.82369299646 481231.57540042157,165854.33365392467 481232.05545480386,165876.44389041603 481300.6554533546,165878.1138858439 481300.1253995869,165878.3339113341 481300.80537398526,165886.68397781134 481326.77534298535,165894.68699622378 481324.19342627533,165903.4679854846 481321.36145030503,165912.37800999396 481318.48738357215,165921.19804856065 481315.64239624795,165930.08209634136 481312.7774275843,165939.79406761308 481309.6453844185,165931.37404637353 481283.6954208855,165908.87381045165 481213.76548845315,165907.70576258353 481210.1234609238,165900.16369288534 481186.6055023801,165892.9997111255 481188.9145507321,165887.5766784854 481190.6635628014,165882.15365215074 481192.4114681889,165873.60068580566 481195.1685472645,165865.04766110049 481197.9255297347,165859.62464855894 481199.67446122796,165854.2025963923 481201.4225106706)),((165876.25758868846 481147.235518126,165886.28362180485 481143.98556564905,165896.2337106576 481174.71549742355,165886.18763645564 481177.9574857892,165881.60664909615 481163.8455611428,165876.25758868846 481147.235518126)),((165877.62665215324 481180.720548479,165876.1156383474 481176.1364793717,165874.2206071835 481170.222516107,165867.70355799777 481150.00851581164,165876.25758868846 481147.235518126,165881.60664909615 481163.8455611428,165886.18763645564 481177.9574857892,165877.62665215324 481180.720548479)),((165869.06465495183 481183.48351249145,165864.4985981491 481169.38354181446,165859.15056190282 481152.7805291889,165867.70355799777 481150.00851581164,165874.2206071835 481170.222516107,165876.1156383474 481176.1364793717,165877.62665215324 481180.720548479,165869.06465495183 481183.48351249145)),((165853.91450703648 481154.47847423767,165859.15056190282 481152.7805291889,165864.4985981491 481169.38354181446,165869.06465495183 481183.48351249145,165860.50362192755 481186.2464934498,165859.00158758258 481181.6654534509,165857.05258033366 481175.793547097,165856.1815873062 481173.1014900736,165850.60753492877 481155.55046525295,165853.77149161507 481154.5245568851,165853.91450703648 481154.47847423767)),((165924.52807736598 481843.81189789885,165956.08599516712 481745.01508612063,165965.7919827646 481714.12902105553,165975.93794683047 481682.76206980716,165985.7359202118 481649.83511083043,165993.46790969896 481619.4111303698,166001.88886370874 481579.6282719317,166008.29380160503 481545.4542077084,166012.5927007486 481514.79429283564,166015.75270217698 481484.19937875186,166018.35059922235 481447.76941500005,166020.69352027407 481414.70640413306,166019.8444648481 481375.4923786521,166018.69738716728 481336.5465047899,166015.15530439743 481290.8855103039,166010.82720700584 481258.03348857275,166005.06812188454 481222.01660339045,165997.66299492292 481186.39761198557,165989.9529152416 481154.0525668103,165980.3347990849 481119.55767611903,165970.06673855023 481085.06470021605,165920.02428878422 480929.8827890846,165922.1182438914 480929.20882226096,165972.17376532574 481084.43462164776,165982.45284189627 481118.96567873587,165992.08393542428 481153.505664375,165999.8039932762 481185.89557452104,166007.23313360344 481221.6245515634,166013.00322002955 481257.715565682,166017.34331388713 481290.65451334784,166020.8944038609 481336.42545843904,166022.04348282522 481375.44443781814,166022.89455435504 481414.75537924014,166020.5436071265 481447.925407236,166017.944697256 481484.37428252696,166014.77372129864 481515.08432910295,166010.46478895945 481545.80430237454,166004.04382546115 481580.0652253856,165995.61388665624 481619.89523620025,165987.85492324663 481650.42518802424,165978.03495803892 481683.42508322693,165967.88499884465 481714.8050392654,165958.18401185697 481745.6750893561,165926.63909579924 481844.43286302045,165924.52807736598 481843.81189789885)),((165619.34493397814 481753.9937822201,165621.25993950333 481746.4797864231,165726.6254969247 481332.95825022587,165742.17659175242 481381.20723075565,165811.18078064197 481358.96532213397,165863.38789269142 481342.1373177792,165880.18498152556 481336.7233748839,165923.01604604002 481322.9174133205,165936.05519068605 481363.369405808,166002.68035683886 481341.89440115006,165973.53406971783 481251.476547989,165994.94911866274 481244.573534503,165983.4440417146 481208.88056617026,165990.58306434262 481206.5796042553,165960.67176963005 481113.7816573767,165903.14921352794 480935.321792724,165920.02428878422 480929.8827890846,165970.06673855023 481085.06470021605,165980.3347990849 481119.55767611903,165989.9529152416 481154.0525668103,165997.66299492292 481186.39761198557,166005.06812188454 481222.01660339045,166010.82720700584 481258.03348857275,166015.15530439743 481290.8855103039,166018.69738716728 481336.5465047899,166019.8444648481 481375.4923786521,166020.69352027407 481414.70640413306,166018.35059922235 481447.76941500005,166015.75270217698 481484.19937875186,166012.5927007486 481514.79429283564,166008.29380160503 481545.4542077084,166001.88886370874 481579.6282719317,165993.46790969896 481619.4111303698,165985.7359202118 481649.83511083043,165975.93794683047 481682.76206980716,165965.7919827646 481714.12902105553,165956.08599516712 481745.01508612063,165924.52807736598 481843.81189789885,165853.94681607577 481823.0388199289,165677.60915791194 481771.1417838235,165619.34493397814 481753.9937822201),(165673.3708977106 481644.8049006763,165647.9609629814 481731.14381613344,165787.06153932825 481772.0818594473,165926.16303056382 481813.0209374773,165951.5729883572 481726.68209263764,165995.3347822398 481577.9882105603,165988.14081311575 481575.871190598,165990.2887963984 481568.5732643481,165996.0747680759 481570.2552233033,166000.28978018748 481555.8702663668,166004.50474845723 481541.48531321733,165990.07469705105 481536.73523226037,165975.7046653689 481533.0052850057,165972.34463824946 481532.0372719382,165976.5556365254 481517.7543160746,165980.7906309283 481503.33033460635,165985.017608498 481488.9352678822,165989.26357937 481474.4722649936,165993.45358051884 481460.20129447326,165997.67452061403 481445.8253634295,165983.38548240822 481441.61335710034,165967.16940644267 481436.83333526517,165951.29139067512 481432.15236295323,165940.17434220857 481428.87535132206,165935.97235709074 481443.2893136629,165931.78434320926 481457.6552447277,165929.6113786002 481464.82930264046,165881.64417191545 481450.71128487133,165812.09292220575 481430.24218691647,165742.54266873017 481409.7731823477,165717.13279208494 481496.11104573845,165673.3708977106 481644.8049006763)),((165944.21996750988 481231.4705071231,165951.09199357682 481229.2654734652,165960.13897532108 481226.33549698483,165963.05302768055 481235.37549498817,165960.19799728072 481236.29654102743,165962.03901342853 481242.00547000783,165964.4030222143 481249.38752608956,165961.2800567513 481250.39353844704,165958.91504699853 481243.0305077823,165957.41400492916 481238.35853659053,165947.4609974654 481241.54953687976,165946.2929498066 481237.89247930876,165944.21996750988 481231.4705071231)),((165964.89403841048 481241.0855376612,165967.25804585416 481248.46648246696,165964.41803350058 481249.3825525534,165964.4030222143 481249.38752608956,165962.03901342853 481242.00547000783,165960.19799728072 481236.29654102743,165963.05302768055 481235.37549498817,165964.89403841048 481241.0855376612)),((165799.76645236128 481728.91290228424,165856.23329322916 481537.0501121804,165925.78456217595 481557.5191725351,165882.02270928613 481706.2129920733,165869.31776905607 481749.3819606654,165799.76645236128 481728.91290228424),(165818.18347132907 481699.0759244936,165810.6795268119 481724.3238936018,165818.52953724368 481726.63391340274,165823.7105264967 481728.1579079759,165828.8165668759 481729.65993579174,165834.0725614319 481731.2069149638,165839.2525866725 481732.73092375806,165844.43165426826 481734.254935893,165849.6136502441 481735.7789599037,165854.79468637242 481737.3039886345,165864.21673524188 481740.07594691927,165871.61166309135 481714.8499591504,165873.5856655602 481708.1559845713,165875.19665619102 481702.68901061267,165876.80867300337 481697.2220394776,165878.42062517727 481691.7550687749,165880.0326493108 481686.2879875313,165881.64365188024 481680.82201724674,165883.25561466636 481675.3550482706,165885.81462477864 481666.6750804727,165862.71556835776 481659.87201639387,165858.18350495028 481662.28103755135,165857.22255387413 481661.9990944326,165860.42351585196 481651.13507619646,165887.98459628696 481659.2750171646,165890.5355846362 481650.59203018417,165892.1425944516 481645.1230506564,165893.74858513728 481639.6540694473,165895.3556020077 481634.18509106763,165896.961599746 481628.7161110021,165898.56855549413 481623.2471336177,165900.5446102156 481616.5211311452,165907.9205223746 481591.3661466478,165854.4933637975 481575.62010088266,165846.79339518113 481601.7910717138,165845.1543742347 481601.3041389397,165816.8084509125 481697.6910105642,165818.44844988626 481698.18494588154,165818.18347132907 481699.0759244936),(165913.7345330837 481561.835152511,165911.98453541263 481567.87514941185,165914.68449818296 481568.66519705893,165916.4345449143 481562.6352149766,165913.7345330837 481561.835152511)),((165948.95499848967 481246.2335059524,165936.5469794084 481250.24243752443,165935.02397284005 481245.53548755957,165947.4609974654 481241.54953687976,165948.95499848967 481246.2335059524)),((165947.4609974654 481241.54953687976,165957.41400492916 481238.35853659053,165958.91504699853 481243.0305077823,165948.95499848967 481246.2335059524,165947.4609974654 481241.54953687976)),((165905.31869812732 481178.3775641539,165891.6666154965 481136.02359245205,165960.67176963005 481113.7816573767,165990.58306434262 481206.5796042553,165983.4440417146 481208.88056617026,165994.94911866274 481244.573534503,165973.53406971783 481251.476547989,165968.77606675995 481253.0095394675,165954.55201612142 481257.6254531015,165940.47400505433 481262.19544545864,165941.9830346947 481266.89747067,165934.61698036632 481269.27143408824,165905.31869812732 481178.3775641539),(165905.50370686068 481154.0755739703,165908.7426881924 481164.09159663186,165911.99370911228 481174.1455892804,165924.47675393053 481170.1415464862,165925.0648026079 481171.97659024666,165925.6577841699 481173.8315612609,165913.1937729216 481177.86557317525,165916.45976908074 481187.9535376864,165919.70380637315 481197.9754764354,165932.12180322534 481193.94749854505,165932.71481026363 481195.78856254957,165933.3258276864 481197.68652243924,165920.90381222923 481201.6855597624,165924.12884127168 481211.6925502743,165927.31390358304 481221.5755064988,165939.7208855557 481217.54051367636,165940.38089696498 481219.5725450003,165940.92392673437 481221.25650576956,165928.51389815565 481225.28548057156,165931.78590693325 481235.4624807737,165935.02397284005 481245.53548755957,165936.5469794084 481250.24243752443,165948.95499848967 481246.2335059524,165958.91504699853 481243.0305077823,165961.2800567513 481250.39353844704,165964.4030222143 481249.38752608956,165964.41803350058 481249.3825525534,165967.25804585416 481248.46648246696,165964.89403841048 481241.0855376612,165968.73504042928 481239.8365646448,165963.9829787248 481225.09053244634,165960.15095575404 481213.20058163744,165956.3139019831 481201.2956022904,165952.48285594245 481189.4095544417,165948.64786753405 481177.50959311274,165944.81482477117 481165.61553636834,165940.9817653917 481153.7205927461,165936.22770472043 481138.9705800083,165932.37375480027 481140.215544091,165918.07372073093 481144.83562240377,165916.79371812948 481146.3055934274,165917.98371786345 481150.0455835623,165905.50370686068 481154.0755739703)),((165856.84086455274 481321.967319789,165853.9738187968 481312.8804221144,165852.74684928128 481309.0813951317,165860.79386263408 481306.4653622439,165869.11391915628 481332.4153192787,165861.07293261477 481335.00531610136,165856.84086455274 481321.967319789)),((165878.3339113341 481300.80537398526,165886.31888588314 481298.2294122301,165887.55189386752 481302.06239640043,165890.49793373534 481311.10642862413,165894.68699622378 481324.19342627533,165886.68397781134 481326.77534298535,165878.3339113341 481300.80537398526)),((165886.31888588314 481298.2294122301,165895.26694583046 481295.34338203387,165903.4679854846 481321.36145030503,165894.68699622378 481324.19342627533,165890.49793373534 481311.10642862413,165887.55189386752 481302.06239640043,165886.31888588314 481298.2294122301)),((165904.0799201045 481292.50046260294,165912.37800999396 481318.48738357215,165903.4679854846 481321.36145030503,165895.26694583046 481295.34338203387,165904.0799201045 481292.50046260294)),((165912.9189682873 481289.6493829797,165921.19804856065 481315.64239624795,165912.37800999396 481318.48738357215,165904.0799201045 481292.50046260294,165912.9189682873 481289.6493829797)),((165921.7149745366 481286.811464343,165922.95697104238 481290.6694003715,165925.87703315547 481299.68747166824,165930.08209634136 481312.7774275843,165921.19804856065 481315.64239624795,165912.9189682873 481289.6493829797,165921.7149745366 481286.811464343)),((165925.87703315547 481299.68747166824,165922.95697104238 481290.6694003715,165921.7149745366 481286.811464343,165931.37404637353 481283.6954208855,165939.79406761308 481309.6453844185,165930.08209634136 481312.7774275843,165925.87703315547 481299.68747166824)),((165859.39522142088 482267.4240714624,165864.58023530198 482251.2500981201,165870.91425172254 482253.2841598908,165879.3223348805 482255.98515759007,165880.66728750238 482251.79012318875,166036.17032815237 481766.6561312795,166046.02629930346 481735.6421578694,166055.72829030015 481703.96917686274,166065.4712408115 481670.5332167183,166073.85019402683 481639.2992494934,166083.20415541553 481598.5192454308,166089.29909334317 481563.24629943684,166094.11802925434 481531.8473813481,166098.9169394697 481487.64036907634,166101.8988601309 481450.2853709817,166103.08684389706 481416.0574241747,166102.93369437646 481375.9605096085,166101.7456417802 481336.0315043455,166098.21153095478 481289.0156036395,166092.06841256854 481242.295594639,166085.97631042093 481205.444609844,166078.7762296343 481168.82068623864,166070.93011676625 481135.4857379878,166061.18305531278 481100.10373740544,166048.71992073982 481059.8637894088,165962.33810554908 480790.9669277343,166126.4834736357 480738.2440844735,166284.86517634048 481326.3456167291,166308.26957530715 481457.38460489427,166313.80279147168 481573.28041882324,166138.78833844126 482338.71614736825,166081.8201098793 482362.2970864991,166078.87909140653 482354.8260973728,166065.03704142952 482350.38408176304,166067.1140423639 482343.91004357993,166047.4829979523 482337.61111607857,166046.74999094714 482339.89406430745,166011.74583306516 482328.6640402399,166011.13186545088 482330.5790858652,166004.40580526416 482313.8841250333,165995.45578310077 482311.04407232424,165986.90472601514 482308.30205776816,165982.0726736712 482294.6751175899,165979.4386831764 482292.11407342803,165976.74666644353 482289.497158236,165899.84941197015 482264.8940946159,165869.29827784642 482255.2771259079,165868.52726891052 482258.56606753974,165868.38028862118 482260.3340663107,165868.4712669673 482261.86314850824,165868.77225205908 482263.40203940653,165869.67226675144 482265.7321144773,165870.67225428545 482267.33307287534,165871.79227875813 482268.6280967436,165873.43232301722 482269.94106750196,165872.85431873804 482271.73604384495,165859.39522142088 482267.4240714624),(165940.77448270976 482218.33322843845,165944.22452076612 482227.1041601321,165950.84449544462 482224.5042468528,165947.40550719973 482215.704183836,165940.77448270976 482218.33322843845),(165988.2834341863 481993.02561051334,165987.16844019052 481996.4996890827,165988.64441476608 481996.9726212037,165987.372450483 482000.9536037061,165989.25942115605 482001.5556273442,165987.4364448771 482007.27065934683,165996.94850338978 482010.288634211,165999.36648882768 482002.6816601978,166004.11051088283 482004.19563692395,166006.53747695938 481996.633637221,166001.79845842728 481995.1046486911,166004.25946674342 481987.5016673862,165994.78641562958 481984.4296911814,165992.936448327 481990.13664986735,165991.03443861072 481989.5206833329,165989.74945852134 481993.497630687,165988.2834341863 481993.02561051334)),((165770.70677304774 480876.53069712035,165770.536768592 480876.0047152948,165773.1827870658 480875.57578046166,165775.54973754956 480875.19775313267,165805.11504480283 480966.92162979336,165834.14510546066 480957.56464399444,165891.6666154965 481136.02359245205,165905.31869812732 481178.3775641539,165836.31353847278 481200.6194925535,165822.6624279071 481158.26549094514,165814.0884203272 481161.02952517034,165811.68239555878 481148.67550719803,165823.73143364282 481145.3844633131,165854.20752218604 481135.45653249667,165847.1513999863 481113.57252679195,165841.32134709298 481095.4945620494,165835.492344386 481077.4156058137,165829.66525436094 481059.3465638337,165822.60918593645 481037.46259682236,165815.54912171973 481015.56861839304,165809.99907371998 480998.4285956074,165802.02399302027 480973.6876148568,165794.05297156327 480948.95566952834,165788.1319265725 480930.5877322591,165782.22086577112 480912.2487532343,165776.30278118345 480893.88973914855,165770.70677304774 480876.53069712035),(165833.25349588718 481161.17546683183,165832.3144548628 481161.5215512784,165836.15848971994 481173.47150982666,165837.11053207144 481173.1655096956,165843.1235316795 481191.85549232556,165851.94157576005 481189.0094869923,165860.50362192755 481186.2464934498,165869.06465495183 481183.48351249145,165877.62665215324 481180.720548479,165886.18763645564 481177.9574857892,165896.2337106576 481174.71549742355,165886.28362180485 481143.98556564905,165876.25758868846 481147.235518126,165867.70355799777 481150.00851581164,165859.15056190282 481152.7805291889,165853.91450703648 481154.47847423767,165852.19550400035 481148.7454882739,165850.19450258528 481142.07448384096,165849.5824694122 481140.03155528376,165849.43850588406 481140.07452058146,165852.05248622812 481148.7925723464,165853.77149161507 481154.5245568851,165850.60753492877 481155.55046525295,165842.05346714336 481158.3225058388,165834.20445387694 481160.8674610125,165833.25349588718 481161.17546683183)),((165960.17927882302 481921.8258100093,166012.34424551582 481759.0840178028,166022.14521790974 481728.24511586566,166031.79418719656 481696.74509726476,166041.42513576322 481663.6941479141,166049.5850707105 481633.26420126244,166058.68402618731 481593.5952206984,166064.62495930243 481559.2152395635,166069.32390902136 481528.5953227781,166074.02386650007 481485.3043251416,166076.93381866926 481448.8553972129,166078.08471020023 481415.6754693985,166077.9346373195 481376.3654226637,166076.77359289434 481337.3455119879,166073.33447668666 481291.5845675772,166067.3343192893 481245.95563193766,166061.37422548773 481209.90462836804,166054.33414940542 481174.0956631055,166046.7030684515 481141.6757140136,166037.18297547125 481107.11472961167,166024.8938545033 481067.4346662247,165975.01141201917 480912.1598730747,165908.78982323577 480706.0200216608,165932.4678412107 480697.9859559182,165962.33810554908 480790.9669277343,166048.71992073982 481059.8637894088,166061.18305531278 481100.10373740544,166070.93011676625 481135.4857379878,166078.7762296343 481168.82068623864,166085.97631042093 481205.444609844,166092.06841256854 481242.295594639,166098.21153095478 481289.0156036395,166101.7456417802 481336.0315043455,166102.93369437646 481375.9605096085,166103.08684389706 481416.0574241747,166101.8988601309 481450.2853709817,166098.9169394697 481487.64036907634,166094.11802925434 481531.8473813481,166089.29909334317 481563.24629943684,166083.20415541553 481598.5192454308,166073.85019402683 481639.2992494934,166065.4712408115 481670.5332167183,166055.72829030015 481703.96917686274,166046.02629930346 481735.6421578694,166036.17032815237 481766.6561312795,165880.66728750238 482251.79012318875,165879.3223348805 482255.98515759007,165870.91425172254 482253.2841598908,165864.58023530198 482251.2500981201,165859.39522142088 482267.4240714624,165850.33523032715 482264.5140551999,165960.17927882302 481921.8258100093)),((165893.09843377655 481540.1511493943,165865.49131977314 481532.05914822913,165867.54927288933 481525.10522256023,165879.0643191656 481528.5361596588,165891.77638575548 481532.2681751332,165895.13041732486 481533.24123828445,165893.09843377655 481540.1511493943)),((165869.08127331096 481519.9271384061,165880.59932803316 481523.3591982882,165893.3063660066 481527.08920379117,165896.64740066387 481528.08315691736,165895.13041732486 481533.24123828445,165891.77638575548 481532.2681751332,165879.0643191656 481528.5361596588,165867.54927288933 481525.10522256023,165869.08127331096 481519.9271384061)),((165869.08127331096 481519.9271384061,165870.61327667205 481514.749166038,165882.13434009094 481518.1822374329,165894.84434836917 481521.9311682699,165898.16535466668 481522.9191811999,165896.65241750143 481528.06514321023,165896.64740066387 481528.08315691736,165893.3063660066 481527.08920379117,165880.59932803316 481523.3591982882,165869.08127331096 481519.9271384061)),((165872.1452832179 481509.57119418646,165883.66833510826 481513.0041622153,165896.3713373239 481516.7511899681,165899.69038288604 481517.7331913193,165898.17435241595 481522.8891597626,165898.16535466668 481522.9191811999,165894.84434836917 481521.9311682699,165882.13434009094 481518.1822374329,165870.61327667205 481514.749166038,165872.1452832179 481509.57119418646)),((165872.1452832179 481509.57119418646,165873.67729294812 481504.3932228555,165885.20328536665 481507.8272022588,165897.90333968002 481511.55620259815,165901.21136076152 481512.5612122759,165899.69635646036 481517.7141783537,165899.69038288604 481517.7331913193,165896.3713373239 481516.7511899681,165883.66833510826 481513.0041622153,165872.1452832179 481509.57119418646)),((165875.20924209635 481499.2132491519,165886.73728430836 481502.6502407134,165899.42234036024 481506.3842186977,165902.7343960123 481507.3852327769,165901.218365878 481512.5381960822,165901.21136076152 481512.5612122759,165897.90333968002 481511.55620259815,165885.20328536665 481507.8272022588,165873.67729294812 481504.3932228555,165875.20924209635 481499.2132491519)),((165876.74125623505 481494.0361689687,165888.2723115794 481497.4721693098,165900.94134198249 481501.21323667804,165903.3433580554 481501.92918564315,165904.25833845264 481502.20124477724,165902.74037624605 481507.3632156981,165902.7343960123 481507.3852327769,165899.42234036024 481506.3842186977,165886.73728430836 481502.6502407134,165875.20924209635 481499.2132491519,165876.74125623505 481494.0361689687)),((165891.82230733614 481491.62027832307,165897.47634055186 481493.30127379094,165906.11937296687 481495.87120313005,165904.2623919882 481502.18723446043,165904.25833845264 481502.20124477724,165903.3433580554 481501.92918564315,165900.94134198249 481501.21323667804,165888.2723115794 481497.4721693098,165876.74125623505 481494.0361689687,165878.61824088683 481487.69324565696,165888.9282799268 481490.7592738712,165891.82230733614 481491.62027832307)),((165944.79885145818 481178.7555598329,165940.9638250668 481166.8606115619,165944.81482477117 481165.61553636834,165948.64786753405 481177.50959311274,165944.79885145818 481178.7555598329)),((165936.54584356796 481207.699518199,165929.67582654592 481209.9104735108,165924.12884127168 481211.6925502743,165920.90381222923 481201.6855597624,165933.3258276864 481197.68652243924,165934.48284759425 481201.28257951763,165936.54584356796 481207.699518199)),((165932.71481026363 481195.78856254957,165942.92389217904 481192.4915092783,165948.63385924912 481190.6505113363,165952.46891637606 481202.5455774916,165943.42091453492 481205.48758226004,165936.54584356796 481207.699518199,165934.48284759425 481201.28257951763,165933.3258276864 481197.68652243924,165932.71481026363 481195.78856254957)),((165928.88381791487 481183.8815045006,165926.81775358738 481177.45555016235,165925.6577841699 481173.8315612609,165925.0648026079 481171.97659024666,165935.2657636092 481168.7025348458,165940.9638250668 481166.8606115619,165944.79885145818 481178.7555598329,165935.77478973227 481181.6766027653,165928.88381791487 481183.8815045006)),((165960.13897532108 481226.33549698483,165956.30395514896 481214.44053561985,165960.15095575404 481213.20058163744,165963.9829787248 481225.09053244634,165960.13897532108 481226.33549698483)),((165956.30395514896 481214.44053561985,165952.46891637606 481202.5455774916,165956.3139019831 481201.2956022904,165960.15095575404 481213.20058163744,165956.30395514896 481214.44053561985)),((165952.48285594245 481189.4095544417,165956.3139019831 481201.2956022904,165952.46891637606 481202.5455774916,165948.63385924912 481190.6505113363,165952.48285594245 481189.4095544417)),((165944.79885145818 481178.7555598329,165948.64786753405 481177.50959311274,165952.48285594245 481189.4095544417,165948.63385924912 481190.6505113363,165944.79885145818 481178.7555598329)),((165940.9817653917 481153.7205927461,165944.81482477117 481165.61553636834,165940.9638250668 481166.8606115619,165937.12878032168 481154.9655552655,165940.9817653917 481153.7205927461)),((165940.9817653917 481153.7205927461,165937.12878032168 481154.9655552655,165932.37375480027 481140.215544091,165936.22770472043 481138.9705800083,165940.9817653917 481153.7205927461)),((165964.89403841048 481241.0855376612,165963.05302768055 481235.37549498817,165960.13897532108 481226.33549698483,165963.9829787248 481225.09053244634,165968.73504042928 481239.8365646448,165964.89403841048 481241.0855376612)),((165802.02399302027 480973.6876148568,165809.99907371998 480998.4285956074,165779.5610147902 481008.2696508966,165771.58796925325 480983.53361928085,165802.02399302027 480973.6876148568)),((165822.60918593645 481037.46259682236,165817.2181719826 481039.1916174552,165794.19015259045 481046.6316150005,165787.17005423043 481024.74455156905,165815.54912171973 481015.56861839304,165822.60918593645 481037.46259682236)),((165798.50226476917 481099.8185601817,165803.45727884932 481115.1415537492,165773.7592437802 481124.71645183617,165768.84218902295 481109.45854900277,165780.27220397923 481105.77951771766,165798.50226476917 481099.8185601817)),((165799.21918812083 481069.22953836713,165792.16316066612 481047.3965737889,165794.19015259045 481046.6316150005,165817.2181719826 481039.1916174552,165822.60918593645 481037.46259682236,165829.66525436094 481059.3465638337,165799.21918812083 481069.22953836713)),((165793.75132829722 481128.7324718677,165804.16329833507 481125.3754932473,165805.13332047366 481128.41556881135,165811.68239555878 481148.67550719803,165801.26337168008 481152.0354586903,165799.45834097321 481146.42046541837,165793.75132829722 481128.7324718677)),((165799.21918812083 481069.22953836713,165829.66525436094 481059.3465638337,165835.492344386 481077.4156058137,165827.0243031839 481080.140574016,165805.03924028226 481087.31955796864,165799.21918812083 481069.22953836713)),((165805.03924028226 481087.31955796864,165810.88331013816 481105.4135319523,165816.684352003 481123.520548419,165823.73143364282 481145.3844633131,165811.68239555878 481148.67550719803,165805.13332047366 481128.41556881135,165804.16329833507 481125.3754932473,165803.45727884932 481115.1415537492,165798.50226476917 481099.8185601817,165794.10724982165 481086.1055626836,165789.6861977294 481072.3145165163,165782.8121049136 481050.9255724577,165780.94908950687 481051.5405763582,165780.9100788994 481051.4195472039,165773.96205107903 481030.0095373427,165770.60704551917 481019.56454185536,165764.62994572392 481000.72964452335,165766.48497205196 481000.12763493793,165760.2829465038 480980.82661333535,165754.13286905934 480961.78963160724,165749.70980006928 480948.00763282424,165745.2717564758 480934.2646594566,165740.36473812314 480918.93471362256,165737.27473821864 480909.47467202117,165735.34367652657 480903.5747064268,165728.6406590719 480882.8817283568,165738.63867681925 480881.33275286073,165745.8437160834 480903.65674301836,165751.77780333883 480922.0406786393,165757.69286757722 480940.40366301994,165763.60686910295 480958.7646501255,165771.58796925325 480983.53361928085,165779.5610147902 481008.2696508966,165809.99907371998 480998.4285956074,165815.54912171973 481015.56861839304,165787.17005423043 481024.74455156905,165794.19015259045 481046.6316150005,165792.16316066612 481047.3965737889,165799.21918812083 481069.22953836713,165805.03924028226 481087.31955796864)),((165789.3793831147 481175.28645827976,165798.1083621269 481172.4784371293,165802.17141415383 481185.08041044057,165805.42044916144 481195.3554100336,165807.87149465547 481203.2124552643,165799.14445585056 481206.0284744372,165797.98348239536 481202.20045515895,165794.95742641244 481192.6604017623,165789.3793831147 481175.28645827976)),((165816.59847525915 481200.39645136514,165807.87149465547 481203.2124552643,165805.42044916144 481195.3554100336,165802.17141415383 481185.08041044057,165798.1083621269 481172.4784371293,165806.8374214708 481169.66943018365,165812.40746069382 481187.03046920174,165815.44652074503 481196.56544361706,165816.59847525915 481200.39645136514)),((165804.22552325492 481247.50836312154,165798.77555773532 481249.27043149626,165794.17451525794 481234.89239922474,165790.040483603 481222.11336638086,165795.49251017885 481220.3564110396,165796.72551110067 481224.17145823693,165799.6014908201 481233.142403265,165804.22552325492 481247.50836312154)),((165806.8374214708 481169.66943018365,165815.2434093422 481166.9654316354,165819.13143646508 481179.05043658486,165822.57751450696 481189.81243685796,165825.1135385119 481197.6484255169,165816.59847525915 481200.39645136514,165815.44652074503 481196.56544361706,165812.40746069382 481187.03046920174,165806.8374214708 481169.66943018365)),((165832.3144548628 481161.5215512784,165833.25349588718 481161.17546683183,165837.11053207144 481173.1655096956,165836.15848971994 481173.47150982666,165832.3144548628 481161.5215512784)),((165812.5765474452 481244.8093578957,165804.22552325492 481247.50836312154,165799.6014908201 481233.142403265,165796.72551110067 481224.17145823693,165795.49251017885 481220.3564110396,165803.84649189602 481217.6644071663,165809.0895179343 481233.8873874305,165812.5765474452 481244.8093578957)),((165812.5765474452 481244.8093578957,165809.0895179343 481233.8873874305,165803.84649189602 481217.6644071663,165812.20055093075 481214.97241758025,165813.447537585 481218.7784872005,165816.36456501708 481227.73640273476,165817.3325355461 481230.73542040045,165820.9275807907 481242.11036678863,165812.5765474452 481244.8093578957)),((165826.3776279051 481240.34943564463,165820.9275807907 481242.11036678863,165817.3325355461 481230.73542040045,165816.36456501708 481227.73640273476,165813.447537585 481218.7784872005,165812.20055093075 481214.97241758025,165817.6525229432 481213.2164879185,165818.91056491237 481217.01646362,165821.8195992788 481225.9774802488,165826.3776279051 481240.34943564463)),((165830.64859399022 481234.9194398026,165826.6675734102 481236.20047952776,165827.8525865298 481239.8724551546,165826.3776279051 481240.34943564463,165821.8195992788 481225.9774802488,165818.91056491237 481217.01646362,165817.6525229432 481213.2164879185,165823.10456946667 481211.45945178793,165827.27456949902 481224.218452369,165830.64859399022 481234.9194398026)),((165784.28590465026 481459.9431598627,165784.580929966 481459.00217660615,165785.5959004123 481455.5502011837,165788.38689940557 481456.3701971199,165793.87290232416 481437.7101881182,165794.01687317196 481437.75322834554,165795.3618555604 481433.1752054869,165802.763925968 481435.3552630413,165794.65391076147 481462.99320677517,165784.28590465026 481459.9431598627)),((165808.99602089508 481467.20522848406,165817.18399556502 481439.5251983774,165824.62502849937 481441.7132738949,165823.24797464852 481446.3232626617,165823.3920156111 481446.3651912605,165820.74502463543 481455.3992599747,165817.9330455101 481464.9632532137,165820.70304772386 481465.77721317613,165819.68900930948 481469.22918355267,165819.3730647613 481470.2552359135,165808.99602089508 481467.20522848406)),((165819.3730647613 481470.2552359135,165819.68900930948 481469.22918355267,165820.70304772386 481465.77721317613,165817.9330455101 481464.9632532137,165820.74502463543 481455.3992599747,165823.3920156111 481446.3651912605,165823.24797464852 481446.3232626617,165824.62502849937 481441.7132738949,165830.42703771713 481443.41921739513,165829.05303822085 481448.0332167751,165826.41504651489 481457.0631854822,165823.5790666665 481466.6232286844,165822.25705417473 481471.10315962805,165819.3730647613 481470.2552359135)),((165822.25705417473 481471.10315962805,165823.5790666665 481466.6232286844,165826.41504651489 481457.0631854822,165829.05303822085 481448.0332167751,165830.42703771713 481443.41921739513,165836.22904270093 481445.12527897663,165834.85802961228 481449.74317757157,165834.7140592224 481449.70024741895,165832.06707809644 481458.72118103574,165827.9150598663 481472.76617049647,165827.6230319796 481472.67918898124,165822.25705417473 481471.10315962805)),((165836.6310674592 481475.3272369474,165834.77111099343 481481.66921192576,165831.42309653418 481480.7601800219,165818.66706306094 481476.97414995317,165807.1290240118 481473.57022994,165808.99602089508 481467.20522848406,165819.3730647613 481470.2552359135,165822.25705417473 481471.10315962805,165827.6230319796 481472.67918898124,165827.9150598663 481472.76617049647,165836.6310674592 481475.3272369474)),((165702.08617533752 481203.37240525684,165707.698228188 481220.81630912225,165710.67626070618 481230.3733395914,165711.8762536899 481234.1892952708,165703.4442182028 481236.91032514203,165697.7431872291 481218.77539447945,165693.68317810545 481206.0753786871,165702.08617533752 481203.37240525684)),((165720.60230581425 481231.373342504,165711.8762536899 481234.1892952708,165710.67626070618 481230.3733395914,165707.698228188 481220.81630912225,165702.08617533752 481203.37240525684,165710.81519307548 481200.5633400208,165714.9112243282 481213.23540953355,165718.11326585078 481223.5293871783,165720.60230581425 481231.373342504)),((165714.91335148847 481272.22036780615,165707.31329987882 481248.74530289543,165714.59331353637 481246.3942909105,165715.8582840432 481250.2073845911,165722.21137888666 481269.8803100119,165720.5043766146 481270.4373732078,165714.91335148847 481272.22036780615)),((165727.38639761863 481272.2523536715,165716.10334139835 481275.895331588,165714.91335148847 481272.22036780615,165720.5043766146 481270.4373732078,165722.21137888666 481269.8803100119,165726.19135907304 481268.5822718183,165727.38639761863 481272.2523536715)),((165714.59331353637 481246.3942909105,165720.04529258763 481244.63435943174,165721.30132114777 481248.45032795117,165728.82339729104 481271.7892804257,165727.38639761863 481272.2523536715,165726.19135907304 481268.5822718183,165722.21137888666 481269.8803100119,165715.8582840432 481250.2073845911,165714.59331353637 481246.3942909105)),((165720.60230581425 481231.373342504,165718.11326585078 481223.5293871783,165714.9112243282 481213.23540953355,165710.81519307548 481200.5633400208,165719.54421835704 481197.7554028533,165725.1382394831 481215.1883834767,165728.14926428013 481224.7353711206,165729.32932247905 481228.5574072319,165720.60230581425 481231.373342504)),((165705.3020483263 481146.65442658326,165675.90201051926 481156.17036465387,165669.55094053983 481136.19542623137,165698.88103838265 481126.7204665121,165700.41401468738 481131.47843376535,165705.3020483263 481146.65442658326)),((165695.87495793874 481117.38646867196,165698.88103838265 481126.7204665121,165669.55094053983 481136.19542623137,165663.1508710861 481116.216385467,165692.44894243017 481106.7494406987,165695.87495793874 481117.38646867196)),((165692.44894243017 481106.7494406987,165663.1508710861 481116.216385467,165656.7638580151 481096.22948227986,165686.00988237115 481086.7584927733,165686.81593508384 481089.2614522431,165691.34494702617 481103.3244577809,165692.44894243017 481106.7494406987)),((165682.26786047127 481075.1414428623,165686.00988237115 481086.7584927733,165656.7638580151 481096.22948227986,165650.34775066923 481076.2404114006,165679.56785737386 481066.7585352824,165682.26786047127 481075.1414428623)),((165677.7228085178 481061.03045700997,165679.56785737386 481066.7585352824,165650.34775066923 481076.2404114006,165643.97375326228 481056.2404253602,165673.12279942227 481046.74945683393,165677.7228085178 481061.03045700997)),((165665.2167271966 481022.23148489284,165669.75774128851 481036.3195289759,165657.01070788447 481040.44147329027,165640.6076735651 481045.7844793601,165633.76962697253 481024.34352915717,165662.85469769547 481014.9065478738,165665.2167271966 481022.23148489284)),((165656.1386727924 480994.0735551053,165660.6777128998 481008.1525733653,165662.85469769547 481014.9065478738,165633.76962697253 481024.34352915717,165626.91556022537 481002.9364904099,165655.95464276624 480993.50259621587,165656.1386727924 480994.0735551053)),((165649.0525699072 480972.0895271607,165651.6006294285 480979.9945435866,165655.95464276624 480993.50259621587,165626.91556022537 481002.9364904099,165620.04149362512 480981.51150561386,165649.0525699072 480972.0895271607)),((165656.1386727924 480994.0735551053,165655.95464276624 480993.50259621587,165651.6006294285 480979.9945435866,165680.7376970608 480970.5815901459,165685.28873225473 480984.6725617586,165656.1386727924 480994.0735551053)),((165660.6777128998 481008.1525733653,165656.1386727924 480994.0735551053,165685.28873225473 480984.6725617586,165689.82074318492 480998.7515915497,165671.74072219664 481004.55650303455,165660.6777128998 481008.1525733653)),((165660.6777128998 481008.1525733653,165671.74072219664 481004.55650303455,165689.82074318492 480998.7515915497,165694.39581986226 481012.8314980565,165665.2167271966 481022.23148489284,165662.85469769547 481014.9065478738,165660.6777128998 481008.1525733653)),((165694.39581986226 481012.8314980565,165698.92286276966 481026.9135303987,165685.32080501522 481031.3154916907,165678.1797602082 481033.61855879077,165669.75774128851 481036.3195289759,165665.2167271966 481022.23148489284,165694.39581986226 481012.8314980565)),((165677.7228085178 481061.03045700997,165673.12279942227 481046.74945683393,165700.16085605856 481038.04550473945,165704.7448605624 481052.2855502074,165677.7228085178 481061.03045700997)),((165682.26786047127 481075.1414428623,165679.56785737386 481066.7585352824,165677.7228085178 481061.03045700997,165704.7448605624 481052.2855502074,165706.80189334918 481051.65246858,165711.3709330973 481065.73549467267,165694.0118988219 481071.4235043166,165682.26786047127 481075.1414428623)),((165682.26786047127 481075.1414428623,165694.0118988219 481071.4235043166,165711.3709330973 481065.73549467267,165715.89894905448 481079.7955159842,165686.81593508384 481089.2614522431,165686.00988237115 481086.7584927733,165682.26786047127 481075.1414428623)),((165686.81593508384 481089.2614522431,165715.89894905448 481079.7955159842,165720.4460383135 481093.8835105415,165706.03001425508 481098.5694844996,165691.34494702617 481103.3244577809,165686.81593508384 481089.2614522431)),((165692.44894243017 481106.7494406987,165691.34494702617 481103.3244577809,165706.03001425508 481098.5694844996,165720.4460383135 481093.8835105415,165724.99705833508 481107.97051686584,165710.78603248336 481112.59450324246,165695.87495793874 481117.38646867196,165692.44894243017 481106.7494406987)),((165724.99705833508 481107.97051686584,165729.54009859625 481122.04649532033,165711.89106420428 481127.78944391175,165700.41401468738 481131.47843376535,165698.88103838265 481126.7204665121,165695.87495793874 481117.38646867196,165710.78603248336 481112.59450324246,165724.99705833508 481107.97051686584)),((165734.4521396814 481137.24548951746,165705.3020483263 481146.65442658326,165700.41401468738 481131.47843376535,165711.89106420428 481127.78944391175,165729.54009859625 481122.04649532033,165734.4521396814 481137.24548951746)),((165738.16194859543 481014.2605593478,165742.755978062 481028.52258053963,165715.05491697186 481037.37150660635,165710.47685048796 481023.1045389031,165738.16194859543 481014.2605593478)),((165733.55590598722 480999.96057572326,165736.62288285774 481009.4805378496,165738.16194859543 481014.2605593478,165710.47685048796 481023.1045389031,165710.46285964557 481023.0475413903,165708.35282638256 481023.71555468504,165703.78783296674 481009.5996071852,165733.55590598722 480999.96057572326)),((165699.20177862456 480995.4046212557,165716.56078040772 480989.73153913725,165728.96582642768 480985.70758491463,165730.4898739962 480990.4396163693,165733.55590598722 480999.96057572326,165703.78783296674 481009.5996071852,165699.20177862456 480995.4046212557)),((165699.20177862456 480995.4046212557,165694.5887459312 480981.1235745071,165724.35281870016 480971.3875680756,165728.96582642768 480985.70758491463,165716.56078040772 480989.73153913725,165699.20177862456 480995.4046212557)),((165690.96304236684 481161.88443377306,165698.48310648455 481185.17838073144,165688.07310791782 481188.53536355897,165681.53306035264 481168.2743844818,165680.54303647086 481165.24541627563,165690.96304236684 481161.88443377306)),((165701.241071616 481158.56945126434,165703.20107209298 481164.64838160586,165708.76914462214 481181.860427097,165698.48310648455 481185.17838073144,165690.96304236684 481161.88443377306,165701.241071616 481158.56945126434)),((165711.51911494508 481155.254378882,165717.22517172978 481172.9383812277,165719.04618793767 481178.5463695621,165708.76914462214 481181.860427097,165703.20107209298 481164.64838160586,165701.241071616 481158.56945126434,165711.51911494508 481155.254378882)),((165721.79710368768 481151.9394390017,165723.74411552557 481158.02346741577,165725.91517520873 481164.6724258073,165729.32317666116 481175.2324445252,165719.04618793767 481178.5463695621,165717.22517172978 481172.9383812277,165711.51911494508 481155.254378882,165721.79710368768 481151.9394390017)),((165729.32317666116 481175.2324445252,165725.91517520873 481164.6724258073,165723.74411552557 481158.02346741577,165721.79710368768 481151.9394390017,165732.07517469442 481148.62440939253,165733.6001518292 481153.37447009963,165739.60024764334 481171.918429759,165729.32317666116 481175.2324445252)),((165744.0691597118 481134.3254810618,165734.4521396814 481137.24548951746,165729.54009859625 481122.04649532033,165724.99705833508 481107.97051686584,165720.4460383135 481093.8835105415,165715.89894905448 481079.7955159842,165711.3709330973 481065.73549467267,165706.80189334918 481051.65246858,165704.7448605624 481052.2855502074,165700.16085605856 481038.04550473945,165673.12279942227 481046.74945683393,165643.97375326228 481056.2404253602,165640.6076735651 481045.7844793601,165657.01070788447 481040.44147329027,165669.75774128851 481036.3195289759,165678.1797602082 481033.61855879077,165685.32080501522 481031.3154916907,165698.92286276966 481026.9135303987,165694.39581986226 481012.8314980565,165689.82074318492 480998.7515915497,165685.28873225473 480984.6725617586,165680.7376970608 480970.5815901459,165676.18266685502 480956.4655801002,165671.2726088129 480941.31761282677,165680.77863373855 480938.2345733982,165685.66868356994 480953.4786388692,165690.1106654938 480967.2975605761,165694.5887459312 480981.1235745071,165699.20177862456 480995.4046212557,165703.78783296674 481009.5996071852,165708.35282638256 481023.71555468504,165710.46285964557 481023.0475413903,165710.47685048796 481023.1045389031,165715.05491697186 481037.37150660635,165742.755978062 481028.52258053963,165749.7149720541 481026.265607322,165757.8109932328 481023.6556331221,165770.60704551917 481019.56454185536,165773.96205107903 481030.0095373427,165746.13098868445 481038.97950592457,165716.31991080538 481048.61158124864,165720.882987899 481062.85448954423,165725.50401482623 481077.15149142453,165730.10002995466 481091.43053018703,165734.55407641333 481105.2304959504,165739.06214865297 481119.03948478634,165744.0691597118 481134.3254810618)),((165601.6954647942 481546.6719394332,165603.2665091612 481557.8749336627,165605.13056301366 481571.1788902562,165606.29552746078 481579.4919302932,165603.93553425858 481579.8729459884,165601.81456528604 481580.6709376807,165600.84352435562 481581.3269791026,165599.85957510618 481582.0889164069,165597.87554561417 481582.77493841195,165596.68251470744 481583.4638832395,165593.01144504713 481547.03092506714,165601.6954647942 481546.6719394332)),((165613.28859894958 481577.5799795205,165608.9645699642 481578.9539187594,165606.29552746078 481579.4919302932,165605.13056301366 481571.1788902562,165603.2665091612 481557.8749336627,165601.6954647942 481546.6719394332,165608.92851025684 481546.3739382984,165610.40250501593 481556.91793163173,165612.08657528792 481568.9728984502,165613.28859894958 481577.5799795205)),((165620.21859594 481575.1679933951,165619.30361080015 481575.3409318947,165618.05659153924 481575.7699537777,165615.57457625074 481577.282924743,165613.28859894958 481577.5799795205,165612.08657528792 481568.9728984502,165610.40250501593 481556.91793163173,165608.92851025684 481546.3739382984,165616.15855676873 481546.07594130037,165617.5385718406 481555.9609400558,165619.04956229002 481566.7919658535,165620.21859594 481575.1679933951)),((165623.9376382452 481574.2589582951,165623.01662087196 481574.6369428262,165620.21859594 481575.1679933951,165619.04956229002 481566.7919658535,165617.5385718406 481555.9609400558,165616.15855676873 481546.07594130037,165630.81959485167 481545.47095438227,165630.21454977486 481547.5409433741,165628.09460247122 481555.2969364661,165625.4496212022 481564.38196237275,165623.9376382452 481574.2589582951)),((165628.31663550483 481572.72292747104,165628.04863887076 481572.71700972883,165627.295598274 481572.8799478917,165623.9376382452 481574.2589582951,165625.4496212022 481564.38196237275,165628.09460247122 481555.2969364661,165630.21454977486 481547.5409433741,165630.81959485167 481545.47095438227,165631.22455350097 481544.08903662313,165633.3745833264 481544.7169693225,165636.29257085733 481545.5699760255,165633.00861587102 481556.7359281843,165630.34462376888 481565.81200944126,165628.31663550483 481572.72292747104)),((165633.3856519854 481573.5369492708,165632.82463946828 481573.27093218954,165630.5476559399 481572.77791210177,165628.31663550483 481572.72292747104,165630.34462376888 481565.81200944126,165633.00861587102 481556.7359281843,165636.29257085733 481545.5699760255,165639.0665883725 481546.3799487256,165641.1875889794 481547.00003377564,165640.17763841612 481550.4559441469,165637.91261260203 481558.1710089705,165635.23962159565 481567.2429514656,165633.3856519854 481573.5369492708)),((165641.1875889794 481547.00003377564,165643.28964864177 481547.61395936704,165646.08260235947 481548.430986488,165642.7976639682 481559.6009356378,165640.13564119017 481568.67301044683,165638.23264531 481575.1569398359,165637.4426444891 481575.10194171686,165635.3536547517 481574.47091204784,165633.3856519854 481573.5369492708,165635.23962159565 481567.2429514656,165637.91261260203 481558.1710089705,165640.17763841612 481550.4559441469,165641.1875889794 481547.00003377564)),((165646.08260235947 481548.430986488,165648.85661667652 481549.24096469354,165650.96862176774 481549.85803041206,165649.958664692 481553.31405006663,165647.69163715083 481561.03400178667,165645.03063553 481570.10296081327,165643.2706992526 481576.0999714038,165639.91967184047 481575.27395426604,165638.23264531 481575.1569398359,165640.13564119017 481568.67301044683,165642.7976639682 481559.6009356378,165646.08260235947 481548.430986488)),((165650.96862176774 481549.85803041206,165653.05364497183 481550.467027788,165657.99464405555 481551.91099821345,165650.32766874752 481578.0449577952,165648.0466597634 481577.8079396033,165644.648671317 481576.43896047387,165643.2706992526 481576.0999714038,165645.03063553 481570.10296081327,165647.69163715083 481561.03400178667,165649.958664692 481553.31405006663,165650.96862176774 481549.85803041206)),((165597.10836855051 481501.71796845895,165598.75642536755 481513.5499901675,165600.78144138883 481528.0779719089,165601.90946393978 481536.1719631933,165601.79148220416 481536.1869529567,165600.50544929018 481536.5239913413,165598.6064298529 481537.42793941393,165597.56047163295 481538.20198303956,165595.37948262927 481538.55801897385,165594.34147427918 481538.8050224204,165592.372445522 481540.68994923134,165588.5163591032 481502.0869509593,165597.10836855051 481501.71796845895)),((165597.10836855051 481501.71796845895,165604.32943953897 481501.40702809585,165605.8934301998 481512.59698919836,165607.74949452898 481525.88001087715,165608.8854826356 481534.00595366396,165608.20447646998 481534.1490220308,165606.98346215248 481534.59201060794,165605.26547829775 481535.54897306906,165604.510497712 481535.8509906347,165601.90946393978 481536.1719631933,165600.78144138883 481528.0779719089,165598.75642536755 481513.5499901675,165597.10836855051 481501.71796845895)),((165615.8315313926 481531.766010167,165615.3114868945 481531.91298419517,165611.34546807274 481533.4889680317,165608.8854826356 481534.00595366396,165607.74949452898 481525.88001087715,165605.8934301998 481512.59698919836,165604.32943953897 481501.40702809585,165611.56142035974 481501.0960104723,165613.03043996624 481511.64299716364,165614.70650677482 481523.6830372915,165615.8315313926 481531.766010167)),((165622.75852275462 481529.29204706463,165620.85555015082 481529.8120057646,165618.75952816228 481531.2989910082,165616.7705169842 481531.50099598616,165615.8315313926 481531.766010167,165614.70650677482 481523.6830372915,165613.03043996624 481511.64299716364,165611.56142035974 481501.0960104723,165618.78644569792 481500.7859898448,165620.16649585604 481510.6900147568,165621.67753720444 481521.5330571065,165622.75852275462 481529.29204706463)),((165625.36251695952 481528.5799986202,165622.75852275462 481529.29204706463,165621.67753720444 481521.5330571065,165620.16649585604 481510.6900147568,165618.78644569792 481500.7859898448,165633.42851383932 481500.1560463788,165632.83250715226 481502.20502546395,165630.69952356882 481510.02007002296,165628.0715206423 481519.09099991864,165625.36251695952 481528.5799986202)),((165631.39255629783 481525.9149679285,165630.9685436477 481525.75995393127,165626.60055760553 481527.95702596626,165625.36251695952 481528.5799986202,165628.0715206423 481519.09099991864,165630.69952356882 481510.02007002296,165632.83250715226 481502.20502546395,165633.42851383932 481500.1560463788,165633.83247599567 481498.76400175615,165635.98251853054 481499.39505090343,165638.89950109937 481500.2520623487,165635.61351528965 481511.4580626708,165632.96656307607 481520.5230521847,165631.39255629783 481525.9149679285)),((165636.15255543543 481527.8090347562,165635.76454149632 481527.74900617154,165633.54852585605 481526.7010197023,165631.39255629783 481525.9149679285,165632.96656307607 481520.5230521847,165635.61351528965 481511.4580626708,165638.89950109937 481500.2520623487,165641.6435532639 481501.0580775339,165643.76354626822 481501.6800529023,165642.74956631157 481505.1340623208,165640.50856337114 481512.89001112076,165637.8615369034 481521.9539965238,165636.15255543543 481527.8090347562)),((165641.0645587276 481529.1800476667,165638.37758717962 481528.1529627594,165636.15255543543 481527.8090347562,165637.8615369034 481521.9539965238,165640.50856337114 481512.89001112076,165642.74956631157 481505.1340623208,165643.76354626822 481501.6800529023,165645.86452733708 481502.2970925542,165648.68557037693 481503.12608684925,165645.4025835435 481514.32307485805,165642.75657368667 481523.3860584972,165641.0645587276 481529.1800476667)),((165645.72461313903 481531.4160453151,165643.13460460407 481529.8150443105,165641.31457092945 481529.27504986216,165641.0645587276 481529.1800476667,165642.75657368667 481523.3860584972,165645.4025835435 481514.32307485805,165648.68557037693 481503.12608684925,165651.4875353038 481503.949033332,165653.5885826305 481504.5660764206,165652.57459638227 481508.0200838466,165650.2975556335 481515.7560342427,165647.65160788404 481524.81801406626,165645.72461313903 481531.4160453151)),((165594.43835523605 481468.28806687647,165600.1983606112 481464.6210421077,165612.83637232205 481459.5890219916,165620.33443431728 481482.60899424774,165617.41239246196 481483.43207033456,165615.567429844 481484.39298408286,165611.76339167368 481487.9240030302,165610.4653846653 481489.7019940075,165609.1804135772 481491.25203327456,165594.43835523605 481468.28806687647)),((165651.00263553346 481531.53602544207,165650.68361048083 481531.4800387959,165648.0476012429 481531.2610583079,165646.0606299827 481531.6230536444,165645.72461313903 481531.4160453151,165647.65160788404 481524.81801406626,165650.2975556335 481515.7560342427,165652.57459638227 481508.0200838466,165653.5885826305 481504.5660764206,165655.69957732878 481505.1860347452,165658.47258306312 481506.00002155197,165655.1925952362 481517.1879972574,165652.54664141696 481526.2489731121,165651.00263553346 481531.53602544207)),((165655.69661185972 481533.65705866605,165655.4066068051 481533.64397103206,165653.0226090003 481532.37297374895,165652.3046370842 481531.7630322554,165651.00263553346 481531.53602544207,165652.54664141696 481526.2489731121,165655.1925952362 481517.1879972574,165658.47258306312 481506.00002155197,165661.29362405348 481506.82802168775,165663.39460076226 481507.4450688031,165662.38060607156 481510.9000756058,165660.08660692768 481518.6210755559,165657.4416015454 481527.68104950315,165655.69661185972 481533.65705866605)),((165663.39460076226 481507.4450688031,165665.47860903255 481508.0580746425,165670.22964096483 481509.46604211105,165662.57364781812 481535.79004389286,165661.11068602707 481535.338044527,165660.1266268186 481534.8480261718,165658.27065199334 481533.7779970369,165655.69661185972 481533.65705866605,165657.4416015454 481527.68104950315,165660.08660692768 481518.6210755559,165662.38060607156 481510.9000756058,165663.39460076226 481507.4450688031)),((165609.1804135772 481491.25203327456,165606.64137371397 481493.6790316174,165604.2244188458 481495.22997775994,165602.0863669969 481495.8700489089,165597.89835535063 481496.7679685144,165593.188377013 481497.3100615866,165588.03632643542 481497.5650396594,165587.65731793118 481493.6549637098,165585.72233638985 481491.07004353654,165587.94934977996 481486.58998821466,165587.7653250545 481478.26604016084,165588.21129993236 481474.9870435183,165590.01334120362 481471.9130116907,165592.43131333546 481469.63706420065,165594.43835523605 481468.28806687647,165609.1804135772 481491.25203327456)),((165625.61842997943 481484.47602831735,165621.1104070053 481482.5680497702,165620.85143608338 481482.51608853386,165620.5864597661 481482.53009397513,165620.33443431728 481482.60899424774,165612.83637232205 481459.5890219916,165620.71241652773 481456.7870874901,165627.99739901253 481454.5000468303,165635.8624803692 481479.10100514797,165634.66750241435 481480.9960390412,165634.4774464169 481481.29904667084,165634.34248522227 481481.63110167166,165634.2674835271 481481.98108809546,165634.09446386903 481482.3830462035,165633.8515055482 481482.7470238606,165633.54647508613 481483.0610215058,165633.18948459928 481483.31504716893,165631.25648065427 481484.411062512,165629.91048233415 481484.59909278114,165627.1144806144 481484.76809059485,165626.603464249 481484.74106588034,165626.10146400786 481484.64307415194,165625.61842997943 481484.47602831735)),((165648.08653428173 481476.2990276144,165647.86148435998 481475.94605757366,165647.57353313183 481475.643020685,165647.2324787548 481475.39906175155,165646.85247903992 481475.2251152005,165646.44552518346 481475.1251011414,165646.02749005595 481475.10506207735,165643.58148713713 481475.28804590553,165642.12246694972 481475.65507555055,165638.07150308546 481477.1080192522,165636.6764993843 481477.95206626377,165636.23644210448 481478.47005359555,165635.8624803692 481479.10100514797,165627.99739901253 481454.5000468303,165636.2674338283 481452.2540818349,165643.30345424515 481450.68607193313,165649.01146646184 481450.635073883,165648.08653428173 481476.2990276144)),((165649.01146646184 481450.635073883,165661.20053165723 481452.01012863585,165669.51655038618 481453.89110264566,165660.14857230982 481485.5410656815,165654.23356992472 481483.0190674538,165653.72155860608 481482.7580494559,165653.2395243348 481482.4440232437,165652.79249916642 481482.08311920054,165652.38654961833 481481.6760179917,165652.02452553634 481481.2290678083,165648.08653428173 481476.2990276144,165649.01146646184 481450.635073883)),((165669.51655038618 481453.89110264566,165677.21057037477 481455.7971147626,165678.09361457388 481474.8440950918,165679.7696094002 481477.1761442125,165675.3816531761 481492.013062,165671.26163448754 481491.7910823835,165667.6125819265 481490.75711747725,165663.79056113077 481487.1331103664,165660.14857230982 481485.5410656815,165669.51655038618 481453.89110264566)),((165681.03342769816 481370.15520559694,165641.61332610715 481382.8551930367,165641.5133125544 481382.5352045473,165638.62327390848 481383.47516436345,165634.75324187803 481371.4851336322,165635.76328570157 481371.1652004403,165635.0433026686 481368.94515537814,165663.8433302382 481360.86520960403,165657.52328062925 481341.24516691454,165628.47320274284 481351.8552004529,165625.06317551967 481341.27521638497,165665.82326523197 481328.1352726176,165666.68328978316 481330.79522885894,165667.64327717246 481330.48520777485,165678.1333795042 481363.04516690416,165678.6834249223 481362.87523271586,165681.03342769816 481370.15520559694)),((165617.09714722337 481317.51421955513,165606.96301187953 481285.8701942276,165646.96914224676 481273.1072177767,165657.14321245725 481304.6542777951,165617.09714722337 481317.51421955513)),((165697.51917027353 481223.1333431713,165698.7212011478 481226.9583123765,165695.85917038817 481227.8583556615,165694.65720787522 481224.0323859261,165697.51917027353 481223.1333431713)),((165691.0211510048 481200.6953381686,165684.65409020818 481202.74839304714,165627.13258731828 481024.289515661,165607.1455695246 481030.731438868,165566.96323440745 480906.0715719191,165574.42528150935 480904.9875946103,165574.58128517252 480905.4695904154,165583.41331453214 480932.7785604291,165586.3243433018 480937.3354978831,165597.32340997134 480954.55349533306,165613.19249478946 480960.0385192044,165620.04149362512 480981.51150561386,165626.91556022537 481002.9364904099,165633.76962697253 481024.34352915717,165640.6076735651 481045.7844793601,165643.97375326228 481056.2404253602,165650.34775066923 481076.2404114006,165656.7638580151 481096.22948227986,165663.1508710861 481116.216385467,165669.55094053983 481136.19542623137,165675.90201051926 481156.17036465387,165680.54303647086 481165.24541627563,165681.53306035264 481168.2743844818,165688.07310791782 481188.53536355897,165691.87410709585 481200.42136204895,165691.16416331995 481200.64936207084,165688.9681318548 481194.1513498069,165688.82613778592 481194.19933092536,165691.0211510048 481200.6953381686)),((165394.9029742899 481052.66726315656,165391.35300913145 481055.2353273808,165419.3029016435 480960.14942550805,165522.93914092943 480915.56648424943,165552.40018022567 480908.1865915554,165566.96323440745 480906.0715719191,165607.1455695246 481030.731438868,165627.13258731828 481024.289515661,165684.65409020818 481202.74839304714,165690.637159789 481221.30839094444,165698.30625700488 481245.10234980984,165726.6254969247 481332.95825022587,165621.25993950333 481746.4797864231,165608.29683258527 481742.66481066804,165530.07598408076 481402.1821074725,165504.24280883875 481322.0651372312,165506.19878915494 481318.29511296586,165535.80903714304 481410.38904937153,165552.20405153732 481405.0530219699,165546.18801888666 481386.17912897764,165541.54601756966 481371.76508184953,165554.2629943963 481367.735124824,165562.40305383655 481365.1051199224,165574.37903995242 481361.12113882875,165564.77300100867 481331.25810891256,165509.9188188538 481314.44116910786,165465.68434751168 481121.8952823013,165427.8932166291 481135.29226641194,165401.2360271267 481050.67228847835,165394.9029742899 481052.66726315656),(165427.52394187503 480977.50537967804,165440.88706372227 481019.16937753715,165489.6121819983 481003.45438690356,165489.7661682667 481003.89342792385,165501.345250247 481038.8804116276,165549.2653961326 481023.05548012163,165537.74729069465 480988.0414772943,165536.48827910237 480984.2474703807,165550.1163297019 480979.8685207914,165551.204297186 480983.2904326845,165554.06332501216 480982.3815094123,165552.97231042304 480978.9504667289,165550.39932501575 480970.86152901244,165538.51629952638 480974.6894406412,165529.12722465204 480945.6495404934,165506.22314893643 480953.0694465758,165498.83109759056 480930.19554248103,165465.89800546746 480944.3154379804,165467.87100096743 480950.48842851777,165464.2350314395 480954.8794289921,165466.6010389317 480962.2814950371,165481.35811240494 480957.5234483394,165482.11709943743 480959.9004340465,165427.52394187503 480977.50537967804),(165584.85220088865 481409.5310950002,165586.09217947957 481413.3250766451,165588.95218029778 481412.39013984415,165587.7132266067 481408.5960484149,165584.85220088865 481409.5310950002),(165585.72233638985 481491.07004353654,165587.65731793118 481493.6549637098,165588.03632643542 481497.5650396594,165593.188377013 481497.3100615866,165597.89835535063 481496.7679685144,165602.0863669969 481495.8700489089,165604.2244188458 481495.22997775994,165606.64137371397 481493.6790316174,165609.1804135772 481491.25203327456,165610.4653846653 481489.7019940075,165611.76339167368 481487.9240030302,165615.567429844 481484.39298408286,165617.41239246196 481483.43207033456,165620.33443431728 481482.60899424774,165620.5864597661 481482.53009397513,165620.85143608338 481482.51608853386,165621.1104070053 481482.5680497702,165625.61842997943 481484.47602831735,165626.10146400786 481484.64307415194,165626.603464249 481484.74106588034,165627.1144806144 481484.76809059485,165629.91048233415 481484.59909278114,165631.25648065427 481484.411062512,165633.18948459928 481483.31504716893,165633.54647508613 481483.0610215058,165633.8515055482 481482.7470238606,165634.09446386903 481482.3830462035,165634.2674835271 481481.98108809546,165634.34248522227 481481.63110167166,165634.4774464169 481481.29904667084,165634.66750241435 481480.9960390412,165635.8624803692 481479.10100514797,165636.23644210448 481478.47005359555,165636.6764993843 481477.95206626377,165638.07150308546 481477.1080192522,165642.12246694972 481475.65507555055,165643.58148713713 481475.28804590553,165646.02749005595 481475.10506207735,165646.44552518346 481475.1251011414,165646.85247903992 481475.2251152005,165647.2324787548 481475.39906175155,165647.57353313183 481475.643020685,165647.86148435998 481475.94605757366,165648.08653428173 481476.2990276144,165652.02452553634 481481.2290678083,165652.38654961833 481481.6760179917,165652.79249916642 481482.08311920054,165653.2395243348 481482.4440232437,165653.72155860608 481482.7580494559,165654.23356992472 481483.0190674538,165660.14857230982 481485.5410656815,165663.79056113077 481487.1331103664,165667.6125819265 481490.75711747725,165671.26163448754 481491.7910823835,165675.3816531761 481492.013062,165679.7696094002 481477.1761442125,165678.09361457388 481474.8440950918,165677.21057037477 481455.7971147626,165669.51655038618 481453.89110264566,165661.20053165723 481452.01012863585,165649.01146646184 481450.635073883,165643.30345424515 481450.68607193313,165636.2674338283 481452.2540818349,165627.99739901253 481454.5000468303,165620.71241652773 481456.7870874901,165612.83637232205 481459.5890219916,165600.1983606112 481464.6210421077,165594.43835523605 481468.28806687647,165592.43131333546 481469.63706420065,165590.01334120362 481471.9130116907,165588.21129993236 481474.9870435183,165587.7653250545 481478.26604016084,165587.94934977996 481486.58998821466,165585.72233638985 481491.07004353654),(165588.5163591032 481502.0869509593,165592.372445522 481540.68994923134,165594.34147427918 481538.8050224204,165595.37948262927 481538.55801897385,165597.56047163295 481538.20198303956,165598.6064298529 481537.42793941393,165600.50544929018 481536.5239913413,165601.79148220416 481536.1869529567,165601.90946393978 481536.1719631933,165604.510497712 481535.8509906347,165605.26547829775 481535.54897306906,165606.98346215248 481534.59201060794,165608.20447646998 481534.1490220308,165608.8854826356 481534.00595366396,165611.34546807274 481533.4889680317,165615.3114868945 481531.91298419517,165615.8315313926 481531.766010167,165616.7705169842 481531.50099598616,165618.75952816228 481531.2989910082,165620.85555015082 481529.8120057646,165622.75852275462 481529.29204706463,165625.36251695952 481528.5799986202,165626.60055760553 481527.95702596626,165630.9685436477 481525.75995393127,165631.39255629783 481525.9149679285,165633.54852585605 481526.7010197023,165635.76454149632 481527.74900617154,165636.15255543543 481527.8090347562,165638.37758717962 481528.1529627594,165641.0645587276 481529.1800476667,165641.31457092945 481529.27504986216,165643.13460460407 481529.8150443105,165645.72461313903 481531.4160453151,165646.0606299827 481531.6230536444,165648.0476012429 481531.2610583079,165650.68361048083 481531.4800387959,165651.00263553346 481531.53602544207,165652.3046370842 481531.7630322554,165653.0226090003 481532.37297374895,165655.4066068051 481533.64397103206,165655.69661185972 481533.65705866605,165658.27065199334 481533.7779970369,165660.1266268186 481534.8480261718,165661.11068602707 481535.338044527,165662.57364781812 481535.79004389286,165670.22964096483 481509.46604211105,165665.47860903255 481508.0580746425,165663.39460076226 481507.4450688031,165661.29362405348 481506.82802168775,165658.47258306312 481506.00002155197,165655.69957732878 481505.1860347452,165653.5885826305 481504.5660764206,165651.4875353038 481503.949033332,165648.68557037693 481503.12608684925,165645.86452733708 481502.2970925542,165643.76354626822 481501.6800529023,165641.6435532639 481501.0580775339,165638.89950109937 481500.2520623487,165635.98251853054 481499.39505090343,165633.83247599567 481498.76400175615,165633.42851383932 481500.1560463788,165618.78644569792 481500.7859898448,165611.56142035974 481501.0960104723,165604.32943953897 481501.40702809585,165597.10836855051 481501.71796845895,165588.5163591032 481502.0869509593),(165593.01144504713 481547.03092506714,165596.68251470744 481583.4638832395,165597.87554561417 481582.77493841195,165599.85957510618 481582.0889164069,165600.84352435562 481581.3269791026,165601.81456528604 481580.6709376807,165603.93553425858 481579.8729459884,165606.29552746078 481579.4919302932,165608.9645699642 481578.9539187594,165613.28859894958 481577.5799795205,165615.57457625074 481577.282924743,165618.05659153924 481575.7699537777,165619.30361080015 481575.3409318947,165620.21859594 481575.1679933951,165623.01662087196 481574.6369428262,165623.9376382452 481574.2589582951,165627.295598274 481572.8799478917,165628.04863887076 481572.71700972883,165628.31663550483 481572.72292747104,165630.5476559399 481572.77791210177,165632.82463946828 481573.27093218954,165633.3856519854 481573.5369492708,165635.3536547517 481574.47091204784,165637.4426444891 481575.10194171686,165638.23264531 481575.1569398359,165639.91967184047 481575.27395426604,165643.2706992526 481576.0999714038,165644.648671317 481576.43896047387,165648.0466597634 481577.8079396033,165650.32766874752 481578.0449577952,165657.99464405555 481551.91099821345,165653.05364497183 481550.467027788,165650.96862176774 481549.85803041206,165648.85661667652 481549.24096469354,165646.08260235947 481548.430986488,165643.28964864177 481547.61395936704,165641.1875889794 481547.00003377564,165639.0665883725 481546.3799487256,165636.29257085733 481545.5699760255,165633.3745833264 481544.7169693225,165631.22455350097 481544.08903662313,165630.81959485167 481545.47095438227,165616.15855676873 481546.07594130037,165608.92851025684 481546.3739382984,165601.6954647942 481546.6719394332,165593.01144504713 481547.03092506714),(165597.5845531633 481592.7809603289,165601.46063956618 481624.22684115765,165602.4566080327 481626.1179109706,165603.4766237798 481624.7488834811,165603.94560087743 481624.40786518116,165605.9586501752 481623.6938694143,165608.3766218822 481622.2119098665,165609.59865615456 481622.0139273513,165610.50162004144 481622.1958936819,165610.90362644003 481622.2768680413,165612.98163506953 481622.0459009408,165615.42563522808 481620.3188860079,165616.78266352086 481620.37387635745,165617.541648888 481620.5498598102,165617.8856379771 481620.6299310871,165620.35871091337 481620.06290929666,165621.48069942274 481619.27690625296,165622.2996590703 481618.7028769826,165625.2756705811 481617.25394821167,165625.84766296556 481617.26296805777,165628.1157292097 481617.2968912284,165630.43568379804 481617.8349535341,165630.91172989132 481618.07486284024,165632.94469717392 481619.0998674647,165635.7647570934 481619.4059113776,165638.03776862158 481619.89692265476,165644.46871871245 481593.9039186575,165638.50767270915 481592.1769323115,165633.6376789234 481590.7659570493,165628.70063606824 481589.335927328,165628.16568494434 481591.1839845278,165613.63262675228 481591.94290989527,165606.4086137545 481592.319920889,165597.5845531633 481592.7809603289),(165606.96301187953 481285.8701942276,165617.09714722337 481317.51421955513,165657.14321245725 481304.6542777951,165646.96914224676 481273.1072177767,165606.96301187953 481285.8701942276),(165607.4216895084 481643.51492878806,165613.1327812483 481684.9217904698,165613.63977163073 481687.1918895534,165614.71079015185 481685.2448456506,165620.94879263086 481665.6538638274,165624.86279959895 481664.59682269074,165631.44275984986 481641.9439352179,165619.17873585294 481638.4528815434,165616.39472356904 481642.6609089703,165607.4216895084 481643.51492878806),(165625.06317551967 481341.27521638497,165628.47320274284 481351.8552004529,165657.52328062925 481341.24516691454,165663.8433302382 481360.86520960403,165635.0433026686 481368.94515537814,165635.76328570157 481371.1652004403,165634.75324187803 481371.4851336322,165638.62327390848 481383.47516436345,165641.5133125544 481382.5352045473,165641.61332610715 481382.8551930367,165681.03342769816 481370.15520559694,165678.6834249223 481362.87523271586,165678.1333795042 481363.04516690416,165667.64327717246 481330.48520777485,165666.68328978316 481330.79522885894,165665.82326523197 481328.1352726176,165625.06317551967 481341.27521638497)),((165853.91450703648 481154.47847423767,165853.77149161507 481154.5245568851,165852.05248622812 481148.7925723464,165849.43850588406 481140.07452058146,165849.5824694122 481140.03155528376,165850.19450258528 481142.07448384096,165852.19550400035 481148.7454882739,165853.91450703648 481154.47847423767)),((165690.637159789 481221.30839094444,165684.65409020818 481202.74839304714,165691.0211510048 481200.6953381686,165693.18418155596 481207.09636898787,165693.32617529767 481207.04838799126,165691.16416331995 481200.64936207084,165691.87410709585 481200.42136204895,165753.65927694863 481180.5064628724,165814.0884203272 481161.02952517034,165822.6624279071 481158.26549094514,165836.31353847278 481200.6194925535,165767.3103702741 481222.86038524355,165698.30625700488 481245.10234980984,165690.637159789 481221.30839094444),(165693.68317810545 481206.0753786871,165697.7431872291 481218.77539447945,165703.4442182028 481236.91032514203,165711.8762536899 481234.1892952708,165720.60230581425 481231.373342504,165729.32932247905 481228.5574072319,165738.05634936754 481225.7413761125,165746.78331805518 481222.92536026856,165755.51036490736 481220.10935998964,165764.23735355845 481217.29337498534,165772.96339762883 481214.47740331833,165781.69040843003 481211.6604477769,165790.41742727094 481208.8443977667,165799.14445585056 481206.0284744372,165807.87149465547 481203.2124552643,165816.59847525915 481200.39645136514,165825.1135385119 481197.6484255169,165822.57751450696 481189.81243685796,165819.13143646508 481179.05043658486,165820.13049025944 481178.728514202,165816.24341989227 481166.6435105667,165815.2434093422 481166.9654316354,165806.8374214708 481169.66943018365,165798.1083621269 481172.4784371293,165789.3793831147 481175.28645827976,165780.6493209348 481178.09549384686,165771.9203620799 481180.90343458427,165763.1913428137 481183.7123919793,165754.46226726277 481186.5204745377,165745.73224516274 481189.3294605534,165737.0032581936 481192.1373515939,165728.27421057862 481194.94637054345,165719.54421835704 481197.7554028533,165710.81519307548 481200.5633400208,165702.08617533752 481203.37240525684,165693.68317810545 481206.0753786871),(165694.65720787522 481224.0323859261,165695.85917038817 481227.8583556615,165698.7212011478 481226.9583123765,165697.51917027353 481223.1333431713,165694.65720787522 481224.0323859261)),((165737.3379160775 481555.91300334374,165735.73095426153 481561.36300590524,165734.12296457813 481566.8170122977,165732.5039211776 481572.30804616894,165731.722979526 481574.95398846315,165704.13282570825 481566.80807221646,165711.63384485795 481541.3200574355,165739.22793669422 481549.5020729691,165738.95195147427 481550.44109771407,165737.3379160775 481555.91300334374)),((165742.76593479898 481537.5050447366,165740.56592901776 481544.9660771371,165739.22793669422 481549.5020729691,165711.63384485795 481541.3200574355,165715.32678747826 481528.77303401113,165725.64985202887 481531.7811151973,165734.24586626413 481534.2861086722,165742.97691753737 481536.8301309427,165742.76593479898 481537.5050447366)),((165767.09185403027 481454.8851670778,165754.05186441253 481499.1701048759,165726.42579294113 481491.028104843,165739.44771866192 481446.73115084914,165749.84376477124 481449.7981879186,165752.72879604952 481450.6481872374,165758.38179191307 481452.3162255302,165767.09185403027 481454.8851670778)),((165791.7737026315 481328.7753049603,165783.7456507334 481331.359336259,165774.88861889107 481334.2092723015,165766.04762865734 481337.0552536876,165757.1655748783 481339.9142905514,165748.30754891026 481342.7652734014,165738.64354107963 481345.87521031464,165716.10334139835 481275.895331588,165727.38639761863 481272.2523536715,165728.82339729104 481271.7892804257,165734.2843600761 481270.0263800398,165742.61838084552 481267.3353419938,165750.98140785462 481264.635368777,165756.43242557545 481262.8753640524,165757.8784395208 481262.4083133824,165769.13344454192 481258.7753833276,165769.3634933841 481259.5253597224,165771.04348919258 481258.97537535493,165793.1736878639 481327.55535145255,165791.54366571992 481328.0852987592,165791.7737026315 481328.7753049603)),((165720.04529258763 481244.63435943174,165725.5073073317 481242.8703389998,165726.75330058602 481246.6902926032,165729.64336236584 481255.6653443158,165734.2843600761 481270.0263800398,165728.82339729104 481271.7892804257,165721.30132114777 481248.45032795117,165720.04529258763 481244.63435943174)),((165725.5073073317 481242.8703389998,165733.85235512824 481240.17530463496,165735.78637572107 481246.0963088247,165739.1253645554 481256.40639819385,165742.61838084552 481267.3353419938,165734.2843600761 481270.0263800398,165729.64336236584 481255.6653443158,165726.75330058602 481246.6902926032,165725.5073073317 481242.8703389998)),((165726.6254969247 481332.95825022587,165698.30625700488 481245.10234980984,165767.3103702741 481222.86038524355,165811.18078064197 481358.96532213397,165742.17659175242 481381.20723075565,165726.6254969247 481332.95825022587),(165714.59331353637 481246.3942909105,165707.31329987882 481248.74530289543,165714.91335148847 481272.22036780615,165716.10334139835 481275.895331588,165738.64354107963 481345.87521031464,165746.99361894192 481371.7652784169,165756.65861975378 481368.6482390871,165765.53763238693 481365.7842990672,165774.3697140342 481362.9352931985,165783.21470086896 481360.0823257834,165792.06672522734 481357.2272755572,165800.07373514827 481354.6453257462,165791.7737026315 481328.7753049603,165791.54366571992 481328.0852987592,165793.1736878639 481327.55535145255,165771.04348919258 481258.97537535493,165769.3634933841 481259.5253597224,165769.13344454192 481258.7753833276,165767.94046532223 481255.0803727385,165760.36338960959 481231.6154014575,165753.1123999269 481233.956395535,165747.66039481142 481235.71740314807,165742.20737085477 481237.47841455427,165733.85235512824 481240.17530463496,165725.5073073317 481242.8703389998,165720.04529258763 481244.63435943174,165714.59331353637 481246.3942909105)),((165728.27421057862 481194.94637054345,165737.0032581936 481192.1373515939,165742.59732487198 481209.55544268835,165745.61234685374 481219.1003356426,165746.78331805518 481222.92536026856,165738.05634936754 481225.7413761125,165735.57526303138 481217.8884169158,165732.34628696222 481207.6103914263,165728.27421057862 481194.94637054345)),((165719.54421835704 481197.7554028533,165728.27421057862 481194.94637054345,165732.34628696222 481207.6103914263,165735.57526303138 481217.8884169158,165738.05634936754 481225.7413761125,165729.32932247905 481228.5574072319,165728.14926428013 481224.7353711206,165725.1382394831 481215.1883834767,165719.54421835704 481197.7554028533)),((165717.13279208494 481496.11104573845,165742.54266873017 481409.7731823477,165812.09292220575 481430.24218691647,165786.68302267324 481516.58014388575,165717.13279208494 481496.11104573845),(165739.44771866192 481446.73115084914,165726.42579294113 481491.028104843,165754.05186441253 481499.1701048759,165781.5689765867 481507.33716742526,165794.65391076147 481462.99320677517,165802.763925968 481435.3552630413,165795.3618555604 481433.1752054869,165789.54184028375 481431.46125288424,165783.75084868493 481429.75515904836,165775.2168089457 481427.24120325147,165766.68378131933 481424.7281545481,165760.87376458934 481423.0161490942,165755.07273490838 481421.3081755765,165747.59369677713 481419.1052129124,165739.44771866192 481446.73115084914)),((165725.64985202887 481531.7811151973,165715.32678747826 481528.77303401113,165722.1637920794 481505.38503976824,165732.5078354939 481508.4231106378,165731.36181199265 481512.2791458858,165728.8128404287 481520.9150407567,165725.64985202887 481531.7811151973)),((165734.24586626413 481534.2861086722,165725.64985202887 481531.7811151973,165728.8128404287 481520.9150407567,165731.36181199265 481512.2791458858,165732.5078354939 481508.4231106378,165741.1428862153 481510.9591321961,165734.24586626413 481534.2861086722)),((165673.3708977106 481644.8049006763,165717.13279208494 481496.11104573845,165786.68302267324 481516.58014388575,165742.92118772503 481665.2739500047,165673.3708977106 481644.8049006763),(165689.5289023787 481616.43091684714,165682.66390541804 481639.6949511576,165693.02695096543 481642.74889270985,165701.65495568834 481645.29095071973,165710.28301998795 481647.8329127002,165718.91107302954 481650.3760023997,165727.5380969889 481652.91799232236,165737.844128147 481655.95499203826,165744.93108682157 481631.96596303635,165747.11110594447 481624.55796098587,165748.72110548115 481619.0870505108,165750.3331012124 481613.60902404686,165751.94207886027 481608.14100534626,165753.55408603878 481602.66097729624,165756.02206237818 481594.2760404996,165758.48305164994 481585.91000471317,165760.09602746696 481580.43009233876,165761.7070189946 481574.9550718272,165763.31704865114 481569.4850566739,165764.92303530494 481564.0260484118,165766.5320427976 481558.5590362891,165768.14401146414 481553.08012593735,165770.3300088621 481545.6511190906,165777.35402061223 481521.5951332937,165767.04893821903 481518.56806844496,165758.41391373967 481516.0321128274,165749.7788806756 481513.49606105307,165741.1428862153 481510.9591321961,165732.5078354939 481508.4231106378,165722.1637920794 481505.38503976824,165715.32678747826 481528.77303401113,165711.63384485795 481541.3200574355,165704.13282570825 481566.80807221646,165694.93587527092 481598.058018297,165689.5289023787 481616.43091684714)),((165749.87821666626 481168.6054396765,165760.15524713008 481165.29146753036,165770.4322916698 481161.9774055011,165780.70934980048 481158.6634761236,165790.9863538234 481155.3494567121,165801.26337168008 481152.0354586903,165811.68239555878 481148.67550719803,165814.0884203272 481161.02952517034,165753.65927694863 481180.5064628724,165691.87410709585 481200.42136204895,165688.07310791782 481188.53536355897,165698.48310648455 481185.17838073144,165708.76914462214 481181.860427097,165719.04618793767 481178.5463695621,165729.32317666116 481175.2324445252,165739.60024764334 481171.918429759,165749.87821666626 481168.6054396765)),((165804.16329833507 481125.3754932473,165793.75132829722 481128.7324718677,165783.4742649519 481132.0474867819,165773.19626086665 481135.36252099246,165762.91820267861 481138.67746517947,165752.64022651344 481141.99243090645,165742.36219818195 481145.3064164967,165732.07517469442 481148.62440939253,165721.79710368768 481151.9394390017,165711.51911494508 481155.254378882,165701.241071616 481158.56945126434,165690.96304236684 481161.88443377306,165680.54303647086 481165.24541627563,165675.90201051926 481156.17036465387,165705.3020483263 481146.65442658326,165734.4521396814 481137.24548951746,165744.0691597118 481134.3254810618,165773.7592437802 481124.71645183617,165803.45727884932 481115.1415537492,165804.16329833507 481125.3754932473)),((165815.2434093422 481166.9654316354,165816.24341989227 481166.6435105667,165820.13049025944 481178.728514202,165819.13143646508 481179.05043658486,165815.2434093422 481166.9654316354)),((165765.53763238693 481365.7842990672,165757.1655748783 481339.9142905514,165766.04762865734 481337.0552536876,165774.3697140342 481362.9352931985,165765.53763238693 481365.7842990672)),((165774.3697140342 481362.9352931985,165766.04762865734 481337.0552536876,165774.88861889107 481334.2092723015,165783.21470086896 481360.0823257834,165774.3697140342 481362.9352931985)),((165792.06672522734 481357.2272755572,165783.21470086896 481360.0823257834,165774.88861889107 481334.2092723015,165783.7456507334 481331.359336259,165784.97264818248 481335.1672473105,165787.86368516678 481344.1852849584,165792.06672522734 481357.2272755572)),((165787.86368516678 481344.1852849584,165784.97264818248 481335.1672473105,165783.7456507334 481331.359336259,165791.7737026315 481328.7753049603,165800.07373514827 481354.6453257462,165792.06672522734 481357.2272755572,165787.86368516678 481344.1852849584)),((165817.33076423616 481320.5923644494,165818.53473190608 481324.32034577214,165821.46778268923 481333.36931528937,165825.6738182269 481346.4083368862,165817.67381487784 481348.9853649841,165809.32371226288 481323.19531513343,165817.33076423616 481320.5923644494)),((165817.33076423616 481320.5923644494,165826.1607530206 481317.7223063045,165834.53086462567 481343.55537642253,165825.6738182269 481346.4083368862,165821.46778268923 481333.36931528937,165818.53473190608 481324.32034577214,165817.33076423616 481320.5923644494)),((165691.0211510048 481200.6953381686,165688.82613778592 481194.19933092536,165688.9681318548 481194.1513498069,165691.16416331995 481200.64936207084,165693.32617529767 481207.04838799126,165693.18418155596 481207.09636898787,165691.0211510048 481200.6953381686)),((165798.00803197207 481504.65914855164,165809.52610699498 481508.05810830294,165822.24111503712 481511.8021899461,165825.61514416043 481512.7781425044,165823.56413966522 481519.7282063275,165795.9680335119 481511.61214057665,165798.00803197207 481504.65914855164)),((165799.53601079423 481499.45010300004,165811.0490582101 481502.8772050506,165827.14610558908 481507.58913941676,165825.61514416043 481512.7781425044,165822.24111503712 481511.8021899461,165809.52610699498 481508.05810830294,165798.00803197207 481504.65914855164,165799.53601079423 481499.45010300004)),((165801.0480544796 481494.29621007456,165812.57303552347 481497.69619328826,165825.33510116214 481501.4762128732,165828.6791265633 481502.39513447497,165827.14610558908 481507.58913941676,165811.0490582101 481502.8772050506,165799.53601079423 481499.45010300004,165801.0480544796 481494.29621007456)),((165802.56800132265 481489.1151865056,165814.09605930385 481492.51618132205,165830.20212846796 481497.23215074255,165828.6791265633 481502.39513447497,165825.33510116214 481501.4762128732,165812.57303552347 481497.69619328826,165801.0480544796 481494.29621007456,165802.56800132265 481489.1151865056)),((165804.0880216979 481483.9331622273,165815.62004295533 481487.3351705922,165828.35112886416 481491.10723019537,165831.73209434262 481492.0351359933,165830.97413562768 481494.6171360007,165830.20212846796 481497.23215074255,165814.09605930385 481492.51618132205,165802.56800132265 481489.1151865056,165804.0880216979 481483.9331622273)),((165805.60797486416 481478.7521396871,165817.14307526563 481482.1541582829,165833.24713194987 481486.86924293207,165831.73209434262 481492.0351359933,165828.35112886416 481491.10723019537,165815.62004295533 481487.3351705922,165804.0880216979 481483.9331622273,165805.60797486416 481478.7521396871)),((165807.1290240118 481473.57022994,165818.66706306094 481476.97414995317,165831.42309653418 481480.7601800219,165834.77111099343 481481.66921192576,165833.24713194987 481486.86924293207,165817.14307526563 481482.1541582829,165805.60797486416 481478.7521396871,165807.1290240118 481473.57022994)),((165780.9100788994 481051.4195472039,165780.94908950687 481051.5405763582,165782.8121049136 481050.9255724577,165789.6861977294 481072.3145165163,165759.94208684235 481081.8385492149,165755.3420530924 481067.5615879822,165753.04303926002 481060.4275618781,165780.9100788994 481051.4195472039)),((165789.6861977294 481072.3145165163,165794.10724982165 481086.1055626836,165764.39215046004 481095.6485469322,165759.94208684235 481081.8385492149,165789.6861977294 481072.3145165163)),((165764.39215046004 481095.6485469322,165794.10724982165 481086.1055626836,165798.50226476917 481099.8185601817,165780.27220397923 481105.77951771766,165768.84218902295 481109.45854900277,165764.39215046004 481095.6485469322)),((165780.70934980048 481158.6634761236,165778.90532097794 481153.0484925419,165774.72427119376 481140.1124897321,165773.19626086665 481135.36252099246,165783.4742649519 481132.0474867819,165785.43027980113 481138.130446508,165787.59027662704 481144.78452594153,165790.9863538234 481155.3494567121,165780.70934980048 481158.6634761236)),((165790.9863538234 481155.3494567121,165787.59027662704 481144.78452594153,165785.43027980113 481138.130446508,165783.4742649519 481132.0474867819,165793.75132829722 481128.7324718677,165799.45834097321 481146.42046541837,165801.26337168008 481152.0354586903,165790.9863538234 481155.3494567121)),((165771.9203620799 481180.90343458427,165780.6493209348 481178.09549384686,165784.69838921897 481190.71845116117,165787.94644276387 481200.9894316278,165790.41742727094 481208.8443977667,165781.69040843003 481211.6604477769,165780.52041607565 481207.835417028,165777.4883933551 481198.2974753085,165771.9203620799 481180.90343458427)),((165780.6493209348 481178.09549384686,165789.3793831147 481175.28645827976,165794.95742641244 481192.6604017623,165797.98348239536 481202.20045515895,165799.14445585056 481206.0284744372,165790.41742727094 481208.8443977667,165787.94644276387 481200.9894316278,165784.69838921897 481190.71845116117,165780.6493209348 481178.09549384686)),((165785.55950023342 481249.4403665603,165778.02345562194 481225.98536036786,165784.58846067498 481223.87043900834,165785.88444177373 481227.66737380484,165788.72052130097 481236.65235585446,165792.13649313548 481247.3183605189,165790.44449281244 481247.86742136953,165785.55950023342 481249.4403665603)),((165785.55950023342 481249.4403665603,165790.44449281244 481247.86742136953,165792.13649313548 481247.3183605189,165796.1385307854 481246.02142821206,165797.33956570356 481249.73437673337,165786.7535148305 481253.1554111886,165785.55950023342 481249.4403665603)),((165790.040483603 481222.11336638086,165794.17451525794 481234.89239922474,165798.77555773532 481249.27043149626,165797.33956570356 481249.73437673337,165796.1385307854 481246.02142821206,165792.13649313548 481247.3183605189,165788.72052130097 481236.65235585446,165785.88444177373 481227.66737380484,165784.58846067498 481223.87043900834,165790.040483603 481222.11336638086)),((165775.75088814163 481457.4322048577,165779.88083834152 481443.37722162984,165782.5408714928 481434.36519018246,165782.39683007967 481434.32315151556,165783.75084868493 481429.75515904836,165789.54184028375 481431.46125288424,165788.19285334527 481436.0332602932,165781.70292275774 481458.1561794963,165781.4059229174 481459.0961572339,165775.75088814163 481457.4322048577)),((165781.4059229174 481459.0961572339,165781.70292275774 481458.1561794963,165788.19285334527 481436.0332602932,165789.54184028375 481431.46125288424,165795.3618555604 481433.1752054869,165794.01687317196 481437.75322834554,165793.87290232416 481437.7101881182,165788.38689940557 481456.3701971199,165785.5959004123 481455.5502011837,165784.580929966 481459.00217660615,165784.28590465026 481459.9431598627,165781.4059229174 481459.0961572339)),((165784.28590465026 481459.9431598627,165794.65391076147 481462.99320677517,165781.5689765867 481507.33716742526,165754.05186441253 481499.1701048759,165767.09185403027 481454.8851670778,165775.75088814163 481457.4322048577,165781.4059229174 481459.0961572339,165784.28590465026 481459.9431598627))) \ No newline at end of file diff --git a/geo-test-fixtures/src/lib.rs b/geo-test-fixtures/src/lib.rs index 811781c31..962bc6883 100644 --- a/geo-test-fixtures/src/lib.rs +++ b/geo-test-fixtures/src/lib.rs @@ -126,13 +126,21 @@ where } // From https://afnemers.ruimtelijkeplannen.nl/afnemers/services?request=GetFeature&service=WFS&srsName=EPSG:4326&typeName=Enkelbestemming&version=2.0.0&bbox=165618,480983,166149,481542"; -pub fn nl_plots() -> MultiPolygon +pub fn nl_plots_wgs84() -> MultiPolygon where T: WktFloat + Default + FromStr, { multi_polygon("nl_plots.wkt") } +pub fn nl_plots_epsg_28992() -> MultiPolygon +where + T: WktFloat + Default + FromStr, +{ + // https://epsg.io/28992 + multi_polygon("nl_plots_epsg_28992.wkt") +} + fn line_string(name: &str) -> LineString where T: WktFloat + Default + FromStr, diff --git a/geo/benches/coordinate_position.rs b/geo/benches/coordinate_position.rs index 2b5e2b468..4e8adb967 100644 --- a/geo/benches/coordinate_position.rs +++ b/geo/benches/coordinate_position.rs @@ -11,7 +11,7 @@ use criterion::Criterion; fn criterion_benchmark(c: &mut Criterion) { c.bench_function("Point position to rect", |bencher| { - let plot_centroids: Vec = geo_test_fixtures::nl_plots() + let plot_centroids: Vec = geo_test_fixtures::nl_plots_wgs84() .iter() .map(|plot| plot.centroid().unwrap()) .collect(); diff --git a/geo/benches/intersection.rs b/geo/benches/intersection.rs index 8dda67d0f..3e507386f 100644 --- a/geo/benches/intersection.rs +++ b/geo/benches/intersection.rs @@ -3,7 +3,7 @@ use geo::intersects::Intersects; use geo::MultiPolygon; fn multi_polygon_intersection(c: &mut Criterion) { - let plot_polygons: MultiPolygon = geo_test_fixtures::nl_plots(); + let plot_polygons: MultiPolygon = geo_test_fixtures::nl_plots_wgs84(); let zone_polygons: MultiPolygon = geo_test_fixtures::nl_zones(); c.bench_function("MultiPolygon intersects", |bencher| { @@ -30,7 +30,7 @@ fn multi_polygon_intersection(c: &mut Criterion) { fn rect_intersection(c: &mut Criterion) { use geo::algorithm::BoundingRect; use geo::geometry::Rect; - let plot_bbox: Vec = geo_test_fixtures::nl_plots() + let plot_bbox: Vec = geo_test_fixtures::nl_plots_wgs84() .iter() .map(|plot| plot.bounding_rect().unwrap()) .collect(); @@ -63,7 +63,7 @@ fn rect_intersection(c: &mut Criterion) { fn point_rect_intersection(c: &mut Criterion) { use geo::algorithm::{BoundingRect, Centroid}; use geo::geometry::{Point, Rect}; - let plot_centroids: Vec = geo_test_fixtures::nl_plots() + let plot_centroids: Vec = geo_test_fixtures::nl_plots_wgs84() .iter() .map(|plot| plot.centroid().unwrap()) .collect(); @@ -96,7 +96,7 @@ fn point_rect_intersection(c: &mut Criterion) { fn point_triangle_intersection(c: &mut Criterion) { use geo::{Centroid, TriangulateEarcut}; use geo_types::{Point, Triangle}; - let plot_centroids: Vec = geo_test_fixtures::nl_plots() + let plot_centroids: Vec = geo_test_fixtures::nl_plots_wgs84() .iter() .map(|plot| plot.centroid().unwrap()) .collect(); diff --git a/geo/benches/prepared_geometry.rs b/geo/benches/prepared_geometry.rs index 96253aa6b..e9d9b6b67 100644 --- a/geo/benches/prepared_geometry.rs +++ b/geo/benches/prepared_geometry.rs @@ -5,7 +5,7 @@ use geo_types::MultiPolygon; fn criterion_benchmark(c: &mut Criterion) { c.bench_function("relate prepared polygons", |bencher| { - let plot_polygons: MultiPolygon = geo_test_fixtures::nl_plots(); + let plot_polygons: MultiPolygon = geo_test_fixtures::nl_plots_wgs84(); let zone_polygons = geo_test_fixtures::nl_zones(); bencher.iter(|| { @@ -38,7 +38,7 @@ fn criterion_benchmark(c: &mut Criterion) { }); c.bench_function("relate unprepared polygons", |bencher| { - let plot_polygons: MultiPolygon = geo_test_fixtures::nl_plots(); + let plot_polygons: MultiPolygon = geo_test_fixtures::nl_plots_wgs84(); let zone_polygons = geo_test_fixtures::nl_zones(); bencher.iter(|| { diff --git a/geo/src/algorithm/bool_ops/mod.rs b/geo/src/algorithm/bool_ops/mod.rs index 25bbab6e2..23d704e6a 100644 --- a/geo/src/algorithm/bool_ops/mod.rs +++ b/geo/src/algorithm/bool_ops/mod.rs @@ -2,29 +2,25 @@ mod i_overlay_integration; #[cfg(test)] mod tests; -use crate::bool_ops::i_overlay_integration::convert::{ - multi_polygon_from_shapes, ring_to_shape_path, -}; -use crate::bool_ops::i_overlay_integration::BoolOpsCoord; +use i_overlay_integration::convert::{multi_polygon_from_shapes, ring_to_shape_path}; +use i_overlay_integration::BoolOpsCoord; +pub use i_overlay_integration::BoolOpsNum; + +use crate::geometry::{LineString, MultiLineString, MultiPolygon, Polygon}; +use crate::winding_order::{Winding, WindingOrder}; + use i_overlay::core::fill_rule::FillRule; +use i_overlay::core::overlay_rule::OverlayRule; use i_overlay::float::clip::FloatClip; +use i_overlay::float::overlay::FloatOverlay; use i_overlay::float::single::SingleFloatOverlay; use i_overlay::string::clip::ClipRule; -#[cfg(feature = "multithreading")] -use rayon::prelude::*; - -pub use i_overlay_integration::BoolOpsNum; - -use crate::geometry::{LineString, MultiLineString, MultiPolygon, Polygon}; -use rstar::{ - primitives::CachedEnvelope, primitives::ObjectRef, ParentNode, RTree, RTreeNode, RTreeObject, -}; /// Boolean Operations on geometry. /// /// Boolean operations are set operations on geometries considered as a subset -/// of the 2-D plane. The operations supported are: intersection, union, xor or -/// symmetric difference, and set-difference on pairs of 2-D geometries and +/// of the 2-D plane. The operations supported are: intersection, union, +/// symmetric difference (xor), and set-difference on pairs of 2-D geometries and /// clipping a 1-D geometry with self. /// /// These operations are implemented on [`Polygon`] and the [`MultiPolygon`] @@ -43,9 +39,8 @@ use rstar::{ /// /// # Performance /// -/// For union operations on a collection of overlapping and / or adjacent [`Polygon`]s -/// (e.g. contained in a `Vec` or a [`MultiPolygon`]), using [`UnaryUnion`] will -/// yield far better performance. +/// For union operations on a large number of [`Polygon`]s or [`MultiPolygons`], +/// using [`unary_union`] will yield far better performance. pub trait BooleanOps { type Scalar: BoolOpsNum; @@ -69,18 +64,26 @@ pub trait BooleanOps { multi_polygon_from_shapes(shapes) } + /// Returns the overlapping regions shared by both `self` and `other`. fn intersection( &self, other: &impl BooleanOps, ) -> MultiPolygon { self.boolean_op(other, OpType::Intersection) } + + /// Combines the regions of both `self` and `other` into a single geometry, removing + /// overlaps and merging boundaries. fn union(&self, other: &impl BooleanOps) -> MultiPolygon { self.boolean_op(other, OpType::Union) } + + /// The regions that are in either `self` or `other`, but not in both. fn xor(&self, other: &impl BooleanOps) -> MultiPolygon { self.boolean_op(other, OpType::Xor) } + + /// The regions of `self` which are not in `other`. fn difference( &self, other: &impl BooleanOps, @@ -121,104 +124,73 @@ pub enum OpType { Xor, } -// Recursive algorithms can benefit from grouping those parameters which are constant over -// the whole algorithm to reduce the overhead of the recursive calls, in this case the single- -// and multi-threaded unary union tree traversals -#[derive(Debug)] -struct Ops { - init: I, - fold: F, - reduce: R, -} - -/// Efficient [BooleanOps::union] of adjacent / overlapping geometries +/// Efficient [union](BooleanOps::union) of many adjacent / overlapping geometries /// -/// For geometries with a high degree of overlap or adjacency -/// (for instance, merging a large contiguous area made up of many adjacent polygons) -/// this method will be orders of magnitude faster than a manual iteration and union approach. -pub trait UnaryUnion { - type Scalar: BoolOpsNum; - - /// Construct a tree of all the input geometries and progressively union them from the "bottom up" - /// - /// This is considerably more efficient than using e.g. `fold()` over an iterator of Polygons. - /// # Examples - /// - /// ``` - /// use geo::{BooleanOps, UnaryUnion}; - /// use geo::{MultiPolygon, polygon}; - /// let poly1 = polygon![ - /// (x: 0.0, y: 0.0), - /// (x: 4.0, y: 0.0), - /// (x: 4.0, y: 4.0), - /// (x: 0.0, y: 4.0), - /// (x: 0.0, y: 0.0), - /// ]; - /// let poly2 = polygon![ - /// (x: 4.0, y: 0.0), - /// (x: 8.0, y: 0.0), - /// (x: 8.0, y: 4.0), - /// (x: 4.0, y: 4.0), - /// (x: 4.0, y: 0.0), - /// ]; - /// let merged = &poly1.union(&poly2); - /// let mp = MultiPolygon(vec![poly1, poly2]); - /// // A larger single rectangle - /// let combined = mp.unary_union(); - /// assert_eq!(&combined, merged); - /// ``` - fn unary_union(self) -> MultiPolygon; -} - -// This function carries out a full post-order traversal of the tree, building up MultiPolygons from inside to outside. -// Though the operation is carried out via fold() over the tree iterator, there are two actual nested operations: -// "fold" operations on leaf nodes build up output MultiPolygons by adding Polygons to them via union and -// "reduce" operations on parent nodes combine these output MultiPolygons from leaf operations by recursion -fn bottom_up_fold_reduce(ops: &Ops, parent: &ParentNode) -> S -where - // This operation only requires two types: output (S) and input (T) - T: RTreeObject, - // Because this is a fold operation, we need to initialise a "container" to which we'll be adding using union. - // The output of a union op is a MultiPolygon. - I: Fn() -> S, - // The meat of the fold op is unioning input borrowed leaf Polygons into an output MultiPolygon. - F: Fn(S, &T) -> S, - // Parent nodes require us to process their child nodes to produce a MultiPolygon. We do this recursively. - // This is a reduce op so there's no need for an init value and the two inputs must have the same type: MultiPolygon - R: Fn(S, S) -> S, -{ - parent - .children() - .iter() - .fold((ops.init)(), |accum, child| match child { - RTreeNode::Leaf(value) => (ops.fold)(accum, value), - RTreeNode::Parent(parent) => { - let value = bottom_up_fold_reduce(ops, parent); - (ops.reduce)(accum, value) - } +/// This is typically much faster than `union`ing a bunch of geometries together one at a time. +/// +/// Note: Geometries can be wound in either direction, but the winding order must be consistent, +/// and the polygon's interiors must be wound opposite to its exterior. +/// +/// See [Orient] for more information. +/// +/// [Orient]: crate::algorithm::orient::Orient +/// +/// # Arguments +/// +/// `boppables`: A collection of `Polygon` or `MultiPolygons` to union together. +/// +/// returns the union of all the inputs. +/// +/// # Examples +/// +/// ``` +/// use geo::algorithm::unary_union; +/// use geo::wkt; +/// +/// let right_piece = wkt!(POLYGON((4. 0.,4. 4.,8. 4.,8. 0.,4. 0.))); +/// let left_piece = wkt!(POLYGON((0. 0.,0. 4.,4. 4.,4. 0.,0. 0.))); +/// +/// // touches neither right nor left piece +/// let separate_piece = wkt!(POLYGON((14. 10.,14. 14.,18. 14.,18. 10.,14. 10.))); +/// +/// let polygons = vec![left_piece, separate_piece, right_piece]; +/// let actual_output = unary_union(&polygons); +/// +/// let expected_output = wkt!(MULTIPOLYGON( +/// // left and right piece have been combined +/// ((0. 0., 0. 4., 8. 4., 8. 0., 0. 0.)), +/// // separate piece remains separate +/// ((14. 10., 14. 14., 18. 14.,18. 10., 14. 10.)) +/// )); +/// assert_eq!(actual_output, expected_output); +/// ``` +pub fn unary_union<'a, B: BooleanOps + 'a>( + boppables: impl IntoIterator, +) -> MultiPolygon { + let mut winding_order: Option = None; + let subject = boppables + .into_iter() + .flat_map(|boppable| { + let rings = boppable.rings(); + rings + .map(|ring| { + if winding_order.is_none() { + winding_order = ring.winding_order(); + } + ring_to_shape_path(ring) + }) + .collect::>() }) -} + .collect::>(); -fn par_bottom_up_fold_reduce(ops: &Ops, parent: &ParentNode) -> S -where - T: RTreeObject, - RTreeNode: Send + Sync, - S: Send, - I: Fn() -> S + Send + Sync, - F: Fn(S, &T) -> S + Send + Sync, - R: Fn(S, S) -> S + Send + Sync, -{ - parent - .children() - .into_par_iter() - .fold(&ops.init, |accum, child| match child { - RTreeNode::Leaf(value) => (ops.fold)(accum, value), - RTreeNode::Parent(parent) => { - let value = par_bottom_up_fold_reduce(ops, parent); - (ops.reduce)(accum, value) - } - }) - .reduce(&ops.init, &ops.reduce) + let fill_rule = if winding_order == Some(WindingOrder::Clockwise) { + FillRule::Positive + } else { + FillRule::Negative + }; + + let shapes = FloatOverlay::with_subj(&subject).overlay(OverlayRule::Subject, fill_rule); + multi_polygon_from_shapes(shapes) } impl BooleanOps for Polygon { @@ -236,71 +208,3 @@ impl BooleanOps for MultiPolygon { self.iter().flat_map(BooleanOps::rings) } } - -impl<'a, T, Boppable, BoppableCollection> UnaryUnion for &'a BoppableCollection -where - T: BoolOpsNum, - Boppable: BooleanOps + RTreeObject + 'a, - &'a BoppableCollection: IntoIterator, -{ - type Scalar = T; - - fn unary_union(self) -> MultiPolygon { - // these three functions drive the union operation - let init = || MultiPolygon::::new(vec![]); - let fold = |mut accum: MultiPolygon, - poly: &CachedEnvelope>| - -> MultiPolygon { - accum = accum.union(&***poly); - accum - }; - let reduce = |accum1: MultiPolygon, accum2: MultiPolygon| -> MultiPolygon { - accum1.union(&accum2) - }; - let rtree = RTree::bulk_load( - self.into_iter() - .map(|p| CachedEnvelope::new(ObjectRef::new(p))) - .collect(), - ); - let ops = Ops { init, fold, reduce }; - bottom_up_fold_reduce(&ops, rtree.root()) - } -} - -#[cfg(feature = "multithreading")] -/// Wrapper type which signals to algorithms operating on `T` that utilizing parallelism might be viable. -pub struct AllowMultithreading(pub T); - -#[cfg(feature = "multithreading")] -impl<'a, T, Boppable, BoppableCollection> UnaryUnion for AllowMultithreading<&'a BoppableCollection> -where - T: BoolOpsNum + Send, - Boppable: BooleanOps + RTreeObject + 'a + Send + Sync, - ::Envelope: Send + Sync, - &'a BoppableCollection: IntoParallelIterator, -{ - type Scalar = T; - - fn unary_union(self) -> MultiPolygon { - // these three functions drive the union operation - let init = || MultiPolygon::::new(vec![]); - let fold = |mut accum: MultiPolygon, - poly: &CachedEnvelope>| - -> MultiPolygon { - accum = accum.union(&***poly); - accum - }; - let reduce = |accum1: MultiPolygon, accum2: MultiPolygon| -> MultiPolygon { - accum1.union(&accum2) - }; - let rtree = RTree::bulk_load( - self.0 - .into_par_iter() - .map(|p| CachedEnvelope::new(ObjectRef::new(p))) - .collect(), - ); - - let ops = Ops { init, fold, reduce }; - par_bottom_up_fold_reduce(&ops, rtree.root()) - } -} diff --git a/geo/src/algorithm/bool_ops/tests.rs b/geo/src/algorithm/bool_ops/tests.rs index 2951ad710..7a665064a 100644 --- a/geo/src/algorithm/bool_ops/tests.rs +++ b/geo/src/algorithm/bool_ops/tests.rs @@ -1,5 +1,6 @@ -use super::{BooleanOps, UnaryUnion}; +use super::{unary_union, BooleanOps}; use crate::{wkt, Convert, MultiPolygon, Polygon, Relate}; +use std::time::Instant; use wkt::ToWkt; #[test] @@ -9,16 +10,85 @@ fn test_unary_union() { let poly3: Polygon = wkt!(POLYGON((211.0 292.0,202.07584923592933 288.2701221108328,212.24082541367974 285.47846008552216,210.0 290.0))); let polys = vec![poly1.clone(), poly2.clone(), poly3.clone()]; - let poly_union = polys.unary_union(); + let poly_union = unary_union(&polys); assert_eq!(poly_union.0.len(), 1); let multi_poly_12 = MultiPolygon::new(vec![poly1.clone(), poly2.clone()]); let multi_poly_3 = MultiPolygon::new(vec![poly3]); let multi_polys = vec![multi_poly_12.clone(), multi_poly_3.clone()]; - let multi_poly_union = multi_polys.unary_union(); + let multi_poly_union = unary_union(&multi_polys); assert_eq!(multi_poly_union.0.len(), 1); } +#[test] +fn test_unary_union_errors() { + let input: MultiPolygon = geo_test_fixtures::nl_plots_epsg_28992(); + + assert_eq!(input.0.len(), 316); + + let input_area = input.signed_area(); + assert_relative_eq!(input_area, 763889.4732974821); + + let naive_union = { + let start = Instant::now(); + let mut output = MultiPolygon::new(Vec::new()); + for poly in input.iter() { + output = output.union(poly); + } + let union = output; + let duration = start.elapsed(); + println!("Time elapsed (naive): {:.2?}", duration); + union + }; + + let simplified_union = { + let start = Instant::now(); + let union = unary_union(input.iter()); + let duration = start.elapsed(); + println!("Time elapsed (simplification): {:.2?}", duration); + union + }; + + use crate::algorithm::Area; + let naive_area = naive_union.unsigned_area(); + let simplified_area = simplified_union.unsigned_area(); + assert_relative_eq!(naive_area, simplified_area, max_relative = 1e-5); + + // Serial vs. parallel are expected to have slightly different results. + // + // Each boolean operation scales the floating point to a discrete + // integer grid, which introduces some error, and this error factor depends on the magnitude + // of the input. + // + // Because the serial vs. parallel approaches group inputs differently, error is accumulated + // differently - hence the slightly different outputs. + // + // xor'ing the two shapes represents the magnitude of the difference between the two outputs. + // + // We want to verify that this error is small - it should be near 0, but the + // magnitude of the error is relative to the magnitude of the input geometries, so we offset + // both the error and 0 by `input_area` to make a scale relative comparison. + let naive_vs_simplified_discrepancy = simplified_union.xor(&naive_union); + assert_relative_eq!( + input_area + naive_vs_simplified_discrepancy.unsigned_area(), + 0.0 + input_area, + max_relative = 1e-5 + ); + + assert_eq!(simplified_union.0.len(), 1); + assert_relative_eq!(simplified_area, input_area, max_relative = 1e-5); +} + +#[test] +fn test_unary_union_winding() { + let input: MultiPolygon = geo_test_fixtures::nl_plots_epsg_28992(); + + use crate::orient::{Direction, Orient}; + let default_winding_union = unary_union(input.orient(Direction::Default).iter()); + let reversed_winding_union = unary_union(input.orient(Direction::Reversed).iter()); + assert_eq!(default_winding_union, reversed_winding_union); +} + #[test] fn jts_test_overlay_la_1() { // From TestOverlayLA.xml test case with description "mLmA - A and B complex, overlapping and touching #1" diff --git a/geo/src/algorithm/mod.rs b/geo/src/algorithm/mod.rs index 7c1bf0d10..b61400ac6 100644 --- a/geo/src/algorithm/mod.rs +++ b/geo/src/algorithm/mod.rs @@ -6,9 +6,9 @@ pub use kernels::{Kernel, Orientation}; pub mod area; pub use area::Area; -/// Boolean Ops such as union, xor, difference. +/// Boolean Operations such as the union, xor, or difference of two geometries. pub mod bool_ops; -pub use bool_ops::{BooleanOps, OpType, UnaryUnion}; +pub use bool_ops::{unary_union, BooleanOps, OpType}; /// Calculate the bounding rectangle of a `Geometry`. pub mod bounding_rect; diff --git a/geo/src/lib.rs b/geo/src/lib.rs index c28ebe2a5..7ba929886 100644 --- a/geo/src/lib.rs +++ b/geo/src/lib.rs @@ -67,8 +67,8 @@ //! //! ## Boolean Operations //! -//! - **[`BooleanOps`]**: Combine or split (Multi)Polygons using intersecton, union, xor, or difference operations -//! - **[`UnaryUnion`]**: Efficient union of a collection of adjacent or overlapping [`Polygon`] or [`MultiPolygon`]s +//! - **[`BooleanOps`]**: Combine or split (Multi)Polygons using intersection, union, xor, or difference operations +//! - **[`unary_union`]**: Efficient union of many [`Polygon`] or [`MultiPolygon`]s //! //! ## Outlier Detection //! From 3bb18812424fcdef69f846d5492c833640c244ad Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Thu, 19 Dec 2024 12:24:33 -0600 Subject: [PATCH 3/3] remove no longer needed dep changes --- geo-types/CHANGES.md | 3 --- geo-types/Cargo.toml | 2 +- geo/CHANGES.md | 2 -- geo/Cargo.toml | 5 ++--- 4 files changed, 3 insertions(+), 9 deletions(-) diff --git a/geo-types/CHANGES.md b/geo-types/CHANGES.md index a4e0cff6e..3937d89e2 100644 --- a/geo-types/CHANGES.md +++ b/geo-types/CHANGES.md @@ -2,9 +2,6 @@ ## Unreleased -- Bumps rstar minimum version from 0.12.0 to 0.12.2 - - - ## 0.7.14 - POSSIBLY BREAKING: Minimum supported version of Rust (MSRV) is now 1.75 diff --git a/geo-types/Cargo.toml b/geo-types/Cargo.toml index af4f517e0..35890c329 100644 --- a/geo-types/Cargo.toml +++ b/geo-types/Cargo.toml @@ -34,7 +34,7 @@ rstar_0_8 = { package = "rstar", version = "0.8", optional = true } rstar_0_9 = { package = "rstar", version = "0.9", optional = true } rstar_0_10 = { package = "rstar", version = "0.10", optional = true } rstar_0_11 = { package = "rstar", version = "0.11", optional = true } -rstar_0_12 = { package = "rstar", version = "0.12.2", optional = true } +rstar_0_12 = { package = "rstar", version = "0.12", optional = true } serde = { version = "1", optional = true, default-features = false, features = ["alloc", "derive"] } [dev-dependencies] diff --git a/geo/CHANGES.md b/geo/CHANGES.md index 647b57a6f..b7bf4c087 100644 --- a/geo/CHANGES.md +++ b/geo/CHANGES.md @@ -4,8 +4,6 @@ - Add Unary Union algorithm for fast union ops on adjacent / overlapping geometries - - - Adds an optional dependency on Rayon (previously depended on by i_overlay) - - Bumps minimum rstar version to 0.12.2 - Loosen bounds on `RemoveRepeatedPoints` trait (`num_traits::FromPrimitive` isn't required) - diff --git a/geo/Cargo.toml b/geo/Cargo.toml index cccdc15fd..6751fda26 100644 --- a/geo/Cargo.toml +++ b/geo/Cargo.toml @@ -17,10 +17,9 @@ default = ["earcutr", "spade", "multithreading"] use-proj = ["proj"] proj-network = ["use-proj", "proj/network"] use-serde = ["serde", "geo-types/serde"] -multithreading = ["i_overlay/allow_multithreading", "geo-types/multithreading", "dep:rayon"] +multithreading = ["i_overlay/allow_multithreading", "geo-types/multithreading"] [dependencies] -rayon = { version = "1.10.0", optional = true } earcutr = { version = "0.4.2", optional = true } spade = { version = "2.10.0", optional = true } float_next_after = "1.0.0" @@ -30,7 +29,7 @@ log = "0.4.11" num-traits = "0.2" proj = { version = "0.27.0", optional = true } robust = "1.1.0" -rstar = "0.12.2" +rstar = "0.12.0" serde = { version = "1.0", optional = true, features = ["derive"] } i_overlay = { version = "1.9.0, < 1.10.0", default-features = false } # co-erce the version of `home` used transitively by proj (via bindgen -> which -> home)