[jts] 02/08: Imported Upstream version 1.14+ds

Sebastiaan Couwenberg sebastic at moszumanska.debian.org
Sat Jan 16 01:16:51 UTC 2016


This is an automated email from the git hooks/post-receive script.

sebastic pushed a commit to branch master
in repository jts.

commit a09b6f311141f9a2ea942ef28e6a1aec19e359f4
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Sat Jan 16 00:45:00 2016 +0100

    Imported Upstream version 1.14+ds
---
 ...rsion History.html => JTS_Version_History.html} |  136 +-
 jtsio/src/META-INF/MANIFEST.MF                     |    4 +
 .../jts/io/geojson/GeoJsonConstants.java}          |   42 +-
 .../jts/io/geojson/GeoJsonReader.java              |  494 ++
 .../jts/io/geojson/GeoJsonWriter.java              |  325 +
 .../vividsolutions/jts/io/oracle/Constants.java    |  123 -
 .../com/vividsolutions/jts/io/oracle/OraGeom.java  |  521 ++
 .../vividsolutions/jts/io/oracle/OraReader.java    | 1145 ++-
 .../com/vividsolutions/jts/io/oracle/OraUtil.java  |  161 +
 .../vividsolutions/jts/io/oracle/OraWriter.java    | 1334 ++--
 .../com/vividsolutions/jts/io/oracle/package.html  |    6 -
 .../src/com/vividsolutions/jts/io/sde/package.html |    6 -
 .../jts/generator/GeometryGenerator.java           |  169 -
 .../jts/generator/GridGenerator.java               |  175 -
 .../jts/generator/LineStringGenerator.java         |  219 -
 .../jts/generator/MultiGenerator.java              |  190 -
 .../jts/generator/PolygonGenerator.java            |  328 -
 .../jts/io/gml2/GMLReaderTestCase.java             |  146 -
 .../jts/io/gml2/StaticLineStringTest.java          |  118 -
 .../jts/io/gml2/StaticMultiLineStringTest.java     |  128 -
 .../jts/io/gml2/StaticMultiPointTest.java          |   90 -
 .../jts/io/gml2/StaticMultiPolygonTest.java        |  226 -
 .../jts/io/gml2/StaticPointTest.java               |   86 -
 .../jts/io/gml2/StaticPolygonTest.java             |  195 -
 .../jts/io/gml2/WritingTestCase.java               |   77 -
 .../com/vividsolutions/jts/io/gml2/geometry.xsd    |  349 -
 .../jts/io/oracle/ConnectedTestCase.java           |  120 -
 .../jts/io/oracle/StaticLineStringTest.java        |  190 -
 .../jts/io/oracle/StaticMultiLineStringTest.java   |  207 -
 .../jts/io/oracle/StaticMultiPointTest.java        |  171 -
 .../jts/io/oracle/StaticMultiPolygonTest.java      |  394 -
 .../jts/io/oracle/StaticPointTest.java             |  159 -
 .../jts/io/oracle/StaticPolygonTest.java           |  350 -
 .../jts/io/oracle/connection.properties            |    5 -
 jtsio/test/data/linestrings.xml                    |  312 -
 jtsio/test/data/multilinestrings.xml               | 1479 ----
 jtsio/test/data/multipoints.xml                    |  580 --
 jtsio/test/data/multipolygons.xml                  | 8380 --------------------
 jtsio/test/data/points.xml                         |  105 -
 jtsio/test/data/polygons.xml                       | 2047 -----
 jtsio/test/readme                                  |    1 -
 src/.classpath                                     |   12 -
 src/.project                                       |   29 -
 src/MANIFEST.MF                                    |    4 -
 src/META-INF/MANIFEST.MF                           |    4 +
 src/com/vividsolutions/jts/JTSVersion.java         |    2 +-
 .../vividsolutions/jts/algorithm/CGAlgorithms.java |   13 +-
 .../jts/algorithm/CGAlgorithmsDD.java              |    2 +-
 .../jts/algorithm/CentralEndpointIntersector.java  |   31 +-
 .../algorithm/{CentroidArea.java => Centroid.java} |  166 +-
 .../vividsolutions/jts/algorithm/CentroidArea.java |    1 +
 .../vividsolutions/jts/algorithm/CentroidLine.java |    1 +
 .../jts/algorithm/CentroidPoint.java               |    1 +
 .../vividsolutions/jts/algorithm/ConvexHull.java   |    3 +-
 .../jts/algorithm/InteriorPointArea.java           |  140 +-
 .../jts/algorithm/MinimumBoundingCircle.java       |   76 +-
 .../jts/algorithm/MinimumDiameter.java             |   19 +
 .../jts/algorithm/RobustLineIntersector.java       |   71 +-
 .../jts/algorithm/distance/DistanceToPoint.java    |   12 +-
 .../jts/algorithm/distance/package.html            |   13 -
 .../locate/IndexedPointInAreaLocator.java          |   11 +-
 .../jts/algorithm/locate/package.html              |   13 -
 .../jts/algorithm/match/package.html               |   13 -
 src/com/vividsolutions/jts/algorithm/package.html  |   50 -
 .../vividsolutions/jts/awt/FontGlyphReader.java    |   33 +-
 .../vividsolutions/jts/awt/PointShapeFactory.java  |    2 +-
 src/com/vividsolutions/jts/awt/ShapeReader.java    |    2 +-
 src/com/vividsolutions/jts/awt/package.html        |   13 -
 src/com/vividsolutions/jts/densify/package.html    |   13 -
 .../jts/dissolve/DissolveEdgeGraph.java            |   22 +
 .../jts/dissolve/DissolveHalfEdge.java             |   40 +
 .../vividsolutions/jts/dissolve/LineDissolver.java |  286 +
 .../vividsolutions/jts/edgegraph/EdgeGraph.java    |  144 +
 .../jts/edgegraph/EdgeGraphBuilder.java            |   77 +
 src/com/vividsolutions/jts/edgegraph/HalfEdge.java |  351 +
 .../vividsolutions/jts/edgegraph/MarkHalfEdge.java |  110 +
 src/com/vividsolutions/jts/geom/Coordinate.java    |   84 +-
 .../vividsolutions/jts/geom/CoordinateArrays.java  |   29 +
 .../vividsolutions/jts/geom/CoordinateFilter.java  |   25 +-
 .../jts/geom/CoordinateSequenceFactory.java        |    4 +
 .../jts/geom/CoordinateSequenceFilter.java         |   26 +-
 .../jts/geom/CoordinateSequences.java              |   96 +-
 src/com/vividsolutions/jts/geom/Envelope.java      |   39 +-
 src/com/vividsolutions/jts/geom/Geometry.java      |   73 +-
 .../jts/geom/GeometryCollectionIterator.java       |    7 +
 .../vividsolutions/jts/geom/GeometryFactory.java   |   62 +-
 src/com/vividsolutions/jts/geom/LineSegment.java   |   34 +-
 src/com/vividsolutions/jts/geom/LineString.java    |    8 +-
 .../vividsolutions/jts/geom/OctagonalEnvelope.java |   21 +-
 src/com/vividsolutions/jts/geom/Point.java         |    2 +-
 .../jts/geom/impl/CoordinateArraySequence.java     |   13 +-
 .../geom/impl/CoordinateArraySequenceFactory.java  |   12 +-
 .../jts/geom/impl/PackedCoordinateSequence.java    |   11 +-
 src/com/vividsolutions/jts/geom/impl/package.html  |   13 -
 src/com/vividsolutions/jts/geom/package.html       |   25 -
 .../geom/prep/AbstractPreparedPolygonContains.java |    3 +-
 .../jts/geom/prep/BasicPreparedGeometry.java       |   11 +-
 .../geom/prep/PreparedLineStringIntersects.java    |    1 -
 .../jts/geom/prep/PreparedPolygon.java             |   10 +-
 .../jts/geom/prep/PreparedPolygonIntersects.java   |  144 +-
 src/com/vividsolutions/jts/geom/prep/package.html  |   13 -
 .../jts/geom/util/GeometryEditor.java              |   48 +-
 .../jts/geom/util/GeometryTransformer.java         |    9 +-
 .../jts/geom/util/LineStringExtracter.java         |   14 +
 .../jts/geom/util/LinearComponentExtracter.java    |   27 +
 .../jts/geom/util/PointExtracter.java              |    6 +-
 src/com/vividsolutions/jts/geom/util/package.html  |   13 -
 .../jts/geomgraph/index/MonotoneChainIndexer.java  |    7 +-
 .../index/SimpleMCSweepLineIntersector.java        |   12 +-
 .../index/SimpleSweepLineIntersector.java          |   14 +-
 .../jts/geomgraph/index/SweepLineEvent.java        |   53 +-
 .../jts/geomgraph/index/package.html               |   13 -
 src/com/vividsolutions/jts/geomgraph/package.html  |   25 -
 .../vividsolutions/jts/index/bintree/package.html  |   13 -
 .../jts/index/chain/MonotoneChain.java             |    5 +-
 .../vividsolutions/jts/index/chain/package.html    |   13 -
 .../jts/index/intervalrtree/package.html           |   13 -
 .../kdtree/KdNodeVisitor.java}                     |   42 +-
 .../vividsolutions/jts/index/kdtree/KdTree.java    |  457 +-
 .../vividsolutions/jts/index/kdtree/package.html   |   13 -
 src/com/vividsolutions/jts/index/package.html      |   13 -
 .../vividsolutions/jts/index/quadtree/package.html |   13 -
 .../jts/index/strtree/AbstractSTRtree.java         |    8 +-
 .../vividsolutions/jts/index/strtree/SIRtree.java  |    4 +
 .../vividsolutions/jts/index/strtree/STRtree.java  |    3 +
 .../vividsolutions/jts/index/strtree/package.html  |    8 -
 .../jts/index/sweepline/package.html               |   13 -
 src/com/vividsolutions/jts/io/ParseException.java  |   13 +-
 src/com/vividsolutions/jts/io/WKBReader.java       |   30 +-
 src/com/vividsolutions/jts/io/WKTWriter.java       |   28 +-
 .../vividsolutions/jts/io/gml2/GMLConstants.java   |    2 +-
 .../jts/io/gml2/GeometryStrategies.java            |    3 +-
 src/com/vividsolutions/jts/io/gml2/package.html    |    6 -
 src/com/vividsolutions/jts/io/kml/KMLWriter.java   |  386 +
 src/com/vividsolutions/jts/io/package.html         |   25 -
 .../jts/linearref/ExtractLineByLocation.java       |    2 +-
 .../jts/linearref/LengthIndexedLine.java           |    5 +-
 .../jts/linearref/LinearLocation.java              |   51 +-
 .../jts/linearref/LocationIndexedLine.java         |    9 +-
 src/com/vividsolutions/jts/linearref/package.html  |   37 -
 src/com/vividsolutions/jts/math/DD.java            |   55 +-
 .../jts/noding/FastNodingValidator.java            |   15 +
 .../noding/FastSegmentSetIntersectionFinder.java   |   62 +-
 .../jts/noding/InteriorIntersectionFinder.java     |   91 +-
 ...r.java => InteriorIntersectionFinderAdder.java} |   13 +-
 .../jts/noding/IntersectionAdder.java              |   13 +-
 .../jts/noding/IntersectionFinderAdder.java        |   10 +-
 .../noding/MCIndexSegmentSetMutualIntersector.java |   74 +-
 .../jts/noding/SegmentIntersectionDetector.java    |   37 +-
 .../vividsolutions/jts/noding/SegmentNodeList.java |   53 +-
 .../jts/noding/SegmentSetMutualIntersector.java    |   50 +-
 .../jts/noding/SegmentStringUtil.java              |   96 +-
 .../noding/SimpleSegmentSetMutualIntersector.java  |   53 +-
 src/com/vividsolutions/jts/noding/package.html     |   13 -
 .../jts/noding/snapround/HotPixel.java             |   18 +-
 .../jts/noding/snapround/MCIndexPointSnapper.java  |    2 +-
 .../jts/noding/snapround/MCIndexSnapRounder.java   |    2 +-
 .../jts/noding/snapround/SimpleSnapRounder.java    |    2 +-
 .../jts/noding/snapround/package.html              |   13 -
 .../vividsolutions/jts/operation/BoundaryOp.java   |   12 +
 .../jts/operation/buffer/BufferBuilder.java        |    4 +-
 .../jts/operation/buffer/BufferOp.java             |   36 +-
 .../jts/operation/buffer/BufferParameters.java     |   31 +
 .../jts/operation/buffer/BufferSubgraph.java       |    2 +-
 .../jts/operation/buffer/OffsetCurveBuilder.java   |   13 +-
 .../jts/operation/buffer/RightmostEdgeFinder.java  |    2 +-
 .../jts/operation/buffer/SubgraphDepthLocater.java |   59 +-
 .../jts/operation/buffer/package.html              |   13 -
 .../buffer/validate/DistanceToPointFinder.java     |    4 +-
 .../jts/operation/buffer/validate/package.html     |   13 -
 .../jts/operation/distance/package.html            |   13 -
 .../distance3d/AxisPlaneCoordinateSequence.java    |    6 +-
 .../jts/operation/distance3d/Distance3DOp.java     |    6 +-
 .../jts/operation/distance3d/PlanarPolygon3D.java  |    2 +-
 .../jts/operation/linemerge/package.html           |   13 -
 .../jts/operation/overlay/OverlayOp.java           |  111 +-
 .../jts/operation/overlay/package.html             |   41 -
 .../operation/overlay/snap/GeometrySnapper.java    |   30 +-
 .../jts/operation/overlay/snap/package.html        |   13 -
 .../jts/operation/overlay/validate/package.html    |   13 -
 src/com/vividsolutions/jts/operation/package.html  |   13 -
 .../jts/operation/polygonize/EdgeRing.java         |  208 +-
 .../polygonize/PolygonizeDirectedEdge.java         |    9 +
 .../jts/operation/polygonize/PolygonizeGraph.java  |   38 +-
 .../jts/operation/polygonize/Polygonizer.java      |  161 +-
 .../jts/operation/polygonize/package.html          |   13 -
 .../jts/operation/predicate/package.html           |   13 -
 .../jts/operation/relate/package.html              |   52 -
 .../jts/operation/union/CascadedPolygonUnion.java  |   18 +-
 .../jts/operation/union/UnaryUnionOp.java          |   62 +-
 .../jts/operation/union/package.html               |   13 -
 .../jts/operation/valid/package.html               |   13 -
 .../jts/planargraph/algorithm/package.html         |   13 -
 .../vividsolutions/jts/planargraph/package.html    |   13 -
 .../jts/precision/CommonBitsRemover.java           |   20 +-
 .../jts/precision/doc-files/minClearance.png       |  Bin 6539 -> 0 bytes
 src/com/vividsolutions/jts/precision/package.html  |   14 -
 .../jts/shape/fractal/KochSnowflakeBuilder.java    |    2 +-
 .../jts/simplify/DouglasPeuckerLineSimplifier.java |    1 -
 .../jts/simplify/DouglasPeuckerSimplifier.java     |   49 +-
 .../jts/simplify/TaggedLineStringSimplifier.java   |   21 +-
 .../jts/simplify/TopologyPreservingSimplifier.java |   17 +-
 .../jts/simplify/VWLineSimplifier.java             |  162 +
 .../vividsolutions/jts/simplify/VWSimplifier.java  |  227 +
 src/com/vividsolutions/jts/simplify/package.html   |   13 -
 .../ConformingDelaunayTriangulationBuilder.java    |    1 +
 .../ConformingDelaunayTriangulator.java            |    1 +
 .../jts/triangulate/VoronoiDiagramBuilder.java     |   19 +-
 .../vividsolutions/jts/triangulate/package.html    |   13 -
 .../jts/triangulate/quadedge/package.html          |   14 -
 src/com/vividsolutions/jts/util/Debug.java         |   48 +-
 src/com/vividsolutions/jts/util/NumberUtil.java    |   11 +
 src/com/vividsolutions/jts/util/Stopwatch.java     |    8 +-
 src/com/vividsolutions/jts/util/StringUtil.java    |   94 +
 .../jts/util/UniqueCoordinateArrayFilter.java      |   19 +-
 src/com/vividsolutions/jts/util/package.html       |    8 -
 .../jtsexample/geom/BasicExample.java              |   66 -
 .../jtsexample/geom/ConstructionExample.java       |   40 -
 .../jtsexample/geom/ExtendedCoordinate.java        |   93 -
 .../jtsexample/geom/ExtendedCoordinateExample.java |   89 -
 .../geom/ExtendedCoordinateSequence.java           |  215 -
 .../geom/ExtendedCoordinateSequenceFactory.java    |   83 -
 .../jtsexample/geom/PrecisionModelExample.java     |  130 -
 .../jtsexample/geom/SimpleMethodsExample.java      |   91 -
 .../geom/prep/PreparedGeometryExample.java         |   94 -
 .../jtsexample/io/gml2/KMLReaderExample.java       |  169 -
 .../jtsexample/linearref/LinearRefExample.java     |   87 -
 .../operation/distance/ClosestPointExample.java    |  108 -
 .../operation/linemerge/LineMergeExample.java      |  106 -
 .../operation/polygonize/PolygonizeExample.java    |   85 -
 src/com/vividsolutions/jtsexample/package.html     |   14 -
 .../precision/EnhancedPrecisionOpExample.java      |   87 -
 .../technique/LineStringSelfIntersections.java     |   65 -
 .../technique/PolygonUnionUsingBuffer.java         |   50 -
 .../SearchUsingPreparedGeometryIndex.java          |  244 -
 testxml/external/TestOverlay.xml                   |   86 +
 testxml/failure/TestBufferFailure.xml              |   46 +-
 testxml/failure/TestOverlay.xml                    |  225 -
 testxml/failure/TestOverlayFailure.xml             |   19 +
 testxml/general/TestCentroid.xml                   |   63 +-
 testxml/general/TestInteriorPoint.xml              |   68 +-
 testxml/general/TestPreparedPolygonPredicate.xml   |   20 +-
 testxml/robust/TestRobustBuffer.xml                |   20 -
 243 files changed, 7799 insertions(+), 22469 deletions(-)

diff --git a/doc/JTS Version History.html b/doc/JTS_Version_History.html
similarity index 86%
rename from doc/JTS Version History.html
rename to doc/JTS_Version_History.html
index 46d2f52..f2f4538 100644
--- a/doc/JTS Version History.html	
+++ b/doc/JTS_Version_History.html
@@ -23,9 +23,139 @@ The current and archived JTS distributions can be obtained at the
 
 <!-- ================================================================ -->
 <hr size='4' color='darkblue'>
+<h2>Version 1.14</h2>
+
+<i>Release Date:  September 23, 2015</i>
+
+<h3>Functionality Improvements</h3>
+<ul>
+<li>Added <code>Envelope.compareTo</code> method
+<li>Fixed <code>SegmentSetMutualIntersector</code> classes to be thread-safe</li>
+<li>Fixed <code>PreparedGeometry</code> classes to be thread-safe</li>
+<li>Added <code>LineDissolver</code> class
+<li>Added <code>edgegraph</code> package
+<li>Added <code>CoordinateSequences.isEqual</code> method
+<li>Extended <code>CoordinateSequences.copy</code> and <code>CoordinateSequences.copy</code> to handle inputs of different dimension
+<li>Added <code>CoordinateArrays.envelope()</code> function
+<li>Added <code>CoordinateArrays.intersection()</code> function
+<li>Added <code>Polygonizer.setCheckValidRings()</code> method for optimizing performance in some situations
+<li>Added <code>KMLWriter</code> to convert Geometry to KML representation
+<li>Added <code>Coordinate</code> <code>equals3D</code>, <code>equals2D(Coordinate, tolerance)</code>, and <code>equalInZ</code> methods.
+<li>Added <code>VWSimplifier</code> to perform Visvalingam-Whyatt simplification
+<li>Enhanced <code>WKBReader</code> to handle Spatialite WKB format
+<li>Added <code>DD.setValue()</code> methods
+<li>Added <code>getGeometry()</code> methods to <code>LinearComponentExtracter</code> and <code>LineStringExtracter</code>
+<li>Added <code>BufferParameters</code> </code>simplifyFactor</code> setting
+<li>Added node counting and ability to not keep intersection points to <code>InteriorIntersectionFinder</code>
+<li>Added <code>Polygonizer</code> functionality to extract only polygons forming a valid polygonal geometry
+<li>Added <code>KdTree.toCoordinates</code>
+<li>Added <code>MinimumBoundingCircle.getFarthestPoints</code> method
+</ul>
+
+<h3>Performance Improvements</h3>
+<ul>
+<li>Performance & memory improvement in <tt>PreparedPolygonIntersects</tt> by short-circuiting point input case
+<li>Allow for memory usage optimization in <code>CascadedPolygonUnion</code>, by avoiding retaining input collection
+<li>Fix <code>Point.isEmpty()</code> to avoid allocating a coordinate
+<li>Fix <code>Geometry.equalsExact()</code> to short-circuit when the inputs are identical objects
+<li>Add short-circuit to <code>PointExtracter</code> to improve performance for Points
+</ul>
+
+<h3>Bug Fixes</h3>
+<ul>
+<li>Fixed <code>RobustLineIntersector</code> heuristic for handling invalid intersection points
+(computed as outside envelope of input segments due to numeric precision issues)
+<li>Fixed <code>CGAlgorithmsDD.intersection</code> to compute intersection correctly
+<li>Fixed <tt>Geometry.interiorPoint()</tt> to compute a true interior point in certain cases
+<li>Fixed <code>Geometry.equals</code> to handle null argument
+<li>Fixed <code>DistanceToPoint</code> to be thread-safe
+<li>Fixed <code>Geometry.interiorPoint()</code> and <code>InteriorPointArea</code> to handle zero-area geometries
+<li>Fixed <code>STRtree</code> classes to be thread-safe (by synchronizing the <code>AbstractSTRtree.build()</code> method)
+<li>Fixed <code>STRtree.remove()</code> method to avoid a NPE
+<li>Fixed <code>DouglasPeuckerSimplifier</code> and <code>TopologyPreservingSimplifier</code> to handle empty geometry components in the input
+<li>Fixed <code>ConvexHull</code> to handle input of array of identical coordinates
+<li>Fixed <code>GeometryTransformer.transformLinearRing()</code> to handle null inputs
+<li>Fixed the <code>extractPoint(distance, offset)</code> methods in
+  <code>LocationIndexedLine</code> and <code>LengthIndexedLine</code> to handle offsets from endpoints correctly.
+<li>Fixed <code>GeometryCollectionIterator</code> to correctly handle atomic geometries
+<li>Fixed <code>InteriorIntersectionFinder</code> to not short-circuit when finding all nodes
+<li>Fixed <code>SubgraphDepthLocator</code> to work with Java 7+ by avoiding sorting with an inconsistent ordering
+<li>Fixed <code>FontGlyphReader</code> to use correct Java font value of "SansSerif", and added new constant to match.
+<li>Fixed <code>KdTree</code> to correctly implement distance tolerance-based coordinate matching
+<li>Fixed <code>LineString.normalize()</code> to correctly handle CoordinateSequences
+<li>Fixed <code>CommonBitsRemover</code> to correctly handle CoordinateSequences
+<li>Fixed bug in <code>CoordinateArraySequence.clone()</code>
+</ul>
+
+<h3>API Changes</h3>
+<ul>
+<li>Changed interface of <code>SegmentSetMutualIntersector</code> to support thread-safety by removing state
+<li>Provided <code>InteriorIntersectionFinderAdder</code> to replace the poorly named <code>IntersectionFinderAdder</code>
+<li>Changed some classes in <code>com.vividsolutions.jts.operation.buffer</code> to be package-private
+</ul>
+
+<h3>Testing Improvements</h3>
+<ul>
+<li>Added <code>GeometryTestCase</code> base class to simplify unit tests
+</ul>
+
+<!------- JTS-IO -------------------->
+<hr size='0' color='darkblue'>
+<h3 style='font-family:sans-serif; color:darkblue'>JTS I/O</h3>
+
+<h3>Functionality Improvements</h3>
+<ul>
+<li>Added <code>GeoJsonReader</code> and <code>GeoJsonWriter</code> classes
+</ul>
+
+<h3>API Changes</h3>
+<ul>
+<li>In <code>OraWriter</code> the connection is now provided to the <code>write()</code> method, not the constructors
+</ul>
+
+<h3>Bug Fixes</h3>
+<ul>
+<li>Fixed <code>OraReader</code> to handle reading <code>GeometryCollection</code> with <code>Point</code> as second element
+<li>Many improvements to Oracle API code and performance
+<li>Added <code>OraWriter.setOptimizePoint</code> and <code>OraWriter.setOptimizeRectangle</code> methods
+</ul>
+
+<!------- TestBuilder -------------------->
+<hr size='0' color='darkblue'>
+<h3 style='font-family:sans-serif; color:darkblue'>JTS TestBuilder</h3>
+
+<h3>Functionality Improvements</h3>
+<ul>
+<li>Added ability to read multiple WKBHex geometries from a text file
+<li>Added AutoZoom to input
+<li>Added Oracle text output
+<li>Added more function sets
+<li>Removed dependency on Acme GIF encoder library
+<li>Improved zooming logic
+<li>Added mouse wheel zooming
+<li>Improved UI for editing A/B geometries
+<li>Added <b>Compute New</b> button to Geometry Functions panel
+<li>Added SpatialIndex functions
+<li>Added User Data labelling
+</ul>
+
+<h3>UI Changes</h3>
+<ul>
+<li>Moved Options menu items to View menu
+<li>Removed Tools menu items (they are available as functions)
+</ul>
+
+<h3>Bug Fixes</h3>
+<ul>
+<li>Fixed to correctly handle changing Swing Look&Feel
+</ul>
+
+
+<!-- ================================================================ -->
+<hr size='4' color='darkblue'>
 <h2>Version 1.13</h2>
 
-<i>Release Date:  ????</i>
+<i>Release Date:  December 13, 2012</i>
 
 <h3>Functionality Improvements</h3>
 <ul>
@@ -40,7 +170,7 @@ using the CoordinateSequenceFactory of the factory
 <li>Added <tt>getOrdinate</tt> and <tt>setOrdinate</tt> to <tt>Coordinate</tt>
 <li><tt>Quadtree</tt> is <tt>Serializable</tt>
 <li><tt>STRtree</tt> is <tt>Serializable</tt>
-<li>Added <tt>max</tt>, <tt>average</tt> and <tt>wrap</tt> functions to </tt>MathUtil</tt>
+<li>Added <tt>max</tt>, <tt>average</tt> and <tt>wrap</tt> functions to <tt>MathUtil</tt>
 <li>Improved <tt>WKTReader</tt> parse error reporting to report input line of error
 <li>Improved <code>WKBReader</code> to repair structurally-invalid input
 <li>Made <tt>TopologyPreservingSimplifier</tt> thread-safe
@@ -123,7 +253,7 @@ for closed <tt>LineString</tt>s with large distance tolerances
 <li>Fixed <code>LengthIndexedLine</code> and <code>LocationIndexedLine</code> to handle <code>indexOfAfter()</code> correctly
 <li>Fixed <code>WKBReader</code> to handle successive geometrys with different endianness
 <li>Fixed <code>GeometricShapeFactory</code> to correctly handle setting the centre point
-<li>Fixed <code>GeometryFactory.createMultiPoint(CoordinateSequence)</code> to handle sequences of dimension > 3
+<li>Fixed <code>GeometryFactory.createMultiPoint(CoordinateSequence)</code> to handle sequences of dimension > 3
 </ul>
 
 <h3>API Changes</h3>
diff --git a/jtsio/src/META-INF/MANIFEST.MF b/jtsio/src/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5045494
--- /dev/null
+++ b/jtsio/src/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Ant-Version: Apache Ant 1.9.4
+Created-By: 1.7.0_75-b13 (Oracle Corporation)
+
diff --git a/jtsio/test/com/vividsolutions/jts/generator/PointGenerator.java b/jtsio/src/com/vividsolutions/jts/io/geojson/GeoJsonConstants.java
similarity index 55%
rename from jtsio/test/com/vividsolutions/jts/generator/PointGenerator.java
rename to jtsio/src/com/vividsolutions/jts/io/geojson/GeoJsonConstants.java
index 79c9930..d92bdd5 100644
--- a/jtsio/test/com/vividsolutions/jts/generator/PointGenerator.java
+++ b/jtsio/src/com/vividsolutions/jts/io/geojson/GeoJsonConstants.java
@@ -30,36 +30,28 @@
  *     (250)385-6040
  *     www.vividsolutions.com
  */
-package com.vividsolutions.jts.generator;
+package com.vividsolutions.jts.io.geojson;
 
-import com.vividsolutions.jts.geom.Geometry;
-import com.vividsolutions.jts.geom.Point;
 
 /**
+ * Constants for GeoJSON objects
  * 
- * Creates a point based on the bounding box. 
- * 
- * This implementation returns the centroid.
- *
- * @author David Zwiers, Vivid Solutions. 
+ * @author Martin Davis
  */
-public class PointGenerator extends GeometryGenerator {
+public class GeoJsonConstants {
 
-	/**
-	 * @see com.vividsolutions.jts.generator.GeometryGenerator#create()
-	 * @throws NullPointerException when either the Geometry Factory, or the Bounding Box are undefined.
-	 */
-	public Geometry create() {
-		if(geometryFactory == null){
-			throw new NullPointerException("GeometryFactory is not declared");
-		}
-		if(boundingBox == null || boundingBox.isNull()){
-			throw new NullPointerException("Bounding Box is not declared");
-		}
-		
-		Point p = geometryFactory.toGeometry(boundingBox).getCentroid();
-		geometryFactory.getPrecisionModel().makePrecise(p.getCoordinate());
-		return p;
-	}
+  public static final String NAME_GEOMETRIES = "geometries";
+  public static final String NAME_CRS = "crs";
+  public static final String NAME_PROPERTIES = "properties";
+  public static final String NAME_NAME = "name";
+  public static final String NAME_TYPE = "type";
+  public static final String NAME_POINT = "Point";
+  public static final String NAME_LINESTRING = "LineString";
+  public static final String NAME_POLYGON = "Polygon";
+  public static final String NAME_COORDINATES = "coordinates";
+  public static final String NAME_GEOMETRYCOLLECTION = "GeometryCollection";
+  public static final String NAME_MULTIPOLYGON = "MultiPolygon";
+  public static final String NAME_MULTILINESTRING = "MultiLineString";
+  public static final String NAME_MULTIPOINT = "MultiPoint";
 
 }
diff --git a/jtsio/src/com/vividsolutions/jts/io/geojson/GeoJsonReader.java b/jtsio/src/com/vividsolutions/jts/io/geojson/GeoJsonReader.java
new file mode 100644
index 0000000..ba99620
--- /dev/null
+++ b/jtsio/src/com/vividsolutions/jts/io/geojson/GeoJsonReader.java
@@ -0,0 +1,494 @@
+/*
+ * The JTS Topology Suite is a collection of Java classes that
+ * implement the fundamental operations required to validate a given
+ * geo-spatial data set to a known topological specification.
+ *
+ * Copyright (C) 2001 Vivid Solutions
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * For more information, contact:
+ *
+ *     Vivid Solutions
+ *     Suite #1A
+ *     2328 Government Street
+ *     Victoria BC  V8T 5G5
+ *     Canada
+ *
+ *     (250)385-6040
+ *     www.vividsolutions.com
+ */
+package com.vividsolutions.jts.io.geojson;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.json.simple.parser.JSONParser;
+
+import com.vividsolutions.jts.geom.CoordinateSequence;
+import com.vividsolutions.jts.geom.Geometry;
+import com.vividsolutions.jts.geom.GeometryFactory;
+import com.vividsolutions.jts.geom.LineString;
+import com.vividsolutions.jts.geom.LinearRing;
+import com.vividsolutions.jts.geom.Polygon;
+import com.vividsolutions.jts.geom.PrecisionModel;
+import com.vividsolutions.jts.geom.impl.CoordinateArraySequence;
+import com.vividsolutions.jts.io.ParseException;
+
+/**
+ * Reads a GeoJson Geometry from a JSON fragment into a {@link Geometry}.
+ * <p>
+ * A specification of the GeoJson format can be found at the GeoJson web site:
+ * <a href='http://geojson.org/geojson-spec.html'>http://geojson.org/geojson-spec.html</a>.
+ * <p>
+ * It is the caller's responsibility to ensure that the supplied
+ * {@link PrecisionModel} matches the precision of the incoming data. If a lower
+ * precision for the data is required, a subsequent process must be run on the
+ * data to reduce its precision.
+ * 
+ * @author Martin Davis
+ * @author Paul Howells, Vivid Solutions.
+ * 
+ */
+public class GeoJsonReader {
+
+  private GeometryFactory gf;
+
+  /**
+   * The default constructor uses the SRID from the Geojson CRS and the
+   * default <code>PrecisionModel</code> to create a
+   * <code>GeometryFactory</code>. If there is no CRS specified then the default
+   * CRS is a geographic coordinate reference system, using the WGS84 datum, and
+   * with longitude and latitude units of decimal degrees (SRID = 4326)
+   */
+  public GeoJsonReader() {
+    // do nothing
+  }
+
+  /**
+   * This constructor accepts a <code>GeometryFactory</code> that is used
+   * to create the output geometries and to override the GeoJson CRS.
+   * 
+   * @param geometryFactory
+   *          a GeometryFactory
+   */
+  public GeoJsonReader(GeometryFactory geometryFactory) {
+    this.gf = geometryFactory;
+  }
+
+  /**
+   * Reads a GeoJson Geometry from a <tt>String</tt> into a single
+   * {@link Geometry}.
+   * 
+   * 
+   * @param json
+   *          The GeoJson String to parse
+   * @return the resulting JTS Geometry
+   * 
+   * @throws ParseException
+   *           throws a ParseException if the JSON string cannot be parsed
+   */
+  public Geometry read(String json) throws ParseException {
+    Geometry result = read(new StringReader(json));
+    return result;
+  }
+
+  /**
+   * Reads a GeoJson Geometry from a {@link Reader} into a single
+   * {@link Geometry}.
+   * 
+   * 
+   * @param reader
+   *          The input source
+   * @return The resulting JTS Geometry
+   * 
+   * @throws ParseException
+   *           throws a ParseException if the JSON string cannot be parsed
+   */
+  public Geometry read(Reader reader) throws ParseException {
+
+    Geometry result = null;
+
+    JSONParser parser = new JSONParser();
+    try {
+      @SuppressWarnings("unchecked")
+      Map<String, Object> geometryMap = (Map<String, Object>) parser
+          .parse(reader);
+
+      GeometryFactory geometryFactory = null;
+      if (this.gf == null) {
+        geometryFactory = this.getGeometryFactory(geometryMap);
+      } else {
+        geometryFactory = this.gf;
+      }
+
+      result = create(geometryMap, geometryFactory);
+
+    } catch (org.json.simple.parser.ParseException e) {
+      throw new ParseException(e);
+    } catch (IOException e) {
+      throw new ParseException(e);
+    }
+
+    return result;
+  }
+
+  private Geometry create(Map<String, Object> geometryMap,
+      GeometryFactory geometryFactory) throws ParseException {
+
+    Geometry result = null;
+
+    String type = (String) geometryMap.get(GeoJsonConstants.NAME_TYPE);
+
+    if (type == null) {
+      throw new ParseException(
+          "Could not parse Geometry from Json string.  No 'type' property found.");
+    } else {
+
+      if (GeoJsonConstants.NAME_POINT.equals(type)) {
+        result = createPoint(geometryMap, geometryFactory);
+
+      } else if (GeoJsonConstants.NAME_LINESTRING.equals(type)) {
+        result = createLineString(geometryMap, geometryFactory);
+
+      } else if (GeoJsonConstants.NAME_POLYGON.equals(type)) {
+        result = createPolygon(geometryMap, geometryFactory);
+
+      } else if (GeoJsonConstants.NAME_MULTIPOINT.equals(type)) {
+        result = createMultiPoint(geometryMap, geometryFactory);
+
+      } else if (GeoJsonConstants.NAME_MULTILINESTRING.equals(type)) {
+        result = createMultiLineString(geometryMap, geometryFactory);
+
+      } else if (GeoJsonConstants.NAME_MULTIPOLYGON.equals(type)) {
+        result = createMultiPolygon(geometryMap, geometryFactory);
+
+      } else if (GeoJsonConstants.NAME_GEOMETRYCOLLECTION.equals(type)) {
+        result = createGeometryCollection(geometryMap, geometryFactory);
+
+      } else {
+        throw new ParseException(
+            "Could not parse Geometry from GeoJson string.  Unsupported 'type':"
+                + type);
+      }
+    }
+
+    return result;
+  }
+
+  private Geometry createGeometryCollection(Map<String, Object> geometryMap,
+      GeometryFactory geometryFactory) throws ParseException {
+
+    Geometry result = null;
+
+    try {
+
+      @SuppressWarnings("unchecked")
+      List<Map<String, Object>> geometriesList = (List<Map<String, Object>>) geometryMap
+          .get(GeoJsonConstants.NAME_GEOMETRIES);
+
+      Geometry[] geometries = new Geometry[geometriesList.size()];
+
+      int i = 0;
+      for (Map<String, Object> map : geometriesList) {
+
+        geometries[i] = this.create(map, geometryFactory);
+
+        ++i;
+      }
+
+      result = geometryFactory.createGeometryCollection(geometries);
+
+    } catch (RuntimeException e) {
+      throw new ParseException(
+          "Could not parse GeometryCollection from GeoJson string.", e);
+    }
+
+    return result;
+  }
+
+  private Geometry createMultiPolygon(Map<String, Object> geometryMap,
+      GeometryFactory geometryFactory) throws ParseException {
+
+    Geometry result = null;
+
+    try {
+
+      @SuppressWarnings("unchecked")
+      List<List<List<List<Number>>>> polygonsList = (List<List<List<List<Number>>>>) geometryMap
+          .get(GeoJsonConstants.NAME_COORDINATES);
+
+      Polygon[] polygons = new Polygon[polygonsList.size()];
+
+      int p = 0;
+      for (List<List<List<Number>>> ringsList : polygonsList) {
+
+        List<CoordinateSequence> rings = new ArrayList<CoordinateSequence>();
+
+        for (List<List<Number>> coordinates : ringsList) {
+
+          rings.add(createCoordinateSequence(coordinates));
+        }
+
+        if (rings.isEmpty()) {
+          continue;
+        }
+
+        LinearRing outer = geometryFactory.createLinearRing(rings.get(0));
+        LinearRing[] inner = null;
+        if (rings.size() > 1) {
+          inner = new LinearRing[rings.size() - 1];
+          for (int i = 1; i < rings.size(); i++) {
+            inner[i - 1] = geometryFactory.createLinearRing(rings.get(i));
+          }
+        }
+
+        polygons[p] = geometryFactory.createPolygon(outer, inner);
+
+        ++p;
+      }
+
+      result = geometryFactory.createMultiPolygon(polygons);
+
+    } catch (RuntimeException e) {
+      throw new ParseException(
+          "Could not parse MultiPolygon from GeoJson string.", e);
+    }
+
+    return result;
+  }
+
+  private Geometry createMultiLineString(Map<String, Object> geometryMap,
+      GeometryFactory geometryFactory) throws ParseException {
+
+    Geometry result = null;
+
+    try {
+
+      @SuppressWarnings("unchecked")
+      List<List<List<Number>>> linesList = (List<List<List<Number>>>) geometryMap
+          .get(GeoJsonConstants.NAME_COORDINATES);
+
+      LineString[] lineStrings = new LineString[linesList.size()];
+
+      int i = 0;
+      for (List<List<Number>> coordinates : linesList) {
+
+        lineStrings[i] = geometryFactory
+            .createLineString(createCoordinateSequence(coordinates));
+
+        ++i;
+      }
+
+      result = geometryFactory.createMultiLineString(lineStrings);
+
+    } catch (RuntimeException e) {
+      throw new ParseException(
+          "Could not parse MultiLineString from GeoJson string.", e);
+    }
+
+    return result;
+  }
+
+  private Geometry createMultiPoint(Map<String, Object> geometryMap,
+      GeometryFactory geometryFactory) throws ParseException {
+
+    Geometry result = null;
+
+    try {
+
+      @SuppressWarnings("unchecked")
+      List<List<Number>> coordinatesList = (List<List<Number>>) geometryMap
+          .get(GeoJsonConstants.NAME_COORDINATES);
+
+      CoordinateSequence coordinates = this
+          .createCoordinateSequence(coordinatesList);
+
+      result = geometryFactory.createMultiPoint(coordinates);
+
+    } catch (RuntimeException e) {
+      throw new ParseException(
+          "Could not parse MultiPoint from GeoJson string.", e);
+    }
+
+    return result;
+  }
+
+  private Geometry createPolygon(Map<String, Object> geometryMap,
+      GeometryFactory geometryFactory) throws ParseException {
+
+    Geometry result = null;
+
+    try {
+
+      @SuppressWarnings("unchecked")
+      List<List<List<Number>>> ringsList = (List<List<List<Number>>>) geometryMap
+          .get(GeoJsonConstants.NAME_COORDINATES);
+
+      List<CoordinateSequence> rings = new ArrayList<CoordinateSequence>();
+
+      for (List<List<Number>> coordinates : ringsList) {
+
+        rings.add(createCoordinateSequence(coordinates));
+      }
+
+      if (rings.isEmpty()) {
+        throw new IllegalArgumentException("Polygon specified with no rings.");
+      }
+
+      LinearRing outer = geometryFactory.createLinearRing(rings.get(0));
+      LinearRing[] inner = null;
+      if (rings.size() > 1) {
+        inner = new LinearRing[rings.size() - 1];
+        for (int i = 1; i < rings.size(); i++) {
+          inner[i - 1] = geometryFactory.createLinearRing(rings.get(i));
+        }
+      }
+
+      result = geometryFactory.createPolygon(outer, inner);
+
+    } catch (RuntimeException e) {
+      throw new ParseException("Could not parse Polygon from GeoJson string.",
+          e);
+    }
+
+    return result;
+  }
+
+  private Geometry createLineString(Map<String, Object> geometryMap,
+      GeometryFactory geometryFactory) throws ParseException {
+
+    Geometry result = null;
+
+    try {
+
+      @SuppressWarnings("unchecked")
+      List<List<Number>> coordinatesList = (List<List<Number>>) geometryMap
+          .get(GeoJsonConstants.NAME_COORDINATES);
+
+      CoordinateSequence coordinates = createCoordinateSequence(coordinatesList);
+
+      result = geometryFactory.createLineString(coordinates);
+
+    } catch (RuntimeException e) {
+      throw new ParseException(
+          "Could not parse LineString from GeoJson string.", e);
+    }
+
+    return result;
+  }
+
+  private Geometry createPoint(Map<String, Object> geometryMap,
+      GeometryFactory geometryFactory) throws ParseException {
+
+    Geometry result = null;
+
+    try {
+
+      @SuppressWarnings("unchecked")
+      List<Number> coordinateList = (List<Number>) geometryMap
+          .get(GeoJsonConstants.NAME_COORDINATES);
+
+      CoordinateSequence coordinate = this.createCoordinate(coordinateList);
+
+      result = geometryFactory.createPoint(coordinate);
+
+    } catch (RuntimeException e) {
+      throw new ParseException("Could not parse Point from GeoJson string.", e);
+    }
+
+    return result;
+  }
+
+  private GeometryFactory getGeometryFactory(Map<String, Object> geometryMap)
+      throws ParseException {
+
+    GeometryFactory result = null;
+    @SuppressWarnings("unchecked")
+    Map<String, Object> crsMap = (Map<String, Object>) geometryMap.get(GeoJsonConstants.NAME_CRS);
+    Integer srid = null;
+    
+    if (crsMap != null) {
+
+      try {
+
+        @SuppressWarnings("unchecked")
+        Map<String, Object> propertiesMap = (Map<String, Object>) crsMap
+            .get(GeoJsonConstants.NAME_PROPERTIES);
+        String name = (String) propertiesMap.get(GeoJsonConstants.NAME_NAME);
+        String[] split = name.split(":");
+        String epsg = split[1];
+        srid = Integer.valueOf(epsg);
+      } catch (RuntimeException e) {
+        throw new ParseException(
+            "Could not parse SRID from Geojson 'crs' object.", e);
+      }
+    }
+
+    if (srid == null) {
+      // The default CRS is a geographic coordinate reference
+      // system, using the WGS84 datum, and with longitude and
+      // latitude units of decimal degrees. SRID 4326
+      srid = Integer.valueOf(4326);
+    }
+
+    result = new GeometryFactory(new PrecisionModel(), srid.intValue());
+    return result;
+  }
+
+  private CoordinateSequence createCoordinateSequence(
+      List<List<Number>> coordinates) {
+    CoordinateSequence result = null;
+
+    result = new CoordinateArraySequence(coordinates.size());
+
+    for (int i = 0; i < coordinates.size(); ++i) {
+      List<Number> ordinates = coordinates.get(i);
+
+      if (ordinates.size() > 0) {
+        result.setOrdinate(i, 0, ordinates.get(0).doubleValue());
+      }
+      if (ordinates.size() > 1) {
+        result.setOrdinate(i, 1, ordinates.get(1).doubleValue());
+      }
+      if (ordinates.size() > 2) {
+        result.setOrdinate(i, 2, ordinates.get(2).doubleValue());
+      }
+
+    }
+
+    return result;
+  }
+
+  private CoordinateSequence createCoordinate(List<Number> ordinates) {
+    CoordinateSequence result = new CoordinateArraySequence(1);
+
+    if (ordinates.size() > 0) {
+      result.setOrdinate(0, 0, ordinates.get(0).doubleValue());
+    }
+    if (ordinates.size() > 1) {
+      result.setOrdinate(0, 1, ordinates.get(1).doubleValue());
+    }
+    if (ordinates.size() > 2) {
+      result.setOrdinate(0, 2, ordinates.get(2).doubleValue());
+    }
+
+    return result;
+  }
+}
diff --git a/jtsio/src/com/vividsolutions/jts/io/geojson/GeoJsonWriter.java b/jtsio/src/com/vividsolutions/jts/io/geojson/GeoJsonWriter.java
new file mode 100644
index 0000000..54abf33
--- /dev/null
+++ b/jtsio/src/com/vividsolutions/jts/io/geojson/GeoJsonWriter.java
@@ -0,0 +1,325 @@
+/*
+ * The JTS Topology Suite is a collection of Java classes that
+ * implement the fundamental operations required to validate a given
+ * geo-spatial data set to a known topological specification.
+ *
+ * Copyright (C) 2001 Vivid Solutions
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * For more information, contact:
+ *
+ *     Vivid Solutions
+ *     Suite #1A
+ *     2328 Government Street
+ *     Victoria BC  V8T 5G5
+ *     Canada
+ *
+ *     (250)385-6040
+ *     www.vividsolutions.com
+ */
+package com.vividsolutions.jts.io.geojson;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.json.simple.JSONAware;
+import org.json.simple.JSONObject;
+
+import com.vividsolutions.jts.geom.CoordinateSequence;
+import com.vividsolutions.jts.geom.Geometry;
+import com.vividsolutions.jts.geom.GeometryCollection;
+import com.vividsolutions.jts.geom.LineString;
+import com.vividsolutions.jts.geom.MultiLineString;
+import com.vividsolutions.jts.geom.MultiPoint;
+import com.vividsolutions.jts.geom.MultiPolygon;
+import com.vividsolutions.jts.geom.Point;
+import com.vividsolutions.jts.geom.Polygon;
+import com.vividsolutions.jts.util.Assert;
+
+/**
+ * Writes {@link Geometry}s as JSON fragments in GeoJson format.
+ * 
+ * @author Martin Davis
+ * @author Paul Howells, Vivid Solutions
+ */
+public class GeoJsonWriter {
+  
+  public static final String EPSG_PREFIX = "EPSG:";
+  
+  private double scale;
+  private boolean isEncodeCRS = true;
+
+  /**
+   * Constructs a GeoJsonWriter instance.
+   */
+  public GeoJsonWriter() {
+    this(8);
+  }
+
+  /**
+   * Constructs a GeoJsonWriter instance specifying the number of decimals to
+   * use when encoding floating point numbers.
+   */
+  public GeoJsonWriter(int decimals) {
+    this.scale = Math.pow(10, decimals);
+  }
+
+  public void setEncodeCRS(boolean isEncodeCRS) {
+    this.isEncodeCRS  = isEncodeCRS;
+  }
+  
+  /**
+   * Writes a {@link Geometry} in GeoJson format to a String.
+   * 
+   * @param geometry
+   * @return String GeoJson Encoded Geometry
+   */
+  public String write(Geometry geometry) {
+
+    StringWriter writer = new StringWriter();
+    try {
+      write(geometry, writer);
+    } catch (IOException ex) {
+      Assert.shouldNeverReachHere();
+    }
+
+    return writer.toString();
+  }
+
+  /**
+   * Writes a {@link Geometry} in GeoJson format into a {@link Writer}.
+   * 
+   * @param geometry
+   *          Geometry to encode
+   * @param writer
+   *          Stream to encode to.
+   * @throws IOException
+   *           throws an IOException when unable to write the JSON string
+   */
+  public void write(Geometry geometry, Writer writer) throws IOException {
+    Map<String, Object> map = create(geometry, isEncodeCRS);
+    JSONObject.writeJSONString(map, writer);
+    writer.flush();
+  }
+
+  private Map<String, Object> create(Geometry geometry, boolean encodeCRS) {
+
+    Map<String, Object> result = new LinkedHashMap<String, Object>();
+    result.put(GeoJsonConstants.NAME_TYPE, geometry.getGeometryType());
+
+    if (geometry instanceof Point) {
+      Point point = (Point) geometry;
+
+      final String jsonString = getJsonString(point.getCoordinateSequence());
+
+      result.put(GeoJsonConstants.NAME_COORDINATES, new JSONAware() {
+
+        public String toJSONString() {
+          return jsonString;
+        }
+      });
+
+    } else if (geometry instanceof LineString) {
+      LineString lineString = (LineString) geometry;
+
+      final String jsonString = getJsonString(lineString
+          .getCoordinateSequence());
+
+      result.put(GeoJsonConstants.NAME_COORDINATES, new JSONAware() {
+
+        public String toJSONString() {
+          return jsonString;
+        }
+      });
+
+    } else if (geometry instanceof Polygon) {
+      Polygon polygon = (Polygon) geometry;
+
+      result.put(GeoJsonConstants.NAME_COORDINATES, makeJsonAware(polygon));
+
+    } else if (geometry instanceof MultiPoint) {
+      MultiPoint multiPoint = (MultiPoint) geometry;
+
+      result.put(GeoJsonConstants.NAME_COORDINATES, makeJsonAware(multiPoint));
+
+    } else if (geometry instanceof MultiLineString) {
+      MultiLineString multiLineString = (MultiLineString) geometry;
+
+      result.put(GeoJsonConstants.NAME_COORDINATES, makeJsonAware(multiLineString));
+
+    } else if (geometry instanceof MultiPolygon) {
+      MultiPolygon multiPolygon = (MultiPolygon) geometry;
+
+      result.put(GeoJsonConstants.NAME_COORDINATES, makeJsonAware(multiPolygon));
+
+    } else if (geometry instanceof GeometryCollection) {
+      GeometryCollection geometryCollection = (GeometryCollection) geometry;
+
+      ArrayList<Map<String, Object>> geometries = new ArrayList<Map<String, Object>>(
+          geometryCollection.getNumGeometries());
+
+      for (int i = 0; i < geometryCollection.getNumGeometries(); i++) {
+        geometries.add(create(geometryCollection.getGeometryN(i), false));
+      }
+
+      result.put(GeoJsonConstants.NAME_GEOMETRIES, geometries);
+
+    } else {
+      throw new IllegalArgumentException("Unable to encode geometry " + geometry.getGeometryType() );
+    }
+
+    if (encodeCRS) {
+      result.put(GeoJsonConstants.NAME_CRS, createCRS(geometry.getSRID()));
+    }
+
+    return result;
+  }
+
+  private Map<String, Object> createCRS(int srid) {
+
+    Map<String, Object> result = new LinkedHashMap<String, Object>();
+    result.put(GeoJsonConstants.NAME_TYPE, GeoJsonConstants.NAME_NAME);
+
+    Map<String, Object> props = new LinkedHashMap<String, Object>();
+    props.put(GeoJsonConstants.NAME_NAME, EPSG_PREFIX + srid);
+
+    result.put(GeoJsonConstants.NAME_PROPERTIES, props);
+
+    return result;
+  }
+
+  private List<JSONAware> makeJsonAware(Polygon poly) {
+    ArrayList<JSONAware> result = new ArrayList<JSONAware>();
+
+    {
+      final String jsonString = getJsonString(poly.getExteriorRing()
+          .getCoordinateSequence());
+      result.add(new JSONAware() {
+
+        public String toJSONString() {
+          return jsonString;
+        }
+      });
+    }
+    for (int i = 0; i < poly.getNumInteriorRing(); i++) {
+      final String jsonString = getJsonString(poly.getInteriorRingN(i)
+          .getCoordinateSequence());
+      result.add(new JSONAware() {
+
+        public String toJSONString() {
+          return jsonString;
+        }
+      });
+    }
+
+    return result;
+  }
+
+  private List<Object> makeJsonAware(GeometryCollection geometryCollection) {
+
+    ArrayList<Object> list = new ArrayList<Object>(
+        geometryCollection.getNumGeometries());
+    for (int i = 0; i < geometryCollection.getNumGeometries(); i++) {
+      Geometry geometry = geometryCollection.getGeometryN(i);
+      
+      if (geometry instanceof Polygon) {
+        Polygon polygon = (Polygon) geometry;
+        list.add(makeJsonAware(polygon));
+      } 
+      else if (geometry instanceof LineString) {
+        LineString lineString = (LineString) geometry;
+        final String jsonString = getJsonString(lineString
+            .getCoordinateSequence());
+        list.add(new JSONAware() {
+
+          public String toJSONString() {
+            return jsonString;
+          }
+        });
+      } 
+      else if (geometry instanceof Point) {
+        Point point = (Point) geometry;
+        final String jsonString = getJsonString(point.getCoordinateSequence());
+        list.add(new JSONAware() {
+
+          public String toJSONString() {
+            return jsonString;
+          }
+        });
+      }
+    }
+
+    return list;
+  }
+
+  private String getJsonString(CoordinateSequence coordinateSequence) {
+    StringBuffer result = new StringBuffer();
+
+    if (coordinateSequence.size() > 1) {
+      result.append("[");
+    }
+    for (int i = 0; i < coordinateSequence.size(); i++) {
+      if (i > 0) {
+        result.append(",");
+      }
+      result.append("[");
+      result.append(formatOrdinate(coordinateSequence.getOrdinate(i, CoordinateSequence.X))); 
+      result.append(",");
+      result.append(formatOrdinate(coordinateSequence.getOrdinate(i, CoordinateSequence.Y)));
+
+      if (coordinateSequence.getDimension() > 2 ) {
+        double z = coordinateSequence.getOrdinate(i, CoordinateSequence.Z);
+        if (!  Double.isNaN(z)) {
+          result.append(",");
+          result.append(formatOrdinate(z));
+        }
+      }
+
+      result.append("]");
+
+    }
+
+    if (coordinateSequence.size() > 1) {
+      result.append("]");
+    }
+
+    return result.toString();
+  }
+
+  private String formatOrdinate(double x) {
+    String result = null;
+
+    if (Math.abs(x) >= Math.pow(10, -3) && x < Math.pow(10, 7)) {
+      x = Math.floor(x * scale + 0.5) / scale;
+      long lx = (long) x;
+      if (lx == x) {
+        result = Long.toString(lx);
+      } else {
+        result = Double.toString(x);
+      }
+    } else {
+      result = Double.toString(x);
+    }
+
+    return result;
+  }
+
+}
diff --git a/jtsio/src/com/vividsolutions/jts/io/oracle/Constants.java b/jtsio/src/com/vividsolutions/jts/io/oracle/Constants.java
deleted file mode 100644
index 673b5d7..0000000
--- a/jtsio/src/com/vividsolutions/jts/io/oracle/Constants.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-/*
- *    Geotools2 - OpenSource mapping toolkit
- *    http://geotools.org
- *    (C) 2003, Geotools Project Managment Committee (PMC)
- *
- *    This library is free software; you can redistribute it and/or
- *    modify it under the terms of the GNU Lesser General Public
- *    License as published by the Free Software Foundation;
- *    version 2.1 of the License.
- *
- *    This library is distributed in the hope that it will be useful,
- *    but WITHOUT ANY WARRANTY; without even the implied warranty of
- *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *    Lesser General Public License for more details.
- *
- */
-package com.vividsolutions.jts.io.oracle;
-
-/**
- * Set of constants used to interact with MDSYS.GEOMETRY and JTS Geometries. 
- * 
- *
- * @author David Zwiers, Vivid Solutions.
- */
-class Constants {
-	
-	/**
-	 * Null SRID
-	 */
-	public static final int SRID_NULL = -1;
-	
-	/**
-	 * 
-	 * Extracted from the Oracle Documentation for SDO_ETYPE
-	 * 
-	 * This list may need to be expanded in the future to handle additional Geometry Types.
-	 *
-	 * @author David Zwiers, Vivid Solutions.
-	 * @author Jody Garnett, Refractions Research, Inc.
-	 */
-	static final class SDO_ETYPE{
-
-	    /** <code>ETYPE</code> code representing Point */
-	    public static final int POINT = 1;
-	
-	    /** <code>ETYPE</code> code representing Line */
-	    public static final int LINE = 2;
-	    
-		/** <code>ETYPE</code> code representing Polygon */
-		public static final int POLYGON = 3;
-	
-	    /** <code>ETYPE</code> code representing exterior counterclockwise  polygon ring */
-	    public static final int POLYGON_EXTERIOR = 1003;
-	
-	    /** <code>ETYPE</code> code representing interior clockwise  polygon ring */
-	    public static final int POLYGON_INTERIOR = 2003;
-	}
-    
-	/**
-	 * Extracted from the Oracle Documentation for SDO_GTYPE.
-	 * This represents the last two digits in a GTYPE, where the first id dimension and the second if LRS
-	 * 
-	 * This list may need to be expanded in the future to handle additional Geometry Types.
-	 *
-	 * @author David Zwiers, Vivid Solutions.
-	 * @author Brent Owens, The Open Planning Project.
-	 */
-	static final class SDO_GTEMPLATE{
-	
-		/** <code>TT</code> code representing Point */
-		public static final int POINT         = 01;
-	
-		/** <code>TT</code> code representing Line (or Curve) */
-		public static final int LINE          = 02;  
-	    
-		/** <code>TT</code> code representing Polygon */
-		public static final int POLYGON       = 03;
-	
-		/** <code>TT</code> code representing Collection */
-		public static final int COLLECTION    = 04;   
-	
-		/** <code>TT</code> code representing Multpoint */
-		public static final int MULTIPOINT    = 05;       
-	
-		/** <code>TT</code> code representing Multiline (or Multicurve) */
-		public static final int MULTILINE     = 06;
-	
-		/** <code>TT</code> code representing MULTIPOLYGON */
-		public static final int MULTIPOLYGON  = 07;
-	}
-}
diff --git a/jtsio/src/com/vividsolutions/jts/io/oracle/OraGeom.java b/jtsio/src/com/vividsolutions/jts/io/oracle/OraGeom.java
new file mode 100644
index 0000000..8a79d3c
--- /dev/null
+++ b/jtsio/src/com/vividsolutions/jts/io/oracle/OraGeom.java
@@ -0,0 +1,521 @@
+/*
+ * The JTS Topology Suite is a collection of Java classes that
+ * implement the fundamental operations required to validate a given
+ * geo-spatial data set to a known topological specification.
+ *
+ * Copyright (C) 2001 Vivid Solutions
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * For more information, contact:
+ *
+ *     Vivid Solutions
+ *     Suite #1A
+ *     2328 Government Street
+ *     Victoria BC  V8T 5G5
+ *     Canada
+ *
+ *     (250)385-6040
+ *     www.vividsolutions.com
+ */
+package com.vividsolutions.jts.io.oracle;
+
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+
+import com.vividsolutions.jts.geom.Geometry;
+import com.vividsolutions.jts.geom.GeometryCollection;
+import com.vividsolutions.jts.geom.LineString;
+import com.vividsolutions.jts.geom.MultiLineString;
+import com.vividsolutions.jts.geom.MultiPoint;
+import com.vividsolutions.jts.geom.MultiPolygon;
+import com.vividsolutions.jts.geom.Point;
+import com.vividsolutions.jts.geom.Polygon;
+
+/**
+ * Represents the contents of an Oracle SDO_GEOMETRY structure.
+ * Also provides code values and convenience methods for working
+ * with SDO_GEOMETRY values.
+ * 
+ * @author Martin Davis
+ *
+ */
+class OraGeom
+{
+	public static final int NULL_DIMENSION = -1;	
+
+	private static NumberFormat fmt = new DecimalFormat("0.################");
+	  
+	public static final String SQL_NULL = "NULL";
+
+  int gType;
+  int srid;
+  double[] point = null;
+  int[] elemInfo = null;
+  double[] ordinates = null;
+  private int geomType;
+  private int ordDim;
+  private int lrsDim;
+
+  public OraGeom(int gType, int srid, double[] ptType, int[] elemInfo, double[] ordinates)
+  {
+    this.gType = gType;
+    this.srid = srid;
+    this.point = ptType;
+    this.elemInfo = elemInfo;
+    this.ordinates = ordinates;
+    geomType = gTypeGeomType(gType);
+    ordDim = gTypeDim(gType);
+    lrsDim = gTypeMeasureDim(gType);
+  }
+
+  public OraGeom(int gType, int srid, int[] elemInfo, double[] ordinates)
+  {
+    this(gType, srid, null, elemInfo, ordinates);
+  }
+
+  public OraGeom(int gType, int srid, double[] ptType)
+  {
+    this(gType, srid, ptType, null, null);
+  }
+
+  public int geomType()
+  {
+    return geomType;
+  }
+
+  public int ordDim()
+  {
+    return ordDim;
+  }
+
+  public int lrsDim()
+  {
+    return lrsDim;
+  }
+  
+  public boolean isCompactPoint()
+  {
+    return lrsDim == 0 && geomType == OraGeom.GEOM_TYPE.POINT && point != null && elemInfo == null;
+  }
+  
+  public boolean isEqual(OraGeom og)
+  {
+    if (gType != og.gType) return false;
+//    if (srid != og.srid) return false;
+    if (! isEqual(point, og.point))
+        return false;
+    // assume is defined by elemInfo and ordinates
+    if (! isEqual(elemInfo, og.elemInfo)) 
+      return false;
+    if (! isEqual(ordinates, og.ordinates)) 
+      return false;
+    return true;
+  }
+
+  private boolean isEqual(double[] a1, double[] a2)
+  {
+    if (a2 == null || a1 == null) {
+      return a2 == a1;
+    }
+    if (a1.length != a2.length) return false;
+    for (int i = 0; i < a1.length; i++) {
+      // check NaN == NaN
+      if (Double.isNaN(a1[i]) && Double.isNaN(a2[i])) 
+    	  continue;
+      if (a1[i] != a2[i]) 
+    	  return false;
+    }
+    return true;
+  }
+  private boolean isEqual(int[] a1, int[] a2)
+  {
+    if (a2 == null || a1 == null) {
+      return a2 == a1;
+    }
+    if (a1.length != a2.length) return false;
+    for (int i = 0; i < a1.length; i++) {
+      if (a1[i] != a2[i]) return false;
+    }
+    return true;
+  }
+  
+  public String toString()
+  {
+	  return toSQLString();
+	  /*
+	  return "GTYPE=" + gType 
+			  + " SRID=" + srid
+			  + " ELEM_INFO=" + toStringElemInfo(elemInfo)
+			  + " ORDS=" + toString(ordinates);
+			  */
+  }
+  
+  public String toSQLString()
+  {
+  	StringBuffer buf = new StringBuffer();
+  	buf.append("SDO_GEOMETRY(");
+  	
+  	buf.append(gType);
+  	buf.append(",");
+  	
+  	buf.append(srid >= 0 ? String.valueOf(srid) : SQL_NULL);
+  	buf.append(",");
+  	
+  	buf.append(toStringPointType());
+  	buf.append(",");
+  	
+  	buf.append(toStringElemInfo());
+  	buf.append(",");
+  	
+  	buf.append(toStringOrdinates());
+  	buf.append(")");
+  	
+  	return buf.toString();
+  }
+  
+  private String toString(double[] ordinates)
+  {
+    if (ordinates == null) return SQL_NULL;
+    
+    StringBuffer buf = new StringBuffer();
+    for (int i = 0; i < ordinates.length; i++) {
+      if (i > 0) {
+        buf.append(",");
+        // spacer between triplets
+        if (i % ordDim == 0)
+          buf.append("  ");
+      }
+      buf.append(number(ordinates[i]));
+    }
+    return buf.toString();
+  }
+
+  private static String number(double d)
+  {
+	 if (Double.isNaN(d)) return SQL_NULL;
+	 return fmt.format(d);
+  }
+  
+  public static String toStringElemInfo(int[] elemInfo)
+  {
+    if (elemInfo == null) return "null";
+    StringBuffer buf = new StringBuffer();
+    for (int i = 0; i < elemInfo.length; i++) {
+      if (i > 0) {
+        buf.append(",");
+        // spacer between triplets
+        if (i % 3 == 0)
+          buf.append("  ");
+      }
+      buf.append(elemInfo[i]);
+    }
+    return buf.toString();
+  }
+  
+  private Object toStringOrdinates() {
+	  if (ordinates == null) {
+		 return SQL_NULL;
+	  }
+	  return "SDO_ORDINATE_ARRAY(" + toString(ordinates) + ")"; 
+  }
+
+  private Object toStringElemInfo() {
+	  if (elemInfo == null) {
+		 return SQL_NULL;
+	  }
+	  return "SDO_ELEM_INFO_ARRAY(" + toStringElemInfo(elemInfo) + ")"; 
+  }
+
+  private Object toStringPointType() {
+	  if (point == null) {
+		 return SQL_NULL;
+	  }
+	  return "SDO_POINT_TYPE(" 
+	  	+ number(point[0]) + ","
+	  	+ number(point[1]) + ","
+	  	+ number(point[2])
+	  	+ ")"; 
+  }
+
+public int startingOffset(int elemIndex)
+  {
+    // if beyond actual elements, return "virtual" startingOffset
+    if (((elemIndex * 3)) >= elemInfo.length) {
+      return ordinates.length + 1;
+    }
+    return elemInfo[elemIndex * 3];
+  }
+
+  /**
+   * Extracts the SDO_ELEM_INFO ETYPE value for a given triplet.
+   *
+   * @param elemIndex index of the triplet to read
+   * @return ETYPE for indicated triplet, or -1 if the triplet index is out of range
+   * 
+   * @see ETYPE
+   */
+  public int eType(int elemIndex)
+  {
+    if (((elemIndex * 3) + 1) >= elemInfo.length) {
+      return -1;
+    }
+    return elemInfo[(elemIndex * 3) + 1];
+  }
+
+  /**
+   * Extracts the SDO_ELEM_INFO interpretation value (SDO_INTERPRETATION) for a given triplet.
+   * <p>
+   * JTS valid interpretation values are: 1 for straight edges, 3 for rectangle
+   * Other interpretation value include: 2 for arcs, 4 for circles
+   *
+   * @param elemIndex index of the triplet to read
+   * @return interpretation value, or -1 if the triplet index is out of range
+   */
+  public int interpretation(int elemIndex)
+  {
+    if (((elemIndex * 3) + 2) >= elemInfo.length) {
+      return -1;
+    }
+    return elemInfo[(elemIndex * 3) + 2];
+  }
+
+  public int ordinateLen()
+  {
+    if (ordinates != null)
+      return ordinates.length;
+    return 0;
+  }
+
+  public int numElements()
+  {
+    if (elemInfo == null) return 0;
+    return elemInfo.length / 3;
+  }
+  /**
+   * Computes the SDO_GTYPE code for the given D, L, and TT components.
+   * 
+   * @param dim the coordinate dimension
+   * @param lrsDim the measure dimension
+   * @param geomType the geometry type code
+   * @return the SDO_GTYPE code
+   */
+  public static int gType(int dim, int lrsDim, int geomType)
+  {
+    return dim * 1000 + lrsDim * 100 + geomType;
+  }
+
+  /**
+   * Returns the GTYPE GEOM_TYPE code
+   * corresponding to the geometry type.
+   * 
+   * @see OraGeom.GEOM_TYPE
+   *
+   * @param geom the geometry to compute the GEOM_TYPE for
+   * @return geom type code, if known, or UNKNOWN
+   */
+  static int geomType(Geometry geom) {
+    if (geom == null) {
+        return OraGeom.GEOM_TYPE.UNKNOWN_GEOMETRY; 
+    } else if (geom instanceof Point) {
+        return OraGeom.GEOM_TYPE.POINT;
+    } else if (geom instanceof LineString) {
+        return OraGeom.GEOM_TYPE.LINE;
+    } else if (geom instanceof Polygon) {
+        return OraGeom.GEOM_TYPE.POLYGON;
+    } else if (geom instanceof MultiPoint) {
+        return OraGeom.GEOM_TYPE.MULTIPOINT;
+    } else if (geom instanceof MultiLineString) {
+        return OraGeom.GEOM_TYPE.MULTILINE;
+    } else if (geom instanceof MultiPolygon) {
+        return OraGeom.GEOM_TYPE.MULTIPOLYGON;
+    } else if (geom instanceof GeometryCollection) {
+        return OraGeom.GEOM_TYPE.COLLECTION;
+    }
+    return OraGeom.GEOM_TYPE.UNKNOWN_GEOMETRY; 
+  }
+
+  /**
+   * Extracts the coordinate dimension containing the Measure value from 
+   * an SDO_GTYPE code.
+   * For a measured geometry this is 0, 3 or 4.  0 indicates that the last dimension is the measure dimension
+   * For an non-measured geometry this is 0.
+   * 
+   * @param gType an SDO_GTYPE code
+   * @return the Measure dimension
+   */
+  static int gTypeMeasureDim(int gType) {
+  	return (gType % 1000) / 100;
+  }
+
+  /**
+   * Extracts the coordinate dimension from an SDO_GTYPE code.
+   * 
+   * @param gType an SDO_GTYPE code
+   * @return the coordinate dimension
+   */
+  static int gTypeDim(int gType) {
+  	return gType / 1000;
+  }
+
+  /**
+   * Extracts the GEOM_TYPE code from an SDO_GTYPE code.
+   * 
+   * @param gType an SDO_GTYPE code
+   * @return the GEOM_TYPE code
+   */
+  static int gTypeGeomType(int gType) {
+  	return gType % 100;
+  }
+
+  /**
+   * Extracts the SDO_ELEM_INFO start index (SDO_STARTING_OFFSET) in the ordinate array for a given triplet.
+   * Starting offsets are 1-based indexes.
+   *
+   * @param elemInfo the SDO_ELEM_INFO array
+   * @param tripletIndex index of the triplet to read
+   * @return Starting Offset, or -1 if the triplet index is too large
+   */
+  static int startingOffset(int[] elemInfo, int tripletIndex) {
+      if (((tripletIndex * 3) + 0) >= elemInfo.length) {
+          return -1;
+      }
+      return elemInfo[(tripletIndex * 3) + 0];
+  }
+
+  /**
+   * Extracts the SDO_ELEM_INFO interpretation value (SDO_INTERPRETATION) for a given triplet.
+   * <p>
+   * JTS valid interpretation values are: 1 for straight edges, 3 for rectangle
+   * Other interpretation value include: 2 for arcs, 4 for circles
+   *
+   * @param elemInfo the SDO_ELEM_INFO array
+   * @param tripletIndex index of the triplet to read
+   * @return interpretation value, or -1 if the triplet index is too large
+   */
+  static int interpretation(int[] elemInfo, int tripletIndex) {
+      if (((tripletIndex * 3) + 2) >= elemInfo.length) {
+          return -1;
+      }
+      return elemInfo[(tripletIndex * 3) + 2];
+  }
+
+  /**
+   * Extracts the SDO_ELEM_INFO ETYPE value for a given triplet.
+   * <p>
+   * @see OraGeom.ETYPE for an indication of possible values
+   *
+   * @param elemInfo the SDO_ELEM_INFO array
+   * @param tripletIndex index of the triplet to read
+   * @return ETYPE for indicated triplet, or -1 if the triplet index is too large
+   */
+  static int eType(int[] elemInfo, int tripletIndex) {
+      if (((tripletIndex * 3) + 1) >= elemInfo.length) {
+          return -1;
+      }
+      return elemInfo[(tripletIndex * 3) + 1];
+  }
+
+  /**
+   * Codes used in SDO_INTERPRETATION attribute.
+   * 
+   * @author Martin Davis
+   *
+   */
+  static final class INTERP {
+    
+    public static final int POINT         = 1;
+    
+    public static final int LINESTRING    = 1;  
+    
+    public static final int POLYGON       = 1;  
+    
+    public static final int RECTANGLE     = 3;  
+        
+  }
+
+  /**
+   * Codes used to specify geometry type
+   * These are used in the last two digits in a GTYPE value.
+   */
+  static final class GEOM_TYPE {
+  
+    /** <code>TT</code> code representing Unknown type */
+    public static final int UNKNOWN_GEOMETRY       = 00;
+  
+    /** <code>TT</code> code representing Point */
+    public static final int POINT         = 01;
+  
+    /** <code>TT</code> code representing Line (or Curve) */
+    public static final int LINE          = 02;  
+      
+    /** <code>TT</code> code representing Polygon */
+    public static final int POLYGON       = 03;
+  
+    /** <code>TT</code> code representing Collection */
+    public static final int COLLECTION    = 04;   
+  
+    /** <code>TT</code> code representing MultiPoint */
+    public static final int MULTIPOINT    = 05;       
+  
+    /** <code>TT</code> code representing MultiLine (or MultiCurve) */
+    public static final int MULTILINE     = 06;
+  
+    /** <code>TT</code> code representing MULTIPOLYGON */
+    public static final int MULTIPOLYGON  = 07;
+  }
+
+  /**
+   * Codes used in the SDO_ETYPE attribute.
+   * The code indicates the type of element denoted by an SDO_ELEM_INFO triplet.
+   */
+  static final class ETYPE
+  {
+    /** <code>ETYPE</code> code representing Point */
+    public static final int POINT = 1;
+  
+    /** <code>ETYPE</code> code representing Line */
+    public static final int LINE = 2;
+  
+    /** <code>ETYPE</code> code representing Polygon ring 
+     *  Shell or hole is determined by orientation (CCW or CW).
+     *  Now deprecated. 
+     */
+    public static final int POLYGON = 3;
+  
+    /**
+     * <code>ETYPE</code> code representing exterior counterclockwise polygon ring
+     */
+    public static final int POLYGON_EXTERIOR = 1003;
+  
+    /** <code>ETYPE</code> code representing interior clockwise polygon ring */
+    public static final int POLYGON_INTERIOR = 2003;
+  }
+  
+  /**
+   * Oracle types used by SDO_GEOMETRY
+   */
+  public static final String TYPE_GEOMETRY = "MDSYS.SDO_GEOMETRY";
+  public static final String TYPE_ELEM_INFO_ARRAY = "MDSYS.SDO_ELEM_INFO_ARRAY";
+  public static final String TYPE_ORDINATE_ARRAY = "MDSYS.SDO_ORDINATE_ARRAY";
+  public static final String TYPE_POINT_TYPE = "MDSYS.SDO_POINT_TYPE";
+  
+  /**
+   * Value indicating a Null SRID.
+   */
+  public static final int SRID_NULL = -1;
+
+
+}
diff --git a/jtsio/src/com/vividsolutions/jts/io/oracle/OraReader.java b/jtsio/src/com/vividsolutions/jts/io/oracle/OraReader.java
index ee7470b..70bc1c3 100644
--- a/jtsio/src/com/vividsolutions/jts/io/oracle/OraReader.java
+++ b/jtsio/src/com/vividsolutions/jts/io/oracle/OraReader.java
@@ -49,40 +49,87 @@
 package com.vividsolutions.jts.io.oracle;
 
 import java.sql.SQLException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
 
-import oracle.sql.*;
+import oracle.sql.ARRAY;
+import oracle.sql.Datum;
+import oracle.sql.STRUCT;
 
 import com.vividsolutions.jts.algorithm.CGAlgorithms;
-import com.vividsolutions.jts.geom.*;
+import com.vividsolutions.jts.geom.Coordinate;
+import com.vividsolutions.jts.geom.CoordinateSequence;
+import com.vividsolutions.jts.geom.CoordinateSequenceFactory;
+import com.vividsolutions.jts.geom.Geometry;
+import com.vividsolutions.jts.geom.GeometryCollection;
+import com.vividsolutions.jts.geom.GeometryFactory;
+import com.vividsolutions.jts.geom.LineString;
+import com.vividsolutions.jts.geom.LinearRing;
+import com.vividsolutions.jts.geom.MultiLineString;
+import com.vividsolutions.jts.geom.MultiPoint;
+import com.vividsolutions.jts.geom.MultiPolygon;
+import com.vividsolutions.jts.geom.Point;
+import com.vividsolutions.jts.geom.Polygon;
+import com.vividsolutions.jts.geom.PrecisionModel;
 
 /**
- * Reads a {@link Geometry} from an Oracle <tt>MDSYS.GEOMETRY</tt> object.
- *
- * A {@link GeometryFactory} may be provided, otherwise
- * a default one will be used.
- * The provided GeometryFactory will be used, with the exception of the SRID field.
- * This will be extracted from the Geometry.
+ * Reads a {@link Geometry} from an Oracle <code>MDSYS.GEOMETRY</code> <code>STRUCT</code> object.
+ * <p>
+ * The following Oracle geometry types are supported:
+ * <ul>
+ * <li>POINT, MULTIPOINT
+ * <li>LINE, MULTILINE
+ * <li>POLYGON, MULTIPOLYGON
+ * </ul>
+ * The optimized representations of <code>SDO_POINT</code> 
+ * and <code>RECTANGLE</code> are supported in the following way:
+ * <ul>
+ * <li>If the <code>SDO_POINT</code> attribute is present 
+ * and <code>SDO_ELEM_INFO</code> and <code>SDO_ORDINATES</code> are not,
+ * a {@link Point} geometry is read.
+ * Otherwise, the geometry specified by the latter two attributes is read.
+ * <li><code>RECTANGLE</code>s are converted to equivalent {@link Polygon}s
+ * </ul> 
  * <p>
- * If a {@link PrecisionModel} is supplied it is the callers's responsibility
+ * A {@link GeometryFactory} may be provided, otherwise a default one will be used.
+ * If a {@link PrecisionModel} other than {@link PrecisionModel#FLOATING} 
+ * is supplied it is the client's responsibility
  * to ensure that it matches the precision of the incoming data.
  * If a lower precision for the data is required, a subsequent
  * process must be run on the data to reduce its precision.
  * <p>
- * To use this class a suitable Oracle JDBC driver JAR must be present.
+ * The coordinate dimension of the output is determined as follows:
+ * <ul>
+ * <li>by default, the coordinate dimension matches that of the input
+ * <li>the coordinate dimension can be set explicitly by the {@link #setDimension(int)} method
+ * <li>finally, the coordinate dimension is limited by the maximum dimension supported
+ * by the provided {@link CoordinateSequenceFactory}.
+ * </ul>
+ * The Geometry SRID field is populated from the input Geometry.
+ * <p>
+ * To use this class a suitable Oracle JDBC JAR must be present in the classpath.
+ * 
+ * <h3>LIMITATIONS</h3>
+ * <ul>
+ * <li>Geometries with Measures (XYM or XYZM) can be read, but the Measure values are not preserved
+ * <li>Oracle geometries with a GTYPE of <code>43xx</code> (XYMZ) are not supported.
+ * <li>Geometries containing arcs are not supported
+ * <li>Surface and solid geometries are not supported
+ * <li>There is currently no way to read ancillary SDO_POINT information
+ * </ul>
  *
- * @version 9i
- * @author David Zwiers, Vivid Solutions.
  * @author Martin Davis
  */
-public class OraReader {
+public class OraReader 
+{
+	//TODO: add a strict mode, that checks for ordinate length & other errors?
+	
 	private GeometryFactory geometryFactory;
 
-	public static final int NULL_DIMENSION = -1;
-	private int dimension = -1;
+	private int outputDimension = OraGeom.NULL_DIMENSION;
 
 	/**
-	 * Creates a new reader, with a default GeometryFactory.
+	 * Creates a new reader, with a default {@link GeometryFactory}.
 	 *
 	 * @see #OraReader(GeometryFactory)
 	 */
@@ -94,7 +141,7 @@ public class OraReader {
 	 * Creates a new reader, with the supplied {@link GeometryFactory}.
 	 * It is assumed that the supplied {@link PrecisionModel}
 	 * matches the precision of the incoming data -
-	 * coordinates are <b>not</b> made precise.
+	 * coordinates are <b>not</b> made precise when read.
 	 *
 	 * @param gf A non-null geometry factory for later use.
 	 *
@@ -105,753 +152,499 @@ public class OraReader {
 			throw new NullPointerException("Geometry Factory may not be Null");
 		this.geometryFactory = gf;
 	}
+	
 	/**
-	 * Gets the number of coordinate dimensions which will be read.
+	 * Gets the coordinate dimension which will be created.
 	 *
-	 * @return the dimension which will be read
+	 * @return the coordinate dimension which will be created
 	 */
 	public int getDimension() {
-		return dimension;
+		return outputDimension;
 	}
 
-	/**
-	 * Sets the number of coordinate dimensions to read.
-	 *
-	 * @param dimension the dimension to read
-	 */
-	public void setDimension(int dimension) {
-		this.dimension = dimension;
-	}
+    /**
+     * Sets the coordinate dimension to use for created geometries.
+     * 
+     * @param outputDimension
+     *            the coordinate dimension to create
+     */
+    public void setDimension(int outputDimension) {
+        if (outputDimension < 2)
+            throw new IllegalArgumentException("Output dimension must be >= 2");
+        this.outputDimension = outputDimension;
+    }
 
 	/**
-	 * This method will attempt to create a JTS Geometry for the MDSYS.GEOMETRY
-	 * provided. The Type of gemetry returned will depend on the input datum,
-	 * where the Geometry type is specified within the STRUCT.
+	 * Reads a {@link Geometry} representing the MDSYS.GEOMETRY
+	 * provided in the STRUCT. The type of geometry created 
+	 * depends on the Geometry type specified within the STRUCT.
+	 * The SRID of the created geometry is set to be the same as the input SRID.
 	 *
 	 * @param struct The MDSYS.GEOMETRY Object to decode
-	 * @return A JTS Geometry if one could be created, null otherwise
-	 * @throws SQLException When a read error occured within the struct
+	 * @return the Geometry if one could be created, null otherwise
+	 * 
+	 * @throws SQLException if a read error occurs while accessing the struct
+   * @throws IllegalArgumentException if an unsupported geometry type or encoding error is found
 	 */
-	public Geometry read(STRUCT struct) throws SQLException {
-
-		// Note Returning null for null Datum
+	public Geometry read(STRUCT struct) throws SQLException 
+	{
+		// Return null for null input
 		if (struct == null)
 			return null;
 
 		Datum data[] = struct.getOracleAttributes();
-		int gType = asInteger(data[0], 0);
-		int SRID = asInteger(data[1], Constants.SRID_NULL);
-		double point[] = asDoubleArray((STRUCT) data[2], Double.NaN);
-		int elemInfo[] = asIntArray((ARRAY) data[3], 0);
-		double ordinates[] = asDoubleArray((ARRAY) data[4], Double.NaN);
-		GeometryFactory gf = geometryFactory;
-		if(geometryFactory.getSRID() != SRID){
-			// clone it and use the geom's srid
-			gf = new GeometryFactory(geometryFactory.getPrecisionModel(),SRID,geometryFactory.getCoordinateSequenceFactory());
-		}
-
-		return create(gf, gType, point, elemInfo, ordinates);
+		
+		int gType = OraUtil.toInteger(data[0], 0);
+		int SRID = OraUtil.toInteger(data[1], OraGeom.SRID_NULL);
+		double point[] = OraUtil.toDoubleArray((STRUCT) data[2], Double.NaN);
+		int elemInfo[] = OraUtil.toIntArray((ARRAY) data[3], 0);
+		double ordinates[] = OraUtil.toDoubleArray((ARRAY) data[4], Double.NaN);
+		OraGeom oraGeom = new OraGeom(gType, SRID, point, elemInfo, ordinates);
+		Geometry geom = read(oraGeom);
+		
+		// Set SRID of created Geometry to be the same as input (regardless of geomFactory SRID)
+		if (geom != null)
+			geom.setSRID(SRID);
+		return geom;
 	}
 
 	/**
-     * Decode geometry from provided SDO encoded information.
-     *
-     * <p></p>
-     *
-     * @param gf Used to construct returned Geometry
-     * @param gType SDO_GTEMPLATE represents dimension, LRS, and geometry type
-     * @param point
-     * @param elemInfo
-     * @param ordinates
-     *
-     * @return Geometry as encoded
-     */
-    private Geometry create(GeometryFactory gf, int gType,
-        double[] point, int[] elemInfo, double[] ordinates) {
-
-        int lrs = (gType%1000)/100;
-
-        // find the dimension: represented by the smaller of the two dimensions
-        int dim = 0;
-        if(dimension != NULL_DIMENSION){
-        	dim = dimension;
-        }else{
-        	dim = Math.min(gType/1000,gf.getCoordinateSequenceFactory().create(0,0).getDimension()) ;
-        }
-
-        if(dim<2){
-        	throw new IllegalArgumentException("Dimension D:" + dim + " is not valid for JTS. " +
-        			"Either specify a dimension or use Oracle Locator Version 9i or later");
-        }
-
-        // extract the geometry template type
-        // this is represented as the rightmost two digits
-        int geomTemplate = gType - (dim * 1000) - (lrs * 100);
-
-        CoordinateSequence coords = null;
-
-        if (lrs == 0 && geomTemplate == 1 && point != null && elemInfo == null) {
-            // Single Point Type Optimization
-            coords = coordinates(gf.getCoordinateSequenceFactory(), dim, lrs, geomTemplate, point);
-            elemInfo = new int[] { 1, Constants.SDO_ETYPE.POINT, 1 };
-        } else {
-            coords = coordinates(gf.getCoordinateSequenceFactory(), dim, lrs, geomTemplate, ordinates);
-        }
-
-        switch (geomTemplate) {
-        case Constants.SDO_GTEMPLATE.POINT:
-            return createPoint(gf, dim, lrs, elemInfo, 0, coords);
-
-        case Constants.SDO_GTEMPLATE.LINE:
-            return createLine(gf, dim, lrs, elemInfo, 0, coords);
-
-        case Constants.SDO_GTEMPLATE.POLYGON:
-            return createPolygon(gf, dim, lrs, elemInfo, 0, coords);
-
-        case Constants.SDO_GTEMPLATE.MULTIPOINT:
-            return createMultiPoint(gf, dim, lrs, elemInfo, 0, coords);
-
-        case Constants.SDO_GTEMPLATE.MULTILINE:
-            return createMultiLine(gf, dim, lrs, elemInfo, 0, coords, -1);
-
-        case Constants.SDO_GTEMPLATE.MULTIPOLYGON:
-            return createMultiPolygon(gf, dim, lrs, elemInfo, 0, coords, -1);
-
-        case Constants.SDO_GTEMPLATE.COLLECTION:
-            return createCollection(gf, dim, lrs, elemInfo, 0, coords,-1);
-
-        default:
-            return null;
-        }
+   * Reads a {@link Geometry} from SDO_GEOMETRY attributes.
+   *
+   * @param oraGeom the Oracle geometry to read
+   * @return the Geometry read
+   * @throws IllegalArgumentException when an encoding error or unsupported geometry type is found
+   */
+  Geometry read(OraGeom oraGeom) {
+    int ordDim = oraGeom.ordDim();
+    if (ordDim < 2) {
+    	throw new IllegalArgumentException("Dimension D = " + ordDim + " is not supported by JTS. " +
+    			"Either specify a valid dimension or use Oracle Locator Version 9i or later");
     }
-
-    /**
-     * Construct CoordinateList as described by GTYPE.
-     *
-     * The number of ordinates per coordinate are taken to be lrs+dim, and the
-     * number of ordinates should be a multiple of this value.
-
-     * In the Special case of GTYPE 2001 and a three ordinates are interpreted
-     * as a single Coordinate rather than an error.
-     *
-     * @param f CoordinateSequenceFactory used to encode ordiantes for JTS
-     * @param ordinates
-     *
-     * @return protected
-     *
-     * @throws IllegalArgumentException
-     */
-    private CoordinateSequence coordinates(CoordinateSequenceFactory f,
-        int dim, int lrs, int gtemplate, double[] ordinates) {
-        if ((ordinates == null) || (ordinates.length == 0)) {
-            return f.create(new Coordinate[0]);
-        }
-
-        //      POINT_TYPE Special Case
-        //
-        if ((dim == 2) && (lrs == 0) && (gtemplate == 01) && (ordinates.length == 3)) {
-            return f.create(new Coordinate[] {
-                    new Coordinate(ordinates[0], ordinates[1], ordinates[2]),
-                });
-        }
-
-        int len = dim + lrs;
-
-        if ((len == 0 && ordinates.length!=0 ) || (len != 0 && ((ordinates.length % len) != 0))){
-            throw new IllegalArgumentException("Dimension D:" + dim + " and L:"
-                + lrs + " denote Coordinates " + "of " + len
-                + " ordinates. This cannot be resolved with"
-                + "an ordinate array of length " + ordinates.length);
-        }
-
-        int length = (len == 0?0:ordinates.length / len);
-
-        // we would have to ask for a dimension which represents all the requested
-        // dimension and measures from a mask array in the future
-        CoordinateSequence cs = f.create(length,dim);
-
-        int actualDim = cs.getDimension();
-        for(int i=0;i<length;i++){
-        	int j=0;
-        	// in the future change this condition to include ignored dimensions from mask array
-        	for(;j<actualDim && j<dim;j++){
-        		cs.setOrdinate(i,j,ordinates[i*len+j]);
-        		// may not always want to inc. j when we have a mask array
-        	}
-        	// in the future change this condition to include ignored dimensions from mask array
-        	for(int d = j;j<actualDim && (j-d)<lrs;j++){
-        		cs.setOrdinate(i,j,ordinates[i*len+j]);
-        		// may not always want to inc. j when we have a mask array
-        	}
-        }
-        return cs;
+    // read from SDO_POINT_TYPE, if that carries the primary geometry data
+    if (oraGeom.isCompactPoint()) {
+      CoordinateSequence ptCoord = extractCoords(oraGeom, oraGeom.point);
+      return createPoint(ptCoord);
+    } 
+    
+    CoordinateSequence coords = null;
+
+    switch (oraGeom.geomType()) {
+    case OraGeom.GEOM_TYPE.POINT:
+        return readPoint(oraGeom, 0);
+    case OraGeom.GEOM_TYPE.LINE:
+        return readLine(oraGeom, 0);
+    case OraGeom.GEOM_TYPE.POLYGON:
+        return readPolygon(oraGeom, 0);
+    case OraGeom.GEOM_TYPE.MULTIPOINT:
+        return readMultiPoint(oraGeom, 0);
+    case OraGeom.GEOM_TYPE.MULTILINE:
+        return readMultiLine(oraGeom);
+    case OraGeom.GEOM_TYPE.MULTIPOLYGON:
+        return readMultiPolygon(oraGeom);
+    case OraGeom.GEOM_TYPE.COLLECTION:
+        return readCollection(oraGeom);
+    default:
+    	throw new IllegalArgumentException("GTYPE " + oraGeom.gType + " is not supported");
     }
-
-    /**
-     * Create MultiGeometry as encoded by elemInfo.
-     *
-     * @param gf Used to construct MultiLineString
-     * @param elemInfo Interpretation of coords
-     * @param elemIndex Triplet in elemInfo to process as a Polygon
-     * @param coords Coordinates to interpret using elemInfo
-     * @param numGeom Number of triplets (or -1 for rest)
-     *
-     * @return GeometryCollection
-     *
-     * @throws IllegalArgumentException DWhen faced with an encoding error
-     */
-    private GeometryCollection createCollection(GeometryFactory gf, int dim, int lrs, int[] elemInfo, int elemIndex, CoordinateSequence coords, int numGeom) {
-
-    	int sOffset = StartingOffset(elemInfo, elemIndex);
-
-        int length = coords.size()*dim;
-
-		if (!(sOffset <= length))
-		    throw new IllegalArgumentException("ELEM_INFO STARTING_OFFSET "+sOffset+" inconsistent with ORDINATES length "+coords.size());
-
-        int endTriplet = (numGeom != -1) ? elemIndex + numGeom : elemInfo.length / 3 + 1;
-
-        List list = new LinkedList();
-        int etype;
-        int interpretation;
+  }
+
+  /**
+   * Create a {@link GeometryCollection} as specified by elemInfo. Note that in
+   * Oracle, unlike the SFS and JTS, collections contain only atomic types or
+   * (possibly) MultiPoints. This makes them simpler to parse.
+   * 
+   * @param oraGeom
+   *          SDO_GEOMETRY attributes being read
+   * @param coords
+   *          the coordinates of the entire geometry
+   * @return GeometryCollection
+   * 
+   * @throws IllegalArgumentException
+   *           when an encoding error or unsupported geometry type is found
+   */
+    private GeometryCollection readCollection(OraGeom oraGeom) 
+    {
+      checkOrdinates(oraGeom, 0, "GeometryCollection");
+      
+      int nElem = oraGeom.numElements();
+      List geomList = new ArrayList();
+      boolean cont = true;
+      for (int i = 0; cont && i < nElem; i++) {
+        int etype = oraGeom.eType(i);
+        int interpretation = oraGeom.interpretation(i);
         Geometry geom;
 
-        boolean cont = true;
-        for (int i = elemIndex; cont && i < endTriplet; i++) {
-            etype = eType(elemInfo, i);
-            interpretation = interpretation(elemInfo, i);
-
-            switch (etype) {
-            case -1:
-                cont = false; // We are the of the list - get out of here
-
-            case Constants.SDO_ETYPE.POINT:
-
-                if (interpretation == 1) {
-                    geom = createPoint(gf, dim, lrs, elemInfo, i, coords);
-                } else if (interpretation > 1) {
-                    geom = createMultiPoint(gf, dim, lrs, elemInfo, i, coords);
-                } else {
-                    throw new IllegalArgumentException(
-                        "ETYPE.POINT requires INTERPRETATION >= 1");
-                }
-
-                break;
-
-            case Constants.SDO_ETYPE.LINE:
-                geom = createLine(gf, dim, lrs, elemInfo, i, coords);
-
-                break;
-
-            case Constants.SDO_ETYPE.POLYGON:
-            case Constants.SDO_ETYPE.POLYGON_EXTERIOR:
-                geom = createPolygon(gf, dim, lrs, elemInfo, i, coords);
-                i += ((Polygon) geom).getNumInteriorRing();
+        switch (etype) {
+        case -1:
+          cont = false; // We are at the end of the list - get out of here
+          continue;
+            
+        case OraGeom.ETYPE.POINT:
+            if (interpretation == OraGeom.INTERP.POINT) {
+                geom = readPoint(oraGeom, i);
+            } else if (interpretation > 1) {
+                geom = readMultiPoint(oraGeom, i);
+            } else {
+                throw new IllegalArgumentException("ETYPE.POINT requires INTERPRETATION >= 1");
+            }
+            break;
 
-                break;
+        case OraGeom.ETYPE.LINE:
+            geom = readLine(oraGeom, i);
+            break;
 
-            case Constants.SDO_ETYPE.POLYGON_INTERIOR:
-                throw new IllegalArgumentException(
-                    "ETYPE 2003 (Polygon Interior) no expected in a GeometryCollection"
-                    + "(2003 is used to represent polygon holes, in a 1003 polygon exterior)");
+        case OraGeom.ETYPE.POLYGON:
+        case OraGeom.ETYPE.POLYGON_EXTERIOR:
+            geom = readPolygon(oraGeom, i);
+            i += ((Polygon) geom).getNumInteriorRing();
+            break;
 
-            default:
-                throw new IllegalArgumentException("ETYPE " + etype
-                    + " not representable as a JTS Geometry."
-                    + "(Custom and Compound Straight and Curved Geometries not supported)");
-            }
+        case OraGeom.ETYPE.POLYGON_INTERIOR:
+            throw new IllegalArgumentException(
+                "ETYPE 2003 (Polygon Interior) not expected in a Collection");
 
-            list.add(geom);
+        default:
+            throw new IllegalArgumentException("ETYPE " + etype
+                + " not representable as a JTS Geometry."
+                + "(Custom and Compound Straight and Curved Geometries not supported)");
         }
-
-        GeometryCollection geoms = gf.createGeometryCollection((Geometry[]) list.toArray(new Geometry[list.size()]));
-
-        return geoms;
+        geomList.add(geom);
+      }
+      GeometryCollection geoms = geometryFactory.createGeometryCollection(GeometryFactory.toGeometryArray(geomList));
+      return geoms;
     }
 
     /**
      * Create MultiPolygon as encoded by elemInfo.
      *
-     *
-     * @param gf Used to construct MultiLineString
-     * @param elemInfo Interpretation of coords
-     * @param elemIndex Triplet in elemInfo to process as a Polygon
-     * @param coords Coordinates to interpret using elemInfo
-     * @param numGeom Number of triplets (or -1 for rest)
-     *
+     * @param oraGeom SDO_GEOMETRY attributes being read
+     * @param coords the coordinates of the entire geometry
      * @return MultiPolygon
      */
-    private MultiPolygon createMultiPolygon(GeometryFactory gf, int dim, int lrs, int[] elemInfo, int elemIndex, CoordinateSequence coords, int numGeom){
-
-    	int sOffset = StartingOffset(elemInfo, elemIndex);
-        int etype = eType(elemInfo, elemIndex);
-        int interpretation = interpretation(elemInfo, elemIndex);
-
-        int length = coords.size()*dim;
-
-		if (!(sOffset >= 1) || !(sOffset <= length))
-		    throw new IllegalArgumentException("ELEM_INFO STARTING_OFFSET "+sOffset+" inconsistent with ORDINATES length "+coords.size());
-		if(!(etype == Constants.SDO_ETYPE.POLYGON) && !(etype == Constants.SDO_ETYPE.POLYGON_EXTERIOR))
-		    throw new IllegalArgumentException("ETYPE "+etype+" inconsistent with expected POLYGON or POLYGON_EXTERIOR");
-		if (interpretation != 1 && interpretation != 3){
-			return null;
-		}
-
-        int endTriplet = (numGeom != -1) ? elemIndex + numGeom : (elemInfo.length / 3) + 1;
-
-        List list = new LinkedList();
-        boolean cont = true;
-
-        for (int i = elemIndex; cont && i < endTriplet && (etype = eType(elemInfo, i)) != -1; i++) {
-            if ((etype == Constants.SDO_ETYPE.POLYGON) || (etype == Constants.SDO_ETYPE.POLYGON_EXTERIOR)) {
-                Polygon poly = createPolygon(gf, dim, lrs, elemInfo, i, coords);
-                i += poly.getNumInteriorRing(); // skip interior rings
-                list.add(poly);
-            } else { // not a Polygon - get out here
-            	cont = false;
-            }
+    private MultiPolygon readMultiPolygon(OraGeom oraGeom)
+    {
+      int nElem = oraGeom.numElements();
+      List geoms = new ArrayList();
+      for (int i = 0; i < nElem; i++) {
+        int etype = oraGeom.eType(i);
+        if ((etype == OraGeom.ETYPE.POLYGON) || (etype == OraGeom.ETYPE.POLYGON_EXTERIOR)) {
+          Polygon poly = readPolygon(oraGeom, i);
+          i += poly.getNumInteriorRing(); // skip interior rings
+          geoms.add(poly);
+        } 
+        else { // not a Polygon - stop reading
+        	break;
         }
-
-        MultiPolygon polys = gf.createMultiPolygon((Polygon[]) list.toArray(new Polygon[list.size()]));
-
-        return polys;
+      }
+      MultiPolygon polys = geometryFactory.createMultiPolygon(GeometryFactory.toPolygonArray(geoms));
+      return polys;
     }
 
     /**
      * Create MultiLineString as encoded by elemInfo.
      *
-     *
-     * @param gf Used to construct MultiLineString
-     * @param elemInfo Interpretation of coords
-     * @param elemIndex Triplet in elemInfo to process as a Polygon
-     * @param coords Coordinates to interpret using elemInfo
-     * @param numGeom Number of triplets (or -1 for rest)
-     *
+     * @param oraGeom SDO_GEOMETRY attributes being read
+     * @param coords the coordinates of the entire geometry
      * @return MultiLineString
      */
-    private MultiLineString createMultiLine(GeometryFactory gf, int dim, int lrs, int[] elemInfo, int elemIndex, CoordinateSequence coords, int numGeom) {
-
-    	int sOffset = StartingOffset(elemInfo, elemIndex);
-        int etype = eType(elemInfo, elemIndex);
-        int interpretation = interpretation(elemInfo, elemIndex);
-
-        int length = coords.size()*dim;
-
-		if (!(sOffset >= 1) || !(sOffset <= length))
-		    throw new IllegalArgumentException("ELEM_INFO STARTING_OFFSET "+sOffset+" inconsistent with ORDINATES length "+coords.size());
-		if(!(etype == Constants.SDO_ETYPE.LINE))
-		    throw new IllegalArgumentException("ETYPE "+etype+" inconsistent with expected LINE");
-		if (!(interpretation == 1)){
-            // we cannot represent INTERPRETATION > 1
-			return null;
-		}
-
-        int endTriplet = (numGeom != -1) ? (elemIndex + numGeom) : (elemInfo.length / 3);
-
-        List list = new LinkedList();
-
-        boolean cont = true;
-        for (int i = elemIndex; cont && i < endTriplet && (etype = eType(elemInfo, i)) != -1 ;i++) {
-            if (etype == Constants.SDO_ETYPE.LINE) {
-                list.add(createLine(gf, dim, lrs, elemInfo, i, coords));
-            } else { // not a LineString - get out of here
-                cont = false;
-            }
-        }
-
-        MultiLineString lines = gf.createMultiLineString((LineString[]) list.toArray(new LineString[list.size()]));
-
-        return lines;
+    private MultiLineString readMultiLine(OraGeom oraGeom) 
+    {
+      int nElem = oraGeom.numElements();
+      List geoms = new ArrayList();
+      for (int i = 0; i < nElem; i++) {
+        int etype = oraGeom.eType(i);
+        // stop reading if not a line
+        if (etype != OraGeom.ETYPE.LINE)
+          break;
+        geoms.add(readLine(oraGeom, i));
+      }
+      MultiLineString lines = geometryFactory.createMultiLineString(GeometryFactory.toLineStringArray(geoms));
+      return lines;
     }
 
     /**
      * Create MultiPoint as encoded by elemInfo.
      *
-     *
-     * @param gf Used to construct polygon
-     * @param elemInfo Interpretation of coords
-     * @param elemIndex Triplet in elemInfo to process as a Polygon
-     * @param coords Coordinates to interpret using elemInfo
-     *
+     * @param oraGeom SDO_GEOMETRY attributes being read
+     * @param elemIndex the element being read
+     * @param coords the coordinates of the entire geometry
      * @return MultiPoint
      */
-    private MultiPoint createMultiPoint(GeometryFactory gf, int dim, int lrs, int[] elemInfo, int elemIndex, CoordinateSequence coords) {
-
-    	int sOffset = StartingOffset(elemInfo, elemIndex);
-        int etype = eType(elemInfo, elemIndex);
-        int interpretation = interpretation(elemInfo, elemIndex);
-
-		if (!(sOffset >= 1) || !(sOffset <= coords.size()))
-		    throw new IllegalArgumentException("ELEM_INFO STARTING_OFFSET "+sOffset+" inconsistent with ORDINATES length "+coords.size());
-		if(!(etype == Constants.SDO_ETYPE.POINT))
-		    throw new IllegalArgumentException("ETYPE "+etype+" inconsistent with expected POINT");
-		if (!(interpretation > 1)){
-			return null;
-		}
-
-        int len = dim + lrs;
-
-        int start = (sOffset - 1) / len;
-        int end = start + interpretation;
-
-        MultiPoint points = gf.createMultiPoint(subList(gf.getCoordinateSequenceFactory(), coords, start, end));
-
-        return points;
+    private MultiPoint readMultiPoint(OraGeom oraGeom, int elemIndex) 
+    {
+      CoordinateSequence seq;
+      /**
+       * Special handling when GTYPE is MULTIPOINT.
+       * In this case all ordinates are read as a single MultiPoint, regardless of elemInfo contents.
+       * This is because MultiPoints can be encoded as either a single MULTI elemInfo,
+       * or as multiple POINT elemInfos
+       */
+      if (oraGeom.geomType() == OraGeom.GEOM_TYPE.MULTIPOINT) {
+        seq = extractCoords(oraGeom, oraGeom.ordinates);
+      }
+      else {
+        int etype = oraGeom.eType(elemIndex);
+        int interpretation = oraGeom.interpretation(elemIndex);
+  
+        checkOrdinates(oraGeom, elemIndex, "MultiPoint");
+        checkETYPE(etype, OraGeom.ETYPE.POINT, "MultiPoint");
+        // MultiPoints have a unique interpretation code
+        if (! (interpretation >= 1)){
+          errorInterpretation(interpretation, "MultiPoint");
+        }
+        seq = extractCoords(oraGeom, elemIndex);
+      }
+      MultiPoint points = geometryFactory.createMultiPoint(seq);
+      return points;
     }
-
+    
     /**
-     * Create Polygon as encoded.
-     *
-     * @see #interpretation(int[], int)
-     *
-     * @param gf Used to construct polygon
-     * @param elemInfo Interpretation of coords
-     * @param elemIndex Triplet in elemInfo to process as a Polygon
-     * @param coords Coordinates to interpret using elemInfo
+     * Read {@link Polygon) from encoded geometry.
      *
+     * @param oraGeom SDO_GEOMETRY attributes being read
+     * @param elemIndex the element being read
+     * @param coords the coordinates of the entire geometry
      * @return Polygon as encoded by elemInfo, or null when faced with and
      *         encoding that can not be captured by JTS
      * @throws IllegalArgumentException When faced with an invalid SDO encoding
      */
-    private Polygon createPolygon(GeometryFactory gf, int dim, int lrs, int[] elemInfo, int elemIndex, CoordinateSequence coords) {
-
-    	int sOffset = StartingOffset(elemInfo, elemIndex);
-        int etype = eType(elemInfo, elemIndex);
-        int interpretation = interpretation(elemInfo, elemIndex);
-
-        if( !(1 <= sOffset && sOffset <= (coords.size() * dim))){
-            throw new IllegalArgumentException(
-                    "ELEM_INFO STARTING_OFFSET "+sOffset+
-                    "inconsistent with COORDINATES length "+(coords.size() * dim) );
-        }
-
-		if(!(etype == Constants.SDO_ETYPE.POLYGON) && !(etype == Constants.SDO_ETYPE.POLYGON_EXTERIOR)){
-			throw new IllegalArgumentException("ETYPE "+etype+" inconsistent with expected POLYGON or POLYGON_EXTERIOR");
-		}
-		if (!(interpretation == 1) && !(interpretation == 3)){
-			return null;
-		}
-
-        LinearRing exteriorRing = createLinearRing(gf, dim, lrs, elemInfo, elemIndex, coords);
-
-        List rings = new LinkedList();
-
-        boolean cont = true;
-        for (int i = elemIndex + 1; cont && (etype = eType(elemInfo, i)) != -1; i++) {
-            if (etype == Constants.SDO_ETYPE.POLYGON_INTERIOR) {
-                rings.add(createLinearRing(gf, dim, lrs, elemInfo, i, coords));
-            } else if (etype == Constants.SDO_ETYPE.POLYGON) { // need to test Clockwiseness of Ring to see if it is
-                                                 // interior or not - (use POLYGON_INTERIOR to avoid pain)
-
-                LinearRing ring = createLinearRing(gf, dim, lrs, elemInfo, i, coords);
-
-                if (CGAlgorithms.isCCW(ring.getCoordinates())) { // it is an Interior Hole
-                    rings.add(ring);
-                } else { // it is the next Polygon! - get out of here
-                    cont = false;
-                }
-            } else { // not a LinearRing - get out of here
-                cont = false;
-            }
+    private Polygon readPolygon(OraGeom oraGeom, int elemIndex) 
+    {
+      int etype = oraGeom.eType(elemIndex);
+      int interpretation = oraGeom.interpretation(elemIndex);
+
+    	checkOrdinates(oraGeom, elemIndex, "Polygon");
+    	checkETYPE(etype,OraGeom.ETYPE.POLYGON, OraGeom.ETYPE.POLYGON_EXTERIOR, "Polygon");
+    	checkInterpretation(interpretation, OraGeom.INTERP.POLYGON, OraGeom.INTERP.RECTANGLE, "Polygon");
+
+      int nElem = oraGeom.numElements();
+    	// ETYPE is either POLYGON or POLYGON_EXTERIOR
+      LinearRing exteriorRing = readLinearRing(oraGeom, elemIndex);
+
+      /**
+       * Holes are read as long as ETYPE = POLYGON_INTERIOR
+       * or ETYPE = POLYGON && orient = CW (Hole)
+       */
+      List holeRings = new ArrayList();
+      for (int i = elemIndex + 1; i < nElem; i++) {
+        etype = oraGeom.eType(i);
+        if (etype == OraGeom.ETYPE.POLYGON_INTERIOR) {
+          holeRings.add(readLinearRing(oraGeom, i));
+        } 
+        else if (etype == OraGeom.ETYPE.POLYGON) { 
+          // test orientation of Ring to see if it is
+          // an interior (hole) ring
+          LinearRing ring = readLinearRing(oraGeom, i);
+          // TODO: use the coordSeq directly (requires new CGAlgorithms method)
+          boolean isHole = ! CGAlgorithms.isCCW(ring.getCoordinates());
+          // if not a hole, exit
+          if (! isHole)
+            break;
+          // it is an Interior Hole
+          holeRings.add(ring);
+        } 
+        else { // not a LinearRing - get out of here
+            break;
         }
-
-        Polygon poly = gf.createPolygon(exteriorRing, (LinearRing[]) rings.toArray(new LinearRing[rings.size()]));
-
-        return poly;
+      }
+      Polygon poly = geometryFactory.createPolygon(exteriorRing, 
+          GeometryFactory.toLinearRingArray(holeRings));
+      return poly;
     }
 
     /**
-     * Create Linear Ring for exterior/interior polygon ELEM_INFO triplets.
-     *
-     * @param gf
-     * @param elemInfo
-     * @param elemIndex
-     * @param coords
+     * Create LinearRing for exterior/interior polygon ELEM_INFO triplets.
      *
+     * @param oraGeom SDO_GEOMETRY attributes being read
+     * @param elemIndex the element being read
+     * @param coords the coordinates of the entire geometry
      * @return LinearRing
      *
      * @throws IllegalArgumentException If circle, or curve is requested
      */
-    private LinearRing createLinearRing(GeometryFactory gf, int dim, int lrs, int[] elemInfo, int elemIndex, CoordinateSequence coords) {
-
-    	int sOffset = StartingOffset(elemInfo, elemIndex);
-        int etype = eType(elemInfo, elemIndex);
-        int interpretation = interpretation(elemInfo, elemIndex);
-        int length = coords.size()*dim;
-
-		if (!(sOffset <= length))
-		    throw new IllegalArgumentException("ELEM_INFO STARTING_OFFSET "+sOffset+" inconsistent with ORDINATES length "+coords.size());
-		if(!(etype == Constants.SDO_ETYPE.POLYGON) && !(etype == Constants.SDO_ETYPE.POLYGON_EXTERIOR) && !(etype == Constants.SDO_ETYPE.POLYGON_INTERIOR)){
-		    throw new IllegalArgumentException("ETYPE "+etype+" inconsistent with expected POLYGON, POLYGON_EXTERIOR or POLYGON_INTERIOR");
-		}
-		if (!(interpretation == 1) && !(interpretation == 3)){
-			return null;
-		}
-        LinearRing ring;
-
-
-		int len = (dim+lrs);
-		int start = (sOffset - 1) / len;
-		int eOffset = StartingOffset(elemInfo, elemIndex+1); // -1 for end
-        int end = (eOffset != -1) ? ((eOffset - 1) / len) : coords.size();
-
-        if (interpretation == 1) {
-            ring = gf.createLinearRing(subList(gf.getCoordinateSequenceFactory(),coords, start,end));
-        } else { // interpretation == 3
-            // rectangle does not maintain measures
-            //
-            CoordinateSequence ext = subList(gf.getCoordinateSequenceFactory(),coords, start,end);
-            Coordinate min = ext.getCoordinate(0);
-            Coordinate max = ext.getCoordinate(1);
-            ring = gf.createLinearRing(new Coordinate[] {
-                        min, new Coordinate(max.x, min.y), max,
-                        new Coordinate(min.x, max.y), min
-                    });
-        }
-
-        return ring;
+    private LinearRing readLinearRing(OraGeom oraGeom, int elemIndex) 
+    {
+      int etype = oraGeom.eType(elemIndex);
+      int interpretation = oraGeom.interpretation(elemIndex);
+
+    	checkOrdinates(oraGeom, elemIndex, "Polygon");
+    	checkETYPE(etype,OraGeom.ETYPE.POLYGON, OraGeom.ETYPE.POLYGON_EXTERIOR,  OraGeom.ETYPE.POLYGON_INTERIOR, "Polygon");
+    	checkInterpretation(interpretation, OraGeom.INTERP.POLYGON, OraGeom.INTERP.RECTANGLE, "Polygon");
+
+      CoordinateSequence seq = extractCoords(oraGeom, elemIndex);
+    	LinearRing ring;
+      if (interpretation == OraGeom.INTERP.POLYGON) {
+        ring = geometryFactory.createLinearRing(seq);
+      } 
+      else { 
+      	// interpretation == OraSDO.INTERP.RECTANGLE
+        // rectangle does not maintain measures
+        Coordinate min = seq.getCoordinate(0);
+        Coordinate max = seq.getCoordinate(1);
+        ring = geometryFactory.createLinearRing(new Coordinate[] {
+                    min, new Coordinate(max.x, min.y), 
+                    max, new Coordinate(min.x, max.y), 
+                    min
+                });
+      }
+      return ring;
     }
 
-    /**
-     * Create LineString as encoded.
-     *
-     * @param gf
-     * @param elemInfo
-     * @param coords
-     *
-     * @return LineString
-     *
-     * @throws IllegalArgumentException If asked to create a curve
-     */
-    private LineString createLine(GeometryFactory gf, int dim, int lrs, int[] elemInfo, int elemIndex, CoordinateSequence coords) {
-
-    	int sOffset = StartingOffset(elemInfo, elemIndex);
-        int etype = eType(elemInfo, elemIndex);
-        int interpretation = interpretation(elemInfo, elemIndex);
-
-		if (etype != Constants.SDO_ETYPE.LINE)
-			return null;
-
-        if (interpretation != 1) {
-            throw new IllegalArgumentException("ELEM_INFO INTERPRETAION "
-                + interpretation + " not supported"
-                + "by JTS LineString.  Straight edges"
-                + "( ELEM_INFO INTERPRETAION 1) is supported");
-        }
-
-		int len = (dim+lrs);
-		int start = (sOffset - 1) / len;
-		int eOffset = StartingOffset(elemInfo, elemIndex+1); // -1 for end
-        int end = (eOffset != -1) ? ((eOffset - 1) / len) : coords.size();
-
-
-        LineString line = gf.createLineString(subList(gf.getCoordinateSequenceFactory(),coords, start,end));
-
-        return line;
-    }
+  /**
+   * Create LineString as encoded.
+   * 
+   * @param oraGeom SDO_GEOMETRY attributes being read
+   * @param elemIndex the element being read
+   * @param coords the coordinates of the entire geometry
+   * @return LineString
+   * 
+   * @throws IllegalArgumentException If asked to create a curve
+   */
+  private LineString readLine(OraGeom oraGeom, int elemIndex)
+  {
+    int etype = oraGeom.eType(elemIndex);
+    int interpretation = oraGeom.interpretation(elemIndex);
+
+  	checkOrdinates(oraGeom, elemIndex, "LineString");
+  	checkETYPE(etype, OraGeom.ETYPE.LINE, "LineString");
+  	checkInterpretation(interpretation, OraGeom.INTERP.LINESTRING, "LineString");
+	
+    LineString line = geometryFactory.createLineString(
+        extractCoords(oraGeom, elemIndex));
+    return line;
+  }
 
     /**
      * Create Point as encoded.
      *
-     * @param gf
-     * @param dim The number of Dimensions
-     * @param elemInfo
-     * @param elemIndex
-     * @param coords
-     *
+   * @param oraGeom SDO_GEOMETRY attributes being read
+   * @param elemIndex the element being read
+   * @param coords the coordinates of the entire geometry
      * @return Point
      */
-    private Point createPoint(GeometryFactory gf, int dim, int lrs, int[] elemInfo, int elemIndex, CoordinateSequence coords) {
-    	int sOffset = StartingOffset(elemInfo, elemIndex);
-        int etype = eType(elemInfo, elemIndex);
-        int interpretation = interpretation(elemInfo, elemIndex);
-
-		if (!(sOffset >= 1) || !(sOffset <= coords.size()))
-		    throw new IllegalArgumentException("ELEM_INFO STARTING_OFFSET "+sOffset+" inconsistent with ORDINATES length "+coords.size());
-		if (etype != Constants.SDO_ETYPE.POINT)
-		    throw new IllegalArgumentException("ETYPE "+etype+" inconsistent with expected POINT");
-		if (interpretation != 1){
-			return null;
-		}
-
-		int len = (dim+lrs);
-		int start = (sOffset - 1) / len;
-		int eOffset = StartingOffset(elemInfo, elemIndex+1); // -1 for end
-
-		Point point = null;
-        if ((sOffset == 1) && (eOffset == -1)) {
-            // Use all Coordinates
-        	point = gf.createPoint( coords);
-        }else{
-	        int end = (eOffset != -1) ? ((eOffset - 1) / len) : coords.size();
-	        point = gf.createPoint(subList(gf.getCoordinateSequenceFactory(),coords,start,end));
-        }
-
-        return point;
+    private Point readPoint(OraGeom oraGeom, int elemIndex) {
+      int etype = oraGeom.eType(elemIndex);
+      int interpretation = oraGeom.interpretation(elemIndex);
+
+  		checkOrdinates(oraGeom, elemIndex, "Point");
+  		checkETYPE(etype,OraGeom.ETYPE.POINT, "Point");
+  		checkInterpretation(interpretation, OraGeom.INTERP.POINT, "Point");
+  
+      CoordinateSequence seq = extractCoords(oraGeom, elemIndex);
+      return createPoint(seq);
     }
 
+    private Point createPoint(CoordinateSequence coords)
+    {
+      return geometryFactory.createPoint(coords);
+    }
 
     /**
-     * Version of List.subList() that returns a CoordinateSequence.
+     * Constructs a coordinate sequence from the ordinates
+     * for a given element
+     * taking into account the input and output dimensions.
      *
-     * <p>
-     * Returns from start (inclusive) to end (exlusive):
-     * </p>
+     * The number of ordinates read per coordinate is given by outputDim.
+     * The number of ordinates for each input point is given by ordDim.
+     * The ordinate array length must be a multiple of this value.
      *
-     * @param factory Manages CoordinateSequences for JTS
-     * @param coords coords to sublist
-     * @param start starting offset
-     * @param end upper bound of sublist
+     * @param oraGeom the input geometry
+     * @param elemIndex the element to read
+     * @return a coordinate sequence representing the ordinates for the element
      *
-     * @return CoordianteSequence
+     * @throws IllegalArgumentException if the ordinate array has an invalid length
      */
-    private CoordinateSequence subList(CoordinateSequenceFactory factory, CoordinateSequence coords, int start, int end) {
-        if ((start == 0) && (end == coords.size())) {
-            return coords;
-        }
-
-        if (coords instanceof List) {
-            List sublist = ((List) coords).subList(start, end);
-
-            if (sublist instanceof CoordinateSequence) {
-                return (CoordinateSequence) sublist;
-            }
-        }
-
-        CoordinateList list = new CoordinateList(coords.toCoordinateArray());
-
-        Coordinate[] array = new Coordinate[end - start];
-        int index = 0;
-
-        for (Iterator i = list.subList(start, end).iterator(); i.hasNext(); index++) {
-            array[index] = (Coordinate) i.next();
-        }
-
-        return factory.create(array);
+    private CoordinateSequence extractCoords(OraGeom oraGeom, int elemIndex)
+    {
+      int start = oraGeom.startingOffset(elemIndex);
+      int end = oraGeom.startingOffset(elemIndex + 1);
+      return extractCoords(oraGeom, oraGeom.ordinates, start, end);
     }
-
-    /**
-     * ETYPE access for the elemInfo triplet indicated.
-     * <p>
-     * @see Constants.SDO_ETYPE for an indication of possible values
-     *
-     * @param elemInfo
-     * @param tripletIndex
-     * @return ETYPE for indicated triplet
-     */
-    private int eType(int[] elemInfo, int tripletIndex) {
-        if (((tripletIndex * 3) + 1) >= elemInfo.length) {
-            return -1;
-        }
-
-        return elemInfo[(tripletIndex * 3) + 1];
+    
+    private CoordinateSequence extractCoords(OraGeom oraGeom, double[] ordinates)
+    {
+      return extractCoords(oraGeom, ordinates, 1, ordinates.length + 1);
     }
-
-
-    /**
-     * Accesses the interpretation value for the current geometry
-     *
-     * JTS valid interpretation is: 1 for strait edges, 3 for rectangle
-     *
-     * Other interpretations include: 2 for arcs, 4 for circles
-     *
-     * mostly useful for polygons
-     *
-     * @param elemInfo
-     * @param tripletIndex
-     * @return Starting Offset for the ordinates of the geometry
-     */
-    private int interpretation(int[] elemInfo, int tripletIndex) {
-        if (((tripletIndex * 3) + 2) >= elemInfo.length) {
-            return -1;
+    
+    private CoordinateSequence extractCoords(OraGeom oraGeom, double[] ordinates, int start, int end)
+    {
+      CoordinateSequenceFactory csFactory = geometryFactory.getCoordinateSequenceFactory();
+      // handle empty case
+      if ((ordinates == null) || (ordinates.length == 0)) {
+        return csFactory.create(new Coordinate[0]);
+      }
+      int ordDim = oraGeom.ordDim();
+      
+      /**
+       * The dimension created matches the input dim, unless it is explicitly set,
+       * and unless the CoordinateSequence impl limits the dimension.
+       */
+      int csDim = ordDim;
+      if(outputDimension != OraGeom.NULL_DIMENSION){
+    	  csDim = outputDimension;
+      }
+      int nCoord = (ordDim == 0 ? 0 : (end - start) / ordDim);
+
+      CoordinateSequence cs = csFactory.create(nCoord, csDim);
+      int actualCSDim = cs.getDimension();
+      int readDim = Math.min(actualCSDim, ordDim);
+      
+      for (int iCoord = 0; iCoord < nCoord; iCoord++) {
+        for (int iDim = 0; iDim < readDim; iDim++) {
+          int ordIndex = start + iCoord * ordDim + iDim - 1;
+          // TODO: be more lenient in handling invalid ordinates length
+          cs.setOrdinate(iCoord, iDim, ordinates[ordIndex]);
         }
-
-        return elemInfo[(tripletIndex * 3) + 2];
+      }
+      return cs;
     }
 
-    /**
-     * Accesses the starting index in the ordinate array for the current geometry
-     *
-     * mostly useful for polygons
-     *
-     * @param elemInfo
-     * @param tripletIndex
-     * @return Starting Offset for the ordinates of the geometry
-     */
-    private int StartingOffset(int[] elemInfo, int tripletIndex) {
-        if (((tripletIndex * 3) + 0) >= elemInfo.length) {
-            return -1;
-        }
-
-        return elemInfo[(tripletIndex * 3) + 0];
+    private static void checkETYPE(int eType, int val1, String geomType)
+    {
+    	checkETYPE(eType,val1, -1, -1, geomType);
+    }
+    
+    private static void checkETYPE(int eType, int val1, int val2, String geomType)
+    {
+    	checkETYPE(eType,val1, val2, -1, geomType);
+    }
+    
+    private static void checkETYPE(int eType, int val1, int val2, int val3, String geomType)
+    {
+    	if (eType == val1) return;
+    	if (val2 >= 0 && eType == val2) return;
+    	if (val3 >= 0 && eType == val3) return;
+    	throw new IllegalArgumentException("SDO_ETYPE "+ eType +" is not supported when reading a " + geomType);
+    }
+    
+    private static void checkInterpretation(int interpretation, int val1, String geomType) {
+    	checkInterpretation(interpretation, val1, -1, geomType);
+    }
+    
+    private static void checkInterpretation(int interpretation, int val1, int val2, String geomType) {
+		if (interpretation == val1) return;
+	   	if (val2 >= 0 && interpretation == val2) return;
+	   	errorInterpretation(interpretation, geomType);
     }
 
-	/** Presents datum as an int */
-	private int asInteger(Datum datum, final int DEFAULT)
-			throws SQLException {
-		if (datum == null)
-			return DEFAULT;
-		return ((NUMBER) datum).intValue();
-	}
-
-	/** Presents datum as a double */
-	private double asDouble(Datum datum, final double DEFAULT) {
-		if (datum == null)
-			return DEFAULT;
-		return ((NUMBER) datum).doubleValue();
-	}
-
-	/** Presents struct as a double[] */
-	private double[] asDoubleArray(STRUCT struct, final double DEFAULT)
-			throws SQLException {
-		if (struct == null)
-			return null;
-		return asDoubleArray(struct.getOracleAttributes(), DEFAULT);
-	}
-
-	/** Presents array as a double[] */
-	private double[] asDoubleArray(ARRAY array, final double DEFAULT)
-			throws SQLException {
-		if (array == null)
-			return null;
-		if (DEFAULT == 0)
-			return array.getDoubleArray();
-
-		return asDoubleArray(array.getOracleArray(), DEFAULT);
-	}
-
-	/** Presents Datum[] as a double[] */
-	private double[] asDoubleArray(Datum data[], final double DEFAULT) {
-		if (data == null)
-			return null;
-		double array[] = new double[data.length];
-		for (int i = 0; i < data.length; i++) {
-			array[i] = asDouble(data[i], DEFAULT);
-		}
-		return array;
-	}
-
-	private int[] asIntArray(ARRAY array, int DEFAULT)
-			throws SQLException {
-		if (array == null)
-			return null;
-		if (DEFAULT == 0)
-			return array.getIntArray();
-
-		return asIntArray(array.getOracleArray(), DEFAULT);
-	}
+  	private static void errorInterpretation(int interpretation, String geomType) {
+  		throw new IllegalArgumentException("SDO_INTERPRETATION "+ interpretation +" is not supported when reading a " + geomType);
+  	}
 
-	/** Presents Datum[] as a int[] */
-	private int[] asIntArray(Datum data[], final int DEFAULT)
-			throws SQLException {
-		if (data == null)
-			return null;
-		int array[] = new int[data.length];
-		for (int i = 0; i < data.length; i++) {
-			array[i] = asInteger(data[i], DEFAULT);
-		}
-		return array;
-	}
+    private static void checkOrdinates(OraGeom oraGeom, int elemIndex, String geomType)
+    {
+      int startOffset = oraGeom.startingOffset(elemIndex);
+      int ordLen = oraGeom.ordinateLen();
+      checkOrdinates(oraGeom.elemInfo, elemIndex, startOffset, ordLen, geomType);
+    }
 
+    private static void checkOrdinates(int[] elemInfo, int elemIndex, int startOffset, int ordLen, String geomType)
+    {
+      if (startOffset > ordLen)
+		    throw new IllegalArgumentException("STARTING_OFFSET " + startOffset + " inconsistent with ORDINATES length " + ordLen
+		    		+ " (Element " + elemIndex + " in SDO_ELEM_INFO " + OraGeom.toStringElemInfo(elemInfo) + ")");
+    }
+    
 
 }
diff --git a/jtsio/src/com/vividsolutions/jts/io/oracle/OraUtil.java b/jtsio/src/com/vividsolutions/jts/io/oracle/OraUtil.java
new file mode 100644
index 0000000..4f83c78
--- /dev/null
+++ b/jtsio/src/com/vividsolutions/jts/io/oracle/OraUtil.java
@@ -0,0 +1,161 @@
+package com.vividsolutions.jts.io.oracle;
+
+import java.sql.SQLException;
+
+import oracle.jdbc.OracleConnection;
+import oracle.sql.ARRAY;
+import oracle.sql.ArrayDescriptor;
+import oracle.sql.Datum;
+import oracle.sql.NUMBER;
+import oracle.sql.STRUCT;
+import oracle.sql.StructDescriptor;
+
+/**
+ * Utility methods for working with Oracle structures.
+ * 
+ * @author Martin Davis
+ * 
+ */
+public class OraUtil
+{
+  /**
+   * Converts an Oracle <code>Datum</code> into an <code>int</code> value, 
+   * with a default value used if the datum is NULL.
+   * 
+   * @param datum the Oracle Datum
+   * @param defaultValue the value to use for NULLs
+   * @return an integer value
+   * @throws SQLException if an error occurs
+   */
+  public static int toInteger(Datum datum, final int defaultValue)
+      throws SQLException
+  {
+    if (datum == null)
+      return defaultValue;
+    return ((NUMBER) datum).intValue();
+  }
+
+  /**
+   * Converts an Oracle <code>ARRAY</code> into a <code>int</code> array, 
+   * with a default value used to represent NULL values.
+   * 
+   * @param array an Oracle ARRAY of integer values
+   * @param defaultValue the value to use for NULL values
+   * @return an array of ints
+   * @throws SQLException if an error was encountered
+   */
+  public static int[] toIntArray(ARRAY array, int defaultValue) throws SQLException
+  {
+    if (array == null)
+      return null;
+    if (defaultValue == 0)
+      return array.getIntArray();
+
+    return toIntArray(array.getOracleArray(), defaultValue);
+  }
+
+  /** Presents Datum[] as a int[] */
+  public static int[] toIntArray(Datum data[], final int defaultValue)
+      throws SQLException
+  {
+    if (data == null)
+      return null;
+    int array[] = new int[data.length];
+    for (int i = 0; i < data.length; i++) {
+      array[i] = toInteger(data[i], defaultValue);
+    }
+    return array;
+  }
+
+  /** Presents Datum[] as a double[] */
+  public static double[] toDoubleArray(Datum[] data, final double defaultValue)
+  {
+    if (data == null)
+      return null;
+    double array[] = new double[data.length];
+    for (int i = 0; i < data.length; i++) {
+      array[i] = toDouble(data[i], defaultValue);
+    }
+    return array;
+  }
+
+  /** Presents array as a double[] */
+  public static double[] toDoubleArray(ARRAY array, final double defaultValue)
+      throws SQLException
+  {
+    if (array == null)
+      return null;
+    if (defaultValue == 0)
+      return array.getDoubleArray();
+
+    return toDoubleArray(array.getOracleArray(), defaultValue);
+  }
+
+  /** Presents struct as a double[] */
+  public static double[] toDoubleArray(STRUCT struct, final double defaultValue)
+      throws SQLException
+  {
+    if (struct == null)
+      return null;
+    return toDoubleArray(struct.getOracleAttributes(), defaultValue);
+  }
+
+  /** Presents datum as a double */
+  public static double toDouble(Datum datum, final double defaultValue)
+  {
+    if (datum == null)
+      return defaultValue;
+    return ((NUMBER) datum).doubleValue();
+  }
+
+  /**
+   * Convenience method for NUMBER construction.
+   * <p>
+   * Double.NaN is represented as <code>NULL</code> to agree with JTS use.
+   * </p>
+   */
+  public static NUMBER toNUMBER(double number) throws SQLException
+  {
+    if (Double.isNaN(number)) {
+      return null;
+    }
+    return new NUMBER(number);
+  }
+
+  /**
+   * Convience method for ARRAY construction.
+   * </p>
+   */
+  public static ARRAY toARRAY(double[] doubles, String dataType,
+      OracleConnection connection) throws SQLException
+  {
+    ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor(dataType,
+        connection);
+    return new ARRAY(descriptor, connection, doubles);
+  }
+
+  /**
+   * Convience method for ARRAY construction.
+   */
+  public static ARRAY toARRAY(int[] ints, String dataType,
+      OracleConnection connection) throws SQLException
+  {
+    ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor(dataType,
+        connection);
+    return new ARRAY(descriptor, connection, ints);
+  }
+
+  /** Convenience method for STRUCT construction. */
+  public static STRUCT toSTRUCT(Datum[] attributes, String dataType,
+      OracleConnection connection) throws SQLException
+  {
+    //TODO: fix this to be more generic
+    if (dataType.startsWith("*.")) {
+      dataType = "DRA." + dataType.substring(2);
+    }
+    StructDescriptor descriptor = StructDescriptor.createDescriptor(dataType,
+        connection);
+    return new STRUCT(descriptor, connection, attributes);
+  }
+
+}
diff --git a/jtsio/src/com/vividsolutions/jts/io/oracle/OraWriter.java b/jtsio/src/com/vividsolutions/jts/io/oracle/OraWriter.java
index 36cabab..836939f 100644
--- a/jtsio/src/com/vividsolutions/jts/io/oracle/OraWriter.java
+++ b/jtsio/src/com/vividsolutions/jts/io/oracle/OraWriter.java
@@ -53,767 +53,663 @@ import java.util.*;
 
 import com.vividsolutions.jts.algorithm.CGAlgorithms;
 import com.vividsolutions.jts.geom.*;
+import com.vividsolutions.jts.util.Assert;
 
 import oracle.jdbc.OracleConnection;
 import oracle.sql.*;
 
 /**
+ * Translates a JTS Geometry into an Oracle STRUCT representing an <code>MDSYS.SDO_GEOMETRY</code> object. 
+ * Supports writing all JTS geometry types into an equivalent Oracle representation.
+ * <p>
+ * To write an Oracle <code>STRUCT</code> a connection to an Oracle instance with access to the definition of the <code>MDSYS.SDO_GEOMETRY</code>
+ * type is required.  Oracle <code>SDO_GEOMETRY</code> SQL strings may be written without a connection, however.
+ * <p>
+ * By default, a single {@link Point} is written using the optimized <code>SDO_POINT_TYPE</code> attribute.
+ * This can be overridden to use the (less compact) <code>SDO_ELEM_INFO/SDOORDINATES</code> representation
+ * by using {@link #setOptimizePoint(boolean)}.
+ * <p>
+ * By default, rectangular polygons are written as regular 5-point polygons.
+ * This can be changed to use the optimized RECTANGLE points 
+ * by using {@link #setOptimizeRectangle(boolean)}.
+ * Note that RECTANGLEs do not support LRS Measure ordinate values.
+ * Also, this class only writes RECTANGLEs for polygons containing a single ring (i.e. the shell). 
+ * <p>
+ * Oracle cannot represent {@link MultiPolygon}s or {@link MultiLineString}s directly as elements
+ * of a {@link GeometryCollection}. Instead, their components are written individually.
+ * {@link MultiPoint}s are represented directly, however.
  * 
- * Translates a JTS Geometry into an Oracle STRUCT representing an MDSYS.GEOMETRY object. 
+ * The dimension of the output <code>SDO_GEOMETRY</code> is determined as follows:
+ * <ul>
+ * <li>by default, the dimension matches that of the input
+ * <li>currently the coordinate dimension of the input is determined by inspecting a sample coordinate.
+ * If the Z value is <code>NaN</code>, the coordinate dimension is assumed to be 2.
+ * (In the future this will be determined from the underlying {@link CoordinateSequence}s.
+ * <li>the dimension can be set explicitly by the {@link #setDimension(int)} method.
+ * This allows forcing Z output even if the Z values are <code>NaN</code>.
+ * Conversely, if Z values are present this allows forcing 2D output.
+ * </ul>
  * 
- * A connection to an oracle instance with access to the definition of the MDSYS.GEOMETRY 
- * object is required by the oracle driver.
+ * <h3>LIMITATIONS</h3>
+ * <ul>
+ * <li>Since JTS does not support Measures, they cannot be written.
+ * (A future release could allow forcing interpreting Z as M, or else providing a fixed M value).
+ * </ul>
  * 
- * @version 9i
+ * @author Martin Davis
  * @author David Zwiers, Vivid Solutions.
  */
-public class OraWriter {
+public class OraWriter 
+{
+	/**
+	 * A connection providing access to the required type definitions
+	 */
 	private OracleConnection connection;
-	private int dimension = 2;
-	private int srid = Constants.SRID_NULL;
-	
-	private String DATATYPE = "MDSYS.SDO_GEOMETRY";
-	
 	/**
-	 * Initialize the Oracle MDSYS.GEOMETRY Encoder with a valid oracle connection. 
-	 * 
-	 * The connection should have sufficient priveledges to view the description of the MDSYS.GEOMETRY type.
-	 * 
-	 * The dimension is set to 2
-	 * 
-	 * @param con
+	 * The maximum output dimension to write
 	 */
-	public OraWriter(OracleConnection con){
-		this.connection = con;
-	}
-	
+	private int outputDimension = OraGeom.NULL_DIMENSION;
 	/**
-	 * Initialize the Oracle MDSYS.GEOMETRY Encoder with a valid oracle connection. 
-	 * 
-	 * The connection should have sufficient priveledges to view the description of the MDSYS.GEOMETRY type.
-	 * 
-	 * @param con
-	 * @param dimension 
+	 * The default SRID to write 
 	 */
-	public OraWriter(OracleConnection con, int dimension){
-		this.connection = con;
-		this.dimension = dimension;
-	}
-	
+	private int srid = OraGeom.SRID_NULL;
+	private boolean isOptimizeRectangle = false;
+	private boolean isOptimizePoint = true;
+
+  /**
+   * Creates a writer for Oracle geometry formats. 
+   * 
+   * The output dimension will be whatever the dimension of the input is.
+   */
+  public OraWriter()
+  {
+  }
+  
+  /**
+   * Creates a writer for Oracle geometry formats,
+   * specifying the maximum output dimension. 
+   * 
+   * @param outputDimension the coordinate dimension to use for the output
+   */
+  public OraWriter(int outputDimension)
+  {
+    this.outputDimension = outputDimension;
+  }
+
+  /**
+   * Creates a writer using a valid Oracle connection. 
+   * <p>
+   * To simplify connection resource handling, the connection should be
+   * provided in the {@link #write(Geometry, OracleConnection)} method.
+   * Accordingly, this constructor has been deprecated.
+   * <p>
+   * The connection should have sufficient privileges to view the description of the MDSYS.SDO_GEOMETRY type.
+   * <p>
+   * The output dimension will be whatever the dimension of the input is.
+   * 
+   * @param con a valid Oracle connection
+   * @deprecated use {@link #OraWriter()} instead
+   */
+  public OraWriter(OracleConnection con)
+  {
+    this.connection = con;
+  }
+  
 	/**
-	 * Provides the oppotunity to force all geometries written using this writter to be written using the 
-	 * specified srid. This is useful in two cases: 1) when you do not want the geometry's srid to be 
-	 * over-written or 2) when you want to ensure an entire layer is always written using a constant srid.
+	 * Creates a writer using a valid Oracle connection,
+	 * and specifying the maximum output dimension. 
+   * <p>
+   * To simplify connection resource handling, the connection should be
+   * provided in the {@link #write(Geometry, OracleConnection)} method.
+   * Accordingly, this constructor has been deprecated.
+   * <p>
+   * The connection should have sufficient privileges to view the description of the MDSYS.SDO_GEOMETRY type.
 	 * 
-	 * @param srid
+	 * @param con a valid Oracle connection
+	 * @param outputDimension the coordinate dimension to use for the output
+	 * @deprecated use {@link #OraWriter(int)} instead
 	 */
-	public void setSRID(int srid){
-		this.srid = srid;
+	public OraWriter(OracleConnection con, int outputDimension)
+	{
+		this.connection = con;
+		this.outputDimension = outputDimension;
 	}
+	
+    /**
+     * Sets the coordinate dimension for the created Oracle geometries.
+     * 
+     * @param outputDimension
+     *            the coordinate dimension to use for the output
+     */
+    public void setDimension(int outputDimension) 
+    {
+        if (outputDimension < 2)
+            throw new IllegalArgumentException("Output dimension must be >= 2");
+        this.outputDimension = outputDimension;
+    }
 
 	/**
-	 * This routine will translate the JTS Geometry into an Oracle MDSYS.GEOMETRY STRUCT.
-	 * 
-	 * Although invalid geometries may be encoded, and inserted into an Oracle DB, this is 
-	 * not recomended. It is the responsibility of the user to ensure the geometry is valid 
-	 * prior to calling this method. The user should also ensure the the geometry's SRID 
-	 * field contains the correct value, if an SRID is desired. An incorrect SRID value may 
-	 * cause index exceptions during an insert or update. 
+	 * Forces geometries to be written using the specified SRID. 
+	 * This is useful in two cases: 
+	 * <ul>
+	 * <li>to avoid using the native geometry's SRID
+	 * <li>to ensure an entire table is written using a fixed SRID.
+	 * </ul>
 	 * 
-	 * When a null Geometry is passed in, a non-null, empty STRUCT is returned. Therefore, 
-	 * inserting the the result of calling this method directly into a table will never result 
-	 * in null insertions. 
-	 * (March 2006)
-	 * 
-	 * To pass a NULL Geometry into an oracle geometry parameter using jdbc, use 
-	 * java.sql.CallableStatement.setNull(index,java.sql.Types.STRUCT,"MDSYS.SDO_GEOMETRY")
-	 * (April 2006)
-	 * 
-	 * @param geom JTS Geometry to encode
-	 * @return Oracle MDSYS.GEOMETRY STRUCT
-	 * @throws SQLException 
+	 * @param srid the srid to use
 	 */
-	public STRUCT write(Geometry geom) throws SQLException{
-		
-		// this line may be problematic ... for v9i and later 
-		// need to revisit.
-		
-		// was this ... does not work for 9i
-//		if( geom == null) return toSTRUCT( null, DATATYPE );
-		
-		//works fro 9i
-		if( geom == null) return toSTRUCT( new Datum[5], DATATYPE );
-		
-		// does not work for 9i
-//		if( geom == null) return null;
-		
-		//empty geom
-		if( geom.isEmpty() || geom.getCoordinate() == null) 
-			return toSTRUCT( new Datum[5], DATATYPE );
-        
-        int gtype = gType( geom);
-        NUMBER SDO_GTYPE = new NUMBER( gtype );
-
-        //int srid = geom.getFactory().getSRID();
-        int srid = this.srid == Constants.SRID_NULL? geom.getSRID() : this.srid;
-        NUMBER SDO_SRID = srid == Constants.SRID_NULL ? null : new NUMBER( srid );
-        
-        double[] point = point( geom );
-        
-        STRUCT SDO_POINT;
-        
-        ARRAY SDO_ELEM_INFO;
-        ARRAY SDO_ORDINATES;
-        
-        if( point == null ){
-            int elemInfo[] = elemInfo( geom , gtype);
-            
-            List list = new ArrayList();
-            coordinates(list, geom);
-                        
-            int dim = gtype / 1000;
-            int lrs = (gtype - dim*1000)/100;
-            int len = dim+lrs; // size per coordinate
-            double[] ordinates = new double[list.size()*len];
-            
-            int k=0;
-            for(int i=0;i<list.size() && k<ordinates.length;i++){
-            	int j=0;
-            	double[] ords = (double[]) list.get(i);
-            	for(;j<len && j<ords.length;j++){
-            		ordinates[k++] = ords[j];
-            	}
-            	for(;j<len;j++){ // mostly safety
-            		ordinates[k++] = Double.NaN;
-            	}
-            }
-            
-            list = null;
-            
-            SDO_POINT = null;
-            SDO_ELEM_INFO = toARRAY( elemInfo, "MDSYS.SDO_ELEM_INFO_ARRAY" );
-            SDO_ORDINATES = toARRAY( ordinates, "MDSYS.SDO_ORDINATE_ARRAY" );                        
-        }
-        else { // Point Optimization
-            Datum data[] = new Datum[]{
-                toNUMBER( point[0] ),
-                toNUMBER( point[1] ),
-                toNUMBER( point[2] ),
-            };
-            SDO_POINT = toSTRUCT( data, "MDSYS.SDO_POINT_TYPE"  );
-            SDO_ELEM_INFO = null;
-            SDO_ORDINATES = null;
-        }                
-        Datum attributes[] = new Datum[]{
-            SDO_GTYPE,
-            SDO_SRID,
-            SDO_POINT,
-            SDO_ELEM_INFO,
-            SDO_ORDINATES
-        };
-        return toSTRUCT( attributes, DATATYPE );      
+	public void setSRID(int srid)
+	{
+		this.srid = srid;
 	}
 
-	/**
-     * Encode Geometry as described by GTYPE and ELEM_INFO
-     * 
-     * @param list Flat list of Double
-     * @param geom Geometry 
-     *
-     * @throws IllegalArgumentException If geometry cannot be encoded
-     */
-    private void coordinates(List list, Geometry geom) {
-        switch (template(geom)) {
-
-        case Constants.SDO_GTEMPLATE.POINT:
-            addCoordinates(list, ((Point)geom).getCoordinateSequence());
-            return;
-        case Constants.SDO_GTEMPLATE.LINE:
-            addCoordinates(list, ((LineString)geom).getCoordinateSequence());
-            return;
-        case Constants.SDO_GTEMPLATE.POLYGON:
-            switch (elemInfoInterpretation(geom,Constants.SDO_ETYPE.POLYGON_EXTERIOR)) {
-            case 3:
-                Envelope e = geom.getEnvelopeInternal();
-                list.add(new double[] { e.getMinX(), e.getMinY() });
-                list.add(new double[] { e.getMaxX(), e.getMaxY() });
-                return;
-            case 1:
-            	Polygon polygon = (Polygon) geom;
-                int holes = polygon.getNumInteriorRing();
-                
-                // check outer ring's direction
-                CoordinateSequence ring = polygon.getExteriorRing().getCoordinateSequence();
-                if (!CGAlgorithms.isCCW(ring.toCoordinateArray())) {
-                    ring = reverse(polygon.getFactory().getCoordinateSequenceFactory(), ring); 
-                }
-                addCoordinates(list,ring);
-
-                for (int i = 0; i < holes; i++) {
-                	// check inner ring's direction
-                	ring = polygon.getInteriorRingN(i).getCoordinateSequence();
-                	if (CGAlgorithms.isCCW(ring.toCoordinateArray())) {
-                        ring = reverse(polygon.getFactory().getCoordinateSequenceFactory(), ring); 
-                    }
-                    
-                    addCoordinates(list,ring);
-                }
-                return;
-            }
-            break; // interpretations 2,4 not supported
-        case Constants.SDO_GTEMPLATE.MULTIPOINT:
-        case Constants.SDO_GTEMPLATE.MULTILINE:
-        case Constants.SDO_GTEMPLATE.MULTIPOLYGON:
-        case Constants.SDO_GTEMPLATE.COLLECTION:
-            for (int i = 0; i < geom.getNumGeometries(); i++) {
-                coordinates(list,geom.getGeometryN(i));
-            }
-            return;
-        }
-
-        throw new IllegalArgumentException("Cannot encode JTS "
-            + geom.getGeometryType() + " as "
-            + "SDO_ORDINATRES (Limitied to Point, Line, Polygon, "
-            + "GeometryCollection, MultiPoint, MultiLineString and MultiPolygon)");
+  /**
+   * Sets whether rectangle polygons should be written using the 
+   * optimized 4-coordinate RECTANGLE format
+   * (ETYPE=1003, INTERPRETATION=3).
+   * If this option is false, rectangles are written as 5-coordinate polygons.
+   * The default setting is <code>false</code>.
+   * 
+   * @param isOptimizeRectangle whether to optimize rectangle writing
+   */
+  public void setOptimizeRectangle(boolean isOptimizeRectangle)
+  {
+    this.isOptimizeRectangle  = isOptimizeRectangle;
+  }
+  
+  /**
+   * Sets whether points should be written using the 
+   * optimized SDO_POINT_TYPE format.
+   * If this option is <code>false</code>, points are written using the SDO_ORDINATES attribute.
+   * The default setting is <code>true</code>.
+   * 
+   * @param isOptimizePoint whether to optimize point writing
+   */
+  public void setOptimizePoint(boolean isOptimizePoint)
+  {
+    this.isOptimizePoint   = isOptimizePoint;
+  }
+  
+  /**
+   * Converts a {@link Geometry} into an Oracle MDSYS.SDO_GEOMETRY STRUCT.
+   * <p>
+   * Although invalid geometries may be encoded, and inserted into an Oracle DB,
+   * this is not recommended. It is the responsibility of the user to ensure the
+   * geometry is valid prior to calling this method. 
+   * <p>
+   * The SRID of the created SDO_GEOMETRY is the SRID defined explicitly for the writer, if any; 
+   * otherwise it is the SRID contained in the input geometry. 
+   * The caller should ensure the the SRID is valid for the intended use, 
+   * since an incorrect SRID may cause indexing exceptions during an
+   * INSERT or UPDATE.
+   * <p>
+   * When a null Geometry is passed in, a non-null, empty SDO_GEOMETRY STRUCT is returned.
+   * Therefore, inserting the output of the writer into a
+   * table will never result in NULL insertions.
+   * To pass a NULL Geometry into an Oracle SDO_GEOMETRY-valued parameter using JDBC, use
+   * <pre>
+   * java.sql.CallableStatement.setNull(index, java.sql.Types.STRUCT, "MDSYS.SDO_GEOMETRY"). 
+   * </pre>
+   * 
+   * @param geom the geometry to encode
+   * @return a Oracle MDSYS.SDO_GEOMETRY STRUCT representing the geometry
+   * @throws SQLException if an encoding error was encountered
+   * @deprecated
+   */
+  public STRUCT write(Geometry geom) throws SQLException
+  {
+    return write(geom, connection);
+  }
+  
+  /**
+   * Converts a {@link Geometry} into an Oracle MDSYS.SDO_GEOMETRY STRUCT.
+   * <p>
+   * Although invalid geometries may be encoded, and inserted into an Oracle DB,
+   * this is not recommended. It is the responsibility of the user to ensure the
+   * geometry is valid prior to calling this method. 
+   * <p>
+   * The SRID of the created SDO_GEOMETRY is the SRID defined explicitly for the writer, if any; 
+   * otherwise it is the SRID contained in the input geometry. 
+   * The caller should ensure the the SRID is valid for the intended use, 
+   * since an incorrect SRID may cause indexing exceptions during an
+   * INSERT or UPDATE.
+   * <p>
+   * When a null Geometry is passed in, a non-null, empty SDO_GEOMETRY STRUCT is returned.
+   * Therefore, inserting the output of the writer into a
+   * table will never result in NULL insertions.
+   * To pass a NULL Geometry into an Oracle SDO_GEOMETRY-valued parameter using JDBC, use
+   * <pre>
+   * java.sql.CallableStatement.setNull(index, java.sql.Types.STRUCT, "MDSYS.SDO_GEOMETRY"). 
+   * </pre>
+   * 
+   * @param geom the geometry to encode
+   * @return a Oracle MDSYS.SDO_GEOMETRY STRUCT representing the geometry
+   * @throws SQLException if an encoding error was encountered
+   */
+  public STRUCT write(Geometry geom, OracleConnection connection) throws SQLException
+  {
+    // this line may be problematic ... for v9i and later need to revisit.
+
+    // was this ... does not work for 9i
+    // if( geom == null) return toSTRUCT( null, DATATYPE );
+
+    if (geom == null || geom.isEmpty() || geom.getCoordinate() == null)
+      return createEmptySDOGeometry(connection);
+
+    OraGeom oraGeom = createOraGeom(geom);
+    
+    STRUCT SDO_POINT = null;
+    ARRAY SDO_ELEM_INFO = null;
+    ARRAY SDO_ORDINATES = null;
+    if (oraGeom.point == null) {
+      SDO_ELEM_INFO = OraUtil.toARRAY(oraGeom.elemInfo, OraGeom.TYPE_ELEM_INFO_ARRAY,
+          connection);
+      SDO_ORDINATES = OraUtil.toARRAY(oraGeom.ordinates, OraGeom.TYPE_ORDINATE_ARRAY,
+          connection);
     }
-
-    /**
-     * Adds a double array to list.
-     * 
-     * <p>
-     * The double array will contain all the ordinates in the Coordiante
-     * sequence.
-     * </p>
-     *
-     * @param list
-     * @param sequence
-     */
-    private static void addCoordinates(List list, CoordinateSequence sequence) {
-    	Coordinate coord = null;
-        for (int i = 0; i < sequence.size(); i++) {
-        	coord = sequence.getCoordinate(i);
-        	if(coord.z == Double.NaN)
-        		list.add( new double[] { coord.x, coord.y});
-        	else
-        		list.add( new double[] { coord.x, coord.y, coord.z });
-        }
+    else { // Point Optimization
+      Datum data[] = new Datum[] { 
+          OraUtil.toNUMBER(oraGeom.point[0]),
+          OraUtil.toNUMBER(oraGeom.point[1]), 
+          OraUtil.toNUMBER(oraGeom.point[2]), };
+      SDO_POINT = OraUtil.toSTRUCT(data, OraGeom.TYPE_POINT_TYPE, connection);
     }
+    
+    NUMBER SDO_GTYPE = new NUMBER(oraGeom.gType);
+    NUMBER SDO_SRID = oraGeom.srid == OraGeom.SRID_NULL ? null : new NUMBER(oraGeom.srid);
+    
+    Datum sdoGeometryComponents[] = new Datum[] { 
+        SDO_GTYPE, 
+        SDO_SRID, 
+        SDO_POINT,
+        SDO_ELEM_INFO, 
+        SDO_ORDINATES };
+    return OraUtil.toSTRUCT(sdoGeometryComponents, OraGeom.TYPE_GEOMETRY, connection);
+  }
+
+  /**
+   * Writes a Geometry in Oracle SDO_GEOMETRY SQL literal format.
+   * <p>
+   * Examples of output are:
+   * <pre>
+   * SDO_GEOMETRY(2001,NULL,NULL,SDO_ELEM_INFO_ARRAY(1,1,1),SDO_ORDINATE_ARRAY(50,50))
+   * SDO_GEOMETRY(3001,NULL,SDO_POINT_TYPE(50,50,100,),NULL,NULL)
+   * SDO_GEOMETRY(3006,8307,NULL,SDO_ELEM_INFO_ARRAY(1,2,1,  7,2,1),SDO_ORDINATE_ARRAY(0,0,2,  50,50,100,  10,10,12,  150,150,110))
+   * </pre>
+   * 
+   * @param geom the Geometry to write
+   * @return a string representing the geometry as an SDO_GEOMETRY literal
+   */
+  public String writeSQL(Geometry geom)
+  {
+	  if (geom == null) return OraGeom.SQL_NULL;
+	  OraGeom oraGeom = createOraGeom(geom);
+	  return oraGeom.toString();
+  }
+  
+	private STRUCT createEmptySDOGeometry(OracleConnection connection) throws SQLException {
+		return OraUtil.toSTRUCT(new Datum[5], OraGeom.TYPE_GEOMETRY, connection);
+	}
 
-    /**
-     * Return SDO_ELEM_INFO array for geometry
-     * 
-     * <pre><code><b>
-     * # Name                Meaning</b>
-     * 0 SDO_STARTING_OFFSET Offsets start at one
-     * 1 SDO_ETYPE           Describes how ordinates are ordered
-     * 2 SDO_INTERPRETATION  SDO_ETYPE: 4, 1005, or 2005
-     *                       Number of triplets involved in compound geometry
-     *                       
-     *                       SDO_ETYPE: 1, 2, 1003, or 2003
-     *                       Describes ordering of ordinates in geometry  
-     * </code></pre>
-     * 
-     * <p>
-     * For compound elements (SDO_ETYPE values 4 and 5) the last element of one
-     * is the first element of the next.
-     * </p>
-     *
-     * @param geom Geometry being represented
-     *
-     * @return Descriptionof Ordinates representation
-     */
-	private int[] elemInfo(Geometry geom, int gtype) {
-		List list = new LinkedList();
-
-        elemInfo(list, geom, 1, gtype);
-        
-        int[] array = new int[list.size()];
-        int offset = 0;
-
-        for (Iterator i = list.iterator(); i.hasNext(); offset++) {
-            array[offset] = ((Number) i.next()).intValue();
-        }
-
-        return array;
+  /**
+   * Creates an {@link OraGeom} structure corresponding to the Oracle SDO_GEOMETRY
+   * attributes representing the given Geometry.
+   * This allows disconnected testing, since no Oracle types are accessed.
+   * 
+   * @param geom the non-null, non-empty Geometry to write
+   * @return an OraGeom structure
+   */
+  OraGeom createOraGeom(Geometry geom)
+  {
+    int gtype = gType(geom);
+    int srid = this.srid == OraGeom.SRID_NULL ? geom.getSRID() : this.srid;
+    double[] point = null;
+    int elemInfo[] = null;
+    double[] ordinates = null;
+    
+    // if geometry ordinate data should be represented by SDO_ORDINATES array
+    if (isEncodeAsPointType(geom)) {
+        point = pointOrdinates(geom);
     }
-	
-    /**
-     * Add to SDO_ELEM_INFO list for geometry and GTYPE.
-     *
-     * @param elemInfoList List used to gather SDO_ELEM_INFO
-     * @param geom Geometry to encode
-     * @param sOffSet Starting offset in SDO_ORDINATES
-     *
-     * @throws IllegalArgumentException If geom cannot be encoded by ElemInfo
-     */
-    private void elemInfo(List elemInfoList, Geometry geom, int sOffSet, int gtype) {
-
-        switch (gtype - (gtype/100) * 100) { // removes right two digits
-        case Constants.SDO_GTEMPLATE.POINT:
-            addInt(elemInfoList, sOffSet);
-            addInt(elemInfoList, Constants.SDO_ETYPE.POINT);
-            addInt(elemInfoList, 1); // INTERPRETATION single point
-
-            return;
-
-        case Constants.SDO_GTEMPLATE.MULTIPOINT:
-            MultiPoint points = (MultiPoint) geom;
-
-            addInt(elemInfoList, sOffSet);
-            addInt(elemInfoList, Constants.SDO_ETYPE.POINT);
-            addInt(elemInfoList, elemInfoInterpretation(points, Constants.SDO_ETYPE.POINT));
-
-            return;
-
-        case Constants.SDO_GTEMPLATE.LINE:
-            addInt(elemInfoList, sOffSet);
-            addInt(elemInfoList, Constants.SDO_ETYPE.LINE);
-            addInt(elemInfoList, 1); // INTERPRETATION straight edges    
-
-            return;
-
-        case Constants.SDO_GTEMPLATE.MULTILINE:
-        	MultiLineString lines = (MultiLineString) geom;
-            LineString line;
-            int offset = sOffSet;
-            int dim = gtype/1000;
-            int len = dim + (gtype-dim*1000)/100;
-
-            for (int i = 0; i < lines.getNumGeometries(); i++) {
-                line = (LineString) lines.getGeometryN(i);
-                addInt(elemInfoList, offset);
-                addInt(elemInfoList, Constants.SDO_ETYPE.LINE);
-                addInt(elemInfoList, 1); // INTERPRETATION straight edges  
-                offset += (line.getNumPoints() * len);
-            }
-
-            return;
-
-        case Constants.SDO_GTEMPLATE.POLYGON:
-        	Polygon polygon = (Polygon)geom;
-            int holes = polygon.getNumInteriorRing();
-
-            if (holes == 0) {
-                addInt(elemInfoList, sOffSet);
-                addInt(elemInfoList, elemInfoEType(polygon));
-                addInt(elemInfoList, elemInfoInterpretation(polygon, Constants.SDO_ETYPE.POLYGON_EXTERIOR));
-                return;
-            }
-
-            dim = gtype/1000;
-            len = dim + (gtype-dim*1000)/100;
-            offset = sOffSet;
-            LineString ring;
-
-            ring = polygon.getExteriorRing();
-            addInt(elemInfoList, offset);
-            addInt(elemInfoList, elemInfoEType(polygon));
-            addInt(elemInfoList, elemInfoInterpretation(polygon, Constants.SDO_ETYPE.POLYGON_EXTERIOR));
-            offset += (ring.getNumPoints() * len);
-
-            for (int i = 1; i <= holes; i++) {
-                ring = polygon.getInteriorRingN(i - 1);
-                addInt(elemInfoList, offset);
-                addInt(elemInfoList, Constants.SDO_ETYPE.POLYGON_INTERIOR);
-                addInt(elemInfoList, elemInfoInterpretation(ring, Constants.SDO_ETYPE.POLYGON_INTERIOR));
-                offset += (ring.getNumPoints() * len);
-            }
-
-            return;
-
-        case Constants.SDO_GTEMPLATE.MULTIPOLYGON:
-        	MultiPolygon polys = (MultiPolygon) geom;
-            Polygon poly;
-            offset = sOffSet;
-
-            dim = gtype/1000;
-            len = dim + (gtype-dim*1000)/100;
-
-            for (int i = 0; i < polys.getNumGeometries(); i++) {
-                poly = (Polygon) polys.getGeometryN(i);
-                elemInfo(elemInfoList, poly, offset, gType(poly));
-                if( isRectangle( poly )){
-                    offset += (2 * len);                
-                }
-                else {
-                    offset += (poly.getNumPoints() * len);                
-                }            
-            }
-
-            return;
-
-        case Constants.SDO_GTEMPLATE.COLLECTION:
-        	GeometryCollection geoms = (GeometryCollection) geom;
-            offset = sOffSet;
-            dim = gtype/1000;
-            len = dim + (gtype-dim*1000)/100;
-
-            for (int i = 0; i < geoms.getNumGeometries(); i++) {
-                geom = geoms.getGeometryN(i);
-                // MD  20/3/07 modified to provide gType of component geometry
-                elemInfo(elemInfoList, geom, offset, gType(geom));
-                if( geom instanceof Polygon && isRectangle( (Polygon) geom )){
-                    offset += (2 * len);                
-                }
-                else {
-                    offset += (geom.getNumPoints() * len);                
-                }                        
-            }
-
-            return;
-        }
-
-        throw new IllegalArgumentException("Cannot encode JTS "
-            + geom.getGeometryType() + " as SDO_ELEM_INFO "
-            + "(Limitied to Point, Line, Polygon, GeometryCollection, MultiPoint,"
-            + " MultiLineString and MultiPolygon)");
+    else {
+      int dim = dimension(geom);
+      List elemTriplets = new ArrayList();
+      List ordGeoms = new ArrayList();
+      int lastOrdOffset = writeElement(geom, dim, 1, elemTriplets, ordGeoms);
+      elemInfo = flattenTriplets(elemTriplets);
+      ordinates = writeGeometryOrdinates(elemTriplets, ordGeoms, lastOrdOffset - 1, dim);
     }
-
-    private void addInt(List list, int i) {
-        list.add(new Integer(i));
+    
+    OraGeom oraGeom = new OraGeom(gtype, srid, point, elemInfo, ordinates);
+    return oraGeom;
+  }
+
+  /**
+   * Extracts ordinate data for SDO_POINT_TYPE for Point geometries.
+   * <code>null</code> is returned
+   * for all non-Point geometries, or for LRS points.
+
+   * This cannot be used for LRS coordinates.
+   * Subclasses may wish to repress this method and force Points to be
+   * represented using SDO_ORDINATES.
+   *
+   * @param geom the geometry providing the ordinates
+   * @return double[] the point ordinates
+   */
+  private double[] pointOrdinates(Geometry geom)
+  {
+    Point point = (Point) geom;
+    Coordinate coord = point.getCoordinate();
+    return new double[] { coord.x, coord.y, coord.z };
+  }
+
+  /**
+   * Writes each geometry element which will appear in the output,
+   * by recursing through the input geometry, 
+   * and identifying each element and how it will 
+   * appear in the output elemInfo array.
+   * For each element the relevant geometry component
+   * is recorded as well, to allow the ordinates
+   * array to be written from them subsequently.
+   * The total length of the ordinate array is summed
+   * during this process as well (which also allows determining startingOffsets).
+   * 
+   * @param geom
+   * @param dim
+   * @param offset
+   * @param elemTriplets
+   * @param ordGeoms
+   * @return the final startingOffset
+   */
+  private int writeElement(Geometry geom, int dim, int offset, List elemTriplets, List ordGeoms)
+  {
+    int interp;
+    int geomType = OraGeom.geomType(geom);
+    switch (geomType) {
+    case OraGeom.GEOM_TYPE.POINT:
+      // full point encoding - optimized one has been done earlier if possible
+      Point point = (Point) geom;
+      elemTriplets.add(triplet(offset, OraGeom.ETYPE.POINT, OraGeom.INTERP.POINT));
+      ordGeoms.add(point);
+      return offset + dim;
+      
+    case OraGeom.GEOM_TYPE.MULTIPOINT:
+      MultiPoint points = (MultiPoint) geom;
+      int nPts = points.getNumGeometries();
+      // this works for nPts >= 1 (0 has already been handled)
+      elemTriplets.add(triplet(offset, OraGeom.ETYPE.POINT, nPts));
+      ordGeoms.add(points);
+      return offset + dim * nPts;
+      
+    case OraGeom.GEOM_TYPE.LINE:
+      LineString line = (LineString) geom;
+      elemTriplets.add(triplet(offset, OraGeom.ETYPE.LINE, OraGeom.INTERP.LINESTRING));
+      ordGeoms.add(line);
+      return offset + dim * line.getNumPoints();
+      
+    case OraGeom.GEOM_TYPE.MULTILINE:
+      MultiLineString lines = (MultiLineString) geom;
+      for (int i = 0; i < lines.getNumGeometries(); i++) {
+        LineString lineElem = (LineString) lines.getGeometryN(i);
+        offset = writeElement(lineElem, dim, offset, elemTriplets, ordGeoms);
+      }
+      return offset;
+      
+    case OraGeom.GEOM_TYPE.POLYGON:
+      Polygon polygon = (Polygon) geom;
+      // shell
+      LineString ring = polygon.getExteriorRing();
+      interp = isWriteAsRectangle(polygon) ? OraGeom.INTERP.RECTANGLE : OraGeom.INTERP.POLYGON;
+      elemTriplets.add(triplet(offset, OraGeom.ETYPE.POLYGON_EXTERIOR, interp));
+      ordGeoms.add(ring);
+      if (interp == OraGeom.INTERP.RECTANGLE) {
+        offset += 4;
+      }
+      else {
+        offset += dim * ring.getNumPoints();
+      }
+      
+      // holes
+      int holes = polygon.getNumInteriorRing();
+      for (int i = 0; i < holes; i++) {
+        ring = polygon.getInteriorRingN(i);
+        elemTriplets.add(triplet(offset, OraGeom.ETYPE.POLYGON_INTERIOR, OraGeom.INTERP.POLYGON));
+        ordGeoms.add(ring);
+        offset += dim * ring.getNumPoints();
+      }
+      return offset;
+      
+    case OraGeom.GEOM_TYPE.MULTIPOLYGON:
+      MultiPolygon polys = (MultiPolygon) geom;
+      Polygon poly;
+      for (int i = 0; i < polys.getNumGeometries(); i++) {
+        poly = (Polygon) polys.getGeometryN(i);
+        offset = writeElement(poly, dim, offset, elemTriplets, ordGeoms);
+      }
+      return offset;
+      
+    case OraGeom.GEOM_TYPE.COLLECTION:
+      GeometryCollection geoms = (GeometryCollection) geom;
+      for (int i = 0; i < geoms.getNumGeometries(); i++) {
+        geom = geoms.getGeometryN(i);
+        offset = writeElement(geom, dim, offset, elemTriplets, ordGeoms);
+      }
+      return offset;
     }
 
-    /**
-     * We need to check if a <code>polygon</code> a rectangle so we can produce
-     * the correct encoding.
-     * 
-     * Rectangles are only supported without a SRID!
-     *
-     * @param polygon
-     *
-     * @return <code>true</code> if polygon is SRID==0 and a rectangle
-     */
-    private boolean isRectangle(Polygon polygon) {
-        if (polygon.getFactory().getSRID() != Constants.SRID_NULL) {
-            // Rectangles only valid in CAD applications
-            // that do not have an SRID system
-            //
-            return false;
-        }
-
-        if (lrs(polygon) != 0) {
-            // cannot support LRS on a rectangle
-            return false;
-        }
-
-        Coordinate[] coords = polygon.getCoordinates();
-
-        if (coords.length != 5) {
-            return false;
-        }
-
-        if ((coords[0] == null) || (coords[1] == null) || (coords[2] == null)
-                || (coords[3] == null)) {
-            return false;
-        }
-
-        if (!coords[0].equals2D(coords[4])) {
-            return false;
-        }
-
-        double x1 = coords[0].x;
-        double y1 = coords[0].y;
-        double x2 = coords[1].x;
-        double y2 = coords[1].y;
-        double x3 = coords[2].x;
-        double y3 = coords[2].y;
-        double x4 = coords[3].x;
-        double y4 = coords[3].y;
-
-        if ((x1 == x4) && (y1 == y2) && (x3 == x2) && (y3 == y4)) {
-            // 1+-----+2
-            //  |     |
-            // 4+-----+3
-            return true;
-        }
-
-        if ((x1 == x2) && (y1 == y4) && (x3 == x4) && (y3 == y2)) {
-            // 2+-----+3
-            //  |     |
-            // 1+-----+4
-            return true;
-        }
-
-        return false;
+    throw new IllegalArgumentException("Cannot encode JTS "
+        + geom.getGeometryType() + " as SDO_ELEM_INFO "
+        + "(Limited to Point, Line, Polygon, GeometryCollection, MultiPoint,"
+        + " MultiLineString and MultiPolygon)");
+  }
+  
+  private static int[] triplet(int sOffset, int etype, int interp)
+  {
+    return new int[] { sOffset, etype, interp };
+  }
+  
+  private int[] flattenTriplets(List elemTriplets)
+  {
+    int[] elemInfo = new int[3 * elemTriplets.size()];
+    int eiIndex = 0;
+    for (int i = 0; i < elemTriplets.size(); i++) {
+      int[] triplet = (int[]) elemTriplets.get(i);
+      for (int ii = 0; ii < 3; ii++) {
+        elemInfo[eiIndex++] = triplet[ii];
+      }
     }
-    /**
-     * Produce <code>SDO_ETYPE</code> for geometry description as stored in the
-     * <code>SDO_ELEM_INFO</code>.
-     * 
-     * <p>
-     * Describes how Ordinates are ordered:
-     * </p>
-     * <pre><code><b>
-     * Value Elements Meaning</b>
-     *    0           Custom Geometry (like spline) 
-     *    1  simple   Point (or Points)
-     *    2  simple   Line (or Lines)
-     *    3           polygon ring of unknown order (discouraged update to 1003 or 2003)
-     * 1003  simple   polygon ring (1 exterior counterclockwise order)
-     * 2003  simple   polygon ring (2 interior clockwise order)
-     *    4  compound series defines a linestring
-     *    5  compound series defines a polygon ring of unknown order (discouraged)
-     * 1005  compound series defines exterior polygon ring (counterclockwise order)
-     * 2005  compound series defines interior polygon ring (clockwise order)
-     * </code></pre>
-     * 
-     * @param geom Geometry being represented
-     *
-     * @return Descriptionof Ordinates representation
-     *
-     * @throws IllegalArgumentException
-     */
-    private int elemInfoEType(Geometry geom) {
-        switch (template(geom)) {
-
-        case Constants.SDO_GTEMPLATE.POINT:
-            return Constants.SDO_ETYPE.POINT;
-
-        case Constants.SDO_GTEMPLATE.LINE:
-            return Constants.SDO_ETYPE.LINE;
-
-        case Constants.SDO_GTEMPLATE.POLYGON:
-        	// jts convention
-            return Constants.SDO_ETYPE.POLYGON_EXTERIOR; // cc order
-
-        default:
-
-            // should never happen!
-            throw new IllegalArgumentException("Unknown encoding of SDO_GTEMPLATE");
+    return elemInfo;
+  }
+
+  /**
+   * Writes the ordinate values extracted from each element Geometry
+   * into a double array.
+   * This optimizes memory usage by only allocating the single
+   * double array required to pass the ordinates to the Oracle STRUCT.
+   * 
+   * @param elemTriplets
+   * @param ordGeoms
+   * @param ordSize
+   * @param dim
+   * @return the final ordinate array
+   */
+  private double[] writeGeometryOrdinates(List elemTriplets, List ordGeoms, int ordSize, int dim)
+  {
+    double[] ords = new double[ordSize];
+    int ordIndex = 0;
+    for (int ielem = 0; ielem < elemTriplets.size(); ielem++) {
+      int[] triplet = (int[]) elemTriplets.get(ielem);
+      
+      int startOffset = triplet[0]; 
+      //verify startOffset is same as ordIndex
+      Assert.isTrue(startOffset == ordIndex + 1,
+          "ElemInfo computed startingOffset does not match actual ordinates position");
+      
+      int elemType = triplet[1];
+      int interp = triplet[2];
+      Geometry geom = (Geometry) ordGeoms.get(ielem);
+      switch (elemType) {
+      case OraGeom.ETYPE.POINT:
+        if (interp == 1) {
+          ordIndex = writeOrds(((Point) geom).getCoordinateSequence(), dim, ords, ordIndex);
         }
-    }
-    
-    /**
-     * Allows specification of <code>INTERPRETATION</code> used to interpret
-     * <code>geom</code>.
-     * 
-     * @param geom Geometry to encode
-     * @param etype ETYPE value requiring an INTERPREATION
-     *
-     * @return INTERPRETATION ELEM_INFO entry for geom given etype
-     *
-     * @throws IllegalArgumentException If asked to encode a curve
-     */
-    private int elemInfoInterpretation(Geometry geom, int etype) {
-        switch (etype) {
-
-        case Constants.SDO_ETYPE.POINT:
-
-            if (geom instanceof Point) {
-                return 1;
-            }
-
-            if (geom instanceof MultiPoint) {
-                return ((MultiPoint) geom).getNumGeometries();
-            }
-
-            break;
-
-        case Constants.SDO_ETYPE.LINE:
-        	// always straight for jts
-            return 1;
-
-        case Constants.SDO_ETYPE.POLYGON:
-        case Constants.SDO_ETYPE.POLYGON_EXTERIOR:
-        case Constants.SDO_ETYPE.POLYGON_INTERIOR:
-
-            if (geom instanceof Polygon) {
-                Polygon polygon = (Polygon) geom;
-            	// always straight for jts
-                if (isRectangle(polygon)) {
-                    return 3;
-                }
-            }
-
-            return 1;
+        else {
+          // must be > 1 - write MultiPoint
+          ordIndex = writeOrds((MultiPoint) geom, dim, ords, ordIndex);          
         }
-
-        throw new IllegalArgumentException("Cannot encode JTS "
-            + geom.getGeometryType() + " as "
-            + "SDO_INTERPRETATION (Limitied to Point, Line, Polygon, "
-            + "GeometryCollection, MultiPoint, MultiLineString and MultiPolygon)");
-    }
-	
-    /**
-     * Return SDO_POINT_TYPE for geometry
-     * 
-     * Will return non null for Point objects. <code>null</code> is returned
-     * for all non point objects.
-
-     * You cannot use this with LRS Coordiantes
-     * Subclasses may wish to repress this method and force Points to be
-     * represented using SDO_ORDINATES.
-     *
-     * @param geom
-     *
-     * @return double[]
-     */
-	private double[] point(Geometry geom) {
-        if (geom instanceof Point && (lrs(geom) == 0)) {
-            Point point = (Point) geom;
-            Coordinate coord = point.getCoordinate();
-
-            return new double[] { coord.x, coord.y, coord.z };
+        break;
+        
+      case OraGeom.ETYPE.LINE:
+        ordIndex = writeOrds(((LineString) geom).getCoordinateSequence(), dim, ords, ordIndex);
+        break;
+        
+      case OraGeom.ETYPE.POLYGON_EXTERIOR:
+        if (interp == OraGeom.INTERP.RECTANGLE) {
+          ordIndex = writeRectangleOrds(geom, dim, ords, ordIndex);
         }
-
-        // SDO_POINT_TYPE only used for non LRS Points
-        return null;
-    }
-
-    /**
-     * Produce SDO_GTEMPLATE representing provided Geometry.
-     * 
-     * <p>
-     * Encoding of Geometry type and dimension.
-     * </p>
-     * 
-     * <p>
-     * SDO_GTEMPLATE defined as for digits <code>[d][l][tt]</code>:
-     * </p>
-     * 
-     * @param geom
-     *
-     * @return SDO_GTEMPLATE
-     */
-	private int gType(Geometry geom) {
-        int d = dimension(geom) * 1000;
-        int l = lrs(geom) * 100;
-        int tt = template(geom);
-
-        return d + l + tt;
-    }
-
-    /**
-     * Return dimensions as defined by SDO_GTEMPLATE (either 2,3 or 4).
-     * 
-     *
-     * @param geom
-     *
-     * @return num dimensions
-     */
-    private int dimension(Geometry geom) {
-    	int d = Double.isNaN(geom.getCoordinate().z)?2:3;
-		return d<dimension?d:dimension;
-    }
-
-    /**
-     * Return LRS as defined by SDO_GTEMPLATE (either 3,4 or 0).
-     * 
-     * @param geom
-     *
-     * @return <code>0</code>
-     */
-    private int lrs(Geometry geom) {
-        // when measures are supported this may change
-    	// until then ... 
-    	return 0;
-    }
-    
-    /**
-     * Return TT as defined by SDO_GTEMPLATE (represents geometry type).
-     * 
-     * @see Constants.SDO_GTEMPLATE
-     *
-     * @param geom
-     *
-     * @return template code
-     */
-    private int template(Geometry geom) {
-        if (geom == null) {
-            return -1; // UNKNOWN
-        } else if (geom instanceof Point) {
-            return Constants.SDO_GTEMPLATE.POINT;
-        } else if (geom instanceof LineString) {
-            return Constants.SDO_GTEMPLATE.LINE;
-        } else if (geom instanceof Polygon) {
-            return Constants.SDO_GTEMPLATE.POLYGON;
-        } else if (geom instanceof MultiPoint) {
-            return Constants.SDO_GTEMPLATE.MULTIPOINT;
-        } else if (geom instanceof MultiLineString) {
-            return Constants.SDO_GTEMPLATE.MULTILINE;
-        } else if (geom instanceof MultiPolygon) {
-            return Constants.SDO_GTEMPLATE.MULTIPOLYGON;
-        } else if (geom instanceof GeometryCollection) {
-            return Constants.SDO_GTEMPLATE.COLLECTION;
+        else {
+          ordIndex = writeOrdsOriented(((LineString) geom).getCoordinateSequence(), dim, ords, ordIndex, true);
         }
-
-        throw new IllegalArgumentException("Cannot encode JTS "
-            + geom.getGeometryType() + " as SDO_GTEMPLATE "
-            + "(Limitied to Point, Line, Polygon, GeometryCollection, MultiPoint,"
-            + " MultiLineString and MultiPolygon)");
+        break;
+        
+      case OraGeom.ETYPE.POLYGON_INTERIOR:
+        ordIndex = writeOrdsOriented(((LineString) geom).getCoordinateSequence(), dim, ords, ordIndex, false);
+        break;
+      }
     }
-	
-    /** Convience method for STRUCT construction. */
-    private STRUCT toSTRUCT( Datum attributes[], String dataType )
-            throws SQLException
-    {
-    	if( dataType.startsWith("*.")){
-    		dataType = "DRA."+dataType.substring(2);//TODO here
-    	}
-        StructDescriptor descriptor =
-            StructDescriptor.createDescriptor( dataType, connection );
-    
-         return new STRUCT( descriptor, connection, attributes );
+    return ords; 
+  }
+
+  /**
+   * Writes ordinates in the orientation
+   * specified by the isWriteCCW CCW flag.
+   * Coordinates are reversed if necessary.
+   * 
+   * @param seq the coordinates to write
+   * @param dim the output dimension required
+   * @param ordData the ordinates array
+   * @param ordIndex the starting index in the ordinates array
+   * @param isWriteCCW true if the ordinates should be written in CCW orientation, false if CW 
+   * @return the next index to write in the ordinates array
+   */
+  private int writeOrdsOriented(CoordinateSequence seq, int dim,
+      double[] ordData, int ordIndex, boolean isWriteCCW)
+  {
+    Coordinate[] coords = seq.toCoordinateArray();
+    //TODO: add method to CGAlgorithms to compute isCCW for CoordinateSequences
+    boolean isCCW = CGAlgorithms.isCCW(coords);
+    if (isCCW != isWriteCCW) {
+      return writeOrdsReverse(seq, dim, ordData, ordIndex);
     }
-    
-    /** 
-     * Convience method for ARRAY construction.
-     * <p>
-     * Compare and contrast with toORDINATE - which treats <code>Double.NaN</code>
-     * as<code>NULL</code></p>
-     */
-    private ARRAY toARRAY( double doubles[], String dataType )
-            throws SQLException
-    {
-        ArrayDescriptor descriptor =
-            ArrayDescriptor.createDescriptor( dataType, connection );
-        
-         return new ARRAY( descriptor, connection, doubles );
+    return writeOrds(seq, dim, ordData, ordIndex);
+  }
+
+  private int writeOrdsReverse(CoordinateSequence seq, int dim, double[] ordData, int ordIndex)
+  {
+    int nCoord = seq.size();
+    for (int i = nCoord-1; i >= 0; i--) {
+      for (int id = 0; id < dim; id++) {
+        ordData[ordIndex++] = seq.getOrdinate(i, id);
+      }
     }
-    
-    /** 
-     * Convience method for ARRAY construction.
-     */
-    private ARRAY toARRAY( int ints[], String dataType )
-        throws SQLException
-    {
-        ArrayDescriptor descriptor =
-            ArrayDescriptor.createDescriptor( dataType, connection );
-            
-         return new ARRAY( descriptor, connection, ints );
+    return ordIndex;
+  }
+
+  private int writeOrds(CoordinateSequence seq, int dim, double[] ordData, int ordIndex)
+  {
+    int nCoord = seq.size();
+    for (int i = 0; i < nCoord; i++) {
+      for (int id = 0; id < dim; id++) {
+        ordData[ordIndex++] = seq.getOrdinate(i, id);
+      }
     }
-
-    /** 
-     * Convience method for NUMBER construction.
-     * <p>
-     * Double.NaN is represented as <code>NULL</code> to agree
-     * with JTS use.</p>
-     */
-    private NUMBER toNUMBER( double number ) throws SQLException{
-        if( Double.isNaN( number )){
-            return null;
-        }
-        return new NUMBER( number );
+    return ordIndex;
+  }
+
+  private int writeOrds(MultiPoint geom, int dim, double[] ordData, int ordIndex)
+  {
+    int nGeom = geom.getNumGeometries();
+    for (int i = 0; i < nGeom; i++) {
+      CoordinateSequence seq = ((Point) geom.getGeometryN(i)).getCoordinateSequence();
+      for (int id = 0; id < dim; id++) {
+        ordData[ordIndex++] = seq.getOrdinate(0, id);
+      }
     }
-
-    /**
-     * reverses the coordinate order
-     *
-     * @param factory
-     * @param sequence
-     *
-     * @return CoordinateSequence reversed sequence
-     */
-    private CoordinateSequence reverse(CoordinateSequenceFactory factory, CoordinateSequence sequence) {
-    	CoordinateList list = new CoordinateList(sequence.toCoordinateArray());
-        Collections.reverse(list);
-        return factory.create(list.toCoordinateArray());
+    return ordIndex;
+  }
+
+  private int writeRectangleOrds(Geometry ring, int dim, double[] ordData, int ordIndex)
+  {
+    Envelope e = ring.getEnvelopeInternal();
+    ordData[ordIndex++] = e.getMinX();
+    ordData[ordIndex++] = e.getMinY();
+    ordData[ordIndex++] = e.getMaxX();
+    ordData[ordIndex++] = e.getMaxY();
+    return ordIndex;
+  }
+
+  /**
+   * Tests if a <code>polygon</code> can be written aa a RECTANGLE.
+   * Rectangles are only supported without a SRID!
+   *
+   * @param polygon
+   * @return <code>true</code> if polygon is SRID==NULL and a rectangle
+   */
+  private boolean isWriteAsRectangle(Polygon polygon) {
+    if (! isOptimizeRectangle) return false;
+
+    if (lrsDim(polygon) != 0) {
+        // cannot support LRS on a rectangle
+        return false;
     }
+    return polygon.isRectangle();
+  }
+      	
+  private boolean isEncodeAsPointType(Geometry geom)
+  {
+    if (! isOptimizePoint) return false;
+    if (geom instanceof Point && (lrsDim(geom) == 0) && outputDimension <= 3) 
+      return true;
+    // Geometry type is not appropriate for SDO_POINT_TYPE
+    return false;
+  }
+
+  /**
+   * Produce SDO_GTYPE code for input Geometry.
+   * 
+   * @param geom
+   * @return SDO_GTYPE code
+   */
+  private int gType(Geometry geom)
+  {
+    return OraGeom.gType(dimension(geom), lrsDim(geom), OraGeom.geomType(geom));
+  }
+
+  /**
+   * Return dimension of output coordinates (either 2,3 or 4), 
+   * respecting the explicit output dimension (if any).
+   * 
+   * @param geom
+   * @return coordinate dimension number
+   */
+  private int dimension(Geometry geom) {
+	  if (outputDimension != OraGeom.NULL_DIMENSION)
+		  return outputDimension;
+	  
+	  //TODO: check dimension of a geometry CoordinateSequence to determine dimension
+  	int d = Double.isNaN(geom.getCoordinate().z) ? 2 : 3;
+  	return d;
+  }
+
+  /**
+   * Return LRS dimension as defined by SDO_GTYPE (either 3,4 or 0).
+   * 
+   * @param geom
+   * @return LRS dimension
+   */
+  private int lrsDim(Geometry geom) {
+    //TODO: implement measure support when available 
+  	return 0;
+  }
 
-	/**
-	 * @param dimension The dimension to set.
-	 */
-	public void setDimension(int dimension) {
-		this.dimension = dimension;
-	}
 }
diff --git a/jtsio/src/com/vividsolutions/jts/io/oracle/package.html b/jtsio/src/com/vividsolutions/jts/io/oracle/package.html
deleted file mode 100644
index 19fbdda..0000000
--- a/jtsio/src/com/vividsolutions/jts/io/oracle/package.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<html>
-	<head><title>JTS IO: Java Topology Suite IO Library</title></head>
-	<body>
-	Classes to read and write Oracle SDO_GEOMETRY object structures.
-	</body>
-</html>
\ No newline at end of file
diff --git a/jtsio/src/com/vividsolutions/jts/io/sde/package.html b/jtsio/src/com/vividsolutions/jts/io/sde/package.html
deleted file mode 100644
index 5d5c540..0000000
--- a/jtsio/src/com/vividsolutions/jts/io/sde/package.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<html>
-	<head><title>JTS IO: Java Topology Suite IO Library</title></head>
-	<body>
-	Classes to read and write ESRI SDE shapes.
-	</body>
-</html>
\ No newline at end of file
diff --git a/jtsio/test/com/vividsolutions/jts/generator/GeometryGenerator.java b/jtsio/test/com/vividsolutions/jts/generator/GeometryGenerator.java
deleted file mode 100644
index b659a07..0000000
--- a/jtsio/test/com/vividsolutions/jts/generator/GeometryGenerator.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jts.generator;
-
-import com.vividsolutions.jts.geom.*;
-
-/**
- * This class illustrates the basic functionality and configuration options for generating spatial data. 
- *
- * @author David Zwiers, Vivid Solutions. 
- */
-public abstract class GeometryGenerator {
-	protected int dimensions = 2;
-	protected GeometryFactory geometryFactory; // includes srid
-	protected Envelope boundingBox;
-	
-	/**
-	 * @return A Geometry which uses some or all of the Bounding Box specified.
-	 */
-	public abstract Geometry create();
-
-	
-	/**
-	 * @see GridGenerator
-	 * @return A new GridGenerator
-	 */
-	public static GridGenerator createGridGenerator(){
-		return new GridGenerator();
-	}
-	
-	/**
-	 * @see PointGenerator
-	 * @return A new PointGenerator
-	 */
-	public static PointGenerator createPointGenerator(){
-		return new PointGenerator();
-	}
-
-	/**
-	 * @see LineStringGenerator
-	 * @return A new LineStringGenerator
-	 */
-	public static LineStringGenerator createLineStringGenerator(){
-		LineStringGenerator lsg = new LineStringGenerator();
-		lsg.setGenerationAlgorithm(LineStringGenerator.ARC);
-		lsg.setNumberPoints(10);
-		return lsg;
-	}
-
-	/**
-	 * @see PolygonGenerator
-	 * @return A new PolygonGenerator
-	 */
-	public static PolygonGenerator createPolygonGenerator(){
-		PolygonGenerator pg = new PolygonGenerator();
-		pg.setGenerationAlgorithm(PolygonGenerator.ARC);
-		pg.setNumberPoints(10);
-		pg.setNumberHoles(8);
-		return pg;
-	}
-
-	/**
-	 * @see PointGenerator
-	 * @see MultiGenerator
-	 * @return A new MultiGenerator
-	 */
-	public static MultiGenerator createMultiPointGenerator(){
-		MultiGenerator mg = new MultiGenerator(createPointGenerator());
-		mg.setNumberGeometries(4);
-		return mg;
-	}
-
-	/**
-	 * @see LineStringGenerator
-	 * @see MultiGenerator
-	 * @return A new PointGenerator
-	 */
-	public static MultiGenerator createMultiLineStringGenerator(){
-		MultiGenerator mg = new MultiGenerator(createLineStringGenerator());
-		mg.setNumberGeometries(4);
-		return mg;
-	}
-
-	/**
-	 * @see PolygonGenerator
-	 * @see MultiGenerator
-	 * @return A new PointGenerator
-	 */
-	public static MultiGenerator createMultiPolygonGenerator(){
-		MultiGenerator mg = new MultiGenerator(createPolygonGenerator());
-		mg.setNumberGeometries(4);
-		return mg;
-	}
-
-	/**
-	 * @return Returns the boundingBox.
-	 */
-	public Envelope getBoundingBox() {
-		return boundingBox;
-	}
-
-	/**
-	 * @param boundingBox The boundingBox to set.
-	 */
-	public void setBoundingBox(Envelope boundingBox) {
-		this.boundingBox = boundingBox;
-	}
-
-	/**
-	 * @return Returns the dimensions.
-	 */
-	public int getDimensions() {
-		return dimensions;
-	}
-
-	/**
-	 * @param dimensions The dimensions to set.
-	 */
-	public void setDimensions(int dimensions) {
-		this.dimensions = dimensions;
-		throw new RuntimeException("Dimensions other than 2 are not yet supported");
-	}
-
-	/**
-	 * @return Returns the geometryFactory.
-	 */
-	public GeometryFactory getGeometryFactory() {
-		return geometryFactory;
-	}
-
-	/**
-	 * @param geometryFactory The geometryFactory to set.
-	 */
-	public void setGeometryFactory(GeometryFactory geometryFactory) {
-		this.geometryFactory = geometryFactory;
-	}
-	
-	
-}
diff --git a/jtsio/test/com/vividsolutions/jts/generator/GridGenerator.java b/jtsio/test/com/vividsolutions/jts/generator/GridGenerator.java
deleted file mode 100644
index 843e127..0000000
--- a/jtsio/test/com/vividsolutions/jts/generator/GridGenerator.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jts.generator;
-
-import java.util.NoSuchElementException;
-
-import com.vividsolutions.jts.geom.Envelope;
-import com.vividsolutions.jts.geom.Geometry;
-
-/**
- * This class should be used to generate a grid of bounding boxes, 
- * most useful when creating multiple geometries.
- *
- * Successive calls to create() will walk the user though the grid. 
- * Use canCreate() and reset() to control the walk through the grid.
- * 
- * @see #canCreate()
- * @see #reset()
- * 
- * @author David Zwiers, Vivid Solutions. 
- */
-public class GridGenerator extends GeometryGenerator {
-
-	protected int numberColumns = 1;
-	protected int numberRows = 1;
-	protected int index = 0;
-	
-	/**
-	 * Sets some default values.
-	 */
-	public GridGenerator(){
-		dimensions = 2;
-	}
-	
-	/**
-	 * 
-	 * @see com.vividsolutions.jts.generator.GeometryGenerator#create()
-	 * 
-	 * @throws NoSuchElementException when all the grids have been created (@see #create())
-	 * @throws NullPointerException when either the Geometry Factory, or the Bounding Box are undefined.
-	 */
-	public Geometry create() {
-		return geometryFactory.toGeometry(createEnv());
-	}
-	/**
-	 * 
-	 * @return Envelope 
-	 * 
-	 * @see com.vividsolutions.jts.generator.GeometryGenerator#create()
-	 * 
-	 * @throws NoSuchElementException when all the grids have been created (@see #create())
-	 * @throws NullPointerException when either the Geometry Factory, or the Bounding Box are undefined.
-	 */
-	public Envelope createEnv() {
-		if(!canCreate()){
-			throw new NoSuchElementException("There are not any grids left to create.");
-		}
-		if(geometryFactory == null){
-			throw new NullPointerException("GeometryFactory is not declared");
-		}
-		if(boundingBox == null || boundingBox.isNull()){
-			throw new NullPointerException("Bounding Box is not declared");
-		}
-
-		double x = boundingBox.getMinX(); // base x
-		double dx = boundingBox.getMaxX()-x;
-		
-		double y = boundingBox.getMinY(); // base y
-		double dy = boundingBox.getMaxY()-y;
-		
-		int row = numberRows==1?0:index / numberRows;
-		int col = numberColumns==1?0:index % numberColumns;
-		
-		double sx,sy; // size of a step
-		sx = dx/numberColumns;
-		sy = dy/numberRows;
-		
-		double minx, miny;
-		minx = x+col*sx;
-		miny = y+row*sy;
-		
-		Envelope box = new Envelope(geometryFactory.getPrecisionModel().makePrecise(minx),
-									geometryFactory.getPrecisionModel().makePrecise(minx+sx),
-									geometryFactory.getPrecisionModel().makePrecise(miny),
-									geometryFactory.getPrecisionModel().makePrecise(miny+sy));
-		
-		index++;
-		return box;
-	}
-
-	/**
-	 * @return true when more grids exist
-	 */
-	public boolean canCreate(){
-		return (numberColumns*numberRows)>index;
-	}
-	
-	/**
-	 * Resets the grid counter
-	 */
-	public void reset(){
-		index = 0;
-	}
-
-	/**
-	 * @see com.vividsolutions.jts.generator.GeometryGenerator#setDimensions(int)
-	 */
-	public void setDimensions(int dimensions) {
-		if(dimensions!=2)
-			throw new IllegalStateException("MAY NOT CHANGE GridGenerator's Dimensions");
-	}
-
-	/**
-	 * @return Returns the numberColumns.
-	 */
-	public int getNumberColumns() {
-		return numberColumns;
-	}
-
-	/**
-	 * @param numberColumns The numberColumns to set.
-	 */
-	public void setNumberColumns(int numberColumns) {
-		if(numberColumns<=0)
-			throw new IndexOutOfBoundsException("Index sizes must be positive, non zero");
-		this.numberColumns = numberColumns;
-	}
-
-	/**
-	 * @return Returns the numberRows.
-	 */
-	public int getNumberRows() {
-		return numberRows;
-	}
-
-	/**
-	 * @param numberRows The numberRows to set.
-	 */
-	public void setNumberRows(int numberRows) {
-		if(numberRows<=0)
-			throw new IndexOutOfBoundsException("Index sizes must be positive, non zero");
-		this.numberRows = numberRows;
-	}
-	
-}
diff --git a/jtsio/test/com/vividsolutions/jts/generator/LineStringGenerator.java b/jtsio/test/com/vividsolutions/jts/generator/LineStringGenerator.java
deleted file mode 100644
index 3e077ce..0000000
--- a/jtsio/test/com/vividsolutions/jts/generator/LineStringGenerator.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jts.generator;
-
-import com.vividsolutions.jts.geom.*;
-import com.vividsolutions.jts.operation.valid.IsValidOp;
-
-/**
- * 
- * This class is used to create a line string within the specified bounding box.
- * 
- * Sucessive calls to create may or may not return the same geometry topology.
- *
- * @author David Zwiers, Vivid Solutions. 
- */
-public class LineStringGenerator extends GeometryGenerator {
-	protected int numberPoints = 2;
-	protected int generationAlgorithm = 0;
-	
-	/**
-	 * Create the points in a vertical line
-	 */
-	public static final int VERT = 1;
-	
-	/**
-	 * Create the points in a horizontal line
-	 */
-	public static final int HORZ = 2;
-	
-	/**
-	 * Create the points in an approximation of an open circle (one edge will not be included).
-	 * 
-	 * Note: this requires the number of points to be greater than 2.
-	 * 
-	 * @see #getNumberPoints()
-	 * @see #setNumberPoints(int)
-	 */
-	public static final int ARC = 0;
-	
-	/**
-	 * Number of interations attempting to create a valid line string
-	 */
-	private static final int RUNS = 5;
-
-	/**
-	 * As the user increases the number of points, the probability of creating a random valid linestring decreases. 
-	 * Please take not of this when selecting the generation style, and the number of points. 
-	 * 
-	 * May return null if a geometry could not be created.
-	 * 
-	 * @see #getNumberPoints()
-	 * @see #setNumberPoints(int)
-	 * @see #getGenerationAlgorithm()
-	 * @see #setGenerationAlgorithm(int)
-	 * 
-	 * @see #VERT
-	 * @see #HORZ
-	 * @see #ARC
-	 * 
-	 * @see com.vividsolutions.jts.generator.GeometryGenerator#create()
-	 * 
-	 * @throws IllegalStateException When the alg is not valid or the number of points is invalid
-	 * @throws NullPointerException when either the Geometry Factory, or the Bounding Box are undefined.
-	 */
-	public Geometry create() {
-
-		if(geometryFactory == null){
-			throw new NullPointerException("GeometryFactory is not declared");
-		}
-		if(boundingBox == null || boundingBox.isNull()){
-			throw new NullPointerException("Bounding Box is not declared");
-		}
-		if(numberPoints<2){
-			throw new IllegalStateException("Too few points");
-		}
-		
-		Coordinate[] coords = new Coordinate[numberPoints];
-
-		double x = boundingBox.getMinX(); // base x
-		double dx = boundingBox.getMaxX()-x;
-		
-		double y = boundingBox.getMinY(); // base y
-		double dy = boundingBox.getMaxY()-y;
-		
-		
-		for(int i=0;i<RUNS;i++){
-			switch(getGenerationAlgorithm()){
-			case VERT:
-				fillVert(x,dx,y,dy,coords,geometryFactory);
-				break;
-			case HORZ:
-				fillHorz(x,dx,y,dy,coords,geometryFactory);
-				break;
-			case ARC:
-				fillArc(x,dx,y,dy,coords,geometryFactory);
-				break;
-			default:
-				throw new IllegalStateException("Invalid Alg. Specified");
-			}
-			
-			LineString ls = geometryFactory.createLineString(coords);
-			IsValidOp valid = new IsValidOp(ls);
-			if(valid.isValid()){
-				return ls;
-			}
-		}
-		return null;
-	}
-	
-	private static void fillVert(double x, double dx, double y, double dy, Coordinate[] coords, GeometryFactory gf){
-		double fx = x+Math.random()*dx;
-		double ry = dy; // remainder of y distance
-		coords[0] = new Coordinate(fx,y);
-		gf.getPrecisionModel().makePrecise(coords[0]);
-		for(int i=1;i<coords.length-1;i++){
-			ry -= Math.random()*ry;
-			coords[i] = new Coordinate(fx,y+dy-ry);
-			gf.getPrecisionModel().makePrecise(coords[i]);
-		}
-		coords[coords.length-1] = new Coordinate(fx,y+dy);
-		gf.getPrecisionModel().makePrecise(coords[coords.length-1]);
-	}
-	
-	private static void fillHorz(double x, double dx, double y, double dy, Coordinate[] coords, GeometryFactory gf){
-		double fy = y+Math.random()*dy;
-		double rx = dx; // remainder of x distance
-		coords[0] = new Coordinate(x,fy);
-		gf.getPrecisionModel().makePrecise(coords[0]);
-		for(int i=1;i<coords.length-1;i++){
-			rx -= Math.random()*rx;
-			coords[i] = new Coordinate(x+dx-rx,fy);
-			gf.getPrecisionModel().makePrecise(coords[i]);
-		}
-		coords[coords.length-1] = new Coordinate(x+dx,fy);
-		gf.getPrecisionModel().makePrecise(coords[coords.length-1]);
-	}
-	
-	private static void fillArc(double x, double dx, double y, double dy, Coordinate[] coords, GeometryFactory gf){
-		if(coords.length == 2)
-			throw new IllegalStateException("Too few points for Arc");
-		
-		double theta = 360/coords.length;
-		double start = theta/2;
-		
-		double radius = dx<dy?dx/3:dy/3;
-		
-		double cx = x+(dx/2); // center
-		double cy = y+(dy/2); // center
-		
-		for(int i=0;i<coords.length;i++){
-			double angle = Math.toRadians(start+theta*i);
-			
-			double fx = Math.sin(angle)*radius; // may be neg.
-			double fy = Math.cos(angle)*radius; // may be neg.
-			
-			coords[i] = new Coordinate(cx+fx,cy+fy);
-			gf.getPrecisionModel().makePrecise(coords[i]);
-		}
-	}
-
-	/**
-	 * @return Returns the numberPoints.
-	 */
-	public int getNumberPoints() {
-		return numberPoints;
-	}
-
-	/**
-	 * @param numberPoints The numberPoints to set.
-	 */
-	public void setNumberPoints(int numberPoints) {
-		this.numberPoints = numberPoints;
-	}
-
-	/**
-	 * @return Returns the generationAlgorithm.
-	 */
-	public int getGenerationAlgorithm() {
-		return generationAlgorithm;
-	}
-
-	/**
-	 * @param generationAlgorithm The generationAlgorithm to set.
-	 */
-	public void setGenerationAlgorithm(int generationAlgorithm) {
-		this.generationAlgorithm = generationAlgorithm;
-	}
-	
-}
diff --git a/jtsio/test/com/vividsolutions/jts/generator/MultiGenerator.java b/jtsio/test/com/vividsolutions/jts/generator/MultiGenerator.java
deleted file mode 100644
index afbc72f..0000000
--- a/jtsio/test/com/vividsolutions/jts/generator/MultiGenerator.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jts.generator;
-
-import java.util.ArrayList;
-
-import com.vividsolutions.jts.geom.*;
-
-/**
- * 
- * Cascades the effort of creating a set of topologically valid geometries.
- *
- * @author David Zwiers, Vivid Solutions. 
- */
-public class MultiGenerator extends GeometryGenerator {
-
-	private GeometryGenerator generator = null;
-	private int numberGeometries = 2;
-	private int generationAlgorithm = 0;
-	
-	/**
-	 * Grid style blocks
-	 */
-	public static final int BOX = 0;
-	/**
-	 * vertical strips
-	 */
-	public static final int VERT = 1;
-	/**
-	 * Horizontal strips
-	 */
-	public static final int HORZ = 2;
-	
-	/**
-	 * @param generator
-	 */
-	public MultiGenerator(GeometryGenerator generator) {
-		this.generator = generator;
-	}
-
-	/**
-	 * Creates a geometry collection representing the set of child geometries created.
-	 * 
-	 * @see #setNumberGeometries(int)
-	 * @see com.vividsolutions.jts.generator.GeometryGenerator#create()
-	 * 
-	 * @see #BOX
-	 * @see #VERT
-	 * @see #HORZ
-	 * 
-	 * @throws NullPointerException when the generator is missing
-	 * @throws IllegalStateException when the number of child geoms is too small
-	 * @throws IllegalStateException when the selected alg. is invalid
-	 */
-	public Geometry create() {
-		if(generator == null)
-			throw new NullPointerException("Missing child generator");
-		
-		if(numberGeometries < 1)
-			throw new IllegalStateException("Too few child geoms to create");
-		
-		ArrayList geoms = new ArrayList(numberGeometries);
-
-		GridGenerator grid = GeometryGenerator.createGridGenerator();
-		grid.setBoundingBox(boundingBox);
-		grid.setGeometryFactory(geometryFactory);
-		
-		switch(generationAlgorithm){
-		case BOX:
-
-			int nrow = (int)Math.sqrt(numberGeometries);
-			int ncol = numberGeometries/nrow;
-			grid.setNumberRows(nrow);
-			grid.setNumberColumns(ncol);
-			
-			break;
-		case VERT:
-
-			grid.setNumberRows(1);
-			grid.setNumberColumns(numberGeometries);
-			
-			break;
-		case HORZ:
-
-			grid.setNumberRows(numberGeometries);
-			grid.setNumberColumns(1);
-			
-			break;
-		default:
-			throw new IllegalStateException("Invalid Alg. Specified");
-		}
-		
-		while(grid.canCreate()){
-			generator.setBoundingBox(grid.createEnv());
-			geoms.add(generator.create());
-		}
-		
-		// yes ... there are better ways
-		if(generator instanceof PointGenerator){
-			return geometryFactory.createMultiPoint((Point[]) geoms.toArray(new Point[numberGeometries]));
-		}else{
-		if(generator instanceof LineStringGenerator){
-			return geometryFactory.createMultiLineString((LineString[]) geoms.toArray(new LineString[numberGeometries]));
-		}else{
-		if(generator instanceof PolygonGenerator){
-			return geometryFactory.createMultiPolygon((Polygon[]) geoms.toArray(new Polygon[numberGeometries]));
-		}else{
-			// same as multi
-			return geometryFactory.createGeometryCollection((Geometry[]) geoms.toArray(new Geometry[numberGeometries]));
-		}}}
-	}
-
-	/**
-	 * @return Returns the numberGeometries.
-	 */
-	public int getNumberGeometries() {
-		return numberGeometries;
-	}
-
-	/**
-	 * @param numberGeometries The numberGeometries to set.
-	 */
-	public void setNumberGeometries(int numberGeometries) {
-		this.numberGeometries = numberGeometries;
-	}
-
-	/**
-	 * @return Returns the generator.
-	 */
-	public GeometryGenerator getGenerator() {
-		return generator;
-	}
-
-	/**
-	 * @see com.vividsolutions.jts.generator.GeometryGenerator#setBoundingBox(com.vividsolutions.jts.geom.Envelope)
-	 */
-	public void setBoundingBox(Envelope boundingBox) {
-		super.setBoundingBox(boundingBox);
-		if(generator!=null)
-			generator.setBoundingBox(boundingBox);
-	}
-
-	/**
-	 * @see com.vividsolutions.jts.generator.GeometryGenerator#setDimensions(int)
-	 */
-	public void setDimensions(int dimensions) {
-		super.setDimensions(dimensions);
-		if(generator!=null)
-			generator.setDimensions(dimensions);
-	}
-
-	/**
-	 * @see com.vividsolutions.jts.generator.GeometryGenerator#setGeometryFactory(com.vividsolutions.jts.geom.GeometryFactory)
-	 */
-	public void setGeometryFactory(GeometryFactory geometryFactory) {
-		super.setGeometryFactory(geometryFactory);
-		if(generator!=null)
-			generator.setGeometryFactory(geometryFactory);
-	}
-}
diff --git a/jtsio/test/com/vividsolutions/jts/generator/PolygonGenerator.java b/jtsio/test/com/vividsolutions/jts/generator/PolygonGenerator.java
deleted file mode 100644
index 80bfa6a..0000000
--- a/jtsio/test/com/vividsolutions/jts/generator/PolygonGenerator.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jts.generator;
-
-import com.vividsolutions.jts.geom.*;
-import com.vividsolutions.jts.geom.Geometry;
-import com.vividsolutions.jts.operation.valid.IsValidOp;
-
-/**
- * 
- * This class is used to create a polygon within the specified bounding box.
- * 
- * Sucessive calls to create may or may not return the same geometry topology.
- *
- * @author David Zwiers, Vivid Solutions. 
- */
-public class PolygonGenerator extends GeometryGenerator {
-	protected int numberPoints = 4;
-	protected int numberHoles = 0;
-	protected int generationAlgorithm = 0;
-	
-	/**
-	 * Creates rectangular polygons
-	 */
-	public static final int BOX = 0;
-	
-	/**
-	 * Creates polygons whose points will not be rectangular when there are more than 4 points 
-	 */
-	public static final int ARC = 1;
-	
-	private static final int RUNS = 5;
-	
-	/**
-	 * As the user increases the number of points, the probability of creating a random valid polygon decreases. 
-	 * Please take not of this when selecting the generation style, and the number of points. 
-	 * 
-	 * May return null if a geometry could not be created.
-	 * 
-	 * @see #getNumberPoints()
-	 * @see #setNumberPoints(int)
-	 * @see #getGenerationAlgorithm()
-	 * @see #setGenerationAlgorithm(int)
-	 * 
-	 * @see #BOX
-	 * @see #ARC
-	 * 
-	 * @see com.vividsolutions.jts.generator.GeometryGenerator#create()
-	 * 
-	 * @throws IllegalStateException When the alg is not valid or the number of points is invalid
-	 * @throws NullPointerException when either the Geometry Factory, or the Bounding Box are undefined.
-	 */
-	public Geometry create() {
-
-		if(geometryFactory == null){
-			throw new NullPointerException("GeometryFactory is not declared");
-		}
-		if(boundingBox == null || boundingBox.isNull()){
-			throw new NullPointerException("Bounding Box is not declared");
-		}
-		if(numberPoints<4){
-			throw new IllegalStateException("Too few points");
-		}
-		
-		double x = boundingBox.getMinX(); // base x
-		double dx = boundingBox.getMaxX()-x;
-		
-		double y = boundingBox.getMinY(); // base y
-		double dy = boundingBox.getMaxY()-y;
-		
-		Polygon p = null;
-		
-		for(int i=0;i<RUNS;i++){
-			switch(getGenerationAlgorithm()){
-			case BOX:
-				p = createBox(x,dx,y,dy,numberHoles,numberPoints,geometryFactory);
-				break;
-			case ARC:
-				p = createArc(x,dx,y,dy,numberHoles,numberPoints,geometryFactory);
-				break;
-			default:
-				throw new IllegalStateException("Invalid Alg. Specified");
-			}
-			
-			IsValidOp valid = new IsValidOp(p);
-			if(valid.isValid()){
-				return p;
-			}
-		}
-		return null;
-	}
-	
-	private static Polygon createArc(double x, double dx, double y, double dy, int nholes, int npoints, GeometryFactory gf){
-		// make outer ring first
-		double radius = dx<dy?dx/3:dy/3;
-		
-		double cx = x+(dx/2); // center
-		double cy = y+(dy/2); // center
-		
-		LinearRing outer = createArc(cx,cy,radius,npoints,gf);
-		
-		if(nholes == 0){
-			return gf.createPolygon(outer,null);
-		}
-		
-		LinearRing[] inner = new LinearRing[nholes];
-		
-		radius *= .75;
-		int degreesPerHole = 360/(nholes+1);
-		int degreesPerGap = degreesPerHole/nholes;
-		degreesPerGap = degreesPerGap<2?2:degreesPerGap;
-		degreesPerHole = (360-(degreesPerGap*nholes))/nholes;
-		
-		if(degreesPerHole < 2)
-			throw new RuntimeException("Slices too small for poly. Use Box alg.");
-		
-		int start = degreesPerGap/2;
-		for(int i=0;i<nholes;i++){
-			int st = start+(i*(degreesPerHole+degreesPerGap)); // start angle 
-			inner[i] = createTri(cx,cy,st,st+degreesPerHole,radius,gf);
-		}
-		
-		
-		return gf.createPolygon(outer,inner);
-	}
-	
-	private static LinearRing createTri(double cx, double cy ,int startAngle, int endAngle, double radius, GeometryFactory gf){
-
-		Coordinate[] coords = new Coordinate[4];
-		
-		double fx1,fx2,fy1,fy2;
-		
-		double angle = Math.toRadians(startAngle);
-		fx1 = Math.sin(angle)*radius; // may be neg.
-		fy1 = Math.cos(angle)*radius; // may be neg.
-		
-		angle = Math.toRadians(endAngle);
-		fx2 = Math.sin(angle)*radius; // may be neg.
-		fy2 = Math.cos(angle)*radius; // may be neg.
-		
-		coords[0] = new Coordinate(cx,cy);
-		gf.getPrecisionModel().makePrecise(coords[0]);
-		coords[1] = new Coordinate(cx+fx1,cy+fy1);
-		gf.getPrecisionModel().makePrecise(coords[1]);
-		coords[2] = new Coordinate(cx+fx2,cy+fy2);
-		gf.getPrecisionModel().makePrecise(coords[2]);
-		coords[3] = new Coordinate(cx,cy);
-		gf.getPrecisionModel().makePrecise(coords[3]);
-		
-		return gf.createLinearRing(coords);
-	}
-	
-	private static LinearRing createArc(double cx, double cy ,double radius, int npoints, GeometryFactory gf){
-
-		Coordinate[] coords = new Coordinate[npoints+1];
-		
-		double theta = 360/npoints;
-		
-		for(int i=0;i<npoints;i++){
-			double angle = Math.toRadians(theta*i);
-			
-			double fx = Math.sin(angle)*radius; // may be neg.
-			double fy = Math.cos(angle)*radius; // may be neg.
-			
-			coords[i] = new Coordinate(cx+fx,cy+fy);
-			gf.getPrecisionModel().makePrecise(coords[i]);
-		}
-		
-		coords[npoints] = new Coordinate(coords[0]);
-		gf.getPrecisionModel().makePrecise(coords[npoints]);
-		
-		return gf.createLinearRing(coords);
-	}
-	
-	private static Polygon createBox(double x, double dx, double y, double dy, int nholes, int npoints, GeometryFactory gf){
-		// make outer ring first
-		LinearRing outer = createBox(x,dx,y,dy,npoints,gf);
-		
-		if(nholes == 0){
-			return gf.createPolygon(outer,null);
-		}
-		
-		LinearRing[] inner = new LinearRing[nholes];
-		
-		int nrow = (int)Math.sqrt(nholes);
-		int ncol = nholes/nrow;
-		
-		double ddx = dx/(ncol+1);
-		double ddy = dy/(nrow+1);
-		
-		// spacers
-		double spx = ddx/(ncol+1);
-		double spy = ddy/(nrow+1);
-		
-		// should have more grids than required
-		int cindex = 0;
-		for(int i=0;i<nrow;i++){
-			for(int j=0;j<ncol;j++){
-				if(cindex<nholes){
-					// make another box
-					int pts = npoints/2;
-					pts = pts<4?4:pts;
-					
-					inner[cindex++] = createBox(spx+x+j*(ddx+spx),ddx,spy+y+i*(ddy+spy),ddy,pts,gf);
-				}
-			}
-		}
-		
-		return gf.createPolygon(outer,inner);
-	}
-	
-	private static LinearRing createBox(double x, double dx, double y, double dy, int npoints, GeometryFactory gf){
-
-		//figure out the number of points per side
-		int ptsPerSide = npoints/4;
-		int rPtsPerSide = npoints%4;
-		Coordinate[] coords = new Coordinate[npoints+1];
-		coords[0] = new Coordinate(x,y); // start
-		gf.getPrecisionModel().makePrecise(coords[0]);
-		
-		int cindex = 1;
-		for(int i=0;i<4;i++){ // sides
-			int npts = ptsPerSide+(rPtsPerSide-->0?1:0);
-			// npts atleast 1
-			
-			if(i%2 == 1){ // odd vert
-				double cy = dy/npts;
-				if(i > 1) // down
-					cy *=-1;
-				double tx = coords[cindex-1].x;
-				double sy = coords[cindex-1].y;
-				
-				for(int j=0;j<npts;j++){
-					coords[cindex] = new Coordinate(tx,sy+(j+1)*cy);
-					gf.getPrecisionModel().makePrecise(coords[cindex++]);
-				}
-			}else{ // even horz
-				double cx = dx/npts;
-				if(i > 1) // down
-					cx *=-1;
-				double ty = coords[cindex-1].y;
-				double sx = coords[cindex-1].x;
-				
-				for(int j=0;j<npts;j++){
-					coords[cindex] = new Coordinate(sx+(j+1)*cx,ty);
-					gf.getPrecisionModel().makePrecise(coords[cindex++]);
-				}
-			}
-		}
-		coords[npoints] = new Coordinate(x,y); // end
-		gf.getPrecisionModel().makePrecise(coords[npoints]);
-		
-		return gf.createLinearRing(coords);
-	}
-
-	/**
-	 * @return Returns the generationAlgorithm.
-	 */
-	public int getGenerationAlgorithm() {
-		return generationAlgorithm;
-	}
-
-	/**
-	 * @param generationAlgorithm The generationAlgorithm to set.
-	 */
-	public void setGenerationAlgorithm(int generationAlgorithm) {
-		this.generationAlgorithm = generationAlgorithm;
-	}
-
-	/**
-	 * @return Returns the numberHoles.
-	 */
-	public int getNumberHoles() {
-		return numberHoles;
-	}
-
-	/**
-	 * @param numberHoles The numberHoles to set.
-	 */
-	public void setNumberHoles(int numberHoles) {
-		this.numberHoles = numberHoles;
-	}
-
-	/**
-	 * @return Returns the numberPoints.
-	 */
-	public int getNumberPoints() {
-		return numberPoints;
-	}
-
-	/**
-	 * @param numberPoints The numberPoints to set.
-	 */
-	public void setNumberPoints(int numberPoints) {
-		this.numberPoints = numberPoints;
-	}
-	
-}
diff --git a/jtsio/test/com/vividsolutions/jts/io/gml2/GMLReaderTestCase.java b/jtsio/test/com/vividsolutions/jts/io/gml2/GMLReaderTestCase.java
deleted file mode 100644
index 2374f7d..0000000
--- a/jtsio/test/com/vividsolutions/jts/io/gml2/GMLReaderTestCase.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jts.io.gml2;
-
-import java.io.FileReader;
-import java.io.IOException;
-
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.xml.sax.SAXException;
-
-import com.vividsolutions.jts.geom.*;
-
-import junit.framework.TestCase;
-
-public class GMLReaderTestCase extends TestCase {
-
-	public GMLReaderTestCase(String arg0) {
-		super(arg0);
-		// TODO Auto-generated constructor stub
-	}
-	
-	protected static PrecisionModel precisionModel = new PrecisionModel(1000);
-	protected static GeometryFactory geometryFactory = new GeometryFactory(precisionModel);
-	
-	public void testPointRead() throws SAXException, IOException, ParserConfigurationException{
-		FileReader fr = new FileReader("./jtsio/test/data/points.xml");
-		
-		GMLReader gr = new GMLReader();
-		Geometry g = gr.read(fr,geometryFactory);
-		
-		GeometryCollection gc = (GeometryCollection)g;
-		assertTrue(gc.getNumGeometries() == 25);
-		
-		for(int i=0;i<25;i++){
-			Point p = (Point) gc.getGeometryN(i);
-			assertNotNull(p);
-		}
-	}
-
-	public void testLineStringRead() throws SAXException, IOException, ParserConfigurationException{
-		FileReader fr = new FileReader("./jtsio/test/data/linestrings.xml");
-		
-		GMLReader gr = new GMLReader();
-		Geometry g = gr.read(fr,geometryFactory);
-		
-		GeometryCollection gc = (GeometryCollection)g;
-		assertTrue(gc.getNumGeometries() == 25);
-		
-		for(int i=0;i<25;i++){
-			LineString ls = (LineString) gc.getGeometryN(i);
-			assertNotNull(ls);
-		}
-	}
-
-	public void testPolygonRead() throws SAXException, IOException, ParserConfigurationException{
-		FileReader fr = new FileReader("./jtsio/test/data/polygons.xml");
-		
-		GMLReader gr = new GMLReader();
-		Geometry g = gr.read(fr,geometryFactory);
-		
-		GeometryCollection gc = (GeometryCollection)g;
-		assertTrue(gc.getNumGeometries() == 25);
-		
-		for(int i=0;i<25;i++){
-			Polygon p = (Polygon) gc.getGeometryN(i);
-			assertNotNull(p);
-		}
-	}
-	
-	public void testMultiPointRead() throws SAXException, IOException, ParserConfigurationException{
-		FileReader fr = new FileReader("./jtsio/test/data/multipoints.xml");
-		
-		GMLReader gr = new GMLReader();
-		Geometry g = gr.read(fr,geometryFactory);
-		
-		GeometryCollection gc = (GeometryCollection)g;
-		assertTrue(gc.getNumGeometries() == 25);
-		
-		for(int i=0;i<25;i++){
-			MultiPoint p = (MultiPoint) gc.getGeometryN(i);
-			assertNotNull(p);
-		}
-	}
-
-	public void testMultiLineStringRead() throws SAXException, IOException, ParserConfigurationException{
-		FileReader fr = new FileReader("./jtsio/test/data/multilinestrings.xml");
-		
-		GMLReader gr = new GMLReader();
-		Geometry g = gr.read(fr,geometryFactory);
-		
-		GeometryCollection gc = (GeometryCollection)g;
-		assertTrue(gc.getNumGeometries() == 25);
-		
-		for(int i=0;i<25;i++){
-			MultiLineString ls = (MultiLineString) gc.getGeometryN(i);
-			assertNotNull(ls);
-		}
-	}
-
-	public void testMultiPolygonRead() throws SAXException, IOException, ParserConfigurationException{
-		FileReader fr = new FileReader("./jtsio/test/data/multipolygons.xml");
-		
-		GMLReader gr = new GMLReader();
-		Geometry g = gr.read(fr,geometryFactory);
-		
-		GeometryCollection gc = (GeometryCollection)g;
-		assertTrue(gc.getNumGeometries() == 25);
-		
-		for(int i=0;i<25;i++){
-			MultiPolygon p = (MultiPolygon) gc.getGeometryN(i);
-			assertNotNull(p);
-		}
-	}
-
-}
diff --git a/jtsio/test/com/vividsolutions/jts/io/gml2/StaticLineStringTest.java b/jtsio/test/com/vividsolutions/jts/io/gml2/StaticLineStringTest.java
deleted file mode 100644
index 0f43222..0000000
--- a/jtsio/test/com/vividsolutions/jts/io/gml2/StaticLineStringTest.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jts.io.gml2;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.sql.SQLException;
-
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.xml.sax.SAXException;
-
-import com.vividsolutions.jts.generator.*;
-import com.vividsolutions.jts.geom.*;
-
-/**
- * 
- * Does round trip testing by creating the oracle object, then decoding it. 
- * 
- * These tests do not include insert / delete / select operations.
- * 
- * NOTE: This test does require a precision to be used during the comparison, 
- * as points are rounded somewhat when creating the oracle struct. 
- * (One less decimal than a java double).
- *
- * @author David Zwiers, Vivid Solutions. 
- */
-public class StaticLineStringTest extends WritingTestCase {
-
-	/**
-	 * @param arg
-	 */
-	public StaticLineStringTest(String arg) {
-		super(arg);
-	}
-
-	/**
-	 * Round Trip test for a single line string
-	 * @throws ParserConfigurationException 
-	 * @throws IOException 
-	 * @throws SAXException 
-	 */
-	public void testSingleLineStringRoundTrip() throws SAXException, IOException, ParserConfigurationException{
-		LineStringGenerator pg = new LineStringGenerator();
-		pg.setGeometryFactory(geometryFactory);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberPoints(10);
-		
-		LineString pt = (LineString) pg.create();
-		
-		GMLWriter out = new GMLWriter();
-		out.setPrefix("");
-		out.write(pt,getWriter());
-		
-		GMLReader in = new GMLReader();
-		LineString pt2 = (LineString) in.read(getReader(),geometryFactory);
-		
-//		System.out.println(pt);
-//		System.out.println(pt2);
-		assertTrue("The input LineString is not the same as the output LineString",pt.equals(pt2));
-	}
-
-	/**
-	 * Round Trip test for a single line string with lotsa points
-	 * @throws ParserConfigurationException 
-	 * @throws IOException 
-	 * @throws SAXException 
-	 */
-	public void testSingleLineStringManyPointRoundTrip() throws SAXException, IOException, ParserConfigurationException{
-		LineStringGenerator pg = new LineStringGenerator();
-		pg.setGeometryFactory(geometryFactory);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setGenerationAlgorithm(LineStringGenerator.HORZ);
-		pg.setNumberPoints(1000);
-		
-		LineString pt = (LineString) pg.create();
-
-		GMLWriter out = new GMLWriter();
-		out.setPrefix("");
-		out.write(pt,getWriter());
-		
-		GMLReader in = new GMLReader();
-		LineString pt2 = (LineString) in.read(getReader(),geometryFactory);
-
-		assertTrue("The input LineString is not the same as the output LineString",pt.equals(pt2));
-	}
-}
-
diff --git a/jtsio/test/com/vividsolutions/jts/io/gml2/StaticMultiLineStringTest.java b/jtsio/test/com/vividsolutions/jts/io/gml2/StaticMultiLineStringTest.java
deleted file mode 100644
index fc07a19..0000000
--- a/jtsio/test/com/vividsolutions/jts/io/gml2/StaticMultiLineStringTest.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jts.io.gml2;
-
-import java.io.IOException;
-
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.xml.sax.SAXException;
-
-import com.vividsolutions.jts.generator.LineStringGenerator;
-import com.vividsolutions.jts.generator.MultiGenerator;
-import com.vividsolutions.jts.geom.Envelope;
-import com.vividsolutions.jts.geom.MultiLineString;
-
-/**
- * 
- * Does round trip testing by creating the oracle object, then decoding it. 
- * 
- * These tests do not include insert / delete / select operations.
- * 
- * NOTE: This test does require a precision to be used during the comparison, 
- * as points are rounded somewhat when creating the oracle struct. 
- * (One less decimal than a java double).
- *
- * @author David Zwiers, Vivid Solutions. 
- */
-public class StaticMultiLineStringTest extends WritingTestCase {
-
-	/**
-	 * @param arg
-	 */
-	public StaticMultiLineStringTest(String arg) {
-		super(arg);
-	}
-
-	/**
-	 * Round Trip test for a single line string
-	 * @throws ParserConfigurationException 
-	 * @throws IOException 
-	 * @throws SAXException 
-	 */
-	public void testSingleMultiLineStringRoundTrip() throws SAXException, IOException, ParserConfigurationException{
-		LineStringGenerator pgc = new LineStringGenerator();
-		pgc.setGeometryFactory(geometryFactory);
-		pgc.setNumberPoints(10);
-		MultiGenerator pg = new MultiGenerator(pgc);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberGeometries(3);
-		pg.setGeometryFactory(geometryFactory);
-		
-		MultiLineString pt = (MultiLineString) pg.create();
-
-		GMLWriter out = new GMLWriter();
-		out.setPrefix(null);
-		out.write(pt,getWriter());
-		
-		GMLReader in = new GMLReader();
-		MultiLineString pt2 = (MultiLineString) in.read(getReader(),geometryFactory);
-		
-//		System.out.println((pt==null?"NULL":pt.toString()));
-//		System.out.println((pt2==null?"NULL":pt2.toString()));
-		assertTrue("The input MultiLineString is not the same as the output MultiLineString",pt.equals(pt2));
-	}
-
-	/**
-	 * Round Trip test for a single line string with lotsa points
-	 * @throws IOException 
-	 * @throws ParserConfigurationException 
-	 * @throws SAXException 
-	 */
-	public void testSingleMultiLineStringManyPointRoundTrip() throws IOException, SAXException, ParserConfigurationException{
-
-		LineStringGenerator pgc = new LineStringGenerator();
-		pgc.setGeometryFactory(geometryFactory);
-		pgc.setNumberPoints(1000);
-		pgc.setGenerationAlgorithm(LineStringGenerator.HORZ);
-		MultiGenerator pg = new MultiGenerator(pgc);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberGeometries(3);
-		pg.setGeometryFactory(geometryFactory);
-		
-		MultiLineString pt = (MultiLineString) pg.create();
-//		System.out.println((pt==null?"NULL":pt.toString()));
-
-
-		GMLWriter out = new GMLWriter();
-		out.setPrefix(null);
-		out.write(pt,getWriter());
-		
-		GMLReader in = new GMLReader();
-		MultiLineString pt2 = (MultiLineString) in.read(getReader(),geometryFactory);
-
-//		System.out.println((pt==null?"NULL":pt.toString()));
-//		System.out.println((pt2==null?"NULL":pt2.toString()));
-		assertTrue("The input MultiLineString is not the same as the output MultiLineString",pt.equals(pt2));
-	}
-}
diff --git a/jtsio/test/com/vividsolutions/jts/io/gml2/StaticMultiPointTest.java b/jtsio/test/com/vividsolutions/jts/io/gml2/StaticMultiPointTest.java
deleted file mode 100644
index 1beabc7..0000000
--- a/jtsio/test/com/vividsolutions/jts/io/gml2/StaticMultiPointTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jts.io.gml2;
-
-import java.io.IOException;
-
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.xml.sax.SAXException;
-
-import com.vividsolutions.jts.generator.MultiGenerator;
-import com.vividsolutions.jts.generator.PointGenerator;
-import com.vividsolutions.jts.geom.Envelope;
-import com.vividsolutions.jts.geom.MultiPoint;
-
-/**
- * 
- * Does round trip testing by creating the oracle object, then decoding it. 
- * 
- * These tests do not include insert / delete / select operations.
- *
- * @author David Zwiers, Vivid Solutions. 
- */
-public class StaticMultiPointTest extends WritingTestCase {
-
-	/**
-	 * @param arg
-	 */
-	public StaticMultiPointTest(String arg) {
-		super(arg);
-	}
-
-	/**
-	 * Round Trip test for a single MultiPoint
-	 * @throws ParserConfigurationException 
-	 * @throws IOException 
-	 * @throws SAXException 
-	 */
-	public void testSingleMultiPointRoundTrip() throws SAXException, IOException, ParserConfigurationException{
-		PointGenerator pgc = new PointGenerator();
-		pgc.setGeometryFactory(geometryFactory);
-		MultiGenerator pg = new MultiGenerator(pgc);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberGeometries(3);
-		pg.setGeometryFactory(geometryFactory);
-		
-		MultiPoint pt = (MultiPoint) pg.create();
-
-		GMLWriter out = new GMLWriter();
-		out.setPrefix(null);
-		out.write(pt,getWriter());
-		
-		GMLReader in = new GMLReader();
-		MultiPoint pt2 = (MultiPoint) in.read(getReader(),geometryFactory);
-
-//		System.out.println((pt==null?"NULL":pt.toString()));
-//		System.out.println((pt2==null?"NULL":pt2.toString()));
-		assertTrue("The input MultiPoint is not the same as the output MultiPoint",pt.equals(pt2));
-	}
-}
diff --git a/jtsio/test/com/vividsolutions/jts/io/gml2/StaticMultiPolygonTest.java b/jtsio/test/com/vividsolutions/jts/io/gml2/StaticMultiPolygonTest.java
deleted file mode 100644
index 2c77d92..0000000
--- a/jtsio/test/com/vividsolutions/jts/io/gml2/StaticMultiPolygonTest.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jts.io.gml2;
-
-import java.io.IOException;
-
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.xml.sax.SAXException;
-
-import com.vividsolutions.jts.generator.MultiGenerator;
-import com.vividsolutions.jts.generator.PolygonGenerator;
-import com.vividsolutions.jts.geom.Envelope;
-import com.vividsolutions.jts.geom.MultiPolygon;
-
-/**
- * 
- * Does round trip testing by creating the oracle object, then decoding it. 
- * 
- * These tests do not include insert / delete / select operations.
- * 
- * NOTE: This test does require a precision to be used during the comparison, 
- * as points are rounded somewhat when creating the oracle struct. 
- * (One less decimal than a java double).
- * 
- * NOTE: The points may be re-ordered during these tests. 
- *
- * @author David Zwiers, Vivid Solutions. 
- */
-public class StaticMultiPolygonTest extends WritingTestCase {
-
-	/**
-	 * @param arg
-	 */
-	public StaticMultiPolygonTest(String arg) {
-		super(arg);
-	}
-
-	/**
-	 * Round Trip test for a single MultiPolygon
-	 * @throws ParserConfigurationException 
-	 * @throws IOException 
-	 * @throws SAXException 
-	 */
-	public void testSingleMultiPolygonNoHoleRoundTrip() throws SAXException, IOException, ParserConfigurationException{
-		PolygonGenerator pgc = new PolygonGenerator();
-		pgc.setGeometryFactory(geometryFactory);
-		pgc.setNumberPoints(10);
-		MultiGenerator pg = new MultiGenerator(pgc);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberGeometries(3);
-		pg.setGeometryFactory(geometryFactory);
-		
-		MultiPolygon pt = (MultiPolygon) pg.create();
-
-		GMLWriter out = new GMLWriter();
-		out.setPrefix(null);
-		out.write(pt,getWriter());
-		
-		GMLReader in = new GMLReader();
-		MultiPolygon pt2 = (MultiPolygon) in.read(getReader(),geometryFactory);
-		
-//		System.out.println((pt==null?"NULL":pt.toString()));
-//		System.out.println((pt2==null?"NULL":pt2.toString()));
-		assertTrue("The input MultiPolygon is not the same as the output MultiPolygon",pt.equals(pt2));
-	}
-
-	/**
-	 * Round Trip test for a single MultiPolygon with lotsa points
-	 * @throws ParserConfigurationException 
-	 * @throws IOException 
-	 * @throws SAXException 
-	 */
-	public void testSingleMultiPolygonManyPointsNoHoleRoundTrip() throws SAXException, IOException, ParserConfigurationException{
-
-		PolygonGenerator pgc = new PolygonGenerator();
-		pgc.setGeometryFactory(geometryFactory);
-		pgc.setGenerationAlgorithm(PolygonGenerator.BOX);
-		pgc.setNumberPoints(1000);
-		MultiGenerator pg = new MultiGenerator(pgc);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberGeometries(3);
-		pg.setGeometryFactory(geometryFactory);
-		
-		MultiPolygon pt = (MultiPolygon) pg.create();
-
-		GMLWriter out = new GMLWriter();
-		out.setPrefix(null);
-		out.write(pt,getWriter());
-		
-		GMLReader in = new GMLReader();
-		MultiPolygon pt2 = (MultiPolygon) in.read(getReader(),geometryFactory);
-
-//		System.out.println((pt==null?"NULL":pt.toString()));
-//		System.out.println((pt2==null?"NULL":pt2.toString()));
-		assertTrue("The input MultiPolygon is not the same as the output MultiPolygon",pt.equals(pt2));
-	}
-
-	/**
-	 * Round Trip test for a single MultiPolygon
-	 * @throws ParserConfigurationException 
-	 * @throws IOException 
-	 * @throws SAXException 
-	 */
-	public void testSingleMultiPolygonHolesRoundTrip() throws SAXException, IOException, ParserConfigurationException{
-
-		PolygonGenerator pgc = new PolygonGenerator();
-		pgc.setGeometryFactory(geometryFactory);
-		pgc.setGenerationAlgorithm(PolygonGenerator.BOX);
-		pgc.setNumberPoints(10);
-		pgc.setNumberHoles(4);
-		MultiGenerator pg = new MultiGenerator(pgc);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberGeometries(3);
-		pg.setGeometryFactory(geometryFactory);
-		
-		MultiPolygon pt = (MultiPolygon) pg.create();
-
-		GMLWriter out = new GMLWriter();
-		out.setPrefix(null);
-		out.write(pt,getWriter());
-		
-		GMLReader in = new GMLReader();
-		MultiPolygon pt2 = (MultiPolygon) in.read(getReader(),geometryFactory);
-		
-//		System.out.println((pt==null?"NULL":pt.toString()));
-//		System.out.println((pt2==null?"NULL":pt2.toString()));
-		assertTrue("The input MultiPolygon is not the same as the output MultiPolygon",pt.equals(pt2));
-	}
-
-	/**
-	 * Round Trip test for a single MultiPolygon with lotsa points
-	 * @throws ParserConfigurationException 
-	 * @throws IOException 
-	 * @throws SAXException 
-	 */
-	public void testSingleMultiPolygonManyPointsHolesRoundTrip() throws SAXException, IOException, ParserConfigurationException{
-
-		PolygonGenerator pgc = new PolygonGenerator();
-		pgc.setGeometryFactory(geometryFactory);
-		pgc.setGenerationAlgorithm(PolygonGenerator.BOX);
-		pgc.setNumberPoints(1000);
-		pgc.setNumberHoles(4);
-		MultiGenerator pg = new MultiGenerator(pgc);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberGeometries(3);
-		pg.setGeometryFactory(geometryFactory);
-		
-		MultiPolygon pt = (MultiPolygon) pg.create();
-//		System.out.println((pt==null?"NULL":pt.toString()));
-
-		GMLWriter out = new GMLWriter();
-		out.setPrefix(null);
-		out.write(pt,getWriter());
-		
-		GMLReader in = new GMLReader();
-		MultiPolygon pt2 = (MultiPolygon) in.read(getReader(),geometryFactory);
-
-//		System.out.println((pt==null?"NULL":pt.toString()));
-//		System.out.println((pt2==null?"NULL":pt2.toString()));
-		assertTrue("The input MultiPolygon is not the same as the output MultiPolygon",pt.equals(pt2));
-	}
-
-	/**
-	 * Round Trip test for a single MultiPolygon with lotsa points
-	 * @throws ParserConfigurationException 
-	 * @throws IOException 
-	 * @throws SAXException 
-	 */
-	public void testSingleMultiPolygonManyPointsManyHolesRoundTrip() throws SAXException, IOException, ParserConfigurationException{
-
-		PolygonGenerator pgc = new PolygonGenerator();
-		pgc.setGeometryFactory(geometryFactory);
-		pgc.setGenerationAlgorithm(PolygonGenerator.BOX);
-		pgc.setNumberPoints(100);
-		pgc.setNumberHoles(100);
-		MultiGenerator pg = new MultiGenerator(pgc);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberGeometries(3);
-		pg.setGeometryFactory(geometryFactory);
-		
-		MultiPolygon pt = (MultiPolygon) pg.create();
-//		System.out.println((pt==null?"NULL":pt.toString()));
-
-		GMLWriter out = new GMLWriter();
-		out.setPrefix(null);
-		out.write(pt,getWriter());
-		
-		GMLReader in = new GMLReader();
-		MultiPolygon pt2 = (MultiPolygon) in.read(getReader(),geometryFactory);
-
-//		System.out.println((pt==null?"NULL":pt.toString()));
-//		System.out.println((pt2==null?"NULL":pt2.toString()));
-		assertTrue("The input MultiPolygon is not the same as the output MultiPolygon",pt.equals(pt2));
-	}
-}
diff --git a/jtsio/test/com/vividsolutions/jts/io/gml2/StaticPointTest.java b/jtsio/test/com/vividsolutions/jts/io/gml2/StaticPointTest.java
deleted file mode 100644
index 1759b5a..0000000
--- a/jtsio/test/com/vividsolutions/jts/io/gml2/StaticPointTest.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jts.io.gml2;
-
-import java.io.IOException;
-
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.xml.sax.SAXException;
-
-import com.vividsolutions.jts.generator.PointGenerator;
-import com.vividsolutions.jts.geom.Envelope;
-import com.vividsolutions.jts.geom.Point;
-
-/**
- * 
- * Does round trip testing by creating the oracle object, then decoding it. 
- * 
- * These tests do not include insert / delete / select operations.
- *
- * @author David Zwiers, Vivid Solutions. 
- */
-public class StaticPointTest extends WritingTestCase {
-
-	/**
-	 * @param arg
-	 */
-	public StaticPointTest(String arg) {
-		super(arg);
-	}
-
-	/**
-	 * Round Trip test for a single point
-	 * @throws ParserConfigurationException 
-	 * @throws IOException 
-	 * @throws SAXException 
-	 */
-	public void testSinglePointRoundTrip() throws SAXException, IOException, ParserConfigurationException{
-		PointGenerator pg = new PointGenerator();
-		pg.setGeometryFactory(geometryFactory);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		
-		Point pt = (Point) pg.create();
-
-		GMLWriter out = new GMLWriter();
-		out.setPrefix(null);
-		out.write(pt,getWriter());
-		
-		GMLReader in = new GMLReader();
-		Point pt2 = (Point) in.read(getReader(),geometryFactory);
-
-//		System.out.println((pt==null?"NULL":pt.toString()));
-//		System.out.println((pt2==null?"NULL":pt2.toString()));
-		assertTrue("The input Point is not the same as the output Point",pt.equals(pt2));
-	}
-}
diff --git a/jtsio/test/com/vividsolutions/jts/io/gml2/StaticPolygonTest.java b/jtsio/test/com/vividsolutions/jts/io/gml2/StaticPolygonTest.java
deleted file mode 100644
index c1cd3da..0000000
--- a/jtsio/test/com/vividsolutions/jts/io/gml2/StaticPolygonTest.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jts.io.gml2;
-
-import java.io.IOException;
-
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.xml.sax.SAXException;
-
-import com.vividsolutions.jts.generator.PolygonGenerator;
-import com.vividsolutions.jts.geom.Envelope;
-import com.vividsolutions.jts.geom.Polygon;
-
-/**
- * 
- * Does round trip testing by creating the oracle object, then decoding it. 
- * 
- * These tests do not include insert / delete / select operations.
- * 
- * NOTE: This test does require a precision to be used during the comparison, 
- * as points are rounded somewhat when creating the oracle struct. 
- * (One less decimal than a java double).
- * 
- * NOTE: The points may be re-ordered during these tests. 
- *
- * @author David Zwiers, Vivid Solutions. 
- */
-public class StaticPolygonTest extends WritingTestCase {
-
-	/**
-	 * @param arg
-	 */
-	public StaticPolygonTest(String arg) {
-		super(arg);
-	}
-
-	/**
-	 * Round Trip test for a single polygon
-	 * @throws IOException 
-	 * @throws ParserConfigurationException 
-	 * @throws SAXException 
-	 */
-	public void testSinglePolygonNoHoleRoundTrip() throws IOException, SAXException, ParserConfigurationException{
-		PolygonGenerator pg = new PolygonGenerator();
-		pg.setGeometryFactory(geometryFactory);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberPoints(10);
-		
-		Polygon pt = (Polygon) pg.create();
-		
-		GMLWriter out = new GMLWriter();
-		out.setPrefix("");
-		out.write(pt,getWriter());
-		
-		GMLReader in = new GMLReader();
-		Polygon pt2 = (Polygon) in.read(getReader(),geometryFactory);
-		
-		assertTrue("The input polygon is not the same as the output polygon",pt.equals(pt2));
-	}
-
-	/**
-	 * Round Trip test for a single polygon with lotsa points
-	 * @throws IOException 
-	 * @throws ParserConfigurationException 
-	 * @throws SAXException 
-	 */
-	public void testSinglePolygonManyPointsNoHoleRoundTrip() throws IOException, SAXException, ParserConfigurationException{
-		PolygonGenerator pg = new PolygonGenerator();
-		pg.setGeometryFactory(geometryFactory);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setGenerationAlgorithm(PolygonGenerator.BOX);
-		pg.setNumberPoints(1000);
-		
-		Polygon pt = (Polygon) pg.create();
-
-		GMLWriter out = new GMLWriter();
-		out.setPrefix("");
-		out.write(pt,getWriter());
-		
-		GMLReader in = new GMLReader();
-		Polygon pt2 = (Polygon) in.read(getReader(),geometryFactory);
-
-		assertTrue("The input polygon is not the same as the output polygon",pt.equals(pt2));
-	}
-
-	/**
-	 * Round Trip test for a single polygon
-	 * @throws ParserConfigurationException 
-	 * @throws IOException 
-	 * @throws SAXException 
-	 */
-	public void testSinglePolygonHolesRoundTrip() throws SAXException, IOException, ParserConfigurationException{
-		PolygonGenerator pg = new PolygonGenerator();
-		pg.setGeometryFactory(geometryFactory);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberPoints(10);
-		pg.setNumberHoles(4);
-		
-		Polygon pt = (Polygon) pg.create();
-
-		GMLWriter out = new GMLWriter();
-		out.setPrefix("");
-		out.write(pt,getWriter());
-		
-		GMLReader in = new GMLReader();
-		Polygon pt2 = (Polygon) in.read(getReader(),geometryFactory);
-		
-//		System.out.println(pt);
-//		System.out.println(pt2);
-		assertTrue("The input polygon is not the same as the output polygon",pt.equals(pt2));
-	}
-
-	/**
-	 * Round Trip test for a single polygon with lotsa points
-	 * @throws ParserConfigurationException 
-	 * @throws IOException 
-	 * @throws SAXException 
-	 */
-	public void testSinglePolygonManyPointsHolesRoundTrip() throws SAXException, IOException, ParserConfigurationException{
-		PolygonGenerator pg = new PolygonGenerator();
-		pg.setGeometryFactory(geometryFactory);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setGenerationAlgorithm(PolygonGenerator.BOX);
-		pg.setNumberPoints(1000);
-		pg.setNumberHoles(4);
-		
-		Polygon pt = (Polygon) pg.create();
-
-		GMLWriter out = new GMLWriter();
-		out.setPrefix("");
-		out.write(pt,getWriter());
-		
-		GMLReader in = new GMLReader();
-		Polygon pt2 = (Polygon) in.read(getReader(),geometryFactory);
-
-		assertTrue("The input polygon is not the same as the output polygon",pt.equals(pt2));
-	}
-
-	/**
-	 * Round Trip test for a single polygon with lotsa points
-	 * @throws ParserConfigurationException 
-	 * @throws IOException 
-	 * @throws SAXException 
-	 */
-	public void testSinglePolygonManyPointsManyHolesRoundTrip() throws SAXException, IOException, ParserConfigurationException{
-		PolygonGenerator pg = new PolygonGenerator();
-		pg.setGeometryFactory(geometryFactory);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setGenerationAlgorithm(PolygonGenerator.BOX);
-		pg.setNumberPoints(100);
-		pg.setNumberHoles(100);
-		
-		Polygon pt = (Polygon) pg.create();
-
-		GMLWriter out = new GMLWriter();
-		out.setPrefix("");
-		out.write(pt,getWriter());
-		
-		GMLReader in = new GMLReader();
-		Polygon pt2 = (Polygon) in.read(getReader(),geometryFactory);
-
-		assertTrue("The input polygon is not the same as the output polygon",pt.equals(pt2));
-	}
-}
diff --git a/jtsio/test/com/vividsolutions/jts/io/gml2/WritingTestCase.java b/jtsio/test/com/vividsolutions/jts/io/gml2/WritingTestCase.java
deleted file mode 100644
index b3f54fa..0000000
--- a/jtsio/test/com/vividsolutions/jts/io/gml2/WritingTestCase.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jts.io.gml2;
-
-import java.io.*;
-
-import com.vividsolutions.jts.geom.GeometryFactory;
-import com.vividsolutions.jts.geom.PrecisionModel;
-
-import junit.framework.TestCase;
-
-/**
- * 
- * Abstract Test Case. Intended to provide some IO operations for the middle of a test.
- * 
- *
- * @author David Zwiers, Vivid Solutions. 
- */
-public class WritingTestCase extends TestCase {
-	
-	/**
-	 * @param arg
-	 */
-	public WritingTestCase(String arg){
-		super(arg);
-	}
-	
-	protected StringWriter sw = null;
-	protected Writer getWriter(){
-		sw = new StringWriter();
-		sw.write("<?xml version='1.0' encoding='UTF-8'?>\n");
-		return sw;
-	}
-	protected Reader getReader() throws IOException{
-		sw.flush();
-		sw.close();
-		String s = sw.toString();
-		
-//		System.out.println(s);
-		
-		return new StringReader(s);
-	}
-	
-	protected static PrecisionModel precisionModel = new PrecisionModel(1000);
-	protected static GeometryFactory geometryFactory = new GeometryFactory(precisionModel);
-
-}
diff --git a/jtsio/test/com/vividsolutions/jts/io/gml2/geometry.xsd b/jtsio/test/com/vividsolutions/jts/io/gml2/geometry.xsd
deleted file mode 100644
index 4a857a8..0000000
--- a/jtsio/test/com/vividsolutions/jts/io/gml2/geometry.xsd
+++ /dev/null
@@ -1,349 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<schema targetNamespace="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="2.1.2">
-  <annotation>
-    <appinfo>geometry.xsd v2.1.2 2002-07</appinfo>
-    <documentation xml:lang="en">
-      GML Geometry schema. Copyright (c) 2001,2002 OGC, All Rights Reserved.
-    </documentation>
-  </annotation>
-  <!-- bring in the XLink attributes -->
-  <import namespace="http://www.w3.org/1999/xlink" schemaLocation="xlinks.xsd"/>
-  <!-- ==============================================================
-       global declarations
-  =================================================================== -->
-  <element name="_Geometry" type="gml:AbstractGeometryType" abstract="true"/>
-  <element name="_GeometryCollection" type="gml:GeometryCollectionType" abstract="true" substitutionGroup="gml:_Geometry"/>
-  <element name="geometryMember" type="gml:GeometryAssociationType"/>
-  <element name="pointMember" type="gml:PointMemberType" substitutionGroup="gml:geometryMember"/>
-  <element name="lineStringMember" type="gml:LineStringMemberType" substitutionGroup="gml:geometryMember"/>
-  <element name="polygonMember" type="gml:PolygonMemberType" substitutionGroup="gml:geometryMember"/>
-  <element name="outerBoundaryIs" type="gml:LinearRingMemberType"/>
-  <element name="innerBoundaryIs" type="gml:LinearRingMemberType"/>
-  <!-- primitive geometry elements -->
-  <element name="Point" type="gml:PointType" substitutionGroup="gml:_Geometry"/>
-  <element name="LineString" type="gml:LineStringType" substitutionGroup="gml:_Geometry"/>
-  <element name="LinearRing" type="gml:LinearRingType" substitutionGroup="gml:_Geometry"/>
-  <element name="Polygon" type="gml:PolygonType" substitutionGroup="gml:_Geometry"/>
-  <element name="Box" type="gml:BoxType"/>
-  <!-- aggregate geometry elements -->
-  <element name="MultiGeometry" type="gml:GeometryCollectionType" substitutionGroup="gml:_Geometry"/>
-  <element name="MultiPoint" type="gml:MultiPointType" substitutionGroup="gml:_Geometry"/>
-  <element name="MultiLineString" type="gml:MultiLineStringType" substitutionGroup="gml:_Geometry"/>
-  <element name="MultiPolygon" type="gml:MultiPolygonType" substitutionGroup="gml:_Geometry"/>
-  <!-- coordinate elements -->
-  <element name="coord" type="gml:CoordType"/>
-  <element name="coordinates" type="gml:CoordinatesType"/>
-  <!-- this attribute gives the location where an element is defined -->
-  <attribute name="remoteSchema" type="anyURI"/>
-  <!-- ==============================================================
-       abstract supertypes
-  =================================================================== -->
-  <complexType name="AbstractGeometryType" abstract="true">
-    <annotation>
-      <documentation>
-        All geometry elements are derived from this abstract supertype; 
-        a geometry element may have an identifying attribute (gid). 
-        It may be associated with a spatial reference system.
-      </documentation>
-    </annotation>
-    <complexContent>
-      <restriction base="anyType">
-        <attribute name="gid" type="ID" use="optional"/>
-        <attribute name="srsName" type="anyURI" use="optional"/>
-      </restriction>
-    </complexContent>
-  </complexType>
-  <complexType name="AbstractGeometryCollectionBaseType" abstract="true">
-    <annotation>
-      <documentation>
-        This abstract base type for geometry collections just makes the 
-        srsName attribute mandatory.
-      </documentation>
-    </annotation>
-    <complexContent>
-      <restriction base="gml:AbstractGeometryType">
-        <attribute name="gid" type="ID" use="optional"/>
-        <attribute name="srsName" type="anyURI" use="required"/>
-      </restriction>
-    </complexContent>
-  </complexType>
-  <attributeGroup name="AssociationAttributeGroup">
-    <annotation>
-      <documentation>
-        These attributes can be attached to any element, thus allowing it 
-        to act as a pointer. The 'remoteSchema' attribute allows an element 
-        that carries link attributes to indicate that the element is declared 
-        in a remote schema rather than by the schema that constrains the 
-        current document instance.  
-      </documentation>
-    </annotation>
-    <attributeGroup ref="xlink:simpleLink"/>
-    <attribute ref="gml:remoteSchema" use="optional"/>
-  </attributeGroup>
-  <complexType name="GeometryAssociationType">
-    <annotation>
-      <documentation>
-        An instance of this type (e.g. a geometryMember) can either 
-        enclose or point to a primitive geometry element. When serving 
-        as a simple link that references a remote geometry instance, 
-        the value of the gml:remoteSchema attribute can be used to 
-        locate a schema fragment that constrains the target instance.
-      </documentation>
-    </annotation>
-    <sequence minOccurs="0">
-      <element ref="gml:_Geometry"/>
-    </sequence>
-    <!-- <attributeGroup ref="gml:AssociationAttributeGroup"/> -->
-    <attributeGroup ref="xlink:simpleLink"/>
-    <attribute ref="gml:remoteSchema" use="optional"/>
-  </complexType>
-  <complexType name="PointMemberType">
-    <annotation>
-      <documentation>Restricts the geometry member to being a Point instance.</documentation>
-    </annotation>
-    <complexContent>
-      <restriction base="gml:GeometryAssociationType">
-        <sequence minOccurs="0">
-          <element ref="gml:Point"/>
-        </sequence>
-        <attributeGroup ref="gml:AssociationAttributeGroup"/>
-      </restriction>
-    </complexContent>
-  </complexType>
-  <complexType name="LineStringMemberType">
-    <annotation>
-      <documentation>Restricts the geometry member to being a LineString instance.</documentation>
-    </annotation>
-    <complexContent>
-      <restriction base="gml:GeometryAssociationType">
-        <sequence minOccurs="0">
-          <element ref="gml:LineString"/>
-        </sequence>
-        <attributeGroup ref="gml:AssociationAttributeGroup"/>
-      </restriction>
-    </complexContent>
-  </complexType>
-  <complexType name="PolygonMemberType">
-    <annotation>
-      <documentation>Restricts the geometry member to being a Polygon instance.</documentation>
-    </annotation>
-    <complexContent>
-      <restriction base="gml:GeometryAssociationType">
-        <sequence minOccurs="0">
-          <element ref="gml:Polygon"/>
-        </sequence>
-        <attributeGroup ref="gml:AssociationAttributeGroup"/>
-      </restriction>
-    </complexContent>
-  </complexType>
-  <complexType name="LinearRingMemberType">
-    <annotation>
-      <documentation>Restricts the outer or inner boundary of a polygon instance 
-			to being a LinearRing.</documentation>
-    </annotation>
-    <complexContent>
-      <restriction base="gml:GeometryAssociationType">
-        <sequence minOccurs="0">
-          <element ref="gml:LinearRing"/>
-        </sequence>
-        <attributeGroup ref="gml:AssociationAttributeGroup"/>
-      </restriction>
-    </complexContent>
-  </complexType>
-  <!-- ==============================================================
-       primitive geometry types
-  =================================================================== -->
-  <complexType name="PointType">
-    <annotation>
-      <documentation>
-        A Point is defined by a single coordinate tuple.
-      </documentation>
-    </annotation>
-    <complexContent>
-      <extension base="gml:AbstractGeometryType">
-        <sequence>
-          <choice>
-            <element ref="gml:coord"/>
-            <element ref="gml:coordinates"/>
-          </choice>
-        </sequence>
-      </extension>
-    </complexContent>
-  </complexType>
-  <complexType name="LineStringType">
-    <annotation>
-      <documentation>
-        A LineString is defined by two or more coordinate tuples, with 
-        linear interpolation between them. 
-      </documentation>
-    </annotation>
-    <complexContent>
-      <extension base="gml:AbstractGeometryType">
-        <sequence>
-          <choice>
-            <element ref="gml:coord" minOccurs="2" maxOccurs="unbounded"/>
-            <element ref="gml:coordinates"/>
-          </choice>
-        </sequence>
-      </extension>
-    </complexContent>
-  </complexType>
-  <complexType name="LinearRingType">
-    <annotation>
-      <documentation>
-        A LinearRing is defined by four or more coordinate tuples, with 
-        linear interpolation between them; the first and last coordinates 
-        must be coincident.
-      </documentation>
-    </annotation>
-    <complexContent>
-      <extension base="gml:AbstractGeometryType">
-        <sequence>
-          <choice>
-            <element ref="gml:coord" minOccurs="4" maxOccurs="unbounded"/>
-            <element ref="gml:coordinates"/>
-          </choice>
-        </sequence>
-      </extension>
-    </complexContent>
-  </complexType>
-  <complexType name="BoxType">
-    <annotation>
-      <documentation>
-        The Box structure defines an extent using a pair of coordinate tuples.
-      </documentation>
-    </annotation>
-    <complexContent>
-      <extension base="gml:AbstractGeometryType">
-        <sequence>
-          <choice>
-            <element ref="gml:coord" minOccurs="2" maxOccurs="2"/>
-            <element ref="gml:coordinates"/>
-          </choice>
-        </sequence>
-      </extension>
-    </complexContent>
-  </complexType>
-  <complexType name="PolygonType">
-    <annotation>
-      <documentation>
-        A Polygon is defined by an outer boundary and zero or more inner 
-        boundaries which are in turn defined by LinearRings.
-      </documentation>
-    </annotation>
-    <complexContent>
-      <extension base="gml:AbstractGeometryType">
-        <sequence>
-          <element ref="gml:outerBoundaryIs"/>
-          <element ref="gml:innerBoundaryIs" minOccurs="0" maxOccurs="unbounded"/>
-        </sequence>
-      </extension>
-    </complexContent>
-  </complexType>
-  <!-- ==============================================================
-       aggregate geometry types
-  =================================================================== -->
-  <complexType name="GeometryCollectionType">
-    <annotation>
-      <documentation>
-        A geometry collection must include one or more geometries, referenced 
-        through geometryMember elements. User-defined geometry collections 
-        that accept GML geometry classes as members must instantiate--or 
-        derive from--this type.
-      </documentation>
-    </annotation>
-    <complexContent>
-      <extension base="gml:AbstractGeometryCollectionBaseType">
-        <sequence>
-          <element ref="gml:geometryMember" maxOccurs="unbounded"/>
-        </sequence>
-      </extension>
-    </complexContent>
-  </complexType>
-  <complexType name="MultiPointType">
-    <annotation>
-      <documentation>
-        A MultiPoint is defined by one or more Points, referenced through 
-        pointMember elements.
-      </documentation>
-    </annotation>
-    <complexContent>
-      <restriction base="gml:GeometryCollectionType">
-        <sequence>
-          <element ref="gml:pointMember" maxOccurs="unbounded"/>
-        </sequence>
-        <attribute name="gid" type="ID" use="optional"/>
-        <attribute name="srsName" type="anyURI" use="required"/>
-      </restriction>
-    </complexContent>
-  </complexType>
-  <complexType name="MultiLineStringType">
-    <annotation>
-      <documentation>
-        A MultiLineString is defined by one or more LineStrings, referenced 
-        through lineStringMember elements.
-      </documentation>
-    </annotation>
-    <complexContent>
-      <restriction base="gml:GeometryCollectionType">
-        <sequence>
-          <element ref="gml:lineStringMember" maxOccurs="unbounded"/>
-        </sequence>
-        <attribute name="gid" type="ID" use="optional"/>
-        <attribute name="srsName" type="anyURI" use="required"/>
-      </restriction>
-    </complexContent>
-  </complexType>
-  <complexType name="MultiPolygonType">
-    <annotation>
-      <documentation>
-        A MultiPolygon is defined by one or more Polygons, referenced through 
-        polygonMember elements. 
-      </documentation>
-    </annotation>
-    <complexContent>
-      <restriction base="gml:GeometryCollectionType">
-        <sequence>
-          <element ref="gml:polygonMember" maxOccurs="unbounded"/>
-        </sequence>
-        <attribute name="gid" type="ID" use="optional"/>
-        <attribute name="srsName" type="anyURI" use="required"/>
-      </restriction>
-    </complexContent>
-  </complexType>
-  <!-- ==============================================================
-       There are two ways to represent coordinates: (1) as a sequence 
-       of <coord> elements that encapsulate tuples, or (2) using a 
-       single <coordinates> string.
-  =================================================================== -->
-  <complexType name="CoordType">
-    <annotation>
-      <documentation>
-        Represents a coordinate tuple in one, two, or three dimensions.
-      </documentation>
-    </annotation>
-    <sequence>
-      <element name="X" type="decimal"/>
-      <element name="Y" type="decimal" minOccurs="0"/>
-      <element name="Z" type="decimal" minOccurs="0"/>
-    </sequence>
-  </complexType>
-  <complexType name="CoordinatesType">
-    <annotation>
-      <documentation>
-        Coordinates can be included in a single string, but there is no 
-        facility for validating string content. The value of the 'cs' attribute 
-        is the separator for coordinate values, and the value of the 'ts' 
-        attribute gives the tuple separator (a single space by default); the 
-        default values may be changed to reflect local usage.
-      </documentation>
-    </annotation>
-    <simpleContent>
-      <extension base="string">
-        <attribute name="decimal" type="string" use="optional" default="."/>
-        <attribute name="cs" type="string" use="optional" default=","/>
-        <attribute name="ts" type="string" use="optional" default="&#x20;"/>
-      </extension>
-    </simpleContent>
-  </complexType>
-</schema>
diff --git a/jtsio/test/com/vividsolutions/jts/io/oracle/ConnectedTestCase.java b/jtsio/test/com/vividsolutions/jts/io/oracle/ConnectedTestCase.java
deleted file mode 100644
index bc6d6a9..0000000
--- a/jtsio/test/com/vividsolutions/jts/io/oracle/ConnectedTestCase.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jts.io.oracle;
-
-import java.net.URL;
-import java.sql.*;
-import java.util.Properties;
-
-import com.vividsolutions.jts.geom.GeometryFactory;
-import com.vividsolutions.jts.geom.PrecisionModel;
-
-import oracle.jdbc.OracleConnection;
-import junit.framework.TestCase;
-
-/**
- * 
- * Abstract Test Case. Intended to provide a connection with which test may be performed.
- * 
- * Sub-classes should not assume that either the connection will always exist, or 
- * the connection has the required permissions.
- *
- * @author David Zwiers, Vivid Solutions. 
- */
-public class ConnectedTestCase extends TestCase {
-	
-	/**
-	 * @param arg
-	 */
-	public ConnectedTestCase(String arg){
-		super(arg);
-	}
-	
-	private OracleConnection connection = null;
-	
-	/**
-	 * Sub-classes should not assume that either the connection will always exist, or 
-	 * the connection has the required permissions.
-	 * 
-	 * @return OracleConnection
-	 */
-	protected OracleConnection getConnection(){
-		return connection;
-	}
-
-	/**
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		Properties props = new Properties();
-		URL path = ClassLoader.getSystemResource("com/vividsolutions/jts/io/oracle/connection.properties");
-		props.load(path.openStream());
-		
-		connection = getOracleConnection(props.getProperty("test.server"),props.getProperty("test.port"),
-				props.getProperty("test.sid"),props.getProperty("test.user"),props.getProperty("test.pwd"));
-	}
-
-    private static OracleConnection getOracleConnection(String server, String port, String sid, String userid, String pwd) throws SQLException {
-        String url       = "jdbc:oracle:thin:@"+server+":"+port+":"+sid;
-        return (OracleConnection)openConnection( "oracle.jdbc.driver.OracleDriver", url, userid, pwd );
-    }
-
-
-
-    private static Connection openConnection( String driver, String url, String uid, String pwd ) throws SQLException {
-
-        Connection conn  = null;
-        try {
-            Class.forName( driver );
-        } catch ( java.lang.ClassNotFoundException e ) {
-            fail( e.getMessage() );
-        }
-        conn = DriverManager.getConnection( url, uid, pwd );
-        return conn;
-    }
-
-	/**
-	 * @see junit.framework.TestCase#tearDown()
-	 */
-	protected void tearDown() throws Exception {
-		super.tearDown();
-		if(connection != null && !connection.isClosed())
-			connection.close();
-	}
-	
-	protected static PrecisionModel precisionModel = new PrecisionModel(1000);
-	protected static GeometryFactory geometryFactory = new GeometryFactory(precisionModel);
-
-}
diff --git a/jtsio/test/com/vividsolutions/jts/io/oracle/StaticLineStringTest.java b/jtsio/test/com/vividsolutions/jts/io/oracle/StaticLineStringTest.java
deleted file mode 100644
index b623989..0000000
--- a/jtsio/test/com/vividsolutions/jts/io/oracle/StaticLineStringTest.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jts.io.oracle;
-
-import java.sql.SQLException;
-
-import oracle.sql.STRUCT;
-
-import com.vividsolutions.jts.generator.*;
-import com.vividsolutions.jts.geom.*;
-
-/**
- * 
- * Does round trip testing by creating the oracle object, then decoding it. 
- * 
- * These tests do not include insert / delete / select operations.
- * 
- * NOTE: This test does require a precision to be used during the comparison, 
- * as points are rounded somewhat when creating the oracle struct. 
- * (One less decimal than a java double).
- *
- * @author David Zwiers, Vivid Solutions. 
- */
-public class StaticLineStringTest extends ConnectedTestCase {
-
-	/**
-	 * @param arg
-	 */
-	public StaticLineStringTest(String arg) {
-		super(arg);
-	}
-
-	/**
-	 * Round Trip test for a single line string
-	 * @throws SQLException 
-	 */
-	public void testSingleLineStringRoundTrip() throws SQLException{
-		LineStringGenerator pg = new LineStringGenerator();
-		pg.setGeometryFactory(geometryFactory);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberPoints(10);
-		
-		LineString pt = (LineString) pg.create();
-		
-		OraWriter ow = new OraWriter(getConnection());
-		STRUCT st = ow.write(pt);
-		
-		OraReader or = new OraReader();
-		LineString pt2 = (LineString) or.read(st);
-		
-//		System.out.println((pt==null?"NULL":pt.toString()));
-//		System.out.println((pt2==null?"NULL":pt2.toString()));
-		assertTrue("The input LineString is not the same as the output LineString",pt.equals(pt2));
-	}
-
-	/**
-	 * Round Trip test for a 100 non overlapping line strings
-	 * @throws SQLException 
-	 */
-	public void testGridLineStringsRoundTrip() throws SQLException{
-		GridGenerator grid = new GridGenerator();
-		grid.setGeometryFactory(geometryFactory);
-		grid.setBoundingBox(new Envelope(0,10,0,10));
-		grid.setNumberColumns(10);
-		grid.setNumberRows(10);
-		
-		LineString[] pt = new LineString[100];
-		STRUCT[] st = new STRUCT[100];
-
-		LineStringGenerator pg = new LineStringGenerator();
-		pg.setGeometryFactory(geometryFactory);
-		pg.setNumberPoints(10);
-		OraWriter ow = new OraWriter(getConnection());
-		
-		int i=0;
-		while(grid.canCreate() && i<100){
-			pg.setBoundingBox(grid.createEnv());
-			pt[i] = (LineString) pg.create();
-			st[i] = ow.write(pt[i]);
-			i++;
-		}
-		
-		OraReader or = new OraReader();
-		i=0;
-		while(i<100 && pt[i] != null){
-			LineString pt2 = (LineString) or.read(st[i]);
-//			System.out.println((pt[i]==null?"NULL":pt[i].toString()));
-//			System.out.println((pt2==null?"NULL":pt2.toString()));
-			assertTrue("The input LineString is not the same as the output LineString",pt[i].equals(pt2));
-			i++;
-		}
-	}
-
-	/**
-	 * Round Trip test for a 8 overlapping line strings (4 distinct line strings)
-	 * @throws SQLException 
-	 */
-	public void testOverlappingLineStringsRoundTrip() throws SQLException{
-		GridGenerator grid = new GridGenerator();
-		grid.setGeometryFactory(geometryFactory);
-		grid.setBoundingBox(new Envelope(0,10,0,10));
-		grid.setNumberColumns(2);
-		grid.setNumberRows(2);
-		
-		LineString[] pt = new LineString[4];
-		STRUCT[] st = new STRUCT[8];
-
-		LineStringGenerator pg = new LineStringGenerator();
-		pg.setGeometryFactory(geometryFactory);
-		pg.setNumberPoints(10);
-		OraWriter ow = new OraWriter(getConnection());
-		
-		int i=0;
-		while(grid.canCreate() && i<8){
-			pg.setBoundingBox(grid.createEnv());
-			pt[i] = (LineString) pg.create();
-			st[i] = ow.write(pt[i]);
-			i++;
-		}
-		for(int j=0;j<4;j++){
-			if(pt[j]!=null)
-				st[i++] = ow.write(pt[j]);
-		}
-		
-		OraReader or = new OraReader();
-		i=0;
-		while(i<8 && pt[i%4] != null){
-			LineString pt2 = (LineString) or.read(st[i]);
-//			System.out.println((pt==null?"NULL":pt[i%4].toString()));
-//			System.out.println((pt2==null?"NULL":pt2.toString()));
-			assertTrue("The input LineString is not the same as the output LineString",pt[i%4].equals(pt2));
-			i++;
-		}
-	}
-
-	/**
-	 * Round Trip test for a single line string with lotsa points
-	 * @throws SQLException 
-	 */
-	public void testSingleLineStringManyPointRoundTrip() throws SQLException{
-		LineStringGenerator pg = new LineStringGenerator();
-		pg.setGeometryFactory(geometryFactory);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setGenerationAlgorithm(LineStringGenerator.HORZ);
-		pg.setNumberPoints(1000);
-		
-		LineString pt = (LineString) pg.create();
-//		System.out.println((pt==null?"NULL":pt.toString()));
-		
-		OraWriter ow = new OraWriter(getConnection());
-		STRUCT st = ow.write(pt);
-		
-		OraReader or = new OraReader();
-		LineString pt2 = (LineString) or.read(st);
-
-//		System.out.println((pt==null?"NULL":pt.toString()));
-//		System.out.println((pt2==null?"NULL":pt2.toString()));
-		assertTrue("The input LineString is not the same as the output LineString",pt.equals(pt2));
-	}
-}
diff --git a/jtsio/test/com/vividsolutions/jts/io/oracle/StaticMultiLineStringTest.java b/jtsio/test/com/vividsolutions/jts/io/oracle/StaticMultiLineStringTest.java
deleted file mode 100644
index 74b674a..0000000
--- a/jtsio/test/com/vividsolutions/jts/io/oracle/StaticMultiLineStringTest.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jts.io.oracle;
-
-import java.sql.SQLException;
-
-import oracle.sql.STRUCT;
-
-import com.vividsolutions.jts.generator.*;
-import com.vividsolutions.jts.geom.*;
-
-/**
- * 
- * Does round trip testing by creating the oracle object, then decoding it. 
- * 
- * These tests do not include insert / delete / select operations.
- * 
- * NOTE: This test does require a precision to be used during the comparison, 
- * as points are rounded somewhat when creating the oracle struct. 
- * (One less decimal than a java double).
- *
- * @author David Zwiers, Vivid Solutions. 
- */
-public class StaticMultiLineStringTest extends ConnectedTestCase {
-
-	/**
-	 * @param arg
-	 */
-	public StaticMultiLineStringTest(String arg) {
-		super(arg);
-	}
-
-	/**
-	 * Round Trip test for a single line string
-	 * @throws SQLException 
-	 */
-	public void testSingleMultiLineStringRoundTrip() throws SQLException{
-		LineStringGenerator pgc = new LineStringGenerator();
-		pgc.setGeometryFactory(geometryFactory);
-		pgc.setNumberPoints(10);
-		MultiGenerator pg = new MultiGenerator(pgc);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberGeometries(3);
-		pg.setGeometryFactory(geometryFactory);
-		
-		MultiLineString pt = (MultiLineString) pg.create();
-		
-		OraWriter ow = new OraWriter(getConnection());
-		STRUCT st = ow.write(pt);
-		
-		OraReader or = new OraReader();
-		MultiLineString pt2 = (MultiLineString) or.read(st);
-		
-//		System.out.println((pt==null?"NULL":pt.toString()));
-//		System.out.println((pt2==null?"NULL":pt2.toString()));
-		assertTrue("The input MultiLineString is not the same as the output MultiLineString",pt.equals(pt2));
-	}
-
-	/**
-	 * Round Trip test for a 100 non overlapping line strings
-	 * @throws SQLException 
-	 */
-	public void testGridMultiLineStringsRoundTrip() throws SQLException{
-		GridGenerator grid = new GridGenerator();
-		grid.setGeometryFactory(geometryFactory);
-		grid.setBoundingBox(new Envelope(0,10,0,10));
-		grid.setNumberColumns(10);
-		grid.setNumberRows(10);
-		
-		MultiLineString[] pt = new MultiLineString[100];
-		STRUCT[] st = new STRUCT[100];
-
-		LineStringGenerator pgc = new LineStringGenerator();
-		pgc.setGeometryFactory(geometryFactory);
-		pgc.setNumberPoints(10);
-		MultiGenerator pg = new MultiGenerator(pgc);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberGeometries(3);
-		pg.setGeometryFactory(geometryFactory);
-		
-		OraWriter ow = new OraWriter(getConnection());
-		
-		int i=0;
-		while(grid.canCreate() && i<100){
-			pg.setBoundingBox(grid.createEnv());
-			pt[i] = (MultiLineString) pg.create();
-			st[i] = ow.write(pt[i]);
-			i++;
-		}
-		
-		OraReader or = new OraReader();
-		i=0;
-		while(i<100 && pt[i] != null){
-			MultiLineString pt2 = (MultiLineString) or.read(st[i]);
-//			System.out.println((pt[i]==null?"NULL":pt[i].toString()));
-//			System.out.println((pt2==null?"NULL":pt2.toString()));
-			assertTrue("The input MultiLineString is not the same as the output MultiLineString",pt[i].equals(pt2));
-			i++;
-		}
-	}
-
-	/**
-	 * Round Trip test for a 8 overlapping line strings (4 distinct line strings)
-	 * @throws SQLException 
-	 */
-	public void testOverlappingMultiLineStringsRoundTrip() throws SQLException{
-		GridGenerator grid = new GridGenerator();
-		grid.setGeometryFactory(geometryFactory);
-		grid.setBoundingBox(new Envelope(0,10,0,10));
-		grid.setNumberColumns(2);
-		grid.setNumberRows(2);
-		
-		MultiLineString[] pt = new MultiLineString[4];
-		STRUCT[] st = new STRUCT[8];
-
-		LineStringGenerator pgc = new LineStringGenerator();
-		pgc.setGeometryFactory(geometryFactory);
-		pgc.setNumberPoints(10);
-		MultiGenerator pg = new MultiGenerator(pgc);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberGeometries(3);
-		pg.setGeometryFactory(geometryFactory);
-		
-		OraWriter ow = new OraWriter(getConnection());
-		
-		int i=0;
-		while(grid.canCreate() && i<8){
-			pg.setBoundingBox(grid.createEnv());
-			pt[i] = (MultiLineString) pg.create();
-			st[i] = ow.write(pt[i]);
-			i++;
-		}
-		for(int j=0;j<4;j++){
-			if(pt[j]!=null)
-				st[i++] = ow.write(pt[j]);
-		}
-		
-		OraReader or = new OraReader();
-		i=0;
-		while(i<8 && pt[i%4] != null){
-			MultiLineString pt2 = (MultiLineString) or.read(st[i]);
-//			System.out.println((pt==null?"NULL":pt[i%4].toString()));
-//			System.out.println((pt2==null?"NULL":pt2.toString()));
-			assertTrue("The input MultiLineString is not the same as the output MultiLineString",pt[i%4].equals(pt2));
-			i++;
-		}
-	}
-
-	/**
-	 * Round Trip test for a single line string with lotsa points
-	 * @throws SQLException 
-	 */
-	public void testSingleMultiLineStringManyPointRoundTrip() throws SQLException{
-
-		LineStringGenerator pgc = new LineStringGenerator();
-		pgc.setGeometryFactory(geometryFactory);
-		pgc.setNumberPoints(1000);
-		pgc.setGenerationAlgorithm(LineStringGenerator.HORZ);
-		MultiGenerator pg = new MultiGenerator(pgc);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberGeometries(3);
-		pg.setGeometryFactory(geometryFactory);
-		
-		MultiLineString pt = (MultiLineString) pg.create();
-//		System.out.println((pt==null?"NULL":pt.toString()));
-		
-		OraWriter ow = new OraWriter(getConnection());
-		STRUCT st = ow.write(pt);
-		
-		OraReader or = new OraReader();
-		MultiLineString pt2 = (MultiLineString) or.read(st);
-
-//		System.out.println((pt==null?"NULL":pt.toString()));
-//		System.out.println((pt2==null?"NULL":pt2.toString()));
-		assertTrue("The input MultiLineString is not the same as the output MultiLineString",pt.equals(pt2));
-	}
-}
diff --git a/jtsio/test/com/vividsolutions/jts/io/oracle/StaticMultiPointTest.java b/jtsio/test/com/vividsolutions/jts/io/oracle/StaticMultiPointTest.java
deleted file mode 100644
index 6ca04f0..0000000
--- a/jtsio/test/com/vividsolutions/jts/io/oracle/StaticMultiPointTest.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jts.io.oracle;
-
-import java.sql.SQLException;
-
-import oracle.sql.STRUCT;
-
-import com.vividsolutions.jts.generator.*;
-import com.vividsolutions.jts.geom.*;
-
-/**
- * 
- * Does round trip testing by creating the oracle object, then decoding it. 
- * 
- * These tests do not include insert / delete / select operations.
- *
- * @author David Zwiers, Vivid Solutions. 
- */
-public class StaticMultiPointTest extends ConnectedTestCase {
-
-	/**
-	 * @param arg
-	 */
-	public StaticMultiPointTest(String arg) {
-		super(arg);
-	}
-
-	/**
-	 * Round Trip test for a single MultiPoint
-	 * @throws SQLException 
-	 */
-	public void testSingleMultiPointRoundTrip() throws SQLException{
-		PointGenerator pgc = new PointGenerator();
-		pgc.setGeometryFactory(geometryFactory);
-		MultiGenerator pg = new MultiGenerator(pgc);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberGeometries(3);
-		pg.setGeometryFactory(geometryFactory);
-		
-		MultiPoint pt = (MultiPoint) pg.create();
-		
-		OraWriter ow = new OraWriter(getConnection());
-		STRUCT st = ow.write(pt);
-		
-		OraReader or = new OraReader();
-		MultiPoint pt2 = (MultiPoint) or.read(st);
-
-//		System.out.println((pt==null?"NULL":pt.toString()));
-//		System.out.println((pt2==null?"NULL":pt2.toString()));
-		assertTrue("The input MultiPoint is not the same as the output MultiPoint",pt.equals(pt2));
-	}
-
-	/**
-	 * Round Trip test for a 100 non overlapping MultiPoints
-	 * @throws SQLException 
-	 */
-	public void testGridMultiPointsRoundTrip() throws SQLException{
-		GridGenerator grid = new GridGenerator();
-		grid.setGeometryFactory(geometryFactory);
-		grid.setBoundingBox(new Envelope(0,10,0,10));
-		grid.setNumberColumns(10);
-		grid.setNumberRows(10);
-		
-		MultiPoint[] pt = new MultiPoint[100];
-		STRUCT[] st = new STRUCT[100];
-
-		PointGenerator pgc = new PointGenerator();
-		pgc.setGeometryFactory(geometryFactory);
-		MultiGenerator pg = new MultiGenerator(pgc);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberGeometries(3);
-		pg.setGeometryFactory(geometryFactory);
-		
-		OraWriter ow = new OraWriter(getConnection());
-		
-		int i=0;
-		while(grid.canCreate() && i<100){
-			pg.setBoundingBox(grid.createEnv());
-			pt[i] = (MultiPoint) pg.create();
-			st[i] = ow.write(pt[i]);
-			i++;
-		}
-		
-		OraReader or = new OraReader();
-		i=0;
-		while(i<100 && pt[i] != null){
-			MultiPoint pt2 = (MultiPoint) or.read(st[i]);
-//			System.out.println((pt[i]==null?"NULL":pt[i].toString()));
-//			System.out.println((pt2==null?"NULL":pt2.toString()));
-			assertTrue("The input MultiPoint is not the same as the output MultiPoint",pt[i].equals(pt2));
-			i++;
-		}
-	}
-
-	/**
-	 * Round Trip test for a 8 overlapping MultiPoints (4 distinct MultiPoints)
-	 * @throws SQLException 
-	 */
-	public void testOverlappingMultiPointsRoundTrip() throws SQLException{
-		GridGenerator grid = new GridGenerator();
-		grid.setGeometryFactory(geometryFactory);
-		grid.setBoundingBox(new Envelope(0,10,0,10));
-		grid.setNumberColumns(2);
-		grid.setNumberRows(2);
-		
-		MultiPoint[] pt = new MultiPoint[4];
-		STRUCT[] st = new STRUCT[8];
-
-		PointGenerator pgc = new PointGenerator();
-		pgc.setGeometryFactory(geometryFactory);
-		MultiGenerator pg = new MultiGenerator(pgc);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberGeometries(3);
-		pg.setGeometryFactory(geometryFactory);
-		
-		OraWriter ow = new OraWriter(getConnection());
-		
-		int i=0;
-		while(grid.canCreate() && i<8){
-			pg.setBoundingBox(grid.createEnv());
-			pt[i] = (MultiPoint) pg.create();
-			st[i] = ow.write(pt[i]);
-			i++;
-		}
-		for(int j=0;j<4;j++){
-			if(pt[j]!=null)
-				st[i++] = ow.write(pt[j]);
-		}
-		
-		OraReader or = new OraReader();
-		i=0;
-		while(i<8 && pt[i%4] != null){
-			MultiPoint pt2 = (MultiPoint) or.read(st[i]);
-//			System.out.println((pt[i]==null?"NULL":pt[i].toString()));
-//			System.out.println((pt2==null?"NULL":pt2.toString()));
-			assertTrue("The input MultiPoint is not the same as the output MultiPoint",pt[i%4].equals(pt2));
-			i++;
-		}
-	}
-}
diff --git a/jtsio/test/com/vividsolutions/jts/io/oracle/StaticMultiPolygonTest.java b/jtsio/test/com/vividsolutions/jts/io/oracle/StaticMultiPolygonTest.java
deleted file mode 100644
index b503c27..0000000
--- a/jtsio/test/com/vividsolutions/jts/io/oracle/StaticMultiPolygonTest.java
+++ /dev/null
@@ -1,394 +0,0 @@
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jts.io.oracle;
-
-import java.sql.SQLException;
-
-import oracle.sql.STRUCT;
-
-import com.vividsolutions.jts.generator.*;
-import com.vividsolutions.jts.geom.*;
-
-/**
- * 
- * Does round trip testing by creating the oracle object, then decoding it. 
- * 
- * These tests do not include insert / delete / select operations.
- * 
- * NOTE: This test does require a precision to be used during the comparison, 
- * as points are rounded somewhat when creating the oracle struct. 
- * (One less decimal than a java double).
- * 
- * NOTE: The points may be re-ordered during these tests. 
- *
- * @author David Zwiers, Vivid Solutions. 
- */
-public class StaticMultiPolygonTest extends ConnectedTestCase {
-
-	/**
-	 * @param arg
-	 */
-	public StaticMultiPolygonTest(String arg) {
-		super(arg);
-	}
-
-	/**
-	 * Round Trip test for a single MultiPolygon
-	 * @throws SQLException 
-	 */
-	public void testSingleMultiPolygonNoHoleRoundTrip() throws SQLException{
-		PolygonGenerator pgc = new PolygonGenerator();
-		pgc.setGeometryFactory(geometryFactory);
-		pgc.setNumberPoints(10);
-		MultiGenerator pg = new MultiGenerator(pgc);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberGeometries(3);
-		pg.setGeometryFactory(geometryFactory);
-		
-		MultiPolygon pt = (MultiPolygon) pg.create();
-		
-		OraWriter ow = new OraWriter(getConnection());
-		STRUCT st = ow.write(pt);
-		
-		OraReader or = new OraReader();
-		MultiPolygon pt2 = (MultiPolygon) or.read(st);
-		
-//		System.out.println((pt==null?"NULL":pt.toString()));
-//		System.out.println((pt2==null?"NULL":pt2.toString()));
-		assertTrue("The input MultiPolygon is not the same as the output MultiPolygon",pt.equals(pt2));
-	}
-
-	/**
-	 * Round Trip test for a 100 non overlapping MultiPolygon
-	 * @throws SQLException 
-	 */
-	public void testGridMultiPolygonsNoHoleRoundTrip() throws SQLException{
-		GridGenerator grid = new GridGenerator();
-		grid.setGeometryFactory(geometryFactory);
-		grid.setBoundingBox(new Envelope(0,10,0,10));
-		grid.setNumberColumns(10);
-		grid.setNumberRows(10);
-		
-		MultiPolygon[] pt = new MultiPolygon[100];
-		STRUCT[] st = new STRUCT[100];
-
-		PolygonGenerator pgc = new PolygonGenerator();
-		pgc.setGeometryFactory(geometryFactory);
-		pgc.setNumberPoints(10);
-		MultiGenerator pg = new MultiGenerator(pgc);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberGeometries(3);
-		pg.setGeometryFactory(geometryFactory);
-		
-		OraWriter ow = new OraWriter(getConnection());
-		
-		int i=0;
-		while(grid.canCreate() && i<100){
-			pg.setBoundingBox(grid.createEnv());
-			pt[i] = (MultiPolygon) pg.create();
-			st[i] = ow.write(pt[i]);
-			i++;
-		}
-		
-		OraReader or = new OraReader();
-		i=0;
-		while(i<100 && pt[i] != null){
-			MultiPolygon pt2 = (MultiPolygon) or.read(st[i]);
-//			System.out.println((pt[i]==null?"NULL":pt[i].toString()));
-//			System.out.println((pt2==null?"NULL":pt2.toString()));
-			assertTrue("The input MultiPolygon is not the same as the output MultiPolygon",pt[i].equals(pt2));
-			i++;
-		}
-	}
-
-	/**
-	 * Round Trip test for a 8 overlapping line MultiPolygons (4 distinct MultiPolygons)
-	 * @throws SQLException 
-	 */
-	public void testOverlappingMultiPolygonsNoHoleRoundTrip() throws SQLException{
-		GridGenerator grid = new GridGenerator();
-		grid.setGeometryFactory(geometryFactory);
-		grid.setBoundingBox(new Envelope(0,10,0,10));
-		grid.setNumberColumns(2);
-		grid.setNumberRows(2);
-		
-		MultiPolygon[] pt = new MultiPolygon[4];
-		STRUCT[] st = new STRUCT[8];
-
-		PolygonGenerator pgc = new PolygonGenerator();
-		pgc.setGeometryFactory(geometryFactory);
-		pgc.setNumberPoints(10);
-		MultiGenerator pg = new MultiGenerator(pgc);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberGeometries(3);
-		pg.setGeometryFactory(geometryFactory);
-		
-		OraWriter ow = new OraWriter(getConnection());
-		
-		int i=0;
-		while(grid.canCreate() && i<8){
-			pg.setBoundingBox(grid.createEnv());
-			pt[i] = (MultiPolygon) pg.create();
-			st[i] = ow.write(pt[i]);
-			i++;
-		}
-		for(int j=0;j<4;j++){
-			if(pt[j]!=null)
-				st[i++] = ow.write(pt[j]);
-		}
-		
-		OraReader or = new OraReader();
-		i=0;
-		while(i<8 && pt[i%4] != null){
-			MultiPolygon pt2 = (MultiPolygon) or.read(st[i]);
-//			System.out.println((pt==null?"NULL":pt[i%4].toString()));
-//			System.out.println((pt2==null?"NULL":pt2.toString()));
-			assertTrue("The input MultiPolygon is not the same as the output MultiPolygon",pt[i%4].equals(pt2));
-			i++;
-		}
-	}
-
-	/**
-	 * Round Trip test for a single MultiPolygon with lotsa points
-	 * @throws SQLException 
-	 */
-	public void testSingleMultiPolygonManyPointsNoHoleRoundTrip() throws SQLException{
-
-		PolygonGenerator pgc = new PolygonGenerator();
-		pgc.setGeometryFactory(geometryFactory);
-		pgc.setGenerationAlgorithm(PolygonGenerator.BOX);
-		pgc.setNumberPoints(1000);
-		MultiGenerator pg = new MultiGenerator(pgc);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberGeometries(3);
-		pg.setGeometryFactory(geometryFactory);
-		
-		MultiPolygon pt = (MultiPolygon) pg.create();
-//		System.out.println((pt==null?"NULL":pt.toString()));
-		
-		OraWriter ow = new OraWriter(getConnection());
-		STRUCT st = ow.write(pt);
-		
-		OraReader or = new OraReader();
-		MultiPolygon pt2 = (MultiPolygon) or.read(st);
-
-//		System.out.println((pt==null?"NULL":pt.toString()));
-//		System.out.println((pt2==null?"NULL":pt2.toString()));
-		assertTrue("The input MultiPolygon is not the same as the output MultiPolygon",pt.equals(pt2));
-	}
-
-	/**
-	 * Round Trip test for a single MultiPolygon
-	 * @throws SQLException 
-	 */
-	public void testSingleMultiPolygonHolesRoundTrip() throws SQLException{
-
-		PolygonGenerator pgc = new PolygonGenerator();
-		pgc.setGeometryFactory(geometryFactory);
-		pgc.setGenerationAlgorithm(PolygonGenerator.BOX);
-		pgc.setNumberPoints(10);
-		pgc.setNumberHoles(4);
-		MultiGenerator pg = new MultiGenerator(pgc);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberGeometries(3);
-		pg.setGeometryFactory(geometryFactory);
-		
-		MultiPolygon pt = (MultiPolygon) pg.create();
-		
-		OraWriter ow = new OraWriter(getConnection());
-		STRUCT st = ow.write(pt);
-		
-		OraReader or = new OraReader();
-		MultiPolygon pt2 = (MultiPolygon) or.read(st);
-		
-//		System.out.println((pt==null?"NULL":pt.toString()));
-//		System.out.println((pt2==null?"NULL":pt2.toString()));
-		assertTrue("The input MultiPolygon is not the same as the output MultiPolygon",pt.equals(pt2));
-	}
-
-	/**
-	 * Round Trip test for a 100 non overlapping MultiPolygon
-	 * @throws SQLException 
-	 */
-	public void testGridMultiPolygonsHolesRoundTrip() throws SQLException{
-		GridGenerator grid = new GridGenerator();
-		grid.setGeometryFactory(geometryFactory);
-		grid.setBoundingBox(new Envelope(0,10,0,10));
-		grid.setNumberColumns(10);
-		grid.setNumberRows(10);
-		
-		MultiPolygon[] pt = new MultiPolygon[100];
-		STRUCT[] st = new STRUCT[100];
-
-
-		PolygonGenerator pgc = new PolygonGenerator();
-		pgc.setGeometryFactory(geometryFactory);
-		pgc.setGenerationAlgorithm(PolygonGenerator.BOX);
-		pgc.setNumberPoints(10);
-		pgc.setNumberHoles(4);
-		MultiGenerator pg = new MultiGenerator(pgc);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberGeometries(3);
-		pg.setGeometryFactory(geometryFactory);
-		
-		OraWriter ow = new OraWriter(getConnection());
-		
-		int i=0;
-		while(grid.canCreate() && i<100){
-			pg.setBoundingBox(grid.createEnv());
-			pt[i] = (MultiPolygon) pg.create();
-			st[i] = ow.write(pt[i]);
-			i++;
-		}
-		
-		OraReader or = new OraReader();
-		i=0;
-		while(i<100 && pt[i] != null){
-			MultiPolygon pt2 = (MultiPolygon) or.read(st[i]);
-//			System.out.println((pt[i]==null?"NULL":pt[i].toString()));
-//			System.out.println((pt2==null?"NULL":pt2.toString()));
-			assertTrue("The input MultiPolygon is not the same as the output MultiPolygon",pt[i].equals(pt2));
-			i++;
-		}
-	}
-
-	/**
-	 * Round Trip test for a 8 overlapping line MultiPolygons (4 distinct MultiPolygons)
-	 * @throws SQLException 
-	 */
-	public void testOverlappingMultiPolygonsHolesRoundTrip() throws SQLException{
-		GridGenerator grid = new GridGenerator();
-		grid.setGeometryFactory(geometryFactory);
-		grid.setBoundingBox(new Envelope(0,10,0,10));
-		grid.setNumberColumns(2);
-		grid.setNumberRows(2);
-		
-		MultiPolygon[] pt = new MultiPolygon[4];
-		STRUCT[] st = new STRUCT[8];
-
-
-		PolygonGenerator pgc = new PolygonGenerator();
-		pgc.setGeometryFactory(geometryFactory);
-		pgc.setGenerationAlgorithm(PolygonGenerator.BOX);
-		pgc.setNumberPoints(10);
-		pgc.setNumberHoles(4);
-		MultiGenerator pg = new MultiGenerator(pgc);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberGeometries(3);
-		pg.setGeometryFactory(geometryFactory);
-		
-		OraWriter ow = new OraWriter(getConnection());
-		
-		int i=0;
-		while(grid.canCreate() && i<8){
-			pg.setBoundingBox(grid.createEnv());
-			pt[i] = (MultiPolygon) pg.create();
-			st[i] = ow.write(pt[i]);
-			i++;
-		}
-		for(int j=0;j<4;j++){
-			if(pt[j]!=null)
-				st[i++] = ow.write(pt[j]);
-		}
-		
-		OraReader or = new OraReader();
-		i=0;
-		while(i<8 && pt[i%4] != null){
-			MultiPolygon pt2 = (MultiPolygon) or.read(st[i]);
-//			System.out.println((pt==null?"NULL":pt[i%4].toString()));
-//			System.out.println((pt2==null?"NULL":pt2.toString()));
-			assertTrue("The input MultiPolygon is not the same as the output MultiPolygon",pt[i%4].equals(pt2));
-			i++;
-		}
-	}
-
-	/**
-	 * Round Trip test for a single MultiPolygon with lotsa points
-	 * @throws SQLException 
-	 */
-	public void testSingleMultiPolygonManyPointsHolesRoundTrip() throws SQLException{
-
-		PolygonGenerator pgc = new PolygonGenerator();
-		pgc.setGeometryFactory(geometryFactory);
-		pgc.setGenerationAlgorithm(PolygonGenerator.BOX);
-		pgc.setNumberPoints(1000);
-		pgc.setNumberHoles(4);
-		MultiGenerator pg = new MultiGenerator(pgc);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberGeometries(3);
-		pg.setGeometryFactory(geometryFactory);
-		
-		MultiPolygon pt = (MultiPolygon) pg.create();
-//		System.out.println((pt==null?"NULL":pt.toString()));
-		
-		OraWriter ow = new OraWriter(getConnection());
-		STRUCT st = ow.write(pt);
-		
-		OraReader or = new OraReader();
-		MultiPolygon pt2 = (MultiPolygon) or.read(st);
-
-//		System.out.println((pt==null?"NULL":pt.toString()));
-//		System.out.println((pt2==null?"NULL":pt2.toString()));
-		assertTrue("The input MultiPolygon is not the same as the output MultiPolygon",pt.equals(pt2));
-	}
-
-	/**
-	 * Round Trip test for a single MultiPolygon with lotsa points
-	 * @throws SQLException 
-	 */
-	public void testSingleMultiPolygonManyPointsManyHolesRoundTrip() throws SQLException{
-
-		PolygonGenerator pgc = new PolygonGenerator();
-		pgc.setGeometryFactory(geometryFactory);
-		pgc.setGenerationAlgorithm(PolygonGenerator.BOX);
-		pgc.setNumberPoints(100);
-		pgc.setNumberHoles(100);
-		MultiGenerator pg = new MultiGenerator(pgc);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberGeometries(3);
-		pg.setGeometryFactory(geometryFactory);
-		
-		MultiPolygon pt = (MultiPolygon) pg.create();
-//		System.out.println((pt==null?"NULL":pt.toString()));
-		
-		OraWriter ow = new OraWriter(getConnection());
-		STRUCT st = ow.write(pt);
-		
-		OraReader or = new OraReader();
-		MultiPolygon pt2 = (MultiPolygon) or.read(st);
-
-//		System.out.println((pt==null?"NULL":pt.toString()));
-//		System.out.println((pt2==null?"NULL":pt2.toString()));
-		assertTrue("The input MultiPolygon is not the same as the output MultiPolygon",pt.equals(pt2));
-	}
-}
diff --git a/jtsio/test/com/vividsolutions/jts/io/oracle/StaticPointTest.java b/jtsio/test/com/vividsolutions/jts/io/oracle/StaticPointTest.java
deleted file mode 100644
index 4198784..0000000
--- a/jtsio/test/com/vividsolutions/jts/io/oracle/StaticPointTest.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jts.io.oracle;
-
-import java.sql.SQLException;
-
-import oracle.sql.STRUCT;
-
-import com.vividsolutions.jts.generator.GridGenerator;
-import com.vividsolutions.jts.generator.PointGenerator;
-import com.vividsolutions.jts.geom.*;
-
-/**
- * 
- * Does round trip testing by creating the oracle object, then decoding it. 
- * 
- * These tests do not include insert / delete / select operations.
- *
- * @author David Zwiers, Vivid Solutions. 
- */
-public class StaticPointTest extends ConnectedTestCase {
-
-	/**
-	 * @param arg
-	 */
-	public StaticPointTest(String arg) {
-		super(arg);
-	}
-
-	/**
-	 * Round Trip test for a single point
-	 * @throws SQLException 
-	 */
-	public void testSinglePointRoundTrip() throws SQLException{
-		PointGenerator pg = new PointGenerator();
-		pg.setGeometryFactory(geometryFactory);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		
-		Point pt = (Point) pg.create();
-		
-		OraWriter ow = new OraWriter(getConnection());
-		STRUCT st = ow.write(pt);
-		
-		OraReader or = new OraReader();
-		Point pt2 = (Point) or.read(st);
-
-//		System.out.println((pt==null?"NULL":pt.toString()));
-//		System.out.println((pt2==null?"NULL":pt2.toString()));
-		assertTrue("The input Point is not the same as the output Point",pt.equals(pt2));
-	}
-
-	/**
-	 * Round Trip test for a 100 non overlapping points
-	 * @throws SQLException 
-	 */
-	public void testGridPointsRoundTrip() throws SQLException{
-		GridGenerator grid = new GridGenerator();
-		grid.setGeometryFactory(geometryFactory);
-		grid.setBoundingBox(new Envelope(0,10,0,10));
-		grid.setNumberColumns(10);
-		grid.setNumberRows(10);
-		
-		Point[] pt = new Point[100];
-		STRUCT[] st = new STRUCT[100];
-
-		PointGenerator pg = new PointGenerator();
-		pg.setGeometryFactory(geometryFactory);
-		OraWriter ow = new OraWriter(getConnection());
-		
-		int i=0;
-		while(grid.canCreate() && i<100){
-			pg.setBoundingBox(grid.createEnv());
-			pt[i] = (Point) pg.create();
-			st[i] = ow.write(pt[i]);
-			i++;
-		}
-		
-		OraReader or = new OraReader();
-		i=0;
-		while(i<100 && pt[i] != null){
-			Point pt2 = (Point) or.read(st[i]);
-//			System.out.println((pt[i]==null?"NULL":pt[i].toString()));
-//			System.out.println((pt2==null?"NULL":pt2.toString()));
-			assertTrue("The input Point is not the same as the output Point",pt[i].equals(pt2));
-			i++;
-		}
-	}
-
-	/**
-	 * Round Trip test for a 8 overlapping points (4 distinct points)
-	 * @throws SQLException 
-	 */
-	public void testOverlappingPointsRoundTrip() throws SQLException{
-		GridGenerator grid = new GridGenerator();
-		grid.setGeometryFactory(geometryFactory);
-		grid.setBoundingBox(new Envelope(0,10,0,10));
-		grid.setNumberColumns(2);
-		grid.setNumberRows(2);
-		
-		Point[] pt = new Point[4];
-		STRUCT[] st = new STRUCT[8];
-
-		PointGenerator pg = new PointGenerator();
-		pg.setGeometryFactory(geometryFactory);
-		OraWriter ow = new OraWriter(getConnection());
-		
-		int i=0;
-		while(grid.canCreate() && i<8){
-			pg.setBoundingBox(grid.createEnv());
-			pt[i] = (Point) pg.create();
-			st[i] = ow.write(pt[i]);
-			i++;
-		}
-		for(int j=0;j<4;j++){
-			if(pt[j]!=null)
-				st[i++] = ow.write(pt[j]);
-		}
-		
-		OraReader or = new OraReader();
-		i=0;
-		while(i<8 && pt[i%4] != null){
-			Point pt2 = (Point) or.read(st[i]);
-//			System.out.println((pt[i]==null?"NULL":pt[i].toString()));
-//			System.out.println((pt2==null?"NULL":pt2.toString()));
-			assertTrue("The input Point is not the same as the output Point",pt[i%4].equals(pt2));
-			i++;
-		}
-	}
-}
diff --git a/jtsio/test/com/vividsolutions/jts/io/oracle/StaticPolygonTest.java b/jtsio/test/com/vividsolutions/jts/io/oracle/StaticPolygonTest.java
deleted file mode 100644
index 8417209..0000000
--- a/jtsio/test/com/vividsolutions/jts/io/oracle/StaticPolygonTest.java
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jts.io.oracle;
-
-import java.sql.SQLException;
-
-import oracle.sql.STRUCT;
-
-import com.vividsolutions.jts.generator.*;
-import com.vividsolutions.jts.geom.*;
-
-/**
- * 
- * Does round trip testing by creating the oracle object, then decoding it. 
- * 
- * These tests do not include insert / delete / select operations.
- * 
- * NOTE: This test does require a precision to be used during the comparison, 
- * as points are rounded somewhat when creating the oracle struct. 
- * (One less decimal than a java double).
- * 
- * NOTE: The points may be re-ordered during these tests. 
- *
- * @author David Zwiers, Vivid Solutions. 
- */
-public class StaticPolygonTest extends ConnectedTestCase {
-
-	/**
-	 * @param arg
-	 */
-	public StaticPolygonTest(String arg) {
-		super(arg);
-	}
-
-	/**
-	 * Round Trip test for a single polygon
-	 * @throws SQLException 
-	 */
-	public void testSinglePolygonNoHoleRoundTrip() throws SQLException{
-		PolygonGenerator pg = new PolygonGenerator();
-		pg.setGeometryFactory(geometryFactory);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberPoints(10);
-		
-		Polygon pt = (Polygon) pg.create();
-		
-		OraWriter ow = new OraWriter(getConnection());
-		STRUCT st = ow.write(pt);
-		
-		OraReader or = new OraReader();
-		Polygon pt2 = (Polygon) or.read(st);
-		
-//		System.out.println((pt==null?"NULL":pt.toString()));
-//		System.out.println((pt2==null?"NULL":pt2.toString()));
-		assertTrue("The input polygon is not the same as the output polygon",pt.equals(pt2));
-	}
-
-	/**
-	 * Round Trip test for a 100 non overlapping polygon
-	 * @throws SQLException 
-	 */
-	public void testGridPolygonsNoHoleRoundTrip() throws SQLException{
-		GridGenerator grid = new GridGenerator();
-		grid.setGeometryFactory(geometryFactory);
-		grid.setBoundingBox(new Envelope(0,10,0,10));
-		grid.setNumberColumns(10);
-		grid.setNumberRows(10);
-		
-		Polygon[] pt = new Polygon[100];
-		STRUCT[] st = new STRUCT[100];
-
-		PolygonGenerator pg = new PolygonGenerator();
-		pg.setGeometryFactory(geometryFactory);
-		pg.setNumberPoints(10);
-		OraWriter ow = new OraWriter(getConnection());
-		
-		int i=0;
-		while(grid.canCreate() && i<100){
-			pg.setBoundingBox(grid.createEnv());
-			pt[i] = (Polygon) pg.create();
-			st[i] = ow.write(pt[i]);
-			i++;
-		}
-		
-		OraReader or = new OraReader();
-		i=0;
-		while(i<100 && pt[i] != null){
-			Polygon pt2 = (Polygon) or.read(st[i]);
-//			System.out.println((pt[i]==null?"NULL":pt[i].toString()));
-//			System.out.println((pt2==null?"NULL":pt2.toString()));
-			assertTrue("The input polygon is not the same as the output polygon",pt[i].equals(pt2));
-			i++;
-		}
-	}
-
-	/**
-	 * Round Trip test for a 8 overlapping line polygons (4 distinct polygons)
-	 * @throws SQLException 
-	 */
-	public void testOverlappingPolygonsNoHoleRoundTrip() throws SQLException{
-		GridGenerator grid = new GridGenerator();
-		grid.setGeometryFactory(geometryFactory);
-		grid.setBoundingBox(new Envelope(0,10,0,10));
-		grid.setNumberColumns(2);
-		grid.setNumberRows(2);
-		
-		Polygon[] pt = new Polygon[4];
-		STRUCT[] st = new STRUCT[8];
-
-		PolygonGenerator pg = new PolygonGenerator();
-		pg.setGeometryFactory(geometryFactory);
-		pg.setNumberPoints(10);
-		OraWriter ow = new OraWriter(getConnection());
-		
-		int i=0;
-		while(grid.canCreate() && i<8){
-			pg.setBoundingBox(grid.createEnv());
-			pt[i] = (Polygon) pg.create();
-			st[i] = ow.write(pt[i]);
-			i++;
-		}
-		for(int j=0;j<4;j++){
-			if(pt[j]!=null)
-				st[i++] = ow.write(pt[j]);
-		}
-		
-		OraReader or = new OraReader();
-		i=0;
-		while(i<8 && pt[i%4] != null){
-			Polygon pt2 = (Polygon) or.read(st[i]);
-//			System.out.println((pt==null?"NULL":pt[i%4].toString()));
-//			System.out.println((pt2==null?"NULL":pt2.toString()));
-			assertTrue("The input polygon is not the same as the output polygon",pt[i%4].equals(pt2));
-			i++;
-		}
-	}
-
-	/**
-	 * Round Trip test for a single polygon with lotsa points
-	 * @throws SQLException 
-	 */
-	public void testSinglePolygonManyPointsNoHoleRoundTrip() throws SQLException{
-		PolygonGenerator pg = new PolygonGenerator();
-		pg.setGeometryFactory(geometryFactory);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setGenerationAlgorithm(PolygonGenerator.BOX);
-		pg.setNumberPoints(1000);
-		
-		Polygon pt = (Polygon) pg.create();
-//		System.out.println((pt==null?"NULL":pt.toString()));
-		
-		OraWriter ow = new OraWriter(getConnection());
-		STRUCT st = ow.write(pt);
-		
-		OraReader or = new OraReader();
-		Polygon pt2 = (Polygon) or.read(st);
-
-//		System.out.println((pt==null?"NULL":pt.toString()));
-//		System.out.println((pt2==null?"NULL":pt2.toString()));
-		assertTrue("The input polygon is not the same as the output polygon",pt.equals(pt2));
-	}
-
-	/**
-	 * Round Trip test for a single polygon
-	 * @throws SQLException 
-	 */
-	public void testSinglePolygonHolesRoundTrip() throws SQLException{
-		PolygonGenerator pg = new PolygonGenerator();
-		pg.setGeometryFactory(geometryFactory);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setNumberPoints(10);
-		pg.setNumberHoles(4);
-		
-		Polygon pt = (Polygon) pg.create();
-		
-		OraWriter ow = new OraWriter(getConnection());
-		STRUCT st = ow.write(pt);
-		
-		OraReader or = new OraReader();
-		Polygon pt2 = (Polygon) or.read(st);
-		
-//		System.out.println((pt==null?"NULL":pt.toString()));
-//		System.out.println((pt2==null?"NULL":pt2.toString()));
-		assertTrue("The input polygon is not the same as the output polygon",pt.equals(pt2));
-	}
-
-	/**
-	 * Round Trip test for a 100 non overlapping polygon
-	 * @throws SQLException 
-	 */
-	public void testGridPolygonsHolesRoundTrip() throws SQLException{
-		GridGenerator grid = new GridGenerator();
-		grid.setGeometryFactory(geometryFactory);
-		grid.setBoundingBox(new Envelope(0,10,0,10));
-		grid.setNumberColumns(10);
-		grid.setNumberRows(10);
-		
-		Polygon[] pt = new Polygon[100];
-		STRUCT[] st = new STRUCT[100];
-
-		PolygonGenerator pg = new PolygonGenerator();
-		pg.setGeometryFactory(geometryFactory);
-		pg.setNumberPoints(10);
-		pg.setNumberHoles(4);
-		OraWriter ow = new OraWriter(getConnection());
-		
-		int i=0;
-		while(grid.canCreate() && i<100){
-			pg.setBoundingBox(grid.createEnv());
-			pt[i] = (Polygon) pg.create();
-			st[i] = ow.write(pt[i]);
-			i++;
-		}
-		
-		OraReader or = new OraReader();
-		i=0;
-		while(i<100 && pt[i] != null){
-			Polygon pt2 = (Polygon) or.read(st[i]);
-//			System.out.println((pt[i]==null?"NULL":pt[i].toString()));
-//			System.out.println((pt2==null?"NULL":pt2.toString()));
-			assertTrue("The input polygon is not the same as the output polygon",pt[i].equals(pt2));
-			i++;
-		}
-	}
-
-	/**
-	 * Round Trip test for a 8 overlapping line polygons (4 distinct polygons)
-	 * @throws SQLException 
-	 */
-	public void testOverlappingPolygonsHolesRoundTrip() throws SQLException{
-		GridGenerator grid = new GridGenerator();
-		grid.setGeometryFactory(geometryFactory);
-		grid.setBoundingBox(new Envelope(0,10,0,10));
-		grid.setNumberColumns(2);
-		grid.setNumberRows(2);
-		
-		Polygon[] pt = new Polygon[4];
-		STRUCT[] st = new STRUCT[8];
-
-		PolygonGenerator pg = new PolygonGenerator();
-		pg.setGeometryFactory(geometryFactory);
-		pg.setNumberPoints(10);
-		pg.setNumberHoles(4);
-		OraWriter ow = new OraWriter(getConnection());
-		
-		int i=0;
-		while(grid.canCreate() && i<8){
-			pg.setBoundingBox(grid.createEnv());
-			pt[i] = (Polygon) pg.create();
-			st[i] = ow.write(pt[i]);
-			i++;
-		}
-		for(int j=0;j<4;j++){
-			if(pt[j]!=null)
-				st[i++] = ow.write(pt[j]);
-		}
-		
-		OraReader or = new OraReader();
-		i=0;
-		while(i<8 && pt[i%4] != null){
-			Polygon pt2 = (Polygon) or.read(st[i]);
-//			System.out.println((pt==null?"NULL":pt[i%4].toString()));
-//			System.out.println((pt2==null?"NULL":pt2.toString()));
-			assertTrue("The input polygon is not the same as the output polygon",pt[i%4].equals(pt2));
-			i++;
-		}
-	}
-
-	/**
-	 * Round Trip test for a single polygon with lotsa points
-	 * @throws SQLException 
-	 */
-	public void testSinglePolygonManyPointsHolesRoundTrip() throws SQLException{
-		PolygonGenerator pg = new PolygonGenerator();
-		pg.setGeometryFactory(geometryFactory);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setGenerationAlgorithm(PolygonGenerator.BOX);
-		pg.setNumberPoints(1000);
-		pg.setNumberHoles(4);
-		
-		Polygon pt = (Polygon) pg.create();
-//		System.out.println((pt==null?"NULL":pt.toString()));
-		
-		OraWriter ow = new OraWriter(getConnection());
-		STRUCT st = ow.write(pt);
-		
-		OraReader or = new OraReader();
-		Polygon pt2 = (Polygon) or.read(st);
-
-//		System.out.println((pt==null?"NULL":pt.toString()));
-//		System.out.println((pt2==null?"NULL":pt2.toString()));
-		assertTrue("The input polygon is not the same as the output polygon",pt.equals(pt2));
-	}
-
-	/**
-	 * Round Trip test for a single polygon with lotsa points
-	 * @throws SQLException 
-	 */
-	public void testSinglePolygonManyPointsManyHolesRoundTrip() throws SQLException{
-		PolygonGenerator pg = new PolygonGenerator();
-		pg.setGeometryFactory(geometryFactory);
-		pg.setBoundingBox(new Envelope(0,10,0,10));
-		pg.setGenerationAlgorithm(PolygonGenerator.BOX);
-		pg.setNumberPoints(100);
-		pg.setNumberHoles(100);
-		
-		Polygon pt = (Polygon) pg.create();
-//		System.out.println((pt==null?"NULL":pt.toString()));
-		
-		OraWriter ow = new OraWriter(getConnection());
-		STRUCT st = ow.write(pt);
-		
-		OraReader or = new OraReader();
-		Polygon pt2 = (Polygon) or.read(st);
-
-//		System.out.println((pt==null?"NULL":pt.toString()));
-//		System.out.println((pt2==null?"NULL":pt2.toString()));
-		assertTrue("The input polygon is not the same as the output polygon",pt.equals(pt2));
-	}
-}
diff --git a/jtsio/test/com/vividsolutions/jts/io/oracle/connection.properties b/jtsio/test/com/vividsolutions/jts/io/oracle/connection.properties
deleted file mode 100644
index 32b0689..0000000
--- a/jtsio/test/com/vividsolutions/jts/io/oracle/connection.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-test.server=Neptune
-test.port=1521
-test.sid=LRDW
-test.user=inventory
-test.pwd=password
\ No newline at end of file
diff --git a/jtsio/test/data/linestrings.xml b/jtsio/test/data/linestrings.xml
deleted file mode 100644
index 66dd0ce..0000000
--- a/jtsio/test/data/linestrings.xml
+++ /dev/null
@@ -1,312 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-
-<MultiGeometry>
-	<LineString>
-		<coordinates>24824.045318333192,38536.15071012041
-			26157.378651666528,37567.42733944659 26666.666666666668,36000.0
-			26157.378651666528,34432.57266055341
-			24824.045318333192,33463.84928987959
-			23175.954681666804,33463.84928987959
-			21842.621348333472,34432.57266055341 21333.333333333332,36000.0
-			21842.621348333472,37567.42733944659
-			23175.954681666808,38536.15071012041 </coordinates>
-	</LineString>
-
-
-
-	<LineString>
-		<coordinates>32824.04531833319,38536.15071012041
-			34157.37865166653,37567.42733944659 34666.666666666664,36000.0
-			34157.37865166653,34432.57266055341
-			32824.04531833319,33463.84928987959
-			31175.954681666804,33463.84928987959
-			29842.621348333472,34432.57266055341 29333.333333333332,36000.0
-			29842.621348333472,37567.42733944659
-			31175.954681666808,38536.15071012041 </coordinates>
-	</LineString>
-
-
-
-	<LineString>
-		<coordinates>40824.04531833319,38536.15071012041
-			42157.37865166653,37567.42733944659 42666.666666666664,36000.0
-			42157.37865166653,34432.57266055341
-			40824.04531833319,33463.84928987959
-			39175.95468166681,33463.84928987959
-			37842.62134833347,34432.57266055341 37333.333333333336,36000.0
-			37842.62134833347,37567.42733944659
-			39175.95468166681,38536.15071012041 </coordinates>
-	</LineString>
-
-
-
-	<LineString>
-		<coordinates>48824.04531833319,38536.15071012041
-			50157.37865166653,37567.42733944659 50666.666666666664,36000.0
-			50157.37865166653,34432.57266055341
-			48824.04531833319,33463.84928987959
-			47175.95468166681,33463.84928987959
-			45842.62134833347,34432.57266055341 45333.333333333336,36000.0
-			45842.62134833347,37567.42733944659
-			47175.95468166681,38536.15071012041 </coordinates>
-	</LineString>
-
-
-
-	<LineString>
-		<coordinates>56824.04531833319,38536.15071012041
-			58157.37865166653,37567.42733944659 58666.666666666664,36000.0
-			58157.37865166653,34432.57266055341
-			56824.04531833319,33463.84928987959
-			55175.95468166681,33463.84928987959
-			53842.62134833347,34432.57266055341 53333.333333333336,36000.0
-			53842.62134833347,37567.42733944659
-			55175.95468166681,38536.15071012041 </coordinates>
-	</LineString>
-
-
-
-	<LineString>
-		<coordinates>24824.045318333192,50536.15071012041
-			26157.378651666528,49567.42733944659 26666.666666666668,48000.0
-			26157.378651666528,46432.57266055341
-			24824.045318333192,45463.84928987959
-			23175.954681666804,45463.84928987959
-			21842.621348333472,46432.57266055341 21333.333333333332,48000.0
-			21842.621348333472,49567.42733944659
-			23175.954681666808,50536.15071012041 </coordinates>
-	</LineString>
-
-
-
-	<LineString>
-		<coordinates>32824.04531833319,50536.15071012041
-			34157.37865166653,49567.42733944659 34666.666666666664,48000.0
-			34157.37865166653,46432.57266055341
-			32824.04531833319,45463.84928987959
-			31175.954681666804,45463.84928987959
-			29842.621348333472,46432.57266055341 29333.333333333332,48000.0
-			29842.621348333472,49567.42733944659
-			31175.954681666808,50536.15071012041 </coordinates>
-	</LineString>
-
-
-
-	<LineString>
-		<coordinates>40824.04531833319,50536.15071012041
-			42157.37865166653,49567.42733944659 42666.666666666664,48000.0
-			42157.37865166653,46432.57266055341
-			40824.04531833319,45463.84928987959
-			39175.95468166681,45463.84928987959
-			37842.62134833347,46432.57266055341 37333.333333333336,48000.0
-			37842.62134833347,49567.42733944659
-			39175.95468166681,50536.15071012041 </coordinates>
-	</LineString>
-
-
-
-	<LineString>
-		<coordinates>48824.04531833319,50536.15071012041
-			50157.37865166653,49567.42733944659 50666.666666666664,48000.0
-			50157.37865166653,46432.57266055341
-			48824.04531833319,45463.84928987959
-			47175.95468166681,45463.84928987959
-			45842.62134833347,46432.57266055341 45333.333333333336,48000.0
-			45842.62134833347,49567.42733944659
-			47175.95468166681,50536.15071012041 </coordinates>
-	</LineString>
-
-
-
-	<LineString>
-		<coordinates>56824.04531833319,50536.15071012041
-			58157.37865166653,49567.42733944659 58666.666666666664,48000.0
-			58157.37865166653,46432.57266055341
-			56824.04531833319,45463.84928987959
-			55175.95468166681,45463.84928987959
-			53842.62134833347,46432.57266055341 53333.333333333336,48000.0
-			53842.62134833347,49567.42733944659
-			55175.95468166681,50536.15071012041 </coordinates>
-	</LineString>
-
-
-
-	<LineString>
-		<coordinates>24824.045318333192,62536.15071012041
-			26157.378651666528,61567.42733944659 26666.666666666668,60000.0
-			26157.378651666528,58432.57266055341
-			24824.045318333192,57463.84928987959
-			23175.954681666804,57463.84928987959
-			21842.621348333472,58432.57266055341 21333.333333333332,60000.0
-			21842.621348333472,61567.42733944659
-			23175.954681666808,62536.15071012041 </coordinates>
-	</LineString>
-
-
-
-	<LineString>
-		<coordinates>32824.04531833319,62536.15071012041
-			34157.37865166653,61567.42733944659 34666.666666666664,60000.0
-			34157.37865166653,58432.57266055341
-			32824.04531833319,57463.84928987959
-			31175.954681666804,57463.84928987959
-			29842.621348333472,58432.57266055341 29333.333333333332,60000.0
-			29842.621348333472,61567.42733944659
-			31175.954681666808,62536.15071012041 </coordinates>
-	</LineString>
-
-
-
-	<LineString>
-		<coordinates>40824.04531833319,62536.15071012041
-			42157.37865166653,61567.42733944659 42666.666666666664,60000.0
-			42157.37865166653,58432.57266055341
-			40824.04531833319,57463.84928987959
-			39175.95468166681,57463.84928987959
-			37842.62134833347,58432.57266055341 37333.333333333336,60000.0
-			37842.62134833347,61567.42733944659
-			39175.95468166681,62536.15071012041 </coordinates>
-	</LineString>
-
-
-
-	<LineString>
-		<coordinates>48824.04531833319,62536.15071012041
-			50157.37865166653,61567.42733944659 50666.666666666664,60000.0
-			50157.37865166653,58432.57266055341
-			48824.04531833319,57463.84928987959
-			47175.95468166681,57463.84928987959
-			45842.62134833347,58432.57266055341 45333.333333333336,60000.0
-			45842.62134833347,61567.42733944659
-			47175.95468166681,62536.15071012041 </coordinates>
-	</LineString>
-
-
-
-	<LineString>
-		<coordinates>56824.04531833319,62536.15071012041
-			58157.37865166653,61567.42733944659 58666.666666666664,60000.0
-			58157.37865166653,58432.57266055341
-			56824.04531833319,57463.84928987959
-			55175.95468166681,57463.84928987959
-			53842.62134833347,58432.57266055341 53333.333333333336,60000.0
-			53842.62134833347,61567.42733944659
-			55175.95468166681,62536.15071012041 </coordinates>
-	</LineString>
-
-
-
-	<LineString>
-		<coordinates>24824.045318333192,74536.1507101204
-			26157.378651666528,73567.4273394466 26666.666666666668,72000.0
-			26157.378651666528,70432.5726605534
-			24824.045318333192,69463.8492898796
-			23175.954681666804,69463.8492898796
-			21842.621348333472,70432.5726605534 21333.333333333332,72000.0
-			21842.621348333472,73567.4273394466
-			23175.954681666808,74536.1507101204 </coordinates>
-	</LineString>
-
-
-
-	<LineString>
-		<coordinates>32824.04531833319,74536.1507101204
-			34157.37865166653,73567.4273394466 34666.666666666664,72000.0
-			34157.37865166653,70432.5726605534 32824.04531833319,69463.8492898796
-			31175.954681666804,69463.8492898796
-			29842.621348333472,70432.5726605534 29333.333333333332,72000.0
-			29842.621348333472,73567.4273394466
-			31175.954681666808,74536.1507101204 </coordinates>
-	</LineString>
-
-
-
-	<LineString>
-		<coordinates>40824.04531833319,74536.1507101204
-			42157.37865166653,73567.4273394466 42666.666666666664,72000.0
-			42157.37865166653,70432.5726605534 40824.04531833319,69463.8492898796
-			39175.95468166681,69463.8492898796 37842.62134833347,70432.5726605534
-			37333.333333333336,72000.0 37842.62134833347,73567.4273394466
-			39175.95468166681,74536.1507101204 </coordinates>
-	</LineString>
-
-
-
-	<LineString>
-		<coordinates>48824.04531833319,74536.1507101204
-			50157.37865166653,73567.4273394466 50666.666666666664,72000.0
-			50157.37865166653,70432.5726605534 48824.04531833319,69463.8492898796
-			47175.95468166681,69463.8492898796 45842.62134833347,70432.5726605534
-			45333.333333333336,72000.0 45842.62134833347,73567.4273394466
-			47175.95468166681,74536.1507101204 </coordinates>
-	</LineString>
-
-
-
-	<LineString>
-		<coordinates>56824.04531833319,74536.1507101204
-			58157.37865166653,73567.4273394466 58666.666666666664,72000.0
-			58157.37865166653,70432.5726605534 56824.04531833319,69463.8492898796
-			55175.95468166681,69463.8492898796 53842.62134833347,70432.5726605534
-			53333.333333333336,72000.0 53842.62134833347,73567.4273394466
-			55175.95468166681,74536.1507101204 </coordinates>
-	</LineString>
-
-
-
-	<LineString>
-		<coordinates>24824.045318333192,86536.1507101204
-			26157.378651666528,85567.4273394466 26666.666666666668,84000.0
-			26157.378651666528,82432.5726605534
-			24824.045318333192,81463.8492898796
-			23175.954681666804,81463.8492898796
-			21842.621348333472,82432.5726605534 21333.333333333332,84000.0
-			21842.621348333472,85567.4273394466
-			23175.954681666808,86536.1507101204 </coordinates>
-	</LineString>
-
-
-
-	<LineString>
-		<coordinates>32824.04531833319,86536.1507101204
-			34157.37865166653,85567.4273394466 34666.666666666664,84000.0
-			34157.37865166653,82432.5726605534 32824.04531833319,81463.8492898796
-			31175.954681666804,81463.8492898796
-			29842.621348333472,82432.5726605534 29333.333333333332,84000.0
-			29842.621348333472,85567.4273394466
-			31175.954681666808,86536.1507101204 </coordinates>
-	</LineString>
-
-
-
-	<LineString>
-		<coordinates>40824.04531833319,86536.1507101204
-			42157.37865166653,85567.4273394466 42666.666666666664,84000.0
-			42157.37865166653,82432.5726605534 40824.04531833319,81463.8492898796
-			39175.95468166681,81463.8492898796 37842.62134833347,82432.5726605534
-			37333.333333333336,84000.0 37842.62134833347,85567.4273394466
-			39175.95468166681,86536.1507101204 </coordinates>
-	</LineString>
-
-
-
-	<LineString>
-		<coordinates>48824.04531833319,86536.1507101204
-			50157.37865166653,85567.4273394466 50666.666666666664,84000.0
-			50157.37865166653,82432.5726605534 48824.04531833319,81463.8492898796
-			47175.95468166681,81463.8492898796 45842.62134833347,82432.5726605534
-			45333.333333333336,84000.0 45842.62134833347,85567.4273394466
-			47175.95468166681,86536.1507101204 </coordinates>
-	</LineString>
-
-
-
-	<LineString>
-		<coordinates>56824.04531833319,86536.1507101204
-			58157.37865166653,85567.4273394466 58666.666666666664,84000.0
-			58157.37865166653,82432.5726605534 56824.04531833319,81463.8492898796
-			55175.95468166681,81463.8492898796 53842.62134833347,82432.5726605534
-			53333.333333333336,84000.0 53842.62134833347,85567.4273394466
-			55175.95468166681,86536.1507101204 </coordinates>
-	</LineString>
-</MultiGeometry>
diff --git a/jtsio/test/data/multilinestrings.xml b/jtsio/test/data/multilinestrings.xml
deleted file mode 100644
index 53a486f..0000000
--- a/jtsio/test/data/multilinestrings.xml
+++ /dev/null
@@ -1,1479 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-
-<MultiGeometry>
-	
-	<MultiLineString>
-		<lineStringMember>
-			<LineString>
-				<coordinates>22412.022659166596,34268.0753550602
-					23078.689325833264,33783.7136697233
-					23333.333333333332,33000.0
-					23078.689325833264,32216.286330276704
-					22412.022659166596,31731.924644939794
-					21587.977340833404,31731.924644939794
-					20921.310674166736,32216.286330276704
-					20666.666666666668,33000.0
-					20921.310674166736,33783.7136697233
-					21587.977340833404,34268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>26412.022659166596,34268.0753550602
-					27078.689325833264,33783.7136697233
-					27333.333333333332,33000.0
-					27078.689325833264,32216.286330276704
-					26412.022659166596,31731.924644939794
-					25587.977340833404,31731.924644939794
-					24921.310674166736,32216.286330276704
-					24666.666666666668,33000.0
-					24921.310674166736,33783.7136697233
-					25587.977340833404,34268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>22412.022659166596,40268.0753550602
-					23078.689325833264,39783.7136697233
-					23333.333333333332,39000.0
-					23078.689325833264,38216.2863302767
-					22412.022659166596,37731.9246449398
-					21587.977340833404,37731.9246449398
-					20921.310674166736,38216.2863302767
-					20666.666666666668,39000.0
-					20921.310674166736,39783.7136697233
-					21587.977340833404,40268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>26412.022659166596,40268.0753550602
-					27078.689325833264,39783.7136697233
-					27333.333333333332,39000.0
-					27078.689325833264,38216.2863302767
-					26412.022659166596,37731.9246449398
-					25587.977340833404,37731.9246449398
-					24921.310674166736,38216.2863302767
-					24666.666666666668,39000.0
-					24921.310674166736,39783.7136697233
-					25587.977340833404,40268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-	</MultiLineString>
-	
-	<MultiLineString>
-		<lineStringMember>
-			<LineString>
-				<coordinates>30412.022659166596,34268.0753550602
-					31078.689325833264,33783.7136697233
-					31333.333333333332,33000.0
-					31078.689325833264,32216.286330276704
-					30412.022659166596,31731.924644939794
-					29587.977340833404,31731.924644939794
-					28921.310674166736,32216.286330276704
-					28666.666666666668,33000.0
-					28921.310674166736,33783.7136697233
-					29587.977340833404,34268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>34412.0226591666,34268.0753550602
-					35078.689325833264,33783.7136697233
-					35333.333333333336,33000.0
-					35078.689325833264,32216.286330276704
-					34412.0226591666,31731.924644939794
-					33587.9773408334,31731.924644939794
-					32921.310674166736,32216.286330276704
-					32666.666666666668,33000.0
-					32921.310674166736,33783.7136697233
-					33587.9773408334,34268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>30412.022659166596,40268.0753550602
-					31078.689325833264,39783.7136697233
-					31333.333333333332,39000.0
-					31078.689325833264,38216.2863302767
-					30412.022659166596,37731.9246449398
-					29587.977340833404,37731.9246449398
-					28921.310674166736,38216.2863302767
-					28666.666666666668,39000.0
-					28921.310674166736,39783.7136697233
-					29587.977340833404,40268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>34412.0226591666,40268.0753550602
-					35078.689325833264,39783.7136697233
-					35333.333333333336,39000.0
-					35078.689325833264,38216.2863302767
-					34412.0226591666,37731.9246449398
-					33587.9773408334,37731.9246449398
-					32921.310674166736,38216.2863302767
-					32666.666666666668,39000.0
-					32921.310674166736,39783.7136697233
-					33587.9773408334,40268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-	</MultiLineString>
-	
-	<MultiLineString>
-		<lineStringMember>
-			<LineString>
-				<coordinates>38412.0226591666,34268.0753550602
-					39078.689325833264,33783.7136697233
-					39333.333333333336,33000.0
-					39078.689325833264,32216.286330276704
-					38412.0226591666,31731.924644939794
-					37587.9773408334,31731.924644939794
-					36921.310674166736,32216.286330276704
-					36666.666666666664,33000.0
-					36921.310674166736,33783.7136697233
-					37587.9773408334,34268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>42412.0226591666,34268.0753550602
-					43078.689325833264,33783.7136697233
-					43333.333333333336,33000.0
-					43078.689325833264,32216.286330276704
-					42412.0226591666,31731.924644939794
-					41587.9773408334,31731.924644939794
-					40921.310674166736,32216.286330276704
-					40666.666666666664,33000.0
-					40921.310674166736,33783.7136697233
-					41587.9773408334,34268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>38412.0226591666,40268.0753550602
-					39078.689325833264,39783.7136697233
-					39333.333333333336,39000.0
-					39078.689325833264,38216.2863302767
-					38412.0226591666,37731.9246449398
-					37587.9773408334,37731.9246449398
-					36921.310674166736,38216.2863302767
-					36666.666666666664,39000.0
-					36921.310674166736,39783.7136697233
-					37587.9773408334,40268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>42412.0226591666,40268.0753550602
-					43078.689325833264,39783.7136697233
-					43333.333333333336,39000.0
-					43078.689325833264,38216.2863302767
-					42412.0226591666,37731.9246449398
-					41587.9773408334,37731.9246449398
-					40921.310674166736,38216.2863302767
-					40666.666666666664,39000.0
-					40921.310674166736,39783.7136697233
-					41587.9773408334,40268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-	</MultiLineString>
-	
-	<MultiLineString>
-		<lineStringMember>
-			<LineString>
-				<coordinates>46412.0226591666,34268.0753550602
-					47078.689325833264,33783.7136697233
-					47333.333333333336,33000.0
-					47078.689325833264,32216.286330276704
-					46412.0226591666,31731.924644939794
-					45587.9773408334,31731.924644939794
-					44921.310674166736,32216.286330276704
-					44666.666666666664,33000.0
-					44921.310674166736,33783.7136697233
-					45587.9773408334,34268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>50412.0226591666,34268.0753550602
-					51078.689325833264,33783.7136697233
-					51333.333333333336,33000.0
-					51078.689325833264,32216.286330276704
-					50412.0226591666,31731.924644939794
-					49587.9773408334,31731.924644939794
-					48921.310674166736,32216.286330276704
-					48666.666666666664,33000.0
-					48921.310674166736,33783.7136697233
-					49587.9773408334,34268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>46412.0226591666,40268.0753550602
-					47078.689325833264,39783.7136697233
-					47333.333333333336,39000.0
-					47078.689325833264,38216.2863302767
-					46412.0226591666,37731.9246449398
-					45587.9773408334,37731.9246449398
-					44921.310674166736,38216.2863302767
-					44666.666666666664,39000.0
-					44921.310674166736,39783.7136697233
-					45587.9773408334,40268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>50412.0226591666,40268.0753550602
-					51078.689325833264,39783.7136697233
-					51333.333333333336,39000.0
-					51078.689325833264,38216.2863302767
-					50412.0226591666,37731.9246449398
-					49587.9773408334,37731.9246449398
-					48921.310674166736,38216.2863302767
-					48666.666666666664,39000.0
-					48921.310674166736,39783.7136697233
-					49587.9773408334,40268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-	</MultiLineString>
-	
-	<MultiLineString>
-		<lineStringMember>
-			<LineString>
-				<coordinates>54412.0226591666,34268.0753550602
-					55078.689325833264,33783.7136697233
-					55333.333333333336,33000.0
-					55078.689325833264,32216.286330276704
-					54412.0226591666,31731.924644939794
-					53587.9773408334,31731.924644939794
-					52921.310674166736,32216.286330276704
-					52666.666666666664,33000.0
-					52921.310674166736,33783.7136697233
-					53587.9773408334,34268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>58412.0226591666,34268.0753550602
-					59078.689325833264,33783.7136697233
-					59333.333333333336,33000.0
-					59078.689325833264,32216.286330276704
-					58412.0226591666,31731.924644939794
-					57587.9773408334,31731.924644939794
-					56921.310674166736,32216.286330276704
-					56666.666666666664,33000.0
-					56921.310674166736,33783.7136697233
-					57587.9773408334,34268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>54412.0226591666,40268.0753550602
-					55078.689325833264,39783.7136697233
-					55333.333333333336,39000.0
-					55078.689325833264,38216.2863302767
-					54412.0226591666,37731.9246449398
-					53587.9773408334,37731.9246449398
-					52921.310674166736,38216.2863302767
-					52666.666666666664,39000.0
-					52921.310674166736,39783.7136697233
-					53587.9773408334,40268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>58412.0226591666,40268.0753550602
-					59078.689325833264,39783.7136697233
-					59333.333333333336,39000.0
-					59078.689325833264,38216.2863302767
-					58412.0226591666,37731.9246449398
-					57587.9773408334,37731.9246449398
-					56921.310674166736,38216.2863302767
-					56666.666666666664,39000.0
-					56921.310674166736,39783.7136697233
-					57587.9773408334,40268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-	</MultiLineString>
-	
-	<MultiLineString>
-		<lineStringMember>
-			<LineString>
-				<coordinates>22412.022659166596,46268.0753550602
-					23078.689325833264,45783.7136697233
-					23333.333333333332,45000.0
-					23078.689325833264,44216.2863302767
-					22412.022659166596,43731.9246449398
-					21587.977340833404,43731.9246449398
-					20921.310674166736,44216.2863302767
-					20666.666666666668,45000.0
-					20921.310674166736,45783.7136697233
-					21587.977340833404,46268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>26412.022659166596,46268.0753550602
-					27078.689325833264,45783.7136697233
-					27333.333333333332,45000.0
-					27078.689325833264,44216.2863302767
-					26412.022659166596,43731.9246449398
-					25587.977340833404,43731.9246449398
-					24921.310674166736,44216.2863302767
-					24666.666666666668,45000.0
-					24921.310674166736,45783.7136697233
-					25587.977340833404,46268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>22412.022659166596,52268.0753550602
-					23078.689325833264,51783.7136697233
-					23333.333333333332,51000.0
-					23078.689325833264,50216.2863302767
-					22412.022659166596,49731.9246449398
-					21587.977340833404,49731.9246449398
-					20921.310674166736,50216.2863302767
-					20666.666666666668,51000.0
-					20921.310674166736,51783.7136697233
-					21587.977340833404,52268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>26412.022659166596,52268.0753550602
-					27078.689325833264,51783.7136697233
-					27333.333333333332,51000.0
-					27078.689325833264,50216.2863302767
-					26412.022659166596,49731.9246449398
-					25587.977340833404,49731.9246449398
-					24921.310674166736,50216.2863302767
-					24666.666666666668,51000.0
-					24921.310674166736,51783.7136697233
-					25587.977340833404,52268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-	</MultiLineString>
-	
-	<MultiLineString>
-		<lineStringMember>
-			<LineString>
-				<coordinates>30412.022659166596,46268.0753550602
-					31078.689325833264,45783.7136697233
-					31333.333333333332,45000.0
-					31078.689325833264,44216.2863302767
-					30412.022659166596,43731.9246449398
-					29587.977340833404,43731.9246449398
-					28921.310674166736,44216.2863302767
-					28666.666666666668,45000.0
-					28921.310674166736,45783.7136697233
-					29587.977340833404,46268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>34412.0226591666,46268.0753550602
-					35078.689325833264,45783.7136697233
-					35333.333333333336,45000.0
-					35078.689325833264,44216.2863302767
-					34412.0226591666,43731.9246449398
-					33587.9773408334,43731.9246449398
-					32921.310674166736,44216.2863302767
-					32666.666666666668,45000.0
-					32921.310674166736,45783.7136697233
-					33587.9773408334,46268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>30412.022659166596,52268.0753550602
-					31078.689325833264,51783.7136697233
-					31333.333333333332,51000.0
-					31078.689325833264,50216.2863302767
-					30412.022659166596,49731.9246449398
-					29587.977340833404,49731.9246449398
-					28921.310674166736,50216.2863302767
-					28666.666666666668,51000.0
-					28921.310674166736,51783.7136697233
-					29587.977340833404,52268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>34412.0226591666,52268.0753550602
-					35078.689325833264,51783.7136697233
-					35333.333333333336,51000.0
-					35078.689325833264,50216.2863302767
-					34412.0226591666,49731.9246449398
-					33587.9773408334,49731.9246449398
-					32921.310674166736,50216.2863302767
-					32666.666666666668,51000.0
-					32921.310674166736,51783.7136697233
-					33587.9773408334,52268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-	</MultiLineString>
-	
-	<MultiLineString>
-		<lineStringMember>
-			<LineString>
-				<coordinates>38412.0226591666,46268.0753550602
-					39078.689325833264,45783.7136697233
-					39333.333333333336,45000.0
-					39078.689325833264,44216.2863302767
-					38412.0226591666,43731.9246449398
-					37587.9773408334,43731.9246449398
-					36921.310674166736,44216.2863302767
-					36666.666666666664,45000.0
-					36921.310674166736,45783.7136697233
-					37587.9773408334,46268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>42412.0226591666,46268.0753550602
-					43078.689325833264,45783.7136697233
-					43333.333333333336,45000.0
-					43078.689325833264,44216.2863302767
-					42412.0226591666,43731.9246449398
-					41587.9773408334,43731.9246449398
-					40921.310674166736,44216.2863302767
-					40666.666666666664,45000.0
-					40921.310674166736,45783.7136697233
-					41587.9773408334,46268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>38412.0226591666,52268.0753550602
-					39078.689325833264,51783.7136697233
-					39333.333333333336,51000.0
-					39078.689325833264,50216.2863302767
-					38412.0226591666,49731.9246449398
-					37587.9773408334,49731.9246449398
-					36921.310674166736,50216.2863302767
-					36666.666666666664,51000.0
-					36921.310674166736,51783.7136697233
-					37587.9773408334,52268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>42412.0226591666,52268.0753550602
-					43078.689325833264,51783.7136697233
-					43333.333333333336,51000.0
-					43078.689325833264,50216.2863302767
-					42412.0226591666,49731.9246449398
-					41587.9773408334,49731.9246449398
-					40921.310674166736,50216.2863302767
-					40666.666666666664,51000.0
-					40921.310674166736,51783.7136697233
-					41587.9773408334,52268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-	</MultiLineString>
-	
-	<MultiLineString>
-		<lineStringMember>
-			<LineString>
-				<coordinates>46412.0226591666,46268.0753550602
-					47078.689325833264,45783.7136697233
-					47333.333333333336,45000.0
-					47078.689325833264,44216.2863302767
-					46412.0226591666,43731.9246449398
-					45587.9773408334,43731.9246449398
-					44921.310674166736,44216.2863302767
-					44666.666666666664,45000.0
-					44921.310674166736,45783.7136697233
-					45587.9773408334,46268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>50412.0226591666,46268.0753550602
-					51078.689325833264,45783.7136697233
-					51333.333333333336,45000.0
-					51078.689325833264,44216.2863302767
-					50412.0226591666,43731.9246449398
-					49587.9773408334,43731.9246449398
-					48921.310674166736,44216.2863302767
-					48666.666666666664,45000.0
-					48921.310674166736,45783.7136697233
-					49587.9773408334,46268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>46412.0226591666,52268.0753550602
-					47078.689325833264,51783.7136697233
-					47333.333333333336,51000.0
-					47078.689325833264,50216.2863302767
-					46412.0226591666,49731.9246449398
-					45587.9773408334,49731.9246449398
-					44921.310674166736,50216.2863302767
-					44666.666666666664,51000.0
-					44921.310674166736,51783.7136697233
-					45587.9773408334,52268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>50412.0226591666,52268.0753550602
-					51078.689325833264,51783.7136697233
-					51333.333333333336,51000.0
-					51078.689325833264,50216.2863302767
-					50412.0226591666,49731.9246449398
-					49587.9773408334,49731.9246449398
-					48921.310674166736,50216.2863302767
-					48666.666666666664,51000.0
-					48921.310674166736,51783.7136697233
-					49587.9773408334,52268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-	</MultiLineString>
-	
-	<MultiLineString>
-		<lineStringMember>
-			<LineString>
-				<coordinates>54412.0226591666,46268.0753550602
-					55078.689325833264,45783.7136697233
-					55333.333333333336,45000.0
-					55078.689325833264,44216.2863302767
-					54412.0226591666,43731.9246449398
-					53587.9773408334,43731.9246449398
-					52921.310674166736,44216.2863302767
-					52666.666666666664,45000.0
-					52921.310674166736,45783.7136697233
-					53587.9773408334,46268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>58412.0226591666,46268.0753550602
-					59078.689325833264,45783.7136697233
-					59333.333333333336,45000.0
-					59078.689325833264,44216.2863302767
-					58412.0226591666,43731.9246449398
-					57587.9773408334,43731.9246449398
-					56921.310674166736,44216.2863302767
-					56666.666666666664,45000.0
-					56921.310674166736,45783.7136697233
-					57587.9773408334,46268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>54412.0226591666,52268.0753550602
-					55078.689325833264,51783.7136697233
-					55333.333333333336,51000.0
-					55078.689325833264,50216.2863302767
-					54412.0226591666,49731.9246449398
-					53587.9773408334,49731.9246449398
-					52921.310674166736,50216.2863302767
-					52666.666666666664,51000.0
-					52921.310674166736,51783.7136697233
-					53587.9773408334,52268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>58412.0226591666,52268.0753550602
-					59078.689325833264,51783.7136697233
-					59333.333333333336,51000.0
-					59078.689325833264,50216.2863302767
-					58412.0226591666,49731.9246449398
-					57587.9773408334,49731.9246449398
-					56921.310674166736,50216.2863302767
-					56666.666666666664,51000.0
-					56921.310674166736,51783.7136697233
-					57587.9773408334,52268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-	</MultiLineString>
-	
-	<MultiLineString>
-		<lineStringMember>
-			<LineString>
-				<coordinates>22412.022659166596,58268.0753550602
-					23078.689325833264,57783.7136697233
-					23333.333333333332,57000.0
-					23078.689325833264,56216.2863302767
-					22412.022659166596,55731.9246449398
-					21587.977340833404,55731.9246449398
-					20921.310674166736,56216.2863302767
-					20666.666666666668,57000.0
-					20921.310674166736,57783.7136697233
-					21587.977340833404,58268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>26412.022659166596,58268.0753550602
-					27078.689325833264,57783.7136697233
-					27333.333333333332,57000.0
-					27078.689325833264,56216.2863302767
-					26412.022659166596,55731.9246449398
-					25587.977340833404,55731.9246449398
-					24921.310674166736,56216.2863302767
-					24666.666666666668,57000.0
-					24921.310674166736,57783.7136697233
-					25587.977340833404,58268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>22412.022659166596,64268.0753550602
-					23078.689325833264,63783.7136697233
-					23333.333333333332,63000.0
-					23078.689325833264,62216.2863302767
-					22412.022659166596,61731.9246449398
-					21587.977340833404,61731.9246449398
-					20921.310674166736,62216.2863302767
-					20666.666666666668,63000.0
-					20921.310674166736,63783.7136697233
-					21587.977340833404,64268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>26412.022659166596,64268.0753550602
-					27078.689325833264,63783.7136697233
-					27333.333333333332,63000.0
-					27078.689325833264,62216.2863302767
-					26412.022659166596,61731.9246449398
-					25587.977340833404,61731.9246449398
-					24921.310674166736,62216.2863302767
-					24666.666666666668,63000.0
-					24921.310674166736,63783.7136697233
-					25587.977340833404,64268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-	</MultiLineString>
-	
-	<MultiLineString>
-		<lineStringMember>
-			<LineString>
-				<coordinates>30412.022659166596,58268.0753550602
-					31078.689325833264,57783.7136697233
-					31333.333333333332,57000.0
-					31078.689325833264,56216.2863302767
-					30412.022659166596,55731.9246449398
-					29587.977340833404,55731.9246449398
-					28921.310674166736,56216.2863302767
-					28666.666666666668,57000.0
-					28921.310674166736,57783.7136697233
-					29587.977340833404,58268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>34412.0226591666,58268.0753550602
-					35078.689325833264,57783.7136697233
-					35333.333333333336,57000.0
-					35078.689325833264,56216.2863302767
-					34412.0226591666,55731.9246449398
-					33587.9773408334,55731.9246449398
-					32921.310674166736,56216.2863302767
-					32666.666666666668,57000.0
-					32921.310674166736,57783.7136697233
-					33587.9773408334,58268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>30412.022659166596,64268.0753550602
-					31078.689325833264,63783.7136697233
-					31333.333333333332,63000.0
-					31078.689325833264,62216.2863302767
-					30412.022659166596,61731.9246449398
-					29587.977340833404,61731.9246449398
-					28921.310674166736,62216.2863302767
-					28666.666666666668,63000.0
-					28921.310674166736,63783.7136697233
-					29587.977340833404,64268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>34412.0226591666,64268.0753550602
-					35078.689325833264,63783.7136697233
-					35333.333333333336,63000.0
-					35078.689325833264,62216.2863302767
-					34412.0226591666,61731.9246449398
-					33587.9773408334,61731.9246449398
-					32921.310674166736,62216.2863302767
-					32666.666666666668,63000.0
-					32921.310674166736,63783.7136697233
-					33587.9773408334,64268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-	</MultiLineString>
-	
-	<MultiLineString>
-		<lineStringMember>
-			<LineString>
-				<coordinates>38412.0226591666,58268.0753550602
-					39078.689325833264,57783.7136697233
-					39333.333333333336,57000.0
-					39078.689325833264,56216.2863302767
-					38412.0226591666,55731.9246449398
-					37587.9773408334,55731.9246449398
-					36921.310674166736,56216.2863302767
-					36666.666666666664,57000.0
-					36921.310674166736,57783.7136697233
-					37587.9773408334,58268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>42412.0226591666,58268.0753550602
-					43078.689325833264,57783.7136697233
-					43333.333333333336,57000.0
-					43078.689325833264,56216.2863302767
-					42412.0226591666,55731.9246449398
-					41587.9773408334,55731.9246449398
-					40921.310674166736,56216.2863302767
-					40666.666666666664,57000.0
-					40921.310674166736,57783.7136697233
-					41587.9773408334,58268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>38412.0226591666,64268.0753550602
-					39078.689325833264,63783.7136697233
-					39333.333333333336,63000.0
-					39078.689325833264,62216.2863302767
-					38412.0226591666,61731.9246449398
-					37587.9773408334,61731.9246449398
-					36921.310674166736,62216.2863302767
-					36666.666666666664,63000.0
-					36921.310674166736,63783.7136697233
-					37587.9773408334,64268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>42412.0226591666,64268.0753550602
-					43078.689325833264,63783.7136697233
-					43333.333333333336,63000.0
-					43078.689325833264,62216.2863302767
-					42412.0226591666,61731.9246449398
-					41587.9773408334,61731.9246449398
-					40921.310674166736,62216.2863302767
-					40666.666666666664,63000.0
-					40921.310674166736,63783.7136697233
-					41587.9773408334,64268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-	</MultiLineString>
-	
-	<MultiLineString>
-		<lineStringMember>
-			<LineString>
-				<coordinates>46412.0226591666,58268.0753550602
-					47078.689325833264,57783.7136697233
-					47333.333333333336,57000.0
-					47078.689325833264,56216.2863302767
-					46412.0226591666,55731.9246449398
-					45587.9773408334,55731.9246449398
-					44921.310674166736,56216.2863302767
-					44666.666666666664,57000.0
-					44921.310674166736,57783.7136697233
-					45587.9773408334,58268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>50412.0226591666,58268.0753550602
-					51078.689325833264,57783.7136697233
-					51333.333333333336,57000.0
-					51078.689325833264,56216.2863302767
-					50412.0226591666,55731.9246449398
-					49587.9773408334,55731.9246449398
-					48921.310674166736,56216.2863302767
-					48666.666666666664,57000.0
-					48921.310674166736,57783.7136697233
-					49587.9773408334,58268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>46412.0226591666,64268.0753550602
-					47078.689325833264,63783.7136697233
-					47333.333333333336,63000.0
-					47078.689325833264,62216.2863302767
-					46412.0226591666,61731.9246449398
-					45587.9773408334,61731.9246449398
-					44921.310674166736,62216.2863302767
-					44666.666666666664,63000.0
-					44921.310674166736,63783.7136697233
-					45587.9773408334,64268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>50412.0226591666,64268.0753550602
-					51078.689325833264,63783.7136697233
-					51333.333333333336,63000.0
-					51078.689325833264,62216.2863302767
-					50412.0226591666,61731.9246449398
-					49587.9773408334,61731.9246449398
-					48921.310674166736,62216.2863302767
-					48666.666666666664,63000.0
-					48921.310674166736,63783.7136697233
-					49587.9773408334,64268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-	</MultiLineString>
-	
-	<MultiLineString>
-		<lineStringMember>
-			<LineString>
-				<coordinates>54412.0226591666,58268.0753550602
-					55078.689325833264,57783.7136697233
-					55333.333333333336,57000.0
-					55078.689325833264,56216.2863302767
-					54412.0226591666,55731.9246449398
-					53587.9773408334,55731.9246449398
-					52921.310674166736,56216.2863302767
-					52666.666666666664,57000.0
-					52921.310674166736,57783.7136697233
-					53587.9773408334,58268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>58412.0226591666,58268.0753550602
-					59078.689325833264,57783.7136697233
-					59333.333333333336,57000.0
-					59078.689325833264,56216.2863302767
-					58412.0226591666,55731.9246449398
-					57587.9773408334,55731.9246449398
-					56921.310674166736,56216.2863302767
-					56666.666666666664,57000.0
-					56921.310674166736,57783.7136697233
-					57587.9773408334,58268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>54412.0226591666,64268.0753550602
-					55078.689325833264,63783.7136697233
-					55333.333333333336,63000.0
-					55078.689325833264,62216.2863302767
-					54412.0226591666,61731.9246449398
-					53587.9773408334,61731.9246449398
-					52921.310674166736,62216.2863302767
-					52666.666666666664,63000.0
-					52921.310674166736,63783.7136697233
-					53587.9773408334,64268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>58412.0226591666,64268.0753550602
-					59078.689325833264,63783.7136697233
-					59333.333333333336,63000.0
-					59078.689325833264,62216.2863302767
-					58412.0226591666,61731.9246449398
-					57587.9773408334,61731.9246449398
-					56921.310674166736,62216.2863302767
-					56666.666666666664,63000.0
-					56921.310674166736,63783.7136697233
-					57587.9773408334,64268.0753550602 </coordinates>
-			</LineString>
-		</lineStringMember>
-	</MultiLineString>
-	
-	<MultiLineString>
-		<lineStringMember>
-			<LineString>
-				<coordinates>22412.022659166596,70268.07535506021
-					23078.689325833264,69783.71366972329
-					23333.333333333332,69000.0
-					23078.689325833264,68216.28633027671
-					22412.022659166596,67731.92464493979
-					21587.977340833404,67731.92464493979
-					20921.310674166736,68216.28633027671
-					20666.666666666668,69000.0
-					20921.310674166736,69783.71366972329
-					21587.977340833404,70268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>26412.022659166596,70268.07535506021
-					27078.689325833264,69783.71366972329
-					27333.333333333332,69000.0
-					27078.689325833264,68216.28633027671
-					26412.022659166596,67731.92464493979
-					25587.977340833404,67731.92464493979
-					24921.310674166736,68216.28633027671
-					24666.666666666668,69000.0
-					24921.310674166736,69783.71366972329
-					25587.977340833404,70268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>22412.022659166596,76268.07535506021
-					23078.689325833264,75783.71366972329
-					23333.333333333332,75000.0
-					23078.689325833264,74216.28633027671
-					22412.022659166596,73731.92464493979
-					21587.977340833404,73731.92464493979
-					20921.310674166736,74216.28633027671
-					20666.666666666668,75000.0
-					20921.310674166736,75783.71366972329
-					21587.977340833404,76268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>26412.022659166596,76268.07535506021
-					27078.689325833264,75783.71366972329
-					27333.333333333332,75000.0
-					27078.689325833264,74216.28633027671
-					26412.022659166596,73731.92464493979
-					25587.977340833404,73731.92464493979
-					24921.310674166736,74216.28633027671
-					24666.666666666668,75000.0
-					24921.310674166736,75783.71366972329
-					25587.977340833404,76268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-	</MultiLineString>
-	
-	<MultiLineString>
-		<lineStringMember>
-			<LineString>
-				<coordinates>30412.022659166596,70268.07535506021
-					31078.689325833264,69783.71366972329
-					31333.333333333332,69000.0
-					31078.689325833264,68216.28633027671
-					30412.022659166596,67731.92464493979
-					29587.977340833404,67731.92464493979
-					28921.310674166736,68216.28633027671
-					28666.666666666668,69000.0
-					28921.310674166736,69783.71366972329
-					29587.977340833404,70268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>34412.0226591666,70268.07535506021
-					35078.689325833264,69783.71366972329
-					35333.333333333336,69000.0
-					35078.689325833264,68216.28633027671
-					34412.0226591666,67731.92464493979
-					33587.9773408334,67731.92464493979
-					32921.310674166736,68216.28633027671
-					32666.666666666668,69000.0
-					32921.310674166736,69783.71366972329
-					33587.9773408334,70268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>30412.022659166596,76268.07535506021
-					31078.689325833264,75783.71366972329
-					31333.333333333332,75000.0
-					31078.689325833264,74216.28633027671
-					30412.022659166596,73731.92464493979
-					29587.977340833404,73731.92464493979
-					28921.310674166736,74216.28633027671
-					28666.666666666668,75000.0
-					28921.310674166736,75783.71366972329
-					29587.977340833404,76268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>34412.0226591666,76268.07535506021
-					35078.689325833264,75783.71366972329
-					35333.333333333336,75000.0
-					35078.689325833264,74216.28633027671
-					34412.0226591666,73731.92464493979
-					33587.9773408334,73731.92464493979
-					32921.310674166736,74216.28633027671
-					32666.666666666668,75000.0
-					32921.310674166736,75783.71366972329
-					33587.9773408334,76268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-	</MultiLineString>
-	
-	<MultiLineString>
-		<lineStringMember>
-			<LineString>
-				<coordinates>38412.0226591666,70268.07535506021
-					39078.689325833264,69783.71366972329
-					39333.333333333336,69000.0
-					39078.689325833264,68216.28633027671
-					38412.0226591666,67731.92464493979
-					37587.9773408334,67731.92464493979
-					36921.310674166736,68216.28633027671
-					36666.666666666664,69000.0
-					36921.310674166736,69783.71366972329
-					37587.9773408334,70268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>42412.0226591666,70268.07535506021
-					43078.689325833264,69783.71366972329
-					43333.333333333336,69000.0
-					43078.689325833264,68216.28633027671
-					42412.0226591666,67731.92464493979
-					41587.9773408334,67731.92464493979
-					40921.310674166736,68216.28633027671
-					40666.666666666664,69000.0
-					40921.310674166736,69783.71366972329
-					41587.9773408334,70268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>38412.0226591666,76268.07535506021
-					39078.689325833264,75783.71366972329
-					39333.333333333336,75000.0
-					39078.689325833264,74216.28633027671
-					38412.0226591666,73731.92464493979
-					37587.9773408334,73731.92464493979
-					36921.310674166736,74216.28633027671
-					36666.666666666664,75000.0
-					36921.310674166736,75783.71366972329
-					37587.9773408334,76268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>42412.0226591666,76268.07535506021
-					43078.689325833264,75783.71366972329
-					43333.333333333336,75000.0
-					43078.689325833264,74216.28633027671
-					42412.0226591666,73731.92464493979
-					41587.9773408334,73731.92464493979
-					40921.310674166736,74216.28633027671
-					40666.666666666664,75000.0
-					40921.310674166736,75783.71366972329
-					41587.9773408334,76268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-	</MultiLineString>
-	
-	<MultiLineString>
-		<lineStringMember>
-			<LineString>
-				<coordinates>46412.0226591666,70268.07535506021
-					47078.689325833264,69783.71366972329
-					47333.333333333336,69000.0
-					47078.689325833264,68216.28633027671
-					46412.0226591666,67731.92464493979
-					45587.9773408334,67731.92464493979
-					44921.310674166736,68216.28633027671
-					44666.666666666664,69000.0
-					44921.310674166736,69783.71366972329
-					45587.9773408334,70268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>50412.0226591666,70268.07535506021
-					51078.689325833264,69783.71366972329
-					51333.333333333336,69000.0
-					51078.689325833264,68216.28633027671
-					50412.0226591666,67731.92464493979
-					49587.9773408334,67731.92464493979
-					48921.310674166736,68216.28633027671
-					48666.666666666664,69000.0
-					48921.310674166736,69783.71366972329
-					49587.9773408334,70268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>46412.0226591666,76268.07535506021
-					47078.689325833264,75783.71366972329
-					47333.333333333336,75000.0
-					47078.689325833264,74216.28633027671
-					46412.0226591666,73731.92464493979
-					45587.9773408334,73731.92464493979
-					44921.310674166736,74216.28633027671
-					44666.666666666664,75000.0
-					44921.310674166736,75783.71366972329
-					45587.9773408334,76268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>50412.0226591666,76268.07535506021
-					51078.689325833264,75783.71366972329
-					51333.333333333336,75000.0
-					51078.689325833264,74216.28633027671
-					50412.0226591666,73731.92464493979
-					49587.9773408334,73731.92464493979
-					48921.310674166736,74216.28633027671
-					48666.666666666664,75000.0
-					48921.310674166736,75783.71366972329
-					49587.9773408334,76268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-	</MultiLineString>
-	
-	<MultiLineString>
-		<lineStringMember>
-			<LineString>
-				<coordinates>54412.0226591666,70268.07535506021
-					55078.689325833264,69783.71366972329
-					55333.333333333336,69000.0
-					55078.689325833264,68216.28633027671
-					54412.0226591666,67731.92464493979
-					53587.9773408334,67731.92464493979
-					52921.310674166736,68216.28633027671
-					52666.666666666664,69000.0
-					52921.310674166736,69783.71366972329
-					53587.9773408334,70268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>58412.0226591666,70268.07535506021
-					59078.689325833264,69783.71366972329
-					59333.333333333336,69000.0
-					59078.689325833264,68216.28633027671
-					58412.0226591666,67731.92464493979
-					57587.9773408334,67731.92464493979
-					56921.310674166736,68216.28633027671
-					56666.666666666664,69000.0
-					56921.310674166736,69783.71366972329
-					57587.9773408334,70268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>54412.0226591666,76268.07535506021
-					55078.689325833264,75783.71366972329
-					55333.333333333336,75000.0
-					55078.689325833264,74216.28633027671
-					54412.0226591666,73731.92464493979
-					53587.9773408334,73731.92464493979
-					52921.310674166736,74216.28633027671
-					52666.666666666664,75000.0
-					52921.310674166736,75783.71366972329
-					53587.9773408334,76268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>58412.0226591666,76268.07535506021
-					59078.689325833264,75783.71366972329
-					59333.333333333336,75000.0
-					59078.689325833264,74216.28633027671
-					58412.0226591666,73731.92464493979
-					57587.9773408334,73731.92464493979
-					56921.310674166736,74216.28633027671
-					56666.666666666664,75000.0
-					56921.310674166736,75783.71366972329
-					57587.9773408334,76268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-	</MultiLineString>
-	
-	<MultiLineString>
-		<lineStringMember>
-			<LineString>
-				<coordinates>22412.022659166596,82268.07535506021
-					23078.689325833264,81783.71366972329
-					23333.333333333332,81000.0
-					23078.689325833264,80216.28633027671
-					22412.022659166596,79731.92464493979
-					21587.977340833404,79731.92464493979
-					20921.310674166736,80216.28633027671
-					20666.666666666668,81000.0
-					20921.310674166736,81783.71366972329
-					21587.977340833404,82268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>26412.022659166596,82268.07535506021
-					27078.689325833264,81783.71366972329
-					27333.333333333332,81000.0
-					27078.689325833264,80216.28633027671
-					26412.022659166596,79731.92464493979
-					25587.977340833404,79731.92464493979
-					24921.310674166736,80216.28633027671
-					24666.666666666668,81000.0
-					24921.310674166736,81783.71366972329
-					25587.977340833404,82268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>22412.022659166596,88268.07535506021
-					23078.689325833264,87783.71366972329
-					23333.333333333332,87000.0
-					23078.689325833264,86216.28633027671
-					22412.022659166596,85731.92464493979
-					21587.977340833404,85731.92464493979
-					20921.310674166736,86216.28633027671
-					20666.666666666668,87000.0
-					20921.310674166736,87783.71366972329
-					21587.977340833404,88268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>26412.022659166596,88268.07535506021
-					27078.689325833264,87783.71366972329
-					27333.333333333332,87000.0
-					27078.689325833264,86216.28633027671
-					26412.022659166596,85731.92464493979
-					25587.977340833404,85731.92464493979
-					24921.310674166736,86216.28633027671
-					24666.666666666668,87000.0
-					24921.310674166736,87783.71366972329
-					25587.977340833404,88268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-	</MultiLineString>
-	
-	<MultiLineString>
-		<lineStringMember>
-			<LineString>
-				<coordinates>30412.022659166596,82268.07535506021
-					31078.689325833264,81783.71366972329
-					31333.333333333332,81000.0
-					31078.689325833264,80216.28633027671
-					30412.022659166596,79731.92464493979
-					29587.977340833404,79731.92464493979
-					28921.310674166736,80216.28633027671
-					28666.666666666668,81000.0
-					28921.310674166736,81783.71366972329
-					29587.977340833404,82268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>34412.0226591666,82268.07535506021
-					35078.689325833264,81783.71366972329
-					35333.333333333336,81000.0
-					35078.689325833264,80216.28633027671
-					34412.0226591666,79731.92464493979
-					33587.9773408334,79731.92464493979
-					32921.310674166736,80216.28633027671
-					32666.666666666668,81000.0
-					32921.310674166736,81783.71366972329
-					33587.9773408334,82268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>30412.022659166596,88268.07535506021
-					31078.689325833264,87783.71366972329
-					31333.333333333332,87000.0
-					31078.689325833264,86216.28633027671
-					30412.022659166596,85731.92464493979
-					29587.977340833404,85731.92464493979
-					28921.310674166736,86216.28633027671
-					28666.666666666668,87000.0
-					28921.310674166736,87783.71366972329
-					29587.977340833404,88268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>34412.0226591666,88268.07535506021
-					35078.689325833264,87783.71366972329
-					35333.333333333336,87000.0
-					35078.689325833264,86216.28633027671
-					34412.0226591666,85731.92464493979
-					33587.9773408334,85731.92464493979
-					32921.310674166736,86216.28633027671
-					32666.666666666668,87000.0
-					32921.310674166736,87783.71366972329
-					33587.9773408334,88268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-	</MultiLineString>
-	
-	<MultiLineString>
-		<lineStringMember>
-			<LineString>
-				<coordinates>38412.0226591666,82268.07535506021
-					39078.689325833264,81783.71366972329
-					39333.333333333336,81000.0
-					39078.689325833264,80216.28633027671
-					38412.0226591666,79731.92464493979
-					37587.9773408334,79731.92464493979
-					36921.310674166736,80216.28633027671
-					36666.666666666664,81000.0
-					36921.310674166736,81783.71366972329
-					37587.9773408334,82268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>42412.0226591666,82268.07535506021
-					43078.689325833264,81783.71366972329
-					43333.333333333336,81000.0
-					43078.689325833264,80216.28633027671
-					42412.0226591666,79731.92464493979
-					41587.9773408334,79731.92464493979
-					40921.310674166736,80216.28633027671
-					40666.666666666664,81000.0
-					40921.310674166736,81783.71366972329
-					41587.9773408334,82268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>38412.0226591666,88268.07535506021
-					39078.689325833264,87783.71366972329
-					39333.333333333336,87000.0
-					39078.689325833264,86216.28633027671
-					38412.0226591666,85731.92464493979
-					37587.9773408334,85731.92464493979
-					36921.310674166736,86216.28633027671
-					36666.666666666664,87000.0
-					36921.310674166736,87783.71366972329
-					37587.9773408334,88268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>42412.0226591666,88268.07535506021
-					43078.689325833264,87783.71366972329
-					43333.333333333336,87000.0
-					43078.689325833264,86216.28633027671
-					42412.0226591666,85731.92464493979
-					41587.9773408334,85731.92464493979
-					40921.310674166736,86216.28633027671
-					40666.666666666664,87000.0
-					40921.310674166736,87783.71366972329
-					41587.9773408334,88268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-	</MultiLineString>
-	
-	<MultiLineString>
-		<lineStringMember>
-			<LineString>
-				<coordinates>46412.0226591666,82268.07535506021
-					47078.689325833264,81783.71366972329
-					47333.333333333336,81000.0
-					47078.689325833264,80216.28633027671
-					46412.0226591666,79731.92464493979
-					45587.9773408334,79731.92464493979
-					44921.310674166736,80216.28633027671
-					44666.666666666664,81000.0
-					44921.310674166736,81783.71366972329
-					45587.9773408334,82268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>50412.0226591666,82268.07535506021
-					51078.689325833264,81783.71366972329
-					51333.333333333336,81000.0
-					51078.689325833264,80216.28633027671
-					50412.0226591666,79731.92464493979
-					49587.9773408334,79731.92464493979
-					48921.310674166736,80216.28633027671
-					48666.666666666664,81000.0
-					48921.310674166736,81783.71366972329
-					49587.9773408334,82268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>46412.0226591666,88268.07535506021
-					47078.689325833264,87783.71366972329
-					47333.333333333336,87000.0
-					47078.689325833264,86216.28633027671
-					46412.0226591666,85731.92464493979
-					45587.9773408334,85731.92464493979
-					44921.310674166736,86216.28633027671
-					44666.666666666664,87000.0
-					44921.310674166736,87783.71366972329
-					45587.9773408334,88268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>50412.0226591666,88268.07535506021
-					51078.689325833264,87783.71366972329
-					51333.333333333336,87000.0
-					51078.689325833264,86216.28633027671
-					50412.0226591666,85731.92464493979
-					49587.9773408334,85731.92464493979
-					48921.310674166736,86216.28633027671
-					48666.666666666664,87000.0
-					48921.310674166736,87783.71366972329
-					49587.9773408334,88268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-	</MultiLineString>
-	
-	<MultiLineString>
-		<lineStringMember>
-			<LineString>
-				<coordinates>54412.0226591666,82268.07535506021
-					55078.689325833264,81783.71366972329
-					55333.333333333336,81000.0
-					55078.689325833264,80216.28633027671
-					54412.0226591666,79731.92464493979
-					53587.9773408334,79731.92464493979
-					52921.310674166736,80216.28633027671
-					52666.666666666664,81000.0
-					52921.310674166736,81783.71366972329
-					53587.9773408334,82268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>58412.0226591666,82268.07535506021
-					59078.689325833264,81783.71366972329
-					59333.333333333336,81000.0
-					59078.689325833264,80216.28633027671
-					58412.0226591666,79731.92464493979
-					57587.9773408334,79731.92464493979
-					56921.310674166736,80216.28633027671
-					56666.666666666664,81000.0
-					56921.310674166736,81783.71366972329
-					57587.9773408334,82268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>54412.0226591666,88268.07535506021
-					55078.689325833264,87783.71366972329
-					55333.333333333336,87000.0
-					55078.689325833264,86216.28633027671
-					54412.0226591666,85731.92464493979
-					53587.9773408334,85731.92464493979
-					52921.310674166736,86216.28633027671
-					52666.666666666664,87000.0
-					52921.310674166736,87783.71366972329
-					53587.9773408334,88268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-		<lineStringMember>
-			<LineString>
-				<coordinates>58412.0226591666,88268.07535506021
-					59078.689325833264,87783.71366972329
-					59333.333333333336,87000.0
-					59078.689325833264,86216.28633027671
-					58412.0226591666,85731.92464493979
-					57587.9773408334,85731.92464493979
-					56921.310674166736,86216.28633027671
-					56666.666666666664,87000.0
-					56921.310674166736,87783.71366972329
-					57587.9773408334,88268.07535506021 </coordinates>
-			</LineString>
-		</lineStringMember>
-	</MultiLineString>
-</MultiGeometry>
diff --git a/jtsio/test/data/multipoints.xml b/jtsio/test/data/multipoints.xml
deleted file mode 100644
index 2875686..0000000
--- a/jtsio/test/data/multipoints.xml
+++ /dev/null
@@ -1,580 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-
-<MultiGeometry>
-	
-	<MultiPoint>
-		<pointMember>
-			<Point>
-				<coordinates>22000.0,33000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>26000.0,33000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>22000.0,39000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>26000.0,39000.0 </coordinates>
-			</Point>
-		</pointMember>
-	</MultiPoint>
-	
-	<MultiPoint>
-		<pointMember>
-			<Point>
-				<coordinates>30000.0,33000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>34000.0,33000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>30000.0,39000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>34000.0,39000.0 </coordinates>
-			</Point>
-		</pointMember>
-	</MultiPoint>
-	
-	<MultiPoint>
-		<pointMember>
-			<Point>
-				<coordinates>38000.0,33000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>42000.0,33000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>38000.0,39000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>42000.0,39000.0 </coordinates>
-			</Point>
-		</pointMember>
-	</MultiPoint>
-	
-	<MultiPoint>
-		<pointMember>
-			<Point>
-				<coordinates>46000.0,33000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>50000.0,33000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>46000.0,39000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>50000.0,39000.0 </coordinates>
-			</Point>
-		</pointMember>
-	</MultiPoint>
-	
-	<MultiPoint>
-		<pointMember>
-			<Point>
-				<coordinates>54000.0,33000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>58000.0,33000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>54000.0,39000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>58000.0,39000.0 </coordinates>
-			</Point>
-		</pointMember>
-	</MultiPoint>
-	
-	<MultiPoint>
-		<pointMember>
-			<Point>
-				<coordinates>22000.0,45000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>26000.0,45000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>22000.0,51000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>26000.0,51000.0 </coordinates>
-			</Point>
-		</pointMember>
-	</MultiPoint>
-	
-	<MultiPoint>
-		<pointMember>
-			<Point>
-				<coordinates>30000.0,45000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>34000.0,45000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>30000.0,51000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>34000.0,51000.0 </coordinates>
-			</Point>
-		</pointMember>
-	</MultiPoint>
-	
-	<MultiPoint>
-		<pointMember>
-			<Point>
-				<coordinates>38000.0,45000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>42000.0,45000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>38000.0,51000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>42000.0,51000.0 </coordinates>
-			</Point>
-		</pointMember>
-	</MultiPoint>
-	
-	<MultiPoint>
-		<pointMember>
-			<Point>
-				<coordinates>46000.0,45000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>50000.0,45000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>46000.0,51000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>50000.0,51000.0 </coordinates>
-			</Point>
-		</pointMember>
-	</MultiPoint>
-	
-	<MultiPoint>
-		<pointMember>
-			<Point>
-				<coordinates>54000.0,45000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>58000.0,45000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>54000.0,51000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>58000.0,51000.0 </coordinates>
-			</Point>
-		</pointMember>
-	</MultiPoint>
-	
-	<MultiPoint>
-		<pointMember>
-			<Point>
-				<coordinates>22000.0,57000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>26000.0,57000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>22000.0,63000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>26000.0,63000.0 </coordinates>
-			</Point>
-		</pointMember>
-	</MultiPoint>
-	
-	<MultiPoint>
-		<pointMember>
-			<Point>
-				<coordinates>30000.0,57000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>34000.0,57000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>30000.0,63000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>34000.0,63000.0 </coordinates>
-			</Point>
-		</pointMember>
-	</MultiPoint>
-	
-	<MultiPoint>
-		<pointMember>
-			<Point>
-				<coordinates>38000.0,57000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>42000.0,57000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>38000.0,63000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>42000.0,63000.0 </coordinates>
-			</Point>
-		</pointMember>
-	</MultiPoint>
-	
-	<MultiPoint>
-		<pointMember>
-			<Point>
-				<coordinates>46000.0,57000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>50000.0,57000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>46000.0,63000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>50000.0,63000.0 </coordinates>
-			</Point>
-		</pointMember>
-	</MultiPoint>
-	
-	<MultiPoint>
-		<pointMember>
-			<Point>
-				<coordinates>54000.0,57000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>58000.0,57000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>54000.0,63000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>58000.0,63000.0 </coordinates>
-			</Point>
-		</pointMember>
-	</MultiPoint>
-	
-	<MultiPoint>
-		<pointMember>
-			<Point>
-				<coordinates>22000.0,69000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>26000.0,69000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>22000.0,75000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>26000.0,75000.0 </coordinates>
-			</Point>
-		</pointMember>
-	</MultiPoint>
-	
-	<MultiPoint>
-		<pointMember>
-			<Point>
-				<coordinates>30000.0,69000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>34000.0,69000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>30000.0,75000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>34000.0,75000.0 </coordinates>
-			</Point>
-		</pointMember>
-	</MultiPoint>
-	
-	<MultiPoint>
-		<pointMember>
-			<Point>
-				<coordinates>38000.0,69000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>42000.0,69000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>38000.0,75000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>42000.0,75000.0 </coordinates>
-			</Point>
-		</pointMember>
-	</MultiPoint>
-	
-	<MultiPoint>
-		<pointMember>
-			<Point>
-				<coordinates>46000.0,69000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>50000.0,69000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>46000.0,75000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>50000.0,75000.0 </coordinates>
-			</Point>
-		</pointMember>
-	</MultiPoint>
-	
-	<MultiPoint>
-		<pointMember>
-			<Point>
-				<coordinates>54000.0,69000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>58000.0,69000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>54000.0,75000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>58000.0,75000.0 </coordinates>
-			</Point>
-		</pointMember>
-	</MultiPoint>
-	
-	<MultiPoint>
-		<pointMember>
-			<Point>
-				<coordinates>22000.0,81000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>26000.0,81000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>22000.0,87000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>26000.0,87000.0 </coordinates>
-			</Point>
-		</pointMember>
-	</MultiPoint>
-	
-	<MultiPoint>
-		<pointMember>
-			<Point>
-				<coordinates>30000.0,81000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>34000.0,81000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>30000.0,87000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>34000.0,87000.0 </coordinates>
-			</Point>
-		</pointMember>
-	</MultiPoint>
-	
-	<MultiPoint>
-		<pointMember>
-			<Point>
-				<coordinates>38000.0,81000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>42000.0,81000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>38000.0,87000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>42000.0,87000.0 </coordinates>
-			</Point>
-		</pointMember>
-	</MultiPoint>
-	
-	<MultiPoint>
-		<pointMember>
-			<Point>
-				<coordinates>46000.0,81000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>50000.0,81000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>46000.0,87000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>50000.0,87000.0 </coordinates>
-			</Point>
-		</pointMember>
-	</MultiPoint>
-	
-	<MultiPoint>
-		<pointMember>
-			<Point>
-				<coordinates>54000.0,81000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>58000.0,81000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>54000.0,87000.0 </coordinates>
-			</Point>
-		</pointMember>
-		<pointMember>
-			<Point>
-				<coordinates>58000.0,87000.0 </coordinates>
-			</Point>
-		</pointMember>
-	</MultiPoint>
-	
-</MultiGeometry>
diff --git a/jtsio/test/data/multipolygons.xml b/jtsio/test/data/multipolygons.xml
deleted file mode 100644
index 8db27f8..0000000
--- a/jtsio/test/data/multipolygons.xml
+++ /dev/null
@@ -1,8380 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-
-<MultiGeometry>
-	
-	<MultiPolygon>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,34333.333333333336
-							22783.713669723296,34078.689325833264
-							23268.075355060206,33412.0226591666
-							23268.075355060206,32587.977340833404
-							22783.713669723296,31921.310674166736
-							22000.0,31666.666666666668
-							21216.286330276704,31921.310674166736
-							20731.924644939794,32587.977340833404
-							20731.924644939794,33412.0226591666
-							21216.286330276704,34078.689325833264
-							22000.0,34333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,33000.0
-							22669.13060635886,33743.14482547739
-							22034.8994967025,33999.390827019095 22000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,33000.0
-							22998.629534754575,33052.33595624295
-							22731.35370161917,33681.9983600625 22000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,33000.0
-							22743.144825477393,32330.869393641144
-							22999.390827019095,32965.1005032975 22000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,33000.0
-							22052.335956242943,32001.370465245425
-							22681.9983600625,32268.64629838083 22000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,33000.0
-							21330.86939364114,32256.855174522607
-							21965.1005032975,32000.609172980905 22000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,33000.0
-							21001.370465245425,32947.66404375705
-							21268.64629838083,32318.0016399375 22000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,33000.0
-							21256.855174522607,33669.130606358856
-							21000.609172980905,33034.8994967025 22000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,33000.0
-							21947.664043757057,33998.629534754575
-							21318.0016399375,33731.35370161917 22000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,34333.333333333336
-							26783.713669723296,34078.689325833264
-							27268.075355060206,33412.0226591666
-							27268.075355060206,32587.977340833404
-							26783.713669723296,31921.310674166736
-							26000.0,31666.666666666668
-							25216.286330276704,31921.310674166736
-							24731.924644939794,32587.977340833404
-							24731.924644939794,33412.0226591666
-							25216.286330276704,34078.689325833264
-							26000.0,34333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,33000.0
-							26669.13060635886,33743.14482547739
-							26034.8994967025,33999.390827019095 26000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,33000.0
-							26998.629534754575,33052.33595624295
-							26731.35370161917,33681.9983600625 26000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,33000.0
-							26743.144825477393,32330.869393641144
-							26999.390827019095,32965.1005032975 26000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,33000.0
-							26052.335956242943,32001.370465245425
-							26681.9983600625,32268.64629838083 26000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,33000.0
-							25330.86939364114,32256.855174522607
-							25965.1005032975,32000.609172980905 26000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,33000.0
-							25001.370465245425,32947.66404375705
-							25268.64629838083,32318.0016399375 26000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,33000.0
-							25256.855174522607,33669.130606358856
-							25000.609172980905,33034.8994967025 26000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,33000.0
-							25947.664043757057,33998.629534754575
-							25318.0016399375,33731.35370161917 26000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,40333.333333333336
-							22783.713669723296,40078.689325833264
-							23268.075355060206,39412.0226591666
-							23268.075355060206,38587.9773408334
-							22783.713669723296,37921.310674166736
-							22000.0,37666.666666666664
-							21216.286330276704,37921.310674166736
-							20731.924644939794,38587.9773408334
-							20731.924644939794,39412.0226591666
-							21216.286330276704,40078.689325833264
-							22000.0,40333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,39000.0
-							22669.13060635886,39743.14482547739
-							22034.8994967025,39999.390827019095 22000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,39000.0
-							22998.629534754575,39052.33595624295
-							22731.35370161917,39681.9983600625 22000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,39000.0
-							22743.144825477393,38330.869393641144
-							22999.390827019095,38965.1005032975 22000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,39000.0
-							22052.335956242943,38001.370465245425
-							22681.9983600625,38268.64629838083 22000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,39000.0
-							21330.86939364114,38256.85517452261
-							21965.1005032975,38000.609172980905 22000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,39000.0
-							21001.370465245425,38947.66404375705
-							21268.64629838083,38318.0016399375 22000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,39000.0
-							21256.855174522607,39669.130606358856
-							21000.609172980905,39034.8994967025 22000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,39000.0
-							21947.664043757057,39998.629534754575
-							21318.0016399375,39731.35370161917 22000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,40333.333333333336
-							26783.713669723296,40078.689325833264
-							27268.075355060206,39412.0226591666
-							27268.075355060206,38587.9773408334
-							26783.713669723296,37921.310674166736
-							26000.0,37666.666666666664
-							25216.286330276704,37921.310674166736
-							24731.924644939794,38587.9773408334
-							24731.924644939794,39412.0226591666
-							25216.286330276704,40078.689325833264
-							26000.0,40333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,39000.0
-							26669.13060635886,39743.14482547739
-							26034.8994967025,39999.390827019095 26000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,39000.0
-							26998.629534754575,39052.33595624295
-							26731.35370161917,39681.9983600625 26000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,39000.0
-							26743.144825477393,38330.869393641144
-							26999.390827019095,38965.1005032975 26000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,39000.0
-							26052.335956242943,38001.370465245425
-							26681.9983600625,38268.64629838083 26000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,39000.0
-							25330.86939364114,38256.85517452261
-							25965.1005032975,38000.609172980905 26000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,39000.0
-							25001.370465245425,38947.66404375705
-							25268.64629838083,38318.0016399375 26000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,39000.0
-							25256.855174522607,39669.130606358856
-							25000.609172980905,39034.8994967025 26000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,39000.0
-							25947.664043757057,39998.629534754575
-							25318.0016399375,39731.35370161917 26000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-	</MultiPolygon>
-	
-	<MultiPolygon>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,34333.333333333336
-							30783.713669723296,34078.689325833264
-							31268.075355060206,33412.0226591666
-							31268.075355060206,32587.977340833404
-							30783.713669723296,31921.310674166736
-							30000.0,31666.666666666668
-							29216.286330276704,31921.310674166736
-							28731.924644939794,32587.977340833404
-							28731.924644939794,33412.0226591666
-							29216.286330276704,34078.689325833264
-							30000.0,34333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,33000.0
-							30669.13060635886,33743.14482547739
-							30034.8994967025,33999.390827019095 30000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,33000.0
-							30998.629534754575,33052.33595624295
-							30731.35370161917,33681.9983600625 30000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,33000.0
-							30743.144825477393,32330.869393641144
-							30999.390827019095,32965.1005032975 30000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,33000.0
-							30052.335956242943,32001.370465245425
-							30681.9983600625,32268.64629838083 30000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,33000.0
-							29330.86939364114,32256.855174522607
-							29965.1005032975,32000.609172980905 30000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,33000.0
-							29001.370465245425,32947.66404375705
-							29268.64629838083,32318.0016399375 30000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,33000.0
-							29256.855174522607,33669.130606358856
-							29000.609172980905,33034.8994967025 30000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,33000.0
-							29947.664043757057,33998.629534754575
-							29318.0016399375,33731.35370161917 30000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,34333.333333333336
-							34783.7136697233,34078.689325833264
-							35268.0753550602,33412.0226591666
-							35268.0753550602,32587.977340833404
-							34783.7136697233,31921.310674166736
-							34000.0,31666.666666666668
-							33216.2863302767,31921.310674166736
-							32731.924644939794,32587.977340833404
-							32731.924644939794,33412.0226591666
-							33216.2863302767,34078.689325833264
-							34000.0,34333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,33000.0
-							34669.130606358856,33743.14482547739
-							34034.8994967025,33999.390827019095 34000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,33000.0
-							34998.629534754575,33052.33595624295
-							34731.35370161917,33681.9983600625 34000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,33000.0
-							34743.14482547739,32330.869393641144
-							34999.390827019095,32965.1005032975 34000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,33000.0
-							34052.33595624295,32001.370465245425
-							34681.9983600625,32268.64629838083 34000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,33000.0
-							33330.869393641144,32256.855174522607
-							33965.1005032975,32000.609172980905 34000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,33000.0
-							33001.370465245425,32947.66404375705
-							33268.64629838083,32318.0016399375 34000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,33000.0
-							33256.85517452261,33669.130606358856
-							33000.609172980905,33034.8994967025 34000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,33000.0
-							33947.66404375705,33998.629534754575
-							33318.0016399375,33731.35370161917 34000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,40333.333333333336
-							30783.713669723296,40078.689325833264
-							31268.075355060206,39412.0226591666
-							31268.075355060206,38587.9773408334
-							30783.713669723296,37921.310674166736
-							30000.0,37666.666666666664
-							29216.286330276704,37921.310674166736
-							28731.924644939794,38587.9773408334
-							28731.924644939794,39412.0226591666
-							29216.286330276704,40078.689325833264
-							30000.0,40333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,39000.0
-							30669.13060635886,39743.14482547739
-							30034.8994967025,39999.390827019095 30000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,39000.0
-							30998.629534754575,39052.33595624295
-							30731.35370161917,39681.9983600625 30000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,39000.0
-							30743.144825477393,38330.869393641144
-							30999.390827019095,38965.1005032975 30000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,39000.0
-							30052.335956242943,38001.370465245425
-							30681.9983600625,38268.64629838083 30000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,39000.0
-							29330.86939364114,38256.85517452261
-							29965.1005032975,38000.609172980905 30000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,39000.0
-							29001.370465245425,38947.66404375705
-							29268.64629838083,38318.0016399375 30000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,39000.0
-							29256.855174522607,39669.130606358856
-							29000.609172980905,39034.8994967025 30000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,39000.0
-							29947.664043757057,39998.629534754575
-							29318.0016399375,39731.35370161917 30000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,40333.333333333336
-							34783.7136697233,40078.689325833264
-							35268.0753550602,39412.0226591666
-							35268.0753550602,38587.9773408334
-							34783.7136697233,37921.310674166736
-							34000.0,37666.666666666664
-							33216.2863302767,37921.310674166736
-							32731.924644939794,38587.9773408334
-							32731.924644939794,39412.0226591666
-							33216.2863302767,40078.689325833264
-							34000.0,40333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,39000.0
-							34669.130606358856,39743.14482547739
-							34034.8994967025,39999.390827019095 34000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,39000.0
-							34998.629534754575,39052.33595624295
-							34731.35370161917,39681.9983600625 34000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,39000.0
-							34743.14482547739,38330.869393641144
-							34999.390827019095,38965.1005032975 34000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,39000.0
-							34052.33595624295,38001.370465245425
-							34681.9983600625,38268.64629838083 34000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,39000.0
-							33330.869393641144,38256.85517452261
-							33965.1005032975,38000.609172980905 34000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,39000.0
-							33001.370465245425,38947.66404375705
-							33268.64629838083,38318.0016399375 34000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,39000.0
-							33256.85517452261,39669.130606358856
-							33000.609172980905,39034.8994967025 34000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,39000.0
-							33947.66404375705,39998.629534754575
-							33318.0016399375,39731.35370161917 34000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-	</MultiPolygon>
-	
-	<MultiPolygon>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,34333.333333333336
-							38783.7136697233,34078.689325833264
-							39268.0753550602,33412.0226591666
-							39268.0753550602,32587.977340833404
-							38783.7136697233,31921.310674166736
-							38000.0,31666.666666666668
-							37216.2863302767,31921.310674166736
-							36731.9246449398,32587.977340833404
-							36731.9246449398,33412.0226591666
-							37216.2863302767,34078.689325833264
-							38000.0,34333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,33000.0
-							38669.130606358856,33743.14482547739
-							38034.8994967025,33999.390827019095 38000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,33000.0
-							38998.629534754575,33052.33595624295
-							38731.35370161917,33681.9983600625 38000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,33000.0
-							38743.14482547739,32330.869393641144
-							38999.390827019095,32965.1005032975 38000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,33000.0
-							38052.33595624295,32001.370465245425
-							38681.9983600625,32268.64629838083 38000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,33000.0
-							37330.869393641144,32256.855174522607
-							37965.1005032975,32000.609172980905 38000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,33000.0
-							37001.370465245425,32947.66404375705
-							37268.64629838083,32318.0016399375 38000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,33000.0
-							37256.85517452261,33669.130606358856
-							37000.609172980905,33034.8994967025 38000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,33000.0
-							37947.66404375705,33998.629534754575
-							37318.0016399375,33731.35370161917 38000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,34333.333333333336
-							42783.7136697233,34078.689325833264
-							43268.0753550602,33412.0226591666
-							43268.0753550602,32587.977340833404
-							42783.7136697233,31921.310674166736
-							42000.0,31666.666666666668
-							41216.2863302767,31921.310674166736
-							40731.9246449398,32587.977340833404
-							40731.9246449398,33412.0226591666
-							41216.2863302767,34078.689325833264
-							42000.0,34333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,33000.0
-							42669.130606358856,33743.14482547739
-							42034.8994967025,33999.390827019095 42000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,33000.0
-							42998.629534754575,33052.33595624295
-							42731.35370161917,33681.9983600625 42000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,33000.0
-							42743.14482547739,32330.869393641144
-							42999.390827019095,32965.1005032975 42000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,33000.0
-							42052.33595624295,32001.370465245425
-							42681.9983600625,32268.64629838083 42000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,33000.0
-							41330.869393641144,32256.855174522607
-							41965.1005032975,32000.609172980905 42000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,33000.0
-							41001.370465245425,32947.66404375705
-							41268.64629838083,32318.0016399375 42000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,33000.0
-							41256.85517452261,33669.130606358856
-							41000.609172980905,33034.8994967025 42000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,33000.0
-							41947.66404375705,33998.629534754575
-							41318.0016399375,33731.35370161917 42000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,40333.333333333336
-							38783.7136697233,40078.689325833264
-							39268.0753550602,39412.0226591666
-							39268.0753550602,38587.9773408334
-							38783.7136697233,37921.310674166736
-							38000.0,37666.666666666664
-							37216.2863302767,37921.310674166736
-							36731.9246449398,38587.9773408334
-							36731.9246449398,39412.0226591666
-							37216.2863302767,40078.689325833264
-							38000.0,40333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,39000.0
-							38669.130606358856,39743.14482547739
-							38034.8994967025,39999.390827019095 38000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,39000.0
-							38998.629534754575,39052.33595624295
-							38731.35370161917,39681.9983600625 38000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,39000.0
-							38743.14482547739,38330.869393641144
-							38999.390827019095,38965.1005032975 38000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,39000.0
-							38052.33595624295,38001.370465245425
-							38681.9983600625,38268.64629838083 38000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,39000.0
-							37330.869393641144,38256.85517452261
-							37965.1005032975,38000.609172980905 38000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,39000.0
-							37001.370465245425,38947.66404375705
-							37268.64629838083,38318.0016399375 38000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,39000.0
-							37256.85517452261,39669.130606358856
-							37000.609172980905,39034.8994967025 38000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,39000.0
-							37947.66404375705,39998.629534754575
-							37318.0016399375,39731.35370161917 38000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,40333.333333333336
-							42783.7136697233,40078.689325833264
-							43268.0753550602,39412.0226591666
-							43268.0753550602,38587.9773408334
-							42783.7136697233,37921.310674166736
-							42000.0,37666.666666666664
-							41216.2863302767,37921.310674166736
-							40731.9246449398,38587.9773408334
-							40731.9246449398,39412.0226591666
-							41216.2863302767,40078.689325833264
-							42000.0,40333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,39000.0
-							42669.130606358856,39743.14482547739
-							42034.8994967025,39999.390827019095 42000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,39000.0
-							42998.629534754575,39052.33595624295
-							42731.35370161917,39681.9983600625 42000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,39000.0
-							42743.14482547739,38330.869393641144
-							42999.390827019095,38965.1005032975 42000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,39000.0
-							42052.33595624295,38001.370465245425
-							42681.9983600625,38268.64629838083 42000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,39000.0
-							41330.869393641144,38256.85517452261
-							41965.1005032975,38000.609172980905 42000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,39000.0
-							41001.370465245425,38947.66404375705
-							41268.64629838083,38318.0016399375 42000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,39000.0
-							41256.85517452261,39669.130606358856
-							41000.609172980905,39034.8994967025 42000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,39000.0
-							41947.66404375705,39998.629534754575
-							41318.0016399375,39731.35370161917 42000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-	</MultiPolygon>
-	
-	<MultiPolygon>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,34333.333333333336
-							46783.7136697233,34078.689325833264
-							47268.0753550602,33412.0226591666
-							47268.0753550602,32587.977340833404
-							46783.7136697233,31921.310674166736
-							46000.0,31666.666666666668
-							45216.2863302767,31921.310674166736
-							44731.9246449398,32587.977340833404
-							44731.9246449398,33412.0226591666
-							45216.2863302767,34078.689325833264
-							46000.0,34333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,33000.0
-							46669.130606358856,33743.14482547739
-							46034.8994967025,33999.390827019095 46000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,33000.0
-							46998.629534754575,33052.33595624295
-							46731.35370161917,33681.9983600625 46000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,33000.0
-							46743.14482547739,32330.869393641144
-							46999.390827019095,32965.1005032975 46000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,33000.0
-							46052.33595624295,32001.370465245425
-							46681.9983600625,32268.64629838083 46000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,33000.0
-							45330.869393641144,32256.855174522607
-							45965.1005032975,32000.609172980905 46000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,33000.0
-							45001.370465245425,32947.66404375705
-							45268.64629838083,32318.0016399375 46000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,33000.0
-							45256.85517452261,33669.130606358856
-							45000.609172980905,33034.8994967025 46000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,33000.0
-							45947.66404375705,33998.629534754575
-							45318.0016399375,33731.35370161917 46000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,34333.333333333336
-							50783.7136697233,34078.689325833264
-							51268.0753550602,33412.0226591666
-							51268.0753550602,32587.977340833404
-							50783.7136697233,31921.310674166736
-							50000.0,31666.666666666668
-							49216.2863302767,31921.310674166736
-							48731.9246449398,32587.977340833404
-							48731.9246449398,33412.0226591666
-							49216.2863302767,34078.689325833264
-							50000.0,34333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,33000.0
-							50669.130606358856,33743.14482547739
-							50034.8994967025,33999.390827019095 50000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,33000.0
-							50998.629534754575,33052.33595624295
-							50731.35370161917,33681.9983600625 50000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,33000.0
-							50743.14482547739,32330.869393641144
-							50999.390827019095,32965.1005032975 50000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,33000.0
-							50052.33595624295,32001.370465245425
-							50681.9983600625,32268.64629838083 50000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,33000.0
-							49330.869393641144,32256.855174522607
-							49965.1005032975,32000.609172980905 50000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,33000.0
-							49001.370465245425,32947.66404375705
-							49268.64629838083,32318.0016399375 50000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,33000.0
-							49256.85517452261,33669.130606358856
-							49000.609172980905,33034.8994967025 50000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,33000.0
-							49947.66404375705,33998.629534754575
-							49318.0016399375,33731.35370161917 50000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,40333.333333333336
-							46783.7136697233,40078.689325833264
-							47268.0753550602,39412.0226591666
-							47268.0753550602,38587.9773408334
-							46783.7136697233,37921.310674166736
-							46000.0,37666.666666666664
-							45216.2863302767,37921.310674166736
-							44731.9246449398,38587.9773408334
-							44731.9246449398,39412.0226591666
-							45216.2863302767,40078.689325833264
-							46000.0,40333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,39000.0
-							46669.130606358856,39743.14482547739
-							46034.8994967025,39999.390827019095 46000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,39000.0
-							46998.629534754575,39052.33595624295
-							46731.35370161917,39681.9983600625 46000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,39000.0
-							46743.14482547739,38330.869393641144
-							46999.390827019095,38965.1005032975 46000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,39000.0
-							46052.33595624295,38001.370465245425
-							46681.9983600625,38268.64629838083 46000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,39000.0
-							45330.869393641144,38256.85517452261
-							45965.1005032975,38000.609172980905 46000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,39000.0
-							45001.370465245425,38947.66404375705
-							45268.64629838083,38318.0016399375 46000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,39000.0
-							45256.85517452261,39669.130606358856
-							45000.609172980905,39034.8994967025 46000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,39000.0
-							45947.66404375705,39998.629534754575
-							45318.0016399375,39731.35370161917 46000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,40333.333333333336
-							50783.7136697233,40078.689325833264
-							51268.0753550602,39412.0226591666
-							51268.0753550602,38587.9773408334
-							50783.7136697233,37921.310674166736
-							50000.0,37666.666666666664
-							49216.2863302767,37921.310674166736
-							48731.9246449398,38587.9773408334
-							48731.9246449398,39412.0226591666
-							49216.2863302767,40078.689325833264
-							50000.0,40333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,39000.0
-							50669.130606358856,39743.14482547739
-							50034.8994967025,39999.390827019095 50000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,39000.0
-							50998.629534754575,39052.33595624295
-							50731.35370161917,39681.9983600625 50000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,39000.0
-							50743.14482547739,38330.869393641144
-							50999.390827019095,38965.1005032975 50000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,39000.0
-							50052.33595624295,38001.370465245425
-							50681.9983600625,38268.64629838083 50000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,39000.0
-							49330.869393641144,38256.85517452261
-							49965.1005032975,38000.609172980905 50000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,39000.0
-							49001.370465245425,38947.66404375705
-							49268.64629838083,38318.0016399375 50000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,39000.0
-							49256.85517452261,39669.130606358856
-							49000.609172980905,39034.8994967025 50000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,39000.0
-							49947.66404375705,39998.629534754575
-							49318.0016399375,39731.35370161917 50000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-	</MultiPolygon>
-	
-	<MultiPolygon>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,34333.333333333336
-							54783.7136697233,34078.689325833264
-							55268.0753550602,33412.0226591666
-							55268.0753550602,32587.977340833404
-							54783.7136697233,31921.310674166736
-							54000.0,31666.666666666668
-							53216.2863302767,31921.310674166736
-							52731.9246449398,32587.977340833404
-							52731.9246449398,33412.0226591666
-							53216.2863302767,34078.689325833264
-							54000.0,34333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,33000.0
-							54669.130606358856,33743.14482547739
-							54034.8994967025,33999.390827019095 54000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,33000.0
-							54998.629534754575,33052.33595624295
-							54731.35370161917,33681.9983600625 54000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,33000.0
-							54743.14482547739,32330.869393641144
-							54999.390827019095,32965.1005032975 54000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,33000.0
-							54052.33595624295,32001.370465245425
-							54681.9983600625,32268.64629838083 54000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,33000.0
-							53330.869393641144,32256.855174522607
-							53965.1005032975,32000.609172980905 54000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,33000.0
-							53001.370465245425,32947.66404375705
-							53268.64629838083,32318.0016399375 54000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,33000.0
-							53256.85517452261,33669.130606358856
-							53000.609172980905,33034.8994967025 54000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,33000.0
-							53947.66404375705,33998.629534754575
-							53318.0016399375,33731.35370161917 54000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,34333.333333333336
-							58783.7136697233,34078.689325833264
-							59268.0753550602,33412.0226591666
-							59268.0753550602,32587.977340833404
-							58783.7136697233,31921.310674166736
-							58000.0,31666.666666666668
-							57216.2863302767,31921.310674166736
-							56731.9246449398,32587.977340833404
-							56731.9246449398,33412.0226591666
-							57216.2863302767,34078.689325833264
-							58000.0,34333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,33000.0
-							58669.130606358856,33743.14482547739
-							58034.8994967025,33999.390827019095 58000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,33000.0
-							58998.629534754575,33052.33595624295
-							58731.35370161917,33681.9983600625 58000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,33000.0
-							58743.14482547739,32330.869393641144
-							58999.390827019095,32965.1005032975 58000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,33000.0
-							58052.33595624295,32001.370465245425
-							58681.9983600625,32268.64629838083 58000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,33000.0
-							57330.869393641144,32256.855174522607
-							57965.1005032975,32000.609172980905 58000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,33000.0
-							57001.370465245425,32947.66404375705
-							57268.64629838083,32318.0016399375 58000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,33000.0
-							57256.85517452261,33669.130606358856
-							57000.609172980905,33034.8994967025 58000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,33000.0
-							57947.66404375705,33998.629534754575
-							57318.0016399375,33731.35370161917 58000.0,33000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,40333.333333333336
-							54783.7136697233,40078.689325833264
-							55268.0753550602,39412.0226591666
-							55268.0753550602,38587.9773408334
-							54783.7136697233,37921.310674166736
-							54000.0,37666.666666666664
-							53216.2863302767,37921.310674166736
-							52731.9246449398,38587.9773408334
-							52731.9246449398,39412.0226591666
-							53216.2863302767,40078.689325833264
-							54000.0,40333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,39000.0
-							54669.130606358856,39743.14482547739
-							54034.8994967025,39999.390827019095 54000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,39000.0
-							54998.629534754575,39052.33595624295
-							54731.35370161917,39681.9983600625 54000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,39000.0
-							54743.14482547739,38330.869393641144
-							54999.390827019095,38965.1005032975 54000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,39000.0
-							54052.33595624295,38001.370465245425
-							54681.9983600625,38268.64629838083 54000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,39000.0
-							53330.869393641144,38256.85517452261
-							53965.1005032975,38000.609172980905 54000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,39000.0
-							53001.370465245425,38947.66404375705
-							53268.64629838083,38318.0016399375 54000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,39000.0
-							53256.85517452261,39669.130606358856
-							53000.609172980905,39034.8994967025 54000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,39000.0
-							53947.66404375705,39998.629534754575
-							53318.0016399375,39731.35370161917 54000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,40333.333333333336
-							58783.7136697233,40078.689325833264
-							59268.0753550602,39412.0226591666
-							59268.0753550602,38587.9773408334
-							58783.7136697233,37921.310674166736
-							58000.0,37666.666666666664
-							57216.2863302767,37921.310674166736
-							56731.9246449398,38587.9773408334
-							56731.9246449398,39412.0226591666
-							57216.2863302767,40078.689325833264
-							58000.0,40333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,39000.0
-							58669.130606358856,39743.14482547739
-							58034.8994967025,39999.390827019095 58000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,39000.0
-							58998.629534754575,39052.33595624295
-							58731.35370161917,39681.9983600625 58000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,39000.0
-							58743.14482547739,38330.869393641144
-							58999.390827019095,38965.1005032975 58000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,39000.0
-							58052.33595624295,38001.370465245425
-							58681.9983600625,38268.64629838083 58000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,39000.0
-							57330.869393641144,38256.85517452261
-							57965.1005032975,38000.609172980905 58000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,39000.0
-							57001.370465245425,38947.66404375705
-							57268.64629838083,38318.0016399375 58000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,39000.0
-							57256.85517452261,39669.130606358856
-							57000.609172980905,39034.8994967025 58000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,39000.0
-							57947.66404375705,39998.629534754575
-							57318.0016399375,39731.35370161917 58000.0,39000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-	</MultiPolygon>
-	
-	<MultiPolygon>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,46333.333333333336
-							22783.713669723296,46078.689325833264
-							23268.075355060206,45412.0226591666
-							23268.075355060206,44587.9773408334
-							22783.713669723296,43921.310674166736
-							22000.0,43666.666666666664
-							21216.286330276704,43921.310674166736
-							20731.924644939794,44587.9773408334
-							20731.924644939794,45412.0226591666
-							21216.286330276704,46078.689325833264
-							22000.0,46333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,45000.0
-							22669.13060635886,45743.14482547739
-							22034.8994967025,45999.390827019095 22000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,45000.0
-							22998.629534754575,45052.33595624295
-							22731.35370161917,45681.9983600625 22000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,45000.0
-							22743.144825477393,44330.869393641144
-							22999.390827019095,44965.1005032975 22000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,45000.0
-							22052.335956242943,44001.370465245425
-							22681.9983600625,44268.64629838083 22000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,45000.0
-							21330.86939364114,44256.85517452261
-							21965.1005032975,44000.609172980905 22000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,45000.0
-							21001.370465245425,44947.66404375705
-							21268.64629838083,44318.0016399375 22000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,45000.0
-							21256.855174522607,45669.130606358856
-							21000.609172980905,45034.8994967025 22000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,45000.0
-							21947.664043757057,45998.629534754575
-							21318.0016399375,45731.35370161917 22000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,46333.333333333336
-							26783.713669723296,46078.689325833264
-							27268.075355060206,45412.0226591666
-							27268.075355060206,44587.9773408334
-							26783.713669723296,43921.310674166736
-							26000.0,43666.666666666664
-							25216.286330276704,43921.310674166736
-							24731.924644939794,44587.9773408334
-							24731.924644939794,45412.0226591666
-							25216.286330276704,46078.689325833264
-							26000.0,46333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,45000.0
-							26669.13060635886,45743.14482547739
-							26034.8994967025,45999.390827019095 26000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,45000.0
-							26998.629534754575,45052.33595624295
-							26731.35370161917,45681.9983600625 26000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,45000.0
-							26743.144825477393,44330.869393641144
-							26999.390827019095,44965.1005032975 26000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,45000.0
-							26052.335956242943,44001.370465245425
-							26681.9983600625,44268.64629838083 26000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,45000.0
-							25330.86939364114,44256.85517452261
-							25965.1005032975,44000.609172980905 26000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,45000.0
-							25001.370465245425,44947.66404375705
-							25268.64629838083,44318.0016399375 26000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,45000.0
-							25256.855174522607,45669.130606358856
-							25000.609172980905,45034.8994967025 26000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,45000.0
-							25947.664043757057,45998.629534754575
-							25318.0016399375,45731.35370161917 26000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,52333.333333333336
-							22783.713669723296,52078.689325833264
-							23268.075355060206,51412.0226591666
-							23268.075355060206,50587.9773408334
-							22783.713669723296,49921.310674166736
-							22000.0,49666.666666666664
-							21216.286330276704,49921.310674166736
-							20731.924644939794,50587.9773408334
-							20731.924644939794,51412.0226591666
-							21216.286330276704,52078.689325833264
-							22000.0,52333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,51000.0
-							22669.13060635886,51743.14482547739
-							22034.8994967025,51999.390827019095 22000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,51000.0
-							22998.629534754575,51052.33595624295
-							22731.35370161917,51681.9983600625 22000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,51000.0
-							22743.144825477393,50330.869393641144
-							22999.390827019095,50965.1005032975 22000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,51000.0
-							22052.335956242943,50001.370465245425
-							22681.9983600625,50268.64629838083 22000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,51000.0
-							21330.86939364114,50256.85517452261
-							21965.1005032975,50000.609172980905 22000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,51000.0
-							21001.370465245425,50947.66404375705
-							21268.64629838083,50318.0016399375 22000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,51000.0
-							21256.855174522607,51669.130606358856
-							21000.609172980905,51034.8994967025 22000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,51000.0
-							21947.664043757057,51998.629534754575
-							21318.0016399375,51731.35370161917 22000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,52333.333333333336
-							26783.713669723296,52078.689325833264
-							27268.075355060206,51412.0226591666
-							27268.075355060206,50587.9773408334
-							26783.713669723296,49921.310674166736
-							26000.0,49666.666666666664
-							25216.286330276704,49921.310674166736
-							24731.924644939794,50587.9773408334
-							24731.924644939794,51412.0226591666
-							25216.286330276704,52078.689325833264
-							26000.0,52333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,51000.0
-							26669.13060635886,51743.14482547739
-							26034.8994967025,51999.390827019095 26000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,51000.0
-							26998.629534754575,51052.33595624295
-							26731.35370161917,51681.9983600625 26000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,51000.0
-							26743.144825477393,50330.869393641144
-							26999.390827019095,50965.1005032975 26000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,51000.0
-							26052.335956242943,50001.370465245425
-							26681.9983600625,50268.64629838083 26000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,51000.0
-							25330.86939364114,50256.85517452261
-							25965.1005032975,50000.609172980905 26000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,51000.0
-							25001.370465245425,50947.66404375705
-							25268.64629838083,50318.0016399375 26000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,51000.0
-							25256.855174522607,51669.130606358856
-							25000.609172980905,51034.8994967025 26000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,51000.0
-							25947.664043757057,51998.629534754575
-							25318.0016399375,51731.35370161917 26000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-	</MultiPolygon>
-	
-	<MultiPolygon>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,46333.333333333336
-							30783.713669723296,46078.689325833264
-							31268.075355060206,45412.0226591666
-							31268.075355060206,44587.9773408334
-							30783.713669723296,43921.310674166736
-							30000.0,43666.666666666664
-							29216.286330276704,43921.310674166736
-							28731.924644939794,44587.9773408334
-							28731.924644939794,45412.0226591666
-							29216.286330276704,46078.689325833264
-							30000.0,46333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,45000.0
-							30669.13060635886,45743.14482547739
-							30034.8994967025,45999.390827019095 30000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,45000.0
-							30998.629534754575,45052.33595624295
-							30731.35370161917,45681.9983600625 30000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,45000.0
-							30743.144825477393,44330.869393641144
-							30999.390827019095,44965.1005032975 30000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,45000.0
-							30052.335956242943,44001.370465245425
-							30681.9983600625,44268.64629838083 30000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,45000.0
-							29330.86939364114,44256.85517452261
-							29965.1005032975,44000.609172980905 30000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,45000.0
-							29001.370465245425,44947.66404375705
-							29268.64629838083,44318.0016399375 30000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,45000.0
-							29256.855174522607,45669.130606358856
-							29000.609172980905,45034.8994967025 30000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,45000.0
-							29947.664043757057,45998.629534754575
-							29318.0016399375,45731.35370161917 30000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,46333.333333333336
-							34783.7136697233,46078.689325833264
-							35268.0753550602,45412.0226591666
-							35268.0753550602,44587.9773408334
-							34783.7136697233,43921.310674166736
-							34000.0,43666.666666666664
-							33216.2863302767,43921.310674166736
-							32731.924644939794,44587.9773408334
-							32731.924644939794,45412.0226591666
-							33216.2863302767,46078.689325833264
-							34000.0,46333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,45000.0
-							34669.130606358856,45743.14482547739
-							34034.8994967025,45999.390827019095 34000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,45000.0
-							34998.629534754575,45052.33595624295
-							34731.35370161917,45681.9983600625 34000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,45000.0
-							34743.14482547739,44330.869393641144
-							34999.390827019095,44965.1005032975 34000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,45000.0
-							34052.33595624295,44001.370465245425
-							34681.9983600625,44268.64629838083 34000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,45000.0
-							33330.869393641144,44256.85517452261
-							33965.1005032975,44000.609172980905 34000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,45000.0
-							33001.370465245425,44947.66404375705
-							33268.64629838083,44318.0016399375 34000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,45000.0
-							33256.85517452261,45669.130606358856
-							33000.609172980905,45034.8994967025 34000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,45000.0
-							33947.66404375705,45998.629534754575
-							33318.0016399375,45731.35370161917 34000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,52333.333333333336
-							30783.713669723296,52078.689325833264
-							31268.075355060206,51412.0226591666
-							31268.075355060206,50587.9773408334
-							30783.713669723296,49921.310674166736
-							30000.0,49666.666666666664
-							29216.286330276704,49921.310674166736
-							28731.924644939794,50587.9773408334
-							28731.924644939794,51412.0226591666
-							29216.286330276704,52078.689325833264
-							30000.0,52333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,51000.0
-							30669.13060635886,51743.14482547739
-							30034.8994967025,51999.390827019095 30000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,51000.0
-							30998.629534754575,51052.33595624295
-							30731.35370161917,51681.9983600625 30000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,51000.0
-							30743.144825477393,50330.869393641144
-							30999.390827019095,50965.1005032975 30000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,51000.0
-							30052.335956242943,50001.370465245425
-							30681.9983600625,50268.64629838083 30000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,51000.0
-							29330.86939364114,50256.85517452261
-							29965.1005032975,50000.609172980905 30000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,51000.0
-							29001.370465245425,50947.66404375705
-							29268.64629838083,50318.0016399375 30000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,51000.0
-							29256.855174522607,51669.130606358856
-							29000.609172980905,51034.8994967025 30000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,51000.0
-							29947.664043757057,51998.629534754575
-							29318.0016399375,51731.35370161917 30000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,52333.333333333336
-							34783.7136697233,52078.689325833264
-							35268.0753550602,51412.0226591666
-							35268.0753550602,50587.9773408334
-							34783.7136697233,49921.310674166736
-							34000.0,49666.666666666664
-							33216.2863302767,49921.310674166736
-							32731.924644939794,50587.9773408334
-							32731.924644939794,51412.0226591666
-							33216.2863302767,52078.689325833264
-							34000.0,52333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,51000.0
-							34669.130606358856,51743.14482547739
-							34034.8994967025,51999.390827019095 34000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,51000.0
-							34998.629534754575,51052.33595624295
-							34731.35370161917,51681.9983600625 34000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,51000.0
-							34743.14482547739,50330.869393641144
-							34999.390827019095,50965.1005032975 34000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,51000.0
-							34052.33595624295,50001.370465245425
-							34681.9983600625,50268.64629838083 34000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,51000.0
-							33330.869393641144,50256.85517452261
-							33965.1005032975,50000.609172980905 34000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,51000.0
-							33001.370465245425,50947.66404375705
-							33268.64629838083,50318.0016399375 34000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,51000.0
-							33256.85517452261,51669.130606358856
-							33000.609172980905,51034.8994967025 34000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,51000.0
-							33947.66404375705,51998.629534754575
-							33318.0016399375,51731.35370161917 34000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-	</MultiPolygon>
-	
-	<MultiPolygon>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,46333.333333333336
-							38783.7136697233,46078.689325833264
-							39268.0753550602,45412.0226591666
-							39268.0753550602,44587.9773408334
-							38783.7136697233,43921.310674166736
-							38000.0,43666.666666666664
-							37216.2863302767,43921.310674166736
-							36731.9246449398,44587.9773408334
-							36731.9246449398,45412.0226591666
-							37216.2863302767,46078.689325833264
-							38000.0,46333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,45000.0
-							38669.130606358856,45743.14482547739
-							38034.8994967025,45999.390827019095 38000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,45000.0
-							38998.629534754575,45052.33595624295
-							38731.35370161917,45681.9983600625 38000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,45000.0
-							38743.14482547739,44330.869393641144
-							38999.390827019095,44965.1005032975 38000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,45000.0
-							38052.33595624295,44001.370465245425
-							38681.9983600625,44268.64629838083 38000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,45000.0
-							37330.869393641144,44256.85517452261
-							37965.1005032975,44000.609172980905 38000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,45000.0
-							37001.370465245425,44947.66404375705
-							37268.64629838083,44318.0016399375 38000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,45000.0
-							37256.85517452261,45669.130606358856
-							37000.609172980905,45034.8994967025 38000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,45000.0
-							37947.66404375705,45998.629534754575
-							37318.0016399375,45731.35370161917 38000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,46333.333333333336
-							42783.7136697233,46078.689325833264
-							43268.0753550602,45412.0226591666
-							43268.0753550602,44587.9773408334
-							42783.7136697233,43921.310674166736
-							42000.0,43666.666666666664
-							41216.2863302767,43921.310674166736
-							40731.9246449398,44587.9773408334
-							40731.9246449398,45412.0226591666
-							41216.2863302767,46078.689325833264
-							42000.0,46333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,45000.0
-							42669.130606358856,45743.14482547739
-							42034.8994967025,45999.390827019095 42000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,45000.0
-							42998.629534754575,45052.33595624295
-							42731.35370161917,45681.9983600625 42000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,45000.0
-							42743.14482547739,44330.869393641144
-							42999.390827019095,44965.1005032975 42000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,45000.0
-							42052.33595624295,44001.370465245425
-							42681.9983600625,44268.64629838083 42000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,45000.0
-							41330.869393641144,44256.85517452261
-							41965.1005032975,44000.609172980905 42000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,45000.0
-							41001.370465245425,44947.66404375705
-							41268.64629838083,44318.0016399375 42000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,45000.0
-							41256.85517452261,45669.130606358856
-							41000.609172980905,45034.8994967025 42000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,45000.0
-							41947.66404375705,45998.629534754575
-							41318.0016399375,45731.35370161917 42000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,52333.333333333336
-							38783.7136697233,52078.689325833264
-							39268.0753550602,51412.0226591666
-							39268.0753550602,50587.9773408334
-							38783.7136697233,49921.310674166736
-							38000.0,49666.666666666664
-							37216.2863302767,49921.310674166736
-							36731.9246449398,50587.9773408334
-							36731.9246449398,51412.0226591666
-							37216.2863302767,52078.689325833264
-							38000.0,52333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,51000.0
-							38669.130606358856,51743.14482547739
-							38034.8994967025,51999.390827019095 38000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,51000.0
-							38998.629534754575,51052.33595624295
-							38731.35370161917,51681.9983600625 38000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,51000.0
-							38743.14482547739,50330.869393641144
-							38999.390827019095,50965.1005032975 38000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,51000.0
-							38052.33595624295,50001.370465245425
-							38681.9983600625,50268.64629838083 38000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,51000.0
-							37330.869393641144,50256.85517452261
-							37965.1005032975,50000.609172980905 38000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,51000.0
-							37001.370465245425,50947.66404375705
-							37268.64629838083,50318.0016399375 38000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,51000.0
-							37256.85517452261,51669.130606358856
-							37000.609172980905,51034.8994967025 38000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,51000.0
-							37947.66404375705,51998.629534754575
-							37318.0016399375,51731.35370161917 38000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,52333.333333333336
-							42783.7136697233,52078.689325833264
-							43268.0753550602,51412.0226591666
-							43268.0753550602,50587.9773408334
-							42783.7136697233,49921.310674166736
-							42000.0,49666.666666666664
-							41216.2863302767,49921.310674166736
-							40731.9246449398,50587.9773408334
-							40731.9246449398,51412.0226591666
-							41216.2863302767,52078.689325833264
-							42000.0,52333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,51000.0
-							42669.130606358856,51743.14482547739
-							42034.8994967025,51999.390827019095 42000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,51000.0
-							42998.629534754575,51052.33595624295
-							42731.35370161917,51681.9983600625 42000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,51000.0
-							42743.14482547739,50330.869393641144
-							42999.390827019095,50965.1005032975 42000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,51000.0
-							42052.33595624295,50001.370465245425
-							42681.9983600625,50268.64629838083 42000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,51000.0
-							41330.869393641144,50256.85517452261
-							41965.1005032975,50000.609172980905 42000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,51000.0
-							41001.370465245425,50947.66404375705
-							41268.64629838083,50318.0016399375 42000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,51000.0
-							41256.85517452261,51669.130606358856
-							41000.609172980905,51034.8994967025 42000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,51000.0
-							41947.66404375705,51998.629534754575
-							41318.0016399375,51731.35370161917 42000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-	</MultiPolygon>
-	
-	<MultiPolygon>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,46333.333333333336
-							46783.7136697233,46078.689325833264
-							47268.0753550602,45412.0226591666
-							47268.0753550602,44587.9773408334
-							46783.7136697233,43921.310674166736
-							46000.0,43666.666666666664
-							45216.2863302767,43921.310674166736
-							44731.9246449398,44587.9773408334
-							44731.9246449398,45412.0226591666
-							45216.2863302767,46078.689325833264
-							46000.0,46333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,45000.0
-							46669.130606358856,45743.14482547739
-							46034.8994967025,45999.390827019095 46000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,45000.0
-							46998.629534754575,45052.33595624295
-							46731.35370161917,45681.9983600625 46000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,45000.0
-							46743.14482547739,44330.869393641144
-							46999.390827019095,44965.1005032975 46000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,45000.0
-							46052.33595624295,44001.370465245425
-							46681.9983600625,44268.64629838083 46000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,45000.0
-							45330.869393641144,44256.85517452261
-							45965.1005032975,44000.609172980905 46000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,45000.0
-							45001.370465245425,44947.66404375705
-							45268.64629838083,44318.0016399375 46000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,45000.0
-							45256.85517452261,45669.130606358856
-							45000.609172980905,45034.8994967025 46000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,45000.0
-							45947.66404375705,45998.629534754575
-							45318.0016399375,45731.35370161917 46000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,46333.333333333336
-							50783.7136697233,46078.689325833264
-							51268.0753550602,45412.0226591666
-							51268.0753550602,44587.9773408334
-							50783.7136697233,43921.310674166736
-							50000.0,43666.666666666664
-							49216.2863302767,43921.310674166736
-							48731.9246449398,44587.9773408334
-							48731.9246449398,45412.0226591666
-							49216.2863302767,46078.689325833264
-							50000.0,46333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,45000.0
-							50669.130606358856,45743.14482547739
-							50034.8994967025,45999.390827019095 50000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,45000.0
-							50998.629534754575,45052.33595624295
-							50731.35370161917,45681.9983600625 50000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,45000.0
-							50743.14482547739,44330.869393641144
-							50999.390827019095,44965.1005032975 50000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,45000.0
-							50052.33595624295,44001.370465245425
-							50681.9983600625,44268.64629838083 50000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,45000.0
-							49330.869393641144,44256.85517452261
-							49965.1005032975,44000.609172980905 50000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,45000.0
-							49001.370465245425,44947.66404375705
-							49268.64629838083,44318.0016399375 50000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,45000.0
-							49256.85517452261,45669.130606358856
-							49000.609172980905,45034.8994967025 50000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,45000.0
-							49947.66404375705,45998.629534754575
-							49318.0016399375,45731.35370161917 50000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,52333.333333333336
-							46783.7136697233,52078.689325833264
-							47268.0753550602,51412.0226591666
-							47268.0753550602,50587.9773408334
-							46783.7136697233,49921.310674166736
-							46000.0,49666.666666666664
-							45216.2863302767,49921.310674166736
-							44731.9246449398,50587.9773408334
-							44731.9246449398,51412.0226591666
-							45216.2863302767,52078.689325833264
-							46000.0,52333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,51000.0
-							46669.130606358856,51743.14482547739
-							46034.8994967025,51999.390827019095 46000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,51000.0
-							46998.629534754575,51052.33595624295
-							46731.35370161917,51681.9983600625 46000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,51000.0
-							46743.14482547739,50330.869393641144
-							46999.390827019095,50965.1005032975 46000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,51000.0
-							46052.33595624295,50001.370465245425
-							46681.9983600625,50268.64629838083 46000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,51000.0
-							45330.869393641144,50256.85517452261
-							45965.1005032975,50000.609172980905 46000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,51000.0
-							45001.370465245425,50947.66404375705
-							45268.64629838083,50318.0016399375 46000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,51000.0
-							45256.85517452261,51669.130606358856
-							45000.609172980905,51034.8994967025 46000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,51000.0
-							45947.66404375705,51998.629534754575
-							45318.0016399375,51731.35370161917 46000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,52333.333333333336
-							50783.7136697233,52078.689325833264
-							51268.0753550602,51412.0226591666
-							51268.0753550602,50587.9773408334
-							50783.7136697233,49921.310674166736
-							50000.0,49666.666666666664
-							49216.2863302767,49921.310674166736
-							48731.9246449398,50587.9773408334
-							48731.9246449398,51412.0226591666
-							49216.2863302767,52078.689325833264
-							50000.0,52333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,51000.0
-							50669.130606358856,51743.14482547739
-							50034.8994967025,51999.390827019095 50000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,51000.0
-							50998.629534754575,51052.33595624295
-							50731.35370161917,51681.9983600625 50000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,51000.0
-							50743.14482547739,50330.869393641144
-							50999.390827019095,50965.1005032975 50000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,51000.0
-							50052.33595624295,50001.370465245425
-							50681.9983600625,50268.64629838083 50000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,51000.0
-							49330.869393641144,50256.85517452261
-							49965.1005032975,50000.609172980905 50000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,51000.0
-							49001.370465245425,50947.66404375705
-							49268.64629838083,50318.0016399375 50000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,51000.0
-							49256.85517452261,51669.130606358856
-							49000.609172980905,51034.8994967025 50000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,51000.0
-							49947.66404375705,51998.629534754575
-							49318.0016399375,51731.35370161917 50000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-	</MultiPolygon>
-	
-	<MultiPolygon>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,46333.333333333336
-							54783.7136697233,46078.689325833264
-							55268.0753550602,45412.0226591666
-							55268.0753550602,44587.9773408334
-							54783.7136697233,43921.310674166736
-							54000.0,43666.666666666664
-							53216.2863302767,43921.310674166736
-							52731.9246449398,44587.9773408334
-							52731.9246449398,45412.0226591666
-							53216.2863302767,46078.689325833264
-							54000.0,46333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,45000.0
-							54669.130606358856,45743.14482547739
-							54034.8994967025,45999.390827019095 54000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,45000.0
-							54998.629534754575,45052.33595624295
-							54731.35370161917,45681.9983600625 54000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,45000.0
-							54743.14482547739,44330.869393641144
-							54999.390827019095,44965.1005032975 54000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,45000.0
-							54052.33595624295,44001.370465245425
-							54681.9983600625,44268.64629838083 54000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,45000.0
-							53330.869393641144,44256.85517452261
-							53965.1005032975,44000.609172980905 54000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,45000.0
-							53001.370465245425,44947.66404375705
-							53268.64629838083,44318.0016399375 54000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,45000.0
-							53256.85517452261,45669.130606358856
-							53000.609172980905,45034.8994967025 54000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,45000.0
-							53947.66404375705,45998.629534754575
-							53318.0016399375,45731.35370161917 54000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,46333.333333333336
-							58783.7136697233,46078.689325833264
-							59268.0753550602,45412.0226591666
-							59268.0753550602,44587.9773408334
-							58783.7136697233,43921.310674166736
-							58000.0,43666.666666666664
-							57216.2863302767,43921.310674166736
-							56731.9246449398,44587.9773408334
-							56731.9246449398,45412.0226591666
-							57216.2863302767,46078.689325833264
-							58000.0,46333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,45000.0
-							58669.130606358856,45743.14482547739
-							58034.8994967025,45999.390827019095 58000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,45000.0
-							58998.629534754575,45052.33595624295
-							58731.35370161917,45681.9983600625 58000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,45000.0
-							58743.14482547739,44330.869393641144
-							58999.390827019095,44965.1005032975 58000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,45000.0
-							58052.33595624295,44001.370465245425
-							58681.9983600625,44268.64629838083 58000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,45000.0
-							57330.869393641144,44256.85517452261
-							57965.1005032975,44000.609172980905 58000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,45000.0
-							57001.370465245425,44947.66404375705
-							57268.64629838083,44318.0016399375 58000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,45000.0
-							57256.85517452261,45669.130606358856
-							57000.609172980905,45034.8994967025 58000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,45000.0
-							57947.66404375705,45998.629534754575
-							57318.0016399375,45731.35370161917 58000.0,45000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,52333.333333333336
-							54783.7136697233,52078.689325833264
-							55268.0753550602,51412.0226591666
-							55268.0753550602,50587.9773408334
-							54783.7136697233,49921.310674166736
-							54000.0,49666.666666666664
-							53216.2863302767,49921.310674166736
-							52731.9246449398,50587.9773408334
-							52731.9246449398,51412.0226591666
-							53216.2863302767,52078.689325833264
-							54000.0,52333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,51000.0
-							54669.130606358856,51743.14482547739
-							54034.8994967025,51999.390827019095 54000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,51000.0
-							54998.629534754575,51052.33595624295
-							54731.35370161917,51681.9983600625 54000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,51000.0
-							54743.14482547739,50330.869393641144
-							54999.390827019095,50965.1005032975 54000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,51000.0
-							54052.33595624295,50001.370465245425
-							54681.9983600625,50268.64629838083 54000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,51000.0
-							53330.869393641144,50256.85517452261
-							53965.1005032975,50000.609172980905 54000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,51000.0
-							53001.370465245425,50947.66404375705
-							53268.64629838083,50318.0016399375 54000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,51000.0
-							53256.85517452261,51669.130606358856
-							53000.609172980905,51034.8994967025 54000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,51000.0
-							53947.66404375705,51998.629534754575
-							53318.0016399375,51731.35370161917 54000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,52333.333333333336
-							58783.7136697233,52078.689325833264
-							59268.0753550602,51412.0226591666
-							59268.0753550602,50587.9773408334
-							58783.7136697233,49921.310674166736
-							58000.0,49666.666666666664
-							57216.2863302767,49921.310674166736
-							56731.9246449398,50587.9773408334
-							56731.9246449398,51412.0226591666
-							57216.2863302767,52078.689325833264
-							58000.0,52333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,51000.0
-							58669.130606358856,51743.14482547739
-							58034.8994967025,51999.390827019095 58000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,51000.0
-							58998.629534754575,51052.33595624295
-							58731.35370161917,51681.9983600625 58000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,51000.0
-							58743.14482547739,50330.869393641144
-							58999.390827019095,50965.1005032975 58000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,51000.0
-							58052.33595624295,50001.370465245425
-							58681.9983600625,50268.64629838083 58000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,51000.0
-							57330.869393641144,50256.85517452261
-							57965.1005032975,50000.609172980905 58000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,51000.0
-							57001.370465245425,50947.66404375705
-							57268.64629838083,50318.0016399375 58000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,51000.0
-							57256.85517452261,51669.130606358856
-							57000.609172980905,51034.8994967025 58000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,51000.0
-							57947.66404375705,51998.629534754575
-							57318.0016399375,51731.35370161917 58000.0,51000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-	</MultiPolygon>
-	
-	<MultiPolygon>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,58333.333333333336
-							22783.713669723296,58078.689325833264
-							23268.075355060206,57412.0226591666
-							23268.075355060206,56587.9773408334
-							22783.713669723296,55921.310674166736
-							22000.0,55666.666666666664
-							21216.286330276704,55921.310674166736
-							20731.924644939794,56587.9773408334
-							20731.924644939794,57412.0226591666
-							21216.286330276704,58078.689325833264
-							22000.0,58333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,57000.0
-							22669.13060635886,57743.14482547739
-							22034.8994967025,57999.390827019095 22000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,57000.0
-							22998.629534754575,57052.33595624295
-							22731.35370161917,57681.9983600625 22000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,57000.0
-							22743.144825477393,56330.869393641144
-							22999.390827019095,56965.1005032975 22000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,57000.0
-							22052.335956242943,56001.370465245425
-							22681.9983600625,56268.64629838083 22000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,57000.0
-							21330.86939364114,56256.85517452261
-							21965.1005032975,56000.609172980905 22000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,57000.0
-							21001.370465245425,56947.66404375705
-							21268.64629838083,56318.0016399375 22000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,57000.0
-							21256.855174522607,57669.130606358856
-							21000.609172980905,57034.8994967025 22000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,57000.0
-							21947.664043757057,57998.629534754575
-							21318.0016399375,57731.35370161917 22000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,58333.333333333336
-							26783.713669723296,58078.689325833264
-							27268.075355060206,57412.0226591666
-							27268.075355060206,56587.9773408334
-							26783.713669723296,55921.310674166736
-							26000.0,55666.666666666664
-							25216.286330276704,55921.310674166736
-							24731.924644939794,56587.9773408334
-							24731.924644939794,57412.0226591666
-							25216.286330276704,58078.689325833264
-							26000.0,58333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,57000.0
-							26669.13060635886,57743.14482547739
-							26034.8994967025,57999.390827019095 26000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,57000.0
-							26998.629534754575,57052.33595624295
-							26731.35370161917,57681.9983600625 26000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,57000.0
-							26743.144825477393,56330.869393641144
-							26999.390827019095,56965.1005032975 26000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,57000.0
-							26052.335956242943,56001.370465245425
-							26681.9983600625,56268.64629838083 26000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,57000.0
-							25330.86939364114,56256.85517452261
-							25965.1005032975,56000.609172980905 26000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,57000.0
-							25001.370465245425,56947.66404375705
-							25268.64629838083,56318.0016399375 26000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,57000.0
-							25256.855174522607,57669.130606358856
-							25000.609172980905,57034.8994967025 26000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,57000.0
-							25947.664043757057,57998.629534754575
-							25318.0016399375,57731.35370161917 26000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,64333.333333333336
-							22783.713669723296,64078.689325833264
-							23268.075355060206,63412.0226591666
-							23268.075355060206,62587.9773408334
-							22783.713669723296,61921.310674166736
-							22000.0,61666.666666666664
-							21216.286330276704,61921.310674166736
-							20731.924644939794,62587.9773408334
-							20731.924644939794,63412.0226591666
-							21216.286330276704,64078.689325833264
-							22000.0,64333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,63000.0
-							22669.13060635886,63743.14482547739
-							22034.8994967025,63999.390827019095 22000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,63000.0
-							22998.629534754575,63052.33595624295
-							22731.35370161917,63681.9983600625 22000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,63000.0
-							22743.144825477393,62330.869393641144
-							22999.390827019095,62965.1005032975 22000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,63000.0
-							22052.335956242943,62001.370465245425
-							22681.9983600625,62268.64629838083 22000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,63000.0
-							21330.86939364114,62256.85517452261
-							21965.1005032975,62000.609172980905 22000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,63000.0
-							21001.370465245425,62947.66404375705
-							21268.64629838083,62318.0016399375 22000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,63000.0
-							21256.855174522607,63669.130606358856
-							21000.609172980905,63034.8994967025 22000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,63000.0
-							21947.664043757057,63998.629534754575
-							21318.0016399375,63731.35370161917 22000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,64333.333333333336
-							26783.713669723296,64078.689325833264
-							27268.075355060206,63412.0226591666
-							27268.075355060206,62587.9773408334
-							26783.713669723296,61921.310674166736
-							26000.0,61666.666666666664
-							25216.286330276704,61921.310674166736
-							24731.924644939794,62587.9773408334
-							24731.924644939794,63412.0226591666
-							25216.286330276704,64078.689325833264
-							26000.0,64333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,63000.0
-							26669.13060635886,63743.14482547739
-							26034.8994967025,63999.390827019095 26000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,63000.0
-							26998.629534754575,63052.33595624295
-							26731.35370161917,63681.9983600625 26000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,63000.0
-							26743.144825477393,62330.869393641144
-							26999.390827019095,62965.1005032975 26000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,63000.0
-							26052.335956242943,62001.370465245425
-							26681.9983600625,62268.64629838083 26000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,63000.0
-							25330.86939364114,62256.85517452261
-							25965.1005032975,62000.609172980905 26000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,63000.0
-							25001.370465245425,62947.66404375705
-							25268.64629838083,62318.0016399375 26000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,63000.0
-							25256.855174522607,63669.130606358856
-							25000.609172980905,63034.8994967025 26000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,63000.0
-							25947.664043757057,63998.629534754575
-							25318.0016399375,63731.35370161917 26000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-	</MultiPolygon>
-	
-	<MultiPolygon>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,58333.333333333336
-							30783.713669723296,58078.689325833264
-							31268.075355060206,57412.0226591666
-							31268.075355060206,56587.9773408334
-							30783.713669723296,55921.310674166736
-							30000.0,55666.666666666664
-							29216.286330276704,55921.310674166736
-							28731.924644939794,56587.9773408334
-							28731.924644939794,57412.0226591666
-							29216.286330276704,58078.689325833264
-							30000.0,58333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,57000.0
-							30669.13060635886,57743.14482547739
-							30034.8994967025,57999.390827019095 30000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,57000.0
-							30998.629534754575,57052.33595624295
-							30731.35370161917,57681.9983600625 30000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,57000.0
-							30743.144825477393,56330.869393641144
-							30999.390827019095,56965.1005032975 30000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,57000.0
-							30052.335956242943,56001.370465245425
-							30681.9983600625,56268.64629838083 30000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,57000.0
-							29330.86939364114,56256.85517452261
-							29965.1005032975,56000.609172980905 30000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,57000.0
-							29001.370465245425,56947.66404375705
-							29268.64629838083,56318.0016399375 30000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,57000.0
-							29256.855174522607,57669.130606358856
-							29000.609172980905,57034.8994967025 30000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,57000.0
-							29947.664043757057,57998.629534754575
-							29318.0016399375,57731.35370161917 30000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,58333.333333333336
-							34783.7136697233,58078.689325833264
-							35268.0753550602,57412.0226591666
-							35268.0753550602,56587.9773408334
-							34783.7136697233,55921.310674166736
-							34000.0,55666.666666666664
-							33216.2863302767,55921.310674166736
-							32731.924644939794,56587.9773408334
-							32731.924644939794,57412.0226591666
-							33216.2863302767,58078.689325833264
-							34000.0,58333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,57000.0
-							34669.130606358856,57743.14482547739
-							34034.8994967025,57999.390827019095 34000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,57000.0
-							34998.629534754575,57052.33595624295
-							34731.35370161917,57681.9983600625 34000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,57000.0
-							34743.14482547739,56330.869393641144
-							34999.390827019095,56965.1005032975 34000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,57000.0
-							34052.33595624295,56001.370465245425
-							34681.9983600625,56268.64629838083 34000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,57000.0
-							33330.869393641144,56256.85517452261
-							33965.1005032975,56000.609172980905 34000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,57000.0
-							33001.370465245425,56947.66404375705
-							33268.64629838083,56318.0016399375 34000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,57000.0
-							33256.85517452261,57669.130606358856
-							33000.609172980905,57034.8994967025 34000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,57000.0
-							33947.66404375705,57998.629534754575
-							33318.0016399375,57731.35370161917 34000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,64333.333333333336
-							30783.713669723296,64078.689325833264
-							31268.075355060206,63412.0226591666
-							31268.075355060206,62587.9773408334
-							30783.713669723296,61921.310674166736
-							30000.0,61666.666666666664
-							29216.286330276704,61921.310674166736
-							28731.924644939794,62587.9773408334
-							28731.924644939794,63412.0226591666
-							29216.286330276704,64078.689325833264
-							30000.0,64333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,63000.0
-							30669.13060635886,63743.14482547739
-							30034.8994967025,63999.390827019095 30000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,63000.0
-							30998.629534754575,63052.33595624295
-							30731.35370161917,63681.9983600625 30000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,63000.0
-							30743.144825477393,62330.869393641144
-							30999.390827019095,62965.1005032975 30000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,63000.0
-							30052.335956242943,62001.370465245425
-							30681.9983600625,62268.64629838083 30000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,63000.0
-							29330.86939364114,62256.85517452261
-							29965.1005032975,62000.609172980905 30000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,63000.0
-							29001.370465245425,62947.66404375705
-							29268.64629838083,62318.0016399375 30000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,63000.0
-							29256.855174522607,63669.130606358856
-							29000.609172980905,63034.8994967025 30000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,63000.0
-							29947.664043757057,63998.629534754575
-							29318.0016399375,63731.35370161917 30000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,64333.333333333336
-							34783.7136697233,64078.689325833264
-							35268.0753550602,63412.0226591666
-							35268.0753550602,62587.9773408334
-							34783.7136697233,61921.310674166736
-							34000.0,61666.666666666664
-							33216.2863302767,61921.310674166736
-							32731.924644939794,62587.9773408334
-							32731.924644939794,63412.0226591666
-							33216.2863302767,64078.689325833264
-							34000.0,64333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,63000.0
-							34669.130606358856,63743.14482547739
-							34034.8994967025,63999.390827019095 34000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,63000.0
-							34998.629534754575,63052.33595624295
-							34731.35370161917,63681.9983600625 34000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,63000.0
-							34743.14482547739,62330.869393641144
-							34999.390827019095,62965.1005032975 34000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,63000.0
-							34052.33595624295,62001.370465245425
-							34681.9983600625,62268.64629838083 34000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,63000.0
-							33330.869393641144,62256.85517452261
-							33965.1005032975,62000.609172980905 34000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,63000.0
-							33001.370465245425,62947.66404375705
-							33268.64629838083,62318.0016399375 34000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,63000.0
-							33256.85517452261,63669.130606358856
-							33000.609172980905,63034.8994967025 34000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,63000.0
-							33947.66404375705,63998.629534754575
-							33318.0016399375,63731.35370161917 34000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-	</MultiPolygon>
-	
-	<MultiPolygon>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,58333.333333333336
-							38783.7136697233,58078.689325833264
-							39268.0753550602,57412.0226591666
-							39268.0753550602,56587.9773408334
-							38783.7136697233,55921.310674166736
-							38000.0,55666.666666666664
-							37216.2863302767,55921.310674166736
-							36731.9246449398,56587.9773408334
-							36731.9246449398,57412.0226591666
-							37216.2863302767,58078.689325833264
-							38000.0,58333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,57000.0
-							38669.130606358856,57743.14482547739
-							38034.8994967025,57999.390827019095 38000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,57000.0
-							38998.629534754575,57052.33595624295
-							38731.35370161917,57681.9983600625 38000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,57000.0
-							38743.14482547739,56330.869393641144
-							38999.390827019095,56965.1005032975 38000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,57000.0
-							38052.33595624295,56001.370465245425
-							38681.9983600625,56268.64629838083 38000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,57000.0
-							37330.869393641144,56256.85517452261
-							37965.1005032975,56000.609172980905 38000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,57000.0
-							37001.370465245425,56947.66404375705
-							37268.64629838083,56318.0016399375 38000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,57000.0
-							37256.85517452261,57669.130606358856
-							37000.609172980905,57034.8994967025 38000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,57000.0
-							37947.66404375705,57998.629534754575
-							37318.0016399375,57731.35370161917 38000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,58333.333333333336
-							42783.7136697233,58078.689325833264
-							43268.0753550602,57412.0226591666
-							43268.0753550602,56587.9773408334
-							42783.7136697233,55921.310674166736
-							42000.0,55666.666666666664
-							41216.2863302767,55921.310674166736
-							40731.9246449398,56587.9773408334
-							40731.9246449398,57412.0226591666
-							41216.2863302767,58078.689325833264
-							42000.0,58333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,57000.0
-							42669.130606358856,57743.14482547739
-							42034.8994967025,57999.390827019095 42000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,57000.0
-							42998.629534754575,57052.33595624295
-							42731.35370161917,57681.9983600625 42000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,57000.0
-							42743.14482547739,56330.869393641144
-							42999.390827019095,56965.1005032975 42000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,57000.0
-							42052.33595624295,56001.370465245425
-							42681.9983600625,56268.64629838083 42000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,57000.0
-							41330.869393641144,56256.85517452261
-							41965.1005032975,56000.609172980905 42000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,57000.0
-							41001.370465245425,56947.66404375705
-							41268.64629838083,56318.0016399375 42000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,57000.0
-							41256.85517452261,57669.130606358856
-							41000.609172980905,57034.8994967025 42000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,57000.0
-							41947.66404375705,57998.629534754575
-							41318.0016399375,57731.35370161917 42000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,64333.333333333336
-							38783.7136697233,64078.689325833264
-							39268.0753550602,63412.0226591666
-							39268.0753550602,62587.9773408334
-							38783.7136697233,61921.310674166736
-							38000.0,61666.666666666664
-							37216.2863302767,61921.310674166736
-							36731.9246449398,62587.9773408334
-							36731.9246449398,63412.0226591666
-							37216.2863302767,64078.689325833264
-							38000.0,64333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,63000.0
-							38669.130606358856,63743.14482547739
-							38034.8994967025,63999.390827019095 38000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,63000.0
-							38998.629534754575,63052.33595624295
-							38731.35370161917,63681.9983600625 38000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,63000.0
-							38743.14482547739,62330.869393641144
-							38999.390827019095,62965.1005032975 38000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,63000.0
-							38052.33595624295,62001.370465245425
-							38681.9983600625,62268.64629838083 38000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,63000.0
-							37330.869393641144,62256.85517452261
-							37965.1005032975,62000.609172980905 38000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,63000.0
-							37001.370465245425,62947.66404375705
-							37268.64629838083,62318.0016399375 38000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,63000.0
-							37256.85517452261,63669.130606358856
-							37000.609172980905,63034.8994967025 38000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,63000.0
-							37947.66404375705,63998.629534754575
-							37318.0016399375,63731.35370161917 38000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,64333.333333333336
-							42783.7136697233,64078.689325833264
-							43268.0753550602,63412.0226591666
-							43268.0753550602,62587.9773408334
-							42783.7136697233,61921.310674166736
-							42000.0,61666.666666666664
-							41216.2863302767,61921.310674166736
-							40731.9246449398,62587.9773408334
-							40731.9246449398,63412.0226591666
-							41216.2863302767,64078.689325833264
-							42000.0,64333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,63000.0
-							42669.130606358856,63743.14482547739
-							42034.8994967025,63999.390827019095 42000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,63000.0
-							42998.629534754575,63052.33595624295
-							42731.35370161917,63681.9983600625 42000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,63000.0
-							42743.14482547739,62330.869393641144
-							42999.390827019095,62965.1005032975 42000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,63000.0
-							42052.33595624295,62001.370465245425
-							42681.9983600625,62268.64629838083 42000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,63000.0
-							41330.869393641144,62256.85517452261
-							41965.1005032975,62000.609172980905 42000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,63000.0
-							41001.370465245425,62947.66404375705
-							41268.64629838083,62318.0016399375 42000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,63000.0
-							41256.85517452261,63669.130606358856
-							41000.609172980905,63034.8994967025 42000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,63000.0
-							41947.66404375705,63998.629534754575
-							41318.0016399375,63731.35370161917 42000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-	</MultiPolygon>
-	
-	<MultiPolygon>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,58333.333333333336
-							46783.7136697233,58078.689325833264
-							47268.0753550602,57412.0226591666
-							47268.0753550602,56587.9773408334
-							46783.7136697233,55921.310674166736
-							46000.0,55666.666666666664
-							45216.2863302767,55921.310674166736
-							44731.9246449398,56587.9773408334
-							44731.9246449398,57412.0226591666
-							45216.2863302767,58078.689325833264
-							46000.0,58333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,57000.0
-							46669.130606358856,57743.14482547739
-							46034.8994967025,57999.390827019095 46000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,57000.0
-							46998.629534754575,57052.33595624295
-							46731.35370161917,57681.9983600625 46000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,57000.0
-							46743.14482547739,56330.869393641144
-							46999.390827019095,56965.1005032975 46000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,57000.0
-							46052.33595624295,56001.370465245425
-							46681.9983600625,56268.64629838083 46000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,57000.0
-							45330.869393641144,56256.85517452261
-							45965.1005032975,56000.609172980905 46000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,57000.0
-							45001.370465245425,56947.66404375705
-							45268.64629838083,56318.0016399375 46000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,57000.0
-							45256.85517452261,57669.130606358856
-							45000.609172980905,57034.8994967025 46000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,57000.0
-							45947.66404375705,57998.629534754575
-							45318.0016399375,57731.35370161917 46000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,58333.333333333336
-							50783.7136697233,58078.689325833264
-							51268.0753550602,57412.0226591666
-							51268.0753550602,56587.9773408334
-							50783.7136697233,55921.310674166736
-							50000.0,55666.666666666664
-							49216.2863302767,55921.310674166736
-							48731.9246449398,56587.9773408334
-							48731.9246449398,57412.0226591666
-							49216.2863302767,58078.689325833264
-							50000.0,58333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,57000.0
-							50669.130606358856,57743.14482547739
-							50034.8994967025,57999.390827019095 50000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,57000.0
-							50998.629534754575,57052.33595624295
-							50731.35370161917,57681.9983600625 50000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,57000.0
-							50743.14482547739,56330.869393641144
-							50999.390827019095,56965.1005032975 50000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,57000.0
-							50052.33595624295,56001.370465245425
-							50681.9983600625,56268.64629838083 50000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,57000.0
-							49330.869393641144,56256.85517452261
-							49965.1005032975,56000.609172980905 50000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,57000.0
-							49001.370465245425,56947.66404375705
-							49268.64629838083,56318.0016399375 50000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,57000.0
-							49256.85517452261,57669.130606358856
-							49000.609172980905,57034.8994967025 50000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,57000.0
-							49947.66404375705,57998.629534754575
-							49318.0016399375,57731.35370161917 50000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,64333.333333333336
-							46783.7136697233,64078.689325833264
-							47268.0753550602,63412.0226591666
-							47268.0753550602,62587.9773408334
-							46783.7136697233,61921.310674166736
-							46000.0,61666.666666666664
-							45216.2863302767,61921.310674166736
-							44731.9246449398,62587.9773408334
-							44731.9246449398,63412.0226591666
-							45216.2863302767,64078.689325833264
-							46000.0,64333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,63000.0
-							46669.130606358856,63743.14482547739
-							46034.8994967025,63999.390827019095 46000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,63000.0
-							46998.629534754575,63052.33595624295
-							46731.35370161917,63681.9983600625 46000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,63000.0
-							46743.14482547739,62330.869393641144
-							46999.390827019095,62965.1005032975 46000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,63000.0
-							46052.33595624295,62001.370465245425
-							46681.9983600625,62268.64629838083 46000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,63000.0
-							45330.869393641144,62256.85517452261
-							45965.1005032975,62000.609172980905 46000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,63000.0
-							45001.370465245425,62947.66404375705
-							45268.64629838083,62318.0016399375 46000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,63000.0
-							45256.85517452261,63669.130606358856
-							45000.609172980905,63034.8994967025 46000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,63000.0
-							45947.66404375705,63998.629534754575
-							45318.0016399375,63731.35370161917 46000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,64333.333333333336
-							50783.7136697233,64078.689325833264
-							51268.0753550602,63412.0226591666
-							51268.0753550602,62587.9773408334
-							50783.7136697233,61921.310674166736
-							50000.0,61666.666666666664
-							49216.2863302767,61921.310674166736
-							48731.9246449398,62587.9773408334
-							48731.9246449398,63412.0226591666
-							49216.2863302767,64078.689325833264
-							50000.0,64333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,63000.0
-							50669.130606358856,63743.14482547739
-							50034.8994967025,63999.390827019095 50000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,63000.0
-							50998.629534754575,63052.33595624295
-							50731.35370161917,63681.9983600625 50000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,63000.0
-							50743.14482547739,62330.869393641144
-							50999.390827019095,62965.1005032975 50000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,63000.0
-							50052.33595624295,62001.370465245425
-							50681.9983600625,62268.64629838083 50000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,63000.0
-							49330.869393641144,62256.85517452261
-							49965.1005032975,62000.609172980905 50000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,63000.0
-							49001.370465245425,62947.66404375705
-							49268.64629838083,62318.0016399375 50000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,63000.0
-							49256.85517452261,63669.130606358856
-							49000.609172980905,63034.8994967025 50000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,63000.0
-							49947.66404375705,63998.629534754575
-							49318.0016399375,63731.35370161917 50000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-	</MultiPolygon>
-	
-	<MultiPolygon>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,58333.333333333336
-							54783.7136697233,58078.689325833264
-							55268.0753550602,57412.0226591666
-							55268.0753550602,56587.9773408334
-							54783.7136697233,55921.310674166736
-							54000.0,55666.666666666664
-							53216.2863302767,55921.310674166736
-							52731.9246449398,56587.9773408334
-							52731.9246449398,57412.0226591666
-							53216.2863302767,58078.689325833264
-							54000.0,58333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,57000.0
-							54669.130606358856,57743.14482547739
-							54034.8994967025,57999.390827019095 54000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,57000.0
-							54998.629534754575,57052.33595624295
-							54731.35370161917,57681.9983600625 54000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,57000.0
-							54743.14482547739,56330.869393641144
-							54999.390827019095,56965.1005032975 54000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,57000.0
-							54052.33595624295,56001.370465245425
-							54681.9983600625,56268.64629838083 54000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,57000.0
-							53330.869393641144,56256.85517452261
-							53965.1005032975,56000.609172980905 54000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,57000.0
-							53001.370465245425,56947.66404375705
-							53268.64629838083,56318.0016399375 54000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,57000.0
-							53256.85517452261,57669.130606358856
-							53000.609172980905,57034.8994967025 54000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,57000.0
-							53947.66404375705,57998.629534754575
-							53318.0016399375,57731.35370161917 54000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,58333.333333333336
-							58783.7136697233,58078.689325833264
-							59268.0753550602,57412.0226591666
-							59268.0753550602,56587.9773408334
-							58783.7136697233,55921.310674166736
-							58000.0,55666.666666666664
-							57216.2863302767,55921.310674166736
-							56731.9246449398,56587.9773408334
-							56731.9246449398,57412.0226591666
-							57216.2863302767,58078.689325833264
-							58000.0,58333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,57000.0
-							58669.130606358856,57743.14482547739
-							58034.8994967025,57999.390827019095 58000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,57000.0
-							58998.629534754575,57052.33595624295
-							58731.35370161917,57681.9983600625 58000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,57000.0
-							58743.14482547739,56330.869393641144
-							58999.390827019095,56965.1005032975 58000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,57000.0
-							58052.33595624295,56001.370465245425
-							58681.9983600625,56268.64629838083 58000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,57000.0
-							57330.869393641144,56256.85517452261
-							57965.1005032975,56000.609172980905 58000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,57000.0
-							57001.370465245425,56947.66404375705
-							57268.64629838083,56318.0016399375 58000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,57000.0
-							57256.85517452261,57669.130606358856
-							57000.609172980905,57034.8994967025 58000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,57000.0
-							57947.66404375705,57998.629534754575
-							57318.0016399375,57731.35370161917 58000.0,57000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,64333.333333333336
-							54783.7136697233,64078.689325833264
-							55268.0753550602,63412.0226591666
-							55268.0753550602,62587.9773408334
-							54783.7136697233,61921.310674166736
-							54000.0,61666.666666666664
-							53216.2863302767,61921.310674166736
-							52731.9246449398,62587.9773408334
-							52731.9246449398,63412.0226591666
-							53216.2863302767,64078.689325833264
-							54000.0,64333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,63000.0
-							54669.130606358856,63743.14482547739
-							54034.8994967025,63999.390827019095 54000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,63000.0
-							54998.629534754575,63052.33595624295
-							54731.35370161917,63681.9983600625 54000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,63000.0
-							54743.14482547739,62330.869393641144
-							54999.390827019095,62965.1005032975 54000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,63000.0
-							54052.33595624295,62001.370465245425
-							54681.9983600625,62268.64629838083 54000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,63000.0
-							53330.869393641144,62256.85517452261
-							53965.1005032975,62000.609172980905 54000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,63000.0
-							53001.370465245425,62947.66404375705
-							53268.64629838083,62318.0016399375 54000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,63000.0
-							53256.85517452261,63669.130606358856
-							53000.609172980905,63034.8994967025 54000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,63000.0
-							53947.66404375705,63998.629534754575
-							53318.0016399375,63731.35370161917 54000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,64333.333333333336
-							58783.7136697233,64078.689325833264
-							59268.0753550602,63412.0226591666
-							59268.0753550602,62587.9773408334
-							58783.7136697233,61921.310674166736
-							58000.0,61666.666666666664
-							57216.2863302767,61921.310674166736
-							56731.9246449398,62587.9773408334
-							56731.9246449398,63412.0226591666
-							57216.2863302767,64078.689325833264
-							58000.0,64333.333333333336 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,63000.0
-							58669.130606358856,63743.14482547739
-							58034.8994967025,63999.390827019095 58000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,63000.0
-							58998.629534754575,63052.33595624295
-							58731.35370161917,63681.9983600625 58000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,63000.0
-							58743.14482547739,62330.869393641144
-							58999.390827019095,62965.1005032975 58000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,63000.0
-							58052.33595624295,62001.370465245425
-							58681.9983600625,62268.64629838083 58000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,63000.0
-							57330.869393641144,62256.85517452261
-							57965.1005032975,62000.609172980905 58000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,63000.0
-							57001.370465245425,62947.66404375705
-							57268.64629838083,62318.0016399375 58000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,63000.0
-							57256.85517452261,63669.130606358856
-							57000.609172980905,63034.8994967025 58000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,63000.0
-							57947.66404375705,63998.629534754575
-							57318.0016399375,63731.35370161917 58000.0,63000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-	</MultiPolygon>
-	
-	<MultiPolygon>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,70333.33333333333
-							22783.713669723296,70078.68932583326
-							23268.075355060206,69412.0226591666
-							23268.075355060206,68587.9773408334
-							22783.713669723296,67921.31067416674
-							22000.0,67666.66666666667
-							21216.286330276704,67921.31067416674
-							20731.924644939794,68587.9773408334
-							20731.924644939794,69412.0226591666
-							21216.286330276704,70078.68932583326
-							22000.0,70333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,69000.0
-							22669.13060635886,69743.1448254774
-							22034.8994967025,69999.3908270191 22000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,69000.0
-							22998.629534754575,69052.33595624294
-							22731.35370161917,69681.9983600625 22000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,69000.0
-							22743.144825477393,68330.86939364114
-							22999.390827019095,68965.1005032975 22000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,69000.0
-							22052.335956242943,68001.37046524543
-							22681.9983600625,68268.64629838083 22000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,69000.0
-							21330.86939364114,68256.8551745226
-							21965.1005032975,68000.6091729809 22000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,69000.0
-							21001.370465245425,68947.66404375706
-							21268.64629838083,68318.0016399375 22000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,69000.0
-							21256.855174522607,69669.13060635886
-							21000.609172980905,69034.8994967025 22000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,69000.0
-							21947.664043757057,69998.62953475457
-							21318.0016399375,69731.35370161917 22000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,70333.33333333333
-							26783.713669723296,70078.68932583326
-							27268.075355060206,69412.0226591666
-							27268.075355060206,68587.9773408334
-							26783.713669723296,67921.31067416674
-							26000.0,67666.66666666667
-							25216.286330276704,67921.31067416674
-							24731.924644939794,68587.9773408334
-							24731.924644939794,69412.0226591666
-							25216.286330276704,70078.68932583326
-							26000.0,70333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,69000.0
-							26669.13060635886,69743.1448254774
-							26034.8994967025,69999.3908270191 26000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,69000.0
-							26998.629534754575,69052.33595624294
-							26731.35370161917,69681.9983600625 26000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,69000.0
-							26743.144825477393,68330.86939364114
-							26999.390827019095,68965.1005032975 26000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,69000.0
-							26052.335956242943,68001.37046524543
-							26681.9983600625,68268.64629838083 26000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,69000.0
-							25330.86939364114,68256.8551745226
-							25965.1005032975,68000.6091729809 26000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,69000.0
-							25001.370465245425,68947.66404375706
-							25268.64629838083,68318.0016399375 26000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,69000.0
-							25256.855174522607,69669.13060635886
-							25000.609172980905,69034.8994967025 26000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,69000.0
-							25947.664043757057,69998.62953475457
-							25318.0016399375,69731.35370161917 26000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,76333.33333333333
-							22783.713669723296,76078.68932583326
-							23268.075355060206,75412.0226591666
-							23268.075355060206,74587.9773408334
-							22783.713669723296,73921.31067416674
-							22000.0,73666.66666666667
-							21216.286330276704,73921.31067416674
-							20731.924644939794,74587.9773408334
-							20731.924644939794,75412.0226591666
-							21216.286330276704,76078.68932583326
-							22000.0,76333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,75000.0
-							22669.13060635886,75743.1448254774
-							22034.8994967025,75999.3908270191 22000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,75000.0
-							22998.629534754575,75052.33595624294
-							22731.35370161917,75681.9983600625 22000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,75000.0
-							22743.144825477393,74330.86939364114
-							22999.390827019095,74965.1005032975 22000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,75000.0
-							22052.335956242943,74001.37046524543
-							22681.9983600625,74268.64629838083 22000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,75000.0
-							21330.86939364114,74256.8551745226
-							21965.1005032975,74000.6091729809 22000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,75000.0
-							21001.370465245425,74947.66404375706
-							21268.64629838083,74318.0016399375 22000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,75000.0
-							21256.855174522607,75669.13060635886
-							21000.609172980905,75034.8994967025 22000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,75000.0
-							21947.664043757057,75998.62953475457
-							21318.0016399375,75731.35370161917 22000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,76333.33333333333
-							26783.713669723296,76078.68932583326
-							27268.075355060206,75412.0226591666
-							27268.075355060206,74587.9773408334
-							26783.713669723296,73921.31067416674
-							26000.0,73666.66666666667
-							25216.286330276704,73921.31067416674
-							24731.924644939794,74587.9773408334
-							24731.924644939794,75412.0226591666
-							25216.286330276704,76078.68932583326
-							26000.0,76333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,75000.0
-							26669.13060635886,75743.1448254774
-							26034.8994967025,75999.3908270191 26000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,75000.0
-							26998.629534754575,75052.33595624294
-							26731.35370161917,75681.9983600625 26000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,75000.0
-							26743.144825477393,74330.86939364114
-							26999.390827019095,74965.1005032975 26000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,75000.0
-							26052.335956242943,74001.37046524543
-							26681.9983600625,74268.64629838083 26000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,75000.0
-							25330.86939364114,74256.8551745226
-							25965.1005032975,74000.6091729809 26000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,75000.0
-							25001.370465245425,74947.66404375706
-							25268.64629838083,74318.0016399375 26000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,75000.0
-							25256.855174522607,75669.13060635886
-							25000.609172980905,75034.8994967025 26000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,75000.0
-							25947.664043757057,75998.62953475457
-							25318.0016399375,75731.35370161917 26000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-	</MultiPolygon>
-	
-	<MultiPolygon>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,70333.33333333333
-							30783.713669723296,70078.68932583326
-							31268.075355060206,69412.0226591666
-							31268.075355060206,68587.9773408334
-							30783.713669723296,67921.31067416674
-							30000.0,67666.66666666667
-							29216.286330276704,67921.31067416674
-							28731.924644939794,68587.9773408334
-							28731.924644939794,69412.0226591666
-							29216.286330276704,70078.68932583326
-							30000.0,70333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,69000.0
-							30669.13060635886,69743.1448254774
-							30034.8994967025,69999.3908270191 30000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,69000.0
-							30998.629534754575,69052.33595624294
-							30731.35370161917,69681.9983600625 30000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,69000.0
-							30743.144825477393,68330.86939364114
-							30999.390827019095,68965.1005032975 30000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,69000.0
-							30052.335956242943,68001.37046524543
-							30681.9983600625,68268.64629838083 30000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,69000.0
-							29330.86939364114,68256.8551745226
-							29965.1005032975,68000.6091729809 30000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,69000.0
-							29001.370465245425,68947.66404375706
-							29268.64629838083,68318.0016399375 30000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,69000.0
-							29256.855174522607,69669.13060635886
-							29000.609172980905,69034.8994967025 30000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,69000.0
-							29947.664043757057,69998.62953475457
-							29318.0016399375,69731.35370161917 30000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,70333.33333333333
-							34783.7136697233,70078.68932583326
-							35268.0753550602,69412.0226591666
-							35268.0753550602,68587.9773408334
-							34783.7136697233,67921.31067416674
-							34000.0,67666.66666666667
-							33216.2863302767,67921.31067416674
-							32731.924644939794,68587.9773408334
-							32731.924644939794,69412.0226591666
-							33216.2863302767,70078.68932583326
-							34000.0,70333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,69000.0
-							34669.130606358856,69743.1448254774
-							34034.8994967025,69999.3908270191 34000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,69000.0
-							34998.629534754575,69052.33595624294
-							34731.35370161917,69681.9983600625 34000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,69000.0
-							34743.14482547739,68330.86939364114
-							34999.390827019095,68965.1005032975 34000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,69000.0
-							34052.33595624295,68001.37046524543
-							34681.9983600625,68268.64629838083 34000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,69000.0
-							33330.869393641144,68256.8551745226
-							33965.1005032975,68000.6091729809 34000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,69000.0
-							33001.370465245425,68947.66404375706
-							33268.64629838083,68318.0016399375 34000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,69000.0
-							33256.85517452261,69669.13060635886
-							33000.609172980905,69034.8994967025 34000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,69000.0
-							33947.66404375705,69998.62953475457
-							33318.0016399375,69731.35370161917 34000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,76333.33333333333
-							30783.713669723296,76078.68932583326
-							31268.075355060206,75412.0226591666
-							31268.075355060206,74587.9773408334
-							30783.713669723296,73921.31067416674
-							30000.0,73666.66666666667
-							29216.286330276704,73921.31067416674
-							28731.924644939794,74587.9773408334
-							28731.924644939794,75412.0226591666
-							29216.286330276704,76078.68932583326
-							30000.0,76333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,75000.0
-							30669.13060635886,75743.1448254774
-							30034.8994967025,75999.3908270191 30000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,75000.0
-							30998.629534754575,75052.33595624294
-							30731.35370161917,75681.9983600625 30000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,75000.0
-							30743.144825477393,74330.86939364114
-							30999.390827019095,74965.1005032975 30000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,75000.0
-							30052.335956242943,74001.37046524543
-							30681.9983600625,74268.64629838083 30000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,75000.0
-							29330.86939364114,74256.8551745226
-							29965.1005032975,74000.6091729809 30000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,75000.0
-							29001.370465245425,74947.66404375706
-							29268.64629838083,74318.0016399375 30000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,75000.0
-							29256.855174522607,75669.13060635886
-							29000.609172980905,75034.8994967025 30000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,75000.0
-							29947.664043757057,75998.62953475457
-							29318.0016399375,75731.35370161917 30000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,76333.33333333333
-							34783.7136697233,76078.68932583326
-							35268.0753550602,75412.0226591666
-							35268.0753550602,74587.9773408334
-							34783.7136697233,73921.31067416674
-							34000.0,73666.66666666667
-							33216.2863302767,73921.31067416674
-							32731.924644939794,74587.9773408334
-							32731.924644939794,75412.0226591666
-							33216.2863302767,76078.68932583326
-							34000.0,76333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,75000.0
-							34669.130606358856,75743.1448254774
-							34034.8994967025,75999.3908270191 34000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,75000.0
-							34998.629534754575,75052.33595624294
-							34731.35370161917,75681.9983600625 34000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,75000.0
-							34743.14482547739,74330.86939364114
-							34999.390827019095,74965.1005032975 34000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,75000.0
-							34052.33595624295,74001.37046524543
-							34681.9983600625,74268.64629838083 34000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,75000.0
-							33330.869393641144,74256.8551745226
-							33965.1005032975,74000.6091729809 34000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,75000.0
-							33001.370465245425,74947.66404375706
-							33268.64629838083,74318.0016399375 34000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,75000.0
-							33256.85517452261,75669.13060635886
-							33000.609172980905,75034.8994967025 34000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,75000.0
-							33947.66404375705,75998.62953475457
-							33318.0016399375,75731.35370161917 34000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-	</MultiPolygon>
-	
-	<MultiPolygon>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,70333.33333333333
-							38783.7136697233,70078.68932583326
-							39268.0753550602,69412.0226591666
-							39268.0753550602,68587.9773408334
-							38783.7136697233,67921.31067416674
-							38000.0,67666.66666666667
-							37216.2863302767,67921.31067416674
-							36731.9246449398,68587.9773408334
-							36731.9246449398,69412.0226591666
-							37216.2863302767,70078.68932583326
-							38000.0,70333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,69000.0
-							38669.130606358856,69743.1448254774
-							38034.8994967025,69999.3908270191 38000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,69000.0
-							38998.629534754575,69052.33595624294
-							38731.35370161917,69681.9983600625 38000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,69000.0
-							38743.14482547739,68330.86939364114
-							38999.390827019095,68965.1005032975 38000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,69000.0
-							38052.33595624295,68001.37046524543
-							38681.9983600625,68268.64629838083 38000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,69000.0
-							37330.869393641144,68256.8551745226
-							37965.1005032975,68000.6091729809 38000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,69000.0
-							37001.370465245425,68947.66404375706
-							37268.64629838083,68318.0016399375 38000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,69000.0
-							37256.85517452261,69669.13060635886
-							37000.609172980905,69034.8994967025 38000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,69000.0
-							37947.66404375705,69998.62953475457
-							37318.0016399375,69731.35370161917 38000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,70333.33333333333
-							42783.7136697233,70078.68932583326
-							43268.0753550602,69412.0226591666
-							43268.0753550602,68587.9773408334
-							42783.7136697233,67921.31067416674
-							42000.0,67666.66666666667
-							41216.2863302767,67921.31067416674
-							40731.9246449398,68587.9773408334
-							40731.9246449398,69412.0226591666
-							41216.2863302767,70078.68932583326
-							42000.0,70333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,69000.0
-							42669.130606358856,69743.1448254774
-							42034.8994967025,69999.3908270191 42000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,69000.0
-							42998.629534754575,69052.33595624294
-							42731.35370161917,69681.9983600625 42000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,69000.0
-							42743.14482547739,68330.86939364114
-							42999.390827019095,68965.1005032975 42000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,69000.0
-							42052.33595624295,68001.37046524543
-							42681.9983600625,68268.64629838083 42000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,69000.0
-							41330.869393641144,68256.8551745226
-							41965.1005032975,68000.6091729809 42000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,69000.0
-							41001.370465245425,68947.66404375706
-							41268.64629838083,68318.0016399375 42000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,69000.0
-							41256.85517452261,69669.13060635886
-							41000.609172980905,69034.8994967025 42000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,69000.0
-							41947.66404375705,69998.62953475457
-							41318.0016399375,69731.35370161917 42000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,76333.33333333333
-							38783.7136697233,76078.68932583326
-							39268.0753550602,75412.0226591666
-							39268.0753550602,74587.9773408334
-							38783.7136697233,73921.31067416674
-							38000.0,73666.66666666667
-							37216.2863302767,73921.31067416674
-							36731.9246449398,74587.9773408334
-							36731.9246449398,75412.0226591666
-							37216.2863302767,76078.68932583326
-							38000.0,76333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,75000.0
-							38669.130606358856,75743.1448254774
-							38034.8994967025,75999.3908270191 38000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,75000.0
-							38998.629534754575,75052.33595624294
-							38731.35370161917,75681.9983600625 38000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,75000.0
-							38743.14482547739,74330.86939364114
-							38999.390827019095,74965.1005032975 38000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,75000.0
-							38052.33595624295,74001.37046524543
-							38681.9983600625,74268.64629838083 38000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,75000.0
-							37330.869393641144,74256.8551745226
-							37965.1005032975,74000.6091729809 38000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,75000.0
-							37001.370465245425,74947.66404375706
-							37268.64629838083,74318.0016399375 38000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,75000.0
-							37256.85517452261,75669.13060635886
-							37000.609172980905,75034.8994967025 38000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,75000.0
-							37947.66404375705,75998.62953475457
-							37318.0016399375,75731.35370161917 38000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,76333.33333333333
-							42783.7136697233,76078.68932583326
-							43268.0753550602,75412.0226591666
-							43268.0753550602,74587.9773408334
-							42783.7136697233,73921.31067416674
-							42000.0,73666.66666666667
-							41216.2863302767,73921.31067416674
-							40731.9246449398,74587.9773408334
-							40731.9246449398,75412.0226591666
-							41216.2863302767,76078.68932583326
-							42000.0,76333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,75000.0
-							42669.130606358856,75743.1448254774
-							42034.8994967025,75999.3908270191 42000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,75000.0
-							42998.629534754575,75052.33595624294
-							42731.35370161917,75681.9983600625 42000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,75000.0
-							42743.14482547739,74330.86939364114
-							42999.390827019095,74965.1005032975 42000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,75000.0
-							42052.33595624295,74001.37046524543
-							42681.9983600625,74268.64629838083 42000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,75000.0
-							41330.869393641144,74256.8551745226
-							41965.1005032975,74000.6091729809 42000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,75000.0
-							41001.370465245425,74947.66404375706
-							41268.64629838083,74318.0016399375 42000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,75000.0
-							41256.85517452261,75669.13060635886
-							41000.609172980905,75034.8994967025 42000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,75000.0
-							41947.66404375705,75998.62953475457
-							41318.0016399375,75731.35370161917 42000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-	</MultiPolygon>
-	
-	<MultiPolygon>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,70333.33333333333
-							46783.7136697233,70078.68932583326
-							47268.0753550602,69412.0226591666
-							47268.0753550602,68587.9773408334
-							46783.7136697233,67921.31067416674
-							46000.0,67666.66666666667
-							45216.2863302767,67921.31067416674
-							44731.9246449398,68587.9773408334
-							44731.9246449398,69412.0226591666
-							45216.2863302767,70078.68932583326
-							46000.0,70333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,69000.0
-							46669.130606358856,69743.1448254774
-							46034.8994967025,69999.3908270191 46000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,69000.0
-							46998.629534754575,69052.33595624294
-							46731.35370161917,69681.9983600625 46000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,69000.0
-							46743.14482547739,68330.86939364114
-							46999.390827019095,68965.1005032975 46000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,69000.0
-							46052.33595624295,68001.37046524543
-							46681.9983600625,68268.64629838083 46000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,69000.0
-							45330.869393641144,68256.8551745226
-							45965.1005032975,68000.6091729809 46000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,69000.0
-							45001.370465245425,68947.66404375706
-							45268.64629838083,68318.0016399375 46000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,69000.0
-							45256.85517452261,69669.13060635886
-							45000.609172980905,69034.8994967025 46000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,69000.0
-							45947.66404375705,69998.62953475457
-							45318.0016399375,69731.35370161917 46000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,70333.33333333333
-							50783.7136697233,70078.68932583326
-							51268.0753550602,69412.0226591666
-							51268.0753550602,68587.9773408334
-							50783.7136697233,67921.31067416674
-							50000.0,67666.66666666667
-							49216.2863302767,67921.31067416674
-							48731.9246449398,68587.9773408334
-							48731.9246449398,69412.0226591666
-							49216.2863302767,70078.68932583326
-							50000.0,70333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,69000.0
-							50669.130606358856,69743.1448254774
-							50034.8994967025,69999.3908270191 50000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,69000.0
-							50998.629534754575,69052.33595624294
-							50731.35370161917,69681.9983600625 50000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,69000.0
-							50743.14482547739,68330.86939364114
-							50999.390827019095,68965.1005032975 50000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,69000.0
-							50052.33595624295,68001.37046524543
-							50681.9983600625,68268.64629838083 50000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,69000.0
-							49330.869393641144,68256.8551745226
-							49965.1005032975,68000.6091729809 50000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,69000.0
-							49001.370465245425,68947.66404375706
-							49268.64629838083,68318.0016399375 50000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,69000.0
-							49256.85517452261,69669.13060635886
-							49000.609172980905,69034.8994967025 50000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,69000.0
-							49947.66404375705,69998.62953475457
-							49318.0016399375,69731.35370161917 50000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,76333.33333333333
-							46783.7136697233,76078.68932583326
-							47268.0753550602,75412.0226591666
-							47268.0753550602,74587.9773408334
-							46783.7136697233,73921.31067416674
-							46000.0,73666.66666666667
-							45216.2863302767,73921.31067416674
-							44731.9246449398,74587.9773408334
-							44731.9246449398,75412.0226591666
-							45216.2863302767,76078.68932583326
-							46000.0,76333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,75000.0
-							46669.130606358856,75743.1448254774
-							46034.8994967025,75999.3908270191 46000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,75000.0
-							46998.629534754575,75052.33595624294
-							46731.35370161917,75681.9983600625 46000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,75000.0
-							46743.14482547739,74330.86939364114
-							46999.390827019095,74965.1005032975 46000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,75000.0
-							46052.33595624295,74001.37046524543
-							46681.9983600625,74268.64629838083 46000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,75000.0
-							45330.869393641144,74256.8551745226
-							45965.1005032975,74000.6091729809 46000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,75000.0
-							45001.370465245425,74947.66404375706
-							45268.64629838083,74318.0016399375 46000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,75000.0
-							45256.85517452261,75669.13060635886
-							45000.609172980905,75034.8994967025 46000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,75000.0
-							45947.66404375705,75998.62953475457
-							45318.0016399375,75731.35370161917 46000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,76333.33333333333
-							50783.7136697233,76078.68932583326
-							51268.0753550602,75412.0226591666
-							51268.0753550602,74587.9773408334
-							50783.7136697233,73921.31067416674
-							50000.0,73666.66666666667
-							49216.2863302767,73921.31067416674
-							48731.9246449398,74587.9773408334
-							48731.9246449398,75412.0226591666
-							49216.2863302767,76078.68932583326
-							50000.0,76333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,75000.0
-							50669.130606358856,75743.1448254774
-							50034.8994967025,75999.3908270191 50000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,75000.0
-							50998.629534754575,75052.33595624294
-							50731.35370161917,75681.9983600625 50000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,75000.0
-							50743.14482547739,74330.86939364114
-							50999.390827019095,74965.1005032975 50000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,75000.0
-							50052.33595624295,74001.37046524543
-							50681.9983600625,74268.64629838083 50000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,75000.0
-							49330.869393641144,74256.8551745226
-							49965.1005032975,74000.6091729809 50000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,75000.0
-							49001.370465245425,74947.66404375706
-							49268.64629838083,74318.0016399375 50000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,75000.0
-							49256.85517452261,75669.13060635886
-							49000.609172980905,75034.8994967025 50000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,75000.0
-							49947.66404375705,75998.62953475457
-							49318.0016399375,75731.35370161917 50000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-	</MultiPolygon>
-	
-	<MultiPolygon>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,70333.33333333333
-							54783.7136697233,70078.68932583326
-							55268.0753550602,69412.0226591666
-							55268.0753550602,68587.9773408334
-							54783.7136697233,67921.31067416674
-							54000.0,67666.66666666667
-							53216.2863302767,67921.31067416674
-							52731.9246449398,68587.9773408334
-							52731.9246449398,69412.0226591666
-							53216.2863302767,70078.68932583326
-							54000.0,70333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,69000.0
-							54669.130606358856,69743.1448254774
-							54034.8994967025,69999.3908270191 54000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,69000.0
-							54998.629534754575,69052.33595624294
-							54731.35370161917,69681.9983600625 54000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,69000.0
-							54743.14482547739,68330.86939364114
-							54999.390827019095,68965.1005032975 54000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,69000.0
-							54052.33595624295,68001.37046524543
-							54681.9983600625,68268.64629838083 54000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,69000.0
-							53330.869393641144,68256.8551745226
-							53965.1005032975,68000.6091729809 54000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,69000.0
-							53001.370465245425,68947.66404375706
-							53268.64629838083,68318.0016399375 54000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,69000.0
-							53256.85517452261,69669.13060635886
-							53000.609172980905,69034.8994967025 54000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,69000.0
-							53947.66404375705,69998.62953475457
-							53318.0016399375,69731.35370161917 54000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,70333.33333333333
-							58783.7136697233,70078.68932583326
-							59268.0753550602,69412.0226591666
-							59268.0753550602,68587.9773408334
-							58783.7136697233,67921.31067416674
-							58000.0,67666.66666666667
-							57216.2863302767,67921.31067416674
-							56731.9246449398,68587.9773408334
-							56731.9246449398,69412.0226591666
-							57216.2863302767,70078.68932583326
-							58000.0,70333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,69000.0
-							58669.130606358856,69743.1448254774
-							58034.8994967025,69999.3908270191 58000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,69000.0
-							58998.629534754575,69052.33595624294
-							58731.35370161917,69681.9983600625 58000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,69000.0
-							58743.14482547739,68330.86939364114
-							58999.390827019095,68965.1005032975 58000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,69000.0
-							58052.33595624295,68001.37046524543
-							58681.9983600625,68268.64629838083 58000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,69000.0
-							57330.869393641144,68256.8551745226
-							57965.1005032975,68000.6091729809 58000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,69000.0
-							57001.370465245425,68947.66404375706
-							57268.64629838083,68318.0016399375 58000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,69000.0
-							57256.85517452261,69669.13060635886
-							57000.609172980905,69034.8994967025 58000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,69000.0
-							57947.66404375705,69998.62953475457
-							57318.0016399375,69731.35370161917 58000.0,69000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,76333.33333333333
-							54783.7136697233,76078.68932583326
-							55268.0753550602,75412.0226591666
-							55268.0753550602,74587.9773408334
-							54783.7136697233,73921.31067416674
-							54000.0,73666.66666666667
-							53216.2863302767,73921.31067416674
-							52731.9246449398,74587.9773408334
-							52731.9246449398,75412.0226591666
-							53216.2863302767,76078.68932583326
-							54000.0,76333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,75000.0
-							54669.130606358856,75743.1448254774
-							54034.8994967025,75999.3908270191 54000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,75000.0
-							54998.629534754575,75052.33595624294
-							54731.35370161917,75681.9983600625 54000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,75000.0
-							54743.14482547739,74330.86939364114
-							54999.390827019095,74965.1005032975 54000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,75000.0
-							54052.33595624295,74001.37046524543
-							54681.9983600625,74268.64629838083 54000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,75000.0
-							53330.869393641144,74256.8551745226
-							53965.1005032975,74000.6091729809 54000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,75000.0
-							53001.370465245425,74947.66404375706
-							53268.64629838083,74318.0016399375 54000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,75000.0
-							53256.85517452261,75669.13060635886
-							53000.609172980905,75034.8994967025 54000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,75000.0
-							53947.66404375705,75998.62953475457
-							53318.0016399375,75731.35370161917 54000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,76333.33333333333
-							58783.7136697233,76078.68932583326
-							59268.0753550602,75412.0226591666
-							59268.0753550602,74587.9773408334
-							58783.7136697233,73921.31067416674
-							58000.0,73666.66666666667
-							57216.2863302767,73921.31067416674
-							56731.9246449398,74587.9773408334
-							56731.9246449398,75412.0226591666
-							57216.2863302767,76078.68932583326
-							58000.0,76333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,75000.0
-							58669.130606358856,75743.1448254774
-							58034.8994967025,75999.3908270191 58000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,75000.0
-							58998.629534754575,75052.33595624294
-							58731.35370161917,75681.9983600625 58000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,75000.0
-							58743.14482547739,74330.86939364114
-							58999.390827019095,74965.1005032975 58000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,75000.0
-							58052.33595624295,74001.37046524543
-							58681.9983600625,74268.64629838083 58000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,75000.0
-							57330.869393641144,74256.8551745226
-							57965.1005032975,74000.6091729809 58000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,75000.0
-							57001.370465245425,74947.66404375706
-							57268.64629838083,74318.0016399375 58000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,75000.0
-							57256.85517452261,75669.13060635886
-							57000.609172980905,75034.8994967025 58000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,75000.0
-							57947.66404375705,75998.62953475457
-							57318.0016399375,75731.35370161917 58000.0,75000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-	</MultiPolygon>
-	
-	<MultiPolygon>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,82333.33333333333
-							22783.713669723296,82078.68932583326
-							23268.075355060206,81412.0226591666
-							23268.075355060206,80587.9773408334
-							22783.713669723296,79921.31067416674
-							22000.0,79666.66666666667
-							21216.286330276704,79921.31067416674
-							20731.924644939794,80587.9773408334
-							20731.924644939794,81412.0226591666
-							21216.286330276704,82078.68932583326
-							22000.0,82333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,81000.0
-							22669.13060635886,81743.1448254774
-							22034.8994967025,81999.3908270191 22000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,81000.0
-							22998.629534754575,81052.33595624294
-							22731.35370161917,81681.9983600625 22000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,81000.0
-							22743.144825477393,80330.86939364114
-							22999.390827019095,80965.1005032975 22000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,81000.0
-							22052.335956242943,80001.37046524543
-							22681.9983600625,80268.64629838083 22000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,81000.0
-							21330.86939364114,80256.8551745226
-							21965.1005032975,80000.6091729809 22000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,81000.0
-							21001.370465245425,80947.66404375706
-							21268.64629838083,80318.0016399375 22000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,81000.0
-							21256.855174522607,81669.13060635886
-							21000.609172980905,81034.8994967025 22000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,81000.0
-							21947.664043757057,81998.62953475457
-							21318.0016399375,81731.35370161917 22000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,82333.33333333333
-							26783.713669723296,82078.68932583326
-							27268.075355060206,81412.0226591666
-							27268.075355060206,80587.9773408334
-							26783.713669723296,79921.31067416674
-							26000.0,79666.66666666667
-							25216.286330276704,79921.31067416674
-							24731.924644939794,80587.9773408334
-							24731.924644939794,81412.0226591666
-							25216.286330276704,82078.68932583326
-							26000.0,82333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,81000.0
-							26669.13060635886,81743.1448254774
-							26034.8994967025,81999.3908270191 26000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,81000.0
-							26998.629534754575,81052.33595624294
-							26731.35370161917,81681.9983600625 26000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,81000.0
-							26743.144825477393,80330.86939364114
-							26999.390827019095,80965.1005032975 26000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,81000.0
-							26052.335956242943,80001.37046524543
-							26681.9983600625,80268.64629838083 26000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,81000.0
-							25330.86939364114,80256.8551745226
-							25965.1005032975,80000.6091729809 26000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,81000.0
-							25001.370465245425,80947.66404375706
-							25268.64629838083,80318.0016399375 26000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,81000.0
-							25256.855174522607,81669.13060635886
-							25000.609172980905,81034.8994967025 26000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,81000.0
-							25947.664043757057,81998.62953475457
-							25318.0016399375,81731.35370161917 26000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,88333.33333333333
-							22783.713669723296,88078.68932583326
-							23268.075355060206,87412.0226591666
-							23268.075355060206,86587.9773408334
-							22783.713669723296,85921.31067416674
-							22000.0,85666.66666666667
-							21216.286330276704,85921.31067416674
-							20731.924644939794,86587.9773408334
-							20731.924644939794,87412.0226591666
-							21216.286330276704,88078.68932583326
-							22000.0,88333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,87000.0
-							22669.13060635886,87743.1448254774
-							22034.8994967025,87999.3908270191 22000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,87000.0
-							22998.629534754575,87052.33595624294
-							22731.35370161917,87681.9983600625 22000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,87000.0
-							22743.144825477393,86330.86939364114
-							22999.390827019095,86965.1005032975 22000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,87000.0
-							22052.335956242943,86001.37046524543
-							22681.9983600625,86268.64629838083 22000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,87000.0
-							21330.86939364114,86256.8551745226
-							21965.1005032975,86000.6091729809 22000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,87000.0
-							21001.370465245425,86947.66404375706
-							21268.64629838083,86318.0016399375 22000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,87000.0
-							21256.855174522607,87669.13060635886
-							21000.609172980905,87034.8994967025 22000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>22000.0,87000.0
-							21947.664043757057,87998.62953475457
-							21318.0016399375,87731.35370161917 22000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,88333.33333333333
-							26783.713669723296,88078.68932583326
-							27268.075355060206,87412.0226591666
-							27268.075355060206,86587.9773408334
-							26783.713669723296,85921.31067416674
-							26000.0,85666.66666666667
-							25216.286330276704,85921.31067416674
-							24731.924644939794,86587.9773408334
-							24731.924644939794,87412.0226591666
-							25216.286330276704,88078.68932583326
-							26000.0,88333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,87000.0
-							26669.13060635886,87743.1448254774
-							26034.8994967025,87999.3908270191 26000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,87000.0
-							26998.629534754575,87052.33595624294
-							26731.35370161917,87681.9983600625 26000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,87000.0
-							26743.144825477393,86330.86939364114
-							26999.390827019095,86965.1005032975 26000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,87000.0
-							26052.335956242943,86001.37046524543
-							26681.9983600625,86268.64629838083 26000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,87000.0
-							25330.86939364114,86256.8551745226
-							25965.1005032975,86000.6091729809 26000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,87000.0
-							25001.370465245425,86947.66404375706
-							25268.64629838083,86318.0016399375 26000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,87000.0
-							25256.855174522607,87669.13060635886
-							25000.609172980905,87034.8994967025 26000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>26000.0,87000.0
-							25947.664043757057,87998.62953475457
-							25318.0016399375,87731.35370161917 26000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-	</MultiPolygon>
-	
-	<MultiPolygon>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,82333.33333333333
-							30783.713669723296,82078.68932583326
-							31268.075355060206,81412.0226591666
-							31268.075355060206,80587.9773408334
-							30783.713669723296,79921.31067416674
-							30000.0,79666.66666666667
-							29216.286330276704,79921.31067416674
-							28731.924644939794,80587.9773408334
-							28731.924644939794,81412.0226591666
-							29216.286330276704,82078.68932583326
-							30000.0,82333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,81000.0
-							30669.13060635886,81743.1448254774
-							30034.8994967025,81999.3908270191 30000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,81000.0
-							30998.629534754575,81052.33595624294
-							30731.35370161917,81681.9983600625 30000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,81000.0
-							30743.144825477393,80330.86939364114
-							30999.390827019095,80965.1005032975 30000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,81000.0
-							30052.335956242943,80001.37046524543
-							30681.9983600625,80268.64629838083 30000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,81000.0
-							29330.86939364114,80256.8551745226
-							29965.1005032975,80000.6091729809 30000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,81000.0
-							29001.370465245425,80947.66404375706
-							29268.64629838083,80318.0016399375 30000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,81000.0
-							29256.855174522607,81669.13060635886
-							29000.609172980905,81034.8994967025 30000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,81000.0
-							29947.664043757057,81998.62953475457
-							29318.0016399375,81731.35370161917 30000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,82333.33333333333
-							34783.7136697233,82078.68932583326
-							35268.0753550602,81412.0226591666
-							35268.0753550602,80587.9773408334
-							34783.7136697233,79921.31067416674
-							34000.0,79666.66666666667
-							33216.2863302767,79921.31067416674
-							32731.924644939794,80587.9773408334
-							32731.924644939794,81412.0226591666
-							33216.2863302767,82078.68932583326
-							34000.0,82333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,81000.0
-							34669.130606358856,81743.1448254774
-							34034.8994967025,81999.3908270191 34000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,81000.0
-							34998.629534754575,81052.33595624294
-							34731.35370161917,81681.9983600625 34000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,81000.0
-							34743.14482547739,80330.86939364114
-							34999.390827019095,80965.1005032975 34000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,81000.0
-							34052.33595624295,80001.37046524543
-							34681.9983600625,80268.64629838083 34000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,81000.0
-							33330.869393641144,80256.8551745226
-							33965.1005032975,80000.6091729809 34000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,81000.0
-							33001.370465245425,80947.66404375706
-							33268.64629838083,80318.0016399375 34000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,81000.0
-							33256.85517452261,81669.13060635886
-							33000.609172980905,81034.8994967025 34000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,81000.0
-							33947.66404375705,81998.62953475457
-							33318.0016399375,81731.35370161917 34000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,88333.33333333333
-							30783.713669723296,88078.68932583326
-							31268.075355060206,87412.0226591666
-							31268.075355060206,86587.9773408334
-							30783.713669723296,85921.31067416674
-							30000.0,85666.66666666667
-							29216.286330276704,85921.31067416674
-							28731.924644939794,86587.9773408334
-							28731.924644939794,87412.0226591666
-							29216.286330276704,88078.68932583326
-							30000.0,88333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,87000.0
-							30669.13060635886,87743.1448254774
-							30034.8994967025,87999.3908270191 30000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,87000.0
-							30998.629534754575,87052.33595624294
-							30731.35370161917,87681.9983600625 30000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,87000.0
-							30743.144825477393,86330.86939364114
-							30999.390827019095,86965.1005032975 30000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,87000.0
-							30052.335956242943,86001.37046524543
-							30681.9983600625,86268.64629838083 30000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,87000.0
-							29330.86939364114,86256.8551745226
-							29965.1005032975,86000.6091729809 30000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,87000.0
-							29001.370465245425,86947.66404375706
-							29268.64629838083,86318.0016399375 30000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,87000.0
-							29256.855174522607,87669.13060635886
-							29000.609172980905,87034.8994967025 30000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>30000.0,87000.0
-							29947.664043757057,87998.62953475457
-							29318.0016399375,87731.35370161917 30000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,88333.33333333333
-							34783.7136697233,88078.68932583326
-							35268.0753550602,87412.0226591666
-							35268.0753550602,86587.9773408334
-							34783.7136697233,85921.31067416674
-							34000.0,85666.66666666667
-							33216.2863302767,85921.31067416674
-							32731.924644939794,86587.9773408334
-							32731.924644939794,87412.0226591666
-							33216.2863302767,88078.68932583326
-							34000.0,88333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,87000.0
-							34669.130606358856,87743.1448254774
-							34034.8994967025,87999.3908270191 34000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,87000.0
-							34998.629534754575,87052.33595624294
-							34731.35370161917,87681.9983600625 34000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,87000.0
-							34743.14482547739,86330.86939364114
-							34999.390827019095,86965.1005032975 34000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,87000.0
-							34052.33595624295,86001.37046524543
-							34681.9983600625,86268.64629838083 34000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,87000.0
-							33330.869393641144,86256.8551745226
-							33965.1005032975,86000.6091729809 34000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,87000.0
-							33001.370465245425,86947.66404375706
-							33268.64629838083,86318.0016399375 34000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,87000.0
-							33256.85517452261,87669.13060635886
-							33000.609172980905,87034.8994967025 34000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>34000.0,87000.0
-							33947.66404375705,87998.62953475457
-							33318.0016399375,87731.35370161917 34000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-	</MultiPolygon>
-	
-	<MultiPolygon>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,82333.33333333333
-							38783.7136697233,82078.68932583326
-							39268.0753550602,81412.0226591666
-							39268.0753550602,80587.9773408334
-							38783.7136697233,79921.31067416674
-							38000.0,79666.66666666667
-							37216.2863302767,79921.31067416674
-							36731.9246449398,80587.9773408334
-							36731.9246449398,81412.0226591666
-							37216.2863302767,82078.68932583326
-							38000.0,82333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,81000.0
-							38669.130606358856,81743.1448254774
-							38034.8994967025,81999.3908270191 38000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,81000.0
-							38998.629534754575,81052.33595624294
-							38731.35370161917,81681.9983600625 38000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,81000.0
-							38743.14482547739,80330.86939364114
-							38999.390827019095,80965.1005032975 38000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,81000.0
-							38052.33595624295,80001.37046524543
-							38681.9983600625,80268.64629838083 38000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,81000.0
-							37330.869393641144,80256.8551745226
-							37965.1005032975,80000.6091729809 38000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,81000.0
-							37001.370465245425,80947.66404375706
-							37268.64629838083,80318.0016399375 38000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,81000.0
-							37256.85517452261,81669.13060635886
-							37000.609172980905,81034.8994967025 38000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,81000.0
-							37947.66404375705,81998.62953475457
-							37318.0016399375,81731.35370161917 38000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,82333.33333333333
-							42783.7136697233,82078.68932583326
-							43268.0753550602,81412.0226591666
-							43268.0753550602,80587.9773408334
-							42783.7136697233,79921.31067416674
-							42000.0,79666.66666666667
-							41216.2863302767,79921.31067416674
-							40731.9246449398,80587.9773408334
-							40731.9246449398,81412.0226591666
-							41216.2863302767,82078.68932583326
-							42000.0,82333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,81000.0
-							42669.130606358856,81743.1448254774
-							42034.8994967025,81999.3908270191 42000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,81000.0
-							42998.629534754575,81052.33595624294
-							42731.35370161917,81681.9983600625 42000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,81000.0
-							42743.14482547739,80330.86939364114
-							42999.390827019095,80965.1005032975 42000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,81000.0
-							42052.33595624295,80001.37046524543
-							42681.9983600625,80268.64629838083 42000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,81000.0
-							41330.869393641144,80256.8551745226
-							41965.1005032975,80000.6091729809 42000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,81000.0
-							41001.370465245425,80947.66404375706
-							41268.64629838083,80318.0016399375 42000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,81000.0
-							41256.85517452261,81669.13060635886
-							41000.609172980905,81034.8994967025 42000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,81000.0
-							41947.66404375705,81998.62953475457
-							41318.0016399375,81731.35370161917 42000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,88333.33333333333
-							38783.7136697233,88078.68932583326
-							39268.0753550602,87412.0226591666
-							39268.0753550602,86587.9773408334
-							38783.7136697233,85921.31067416674
-							38000.0,85666.66666666667
-							37216.2863302767,85921.31067416674
-							36731.9246449398,86587.9773408334
-							36731.9246449398,87412.0226591666
-							37216.2863302767,88078.68932583326
-							38000.0,88333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,87000.0
-							38669.130606358856,87743.1448254774
-							38034.8994967025,87999.3908270191 38000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,87000.0
-							38998.629534754575,87052.33595624294
-							38731.35370161917,87681.9983600625 38000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,87000.0
-							38743.14482547739,86330.86939364114
-							38999.390827019095,86965.1005032975 38000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,87000.0
-							38052.33595624295,86001.37046524543
-							38681.9983600625,86268.64629838083 38000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,87000.0
-							37330.869393641144,86256.8551745226
-							37965.1005032975,86000.6091729809 38000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,87000.0
-							37001.370465245425,86947.66404375706
-							37268.64629838083,86318.0016399375 38000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,87000.0
-							37256.85517452261,87669.13060635886
-							37000.609172980905,87034.8994967025 38000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>38000.0,87000.0
-							37947.66404375705,87998.62953475457
-							37318.0016399375,87731.35370161917 38000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,88333.33333333333
-							42783.7136697233,88078.68932583326
-							43268.0753550602,87412.0226591666
-							43268.0753550602,86587.9773408334
-							42783.7136697233,85921.31067416674
-							42000.0,85666.66666666667
-							41216.2863302767,85921.31067416674
-							40731.9246449398,86587.9773408334
-							40731.9246449398,87412.0226591666
-							41216.2863302767,88078.68932583326
-							42000.0,88333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,87000.0
-							42669.130606358856,87743.1448254774
-							42034.8994967025,87999.3908270191 42000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,87000.0
-							42998.629534754575,87052.33595624294
-							42731.35370161917,87681.9983600625 42000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,87000.0
-							42743.14482547739,86330.86939364114
-							42999.390827019095,86965.1005032975 42000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,87000.0
-							42052.33595624295,86001.37046524543
-							42681.9983600625,86268.64629838083 42000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,87000.0
-							41330.869393641144,86256.8551745226
-							41965.1005032975,86000.6091729809 42000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,87000.0
-							41001.370465245425,86947.66404375706
-							41268.64629838083,86318.0016399375 42000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,87000.0
-							41256.85517452261,87669.13060635886
-							41000.609172980905,87034.8994967025 42000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>42000.0,87000.0
-							41947.66404375705,87998.62953475457
-							41318.0016399375,87731.35370161917 42000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-	</MultiPolygon>
-	
-	<MultiPolygon>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,82333.33333333333
-							46783.7136697233,82078.68932583326
-							47268.0753550602,81412.0226591666
-							47268.0753550602,80587.9773408334
-							46783.7136697233,79921.31067416674
-							46000.0,79666.66666666667
-							45216.2863302767,79921.31067416674
-							44731.9246449398,80587.9773408334
-							44731.9246449398,81412.0226591666
-							45216.2863302767,82078.68932583326
-							46000.0,82333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,81000.0
-							46669.130606358856,81743.1448254774
-							46034.8994967025,81999.3908270191 46000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,81000.0
-							46998.629534754575,81052.33595624294
-							46731.35370161917,81681.9983600625 46000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,81000.0
-							46743.14482547739,80330.86939364114
-							46999.390827019095,80965.1005032975 46000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,81000.0
-							46052.33595624295,80001.37046524543
-							46681.9983600625,80268.64629838083 46000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,81000.0
-							45330.869393641144,80256.8551745226
-							45965.1005032975,80000.6091729809 46000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,81000.0
-							45001.370465245425,80947.66404375706
-							45268.64629838083,80318.0016399375 46000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,81000.0
-							45256.85517452261,81669.13060635886
-							45000.609172980905,81034.8994967025 46000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,81000.0
-							45947.66404375705,81998.62953475457
-							45318.0016399375,81731.35370161917 46000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,82333.33333333333
-							50783.7136697233,82078.68932583326
-							51268.0753550602,81412.0226591666
-							51268.0753550602,80587.9773408334
-							50783.7136697233,79921.31067416674
-							50000.0,79666.66666666667
-							49216.2863302767,79921.31067416674
-							48731.9246449398,80587.9773408334
-							48731.9246449398,81412.0226591666
-							49216.2863302767,82078.68932583326
-							50000.0,82333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,81000.0
-							50669.130606358856,81743.1448254774
-							50034.8994967025,81999.3908270191 50000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,81000.0
-							50998.629534754575,81052.33595624294
-							50731.35370161917,81681.9983600625 50000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,81000.0
-							50743.14482547739,80330.86939364114
-							50999.390827019095,80965.1005032975 50000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,81000.0
-							50052.33595624295,80001.37046524543
-							50681.9983600625,80268.64629838083 50000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,81000.0
-							49330.869393641144,80256.8551745226
-							49965.1005032975,80000.6091729809 50000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,81000.0
-							49001.370465245425,80947.66404375706
-							49268.64629838083,80318.0016399375 50000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,81000.0
-							49256.85517452261,81669.13060635886
-							49000.609172980905,81034.8994967025 50000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,81000.0
-							49947.66404375705,81998.62953475457
-							49318.0016399375,81731.35370161917 50000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,88333.33333333333
-							46783.7136697233,88078.68932583326
-							47268.0753550602,87412.0226591666
-							47268.0753550602,86587.9773408334
-							46783.7136697233,85921.31067416674
-							46000.0,85666.66666666667
-							45216.2863302767,85921.31067416674
-							44731.9246449398,86587.9773408334
-							44731.9246449398,87412.0226591666
-							45216.2863302767,88078.68932583326
-							46000.0,88333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,87000.0
-							46669.130606358856,87743.1448254774
-							46034.8994967025,87999.3908270191 46000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,87000.0
-							46998.629534754575,87052.33595624294
-							46731.35370161917,87681.9983600625 46000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,87000.0
-							46743.14482547739,86330.86939364114
-							46999.390827019095,86965.1005032975 46000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,87000.0
-							46052.33595624295,86001.37046524543
-							46681.9983600625,86268.64629838083 46000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,87000.0
-							45330.869393641144,86256.8551745226
-							45965.1005032975,86000.6091729809 46000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,87000.0
-							45001.370465245425,86947.66404375706
-							45268.64629838083,86318.0016399375 46000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,87000.0
-							45256.85517452261,87669.13060635886
-							45000.609172980905,87034.8994967025 46000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>46000.0,87000.0
-							45947.66404375705,87998.62953475457
-							45318.0016399375,87731.35370161917 46000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,88333.33333333333
-							50783.7136697233,88078.68932583326
-							51268.0753550602,87412.0226591666
-							51268.0753550602,86587.9773408334
-							50783.7136697233,85921.31067416674
-							50000.0,85666.66666666667
-							49216.2863302767,85921.31067416674
-							48731.9246449398,86587.9773408334
-							48731.9246449398,87412.0226591666
-							49216.2863302767,88078.68932583326
-							50000.0,88333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,87000.0
-							50669.130606358856,87743.1448254774
-							50034.8994967025,87999.3908270191 50000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,87000.0
-							50998.629534754575,87052.33595624294
-							50731.35370161917,87681.9983600625 50000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,87000.0
-							50743.14482547739,86330.86939364114
-							50999.390827019095,86965.1005032975 50000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,87000.0
-							50052.33595624295,86001.37046524543
-							50681.9983600625,86268.64629838083 50000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,87000.0
-							49330.869393641144,86256.8551745226
-							49965.1005032975,86000.6091729809 50000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,87000.0
-							49001.370465245425,86947.66404375706
-							49268.64629838083,86318.0016399375 50000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,87000.0
-							49256.85517452261,87669.13060635886
-							49000.609172980905,87034.8994967025 50000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>50000.0,87000.0
-							49947.66404375705,87998.62953475457
-							49318.0016399375,87731.35370161917 50000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-	</MultiPolygon>
-	
-	<MultiPolygon>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,82333.33333333333
-							54783.7136697233,82078.68932583326
-							55268.0753550602,81412.0226591666
-							55268.0753550602,80587.9773408334
-							54783.7136697233,79921.31067416674
-							54000.0,79666.66666666667
-							53216.2863302767,79921.31067416674
-							52731.9246449398,80587.9773408334
-							52731.9246449398,81412.0226591666
-							53216.2863302767,82078.68932583326
-							54000.0,82333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,81000.0
-							54669.130606358856,81743.1448254774
-							54034.8994967025,81999.3908270191 54000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,81000.0
-							54998.629534754575,81052.33595624294
-							54731.35370161917,81681.9983600625 54000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,81000.0
-							54743.14482547739,80330.86939364114
-							54999.390827019095,80965.1005032975 54000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,81000.0
-							54052.33595624295,80001.37046524543
-							54681.9983600625,80268.64629838083 54000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,81000.0
-							53330.869393641144,80256.8551745226
-							53965.1005032975,80000.6091729809 54000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,81000.0
-							53001.370465245425,80947.66404375706
-							53268.64629838083,80318.0016399375 54000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,81000.0
-							53256.85517452261,81669.13060635886
-							53000.609172980905,81034.8994967025 54000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,81000.0
-							53947.66404375705,81998.62953475457
-							53318.0016399375,81731.35370161917 54000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,82333.33333333333
-							58783.7136697233,82078.68932583326
-							59268.0753550602,81412.0226591666
-							59268.0753550602,80587.9773408334
-							58783.7136697233,79921.31067416674
-							58000.0,79666.66666666667
-							57216.2863302767,79921.31067416674
-							56731.9246449398,80587.9773408334
-							56731.9246449398,81412.0226591666
-							57216.2863302767,82078.68932583326
-							58000.0,82333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,81000.0
-							58669.130606358856,81743.1448254774
-							58034.8994967025,81999.3908270191 58000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,81000.0
-							58998.629534754575,81052.33595624294
-							58731.35370161917,81681.9983600625 58000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,81000.0
-							58743.14482547739,80330.86939364114
-							58999.390827019095,80965.1005032975 58000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,81000.0
-							58052.33595624295,80001.37046524543
-							58681.9983600625,80268.64629838083 58000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,81000.0
-							57330.869393641144,80256.8551745226
-							57965.1005032975,80000.6091729809 58000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,81000.0
-							57001.370465245425,80947.66404375706
-							57268.64629838083,80318.0016399375 58000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,81000.0
-							57256.85517452261,81669.13060635886
-							57000.609172980905,81034.8994967025 58000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,81000.0
-							57947.66404375705,81998.62953475457
-							57318.0016399375,81731.35370161917 58000.0,81000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,88333.33333333333
-							54783.7136697233,88078.68932583326
-							55268.0753550602,87412.0226591666
-							55268.0753550602,86587.9773408334
-							54783.7136697233,85921.31067416674
-							54000.0,85666.66666666667
-							53216.2863302767,85921.31067416674
-							52731.9246449398,86587.9773408334
-							52731.9246449398,87412.0226591666
-							53216.2863302767,88078.68932583326
-							54000.0,88333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,87000.0
-							54669.130606358856,87743.1448254774
-							54034.8994967025,87999.3908270191 54000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,87000.0
-							54998.629534754575,87052.33595624294
-							54731.35370161917,87681.9983600625 54000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,87000.0
-							54743.14482547739,86330.86939364114
-							54999.390827019095,86965.1005032975 54000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,87000.0
-							54052.33595624295,86001.37046524543
-							54681.9983600625,86268.64629838083 54000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,87000.0
-							53330.869393641144,86256.8551745226
-							53965.1005032975,86000.6091729809 54000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,87000.0
-							53001.370465245425,86947.66404375706
-							53268.64629838083,86318.0016399375 54000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,87000.0
-							53256.85517452261,87669.13060635886
-							53000.609172980905,87034.8994967025 54000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>54000.0,87000.0
-							53947.66404375705,87998.62953475457
-							53318.0016399375,87731.35370161917 54000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-		<polygonMember>
-			<Polygon>
-				<outerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,88333.33333333333
-							58783.7136697233,88078.68932583326
-							59268.0753550602,87412.0226591666
-							59268.0753550602,86587.9773408334
-							58783.7136697233,85921.31067416674
-							58000.0,85666.66666666667
-							57216.2863302767,85921.31067416674
-							56731.9246449398,86587.9773408334
-							56731.9246449398,87412.0226591666
-							57216.2863302767,88078.68932583326
-							58000.0,88333.33333333333 </coordinates>
-					</LinearRing>
-				</outerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,87000.0
-							58669.130606358856,87743.1448254774
-							58034.8994967025,87999.3908270191 58000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,87000.0
-							58998.629534754575,87052.33595624294
-							58731.35370161917,87681.9983600625 58000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,87000.0
-							58743.14482547739,86330.86939364114
-							58999.390827019095,86965.1005032975 58000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,87000.0
-							58052.33595624295,86001.37046524543
-							58681.9983600625,86268.64629838083 58000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,87000.0
-							57330.869393641144,86256.8551745226
-							57965.1005032975,86000.6091729809 58000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,87000.0
-							57001.370465245425,86947.66404375706
-							57268.64629838083,86318.0016399375 58000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,87000.0
-							57256.85517452261,87669.13060635886
-							57000.609172980905,87034.8994967025 58000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-				<innerBoundaryIs>
-					<LinearRing>
-						<coordinates>58000.0,87000.0
-							57947.66404375705,87998.62953475457
-							57318.0016399375,87731.35370161917 58000.0,87000.0
-							</coordinates>
-					</LinearRing>
-				</innerBoundaryIs>
-			</Polygon>
-		</polygonMember>
-	</MultiPolygon>
-	
-</MultiGeometry>
diff --git a/jtsio/test/data/points.xml b/jtsio/test/data/points.xml
deleted file mode 100644
index 9e67590..0000000
--- a/jtsio/test/data/points.xml
+++ /dev/null
@@ -1,105 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-
-<MultiGeometry>
-	
-	<Point>
-		<coordinates>24000.0,36000.0 </coordinates>
-	</Point>
-	
-	<Point>
-		<coordinates>32000.0,36000.0 </coordinates>
-	</Point>
-	
-	<Point>
-		<coordinates>40000.0,36000.0 </coordinates>
-	</Point>
-	
-	<Point>
-		<coordinates>48000.0,36000.0 </coordinates>
-	</Point>
-	
-	<Point>
-		<coordinates>56000.0,36000.0 </coordinates>
-	</Point>
-	
-	<Point>
-		<coordinates>24000.0,48000.0 </coordinates>
-	</Point>
-	
-	<Point>
-		<coordinates>32000.0,48000.0 </coordinates>
-	</Point>
-	
-	<Point>
-		<coordinates>40000.0,48000.0 </coordinates>
-	</Point>
-	
-	<Point>
-		<coordinates>48000.0,48000.0 </coordinates>
-	</Point>
-	
-	<Point>
-		<coordinates>56000.0,48000.0 </coordinates>
-	</Point>
-	
-	<Point>
-		<coordinates>24000.0,60000.0 </coordinates>
-	</Point>
-	
-	<Point>
-		<coordinates>32000.0,60000.0 </coordinates>
-	</Point>
-	
-	<Point>
-		<coordinates>40000.0,60000.0 </coordinates>
-	</Point>
-	
-	<Point>
-		<coordinates>48000.0,60000.0 </coordinates>
-	</Point>
-	
-	<Point>
-		<coordinates>56000.0,60000.0 </coordinates>
-	</Point>
-	
-	<Point>
-		<coordinates>24000.0,72000.0 </coordinates>
-	</Point>
-	
-	<Point>
-		<coordinates>32000.0,72000.0 </coordinates>
-	</Point>
-	
-	<Point>
-		<coordinates>40000.0,72000.0 </coordinates>
-	</Point>
-	
-	<Point>
-		<coordinates>48000.0,72000.0 </coordinates>
-	</Point>
-	
-	<Point>
-		<coordinates>56000.0,72000.0 </coordinates>
-	</Point>
-	
-	<Point>
-		<coordinates>24000.0,84000.0 </coordinates>
-	</Point>
-	
-	<Point>
-		<coordinates>32000.0,84000.0 </coordinates>
-	</Point>
-	
-	<Point>
-		<coordinates>40000.0,84000.0 </coordinates>
-	</Point>
-	
-	<Point>
-		<coordinates>48000.0,84000.0 </coordinates>
-	</Point>
-	
-	<Point>
-		<coordinates>56000.0,84000.0 </coordinates>
-	</Point>
-	
-</MultiGeometry>
diff --git a/jtsio/test/data/polygons.xml b/jtsio/test/data/polygons.xml
deleted file mode 100644
index 21e5c49..0000000
--- a/jtsio/test/data/polygons.xml
+++ /dev/null
@@ -1,2047 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-
-<MultiGeometry>
-	
-	<Polygon>
-		<outerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,38666.666666666664
-					25567.427339446596,38157.37865166653
-					26536.150710120408,36824.04531833319
-					26536.15071012041,35175.95468166681
-					25567.427339446596,33842.62134833347
-					24000.0,33333.333333333336
-					22432.572660553404,33842.62134833347
-					21463.849289879592,35175.95468166681
-					21463.84928987959,36824.04531833319
-					22432.572660553404,38157.37865166653
-					24000.0,38666.666666666664 </coordinates>
-			</LinearRing>
-		</outerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,36000.0
-					25338.261212717716,37486.289650954786
-					24069.798993405002,37998.78165403819 24000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,36000.0
-					25997.25906950915,36104.67191248589
-					25462.707403238343,37363.996720125 24000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,36000.0
-					25486.28965095479,34661.73878728229
-					25998.78165403819,35930.201006595 24000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,36000.0
-					24104.67191248589,34002.74093049085
-					25363.996720124997,34537.29259676166 24000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,36000.0
-					22661.738787282284,34513.710349045214
-					23930.201006594998,34001.21834596181 24000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,36000.0
-					22002.74093049085,35895.32808751411
-					22537.292596761657,34636.003279875 24000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,36000.0
-					22513.710349045214,37338.26121271772
-					22001.21834596181,36069.798993405 24000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,36000.0
-					23895.328087514114,37997.25906950915
-					22636.003279875003,37462.70740323834 24000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-	</Polygon>
-	
-	<Polygon>
-		<outerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,38666.666666666664
-					33567.42733944659,38157.37865166653
-					34536.15071012041,36824.04531833319
-					34536.15071012041,35175.95468166681
-					33567.42733944659,33842.62134833347
-					32000.0,33333.333333333336
-					30432.572660553404,33842.62134833347
-					29463.849289879592,35175.95468166681
-					29463.84928987959,36824.04531833319
-					30432.572660553404,38157.37865166653
-					32000.0,38666.666666666664 </coordinates>
-			</LinearRing>
-		</outerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,36000.0
-					33338.26121271772,37486.289650954786
-					32069.798993405002,37998.78165403819 32000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,36000.0
-					33997.25906950915,36104.67191248589
-					33462.70740323834,37363.996720125 32000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,36000.0
-					33486.289650954786,34661.73878728229
-					33998.78165403819,35930.201006595 32000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,36000.0
-					32104.67191248589,34002.74093049085
-					33363.996720125,34537.29259676166 32000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,36000.0
-					30661.738787282284,34513.710349045214
-					31930.201006594998,34001.21834596181 32000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,36000.0
-					30002.74093049085,35895.32808751411
-					30537.292596761657,34636.003279875 32000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,36000.0
-					30513.710349045214,37338.26121271772
-					30001.21834596181,36069.798993405 32000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,36000.0
-					31895.328087514114,37997.25906950915
-					30636.003279875003,37462.70740323834 32000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-	</Polygon>
-	
-	<Polygon>
-		<outerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,38666.666666666664
-					41567.42733944659,38157.37865166653
-					42536.15071012041,36824.04531833319
-					42536.15071012041,35175.95468166681
-					41567.42733944659,33842.62134833347
-					40000.0,33333.333333333336
-					38432.57266055341,33842.62134833347
-					37463.84928987959,35175.95468166681
-					37463.84928987959,36824.04531833319
-					38432.57266055341,38157.37865166653
-					40000.0,38666.666666666664 </coordinates>
-			</LinearRing>
-		</outerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,36000.0
-					41338.26121271772,37486.289650954786
-					40069.798993405,37998.78165403819 40000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,36000.0
-					41997.25906950915,36104.67191248589
-					41462.70740323834,37363.996720125 40000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,36000.0
-					41486.289650954786,34661.73878728229
-					41998.78165403819,35930.201006595 40000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,36000.0
-					40104.67191248589,34002.74093049085
-					41363.996720125,34537.29259676166 40000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,36000.0
-					38661.73878728228,34513.710349045214
-					39930.201006595,34001.21834596181 40000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,36000.0
-					38002.74093049085,35895.32808751411
-					38537.29259676166,34636.003279875 40000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,36000.0
-					38513.710349045214,37338.26121271772
-					38001.21834596181,36069.798993405 40000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,36000.0
-					39895.32808751411,37997.25906950915
-					38636.003279875,37462.70740323834 40000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-	</Polygon>
-	
-	<Polygon>
-		<outerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,38666.666666666664
-					49567.42733944659,38157.37865166653
-					50536.15071012041,36824.04531833319
-					50536.15071012041,35175.95468166681
-					49567.42733944659,33842.62134833347
-					48000.0,33333.333333333336
-					46432.57266055341,33842.62134833347
-					45463.84928987959,35175.95468166681
-					45463.84928987959,36824.04531833319
-					46432.57266055341,38157.37865166653
-					48000.0,38666.666666666664 </coordinates>
-			</LinearRing>
-		</outerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,36000.0
-					49338.26121271772,37486.289650954786
-					48069.798993405,37998.78165403819 48000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,36000.0
-					49997.25906950915,36104.67191248589
-					49462.70740323834,37363.996720125 48000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,36000.0
-					49486.289650954786,34661.73878728229
-					49998.78165403819,35930.201006595 48000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,36000.0
-					48104.67191248589,34002.74093049085
-					49363.996720125,34537.29259676166 48000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,36000.0
-					46661.73878728228,34513.710349045214
-					47930.201006595,34001.21834596181 48000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,36000.0
-					46002.74093049085,35895.32808751411
-					46537.29259676166,34636.003279875 48000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,36000.0
-					46513.710349045214,37338.26121271772
-					46001.21834596181,36069.798993405 48000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,36000.0
-					47895.32808751411,37997.25906950915
-					46636.003279875,37462.70740323834 48000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-	</Polygon>
-	
-	<Polygon>
-		<outerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,38666.666666666664
-					57567.42733944659,38157.37865166653
-					58536.15071012041,36824.04531833319
-					58536.15071012041,35175.95468166681
-					57567.42733944659,33842.62134833347
-					56000.0,33333.333333333336
-					54432.57266055341,33842.62134833347
-					53463.84928987959,35175.95468166681
-					53463.84928987959,36824.04531833319
-					54432.57266055341,38157.37865166653
-					56000.0,38666.666666666664 </coordinates>
-			</LinearRing>
-		</outerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,36000.0
-					57338.26121271772,37486.289650954786
-					56069.798993405,37998.78165403819 56000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,36000.0
-					57997.25906950915,36104.67191248589
-					57462.70740323834,37363.996720125 56000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,36000.0
-					57486.289650954786,34661.73878728229
-					57998.78165403819,35930.201006595 56000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,36000.0
-					56104.67191248589,34002.74093049085
-					57363.996720125,34537.29259676166 56000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,36000.0
-					54661.73878728228,34513.710349045214
-					55930.201006595,34001.21834596181 56000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,36000.0
-					54002.74093049085,35895.32808751411
-					54537.29259676166,34636.003279875 56000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,36000.0
-					54513.710349045214,37338.26121271772
-					54001.21834596181,36069.798993405 56000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,36000.0
-					55895.32808751411,37997.25906950915
-					54636.003279875,37462.70740323834 56000.0,36000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-	</Polygon>
-	
-	<Polygon>
-		<outerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,50666.666666666664
-					25567.427339446596,50157.37865166653
-					26536.150710120408,48824.04531833319
-					26536.15071012041,47175.95468166681
-					25567.427339446596,45842.62134833347
-					24000.0,45333.333333333336
-					22432.572660553404,45842.62134833347
-					21463.849289879592,47175.95468166681
-					21463.84928987959,48824.04531833319
-					22432.572660553404,50157.37865166653
-					24000.0,50666.666666666664 </coordinates>
-			</LinearRing>
-		</outerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,48000.0
-					25338.261212717716,49486.289650954786
-					24069.798993405002,49998.78165403819 24000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,48000.0
-					25997.25906950915,48104.67191248589
-					25462.707403238343,49363.996720125 24000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,48000.0
-					25486.28965095479,46661.73878728229
-					25998.78165403819,47930.201006595 24000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,48000.0
-					24104.67191248589,46002.74093049085
-					25363.996720124997,46537.29259676166 24000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,48000.0
-					22661.738787282284,46513.710349045214
-					23930.201006594998,46001.21834596181 24000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,48000.0
-					22002.74093049085,47895.32808751411
-					22537.292596761657,46636.003279875 24000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,48000.0
-					22513.710349045214,49338.26121271772
-					22001.21834596181,48069.798993405 24000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,48000.0
-					23895.328087514114,49997.25906950915
-					22636.003279875003,49462.70740323834 24000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-	</Polygon>
-	
-	<Polygon>
-		<outerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,50666.666666666664
-					33567.42733944659,50157.37865166653
-					34536.15071012041,48824.04531833319
-					34536.15071012041,47175.95468166681
-					33567.42733944659,45842.62134833347
-					32000.0,45333.333333333336
-					30432.572660553404,45842.62134833347
-					29463.849289879592,47175.95468166681
-					29463.84928987959,48824.04531833319
-					30432.572660553404,50157.37865166653
-					32000.0,50666.666666666664 </coordinates>
-			</LinearRing>
-		</outerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,48000.0
-					33338.26121271772,49486.289650954786
-					32069.798993405002,49998.78165403819 32000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,48000.0
-					33997.25906950915,48104.67191248589
-					33462.70740323834,49363.996720125 32000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,48000.0
-					33486.289650954786,46661.73878728229
-					33998.78165403819,47930.201006595 32000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,48000.0
-					32104.67191248589,46002.74093049085
-					33363.996720125,46537.29259676166 32000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,48000.0
-					30661.738787282284,46513.710349045214
-					31930.201006594998,46001.21834596181 32000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,48000.0
-					30002.74093049085,47895.32808751411
-					30537.292596761657,46636.003279875 32000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,48000.0
-					30513.710349045214,49338.26121271772
-					30001.21834596181,48069.798993405 32000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,48000.0
-					31895.328087514114,49997.25906950915
-					30636.003279875003,49462.70740323834 32000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-	</Polygon>
-	
-	<Polygon>
-		<outerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,50666.666666666664
-					41567.42733944659,50157.37865166653
-					42536.15071012041,48824.04531833319
-					42536.15071012041,47175.95468166681
-					41567.42733944659,45842.62134833347
-					40000.0,45333.333333333336
-					38432.57266055341,45842.62134833347
-					37463.84928987959,47175.95468166681
-					37463.84928987959,48824.04531833319
-					38432.57266055341,50157.37865166653
-					40000.0,50666.666666666664 </coordinates>
-			</LinearRing>
-		</outerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,48000.0
-					41338.26121271772,49486.289650954786
-					40069.798993405,49998.78165403819 40000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,48000.0
-					41997.25906950915,48104.67191248589
-					41462.70740323834,49363.996720125 40000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,48000.0
-					41486.289650954786,46661.73878728229
-					41998.78165403819,47930.201006595 40000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,48000.0
-					40104.67191248589,46002.74093049085
-					41363.996720125,46537.29259676166 40000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,48000.0
-					38661.73878728228,46513.710349045214
-					39930.201006595,46001.21834596181 40000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,48000.0
-					38002.74093049085,47895.32808751411
-					38537.29259676166,46636.003279875 40000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,48000.0
-					38513.710349045214,49338.26121271772
-					38001.21834596181,48069.798993405 40000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,48000.0
-					39895.32808751411,49997.25906950915
-					38636.003279875,49462.70740323834 40000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-	</Polygon>
-	
-	<Polygon>
-		<outerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,50666.666666666664
-					49567.42733944659,50157.37865166653
-					50536.15071012041,48824.04531833319
-					50536.15071012041,47175.95468166681
-					49567.42733944659,45842.62134833347
-					48000.0,45333.333333333336
-					46432.57266055341,45842.62134833347
-					45463.84928987959,47175.95468166681
-					45463.84928987959,48824.04531833319
-					46432.57266055341,50157.37865166653
-					48000.0,50666.666666666664 </coordinates>
-			</LinearRing>
-		</outerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,48000.0
-					49338.26121271772,49486.289650954786
-					48069.798993405,49998.78165403819 48000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,48000.0
-					49997.25906950915,48104.67191248589
-					49462.70740323834,49363.996720125 48000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,48000.0
-					49486.289650954786,46661.73878728229
-					49998.78165403819,47930.201006595 48000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,48000.0
-					48104.67191248589,46002.74093049085
-					49363.996720125,46537.29259676166 48000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,48000.0
-					46661.73878728228,46513.710349045214
-					47930.201006595,46001.21834596181 48000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,48000.0
-					46002.74093049085,47895.32808751411
-					46537.29259676166,46636.003279875 48000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,48000.0
-					46513.710349045214,49338.26121271772
-					46001.21834596181,48069.798993405 48000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,48000.0
-					47895.32808751411,49997.25906950915
-					46636.003279875,49462.70740323834 48000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-	</Polygon>
-	
-	<Polygon>
-		<outerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,50666.666666666664
-					57567.42733944659,50157.37865166653
-					58536.15071012041,48824.04531833319
-					58536.15071012041,47175.95468166681
-					57567.42733944659,45842.62134833347
-					56000.0,45333.333333333336
-					54432.57266055341,45842.62134833347
-					53463.84928987959,47175.95468166681
-					53463.84928987959,48824.04531833319
-					54432.57266055341,50157.37865166653
-					56000.0,50666.666666666664 </coordinates>
-			</LinearRing>
-		</outerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,48000.0
-					57338.26121271772,49486.289650954786
-					56069.798993405,49998.78165403819 56000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,48000.0
-					57997.25906950915,48104.67191248589
-					57462.70740323834,49363.996720125 56000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,48000.0
-					57486.289650954786,46661.73878728229
-					57998.78165403819,47930.201006595 56000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,48000.0
-					56104.67191248589,46002.74093049085
-					57363.996720125,46537.29259676166 56000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,48000.0
-					54661.73878728228,46513.710349045214
-					55930.201006595,46001.21834596181 56000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,48000.0
-					54002.74093049085,47895.32808751411
-					54537.29259676166,46636.003279875 56000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,48000.0
-					54513.710349045214,49338.26121271772
-					54001.21834596181,48069.798993405 56000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,48000.0
-					55895.32808751411,49997.25906950915
-					54636.003279875,49462.70740323834 56000.0,48000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-	</Polygon>
-	
-	<Polygon>
-		<outerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,62666.666666666664
-					25567.427339446596,62157.37865166653
-					26536.150710120408,60824.04531833319
-					26536.15071012041,59175.95468166681
-					25567.427339446596,57842.62134833347
-					24000.0,57333.333333333336
-					22432.572660553404,57842.62134833347
-					21463.849289879592,59175.95468166681
-					21463.84928987959,60824.04531833319
-					22432.572660553404,62157.37865166653
-					24000.0,62666.666666666664 </coordinates>
-			</LinearRing>
-		</outerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,60000.0
-					25338.261212717716,61486.289650954786
-					24069.798993405002,61998.78165403819 24000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,60000.0
-					25997.25906950915,60104.67191248589
-					25462.707403238343,61363.996720125 24000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,60000.0
-					25486.28965095479,58661.73878728229
-					25998.78165403819,59930.201006595 24000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,60000.0
-					24104.67191248589,58002.74093049085
-					25363.996720124997,58537.29259676166 24000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,60000.0
-					22661.738787282284,58513.710349045214
-					23930.201006594998,58001.21834596181 24000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,60000.0
-					22002.74093049085,59895.32808751411
-					22537.292596761657,58636.003279875 24000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,60000.0
-					22513.710349045214,61338.26121271772
-					22001.21834596181,60069.798993405 24000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,60000.0
-					23895.328087514114,61997.25906950915
-					22636.003279875003,61462.70740323834 24000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-	</Polygon>
-	
-	<Polygon>
-		<outerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,62666.666666666664
-					33567.42733944659,62157.37865166653
-					34536.15071012041,60824.04531833319
-					34536.15071012041,59175.95468166681
-					33567.42733944659,57842.62134833347
-					32000.0,57333.333333333336
-					30432.572660553404,57842.62134833347
-					29463.849289879592,59175.95468166681
-					29463.84928987959,60824.04531833319
-					30432.572660553404,62157.37865166653
-					32000.0,62666.666666666664 </coordinates>
-			</LinearRing>
-		</outerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,60000.0
-					33338.26121271772,61486.289650954786
-					32069.798993405002,61998.78165403819 32000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,60000.0
-					33997.25906950915,60104.67191248589
-					33462.70740323834,61363.996720125 32000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,60000.0
-					33486.289650954786,58661.73878728229
-					33998.78165403819,59930.201006595 32000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,60000.0
-					32104.67191248589,58002.74093049085
-					33363.996720125,58537.29259676166 32000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,60000.0
-					30661.738787282284,58513.710349045214
-					31930.201006594998,58001.21834596181 32000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,60000.0
-					30002.74093049085,59895.32808751411
-					30537.292596761657,58636.003279875 32000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,60000.0
-					30513.710349045214,61338.26121271772
-					30001.21834596181,60069.798993405 32000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,60000.0
-					31895.328087514114,61997.25906950915
-					30636.003279875003,61462.70740323834 32000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-	</Polygon>
-	
-	<Polygon>
-		<outerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,62666.666666666664
-					41567.42733944659,62157.37865166653
-					42536.15071012041,60824.04531833319
-					42536.15071012041,59175.95468166681
-					41567.42733944659,57842.62134833347
-					40000.0,57333.333333333336
-					38432.57266055341,57842.62134833347
-					37463.84928987959,59175.95468166681
-					37463.84928987959,60824.04531833319
-					38432.57266055341,62157.37865166653
-					40000.0,62666.666666666664 </coordinates>
-			</LinearRing>
-		</outerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,60000.0
-					41338.26121271772,61486.289650954786
-					40069.798993405,61998.78165403819 40000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,60000.0
-					41997.25906950915,60104.67191248589
-					41462.70740323834,61363.996720125 40000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,60000.0
-					41486.289650954786,58661.73878728229
-					41998.78165403819,59930.201006595 40000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,60000.0
-					40104.67191248589,58002.74093049085
-					41363.996720125,58537.29259676166 40000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,60000.0
-					38661.73878728228,58513.710349045214
-					39930.201006595,58001.21834596181 40000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,60000.0
-					38002.74093049085,59895.32808751411
-					38537.29259676166,58636.003279875 40000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,60000.0
-					38513.710349045214,61338.26121271772
-					38001.21834596181,60069.798993405 40000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,60000.0
-					39895.32808751411,61997.25906950915
-					38636.003279875,61462.70740323834 40000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-	</Polygon>
-	
-	<Polygon>
-		<outerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,62666.666666666664
-					49567.42733944659,62157.37865166653
-					50536.15071012041,60824.04531833319
-					50536.15071012041,59175.95468166681
-					49567.42733944659,57842.62134833347
-					48000.0,57333.333333333336
-					46432.57266055341,57842.62134833347
-					45463.84928987959,59175.95468166681
-					45463.84928987959,60824.04531833319
-					46432.57266055341,62157.37865166653
-					48000.0,62666.666666666664 </coordinates>
-			</LinearRing>
-		</outerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,60000.0
-					49338.26121271772,61486.289650954786
-					48069.798993405,61998.78165403819 48000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,60000.0
-					49997.25906950915,60104.67191248589
-					49462.70740323834,61363.996720125 48000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,60000.0
-					49486.289650954786,58661.73878728229
-					49998.78165403819,59930.201006595 48000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,60000.0
-					48104.67191248589,58002.74093049085
-					49363.996720125,58537.29259676166 48000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,60000.0
-					46661.73878728228,58513.710349045214
-					47930.201006595,58001.21834596181 48000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,60000.0
-					46002.74093049085,59895.32808751411
-					46537.29259676166,58636.003279875 48000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,60000.0
-					46513.710349045214,61338.26121271772
-					46001.21834596181,60069.798993405 48000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,60000.0
-					47895.32808751411,61997.25906950915
-					46636.003279875,61462.70740323834 48000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-	</Polygon>
-	
-	<Polygon>
-		<outerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,62666.666666666664
-					57567.42733944659,62157.37865166653
-					58536.15071012041,60824.04531833319
-					58536.15071012041,59175.95468166681
-					57567.42733944659,57842.62134833347
-					56000.0,57333.333333333336
-					54432.57266055341,57842.62134833347
-					53463.84928987959,59175.95468166681
-					53463.84928987959,60824.04531833319
-					54432.57266055341,62157.37865166653
-					56000.0,62666.666666666664 </coordinates>
-			</LinearRing>
-		</outerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,60000.0
-					57338.26121271772,61486.289650954786
-					56069.798993405,61998.78165403819 56000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,60000.0
-					57997.25906950915,60104.67191248589
-					57462.70740323834,61363.996720125 56000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,60000.0
-					57486.289650954786,58661.73878728229
-					57998.78165403819,59930.201006595 56000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,60000.0
-					56104.67191248589,58002.74093049085
-					57363.996720125,58537.29259676166 56000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,60000.0
-					54661.73878728228,58513.710349045214
-					55930.201006595,58001.21834596181 56000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,60000.0
-					54002.74093049085,59895.32808751411
-					54537.29259676166,58636.003279875 56000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,60000.0
-					54513.710349045214,61338.26121271772
-					54001.21834596181,60069.798993405 56000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,60000.0
-					55895.32808751411,61997.25906950915
-					54636.003279875,61462.70740323834 56000.0,60000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-	</Polygon>
-	
-	<Polygon>
-		<outerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,74666.66666666667
-					25567.427339446596,74157.37865166653
-					26536.150710120408,72824.0453183332
-					26536.15071012041,71175.9546816668
-					25567.427339446596,69842.62134833347
-					24000.0,69333.33333333333
-					22432.572660553404,69842.62134833347
-					21463.849289879592,71175.9546816668
-					21463.84928987959,72824.0453183332
-					22432.572660553404,74157.37865166653
-					24000.0,74666.66666666667 </coordinates>
-			</LinearRing>
-		</outerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,72000.0
-					25338.261212717716,73486.28965095479
-					24069.798993405002,73998.78165403819 24000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,72000.0
-					25997.25906950915,72104.6719124859
-					25462.707403238343,73363.996720125 24000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,72000.0
-					25486.28965095479,70661.73878728229
-					25998.78165403819,71930.201006595 24000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,72000.0
-					24104.67191248589,70002.74093049085
-					25363.996720124997,70537.29259676166 24000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,72000.0
-					22661.738787282284,70513.71034904521
-					23930.201006594998,70001.21834596181 24000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,72000.0
-					22002.74093049085,71895.3280875141
-					22537.292596761657,70636.003279875 24000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,72000.0
-					22513.710349045214,73338.26121271771
-					22001.21834596181,72069.798993405 24000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,72000.0
-					23895.328087514114,73997.25906950915
-					22636.003279875003,73462.70740323834 24000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-	</Polygon>
-	
-	<Polygon>
-		<outerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,74666.66666666667
-					33567.42733944659,74157.37865166653
-					34536.15071012041,72824.0453183332
-					34536.15071012041,71175.9546816668
-					33567.42733944659,69842.62134833347 32000.0,69333.33333333333
-					30432.572660553404,69842.62134833347
-					29463.849289879592,71175.9546816668
-					29463.84928987959,72824.0453183332
-					30432.572660553404,74157.37865166653
-					32000.0,74666.66666666667 </coordinates>
-			</LinearRing>
-		</outerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,72000.0
-					33338.26121271772,73486.28965095479
-					32069.798993405002,73998.78165403819 32000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,72000.0
-					33997.25906950915,72104.6719124859
-					33462.70740323834,73363.996720125 32000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,72000.0
-					33486.289650954786,70661.73878728229
-					33998.78165403819,71930.201006595 32000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,72000.0
-					32104.67191248589,70002.74093049085
-					33363.996720125,70537.29259676166 32000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,72000.0
-					30661.738787282284,70513.71034904521
-					31930.201006594998,70001.21834596181 32000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,72000.0
-					30002.74093049085,71895.3280875141
-					30537.292596761657,70636.003279875 32000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,72000.0
-					30513.710349045214,73338.26121271771
-					30001.21834596181,72069.798993405 32000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,72000.0
-					31895.328087514114,73997.25906950915
-					30636.003279875003,73462.70740323834 32000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-	</Polygon>
-	
-	<Polygon>
-		<outerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,74666.66666666667
-					41567.42733944659,74157.37865166653
-					42536.15071012041,72824.0453183332
-					42536.15071012041,71175.9546816668
-					41567.42733944659,69842.62134833347 40000.0,69333.33333333333
-					38432.57266055341,69842.62134833347
-					37463.84928987959,71175.9546816668
-					37463.84928987959,72824.0453183332
-					38432.57266055341,74157.37865166653 40000.0,74666.66666666667
-					</coordinates>
-			</LinearRing>
-		</outerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,72000.0
-					41338.26121271772,73486.28965095479
-					40069.798993405,73998.78165403819 40000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,72000.0
-					41997.25906950915,72104.6719124859
-					41462.70740323834,73363.996720125 40000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,72000.0
-					41486.289650954786,70661.73878728229
-					41998.78165403819,71930.201006595 40000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,72000.0
-					40104.67191248589,70002.74093049085
-					41363.996720125,70537.29259676166 40000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,72000.0
-					38661.73878728228,70513.71034904521
-					39930.201006595,70001.21834596181 40000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,72000.0
-					38002.74093049085,71895.3280875141
-					38537.29259676166,70636.003279875 40000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,72000.0
-					38513.710349045214,73338.26121271771
-					38001.21834596181,72069.798993405 40000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,72000.0
-					39895.32808751411,73997.25906950915
-					38636.003279875,73462.70740323834 40000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-	</Polygon>
-	
-	<Polygon>
-		<outerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,74666.66666666667
-					49567.42733944659,74157.37865166653
-					50536.15071012041,72824.0453183332
-					50536.15071012041,71175.9546816668
-					49567.42733944659,69842.62134833347 48000.0,69333.33333333333
-					46432.57266055341,69842.62134833347
-					45463.84928987959,71175.9546816668
-					45463.84928987959,72824.0453183332
-					46432.57266055341,74157.37865166653 48000.0,74666.66666666667
-					</coordinates>
-			</LinearRing>
-		</outerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,72000.0
-					49338.26121271772,73486.28965095479
-					48069.798993405,73998.78165403819 48000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,72000.0
-					49997.25906950915,72104.6719124859
-					49462.70740323834,73363.996720125 48000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,72000.0
-					49486.289650954786,70661.73878728229
-					49998.78165403819,71930.201006595 48000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,72000.0
-					48104.67191248589,70002.74093049085
-					49363.996720125,70537.29259676166 48000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,72000.0
-					46661.73878728228,70513.71034904521
-					47930.201006595,70001.21834596181 48000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,72000.0
-					46002.74093049085,71895.3280875141
-					46537.29259676166,70636.003279875 48000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,72000.0
-					46513.710349045214,73338.26121271771
-					46001.21834596181,72069.798993405 48000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,72000.0
-					47895.32808751411,73997.25906950915
-					46636.003279875,73462.70740323834 48000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-	</Polygon>
-	
-	<Polygon>
-		<outerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,74666.66666666667
-					57567.42733944659,74157.37865166653
-					58536.15071012041,72824.0453183332
-					58536.15071012041,71175.9546816668
-					57567.42733944659,69842.62134833347 56000.0,69333.33333333333
-					54432.57266055341,69842.62134833347
-					53463.84928987959,71175.9546816668
-					53463.84928987959,72824.0453183332
-					54432.57266055341,74157.37865166653 56000.0,74666.66666666667
-					</coordinates>
-			</LinearRing>
-		</outerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,72000.0
-					57338.26121271772,73486.28965095479
-					56069.798993405,73998.78165403819 56000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,72000.0
-					57997.25906950915,72104.6719124859
-					57462.70740323834,73363.996720125 56000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,72000.0
-					57486.289650954786,70661.73878728229
-					57998.78165403819,71930.201006595 56000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,72000.0
-					56104.67191248589,70002.74093049085
-					57363.996720125,70537.29259676166 56000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,72000.0
-					54661.73878728228,70513.71034904521
-					55930.201006595,70001.21834596181 56000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,72000.0
-					54002.74093049085,71895.3280875141
-					54537.29259676166,70636.003279875 56000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,72000.0
-					54513.710349045214,73338.26121271771
-					54001.21834596181,72069.798993405 56000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,72000.0
-					55895.32808751411,73997.25906950915
-					54636.003279875,73462.70740323834 56000.0,72000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-	</Polygon>
-	
-	<Polygon>
-		<outerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,86666.66666666667
-					25567.427339446596,86157.37865166653
-					26536.150710120408,84824.0453183332
-					26536.15071012041,83175.9546816668
-					25567.427339446596,81842.62134833347
-					24000.0,81333.33333333333
-					22432.572660553404,81842.62134833347
-					21463.849289879592,83175.9546816668
-					21463.84928987959,84824.0453183332
-					22432.572660553404,86157.37865166653
-					24000.0,86666.66666666667 </coordinates>
-			</LinearRing>
-		</outerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,84000.0
-					25338.261212717716,85486.28965095479
-					24069.798993405002,85998.78165403819 24000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,84000.0
-					25997.25906950915,84104.6719124859
-					25462.707403238343,85363.996720125 24000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,84000.0
-					25486.28965095479,82661.73878728229
-					25998.78165403819,83930.201006595 24000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,84000.0
-					24104.67191248589,82002.74093049085
-					25363.996720124997,82537.29259676166 24000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,84000.0
-					22661.738787282284,82513.71034904521
-					23930.201006594998,82001.21834596181 24000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,84000.0
-					22002.74093049085,83895.3280875141
-					22537.292596761657,82636.003279875 24000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,84000.0
-					22513.710349045214,85338.26121271771
-					22001.21834596181,84069.798993405 24000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>24000.0,84000.0
-					23895.328087514114,85997.25906950915
-					22636.003279875003,85462.70740323834 24000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-	</Polygon>
-	
-	<Polygon>
-		<outerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,86666.66666666667
-					33567.42733944659,86157.37865166653
-					34536.15071012041,84824.0453183332
-					34536.15071012041,83175.9546816668
-					33567.42733944659,81842.62134833347 32000.0,81333.33333333333
-					30432.572660553404,81842.62134833347
-					29463.849289879592,83175.9546816668
-					29463.84928987959,84824.0453183332
-					30432.572660553404,86157.37865166653
-					32000.0,86666.66666666667 </coordinates>
-			</LinearRing>
-		</outerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,84000.0
-					33338.26121271772,85486.28965095479
-					32069.798993405002,85998.78165403819 32000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,84000.0
-					33997.25906950915,84104.6719124859
-					33462.70740323834,85363.996720125 32000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,84000.0
-					33486.289650954786,82661.73878728229
-					33998.78165403819,83930.201006595 32000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,84000.0
-					32104.67191248589,82002.74093049085
-					33363.996720125,82537.29259676166 32000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,84000.0
-					30661.738787282284,82513.71034904521
-					31930.201006594998,82001.21834596181 32000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,84000.0
-					30002.74093049085,83895.3280875141
-					30537.292596761657,82636.003279875 32000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,84000.0
-					30513.710349045214,85338.26121271771
-					30001.21834596181,84069.798993405 32000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>32000.0,84000.0
-					31895.328087514114,85997.25906950915
-					30636.003279875003,85462.70740323834 32000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-	</Polygon>
-	
-	<Polygon>
-		<outerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,86666.66666666667
-					41567.42733944659,86157.37865166653
-					42536.15071012041,84824.0453183332
-					42536.15071012041,83175.9546816668
-					41567.42733944659,81842.62134833347 40000.0,81333.33333333333
-					38432.57266055341,81842.62134833347
-					37463.84928987959,83175.9546816668
-					37463.84928987959,84824.0453183332
-					38432.57266055341,86157.37865166653 40000.0,86666.66666666667
-					</coordinates>
-			</LinearRing>
-		</outerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,84000.0
-					41338.26121271772,85486.28965095479
-					40069.798993405,85998.78165403819 40000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,84000.0
-					41997.25906950915,84104.6719124859
-					41462.70740323834,85363.996720125 40000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,84000.0
-					41486.289650954786,82661.73878728229
-					41998.78165403819,83930.201006595 40000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,84000.0
-					40104.67191248589,82002.74093049085
-					41363.996720125,82537.29259676166 40000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,84000.0
-					38661.73878728228,82513.71034904521
-					39930.201006595,82001.21834596181 40000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,84000.0
-					38002.74093049085,83895.3280875141
-					38537.29259676166,82636.003279875 40000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,84000.0
-					38513.710349045214,85338.26121271771
-					38001.21834596181,84069.798993405 40000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>40000.0,84000.0
-					39895.32808751411,85997.25906950915
-					38636.003279875,85462.70740323834 40000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-	</Polygon>
-	
-	<Polygon>
-		<outerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,86666.66666666667
-					49567.42733944659,86157.37865166653
-					50536.15071012041,84824.0453183332
-					50536.15071012041,83175.9546816668
-					49567.42733944659,81842.62134833347 48000.0,81333.33333333333
-					46432.57266055341,81842.62134833347
-					45463.84928987959,83175.9546816668
-					45463.84928987959,84824.0453183332
-					46432.57266055341,86157.37865166653 48000.0,86666.66666666667
-					</coordinates>
-			</LinearRing>
-		</outerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,84000.0
-					49338.26121271772,85486.28965095479
-					48069.798993405,85998.78165403819 48000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,84000.0
-					49997.25906950915,84104.6719124859
-					49462.70740323834,85363.996720125 48000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,84000.0
-					49486.289650954786,82661.73878728229
-					49998.78165403819,83930.201006595 48000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,84000.0
-					48104.67191248589,82002.74093049085
-					49363.996720125,82537.29259676166 48000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,84000.0
-					46661.73878728228,82513.71034904521
-					47930.201006595,82001.21834596181 48000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,84000.0
-					46002.74093049085,83895.3280875141
-					46537.29259676166,82636.003279875 48000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,84000.0
-					46513.710349045214,85338.26121271771
-					46001.21834596181,84069.798993405 48000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>48000.0,84000.0
-					47895.32808751411,85997.25906950915
-					46636.003279875,85462.70740323834 48000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-	</Polygon>
-	
-	<Polygon>
-		<outerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,86666.66666666667
-					57567.42733944659,86157.37865166653
-					58536.15071012041,84824.0453183332
-					58536.15071012041,83175.9546816668
-					57567.42733944659,81842.62134833347 56000.0,81333.33333333333
-					54432.57266055341,81842.62134833347
-					53463.84928987959,83175.9546816668
-					53463.84928987959,84824.0453183332
-					54432.57266055341,86157.37865166653 56000.0,86666.66666666667
-					</coordinates>
-			</LinearRing>
-		</outerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,84000.0
-					57338.26121271772,85486.28965095479
-					56069.798993405,85998.78165403819 56000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,84000.0
-					57997.25906950915,84104.6719124859
-					57462.70740323834,85363.996720125 56000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,84000.0
-					57486.289650954786,82661.73878728229
-					57998.78165403819,83930.201006595 56000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,84000.0
-					56104.67191248589,82002.74093049085
-					57363.996720125,82537.29259676166 56000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,84000.0
-					54661.73878728228,82513.71034904521
-					55930.201006595,82001.21834596181 56000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,84000.0
-					54002.74093049085,83895.3280875141
-					54537.29259676166,82636.003279875 56000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,84000.0
-					54513.710349045214,85338.26121271771
-					54001.21834596181,84069.798993405 56000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-		<innerBoundaryIs>
-			<LinearRing>
-				<coordinates>56000.0,84000.0
-					55895.32808751411,85997.25906950915
-					54636.003279875,85462.70740323834 56000.0,84000.0
-					</coordinates>
-			</LinearRing>
-		</innerBoundaryIs>
-	</Polygon>
-	
-</MultiGeometry>
\ No newline at end of file
diff --git a/jtsio/test/readme b/jtsio/test/readme
deleted file mode 100644
index a5aeeba..0000000
--- a/jtsio/test/readme
+++ /dev/null
@@ -1 +0,0 @@
-Set of tests and testing utilities which require the same jar set as the src directory, with the exception of the junit jar.
\ No newline at end of file
diff --git a/src/.classpath b/src/.classpath
deleted file mode 100644
index b67e920..0000000
--- a/src/.classpath
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry excluding="com/vividsolutions/jtsplugin/|srcex/|srcex/" path="" kind="src"/>
-	<classpathentry path="org.eclipse.jdt.launching.JRE_CONTAINER" kind="con"/>
-	<classpathentry path="C:/data/martin/proj/jts/lib/xerces.jar" kind="lib"/>
-	<classpathentry path="C:/data/martin/proj/jts/lib/Acme.jar" kind="lib"/>
-	<classpathentry path="C:/data/martin/proj/jts/lib/jdom.jar" kind="lib"/>
-	<classpathentry path="C:/data/martin/proj/jts/lib/junit.jar" kind="lib"/>
-	<classpathentry path="srcex" kind="src"/>
-	<classpathentry path="C:/data/martin/proj/jts/libex/jump-core-1.2.jar" kind="lib"/>
-	<classpathentry path="classes" kind="output"/>
-</classpath>
diff --git a/src/.project b/src/.project
deleted file mode 100644
index dac9af6..0000000
--- a/src/.project
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>JTS</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-	<linkedResources>
-		<link>
-			<name>srcex</name>
-			<type>2</type>
-			<location>C:/data/martin/proj/jts/srcex</location>
-		</link>
-		<link>
-			<name>classes</name>
-			<type>2</type>
-			<location>C:/data/martin/proj/jts/classes</location>
-		</link>
-	</linkedResources>
-</projectDescription>
diff --git a/src/MANIFEST.MF b/src/MANIFEST.MF
deleted file mode 100644
index 2222b25..0000000
--- a/src/MANIFEST.MF
+++ /dev/null
@@ -1,4 +0,0 @@
-Manifest-version: 1.0
-Implementation-Title: Java Topology Suite
-Implementation-Version: 1.7
-Implementation-Vendor: Vivid Solutions
diff --git a/src/META-INF/MANIFEST.MF b/src/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5045494
--- /dev/null
+++ b/src/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Ant-Version: Apache Ant 1.9.4
+Created-By: 1.7.0_75-b13 (Oracle Corporation)
+
diff --git a/src/com/vividsolutions/jts/JTSVersion.java b/src/com/vividsolutions/jts/JTSVersion.java
index fe752e5..15ebc02 100644
--- a/src/com/vividsolutions/jts/JTSVersion.java
+++ b/src/com/vividsolutions/jts/JTSVersion.java
@@ -57,7 +57,7 @@ public class JTSVersion {
   /**
    * The minor version number.
    */
-  public static final int MINOR = 13;
+  public static final int MINOR = 14;
 
   /**
    * The patch version number.
diff --git a/src/com/vividsolutions/jts/algorithm/CGAlgorithms.java b/src/com/vividsolutions/jts/algorithm/CGAlgorithms.java
index bf97351..c54bdad 100644
--- a/src/com/vividsolutions/jts/algorithm/CGAlgorithms.java
+++ b/src/com/vividsolutions/jts/algorithm/CGAlgorithms.java
@@ -203,7 +203,7 @@ public class CGAlgorithms
    *          an array of Coordinates forming a ring
    * @return true if the ring is oriented counter-clockwise.
    * @throws IllegalArgumentException
-   *           if there are too few points to determine orientation (< 3)
+   *           if there are too few points to determine orientation (< 4)
    */
   public static boolean isCCW(Coordinate[] ring)
   {
@@ -212,7 +212,7 @@ public class CGAlgorithms
     // sanity check
     if (nPts < 3)
       throw new IllegalArgumentException(
-          "Ring has fewer than 3 points, so orientation cannot be determined");
+          "Ring has fewer than 4 points, so orientation cannot be determined");
 
     // find highest point
     Coordinate hiPt = ring[0];
@@ -279,9 +279,12 @@ public class CGAlgorithms
    * The orientation of a point relative to a directed line segment indicates
    * which way you turn to get to q after travelling from p1 to p2.
    * 
-   * @return 1 if q is counter-clockwise from p1-p2
-   * @return -1 if q is clockwise from p1-p2
-   * @return 0 if q is collinear with p1-p2
+   * @param p1 the first vertex of the line segment
+   * @param p2 the second vertex of the line segment
+   * @param q the point to compute the relative orientation of
+   * @return 1 if q is counter-clockwise from p1-p2,
+   * or -1 if q is clockwise from p1-p2,
+   * or 0 if q is collinear with p1-p2
    */
   public static int computeOrientation(Coordinate p1, Coordinate p2,
       Coordinate q)
diff --git a/src/com/vividsolutions/jts/algorithm/CGAlgorithmsDD.java b/src/com/vividsolutions/jts/algorithm/CGAlgorithmsDD.java
index f27f2ef..1e05fc8 100644
--- a/src/com/vividsolutions/jts/algorithm/CGAlgorithmsDD.java
+++ b/src/com/vividsolutions/jts/algorithm/CGAlgorithmsDD.java
@@ -199,7 +199,7 @@ public class CGAlgorithmsDD
     DD numy = numy1.subtract(numy2);
     double fracQ = numy.selfDivide(denom).doubleValue();
     
-    double y = DD.valueOf(p1.y).selfAdd(DD.valueOf(p2.y).selfSubtract(p1.y).selfMultiply(fracQ)).doubleValue();
+    double y = DD.valueOf(q1.y).selfAdd(DD.valueOf(q2.y).selfSubtract(q1.y).selfMultiply(fracQ)).doubleValue();
 
     return new Coordinate(x,y);
   }
diff --git a/src/com/vividsolutions/jts/algorithm/CentralEndpointIntersector.java b/src/com/vividsolutions/jts/algorithm/CentralEndpointIntersector.java
index 56c29ce..4d1f233 100644
--- a/src/com/vividsolutions/jts/algorithm/CentralEndpointIntersector.java
+++ b/src/com/vividsolutions/jts/algorithm/CentralEndpointIntersector.java
@@ -49,9 +49,13 @@ import com.vividsolutions.jts.geom.Coordinate;
  * Intended to be used as a last resort for 
  * computing ill-conditioned intersection situations which 
  * cause other methods to fail.
- *
+ * <p>
+ * WARNING: in some cases this algorithm makes a poor choice of endpoint.
+ * It has been replaced by a better heuristic in {@link RobustLineIntersector}.
+ *  
  * @author Martin Davis
  * @version 1.8
+ * @deprecated
  */
 public class CentralEndpointIntersector 
 {
@@ -72,7 +76,7 @@ public class CentralEndpointIntersector
 		compute();
 	}
 
-	private void compute() 
+	private void Ocompute() 
 	{
 		Coordinate centroid = average(pts);
 		intPt = new Coordinate(findNearestPoint(centroid, pts));
@@ -122,5 +126,28 @@ public class CentralEndpointIntersector
   	return result;
   }
   
+  	private double minDist = Double.MAX_VALUE;
+  	
+  	/**
+  	 * Finds point with smallest distance to other segment
+  	 */
+	private void compute() 
+	{
+		tryDist(pts[0], pts[2], pts[3]);
+		tryDist(pts[1], pts[2], pts[3]);
+		tryDist(pts[2], pts[0], pts[1]);
+		tryDist(pts[3], pts[0], pts[1]);
+	}
+
+	private void tryDist(Coordinate p, Coordinate p0, Coordinate p1) 
+	{
+		double dist = CGAlgorithms.distancePointLine(p, p0, p1);
+		if (dist < minDist) {
+			minDist = dist;
+			intPt = p;
+		}
+	}
+
+
 
 }
diff --git a/src/com/vividsolutions/jts/algorithm/CentroidArea.java b/src/com/vividsolutions/jts/algorithm/Centroid.java
similarity index 50%
copy from src/com/vividsolutions/jts/algorithm/CentroidArea.java
copy to src/com/vividsolutions/jts/algorithm/Centroid.java
index b0168c4..2d02008 100644
--- a/src/com/vividsolutions/jts/algorithm/CentroidArea.java
+++ b/src/com/vividsolutions/jts/algorithm/Centroid.java
@@ -36,47 +36,86 @@ package com.vividsolutions.jts.algorithm;
 import com.vividsolutions.jts.geom.*;
 
 /**
- * Computes the centroid of an area geometry.
+ * Computes the centroid of a {@link Geometry} of any dimension.
+ * If the geometry is nominally of higher dimension, 
+ * but has lower <i>effective</i> dimension 
+ * (i.e. contains only components
+ * having zero length or area), 
+ * the centroid will be computed as for the equivalent lower-dimension geometry.
+ * If the input geometry is empty, a
+ * <code>null</code> Coordinate is returned.
+ * 
  * <h2>Algorithm</h2>
- * Based on the usual algorithm for calculating
- * the centroid as a weighted sum of the centroids
+ * <ul>
+ * <li><b>Dimension 2</b> - the centroid is computed 
+ * as the weighted sum of the centroids
  * of a decomposition of the area into (possibly overlapping) triangles.
- * The algorithm has been extended to handle holes and multi-polygons.
+ * Holes and multipolygons are handled correctly.
  * See <code>http://www.faqs.org/faqs/graphics/algorithms-faq/</code>
  * for further details of the basic approach.
- * The code has also be extended to handle degenerate (zero-area) polygons.
- * In this case, the centroid of the line segments in the polygon 
- * will be returned.
- *
+ * 
+ * <li><b>Dimension 1</b> - Computes the average of the midpoints
+ * of all line segments weighted by the segment length.
+ * Zero-length lines are treated as points.
+ * 
+ * <li><b>Dimension 0</b> - Compute the average coordinate for all points.
+ * Repeated points are all included in the average.
+ * </ul>
+ * 
  * @version 1.7
  */
-public class CentroidArea
+public class Centroid
 {
-  private Coordinate basePt = null;// the point all triangles are based at
+  /**
+   * Computes the centroid point of a geometry.
+   * 
+   * @param geom the geometry to use
+   * @return the centroid point, or null if the geometry is empty
+   */
+  public static Coordinate getCentroid(Geometry geom)
+  {
+    Centroid cent = new Centroid(geom);
+    return cent.getCentroid();
+  }
+  
+  private Coordinate areaBasePt = null;// the point all triangles are based at
   private Coordinate triangleCent3 = new Coordinate();// temporary variable to hold centroid of triangle
   private double  areasum2 = 0;        /* Partial area sum */
   private Coordinate cg3 = new Coordinate(); // partial centroid sum
   
   // data for linear centroid computation, if needed
-  private Coordinate centSum = new Coordinate();
+  private Coordinate lineCentSum = new Coordinate();
   private double totalLength = 0.0;
 
-  public CentroidArea()
+  private int ptCount = 0;
+  private Coordinate ptCentSum = new Coordinate();
+
+  /**
+   * Creates a new instance for computing the centroid of a geometry
+   */
+  public Centroid(Geometry geom)
   {
-    basePt = null;
+    areaBasePt = null;
+    add(geom);
   }
 
   /**
-   * Adds the area defined by a Geometry to the centroid total.
-   * If the geometry has no area it does not contribute to the centroid.
+   * Adds a Geometry to the centroid total.
    *
    * @param geom the geometry to add
    */
-  public void add(Geometry geom)
+  private void add(Geometry geom)
   {
-    if (geom instanceof Polygon) {
+    if (geom.isEmpty())
+      return;
+    if (geom instanceof Point) {
+      addPoint(geom.getCoordinate());
+    }
+    else if (geom instanceof LineString) {
+      addLineSegments(geom.getCoordinates());
+    }
+    else if (geom instanceof Polygon) {
       Polygon poly = (Polygon) geom;
-      setBasePoint(poly.getExteriorRing().getCoordinateN(0));
       add(poly);
     }
     else if (geom instanceof GeometryCollection) {
@@ -88,36 +127,50 @@ public class CentroidArea
   }
 
   /**
-   * Adds the area defined by an array of
-   * coordinates.  The array must be a ring;
-   * i.e. end with the same coordinate as it starts with.
-   * @param ring an array of {@link Coordinate}s
+   * Gets the computed centroid.
+   * 
+   * @return the computed centroid, or null if the input is empty
    */
-  public void add(Coordinate[] ring)
-  {
-    setBasePoint(ring[0]);
-    addShell(ring);
-  }
-
   public Coordinate getCentroid()
   {
+    /**
+     * The centroid is computed from the highest dimension components present in the input.
+     * I.e. areas dominate lineal geometry, which dominates points.
+     * Degenerate geometry are computed using their effective dimension
+     * (e.g. areas may degenerate to lines or points)
+     */
     Coordinate cent = new Coordinate();
     if (Math.abs(areasum2) > 0.0) {
+      /**
+       * Input contains areal geometry
+       */
     	cent.x = cg3.x / 3 / areasum2;
     	cent.y = cg3.y / 3 / areasum2;
     }
+    else if (totalLength > 0.0) {
+      /**
+       * Input contains lineal geometry
+       */
+      cent.x = lineCentSum.x / totalLength;
+      cent.y = lineCentSum.y / totalLength;   	
+    }
+    else if (ptCount > 0){
+      /**
+       * Input contains puntal geometry only
+       */
+      cent.x = ptCentSum.x / ptCount;
+      cent.y = ptCentSum.y / ptCount;
+    }
     else {
-    	// if polygon was degenerate, compute linear centroid instead
-      cent.x = centSum.x / totalLength;
-      cent.y = centSum.y / totalLength;   	
+      return null;
     }
     return cent;
   }
 
   private void setBasePoint(Coordinate basePt)
   {
-    if (this.basePt == null)
-      this.basePt = basePt;
+    if (this.areaBasePt == null)
+      this.areaBasePt = basePt;
   }
   
   private void add(Polygon poly)
@@ -130,19 +183,22 @@ public class CentroidArea
 
   private void addShell(Coordinate[] pts)
   {
+    if (pts.length > 0) 
+      setBasePoint(pts[0]);
     boolean isPositiveArea = ! CGAlgorithms.isCCW(pts);
     for (int i = 0; i < pts.length - 1; i++) {
-      addTriangle(basePt, pts[i], pts[i+1], isPositiveArea);
+      addTriangle(areaBasePt, pts[i], pts[i+1], isPositiveArea);
     }
-    addLinearSegments(pts);
+    addLineSegments(pts);
   }
+  
   private void addHole(Coordinate[] pts)
   {
     boolean isPositiveArea = CGAlgorithms.isCCW(pts);
     for (int i = 0; i < pts.length - 1; i++) {
-      addTriangle(basePt, pts[i], pts[i+1], isPositiveArea);
+      addTriangle(areaBasePt, pts[i], pts[i+1], isPositiveArea);
     }
-    addLinearSegments(pts);
+    addLineSegments(pts);
   }
   private void addTriangle(Coordinate p0, Coordinate p1, Coordinate p2, boolean isPositiveArea)
   {
@@ -154,7 +210,7 @@ public class CentroidArea
     areasum2 += sign * area2;
   }
   /**
-   * Returns three times the centroid of the triangle p1-p2-p3.
+   * Computes three times the centroid of the triangle p1-p2-p3.
    * The factor of 3 is
    * left in to permit division to be avoided until later.
    */
@@ -166,8 +222,8 @@ public class CentroidArea
   }
 
   /**
-   * Returns twice the signed area of the triangle p1-p2-p3,
-   * positive if a,b,c are oriented ccw, and negative if cw.
+   * Returns twice the signed area of the triangle p1-p2-p3.
+   * The area is positive if the triangle is oriented CCW, and negative if CW.
    */
   private static double area2( Coordinate p1, Coordinate p2, Coordinate p3 )
   {
@@ -177,24 +233,40 @@ public class CentroidArea
   }
 
   /**
-   * Adds the linear segments defined by an array of coordinates
+   * Adds the line segments defined by an array of coordinates
    * to the linear centroid accumulators.
-   * This is done in case the polygon(s) have zero-area, 
-   * in which case the linear centroid is computed instead.
    * 
    * @param pts an array of {@link Coordinate}s
    */
-  private void addLinearSegments(Coordinate[] pts)
+  private void addLineSegments(Coordinate[] pts)
   {
+    double lineLen = 0.0;
     for (int i = 0; i < pts.length - 1; i++) {
       double segmentLen = pts[i].distance(pts[i + 1]);
-      totalLength += segmentLen;
+      if (segmentLen == 0.0)
+        continue;
+      
+      lineLen += segmentLen;
 
       double midx = (pts[i].x + pts[i + 1].x) / 2;
-      centSum.x += segmentLen * midx;
+      lineCentSum.x += segmentLen * midx;
       double midy = (pts[i].y + pts[i + 1].y) / 2;
-      centSum.y += segmentLen * midy;
+      lineCentSum.y += segmentLen * midy;
     }
+    totalLength += lineLen;
+    if (lineLen == 0.0 && pts.length > 0)
+      addPoint(pts[0]);
+  }
+
+  /**
+   * Adds a point to the point centroid accumulator.
+   * @param pt a {@link Coordinate}
+   */
+  private void addPoint(Coordinate pt)
+  {
+    ptCount += 1;
+    ptCentSum.x += pt.x;
+    ptCentSum.y += pt.y;
   }
 
 
diff --git a/src/com/vividsolutions/jts/algorithm/CentroidArea.java b/src/com/vividsolutions/jts/algorithm/CentroidArea.java
index b0168c4..b96efeb 100644
--- a/src/com/vividsolutions/jts/algorithm/CentroidArea.java
+++ b/src/com/vividsolutions/jts/algorithm/CentroidArea.java
@@ -49,6 +49,7 @@ import com.vividsolutions.jts.geom.*;
  * will be returned.
  *
  * @version 1.7
+ * @deprecated use Centroid instead
  */
 public class CentroidArea
 {
diff --git a/src/com/vividsolutions/jts/algorithm/CentroidLine.java b/src/com/vividsolutions/jts/algorithm/CentroidLine.java
index 99d388c..7002e46 100644
--- a/src/com/vividsolutions/jts/algorithm/CentroidLine.java
+++ b/src/com/vividsolutions/jts/algorithm/CentroidLine.java
@@ -42,6 +42,7 @@ import com.vividsolutions.jts.geom.*;
  * of all line segments weighted by the segment length.
  *
  * @version 1.7
+ * @deprecated use Centroid instead
  */
 public class CentroidLine
 {
diff --git a/src/com/vividsolutions/jts/algorithm/CentroidPoint.java b/src/com/vividsolutions/jts/algorithm/CentroidPoint.java
index 88b7f04..44dfcc2 100644
--- a/src/com/vividsolutions/jts/algorithm/CentroidPoint.java
+++ b/src/com/vividsolutions/jts/algorithm/CentroidPoint.java
@@ -41,6 +41,7 @@ import com.vividsolutions.jts.geom.*;
  * Compute the average of all points.
  *
  * @version 1.7
+ * @deprecated use Centroid instead
  */
 public class CentroidPoint
 {
diff --git a/src/com/vividsolutions/jts/algorithm/ConvexHull.java b/src/com/vividsolutions/jts/algorithm/ConvexHull.java
index 5c63ee0..d6427d6 100644
--- a/src/com/vividsolutions/jts/algorithm/ConvexHull.java
+++ b/src/com/vividsolutions/jts/algorithm/ConvexHull.java
@@ -65,7 +65,8 @@ public class ConvexHull
    */
   public ConvexHull(Coordinate[] pts, GeometryFactory geomFactory)
   {
-    inputPts = pts;
+    inputPts = UniqueCoordinateArrayFilter.filterCoordinates(pts);
+    //inputPts = pts;
     this.geomFactory = geomFactory;
   }
 
diff --git a/src/com/vividsolutions/jts/algorithm/InteriorPointArea.java b/src/com/vividsolutions/jts/algorithm/InteriorPointArea.java
index cc94adb..5cdd11c 100644
--- a/src/com/vividsolutions/jts/algorithm/InteriorPointArea.java
+++ b/src/com/vividsolutions/jts/algorithm/InteriorPointArea.java
@@ -36,14 +36,19 @@ package com.vividsolutions.jts.algorithm;
 import com.vividsolutions.jts.geom.*;
 
 /**
- * Computes a point in the interior of an area geometry.
+ * Computes a point in the interior of an areal geometry.
  *
  * <h2>Algorithm</h2>
  * <ul>
- *   <li>Find the intersections between the geometry
- *       and the horizontal bisector of the area's envelope
- *   <li>Pick the midpoint of the largest intersection (the intersections
- *       will be lines and points)
+ *   <li>Find a Y value which is close to the centre of 
+ *       the geometry's vertical extent but is different
+ *       to any of it's Y ordinates.
+ *   <li>Create a horizontal bisector line using the Y value
+ *       and the geometry's horizontal extent
+ *   <li>Find the intersection between the geometry
+ *       and the horizontal bisector line.
+ *       The intersection is a collection of lines and points.
+ *   <li>Pick the midpoint of the largest intersection geometry  
  * </ul>
  *
  * <h3>KNOWN BUGS</h3>
@@ -66,11 +71,23 @@ public class InteriorPointArea {
   private Coordinate interiorPoint = null;
   private double maxWidth = 0.0;
 
+  /**
+   * Creates a new interior point finder
+   * for an areal geometry.
+   * 
+   * @param g an areal geometry
+   */
   public InteriorPointArea(Geometry g)
   {
     factory = g.getFactory();
     add(g);
   }
+  
+  /**
+   * Gets the computed interior point.
+   * 
+   * @return the coordinate of an interior point
+   */
   public Coordinate getInteriorPoint()
   {
     return interiorPoint;
@@ -97,25 +114,36 @@ public class InteriorPointArea {
   }
 
   /**
-   * Finds a reasonable point at which to label a Geometry.
+   * Finds an interior point of a Polygon.
    * @param geometry the geometry to analyze
    */
-  public void addPolygon(Geometry geometry) {
-      LineString bisector = horizontalBisector(geometry);
-
+  private void addPolygon(Geometry geometry) {
+    if (geometry.isEmpty())
+      return;
+    
+    Coordinate intPt;
+    double width = 0;
+    
+    LineString bisector = horizontalBisector(geometry);
+    if (bisector.getLength() == 0.0) {
+      width = 0;
+      intPt = bisector.getCoordinate();
+    }
+    else {
       Geometry intersections = bisector.intersection(geometry);
       Geometry widestIntersection = widestGeometry(intersections);
-
-      double width = widestIntersection.getEnvelopeInternal().getWidth();
-      if (interiorPoint == null || width > maxWidth) {
-        interiorPoint = centre(widestIntersection.getEnvelopeInternal());
-        maxWidth = width;
-      }
+      width = widestIntersection.getEnvelopeInternal().getWidth();
+      intPt = centre(widestIntersection.getEnvelopeInternal());
+    }
+    if (interiorPoint == null || width > maxWidth) {
+      interiorPoint = intPt;
+      maxWidth = width;
+    }
   }
 
   //@return if geometry is a collection, the widest sub-geometry; otherwise,
   //the geometry itself
-  protected Geometry widestGeometry(Geometry geometry) {
+  private Geometry widestGeometry(Geometry geometry) {
     if (!(geometry instanceof GeometryCollection)) {
         return geometry;
     }
@@ -128,7 +156,8 @@ public class InteriorPointArea {
     }
 
     Geometry widestGeometry = gc.getGeometryN(0);
-    for (int i = 1; i < gc.getNumGeometries(); i++) { //Start at 1
+    // scan remaining geom components to see if any are wider
+    for (int i = 1; i < gc.getNumGeometries(); i++) { 
         if (gc.getGeometryN(i).getEnvelopeInternal().getWidth() >
             widestGeometry.getEnvelopeInternal().getWidth()) {
             widestGeometry = gc.getGeometryN(i);
@@ -140,11 +169,17 @@ public class InteriorPointArea {
   protected LineString horizontalBisector(Geometry geometry) {
     Envelope envelope = geometry.getEnvelopeInternal();
 
+    /**
+     * Original algorithm.  Fails when geometry contains a horizontal
+     * segment at the Y midpoint.
+     */
     // Assert: for areas, minx <> maxx
-    double avgY = avg(envelope.getMinY(), envelope.getMaxY());
+    //double avgY = avg(envelope.getMinY(), envelope.getMaxY());
+    
+    double bisectY = SafeBisectorFinder.getBisectorY((Polygon) geometry);
     return factory.createLineString(new Coordinate[] {
-            new Coordinate(envelope.getMinX(), avgY),
-            new Coordinate(envelope.getMaxX(), avgY)
+            new Coordinate(envelope.getMinX(), bisectY),
+            new Coordinate(envelope.getMaxX(), bisectY)
         });
   }
 
@@ -153,10 +188,73 @@ public class InteriorPointArea {
    * @param envelope the envelope to analyze
    * @return the centre of the envelope
    */
-  public Coordinate centre(Envelope envelope) {
+  public static Coordinate centre(Envelope envelope) {
       return new Coordinate(avg(envelope.getMinX(),
               envelope.getMaxX()),
           avg(envelope.getMinY(), envelope.getMaxY()));
   }
 
+  /**
+   * Finds a safe bisector Y ordinate
+   * by projecting to the Y axis
+   * and finding the Y-ordinate interval
+   * which contains the centre of the Y extent.
+   * The centre of this interval is returned as the bisector Y-ordinate.
+   * 
+   * @author mdavis
+   *
+   */
+  private static class SafeBisectorFinder 
+  {
+	  public static double getBisectorY(Polygon poly)
+	  {
+		  SafeBisectorFinder finder = new SafeBisectorFinder(poly);
+		  return finder.getBisectorY();
+	  }
+	  
+	  private Polygon poly;
+	  
+	  private double centreY;
+	  private double hiY = Double.MAX_VALUE;
+	  private double loY = -Double.MAX_VALUE;
+	  
+	  public SafeBisectorFinder(Polygon poly) {
+		  this.poly = poly;
+		  
+		  // initialize using extremal values
+		  hiY = poly.getEnvelopeInternal().getMaxY();
+		  loY = poly.getEnvelopeInternal().getMinY();
+		  centreY = avg(loY, hiY);
+	  }
+	  
+	  public double getBisectorY()
+	  {
+		  process(poly.getExteriorRing());
+		  for (int i = 0; i < poly.getNumInteriorRing(); i++) {
+			  process(poly.getInteriorRingN(i));
+		  }
+		  double bisectY = avg(hiY, loY);
+		  return bisectY;
+	  }
+
+	private void process(LineString line) {
+		CoordinateSequence seq = line.getCoordinateSequence();
+		for (int i = 0; i < seq.size(); i++) {
+			double y = seq.getY(i);
+			updateInterval(y);
+		}
+	}
+
+	private void updateInterval(double y) {
+		if (y <= centreY) {
+			if (y > loY)
+				loY = y;
+		}
+		else if (y > centreY) {
+			if (y < hiY) {
+				hiY = y;
+			}
+		}
+	}
+  }
 }
diff --git a/src/com/vividsolutions/jts/algorithm/MinimumBoundingCircle.java b/src/com/vividsolutions/jts/algorithm/MinimumBoundingCircle.java
index 462b1dc..6f099f8 100644
--- a/src/com/vividsolutions/jts/algorithm/MinimumBoundingCircle.java
+++ b/src/com/vividsolutions/jts/algorithm/MinimumBoundingCircle.java
@@ -70,10 +70,10 @@ import com.vividsolutions.jts.util.*;
  */
 public class MinimumBoundingCircle 
 {
-	/*
+  /*
    * The algorithm used is based on the one by Jon Rokne in 
    * the article "An Easy Bounding Circle" in <i>Graphic Gems II</i>.
-	 */
+   */
 	
 	private Geometry input;
 	private Coordinate[] extremalPts = null;
@@ -115,7 +115,53 @@ public class MinimumBoundingCircle
 			return centrePoint;
 		return centrePoint.buffer(radius);
 	}
-	
+
+  /**
+   * Gets a geometry representing a line between the two farthest points
+   * in the input.
+   * These points will be two of the extremal points of the Minimum Bounding Circle.
+   * They also lie on the convex hull of the input.
+   * 
+   * @return a LineString between the two farthest points of the input
+   * @return a empty LineString if the input is empty
+   * @return a Point if the input is a point
+   */
+  public Geometry getFarthestPoints() {
+    compute();
+    switch (extremalPts.length) {
+    case 0:
+      return input.getFactory().createLineString((CoordinateSequence) null);
+    case 1:
+      return input.getFactory().createPoint(centre);
+    }
+    Coordinate p0 = extremalPts[0];
+    Coordinate p1 = extremalPts[extremalPts.length - 1];
+    return input.getFactory().createLineString(new Coordinate[] { p0, p1 });
+  }
+
+  /**
+   * Gets a geometry representing the diameter of the computed Minimum Bounding
+   * Circle.
+   * 
+   * @return the diameter LineString of the Minimum Bounding Circle
+   * @return a empty LineString if the input is empty
+   * @return a Point if the input is a point
+   */
+  public Geometry getDiameter() {
+    compute();
+    switch (extremalPts.length) {
+    case 0:
+      return input.getFactory().createLineString((CoordinateSequence) null);
+    case 1:
+      return input.getFactory().createPoint(centre);
+    }
+    // TODO: handle case of 3 extremal points, by computing a line from one of
+    // them through the centre point with len = 2*radius
+    Coordinate p0 = extremalPts[0];
+    Coordinate p1 = extremalPts[1];
+    return input.getFactory().createLineString(new Coordinate[] { p0, p1 });
+  }
+
 	/**
 	 * Gets the extremal points which define the computed Minimum Bounding Circle.
 	 * There may be zero, one, two or three of these points,
@@ -130,18 +176,18 @@ public class MinimumBoundingCircle
 		return extremalPts;
 	}
 	
-	/**
-	 * Gets the centre point of the computed Minimum Bounding Circle.
-	 * 
-	 * @return the centre point of the Minimum Bounding Circle
-	 * @return null if the input is empty
-	 */
-	public Coordinate getCentre() 
-	{
-		compute();
-		return centre;
-	}
-	
+        /**
+         * Gets the centre point of the computed Minimum Bounding Circle.
+         * 
+         * @return the centre point of the Minimum Bounding Circle
+         * @return null if the input is empty
+         */
+        public Coordinate getCentre() 
+        {
+                compute();
+                return centre;
+        }
+                
 	/**
 	 * Gets the radius of the computed Minimum Bounding Circle.
 	 * 
diff --git a/src/com/vividsolutions/jts/algorithm/MinimumDiameter.java b/src/com/vividsolutions/jts/algorithm/MinimumDiameter.java
index 758cfdc..e6a18ce 100644
--- a/src/com/vividsolutions/jts/algorithm/MinimumDiameter.java
+++ b/src/com/vividsolutions/jts/algorithm/MinimumDiameter.java
@@ -62,6 +62,25 @@ import com.vividsolutions.jts.geom.*;
  */
 public class MinimumDiameter
 {
+  /**
+   * Gets the minimum rectangle enclosing a geometry.
+   * 
+   * @param geom the geometry
+   * @return the minimum rectangle enclosing the geometry
+   */
+  public static Geometry getMinimumRectangle(Geometry geom) {
+    return (new MinimumDiameter(geom)).getMinimumRectangle();
+  }
+  
+  /**
+   * Gets the length of the minimum diameter enclosing a geometry
+   * @param geom the geometry
+   * @return the length of the minimum diameter of the geometry
+   */
+  public static Geometry getMinimumDiameter(Geometry geom) {
+    return (new MinimumDiameter(geom)).getDiameter();
+  }
+  
   private final Geometry inputGeom;
   private final boolean isConvex;
 
diff --git a/src/com/vividsolutions/jts/algorithm/RobustLineIntersector.java b/src/com/vividsolutions/jts/algorithm/RobustLineIntersector.java
index 753a659..7b87f05 100644
--- a/src/com/vividsolutions/jts/algorithm/RobustLineIntersector.java
+++ b/src/com/vividsolutions/jts/algorithm/RobustLineIntersector.java
@@ -246,19 +246,33 @@ public class RobustLineIntersector
      */
     if (! isInSegmentEnvelopes(intPt)) {
 //      System.out.println("Intersection outside segment envelopes: " + intPt);
-//      System.out.println("Segments: " + this);
+      
       // compute a safer result
-      intPt = CentralEndpointIntersector.getIntersection(p1, p2, q1, q2);
+      // copy the coordinate, since it may be rounded later
+      intPt = new Coordinate(nearestEndpoint(p1, p2, q1, q2));
+//    intPt = CentralEndpointIntersector.getIntersection(p1, p2, q1, q2);
+      
+//      System.out.println("Segments: " + this);
 //      System.out.println("Snapped to " + intPt);
+//      checkDD(p1, p2, q1, q2, intPt);
     }
-
     if (precisionModel != null) {
       precisionModel.makePrecise(intPt);
     }
-
     return intPt;
   }
 
+  private void checkDD(Coordinate p1, Coordinate p2, Coordinate q1,
+      Coordinate q2, Coordinate intPt)
+  {
+    Coordinate intPtDD = CGAlgorithmsDD.intersection(p1, p2, q1, q2);
+    boolean isIn = isInSegmentEnvelopes(intPtDD);
+    System.out.println(   "DD in env = " + isIn + "  --------------------- " + intPtDD);
+    if (intPt.distance(intPtDD) > 0.0001) {
+      System.out.println("Distance = " + intPt.distance(intPtDD));
+    }
+  }
+
   private Coordinate intersectionWithNormalization(
     Coordinate p1, Coordinate p2, Coordinate q1, Coordinate q2)
     {
@@ -298,7 +312,8 @@ public class RobustLineIntersector
     catch (NotRepresentableException e) {
 //    	System.out.println("Not calculable: " + this);
       // compute an approximate result
-      intPt = CentralEndpointIntersector.getIntersection(p1, p2, q1, q2);
+//      intPt = CentralEndpointIntersector.getIntersection(p1, p2, q1, q2);
+      intPt = nearestEndpoint(p1, p2, q1, q2);
  //     System.out.println("Snapped to " + intPt);
     }
     return intPt;
@@ -405,7 +420,7 @@ public class RobustLineIntersector
   }
 
   /**
-   * Test whether a point lies in the envelopes of both input segments.
+   * Tests whether a point lies in the envelopes of both input segments.
    * A correctly computed intersection point should return <code>true</code>
    * for this test.
    * Since this test is for debugging purposes only, no attempt is
@@ -420,4 +435,48 @@ public class RobustLineIntersector
     return env0.contains(intPt) && env1.contains(intPt);
   }
 
+  /**
+   * Finds the endpoint of the segments P and Q which 
+   * is closest to the other segment.
+   * This is a reasonable surrogate for the true 
+   * intersection points in ill-conditioned cases
+   * (e.g. where two segments are nearly coincident,
+   * or where the endpoint of one segment lies almost on the other segment).
+   * <p>
+   * This replaces the older CentralEndpoint heuristic,
+   * which chose the wrong endpoint in some cases
+   * where the segments had very distinct slopes 
+   * and one endpoint lay almost on the other segment.
+   * 
+   * @param p1 an endpoint of segment P
+   * @param p2 an endpoint of segment P
+   * @param q1 an endpoint of segment Q
+   * @param q2 an endpoint of segment Q
+   * @return the nearest endpoint to the other segment
+   */
+  private static Coordinate nearestEndpoint(Coordinate p1, Coordinate p2,
+      Coordinate q1, Coordinate q2)
+  {
+    Coordinate nearestPt = p1;
+    double minDist = CGAlgorithms.distancePointLine(p1, q1, q2);
+    
+    double dist = CGAlgorithms.distancePointLine(p2, q1, q2);
+    if (dist < minDist) {
+      minDist = dist;
+      nearestPt = p2;
+    }
+    dist = CGAlgorithms.distancePointLine(q1, p1, p2);
+    if (dist < minDist) {
+      minDist = dist;
+      nearestPt = q1;
+    }
+    dist = CGAlgorithms.distancePointLine(q2, p1, p2);
+    if (dist < minDist) {
+      minDist = dist;
+      nearestPt = q2;
+    }
+    return nearestPt;
+  }
+
+
 }
diff --git a/src/com/vividsolutions/jts/algorithm/distance/DistanceToPoint.java b/src/com/vividsolutions/jts/algorithm/distance/DistanceToPoint.java
index 8162e20..336a8b2 100644
--- a/src/com/vividsolutions/jts/algorithm/distance/DistanceToPoint.java
+++ b/src/com/vividsolutions/jts/algorithm/distance/DistanceToPoint.java
@@ -35,13 +35,11 @@ package com.vividsolutions.jts.algorithm.distance;
 import com.vividsolutions.jts.geom.*;
 
 /**
- * Computes the Euclidean distance (L2 metric) from a Point to a Geometry.
- * Also computes two points which are separated by the distance.
+ * Computes the Euclidean distance (L2 metric) from a {@link Coordinate} to a {@link Geometry}.
+ * Also computes two points on the geometry which are separated by the distance found.
  */
-public class DistanceToPoint {
-
-  // used for point-line distance calculation
-  private static LineSegment tempSegment = new LineSegment();
+public class DistanceToPoint 
+{
 
   public DistanceToPoint() {
   }
@@ -65,8 +63,10 @@ public class DistanceToPoint {
       ptDist.setMinimum(geom.getCoordinate(), pt);
     }
   }
+  
   public static void computeDistance(LineString line, Coordinate pt, PointPairDistance ptDist)
   {
+    LineSegment tempSegment = new LineSegment();
     Coordinate[] coords = line.getCoordinates();
     for (int i = 0; i < coords.length - 1; i++) {
       tempSegment.setCoordinates(coords[i], coords[i + 1]);
diff --git a/src/com/vividsolutions/jts/algorithm/distance/package.html b/src/com/vividsolutions/jts/algorithm/distance/package.html
deleted file mode 100644
index ee42f08..0000000
--- a/src/com/vividsolutions/jts/algorithm/distance/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Classes to compute distance metrics between geonetries.
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/algorithm/locate/IndexedPointInAreaLocator.java b/src/com/vividsolutions/jts/algorithm/locate/IndexedPointInAreaLocator.java
index 8600f62..d093be4 100644
--- a/src/com/vividsolutions/jts/algorithm/locate/IndexedPointInAreaLocator.java
+++ b/src/com/vividsolutions/jts/algorithm/locate/IndexedPointInAreaLocator.java
@@ -46,13 +46,15 @@ import com.vividsolutions.jts.index.intervalrtree.*;
  * This algorithm is suitable for use in cases where
  * many points will be tested against a given area.
  * 
+ * Thread-safe and immutable.
+ *
  * @author Martin Davis
  *
  */
 public class IndexedPointInAreaLocator 
   implements PointOnGeometryLocator
 {
-  private IntervalIndexedGeometry index;
+  private final IntervalIndexedGeometry index;
   
   /**
    * Creates a new locator for a given {@link Geometry}
@@ -62,11 +64,6 @@ public class IndexedPointInAreaLocator
   {
     if (! (g instanceof Polygonal))
       throw new IllegalArgumentException("Argument must be Polygonal");
-    buildIndex(g);
-  }
-  
-  private void buildIndex(Geometry g)
-  {
     index = new IntervalIndexedGeometry(g);
   }
     
@@ -111,7 +108,7 @@ public class IndexedPointInAreaLocator
   
   private static class IntervalIndexedGeometry
   {
-    private SortedPackedIntervalRTree index= new SortedPackedIntervalRTree();
+    private final SortedPackedIntervalRTree index= new SortedPackedIntervalRTree();
 
     public IntervalIndexedGeometry(Geometry geom)
     {
diff --git a/src/com/vividsolutions/jts/algorithm/locate/package.html b/src/com/vividsolutions/jts/algorithm/locate/package.html
deleted file mode 100644
index 2b4bebe..0000000
--- a/src/com/vividsolutions/jts/algorithm/locate/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Classes to determine the topological location of points in geometries.
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/algorithm/match/package.html b/src/com/vividsolutions/jts/algorithm/match/package.html
deleted file mode 100644
index 48a5102..0000000
--- a/src/com/vividsolutions/jts/algorithm/match/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Classes to compute matching metrics between geometries.
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/algorithm/package.html b/src/com/vividsolutions/jts/algorithm/package.html
deleted file mode 100644
index 70b5c0e..0000000
--- a/src/com/vividsolutions/jts/algorithm/package.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Contains classes and interfaces implementing fundamental computational geometry algorithms.
-
-<H3>Robustness</H3>
-
-Geometrical algorithms involve a combination of combinatorial and numerical computation.  As with
-all numerical computation using finite-precision numbers, the algorithms chosen are susceptible to
-problems of robustness.  A robustness problem occurs when a numerical calculation produces an
-incorrect answer for some inputs due to round-off errors.  Robustness problems are especially
-serious in geometric computation, since they can result in errors during topology building.
-<P>
-There are many approaches to dealing with the problem of robustness in geometrical computation.
-Not surprisingly, most robust algorithms are substantially more complex and less performant than
-the non-robust versions.  Fortunately, JTS is sensitive to robustness problems in only a few key
-functions (such as line intersection and the point-in-polygon test).  There are efficient robust
-algorithms available for these functions, and these algorithms are implemented in JTS.
-
-<H3>Computational Performance</H3>
-
-Runtime performance is an important consideration for a production-quality implementation of
-geometric algorithms.  The most computationally intensive algorithm used in JTS is intersection
-detection.  JTS methods need to determine both all intersection between the line segments in a
-single Geometry (self-intersection) and all intersections between the line segments of two different
-Geometries.
-<P>
-The obvious naive algorithm for intersection detection (comparing every segment with every other)
-has unacceptably slow performance.  There is a large literature of faster algorithms for intersection
-detection.  Unfortunately, many of them involve substantial code complexity.  JTS tries to balance code
-simplicity with performance gains.  It uses some simple techniques to produce substantial performance
-gains for common types of input data.
-
-
-<h2>Package Specification</h2>
-
-<ul>
-  <li>Java Topology Suite Technical Specifications
-  <li><A HREF="http://www.opengis.org/techno/specs.htm">
-      OpenGIS Simple Features Specification for SQL</A>
-</ul>
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/awt/FontGlyphReader.java b/src/com/vividsolutions/jts/awt/FontGlyphReader.java
index c26272b..dd6f590 100644
--- a/src/com/vividsolutions/jts/awt/FontGlyphReader.java
+++ b/src/com/vividsolutions/jts/awt/FontGlyphReader.java
@@ -44,8 +44,7 @@ import com.vividsolutions.jts.geom.*;
  * <p>
  * It is suggested to use larger point sizes to render fonts glyphs,
  * to reduce the effects of scale-dependent hints.
- * The resulting geometry are in the base coordinate system 
- * of the font.  
+ * The result geometry is in the base coordinate system of the font.  
  * The geometry can be further transformed as necessary using
  * {@link AffineTransformation}s.
  * 
@@ -53,10 +52,30 @@ import com.vividsolutions.jts.geom.*;
  *
  */
 public class FontGlyphReader 
-{
-	public static final String FONT_SERIF = "Serif";
-	public static final String FONT_SANSERIF = "SanSerif";
-	public static final String FONT_MONOSPACED = "Monospaced";
+{
+  /**
+   * The font name of the Java logical font Serif.
+   */
+  public static final String FONT_SERIF = "Serif";
+  
+  /**
+   * The font name of the Java logical font SansSerif.
+   * <p>
+   * DEPRECATED - use FONT_SANSSERIF
+   */
+  public static final String FONT_SANSERIF = "SansSerif";
+  
+  
+  /**
+   * The font name of the Java logical font SansSerif.
+   */
+  public static final String FONT_SANSSERIF = "SansSerif";
+  
+  /**
+   * The font name of the Java logical font Monospaced.
+   */
+
+  public static final String FONT_MONOSPACED = "Monospaced";
 	
   // a flatness factor empirically determined to provide good results
   private static final double FLATNESS_FACTOR = 400;
@@ -96,7 +115,7 @@ public class FontGlyphReader
    * 
    * @param text the text to render
    * @param font  the font to render with
-   * @param flatness the flatness to use
+   * @param flatness the flatness factor to use
    * @param geomFact the geometryFactory to use to create the result
    * @return a polygonal geometry representing the rendered text
    */
diff --git a/src/com/vividsolutions/jts/awt/PointShapeFactory.java b/src/com/vividsolutions/jts/awt/PointShapeFactory.java
index 4511a1d..1f2e826 100644
--- a/src/com/vividsolutions/jts/awt/PointShapeFactory.java
+++ b/src/com/vividsolutions/jts/awt/PointShapeFactory.java
@@ -63,7 +63,7 @@ public interface PointShapeFactory {
     /**
      * The default size of the shape
      */
-    public static double DEFAULT_SIZE = 3.0;
+    public static final double DEFAULT_SIZE = 3.0;
 
     protected double size = DEFAULT_SIZE;
 
diff --git a/src/com/vividsolutions/jts/awt/ShapeReader.java b/src/com/vividsolutions/jts/awt/ShapeReader.java
index 85f868c..62a49a2 100644
--- a/src/com/vividsolutions/jts/awt/ShapeReader.java
+++ b/src/com/vividsolutions/jts/awt/ShapeReader.java
@@ -60,7 +60,7 @@ import com.vividsolutions.jts.geom.*;
  */
 public class ShapeReader 
 {
-  private static AffineTransform INVERT_Y = AffineTransform.getScaleInstance(1, -1);
+  private static final AffineTransform INVERT_Y = AffineTransform.getScaleInstance(1, -1);
 
   /**
    * Converts a flat path to a {@link Geometry}.
diff --git a/src/com/vividsolutions/jts/awt/package.html b/src/com/vividsolutions/jts/awt/package.html
deleted file mode 100644
index c944a17..0000000
--- a/src/com/vividsolutions/jts/awt/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Classes to perform conversions from Java2D shape objects.
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/densify/package.html b/src/com/vividsolutions/jts/densify/package.html
deleted file mode 100644
index 00e3ead..0000000
--- a/src/com/vividsolutions/jts/densify/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Classes to perform densification on geometries.
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/dissolve/DissolveEdgeGraph.java b/src/com/vividsolutions/jts/dissolve/DissolveEdgeGraph.java
new file mode 100644
index 0000000..341d8b5
--- /dev/null
+++ b/src/com/vividsolutions/jts/dissolve/DissolveEdgeGraph.java
@@ -0,0 +1,22 @@
+package com.vividsolutions.jts.dissolve;
+
+import com.vividsolutions.jts.edgegraph.EdgeGraph;
+import com.vividsolutions.jts.edgegraph.HalfEdge;
+import com.vividsolutions.jts.geom.Coordinate;
+
+
+/**
+ * A graph containing {@link DissolveHalfEdge}s.
+ * 
+ * @author Martin Davis
+ *
+ */
+class DissolveEdgeGraph extends EdgeGraph
+{
+  protected HalfEdge createEdge(Coordinate p0)
+  {
+    return new DissolveHalfEdge(p0);
+  }
+  
+
+}
diff --git a/src/com/vividsolutions/jts/dissolve/DissolveHalfEdge.java b/src/com/vividsolutions/jts/dissolve/DissolveHalfEdge.java
new file mode 100644
index 0000000..67b32c4
--- /dev/null
+++ b/src/com/vividsolutions/jts/dissolve/DissolveHalfEdge.java
@@ -0,0 +1,40 @@
+package com.vividsolutions.jts.dissolve;
+
+import com.vividsolutions.jts.edgegraph.MarkHalfEdge;
+import com.vividsolutions.jts.geom.Coordinate;
+
+
+/**
+ * A HalfEdge which carries information
+ * required to support {@link LineDissolver}.
+ * 
+ * @author Martin Davis
+ *
+ */
+class DissolveHalfEdge extends MarkHalfEdge
+{
+  private boolean isStart = false;
+  
+  public DissolveHalfEdge(Coordinate orig) {
+    super(orig);
+  }
+
+  /**
+   * Tests whether this edge is the starting segment
+   * in a LineString being dissolved.
+   * 
+   * @return true if this edge is a start segment
+   */
+  public boolean isStart()
+  {
+    return isStart;
+  }
+  
+  /**
+   * Sets this edge to be the start segment of an input LineString.
+   */
+  public void setStart()
+  {
+    isStart = true;
+  }
+}
diff --git a/src/com/vividsolutions/jts/dissolve/LineDissolver.java b/src/com/vividsolutions/jts/dissolve/LineDissolver.java
new file mode 100644
index 0000000..a6e013a
--- /dev/null
+++ b/src/com/vividsolutions/jts/dissolve/LineDissolver.java
@@ -0,0 +1,286 @@
+package com.vividsolutions.jts.dissolve;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Stack;
+
+
+import com.vividsolutions.jts.edgegraph.HalfEdge;
+import com.vividsolutions.jts.edgegraph.MarkHalfEdge;
+import com.vividsolutions.jts.geom.CoordinateList;
+import com.vividsolutions.jts.geom.CoordinateSequence;
+import com.vividsolutions.jts.geom.Geometry;
+import com.vividsolutions.jts.geom.GeometryComponentFilter;
+import com.vividsolutions.jts.geom.GeometryFactory;
+import com.vividsolutions.jts.geom.LineString;
+
+/**
+ * Dissolves the linear components 
+ * from a collection of {@link Geometry}s
+ * into a set of maximal-length {@link Linestring}s
+ * in which every unique segment appears once only.
+ * The output linestrings run between node vertices
+ * of the input, which are vertices which have
+ * either degree 1, or degree 3 or greater.
+ * <p>
+ * Use cases for dissolving linear components
+ * include generalization 
+ * (in particular, simplifying polygonal coverages), 
+ * and visualization 
+ * (in particular, avoiding symbology conflicts when
+ * depicting shared polygon boundaries).
+ * <p>
+ * This class does <b>not</b> node the input lines.
+ * If there are line segments crossing in the input, 
+ * they will still cross in the output.
+ * 
+ * @author Martin Davis
+ *
+ */
+public class LineDissolver 
+{
+  /**
+   * Dissolves the linear components in a geometry.
+   * 
+   * @param g the geometry to dissolve
+   * @return the dissolved lines
+   */
+  public static Geometry dissolve(Geometry g)
+  {
+    LineDissolver d = new LineDissolver();
+    d.add(g);
+    return d.getResult();
+  }
+  
+  private Geometry result;
+  private GeometryFactory factory;
+  private DissolveEdgeGraph graph;
+  private List lines = new ArrayList();
+
+  public LineDissolver()
+  {
+    graph = new DissolveEdgeGraph();
+  }
+  
+  /**
+   * Adds a {@link Geometry} to be dissolved. 
+   * Any number of geometries may be adde by calling this method multiple times.
+   * Any type of Geometry may be added.  The constituent linework will be
+   * extracted to be dissolved.
+   * 
+   * @param geometry geometry to be line-merged
+   */  
+  public void add(Geometry geometry) {
+    geometry.apply(new GeometryComponentFilter() {
+      public void filter(Geometry component) {
+        if (component instanceof LineString) {
+          add((LineString)component);
+        }
+      }      
+    });
+  }
+  /**
+   * Adds a collection of Geometries to be processed. May be called multiple times.
+   * Any dimension of Geometry may be added; the constituent linework will be
+   * extracted.
+   * 
+   * @param geometries the geometries to be line-merged
+   */
+  public void add(Collection geometries) 
+  {
+    for (Iterator i = geometries.iterator(); i.hasNext(); ) {
+      Geometry geometry = (Geometry) i.next();
+      add(geometry);
+    }
+  }
+  
+  private void add(LineString lineString) {
+    if (factory == null) {
+      this.factory = lineString.getFactory();
+    }
+    CoordinateSequence seq = lineString.getCoordinateSequence();
+    boolean doneStart = false;
+    for (int i = 1; i < seq.size(); i++) {
+      DissolveHalfEdge e = (DissolveHalfEdge) graph.addEdge(seq.getCoordinate(i-1), seq.getCoordinate(i));
+      // skip zero-length edges
+      if (e == null) continue;
+      /**
+       * Record source initial segments, so that they can be reflected in output when needed
+       * (i.e. during formation of isolated rings)
+       */
+      if (! doneStart) {
+        e.setStart();
+        doneStart = true;
+      }
+    }
+  }
+  
+  /**
+   * Gets the dissolved result as a MultiLineString.
+   * 
+   * @return the dissolved lines
+   */
+  public Geometry getResult()
+  {
+    if (result == null)
+      computeResult();
+    return result;
+  }
+
+  private void computeResult() {
+    Collection edges = graph.getVertexEdges();
+    for (Iterator i = edges.iterator(); i.hasNext(); ) {
+      HalfEdge e = (HalfEdge) i.next();
+      if (MarkHalfEdge.isMarked(e)) continue;
+      process(e);
+    }
+    result = factory.buildGeometry(lines);
+  }
+
+  private Stack nodeEdgeStack = new Stack();
+  
+  private void process(HalfEdge e) {
+    HalfEdge eNode = e.prevNode();
+    // if edge is in a ring, just process this edge
+    if (eNode == null)
+      eNode = e;
+    stackEdges(eNode);
+    // extract lines from node edges in stack
+    buildLines();
+  }
+
+  /**
+   * For each edge in stack
+   * (which must originate at a node)
+   * extracts the line it initiates.
+   */
+  private void buildLines() {
+    while (! nodeEdgeStack.empty()) {
+      HalfEdge e = (HalfEdge) nodeEdgeStack.pop();
+      if (MarkHalfEdge.isMarked(e))
+        continue;
+      buildLine(e);
+    }
+  }
+  
+  private DissolveHalfEdge ringStartEdge;
+  
+  /**
+   * Updates the tracked ringStartEdge
+   * if the given edge has a lower origin
+   * (using the standard {@link Coordinate} ordering).
+   * 
+   * Identifying the lowest starting node meets two goals:
+   * <ul>
+   * <li>It ensures that isolated input rings are created using the original node and orientation
+   * <li>For isolated rings formed from multiple input linestrings, 
+   * it provides a canonical node and orientation for the output
+   * (rather than essentially random, and thus hard to test).
+   * </ul>
+   * 
+   * @param e
+   */
+  private void updateRingStartEdge(DissolveHalfEdge e)
+  {
+    if (! e.isStart()) {
+      e = (DissolveHalfEdge) e.sym();
+      if (! e.isStart()) return;
+    }
+    // here e is known to be a start edge
+    if (ringStartEdge == null) {
+      ringStartEdge = e;
+      return;
+    }
+    if (e.orig().compareTo(ringStartEdge.orig()) < 0) {
+      ringStartEdge = e;
+    }
+  }
+  
+  /**
+   * Builds a line starting from the given edge.
+   * The start edge origin is a node (valence = 1 or >= 3), 
+   * unless it is part of a pure ring.
+   * A pure ring has no other incident lines.
+   * In this case the start edge may occur anywhere on the ring.
+   * 
+   * The line is built up to the next node encountered,
+   * or until the start edge is re-encountered
+   * (which happens if the edges form a ring).
+   * 
+   * @param eStart
+   */
+  private void buildLine(HalfEdge eStart) {
+    CoordinateList line = new CoordinateList();
+    DissolveHalfEdge e = (DissolveHalfEdge) eStart;
+    ringStartEdge = null;
+    
+    MarkHalfEdge.markBoth(e);
+    line.add(e.orig().clone(), false);
+    // scan along the path until a node is found (if one exists)
+    while (e.sym().degree() == 2) {
+      updateRingStartEdge(e);
+      DissolveHalfEdge eNext = (DissolveHalfEdge) e.next();
+      // check if edges form a ring - if so, we're done
+      if (eNext == eStart)  {
+        buildRing(ringStartEdge);
+        return;
+      }
+      // add point to line, and move to next edge
+      line.add(eNext.orig().clone(), false);
+      e = eNext;
+      MarkHalfEdge.markBoth(e);
+    }
+    // add final node
+    line.add(e.dest().clone(), false);
+    
+    // queue up the final node edges
+    stackEdges(e.sym());
+    // store the scanned line
+    addLine(line);
+  }
+
+  private void buildRing(HalfEdge eStartRing) {
+    CoordinateList line = new CoordinateList();
+    HalfEdge e = eStartRing;
+    
+    line.add(e.orig().clone(), false);
+    // scan along the path until a node is found (if one exists)
+    while (e.sym().degree() == 2) {
+      HalfEdge eNext = e.next();
+      // check if edges form a ring - if so, we're done
+      if (eNext == eStartRing)
+        break;
+      
+      // add point to line, and move to next edge
+      line.add(eNext.orig().clone(), false);
+      e = eNext;
+    }
+    // add final node
+    line.add(e.dest().clone(), false);
+    
+    // store the scanned line
+    addLine(line);
+  }
+
+  private void addLine(CoordinateList line) {
+    lines.add(factory.createLineString(line.toCoordinateArray()));
+  }
+
+  /**
+   * Adds edges around this node to the stack.
+   * 
+   * @param node
+   */
+  private void stackEdges(HalfEdge node) {
+    HalfEdge e = node;
+    do {
+      if (! MarkHalfEdge.isMarked(e))
+        nodeEdgeStack.add(e);
+      e = e.oNext();
+    } while (e != node);
+
+  }
+
+}
diff --git a/src/com/vividsolutions/jts/edgegraph/EdgeGraph.java b/src/com/vividsolutions/jts/edgegraph/EdgeGraph.java
new file mode 100644
index 0000000..ad445a0
--- /dev/null
+++ b/src/com/vividsolutions/jts/edgegraph/EdgeGraph.java
@@ -0,0 +1,144 @@
+package com.vividsolutions.jts.edgegraph;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import com.vividsolutions.jts.geom.Coordinate;
+
+/**
+ * A graph comprised of {@link HalfEdge}s.
+ * It supports tracking the vertices in the graph
+ * via edges incident on them, 
+ * to allow efficient lookup of edges and vertices.
+ * <p>
+ * This class may be subclassed to use a 
+ * different subclass of HalfEdge,
+ * by overriding {@link #createEdge(Coordinate)}.
+ * If additional logic is required to initialize
+ * edges then {@link EdgeGraph#addEdge(Coordinate, Coordinate)}
+ * can be overridden as well.
+ * 
+ * @author Martin Davis
+ *
+ */
+public class EdgeGraph 
+{
+  private Map vertexMap = new HashMap();
+  
+  public EdgeGraph() {
+  }
+
+  /**
+   * Creates a single HalfEdge.
+   * Override to use a different HalfEdge subclass.
+   * 
+   * @param orig the origin location
+   * @return a new HalfEdge with the given origin
+   */
+  protected HalfEdge createEdge(Coordinate orig)
+  {
+    return new HalfEdge(orig);
+  }
+
+  private HalfEdge create(Coordinate p0, Coordinate p1)
+  {
+    HalfEdge e0 = createEdge(p0);
+    HalfEdge e1 = createEdge(p1);
+    HalfEdge.init(e0, e1);
+    return e0;
+  }
+  
+  /**
+   * Adds an edge between the coordinates orig and dest
+   * to this graph.
+   * Only valid edges can be added (in particular, zero-length segments cannot be added)
+   * 
+   * @param orig the edge origin location
+   * @param dest the edge destination location.
+   * @return the created edge
+   * @return null if the edge was invalid and not added
+   * 
+   * @see {@link #isValidEdge(Coordinate, Coordinate)}
+   */
+  public HalfEdge addEdge(Coordinate orig, Coordinate dest) {
+    if (! isValidEdge(orig, dest)) return null;
+    
+    /**
+     * Attempt to find the edge already in the graph.
+     * Return it if found.
+     * Otherwise, use a found edge with same origin (if any) to construct new edge. 
+     */
+    HalfEdge eAdj = (HalfEdge) vertexMap.get(orig);
+    HalfEdge eSame = null;
+    if (eAdj != null) {
+      eSame = eAdj.find(dest);
+    }
+    if (eSame != null) {
+      return eSame;
+    }
+    
+    HalfEdge e = insert(orig, dest, eAdj);
+    return e;
+  }
+
+  /**
+   * Tests if the given coordinates form a valid edge (with non-zero length).
+   * 
+   * @param orig the start coordinate
+   * @param dest the end coordinate
+   * @return true if the edge formed is valid
+   */
+  public static boolean isValidEdge(Coordinate orig, Coordinate dest) {
+    int cmp = dest.compareTo(orig);
+    return cmp != 0;
+  }
+
+  /**
+   * Inserts an edge not already present into the graph.
+   * 
+   * @param orig the edge origin location
+   * @param dest the edge destination location
+   * @param eAdj an existing edge with same orig (if any)
+   * @return the created edge
+   */
+  private HalfEdge insert(Coordinate orig, Coordinate dest, HalfEdge eAdj) {
+    // edge does not exist, so create it and insert in graph
+    HalfEdge e = create(orig, dest);
+    if (eAdj != null) {
+      eAdj.insert(e);
+    }
+    else {
+      // add halfedges to to map
+      vertexMap.put(orig, e);
+    }
+    
+    HalfEdge eAdjDest = (HalfEdge) vertexMap.get(dest);
+    if (eAdjDest != null) {
+      eAdjDest.insert(e.sym());
+    }
+    else {
+      vertexMap.put(dest, e.sym());
+    }
+    return e;
+  }
+
+  public Collection getVertexEdges()
+  {
+    return vertexMap.values();
+  }
+
+  /**
+   * Finds an edge in this graph with the given origin
+   * and destination, if one exists.
+   * 
+   * @param orig the origin location
+   * @param dest the destination location.
+   * @return an edge with the given orig and dest, or null if none exists
+   */
+  public HalfEdge findEdge(Coordinate orig, Coordinate dest) {
+    HalfEdge e = (HalfEdge) vertexMap.get(orig);
+    if (e == null) return null;
+    return e.find(dest);
+  }
+}
diff --git a/src/com/vividsolutions/jts/edgegraph/EdgeGraphBuilder.java b/src/com/vividsolutions/jts/edgegraph/EdgeGraphBuilder.java
new file mode 100644
index 0000000..1932686
--- /dev/null
+++ b/src/com/vividsolutions/jts/edgegraph/EdgeGraphBuilder.java
@@ -0,0 +1,77 @@
+package com.vividsolutions.jts.edgegraph;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import com.vividsolutions.jts.geom.CoordinateSequence;
+import com.vividsolutions.jts.geom.Geometry;
+import com.vividsolutions.jts.geom.GeometryComponentFilter;
+import com.vividsolutions.jts.geom.LineString;
+
+/**
+ * Builds an edge graph from geometries containing edges.
+ * 
+ * @author mdavis
+ *
+ */
+public class EdgeGraphBuilder 
+{
+  public static EdgeGraph build(Collection geoms) {
+    EdgeGraphBuilder builder = new EdgeGraphBuilder();
+    builder.add(geoms);
+    return builder.getGraph();
+  }
+
+  private EdgeGraph graph = new EdgeGraph();
+
+  public EdgeGraphBuilder()
+  {
+    
+  }
+  
+  public EdgeGraph getGraph()
+  {
+    return graph;
+  }
+  
+  /**
+   * Adds the edges of a Geometry to the graph. 
+   * May be called multiple times.
+   * Any dimension of Geometry may be added; the constituent edges are
+   * extracted.
+   * 
+   * @param geometry geometry to be added
+   */  
+  public void add(Geometry geometry) {
+    geometry.apply(new GeometryComponentFilter() {
+      public void filter(Geometry component) {
+        if (component instanceof LineString) {
+          add((LineString)component);
+        }
+      }      
+    });
+  }
+  /**
+   * Adds the edges in a collection of {@link Geometry}s to the graph. 
+   * May be called multiple times.
+   * Any dimension of Geometry may be added.
+   * 
+   * @param geometries the geometries to be added
+   */
+  public void add(Collection geometries) 
+  {
+    for (Iterator i = geometries.iterator(); i.hasNext(); ) {
+      Geometry geometry = (Geometry) i.next();
+      add(geometry);
+    }
+  }
+  
+  private void add(LineString lineString) {
+    CoordinateSequence seq = lineString.getCoordinateSequence();
+    for (int i = 1; i < seq.size(); i++) {
+      graph.addEdge(seq.getCoordinate(i-1), seq.getCoordinate(i));
+    }
+  }
+
+  
+}
diff --git a/src/com/vividsolutions/jts/edgegraph/HalfEdge.java b/src/com/vividsolutions/jts/edgegraph/HalfEdge.java
new file mode 100644
index 0000000..3c0e4d2
--- /dev/null
+++ b/src/com/vividsolutions/jts/edgegraph/HalfEdge.java
@@ -0,0 +1,351 @@
+package com.vividsolutions.jts.edgegraph;
+
+import com.vividsolutions.jts.algorithm.CGAlgorithms;
+import com.vividsolutions.jts.geom.Coordinate;
+import com.vividsolutions.jts.geomgraph.Quadrant;
+import com.vividsolutions.jts.util.Assert;
+
+/**
+ * Represents a directed component of an edge in an {@link EdgeGraph}.
+ * HalfEdges link vertices whose locations are defined by {@link Coordinate}s.
+ * HalfEdges start at an <b>origin</b> vertex,
+ * and terminate at a <b>destination</b> vertex.
+ * HalfEdges always occur in symmetric pairs, with the {@link #sym()} method
+ * giving access to the oppositely-oriented component.
+ * HalfEdges and the methods on them form an edge algebra,
+ * which can be used to traverse and query the topology
+ * of the graph formed by the edges.
+ * <p>
+ * By design HalfEdges carry minimal information
+ * about the actual usage of the graph they represent.
+ * They can be subclassed to carry more information if required.
+ * <p>
+ * HalfEdges form a complete and consistent data structure by themselves,
+ * but an {@link EdgeGraph} is useful to allow retrieving edges
+ * by vertex and edge location, as well as ensuring 
+ * edges are created and linked appropriately.
+ * 
+ * @author Martin Davis
+ *
+ */
+public class HalfEdge {
+
+  /**
+   * Creates a HalfEdge pair representing an edge
+   * between two vertices located at coordinates p0 and p1.
+   * 
+   * @param p0 a vertex coordinate
+   * @param p1 a vertex coordinate
+   * @return the HalfEdge with origin at p0
+   */
+  public static HalfEdge create(Coordinate p0, Coordinate p1) {
+    HalfEdge e0 = new HalfEdge(p0);
+    HalfEdge e1 = new HalfEdge(p1);
+    e0.init(e1);
+    return e0;
+  }
+
+  /**
+   * Initialize a symmetric pair of halfedges.
+   * Intended for use by {@link EdgeGraph} subclasses.
+   * The edges are initialized to have each other 
+   * as the {@link sym} edge, and to have {@link next} pointers
+   * which point to edge other.
+   * This effectively creates a graph containing a single edge.
+   * 
+   * @param e0 a halfedge
+   * @param e1 a symmetric halfedge
+   * @return the initialized edge e0
+   */
+  public static HalfEdge init(HalfEdge e0, HalfEdge e1)
+  {
+    // ensure only newly created edges can be initialized, to prevent information loss
+    if (e0.sym != null || e1.sym != null
+        || e0.next != null || e1.next != null)
+      throw new IllegalStateException("Edges are already initialized");
+    e0.init(e1);
+    return e0;
+  }
+  
+  private Coordinate orig;
+  private HalfEdge sym;
+  private HalfEdge next;
+
+  /**
+   * Creates an edge originating from a given coordinate.
+   * 
+   * @param orig the origin coordinate
+   */
+  public HalfEdge(Coordinate orig) {
+    this.orig = orig;
+  }
+
+  protected void init(HalfEdge e)
+  {
+    setSym(e);
+    e.setSym(this);
+    // set next ptrs for a single segment
+    setNext(e);
+    e.setNext(this);
+  }
+  
+  /**
+   * Gets the origin coordinate of this edge.
+   * 
+   * @return the origin coordinate
+   */
+  public Coordinate orig() { return orig; }
+  
+  /**
+   * Gets the destination coordinate of this edge.
+   * 
+   * @return the destination coordinate
+   */
+  public Coordinate dest() { return sym.orig; }
+
+  /**
+   * Gets the symmetric pair edge of this edge.
+   * 
+   * @return the symmetric pair edge
+   */
+  public HalfEdge sym()
+  { 
+    return sym;
+  }
+  
+  /**
+   * Sets the sym edge.
+   * 
+   * @param e the sym edge to set
+   */
+  private void setSym(HalfEdge e) {
+    sym = e;
+  }
+
+  /**
+   * Gets the next edge CCW around the 
+   * destination vertex of this edge.
+   * If the vertex has degree 1 then this is the <b>sym</b> edge.
+   * 
+   * @return the next edge
+   */
+  public HalfEdge next()
+  {
+    return next;
+  }
+  
+  /**
+   * Returns the edge previous to this one
+   * (with dest being the same as this orig).
+   * 
+   * @return the previous edge to this one
+   */
+  public HalfEdge prev() {
+    return sym.next().sym;
+  }
+
+  public void setNext(HalfEdge e)
+  {
+    next = e;
+  }
+  
+  public HalfEdge oNext() {
+    return sym.next;
+  }
+
+  /**
+   * Finds the edge starting at the origin of this edge
+   * with the given dest vertex,
+   * if any.
+   * 
+   * @param dest the dest vertex to search for
+   * @return the edge with the required dest vertex, if it exists,
+   * or null
+   */
+  public HalfEdge find(Coordinate dest) {
+    HalfEdge oNext = this;
+    do {
+      if (oNext == null) return null;
+      if (oNext.dest().equals2D(dest)) 
+        return oNext;
+      oNext = oNext.oNext();
+    } while (oNext != this);
+    return null;
+  }
+
+  /**
+   * Tests whether this edge has the given orig and dest vertices.
+   * 
+   * @param p0 the origin vertex to test
+   * @param p1 the destination vertex to test
+   * @return true if the vertices are equal to the ones of this edge
+   */
+  public boolean equals(Coordinate p0, Coordinate p1) {
+    return orig.equals2D(p0) && sym.orig.equals(p1);
+  }
+  
+  /**
+   * Inserts an edge
+   * into the ring of edges around the origin vertex of this edge.
+   * The inserted edge must have the same origin as this edge.
+   * 
+   * @param e the edge to insert
+   */
+  public void insert(HalfEdge e) {
+    // if no other edge around origin
+    if (oNext() == this) {
+      // set linkage so ring is correct
+      insertAfter(e);
+      return;
+    }
+    
+    // otherwise, find edge to insert after
+    int ecmp = compareTo(e);
+    HalfEdge ePrev = this;
+    do {
+      HalfEdge oNext = ePrev.oNext();
+      int cmp = oNext.compareTo(e);
+      if (cmp != ecmp || oNext == this) {
+        ePrev.insertAfter(e);
+        return;
+      }
+      ePrev = oNext;
+    } while (ePrev != this);
+    Assert.shouldNeverReachHere();
+  }
+  
+  /**
+   * Insert an edge with the same origin after this one.
+   * Assumes that the inserted edge is in the correct
+   * position around the ring.
+   * 
+   * @param e the edge to insert (with same origin)
+   */
+  private void insertAfter(HalfEdge e) {
+    Assert.equals(orig, e.orig());
+    HalfEdge save = oNext();
+    sym.setNext(e);
+    e.sym().setNext(save);
+  }
+
+  /**
+   * Compares edges which originate at the same vertex
+   * based on the angle they make at their origin vertex with the positive X-axis.
+   * This allows sorting edges around their origin vertex in CCW order.
+   */
+  public int compareTo(Object obj)
+  {
+    HalfEdge e = (HalfEdge) obj;
+    int comp = compareAngularDirection(e);
+    return comp;
+  }
+
+  /**
+   * Implements the total order relation:
+   * <p>
+   *    The angle of edge a is greater than the angle of edge b,
+   *    where the angle of an edge is the angle made by 
+   *    the first segment of the edge with the positive x-axis
+   * <p>
+   * When applied to a list of edges originating at the same point,
+   * this produces a CCW ordering of the edges around the point.
+   * <p>
+   * Using the obvious algorithm of computing the angle is not robust,
+   * since the angle calculation is susceptible to roundoff error.
+   * A robust algorithm is:
+   * <ul>
+   * <li>First, compare the quadrants the edge vectors lie in.  
+   * If the quadrants are different, 
+   * it is trivial to determine which edge has a greater angle.
+   * 
+   * <li>if the vectors lie in the same quadrant, the 
+   * {@link CGAlgorithms#computeOrientation(Coordinate, Coordinate, Coordinate)} function
+   * can be used to determine the relative orientation of the vectors.
+   * </ul>
+   */
+  public int compareAngularDirection(HalfEdge e)
+  {
+    double dx = deltaX();
+    double dy = deltaY();
+    double dx2 = e.deltaX();
+    double dy2 = e.deltaY();
+    
+    // same vector
+    if (dx == dx2 && dy == dy2)
+      return 0;
+    
+    double quadrant = Quadrant.quadrant(dx, dy);
+    double quadrant2 = Quadrant.quadrant(dx2, dy2);
+    
+    // if the vectors are in different quadrants, determining the ordering is trivial
+    if (quadrant > quadrant2) return 1;
+    if (quadrant < quadrant2) return -1;
+    // vectors are in the same quadrant
+    // Check relative orientation of direction vectors
+    // this is > e if it is CCW of e
+    return CGAlgorithms.computeOrientation(e.orig, e.dest(), dest());
+  }
+
+  /**
+   * The X component of the distance between the orig and dest vertices.
+   * 
+   * @return the X component of the edge length
+   */
+  public double deltaX() { return sym.orig.x - orig.x; }
+  
+  /**
+   * The Y component of the distance between the orig and dest vertices.
+   * 
+   * @return the Y component of the edge length
+   */
+  public double deltaY() { return sym.orig.y - orig.y; }
+  
+  /**
+   * Computes a string representation of a HalfEdge.
+   * 
+   * @return a string representation
+   */
+  public String toString()
+  {
+    return "HE("+orig.x + " " + orig.y
+        + ", "
+        + sym.orig.x + " " + sym.orig.y
+        + ")";
+  }
+
+  /**
+   * Computes the degree of the origin vertex.
+   * The degree is the number of edges
+   * originating from the vertex.
+   * 
+   * @return the degree of the origin vertex
+   */
+  public int degree() {
+    int degree = 0;
+    HalfEdge e = this;
+    do {
+      degree++;
+      e = e.oNext();
+    } while (e != this);
+    return degree;
+  }
+
+  /**
+   * Finds the first node previous to this edge, if any.
+   * If no such node exists (i.e the edge is part of a ring)
+   * then null is returned.
+   * 
+   * @return an edge originating at the node prior to this edge, if any,
+   *   or null if no node exists
+   */
+  public HalfEdge prevNode() {
+    HalfEdge e = this;
+    while (e.degree() == 2) {
+      e = e.prev();
+      if (e == this)
+        return null;
+    }
+    return e;
+  }
+
+}
diff --git a/src/com/vividsolutions/jts/edgegraph/MarkHalfEdge.java b/src/com/vividsolutions/jts/edgegraph/MarkHalfEdge.java
new file mode 100644
index 0000000..e6f06bb
--- /dev/null
+++ b/src/com/vividsolutions/jts/edgegraph/MarkHalfEdge.java
@@ -0,0 +1,110 @@
+package com.vividsolutions.jts.edgegraph;
+
+import com.vividsolutions.jts.geom.Coordinate;
+
+/**
+ * A {@link HalfEdge} which supports
+ * marking edges with a boolean flag.
+ * Useful for algorithms which perform graph traversals.
+ * 
+ * @author Martin Davis
+ *
+ */
+public class MarkHalfEdge extends HalfEdge
+{
+  /**
+   * Tests whether the given edge is marked.
+   * 
+   * @param e the edge to test
+   * @return true if the edge is marked
+   */
+  public static boolean isMarked(HalfEdge e) 
+  {
+    return ((MarkHalfEdge) e).isMarked();
+  }
+  
+  /**
+   * Marks the given edge.
+   * 
+   * @param e the edge to mark
+   */
+  public static void mark(HalfEdge e)
+  {
+    ((MarkHalfEdge) e).mark();
+  }
+
+  /**
+   * Sets the mark for the given edge to a boolean value.
+   * 
+   * @param e the edge to set
+   * @param isMarked the mark value
+   */
+  public static void setMark(HalfEdge e, boolean isMarked)
+  {
+    ((MarkHalfEdge) e).setMark(isMarked);
+  }
+
+  /**
+   * Sets the mark for the given edge pair to a boolean value.
+   * 
+   * @param e an edge of the pair to update
+   * @param isMarked the mark value to set
+   */
+  public static void setMarkBoth(HalfEdge e, boolean isMarked)
+  {
+    ((MarkHalfEdge) e).setMark(isMarked);
+    ((MarkHalfEdge) e.sym()).setMark(isMarked);
+  }
+
+  /**
+   * Marks the edges in a pair.
+   * 
+   * @param e an edge of the pair to mark
+   */
+  public static void markBoth(HalfEdge e) {
+    ((MarkHalfEdge) e).mark();
+    ((MarkHalfEdge) e.sym()).mark();
+  }
+  
+  private boolean isMarked = false;
+
+  /**
+   * Creates a new marked edge.
+   * 
+   * @param orig the coordinate of the edge origin
+   */
+  public MarkHalfEdge(Coordinate orig) {
+    super(orig);
+  }
+
+  /**
+   * Tests whether this edge is marked.
+   * 
+   * @return true if this edge is marked
+   */
+  public boolean isMarked()
+  {
+    return isMarked ;
+  }
+  
+  /**
+   * Marks this edge.
+   * 
+   */
+  public void mark()
+  {
+    isMarked = true;
+  }
+
+  /**
+   * Sets the value of the mark on this edge.
+   * 
+   * @param isMarked the mark value to set
+   */
+  public void setMark(boolean isMarked)
+  {
+    this.isMarked = isMarked;
+  }
+
+
+}
diff --git a/src/com/vividsolutions/jts/geom/Coordinate.java b/src/com/vividsolutions/jts/geom/Coordinate.java
index 1678749..0297b23 100644
--- a/src/com/vividsolutions/jts/geom/Coordinate.java
+++ b/src/com/vividsolutions/jts/geom/Coordinate.java
@@ -35,6 +35,7 @@ package com.vividsolutions.jts.geom;
 import java.io.Serializable;
 import java.util.Comparator;
 import com.vividsolutions.jts.util.Assert;
+import com.vividsolutions.jts.util.NumberUtil;
 
 
 /**
@@ -47,11 +48,12 @@ import com.vividsolutions.jts.util.Assert;
  * and accessor methods. <P>
  *
  * <code>Coordinate</code>s are two-dimensional points, with an additional Z-ordinate. 
- * JTS does not support any operations on the Z-ordinate except the basic accessor functions. 
  * If an Z-ordinate value is not specified or not defined, 
  * constructed coordinates have a Z-ordinate of <code>NaN</code>
  * (which is also the value of <code>NULL_ORDINATE</code>).  
  * The standard comparison functions ignore the Z-ordinate.
+ * Apart from the basic accessor functions, JTS supports
+ * only specific operations involving the Z-ordinate. 
  *
  *@version 1.7
  */
@@ -194,15 +196,55 @@ public class Coordinate implements Comparable, Cloneable, Serializable {
     if (x != other.x) {
       return false;
     }
-
     if (y != other.y) {
       return false;
     }
-
     return true;
   }
 
   /**
+   * Tests if another coordinate has the same values for the X and Y ordinates.
+   * The Z ordinate is ignored.
+   *
+   *@param other a <code>Coordinate</code> with which to do the 2D comparison.
+   *@return true if <code>other</code> is a <code>Coordinate</code>
+   *      with the same values for X and Y.
+   */
+  public boolean equals2D(Coordinate c, double tolerance){
+    if (! NumberUtil.equalsWithTolerance(this.x, c.x, tolerance)) {
+      return false;
+    }
+    if (! NumberUtil.equalsWithTolerance(this.y, c.y, tolerance)) {
+      return false;
+    }
+    return true;
+  }
+  
+  /**
+   * Tests if another coordinate has the same values for the X, Y and Z ordinates.
+   *
+   *@param other a <code>Coordinate</code> with which to do the 3D comparison.
+   *@return true if <code>other</code> is a <code>Coordinate</code>
+   *      with the same values for X, Y and Z.
+   */
+  public boolean equals3D(Coordinate other) {
+    return (x == other.x) && (y == other.y) &&
+               ((z == other.z) ||
+               (Double.isNaN(z) && Double.isNaN(other.z)));
+  }
+  
+  /**
+   * Tests if another coordinate has the same value for Z, within a tolerance.
+   * 
+   * @param c a coordinate
+   * @param tolerance the tolerance value
+   * @return true if the Z ordinates are within the given tolerance
+   */
+  public boolean equalInZ(Coordinate c, double tolerance){
+    return NumberUtil.equalsWithTolerance(this.z, c.z, tolerance);
+  }
+  
+  /**
    *  Returns <code>true</code> if <code>other</code> has the same values for
    *  the x and y ordinates.
    *  Since Coordinates are 2.5D, this routine ignores the z value when making the comparison.
@@ -248,20 +290,6 @@ public class Coordinate implements Comparable, Cloneable, Serializable {
   }
 
   /**
-   *  Returns <code>true</code> if <code>other</code> has the same values for x,
-   *  y and z.
-   *
-   *@param  other  a <code>Coordinate</code> with which to do the 3D comparison.
-   *@return        <code>true</code> if <code>other</code> is a <code>Coordinate</code>
-   *      with the same values for x, y and z.
-   */
-  public boolean equals3D(Coordinate other) {
-    return (x == other.x) && (y == other.y) &&
-               ((z == other.z) ||
-               (Double.isNaN(z) && Double.isNaN(other.z)));
-  }
-
-  /**
    *  Returns a <code>String</code> of the form <I>(x,y,z)</I> .
    *
    *@return    a <code>String</code> of the form <I>(x,y,z)</I>
@@ -287,17 +315,29 @@ public class Coordinate implements Comparable, Cloneable, Serializable {
    * Computes the 2-dimensional Euclidean distance to another location.
    * The Z-ordinate is ignored.
    * 
-   * @param p a point
+   * @param c a point
    * @return the 2-dimensional Euclidean distance between the locations
    */
-  public double distance(Coordinate p) {
-    double dx = x - p.x;
-    double dy = y - p.y;
-
+  public double distance(Coordinate c) {
+    double dx = x - c.x;
+    double dy = y - c.y;
     return Math.sqrt(dx * dx + dy * dy);
   }
 
   /**
+   * Computes the 3-dimensional Euclidean distance to another location.
+   * 
+   * @param c a coordinate
+   * @return the 3-dimensional Euclidean distance between the locations
+   */
+  public double distance3D(Coordinate c) {
+    double dx = x - c.x;
+    double dy = y - c.y;
+    double dz = z - c.z;
+    return Math.sqrt(dx * dx + dy * dy + dz * dz);
+  }
+
+  /**
    * Gets a hashcode for this coordinate.
    * 
    * @return a hashcode for this coordinate
diff --git a/src/com/vividsolutions/jts/geom/CoordinateArrays.java b/src/com/vividsolutions/jts/geom/CoordinateArrays.java
index f4e38cb..dba958b 100644
--- a/src/com/vividsolutions/jts/geom/CoordinateArrays.java
+++ b/src/com/vividsolutions/jts/geom/CoordinateArrays.java
@@ -457,4 +457,33 @@ public class CoordinateArrays {
     return extractPts;
   }
 
+  /**
+   * Computes the envelope of the coordinates.
+   * 
+   * @param coordinates the coordinates to scan
+   * @return the envelope of the coordinates
+   */
+  public static Envelope envelope(Coordinate[] coordinates) {
+    Envelope env = new Envelope();
+    for (int i = 0; i < coordinates.length; i++) {
+      env.expandToInclude(coordinates[i]);
+    }
+    return env;
+  }
+  
+  /**
+   * Extracts the coordinates which intersect an {@link Envelope}.
+   * 
+   * @param coordinates the coordinates to scan
+   * @param env the envelope to intersect with
+   * @return an array of the coordinates which intersect the envelope
+   */
+  public static Coordinate[] intersection(Coordinate[] coordinates, Envelope env) {
+    CoordinateList coordList = new CoordinateList();
+    for (int i = 0; i < coordinates.length; i++) {
+      if (env.intersects(coordinates[i]))
+        coordList.add(coordinates[i], true);
+    }
+    return coordList.toCoordinateArray();
+  }
 }
diff --git a/src/com/vividsolutions/jts/geom/CoordinateFilter.java b/src/com/vividsolutions/jts/geom/CoordinateFilter.java
index d45e752..2706ffe 100644
--- a/src/com/vividsolutions/jts/geom/CoordinateFilter.java
+++ b/src/com/vividsolutions/jts/geom/CoordinateFilter.java
@@ -36,21 +36,28 @@ package com.vividsolutions.jts.geom;
 
 
 /**
- *  <code>Geometry</code> classes support the concept of applying a
- *  coordinate filter to every coordinate in the <code>Geometry</code>. A
- *  coordinate filter can either record information about each coordinate or
- *  change the coordinate in some way. Coordinate filters implement the
- *  interface <code>CoordinateFilter</code>. (<code>CoordinateFilter</code> is
- *  an example of the Gang-of-Four Visitor pattern). Coordinate filters can be
- *  used to implement such things as coordinate transformations, centroid and
- *  envelope computation, and many other functions.
+ *  An interface for classes which use the values of the coordinates in a {@link Geometry}. 
+ * Coordinate filters can be used to implement centroid and
+ * envelope computation, and many other functions.
+ * <p>
+ * <code>CoordinateFilter</code> is
+ * an example of the Gang-of-Four Visitor pattern. 
+ * <p>
+ * <b>Note</b>: it is not recommended to use these filters to mutate the coordinates.
+ * There is no guarantee that the coordinate is the actual object stored in the geometry.
+ * In particular, modified values may not be preserved if the target Geometry uses a non-default {@link CoordinateSequence}.
+ * If in-place mutation is required, use {@link CoordinateSequenceFilter}.
+ *  
+ * @see Geometry#apply(CoordinateFilter)
+ * @see CoordinateSequenceFilter
  *
  *@version 1.7
  */
 public interface CoordinateFilter {
 
   /**
-   *  Performs an operation with or on <code>coord</code>.
+   * Performs an operation with the <code>coord</code>.
+   * There is no guarantee that the coordinate is the actual object stored in the target geometry.
    *
    *@param  coord  a <code>Coordinate</code> to which the filter is applied.
    */
diff --git a/src/com/vividsolutions/jts/geom/CoordinateSequenceFactory.java b/src/com/vividsolutions/jts/geom/CoordinateSequenceFactory.java
index 3409982..be93710 100644
--- a/src/com/vividsolutions/jts/geom/CoordinateSequenceFactory.java
+++ b/src/com/vividsolutions/jts/geom/CoordinateSequenceFactory.java
@@ -65,6 +65,10 @@ public interface CoordinateSequenceFactory
    * Creates a {@link CoordinateSequence} of the specified size and dimension.
    * For this to be useful, the {@link CoordinateSequence} implementation must
    * be mutable.
+   * <p>
+   * If the requested dimension is larger than the CoordinateSequence implementation
+   * can provide, then a sequence of maximum possible dimension should be created.
+   * An error should not be thrown.
    *
    * @param size the number of coordinates in the sequence
    * @param dimension the dimension of the coordinates in the sequence (if user-specifiable,
diff --git a/src/com/vividsolutions/jts/geom/CoordinateSequenceFilter.java b/src/com/vividsolutions/jts/geom/CoordinateSequenceFilter.java
index cb3443e..ce98bd8 100644
--- a/src/com/vividsolutions/jts/geom/CoordinateSequenceFilter.java
+++ b/src/com/vividsolutions/jts/geom/CoordinateSequenceFilter.java
@@ -36,19 +36,31 @@ package com.vividsolutions.jts.geom;
 
 
 /**
- *  Interface for classes which provide operations that
- *  can be applied to the coordinates in a {@link CoordinateSequence}. 
- *  A CoordinateSequence filter can either record information about each coordinate or
- *  change the coordinate in some way. CoordinateSequence filters can be
- *  used to implement such things as coordinate transformations, centroid and
+ *  An interface for classes which process the coordinates in a {@link CoordinateSequence}. 
+ *  A filter can either record information about each coordinate,
+ *  or change the value of the coordinate. 
+ *  Filters can be
+ *  used to implement operations such as coordinate transformations, centroid and
  *  envelope computation, and many other functions.
- *  For maximum efficiency, the execution of filters can be short-circuited.
  *  {@link Geometry} classes support the concept of applying a
  *  <code>CoordinateSequenceFilter</code> to each 
  *  {@link CoordinateSequence}s they contain. 
  *  <p>
+ *  For maximum efficiency, the execution of filters can be short-circuited by using the {@link #isDone} method.
+ *  <p>
  *  <code>CoordinateSequenceFilter</code> is
- *  an example of the Gang-of-Four Visitor pattern. 
+ *  an example of the Gang-of-Four Visitor pattern.
+ *  <p> 
+ * <b>Note</b>: In general, it is preferable to treat Geometrys as immutable. 
+ * Mutation should be performed by creating a new Geometry object (see {@link GeometryEditor} 
+ * and {@link GeometryTransformer} for convenient ways to do this).
+ * An exception to this rule is when a new Geometry has been created via {@link Geometry#clone()}.
+ * In this case mutating the Geometry will not cause aliasing issues, 
+ * and a filter is a convenient way to implement coordinate transformation.
+ *  
+ * @see Geometry#apply(CoordinateFilter)
+ * @see GeometryTransformer
+ * @see GeometryEditor
  *
  *@see Geometry#apply(CoordinateSequenceFilter)
  *@author Martin Davis
diff --git a/src/com/vividsolutions/jts/geom/CoordinateSequences.java b/src/com/vividsolutions/jts/geom/CoordinateSequences.java
index 30a6873..f59ff5d 100644
--- a/src/com/vividsolutions/jts/geom/CoordinateSequences.java
+++ b/src/com/vividsolutions/jts/geom/CoordinateSequences.java
@@ -32,7 +32,8 @@
  */
 package com.vividsolutions.jts.geom;
 
-import java.util.*;
+import com.vividsolutions.jts.util.StringUtil;
+
 
 /**
  * Utility functions for manipulating {@link CoordinateSequence}s
@@ -56,9 +57,9 @@ public class CoordinateSequences {
   /**
    * Swaps two coordinates in a sequence.
    *
-   * @param seq
-   * @param i
-   * @param j
+   * @param seq the sequence to modify
+   * @param i the index of a coordinate to swap
+   * @param j the index of a coordinate to swap
    */
   public static void swap(CoordinateSequence seq, int i, int j)
   {
@@ -72,13 +73,14 @@ public class CoordinateSequences {
   
   /**
    * Copies a section of a {@link CoordinateSequence} to another {@link CoordinateSequence}.
-   * The sequences must have the same dimension.
+   * The sequences may have different dimensions;
+   * in this case only the common dimensions are copied.
    *
-   * @param src
-   * @param srcPos
-   * @param dest
-   * @param destPos
-   * @param length
+   * @param src the sequence to copy from
+   * @param srcPos the position in the source sequence to start copying at
+   * @param dest the sequence to copy to
+   * @param destPos the position in the destination sequence to copy to
+   * @param length the number of coordinates to copy
    */
   public static void copy(CoordinateSequence src, int srcPos, CoordinateSequence dest, int destPos, int length)
   {
@@ -89,16 +91,18 @@ public class CoordinateSequences {
 
   /**
    * Copies a coordinate of a {@link CoordinateSequence} to another {@link CoordinateSequence}.
-   * The sequences must have the same dimension.
+   * The sequences may have different dimensions;
+   * in this case only the common dimensions are copied.
    * 
-   * @param src
-   * @param srcPos
-   * @param dest
-   * @param destPos
+   * @param src the sequence to copy from
+   * @param srcPos the source coordinate to copy
+   * @param dest the sequence to copy to
+   * @param destPos the destination coordinate to copy to
    */
   public static void copyCoord(CoordinateSequence src, int srcPos, CoordinateSequence dest, int destPos)
   {
-		for (int dim = 0; dim < src.getDimension(); dim++) {
+    int minDim = Math.min(src.getDimension(), dest.getDimension());
+		for (int dim = 0; dim < minDim; dim++) {
 			dest.setOrdinate(destPos, dim, src.getOrdinate(srcPos, dim));
 		}
   }
@@ -176,5 +180,65 @@ public class CoordinateSequences {
     }
     return newseq;
   }
+
+  /**
+   * Tests whether two {@link CoordinateSequence}s are equal.
+   * To be equal, the sequences must be the same length.
+   * They do not need to be of the same dimension, 
+   * but the ordinate values for the smallest dimension of the two
+   * must be equal.
+   * Two <code>NaN</code> ordinates values are considered to be equal. 
+   * 
+   * @param cs1 a CoordinateSequence
+   * @param cs2 a CoordinateSequence
+   * @return true if the sequences are equal in the common dimensions
+   */
+  public static boolean isEqual(CoordinateSequence cs1, CoordinateSequence cs2) {
+    int cs1Size = cs1.size();
+    int cs2Size = cs2.size();
+    if (cs1Size != cs2Size) return false;
+    int dim = Math.min(cs1.getDimension(), cs2.getDimension());
+    for (int i = 0; i < cs1Size; i++) {
+      for (int d = 0; d < dim; d++) {
+        double v1 = cs1.getOrdinate(i, d);
+        double v2 = cs2.getOrdinate(i, d);
+        if (cs1.getOrdinate(i, d) == cs2.getOrdinate(i, d))
+          continue;
+        // special check for NaNs
+        if (Double.isNaN(v1) && Double.isNaN(v2))
+          continue;
+        return false;
+      }
+    }
+    return true;
+  }
   
+  /**
+   * Creates a string representation of a {@link CoordinateSequence}.
+   * The format is:
+   * <pre>
+   *   ( ord0,ord1.. ord0,ord1,...  ... )
+   * </pre>
+   * 
+   * @param cs the sequence to output
+   * @return the string representation of the sequence
+   */
+  public static String toString(CoordinateSequence cs)
+  {
+    int size = cs.size();
+    if (size == 0) 
+      return "()";
+    int dim = cs.getDimension();
+    StringBuffer buf = new StringBuffer();
+    buf.append('(');
+    for (int i = 0; i < size; i++) {
+      if (i > 0) buf.append(" ");
+      for (int d = 0; d < dim; d++) {
+        if (d > 0) buf.append(",");
+        buf.append(StringUtil.toString(cs.getOrdinate(i, d)));
+      }
+    }
+    buf.append(')');
+    return buf.toString();
+  }
 }
\ No newline at end of file
diff --git a/src/com/vividsolutions/jts/geom/Envelope.java b/src/com/vividsolutions/jts/geom/Envelope.java
index f251e2c..a3b27a8 100644
--- a/src/com/vividsolutions/jts/geom/Envelope.java
+++ b/src/com/vividsolutions/jts/geom/Envelope.java
@@ -1,5 +1,3 @@
-
-
 /*
  * The JTS Topology Suite is a collection of Java classes that
  * implement the fundamental operations required to validate a given
@@ -41,8 +39,9 @@ import java.io.Serializable;
  *  It is often used to represent the bounding box of a {@link Geometry},
  *  e.g. the minimum and maximum x and y values of the {@link Coordinate}s.
  *  <p>
- *  Note that Envelopes support infinite or half-infinite regions, by using the values of
+ *  Envelopes support infinite or half-infinite regions, by using the values of
  *  <code>Double.POSITIVE_INFINITY</code> and <code>Double.NEGATIVE_INFINITY</code>.
+ *  Envelope objects may have a null value.
  *  <p>
  *  When Envelope objects are created or initialized,
  *  the supplies extent values are automatically sorted into the correct order.
@@ -50,7 +49,7 @@ import java.io.Serializable;
  *@version 1.7
  */
 public class Envelope
-    implements Serializable
+    implements Comparable, Serializable
 {
     private static final long serialVersionUID = 5873921885273102420L;
 
@@ -744,5 +743,37 @@ public class Envelope
   {
     return "Env[" + minx + " : " + maxx + ", " + miny + " : " + maxy + "]";
   }
+
+  /**
+   * Compares two envelopes using lexicographic ordering.
+   * The ordering comparison is based on the usual numerical
+   * comparison between the sequence of ordinates.
+   * Null envelopes are less than all non-null envelopes.
+   * 
+   * @param o an Envelope object
+   */
+  public int compareTo(Object o) {
+    Envelope env = (Envelope) o;
+    // compare nulls if present
+    if (isNull()) {
+      if (env.isNull()) return 0;
+      return -1;
+    }
+    else {
+      if (env.isNull()) return 1;
+    }
+    // compare based on numerical ordering of ordinates
+    if (minx < env.minx) return -1;
+    if (minx > env.minx) return 1;
+    if (miny < env.miny) return -1;
+    if (miny > env.miny) return 1;
+    if (maxx < env.maxx) return -1;
+    if (maxx > env.maxx) return 1;
+    if (maxy < env.maxy) return -1;
+    if (maxy > env.maxy) return 1;
+    return 0;
+    
+    
+  }
 }
 
diff --git a/src/com/vividsolutions/jts/geom/Geometry.java b/src/com/vividsolutions/jts/geom/Geometry.java
index ba0357f..7d864b7 100644
--- a/src/com/vividsolutions/jts/geom/Geometry.java
+++ b/src/com/vividsolutions/jts/geom/Geometry.java
@@ -88,8 +88,8 @@ import com.vividsolutions.jts.util.Assert;
  *
  *  The SFS does not specify an unambiguous representation of a given point set
  *  returned from a spatial analysis method. One goal of JTS is to make this
- *  specification precise and unambiguous. JTS will use a canonical form for
- *  <code>Geometry</code>s returned from spatial analysis methods. The canonical
+ *  specification precise and unambiguous. JTS uses a canonical form for
+ *  <code>Geometry</code>s returned from overlay methods. The canonical
  *  form is a <code>Geometry</code> which is simple and noded:
  *  <UL>
  *    <LI> Simple means that the Geometry returned will be simple according to
@@ -172,7 +172,15 @@ public abstract class Geometry
 {
   private static final long serialVersionUID = 8763622679187376702L;
     
-  private static Class[] sortedClasses;  
+  private static final Class[] sortedClasses = new Class[] { 
+    Point.class, 
+    MultiPoint.class,
+    LineString.class, 
+    LinearRing.class, 
+    MultiLineString.class,
+    Polygon.class, 
+    MultiPolygon.class, 
+    GeometryCollection.class };  
   
   private final static GeometryComponentFilter geometryChangedFilter = new GeometryComponentFilter() {
     public void filter(Geometry geom) {
@@ -525,25 +533,8 @@ public abstract class Geometry
   {
     if (isEmpty()) 
       return factory.createPoint((Coordinate) null);
-    Coordinate centPt = null;
-    int dim = getDimension();
-    if (dim == 0) {
-      CentroidPoint cent = new CentroidPoint();
-      cent.add(this);
-      centPt = cent.getCentroid();
-    }
-    else if (dim == 1) {
-      CentroidLine cent = new CentroidLine();
-      cent.add(this);
-      centPt = cent.getCentroid();
-    }
-    else {
-      CentroidArea cent = new CentroidArea();
-      cent.add(this);
-      centPt = cent.getCentroid();
-    }
+    Coordinate centPt = Centroid.getCentroid(this);
     return createPointFromInternalCoord(centPt, this);
-
   }
 
   /**
@@ -708,7 +699,8 @@ public abstract class Geometry
    * <p>
    * The <code>touches</code> predicate has the following equivalent definitions:
    * <ul>
-   * <li>The geometries have at least one point in common, but their interiors do not intersect.
+   * <li>The geometries have at least one point in common, 
+   * but their interiors do not intersect.
    * <li>The DE-9IM Intersection Matrix for the two geometries matches
    * at least one of the following patterns
    *  <ul>
@@ -717,7 +709,9 @@ public abstract class Geometry
    *   <li><code>[F***T****]</code>
    *  </ul>
    * </ul>
-   * If both geometries have dimension 0, this predicate returns <code>false</code>.
+   * If both geometries have dimension 0, the predicate returns <code>false</code>,
+   * since points have only interiors.
+   * This predicate is symmetric.
    * 
    *
    *@param  g  the <code>Geometry</code> with which to compare this <code>Geometry</code>
@@ -905,6 +899,7 @@ public abstract class Geometry
    *   or <code>[1*T***T**]</code> (for two curves)
    * </ul>
    * If the geometries are of different dimension this predicate returns <code>false</code>.
+   * This predicate is symmetric.
    *
    *@param  g  the <code>Geometry</code> with which to compare this <code>Geometry</code>
    *@return        <code>true</code> if the two <code>Geometry</code>s overlap.
@@ -1053,6 +1048,7 @@ public abstract class Geometry
    *@see #equalsTopo(Geometry)
    */
   public boolean equals(Geometry g) {
+    if (g == null) return false;
     return equalsTopo(g);
   }
 
@@ -1462,7 +1458,7 @@ public abstract class Geometry
 	/**
 	 * Computes the union of all the elements of this geometry. 
 	 * <p>
-	 * <code>union()</code> supports
+	 * This method supports
 	 * {@link GeometryCollection}s 
 	 * (which the other overlay operations currently do not).
 	 * <p>
@@ -1470,13 +1466,13 @@ public abstract class Geometry
 	 * <ul>
 	 * <li>Unioning a set of {@link LineString}s has the effect of fully noding
 	 * and dissolving the linework.
-	 * <li>Unioning a set of {@link Polygon}s will always 
-	 * return a {@link Polygonal} geometry (unlike {@link #union(Geometry)},
-	 * which may return geometrys of lower dimension if a topology collapse occurred.
+	 * <li>Unioning a set of {@link Polygon}s always 
+	 * returns a {@link Polygonal} geometry (unlike {@link #union(Geometry)},
+	 * which may return geometries of lower dimension if a topology collapse occurred).
 	 * </ul>
 	 * 
 	 * @return the union geometry
-   * @throws TopologyException if a robustness error occurs
+     * @throws TopologyException if a robustness error occurs
 	 * 
 	 * @see UnaryUnionOp
 	 */
@@ -1541,7 +1537,10 @@ public abstract class Geometry
    * @see #normalize()
    * @see #norm()
    */
-  public boolean equalsExact(Geometry other) { return equalsExact(other, 0); }
+  public boolean equalsExact(Geometry other) 
+  { 
+    return this == other || equalsExact(other, 0);
+  }
 
   /**
    * Tests whether two geometries are exactly equal
@@ -1871,9 +1870,6 @@ public abstract class Geometry
   }
 
   private int getClassSortIndex() {
-		if (sortedClasses == null)
-			initSortedClasses();
-
 		for (int i = 0; i < sortedClasses.length; i++) {
 			if (sortedClasses[i].isInstance(this))
 				return i;
@@ -1882,19 +1878,6 @@ public abstract class Geometry
 		return -1;
 	}
 
-  private static void initSortedClasses()
-  {
-		sortedClasses = new Class[] { 
-					Point.class, 
-					MultiPoint.class,
-					LineString.class, 
-					LinearRing.class, 
-					MultiLineString.class,
-					Polygon.class, 
-					MultiPolygon.class, 
-					GeometryCollection.class };
-  }
-  
   private Point createPointFromInternalCoord(Coordinate coord, Geometry exemplar)
   {
     exemplar.getPrecisionModel().makePrecise(coord);
diff --git a/src/com/vividsolutions/jts/geom/GeometryCollectionIterator.java b/src/com/vividsolutions/jts/geom/GeometryCollectionIterator.java
index 4a6eed7..bd44ee0 100644
--- a/src/com/vividsolutions/jts/geom/GeometryCollectionIterator.java
+++ b/src/com/vividsolutions/jts/geom/GeometryCollectionIterator.java
@@ -119,6 +119,8 @@ public class GeometryCollectionIterator implements Iterator {
     // the parent GeometryCollection is the first object returned
     if (atStart) {
       atStart = false;
+      if (isAtomic(parent))
+        index++;
       return parent;
     }
     if (subcollectionIterator != null) {
@@ -141,6 +143,11 @@ public class GeometryCollectionIterator implements Iterator {
     return obj;
   }
 
+  private static boolean isAtomic(Geometry geom)
+  {
+    return ! (geom instanceof GeometryCollection);
+  }
+  
   /**
    * Removal is not supported.
    *
diff --git a/src/com/vividsolutions/jts/geom/GeometryFactory.java b/src/com/vividsolutions/jts/geom/GeometryFactory.java
index 1771008..a5e8d1e 100644
--- a/src/com/vividsolutions/jts/geom/GeometryFactory.java
+++ b/src/com/vividsolutions/jts/geom/GeometryFactory.java
@@ -264,14 +264,19 @@ public class GeometryFactory
   /**
    * Returns the PrecisionModel that Geometries created by this factory
    * will be associated with.
+   * 
+   * @return the PrecisionModel for this factory
    */
   public PrecisionModel getPrecisionModel() {
     return precisionModel;
   }
 
   /**
-   * Creates a Point using the given Coordinate; a null Coordinate will create
-   * an empty Geometry.
+   * Creates a Point using the given Coordinate.
+   * A null Coordinate creates an empty Geometry.
+   * 
+   * @param coordinate a Coordinate, or null
+   * @return the created Point
    */
   public Point createPoint(Coordinate coordinate) {
     return createPoint(coordinate != null ? getCoordinateSequenceFactory().create(new Coordinate[]{coordinate}) : null);
@@ -280,6 +285,9 @@ public class GeometryFactory
   /**
    * Creates a Point using the given CoordinateSequence; a null or empty
    * CoordinateSequence will create an empty Point.
+   * 
+   * @param coordinates a CoordinateSequence (possibly empty), or null
+   * @return the created Point
    */
   public Point createPoint(CoordinateSequence coordinates) {
   	return new Point(coordinates, this);
@@ -288,7 +296,9 @@ public class GeometryFactory
   /**
    * Creates a MultiLineString using the given LineStrings; a null or empty
    * array will create an empty MultiLineString.
+   * 
    * @param lineStrings LineStrings, each of which may be empty but not null
+   * @return the created MultiLineString
    */
   public MultiLineString createMultiLineString(LineString[] lineStrings) {
   	return new MultiLineString(lineStrings, this);
@@ -297,7 +307,9 @@ public class GeometryFactory
   /**
    * Creates a GeometryCollection using the given Geometries; a null or empty
    * array will create an empty GeometryCollection.
-   * @param geometries Geometries, each of which may be empty but not null
+   * 
+   * @param geometries an array of Geometries, each of which may be empty but not null, or null
+   * @return the created GeometryCollection
    */
   public GeometryCollection createGeometryCollection(Geometry[] geometries) {
   	return new GeometryCollection(geometries, this);
@@ -312,6 +324,7 @@ public class GeometryFactory
    *
    * @param polygons
    *            Polygons, each of which may be empty but not null
+   * @return the created MultiPolygon
    */
   public MultiPolygon createMultiPolygon(Polygon[] polygons) {
     return new MultiPolygon(polygons, this);
@@ -319,10 +332,11 @@ public class GeometryFactory
 
   /**
    * Creates a {@link LinearRing} using the given {@link Coordinate}s.
-   * A null or empty array will
-   * create an empty LinearRing. The points must form a closed and simple
-   * linestring. Consecutive points must not be equal.
+   * A null or empty array creates an empty LinearRing. 
+   * The points must form a closed and simple linestring. 
    * @param coordinates an array without null elements, or an empty array, or null
+   * @return the created LinearRing
+   * @throws IllegalArgumentException if the ring is not closed, or has too few points
    */
   public LinearRing createLinearRing(Coordinate[] coordinates) {
     return createLinearRing(coordinates != null ? getCoordinateSequenceFactory().create(coordinates) : null);
@@ -330,11 +344,11 @@ public class GeometryFactory
 
   /**
    * Creates a {@link LinearRing} using the given {@link CoordinateSequence}. 
-   * A null or empty CoordinateSequence will
-   * create an empty LinearRing. The points must form a closed and simple
-   * linestring. Consecutive points must not be equal.
+   * A null or empty array creates an empty LinearRing. 
+   * The points must form a closed and simple linestring. 
    * 
-   * @param coordinates a CoordinateSequence possibly empty, or null
+   * @param coordinates a CoordinateSequence (possibly empty), or null
+   * @return the created LinearRing
    * @throws IllegalArgumentException if the ring is not closed, or has too few points
    */
   public LinearRing createLinearRing(CoordinateSequence coordinates) {
@@ -523,17 +537,19 @@ public class GeometryFactory
   }
 
   /**
-   * Creates a LineString using the given Coordinates; a null or empty array will
-   * create an empty LineString. Consecutive points must not be equal.
+   * Creates a LineString using the given Coordinates.
+   * A null or empty array creates an empty LineString. 
+   * 
    * @param coordinates an array without null elements, or an empty array, or null
    */
   public LineString createLineString(Coordinate[] coordinates) {
     return createLineString(coordinates != null ? getCoordinateSequenceFactory().create(coordinates) : null);
   }
   /**
-   * Creates a LineString using the given CoordinateSequence; a null or empty CoordinateSequence will
-   * create an empty LineString. Consecutive points must not be equal.
-   * @param coordinates a CoordinateSequence possibly empty, or null
+   * Creates a LineString using the given CoordinateSequence.
+   * A null or empty CoordinateSequence creates an empty LineString. 
+   * 
+   * @param coordinates a CoordinateSequence (possibly empty), or null
    */
   public LineString createLineString(CoordinateSequence coordinates) {
 	return new LineString(coordinates, this);
@@ -565,18 +581,12 @@ public class GeometryFactory
           }
     });
   }
-  /*
-  public Geometry OLDcreateGeometry(Geometry g)
-  {
-    GeometryEditor editor = new GeometryEditor(this);
-    return editor.edit(g, new GeometryEditor.CoordinateOperation() {
-      public Coordinate[] edit(Coordinate[] coordinates, Geometry geometry) {
-                  return coordinates;
-          }
-    });
-  }
-*/
 
+  /**
+   * Gets the SRID value defined for this factory.
+   * 
+   * @return the factory SRID value
+   */
   public int getSRID() {
     return SRID;
   }
diff --git a/src/com/vividsolutions/jts/geom/LineSegment.java b/src/com/vividsolutions/jts/geom/LineSegment.java
index 8174902..3aae05b 100644
--- a/src/com/vividsolutions/jts/geom/LineSegment.java
+++ b/src/com/vividsolutions/jts/geom/LineSegment.java
@@ -95,6 +95,38 @@ public class LineSegment
   }
 
   /**
+   * Gets the minimum X ordinate.
+   * @return the minimum X ordinate
+   */
+  public double minX() {
+    return Math.min(p0.x, p1.x);
+  }
+  
+  /**
+   * Gets the maximum X ordinate.
+   * @return the maximum X ordinate
+   */
+  public double maxX() {
+    return Math.max(p0.x, p1.x);
+  }
+
+  /**
+   * Gets the minimum Y ordinate.
+   * @return the minimum Y ordinate
+   */
+  public double minY() {
+    return Math.min(p0.y, p1.y);
+  }
+  
+  /**
+   * Gets the maximum Y ordinate.
+   * @return the maximum Y ordinate
+   */
+  public double maxY() {
+    return Math.max(p0.y, p1.y);
+  }
+
+  /**
    * Computes the length of the line segment.
    * @return the length of the line segment
    */
@@ -134,7 +166,7 @@ public class LineSegment
    *
    * @return 1 if <code>seg</code> is to the left of this segment
    * @return -1 if <code>seg</code> is to the right of this segment
-   * @return 0 if <code>seg</code> has indeterminate orientation relative to this segment
+   * @return 0 if <code>seg</code> is collinear to or crosses this segment
    */
   public int orientationIndex(LineSegment seg)
   {
diff --git a/src/com/vividsolutions/jts/geom/LineString.java b/src/com/vividsolutions/jts/geom/LineString.java
index 644a5ad..f669a75 100644
--- a/src/com/vividsolutions/jts/geom/LineString.java
+++ b/src/com/vividsolutions/jts/geom/LineString.java
@@ -65,7 +65,7 @@ public class LineString
   /**
    *  Constructs a <code>LineString</code> with the given points.
    *
-   *@param  points          the points of the linestring, or <code>null</code>
+   *@param  points the points of the linestring, or <code>null</code>
    *      to create the empty geometry. This array must not contain <code>null</code>
    *      elements. Consecutive points may be equal.
    *@param  precisionModel  the specification of the grid of allowable points
@@ -84,8 +84,8 @@ public class LineString
   /**
    * Constructs a <code>LineString</code> with the given points.
    *  
-   *@param  points          the points of the linestring, or <code>null</code>
-   *      to create the empty geometry. Consecutive points may not be equal.
+   *@param  points the points of the linestring, or <code>null</code>
+   *      to create the empty geometry. 
    * @throws IllegalArgumentException if too few points are provided
    */
   public LineString(CoordinateSequence points, GeometryFactory factory) {
@@ -299,7 +299,7 @@ public class LineString
         // skip equal points on both ends
         if (!points.getCoordinate(i).equals(points.getCoordinate(j))) {
           if (points.getCoordinate(i).compareTo(points.getCoordinate(j)) > 0) {
-            CoordinateArrays.reverse(getCoordinates());
+            CoordinateSequences.reverse(points);
           }
           return;
         }
diff --git a/src/com/vividsolutions/jts/geom/OctagonalEnvelope.java b/src/com/vividsolutions/jts/geom/OctagonalEnvelope.java
index 9bc2d47..d2d03dc 100644
--- a/src/com/vividsolutions/jts/geom/OctagonalEnvelope.java
+++ b/src/com/vividsolutions/jts/geom/OctagonalEnvelope.java
@@ -33,16 +33,26 @@
 package com.vividsolutions.jts.geom;
 
 /**
- * A Bounding Container which is in the shape of an octagon.
+ * A bounding container for a {@link Geometry} which is in the shape of a general octagon.
  * The OctagonalEnvelope of a geometric object
- * is tight along the four extremal rectilineal parallels
- * and along the four extremal diagonal parallels.
+ * is a geometry which is a tight bound
+ * along the (up to) four extremal rectilinear parallels
+ * and along the (up to) four extremal diagonal parallels.
  * Depending on the shape of the contained
  * geometry, the octagon may be degenerate to any extreme
  * (e.g. it may be a rectangle, a line, or a point).
  */
 public class OctagonalEnvelope
 {
+  /**
+   * Gets the octagonal envelope of a geometry
+   * @param geom the geometry
+   * @return the octagonal envelope of the geometry
+   */
+  public static Geometry octagonalEnvelope(Geometry geom) {
+    return (new OctagonalEnvelope(geom)).toGeometry(geom.getFactory());
+  }
+  
   private static double computeA(double x, double y)
   {
     return x + y;
@@ -74,6 +84,8 @@ public class OctagonalEnvelope
 
   /**
    * Creates a new null bounding octagon bounding a {@link Coordinate}
+   * 
+   * @param p the coordinate to bound
    */
   public OctagonalEnvelope(Coordinate p)
   {
@@ -82,6 +94,9 @@ public class OctagonalEnvelope
 
   /**
    * Creates a new null bounding octagon bounding a pair of {@link Coordinate}s
+   * 
+   * @param p1 a coordinate to bound
+   * @param p2 a coordinate to bound
    */
   public OctagonalEnvelope(Coordinate p0, Coordinate p1)
   {
diff --git a/src/com/vividsolutions/jts/geom/Point.java b/src/com/vividsolutions/jts/geom/Point.java
index f721e6c..8a72ebf 100644
--- a/src/com/vividsolutions/jts/geom/Point.java
+++ b/src/com/vividsolutions/jts/geom/Point.java
@@ -104,7 +104,7 @@ public class Point
   }
 
   public boolean isEmpty() {
-    return getCoordinate() == null;
+    return coordinates.size() == 0;
   }
 
   public boolean isSimple() {
diff --git a/src/com/vividsolutions/jts/geom/impl/CoordinateArraySequence.java b/src/com/vividsolutions/jts/geom/impl/CoordinateArraySequence.java
index b38f665..84b4f1a 100644
--- a/src/com/vividsolutions/jts/geom/impl/CoordinateArraySequence.java
+++ b/src/com/vividsolutions/jts/geom/impl/CoordinateArraySequence.java
@@ -125,12 +125,13 @@ public class CoordinateArraySequence
    */
   public CoordinateArraySequence(CoordinateSequence coordSeq)
   {
-    if (coordSeq != null) {
-      dimension = coordSeq.getDimension();
-      coordinates = new Coordinate[coordSeq.size()];
-    }
-    else
+    // NOTE: this will make a sequence of the default dimension
+    if (coordSeq == null) {
       coordinates = new Coordinate[0];
+      return;
+    }
+    dimension = coordSeq.getDimension();
+    coordinates = new Coordinate[coordSeq.size()];
 
     for (int i = 0; i < coordinates.length; i++) {
       coordinates[i] = coordSeq.getCoordinateCopy(i);
@@ -209,7 +210,7 @@ public class CoordinateArraySequence
     for (int i = 0; i < coordinates.length; i++) {
       cloneCoordinates[i] = (Coordinate) coordinates[i].clone();
     }
-    return new CoordinateArraySequence(cloneCoordinates);
+    return new CoordinateArraySequence(cloneCoordinates, dimension);
   }
   /**
    * Returns the size of the coordinate sequence
diff --git a/src/com/vividsolutions/jts/geom/impl/CoordinateArraySequenceFactory.java b/src/com/vividsolutions/jts/geom/impl/CoordinateArraySequenceFactory.java
index d9bd729..2f553b5 100644
--- a/src/com/vividsolutions/jts/geom/impl/CoordinateArraySequenceFactory.java
+++ b/src/com/vividsolutions/jts/geom/impl/CoordinateArraySequenceFactory.java
@@ -44,7 +44,7 @@ public final class CoordinateArraySequenceFactory
     implements CoordinateSequenceFactory, Serializable
 {
   private static final long serialVersionUID = -4099577099607551657L;
-  private static CoordinateArraySequenceFactory instanceObject = new CoordinateArraySequenceFactory();
+  private static final CoordinateArraySequenceFactory instanceObject = new CoordinateArraySequenceFactory();
 
   private CoordinateArraySequenceFactory() {
   }
@@ -81,13 +81,19 @@ public final class CoordinateArraySequenceFactory
   }
 
   /**
+   * The created sequence dimension is clamped to be <= 3. 
+   * 
    * @see com.vividsolutions.jts.geom.CoordinateSequenceFactory#create(int, int)
    *
-   * @throws IllegalArgumentException if the dimension is > 3
    */
   public CoordinateSequence create(int size, int dimension) {
     if (dimension > 3)
-      throw new IllegalArgumentException("dimension must be <= 3");
+      dimension = 3;
+      //throw new IllegalArgumentException("dimension must be <= 3");
+    // handle bogus dimension
+    if (dimension < 2)
+    	// TODO: change to dimension = 2  ???
+      return new CoordinateArraySequence(size);
     return new CoordinateArraySequence(size, dimension);
   }
 }
\ No newline at end of file
diff --git a/src/com/vividsolutions/jts/geom/impl/PackedCoordinateSequence.java b/src/com/vividsolutions/jts/geom/impl/PackedCoordinateSequence.java
index 5b38d90..e2d3f0e 100644
--- a/src/com/vividsolutions/jts/geom/impl/PackedCoordinateSequence.java
+++ b/src/com/vividsolutions/jts/geom/impl/PackedCoordinateSequence.java
@@ -175,6 +175,11 @@ public abstract class PackedCoordinateSequence
     setOrdinate(index, 1, value);
   }
 
+  public String toString()
+  {
+    return CoordinateSequences.toString(this);
+  }
+
   /**
    * Returns a Coordinate representation of the specified coordinate, by always
    * building a new Coordinate object
@@ -458,9 +463,9 @@ public abstract class PackedCoordinateSequence
 
     /**
      * @see com.vividsolutions.jts.geom.CoordinateSequence#getOrdinate(int, int)
-     *      Beware, for performace reasons the ordinate index is not checked, if
-     *      it's over dimensions you may not get an exception but a meaningless
-     *      value.
+     *      For performance reasons the ordinate index is not checked.
+     *      If it is larger than the dimension a meaningless
+     *      value may be returned.
      */
     public double getOrdinate(int index, int ordinate) {
       return coords[index * dimension + ordinate];
diff --git a/src/com/vividsolutions/jts/geom/impl/package.html b/src/com/vividsolutions/jts/geom/impl/package.html
deleted file mode 100644
index ba95a7d..0000000
--- a/src/com/vividsolutions/jts/geom/impl/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Implementations of interfaces for geometric structures.
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/geom/package.html b/src/com/vividsolutions/jts/geom/package.html
deleted file mode 100644
index 75639f1..0000000
--- a/src/com/vividsolutions/jts/geom/package.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Contains the <CODE>Geometry</CODE> interface hierarchy and supporting classes.
-<P>
-The Java Topology Suite (JTS) is a Java API that implements a core set of spatial data operations using an explicit precision model and robust geometric algorithms. JTS is intended to be used in the development of applications that support the validation, cleaning, integration and querying of spatial datasets.
-<P>
-JTS attempts to implement the OpenGIS Simple Features Specification (SFS) as accurately as possible.  In some cases the SFS is unclear or omits a specification; in this case JTS attempts to choose a reasonable and consistent alternative.  Differences from and elaborations of the SFS are documented in this specification.
-
-<h2>Package Specification</h2>
-
-<ul>
-  <li>Java Topology Suite Technical Specifications
-  <li><A HREF="http://www.opengis.org/techno/specs.htm">
-      OpenGIS Simple Features Specification for SQL</A>
-</ul>
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/geom/prep/AbstractPreparedPolygonContains.java b/src/com/vividsolutions/jts/geom/prep/AbstractPreparedPolygonContains.java
index 42e3077..009dbec 100644
--- a/src/com/vividsolutions/jts/geom/prep/AbstractPreparedPolygonContains.java
+++ b/src/com/vividsolutions/jts/geom/prep/AbstractPreparedPolygonContains.java
@@ -224,8 +224,7 @@ abstract class AbstractPreparedPolygonContains
 	{
     List lineSegStr = SegmentStringUtil.extractSegmentStrings(geom);
     
-	  LineIntersector li = new RobustLineIntersector();
-		SegmentIntersectionDetector intDetector = new SegmentIntersectionDetector(li);
+		SegmentIntersectionDetector intDetector = new SegmentIntersectionDetector();
 		intDetector.setFindAllIntersectionTypes(true);
 		prepPoly.getIntersectionFinder().intersects(lineSegStr, intDetector);
 			
diff --git a/src/com/vividsolutions/jts/geom/prep/BasicPreparedGeometry.java b/src/com/vividsolutions/jts/geom/prep/BasicPreparedGeometry.java
index 7cf3b2f..047e66c 100644
--- a/src/com/vividsolutions/jts/geom/prep/BasicPreparedGeometry.java
+++ b/src/com/vividsolutions/jts/geom/prep/BasicPreparedGeometry.java
@@ -53,12 +53,12 @@ import com.vividsolutions.jts.geom.util.ComponentCoordinateExtracter;
 class BasicPreparedGeometry 
   implements PreparedGeometry
 {
-  private Geometry baseGeom;
-  private List representativePts;  // List<Coordinate>
+  private final Geometry baseGeom;
+  private final List representativePts;  // List<Coordinate>
 
   public BasicPreparedGeometry(Geometry geom) 
   {
-    this.baseGeom = geom;
+    baseGeom = geom;
     representativePts = ComponentCoordinateExtracter.getCoordinates(geom);
   }
 
@@ -67,12 +67,15 @@ class BasicPreparedGeometry
   /**
    * Gets the list of representative points for this geometry.
    * One vertex is included for every component of the geometry
-   * (i.e. including one for every ring of polygonal geometries) 
+   * (i.e. including one for every ring of polygonal geometries).
+   * 
+   * Do not modify the returned list!
    * 
    * @return a List of Coordinate
    */
   public List getRepresentativePoints()
   {
+	//TODO wrap in unmodifiable?
     return representativePts;
   }
   
diff --git a/src/com/vividsolutions/jts/geom/prep/PreparedLineStringIntersects.java b/src/com/vividsolutions/jts/geom/prep/PreparedLineStringIntersects.java
index d203d0f..2ef1a4b 100644
--- a/src/com/vividsolutions/jts/geom/prep/PreparedLineStringIntersects.java
+++ b/src/com/vividsolutions/jts/geom/prep/PreparedLineStringIntersects.java
@@ -113,7 +113,6 @@ class PreparedLineStringIntersects
 		if (geom.getDimension() == 0)
 			return isAnyTestPointInTarget(geom);
 		
-//		return prepLine.getGeometry().intersects(geom);
 		return false;
 	}
 	  
diff --git a/src/com/vividsolutions/jts/geom/prep/PreparedPolygon.java b/src/com/vividsolutions/jts/geom/prep/PreparedPolygon.java
index fa43fd9..17be76f 100644
--- a/src/com/vividsolutions/jts/geom/prep/PreparedPolygon.java
+++ b/src/com/vividsolutions/jts/geom/prep/PreparedPolygon.java
@@ -45,7 +45,7 @@ import com.vividsolutions.jts.operation.predicate.*;
  * This class does <b>not</b> support MultiPolygons which are non-valid 
  * (e.g. with overlapping elements). 
  * <p>
- * Instances of this class are thread-safe.
+ * Instances of this class are thread-safe and immutable.
  * 
  * @author mbdavis
  *
@@ -53,10 +53,10 @@ import com.vividsolutions.jts.operation.predicate.*;
 public class PreparedPolygon
   extends BasicPreparedGeometry
 {
-	private boolean isRectangle = false;
+	private final boolean isRectangle;
 	// create these lazily, since they are expensive
-  private FastSegmentSetIntersectionFinder segIntFinder = null;
-  private PointOnGeometryLocator pia = null;
+	private FastSegmentSetIntersectionFinder segIntFinder = null;
+	private PointOnGeometryLocator pia = null;
 
   public PreparedPolygon(Polygonal poly) {
     super((Geometry) poly);
@@ -78,7 +78,7 @@ public class PreparedPolygon
   	 */
   	if (segIntFinder == null)
   		segIntFinder = new FastSegmentSetIntersectionFinder(SegmentStringUtil.extractSegmentStrings(getGeometry()));
-   return segIntFinder;
+  	return segIntFinder;
   }
   
   public synchronized PointOnGeometryLocator getPointLocator()
diff --git a/src/com/vividsolutions/jts/geom/prep/PreparedPolygonIntersects.java b/src/com/vividsolutions/jts/geom/prep/PreparedPolygonIntersects.java
index 520d572..41f71a1 100644
--- a/src/com/vividsolutions/jts/geom/prep/PreparedPolygonIntersects.java
+++ b/src/com/vividsolutions/jts/geom/prep/PreparedPolygonIntersects.java
@@ -32,89 +32,95 @@
  */
 package com.vividsolutions.jts.geom.prep;
 
-import java.util.*;
+import java.util.List;
 
-
-import com.vividsolutions.jts.algorithm.*;
-import com.vividsolutions.jts.geom.*;
-import com.vividsolutions.jts.noding.*;
-import com.vividsolutions.jts.geom.util.*;
+import com.vividsolutions.jts.geom.Geometry;
+import com.vividsolutions.jts.noding.SegmentStringUtil;
 
 /**
- * Computes the <tt>intersects</tt> spatial relationship predicate
- * for {@link PreparedPolygon}s relative to all other {@link Geometry} classes.
- * Uses short-circuit tests and indexing to improve performance. 
+ * Computes the <tt>intersects</tt> spatial relationship predicate for
+ * {@link PreparedPolygon}s relative to all other {@link Geometry} classes. Uses
+ * short-circuit tests and indexing to improve performance.
  * 
  * @author Martin Davis
- *
+ * 
  */
-class PreparedPolygonIntersects 
-	extends PreparedPolygonPredicate
-{
-	/**
-	 * Computes the intersects predicate between a {@link PreparedPolygon}
-	 * and a {@link Geometry}.
-	 * 
-	 * @param prep the prepared polygon
-	 * @param geom a test geometry
-	 * @return true if the polygon intersects the geometry
-	 */
-	public static boolean intersects(PreparedPolygon prep, Geometry geom)
-	{
+class PreparedPolygonIntersects extends PreparedPolygonPredicate {
+  /**
+   * Computes the intersects predicate between a {@link PreparedPolygon} and a
+   * {@link Geometry}.
+   * 
+   * @param prep
+   *          the prepared polygon
+   * @param geom
+   *          a test geometry
+   * @return true if the polygon intersects the geometry
+   */
+  public static boolean intersects(PreparedPolygon prep, Geometry geom) {
     PreparedPolygonIntersects polyInt = new PreparedPolygonIntersects(prep);
     return polyInt.intersects(geom);
-	}
-	
+  }
+
   /**
    * Creates an instance of this operation.
    * 
-   * @param prepPoly the PreparedPolygon to evaluate
+   * @param prepPoly
+   *          the PreparedPolygon to evaluate
+   */
+  public PreparedPolygonIntersects(PreparedPolygon prepPoly) {
+    super(prepPoly);
+  }
+
+  /**
+   * Tests whether this PreparedPolygon intersects a given geometry.
+   * 
+   * @param geom
+   *          the test geometry
+   * @return true if the test geometry intersects
    */
-	public PreparedPolygonIntersects(PreparedPolygon prepPoly)
-	{
-		super(prepPoly);
-	}
-	
-	/**
-	 * Tests whether this PreparedPolygon intersects a given geometry.
-	 * 
-	 * @param geom the test geometry
-	 * @return true if the test geometry intersects
-	 */
-	public boolean intersects(Geometry geom)
-	{
-		/**
-		 * Do point-in-poly tests first, since they are cheaper and may result
-		 * in a quick positive result.
-		 * 
-		 * If a point of any test components lie in target, result is true
-		 */
-		boolean isInPrepGeomArea = isAnyTestComponentInTarget(geom);
-		if (isInPrepGeomArea) return true;
-		
-		/**
-		 * If any segments intersect, result is true
-		 */
+  public boolean intersects(Geometry geom) {
+    /**
+     * Do point-in-poly tests first, since they are cheaper and may result in a
+     * quick positive result.
+     * 
+     * If a point of any test components lie in target, result is true
+     */
+    boolean isInPrepGeomArea = isAnyTestComponentInTarget(geom);
+    if (isInPrepGeomArea)
+      return true;
+    /**
+     * If input contains only points, then at
+     * this point it is known that none of them are contained in the target
+     */
+    if (geom.getDimension() == 0)
+      return false;
+    /**
+     * If any segments intersect, result is true
+     */
     List lineSegStr = SegmentStringUtil.extractSegmentStrings(geom);
-    // only request intersection finder if there are segments (ie NOT for point inputs)
+    // only request intersection finder if there are segments 
+    // (i.e. NOT for point inputs)
     if (lineSegStr.size() > 0) {
-      boolean segsIntersect = prepPoly.getIntersectionFinder().intersects(lineSegStr);
-      if (segsIntersect) 
+      boolean segsIntersect = prepPoly.getIntersectionFinder().intersects(
+          lineSegStr);
+      if (segsIntersect)
+        return true;
+    }
+
+    /**
+     * If the test has dimension = 2 as well, it is necessary to test for proper
+     * inclusion of the target. Since no segments intersect, it is sufficient to
+     * test representative points.
+     */
+    if (geom.getDimension() == 2) {
+      // TODO: generalize this to handle GeometryCollections
+      boolean isPrepGeomInArea = isAnyTargetComponentInAreaTest(geom,
+          prepPoly.getRepresentativePoints());
+      if (isPrepGeomInArea)
         return true;
     }
-		
-		/**
-		 * If the test has dimension = 2 as well, it is necessary to
-		 * test for proper inclusion of the target.
-		 * Since no segments intersect, it is sufficient to test representative points.
-		 */
-		if (geom.getDimension() == 2) {
-			// TODO: generalize this to handle GeometryCollections
-			boolean isPrepGeomInArea = isAnyTargetComponentInAreaTest(geom, prepPoly.getRepresentativePoints());
-			if (isPrepGeomInArea) return true;
-		}
-		
-		return false;
-	}
-	  
+
+    return false;
+  }
+
 }
diff --git a/src/com/vividsolutions/jts/geom/prep/package.html b/src/com/vividsolutions/jts/geom/prep/package.html
deleted file mode 100644
index 54941bc..0000000
--- a/src/com/vividsolutions/jts/geom/prep/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Classes to perform optimized geometric operations on suitably prepared geometries.
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/geom/util/GeometryEditor.java b/src/com/vividsolutions/jts/geom/util/GeometryEditor.java
index cadda7c..d625b31 100644
--- a/src/com/vividsolutions/jts/geom/util/GeometryEditor.java
+++ b/src/com/vividsolutions/jts/geom/util/GeometryEditor.java
@@ -41,11 +41,12 @@ import java.util.ArrayList;
 
 /**
  * A class which supports creating new {@link Geometry}s 
- * which are modifications of existing ones.
+ * which are modifications of existing ones,
+ * maintaining the same type structure.
  * Geometry objects are intended to be treated as immutable.
  * This class "modifies" Geometrys
  * by traversing them, applying a user-defined
- * {@link GeometryEditorOperation} or {@link CoordinateOperation}  
+ * {@link GeometryEditorOperation}, {@link CoordinateSequenceOperation} or {@link CoordinateOperation}  
  * and creating new Geometrys with the same structure but
  * (possibly) modified components.
  * <p>
@@ -54,28 +55,32 @@ import java.util.ArrayList;
  * <li>the values of the coordinates may be changed.
  *     The editor does not check whether changing coordinate values makes the result Geometry invalid
  * <li>the coordinate lists may be changed
- *     (e.g. by adding or deleting coordinates).
+ *     (e.g. by adding, deleting or modifying coordinates).
  *     The modifed coordinate lists must be consistent with their original parent component
  *     (e.g. a <tt>LinearRing</tt> must always have at least 4 coordinates, and the first and last
  *     coordinate must be equal)
  * <li>components of the original geometry may be deleted
- * (   e.g. holes may be removed from a Polygon, or LineStrings removed from a MultiLineString).
+ *    (e.g. holes may be removed from a Polygon, or LineStrings removed from a MultiLineString).
  *     Deletions will be propagated up the component tree appropriately.
  * </ul>
  * All changes must be consistent with the original Geometry's structure
  * (e.g. a <tt>Polygon</tt> cannot be collapsed into a <tt>LineString</tt>).
  * If changing the structure is required, use a {@link GeometryTransformer}.
  * <p>
- * This class supports the case where an edited Geometry needs to
- * be created under a new GeometryFactory, via the {@link #GeometryEditor(GeometryFactory)}
+ * This class supports creating an edited Geometry
+ * using a different <code>GeometryFactory</code> via the {@link #GeometryEditor(GeometryFactory)}
  * constructor.  
  * Examples of situations where this is required is if the geometry is 
  * transformed to a new SRID and/or a new PrecisionModel.
  * <p>
- * The resulting Geometry is not checked for validity.
+ * <b>Usage Notes</b>
+ * <ul>
+ * <li>The resulting Geometry is not checked for validity.
  * If validity needs to be enforced, the new Geometry's 
  * {@link Geometry#isValid} method should be called.
- *
+ * <li>By default the UserData of the input geometry is not copied to the result.
+ * </ul>
+ * 
  * @see GeometryTransformer
  * @see Geometry#isValid
  *
@@ -88,6 +93,7 @@ public class GeometryEditor
    * If <tt>null</tt> the GeometryFactory of the input is used.
    */
   private GeometryFactory factory = null;
+  private boolean isUserDataCopied = false;
 
   /**
    * Creates a new GeometryEditor object which will create
@@ -109,6 +115,17 @@ public class GeometryEditor
   }
 
   /**
+   * Sets whether the User Data is copied to the edit result.
+   * Only the object reference is copied.
+   * 
+   * @param isUserDataCopied true if the input user data should be copied.
+   */
+  public void setCopyUserData(boolean isUserDataCopied)
+  {
+    this.isUserDataCopied = isUserDataCopied;
+  }
+  
+  /**
    * Edit the input {@link Geometry} with the given edit operation.
    * Clients can create subclasses of {@link GeometryEditorOperation} or
    * {@link CoordinateOperation} to perform required modifications.
@@ -121,7 +138,16 @@ public class GeometryEditor
   {
     // nothing to do
     if (geometry == null) return null;
-
+    
+    Geometry result = editInternal(geometry, operation);
+    if (isUserDataCopied) {
+      result.setUserData(geometry.getUserData());
+    }
+    return result;
+  }
+  
+  private Geometry editInternal(Geometry geometry, GeometryEditorOperation operation)
+  {
     // if client did not supply a GeometryFactory, use the one from the input Geometry
     if (factory == null)
       factory = geometry.getFactory();
@@ -219,7 +245,11 @@ public class GeometryEditor
   {
     /**
      * Edits a Geometry by returning a new Geometry with a modification.
+     * The returned geometry may be:
+     * <ul>
+     * <li>the input geometry itself
      * The returned Geometry might be the same as the Geometry passed in.
+     * It may be <code>null</code> if the geometry is to be deleted.
      *
      * @param geometry the Geometry to modify
      * @param factory the factory with which to construct the modified Geometry
diff --git a/src/com/vividsolutions/jts/geom/util/GeometryTransformer.java b/src/com/vividsolutions/jts/geom/util/GeometryTransformer.java
index 6549974..25828d5 100644
--- a/src/com/vividsolutions/jts/geom/util/GeometryTransformer.java
+++ b/src/com/vividsolutions/jts/geom/util/GeometryTransformer.java
@@ -212,13 +212,14 @@ public class GeometryTransformer
    * @return a LineString if the transformation caused the LinearRing to collapse to 3 or fewer points
    */
   protected Geometry transformLinearRing(LinearRing geom, Geometry parent) {
-    CoordinateSequence seq = transformCoordinates(geom.getCoordinateSequence(), geom);
+    CoordinateSequence seq = transformCoordinates(geom.getCoordinateSequence(), geom);
+    if (seq == null) 
+      return factory.createLinearRing((CoordinateSequence) null);
     int seqSize = seq.size();
     // ensure a valid LinearRing
     if (seqSize > 0 && seqSize < 4 && ! preserveType)
       return factory.createLineString(seq);
     return factory.createLinearRing(seq);
-
   }
 
   /**
@@ -228,7 +229,7 @@ public class GeometryTransformer
    * @param parent
    * @return
    */
-  protected Geometry transformLineString(LineString geom, Geometry parent) {
+  protected Geometry transformLineString(LineString geom, Geometry parent) {
     // should check for 1-point sequences and downgrade them to points
     return factory.createLineString(
         transformCoordinates(geom.getCoordinateSequence(), geom));
@@ -236,7 +237,7 @@ public class GeometryTransformer
 
   protected Geometry transformMultiLineString(MultiLineString geom, Geometry parent) {
     List transGeomList = new ArrayList();
-    for (int i = 0; i < geom.getNumGeometries(); i++) {
+    for (int i = 0; i < geom.getNumGeometries(); i++) {  
       Geometry transformGeom = transformLineString((LineString) geom.getGeometryN(i), geom);
       if (transformGeom == null) continue;
       if (transformGeom.isEmpty()) continue;
diff --git a/src/com/vividsolutions/jts/geom/util/LineStringExtracter.java b/src/com/vividsolutions/jts/geom/util/LineStringExtracter.java
index 39dac62..8b5bc31 100644
--- a/src/com/vividsolutions/jts/geom/util/LineStringExtracter.java
+++ b/src/com/vividsolutions/jts/geom/util/LineStringExtracter.java
@@ -51,6 +51,7 @@ public class LineStringExtracter
    * 
    * @param geom the geometry from which to extract
    * @param lines the list to add the extracted LineStrings to
+   * @return the list argument
    */
   public static List getLines(Geometry geom, List lines)
   {
@@ -70,12 +71,25 @@ public class LineStringExtracter
    * and returns them in a {@link List}.
    * 
    * @param geom the geometry from which to extract
+   * @return a list containing the linear elements
    */
   public static List getLines(Geometry geom)
   {
     return getLines(geom, new ArrayList());
   }
 
+  /**
+   * Extracts the {@link LineString} elements from a single {@link Geometry}
+   * and returns them as either a {@link LineString) or {@link MultiLineString}.
+   * 
+   * @param geom the geometry from which to extract
+   * @return a linear geometry
+  */
+  public static Geometry getGeometry(Geometry geom)
+  {
+    return geom.getFactory().buildGeometry(getLines(geom));
+  }
+
   private List comps;
   
   /**
diff --git a/src/com/vividsolutions/jts/geom/util/LinearComponentExtracter.java b/src/com/vividsolutions/jts/geom/util/LinearComponentExtracter.java
index 8b7c192..9a1ea22 100644
--- a/src/com/vividsolutions/jts/geom/util/LinearComponentExtracter.java
+++ b/src/com/vividsolutions/jts/geom/util/LinearComponentExtracter.java
@@ -147,6 +147,33 @@ public class LinearComponentExtracter
     return lines;
   }
 
+  /**
+   * Extracts the linear components from a single {@link Geometry}
+   * and returns them as either a {@link LineString) or {@link MultiLineString}.
+   * 
+   * @param geom the geometry from which to extract
+   * @return a linear geometry
+   */
+  public static Geometry getGeometry(Geometry geom)
+  {
+    return geom.getFactory().buildGeometry(getLines(geom));
+  }
+
+
+  /**
+   * Extracts the linear components from a single {@link Geometry}
+   * and returns them as either a {@link LineString) or {@link MultiLineString}.
+   * 
+   * @param geom the geometry from which to extract
+   * @param forceToLineString true if LinearRings should be converted to LineStrings
+   * @return a linear geometry
+   */
+  public static Geometry getGeometry(Geometry geom, boolean forceToLineString)
+  {
+    return geom.getFactory().buildGeometry(getLines(geom, forceToLineString));
+  }
+
+
   private Collection lines;
   private boolean isForcedToLineString = false;
   
diff --git a/src/com/vividsolutions/jts/geom/util/PointExtracter.java b/src/com/vividsolutions/jts/geom/util/PointExtracter.java
index baf8f12..51dcb06 100644
--- a/src/com/vividsolutions/jts/geom/util/PointExtracter.java
+++ b/src/com/vividsolutions/jts/geom/util/PointExtracter.java
@@ -72,8 +72,10 @@ public class PointExtracter
    * 
    * @param geom the geometry from which to extract
    */
-  public static List getPoints(Geometry geom)
-  {
+  public static List getPoints(Geometry geom) {
+    if (geom instanceof Point) {
+      return Collections.singletonList(geom);
+    }
     return getPoints(geom, new ArrayList());
   }
 
diff --git a/src/com/vividsolutions/jts/geom/util/package.html b/src/com/vividsolutions/jts/geom/util/package.html
deleted file mode 100644
index f95b8fa..0000000
--- a/src/com/vividsolutions/jts/geom/util/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Provides classes that parse and modify Geometry objects.
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/geomgraph/index/MonotoneChainIndexer.java b/src/com/vividsolutions/jts/geomgraph/index/MonotoneChainIndexer.java
index 71a593e..af7a767 100644
--- a/src/com/vividsolutions/jts/geomgraph/index/MonotoneChainIndexer.java
+++ b/src/com/vividsolutions/jts/geomgraph/index/MonotoneChainIndexer.java
@@ -39,6 +39,7 @@ import java.util.*;
 
 import com.vividsolutions.jts.geom.Coordinate;
 import com.vividsolutions.jts.geomgraph.Quadrant;
+
 /**
  * MonotoneChains are a way of partitioning the segments of an edge to
  * allow for fast searching of intersections.
@@ -58,6 +59,9 @@ import com.vividsolutions.jts.geomgraph.Quadrant;
  * binary search to be used to find the intersection points of two monotone chains.
  * For many types of real-world data, these properties eliminate a large number of
  * segment comparisons, producing substantial speed gains.
+ * <p>
+ * Note that due to the efficient intersection test, there is no need to limit the size
+ * of chains to obtain fast performance.
  *
  * @version 1.7
  */
@@ -99,7 +103,8 @@ public class MonotoneChainIndexer {
     // determine quadrant for chain
     int chainQuad = Quadrant.quadrant(pts[start], pts[start + 1]);
     int last = start + 1;
-    while (last < pts.length) {
+    while (last < pts.length ) {
+      //if (last - start > 100) break;
       // compute quadrant for next possible segment in chain
       int quad = Quadrant.quadrant(pts[last - 1], pts[last]);
       if (quad != chainQuad) break;
diff --git a/src/com/vividsolutions/jts/geomgraph/index/SimpleMCSweepLineIntersector.java b/src/com/vividsolutions/jts/geomgraph/index/SimpleMCSweepLineIntersector.java
index f78315e..6132344 100644
--- a/src/com/vividsolutions/jts/geomgraph/index/SimpleMCSweepLineIntersector.java
+++ b/src/com/vividsolutions/jts/geomgraph/index/SimpleMCSweepLineIntersector.java
@@ -104,9 +104,9 @@ public class SimpleMCSweepLineIntersector
     int[] startIndex = mce.getStartIndexes();
     for (int i = 0; i < startIndex.length - 1; i++) {
       MonotoneChain mc = new MonotoneChain(mce, i);
-      SweepLineEvent insertEvent = new SweepLineEvent(edgeSet, mce.getMinX(i), null, mc);
+      SweepLineEvent insertEvent = new SweepLineEvent(edgeSet, mce.getMinX(i), mc);
       events.add(insertEvent);
-      events.add(new SweepLineEvent(edgeSet, mce.getMaxX(i), insertEvent, mc));
+      events.add(new SweepLineEvent(mce.getMaxX(i), insertEvent));
     }
   }
 
@@ -118,6 +118,7 @@ public class SimpleMCSweepLineIntersector
   private void prepareEvents()
   {
     Collections.sort(events);
+    // set DELETE event indexes
     for (int i = 0; i < events.size(); i++ )
     {
       SweepLineEvent ev = (SweepLineEvent) events.get(i);
@@ -146,16 +147,15 @@ public class SimpleMCSweepLineIntersector
     MonotoneChain mc0 = (MonotoneChain) ev0.getObject();
     /**
      * Since we might need to test for self-intersections,
-     * include current insert event object in list of event objects to test.
+     * include current INSERT event object in list of event objects to test.
      * Last index can be skipped, because it must be a Delete event.
      */
     for (int i = start; i < end; i++ ) {
       SweepLineEvent ev1 = (SweepLineEvent) events.get(i);
       if (ev1.isInsert()) {
         MonotoneChain mc1 = (MonotoneChain) ev1.getObject();
-        // don't compare edges in same group
-        // null group indicates that edges should be compared
-        if (ev0.edgeSet == null || (ev0.edgeSet != ev1.edgeSet)) {
+        // don't compare edges in same group, if labels are present
+        if (! ev0.isSameLabel(ev1)) {
           mc0.computeIntersections(mc1, si);
           nOverlaps++;
         }
diff --git a/src/com/vividsolutions/jts/geomgraph/index/SimpleSweepLineIntersector.java b/src/com/vividsolutions/jts/geomgraph/index/SimpleSweepLineIntersector.java
index a71c602..ad70dde 100644
--- a/src/com/vividsolutions/jts/geomgraph/index/SimpleSweepLineIntersector.java
+++ b/src/com/vividsolutions/jts/geomgraph/index/SimpleSweepLineIntersector.java
@@ -99,20 +99,21 @@ public class SimpleSweepLineIntersector
     Coordinate[] pts = edge.getCoordinates();
     for (int i = 0; i < pts.length - 1; i++) {
       SweepLineSegment ss = new SweepLineSegment(edge, i);
-      SweepLineEvent insertEvent = new SweepLineEvent(edgeSet, ss.getMinX(), null, ss);
+      SweepLineEvent insertEvent = new SweepLineEvent(edgeSet, ss.getMinX(), null);
       events.add(insertEvent);
-      events.add(new SweepLineEvent(edgeSet, ss.getMaxX(), insertEvent, ss));
+      events.add(new SweepLineEvent(ss.getMaxX(), insertEvent));
     }
   }
 
   /**
-   * Because Delete Events have a link to their corresponding Insert event,
+   * Because DELETE events have a link to their corresponding INSERT event,
    * it is possible to compute exactly the range of events which must be
-   * compared to a given Insert event object.
+   * compared to a given INSERT event object.
    */
   private void prepareEvents()
   {
     Collections.sort(events);
+    // set DELETE event indexes
     for (int i = 0; i < events.size(); i++ )
     {
       SweepLineEvent ev = (SweepLineEvent) events.get(i);
@@ -141,14 +142,15 @@ public class SimpleSweepLineIntersector
     SweepLineSegment ss0 = (SweepLineSegment) ev0.getObject();
     /**
      * Since we might need to test for self-intersections,
-     * include current insert event object in list of event objects to test.
+     * include current INSERT event object in list of event objects to test.
      * Last index can be skipped, because it must be a Delete event.
      */
     for (int i = start; i < end; i++ ) {
       SweepLineEvent ev1 = (SweepLineEvent) events.get(i);
       if (ev1.isInsert()) {
         SweepLineSegment ss1 = (SweepLineSegment) ev1.getObject();
-        if (ev0.edgeSet == null || (ev0.edgeSet != ev1.edgeSet)) {
+        // don't compare edges in same group, if labels are present
+        if (! ev0.isSameLabel(ev1)) {
           ss0.computeIntersections(ss1, si);
           nOverlaps++;
         }
diff --git a/src/com/vividsolutions/jts/geomgraph/index/SweepLineEvent.java b/src/com/vividsolutions/jts/geomgraph/index/SweepLineEvent.java
index 70e68c8..2423856 100644
--- a/src/com/vividsolutions/jts/geomgraph/index/SweepLineEvent.java
+++ b/src/com/vividsolutions/jts/geomgraph/index/SweepLineEvent.java
@@ -40,39 +40,62 @@ package com.vividsolutions.jts.geomgraph.index;
  */
 public class SweepLineEvent
   implements Comparable
-{
-  public static final int INSERT = 1;
-  public static final int DELETE = 2;
+{ 
+  private static final int INSERT = 1;
+  private static final int DELETE = 2;
 
-  Object edgeSet;    // used for red-blue intersection detection
+  private Object label;    // used for red-blue intersection detection
   private double xValue;
   private int eventType;
-  private SweepLineEvent insertEvent; // null if this is an INSERT event
+  private SweepLineEvent insertEvent = null; // null if this is an INSERT event
   private int deleteEventIndex;
   private Object obj;
 
-  public SweepLineEvent(Object edgeSet, double x, SweepLineEvent insertEvent, Object obj)
+  /**
+   * Creates an INSERT event.
+   * 
+   * @param label the edge set label for this object
+   * @param x the event location
+   * @param obj the object being inserted
+   */
+  public SweepLineEvent(Object label, double x, Object obj)
   {
-    this.edgeSet = edgeSet;
-    xValue = x;
-    this.insertEvent = insertEvent;
     this.eventType = INSERT;
-    if (insertEvent != null)
-      eventType = DELETE;
+    this.label = label;
+    xValue = x;
     this.obj = obj;
   }
 
-  public boolean isInsert() { return insertEvent == null; }
-  public boolean isDelete() { return insertEvent != null; }
+  /**
+   * Creates a DELETE event.
+   * 
+   * @param x the event location
+   * @param insertEvent the corresponding INSERT event
+   */
+  public SweepLineEvent(double x, SweepLineEvent insertEvent)
+  {
+    eventType = DELETE;
+    xValue = x;
+    this.insertEvent = insertEvent;
+  }
+
+  public boolean isInsert() { return eventType == INSERT; }
+  public boolean isDelete() { return eventType == DELETE; }
   public SweepLineEvent getInsertEvent() { return insertEvent; }
   public int getDeleteEventIndex() { return deleteEventIndex; }
   public void setDeleteEventIndex(int deleteEventIndex) { this.deleteEventIndex = deleteEventIndex; }
 
   public Object getObject() { return obj; }
 
+  public boolean isSameLabel(SweepLineEvent ev)
+  {
+    // no label set indicates single group
+    if (label == null) return false;
+    return label == ev.label;
+  }
   /**
-   * ProjectionEvents are ordered first by their x-value, and then by their eventType.
-   * It is important that Insert events are sorted before Delete events, so that
+   * Events are ordered first by their x-value, and then by their eventType.
+   * Insert events are sorted before Delete events, so that
    * items whose Insert and Delete events occur at the same x-value will be
    * correctly handled.
    */
diff --git a/src/com/vividsolutions/jts/geomgraph/index/package.html b/src/com/vividsolutions/jts/geomgraph/index/package.html
deleted file mode 100644
index de6379c..0000000
--- a/src/com/vividsolutions/jts/geomgraph/index/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Contains classes that implement indexes for performing noding on geometry graph edges.
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/geomgraph/package.html b/src/com/vividsolutions/jts/geomgraph/package.html
deleted file mode 100644
index c5d8ee2..0000000
--- a/src/com/vividsolutions/jts/geomgraph/package.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Contains classes that implement topology graphs.
-<P>
-The Java Topology Suite (JTS) is a Java API that implements a core set of spatial data operations using an explicit precision model and robust geometric algorithms. JTS is intended to be used in the development of applications that support the validation, cleaning, integration and querying of spatial datasets.
-<P>
-JTS attempts to implement the OpenGIS Simple Features Specification (SFS) as accurately as possible.  In some cases the SFS is unclear or omits a specification; in this case JTS attempts to choose a reasonable and consistent alternative.  Differences from and elaborations of the SFS are documented in this specification.
-
-<h2>Package Specification</h2>
-
-<ul>
-  <li>Java Topology Suite Technical Specifications
-  <li><A HREF="http://www.opengis.org/techno/specs.htm">
-      OpenGIS Simple Features Specification for SQL</A>
-</ul>
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/index/bintree/package.html b/src/com/vividsolutions/jts/index/bintree/package.html
deleted file mode 100644
index d4047ff..0000000
--- a/src/com/vividsolutions/jts/index/bintree/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Contains classes that implement a Binary Interval Tree index
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/index/chain/MonotoneChain.java b/src/com/vividsolutions/jts/index/chain/MonotoneChain.java
index b9c24c0..44b59a6 100644
--- a/src/com/vividsolutions/jts/index/chain/MonotoneChain.java
+++ b/src/com/vividsolutions/jts/index/chain/MonotoneChain.java
@@ -70,11 +70,12 @@ import com.vividsolutions.jts.geom.*;
  * </ul>
  *
  * This implementation of MonotoneChains uses the concept of internal iterators
- * to return the resultsets for the above queries.
+ * ({@link MonotoneChainSelectAction} and {@link MonotoneChainOverlapAction})
+ * to return the results for queries.
  * This has time and space advantages, since it
  * is not necessary to build lists of instantiated objects to represent the segments
  * returned by the query.
- * However, it does mean that the queries are not thread-safe.
+ * Queries made in this manner are thread-safe.
  *
  * @version 1.7
  */
diff --git a/src/com/vividsolutions/jts/index/chain/package.html b/src/com/vividsolutions/jts/index/chain/package.html
deleted file mode 100644
index b03b2a6..0000000
--- a/src/com/vividsolutions/jts/index/chain/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Contains classes that implement Monotone Chains
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/index/intervalrtree/package.html b/src/com/vividsolutions/jts/index/intervalrtree/package.html
deleted file mode 100644
index cb0c98e..0000000
--- a/src/com/vividsolutions/jts/index/intervalrtree/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Contains classes to implement an R-tree index for one-dimensional intervals.
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/noding/SegmentStringUtil.java b/src/com/vividsolutions/jts/index/kdtree/KdNodeVisitor.java
similarity index 55%
copy from src/com/vividsolutions/jts/noding/SegmentStringUtil.java
copy to src/com/vividsolutions/jts/index/kdtree/KdNodeVisitor.java
index 3ec960d..989b395 100644
--- a/src/com/vividsolutions/jts/noding/SegmentStringUtil.java
+++ b/src/com/vividsolutions/jts/index/kdtree/KdNodeVisitor.java
@@ -31,38 +31,20 @@
 *     www.vividsolutions.com
 */
 
-package com.vividsolutions.jts.noding;
-
-import java.util.*;
-import com.vividsolutions.jts.geom.*;
-import com.vividsolutions.jts.geom.util.LinearComponentExtracter;
+package com.vividsolutions.jts.index.kdtree;
 
 /**
- * Utility methods for processing {@link SegmentString}s.
- * 
- * @author Martin Davis
+ * A visitor for {@link KdNode}s in a {@link KdTree} index.
  *
+ * @version 1.7
  */
-public class SegmentStringUtil 
-{
-  /**
-   * Extracts all linear components from a given {@link Geometry}
-   * to {@link SegmentString}s.
-   * The SegmentString data item is set to be the source Geometry.
-   * 
-   * @param geom the geometry to extract from
-   * @return a List of SegmentStrings
-   */
-  public static List extractSegmentStrings(Geometry geom)
-  {
-    List segStr = new ArrayList();
-    List lines = LinearComponentExtracter.getLines(geom);
-    for (Iterator i = lines.iterator(); i.hasNext(); ) {
-      LineString line = (LineString) i.next();
-      Coordinate[] pts = line.getCoordinates();
-      segStr.add(new NodedSegmentString(pts, geom));
-    }
-    return segStr;
-  }
 
-}
+public interface KdNodeVisitor
+{
+  /**
+   * Visits a node.
+   * 
+   * @param node the node to visit
+   */
+  void visit(KdNode node);
+}
diff --git a/src/com/vividsolutions/jts/index/kdtree/KdTree.java b/src/com/vividsolutions/jts/index/kdtree/KdTree.java
index 2d158e4..04fcb97 100644
--- a/src/com/vividsolutions/jts/index/kdtree/KdTree.java
+++ b/src/com/vividsolutions/jts/index/kdtree/KdTree.java
@@ -34,102 +34,228 @@
 package com.vividsolutions.jts.index.kdtree;
 
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
 import java.util.List;
 
 import com.vividsolutions.jts.geom.Coordinate;
+import com.vividsolutions.jts.geom.CoordinateList;
 import com.vividsolutions.jts.geom.Envelope;
 
 /**
  * An implementation of a 2-D KD-Tree. KD-trees provide fast range searching on
  * point data.
  * <p>
- * This implementation supports detecting and snapping points which are closer than a given
- * tolerance value. If the same point (up to tolerance) is inserted more than once a new node is
- * not created but the count of the existing node is incremented.
- * 
+ * This implementation supports detecting and snapping points which are closer
+ * than a given distance tolerance. 
+ * If the same point (up to tolerance) is inserted
+ * more than once, it is snapped to the existing node.
+ * In other words, if a point is inserted which lies within the tolerance of a node already in the index,
+ * it is snapped to that node. 
+ * When a point is snapped to a node then a new node is not created but the count of the existing node
+ * is incremented.  
+ * If more than one node in the tree is within tolerance of an inserted point, 
+ * the closest and then lowest node is snapped to.
  * 
  * @author David Skea
  * @author Martin Davis
  */
-public class KdTree 
-{
-	private KdNode root = null;
-	private KdNode last = null;
-	private long numberOfNodes;
-	private double tolerance;
-
-	/**
-	 * Creates a new instance of a KdTree 
-	 * with a snapping tolerance of 0.0.
-	 * (I.e. distinct points will <i>not</i> be snapped)
-	 */
-	public KdTree() {
-		this(0.0);
-	}
-
-	/**
-	 * Creates a new instance of a KdTree, specifying a snapping distance tolerance.
-	 * Points which lie closer than the tolerance to a point already 
-	 * in the tree will be treated as identical to the existing point.
-	 * 
-	 * @param tolerance
-	 *          the tolerance distance for considering two points equal
-	 */
-	public KdTree(double tolerance) {
-		this.tolerance = tolerance;
-	}
+public class KdTree {
+
+  /**
+   * Converts a collection of {@link KdNode}s to an array of {@link Coordinate}s.
+   * 
+   * @param kdnodes
+   *          a collection of nodes
+   * @return an array of the coordinates represented by the nodes
+   */
+  public static Coordinate[] toCoordinates(Collection kdnodes) {
+    return toCoordinates(kdnodes, false);
+  }
+
+  /**
+   * Converts a collection of {@link KdNode}s 
+   * to an array of {@link Coordinate}s,
+   * specifying whether repeated nodes should be represented
+   * by multiple coordinates.
+   * 
+   * @param kdnodes a collection of nodes
+   * @param includeRepeated true if repeated nodes should 
+   *   be included multiple times
+   * @return an array of the coordinates represented by the nodes
+   */
+  public static Coordinate[] toCoordinates(Collection kdnodes, boolean includeRepeated) {
+    CoordinateList coord = new CoordinateList();
+    for (Iterator it = kdnodes.iterator(); it.hasNext();) {
+      KdNode node = (KdNode) it.next();
+      int count = includeRepeated ? node.getCount() : 1;
+      for (int i = 0; i < count; i++) {
+       coord.add(node.getCoordinate(), true);
+      }
+    }
+    return coord.toCoordinateArray();
+  }
+
+  private KdNode root = null;
+  private long numberOfNodes;
+  private double tolerance;
+
+  /**
+   * Creates a new instance of a KdTree with a snapping tolerance of 0.0. (I.e.
+   * distinct points will <i>not</i> be snapped)
+   */
+  public KdTree() {
+    this(0.0);
+  }
+
+  /**
+   * Creates a new instance of a KdTree, specifying a snapping distance
+   * tolerance. Points which lie closer than the tolerance to a point already in
+   * the tree will be treated as identical to the existing point.
+   * 
+   * @param tolerance
+   *          the tolerance distance for considering two points equal
+   */
+  public KdTree(double tolerance) {
+    this.tolerance = tolerance;
+  }
 
   /**
    * Tests whether the index contains any items.
    * 
    * @return true if the index does not contain any items
    */
-  public boolean isEmpty()
-  {
-    if (root == null) return true;
+  public boolean isEmpty() {
+    if (root == null)
+      return true;
     return false;
   }
+
+  /**
+   * Inserts a new point in the kd-tree, with no data.
+   * 
+   * @param p
+   *          the point to insert
+   * @return the kdnode containing the point
+   */
+  public KdNode insert(Coordinate p) {
+    return insert(p, null);
+  }
+
+  /**
+   * Inserts a new point into the kd-tree.
+   * 
+   * @param p
+   *          the point to insert
+   * @param data
+   *          a data item for the point
+   * @return returns a new KdNode if a new point is inserted, else an existing
+   *         node is returned with its counter incremented. This can be checked
+   *         by testing returnedNode.getCount() > 1.
+   */
+  public KdNode insert(Coordinate p, Object data) {
+    if (root == null) {
+      root = new KdNode(p, data);
+      return root;
+    }
+    
+    /**
+     * Check if the point is already in the tree, up to tolerance.
+     * If tolerance is zero, this phase of the insertion can be skipped.
+     */
+    if ( tolerance > 0 ) {
+      KdNode matchNode = findBestMatchNode(p);
+      if (matchNode != null) {
+        // point already in index - increment counter
+        matchNode.increment();
+        return matchNode;
+      }
+    }
+    
+    return insertExact(p, data);
+  }
+    
+  /**
+   * Finds the node in the tree which is the best match for a point
+   * being inserted.
+   * The match is made deterministic by returning the lowest of any nodes which
+   * lie the same distance from the point.
+   * There may be no match if the point is not within the distance tolerance of any
+   * existing node.
+   * 
+   * @param p the point being inserted
+   * @return the best matching node
+   * @return null if no match was found
+   */
+  private KdNode findBestMatchNode(Coordinate p) {
+    BestMatchVisitor visitor = new BestMatchVisitor(p, tolerance);
+    query(visitor.queryEnvelope(), visitor);
+    return visitor.getNode();
+  }
+
+  static private class BestMatchVisitor implements KdNodeVisitor {
+
+    private double tolerance;
+    private KdNode matchNode = null;
+    private double matchDist = 0.0;
+    private Coordinate p;
+    
+    public BestMatchVisitor(Coordinate p, double tolerance) {
+      this.p = p;
+      this.tolerance = tolerance;
+    }
+    
+    public Envelope queryEnvelope() {
+      Envelope queryEnv = new Envelope(p);
+      queryEnv.expandBy(tolerance);
+      return queryEnv;
+    }
+
+    public KdNode getNode() {
+      return matchNode;
+    }
+
+    @Override
+    public void visit(KdNode node) {
+      double dist = p.distance(node.getCoordinate());
+      boolean isInTolerance =  dist <= tolerance; 
+      if (! isInTolerance) return;
+      boolean update = false;
+      if (matchNode == null
+          || dist < matchDist
+          // if distances are the same, record the lesser coordinate
+          || (matchNode != null && dist == matchDist 
+          && node.getCoordinate().compareTo(matchNode.getCoordinate()) < 1))
+        update = true;
+
+      if (update) {
+        matchNode = node;
+        matchDist = dist;
+      }
+    }
+  }
   
-	/**
-	 * Inserts a new point in the kd-tree, with no data.
-	 * 
-	 * @param p
-	 *          the point to insert
-	 * @return the kdnode containing the point
-	 */
-	public KdNode insert(Coordinate p) {
-		return insert(p, null);
-	}
-
-	/**
-	 * Inserts a new point into the kd-tree.
-	 * 
-	 * @param p
-	 *          the point to insert
-	 * @param data
-	 *          a data item for the point
-	 * @return returns a new KdNode if a new point is inserted, else an existing
-	 *         node is returned with its counter incremented. This can be checked
-	 *         by testing returnedNode.getCount() > 1.
-	 */
-	public KdNode insert(Coordinate p, Object data) {
-		if (root == null) {
-			root = new KdNode(p, data);
-			return root;
-		}
-
-		KdNode currentNode = root;
-		KdNode leafNode = root;
-		boolean isOddLevel = true;
-		boolean isLessThan = true;
-
-		/**
-		 * Traverse the tree,
-		 * first cutting the plane left-right (by X ordinate)
-		 * then top-bottom (by Y ordinate)
-		 */
-		while (currentNode != last) {
-      // test if point is already a node
+  /**
+   * Inserts a point known to be beyond the distance tolerance of any existing node.
+   * The point is inserted at the bottom of the exact splitting path, 
+   * so that tree shape is deterministic.
+   * 
+   * @param p the point to insert
+   * @param data the data for the point
+   * @return the created node
+   */
+  private KdNode insertExact(Coordinate p, Object data) {
+    KdNode currentNode = root;
+    KdNode leafNode = root;
+    boolean isOddLevel = true;
+    boolean isLessThan = true;
+
+    /**
+     * Traverse the tree, first cutting the plane left-right (by X ordinate)
+     * then top-bottom (by Y ordinate)
+     */
+    while (currentNode != null) {
+      // test if point is already a node (not strictly necessary)
       if (currentNode != null) {
         boolean isInTolerance = p.distance(currentNode.getCoordinate()) <= tolerance;
 
@@ -142,87 +268,104 @@ public class KdTree
       }
 
       if (isOddLevel) {
-				isLessThan = p.x < currentNode.getX();
-			} else {
-				isLessThan = p.y < currentNode.getY();
-			}
-			leafNode = currentNode;
-			if (isLessThan) {
-				currentNode = currentNode.getLeft();
-			} else {
-				currentNode = currentNode.getRight();
-			}
-			
-			isOddLevel = !isOddLevel;
-		}
-
-		// no node found, add new leaf node to tree
-		numberOfNodes = numberOfNodes + 1;
-		KdNode node = new KdNode(p, data);
-		node.setLeft(last);
-		node.setRight(last);
-		if (isLessThan) {
-			leafNode.setLeft(node);
-		} else {
-			leafNode.setRight(node);
-		}
-		return node;
-	}
-
-	private void queryNode(KdNode currentNode, KdNode bottomNode,
-			Envelope queryEnv, boolean odd, List result) {
-		if (currentNode == bottomNode)
-			return;
-
-		double min;
-		double max;
-		double discriminant;
-		if (odd) {
-			min = queryEnv.getMinX();
-			max = queryEnv.getMaxX();
-			discriminant = currentNode.getX();
-		} else {
-			min = queryEnv.getMinY();
-			max = queryEnv.getMaxY();
-			discriminant = currentNode.getY();
-		}
-		boolean searchLeft = min < discriminant;
-		boolean searchRight = discriminant <= max;
-
-		if (searchLeft) {
-			queryNode(currentNode.getLeft(), bottomNode, queryEnv, !odd, result);
-		}
-		if (queryEnv.contains(currentNode.getCoordinate())) {
-			result.add((Object) currentNode);
-		}
-		if (searchRight) {
-			queryNode(currentNode.getRight(), bottomNode, queryEnv, !odd, result);
-		}
-
-	}
-
-	/**
-	 * Performs a range search of the points in the index.
-	 * 
-	 * @param queryEnv
-	 *          the range rectangle to query
-	 * @return a list of the KdNodes found
-	 */
-	public List query(Envelope queryEnv) {
-		List result = new ArrayList();
-		queryNode(root, last, queryEnv, true, result);
-		return result;
-	}
-
-	/**
-	 * Performs a range search of the points in the index.
-	 * 
-	 * @param queryEnv
-	 *          the range rectangle to query
-	 * @param result
-	 *          a list to accumulate the result nodes into
-	 */
-	public void query(Envelope queryEnv, List result) {
-		queryNode(root, last, queryEnv, true, result);
-	}
+        isLessThan = p.x < currentNode.getX();
+      } else {
+        isLessThan = p.y < currentNode.getY();
+      }
+      leafNode = currentNode;
+      if (isLessThan) {
+        currentNode = currentNode.getLeft();
+      } else {
+        currentNode = currentNode.getRight();
+      }
+
+      isOddLevel = ! isOddLevel;
+    }
+
+    // no node found, add new leaf node to tree
+    numberOfNodes = numberOfNodes + 1;
+    KdNode node = new KdNode(p, data);
+    if (isLessThan) {
+      leafNode.setLeft(node);
+    } else {
+      leafNode.setRight(node);
+    }
+    return node;
+  }
+
+  private void queryNode(KdNode currentNode,
+      Envelope queryEnv, boolean odd, KdNodeVisitor visitor) {
+    if (currentNode == null)
+      return;
+
+    double min;
+    double max;
+    double discriminant;
+    if (odd) {
+      min = queryEnv.getMinX();
+      max = queryEnv.getMaxX();
+      discriminant = currentNode.getX();
+    } else {
+      min = queryEnv.getMinY();
+      max = queryEnv.getMaxY();
+      discriminant = currentNode.getY();
+    }
+    boolean searchLeft = min < discriminant;
+    boolean searchRight = discriminant <= max;
+
+    // search is computed via in-order traversal
+    if (searchLeft) {
+      queryNode(currentNode.getLeft(), queryEnv, !odd, visitor);
+    }
+    if (queryEnv.contains(currentNode.getCoordinate())) {
+      visitor.visit(currentNode);
+    }
+    if (searchRight) {
+      queryNode(currentNode.getRight(), queryEnv, !odd, visitor);
+    }
+
+  }
+
+  /**
+   * Performs a range search of the points in the index and visits all nodes found.
+   * 
+   * @param queryEnv
+   *          the range rectangle to query
+   * @param a visitor to visit all nodes found by the search
+   */
+  public void query(Envelope queryEnv, KdNodeVisitor visitor) {
+    queryNode(root, queryEnv, true, visitor);
+  }
+  
+  /**
+   * Performs a range search of the points in the index.
+   * 
+   * @param queryEnv
+   *          the range rectangle to query
+   * @return a list of the KdNodes found
+   */
+  public List query(Envelope queryEnv) {
+    final List result = new ArrayList();
+    query(queryEnv, result);
+    return result;
+  }
+
+  /**
+   * Performs a range search of the points in the index.
+   * 
+   * @param queryEnv
+   *          the range rectangle to query
+   * @param result
+   *          a list to accumulate the result nodes into
+   */
+  public void query(Envelope queryEnv, final List result) {
+    queryNode(root, queryEnv, true, new KdNodeVisitor() {
+
+      @Override
+      public void visit(KdNode node) {
+        result.add(node);
+      }
+      
+    });
+  }
 }
\ No newline at end of file
diff --git a/src/com/vividsolutions/jts/index/kdtree/package.html b/src/com/vividsolutions/jts/index/kdtree/package.html
deleted file mode 100644
index 99fe9bc..0000000
--- a/src/com/vividsolutions/jts/index/kdtree/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Contains classes which implement a k-D tree index over 2-D point data.
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/index/package.html b/src/com/vividsolutions/jts/index/package.html
deleted file mode 100644
index ebdf88d..0000000
--- a/src/com/vividsolutions/jts/index/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Provides classes for various kinds of spatial indexes.
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/index/quadtree/package.html b/src/com/vividsolutions/jts/index/quadtree/package.html
deleted file mode 100644
index ba16317..0000000
--- a/src/com/vividsolutions/jts/index/quadtree/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Contains classes that implement a Quadtree spatial index
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/index/strtree/AbstractSTRtree.java b/src/com/vividsolutions/jts/index/strtree/AbstractSTRtree.java
index 4d586d1..05e7578 100644
--- a/src/com/vividsolutions/jts/index/strtree/AbstractSTRtree.java
+++ b/src/com/vividsolutions/jts/index/strtree/AbstractSTRtree.java
@@ -47,6 +47,9 @@ import java.util.*;
  * This implementation is based on {@link Boundable}s rather than {@link AbstractNode}s,
  * because the STR algorithm operates on both nodes and
  * data, both of which are treated as Boundables.
+ * <p>
+ * This class is thread-safe.  Building the tree is synchronized, 
+ * and querying is stateless.
  *
  * @see STRtree
  * @see SIRtree
@@ -112,7 +115,7 @@ public abstract class AbstractSTRtree implements Serializable {
    * called once, and thus can be called only after all of the data has been
    * inserted into the tree.
    */
-  public void build() {
+  public synchronized void build() {
     if (built) return;
     root = itemBoundables.isEmpty()
            ? createNode(0)
@@ -375,9 +378,6 @@ public abstract class AbstractSTRtree implements Serializable {
    */
   protected boolean remove(Object searchBounds, Object item) {
     build();
-    if (itemBoundables.isEmpty()) {
-      Assert.isTrue(root.getBounds() == null);
-    }
     if (getIntersectsOp().intersects(root.getBounds(), searchBounds)) {
       return remove(searchBounds, root, item);
     }
diff --git a/src/com/vividsolutions/jts/index/strtree/SIRtree.java b/src/com/vividsolutions/jts/index/strtree/SIRtree.java
index 95f6d7d..de21b71 100644
--- a/src/com/vividsolutions/jts/index/strtree/SIRtree.java
+++ b/src/com/vividsolutions/jts/index/strtree/SIRtree.java
@@ -42,6 +42,10 @@ import java.util.List;
  * "Sort-Interval-Recursive". STR-packed R-trees are described in:
  * P. Rigaux, Michel Scholl and Agnes Voisard. Spatial Databases With
  * Application To GIS. Morgan Kaufmann, San Francisco, 2002.
+ * <p>
+ * This class is thread-safe.  Building the tree is synchronized, 
+ * and querying is stateless.
+ * 
  * @see STRtree
  *
  * @version 1.7
diff --git a/src/com/vividsolutions/jts/index/strtree/STRtree.java b/src/com/vividsolutions/jts/index/strtree/STRtree.java
index 5161137..b5f6696 100644
--- a/src/com/vividsolutions/jts/index/strtree/STRtree.java
+++ b/src/com/vividsolutions/jts/index/strtree/STRtree.java
@@ -55,6 +55,9 @@ import com.vividsolutions.jts.index.*;
  * Described in: P. Rigaux, Michel Scholl and Agnes Voisard.
  * <i>Spatial Databases With Application To GIS</i>.
  * Morgan Kaufmann, San Francisco, 2002.
+ * <p>
+ * This class is thread-safe.  Building the tree is synchronized, 
+ * and querying is stateless.
  *
  * @version 1.7
  */
diff --git a/src/com/vividsolutions/jts/index/strtree/package.html b/src/com/vividsolutions/jts/index/strtree/package.html
deleted file mode 100644
index df9afdf..0000000
--- a/src/com/vividsolutions/jts/index/strtree/package.html
+++ /dev/null
@@ -1,8 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-</head>
-<body bgcolor="white">
-Contains 2-D and 1-D versions of the Sort-Tile-Recursive (STR) tree, a query-only R-tree.
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/index/sweepline/package.html b/src/com/vividsolutions/jts/index/sweepline/package.html
deleted file mode 100644
index 78a3301..0000000
--- a/src/com/vividsolutions/jts/index/sweepline/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Contains classes which implement a sweepline algorithm for scanning geometric data structures.
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/io/ParseException.java b/src/com/vividsolutions/jts/io/ParseException.java
index 44b6291..c143071 100644
--- a/src/com/vividsolutions/jts/io/ParseException.java
+++ b/src/com/vividsolutions/jts/io/ParseException.java
@@ -57,7 +57,18 @@ public class ParseException extends Exception {
    *      parsing a Well-known Text string
    */
   public ParseException(Exception e) {
-    this(e.toString());
+    this(e.toString(), e);
+  }
+  
+  /**
+   *  Creates a <code>ParseException</code> with <code>e</code>s detail message.
+   *  
+   *@param  message  a description of this <code>ParseException</code>
+   *@param  e  a throwable that occurred while a com.vividsolutions.jts.io reader was
+   *      parsing a string representation
+   */
+  public ParseException(String message, Throwable e) {
+          super(message, e);
   }
 }
 
diff --git a/src/com/vividsolutions/jts/io/WKBReader.java b/src/com/vividsolutions/jts/io/WKBReader.java
index 4bbc43d..047ade3 100644
--- a/src/com/vividsolutions/jts/io/WKBReader.java
+++ b/src/com/vividsolutions/jts/io/WKBReader.java
@@ -156,12 +156,29 @@ public class WKBReader
   private Geometry readGeometry()
   throws IOException, ParseException
   {
-    // determine byte order
-    byte byteOrderWKB = dis.readByte();
-    // always set byte order, since it may change from geometry to geometry
-    int byteOrder = byteOrderWKB == WKBConstants.wkbNDR ? ByteOrderValues.LITTLE_ENDIAN : ByteOrderValues.BIG_ENDIAN;
-    dis.setOrder(byteOrder);
-    
+
+      // determine byte order
+      byte byteOrderWKB = dis.readByte();
+
+      // always set byte order, since it may change from geometry to geometry
+     if(byteOrderWKB == WKBConstants.wkbNDR)
+     {
+        dis.setOrder(ByteOrderValues.LITTLE_ENDIAN);
+     }
+     else if(byteOrderWKB == WKBConstants.wkbXDR)
+     {
+        dis.setOrder(ByteOrderValues.BIG_ENDIAN);
+     }
+     else if(isStrict)
+     {
+        throw new ParseException("Unknown geometry byte order (not NDR or XDR): " + byteOrderWKB);
+     }
+     //if not strict and not XDR or NDR, then we just use the dis default set at the
+     //start of the geometry (if a multi-geometry).  This  allows WBKReader to work
+     //with Spatialite native BLOB WKB, as well as other WKB variants that might just
+     //specify endian-ness at the start of the multigeometry.
+
+
     int typeInt = dis.readInt();
     int geometryType = typeInt & 0xff;
     // determine if Z values are present
@@ -286,6 +303,7 @@ public class WKBReader
   {
     int numGeom = dis.readInt();
     Polygon[] geoms = new Polygon[numGeom];
+
     for (int i = 0; i < numGeom; i++) {
       Geometry g = readGeometry();
       if (! (g instanceof Polygon))
diff --git a/src/com/vividsolutions/jts/io/WKTWriter.java b/src/com/vividsolutions/jts/io/WKTWriter.java
index cba671a..53d4224 100644
--- a/src/com/vividsolutions/jts/io/WKTWriter.java
+++ b/src/com/vividsolutions/jts/io/WKTWriter.java
@@ -100,6 +100,32 @@ public class WKTWriter
     }
     return buf.toString();
   }
+  
+  /**
+   * Generates the WKT for a <tt>LINESTRING</tt>
+   * specified by a {@link CoordinateSequence}.
+   *
+   * @param seq the sequence to write
+   *
+   * @return the WKT string
+   */
+  public static String toLineString(Coordinate[] coord)
+  {
+    StringBuffer buf = new StringBuffer();
+    buf.append("LINESTRING ");
+    if (coord.length == 0)
+      buf.append(" EMPTY");
+    else {
+      buf.append("(");
+      for (int i = 0; i < coord.length; i++) {
+        if (i > 0)
+          buf.append(", ");
+        buf.append(coord[i].x + " " + coord[i].y );
+      }
+      buf.append(")");
+    }
+    return buf.toString();
+  }
 
   /**
    * Generates the WKT for a <tt>LINESTRING</tt>
@@ -115,7 +141,7 @@ public class WKTWriter
     return "LINESTRING ( " + p0.x + " " + p0.y + ", " + p1.x + " " + p1.y + " )";
   }
 
-  private static int INDENT = 2;
+  private static final int INDENT = 2;
 
   /**
    *  Creates the <code>DecimalFormat</code> used to write <code>double</code>s
diff --git a/src/com/vividsolutions/jts/io/gml2/GMLConstants.java b/src/com/vividsolutions/jts/io/gml2/GMLConstants.java
index 7010a49..02de82f 100644
--- a/src/com/vividsolutions/jts/io/gml2/GMLConstants.java
+++ b/src/com/vividsolutions/jts/io/gml2/GMLConstants.java
@@ -59,7 +59,7 @@ final public class GMLConstants{
 	  public static final String GML_POLYGON = "Polygon";
 	  public static final String GML_BOX = "Box";
 
-	  // Aggregate Ggeometries
+	  // Aggregate Geometries
 	  public static final String GML_MULTI_GEOMETRY = "MultiGeometry";
 	  public static final String GML_MULTI_POINT = "MultiPoint";
 	  public static final String GML_MULTI_LINESTRING = "MultiLineString";
diff --git a/src/com/vividsolutions/jts/io/gml2/GeometryStrategies.java b/src/com/vividsolutions/jts/io/gml2/GeometryStrategies.java
index a1f3911..a930fef 100644
--- a/src/com/vividsolutions/jts/io/gml2/GeometryStrategies.java
+++ b/src/com/vividsolutions/jts/io/gml2/GeometryStrategies.java
@@ -40,6 +40,7 @@ import org.xml.sax.SAXException;
 
 import com.vividsolutions.jts.geom.*;
 import com.vividsolutions.jts.io.gml2.GMLHandler.Handler;
+import com.vividsolutions.jts.util.StringUtil;
 
 /**
  * Container for GML2 Geometry parsing strategies which can be represented in JTS.
@@ -379,7 +380,7 @@ public class GeometryStrategies{
 				if(numNonNullTouples == 0)
 					throw new SAXException("Cannot create a coordinate sequence without a non-null touple to parse");
 				
-				int dim = touples[0].split(coordSeperator).length;
+				int dim = StringUtil.split(touples[0], coordSeperator).length;
 				CoordinateSequence cs = gf.getCoordinateSequenceFactory().create(numNonNullTouples,dim);
 				dim = cs.getDimension(); // max dim
 				
diff --git a/src/com/vividsolutions/jts/io/gml2/package.html b/src/com/vividsolutions/jts/io/gml2/package.html
deleted file mode 100644
index 4701757..0000000
--- a/src/com/vividsolutions/jts/io/gml2/package.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<html>
-	<head><title>JTS IO: Java Topology Suite IO Library</title></head>
-	<body>
-	   Classes to read and write the GML2 geometry format.
-	</body>
-</html>
\ No newline at end of file
diff --git a/src/com/vividsolutions/jts/io/kml/KMLWriter.java b/src/com/vividsolutions/jts/io/kml/KMLWriter.java
new file mode 100644
index 0000000..dcc1b10
--- /dev/null
+++ b/src/com/vividsolutions/jts/io/kml/KMLWriter.java
@@ -0,0 +1,386 @@
+package com.vividsolutions.jts.io.kml;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+
+import com.vividsolutions.jts.geom.Coordinate;
+import com.vividsolutions.jts.geom.Geometry;
+import com.vividsolutions.jts.geom.GeometryCollection;
+import com.vividsolutions.jts.geom.LineString;
+import com.vividsolutions.jts.geom.LinearRing;
+import com.vividsolutions.jts.geom.Point;
+import com.vividsolutions.jts.geom.Polygon;
+import com.vividsolutions.jts.util.StringUtil;
+
+/**
+ * Writes a formatted string containing the KML representation of a JTS
+ * {@link Geometry}. 
+ * The output is KML fragments which 
+ * can be substituted wherever the KML <i>Geometry</i> abstract element can be used.
+ * <p>
+ * Output elements are indented to provide a
+ * nicely-formatted representation. 
+ * An output line prefix and maximum
+ * number of coordinates per line can be specified.
+ * <p>
+ * The Z ordinate value output can be forced to be a specific value. 
+ * The <code>extrude</code> and <code>altitudeMode</code> modes can be set. 
+ * If set, the corresponding sub-elements will be output.
+ */
+public class KMLWriter 
+{
+  /**
+   * The KML standard value <code>clampToGround</code> for use in {@link #setAltitudeMode(String)}.
+   */
+  public static String ALTITUDE_MODE_CLAMPTOGROUND = "clampToGround ";
+  /**
+   * The KML standard value <code>relativeToGround</code> for use in {@link #setAltitudeMode(String)}.
+   */
+  public static String ALTITUDE_MODE_RELATIVETOGROUND  = "relativeToGround  ";
+  /**
+   * The KML standard value <code>absolute</code> for use in {@link #setAltitudeMode(String)}.
+   */
+  public static String ALTITUDE_MODE_ABSOLUTE = "absolute";
+  
+  /**
+   * Writes a Geometry as KML to a string, using
+   * a specified Z value.
+   * 
+   * @param geometry the geometry to write
+   * @param z the Z value to use
+   * @return a string containing the KML geometry representation
+   */
+  public static String writeGeometry(Geometry geometry, double z) {
+    KMLWriter writer = new KMLWriter();
+    writer.setZ(z);
+    return writer.write(geometry);
+  }
+
+  /**
+    * Writes a Geometry as KML to a string, using
+   * a specified Z value, precision, extrude flag,
+   * and altitude mode code.
+   * 
+   * @param geometry the geometry to write
+   * @param z the Z value to use
+   * @param precision the maximum number of decimal places to write
+   * @param extrude the extrude flag to write
+   * @param altitudeMode the altitude model code to write
+   * @return a string containing the KML geometry representation
+   */
+  public static String writeGeometry(Geometry geometry, double z, int precision,
+      boolean extrude, String altitudeMode) {
+    KMLWriter writer = new KMLWriter();
+    writer.setZ(z);
+    writer.setPrecision(precision);
+    writer.setExtrude(extrude);
+    writer.setAltitudeMode(altitudeMode);
+    return writer.write(geometry);
+  }
+
+  private final int INDENT_SIZE = 2;
+  private static final String COORDINATE_SEPARATOR = ",";
+  private static final String TUPLE_SEPARATOR = " ";
+
+  private String linePrefix = null;
+  private int maxCoordinatesPerLine = 5;
+  private double zVal = Double.NaN;
+  private boolean extrude = false;
+  private boolean tesselate;
+  private String altitudeMode = null;
+  private DecimalFormat numberFormatter = null;
+
+  /**
+   * Creates a new writer.
+   */
+  public KMLWriter() {
+  }
+
+  /**
+   * Sets a tag string which is prefixed to every emitted text line.
+   * This can be used to indent the geometry text in a containing document.
+   * 
+   * @param linePrefix the tag string
+   */
+  public void setLinePrefix(String linePrefix) {
+    this.linePrefix = linePrefix;
+  }
+
+  /**
+   * Sets the maximum number of coordinates to output per line.
+   * 
+   * @param maxCoordinatesPerLine the maximum number of coordinates to output
+   */
+  public void setMaximumCoordinatesPerLine(int maxCoordinatesPerLine) {
+    if (maxCoordinatesPerLine <= 0) {
+      maxCoordinatesPerLine = 1;
+      return;
+    }
+    this.maxCoordinatesPerLine = maxCoordinatesPerLine;
+  }
+
+  /**
+   * Sets the Z value to be output for all coordinates.
+   * This overrides any Z value present in the Geometry coordinates.
+   * 
+   * @param zVal the Z value to output
+   */
+  public void setZ(double zVal) {
+    this.zVal = zVal;
+  }
+
+  /**
+   * Sets the flag to be output in the <code>extrude</code> element.
+   * 
+   * @param extrude the extrude flag to output
+   */
+  public void setExtrude(boolean extrude) {
+    this.extrude = extrude;
+  }
+
+  /**
+   * Sets the flag to be output in the <code>tesselate</code> element.
+   * 
+   * @param tesselate the tesselate flag to output
+   */
+  public void setTesselate(boolean tesselate) {
+    this.tesselate = tesselate;
+  }
+
+  /**
+   * Sets the value output in the <code>altitudeMode</code> element.
+   * 
+   * @param altitudeMode string representing the altitude mode
+   */
+  public void setAltitudeMode(String altitudeMode) {
+    this.altitudeMode = altitudeMode;
+  }
+
+  /**
+   * Sets the maximum nummber of decimal places to output in ordinate values.
+   * Useful for limiting output size.
+   * 
+   * @param precision the number of decimal places to output
+   */
+  public void setPrecision(int precision) {
+    //this.precision = precision;
+    if (precision >= 0)
+      numberFormatter = createFormatter(precision);
+  }
+
+  /**
+   * Writes a {@link Geometry} in KML format as a string.
+   * 
+   * @param geom the geometry to write
+   * @return a string containing the KML geometry representation
+   */
+  public String write(Geometry geom) {
+    StringBuffer buf = new StringBuffer();
+    write(geom, buf);
+    return buf.toString();
+  }
+
+  /**
+   * Writes the KML representation of a {@link Geometry} to a {@link Writer}.
+   * 
+   * @param geometry the geometry to write
+   * @param writer the Writer to write to
+   * @throws IOException if an I/O error occurred
+   */
+  public void write(Geometry geometry, Writer writer) throws IOException {
+    writer.write(write(geometry));
+  }
+
+  /**
+   * Appends the KML representation of a {@link Geometry} to a {@link StringBuffer}.
+   * 
+   * @param geometry the geometry to write
+   * @param buf the buffer to write into
+   */
+  public void write(Geometry geometry, StringBuffer buf) {
+    writeGeometry(geometry, 0, buf);
+  }
+
+  private void writeGeometry(Geometry g, int level, StringBuffer buf) {
+    String attributes = "";
+    if (g instanceof Point) {
+      writePoint((Point) g, attributes, level, buf);
+    } else if (g instanceof LinearRing) {
+      writeLinearRing((LinearRing) g, attributes, true, level, buf);
+    } else if (g instanceof LineString) {
+      writeLineString((LineString) g, attributes, level, buf);
+    } else if (g instanceof Polygon) {
+      writePolygon((Polygon) g, attributes, level, buf);
+    } else if (g instanceof GeometryCollection) {
+      writeGeometryCollection((GeometryCollection) g, attributes, level, buf);
+    }
+    else 
+      throw new IllegalArgumentException("Geometry type not supported: " + g.getGeometryType());
+  }
+
+  private void startLine(String text, int level, StringBuffer buf) {
+    if (linePrefix != null)
+      buf.append(linePrefix);
+    buf.append(StringUtil.spaces(INDENT_SIZE * level));
+    buf.append(text);
+  }
+
+  private String geometryTag(String geometryName, String attributes) {
+    StringBuffer buf = new StringBuffer();
+    buf.append("<");
+    buf.append(geometryName);
+    if (attributes != null && attributes.length() > 0) {
+      buf.append(" ");
+      buf.append(attributes);
+    }
+    buf.append(">");
+    return buf.toString();
+  }
+
+  private void writeModifiers(int level, StringBuffer buf)
+  {
+    if (extrude) {
+      startLine("<extrude>1</extrude>\n", level, buf);
+    }
+    if (tesselate) {
+      startLine("<tesselate>1</tesselate>\n", level, buf);
+    }
+    if (altitudeMode != null) {
+      startLine("<altitudeMode>" + altitudeMode + "</altitudeMode>\n", level, buf);
+    }
+  }
+  
+  private void writePoint(Point p, String attributes, int level,
+      StringBuffer buf) {
+  // <Point><coordinates>...</coordinates></Point>
+    startLine(geometryTag("Point", attributes) + "\n", level, buf);
+    writeModifiers(level, buf);
+    write(new Coordinate[] { p.getCoordinate() }, level + 1, buf);
+    startLine("</Point>\n", level, buf);
+  }
+
+  private void writeLineString(LineString ls, String attributes, int level,
+      StringBuffer buf) {
+  // <LineString><coordinates>...</coordinates></LineString>
+    startLine(geometryTag("LineString", attributes) + "\n", level, buf);
+    writeModifiers(level, buf);
+    write(ls.getCoordinates(), level + 1, buf);
+    startLine("</LineString>\n", level, buf);
+  }
+
+  private void writeLinearRing(LinearRing lr, String attributes, 
+      boolean writeModifiers, int level,
+      StringBuffer buf) {
+  // <LinearRing><coordinates>...</coordinates></LinearRing>
+    startLine(geometryTag("LinearRing", attributes) + "\n", level, buf);
+    if (writeModifiers) writeModifiers(level, buf);
+    write(lr.getCoordinates(), level + 1, buf);
+    startLine("</LinearRing>\n", level, buf);
+  }
+
+  private void writePolygon(Polygon p, String attributes, int level,
+      StringBuffer buf) {
+    startLine(geometryTag("Polygon", attributes) + "\n", level, buf);
+    writeModifiers(level, buf);
+
+    startLine("  <outerBoundaryIs>\n", level, buf);
+    writeLinearRing((LinearRing) p.getExteriorRing(), null, false, level + 1, buf);
+    startLine("  </outerBoundaryIs>\n", level, buf);
+
+    for (int t = 0; t < p.getNumInteriorRing(); t++) {
+      startLine("  <innerBoundaryIs>\n", level, buf);
+      writeLinearRing((LinearRing) p.getInteriorRingN(t), null, false, level + 1, buf);
+      startLine("  </innerBoundaryIs>\n", level, buf);
+    }
+
+    startLine("</Polygon>\n", level, buf);
+  }
+
+  private void writeGeometryCollection(GeometryCollection gc,
+      String attributes, int level, StringBuffer buf) {
+    startLine("<MultiGeometry>\n", level, buf);
+    for (int t = 0; t < gc.getNumGeometries(); t++) {
+      writeGeometry(gc.getGeometryN(t), level + 1, buf);
+    }
+    startLine("</MultiGeometry>\n", level, buf);
+  }
+
+  /**
+   * Takes a list of coordinates and converts it to KML.<br>
+   * 2d and 3d aware. Terminates the coordinate output with a newline.
+   * 
+   * @param cs array of coordinates
+   */
+  private void write(Coordinate[] coords, int level, StringBuffer buf) {
+    startLine("<coordinates>", level, buf);
+
+    boolean isNewLine = false;
+    for (int i = 0; i < coords.length; i++) {
+      if (i > 0) {
+        buf.append(TUPLE_SEPARATOR);
+      }
+
+      if (isNewLine) {
+        startLine("  ", level, buf);
+        isNewLine = false;
+      }
+
+      write(coords[i], buf);
+
+      // break output lines to prevent them from getting too long
+      if ((i + 1) % maxCoordinatesPerLine == 0 && i < coords.length - 1) {
+        buf.append("\n");
+        isNewLine = true;
+      }
+    }
+    buf.append("</coordinates>\n");
+  }
+
+  private void write(Coordinate p, StringBuffer buf) {
+    write(p.x, buf);
+    buf.append(COORDINATE_SEPARATOR);
+    write(p.y, buf);
+
+    double z = p.z;
+    // if altitude was specified directly, use it
+    if (!Double.isNaN(zVal))
+      z = zVal;
+
+    // only write if Z present
+    // MD - is this right? Or should it always be written?
+    if (!Double.isNaN(z)) {
+      buf.append(COORDINATE_SEPARATOR);
+      write(z, buf);
+    }
+  }
+
+  private void write(double num, StringBuffer buf) {
+    if (numberFormatter != null)
+      buf.append(numberFormatter.format(num));
+    else
+      buf.append(num);
+  }
+
+  /**
+   * Creates the <code>DecimalFormat</code> used to write <code>double</code>s
+   * with a sufficient number of decimal places.
+   * 
+   * @param precisionModel
+   *          the <code>PrecisionModel</code> used to determine the number of
+   *          decimal places to write.
+   * @return a <code>DecimalFormat</code> that write <code>double</code> s
+   *         without scientific notation.
+   */
+  private static DecimalFormat createFormatter(int precision) {
+    // specify decimal separator explicitly to avoid problems in other locales
+    DecimalFormatSymbols symbols = new DecimalFormatSymbols();
+    symbols.setDecimalSeparator('.');
+    DecimalFormat format = new DecimalFormat("0."
+        + StringUtil.chars('#', precision), symbols);
+    format.setDecimalSeparatorAlwaysShown(false);
+    return format;
+  }
+
+}
diff --git a/src/com/vividsolutions/jts/io/package.html b/src/com/vividsolutions/jts/io/package.html
deleted file mode 100644
index 884feb8..0000000
--- a/src/com/vividsolutions/jts/io/package.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Contains the interfaces for converting JTS objects to and from other formats.
-<P>
-The Java Topology Suite (JTS) is a Java API that implements a core set of spatial data operations using an explicit precision model and robust geometric algorithms. JTS is intended to be used in the development of applications that support the validation, cleaning, integration and querying of spatial datasets.
-<P>
-JTS attempts to implement the OpenGIS Simple Features Specification (SFS) as accurately as possible.  In some cases the SFS is unclear or omits a specification; in this case JTS attempts to choose a reasonable and consistent alternative.  Differences from and elaborations of the SFS are documented in this specification.
-
-<h2>Package Specification</h2>
-
-<ul>
-  <li>Java Topology Suite Technical Specifications
-  <li><A HREF="http://www.opengis.org/techno/specs.htm">
-      OpenGIS Simple Features Specification for SQL</A>
-</ul>
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/linearref/ExtractLineByLocation.java b/src/com/vividsolutions/jts/linearref/ExtractLineByLocation.java
index 601c139..40d2176 100644
--- a/src/com/vividsolutions/jts/linearref/ExtractLineByLocation.java
+++ b/src/com/vividsolutions/jts/linearref/ExtractLineByLocation.java
@@ -46,7 +46,7 @@ class ExtractLineByLocation
    * Computes the subline of a {@link LineString} between
    * two {@link LinearLocation}s on the line.
    * If the start location is after the end location,
-   * the computed geometry is reversed.
+   * the computed linear geometry has reverse orientation to the input line.
    *
    * @param line the line to use as the baseline
    * @param start the start location
diff --git a/src/com/vividsolutions/jts/linearref/LengthIndexedLine.java b/src/com/vividsolutions/jts/linearref/LengthIndexedLine.java
index 6c111ac..bf33d28 100644
--- a/src/com/vividsolutions/jts/linearref/LengthIndexedLine.java
+++ b/src/com/vividsolutions/jts/linearref/LengthIndexedLine.java
@@ -94,8 +94,9 @@ public class LengthIndexedLine
    */
   public Coordinate extractPoint(double index, double offsetDistance)
   {
-    LinearLocation loc = LengthLocationMap.getLocation(linearGeom, index);
-    return loc.getSegment(linearGeom).pointAlongOffset(loc.getSegmentFraction(), offsetDistance);
+    LinearLocation loc = LengthLocationMap.getLocation(linearGeom, index);
+    LinearLocation locLow = loc.toLowest(linearGeom);
+    return locLow.getSegment(linearGeom).pointAlongOffset(locLow.getSegmentFraction(), offsetDistance);
   }
 
   /**
diff --git a/src/com/vividsolutions/jts/linearref/LinearLocation.java b/src/com/vividsolutions/jts/linearref/LinearLocation.java
index 751b47b..c6a9b70 100644
--- a/src/com/vividsolutions/jts/linearref/LinearLocation.java
+++ b/src/com/vividsolutions/jts/linearref/LinearLocation.java
@@ -100,14 +100,23 @@ public class LinearLocation
     this(0, segmentIndex, segmentFraction);
   }
 
-  public LinearLocation(int componentIndex, int segmentIndex, double segmentFraction)
-  {
-    this.componentIndex = componentIndex;
-    this.segmentIndex = segmentIndex;
-    this.segmentFraction = segmentFraction;
-    normalize();
-  }
-
+  public LinearLocation(int componentIndex, int segmentIndex, double segmentFraction)
+  {
+    this.componentIndex = componentIndex;
+    this.segmentIndex = segmentIndex;
+    this.segmentFraction = segmentFraction;
+    normalize();
+  }
+
+  private LinearLocation(int componentIndex, int segmentIndex, double segmentFraction, boolean doNormalize)
+  {
+    this.componentIndex = componentIndex;
+    this.segmentIndex = segmentIndex;
+    this.segmentFraction = segmentFraction;
+    if (doNormalize) 
+      normalize();
+  }
+
   /**
    * Creates a new location equal to a given one.
    * 
@@ -430,7 +439,31 @@ public class LinearLocation
     return segmentIndex >= nseg
         || (segmentIndex == nseg && segmentFraction >= 1.0);
   }
-    
+  
+  /**
+   * Converts a linear location to the lowest equivalent location index.
+   * The lowest index has the lowest possible component and segment indices.
+   * <p>
+   * Specifically:
+   * <ul>
+   * <li>if the location point is an endpoint, a location value is returned as (nseg-1, 1.0)
+   * <li>if the location point is ambiguous (i.e. an endpoint and a startpoint), the lowest endpoint location is returned
+   * </ul>
+   * If the location index is already the lowest possible value, the original location is returned.
+   * 
+   * @param linearGeom the linear geometry referenced by this location
+   * @return the lowest equivalent location
+   */
+  public LinearLocation toLowest(Geometry linearGeom)
+  {
+    // TODO: compute lowest component index
+    LineString lineComp = (LineString) linearGeom.getGeometryN(componentIndex);
+    int nseg = lineComp.getNumPoints() - 1;
+    // if not an endpoint can be returned directly
+    if (segmentIndex < nseg) return this;
+    return new LinearLocation(componentIndex, nseg, 1.0, false);
+  }
+  
   /**
    * Copies this location
    *
diff --git a/src/com/vividsolutions/jts/linearref/LocationIndexedLine.java b/src/com/vividsolutions/jts/linearref/LocationIndexedLine.java
index 262a109..2dbcb71 100644
--- a/src/com/vividsolutions/jts/linearref/LocationIndexedLine.java
+++ b/src/com/vividsolutions/jts/linearref/LocationIndexedLine.java
@@ -94,17 +94,20 @@ public class LocationIndexedLine
    * @return the Coordinate at the given index
    */
   public Coordinate extractPoint(LinearLocation index, double offsetDistance)
-  {
-    return index.getSegment(linearGeom).pointAlongOffset(index.getSegmentFraction(), offsetDistance);
+  {
+    LinearLocation indexLow = index.toLowest(linearGeom);
+    return indexLow.getSegment(linearGeom).pointAlongOffset(indexLow.getSegmentFraction(), offsetDistance);
   }
 
   /**
    * Computes the {@link LineString} for the interval
    * on the line between the given indices.
+   * If the start location is after the end location,
+   * the computed linear geometry has reverse orientation to the input line.
    *
    * @param startIndex the index of the start of the interval
    * @param endIndex the index of the end of the interval
-   * @return the linear interval between the indices
+   * @return the linear geometry between the indices
    */
   public Geometry extractLine(LinearLocation startIndex, LinearLocation endIndex)
   {
diff --git a/src/com/vividsolutions/jts/linearref/package.html b/src/com/vividsolutions/jts/linearref/package.html
deleted file mode 100644
index e7e79d7..0000000
--- a/src/com/vividsolutions/jts/linearref/package.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Contains classes and interfaces implementing linear referencing on linear geometries
-
-<H3>Linear Referencing</H3>
-
-Linear Referencing is a way of defining positions along linear geometries
-(<code>LineStrings</code> and <code>MultiLineStrings</code>).
-It is used extensively in linear network systems.
-There are numerous possible <b>Linear Referencing Methods</b> which
-can be used to define positions along linear geometry.
-This package supports two:
-<ul>
-<li><b>Linear Location</b> - a linear location is a triple
-<code>(component index, segment index, segment fraction)</code>
-which precisely specifies a point on a linear geometry.
-It allows for efficient mapping of the index value to actual coordinate values.
-<li><b>Length</b> - the natural concept of using the length along
-the geometry to specify a position.
-
-<h2>Package Specification</h2>
-
-<ul>
-  <li>Java Topology Suite Technical Specifications
-  <li><A HREF="http://www.opengis.org/techno/specs.htm">
-      OpenGIS Simple Features Specification for SQL</A>
-</ul>
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/math/DD.java b/src/com/vividsolutions/jts/math/DD.java
index db77911..d5a9a0a 100644
--- a/src/com/vividsolutions/jts/math/DD.java
+++ b/src/com/vividsolutions/jts/math/DD.java
@@ -77,6 +77,19 @@ import java.io.*;
  * care to ensure that aliasing errors are not created
  * and constant values are not changed.
  * <p>
+ * For example, the following code example constructs three DD instances:
+ * two to hold the input values and one to hold the result of the addition.
+ * <pre>
+ *     DD a = new DD(2.0);
+ *     DD b = new DD(3.0);
+ *     DD c = a.add(b);
+ * </pre>
+ * In contrast, the following approach uses only one object:
+ * <pre>
+ *     DD a = new DD(2.0);
+ *     a.selfAdd(3.0);
+ * </pre>
+ * <p>
  * This implementation uses algorithms originally designed variously by 
  * Knuth, Kahan, Dekker, and Linnainmaa.  
  * Douglas Priest developed the first C implementation of these techniques. 
@@ -294,7 +307,30 @@ public strictfp final class DD
   */
   
   /**
-   * Returns a DoubleDouble whose value is <tt>(this + y)</tt>.
+   * Set the value for the DD object. This method supports the mutating
+   * operations concept described in the class documentation (see above).
+   * @param value a DD instance supplying an extended-precision value.
+   * @return a self-reference to the DD instance.
+   */
+  public DD setValue(DD value) {
+    init(value);
+    return this;
+  }
+  
+  /**
+   * Set the value for the DD object. This method supports the mutating
+   * operations concept described in the class documentation (see above).
+   * @param value a floating point value to be stored in the instance.
+   * @return a self-reference to the DD instance.
+   */
+  public DD setValue(double value) {
+    init(value);
+    return this;
+  }
+  
+
+  /**
+   * Returns a new DoubleDouble whose value is <tt>(this + y)</tt>.
    * 
    * @param y the addend
    * @return <tt>(this + y)</tt>
@@ -305,7 +341,7 @@ public strictfp final class DD
   }
   
   /**
-   * Returns a DoubleDouble whose value is <tt>(this + y)</tt>.
+   * Returns a new DoubleDouble whose value is <tt>(this + y)</tt>.
    * 
    * @param y the addend
    * @return <tt>(this + y)</tt>
@@ -428,7 +464,7 @@ public strictfp final class DD
   }
   
   /**
-   * Returns a DoubleDouble whose value is <tt>-this</tt>.
+   * Returns a new DoubleDouble whose value is <tt>-this</tt>.
    * 
    * @return <tt>-this</tt>
    */
@@ -734,6 +770,19 @@ public strictfp final class DD
   }
   
   /**
+   * Squares this object.
+   * To prevent altering constants, 
+   * this method <b>must only</b> be used on values known to 
+   * be newly created. 
+   * 
+   * @return the square of this value.
+   */
+  public DD selfSqr()
+  {
+    return this.selfMultiply(this);
+  }
+  
+  /**
    * Computes the square of this value.
    * 
    * @return the square of this value.
diff --git a/src/com/vividsolutions/jts/noding/FastNodingValidator.java b/src/com/vividsolutions/jts/noding/FastNodingValidator.java
index b09dfbf..c1beffc 100644
--- a/src/com/vividsolutions/jts/noding/FastNodingValidator.java
+++ b/src/com/vividsolutions/jts/noding/FastNodingValidator.java
@@ -61,6 +61,14 @@ import com.vividsolutions.jts.io.*;
  */
 public class FastNodingValidator 
 {
+  public static List computeIntersections(Collection segStrings)
+  {
+    FastNodingValidator nv = new FastNodingValidator(segStrings);
+    nv.setFindAllIntersections(true);
+    nv.isValid();
+    return nv.getIntersections();
+  }
+  
   private LineIntersector li = new RobustLineIntersector();
 
   private Collection segStrings;
@@ -83,6 +91,13 @@ public class FastNodingValidator
     this.findAllIntersections = findAllIntersections;
   }
   
+  /**
+   * Gets a list of all intersections found.
+   * Intersections are represented as {@link Coordinate}s.
+   * List is empty if none were found.
+   * 
+   * @return a list of Coordinate
+   */
   public List getIntersections()
   {
     return segInt.getIntersections();
diff --git a/src/com/vividsolutions/jts/noding/FastSegmentSetIntersectionFinder.java b/src/com/vividsolutions/jts/noding/FastSegmentSetIntersectionFinder.java
index 3562bb1..435b1b2 100644
--- a/src/com/vividsolutions/jts/noding/FastSegmentSetIntersectionFinder.java
+++ b/src/com/vividsolutions/jts/noding/FastSegmentSetIntersectionFinder.java
@@ -34,7 +34,6 @@
 package com.vividsolutions.jts.noding;
 
 import java.util.*;
-import com.vividsolutions.jts.algorithm.*;
 
 /**
  * Finds if two sets of {@link SegmentString}s intersect.
@@ -42,28 +41,26 @@ import com.vividsolutions.jts.algorithm.*;
  * against a target set of lines.
  * Short-circuited to return as soon an intersection is found.
  *
+ * Immutable and thread-safe.
+ *
  * @version 1.7
  */
 public class FastSegmentSetIntersectionFinder 
 {
-	private SegmentSetMutualIntersector segSetMutInt; 
+	private final SegmentSetMutualIntersector segSetMutInt; 
 	// for testing purposes
-//	private SimpleSegmentSetMutualIntersector mci;  
-
+	// private SimpleSegmentSetMutualIntersector mci;  
+
+	/**
+	 * Creates an intersection finder against a given set of segment strings.
+	 * 
+	 * @param baseSegStrings the segment strings to search for intersections
+	 */
 	public FastSegmentSetIntersectionFinder(Collection baseSegStrings)
 	{
-		init(baseSegStrings);
+	    segSetMutInt = new MCIndexSegmentSetMutualIntersector(baseSegStrings);
 	}
-	
-	private void init(Collection baseSegStrings)
-	{
-    segSetMutInt = new MCIndexSegmentSetMutualIntersector();
-//    segSetMutInt = new MCIndexIntersectionSegmentSetMutualIntersector();
-    
-//		mci = new SimpleSegmentSetMutualIntersector();
-		segSetMutInt.setBaseSegments(baseSegStrings);
-	}
-	
+		
 	/**
 	 * Gets the segment set intersector used by this class.
 	 * This allows other uses of the same underlying indexed structure.
@@ -74,23 +71,30 @@ public class FastSegmentSetIntersectionFinder
 	{
 		return segSetMutInt;
 	}
-	
-  private static LineIntersector li = new RobustLineIntersector();
-
+	
+	/**
+	 * Tests for intersections with a given set of target {@link SegmentString}s.
+	 * 
+	 * @param segStrings the SegmentStrings to test
+	 * @return true if an intersection is found
+	 */
 	public boolean intersects(Collection segStrings)
-	{
-		SegmentIntersectionDetector intFinder = new SegmentIntersectionDetector(li);
-		segSetMutInt.setSegmentIntersector(intFinder);
-
-		segSetMutInt.process(segStrings);
-		return intFinder.hasIntersection();
+	{
+		SegmentIntersectionDetector intFinder = new SegmentIntersectionDetector();
+		return intersects(segStrings, intFinder);
 	}
-	
+	
+	/**
+	 * Tests for intersections with a given set of target {@link SegmentString}s.
+	 * using a given SegmentIntersectionDetector.
+	 * 
+	 * @param segStrings the SegmentStrings to test
+	 * @param intDetector the intersection detector to use
+	 * @return true if the detector reports intersections
+	 */
 	public boolean intersects(Collection segStrings, SegmentIntersectionDetector intDetector)
 	{
-		segSetMutInt.setSegmentIntersector(intDetector);
-
-		segSetMutInt.process(segStrings);
-		return intDetector.hasIntersection();
+		segSetMutInt.process(segStrings, intDetector);
+ 		return intDetector.hasIntersection();
 	}
 }
diff --git a/src/com/vividsolutions/jts/noding/InteriorIntersectionFinder.java b/src/com/vividsolutions/jts/noding/InteriorIntersectionFinder.java
index 6ccaf30..7fed6c9 100644
--- a/src/com/vividsolutions/jts/noding/InteriorIntersectionFinder.java
+++ b/src/com/vividsolutions/jts/noding/InteriorIntersectionFinder.java
@@ -48,12 +48,56 @@ import com.vividsolutions.jts.algorithm.LineIntersector;
 public class InteriorIntersectionFinder
     implements SegmentIntersector
 {
-	private boolean findAllIntersections = false;
-	private boolean isCheckEndSegmentsOnly = false;
+	/**
+	 * Creates an intersection finder which tests if there is at least one interior intersection.
+	 * Uses short-circuiting for efficient performance.
+	 * The intersection found is recorded.
+	 * 
+	 * @param li a line intersector
+	 * @return a intersection finder which tests if there is at least one interior intersection.
+	 */
+	public static InteriorIntersectionFinder createAnyIntersectionFinder(LineIntersector li)
+	{
+		return new InteriorIntersectionFinder(li);
+	}
+	
+	/**
+	 * Creates an intersection finder which finds all interior intersections.
+	 * The intersections are recorded for later inspection.
+	 * 
+	 * @param li a line intersector
+	 * @return a intersection finder which finds all interior intersections.
+	 */
+	public static InteriorIntersectionFinder createAllIntersectionsFinder(LineIntersector li)
+	{
+		InteriorIntersectionFinder finder = new InteriorIntersectionFinder(li);
+		finder.setFindAllIntersections(true);
+		return finder;
+	}
+	
+	/**
+	 * Creates an intersection finder which counts all interior intersections.
+	 * The intersections are note recorded to reduce memory usage.
+	 * 
+	 * @param li a line intersector
+	 * @return a intersection finder which counts all interior intersections.
+	 */
+	public static InteriorIntersectionFinder createIntersectionCounter(LineIntersector li)
+	{
+		InteriorIntersectionFinder finder = new InteriorIntersectionFinder(li);
+		finder.setFindAllIntersections(true);
+		finder.setKeepIntersections(false);
+		return finder;
+	}
+	
+  private boolean findAllIntersections = false;
+  private boolean isCheckEndSegmentsOnly = false;
   private LineIntersector li;
   private Coordinate interiorIntersection = null;
   private Coordinate[] intSegments = null;
   private List intersections = new ArrayList();
+  private int intersectionCount = 0;
+  private boolean keepIntersections = true;
 
   /**
    * Creates an intersection finder which finds an interior intersection
@@ -67,17 +111,54 @@ public class InteriorIntersectionFinder
     interiorIntersection = null;
   }
 
+  /**
+   * Sets whether all intersections should be computed.
+   * When this is <code>false</code> (the default value)
+   * the value of {@link #isDone()} is <code>true</code> after the first intersection is found.
+   * <p>
+   * Default is <code>false</code>.
+   * 
+   * @param findAllIntersections whether all intersections should be computed
+   */
   public void setFindAllIntersections(boolean findAllIntersections)
   {
     this.findAllIntersections = findAllIntersections;
   }
   
+  /**
+   * Sets whether intersection points are recorded.
+   * If the only need is to count intersection points, this can be set to <code>false</code>.
+   * <p>
+   * Default is <code>true</code>.
+   * 
+   * @param keepIntersections indicates whether intersections should be recorded
+   */
+  public void setKeepIntersections(boolean keepIntersections)
+  {
+    this.keepIntersections = keepIntersections;
+  }
+  
+  /**
+   * Gets the intersections found.
+   * 
+   * @return a List of {@link Coordinate)
+   */
   public List getIntersections()
   {
     return intersections;
   }
   
   /**
+   * Gets the count of intersections found.
+   * 
+   * @return the intersection count
+   */
+  public int count()
+  {
+    return intersectionCount;
+  }
+  
+  /**
    * Sets whether only end segments should be tested for interior intersection.
    * This is a performance optimization that may be used if
    * the segments have been previously noded by an appropriate algorithm.
@@ -136,7 +217,7 @@ public class InteriorIntersectionFinder
       )
   {
   	// short-circuit if intersection already found
-  	if (hasIntersection())
+  	if (! findAllIntersections && hasIntersection())
   		return;
   	
     // don't bother intersecting a segment with itself
@@ -169,7 +250,8 @@ public class InteriorIntersectionFinder
       	intSegments[3] = p11;
       	
       	interiorIntersection = li.getIntersection(0);
-      	intersections.add(interiorIntersection);
+      	if (keepIntersections) intersections.add(interiorIntersection);
+      	intersectionCount++;
       }
     }
   }
@@ -194,4 +276,5 @@ public class InteriorIntersectionFinder
   	if (findAllIntersections) return false;
   	return interiorIntersection != null;
   }
+
 }
\ No newline at end of file
diff --git a/src/com/vividsolutions/jts/noding/IntersectionFinderAdder.java b/src/com/vividsolutions/jts/noding/InteriorIntersectionFinderAdder.java
similarity index 85%
copy from src/com/vividsolutions/jts/noding/IntersectionFinderAdder.java
copy to src/com/vividsolutions/jts/noding/InteriorIntersectionFinderAdder.java
index eec1059..ed8c4e7 100644
--- a/src/com/vividsolutions/jts/noding/IntersectionFinderAdder.java
+++ b/src/com/vividsolutions/jts/noding/InteriorIntersectionFinderAdder.java
@@ -38,12 +38,17 @@ import com.vividsolutions.jts.algorithm.LineIntersector;
 import com.vividsolutions.jts.util.Debug;
 
 /**
- * Finds proper and interior intersections in a set of SegmentStrings,
- * and adds them as nodes.
+ * Finds <b>interior</b> intersections between line segments in {@link NodedSegmentString}s,
+ * and adds them as nodes
+ * using {@link NodedSegmentString#addIntersection(LineIntersector, int, int, int)}.
+ * <p>
+ * This class is used primarily for Snap-Rounding.  
+ * For general-purpose noding, use {@link IntersectionAdder}.
  *
  * @version 1.7
+ * @see IntersectionAdder
  */
-public class IntersectionFinderAdder
+public class InteriorIntersectionFinderAdder
     implements SegmentIntersector
 {
   private LineIntersector li;
@@ -55,7 +60,7 @@ public class IntersectionFinderAdder
    *
    * @param li the LineIntersector to use
    */
-  public IntersectionFinderAdder(LineIntersector li)
+  public InteriorIntersectionFinderAdder(LineIntersector li)
   {
     this.li = li;
     interiorIntersections = new ArrayList();
diff --git a/src/com/vividsolutions/jts/noding/IntersectionAdder.java b/src/com/vividsolutions/jts/noding/IntersectionAdder.java
index 694e221..a9fd3ba 100644
--- a/src/com/vividsolutions/jts/noding/IntersectionAdder.java
+++ b/src/com/vividsolutions/jts/noding/IntersectionAdder.java
@@ -32,18 +32,13 @@
  */
 package com.vividsolutions.jts.noding;
 
-import java.util.*;
-import com.vividsolutions.jts.geom.*;
 import com.vividsolutions.jts.algorithm.LineIntersector;
-import com.vividsolutions.jts.util.Debug;
+import com.vividsolutions.jts.geom.Coordinate;
 
 /**
- * Computes the intersections between two line segments in {@link SegmentString}s
- * and adds them to each string.
- * The {@link SegmentIntersector} is passed to a {@link Noder}.
- * The {@link SegmentIntersector#processIntersections(SegmentString, int, SegmentString, int)} method is called whenever the {@link Noder}
- * detects that two SegmentStrings <i>might</i> intersect.
- * This class is an example of the <i>Strategy</i> pattern.
+ * Computes the possible intersections between two line segments in {@link NodedSegmentString}s
+ * and adds them to each string 
+ * using {@link NodedSegmentString#addIntersection(LineIntersector, int, int, int)}.
  *
  * @version 1.7
  */
diff --git a/src/com/vividsolutions/jts/noding/IntersectionFinderAdder.java b/src/com/vividsolutions/jts/noding/IntersectionFinderAdder.java
index eec1059..0566e02 100644
--- a/src/com/vividsolutions/jts/noding/IntersectionFinderAdder.java
+++ b/src/com/vividsolutions/jts/noding/IntersectionFinderAdder.java
@@ -38,10 +38,16 @@ import com.vividsolutions.jts.algorithm.LineIntersector;
 import com.vividsolutions.jts.util.Debug;
 
 /**
- * Finds proper and interior intersections in a set of SegmentStrings,
- * and adds them as nodes.
+ * Finds <b>interior</b> intersections between line segments in {@link NodedSegmentString}s,
+ * and adds them as nodes
+ * using {@link NodedSegmentString#addIntersection(LineIntersector, int, int, int)}.
+ * <p>
+ * This class is used primarily for Snap-Rounding.  
+ * For general-purpose noding, use {@link IntersectionAdder}.
  *
  * @version 1.7
+ * @see IntersectionAdder
+ * @deprecated see InteriorIntersectionFinderAdder
  */
 public class IntersectionFinderAdder
     implements SegmentIntersector
diff --git a/src/com/vividsolutions/jts/noding/MCIndexSegmentSetMutualIntersector.java b/src/com/vividsolutions/jts/noding/MCIndexSegmentSetMutualIntersector.java
index 2a6833e..d631215 100644
--- a/src/com/vividsolutions/jts/noding/MCIndexSegmentSetMutualIntersector.java
+++ b/src/com/vividsolutions/jts/noding/MCIndexSegmentSetMutualIntersector.java
@@ -36,7 +36,6 @@ import java.util.*;
 
 import com.vividsolutions.jts.index.SpatialIndex;
 import com.vividsolutions.jts.index.chain.*;
-import com.vividsolutions.jts.index.quadtree.Quadtree;
 import com.vividsolutions.jts.index.strtree.STRtree;
 import com.vividsolutions.jts.noding.SegmentIntersector;
 import com.vividsolutions.jts.noding.SegmentString;
@@ -45,34 +44,46 @@ import com.vividsolutions.jts.noding.SegmentString;
  * Intersects two sets of {@link SegmentString}s using a index based
  * on {@link MonotoneChain}s and a {@link SpatialIndex}.
  *
+ * Thread-safe and immutable.
+ * 
  * @version 1.7
  */
-public class MCIndexSegmentSetMutualIntersector
-    extends SegmentSetMutualIntersector
+public class MCIndexSegmentSetMutualIntersector implements SegmentSetMutualIntersector
 {
-  /*
+  /**
   * The {@link SpatialIndex} used should be something that supports
-  * envelope (range) queries efficiently (such as a {@link Quadtree}
+  * envelope (range) queries efficiently (such as a 
+  * {@link com.vividsolutions.jts.index.quadtree.Quadtree}
   * or {@link STRtree}.
   */
-  private SpatialIndex index= new STRtree();
-  private int indexCounter = 0;
-  private int processCounter = 0;
-  // statistics
-  private int nOverlaps = 0;
+  private STRtree index = new STRtree();
 
-  public MCIndexSegmentSetMutualIntersector()
+  /**
+   * Constructs a new intersector for a given set of {@link SegmentStrings}.
+   * 
+   * @param baseSegStrings the base segment strings to intersect
+   */
+  public MCIndexSegmentSetMutualIntersector(Collection baseSegStrings)
   {
+	  initBaseSegments(baseSegStrings);
   }
 
+  /** 
+   * Gets the index constructed over the base segment strings.
+   * 
+   * NOTE: To retain thread-safety, treat returned value as immutable!
+   * 
+   * @return the constructed index
+   */
   public SpatialIndex getIndex() { return index; }
 
-  
-  public void setBaseSegments(Collection segStrings)
+  private void initBaseSegments(Collection segStrings)
   {
     for (Iterator i = segStrings.iterator(); i.hasNext(); ) {
       addToIndex((SegmentString) i.next());
     }
+    // build index to ensure thread-safety
+    index.build();
   }
   
   private void addToIndex(SegmentString segStr)
@@ -80,25 +91,39 @@ public class MCIndexSegmentSetMutualIntersector
     List segChains = MonotoneChainBuilder.getChains(segStr.getCoordinates(), segStr);
     for (Iterator i = segChains.iterator(); i.hasNext(); ) {
       MonotoneChain mc = (MonotoneChain) i.next();
-      mc.setId(indexCounter++);
       index.insert(mc.getEnvelope(), mc);
     }
   }
 
-  public void process(Collection segStrings)
+  /**
+   * Calls {@link SegmentIntersector#processIntersections(SegmentString, int, SegmentString, int)} 
+   * for all <i>candidate</i> intersections between
+   * the given collection of SegmentStrings and the set of indexed segments. 
+   * 
+   * @param a set of segments to intersect
+   * @param the segment intersector to use
+   */
+  public void process(Collection segStrings, SegmentIntersector segInt)
   {
-  	processCounter = indexCounter + 1;
-  	nOverlaps = 0;
   	List monoChains = new ArrayList();
     for (Iterator i = segStrings.iterator(); i.hasNext(); ) {
       addToMonoChains((SegmentString) i.next(), monoChains);
     }
-    intersectChains(monoChains);
+    intersectChains(monoChains, segInt);
 //    System.out.println("MCIndexBichromaticIntersector: # chain overlaps = " + nOverlaps);
 //    System.out.println("MCIndexBichromaticIntersector: # oct chain overlaps = " + nOctOverlaps);
   }
 
-  private void intersectChains(List monoChains)
+  private void addToMonoChains(SegmentString segStr, List monoChains)
+  {
+    List segChains = MonotoneChainBuilder.getChains(segStr.getCoordinates(), segStr);
+    for (Iterator i = segChains.iterator(); i.hasNext(); ) {
+      MonotoneChain mc = (MonotoneChain) i.next();
+      monoChains.add(mc);
+    }
+  }
+
+  private void intersectChains(List monoChains, SegmentIntersector segInt)
   {
     MonotoneChainOverlapAction overlapAction = new SegmentOverlapAction(segInt);
 
@@ -108,22 +133,11 @@ public class MCIndexSegmentSetMutualIntersector
       for (Iterator j = overlapChains.iterator(); j.hasNext(); ) {
         MonotoneChain testChain = (MonotoneChain) j.next();
         queryChain.computeOverlaps(testChain, overlapAction);
-        nOverlaps++;
         if (segInt.isDone()) return;
       }
     }
   }
 
-  private void addToMonoChains(SegmentString segStr, List monoChains)
-  {
-    List segChains = MonotoneChainBuilder.getChains(segStr.getCoordinates(), segStr);
-    for (Iterator i = segChains.iterator(); i.hasNext(); ) {
-      MonotoneChain mc = (MonotoneChain) i.next();
-      mc.setId(processCounter++);
-      monoChains.add(mc);
-    }
-  }
-
   public class SegmentOverlapAction
       extends MonotoneChainOverlapAction
   {
diff --git a/src/com/vividsolutions/jts/noding/SegmentIntersectionDetector.java b/src/com/vividsolutions/jts/noding/SegmentIntersectionDetector.java
index 529bf2c..af58827 100644
--- a/src/com/vividsolutions/jts/noding/SegmentIntersectionDetector.java
+++ b/src/com/vividsolutions/jts/noding/SegmentIntersectionDetector.java
@@ -32,16 +32,14 @@
  */
 package com.vividsolutions.jts.noding;
 
-
-import com.vividsolutions.jts.geom.*;
 import com.vividsolutions.jts.algorithm.LineIntersector;
-import com.vividsolutions.jts.noding.*;;
-//import com.vividsolutions.jts.util.Debug;
+import com.vividsolutions.jts.algorithm.RobustLineIntersector;
+import com.vividsolutions.jts.geom.Coordinate;
 
 /**
  * Detects and records an intersection between two {@link SegmentString}s,
  * if one exists.  Only a single intersection is recorded.
- * This strategy can be configured to search for proper intersections.
+ * This strategy can be configured to search for <b>proper intersections>/b>.
  * In this case, the presence of <i>any</i> kind of intersection will still be recorded,
  * but searching will continue until either a proper intersection has been found
  * or no intersections are detected.
@@ -63,20 +61,38 @@ public class SegmentIntersectionDetector
   private Coordinate[] intSegments = null;
 
   /**
-   * Creates an intersection finder 
+   * Creates an intersection finder using a {@link RobustLineIntersector}.
+   */
+  public SegmentIntersectionDetector()
+  {
+    this(new RobustLineIntersector());
+  }
+
+  /**
+   * Creates an intersection finder using a given LineIntersector.
    *
    * @param li the LineIntersector to use
    */
   public SegmentIntersectionDetector(LineIntersector li)
   {
     this.li = li;
-   }
+  }
 
+  /**
+   * Sets whether processing must continue until a proper intersection is found.
+   * 
+   * @param findProper true if processing should continue until a proper intersection is found
+   */
   public void setFindProper(boolean findProper)
   {
     this.findProper = findProper;
   }
   
+  /**
+   * Sets whether processing can terminate once any intersection is found.
+   * 
+   * @param findAllTypes true if processing can terminate once any intersection is found.
+   */
   public void setFindAllIntersectionTypes(boolean findAllTypes)
   {
     this.findAllTypes = findAllTypes;
@@ -193,6 +209,13 @@ public class SegmentIntersectionDetector
 		}
   }
   
+  /**
+   * Tests whether processing can terminate,
+   * because all required information has been obtained
+   * (e.g. an intersection of the desired type has been detected).
+   * 
+   * @return true if processing can terminate
+   */
   public boolean isDone()
   { 
     /**
diff --git a/src/com/vividsolutions/jts/noding/SegmentNodeList.java b/src/com/vividsolutions/jts/noding/SegmentNodeList.java
index a5e32e0..6579c9d 100644
--- a/src/com/vividsolutions/jts/noding/SegmentNodeList.java
+++ b/src/com/vividsolutions/jts/noding/SegmentNodeList.java
@@ -34,6 +34,7 @@ package com.vividsolutions.jts.noding;
 
 import java.io.PrintStream;
 import java.util.*;
+
 import com.vividsolutions.jts.geom.*;
 import com.vividsolutions.jts.util.*;
 
@@ -250,11 +251,61 @@ public class SegmentNodeList
     for (int i = ei0.segmentIndex + 1; i <= ei1.segmentIndex; i++) {
       pts[ipt++] = edge.getCoordinate(i);
     }
-    if (useIntPt1) pts[ipt] = ei1.coord;
+    if (useIntPt1) pts[ipt] = new Coordinate(ei1.coord);
 
     return new NodedSegmentString(pts, edge.getData());
   }
 
+  /**
+   * Gets the list of coordinates for the fully noded segment string,
+   * including all original segment string vertices and vertices
+   * introduced by nodes in this list.
+   * Repeated coordinates are collapsed.
+   * 
+   * @return an array of Coordinates
+   * 
+   */
+  public Coordinate[] getSplitCoordinates()
+  {
+    CoordinateList coordList = new CoordinateList();
+    // ensure that the list has entries for the first and last point of the edge
+    addEndpoints();
+
+    Iterator it = iterator();
+    // there should always be at least two entries in the list, since the endpoints are nodes
+    SegmentNode eiPrev = (SegmentNode) it.next();
+    while (it.hasNext()) {
+      SegmentNode ei = (SegmentNode) it.next();
+      addEdgeCoordinates(eiPrev, ei, coordList);
+      eiPrev = ei;
+    }
+    return coordList.toCoordinateArray();
+  }
+
+  private void addEdgeCoordinates(SegmentNode ei0, SegmentNode ei1,
+      CoordinateList coordList) {
+    int npts = ei1.segmentIndex - ei0.segmentIndex + 2;
+
+    Coordinate lastSegStartPt = edge.getCoordinate(ei1.segmentIndex);
+    // if the last intersection point is not equal to the its segment start pt,
+    // add it to the points list as well.
+    // (This check is needed because the distance metric is not totally reliable!)
+    // The check for point equality is 2D only - Z values are ignored
+    boolean useIntPt1 = ei1.isInterior() || ! ei1.coord.equals2D(lastSegStartPt);
+    if (! useIntPt1) {
+      npts--;
+    }
+
+    int ipt = 0;
+    coordList.add(new Coordinate(ei0.coord), false);
+    for (int i = ei0.segmentIndex + 1; i <= ei1.segmentIndex; i++) {
+      coordList.add(edge.getCoordinate(i));
+    }
+    if (useIntPt1) {
+      coordList.add(new Coordinate(ei1.coord));
+    }
+  }
+
   public void print(PrintStream out)
   {
     out.println("Intersections:");
diff --git a/src/com/vividsolutions/jts/noding/SegmentSetMutualIntersector.java b/src/com/vividsolutions/jts/noding/SegmentSetMutualIntersector.java
index cd8eaae..e3f07a1 100644
--- a/src/com/vividsolutions/jts/noding/SegmentSetMutualIntersector.java
+++ b/src/com/vividsolutions/jts/noding/SegmentSetMutualIntersector.java
@@ -37,40 +37,34 @@ import java.util.*;
 /**
  * An intersector for the red-blue intersection problem.
  * In this class of line arrangement problem,
- * two disjoint sets of linestrings are provided.
- * It is assumed that within
- * each set, no two linestrings intersect except possibly at their endpoints.
- * Implementations can take advantage of this fact to optimize processing.
+ * two disjoint sets of linestrings are intersected.
+ * <p>
+ * Implementing classes must provide a way
+ * of supplying the base set of segment strings to 
+ * test against (e.g. in the constructor, 
+ * for straightforward thread-safety).
+ * <p>
+ * In order to allow optimizing processing, 
+ * the following condition is assumed to hold for each set:
+ * <ul>
+ * <li>the only intersection between any two linestrings occurs at their endpoints.
+ * </ul>
+ * Implementations can take advantage of this fact to optimize processing
+ * (i.e by avoiding testing for intersections between linestrings
+ * belonging to the same set).
  *
  * @author Martin Davis
  * @version 1.10
  */
-public abstract class SegmentSetMutualIntersector
-{
-  protected SegmentIntersector segInt;
-
+public interface SegmentSetMutualIntersector
+{  
   /**
-   * Sets the {@link SegmentIntersector} to use with this intersector.
-   * The SegmentIntersector will either rocord or add intersection nodes
-   * for the input segment strings.
+   * Computes the intersections with a given set of {@link SegmentString}s,
+   * using the supplied {@link SegmentIntersector}.
    *
-   * @param segInt the segment intersector to use
-   */
-  public void setSegmentIntersector(SegmentIntersector segInt)
-  {
-    this.segInt = segInt;
-  }
-
-  /**
-   * 
    * @param segStrings a collection of {@link SegmentString}s to node
+   * @param segInt the intersection detector to either record intersection occurences
+   * 			 or add intersection nodes to the input segment strings.
    */
-  public abstract void setBaseSegments(Collection segStrings);
-  
-  /**
-   * Computes the intersections for two collections of {@link SegmentString}s.
-   *
-  * @param segStrings a collection of {@link SegmentString}s to node
-   */
-  public abstract void process(Collection segStrings);
+  void process(Collection segStrings, SegmentIntersector segInt);
 }
\ No newline at end of file
diff --git a/src/com/vividsolutions/jts/noding/SegmentStringUtil.java b/src/com/vividsolutions/jts/noding/SegmentStringUtil.java
index 3ec960d..ef38ea5 100644
--- a/src/com/vividsolutions/jts/noding/SegmentStringUtil.java
+++ b/src/com/vividsolutions/jts/noding/SegmentStringUtil.java
@@ -33,9 +33,17 @@
 
 package com.vividsolutions.jts.noding;
 
-import java.util.*;
-import com.vividsolutions.jts.geom.*;
-import com.vividsolutions.jts.geom.util.LinearComponentExtracter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
+import com.vividsolutions.jts.geom.Coordinate;
+import com.vividsolutions.jts.geom.Geometry;
+import com.vividsolutions.jts.geom.GeometryFactory;
+import com.vividsolutions.jts.geom.LineString;
+import com.vividsolutions.jts.geom.MultiLineString;
+import com.vividsolutions.jts.geom.util.LinearComponentExtracter;
 
 /**
  * Utility methods for processing {@link SegmentString}s.
@@ -45,24 +53,68 @@ import com.vividsolutions.jts.geom.util.LinearComponentExtracter;
  */
 public class SegmentStringUtil 
 {
-  /**
-   * Extracts all linear components from a given {@link Geometry}
-   * to {@link SegmentString}s.
-   * The SegmentString data item is set to be the source Geometry.
-   * 
-   * @param geom the geometry to extract from
-   * @return a List of SegmentStrings
-   */
-  public static List extractSegmentStrings(Geometry geom)
-  {
-    List segStr = new ArrayList();
-    List lines = LinearComponentExtracter.getLines(geom);
-    for (Iterator i = lines.iterator(); i.hasNext(); ) {
-      LineString line = (LineString) i.next();
-      Coordinate[] pts = line.getCoordinates();
-      segStr.add(new NodedSegmentString(pts, geom));
-    }
-    return segStr;
+  /**
+   * Extracts all linear components from a given {@link Geometry}
+   * to {@link SegmentString}s.
+   * The SegmentString data item is set to be the source Geometry.
+   * 
+   * @param geom the geometry to extract from
+   * @return a List of SegmentStrings
+   */
+  public static List extractSegmentStrings(Geometry geom)
+  {
+    return extractNodedSegmentStrings(geom);
+  }
+
+  /**
+   * Extracts all linear components from a given {@link Geometry}
+   * to {@link SegmentString}s.
+   * The SegmentString data item is set to be the source Geometry.
+   * 
+   * @param geom the geometry to extract from
+   * @return a List of SegmentStrings
+   */
+  public static List extractNodedSegmentStrings(Geometry geom)
+  {
+    List segStr = new ArrayList();
+    List lines = LinearComponentExtracter.getLines(geom);
+    for (Iterator i = lines.iterator(); i.hasNext(); ) {
+      LineString line = (LineString) i.next();
+      Coordinate[] pts = line.getCoordinates();
+      segStr.add(new NodedSegmentString(pts, geom));
+    }
+    return segStr;
+  }
+
+  /**
+   * Converts a collection of {@link SegmentString}s into a {@link Geometry}.
+   * The geometry will be either a {@link LineString} or a {@link MultiLineString} (possibly empty).
+   *
+   * @param segStrings a collection of SegmentStrings
+   * @return a LineString or MultiLineString
+   */
+  public static Geometry toGeometry(Collection segStrings, GeometryFactory geomFact)
+  {
+    LineString[] lines = new LineString[segStrings.size()];
+    int index = 0;
+    for (Iterator i = segStrings.iterator(); i.hasNext(); ) {
+      SegmentString ss = (SegmentString) i.next();
+      LineString line = geomFact.createLineString(ss.getCoordinates());
+      lines[index++] = line;
+    }
+    if (lines.length == 1) return lines[0];
+    return geomFact.createMultiLineString(lines);
+  }
+
+  public static String toString(List segStrings)
+  {
+	StringBuffer buf = new StringBuffer();
+    for (Iterator i = segStrings.iterator(); i.hasNext(); ) {
+        SegmentString segStr = (SegmentString) i.next();
+        buf.append(segStr.toString());
+        buf.append("\n");
+        
+    }
+    return buf.toString();
   }
-
 }
diff --git a/src/com/vividsolutions/jts/noding/SimpleSegmentSetMutualIntersector.java b/src/com/vividsolutions/jts/noding/SimpleSegmentSetMutualIntersector.java
index da06206..1c65d93 100644
--- a/src/com/vividsolutions/jts/noding/SimpleSegmentSetMutualIntersector.java
+++ b/src/com/vividsolutions/jts/noding/SimpleSegmentSetMutualIntersector.java
@@ -39,44 +39,61 @@ import com.vividsolutions.jts.geom.Coordinate;
 
 /**
  * Intersects two sets of {@link SegmentString}s using 
- * brute-force comparasion.
+ * brute-force comparison.
  *
  * @version 1.7
  */
-public class SimpleSegmentSetMutualIntersector
-    extends SegmentSetMutualIntersector
+public class SimpleSegmentSetMutualIntersector implements SegmentSetMutualIntersector
 {
-	private Collection baseSegStrings;
+  private final Collection baseSegStrings;
 
-  public SimpleSegmentSetMutualIntersector()
+  /**
+   * Constructs a new intersector for a given set of {@link SegmentStrings}.
+   * 
+   * @param baseSegStrings the base segment strings to intersect
+   */
+  public SimpleSegmentSetMutualIntersector(Collection segStrings)
   {
+	  this.baseSegStrings = segStrings;
   }
-  
-  public void setBaseSegments(Collection segStrings)
-  {
-  	this.baseSegStrings = segStrings;
-  }
-  
-  public void process(Collection segStrings)
-  {
+
+  /**
+   * Calls {@link SegmentIntersector#processIntersections(SegmentString, int, SegmentString, int)} 
+   * for all <i>candidate</i> intersections between
+   * the given collection of SegmentStrings and the set of base segments. 
+   * 
+   * @param a set of segments to intersect
+   * @param the segment intersector to use
+   */
+  public void process(Collection segStrings, SegmentIntersector segInt) {
     for (Iterator i = baseSegStrings.iterator(); i.hasNext(); ) {
     	SegmentString baseSS = (SegmentString) i.next();
     	for (Iterator j = segStrings.iterator(); j.hasNext(); ) {
-      	SegmentString ss = (SegmentString) j.next();
-      	intersect(baseSS, ss);
-        if (segInt.isDone()) return;
+	      	SegmentString ss = (SegmentString) j.next();
+	      	intersect(baseSS, ss, segInt);
+	        if (segInt.isDone()) 
+	        	return;
     	}
     }
   }
 
-  private void intersect(SegmentString ss0, SegmentString ss1)
+  /**
+   * Processes all of the segment pairs in the given segment strings
+   * using the given SegmentIntersector.
+   * 
+   * @param ss0 a Segment string
+   * @param ss1 a segment string
+   * @param segInt the segment intersector to use
+   */
+  private void intersect(SegmentString ss0, SegmentString ss1, SegmentIntersector segInt)
   {
     Coordinate[] pts0 = ss0.getCoordinates();
     Coordinate[] pts1 = ss1.getCoordinates();
     for (int i0 = 0; i0 < pts0.length - 1; i0++) {
       for (int i1 = 0; i1 < pts1.length - 1; i1++) {
         segInt.processIntersections(ss0, i0, ss1, i1);
-        if (segInt.isDone()) return;
+        if (segInt.isDone()) 
+        	return;
       }
     }
 
diff --git a/src/com/vividsolutions/jts/noding/package.html b/src/com/vividsolutions/jts/noding/package.html
deleted file mode 100644
index 158ee55..0000000
--- a/src/com/vividsolutions/jts/noding/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Classes to compute nodings for arrangements of line segments and line segment sequences.
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/noding/snapround/HotPixel.java b/src/com/vividsolutions/jts/noding/snapround/HotPixel.java
index 2de94ed..dd2a6a9 100644
--- a/src/com/vividsolutions/jts/noding/snapround/HotPixel.java
+++ b/src/com/vividsolutions/jts/noding/snapround/HotPixel.java
@@ -35,6 +35,7 @@ package com.vividsolutions.jts.noding.snapround;
 
 import com.vividsolutions.jts.algorithm.*;
 import com.vividsolutions.jts.geom.*;
+import com.vividsolutions.jts.io.WKTWriter;
 import com.vividsolutions.jts.noding.*;
 import com.vividsolutions.jts.util.*;
 
@@ -222,13 +223,14 @@ public class HotPixel
    * Tests whether the segment p0-p1 intersects the hot pixel tolerance square.
    * Because the tolerance square point set is partially open (along the
    * top and right) the test needs to be more sophisticated than
-   * simply checking for any intersection.  However, it
-   * can take advantage of the fact that because the hot pixel edges
-   * do not lie on the coordinate grid.  It is sufficient to check
-   * if there is at least one of:
+   * simply checking for any intersection.  
+   * However, it can take advantage of the fact that the hot pixel edges
+   * do not lie on the coordinate grid.  
+   * It is sufficient to check if any of the following occur:
    * <ul>
-   * <li>a proper intersection with the segment and any hot pixel edge
-   * <li>an intersection between the segment and both the left and bottom edges
+   * <li>a proper intersection between the segment and any hot pixel edge
+   * <li>an intersection between the segment and <b>both</b> the left and bottom hot pixel edges
+   * (which detects the case where the segment intersects the bottom left hot pixel corner)
    * <li>an intersection between a segment endpoint and the hot pixel coordinate
    * </ul>
    *
@@ -240,7 +242,9 @@ public class HotPixel
   {
     boolean intersectsLeft = false;
     boolean intersectsBottom = false;
-
+    //System.out.println("Hot Pixel: " + WKTWriter.toLineString(corner));
+    //System.out.println("Line: " + WKTWriter.toLineString(p0, p1));
+    
     li.computeIntersection(p0, p1, corner[0], corner[1]);
     if (li.isProper()) return true;
 
diff --git a/src/com/vividsolutions/jts/noding/snapround/MCIndexPointSnapper.java b/src/com/vividsolutions/jts/noding/snapround/MCIndexPointSnapper.java
index 957926b..bd400a0 100644
--- a/src/com/vividsolutions/jts/noding/snapround/MCIndexPointSnapper.java
+++ b/src/com/vividsolutions/jts/noding/snapround/MCIndexPointSnapper.java
@@ -50,7 +50,7 @@ import com.vividsolutions.jts.noding.SegmentString;
  */
 public class MCIndexPointSnapper
 {
-  public static int nSnaps = 0;
+  //public static final int nSnaps = 0;
 
   private STRtree index;
 
diff --git a/src/com/vividsolutions/jts/noding/snapround/MCIndexSnapRounder.java b/src/com/vividsolutions/jts/noding/snapround/MCIndexSnapRounder.java
index ce95c07..00007e6 100644
--- a/src/com/vividsolutions/jts/noding/snapround/MCIndexSnapRounder.java
+++ b/src/com/vividsolutions/jts/noding/snapround/MCIndexSnapRounder.java
@@ -117,7 +117,7 @@ public class MCIndexSnapRounder
    */
   private List findInteriorIntersections(Collection segStrings, LineIntersector li)
   {
-    IntersectionFinderAdder intFinderAdder = new IntersectionFinderAdder(li);
+    InteriorIntersectionFinderAdder intFinderAdder = new InteriorIntersectionFinderAdder(li);
     noder.setSegmentIntersector(intFinderAdder);
     noder.computeNodes(segStrings);
     return intFinderAdder.getInteriorIntersections();
diff --git a/src/com/vividsolutions/jts/noding/snapround/SimpleSnapRounder.java b/src/com/vividsolutions/jts/noding/snapround/SimpleSnapRounder.java
index 2bcbb71..17072ab 100644
--- a/src/com/vividsolutions/jts/noding/snapround/SimpleSnapRounder.java
+++ b/src/com/vividsolutions/jts/noding/snapround/SimpleSnapRounder.java
@@ -119,7 +119,7 @@ public class SimpleSnapRounder
    */
   private List findInteriorIntersections(Collection segStrings, LineIntersector li)
   {
-    IntersectionFinderAdder intFinderAdder = new IntersectionFinderAdder(li);
+    InteriorIntersectionFinderAdder intFinderAdder = new InteriorIntersectionFinderAdder(li);
     SinglePassNoder noder = new MCIndexNoder();
     noder.setSegmentIntersector(intFinderAdder);
     noder.computeNodes(segStrings);
diff --git a/src/com/vividsolutions/jts/noding/snapround/package.html b/src/com/vividsolutions/jts/noding/snapround/package.html
deleted file mode 100644
index b141426..0000000
--- a/src/com/vividsolutions/jts/noding/snapround/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Contains classes to implement the Snap Rounding algorithm for noding linestrings.
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/operation/BoundaryOp.java b/src/com/vividsolutions/jts/operation/BoundaryOp.java
index 9406621..d6c5b67 100644
--- a/src/com/vividsolutions/jts/operation/BoundaryOp.java
+++ b/src/com/vividsolutions/jts/operation/BoundaryOp.java
@@ -51,6 +51,18 @@ import com.vividsolutions.jts.geomgraph.GeometryGraph;
 
 public class BoundaryOp
 {
+  public static Geometry getBoundary(Geometry g)
+  {
+    BoundaryOp bop = new BoundaryOp(g);
+    return bop.getBoundary();
+  }
+  
+  public static Geometry getBoundary(Geometry g, BoundaryNodeRule bnRule)
+  {
+    BoundaryOp bop = new BoundaryOp(g, bnRule);
+    return bop.getBoundary();
+  }
+  
   private Geometry geom;
   private GeometryFactory geomFact;
   private BoundaryNodeRule bnRule;
diff --git a/src/com/vividsolutions/jts/operation/buffer/BufferBuilder.java b/src/com/vividsolutions/jts/operation/buffer/BufferBuilder.java
index 4fe1e79..cfa7427 100644
--- a/src/com/vividsolutions/jts/operation/buffer/BufferBuilder.java
+++ b/src/com/vividsolutions/jts/operation/buffer/BufferBuilder.java
@@ -56,13 +56,13 @@ import com.vividsolutions.jts.util.*;
  * <p>
  * When computing buffers in floating point double-precision
  * it can happen that the process of iterated noding can fail to converge (terminate).
- * In this case a TopologyException will be thrown.
+ * In this case a {@link TopologyException} will be thrown.
  * Retrying the computation in a fixed precision
  * can produce more robust results.
  *
  * @version 1.7
  */
-public class BufferBuilder
+class BufferBuilder
 {
   /**
    * Compute the change in depth as an edge is crossed from R to L
diff --git a/src/com/vividsolutions/jts/operation/buffer/BufferOp.java b/src/com/vividsolutions/jts/operation/buffer/BufferOp.java
index b335b82..4367cd0 100644
--- a/src/com/vividsolutions/jts/operation/buffer/BufferOp.java
+++ b/src/com/vividsolutions/jts/operation/buffer/BufferOp.java
@@ -51,25 +51,41 @@ import com.vividsolutions.jts.noding.snapround.*;
  * with a circle of radius equal to the absolute value of the buffer distance.
  * In the CAD/CAM world buffers are known as </i>offset curves</i>.
  * In morphological analysis the 
- * operation of postive and negative buffering 
+ * operation of positive and negative buffering 
  * is referred to as <i>erosion</i> and <i>dilation</i>
  * <p>
  * The buffer operation always returns a polygonal result.
  * The negative or zero-distance buffer of lines and points is always an empty {@link Polygon}.
  * <p>
  * Since true buffer curves may contain circular arcs,
- * computed buffer polygons can only be approximations to the true geometry.
- * The user can control the accuracy of the curve approximation by specifying
- * the number of linear segments used to approximate curves.
+ * computed buffer polygons are only approximations to the true geometry.
+ * The user can control the accuracy of the approximation by specifying
+ * the number of linear segments used to approximate arcs.
+ * This is specified via {@link BufferParameters#setQuadrantSegments(int)} or {@link #setQuadrantSegments(int)}.
  * <p>
- * The <b>end cap style</b> of a linear buffer may be specified. The
+ * The <b>end cap style</b> of a linear buffer may be {@link BufferParameters#setEndCapStyle(int) specified}. The
  * following end cap styles are supported:
  * <ul
- * <li>{@link #CAP_ROUND} - the usual round end caps
- * <li>{@link #CAP_BUTT} - end caps are truncated flat at the line ends
- * <li>{@link #CAP_SQUARE} - end caps are squared off at the buffer distance beyond the line ends
+ * <li>{@link BufferParameters#CAP_ROUND} - the usual round end caps
+ * <li>{@link BufferParameters#CAP_BUTT} - end caps are truncated flat at the line ends
+ * <li>{@link BufferParameters#CAP_SQUARE} - end caps are squared off at the buffer distance beyond the line ends
  * </ul>
  * <p>
+ * The <b>join style</b> of the corners in a buffer may be {@link BufferParameters#setJoinStyle(int) specified}. The
+ * following join styles are supported:
+ * <ul
+ * <li>{@link BufferParameters#JOIN_ROUND} - the usual round join
+ * <li>{@link BufferParameters#JOIN_MITRE} - corners are "sharp" (up to a {@link BufferParameters#getMitreLimit() distance limit})
+ * <li>{@link BufferParameters#JOIN_BEVEL} - corners are beveled (clipped off).
+ * </ul>
+ * <p>
+ * The buffer algorithm can perform simplification on the input to increase performance.
+ * The simplification is performed a way that always increases the buffer area 
+ * (so that the simplified input covers the original input).
+ * The degree of simplification can be {@link BufferParameters#setSimplifyFactor(double) specified},
+ * with a {@link BufferParameters#DEFAULT_SIMPLIFY_FACTOR default} used otherwise.
+ * Note that if the buffer distance is zero then so is the computed simplify tolerance, 
+ * no matter what the simplify factor.
  *
  * @version 1.7
  */
@@ -145,6 +161,7 @@ public class BufferOp
     return scaleFactor;
   }
 
+  /*
   private static double OLDprecisionScaleFactor(Geometry g,
       double distance,
     int maxPrecisionDigits)
@@ -161,6 +178,7 @@ public class BufferOp
     double scaleFactor = Math.pow(10.0, -minUnitLog10);
     return scaleFactor;
   }
+  */
 
   /**
    * Computes the buffer of a geometry for a given buffer distance.
@@ -267,7 +285,7 @@ public class BufferOp
 
   /**
    * Specifies the end cap style of the generated buffer.
-   * The styles supported are {@link #CAP_ROUND}, {@link #CAP_BUTT}, and {@link #CAP_SQUARE}.
+   * The styles supported are {@link BufferParameters#CAP_ROUND}, {@link BufferParameters##CAP_BUTT}, and {@link BufferParameters##CAP_SQUARE}.
    * The default is CAP_ROUND.
    *
    * @param endCapStyle the end cap style to specify
diff --git a/src/com/vividsolutions/jts/operation/buffer/BufferParameters.java b/src/com/vividsolutions/jts/operation/buffer/BufferParameters.java
index 32e1be5..2c5759a 100644
--- a/src/com/vividsolutions/jts/operation/buffer/BufferParameters.java
+++ b/src/com/vividsolutions/jts/operation/buffer/BufferParameters.java
@@ -90,12 +90,19 @@ public class BufferParameters
    */
   public static final double DEFAULT_MITRE_LIMIT = 5.0;
   
+  /**
+   * The default simplify factor
+   * Provides an accuracy of about 1%, which matches the accuracy of the default Quadrant Segments parameter.
+   */
+  public static final double DEFAULT_SIMPLIFY_FACTOR = 0.01;
+  
 
   private int quadrantSegments = DEFAULT_QUADRANT_SEGMENTS;
   private int endCapStyle = CAP_ROUND;
   private int joinStyle = JOIN_ROUND;
   private double mitreLimit = DEFAULT_MITRE_LIMIT;
   private boolean isSingleSided = false;
+  private double simplifyFactor = DEFAULT_SIMPLIFY_FACTOR;
   
   /**
    * Creates a default set of parameters
@@ -332,4 +339,28 @@ public class BufferParameters
   public boolean isSingleSided() {
     return isSingleSided;
   }
+
+  /**
+   * Gets the simplify factor.
+   * 
+   * @return the simplify factor
+   */
+  public double getSimplifyFactor() {
+    return simplifyFactor;
+  }
+  
+  /**
+   * Sets the factor used to determine the simplify distance tolerance
+   * for input simplification.
+   * Simplifying can increase the performance of computing buffers.
+   * Generally the simplify factor should be greater than 0.
+   * Values between 0.01 and .1 produce relatively good accuracy for the generate buffer.
+   * Larger values sacrifice accuracy in return for performance.
+   * 
+   * @param simplifyFactor a value greater than or equal to zero.
+   */
+  public void setSimplifyFactor(double simplifyFactor)
+  {
+    this.simplifyFactor = simplifyFactor < 0 ? 0 : simplifyFactor;
+  }
 }
diff --git a/src/com/vividsolutions/jts/operation/buffer/BufferSubgraph.java b/src/com/vividsolutions/jts/operation/buffer/BufferSubgraph.java
index a80c3dd..7f801f6 100644
--- a/src/com/vividsolutions/jts/operation/buffer/BufferSubgraph.java
+++ b/src/com/vividsolutions/jts/operation/buffer/BufferSubgraph.java
@@ -57,7 +57,7 @@ import com.vividsolutions.jts.util.*;
  *
  * @version 1.7
  */
-public class BufferSubgraph
+class BufferSubgraph
   implements Comparable
 {
   private RightmostEdgeFinder finder;
diff --git a/src/com/vividsolutions/jts/operation/buffer/OffsetCurveBuilder.java b/src/com/vividsolutions/jts/operation/buffer/OffsetCurveBuilder.java
index a610ad8..c2c354d 100644
--- a/src/com/vividsolutions/jts/operation/buffer/OffsetCurveBuilder.java
+++ b/src/com/vividsolutions/jts/operation/buffer/OffsetCurveBuilder.java
@@ -172,24 +172,15 @@ public class OffsetCurveBuilder
   }
   
   /**
-   * Use a value which results in a potential distance error which is
-   * significantly less than the error due to 
-   * the quadrant segment discretization.
-   * For QS = 8 a value of 100 is reasonable.
-   * This should produce a maximum of 1% distance error.
-   */
-  private static final double SIMPLIFY_FACTOR = 100.0;
-  
-  /**
    * Computes the distance tolerance to use during input
    * line simplification.
    * 
    * @param distance the buffer distance
    * @return the simplification tolerance
    */
-  private static double simplifyTolerance(double bufDistance)
+  private double simplifyTolerance(double bufDistance)
   {
-    return bufDistance / SIMPLIFY_FACTOR;
+    return bufDistance * bufParams.getSimplifyFactor();
   }
   
   private void computePointCurve(Coordinate pt, OffsetSegmentGenerator segGen) {
diff --git a/src/com/vividsolutions/jts/operation/buffer/RightmostEdgeFinder.java b/src/com/vividsolutions/jts/operation/buffer/RightmostEdgeFinder.java
index ea043b7..cb147a7 100644
--- a/src/com/vividsolutions/jts/operation/buffer/RightmostEdgeFinder.java
+++ b/src/com/vividsolutions/jts/operation/buffer/RightmostEdgeFinder.java
@@ -50,7 +50,7 @@ import com.vividsolutions.jts.util.*;
  *
  * @version 1.7
  */
-public class RightmostEdgeFinder {
+class RightmostEdgeFinder {
 
   //private Coordinate extremeCoord;
   private int minIndex = -1;
diff --git a/src/com/vividsolutions/jts/operation/buffer/SubgraphDepthLocater.java b/src/com/vividsolutions/jts/operation/buffer/SubgraphDepthLocater.java
index 5d60fb7..2ab435b 100644
--- a/src/com/vividsolutions/jts/operation/buffer/SubgraphDepthLocater.java
+++ b/src/com/vividsolutions/jts/operation/buffer/SubgraphDepthLocater.java
@@ -46,7 +46,7 @@ import com.vividsolutions.jts.algorithm.*;
  *
  * @version 1.7
  */
-public class SubgraphDepthLocater
+class SubgraphDepthLocater
 {
   private Collection subgraphs;
   private LineSegment seg = new LineSegment();
@@ -63,8 +63,7 @@ public class SubgraphDepthLocater
     // if no segments on stabbing line subgraph must be outside all others.
     if (stabbedSegments.size() == 0)
       return 0;
-    Collections.sort(stabbedSegments);
-    DepthSegment ds = (DepthSegment) stabbedSegments.get(0);
+    DepthSegment ds = (DepthSegment) Collections.min(stabbedSegments);
     return ds.leftDepth;
   }
 
@@ -169,7 +168,7 @@ public class SubgraphDepthLocater
    * A segment from a directed edge which has been assigned a depth value
    * for its sides.
    */
-  private class DepthSegment
+  static class DepthSegment
       implements Comparable
   {
     private LineSegment upwardSeg;
@@ -183,42 +182,52 @@ public class SubgraphDepthLocater
       this.leftDepth = depth;
     }
     /**
-     * Defines a comparision operation on DepthSegments
-     * which orders them left to right
+     * Defines a comparison operation on DepthSegments
+     * which orders them left to right.
+     * Assumes the segments are normalized.
+     * <p>
+     * The definition of the ordering is:
+     * <ul>
+     * <li>-1 : if DS1.seg is left of or below DS2.seg (DS1 < DS2)
+     * <li>1 : if   DS1.seg is right of or above DS2.seg (DS1 > DS2) 
+     * <li>0 : if the segments are identical 
+     * </ul>
      *
-     * <pre>
-     * DS1 < DS2   if   DS1.seg is left of DS2.seg
-     * DS1 > DS2   if   DS1.seg is right of DS2.seg
-     * </pre>
-     *
-     * @param obj
+     * KNOWN BUGS:
+     * <ul>
+     * <li>The logic does not obey the {@link Comparator.compareTo} contract. 
+     * This is acceptable for the intended usage, but may cause problems if used with some
+     * utilities in the Java standard library (e.g. {@link Collections.sort()}.
+     * </ul>
+     * 
+     * @param obj a DepthSegment
      * @return the comparison value
      */
     public int compareTo(Object obj)
     {
       DepthSegment other = (DepthSegment) obj;
+      
+      // fast check if segments are trivially ordered along X
+      if (upwardSeg.minX() >= other.upwardSeg.maxX()) return 1;
+      if (upwardSeg.maxX() <= other.upwardSeg.minX()) return -1;
+      
       /**
        * try and compute a determinate orientation for the segments.
        * Test returns 1 if other is left of this (i.e. this > other)
        */
       int orientIndex = upwardSeg.orientationIndex(other.upwardSeg);
+      if (orientIndex != 0) return orientIndex;
 
       /**
        * If comparison between this and other is indeterminate,
        * try the opposite call order.
-       * orientationIndex value is 1 if this is left of other,
-       * so have to flip sign to get proper comparison value of
-       * -1 if this is leftmost
+       * The sign of the result needs to be flipped.
        */
-      if (orientIndex == 0)
-        orientIndex = -1 * other.upwardSeg.orientationIndex(upwardSeg);
-
-      // if orientation is determinate, return it
-      if (orientIndex != 0)
-        return orientIndex;
+      orientIndex = -1 * other.upwardSeg.orientationIndex(upwardSeg);
+      if (orientIndex != 0) return orientIndex;
 
-      // otherwise, segs must be collinear - sort based on minimum X value
-      return compareX(this.upwardSeg, other.upwardSeg);
+      // otherwise, use standard lexocographic segment ordering
+      return upwardSeg.compareTo(other.upwardSeg);
     }
 
     /**
@@ -241,5 +250,9 @@ public class SubgraphDepthLocater
 
     }
 
+    public String toString()
+    {
+      return upwardSeg.toString();
+    }
   }
 }
diff --git a/src/com/vividsolutions/jts/operation/buffer/package.html b/src/com/vividsolutions/jts/operation/buffer/package.html
deleted file mode 100644
index 890844f..0000000
--- a/src/com/vividsolutions/jts/operation/buffer/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Provides classes for computing buffers of geometries
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/operation/buffer/validate/DistanceToPointFinder.java b/src/com/vividsolutions/jts/operation/buffer/validate/DistanceToPointFinder.java
index bec28d5..ea0dd59 100644
--- a/src/com/vividsolutions/jts/operation/buffer/validate/DistanceToPointFinder.java
+++ b/src/com/vividsolutions/jts/operation/buffer/validate/DistanceToPointFinder.java
@@ -40,9 +40,6 @@ import com.vividsolutions.jts.geom.*;
  */
 public class DistanceToPointFinder {
 
-  // used for point-line distance calculation
-  private static LineSegment tempSegment = new LineSegment();
-
   public DistanceToPointFinder() {
   }
 
@@ -68,6 +65,7 @@ public class DistanceToPointFinder {
   public static void computeDistance(LineString line, Coordinate pt, PointPairDistance ptDist)
   {
     Coordinate[] coords = line.getCoordinates();
+    LineSegment tempSegment = new LineSegment();
     for (int i = 0; i < coords.length - 1; i++) {
       tempSegment.setCoordinates(coords[i], coords[i + 1]);
       // this is somewhat inefficient - could do better
diff --git a/src/com/vividsolutions/jts/operation/buffer/validate/package.html b/src/com/vividsolutions/jts/operation/buffer/validate/package.html
deleted file mode 100644
index a85ceaf..0000000
--- a/src/com/vividsolutions/jts/operation/buffer/validate/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Classes to perform validation of the results of buffer operations.
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/operation/distance/package.html b/src/com/vividsolutions/jts/operation/distance/package.html
deleted file mode 100644
index b719dfa..0000000
--- a/src/com/vividsolutions/jts/operation/distance/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Provides classes for computing the distance between geometries
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/operation/distance3d/AxisPlaneCoordinateSequence.java b/src/com/vividsolutions/jts/operation/distance3d/AxisPlaneCoordinateSequence.java
index 3cee2c2..2043de2 100644
--- a/src/com/vividsolutions/jts/operation/distance3d/AxisPlaneCoordinateSequence.java
+++ b/src/com/vividsolutions/jts/operation/distance3d/AxisPlaneCoordinateSequence.java
@@ -87,9 +87,9 @@ public class AxisPlaneCoordinateSequence implements CoordinateSequence {
 		return new AxisPlaneCoordinateSequence(seq, YZ_INDEX);
 	}
 	
-	private static int[] XY_INDEX = new int[] { 0,1 };
-	private static int[] XZ_INDEX = new int[] { 0,2 };
-	private static int[] YZ_INDEX = new int[] { 1,2 };
+	private static final int[] XY_INDEX = new int[] { 0,1 };
+	private static final int[] XZ_INDEX = new int[] { 0,2 };
+	private static final int[] YZ_INDEX = new int[] { 1,2 };
 	
 	private CoordinateSequence seq;
 	private int[] indexMap;
diff --git a/src/com/vividsolutions/jts/operation/distance3d/Distance3DOp.java b/src/com/vividsolutions/jts/operation/distance3d/Distance3DOp.java
index 8baed30..4fff2ed 100644
--- a/src/com/vividsolutions/jts/operation/distance3d/Distance3DOp.java
+++ b/src/com/vividsolutions/jts/operation/distance3d/Distance3DOp.java
@@ -44,10 +44,14 @@ import com.vividsolutions.jts.geom.Polygon;
 import com.vividsolutions.jts.operation.distance.GeometryLocation;
 
 /**
- * Find two points on two {@link Geometry}s which lie within a given distance,
+ * Find two points on two 3D {@link Geometry}s which lie within a given distance,
  * or else are the nearest points on the geometries (in which case this also
  * provides the distance between the geometries).
  * <p>
+ * 3D geometries have vertex Z ordinates defined.
+ * 3D {@link Polygon}s are assumed to lie in a single plane (which is enforced if not actually the case).
+ * 3D {@link LineString}s and {link Point}s may have any configuration.
+ * <p>
  * The distance computation also finds a pair of points in the input geometries
  * which have the minimum distance between them. If a point lies in the interior
  * of a line segment, the coordinate computed is a close approximation to the
diff --git a/src/com/vividsolutions/jts/operation/distance3d/PlanarPolygon3D.java b/src/com/vividsolutions/jts/operation/distance3d/PlanarPolygon3D.java
index 73e8e03..003356d 100644
--- a/src/com/vividsolutions/jts/operation/distance3d/PlanarPolygon3D.java
+++ b/src/com/vividsolutions/jts/operation/distance3d/PlanarPolygon3D.java
@@ -44,7 +44,7 @@ import com.vividsolutions.jts.math.Vector3D;
 
 /**
  * Models a polygon lying in a plane in 3-dimensional Cartesian space.
- * The polyogn representation is supplied
+ * The polygon representation is supplied
  * by a {@link Polygon},
  * containing coordinates with XYZ ordinates.
  * 3D polygons are assumed to lie in a single plane.
diff --git a/src/com/vividsolutions/jts/operation/linemerge/package.html b/src/com/vividsolutions/jts/operation/linemerge/package.html
deleted file mode 100644
index 4dab325..0000000
--- a/src/com/vividsolutions/jts/operation/linemerge/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Classes to perform line merging.
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/operation/overlay/OverlayOp.java b/src/com/vividsolutions/jts/operation/overlay/OverlayOp.java
index 13bc41f..c271a2e 100644
--- a/src/com/vividsolutions/jts/operation/overlay/OverlayOp.java
+++ b/src/com/vividsolutions/jts/operation/overlay/OverlayOp.java
@@ -43,7 +43,7 @@ import com.vividsolutions.jts.operation.GeometryGraphOperation;
 import com.vividsolutions.jts.noding.*;
 
 /**
- * Computes the overlay of two {@link Geometry}s.  The overlay
+ * Computes the geometric overlay of two {@link Geometry}s.  The overlay
  * can be used to determine any boolean combination of the geometries.
  *
  * @version 1.7
@@ -55,11 +55,37 @@ public class OverlayOp
  * The spatial functions supported by this class.
  * These operations implement various boolean combinations of the resultants of the overlay.
  */
+	
+  /**
+   * The code for the Intersection overlay operation.
+   */
   public static final int INTERSECTION  = 1;
+  
+  /**
+   * The code for the Union overlay operation.
+   */
   public static final int UNION         = 2;
+  
+  /**
+   *  The code for the Difference overlay operation.
+   */
   public static final int DIFFERENCE    = 3;
+  
+  /**
+   *  The code for the Symmetric Difference overlay operation.
+   */
   public static final int SYMDIFFERENCE = 4;
 
+  /**
+   * Computes an overlay operation for 
+   * the given geometry arguments.
+   * 
+   * @param geom0 the first geometry argument
+   * @param geom1 the second geometry argument
+   * @param opCode the code for the desired overlay operation
+   * @return the result of the overlay operation
+   * @throws TopologyException if a robustness problem is encountered
+   */
   public static Geometry overlayOp(Geometry geom0, Geometry geom1, int opCode)
   {
     OverlayOp gov = new OverlayOp(geom0, geom1);
@@ -67,6 +93,18 @@ public class OverlayOp
     return geomOv;
   }
 
+  /**
+   * Tests whether a point with a given topological {@link Label}
+   * relative to two geometries is contained in 
+   * the result of overlaying the geometries using
+   * a given overlay operation.
+   * <p>
+   * The method handles arguments of {@link Location#NONE} correctly
+   * 
+   * @param label the topological label of the point
+   * @param opCode the code for the overlay operation to test
+   * @return true if the label locations correspond to the overlayOpCode
+   */
   public static boolean isResultOfOp(Label label, int opCode)
   {
     int loc0 = label.getLocation(0);
@@ -75,15 +113,23 @@ public class OverlayOp
   }
 
   /**
-   * This method will handle arguments of Location.NONE correctly
+   * Tests whether a point with given {@link Location}s
+   * relative to two geometries is contained in 
+   * the result of overlaying the geometries using
+   * a given overlay operation.
+   * <p>
+   * The method handles arguments of {@link Location#NONE} correctly
    *
-   * @return true if the locations correspond to the opCode
+   * @param loc0 the code for the location in the first geometry 
+   * @param loc1 the code for the location in the second geometry 
+   * @param overlayOpCode the code for the overlay operation to test
+   * @return true if the locations correspond to the overlayOpCode
    */
-  public static boolean isResultOfOp(int loc0, int loc1, int opCode)
+  public static boolean isResultOfOp(int loc0, int loc1, int overlayOpCode)
   {
     if (loc0 == Location.BOUNDARY) loc0 = Location.INTERIOR;
     if (loc1 == Location.BOUNDARY) loc1 = Location.INTERIOR;
-    switch (opCode) {
+    switch (overlayOpCode) {
     case INTERSECTION:
       return loc0 == Location.INTERIOR
           && loc1 == Location.INTERIOR;
@@ -111,6 +157,13 @@ public class OverlayOp
   private List resultLineList   = new ArrayList();
   private List resultPointList  = new ArrayList();
 
+  /**
+   * Constructs an instance to compute a single overlay operation
+   * for the given geometries.
+   * 
+   * @param g0 the first geometry argument
+   * @param g1 the second geometry argument
+   */
   public OverlayOp(Geometry g0, Geometry g1) {
     super(g0, g1);
     graph = new PlanarGraph(new OverlayNodeFactory());
@@ -122,12 +175,26 @@ public class OverlayOp
     geomFact = g0.getFactory();
   }
 
-  public Geometry getResultGeometry(int funcCode)
+  /**
+   * Gets the result of the overlay for a given overlay operation.
+   * <p>
+   * Note: this method can be called once only.
+   * 
+   * @param overlayOpCode the overlay operation to perform
+   * @return the compute result geometry
+   * @throws TopologyException if a robustness problem is encountered
+   */
+  public Geometry getResultGeometry(int overlayOpCode)
   {
-    computeOverlay(funcCode);
+    computeOverlay(overlayOpCode);
     return resultGeom;
   }
 
+  /**
+   * Gets the graph constructed to compute the overlay.
+   * 
+   * @return the overlay graph
+   */
   public PlanarGraph getGraph() { return graph; }
 
   private void computeOverlay(int opCode)
@@ -499,9 +566,10 @@ public class OverlayOp
     }
   }
   /**
-   * This method is used to decide if a point node should be included in the result or not.
+   * Tests if a point node should be included in the result or not.
    *
-   * @return true if the coord point is covered by a result Line or Area geometry
+   * @param coord the point coordinate
+   * @return true if the coordinate point is covered by a result Line or Area geometry
    */
   public boolean isCoveredByLA(Coordinate coord)
   {
@@ -510,9 +578,10 @@ public class OverlayOp
     return false;
   }
   /**
-   * This method is used to decide if an L edge should be included in the result or not.
+   * Tests if an L edge should be included in the result or not.
    *
-   * @return true if the coord point is covered by a result Area geometry
+   * @param coord the point coordinate
+   * @return true if the coordinate point is covered by a result Area geometry
    */
   public boolean isCoveredByA(Coordinate coord)
   {
@@ -555,29 +624,29 @@ public class OverlayOp
 
   /**
    * Creates an empty result geometry of the appropriate dimension,
-   * based on the dimensions of the inputs.
+   * based on the given overlay operation and the dimensions of the inputs.
    * The created geometry is always an atomic geometry, 
    * not a collection.
    * <p>
-   * Implements the following rules:
+   * The empty result is constructed using the following rules:
    * <ul>
-   * <li><code>intersection</code> - result has the dimension of the lowest input dimension
-   * <li><code>union</code> - result has the dimension of the highest input dimension
-   * <li><code>difference</code> - result has the dimension of the left-hand input
-   * <li><code>symDifference</code> - result has the dimension of the highest input dimension
-   * (since symDifference is the union of the differences).
+   * <li>{@link #INTERSECTION} - result has the dimension of the lowest input dimension
+   * <li>{@link #UNION} - result has the dimension of the highest input dimension
+   * <li>{@link #DIFFERENCE} - result has the dimension of the left-hand input
+   * <li>{@link #SYMDIFFERENCE} - result has the dimension of the highest input dimension
+   * (since the symmetric Difference is the union of the differences).
    * <li>
    * 
-   * @param opCode the overlay operation being performed
+   * @param overlayOpCode the code for the overlay operation being performed
    * @param a an input geometry
    * @param b an input geometry
    * @param geomFact the geometry factory being used for the operation
    * @return an empty atomic geometry of the appropriate dimension
    */
-  public static Geometry createEmptyResult(int opCode, Geometry a, Geometry b, GeometryFactory geomFact)
+  public static Geometry createEmptyResult(int overlayOpCode, Geometry a, Geometry b, GeometryFactory geomFact)
   {
   	Geometry result = null;
-  	switch (resultDimension(opCode, a, b)) {
+  	switch (resultDimension(overlayOpCode, a, b)) {
   	case -1:
   		result = geomFact.createGeometryCollection(new Geometry[0]);
   		break;
diff --git a/src/com/vividsolutions/jts/operation/overlay/package.html b/src/com/vividsolutions/jts/operation/overlay/package.html
deleted file mode 100644
index 9f9eed9..0000000
--- a/src/com/vividsolutions/jts/operation/overlay/package.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Contains classes that perform a topological overlay to compute boolean spatial functions.
-<P>
-The Overlay Algorithm is used in spatial analysis methods for computing set-theoretic 
-operations (boolean combinations) of input {@link Geometry}s. The algorithm for 
-computing the overlay uses the intersection operations supported by topology graphs.  
-To compute an overlay it is necessary to explicitly compute the resultant graph formed 
-by the computed intersections.
-<P>
-The algorithm to compute a set-theoretic spatial analysis method has the following steps:
-<UL>
-  <LI>Build topology graphs of the two input geometries.  For each geometry all 
-      self-intersection nodes are computed and added to the graph.
-  <LI>Compute nodes for all intersections between edges and nodes of the graphs.
-  <LI>Compute the labeling for the computed nodes by merging the labels from the input graphs. 
-  <LI>Compute new edges between the compute intersection nodes.  Label the edges appropriately.
-  <LI>Build the resultant graph from the new nodes and edges.
-  <LI>Compute the labeling for isolated components of the graph.  Add the 
-      isolated components to the resultant graph.
-  <LI>Compute the result of the boolean combination by selecting the node and edges 
-      with the appropriate labels. Polygonize areas and sew linear geometries together.
-</UL>
-
-<h2>Package Specification</h2>
-
-<ul>
-  <li>Java Topology Suite Technical Specifications
-  <li><A HREF="http://www.opengis.org/techno/specs.htm">
-      OpenGIS Simple Features Specification for SQL</A>
-</ul>
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/operation/overlay/snap/GeometrySnapper.java b/src/com/vividsolutions/jts/operation/overlay/snap/GeometrySnapper.java
index fc0b313..5c7f2f5 100644
--- a/src/com/vividsolutions/jts/operation/overlay/snap/GeometrySnapper.java
+++ b/src/com/vividsolutions/jts/operation/overlay/snap/GeometrySnapper.java
@@ -44,9 +44,11 @@ import com.vividsolutions.jts.geom.util.GeometryTransformer;
  * Snapping one geometry to another can improve 
  * robustness for overlay operations by eliminating
  * nearly-coincident edges 
- * (which cause problems during noding and intersection calculation).
+ * (which cause problems during noding and intersection calculation).
+ * It can also be used to eliminate artifacts such as narrow slivers, spikes and gores.
+ * <p>
  * Too much snapping can result in invalid topology 
- * beging created, so the number and location of snapped vertices
+ * being created, so the number and location of snapped vertices
  * is decided using heuristics to determine when it 
  * is safe to snap.
  * This can result in some potential snaps being omitted, however.
@@ -124,9 +126,22 @@ public class GeometrySnapper
 //    System.out.println(snap[1]);
     return snapGeom;
   }
-  public static Geometry snapToSelf(Geometry g0, double snapTolerance, boolean cleanResult)
+  /**
+   * Snaps a geometry to itself.
+   * Allows optionally cleaning the result to ensure it is 
+   * topologically valid
+   * (which fixes issues such as topology collapses in polygonal inputs).
+   * <p>
+   * Snapping a geometry to itself can remove artifacts such as very narrow slivers, gores and spikes.
+   *
+   *@param geom the geometry to snap
+   *@param snapTolerance the snapping tolerance
+   *@param cleanResult whether the result should be made valid
+   * @return a new snapped Geometry
+   */
+  public static Geometry snapToSelf(Geometry geom, double snapTolerance, boolean cleanResult)
   {
-    GeometrySnapper snapper0 = new GeometrySnapper(g0);
+    GeometrySnapper snapper0 = new GeometrySnapper(geom);
     return snapper0.snapToSelf(snapTolerance, cleanResult);
   }
   
@@ -162,7 +177,10 @@ public class GeometrySnapper
   /**
    * Snaps the vertices in the component {@link LineString}s
    * of the source geometry
-   * to the vertices of the given snap geometry.
+   * to the vertices of the same geometry.
+   * Allows optionally cleaning the result to ensure it is 
+   * topologically valid
+   * (which fixes issues such as topology collapses in polygonal inputs).
    *
    *@param snapTolerance the snapping tolerance
    *@param cleanResult whether the result should be made valid
@@ -182,7 +200,7 @@ public class GeometrySnapper
     return result;
   }
 
-  public Coordinate[] extractTargetCoordinates(Geometry g)
+  private Coordinate[] extractTargetCoordinates(Geometry g)
   {
     // TODO: should do this more efficiently.  Use CoordSeq filter to get points, KDTree for uniqueness & queries
     Set ptSet = new TreeSet();
diff --git a/src/com/vividsolutions/jts/operation/overlay/snap/package.html b/src/com/vividsolutions/jts/operation/overlay/snap/package.html
deleted file mode 100644
index e1a2bef..0000000
--- a/src/com/vividsolutions/jts/operation/overlay/snap/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Classes to perform snapping on geometries to prepare them for overlay operations.
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/operation/overlay/validate/package.html b/src/com/vividsolutions/jts/operation/overlay/validate/package.html
deleted file mode 100644
index 597d5e9..0000000
--- a/src/com/vividsolutions/jts/operation/overlay/validate/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Classes to validate the results of overlay operations.
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/operation/package.html b/src/com/vividsolutions/jts/operation/package.html
deleted file mode 100644
index 6c4a5f7..0000000
--- a/src/com/vividsolutions/jts/operation/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Provides classes for implementing operations on geometries
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/operation/polygonize/EdgeRing.java b/src/com/vividsolutions/jts/operation/polygonize/EdgeRing.java
index 83847af..72be78a 100644
--- a/src/com/vividsolutions/jts/operation/polygonize/EdgeRing.java
+++ b/src/com/vividsolutions/jts/operation/polygonize/EdgeRing.java
@@ -36,9 +36,13 @@
 package com.vividsolutions.jts.operation.polygonize;
 
 import java.util.*;
+
 import com.vividsolutions.jts.algorithm.*;
 import com.vividsolutions.jts.geom.*;
+import com.vividsolutions.jts.geom.impl.CoordinateArraySequence;
+import com.vividsolutions.jts.io.WKTWriter;
 import com.vividsolutions.jts.planargraph.*;
+import com.vividsolutions.jts.util.Assert;
 
 /**
  * Represents a ring of {@link PolygonizeDirectedEdge}s which form
@@ -134,41 +138,87 @@ class EdgeRing {
     }
     return false;
   }
+  
+  /**
+   * Traverses a ring of DirectedEdges, accumulating them into a list.
+   * This assumes that all dangling directed edges have been removed
+   * from the graph, so that there is always a next dirEdge.
+   *
+   * @param startDE the DirectedEdge to start traversing at
+   * @return a List of DirectedEdges that form a ring
+   */
+  public static List findDirEdgesInRing(PolygonizeDirectedEdge startDE)
+  {
+    PolygonizeDirectedEdge de = startDE;
+    List edges = new ArrayList();
+    do {
+      edges.add(de);
+      de = de.getNext();
+      Assert.isTrue(de != null, "found null DE in ring");
+      Assert.isTrue(de == startDE || ! de.isInRing(), "found DE already in ring");
+    } while (de != startDE);
+    return edges;
+  }
+  
   private GeometryFactory factory;
 
-
   private List deList = new ArrayList();
-
+  private DirectedEdge lowestEdge = null;
+  
   // cache the following data for efficiency
   private LinearRing ring = null;
 
   private Coordinate[] ringPts = null;
   private List holes;
+  private EdgeRing shell;
+  private boolean isHole;
+  private boolean isProcessed = false;
+  private boolean isIncludedSet = false;
+  private boolean isIncluded = false;
 
   public EdgeRing(GeometryFactory factory)
   {
     this.factory = factory;
   }
 
+  public void build(PolygonizeDirectedEdge startDE) {
+    PolygonizeDirectedEdge de = startDE;
+    do {
+      add(de);
+      de.setRing(this);
+      de = de.getNext();
+      Assert.isTrue(de != null, "found null DE in ring");
+      Assert.isTrue(de == startDE || ! de.isInRing(), "found DE already in ring");
+    } while (de != startDE);
+  }
+  
   /**
    * Adds a {@link DirectedEdge} which is known to form part of this ring.
    * @param de the {@link DirectedEdge} to add.
    */
-  public void add(DirectedEdge de)
+  private void add(DirectedEdge de)
   {
     deList.add(de);
   }
 
   /**
    * Tests whether this ring is a hole.
-   * Due to the way the edges in the polyongization graph are linked,
-   * a ring is a hole if it is oriented counter-clockwise.
    * @return <code>true</code> if this ring is a hole
    */
   public boolean isHole()
   {
+    return isHole;
+  }
+  
+  /**
+   * Computes whether this ring is a hole.
+   * Due to the way the edges in the polyongization graph are linked,
+   * a ring is a hole if it is oriented counter-clockwise.
+   */
+  public void computeHole()
+  {
     LinearRing ring = getRing();
-    return CGAlgorithms.isCCW(ring.getCoordinates());
+    isHole = CGAlgorithms.isCCW(ring.getCoordinates());
   }
 
   /**
@@ -182,6 +232,18 @@ class EdgeRing {
   }
 
   /**
+   * Adds a hole to the polygon formed by this ring.
+   * @param hole the {@link LinearRing} forming the hole.
+   */
+  public void addHole(EdgeRing holeER) {
+    holeER.setShell(this);
+    LinearRing hole = holeER.getRing();
+    if (holes == null)
+      holes = new ArrayList();
+    holes.add(hole);
+  }
+
+  /**
    * Computes the {@link Polygon} formed by this ring and any contained holes.
    *
    * @return the {@link Polygon} formed by this ring and its holes.
@@ -212,6 +274,19 @@ class EdgeRing {
     return ring.isValid();
   }
 
+  public boolean isIncludedSet() {
+    return isIncludedSet;
+  }
+
+  public boolean isIncluded() {
+    return isIncluded;
+  }
+
+  public void setIncluded(boolean isIncluded) {
+    this.isIncluded = isIncluded;
+    this.isIncludedSet = true;
+  }
+
   /**
    * Computes the list of coordinates which are contained in this ring.
    * The coordinatea are computed once only and cached.
@@ -277,4 +352,125 @@ class EdgeRing {
       }
     }
   }
+
+  /**
+   * Sets the containing shell ring of a ring that has been determined to be a hole.
+   * 
+   * @param shell the shell ring
+   */
+  public void setShell(EdgeRing shell) {
+    this.shell = shell;
+  }
+  
+  /**
+   * Tests whether this ring has a shell assigned to it.
+   * 
+   * @return true if the ring has a shell
+   */
+  public boolean hasShell() {
+    return shell != null;
+  }
+  
+  /**
+   * Gets the shell for this ring.  The shell is the ring itself if it is not a hole, otherwise its parent shell.
+   * 
+   * @return the shell for this ring
+   */
+  public EdgeRing getShell() {
+    if (isHole()) return shell;
+    return this;
+  }
+  /**
+   * Tests whether this ring is an outer hole.
+   * A hole is an outer hole if it is not contained by a shell.
+   * 
+   * @return true if the ring is an outer hole.
+   */
+  public boolean isOuterHole() {
+    if (! isHole) return false;
+    return ! hasShell();
+  }
+  
+  /**
+   * Tests whether this ring is an outer shell.
+   * 
+   * @return true if the ring is an outer shell.
+   */
+  public boolean isOuterShell() {
+    return getOuterHole() != null;
+  }
+  
+  public EdgeRing getOuterHole()
+  {
+    if (isHole()) return null;
+    /*
+     * A shell is an outer shell if any edge is also in an outer hole.
+     * A hole is an outer hole if it is not contained by a shell.
+     */
+    for (int i = 0; i < deList.size(); i++) {
+      PolygonizeDirectedEdge de = (PolygonizeDirectedEdge) deList.get(i);
+      EdgeRing adjRing = ((PolygonizeDirectedEdge) de.getSym()).getRing();
+      if (adjRing.isOuterHole()) return adjRing;
+    }
+    return null;    
+  }
+
+  /**
+   * Updates the included status for currently non-included shells
+   * based on whether they are adjacent to an included shell.
+   */
+  public void updateIncluded() {
+    if (isHole()) return;
+    for (int i = 0; i < deList.size(); i++) {
+      PolygonizeDirectedEdge de = (PolygonizeDirectedEdge) deList.get(i);
+      EdgeRing adjShell = ((PolygonizeDirectedEdge) de.getSym()).getRing().getShell();
+      
+      if (adjShell != null && adjShell.isIncludedSet()) {
+        // adjacent ring has been processed, so set included to inverse of adjacent included
+        setIncluded(! adjShell.isIncluded());
+        return;
+      }
+    }
+  }
+
+  /**
+   * Gets a string representation of this object.
+   * 
+   * @return a string representing the object 
+   */
+  public String toString() {
+    return WKTWriter.toLineString(new CoordinateArraySequence(getCoordinates()));
+  }
+  
+  /**
+   * @return whether the ring has been processed
+   */
+  public boolean isProcessed() {
+    return isProcessed;
+  }
+
+  /**
+   * @param isProcessed whether the ring has been processed
+   */
+  public void setProcessed(boolean isProcessed) {
+    this.isProcessed = isProcessed;
+  }
+
+  /**
+   * Compares EdgeRings based on their envelope,
+   * using the standard lexicographic ordering.
+   * This ordering is sufficient to make edge ring sorting deterministic.
+   * 
+   * @author mbdavis
+   *
+   */
+  static class EnvelopeComparator implements Comparator {
+    public int compare(Object obj0, Object obj1) {
+      EdgeRing r0 = (EdgeRing) obj0;
+      EdgeRing r1 = (EdgeRing) obj1;
+      return r0.getRing().getEnvelope().compareTo(r1.getRing().getEnvelope());
+    }
+    
+  }
+
 }
diff --git a/src/com/vividsolutions/jts/operation/polygonize/PolygonizeDirectedEdge.java b/src/com/vividsolutions/jts/operation/polygonize/PolygonizeDirectedEdge.java
index 6609634..3aeb13c 100644
--- a/src/com/vividsolutions/jts/operation/polygonize/PolygonizeDirectedEdge.java
+++ b/src/com/vividsolutions/jts/operation/polygonize/PolygonizeDirectedEdge.java
@@ -101,5 +101,14 @@ class PolygonizeDirectedEdge
   {
       this.edgeRing = edgeRing;
   }
+  /**
+   * Gets the {@link EdgeRing} this edge is a member of.
+   * 
+   * @return an edge ring
+   */
+  public EdgeRing getRing() 
+  {
+    return this.edgeRing;
+  }
 
 }
diff --git a/src/com/vividsolutions/jts/operation/polygonize/PolygonizeGraph.java b/src/com/vividsolutions/jts/operation/polygonize/PolygonizeGraph.java
index af3deac..07dcaed 100644
--- a/src/com/vividsolutions/jts/operation/polygonize/PolygonizeGraph.java
+++ b/src/com/vividsolutions/jts/operation/polygonize/PolygonizeGraph.java
@@ -225,8 +225,8 @@ class PolygonizeGraph
 
   /**
    * Finds and labels all edgerings in the graph.
-   * The edge rings are labelling with unique integers.
-   * The labelling allows detecting cut edges.
+   * The edge rings are labeling with unique integers.
+   * The labeling allows detecting cut edges.
    * 
    * @param dirEdges a List of the DirectedEdges in the graph
    * @return a List of DirectedEdges, one for each edge ring found
@@ -242,7 +242,7 @@ class PolygonizeGraph
       if (de.getLabel() >= 0) continue;
 
       edgeRingStarts.add(de);
-      List edges = findDirEdgesInRing(de);
+      List edges = EdgeRing.findDirEdgesInRing(de);
 
       label(edges, currLabel);
       currLabel++;
@@ -359,40 +359,10 @@ class PolygonizeGraph
     }
   }
 
-  /**
-   * Traverses a ring of DirectedEdges, accumulating them into a list.
-   * This assumes that all dangling directed edges have been removed
-   * from the graph, so that there is always a next dirEdge.
-   *
-   * @param startDE the DirectedEdge to start traversing at
-   * @return a List of DirectedEdges that form a ring
-   */
-  private static List findDirEdgesInRing(PolygonizeDirectedEdge startDE)
-  {
-    PolygonizeDirectedEdge de = startDE;
-    List edges = new ArrayList();
-    do {
-      edges.add(de);
-      de = de.getNext();
-      Assert.isTrue(de != null, "found null DE in ring");
-      Assert.isTrue(de == startDE || ! de.isInRing(), "found DE already in ring");
-    } while (de != startDE);
-
-    return edges;
-  }
-
   private EdgeRing findEdgeRing(PolygonizeDirectedEdge startDE)
   {
-    PolygonizeDirectedEdge de = startDE;
     EdgeRing er = new EdgeRing(factory);
-    do {
-      er.add(de);
-      de.setRing(er);
-      de = de.getNext();
-      Assert.isTrue(de != null, "found null DE in ring");
-      Assert.isTrue(de == startDE || ! de.isInRing(), "found DE already in ring");
-    } while (de != startDE);
-
+    er.build(startDE);
     return er;
   }
 
diff --git a/src/com/vividsolutions/jts/operation/polygonize/Polygonizer.java b/src/com/vividsolutions/jts/operation/polygonize/Polygonizer.java
index 976b843..68e6228 100644
--- a/src/com/vividsolutions/jts/operation/polygonize/Polygonizer.java
+++ b/src/com/vividsolutions/jts/operation/polygonize/Polygonizer.java
@@ -33,8 +33,17 @@
  */
 package com.vividsolutions.jts.operation.polygonize;
 
-import java.util.*;
-import com.vividsolutions.jts.geom.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import com.vividsolutions.jts.geom.Geometry;
+import com.vividsolutions.jts.geom.GeometryComponentFilter;
+import com.vividsolutions.jts.geom.GeometryFactory;
+import com.vividsolutions.jts.geom.LineString;
+import com.vividsolutions.jts.geom.Polygon;
 
 /**
  * Polygonizes a set of {@link Geometry}s which contain linework that
@@ -42,9 +51,9 @@ import com.vividsolutions.jts.geom.*;
  * All types of Geometry are accepted as input;  
  * the constituent linework is extracted as the edges to be polygonized.
  * The processed edges must be correctly noded; that is, they must only meet
- * at their endpoints.  The Polygonizer will run on incorrectly noded input
+ * at their endpoints.  Polygonization will accept incorrectly noded input
  * but will not form polygons from non-noded edges, 
- * and will report them as errors.
+ * and reports them as errors.
  * <p>
  * The Polygonizer reports the follow kinds of errors:
  * <ul>
@@ -53,12 +62,15 @@ import com.vividsolutions.jts.geom.*;
  * <li><b>Invalid Ring Lines</b> - edges which form rings which are invalid
  * (e.g. the component lines contain a self-intersection)
  * </ul>
+ * Polygonization supports extracting only polygons which form a valid polygonal geometry.
+ * The set of extracted polygons is guaranteed to be edge-disjoint.
+ * This is useful for situations where it is known that the input lines form a
+ * valid polygonal geometry.
  *
  * @version 1.7
  */
 public class Polygonizer
-{
-
+{  
   /**
    * Adds every linear element in a {@link Geometry} into the polygonizer graph.
    */
@@ -84,12 +96,29 @@ public class Polygonizer
   protected List shellList = null;
   protected List polyList = null;
 
+  private boolean isCheckingRingsValid = true;
+  private boolean extractOnlyPolygonal;
+
+  private GeometryFactory geomFactory = null;
+
   /**
-   * Create a polygonizer with the same {@link GeometryFactory}
-   * as the input {@link Geometry}s
+   * Creates a polygonizer with the same {@link GeometryFactory}
+   * as the input {@link Geometry}s.
+   * The output mask is {@link #ALL_POLYS}.
    */
   public Polygonizer()
   {
+    this(false);
+  }
+  
+  /**
+   * Creates a polygonizer and allow specifyng if only polygons which form a valid polygonal geometry are to be extracted.
+   * 
+   * @param extractOnlyPolygonal true if only polygons which form a valid polygonal geometry are to be extracted
+   */
+  public Polygonizer(boolean extractOnlyPolygonal)
+  {
+    this.extractOnlyPolygonal = extractOnlyPolygonal;
   }
 
   /**
@@ -128,13 +157,28 @@ public class Polygonizer
    */
   private void add(LineString line)
   {
+    // record the geometry factory for later use
+    geomFactory  = line.getFactory();
     // create a new graph using the factory from the input Geometry
     if (graph == null)
-      graph = new PolygonizeGraph(line.getFactory());
+      graph = new PolygonizeGraph(geomFactory);
     graph.addEdge(line);
   }
 
   /**
+   * Allows disabling the valid ring checking, 
+   * to optimize situations where invalid rings are not expected.
+   * <p>
+   * The default is <code>true</code.
+   * 
+   * @param isCheckingRingsValid true if generated rings should be checked for validity
+   */
+  public void setCheckRingsValid(boolean isCheckingRingsValid)
+  {
+    this.isCheckingRingsValid = isCheckingRingsValid;
+  }
+  
+  /**
    * Gets the list of polygons formed by the polygonization.
    * @return a collection of {@link Polygon}s
    */
@@ -145,6 +189,23 @@ public class Polygonizer
   }
 
   /**
+   * Gets a geometry representing the polygons formed by the polygonization.
+   * If a valid polygonal geometry was extracted the result is a {@linkl Polygonal} geometry. 
+   * 
+   * @return a geometry containing the polygons
+   */
+  public Geometry getGeometry()
+  {
+    if (geomFactory == null) geomFactory = new GeometryFactory();
+    polygonize();
+    if (extractOnlyPolygonal) {
+      return geomFactory.buildGeometry(polyList);
+    }
+    // result may not be valid Polygonal, so return as a GeometryCollection
+    return geomFactory.createGeometryCollection(GeometryFactory.toGeometryArray(polyList));
+  }
+
+  /**
    * Gets the list of dangling lines found during polygonization.
    * @return a collection of the input {@link LineString}s which are dangles
    */
@@ -190,18 +251,31 @@ public class Polygonizer
     cutEdges = graph.deleteCutEdges();
     List edgeRingList = graph.getEdgeRings();
 
+    //Debug.printTime("Build Edge Rings");
+
     List validEdgeRingList = new ArrayList();
     invalidRingLines = new ArrayList();
-    findValidRings(edgeRingList, validEdgeRingList, invalidRingLines);
-
+    if (isCheckingRingsValid) {
+      findValidRings(edgeRingList, validEdgeRingList, invalidRingLines);
+    }
+    else {
+      validEdgeRingList = edgeRingList;
+    }
+    //Debug.printTime("Validate Rings");
+    
     findShellsAndHoles(validEdgeRingList);
     assignHolesToShells(holeList, shellList);
+    // order the shells to make any subsequent processing deterministic
+    Collections.sort(shellList, new EdgeRing.EnvelopeComparator());
 
-    polyList = new ArrayList();
-    for (Iterator i = shellList.iterator(); i.hasNext(); ) {
-      EdgeRing er = (EdgeRing) i.next();
-      polyList.add(er.getPolygon());
+    //Debug.printTime("Assign Holes");
+    
+    boolean includeAll = true;
+    if (extractOnlyPolygonal) {
+      findDisjointShells(shellList);
+      includeAll = false;
     }
+    polyList = extractPolygons(shellList, includeAll);
   }
 
   private void findValidRings(List edgeRingList, List validEdgeRingList, List invalidRingList)
@@ -221,11 +295,11 @@ public class Polygonizer
     shellList = new ArrayList();
     for (Iterator i = edgeRingList.iterator(); i.hasNext(); ) {
       EdgeRing er = (EdgeRing) i.next();
+      er.computeHole();
       if (er.isHole())
         holeList.add(er);
       else
         shellList.add(er);
-
     }
   }
 
@@ -234,15 +308,66 @@ public class Polygonizer
     for (Iterator i = holeList.iterator(); i.hasNext(); ) {
       EdgeRing holeER = (EdgeRing) i.next();
       assignHoleToShell(holeER, shellList);
+      /*
+      if ( ! holeER.hasShell()) {
+        System.out.println("DEBUG: Outer hole: " + holeER);
+      }
+      */
     }
   }
 
   private static void assignHoleToShell(EdgeRing holeER, List shellList)
   {
     EdgeRing shell = EdgeRing.findEdgeRingContaining(holeER, shellList);
-    if (shell != null)
-      shell.addHole(holeER.getRing());
+    if (shell != null) {
+      shell.addHole(holeER);
+    }
   }
 
+  private static void findDisjointShells(List shellList) {
+    findOuterShells(shellList);
+    
+    boolean isMoreToScan;
+    do {
+      isMoreToScan = false;
+      for (Iterator i = shellList.iterator(); i.hasNext(); ) {
+        EdgeRing er = (EdgeRing) i.next();
+        if (er.isIncludedSet()) 
+          continue;
+        er.updateIncluded();
+        if (! er.isIncludedSet()) {
+          isMoreToScan = true;
+        }
+      }
+    } while (isMoreToScan);
+  }
 
+  /**
+   * For each outer hole finds and includes a single outer shell.
+   * This seeds the travesal algorithm for finding only polygonal shells.
+   *  
+   * @param shellList the list of shell EdgeRings
+   */
+  private static void findOuterShells(List shellList) {
+
+    for (Iterator i = shellList.iterator(); i.hasNext();) {
+      EdgeRing er = (EdgeRing) i.next();
+      EdgeRing outerHoleER = er.getOuterHole();
+      if (outerHoleER != null && ! outerHoleER.isProcessed()) {
+        er.setIncluded(true);
+        outerHoleER.setProcessed(true);
+      }
+    }
+  }
+  
+  private static List extractPolygons(List shellList, boolean includeAll) {
+    List polyList = new ArrayList();
+    for (Iterator i = shellList.iterator(); i.hasNext();) {
+      EdgeRing er = (EdgeRing) i.next();
+      if (includeAll || er.isIncluded()) {
+        polyList.add(er.getPolygon());
+      }
+    }
+    return polyList;
+  }
 }
diff --git a/src/com/vividsolutions/jts/operation/polygonize/package.html b/src/com/vividsolutions/jts/operation/polygonize/package.html
deleted file mode 100644
index cff5d28..0000000
--- a/src/com/vividsolutions/jts/operation/polygonize/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-An API for polygonizing sets of lines.
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/operation/predicate/package.html b/src/com/vividsolutions/jts/operation/predicate/package.html
deleted file mode 100644
index a5a72f2..0000000
--- a/src/com/vividsolutions/jts/operation/predicate/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Classes which implement topological predicates optimized for particular kinds of geometries.
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/operation/relate/package.html b/src/com/vividsolutions/jts/operation/relate/package.html
deleted file mode 100644
index 8ba10f3..0000000
--- a/src/com/vividsolutions/jts/operation/relate/package.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Contains classes to implement the computation of the spatial relationships of <CODE>Geometry</CODE>s.
-<P>
-The <code>relate</code> algorithm computes the <code>IntersectionMatrix</code> describing the 
-relationship of two <code>Geometry</code>s.  The algorithm for computing <code>relate</code> 
-uses the intersection operations supported by topology graphs.  Although the <code>relate</code> 
-result depends on the resultant graph formed by the computed intersections, there is 
-no need to explicitly compute the entire graph.  
-It is sufficient to compute the local structure of the graph 
-at each intersection node. 
-<P>
-The algorithm to compute <code>relate</code> has the following steps:
-<UL>
-  <LI>Build topology graphs of the two input geometries. For each geometry 
-      all self-intersection nodes are computed and added to the graph.
-  <LI>Compute nodes for all intersections between edges and nodes of the graphs.
-  <LI>Compute the labeling for the computed nodes by merging the labels from the input graphs. 
-  <LI>Compute the labeling for isolated components of the graph (see below)
-  <LI>Compute the <code>IntersectionMatrix</code> from the labels on the nodes and edges.
-</UL>
-
-<H3>Labeling isolated components</H3>
-
-Isolated components are components (edges or nodes) of an input <code>Geometry</code> which 
-do not contain any intersections with the other input <code>Geometry</code>.  The 
-topological relationship of these components to the other input <code>Geometry</code> 
-must be computed in order to determine the complete labeling of the component.  This can 
-be done by testing whether the component lies in the interior or exterior of the other 
-<code>Geometry</code>.  If the other <code>Geometry</code> is 1-dimensional, the isolated 
-component must lie in the exterior (since otherwise it would have an intersection with an 
-edge of the <code>Geometry</code>).  If the other <code>Geometry</code> is 2-dimensional, 
-a Point-In-Polygon test can be used to determine whether the isolated component is in the 
-interior or exterior. 
-
-<h2>Package Specification</h2>
-
-<ul>
-  <li>Java Topology Suite Technical Specifications
-  <li><A HREF="http://www.opengis.org/techno/specs.htm">
-      OpenGIS Simple Features Specification for SQL</A>
-</ul>
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/operation/union/CascadedPolygonUnion.java b/src/com/vividsolutions/jts/operation/union/CascadedPolygonUnion.java
index edd8989..4282d96 100644
--- a/src/com/vividsolutions/jts/operation/union/CascadedPolygonUnion.java
+++ b/src/com/vividsolutions/jts/operation/union/CascadedPolygonUnion.java
@@ -92,6 +92,9 @@ public class CascadedPolygonUnion
 	public CascadedPolygonUnion(Collection polys)
 	{
 		this.inputPolys = polys;
+		// guard against null input
+		if (inputPolys == null) 
+		  inputPolys = new ArrayList();
 	}
 	
   /**
@@ -105,12 +108,22 @@ public class CascadedPolygonUnion
   
 	/**
 	 * Computes the union of the input geometries.
+	 * <p>
+	 * This method discards the input geometries as they are processed.
+	 * In many input cases this reduces the memory retained
+	 * as the operation proceeds. 
+	 * Optimal memory usage is achieved 
+	 * by disposing of the original input collection 
+	 * before calling this method.
 	 * 
 	 * @return the union of the input geometries
 	 * or null if no input geometries were provided
+	 * @throws IllegalStateException if this method is called more than once
 	 */
 	public Geometry union()
 	{
+	  if (inputPolys == null)
+	    throw new IllegalStateException("union() method cannot be called twice");
 		if (inputPolys.isEmpty())
 			return null;
 		geomFactory = ((Geometry) inputPolys.iterator().next()).getFactory();
@@ -127,10 +140,11 @@ public class CascadedPolygonUnion
       Geometry item = (Geometry) i.next();
       index.insert(item.getEnvelopeInternal(), item);
     }
+    // To avoiding holding memory remove references to the input geometries,
+    inputPolys = null;
+    
     List itemTree = index.itemsTree();
-
 //    printItemEnvelopes(itemTree);
-    
     Geometry unionAll = unionTree(itemTree);
     return unionAll;
 	}
diff --git a/src/com/vividsolutions/jts/operation/union/UnaryUnionOp.java b/src/com/vividsolutions/jts/operation/union/UnaryUnionOp.java
index 715a126..47b1c1d 100644
--- a/src/com/vividsolutions/jts/operation/union/UnaryUnionOp.java
+++ b/src/com/vividsolutions/jts/operation/union/UnaryUnionOp.java
@@ -41,15 +41,15 @@ import com.vividsolutions.jts.operation.overlay.OverlayOp;
 import com.vividsolutions.jts.operation.overlay.snap.SnapIfNeededOverlayOp;
 
 /**
- * Unions a collection of Geometry or a single Geometry 
- * (which may be a collection) together.
+ * Unions a <code>Collection</code> of {@link Geometry}s or a single Geometry 
+ * (which may be a {@link GeoometryCollection}) together.
  * By using this special-purpose operation over a collection of geometries
  * it is possible to take advantage of various optimizations to improve performance.
  * Heterogeneous {@link GeometryCollection}s are fully supported.
  * <p>
  * The result obeys the following contract:
  * <ul>
- * <li>Unioning a set of overlapping {@link Polygon}s has the effect of
+ * <li>Unioning a set of {@link Polygon}s has the effect of
  * merging the areas (i.e. the same effect as 
  * iteratively unioning all individual polygons together).
  * 
@@ -77,18 +77,46 @@ import com.vividsolutions.jts.operation.overlay.snap.SnapIfNeededOverlayOp;
  */
 public class UnaryUnionOp 
 {
+	/**
+	 * Computes the geometric union of a {@link Collection} 
+	 * of {@link Geometry}s.
+	 * 
+	 * @param geoms a collection of geometries
+	 * @return the union of the geometries, 
+	 * or <code>null</code> if the input is empty
+	 */
 	public static Geometry union(Collection geoms)
 	{
 		UnaryUnionOp op = new UnaryUnionOp(geoms);
 		return op.union();
 	}
 	
+	/**
+	 * Computes the geometric union of a {@link Collection} 
+	 * of {@link Geometry}s.
+	 * 
+	 * If no input geometries were provided but a {@link GeometryFactory} was provided, 
+	 * an empty {@link GeometryCollection} is returned.
+     *
+	 * @param geoms a collection of geometries
+	 * @param geomFact the geometry factory to use if the collection is empty
+	 * @return the union of the geometries,
+	 * or an empty GEOMETRYCOLLECTION
+	 */
 	public static Geometry union(Collection geoms, GeometryFactory geomFact)
 	{
 		UnaryUnionOp op = new UnaryUnionOp(geoms, geomFact);
 		return op.union();
 	}
 	
+	/**
+	 * Constructs a unary union operation for a {@link Geometry}
+	 * (which may be a {@link GeometryCollection}).
+	 * 
+	 * @param geom a geometry to union
+	 * @return the union of the elements of the geometry
+	 * or an empty GEOMETRYCOLLECTION
+	 */
 	public static Geometry union(Geometry geom)
 	{
 		UnaryUnionOp op = new UnaryUnionOp(geom);
@@ -101,17 +129,36 @@ public class UnaryUnionOp
 	
 	private GeometryFactory geomFact = null;
 	
+	/**
+	 * Constructs a unary union operation for a {@link Collection} 
+	 * of {@link Geometry}s.
+	 * 
+	 * @param geoms a collection of geometries
+	 * @param geomFact the geometry factory to use if the collection is empty
+	 */
 	public UnaryUnionOp(Collection geoms, GeometryFactory geomFact)
 	{
 		this.geomFact = geomFact;
 		extract(geoms);
 	}
 	
+	/**
+	 * Constructs a unary union operation for a {@link Collection} 
+	 * of {@link Geometry}s, using the {@link GeometryFactory}
+	 * of the input geometries.
+	 * 
+	 * @param geoms a collection of geometries
+	 */
 	public UnaryUnionOp(Collection geoms)
 	{
 		extract(geoms);
 	}
 	
+	/**
+	 * Constructs a unary union operation for a {@link Geometry}
+	 * (which may be a {@link GeometryCollection}).
+	 * @param geom
+	 */
 	public UnaryUnionOp(Geometry geom)
 	{
 		extract(geom);
@@ -142,10 +189,13 @@ public class UnaryUnionOp
 
 	/**
 	 * Gets the union of the input geometries.
-	 * If no input geometries were provided, a POINT EMPTY is returned.
+	 * If no input geometries were provided but a {@link GeometryFactory} was provided, 
+	 * an empty {@link GeometryCollection} is returned.
+	 * Otherwise, the return value is <code>null</code>.
 	 * 
-	 * @return a Geometry containing the union
-	 * or an empty GEOMETRYCOLLECTION if no geometries were provided in the input
+	 * @return a Geometry containing the union,
+	 * or an empty GEOMETRYCOLLECTION if no geometries were provided in the input,
+	 * or <code>null</code> if no GeometryFactory was provided
 	 */
 	public Geometry union()
 	{
diff --git a/src/com/vividsolutions/jts/operation/union/package.html b/src/com/vividsolutions/jts/operation/union/package.html
deleted file mode 100644
index 4714a4d..0000000
--- a/src/com/vividsolutions/jts/operation/union/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Classes to perform efficent unioning of collections of geometries.
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/operation/valid/package.html b/src/com/vividsolutions/jts/operation/valid/package.html
deleted file mode 100644
index 4acfba4..0000000
--- a/src/com/vividsolutions/jts/operation/valid/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Provides classes for testing the validity of geometries.
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/planargraph/algorithm/package.html b/src/com/vividsolutions/jts/planargraph/algorithm/package.html
deleted file mode 100644
index eb8a48e..0000000
--- a/src/com/vividsolutions/jts/planargraph/algorithm/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Classes which implement graph algorithms on planar graphs.
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/planargraph/package.html b/src/com/vividsolutions/jts/planargraph/package.html
deleted file mode 100644
index d38ccca..0000000
--- a/src/com/vividsolutions/jts/planargraph/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Contains classes to implement a planar graph data structure.
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/precision/CommonBitsRemover.java b/src/com/vividsolutions/jts/precision/CommonBitsRemover.java
index 736bfcd..8c77eb3 100644
--- a/src/com/vividsolutions/jts/precision/CommonBitsRemover.java
+++ b/src/com/vividsolutions/jts/precision/CommonBitsRemover.java
@@ -146,7 +146,7 @@ public class CommonBitsRemover
   }
 
   class Translater
-      implements CoordinateFilter
+      implements CoordinateSequenceFilter
   {
     Coordinate trans = null;
 
@@ -154,10 +154,20 @@ public class CommonBitsRemover
     {
       this.trans = trans;
     }
-    public void filter(Coordinate coord)
-    {
-      coord.x += trans.x;
-      coord.y += trans.y;
+
+    public void filter(CoordinateSequence seq, int i) {
+      double xp = seq.getOrdinate(i, 0) + trans.x;
+      double yp = seq.getOrdinate(i, 1) + trans.y;
+      seq.setOrdinate(i, 0, xp);
+      seq.setOrdinate(i, 1, yp);  
+    }
+
+    public boolean isDone() {
+     return false;
+    }
+
+    public boolean isGeometryChanged() {
+      return true;
     }
 
   }
diff --git a/src/com/vividsolutions/jts/precision/doc-files/minClearance.png b/src/com/vividsolutions/jts/precision/doc-files/minClearance.png
deleted file mode 100644
index 2547a7e..0000000
Binary files a/src/com/vividsolutions/jts/precision/doc-files/minClearance.png and /dev/null differ
diff --git a/src/com/vividsolutions/jts/precision/package.html b/src/com/vividsolutions/jts/precision/package.html
deleted file mode 100644
index 76b9b3b..0000000
--- a/src/com/vividsolutions/jts/precision/package.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Provides classes for analyzing and
-manipulating the precision of Geometries.
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/shape/fractal/KochSnowflakeBuilder.java b/src/com/vividsolutions/jts/shape/fractal/KochSnowflakeBuilder.java
index 5c261f8..9fc4595 100644
--- a/src/com/vividsolutions/jts/shape/fractal/KochSnowflakeBuilder.java
+++ b/src/com/vividsolutions/jts/shape/fractal/KochSnowflakeBuilder.java
@@ -66,7 +66,7 @@ extends GeometricShapeBuilder
 	/**
 	 * The height of an equilateral triangle of side one
 	 */
-	private static double HEIGHT_FACTOR = Math.sin(Math.PI / 3.0);
+	private static final double HEIGHT_FACTOR = Math.sin(Math.PI / 3.0);
 	private static final double ONE_THIRD = 1.0/3.0;
 	private static final double THIRD_HEIGHT = HEIGHT_FACTOR/3.0;
 	private static final double TWO_THIRDS = 2.0/3.0;
diff --git a/src/com/vividsolutions/jts/simplify/DouglasPeuckerLineSimplifier.java b/src/com/vividsolutions/jts/simplify/DouglasPeuckerLineSimplifier.java
index eb4415a..63f6359 100644
--- a/src/com/vividsolutions/jts/simplify/DouglasPeuckerLineSimplifier.java
+++ b/src/com/vividsolutions/jts/simplify/DouglasPeuckerLineSimplifier.java
@@ -33,7 +33,6 @@
 
 package com.vividsolutions.jts.simplify;
 
-import java.util.*;
 import com.vividsolutions.jts.geom.*;
 
 /**
diff --git a/src/com/vividsolutions/jts/simplify/DouglasPeuckerSimplifier.java b/src/com/vividsolutions/jts/simplify/DouglasPeuckerSimplifier.java
index 38c4bdb..3c92a80 100644
--- a/src/com/vividsolutions/jts/simplify/DouglasPeuckerSimplifier.java
+++ b/src/com/vividsolutions/jts/simplify/DouglasPeuckerSimplifier.java
@@ -33,29 +33,43 @@
 
 package com.vividsolutions.jts.simplify;
 
-import java.util.*;
 import com.vividsolutions.jts.geom.*;
 import com.vividsolutions.jts.geom.util.*;
 
 /**
- * Simplifies a {@link Geometry} using the standard Douglas-Peucker algorithm.
+ * Simplifies a {@link Geometry} using the Douglas-Peucker algorithm.
  * Ensures that any polygonal geometries returned are valid.
  * Simple lines are not guaranteed to remain simple after simplification.
  * All geometry types are handled. 
- * Empty and point geometries are returned unchanged.
+ * Empty and point geometries are returned unchanged.
+ * Empty geometry components are deleted.
  * <p>
  * Note that in general D-P does not preserve topology -
  * e.g. polygons can be split, collapse to lines or disappear
  * holes can be created or disappear,
  * and lines can cross.
  * To simplify geometry while preserving topology use {@link TopologyPreservingSimplifier}.
- * (However, using D-P is significantly faster).
+ * (However, using D-P is significantly faster).
+ *<h2>KNOWN BUGS</h2>
+ *<ul>
+ *<li>In some cases the approach used to clean invalid simplified polygons
+ *can distort the output geometry severely.
+ *</ul>
+ *
  *
- * @version 1.7
+ * @version 1.7
+ * @see TopologyPreservingSimplifier
  */
 public class DouglasPeuckerSimplifier
 {
 
+  /**
+   * Simplifies a geometry using a given tolerance.
+   * 
+   * @param geom geometry to simplify
+   * @param distanceTolerance the tolerance to use
+   * @return a simplified version of the geometry
+   */
   public static Geometry simplify(Geometry geom, double distanceTolerance)
   {
     DouglasPeuckerSimplifier tss = new DouglasPeuckerSimplifier(geom);
@@ -67,6 +81,11 @@ public class DouglasPeuckerSimplifier
   private double distanceTolerance;
   private boolean isEnsureValidTopology = true;
   
+  /**
+   * Creates a simplifier for a given geometry.
+   * 
+   * @param inputGeom the geometry to simplify
+   */
   public DouglasPeuckerSimplifier(Geometry inputGeom)
   {
     this.inputGeom = inputGeom;
@@ -105,6 +124,11 @@ public class DouglasPeuckerSimplifier
   	this.isEnsureValidTopology = isEnsureValidTopology;
   }
   
+  /**
+   * Gets the simplified geometry.
+   * 
+   * @return the simplified geometry
+   */
   public Geometry getResultGeometry()
   {
     // empty input produces an empty result
@@ -125,15 +149,24 @@ class DPTransformer
 	
   protected CoordinateSequence transformCoordinates(CoordinateSequence coords, Geometry parent)
   {
-    Coordinate[] inputPts = coords.toCoordinateArray();
-    Coordinate[] newPts = DouglasPeuckerLineSimplifier.simplify(inputPts, distanceTolerance);
+    Coordinate[] inputPts = coords.toCoordinateArray();
+    Coordinate[] newPts = null;
+    if (inputPts.length == 0) {
+      newPts = new Coordinate[0];
+    }
+    else {
+      newPts = DouglasPeuckerLineSimplifier.simplify(inputPts, distanceTolerance);
+    }
     return factory.getCoordinateSequenceFactory().create(newPts);
   }
 
   /**
    * Simplifies a polygon, fixing it if required.
    */
-  protected Geometry transformPolygon(Polygon geom, Geometry parent) {
+  protected Geometry transformPolygon(Polygon geom, Geometry parent) {
+    // empty geometries are simply removed
+    if (geom.isEmpty())
+      return null;
     Geometry rawGeom = super.transformPolygon(geom, parent);
     // don't try and correct if the parent is going to do this
     if (parent instanceof MultiPolygon) {
diff --git a/src/com/vividsolutions/jts/simplify/TaggedLineStringSimplifier.java b/src/com/vividsolutions/jts/simplify/TaggedLineStringSimplifier.java
index e0eb075..e06ad26 100644
--- a/src/com/vividsolutions/jts/simplify/TaggedLineStringSimplifier.java
+++ b/src/com/vividsolutions/jts/simplify/TaggedLineStringSimplifier.java
@@ -150,25 +150,30 @@ public class TaggedLineStringSimplifier
     maxDistance[0] = maxDist;
     return maxIndex;
   }
-
+
+  /**
+   * Flattens a section of the line between
+   * indexes <code>start</code> and <code>end</code>,
+   * replacing them with a line between the endpoints.
+   * The input and output indexes are updated
+   * to reflect this.
+   * 
+   * @param start the start index of the flattened section
+   * @param end the end index of the flattened section
+   * @return the new segment created
+   */
   private LineSegment flatten(int start, int end)
   {
     // make a new segment for the simplified geometry
     Coordinate p0 = linePts[start];
     Coordinate p1 = linePts[end];
     LineSegment newSeg = new LineSegment(p0, p1);
-// update the indexes
+    // update the indexes
     remove(line, start, end);
     outputIndex.add(newSeg);
     return newSeg;
   }
 
-  /**
-   * Index of section to be tested for flattening - reusable
-   */
-  private int[] validSectionIndex = new int[2];
-
-
   private boolean hasBadIntersection(TaggedLineString parentLine,
                        int[] sectionIndex,
                        LineSegment candidateSeg)
diff --git a/src/com/vividsolutions/jts/simplify/TopologyPreservingSimplifier.java b/src/com/vividsolutions/jts/simplify/TopologyPreservingSimplifier.java
index 1017cb0..87e626c 100644
--- a/src/com/vividsolutions/jts/simplify/TopologyPreservingSimplifier.java
+++ b/src/com/vividsolutions/jts/simplify/TopologyPreservingSimplifier.java
@@ -67,14 +67,18 @@ import com.vividsolutions.jts.util.Debug;
  * <p>
  * All geometry types are handled. 
  * Empty and point geometries are returned unchanged.
+ * Empty geometry components are deleted.
  * <p>
  * The simplification uses a maximum-distance difference algorithm
  * similar to the Douglas-Peucker algorithm.
  *
  * <h3>KNOWN BUGS</h3>
  * <ul>
- * <li>If a small hole is very near an edge, it is possible for the edge to be moved by
- * a relatively large tolerance value and end up with the hole outside the result shell.
+ * <li>May create invalid topology if there are components which are 
+ * small relative to the tolerance value.
+ * In particular, if a small hole is very near an edge, it is possible for the edge to be moved by
+ * a relatively large tolerance value and end up with the hole outside the result shell
+ * (or inside another hole).
  * Similarly, it is possible for a small polygon component to end up inside
  * a nearby larger polygon.
  * A workaround is to test for this situation in post-processing and remove
@@ -134,7 +138,8 @@ public class TopologyPreservingSimplifier
       extends GeometryTransformer
   {
     protected CoordinateSequence transformCoordinates(CoordinateSequence coords, Geometry parent)
-    {
+    {
+      if (coords.size() == 0) return null;
     	// for linear components (including rings), simplify the linestring
       if (parent instanceof LineString) {
         TaggedLineString taggedLine = (TaggedLineString) linestringMap.get(parent);
@@ -167,9 +172,11 @@ public class TopologyPreservingSimplifier
     public void filter(Geometry geom)
     {
       if (geom instanceof LineString) {
-        LineString line = (LineString) geom;
-        int minSize = ((LineString) line).isClosed() ? 4 : 2;
+        LineString line = (LineString) geom;
+        // skip empty geometries
+        if (line.isEmpty()) return;
         
+        int minSize = ((LineString) line).isClosed() ? 4 : 2;
         TaggedLineString taggedLine = new TaggedLineString((LineString) line, minSize);
         linestringMap.put(line, taggedLine);
       }
diff --git a/src/com/vividsolutions/jts/simplify/VWLineSimplifier.java b/src/com/vividsolutions/jts/simplify/VWLineSimplifier.java
new file mode 100644
index 0000000..38679fa
--- /dev/null
+++ b/src/com/vividsolutions/jts/simplify/VWLineSimplifier.java
@@ -0,0 +1,162 @@
+package com.vividsolutions.jts.simplify;
+
+import com.vividsolutions.jts.geom.Coordinate;
+import com.vividsolutions.jts.geom.CoordinateList;
+import com.vividsolutions.jts.geom.Triangle;
+
+/**
+ * Simplifies a linestring (sequence of points) using the 
+ * Visvalingam-Whyatt algorithm.
+ * The Visvalingam-Whyatt algorithm simplifies geometry 
+ * by removing vertices while trying to minimize the area changed.
+ * 
+ * @version 1.7
+ */
+class VWLineSimplifier
+{
+  public static Coordinate[] simplify(Coordinate[] pts, double distanceTolerance)
+  {
+    VWLineSimplifier simp = new VWLineSimplifier(pts, distanceTolerance);
+    return simp.simplify();
+  }
+
+  private Coordinate[] pts;
+  private double tolerance;
+
+  public VWLineSimplifier(Coordinate[] pts, double distanceTolerance)
+  {
+    this.pts = pts;
+    this.tolerance = distanceTolerance * distanceTolerance;
+  }
+
+  public Coordinate[] simplify()
+  {
+    VWLineSimplifier.VWVertex vwLine = VWVertex.buildLine(pts);
+    double minArea = tolerance;
+    do {
+      minArea = simplifyVertex(vwLine);
+    } while (minArea < tolerance);
+    Coordinate[] simp = vwLine.getCoordinates();
+    // ensure computed value is a valid line
+    if (simp.length < 2) {
+      return new Coordinate[] { simp[0], new Coordinate(simp[0]) };
+    }
+    return simp;
+  }
+
+  private double simplifyVertex(VWLineSimplifier.VWVertex vwLine)
+  {
+    /**
+     * Scan vertices in line and remove the one with smallest effective area.
+     */
+    // TODO: use an appropriate data structure to optimize finding the smallest area vertex
+    VWLineSimplifier.VWVertex curr = vwLine;
+    double minArea = curr.getArea();
+    VWLineSimplifier.VWVertex minVertex = null;
+    while (curr != null) {
+      double area = curr.getArea();
+      if (area < minArea) {
+        minArea = area;
+        minVertex = curr;
+      }
+      curr = curr.next;
+    }
+    if (minVertex != null && minArea < tolerance) {
+      minVertex.remove();
+    }
+    if (! vwLine.isLive()) return -1;
+    return minArea;
+  }
+
+
+  static class VWVertex
+  {
+    public static VWLineSimplifier.VWVertex buildLine(Coordinate[] pts)
+    {
+      VWLineSimplifier.VWVertex first = null;
+      VWLineSimplifier.VWVertex prev = null;
+      for (int i = 0; i < pts.length; i++) {
+        VWLineSimplifier.VWVertex v = new VWVertex(pts[i]);
+        if (first == null)
+          first = v;
+        v.setPrev(prev);
+        if (prev != null) {
+          prev.setNext(v);
+          prev.updateArea();
+        }
+        prev = v;
+      }
+      return first;
+    }
+    
+    public static double MAX_AREA = Double.MAX_VALUE;
+    
+    private Coordinate pt;
+    private VWLineSimplifier.VWVertex prev;
+    private VWLineSimplifier.VWVertex next;
+    private double area = MAX_AREA;
+    private boolean isLive = true;
+
+    public VWVertex(Coordinate pt)
+    {
+      this.pt = pt;
+    }
+
+    public void setPrev(VWLineSimplifier.VWVertex prev)
+    {
+      this.prev = prev;
+    }
+
+    public void setNext(VWLineSimplifier.VWVertex next)
+    {
+      this.next = next;
+    }
+
+    public void updateArea()
+    {
+      if (prev == null || next == null) {
+        area = MAX_AREA;
+        return;
+      }
+      area = Math.abs(Triangle.area(prev.pt, pt, next.pt));
+    }
+
+    public double getArea()
+    {
+      return area;
+    }
+    public boolean isLive()
+    {
+      return isLive;
+    }
+    public VWLineSimplifier.VWVertex remove()
+    {
+      VWLineSimplifier.VWVertex tmpPrev = prev;
+      VWLineSimplifier.VWVertex tmpNext = next;
+      VWLineSimplifier.VWVertex result = null;
+      if (prev != null) {
+        prev.setNext(tmpNext);
+        prev.updateArea();
+        result = prev;
+      }
+      if (next != null) {
+        next.setPrev(tmpPrev);
+        next.updateArea();
+        if (result == null)
+          result = next;
+      }
+      isLive = false;
+      return result;
+    }
+    public Coordinate[] getCoordinates()
+    {
+      CoordinateList coords = new CoordinateList();
+      VWLineSimplifier.VWVertex curr = this;
+      do {
+        coords.add(curr.pt, false);
+        curr = curr.next;
+      } while (curr != null);
+      return coords.toCoordinateArray();
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/com/vividsolutions/jts/simplify/VWSimplifier.java b/src/com/vividsolutions/jts/simplify/VWSimplifier.java
new file mode 100644
index 0000000..78e7183
--- /dev/null
+++ b/src/com/vividsolutions/jts/simplify/VWSimplifier.java
@@ -0,0 +1,227 @@
+/*
+ * The JTS Topology Suite is a collection of Java classes that
+ * implement the fundamental operations required to validate a given
+ * geo-spatial data set to a known topological specification.
+ *
+ * Copyright (C) 2001 Vivid Solutions
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * For more information, contact:
+ *
+ *     Vivid Solutions
+ *     Suite #1A
+ *     2328 Government Street
+ *     Victoria BC  V8T 5G5
+ *     Canada
+ *
+ *     (250)385-6040
+ *     www.vividsolutions.com
+ */
+
+package com.vividsolutions.jts.simplify;
+
+import com.vividsolutions.jts.geom.*;
+import com.vividsolutions.jts.geom.util.*;
+
+/**
+ * Simplifies a {@link Geometry} using the Visvalingam-Whyatt area-based algorithm. 
+ * Ensures that any polygonal geometries returned are valid. Simple lines are not
+ * guaranteed to remain simple after simplification. All geometry types are
+ * handled. Empty and point geometries are returned unchanged. Empty geometry
+ * components are deleted.
+ * <p>
+ * The simplification tolerance is specified as a distance. 
+ * This is converted to an area tolerance by squaring it.
+ * <p>
+ * Note that in general this algorithm does not preserve topology - e.g. polygons can be split,
+ * collapse to lines or disappear holes can be created or disappear, and lines
+ * can cross.
+ * 
+ * <h3>Known Bugs</h3>
+ * <ul>
+ * <li>Not yet optimized for performance
+ * <li>Does not simplify the endpoint of rings
+ * </ul>
+ * <h3>To Do</h3>
+ * <ul>
+ * <li>Allow specifying desired number of vertices in the output
+ * </ul>
+ * 
+ * @version 1.7
+ */
+public class VWSimplifier
+{
+
+  /**
+   * Simplifies a geometry using a given tolerance.
+   * 
+   * @param geom geometry to simplify
+   * @param distanceTolerance the tolerance to use
+   * @return a simplified version of the geometry
+   */
+  public static Geometry simplify(Geometry geom, double distanceTolerance)
+  {
+    VWSimplifier simp = new VWSimplifier(geom);
+    simp.setDistanceTolerance(distanceTolerance);
+    return simp.getResultGeometry();
+  }
+
+  private Geometry inputGeom;
+  private double distanceTolerance;
+  private boolean isEnsureValidTopology = true;
+
+  /**
+   * Creates a simplifier for a given geometry.
+   * 
+   * @param inputGeom the geometry to simplify
+   */
+  public VWSimplifier(Geometry inputGeom)
+  {
+    this.inputGeom = inputGeom;
+  }
+
+  /**
+   * Sets the distance tolerance for the simplification. All vertices in the
+   * simplified geometry will be within this distance of the original geometry.
+   * The tolerance value must be non-negative.
+   * 
+   * @param distanceTolerance
+   *          the approximation tolerance to use
+   */
+  public void setDistanceTolerance(double distanceTolerance)
+  {
+    if (distanceTolerance < 0.0)
+      throw new IllegalArgumentException("Tolerance must be non-negative");
+    this.distanceTolerance = distanceTolerance;
+  }
+
+  /**
+   * Controls whether simplified polygons will be "fixed" to have valid
+   * topology. The caller may choose to disable this because:
+   * <ul>
+   * <li>valid topology is not required
+   * <li>fixing topology is a relative expensive operation
+   * <li>in some pathological cases the topology fixing operation may either
+   * fail or run for too long
+   * </ul>
+   * 
+   * The default is to fix polygon topology.
+   * 
+   * @param isEnsureValidTopology
+   */
+  public void setEnsureValid(boolean isEnsureValidTopology)
+  {
+    this.isEnsureValidTopology = isEnsureValidTopology;
+  }
+
+  /**
+   * Gets the simplified geometry.
+   * 
+   * @return the simplified geometry
+   */
+  public Geometry getResultGeometry()
+  {
+    // empty input produces an empty result
+    if (inputGeom.isEmpty())
+      return (Geometry) inputGeom.clone();
+
+    return (new VWTransformer(isEnsureValidTopology)).transform(inputGeom);
+  }
+
+  class VWTransformer extends GeometryTransformer
+  {
+    private boolean isEnsureValidTopology = true;
+
+    public VWTransformer(boolean isEnsureValidTopology)
+    {
+      this.isEnsureValidTopology = isEnsureValidTopology;
+    }
+
+    protected CoordinateSequence transformCoordinates(CoordinateSequence coords, Geometry parent)
+    {
+      Coordinate[] inputPts = coords.toCoordinateArray();
+      Coordinate[] newPts = null;
+      if (inputPts.length == 0) {
+        newPts = new Coordinate[0];
+      }
+      else {
+        newPts = VWLineSimplifier.simplify(inputPts, distanceTolerance);
+      }
+      return factory.getCoordinateSequenceFactory().create(newPts);
+    }
+
+    /**
+     * Simplifies a polygon, fixing it if required.
+     */
+    protected Geometry transformPolygon(Polygon geom, Geometry parent)
+    {
+      // empty geometries are simply removed
+      if (geom.isEmpty())
+        return null;
+      Geometry rawGeom = super.transformPolygon(geom, parent);
+      // don't try and correct if the parent is going to do this
+      if (parent instanceof MultiPolygon) {
+        return rawGeom;
+      }
+      return createValidArea(rawGeom);
+    }
+
+    /**
+     * Simplifies a LinearRing. If the simplification results in a degenerate
+     * ring, remove the component.
+     * 
+     * @return null if the simplification results in a degenerate ring
+     */
+    protected Geometry transformLinearRing(LinearRing geom, Geometry parent)
+    {
+      boolean removeDegenerateRings = parent instanceof Polygon;
+      Geometry simpResult = super.transformLinearRing(geom, parent);
+      if (removeDegenerateRings && !(simpResult instanceof LinearRing))
+        return null;
+      ;
+      return simpResult;
+    }
+
+    /**
+     * Simplifies a MultiPolygon, fixing it if required.
+     */
+    protected Geometry transformMultiPolygon(MultiPolygon geom, Geometry parent)
+    {
+      Geometry rawGeom = super.transformMultiPolygon(geom, parent);
+      return createValidArea(rawGeom);
+    }
+
+    /**
+     * Creates a valid area geometry from one that possibly has bad topology
+     * (i.e. self-intersections). Since buffer can handle invalid topology, but
+     * always returns valid geometry, constructing a 0-width buffer "corrects"
+     * the topology. Note this only works for area geometries, since buffer
+     * always returns areas. This also may return empty geometries, if the input
+     * has no actual area.
+     * 
+     * @param rawAreaGeom
+     *          an area geometry possibly containing self-intersections
+     * @return a valid area geometry
+     */
+    private Geometry createValidArea(Geometry rawAreaGeom)
+    {
+      if (isEnsureValidTopology)
+        return rawAreaGeom.buffer(0.0);
+      return rawAreaGeom;
+    }
+  }
+
+}
diff --git a/src/com/vividsolutions/jts/simplify/package.html b/src/com/vividsolutions/jts/simplify/package.html
deleted file mode 100644
index 4a9d794..0000000
--- a/src/com/vividsolutions/jts/simplify/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Classes which implement algorithms for simplifying or generalizing geometries.
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/triangulate/ConformingDelaunayTriangulationBuilder.java b/src/com/vividsolutions/jts/triangulate/ConformingDelaunayTriangulationBuilder.java
index bd8689c..9c70675 100644
--- a/src/com/vividsolutions/jts/triangulate/ConformingDelaunayTriangulationBuilder.java
+++ b/src/com/vividsolutions/jts/triangulate/ConformingDelaunayTriangulationBuilder.java
@@ -79,6 +79,7 @@ public class ConformingDelaunayTriangulationBuilder
 	 * All linear components in the input will be used as constraints.
 	 * The constraint vertices do not have to be disjoint from 
 	 * the site vertices.
+   * The constraints must not contain duplicate segments (up to orientation).
 	 * 
 	 * @param constraintLines the lines to constraint to
 	 */
diff --git a/src/com/vividsolutions/jts/triangulate/ConformingDelaunayTriangulator.java b/src/com/vividsolutions/jts/triangulate/ConformingDelaunayTriangulator.java
index 71361e5..519ffce 100644
--- a/src/com/vividsolutions/jts/triangulate/ConformingDelaunayTriangulator.java
+++ b/src/com/vividsolutions/jts/triangulate/ConformingDelaunayTriangulator.java
@@ -135,6 +135,7 @@ public class ConformingDelaunayTriangulator
 
 	/**
 	 * Sets the constraints to be conformed to by the computed triangulation.
+	 * The constraints must not contain duplicate segments (up to orientation).
 	 * The unique set of vertices (as {@link ConstraintVertex}es) 
 	 * forming the constraints must also be supplied.
 	 * Supplying it explicitly allows the ConstraintVertexes to be initialized
diff --git a/src/com/vividsolutions/jts/triangulate/VoronoiDiagramBuilder.java b/src/com/vividsolutions/jts/triangulate/VoronoiDiagramBuilder.java
index bc3e382..22f1fb2 100644
--- a/src/com/vividsolutions/jts/triangulate/VoronoiDiagramBuilder.java
+++ b/src/com/vividsolutions/jts/triangulate/VoronoiDiagramBuilder.java
@@ -40,9 +40,16 @@ import com.vividsolutions.jts.triangulate.quadedge.*;
 /**
  * A utility class which creates Voronoi Diagrams
  * from collections of points.
- * The diagram is returned as a {@link GeometryCollection} of {@link Polygon}s,
- * clipped to the larger of a supplied envelope or to an envelope determined
- * by the input sites.
+ * The diagram is returned as a {@link GeometryCollection} of {@link Polygon}s
+ * representing the faces of the Voronoi diagram.
+ * The faces are clipped to the larger of:
+ * <ul>
+ * <li> an envelope supplied by {@link #setClipEnvelope(Envelope)}
+ * <li> an envelope determined by the input sites
+ * </ul>
+ * The <tt>userData</tt> attribute of each face <tt>Polygon</tt> is set to 
+ * the <tt>Coordinate</tt>  of the corresponding input site.
+ * This allows using a <tt>Map</tt> to link faces to data associated with sites.
  * 
  * @author Martin Davis
  *
@@ -142,9 +149,13 @@ public class VoronoiDiagramBuilder
 	/**
 	 * Gets the faces of the computed diagram as a {@link GeometryCollection} 
 	 * of {@link Polygon}s, clipped as specified.
+	 * <p>
+	 * The <tt>userData</tt> attribute of each face <tt>Polygon</tt> is set to 
+	 * the <tt>Coordinate</tt>  of the corresponding input site.
+	 * This allows using a <tt>Map</tt> to link faces to data associated with sites.
 	 * 
 	 * @param geomFact the geometry factory to use to create the output
-	 * @return the faces of the diagram
+	 * @return a <tt>GeometryCollection</tt> containg the face <tt>Polgyon</tt>s of the diagram
 	 */
 	public Geometry getDiagram(GeometryFactory geomFact)
 	{
diff --git a/src/com/vividsolutions/jts/triangulate/package.html b/src/com/vividsolutions/jts/triangulate/package.html
deleted file mode 100644
index 0f96046..0000000
--- a/src/com/vividsolutions/jts/triangulate/package.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Classes to compute Delaunay triangulations.
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/triangulate/quadedge/package.html b/src/com/vividsolutions/jts/triangulate/quadedge/package.html
deleted file mode 100644
index 47d6702..0000000
--- a/src/com/vividsolutions/jts/triangulate/quadedge/package.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Classes to implement a topological subdivision of quadeges, to support creating triangulations
-and Voronoi diagrams.
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jts/util/Debug.java b/src/com/vividsolutions/jts/util/Debug.java
index 1237cfb..edff60d 100644
--- a/src/com/vividsolutions/jts/util/Debug.java
+++ b/src/com/vividsolutions/jts/util/Debug.java
@@ -49,8 +49,11 @@ import com.vividsolutions.jts.geom.*;
  * DEBUG_PROPERTY_NAME (currently "jts.debug") has the value
  * "on" or "true" debugging is enabled.
  * Otherwise, debugging is disabled.
- * The system property can be set by adding an option '-Djts.debug=on'
- * to the Java VM commandline.
+ * The system property can be set by specifying the following JVM option:
+ * <pre>
+ * -Djts.debug=on
+ * </pre>
+ * 
  *
  * @version 1.7
  */
@@ -71,6 +74,8 @@ public class Debug {
     }
   }
 
+  private static Stopwatch stopwatch = new Stopwatch();
+  private static long lastTimePrinted;
 
   /**
    * Prints the status of debugging to <tt>System.out</tt>
@@ -138,6 +143,44 @@ public class Debug {
     debug.println();
   }
   
+  public static void resetTime()
+  {
+    stopwatch.reset();
+    lastTimePrinted = stopwatch.getTime();
+  }
+  
+  public static void printTime(String tag)
+  {
+    if (!debugOn) {
+      return;
+    }
+    long time = stopwatch.getTime();
+    long elapsedTime = time - lastTimePrinted;
+    debug.instancePrint(
+        formatField(Stopwatch.getTimeString(time), 10)
+        + " (" + formatField(Stopwatch.getTimeString(elapsedTime), 10) + " ) "
+        + tag);
+    debug.println();    
+    lastTimePrinted = time;
+  }
+  
+  private static String formatField(String s, int fieldLen)
+  {
+    int nPad = fieldLen - s.length();
+    if (nPad <= 0) return s;
+    String padStr = spaces(nPad) + s;
+    return padStr.substring(padStr.length() - fieldLen);
+  }
+  
+  private static String spaces(int n)
+  {
+    char[] ch = new char[n];
+    for (int i = 0; i < n; i++) {
+      ch[i] = ' ';
+    }
+    return new String(ch);
+  }
+  
   public static boolean equals(Coordinate c1, Coordinate c2, double tolerance)
   {
   	return c1.distance(c2) <= tolerance;
@@ -232,7 +275,6 @@ public class Debug {
     }
   }
 
-
   public void instancePrintWatch() {
     if (watchObj == null) return;
     instancePrint(watchObj);
diff --git a/src/com/vividsolutions/jts/util/NumberUtil.java b/src/com/vividsolutions/jts/util/NumberUtil.java
new file mode 100644
index 0000000..ce95860
--- /dev/null
+++ b/src/com/vividsolutions/jts/util/NumberUtil.java
@@ -0,0 +1,11 @@
+package com.vividsolutions.jts.util;
+
+public class NumberUtil
+{
+
+  public static boolean equalsWithTolerance(double x1, double x2, double tolerance)
+  {
+    return Math.abs(x1 - x2) <= tolerance;
+  }
+
+}
diff --git a/src/com/vividsolutions/jts/util/Stopwatch.java b/src/com/vividsolutions/jts/util/Stopwatch.java
index a4de7f2..25f1a55 100644
--- a/src/com/vividsolutions/jts/util/Stopwatch.java
+++ b/src/com/vividsolutions/jts/util/Stopwatch.java
@@ -96,7 +96,13 @@ public class Stopwatch {
   public String getTimeString()
   {
     long totalTime = getTime();
-    String totalTimeStr = totalTime < 10000 ? totalTime + " ms" : (double) totalTime / 1000.0 + " s";
+    return getTimeString(totalTime);
+  }
+
+  public static String getTimeString(long timeMillis) {
+    String totalTimeStr = timeMillis < 10000 
+        ? timeMillis + " ms" 
+        : (double) timeMillis / 1000.0 + " s";
     return totalTimeStr;
   }
 }
diff --git a/src/com/vividsolutions/jts/util/StringUtil.java b/src/com/vividsolutions/jts/util/StringUtil.java
new file mode 100644
index 0000000..25b75ae
--- /dev/null
+++ b/src/com/vividsolutions/jts/util/StringUtil.java
@@ -0,0 +1,94 @@
+package com.vividsolutions.jts.util;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.LineNumberReader;
+import java.io.PrintStream;
+import java.io.StringReader;
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+import java.util.ArrayList;
+
+/**
+ * Utility methods for working with {@link String}s.
+ * 
+ * @author Martin Davis
+ *
+ */
+public class StringUtil
+{
+  /**
+   * Mimics the the Java SE {@link String#split(String)} method.
+   *
+   * @param s the string to split.
+   * @param separator the separator to use.
+   * @return the array of split strings.
+   */
+ public static String[] split(String s, String separator)
+ {
+   int separatorlen = separator.length();
+   ArrayList tokenList = new ArrayList();
+   String tmpString = "" + s;
+   int pos = tmpString.indexOf(separator);
+   while (pos >= 0) {
+     String token = tmpString.substring(0, pos);
+     tokenList.add(token);
+     tmpString = tmpString.substring(pos + separatorlen);
+     pos = tmpString.indexOf(separator);
+   }
+   if (tmpString.length() > 0)
+     tokenList.add(tmpString);
+   String[] res = new String[tokenList.size()];
+   for (int i = 0; i < res.length; i++) {
+     res[i] = (String) tokenList.get(i);
+   }
+   return res;
+ }
+
+ public final static String NEWLINE = System.getProperty("line.separator");
+
+ /**
+  *  Returns an throwable's stack trace
+  */
+ public static String getStackTrace(Throwable t) {
+     ByteArrayOutputStream os = new ByteArrayOutputStream();
+     PrintStream ps = new PrintStream(os);
+     t.printStackTrace(ps);
+     return os.toString();
+ }
+
+ public static String getStackTrace(Throwable t, int depth) {
+     String stackTrace = "";
+     StringReader stringReader = new StringReader(getStackTrace(t));
+     LineNumberReader lineNumberReader = new LineNumberReader(stringReader);
+     for (int i = 0; i < depth; i++) {
+         try {
+             stackTrace += lineNumberReader.readLine() + NEWLINE;
+         } catch (IOException e) {
+             Assert.shouldNeverReachHere();
+         }
+     }
+     return stackTrace;
+ }
+
+  private static NumberFormat SIMPLE_ORDINATE_FORMAT = new DecimalFormat("0.#");
+  
+  public static String toString(double d)
+  {
+    return SIMPLE_ORDINATE_FORMAT.format(d);
+  }
+
+  public static String spaces(int n)
+  {
+    return chars(' ', n);
+  }
+  
+  public static String chars(char c, int n)
+  {
+    char[] ch = new char[n];
+    for (int i = 0; i < n; i++) {
+      ch[i] = c;
+    }
+    return new String(ch);
+  }
+}
diff --git a/src/com/vividsolutions/jts/util/UniqueCoordinateArrayFilter.java b/src/com/vividsolutions/jts/util/UniqueCoordinateArrayFilter.java
index 993229e..82e2e96 100644
--- a/src/com/vividsolutions/jts/util/UniqueCoordinateArrayFilter.java
+++ b/src/com/vividsolutions/jts/util/UniqueCoordinateArrayFilter.java
@@ -43,10 +43,27 @@ import com.vividsolutions.jts.geom.CoordinateFilter;
 /**
  *  A {@link CoordinateFilter} that builds a set of <code>Coordinate</code>s.
  *  The set of coordinates contains no duplicate points.
+ *  It preserves the order of the input points.
  *
  *@version 1.7
  */
-public class UniqueCoordinateArrayFilter implements CoordinateFilter {
+public class UniqueCoordinateArrayFilter implements CoordinateFilter 
+{
+  /**
+   * Convenience method which allows running the filter over an array of {@link Coordinate}s.
+   * 
+   * @param coords an array of coordinates
+   * @return an array of the unique coordinates
+   */
+  public static Coordinate[] filterCoordinates(Coordinate[] coords)
+  {
+    UniqueCoordinateArrayFilter filter = new UniqueCoordinateArrayFilter();
+    for (int i = 0; i < coords.length; i++) {
+      filter.filter(coords[i]);
+    }
+    return filter.getCoordinates();
+  }
+  
   TreeSet treeSet = new TreeSet();
   ArrayList list = new ArrayList();
 
diff --git a/src/com/vividsolutions/jts/util/package.html b/src/com/vividsolutions/jts/util/package.html
deleted file mode 100644
index 171f177..0000000
--- a/src/com/vividsolutions/jts/util/package.html
+++ /dev/null
@@ -1,8 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-</head>
-<body bgcolor="white">
-Contains support classes for the Java Topology Suite.
-</body>
-</html>
diff --git a/src/com/vividsolutions/jtsexample/geom/BasicExample.java b/src/com/vividsolutions/jtsexample/geom/BasicExample.java
deleted file mode 100644
index 16e2c61..0000000
--- a/src/com/vividsolutions/jtsexample/geom/BasicExample.java
+++ /dev/null
@@ -1,66 +0,0 @@
-
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jtsexample.geom;
-
-import com.vividsolutions.jts.geom.Coordinate;
-import com.vividsolutions.jts.geom.Geometry;
-import com.vividsolutions.jts.geom.GeometryFactory;
-import com.vividsolutions.jts.io.WKTReader;
-
-/**
- * Shows basic ways of creating and operating on geometries
- *
- * @version 1.7
- */
-public class BasicExample
-{
-  public static void main(String[] args)
-      throws Exception
-  {
-    // read a geometry from a WKT string (using the default geometry factory)
-    Geometry g1 = new WKTReader().read("LINESTRING (0 0, 10 10, 20 20)");
-    System.out.println("Geometry 1: " + g1);
-
-    // create a geometry by specifying the coordinates directly
-    Coordinate[] coordinates = new Coordinate[]{new Coordinate(0, 0),
-      new Coordinate(10, 10), new Coordinate(20, 20)};
-    // use the default factory, which gives full double-precision
-    Geometry g2 = new GeometryFactory().createLineString(coordinates);
-    System.out.println("Geometry 2: " + g2);
-
-    // compute the intersection of the two geometries
-    Geometry g3 = g1.intersection(g2);
-    System.out.println("G1 intersection G2: " + g3);
-  }
-}
diff --git a/src/com/vividsolutions/jtsexample/geom/ConstructionExample.java b/src/com/vividsolutions/jtsexample/geom/ConstructionExample.java
deleted file mode 100644
index 1d7c6b1..0000000
--- a/src/com/vividsolutions/jtsexample/geom/ConstructionExample.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.vividsolutions.jtsexample.geom;
-
-import com.vividsolutions.jts.geom.*;
-
-/**
- * Examples of constructing Geometries programmatically.
- * <p>
- * The Best Practice moral here is:
- * <quote>
- * Use the GeometryFactory to construct Geometries whenever possible.
- * </quote>
- * This has several advantages:
- * <ol>
- * <li>Simplifies your code
- * <li>allows you to take advantage of convenience methods provided by GeometryFactory
- * <li>Insulates your code from changes in the signature of JTS constructors
- * </ol>
- *
- * @version 1.7
- */
-public class ConstructionExample
-{
-
-  public static void main(String[] args)
-      throws Exception
-  {
-    // create a factory using default values (e.g. floating precision)
-    GeometryFactory fact = new GeometryFactory();
-
-    Point p1 = fact.createPoint(new Coordinate(0,0));
-    System.out.println(p1);
-
-    Point p2 = fact.createPoint(new Coordinate(1,1));
-    System.out.println(p2);
-
-    MultiPoint mpt = fact.createMultiPoint(new Coordinate[] { new Coordinate(0,0), new Coordinate(1,1) } );
-    System.out.println(mpt);
-
-  }
-}
\ No newline at end of file
diff --git a/src/com/vividsolutions/jtsexample/geom/ExtendedCoordinate.java b/src/com/vividsolutions/jtsexample/geom/ExtendedCoordinate.java
deleted file mode 100644
index 5226efc..0000000
--- a/src/com/vividsolutions/jtsexample/geom/ExtendedCoordinate.java
+++ /dev/null
@@ -1,93 +0,0 @@
-
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jtsexample.geom;
-
-import com.vividsolutions.jts.geom.*;
-
-
-/**
- * @version 1.7
- */
-public class ExtendedCoordinate
-    extends Coordinate
-{
-    private static final long serialVersionUID = 8527484784733305576L;
-  // A Coordinate subclass should provide all of these methods
-
-  /**
-   * Default constructor
-   */
-  public ExtendedCoordinate()
-  {
-    super();
-    this.m = 0.0;
-  }
-
-  public ExtendedCoordinate(double x, double y, double z, double m)
-  {
-    super(x, y, z);
-    this.m = m;
-  }
-
-  public ExtendedCoordinate(Coordinate coord)
-  {
-    super(coord);
-    if (coord instanceof ExtendedCoordinate)
-      m = ((ExtendedCoordinate) coord).m;
-    else
-      m = Double.NaN;
-  }
-
-  public ExtendedCoordinate(ExtendedCoordinate coord)
-  {
-    super(coord);
-    m = coord.m;
-  }
-
-  /**
-   * An example of extended data.
-   * The m variable holds a measure value for linear referencing
-   */
-
-  private double m;
-
-  public double getM() { return m; }
-  public void setM(double m) { this.m = m; }
-
-  public String toString()
-  {
-    String stringRep = x + " " + y + " m=" + m;
-    return stringRep;
-  }
-}
diff --git a/src/com/vividsolutions/jtsexample/geom/ExtendedCoordinateExample.java b/src/com/vividsolutions/jtsexample/geom/ExtendedCoordinateExample.java
deleted file mode 100644
index c1323f6..0000000
--- a/src/com/vividsolutions/jtsexample/geom/ExtendedCoordinateExample.java
+++ /dev/null
@@ -1,89 +0,0 @@
-
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jtsexample.geom;
-
-import com.vividsolutions.jts.geom.*;
-
-
-/**
- * @version 1.7
- */
-public class ExtendedCoordinateExample
-{
-
-  public static void main(String args[])
-  {
-    ExtendedCoordinateSequenceFactory seqFact = ExtendedCoordinateSequenceFactory.instance();
-
-    ExtendedCoordinate[] array1 = new ExtendedCoordinate[] {
-      new ExtendedCoordinate(0, 0, 0, 91),
-      new ExtendedCoordinate(10, 0, 0, 92),
-      new ExtendedCoordinate(10, 10, 0, 93),
-      new ExtendedCoordinate(0, 10, 0, 94),
-      new ExtendedCoordinate(0, 0, 0, 91),
-    };
-    CoordinateSequence seq1 = seqFact.create(array1);
-
-    CoordinateSequence seq2 = seqFact.create(
-    new ExtendedCoordinate[] {
-      new ExtendedCoordinate(5, 5, 0, 91),
-      new ExtendedCoordinate(15, 5, 0, 92),
-      new ExtendedCoordinate(15, 15, 0, 93),
-      new ExtendedCoordinate(5, 15, 0, 94),
-      new ExtendedCoordinate(5, 5, 0, 91),
-    });
-
-    GeometryFactory fact = new GeometryFactory(
-        ExtendedCoordinateSequenceFactory.instance());
-
-    Geometry g1 = fact.createPolygon(fact.createLinearRing(seq1), null);
-    Geometry g2 = fact.createPolygon(fact.createLinearRing(seq2), null);
-
-    System.out.println("WKT for g1: " + g1);
-    System.out.println("Internal rep for g1: " + ((Polygon) g1).getExteriorRing().getCoordinateSequence());
-
-    System.out.println("WKT for g2: " + g2);
-    System.out.println("Internal rep for g2: " + ((Polygon) g2).getExteriorRing().getCoordinateSequence());
-
-    Geometry gInt = g1.intersection(g2);
-
-    System.out.println("WKT for gInt: " + gInt);
-    System.out.println("Internal rep for gInt: " + ((Polygon) gInt).getExteriorRing().getCoordinateSequence());
-  }
-
-  public ExtendedCoordinateExample() {
-  }
-
-
-}
diff --git a/src/com/vividsolutions/jtsexample/geom/ExtendedCoordinateSequence.java b/src/com/vividsolutions/jtsexample/geom/ExtendedCoordinateSequence.java
deleted file mode 100644
index 3aa414e..0000000
--- a/src/com/vividsolutions/jtsexample/geom/ExtendedCoordinateSequence.java
+++ /dev/null
@@ -1,215 +0,0 @@
-
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jtsexample.geom;
-
-import com.vividsolutions.jts.geom.*;
-
-/**
- * Demonstrates how to implement a CoordinateSequence for a new kind of
- * coordinate (an {@link ExtendedCoordinate} in this example). In this
- * implementation, Coordinates returned by #toArray and #get are live -- parties
- * that change them are actually changing the ExtendedCoordinateSequence's
- * underlying data.
- *
- * @version 1.7
- */
-public class ExtendedCoordinateSequence
-    implements CoordinateSequence
-{
-  public static ExtendedCoordinate[] copy(Coordinate[] coordinates)
-  {
-    ExtendedCoordinate[] copy = new ExtendedCoordinate[coordinates.length];
-    for (int i = 0; i < coordinates.length; i++) {
-      copy[i] = new ExtendedCoordinate(coordinates[i]);
-    }
-    return copy;
-  }
-
-  public static ExtendedCoordinate[] copy(CoordinateSequence coordSeq)
-  {
-    ExtendedCoordinate[] copy = new ExtendedCoordinate[coordSeq.size()];
-    for (int i = 0; i < coordSeq.size(); i++) {
-      copy[i] = new ExtendedCoordinate(coordSeq.getCoordinate(i));
-    }
-    return copy;
-  }
-
-  private ExtendedCoordinate[] coordinates;
-
-  /**
-   * Copy constructor -- simply aliases the input array, for better performance.
-   */
-  public ExtendedCoordinateSequence(ExtendedCoordinate[] coordinates) {
-    this.coordinates = coordinates;
-  }
-
-  /**
-   * Constructor that makes a copy of an array of Coordinates.
-   * Always makes a copy of the input array, since the actual class
-   * of the Coordinates in the input array may be different from ExtendedCoordinate.
-   */
-  public ExtendedCoordinateSequence(Coordinate[] copyCoords) {
-    coordinates = copy(copyCoords);
-  }
-
-  /**
-   * Constructor that makes a copy of a CoordinateSequence.
-   */
-  public ExtendedCoordinateSequence(CoordinateSequence coordSeq) {
-    coordinates = copy(coordSeq);
-  }
-
-  /**
-   * Constructs a sequence of a given size, populated
-   * with new {@link ExtendedCoordinate}s.
-   *
-   * @param size the size of the sequence to create
-   */
-  public ExtendedCoordinateSequence(int size) {
-    coordinates = new ExtendedCoordinate[size];
-    for (int i = 0; i < size; i++) {
-      coordinates[i] = new ExtendedCoordinate();
-    }
-  }
-
-  /**
-   * @see com.vividsolutions.jts.geom.CoordinateSequence#getDimension()
-   */
-  public int getDimension() { return 4; }
-
-  public Coordinate getCoordinate(int i) {
-    return coordinates[i];
-  }
-
-  /**
-   * @see com.vividsolutions.jts.geom.CoordinateSequence#getX(int)
-   */
-  public Coordinate getCoordinateCopy(int index) {
-    return new Coordinate(coordinates[index]);
-  }
-  /**
-   * @see com.vividsolutions.jts.geom.CoordinateSequence#getX(int)
-   */
-  public void getCoordinate(int index, Coordinate coord) {
-    coord.x = coordinates[index].x;
-    coord.y = coordinates[index].y;
-  }
-
-
-  /**
-   * @see com.vividsolutions.jts.geom.CoordinateSequence#getX(int)
-   */
-  public double getX(int index) {
-      return coordinates[index].x;
-  }
-
-  /**
-   * @see com.vividsolutions.jts.geom.CoordinateSequence#getY(int)
-   */
-  public double getY(int index) {
-      return coordinates[index].y;
-  }
-
-  /**
-   * @see com.vividsolutions.jts.geom.CoordinateSequence#getOrdinate(int, int)
-   */
-  public double getOrdinate(int index, int ordinateIndex)
-  {
-    switch (ordinateIndex) {
-      case CoordinateSequence.X:  return coordinates[index].x;
-      case CoordinateSequence.Y:  return coordinates[index].y;
-      case CoordinateSequence.Z:  return coordinates[index].z;
-      case CoordinateSequence.M:  return coordinates[index].getM();
-    }
-    return Double.NaN;
-  }
-
-  /**
-   * @see com.vividsolutions.jts.geom.CoordinateSequence#setOrdinate(int, int, double)
-   */
-  public void setOrdinate(int index, int ordinateIndex, double value)
-  {
-    switch (ordinateIndex) {
-      case CoordinateSequence.X:  
-        coordinates[index].x = value;
-        break;
-      case CoordinateSequence.Y:  
-        coordinates[index].y = value;
-        break;
-      case CoordinateSequence.Z:  
-        coordinates[index].z = value;
-        break;
-      case CoordinateSequence.M:  
-        coordinates[index].setM(value);
-        break;
-    }
-  }
-
-  public Object clone() {
-    ExtendedCoordinate[] cloneCoordinates = new ExtendedCoordinate[size()];
-    for (int i = 0; i < coordinates.length; i++) {
-      cloneCoordinates[i] = (ExtendedCoordinate) coordinates[i].clone();
-    }
-
-    return new ExtendedCoordinateSequence(cloneCoordinates);
-  }
-
-  public int size() {
-    return coordinates.length;
-  }
-
-  public Coordinate[] toCoordinateArray() {
-    return coordinates;
-  }
-
-  public Envelope expandEnvelope(Envelope env)
-  {
-    for (int i = 0; i < coordinates.length; i++ ) {
-      env.expandToInclude(coordinates[i]);
-    }
-    return env;
-  }
-
-  public String toString()
-  {
-    StringBuffer strBuf = new StringBuffer();
-    strBuf.append("ExtendedCoordinateSequence [");
-    for (int i = 0; i < coordinates.length; i++) {
-      if (i > 0) strBuf.append(", ");
-      strBuf.append(coordinates[i]);
-    }
-    strBuf.append("]");
-    return strBuf.toString();
-  }
-}
diff --git a/src/com/vividsolutions/jtsexample/geom/ExtendedCoordinateSequenceFactory.java b/src/com/vividsolutions/jtsexample/geom/ExtendedCoordinateSequenceFactory.java
deleted file mode 100644
index 9bef816..0000000
--- a/src/com/vividsolutions/jtsexample/geom/ExtendedCoordinateSequenceFactory.java
+++ /dev/null
@@ -1,83 +0,0 @@
-
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jtsexample.geom;
-
-import com.vividsolutions.jts.geom.*;
-
-/**
- * Creates ExtendedCoordinateSequenceFactory internally represented
- * as an array of {@link ExtendedCoordinate}s.
- *
- * @version 1.7
- */
-public class ExtendedCoordinateSequenceFactory
-    implements CoordinateSequenceFactory
-{
-    private static ExtendedCoordinateSequenceFactory instance = new ExtendedCoordinateSequenceFactory();
-
-    private ExtendedCoordinateSequenceFactory() {
-    }
-
-    /**
-     * Returns the singleton instance of ExtendedCoordinateSequenceFactory
-     */
-    public static ExtendedCoordinateSequenceFactory instance() {
-        return instance;
-    }
-
-    /**
-     * Returns an ExtendedCoordinateSequence based on the given array -- the array is used
-     * directly if it is an instance of ExtendedCoordinate[]; otherwise it is
-     * copied.
-     */
-    public CoordinateSequence create(Coordinate[] coordinates) {
-      return coordinates instanceof ExtendedCoordinate[]
-          ? new ExtendedCoordinateSequence((ExtendedCoordinate[]) coordinates)
-          : new ExtendedCoordinateSequence(coordinates);
-    }
-
-    public CoordinateSequence create(CoordinateSequence coordSeq) {
-      return coordSeq instanceof ExtendedCoordinateSequence
-          ? new ExtendedCoordinateSequence((ExtendedCoordinateSequence) coordSeq)
-          : new ExtendedCoordinateSequence(coordSeq);
-    }
-
-    /**
-     * @see com.vividsolutions.jts.geom.CoordinateSequenceFactory#create(int, int)
-     */
-    public CoordinateSequence create(int size, int dimension) {
-      return new ExtendedCoordinateSequence(size);
-    }
-
-}
diff --git a/src/com/vividsolutions/jtsexample/geom/PrecisionModelExample.java b/src/com/vividsolutions/jtsexample/geom/PrecisionModelExample.java
deleted file mode 100644
index ddc9dc9..0000000
--- a/src/com/vividsolutions/jtsexample/geom/PrecisionModelExample.java
+++ /dev/null
@@ -1,130 +0,0 @@
-
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jtsexample.geom;
-
-import com.vividsolutions.jts.geom.*;
-import com.vividsolutions.jts.io.*;
-
-/**
- * An example showing the results of using different precision models
- * in computations involving geometric constructions.
- * A simple intersection computation is carried out in three different
- * precision models (Floating, FloatingSingle and Fixed with 0 decimal places).
- * The input is the same in all cases (since it is precise in all three models),
- * The output shows the effects of rounding in the single-precision and fixed-precision
- * models.
- *
- * @version 1.7
- */
-public class PrecisionModelExample
-{
-  public static void main(String[] args) {
-    PrecisionModelExample example = new PrecisionModelExample();
-    try {
-      example.run();
-    }
-    catch (Exception ex) {
-      ex.printStackTrace();
-    }
-  }
-
-  public PrecisionModelExample() {
-  }
-
-  public void run()
-    throws ParseException
-  {
-    example1();
-    example2();
-  }
-
-  public void example1()
-    throws ParseException
-  {
-    System.out.println("-------------------------------------------");
-    System.out.println("Example 1 shows roundoff from computing in different precision models");
-    String wktA = "POLYGON ((60 180, 160 260, 240 80, 60 180))";
-    String wktB = "POLYGON ((200 260, 280 160, 80 100, 200 260))";
-    System.out.println("A = " + wktA);
-    System.out.println("B = " + wktB);
-
-    intersection(wktA, wktB, new PrecisionModel());
-    intersection(wktA, wktB, new PrecisionModel(PrecisionModel.FLOATING_SINGLE));
-    intersection(wktA, wktB, new PrecisionModel(1));
-  }
-
-  public void example2()
-    throws ParseException
-  {
-    System.out.println("-------------------------------------------");
-    System.out.println("Example 2 shows that roundoff can change the topology of geometry computed in different precision models");
-    String wktA = "POLYGON ((0 0, 160 0, 160 1, 0 0))";
-    String wktB = "POLYGON ((40 60, 40 -20, 140 -20, 140 60, 40 60))";
-    System.out.println("A = " + wktA);
-    System.out.println("B = " + wktB);
-
-    difference(wktA, wktB, new PrecisionModel());
-    difference(wktA, wktB, new PrecisionModel(1));
-  }
-
-
-  public void intersection(String wktA, String wktB, PrecisionModel pm)
-      throws ParseException
-  {
-    System.out.println("Running example using Precision Model = " + pm);
-    GeometryFactory fact = new GeometryFactory(pm);
-    WKTReader wktRdr = new WKTReader(fact);
-
-    Geometry A = wktRdr.read(wktA);
-    Geometry B = wktRdr.read(wktB);
-    Geometry C = A.intersection(B);
-
-    System.out.println("A intersection B = " + C);
-  }
-
-  public void difference(String wktA, String wktB, PrecisionModel pm)
-      throws ParseException
-  {
-    System.out.println("-------------------------------------------");
-    System.out.println("Running example using Precision Model = " + pm);
-    GeometryFactory fact = new GeometryFactory(pm);
-    WKTReader wktRdr = new WKTReader(fact);
-
-    Geometry A = wktRdr.read(wktA);
-    Geometry B = wktRdr.read(wktB);
-    Geometry C = A.difference(B);
-
-    System.out.println("A intersection B = " + C);
-  }
-}
diff --git a/src/com/vividsolutions/jtsexample/geom/SimpleMethodsExample.java b/src/com/vividsolutions/jtsexample/geom/SimpleMethodsExample.java
deleted file mode 100644
index 3d5f1b7..0000000
--- a/src/com/vividsolutions/jtsexample/geom/SimpleMethodsExample.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jtsexample.geom;
-
-import com.vividsolutions.jts.geom.*;
-import com.vividsolutions.jts.io.*;
-
-/**
- * An example showing a simple use of JTS methods for:
- * <ul>
- * <li>WKT reading
- * <li>intersection
- * <li>relate
- * <li>WKT output
- * </ul>
- * <p>
- * The expected output from this program is:
- * <pre>
- * ----------------------------------------------------------
- * A = POLYGON ((40 100, 40 20, 120 20, 120 100, 40 100))
- * B = LINESTRING (20 80, 80 60, 100 140)
- * A intersection B = LINESTRING (40 73.33333333333334, 80 60, 90 100)
- * A relate C = 1F20F1102
- * ----------------------------------------------------------
- * </pre>
- *
- * @version 1.7
- */
-public class SimpleMethodsExample
-{
-  public static void main(String[] args) {
-    SimpleMethodsExample example = new SimpleMethodsExample();
-    try {
-      example.run();
-    }
-    catch (Exception ex) {
-      ex.printStackTrace();
-    }
-  }
-
-  public SimpleMethodsExample() {
-  }
-
-  public void run()
-    throws ParseException
-  {
-    GeometryFactory fact = new GeometryFactory();
-    WKTReader wktRdr = new WKTReader(fact);
-
-    String wktA = "POLYGON((40 100, 40 20, 120 20, 120 100, 40 100))";
-    String wktB = "LINESTRING(20 80, 80 60, 100 140)";
-    Geometry A = wktRdr.read(wktA);
-    Geometry B = wktRdr.read(wktB);
-    Geometry C = A.intersection(B);
-    System.out.println("A = " + A);
-    System.out.println("B = " + B);
-    System.out.println("A intersection B = " + C);
-    System.out.println("A relate C = " + A.relate(B));
-  }
-
-}
diff --git a/src/com/vividsolutions/jtsexample/geom/prep/PreparedGeometryExample.java b/src/com/vividsolutions/jtsexample/geom/prep/PreparedGeometryExample.java
deleted file mode 100644
index 35d76ae..0000000
--- a/src/com/vividsolutions/jtsexample/geom/prep/PreparedGeometryExample.java
+++ /dev/null
@@ -1,94 +0,0 @@
-
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jtsexample.geom.prep;
-
-import com.vividsolutions.jts.geom.*;
-import com.vividsolutions.jts.geom.prep.*;
-
-
-/**
- * Shows use of {@link PreparedGeometry} in a batch (repeated) operation.
- * 
- * The example uses a Monte Carlo method to approximate the value of Pi.
- * Given a circle inscribed in a square and a large number of random points
- * in the square, the number of points which intersect the circle approximates Pi/4.  
- * This involves repeated Point-In-Polygon tests, which is one of the 
- * geometry tests optimized by the PreparedGeometry implementation for polygons.
- *
- * @version 1.7
- */
-public class PreparedGeometryExample
-{
-	static GeometryFactory geomFact = new GeometryFactory();
-	
-	static final int MAX_ITER = 100000; 
-		
-  public static void main(String[] args)
-      throws Exception
-  {
-  	Geometry circle = createCircle();
-  	PreparedGeometry prepCircle = PreparedGeometryFactory.prepare(circle);
-  	
-  	int count = 0;
-  	int inCount = 0;
-  	for (int i = 0; i < MAX_ITER; i++) 
-  	{
-  		count++;
-  		Point randPt = createRandomPoint();
-  		if (prepCircle.intersects(randPt)) {
-  			inCount++;
-  		}
-  		
-  		//System.out.println("Approximation to PI: " + (4.0 * inCount / (double) count));
-  	}
-  	double approxPi = 4.0 * inCount / (double) count;
-  	double approxDiffPct = 1.0 - approxPi/Math.PI;
-  	
-		System.out.println("Approximation to PI: " + approxPi
-				+ "  ( % difference from actual = " + 100 * approxDiffPct + " )"
-				); 
-
-  }
-  
-  static Geometry createCircle()
-  {
-  	Geometry centrePt = geomFact.createPoint(new Coordinate(0.5, 0.5));
-  	return centrePt.buffer(0.5, 20);
-  }
-  
-  static Point createRandomPoint()
-  {
-  	return geomFact.createPoint(new Coordinate(Math.random(), Math.random()));
-  }
-}
diff --git a/src/com/vividsolutions/jtsexample/io/gml2/KMLReaderExample.java b/src/com/vividsolutions/jtsexample/io/gml2/KMLReaderExample.java
deleted file mode 100644
index 849d349..0000000
--- a/src/com/vividsolutions/jtsexample/io/gml2/KMLReaderExample.java
+++ /dev/null
@@ -1,169 +0,0 @@
-package com.vividsolutions.jtsexample.io.gml2;
-
-import com.vividsolutions.jts.geom.*;
-import com.vividsolutions.jts.io.gml2.*;
-import java.util.*;
-import java.io.*;
-import org.xml.sax.*;
-import org.xml.sax.helpers.DefaultHandler;
-import org.xml.sax.helpers.XMLReaderFactory;
-
-/**
- * An example of using the {@link GMLHandler} class
- * to read geometry data out of KML files.
- * 
- * @author mbdavis
- *
- */
-public class KMLReaderExample 
-{
-  public static void main(String[] args)
-  throws Exception
-  {
-  	String filename = "C:\\proj\\JTS\\KML\\usPop-STUS-p06.kml";
-  	KMLReader rdr = new KMLReader(filename);
-  	rdr.read();
-  }
-}
-
-class KMLReader
-{
-	private String filename;
-	
-	public KMLReader(String filename)
-	{
-		this.filename = filename;
-	}
-	
-	public void read()
-	throws IOException, SAXException
-	{
-    XMLReader xr; 
-    
-    xr = XMLReaderFactory.createXMLReader();
-    //xr = new org.apache.xerces.parsers.SAXParser();
-    KMLHandler kmlHandler = new KMLHandler();
-    xr.setContentHandler(kmlHandler);
-    xr.setErrorHandler(kmlHandler);
-    
-    Reader r = new BufferedReader(new FileReader(filename));
-    LineNumberReader myReader = new LineNumberReader(r);
-    xr.parse(new InputSource(myReader));
-    
-    List geoms = kmlHandler.getGeometries();
-	}
-}
-
-class KMLHandler extends DefaultHandler
-{
-	private List geoms = new ArrayList();;
-	
-	private GMLHandler currGeomHandler;
-	private String lastEltName = null;
-	private GeometryFactory fact = new FixingGeometryFactory();
-	
-	public KMLHandler()
-	{
-		super();
-	}
-	
-	public List getGeometries()
-	{
-		return geoms;
-	}
-	
-  /**
-   *  SAX handler. Handle state and state transitions based on an element
-   *  starting.
-   *
-   *@param  uri               Description of the Parameter
-   *@param  name              Description of the Parameter
-   *@param  qName             Description of the Parameter
-   *@param  atts              Description of the Parameter
-   *@exception  SAXException  Description of the Exception
-   */
-  public void startElement(String uri, String name, String qName,
-			Attributes atts) throws SAXException {
-		if (name.equalsIgnoreCase(GMLConstants.GML_POLYGON)) {
-			currGeomHandler = new GMLHandler(fact, null);
-		}
-		if (currGeomHandler != null)
-			currGeomHandler.startElement(uri, name, qName, atts);
-		if (currGeomHandler == null) {
-			lastEltName = name;
-			//System.out.println(name);
-		}
-	}
-  
-	public void characters(char[] ch, int start, int length) throws SAXException 
-	{
-    if (currGeomHandler != null) {
-    	currGeomHandler.characters(ch, start, length);
-    }
-    else {
-    	String content = new String(ch, start, length).trim();
-    	if (content.length() > 0) {
-    		System.out.println(lastEltName + "= " + content);
-    	}
-    }
-	}
-	
-	public void ignorableWhitespace(char[] ch, int start, int length)
-	throws SAXException {
-    if (currGeomHandler != null)
-    	currGeomHandler.ignorableWhitespace(ch, start, length);
-	}
-	
-  /**
-   *  SAX handler - handle state information and transitions based on ending
-   *  elements.
-   *
-   *@param  uri               Description of the Parameter
-   *@param  name              Description of the Parameter
-   *@param  qName             Description of the Parameter
-   *@exception  SAXException  Description of the Exception
-   */
-  public void endElement(String uri, String name, String qName)
-			throws SAXException {
-		// System.out.println("/" + name);
-
-		if (currGeomHandler != null) {
-			currGeomHandler.endElement(uri, name, qName);
-
-			if (currGeomHandler.isGeometryComplete()) {
-				Geometry g = currGeomHandler.getGeometry();
-				System.out.println(g);
-				geoms.add(g);
-
-				// reset to indicate no longer parsing geometry
-				currGeomHandler = null;
-			}
-		}
-
-	}
-}
-
-/**
- * A GeometryFactory extension which fixes structurally bad coordinate sequences
- * used to create LinearRings.
- * 
- * @author mbdavis
- * 
- */
-class FixingGeometryFactory extends GeometryFactory
-{
-	public LinearRing createLinearRing(CoordinateSequence cs)
-	{
-		if (cs.getCoordinate(0).equals(cs.getCoordinate(cs.size() - 1))) 
-			return super.createLinearRing(cs);
-			
-			// add a new coordinate to close the ring
-			CoordinateSequenceFactory csFact = getCoordinateSequenceFactory();
-			CoordinateSequence csNew = csFact.create(cs.size() + 1, cs.getDimension());
-			CoordinateSequences.copy(cs, 0, csNew, 0, cs.size());
-			CoordinateSequences.copyCoord(csNew, 0, csNew, csNew.size() - 1);
-			return super.createLinearRing(csNew);
-	}
-
-	
-}
diff --git a/src/com/vividsolutions/jtsexample/linearref/LinearRefExample.java b/src/com/vividsolutions/jtsexample/linearref/LinearRefExample.java
deleted file mode 100644
index 8446c46..0000000
--- a/src/com/vividsolutions/jtsexample/linearref/LinearRefExample.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jtsexample.linearref;
-
-import com.vividsolutions.jts.geom.*;
-import com.vividsolutions.jts.io.*;
-import com.vividsolutions.jts.linearref.*;
-
-/**
- * Examples of Linear Referencing
- *
- * @version 1.7
- */
-
-public class LinearRefExample {
-
-  static GeometryFactory fact = new GeometryFactory();
-  static WKTReader rdr = new WKTReader(fact);
-
-  public static void main(String[] args)
-      throws Exception
-  {
-    LinearRefExample example = new LinearRefExample();
-    example.run();
-  }
-
-
-  public LinearRefExample() {
-  }
-
-  public void run()
-      throws Exception
-  {
-    runExtractedLine("LINESTRING (0 0, 10 10, 20 20)", 1, 10);
-    runExtractedLine("MULTILINESTRING ((0 0, 10 10), (20 20, 25 25, 30 40))", 1, 20);
-  }
-
-  public void runExtractedLine(String wkt, double start, double end)
-    throws ParseException
-  {
-    System.out.println("=========================");
-    Geometry g1 = rdr.read(wkt);
-    System.out.println("Input Geometry: " + g1);
-    System.out.println("Indices to extract: " + start + " " + end);
-
-    LengthIndexedLine indexedLine = new LengthIndexedLine(g1);
-
-    Geometry subLine = indexedLine.extractLine(start, end);
-    System.out.println("Extracted Line: " + subLine);
-
-    double[] index = indexedLine.indicesOf(subLine);
-    System.out.println("Indices of extracted line: " + index[0] + " " + index[1]);
-
-    Coordinate midpt = indexedLine.extractPoint((index[0] + index[1]) / 2);
-    System.out.println("Midpoint of extracted line: " + midpt);
-  }
-}
\ No newline at end of file
diff --git a/src/com/vividsolutions/jtsexample/operation/distance/ClosestPointExample.java b/src/com/vividsolutions/jtsexample/operation/distance/ClosestPointExample.java
deleted file mode 100644
index 79f6bfd..0000000
--- a/src/com/vividsolutions/jtsexample/operation/distance/ClosestPointExample.java
+++ /dev/null
@@ -1,108 +0,0 @@
-
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jtsexample.operation.distance;
-
-import com.vividsolutions.jts.geom.*;
-import com.vividsolutions.jts.io.*;
-import com.vividsolutions.jts.operation.distance.DistanceOp;
-
-/**
- * Example of computing distance and closest points between geometries
- * using the DistanceOp class.
- *
- * @version 1.7
- */
-public class ClosestPointExample
-{
-  static GeometryFactory fact = new GeometryFactory();
-  static WKTReader wktRdr = new WKTReader(fact);
-
-  public static void main(String[] args) {
-    ClosestPointExample example = new ClosestPointExample();
-    example.run();
-  }
-
-  public ClosestPointExample()
-  {
-  }
-
-  public void run()
-  {
-    findClosestPoint(
-        "POLYGON ((200 180, 60 140, 60 260, 200 180))",
-       "POINT (140 280)");
-    findClosestPoint(
-        "POLYGON ((200 180, 60 140, 60 260, 200 180))",
-       "MULTIPOINT (140 280, 140 320)");
-    findClosestPoint(
-        "LINESTRING (100 100, 200 100, 200 200, 100 200, 100 100)",
-       "POINT (10 10)");
-    findClosestPoint(
-        "LINESTRING (100 100, 200 200)",
-       "LINESTRING (100 200, 200 100)");
-    findClosestPoint(
-        "LINESTRING (100 100, 200 200)",
-       "LINESTRING (150 121, 200 0)");
-    findClosestPoint(
-        "POLYGON (( 76 185, 125 283, 331 276, 324 122, 177 70, 184 155, 69 123, 76 185 ), ( 267 237, 148 248, 135 185, 223 189, 251 151, 286 183, 267 237 ))",
-       "LINESTRING ( 153 204, 185 224, 209 207, 238 222, 254 186 )");
-    findClosestPoint(
-        "POLYGON (( 76 185, 125 283, 331 276, 324 122, 177 70, 184 155, 69 123, 76 185 ), ( 267 237, 148 248, 135 185, 223 189, 251 151, 286 183, 267 237 ))",
-       "LINESTRING ( 120 215, 185 224, 209 207, 238 222, 254 186 )");
-  }
-
-  public void findClosestPoint(String wktA, String wktB)
-  {
-    System.out.println("-------------------------------------");
-    try {
-      Geometry A = wktRdr.read(wktA);
-      Geometry B = wktRdr.read(wktB);
-      System.out.println("Geometry A: " + A);
-      System.out.println("Geometry B: " + B);
-      DistanceOp distOp = new DistanceOp(A, B);
-
-      double distance = distOp.distance();
-      System.out.println("Distance = " + distance);
-
-      Coordinate[] closestPt = distOp.nearestPoints();
-      LineString closestPtLine = fact.createLineString(closestPt);
-      System.out.println("Closest points: " + closestPtLine
-                         + " (distance = " + closestPtLine.getLength() + ")");
-    }
-    catch (Exception ex) {
-      ex.printStackTrace();
-    }
-  }
-
-}
diff --git a/src/com/vividsolutions/jtsexample/operation/linemerge/LineMergeExample.java b/src/com/vividsolutions/jtsexample/operation/linemerge/LineMergeExample.java
deleted file mode 100644
index 9ad4b44..0000000
--- a/src/com/vividsolutions/jtsexample/operation/linemerge/LineMergeExample.java
+++ /dev/null
@@ -1,106 +0,0 @@
-
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jtsexample.operation.linemerge;
-
-import com.vividsolutions.jts.geom.Geometry;
-import com.vividsolutions.jts.io.WKTReader;
-import com.vividsolutions.jts.operation.linemerge.LineMerger;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-
-/**
- * Example of using the LineMerger class to sew together a set of fully noded 
- * linestrings.
- *
- * @version 1.7
- */
-public class LineMergeExample {
-  private WKTReader reader = new WKTReader();
-
-  public LineMergeExample() {
-  }
-
-  public static void main(String[] args) throws Exception {
-    LineMergeExample test = new LineMergeExample();
-    try {
-      test.run();
-    } catch (Exception ex) {
-      ex.printStackTrace();
-    }
-  }
-
-  void run() throws Exception {
-    Collection lineStrings = getData();
-    
-    LineMerger lineMerger = new LineMerger();
-    lineMerger.add(lineStrings);
-    Collection mergedLineStrings = lineMerger.getMergedLineStrings();
-    
-    System.out.println("Lines formed (" + mergedLineStrings.size() + "):");
-    System.out.println(mergedLineStrings);
-  }
-
-  Collection getData() {
-    Collection lines = new ArrayList();
-    lines.add(read("LINESTRING (220 160, 240 150, 270 150, 290 170)"));
-    lines.add(read("LINESTRING (60 210, 30 190, 30 160)"));
-    lines.add(read("LINESTRING (70 430, 100 430, 120 420, 140 400)"));
-    lines.add(read("LINESTRING (160 310, 160 280, 160 250, 170 230)"));
-    lines.add(read("LINESTRING (170 230, 180 210, 200 180, 220 160)"));
-    lines.add(read("LINESTRING (30 160, 40 150, 70 150)"));
-    lines.add(read("LINESTRING (160 310, 200 330, 220 340, 240 360)"));
-    lines.add(read("LINESTRING (140 400, 150 370, 160 340, 160 310)"));
-    lines.add(read("LINESTRING (160 310, 130 300, 100 290, 70 270)"));
-    lines.add(read("LINESTRING (240 360, 260 390, 260 410, 250 430)"));
-    lines.add(read("LINESTRING (70 150, 100 180, 100 200)"));
-    lines.add(read("LINESTRING (70 270, 60 260, 50 240, 50 220, 60 210)"));
-    lines.add(read("LINESTRING (100 200, 90 210, 60 210)"));
-
-    return lines;
-  }
-
-  Geometry read(String lineWKT) {
-    try {
-      Geometry geom = reader.read(lineWKT);
-
-      return geom;
-    } catch (Exception ex) {
-      ex.printStackTrace();
-    }
-
-    return null;
-  }
-}
diff --git a/src/com/vividsolutions/jtsexample/operation/polygonize/PolygonizeExample.java b/src/com/vividsolutions/jtsexample/operation/polygonize/PolygonizeExample.java
deleted file mode 100644
index eea6c66..0000000
--- a/src/com/vividsolutions/jtsexample/operation/polygonize/PolygonizeExample.java
+++ /dev/null
@@ -1,85 +0,0 @@
-
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jtsexample.operation.polygonize;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import com.vividsolutions.jts.io.WKTReader;
-import com.vividsolutions.jts.operation.polygonize.Polygonizer;
-
-/**
- *  Example of using Polygonizer class to polygonize a set of fully noded linestrings
- *
- * @version 1.7
- */
-public class PolygonizeExample
-{
-  public static void main(String[] args) throws Exception
-  {
-    PolygonizeExample test = new PolygonizeExample();
-    try {
-      test.run();
-    }
-    catch (Exception ex) {
-      ex.printStackTrace();
-    }
-  }
-
-
-  public PolygonizeExample() {
-  }
-
-  void run()
-      throws Exception
-  {
-    WKTReader rdr = new WKTReader();
-    Collection lines = new ArrayList();
-
-    lines.add(rdr.read("LINESTRING (0 0 , 10 10)"));   // isolated edge
-    lines.add(rdr.read("LINESTRING (185 221, 100 100)"));   //dangling edge
-    lines.add(rdr.read("LINESTRING (185 221, 88 275, 180 316)"));
-    lines.add(rdr.read("LINESTRING (185 221, 292 281, 180 316)"));
-    lines.add(rdr.read("LINESTRING (189 98, 83 187, 185 221)"));
-    lines.add(rdr.read("LINESTRING (189 98, 325 168, 185 221)"));
-
-    Polygonizer polygonizer = new Polygonizer();
-    polygonizer.add(lines);
-
-    Collection polys = polygonizer.getPolygons();
-
-    System.out.println("Polygons formed (" + polys.size() + "):");
-    System.out.println(polys);
-  }
-
-}
diff --git a/src/com/vividsolutions/jtsexample/package.html b/src/com/vividsolutions/jtsexample/package.html
deleted file mode 100644
index 76bb599..0000000
--- a/src/com/vividsolutions/jtsexample/package.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-
--->
-</head>
-<body bgcolor="white">
-
-Contains classes with examples of using the JTS API.
-
-
-</body>
-</html>
diff --git a/src/com/vividsolutions/jtsexample/precision/EnhancedPrecisionOpExample.java b/src/com/vividsolutions/jtsexample/precision/EnhancedPrecisionOpExample.java
deleted file mode 100644
index 37281d6..0000000
--- a/src/com/vividsolutions/jtsexample/precision/EnhancedPrecisionOpExample.java
+++ /dev/null
@@ -1,87 +0,0 @@
-
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jtsexample.precision;
-
-import com.vividsolutions.jts.io.WKTReader;
-import com.vividsolutions.jts.geom.*;
-import com.vividsolutions.jts.precision.EnhancedPrecisionOp;
-
-/**
- * Example of using {@link EnhancedPrecisionOp} to avoid robustness problems
- *
- * @version 1.7
- */
-public class EnhancedPrecisionOpExample
-{
-  public static void main(String[] args) throws Exception
-  {
-    EnhancedPrecisionOpExample example = new EnhancedPrecisionOpExample();
-    try {
-      example.run();
-    }
-    catch (Exception ex) {
-      ex.printStackTrace();
-    }
-  }
-
-  private WKTReader reader = new WKTReader();
-
-  public EnhancedPrecisionOpExample() {
-  }
-
-  void run()
-      throws Exception
-  {
-    String wkt1, wkt2;
-    // two geometries which cause robustness problems
-    wkt1 = "POLYGON ((708653.498611049 2402311.54647056, 708708.895756966 2402203.47250014, 708280.326454234 2402089.6337791, 708247.896591321 2402252.48269854, 708367.379593851 2402324.00761653, 708248.882609455 2402253.07294874, 708249.523621829 2402244.3124463, 708261.854734465 2402182.39086576, 708262.818392579 2402183.35452387, 708653.498611049 2402311.54647056))";
-    wkt2 = "POLYGON ((708258.754920656 2402197.91172757, 708257.029447455 2402206.56901508, 708652.961095455 2402312.65463437, 708657.068786251 2402304.6356364, 708258.754920656 2402197.91172757))";
-    Geometry g1 = reader.read(wkt1);
-    Geometry g2 = reader.read(wkt2);
-
-    System.out.println("This call to intersection will throw a topology exception due to robustness problems:");
-    try {
-      Geometry result = g1.intersection(g2);
-    }
-    catch (TopologyException ex) {
-      ex.printStackTrace();
-    }
-
-    System.out.println("Using EnhancedPrecisionOp allows the intersection to be performed with no errors:");
-    Geometry result = EnhancedPrecisionOp.intersection(g1, g2);
-    System.out.println(result);
-  }
-
-
-}
diff --git a/src/com/vividsolutions/jtsexample/technique/LineStringSelfIntersections.java b/src/com/vividsolutions/jtsexample/technique/LineStringSelfIntersections.java
deleted file mode 100644
index 5483bbe..0000000
--- a/src/com/vividsolutions/jtsexample/technique/LineStringSelfIntersections.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package com.vividsolutions.jtsexample.technique;
-
-import com.vividsolutions.jts.geom.*;
-import com.vividsolutions.jts.io.WKTReader;
-import java.util.*;
-
-/**
- * Shows a technique for identifying the location of self-intersections
- * in a non-simple LineString.
- *
- * @version 1.7
- */
-
-public class LineStringSelfIntersections {
-
-  public static void main(String[] args)
-      throws Exception
-  {
-    WKTReader rdr = new WKTReader();
-
-    LineString line1 = (LineString) (rdr.read("LINESTRING (0 0, 10 10, 20 20)"));
-    showSelfIntersections(line1);
-    LineString line2 = (LineString) (rdr.read("LINESTRING (0 40, 60 40, 60 0, 20 0, 20 60)"));
-    showSelfIntersections(line2);
-
-  }
-
-  public static void showSelfIntersections(LineString line)
-  {
-    System.out.println("Line: " + line);
-    System.out.println("Self Intersections: " + lineStringSelfIntersections(line));
-  }
-
-  public static Geometry lineStringSelfIntersections(LineString line)
-  {
-    Geometry lineEndPts = getEndPoints(line);
-    Geometry nodedLine = line.union(lineEndPts);
-    Geometry nodedEndPts = getEndPoints(nodedLine);
-    Geometry selfIntersections = nodedEndPts.difference(lineEndPts);
-    return selfIntersections;
-  }
-
-  public static Geometry getEndPoints(Geometry g)
-  {
-    List endPtList = new ArrayList();
-    if (g instanceof LineString) {
-      LineString line = (LineString) g;
-
-      endPtList.add(line.getCoordinateN(0));
-      endPtList.add(line.getCoordinateN(line.getNumPoints() - 1));
-    }
-    else if (g instanceof MultiLineString) {
-      MultiLineString mls = (MultiLineString) g;
-      for (int i = 0; i < mls.getNumGeometries(); i++) {
-        LineString line = (LineString) mls.getGeometryN(i);
-        endPtList.add(line.getCoordinateN(0));
-        endPtList.add(line.getCoordinateN(line.getNumPoints() - 1));
-      }
-    }
-    Coordinate[] endPts = CoordinateArrays.toCoordinateArray(endPtList);
-    return (new GeometryFactory()).createMultiPoint(endPts);
-  }
-
-
-}
\ No newline at end of file
diff --git a/src/com/vividsolutions/jtsexample/technique/PolygonUnionUsingBuffer.java b/src/com/vividsolutions/jtsexample/technique/PolygonUnionUsingBuffer.java
deleted file mode 100644
index a120256..0000000
--- a/src/com/vividsolutions/jtsexample/technique/PolygonUnionUsingBuffer.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package com.vividsolutions.jtsexample.technique;
-
-import com.vividsolutions.jts.geom.*;
-import com.vividsolutions.jts.io.WKTReader;
-
-/**
- * Shows a technique for using a zero-width buffer to compute
- * the union of a collection of <b>polygonal</b> geometrys.
- * The advantages of this technique are:
- * <ul>
- * <li>can avoid robustness issues
- * <li>faster for large numbers of input geometries
- * <li>handles GeometryCollections as input (although only the polygons will be buffered)
- * </ul>
- * Disadvantages are:
- * <ul>
- * <li>may not preserve input coordinate precision in some cases
- * <li>only works for polygons
- * </ul>
- * 
- * @deprecated It is now recommended to use Geometry.union() (unary union) instead of this technique.
- *
- * @version 1.7
- */
-public class PolygonUnionUsingBuffer {
-
-  public static void main(String[] args)
-      throws Exception
-  {
-    WKTReader rdr = new WKTReader();
-
-    Geometry[] geom = new Geometry[3];
-    geom[0] = rdr.read("POLYGON (( 100 180, 100 260, 180 260, 180 180, 100 180 ))");
-    geom[1] = rdr.read("POLYGON (( 80 140, 80 200, 200 200, 200 140, 80 140 ))");
-    geom[2] = rdr.read("POLYGON (( 160 160, 160 240, 240 240, 240 160, 160 160 ))");
-    unionUsingBuffer(geom);
-
-  }
-
-  public static void unionUsingBuffer(Geometry[] geom)
-  {
-    GeometryFactory fact = geom[0].getFactory();
-    Geometry geomColl = fact.createGeometryCollection(geom);
-    Geometry union = geomColl.buffer(0.0);
-    System.out.println(union);
-  }
-
-
-
-}
\ No newline at end of file
diff --git a/src/com/vividsolutions/jtsexample/technique/SearchUsingPreparedGeometryIndex.java b/src/com/vividsolutions/jtsexample/technique/SearchUsingPreparedGeometryIndex.java
deleted file mode 100644
index c93502b..0000000
--- a/src/com/vividsolutions/jtsexample/technique/SearchUsingPreparedGeometryIndex.java
+++ /dev/null
@@ -1,244 +0,0 @@
-
-/*
- * The JTS Topology Suite is a collection of Java classes that
- * implement the fundamental operations required to validate a given
- * geo-spatial data set to a known topological specification.
- *
- * Copyright (C) 2001 Vivid Solutions
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For more information, contact:
- *
- *     Vivid Solutions
- *     Suite #1A
- *     2328 Government Street
- *     Victoria BC  V8T 5G5
- *     Canada
- *
- *     (250)385-6040
- *     www.vividsolutions.com
- */
-package com.vividsolutions.jtsexample.technique;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import com.vividsolutions.jts.geom.*;
-import com.vividsolutions.jts.geom.prep.*;
-import com.vividsolutions.jts.index.SpatialIndex;
-import com.vividsolutions.jts.index.strtree.STRtree;
-import com.vividsolutions.jts.util.Stopwatch;
-
-
-/**
- * Demonstrates use of {@link PreparedGeometry}s in a spatial index
- * to optimize spatial search.
- * 
- * The example creates a grid of circular polygons, packed into the 1 x 1 square.
- * This set of polygons is spatially indexed as PreparedGeometrys in an STRtree index.
- * A series of random points in the square is generated, and the index
- * is used to determine whether each point intersects any circles.
- * The fraction of points which intersect will approximate the 
- * fraction of area covered by the circles.
- * 
- * @version 1.12
- */
-public class SearchUsingPreparedGeometryIndex
-{
-	static GeometryFactory geomFact = new GeometryFactory();
-	
-	static final int MAX_ITER = 200000; 
-	static final int GRID_SIZE = 10; 
-	static final int POLYGON_SIZE = 100;
-
-  public static void main(String[] args)
-      throws Exception
-  {
-  	List circleGrid = createCircleGrid(GRID_SIZE);
-  	
-  	PreparedGeometryIndex pgIndex = new PreparedGeometryIndex();
-  	pgIndex.insert(circleGrid);
-  	
-  	Stopwatch sw = new Stopwatch();
-  	int inCount = runIndexedQuery(pgIndex);
-  	String indexTime = sw.getTimeString();
-  	
-		System.out.println("Number of iterations       = " + MAX_ITER ); 
-		System.out.println("Number of circles in grid  = " + circleGrid.size() ); 
-		System.out.println();
-  	System.out.println("The fraction of intersecting points should approximate the total area of the circles:");
-  	System.out.println();
-		System.out.println("Area of circles                = " + area(circleGrid) ); 
-		System.out.println("Fraction of points in circles  = " + inCount / (double) MAX_ITER ); 
-		System.out.println(); 
-		System.out.println("Indexed Execution time: " + indexTime ); 
-		
-		/**
-		 * For comparison purposes run the same query without using an index
-		 */ 
-  	Stopwatch sw2 = new Stopwatch();
-  	int inCount2 = runBruteForceQuery(circleGrid);
-  	String bruteForceTime = sw2.getTimeString();
-  	
-		System.out.println(); 
-		System.out.println("Execution time: " + bruteForceTime ); 
-
-  }
-  
-  static int runIndexedQuery(PreparedGeometryIndex pgIndex)
-  {
-  	int inCount = 0;
-  	for (int i = 0; i < MAX_ITER; i++) 
-  	{
-  		Point randPt = createRandomPoint();
-  		if (pgIndex.intersects(randPt).size() > 0) {
-				inCount++;
-  		}
-  	}
-  	return inCount;
-  }
-  
-  static int runBruteForceQuery(Collection geoms)
-  {
-  	int inCount = 0;
-  	for (int i = 0; i < MAX_ITER; i++) 
-  	{
-  		Point randPt = createRandomPoint();
-  		if (findIntersecting(geoms, randPt).size() > 0) {
-				inCount++;
-  		}
-  	}
-  	return inCount;
-  }
-  
-  static double area(Collection geoms)
-  {
-  	double area = 0.0;
-		for (Iterator i = geoms.iterator(); i.hasNext(); ) {
-			Geometry geom = (Geometry) i.next();
-			area += geom.getArea();
-		}
-		return area;
-  }
-  
-  static List createCircleGrid(int gridSize)
-  {
-  	double diameter = 1.0 / gridSize;
-  	double radius = diameter / 2;
-  	
-  	List circles = new ArrayList();
-  	for (int i = 0; i < gridSize; i++) {
-    	for (int j = 0; j < gridSize; j++) {
-    		Coordinate centre = new Coordinate(radius + i * diameter, radius + j * diameter);
-    		Geometry circle = createCircle(centre, radius);
-    		circles.add(circle);
-    	}
-  	}
-  	return circles;
-  }
-  
-  static Geometry createCircle(Coordinate centre, double radius)
-  {
-  	Geometry centrePt = geomFact.createPoint(centre);
-  	return centrePt.buffer(radius, POLYGON_SIZE);
-  }
-
-  static Point createRandomPoint()
-  {
-  	return geomFact.createPoint(new Coordinate(Math.random(), Math.random()));
-  }
-   
-  static List findIntersecting(Collection targetGeoms, Geometry queryGeom)
-  {
-		List result = new ArrayList();
-		for (Iterator it = targetGeoms.iterator(); it.hasNext(); ) {
-			Geometry test = (Geometry) it.next();
-			if (test.intersects(queryGeom)) {
-				result.add(test);
-			}
-		}
-  	return result;
-  }
-}
-
-/**
- * A spatial index which indexes {@link PreparedGeometry}s 
- * created from a set of {@link Geometry}s.
- * This can be used for efficient testing
- * for intersection with a series of target geomtries. 
- *  
- * @author Martin Davis
- *
- */
-class PreparedGeometryIndex
-{
-	private SpatialIndex index = new STRtree();
-	
-	/**
-	 * Creates a new index
-	 *
-	 */
-	public PreparedGeometryIndex()
-	{
-		
-	}
-	
-	/**
-	 * Inserts a collection of Geometrys into the index.
-	 * 
-	 * @param geoms a collection of Geometrys to insert
-	 */
-	public void insert(Collection geoms)
-	{
-		for (Iterator i = geoms.iterator(); i.hasNext(); ) {
-			Geometry geom = (Geometry) i.next();
-			index.insert(geom.getEnvelopeInternal(), PreparedGeometryFactory.prepare(geom));
-		}
-	}
-	
-	/**
-	 * Finds all {@link PreparedGeometry}s which might 
-	 * interact with a query {@link Geometry}.
-	 * 
-	 * @param g the geometry to query by
-	 * @return a list of candidate PreparedGeometrys
-	 */
-	public List query(Geometry g)
-	{
-		return index.query(g.getEnvelopeInternal());
-	}
-	
-	/**
-	 * Finds all {@link PreparedGeometry}s which intersect a given {@link Geometry}
-	 * 
-	 * @param g the geometry to query by
-	 * @return a list of intersecting PreparedGeometrys 
-	 */
-	public List intersects(Geometry g)
-	{
-		List result = new ArrayList();
-		List candidates = query(g);
-		for (Iterator it = candidates.iterator(); it.hasNext(); ) {
-			PreparedGeometry prepGeom = (PreparedGeometry) it.next();
-			if (prepGeom.intersects(g)) {
-				result.add(prepGeom);
-			}
-		}
-		return result;
-	}
-}
diff --git a/testxml/external/TestOverlay.xml b/testxml/external/TestOverlay.xml
index 3822ad4..d7b7b89 100644
--- a/testxml/external/TestOverlay.xml
+++ b/testxml/external/TestOverlay.xml
@@ -20,4 +20,90 @@ POLYGON ((-3138.9918179090096 39.99292981815133, -3195.9318721744207 131.7765582
 	</op>
 </test>
 </case>
+
+  <case>
+    <desc>
+	   http://trac.osgeo.org/geos/ticket/488
+      TopologyException unioning two valid polygons.
+      Cause is very high precision causing almost-coincident line segments.
+      This causes robustness failures in noding in JTS 1.12
+    </desc>
+    <a>
+0000000006000000020000000003000000010000001540033E1F7210ABF240486E49EB21347440033E1FC144F49740486E58A4BCAE2540033F84D203F6CC40486E58A174517640033F8522035D8340486E675B0F6EC340033E201079973240486E675E57CD4040033E205FAE93C140486E7617F291B740033F8572031F1340486E7614AA316E40033F85C2033B8040486E84CE4499754003424FE840CC7840486E84C79ABF52400342508B6D32EA40486EA23ACE781D4003451AB4D46E3A40486EA2340323E24003451A61A87D4740486E937A6978884003467F7590C5FE40486E9376F745374003467F219A6CB640486E84BD5D410C [...]
+</a>
+    <b>
+000000000600000003000000000300000001000000054003494947D4519340486E84B65FC827400349499D60386F40486E936FF9C88640034AAEB147605C40486E936C6E7F2240034AAE5AF0B2B740486E84B2D480B44003494947D4519340486E84B65FC8270000000003000000010000000540034AB6C9DA982740486FF4D273F1E140034C1C9F1BB040404870124201FBA940034D81C79B7F4F404870123E65C5D940034D8117AF225F40486FF4CB43EB3B40034AB6C9DA982740486FF4D273F1E10000000003000000040000002340035313EBB2595A40486FAB1CA4CCE04003531446D1C55A40486FB9D637A6D240035049FF57 [...]
+</b>
+    <test>
+      <op name="union" arg1="A" arg2="B" >
+        MULTIPOLYGON (((2.40739174 48.87286388, 2.40739296 48.87376262, 2.40534935 48.8737638, 2.40603175 48.87466215, 2.40535053 48.87466254, 
+  2.40535171 48.87556127, 2.40739539 48.87556009, 2.40739661 48.87645882, 2.40807784 48.87645842, 2.40807846 48.87690779, 
+  2.4087597 48.87690738, 2.40876032 48.87735675, 2.40944157 48.87735633, 2.40944219 48.8778057, 2.41012345 48.87780529, 
+  2.41012408 48.87825465, 2.41080534 48.87825423, 2.41080598 48.8787036, 2.41148725 48.87870318, 2.41148789 48.87915254, 
+  2.41353171 48.87915125, 2.41353105 48.87870189, 2.41761864 48.8786992, 2.41761795 48.87824983, 2.41829921 48.87824937, 
+  2.41829897 48.87809957, 2.41966173 48.87824844, 2.41829429 48.8751038, 2.41897551 48.87510334, 2.41965459 48.87375477, 
+  2.42101699 48.87375382, 2.42237792 48.87285412, 2.42237718 48.87240475, 2.42169599 48.87240523, 2.42169673 48.8728546, 
+  2.41556534 48.87240942, 2.41556602 48.87285879, 2.41420364 48.87285968, 2.41420431 48.87330904, 2.41284191 48.87330992, 
+  2.41284322 48.87420864, 2.41216072 48.87331035, 2.41079833 48.8733112, 2.41079769 48.87286183, 2.40739174 48.87286388), 
+  (2.4128465 48.87645548, 2.41284628 48.87630569, 2.41318713 48.87645527, 2.4128465 48.87645548), 
+  (2.41182271 48.87510803, 2.4114821 48.87510824, 2.41148145 48.87465888, 2.41182271 48.87510803), 
+  (2.4101184 48.87421035, 2.41011903 48.87465972, 2.40977842 48.87465993, 2.4101184 48.87421035), 
+  (2.41420764 48.87555588, 2.41420831 48.87600525, 2.41352708 48.87600569, 2.41352642 48.87555632, 2.41420764 48.87555588), 
+  (2.41284716 48.87690486, 2.41284781 48.87735422, 2.41216656 48.87735465, 2.41216591 48.87690529, 2.41284716 48.87690486)), 
+  ((2.40533342 48.86163081, 2.40533401 48.86208019, 2.40601505 48.86207979, 2.40601565 48.86252917, 2.4053346 48.86252956, 
+    2.40533519 48.86297893, 2.40601625 48.86297854, 2.40601684 48.86342791, 2.40737897 48.86342712, 2.40738019 48.86432586, 
+    2.40874234 48.86432505, 2.40874172 48.86387568, 2.4094228 48.86387527, 2.40942217 48.86342589, 2.41010324 48.86342548, 
+    2.41010197 48.86252674, 2.40873987 48.86252756, 2.40873925 48.86207819, 2.4080582 48.8620786, 2.40805758 48.86162922, 
+    2.40533342 48.86163081)), 
+  ((2.4107843 48.86342506, 2.41078494 48.86387443, 2.41146601 48.86387401, 2.41146537 48.86342464, 2.4107843 48.86342506)))
+      </op>
+    </test>
+  </case>
+
+
+	<case>
+	<desc> https://trac.osgeo.org/geos/ticket/368 </desc>
+	  <a>
+010600000003000000010300000001000000210000007711061EC4DE06C1B56E2A7A590F0F4124BB1E1EC4DE06C14E21D979590F0F410000000028E406C100000000900C0F410000000078EA06C10000000070090F410000000038ED06C10000000020080F4100000000C0F706C10000000050030F4100000000580C07C10000000048FB0E4100000000F03307C10000000010F10E4100000000306C07C10000000048EE0E410000000080AA07C10000000000FA0E4100000000B8FF07C100000000901E0F4100000000785208C10000000078510F4100000000E8A308C100000000308B0F4174C9FEC2BFF408C12FD8B0D3E7C50F41 [...]
+		</a>
+	  <b>
+01060000000100000001030000000100000021000000A887CB005F6908C10000000020620F412CD0BB18626908C1EEF84F9700620F410A9F1D426B6908C1E6B79F63E2610F410A3CCF227A6908C108190F8EC6610F4129F772288E6908C129F77228AE610F4108190F8EA66908C10A3CCF229A610F41E6B79F63C26908C10A9F1D428B610F41EEF84F97E06908C12CD0BB1882610F4100000000006A08C1A887CB007F610F411207B0681F6A08C12CD0BB1882610F411A48609C3D6A08C10A9F1D428B610F41F8E6F071596A08C10A3CCF229A610F41D7088DD7716A08C129F77228AE610F41F6C330DD856A08C108190F8EC6610F41 [...]
+		</b>
+		 <test>
+		<op name="intersection" arg1="A" arg2="B">
+MULTIPOLYGON (((-199983.26344477 257080.82601017, -200016.02375918 257104.04485157, -200014.23024947 257106.23024947, -200011.18063527 257108.73300317, -200007.70135552 257110.59271694, -200003.926117 257111.73792302, -200000 257112.1246118, -199996.073883 257111.73792302, -199992.29864448 257110.59271694, -199988.81936473 257108.73300317, -199985.76975053 257106.23024947, -199983.26699683 257103.18063527, -199981.40728306 257099.70135552, -199980.26207698 257095.926117, -199979.8753882  [...]
+		</op>
+		</test>
+	</case>
+  
+	<case>
+	<desc> https://trac.osgeo.org/geos/ticket/522 </desc>
+	  <a>
+010300002040A5000001000000050000001D020000F41831C1E399231EE6F729411C020000F41831C1B992E9C61EFB29411C020000F41831C156E1297A1CFB29411A493FC38F1831C1D8C6FEFCFEF929411D020000F41831C1E399231EE6F72941
+		</a>
+	  <b>
+010300002040A5000001000000040000001D020000F41831C1056DF2EC6AFA29411C020000F41831C1D1D1C8A2C7FA2941D6FA5B26EC1831C1C8F5FEAEBBFA29411D020000F41831C1056DF2EC6AFA2941
+		</b>
+		 <test>
+		<op name="intersection" arg1="A" arg2="B">
+POLYGON ((-1120500.0000001257 851253.4627870636, -1120500.0000001257 851294.2991929492, -1120500.0000001257 851299.817938382, -1120492.1498410008 851293.8417889412, -1120500.0000001257 851253.4627870636))
+		</op>
+		</test>
+	</case>
+  
+	<case>
+	<desc> https://trac.osgeo.org/geos/ticket/737 </desc>
+	  <a>
+000000000600000003000000000300000001000000094116DA6B96F2F37D41524376F35D8F274116DA6E4438B5A94152437FFF8AB0A84116DA6B9A2EF1A741524376FE4C1F1D4116DA6B9C64D49F41524376FE06E7FC4116DA6BE711AC3F41524376F81EE8184116DA6C42BED03541524376F33D0DDD4116DA6C44DDB8BF41524376F32A1A5B4116DB2DC6EC8A7A41524376B9E974024116DA6B96F2F37D41524376F35D8F270000000003000000010000000D4116DA730399ED27415243900B722B6C4116DA7306D13875415243901650D9974116DC0535FFD88A4152438F9F522B5B4116DC0532C3DE004152438F94639D544116DC [...]
+		</a>
+	  <b>
+000000000300000001000000154116DA73B4BBFDA541524390161D64954116DA73B29D152D41524390163058174116DA7356EFF2C2415243901B1232674116DA730C431D144152439020FA32614116DA730A0D3A3F41524390213F698D4116DA7A7380722B415243A92E65B4044116DA7A74AFAFE4415243A92E87A32D4116DA7AC2CD5841415243A9344275704116DA7B214D5B41415243A938ED42D94116DA7B25A0E216415243A93910A1AE4116DC0BF7F4666F415243A8C278A8534116DC0BFA1345FA415243A8C265B5264116DC0C55C065D9415243A8BD83DAE14116DC0CA06D39C8415243A8B79BDB124116DC0CA2A3135A41 [...]
+		</b>
+		 <test>
+		<op name="union" arg1="A" arg2="B">
+MULTIPOLYGON (((374428.75351687 4787776.17884336, 374428.75665749 4787776.34868469, 374428.92649838 4787776.345544, 374428.92442735 4787776.34670069, 374428.83489971 4787776.42298565, 374428.76197477 4787776.5152708, 374428.75981608 4787776.51949538, 374430.61279467 4787876.72495747, 374430.61395144 4787876.72702865, 374430.69023645 4787876.81655632, 374430.78252165 4787876.88948127, 374430.78674653 4787876.89164011, 374530.99214325 4787875.03861435, 374530.99421415 4787875.03745774, 374 [...]
+	</op>
+		</test>
+	</case>
+  
 </run>
diff --git a/testxml/failure/TestBufferFailure.xml b/testxml/failure/TestBufferFailure.xml
index d9e2cc5..b99f26c 100644
--- a/testxml/failure/TestBufferFailure.xml
+++ b/testxml/failure/TestBufferFailure.xml
@@ -8,7 +8,7 @@
 <case>
   <desc>
   	Discovered on Feb 25, 2011.  An incorrect hole is generated
-  	Result provided is correct output.
+  	Result provided below is correct output.
   	The test works correctly for slightly smaller (0.7) and larger (1.1) distance values.
   </desc>
   <a>
@@ -43,5 +43,49 @@ POLYGON ((1676333.3807948758 4847442.337118426, 1676333.3724470409 4847442.53284
 </test>
 </case>
 
+<case>
+  <desc>
+  	http://lists.osgeo.org/pipermail/postgis-users/2013-January/036334.html
+  	Buffer result has spurious small extra polygon,
+  	due to incorrect construction of buffer offset curve.
+  	Result provided below is correct output.
+  </desc>
+  <a>
+LINESTRING (640770.332537465 216785.425146015, 640770.356311913 216785.560172686, 640770.475488952 216786.226162019, 640770.647396495 216787.800152365, 640770.658978918 216789.268376902, 
+  640770.447752096 216792.399898366, 640769.98018796 216795.624688816, 640769.110287021 216798.527305023, 640767.648768098 216801.891389348, 640766.02448565 216804.805892778, 
+  640764.74005588 216807.134569434, 640763.337363474 216809.560477487, 640761.650901703 216812.246990061, 640759.955600712 216815.327305019, 640758.482499366 216817.868732504, 
+  640757.383693167 216819.548488661, 640756.238862077 216821.226720821, 640754.01503683 216824.434442434, 640751.366929134 216828.435255234, 640749.204368809 216832.450088865, 
+  640747.25516891 216836.227787618, 640746.014020829 216838.801219168, 640745.393751588 216840.360274284, 640744.315976633 216842.854457673, 640743.400050801 216844.65704848, 
+  640742.582575565 216846.277673322, 640741.52491745 216848.478638524, 640740.503835408 216850.705816576, 640739.787553975 216852.270967708, 640739.053289307 216853.851968469, 
+  640738.173025147 216855.546355058, 640737.55488951 216856.568961104, 640736.817272035 216857.822910812, 640735.910795021 216859.35697228, 640734.77510795 216861.236982439, 
+  640733.832969266 216862.938074642, 640732.814325629 216865.039674844, 640731.225095251 216869.012141189, 640729.979984761 216871.879095724, 640729.445974092 216873.02148841, 
+  640729.002794006 216873.679857725, 640728.952197105 216873.745389857, 640728.676962154 216874.089814544)  </a>
+<test>
+  <op name='buffer' arg1='A' arg2='100.0'>
+POLYGON ((640638.9602330392 216830.41627953897, 640637.6789730891 216832.6245762575, 640631.3380072431 216851.17414617367, 640628.737722846 216870.60435237407, 640629.9780473689 216890.16850293096, 
+  640635.011315836 216909.11475851017, 640643.6441025628 216926.715025135, 640655.5446543967 216942.29293442937, 640670.2556398048 216955.2498360753, 640687.2117238675 216965.08780360883, 
+  640705.7612937837 216971.42876945485, 640725.191499984 216974.029053852, 640744.7556505409 216972.78872932907, 640763.7019061202 216967.75546086195, 640781.302172745 216959.12267413514, 
+  640796.8800820394 216947.22212230123, 640809.6434126614 216932.7309132399, 640811.9588316501 216929.52156094398, 640812.4020117361 216928.863191629, 640820.0370995901 216915.36824721147, 
+  640820.571110259 216914.22585452546, 640821.7032612086 216911.71426307296, 640822.9483716986 216908.84730853798, 640823.2586106707 216908.10346436422, 640823.4446934869 216907.7871235766, 
+  640823.7530518768 216907.27699418928, 640826.912210114 216901.6479499482, 640827.7924742739 216899.95356335922, 640829.7491765573 216895.9738871799, 640830.4834412253 216894.39288641888, 
+  640830.7177760381 216893.8846038811, 640831.4199399 216892.35030114377, 640832.0499109842 216890.9762119772, 640832.2996192862 216890.45657403787, 640832.6181077951 216889.82517828836, 
+  640833.4673894796 216888.15374671214, 640836.1122804958 216882.52105063383, 640837.1900554508 216880.02686724483, 640837.2196891324 216879.9554398741, 640837.2628346098 216879.8718206329, 
+  640838.4209553085 216878.20130771815, 640838.8482623287 216877.57995489024, 640839.9930934187 216875.90172273025, 640841.0691496847 216874.29101662073, 640842.1679558838 216872.61126046372, 
+  640844.999305102 216868.0169361132, 640846.472406448 216865.4755086282, 640847.5636439583 216863.54380383994, 640847.873518959 216862.98076954397, 640848.0322995551 216862.72783403413, 
+  640849.9075325376 216859.61650437987, 640851.3102249437 216857.1905963269, 640852.3035072248 216855.43200195988, 640853.4819239745 216853.2955273621, 640854.9993506601 216850.57275874168, 
+  640859.3669998952 216841.73817034703, 640860.8285188182 216838.37408602203, 640864.9009404592 216827.23533027506, 640865.7708413982 216824.33271406806, 640868.9453624933 216809.97370375038, 
+  640869.4129266293 216806.7489133004, 640870.2210380215 216799.12978808515, 640870.4322648435 216795.99826662114, 640870.6558674623 216788.47952871647, 640870.6442850393 216787.01130417947, 
+  640870.0562549751 216776.94294942566, 640869.8843474322 216775.36895907967, 640868.9118359282 216768.61123670026, 640868.7926588892 216767.94524736726, 640868.7793140205 216767.9476353964, 
+  640863.5422764267 216749.2043707239, 640854.6849547137 216731.71602477558, 640842.5860169111 216716.29169023613, 640827.7104184137 216703.52411563174, 640810.6298201293 216693.90395169437, 
+  640792.0006198711 216687.80089592905, 640772.5387273576 216685.44948534624, 640752.9920522037 216686.9400833359, 640734.1117621739 216692.2154070533, 640716.6234162257 216701.07272876636, 
+  640701.1990816861 216713.1716665689, 640688.4315070817 216728.04726506636, 640678.8113431444 216745.12786335076, 640672.7082873791 216763.75706360897, 640672.3512380109 216766.71224994565, 
+  640671.8329435985 216767.45985553684, 640670.6267181488 216769.24034576118, 640667.9786104528 216773.2411585612, 640663.3264732505 216781.01291737703, 640661.1639129255 216785.02775100802, 
+  640660.3367419982 216786.59657313264, 640658.3875420992 216790.37427188564, 640657.1835927182 216792.78689487485, 640655.9424446372 216795.36032642485, 640653.765189574 216800.3152229612, 
+  640653.2982606251 216801.2408982852, 640652.4493669361 216802.96480338392, 640651.3917088212 216805.1657685859, 640650.6229513759 216806.80331532354, 640649.9775878104 216808.2109784786, 
+  640649.1804828342 216809.53050169148, 640647.295870119 216812.78718420916, 640646.353731435 216814.48827641216, 640643.8462805866 216819.32161146, 640642.8276369496 216821.423211662, 
+  640639.9686218789 216827.89569423962, 640638.9602330392 216830.41627953897))
+  </test>
+</case>
+
 
 </run>
diff --git a/testxml/failure/TestOverlay.xml b/testxml/failure/TestOverlay.xml
deleted file mode 100644
index 9dd618b..0000000
--- a/testxml/failure/TestOverlay.xml
+++ /dev/null
@@ -1,225 +0,0 @@
-<run>
-
-<case>
-  <desc>
-    http://postgis.refractions.net/pipermail/postgis-users/2006-November/013743.html
-  </desc>
-<a>
-POLYGON((5417148.108 5658342.603,5417139.016
-5658338.009,5417126.791 5658331.833,5417116.292 5658327.518,5417112.871
-5658325.598,5417110.25 5658324.127,5417106.071 5658321.781,5417104.226
-5658320.745,5417093.266 5658315.008,5417091.265 5658313.961,5417085.335
-5658310.857,5417060.44 5658326.26,5417064.68 5658327.52,5417088.83
-5658336.46,5417088.52 5658337.31,5417102.92 5658342.65,5417103.26
-5658341.83,5417111.76 5658345.51,5417121.662 5658349.583,5417121.878
-5658349.672,5417125.217 5658351.119,5417131.761 5658353.388,5417137.589
-5658356.276,5417142.166 5658359.67,5417146.599 5658364.988,5417151.395
-5658370.641,5417150.853 5658371.392,5417152.59741167
-5658373.52811061,5417154.92 5658376.37,5417155.18955743
-5658376.89699992,5417154.919 5658376.371,5417155.814
-5658378.111,5417157.051 5658380.297,5417158.004 5658382.304,5417159.014
-5658384.47,5417159.775 5658386.619,5417160.629 5658389.278,5417161.5
-5658399.49,5417160.773 5658404.194,5417159.41 5658413.02,5417158.853
-5658414.442,5417153.671 5658427.659,5417153.67051161
-5658427.6586943,5417153.67 5658427.66,5417152.73 5658427.07,5417149.993
-5658436.599,5417148.81 5658439.42,5417149.233 5658439.67,5417148.36
-5658440.81,5417146.41 5658446.6,5417144.321 5658453.127,5417144.32092232
-5658453.13043826,5417154.59 5658458.01,5417154.99551047
-5658455.8409905,5417155.446 5658453.413,5417157.23981414
-5658448.75748237,5417157.22660892 5658448.57861162,5417157.22660849
-5658448.57860592,5417157.22660865 5658448.57860812,5417157.128
-5658447.265,5417157.64950997 5658446.06368023,5417157.64950961
-5658446.06368108,5417158.314 5658444.533,5417172.322
-5658417.957,5417174.99 5658418.57,5417175.23 5658417.74,5417176.696
-5658412.61,5417177.875 5658408.488,5417178.76 5658405.39,5417178.1
-5658393.55,5417178.08 5658393.36,5417177.11 5658384.95,5417178.151
-5658384.915,5417178.14836289 5658384.91508866,5417178.12
-5658384.83,5417177.91415246 5658383.81114117,5417176.927
-5658378.944,5417176.603 5658377.341,5417176.73975922
-5658378.01762048,5417176.6 5658377.34,5417176.51210558
-5658376.89535766,5417176.428 5658376.483,5417175.235
-5658370.602,5417171.577 5658362.886,5417170.762 5658360.107,5417168.522
-5658357.989,5417166.042 5658355.047,5417164.137 5658352.264,5417162.642
-5658351.593,5417160.702 5658350.843,5417160.05417889
-5658350.5823586,5417158.82 5658350.09,5417158.82103105
-5658350.0862195,5417159.50373263 5658350.36089455,5417158.818
-5658350.085,5417159.055 5658349.214,5417155.754
-5658347.679,5417156.78066321 5658348.15640928,5417155.7525011
-5658347.6811561,5417155.161 5658348.532,5417149.028
-5658343.237,5417152.26877967 5658346.03496647,5417149.03
-5658343.24,5417148.78133339 5658343.06701453,5417148.108
-5658342.603))
-</a>
-
-<b>
-POLYGON((5417148.36 5658440.81,5417149.233
-5658439.67,5417148.81 5658439.42,5417149.993 5658436.599,5417152.73
-5658427.07,5417153.67 5658427.66,5417153.67051161
-5658427.6586943,5417153.671 5658427.659,5417158.853
-5658414.442,5417159.41 5658413.02,5417160.773 5658404.194,5417161.5
-5658399.49,5417160.63 5658389.28,5417159.78 5658386.62,5417159.366239
-5658385.46469333,5417159.014 5658384.47,5417158.004
-5658382.304,5417157.051 5658380.297,5417155.814
-5658378.111,5417155.18955747 5658376.897,5417154.92
-5658376.37,5417152.59740379 5658373.52810095,5417150.853
-5658371.392,5417151.13020611 5658371.00790076,5417151.4
-5658370.64,5417147.11100598 5658365.59149663,5417146.599
-5658364.988,5417145.96673439 5658364.22950947,5417142.17
-5658359.67,5417139.98754716 5658358.05460369,5417137.589
-5658356.276,5417131.761 5658353.388,5417125.33011568
-5658351.15822058,5417125.22 5658351.12,5417121.88 5658349.67,5417121.66
-5658349.58,5417111.76 5658345.51,5417103.26 5658341.83,5417102.92
-5658342.65,5417088.52 5658337.31,5417088.83 5658336.46,5417064.68
-5658327.52,5417060.44 5658326.26,5417085.34 5658310.86,5417085.90750076
-5658311.15666987,5417091.265 5658313.961,5417093.266
-5658315.008,5417093.61266829 5658315.18946314,5417104.23
-5658320.75,5417105.81727304 5658321.63852784,5417106.071
-5658321.781,5417106.60319005 5658322.07975996,5417110.25
-5658324.13,5417112.87 5658325.6,5417116.29 5658327.52,5417121.76604303
-5658329.76778528,5417126.791 5658331.833,5417139.016
-5658338.009,5417148.108 5658342.603,5417148.78133333
-5658343.06701449,5417149.03 5658343.24,5417152.26878253
-5658346.03496893,5417155.161 5658348.532,5417155.7525011
-5658347.6811561,5417156.78066337 5658348.15640935,5417159.055
-5658349.214,5417158.818 5658350.085,5417158.82103105
-5658350.0862195,5417158.82 5658350.09,5417160.0541792
-5658350.58235872,5417160.702 5658350.843,5417162.642
-5658351.593,5417164.137 5658352.264,5417165.25343486
-5658353.89499119,5417166.04 5658355.05,5417168.52 5658357.99,5417170.76
-5658360.11,5417171.26171711 5658361.81094338,5417171.577
-5658362.886,5417175.235 5658370.602,5417176.428
-5658376.483,5417176.51210558 5658376.89535766,5417176.6
-5658377.34,5417176.73975924 5658378.01762057,5417176.927
-5658378.944,5417177.91415134 5658383.81113564,5417178.12
-5658384.83,5417178.14836289 5658384.91508866,5417177.11
-5658384.95,5417178.08 5658393.36,5417178.1 5658393.55,5417178.76
-5658405.39,5417177.875 5658408.488,5417176.696 5658412.61,5417175.23
-5658417.74,5417174.99 5658418.57,5417172.322
-5658417.957,5417172.32037372 5658417.96008538,5417172.32
-5658417.96,5417158.31 5658444.53,5417157.64951003
-5658446.06368011,5417157.128 5658447.265,5417157.22660867
-5658448.5786084,5417157.23981414 5658448.75748238,5417155.446
-5658453.413,5417154.99551072 5658455.84098918,5417154.59
-5658458.01,5417144.32092232 5658453.13043826,5417144.321
-5658453.127,5417146.41 5658446.6,5417148.36 5658440.81))
-</b>
-<test>
-	<op name="difference" arg1="A" arg2="B">
-POLYGON EMPTY
-	</op>
-</test>
-</case>
-
-
-<case>
-  <desc>
-    http://lists.osgeo.org/pipermail/geos-devel/2010-September/004949.html
-    
-    Fails because B is invalid
-  </desc>
-<a>
-
-0106000000010000000103000000010000009F0100009031772D4C6639418E06F0763C7352417524970F63663941411361A736735241075F980C76663941DF718AFA31735241F4FDD4D88466394135EF38B12E735241083D9B358E663941B7F3FDAC2C7352417E8CB9EB9B66394183E2C7C029735241DE9387E59B663941D9F0F4BE297352410BB5A6E99B6639415DFE43BE2973524103098AEF9B663941D9CEF7BF29735241AA825129B166394187A7572A257352416BBC7423B1663941797AA52825735241E4141D29B1663941C6FEB22725735241B5C8762EB1663941C74B372925735241E561A1C6C0663941850D4FBB21735241 [...]
-</a>
-
-<b>
-010600000005000000010300000001000000A900000086EB51F8B265394115AE47A99472524186EB51F8BD65394115AE47C99372524186EB51F8DF65394115AE47798072524186EB5178DF65394115AE47497E72524186EB5178DF65394115AE47697D72524186EB5138DE65394115AE47A97C72524186EB51B8DB65394115AE47497B72524186EB5178D965394115AE47797972524186EB51B8D865394115AE47197772524186EB51B8D865394115AE47A972725241ACCFD506D9653941D44D62106D7252418B1F63CED66539411383C0D66B7252412D651902D16539410D71AC3769725241F56C56CDC565394168B3EAFB64725241 [...]
-</b>
-<test>
-	<op name="difference" arg1="A" arg2="B">
-POLYGON EMPTY
-	</op>
-</test>
-</case>
-
-<case>
-  <desc>A.union(B) fails, but B.union(A) works!
-    
-    Lowering the precision slightly works.
-    
-    Possibly due to ordering issues in RobustDeterminant?
-    Or due to robustness issue with ordering points along line segments?
-    
-http://sourceforge.net/mailarchive/forum.php?thread_name=4DD83610.70607%40telus.net&forum_name=jts-topo-suite-user    
-  </desc>
-<a>
-
-POLYGON ((-73.16540347748551 -94.50735621934908, -74 -95, -76.23310243744803 -100.58620689655172, -76.23310243744801 -100.5862068965517, -76.23310243744801 -100.58620689655172, 100 -30, 30 90, -73.16540347748551 -94.50735621934908))</a>
-
-<b>
-POLYGON ((-76.23310243744803 -100.58620689655172, 70 -7, -100 -90, -76.23310243744803 -100.58620689655172))</b>
-<test>
-	<op name="union" arg1="A" arg2="B">
-POLYGON ((-100 -90, -76.23310243744803 -100.58620689655172, 100 -30, 30 90, -59.62241169305726 -70.28623629719854, -100 -90))
-	</op>
-</test>
-</case>
-
-<case>
-  <desc>A.intersection(B) fails, since it computes a result equal to A
-   
-   This is a  case which exhibits a (luckily VERY rare) issue 
-   with the RobustDeterminant code in JTS.  
-   This code is sensitive to the order of the input coordinates, in some cases.  
-   Due to the way JTS computes topology, 
-   this can cause an inconsistency in the evaluation of how two polygons intersect. 
-   
-   As a demonstration of this, 
-   notice that if the triangle in the example is reversed, 
-   the intersection computation produces a more reasonable result:
-   
-   polyA = POLYGON ((0 0, 40 0, 40 10.883854, 15.552673 10.883854, 15.552673 20.540905, 0 20.540905, 0 0))
-   
-   tri = POLYGON ((-20.43142161511487 -186.3790522565901, -20.43142161511487 13.620947743409914, 279.56857838488514 -186.3790522565901, -20.43142161511487 -186.3790522565901))
-   
-   polyA.intersection(tri) = POINT (0 0)
-   
-   I have noticed this once before, 
-   but wasn't sure of the best way to address this issue.  
-   It may be best to always force a standard ordering of the inputs to 
-   the RobustDeterminant calculation, in order to at least be consistent.  
-   Hopefully if this proves out I can address this in a future version of JTS.
-
-http://sourceforge.net/mailarchive/forum.php?thread_name=BANLkTi%3D0UrBPmBSg%3Duy4M0ng9Pdptm%2BaYQ%40mail.gmail.com&forum_name=jts-topo-suite-user
-</desc>
-<a>
-POLYGON ((0 0, 40 0, 40 10.883854, 15.552673 10.883854, 15.552673 20.540905, 0 20.540905, 0 0))
-</a>
-<b>
-POLYGON ((-20.43142161511487 -186.3790522565901, 279.56857838488514 -186.3790522565901, -20.43142161511487 13.620947743409914, -20.43142161511487 -186.3790522565901))
-</b>
-<test>
-<op name="intersection" arg1="A" arg2="B">
-GEOMETRYCOLLECTION EMPTY	
-</op>
-</test>
-</case>
-
-<case>
-  <desc>
-  JTS list - March 19 2012.
-  Union of two partially-overlapping polygons returns an incorrect result equal to one of inputs (with node added).
-  
-  This is definitely a robustness error, and a particularly insidious one.  At least part of the problem is that while mathematically the point
-	
-	POINT (42.975 -92.25)
-	
-	lies exactly on the line segment
-	
-	LINESTRING (126 -184.5, -9 -34.5)
-	
-the algorithms that JTS uses report that the point lies off the line (and that's with 2 completely different procedures).  This makes me think that possibly the Java text-to-floating point conversion is not converting the numbers precisely (although there may well be something else causing this - I hesitate to blame the core Java library, which must be pretty well tested by now!).
-
-Correct expected result is computed by hand.
-  </desc>
-<a>
-POLYGON ((42.975 -92.25, 100 0, -200 0, 126 -184.5, 42.975 -92.25))</a>
-<b>
-POLYGON ((126 -184.5, -9 -34.5, -200 -300, 126 -184.5))</b>
-<test>
-<op name="intersection" arg1="A" arg2="B">
-POLYGON ((-46.626 -86.802, -200 0, 100 0, 42.975 -92.25, 126 -184.5, -200 -300, -46.626 -86.802))</op>
-</test>
-</case>
-
-</run>
diff --git a/testxml/failure/TestOverlayFailure.xml b/testxml/failure/TestOverlayFailure.xml
index 527eb4f..279c986 100644
--- a/testxml/failure/TestOverlayFailure.xml
+++ b/testxml/failure/TestOverlayFailure.xml
@@ -258,4 +258,23 @@ GEOMETRYCOLLECTION EMPTY</op>
 </test>
 </case>
 
+<case>
+  <desc>
+  http://trac.osgeo.org/geos/ticket/614
+  
+  Two polygons with nearly coincident linework, causes robustness failure.
+  Correct result unknown.
+  </desc>
+  <a>
+0106000020E61000000400000001030000000100000005000000E42CEC69873FF2BF9E98F56228E34740E92B4833164DF2BF3B1E335019E34740768E01D9EB5DF2BFD0D556EC2FE3474050C5FEB27B72F2BFB94E232D95E34740E42CEC69873FF2BF9E98F56228E34740010300000001000000040000000DB0F50EA8B7F2BF17C856DD28E447407FF6234564D8F2BFF1BA7EC16EE447409DD7D825AAB7F2BFE4FC4D2844E447400DB0F50EA8B7F2BF17C856DD28E4474001030000000100000004000000F9C5FEB27B72F2BFBB4E232D95E347406EC5FEB27B72F2BFBA4E232D95E3474050C5FEB27B72F2BFB94E232D95E34740F9C5 [...]
+  </a>
+  <b>
+0106000020E6100000050000000103000000010000000C000000E42CEC69873FF2BF9E98F56228E347400EDB16653648F2BF4985B18520E34740E92B4833164DF2BF3A1E335019E34740A94D9CDCEF50F2BF33F9669B1BE347407DAEB6627F59F2BF2CF180B229E34740758E01D9EB5DF2BFD0D556EC2FE34740533F6F2A5261F2BFD717096D39E34740F4893C49BA66F2BFC8073D9B55E34740B8239C16BC68F2BF33A7CB6262E34740AA2B9FE57970F2BF4165FCFB8CE3474041C5FEB27B72F2BFB94E232D95E34740E42CEC69873FF2BF9E98F56228E3474001030000000100000004000000FCC5FEB27B72F2BFBB4E232D95E347 [...]
+  </b>
+<test>
+<op name="symDifference" arg1="A" arg2="B">
+GEOMETRYCOLLECTION EMPTY</op>
+</test>
+</case>
+
 </run>
diff --git a/testxml/general/TestCentroid.xml b/testxml/general/TestCentroid.xml
index e43fc17..817ccd5 100644
--- a/testxml/general/TestCentroid.xml
+++ b/testxml/general/TestCentroid.xml
@@ -26,12 +26,30 @@
 </case>
 
 <case>
+  <desc>mP - repeated points</desc>
+  <a>    MULTIPOINT((10 10), (10 10), (10 10), (18 18))  </a>
+<test><op name="getCentroid" arg1="A" >    POINT(12 12)   </op></test>
+</case>
+
+<case>
   <desc>L - single segment</desc>
   <a>    LINESTRING(10 10, 20 20)  </a>
 <test><op name="getCentroid" arg1="A" >    POINT(15 15)   </op></test>
 </case>
 
 <case>
+  <desc>L - zero length line</desc>
+  <a>    LINESTRING (10 10, 10 10)  </a>
+<test><op name="getCentroid" arg1="A" >    POINT (10 10)   </op></test>
+</case>
+
+<case>
+  <desc>mL - zero length lines</desc>
+  <a>    MULTILINESTRING ((10 10, 10 10), (20 20, 20 20))  </a>
+<test><op name="getCentroid" arg1="A" >    POINT (15 15)   </op></test>
+</case>
+
+<case>
   <desc>L - two segments</desc>
   <a>    LINESTRING (60 180, 120 100, 180 180)  </a>
 <test><op name="getCentroid" arg1="A" >    POINT (120 140)   </op></test>
@@ -135,7 +153,7 @@
 </case>
 
 <case>
-  <desc>GC - heterogeneous collection of polygons, lines, points</desc>
+  <desc>GC - collection of polygons, lines, points</desc>
   <a>    GEOMETRYCOLLECTION (POLYGON ((0 40, 40 40, 40 0, 0 0, 0 40)), 
   LINESTRING (80 0, 80 80, 120 40), 
   MULTIPOINT ((20 60), (40 80), (60 60)))
@@ -144,6 +162,49 @@
 </case>
 
 <case>
+  <desc>GC - collection of zero-area polygons and lines</desc>
+  <a>    GEOMETRYCOLLECTION (POLYGON ((10 10, 10 10, 10 10, 10 10)), 
+  LINESTRING (20 20, 30 30))
+	</a>
+<test><op name="getCentroid" arg1="A" >    POINT (25 25)   </op></test>
+</case>
+
+<case>
+  <desc>GC - collection of zero-area polygons and zero-length lines</desc>
+  <a>    GEOMETRYCOLLECTION (POLYGON ((10 10, 10 10, 10 10, 10 10)), 
+  LINESTRING (20 20, 20 20))
+	</a>
+<test><op name="getCentroid" arg1="A" >    POINT (15 15)   </op></test>
+</case>
+
+<case>
+  <desc>GC - collection of zero-area polygons, zero-length lines, and points</desc>
+  <a>    GEOMETRYCOLLECTION (POLYGON ((10 10, 10 10, 10 10, 10 10)), 
+  LINESTRING (20 20, 20 20),
+  MULTIPOINT ((20 10), (10 20)) )
+	</a>
+<test><op name="getCentroid" arg1="A" >    POINT (15 15)   </op></test>
+</case>
+
+<case>
+  <desc>GC - collection of zero-area polygons, zero-length lines, and points</desc>
+  <a>    GEOMETRYCOLLECTION (POLYGON ((10 10, 10 10, 10 10, 10 10)), 
+  LINESTRING (20 20, 20 20),
+  POINT EMPTY )
+	</a>
+<test><op name="getCentroid" arg1="A" >    POINT (15 15)   </op></test>
+</case>
+
+<case>
+  <desc>GC - collection of zero-area polygons, zero-length lines, and points</desc>
+  <a>    GEOMETRYCOLLECTION (POLYGON ((10 10, 10 10, 10 10, 10 10)), 
+  LINESTRING EMPTY,
+  POINT EMPTY )
+	</a>
+<test><op name="getCentroid" arg1="A" >    POINT (10 10)   </op></test>
+</case>
+
+<case>
   <desc>GC - overlapping polygons </desc>
   <a>    GEOMETRYCOLLECTION (POLYGON ((20 100, 20 -20, 60 -20, 60 100, 20 100)), 
   POLYGON ((-20 60, 100 60, 100 20, -20 20, -20 60)))
diff --git a/testxml/general/TestInteriorPoint.xml b/testxml/general/TestInteriorPoint.xml
index dfcc74d..585738a 100644
--- a/testxml/general/TestInteriorPoint.xml
+++ b/testxml/general/TestInteriorPoint.xml
@@ -35,6 +35,18 @@
 </case>
 
 <case>
+  <desc>L - zero length line</desc>
+  <a>    LINESTRING (10 10, 10 10)  </a>
+<test><op name="getInteriorPoint" arg1="A" >    POINT (10 10)   </op></test>
+</case>
+
+<case>
+  <desc>mL - zero length lines</desc>
+  <a>    MULTILINESTRING ((10 10, 10 10), (20 20, 20 20))  </a>
+<test><op name="getInteriorPoint" arg1="A" >    POINT (10 10)   </op></test>
+</case>
+
+<case>
   <desc>mL - complex linestrings</desc>
   <a>    MULTILINESTRING ((60 240, 140 300, 180 200, 40 140, 100 100, 120 220), 
   (240 80, 260 160, 200 240, 180 340, 280 340, 240 180, 180 140, 40 200, 140 260))
@@ -57,14 +69,60 @@
 </case>
 
 <case>
+  <desc>A - polygon with horizontal segment at centre (L shape)</desc>
+  <a>    POLYGON ((0 2, 0 4, 6 4, 6 0, 2 0, 2 2, 0 2))
+	</a>
+<test><op name="getInteriorPoint" arg1="A" >    POINT (3 3)   </op></test>
+</case>
+
+<case>
+  <desc>A - polygon with horizontal segment at centre (narrower L shape)</desc>
+  <a>    POLYGON ((0 2, 0 4, 3 4, 3 0, 2 0, 2 2, 0 2))
+	</a>
+<test><op name="getInteriorPoint" arg1="A" >    POINT (2 3)   </op></test>
+</case>
+
+<case>
   <desc>mA - polygons with holes</desc>
-  <a>    MULTIPOLYGON (((60 320, 240 340, 260 100, 20 60, 120 180, 60 320), 
-  (200 280, 140 260, 180 160, 240 140, 200 280)), 
-  ((380 280, 300 260, 340 100, 440 80, 380 280), 
-    (380 220, 340 200, 400 100, 380 220)))
+  <a>    MULTIPOLYGON (((50 260, 240 340, 260 100, 20 60, 90 140, 50 260), (200 280, 140 240, 180 160, 240 140, 200 280)), ((380 280, 300 260, 340 100, 440 80, 380 280), (380 220, 340 200, 400 100, 380 220)))
 	</a>
-<test><op name="getInteriorPoint" arg1="A" >    POINT (138 200)  </op></test>
+<test><op name="getInteriorPoint" arg1="A" >    POINT (115 200)  </op></test>
 </case>
 
+<case>
+  <desc>GC - collection of polygons, lines, points</desc>
+  <a>    GEOMETRYCOLLECTION (POLYGON ((0 40, 40 40, 40 0, 0 0, 0 40)), 
+  LINESTRING (80 0, 80 80, 120 40), 
+  MULTIPOINT ((20 60), (40 80), (60 60)))
+	</a>
+<test><op name="getInteriorPoint" arg1="A" >    POINT (20 20)   </op></test>
+</case>
+
+<case>
+  <desc>GC - collection of zero-area polygons and lines</desc>
+  <a>    GEOMETRYCOLLECTION (POLYGON ((10 10, 10 10, 10 10, 10 10)), 
+  LINESTRING (20 20, 30 30))
+	</a>
+<test><op name="getInteriorPoint" arg1="A" >    POINT (10 10)   </op></test>
+</case>
+
+<case>
+  <desc>GC - collection of zero-area polygons and zero-length lines</desc>
+  <a>    GEOMETRYCOLLECTION (POLYGON ((10 10, 10 10, 10 10, 10 10)), 
+  LINESTRING (20 20, 20 20))
+	</a>
+<test><op name="getInteriorPoint" arg1="A" >    POINT (10 10)   </op></test>
+</case>
+
+<case>
+  <desc>GC - collection of zero-area polygons, zero-length lines, and points</desc>
+  <a>    GEOMETRYCOLLECTION (POLYGON ((10 10, 10 10, 10 10, 10 10)), 
+  LINESTRING (20 20, 20 20),
+  MULTIPOINT ((20 10), (10 20)) )
+	</a>
+<test><op name="getInteriorPoint" arg1="A" >    POINT (10 10)   </op></test>
+</case>
+
+
 
 </run>
diff --git a/testxml/general/TestPreparedPolygonPredicate.xml b/testxml/general/TestPreparedPolygonPredicate.xml
index a386249..f083020 100644
--- a/testxml/general/TestPreparedPolygonPredicate.xml
+++ b/testxml/general/TestPreparedPolygonPredicate.xml
@@ -4,17 +4,31 @@
   <geometryOperation>com.vividsolutions.jtstest.geomop.PreparedGeometryOperation</geometryOperation>
 
 <case>
-  <desc>P/A - point equal to start point of polygon
+  <desc>A/P - point equal to start point of polygon
   </desc>
   <a>
-      POINT (10 10)
+    POLYGON ((10 10, 60 100, 110 10, 10 10))
   </a>
   <b>
+      POINT (10 10)
+  </b>
+<test>  <op name="contains"   		arg1="A" arg2="B">   false  </op> </test>
+<test>  <op name="covers"     		arg1="A" arg2="B">   true   </op> </test>
+<test>  <op name="intersects" 		arg1="A" arg2="B">   true   </op> </test>
+</case>
+
+<case>
+  <desc>A/P - point equal to start point of polygon
+  </desc>
+  <a>
     POLYGON ((10 10, 60 100, 110 10, 10 10))
+  </a>
+  <b>
+      POINT (10 20)
   </b>
 <test>  <op name="contains"   		arg1="A" arg2="B">   false  </op> </test>
 <test>  <op name="covers"     		arg1="A" arg2="B">   false  </op> </test>
-<test>  <op name="intersects" 		arg1="A" arg2="B">   true   </op> </test>
+<test>  <op name="intersects" 		arg1="A" arg2="B">   false  </op> </test>
 </case>
 
 <case>
diff --git a/testxml/robust/TestRobustBuffer.xml b/testxml/robust/TestRobustBuffer.xml
deleted file mode 100644
index b98866b..0000000
--- a/testxml/robust/TestRobustBuffer.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<run>
-  <desc>
-    Buffer test cases which stres the JTS robust buffer algorithms
-  </desc>
-  <precisionModel type="FLOATING" />
-  <resultMatcher>com.vividsolutions.jtstest.testrunner.BufferResultMatcher</resultMatcher>
-
-<case>
-  <desc>GEOS #605 - smallest case.  Works in JTS, but triggers fixed-precision fallback.</desc>
-  <a>
-    LINESTRING (365851.1186 6133776.04159, 366074.9243 6134077.56523, 375141.3101 6138794.83236, 373718.87248 6137668.4963, 373346.64754 6137433.71166638, 366752.527 6134568.1015, 360775.41757 6127074.35479, 360762.97098 6127054.06482, 365851.11862 6133776.04159, 366074.92434 6134077.56523, 366360.99154 6134339.22803, 366752.52702 6134568.1015, 373346.64754 6137433.71166638, 373718.87248 6137668.4963, 375295.49858 6138886.9262, 373718.87248 6137668.4963, 373346.64754 6137433.71166, 36682 [...]
-  </a>
-<test>
-  <op name="buffer" arg1="A" arg2="1000.0">
-    POLYGON ((355917.67656 6124381.22758, 355939.27747 6124576.05034, 355998.46805 6124762.91656, 356092.97404 6124934.64636, 356219.16428 6125084.64146, 356372.19022 6125207.13868, 359638.80782 6127332.78479, 360038.85848 6127754.60444, 360042.83714 6127759.59265, 365050.94349 6134375.82647, 365271.94686 6134673.57465, 365271.94782 6134673.57567, 365399.99268 6134815.44547, 365686.05988 6135077.10827, 365731.38144 6135110.49622, 365766.07316 6135142.63065, 365855.41384 6135201.86967, 36 [...]
-  </op>
-</test>
-</case>
-
-</run>

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/jts.git



More information about the Pkg-grass-devel mailing list