AE86 пре 1 година
родитељ
комит
13aff8a426

+ 0 - 4
dbsyncer-connector/pom.xml

@@ -35,10 +35,6 @@
             <groupId>com.oracle</groupId>
             <artifactId>ojdbc6</artifactId>
         </dependency>
-        <dependency>
-            <groupId>oracle</groupId>
-            <artifactId>sdoapi</artifactId>
-        </dependency>
 
         <!-- sqlserver-driver -->
         <dependency>

+ 1 - 1
dbsyncer-connector/src/main/java/org/dbsyncer/connector/oracle/OracleOtherValueMapper.java

@@ -2,7 +2,7 @@ package org.dbsyncer.connector.oracle;
 
 import com.microsoft.sqlserver.jdbc.Geometry;
 import oracle.jdbc.OracleConnection;
-import oracle.spatial.geometry.JGeometry;
+import org.dbsyncer.connector.oracle.geometry.JGeometry;
 import org.dbsyncer.common.spi.ConnectorMapper;
 import org.dbsyncer.connector.AbstractValueMapper;
 import org.dbsyncer.connector.ConnectorException;

+ 51 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/oracle/geometry/DataException.java

@@ -0,0 +1,51 @@
+package org.dbsyncer.connector.oracle.geometry;
+
+import java.io.PrintStream;
+import java.io.PrintWriter;
+
+public class DataException extends Exception {
+    public String description = "";
+    public Throwable detail = null;
+
+    public DataException(String var1) {
+        super(var1);
+    }
+
+    public String toString() {
+        String var1 = "Message:" + this.getMessage() + "\n";
+        var1 = var1 + "Description: " + this.description;
+        if (this.detail != null) {
+            var1 = var1 + "Nested exception is:\n" + this.detail.toString();
+        }
+
+        return var1;
+    }
+
+    public void printStackTrace(PrintStream var1) {
+        if (this.detail == null) {
+            super.printStackTrace(var1);
+        } else {
+            synchronized (var1) {
+                var1.println(this);
+                this.detail.printStackTrace(var1);
+            }
+        }
+
+    }
+
+    public void printStackTrace() {
+        this.printStackTrace(System.err);
+    }
+
+    public void printStackTrace(PrintWriter var1) {
+        if (this.detail == null) {
+            super.printStackTrace(var1);
+        } else {
+            synchronized (var1) {
+                var1.println(this);
+                this.detail.printStackTrace(var1);
+            }
+        }
+
+    }
+}

+ 57 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/oracle/geometry/J3D_Geometry.java

@@ -0,0 +1,57 @@
+package org.dbsyncer.connector.oracle.geometry;
+
+public class J3D_Geometry extends JGeometry {
+
+    public J3D_Geometry(int var1, int var2, int[] var3, double[] var4) {
+        super(var1 - 3000 >= 0 ? var1 : 3000 + var1, var2, var3, var4);
+    }
+
+    protected static double[][] getMBH(J3D_Geometry var0) {
+        int var3 = var0.ordinates.length / 3;
+        double[][] var5 = new double[3][2];
+        double[][] var4 = new double[var3][3];
+
+        int var1;
+        for (var1 = 0; var1 < var3; ++var1) {
+            var4[var1][0] = var0.ordinates[3 * var1];
+            var4[var1][1] = var0.ordinates[3 * var1 + 1];
+            var4[var1][2] = var0.ordinates[3 * var1 + 2];
+        }
+
+        double var6 = var4[0][0];
+        double var8 = var4[0][1];
+        double var10 = var4[0][2];
+        double var12 = var4[0][0];
+        double var14 = var4[0][1];
+        double var16 = var4[0][2];
+
+        for (var1 = 1; var1 < var3; ++var1) {
+            if (var4[var1][0] > var6) {
+                var6 = var4[var1][0];
+            } else if (var4[var1][0] < var12) {
+                var12 = var4[var1][0];
+            }
+
+            if (var4[var1][1] > var8) {
+                var8 = var4[var1][1];
+            } else if (var4[var1][1] < var14) {
+                var14 = var4[var1][1];
+            }
+
+            if (var4[var1][2] > var10) {
+                var10 = var4[var1][2];
+            } else if (var4[var1][2] < var16) {
+                var16 = var4[var1][2];
+            }
+        }
+
+        var5[0][0] = var12;
+        var5[0][1] = var6;
+        var5[1][0] = var14;
+        var5[1][1] = var8;
+        var5[2][0] = var16;
+        var5[2][1] = var10;
+        return var5;
+    }
+
+}

+ 3764 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/oracle/geometry/JGeometry.java

@@ -0,0 +1,3764 @@
+package org.dbsyncer.connector.oracle.geometry;
+
+import java.awt.Shape;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.GeneralPath;
+import java.awt.geom.Point2D;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import oracle.sql.ARRAY;
+import oracle.sql.ArrayDescriptor;
+import oracle.sql.Datum;
+import oracle.sql.NUMBER;
+import oracle.sql.STRUCT;
+import oracle.sql.StructDescriptor;
+
+public class JGeometry implements Cloneable, Serializable {
+    static final long serialVersionUID = -4792272186565640701L;
+    protected static StructDescriptor geomDesc = null;
+    protected static StructDescriptor pointDesc = null;
+    protected static ArrayDescriptor elemInfoDesc = null;
+    protected static ArrayDescriptor ordinatesDesc = null;
+    protected int gtype;
+    protected int linfo;
+    protected int srid;
+    protected double x;
+    protected double y;
+    protected double z;
+    protected int[] elemInfo;
+    protected double[] ordinates;
+    protected double[] mbr;
+    protected int dim;
+    protected JGeometry.LT_transform lttpH;
+    protected JGeometry.Gc_trans gtransH;
+    private static final double MERCATOR_e3785 = Math.sqrt(0.0D);
+    private static final double MERCATOR_e54004 = Math.sqrt(0.0066943799901413165D);
+    private static final double MERCATOR_B = Math.exp(1.0D);
+
+    private boolean lltogXYZ(double[] var1, JGeometry.Gc_trans var2) {
+        var1[0] *= var2.unitfactor;
+        var1[1] *= var2.unitfactor;
+        double var3 = Math.cos(var1[1]);
+        double var5 = Math.sin(var1[1]);
+        double var7 = Math.cos(var1[0]);
+        double var9 = Math.sin(var1[0]);
+        double var11 = var2.smax / Math.sqrt(1.0D - var2.esq * var5 * var5);
+        var1[0] = var3 * var7 * (var11 + var1[2]);
+        var1[1] = var3 * var9 * (var11 + var1[2]);
+        var1[2] = var5 * ((1.0D - var2.esq) * var11 + var1[2]);
+        return true;
+    }
+
+    private boolean gXYZtoll(double[] var1, JGeometry.Gc_trans var2) {
+        double var11 = var1[0] * var1[0] + var1[1] * var1[1];
+        double var9 = (1.0D + var2.esq) * var1[2];
+        double var7 = var9 / Math.sqrt(var11 + var9 * var9);
+
+        double var3;
+        double var5;
+        do {
+            var5 = var7;
+            var3 = var2.smax / Math.sqrt(1.0D - var2.esq * var7 * var7);
+            var9 = var1[2] + var3 * var2.esq * var7;
+            var7 = var9 / Math.sqrt(var11 + var9 * var9);
+        } while(Math.abs(var7 - var5) > 1.0E-15D);
+
+        var3 = var2.smax / Math.sqrt(1.0D - var2.esq * var7 * var7);
+        var9 = var1[2] + var3 * var2.esq * var7;
+        var1[0] = Math.atan2(var1[1], var1[0]);
+        var1[1] = Math.asin(var7);
+        var1[2] = Math.sqrt(var11 + var9 * var9) - var3;
+        return true;
+    }
+
+    private boolean gxyzgmcenter(double[] var1, double[] var2, JGeometry.Gc_trans var3) {
+        for(int var4 = 0; var4 < 3; ++var4) {
+            var1[var4] = (var2[var4] + var2[var4 + 3]) / 2.0D;
+        }
+
+        double var7 = var3.radius / Math.sqrt(var1[0] * var1[0] + var1[1] * var1[1] + var1[2] * var1[2]);
+
+        for(int var6 = 0; var6 < 3; ++var6) {
+            var1[var6] *= var7;
+        }
+
+        return this.gXYZtoll(var1, var3);
+    }
+
+    private boolean ltxform(double[] var1, JGeometry.LT_transform var2) {
+        double var3 = var1[0] - var2.xc;
+        double var5 = var1[1] - var2.yc;
+        double var7 = var1[2] - var2.zc;
+        var1[0] = var2.xrow[0] * var3 + var2.xrow[1] * var5 + var2.xrow[2] * var7;
+        var1[1] = var2.yrow[0] * var3 + var2.yrow[1] * var5 + var2.yrow[2] * var7;
+        var1[2] = 0.0D;
+        return true;
+    }
+
+    private boolean iltxform(double[] var1, JGeometry.LT_transform var2, JGeometry.Gc_trans var3) {
+        double var4 = var1[0];
+        double var6 = var1[1];
+        double var8 = 0.0D;
+        var8 = Math.sqrt(var3.radius * var3.radius - var4 * var4 - var6 * var6) - var3.radius;
+        var1[0] = var2.xrow[0] * var4 + var2.yrow[0] * var6 + var2.zrow[0] * var8 + var2.xc;
+        var1[1] = var2.xrow[1] * var4 + var2.yrow[1] * var6 + var2.zrow[1] * var8 + var2.yc;
+        var1[2] = var2.xrow[2] * var4 + var2.yrow[2] * var6 + var2.zrow[2] * var8 + var2.zc;
+        return true;
+    }
+
+    protected JGeometry(int var1, int var2) {
+        this.gtype = 0;
+        this.linfo = 0;
+        this.srid = 0;
+        this.x = 0.0D / 0.0;
+        this.y = 0.0D / 0.0;
+        this.z = 0.0D / 0.0;
+        this.elemInfo = null;
+        this.ordinates = null;
+        this.mbr = null;
+        this.dim = 2;
+        this.gtype = var1 % 100;
+        this.linfo = var1 % 1000 / 100;
+        this.dim = var1 / 1000 > 0 ? var1 / 1000 : 2;
+        this.srid = var2 <= 0 ? 0 : var2;
+    }
+
+    public JGeometry(int var1, int var2, double var3, double var5, double var7, int[] var9, double[] var10) {
+        this(var1, var2);
+        this.x = var3;
+        this.y = var5;
+        this.z = var7;
+        if (var9 != null && var10 != null) {
+            if (etype0_exists(var9) && !ordOffset0_exists(var9)) {
+                ArrayList var11 = new ArrayList();
+                ArrayList var12 = new ArrayList();
+                remove_etype0(var9, var10, var11, var12);
+                int[] var13 = new int[var11.size()];
+                double[] var14 = new double[var12.size()];
+
+                int var15;
+                for(var15 = 0; var15 < var11.size(); ++var15) {
+                    var13[var15] = (Integer)var11.get(var15);
+                }
+
+                for(var15 = 0; var15 < var12.size(); ++var15) {
+                    var14[var15] = (Double)var12.get(var15);
+                }
+
+                this.elemInfo = var13;
+                this.ordinates = var14;
+            } else {
+                this.elemInfo = var9;
+                this.ordinates = var10;
+            }
+        } else {
+            this.elemInfo = var9;
+            this.ordinates = var10;
+        }
+
+    }
+
+    public JGeometry(int var1, int var2, int[] var3, double[] var4) {
+        this(var1, var2);
+        if (var3 != null && var4 != null) {
+            if (etype0_exists(var3) && !ordOffset0_exists(var3)) {
+                ArrayList var5 = new ArrayList();
+                ArrayList var6 = new ArrayList();
+                remove_etype0(var3, var4, var5, var6);
+                int[] var7 = new int[var5.size()];
+                double[] var8 = new double[var6.size()];
+
+                int var9;
+                for(var9 = 0; var9 < var5.size(); ++var9) {
+                    var7[var9] = (Integer)var5.get(var9);
+                }
+
+                for(var9 = 0; var9 < var6.size(); ++var9) {
+                    var8[var9] = (Double)var6.get(var9);
+                }
+
+                this.elemInfo = var7;
+                this.ordinates = var8;
+            } else {
+                this.elemInfo = var3;
+                this.ordinates = var4;
+            }
+        } else {
+            this.elemInfo = var3;
+            this.ordinates = var4;
+        }
+
+    }
+
+    public JGeometry(double var1, double var3, int var5) {
+        this(1, var5);
+        this.x = var1;
+        this.y = var3;
+    }
+
+    public JGeometry(double var1, double var3, double var5, int var7) {
+        this(3001, var7);
+        this.x = var1;
+        this.y = var3;
+        this.z = var5;
+    }
+
+    public JGeometry(double var1, double var3, double var5, double var7, int var9) {
+        this(3, var9);
+        this.elemInfo = new int[3];
+        this.elemInfo[0] = 1;
+        this.elemInfo[1] = 1003;
+        this.elemInfo[2] = 3;
+        this.ordinates = new double[4];
+        this.ordinates[0] = var1;
+        this.ordinates[1] = var3;
+        this.ordinates[2] = var5;
+        this.ordinates[3] = var7;
+    }
+
+    public Object clone() {
+        try {
+            JGeometry var1 = (JGeometry)super.clone();
+            if (this.elemInfo != null) {
+                var1.elemInfo = new int[this.elemInfo.length];
+                System.arraycopy(this.elemInfo, 0, var1.elemInfo, 0, this.elemInfo.length);
+            }
+
+            if (this.ordinates != null) {
+                var1.ordinates = new double[this.ordinates.length];
+                System.arraycopy(this.ordinates, 0, var1.ordinates, 0, this.ordinates.length);
+            }
+
+            if (this.mbr != null) {
+                var1.mbr = new double[this.mbr.length];
+                System.arraycopy(this.mbr, 0, var1.mbr, 0, this.mbr.length);
+            }
+
+            return var1;
+        } catch (CloneNotSupportedException var2) {
+            throw new InternalError(var2.toString());
+        }
+    }
+
+    public static JGeometry createPoint(double[] var0, int var1, int var2) {
+        JGeometry var3 = new JGeometry(1, var2);
+        var3.dim = var0.length;
+        var3.x = var0[0];
+        var3.y = var0[1];
+        if (var1 == 3) {
+            var3.z = var0[2];
+        }
+
+        return var3;
+    }
+
+    public static JGeometry createLRSPoint(double[] var0, int var1, int var2) {
+        try {
+            int[] var3;
+            JGeometry var4;
+            if (var1 == 2 && var0.length == 3) {
+                var3 = new int[]{1, 1, 1};
+                var4 = new JGeometry(3301, var2, var3, var0);
+                return var4;
+            } else if (var1 == 3 && var0.length == 4) {
+                var3 = new int[]{1, 1, 1};
+                var4 = new JGeometry(4401, var2, var3, var0);
+                return var4;
+            } else {
+                throw new RuntimeException("Unsupported LRS Point type");
+            }
+        } catch (Exception var5) {
+            System.out.println("Error: " + var5);
+            return null;
+        }
+    }
+
+    public static JGeometry createCircle(double var0, double var2, double var4, int var6) {
+        return createCircle(var0 + var4 * Math.cos(0.7853981633974483D), var2 + var4 * Math.sin(0.7853981633974483D), var0 + var4 * Math.cos(2.356194490192345D), var2 + var4 * Math.sin(2.356194490192345D), var0 + var4 * Math.cos(4.71238898038469D), var2 + var4 * Math.sin(4.71238898038469D), var6);
+    }
+
+    public static JGeometry createCircle(double var0, double var2, double var4, double var6, double var8, double var10, int var12) {
+        if (orientation(var0, var2, var4, var6, var8, var10) == 0.0D) {
+            return null;
+        } else {
+            JGeometry var13 = new JGeometry(3, var12);
+            var13.elemInfo = new int[3];
+            var13.elemInfo[0] = 1;
+            var13.elemInfo[1] = 1003;
+            var13.elemInfo[2] = 4;
+            var13.ordinates = new double[6];
+            var13.ordinates[0] = var0;
+            var13.ordinates[1] = var2;
+            var13.ordinates[2] = var4;
+            var13.ordinates[3] = var6;
+            var13.ordinates[4] = var8;
+            var13.ordinates[5] = var10;
+            return var13;
+        }
+    }
+
+    public static JGeometry createArc2d(double[] var0, int var1, int var2) {
+        JGeometry var3 = new JGeometry(2, var2);
+        var3.dim = var1;
+        var3.elemInfo = new int[3];
+        var3.elemInfo[0] = 1;
+        var3.elemInfo[1] = 2;
+        var3.elemInfo[2] = 2;
+        var3.ordinates = var0;
+        return var3;
+    }
+
+    public static JGeometry createLinearLineString(double[] var0, int var1, int var2) {
+        JGeometry var3 = new JGeometry(2, var2);
+        var3.dim = var1;
+        var3.elemInfo = new int[3];
+        var3.elemInfo[0] = 1;
+        var3.elemInfo[1] = 2;
+        var3.elemInfo[2] = 1;
+        var3.ordinates = var0;
+        return var3;
+    }
+
+    public static JGeometry createLRSLinearLineString(double[] var0, int var1, int var2) {
+        try {
+            JGeometry var3;
+            if (var1 == 2) {
+                var3 = createLinearLineString(var0, 3, var2);
+                var3.setType(3302);
+                if (monoMeasure(var3.ordinates, var1 + 1) != 0) {
+                    return var3;
+                } else {
+                    System.out.println("Inconsistent LRS Measure Values");
+                    return null;
+                }
+            } else if (var1 == 3) {
+                var3 = createLinearLineString(var0, 4, var2);
+                var3.setType(4402);
+                if (monoMeasure(var3.ordinates, var1 + 1) != 0) {
+                    return var3;
+                } else {
+                    System.out.println("Inconsistent LRS Measure Values");
+                    return null;
+                }
+            } else {
+                throw new RuntimeException("Unsupported LRS Line type");
+            }
+        } catch (Exception var4) {
+            System.out.println("Error: " + var4);
+            return null;
+        }
+    }
+
+    public static JGeometry createLinearMultiLineString(Object[] var0, int var1, int var2) {
+        if (var0.length == 1) {
+            return createLinearLineString((double[])((double[])var0[0]), var1, var2);
+        } else {
+            JGeometry var3 = new JGeometry(6, var2);
+            var3.dim = var1;
+            int var4 = var0.length;
+            int var5 = 1;
+            var3.elemInfo = new int[var4 * 3];
+
+            for(int var6 = 0; var6 < var4; ++var6) {
+                var3.elemInfo[var6 * 3 + 0] = var5;
+                var3.elemInfo[var6 * 3 + 1] = 2;
+                var3.elemInfo[var6 * 3 + 2] = 1;
+                var5 += ((double[])((double[])var0[var6])).length;
+            }
+
+            double[] var10 = new double[var5 - 1];
+            int var7 = 0;
+
+            for(int var8 = 0; var8 < var4; ++var8) {
+                double[] var9 = (double[])((double[])var0[var8]);
+                System.arraycopy(var9, 0, var10, var7, var9.length);
+                var7 += var9.length;
+            }
+
+            var3.ordinates = var10;
+            return var3;
+        }
+    }
+
+    public static JGeometry createLRSLinearMultiLineString(Object[] var0, int var1, int var2) {
+        try {
+            JGeometry var3;
+            if (var1 == 2) {
+                var3 = createLinearMultiLineString(var0, 3, var2);
+                var3.setType(3306);
+                if (monoMeasure(var3.ordinates, var1 + 1) != 0) {
+                    return var3;
+                } else {
+                    System.out.println("Inconsistent LRS Measure Values");
+                    return null;
+                }
+            } else if (var1 == 3) {
+                var3 = createLinearMultiLineString(var0, 4, var2);
+                var3.setType(4406);
+                if (monoMeasure(var3.ordinates, var1 + 1) != 0) {
+                    return var3;
+                } else {
+                    System.out.println("Inconsistent LRS Measure Values");
+                    return null;
+                }
+            } else {
+                throw new RuntimeException("Unsupported LRS MultiLine type");
+            }
+        } catch (Exception var4) {
+            System.out.println("Error: " + var4);
+            return null;
+        }
+    }
+
+    public static JGeometry createMultiPoint(Object[] var0, int var1, int var2) {
+        if (var0.length == 1) {
+            return createPoint((double[])((double[])var0[0]), var1, var2);
+        } else {
+            JGeometry var3 = new JGeometry(5, var2);
+            var3.dim = var1;
+            int var4 = var0.length;
+            var3.elemInfo = new int[3];
+            var3.elemInfo[0] = 1;
+            var3.elemInfo[1] = 1;
+            var3.elemInfo[2] = var4;
+            double[] var5 = new double[var4 * var1];
+            int var6 = 0;
+
+            for(int var7 = 0; var7 < var4; ++var7) {
+                double[] var8 = (double[])((double[])var0[var7]);
+                System.arraycopy(var8, 0, var5, var6, var1);
+                var6 += var1;
+            }
+
+            var3.ordinates = var5;
+            return var3;
+        }
+    }
+
+    public static JGeometry createLinearPolygon(double[] var0, int var1, int var2) {
+        JGeometry var3 = new JGeometry(3, var2);
+        var3.dim = var1;
+        var3.elemInfo = new int[3];
+        var3.elemInfo[0] = 1;
+        var3.elemInfo[1] = 1003;
+        var3.elemInfo[2] = 1;
+        var3.ordinates = closeCoords(var0, var1);
+        return var3;
+    }
+
+    public static JGeometry createLinearPolygon(Object[] var0, int var1, int var2) {
+        if (var0.length == 1) {
+            return createLinearPolygon((double[])((double[])var0[0]), var1, var2);
+        } else {
+            JGeometry var3 = new JGeometry(3, var2);
+            var3.dim = var1;
+            int var4 = var0.length;
+            Object[] var5 = new Object[var4];
+
+            int var6;
+            for(var6 = 0; var6 < var4; ++var6) {
+                var5[var6] = closeCoords((double[])((double[])var0[var6]), var1);
+            }
+
+            var6 = 1;
+            var3.elemInfo = new int[var4 * 3];
+
+            for(int var7 = 0; var7 < var4; ++var7) {
+                var3.elemInfo[var7 * 3 + 0] = var6;
+                var3.elemInfo[var7 * 3 + 1] = var7 == 0 ? 1003 : 2003;
+                var3.elemInfo[var7 * 3 + 2] = 1;
+                var6 += ((double[])((double[])var5[var7])).length;
+            }
+
+            double[] var11 = new double[var6 - 1];
+            int var8 = 0;
+
+            for(int var9 = 0; var9 < var4; ++var9) {
+                double[] var10 = (double[])((double[])var5[var9]);
+                System.arraycopy(var10, 0, var11, var8, var10.length);
+                var8 += var10.length;
+            }
+
+            var3.ordinates = var11;
+            return var3;
+        }
+    }
+
+    public static JGeometry createLRSLinearPolygon(double[] var0, int var1, int var2) {
+        try {
+            JGeometry var3;
+            if (var1 == 2) {
+                var3 = createLinearPolygon((double[])var0, 3, var2);
+                var3.setType(3303);
+                if (monoMeasure(var3.ordinates, var1 + 1) != 0) {
+                    return var3;
+                } else {
+                    System.out.println("Inconsistent LRS Measure Values");
+                    return null;
+                }
+            } else if (var1 == 3) {
+                var3 = createLinearPolygon((double[])var0, 4, var2);
+                var3.setType(4403);
+                if (monoMeasure(var3.ordinates, var1 + 1) != 0) {
+                    return var3;
+                } else {
+                    System.out.println("Inconsistent LRS Measure Values");
+                    return null;
+                }
+            } else {
+                throw new RuntimeException("Unsupported LRS Polygon type");
+            }
+        } catch (Exception var4) {
+            System.out.println("Error: " + var4);
+            return null;
+        }
+    }
+
+    public static JGeometry createLRSLinearPolygon(Object[] var0, int var1, int var2) {
+        try {
+            if (var0 instanceof double[][]) {
+                for(int var3 = 0; var3 < var0.length; ++var3) {
+                    double[] var4 = ((double[][])((double[][])var0))[var3];
+                    if (monoMeasure(var4, var1 + 1) == 0) {
+                        System.out.println("Inconsistent LRS Measure Values");
+                        return null;
+                    }
+                }
+            }
+
+            JGeometry var6;
+            if (var1 == 2) {
+                var6 = createLinearPolygon((Object[])var0, 3, var2);
+                var6.setType(3303);
+                return var6;
+            } else if (var1 == 3) {
+                var6 = createLinearPolygon((Object[])var0, 4, var2);
+                var6.setType(4403);
+                return var6;
+            } else {
+                throw new RuntimeException("Unsupported LRS Polygon type");
+            }
+        } catch (Exception var5) {
+            System.out.println("Error: " + var5);
+            return null;
+        }
+    }
+
+    public static int monoMeasure(double[] var0, int var1) {
+        double var2 = 0.0D / 0.0;
+        int var4 = 0;
+        boolean var5 = false;
+        double var6 = 0.0D / 0.0;
+
+        int var13;
+        for(var13 = var1 - 1; var13 < var0.length; var13 += var1) {
+            var2 = var0[var13];
+            if (!Double.isNaN(var2)) {
+                var4 = var13;
+                break;
+            }
+        }
+
+        int var14;
+        if (var0[var4] == var0[var0.length - 1] && var0[var4 - (var1 - 2)] == var0[var0.length - (var1 - 1)] && var0[var4 - (var1 - 1)] == var0[var0.length - var1]) {
+            var14 = var0.length - var1;
+        } else {
+            var14 = var0.length;
+        }
+
+        if (Double.isNaN(var2)) {
+            return 1;
+        } else {
+            byte var8 = 0;
+            double var11 = var2;
+
+            for(var13 = var4 + var1; var13 < var14; var13 += var1) {
+                var6 = var0[var13];
+                if (!Double.isNaN(var6)) {
+                    double var9 = var6 - var11;
+                    if (var8 == 0) {
+                        if (var9 > 0.0D) {
+                            var8 = 1;
+                        } else if (var9 < 0.0D) {
+                            var8 = -1;
+                        } else {
+                            var8 = 0;
+                        }
+                    } else if (var9 * (double)var8 < 0.0D) {
+                        return 0;
+                    }
+
+                    var11 = var6;
+                }
+            }
+
+            if (var8 == 0) {
+                return 1;
+            } else {
+                return var8;
+            }
+        }
+    }
+
+    public int getType() {
+        return this.gtype;
+    }
+
+    public void setType(int var1) {
+        this.gtype = var1 % 100;
+        this.linfo = var1 % 1000 / 100;
+        if (var1 / 1000 > 0) {
+            this.dim = var1 / 1000;
+        }
+
+    }
+
+    public int getLRMDimension() {
+        return this.linfo;
+    }
+
+    public void setLRMDimension(int var1) {
+        this.linfo = var1;
+    }
+
+    public int getSRID() {
+        return this.srid;
+    }
+
+    public void setSRID(int var1) {
+        this.srid = var1;
+    }
+
+    public Point2D getLabelPoint() {
+        return !Double.isNaN(this.x) && !Double.isNaN(this.y) ? new java.awt.geom.Point2D.Double(this.x, this.y) : null;
+    }
+
+    public double[] getLabelPointXYZ() {
+        return new double[]{this.x, this.y, this.z};
+    }
+
+    public double[] getPoint() {
+        if (this.gtype != 1) {
+            return null;
+        } else {
+            double[] var1 = new double[this.dim];
+            if ((Double.isNaN(this.x) || Double.isNaN(this.y)) && (this.elemInfo == null || this.elemInfo.length == 0)) {
+                return null;
+            } else if (this.elemInfo == null && !Double.isNaN(this.x) && !Double.isNaN(this.y)) {
+                var1[0] = this.x;
+                var1[1] = this.y;
+                if (this.dim > 2) {
+                    var1[2] = this.z;
+                }
+
+                return var1;
+            } else if (this.elemInfo.length != 3) {
+                if (this.elemInfo.length == 6 && this.elemInfo[4] == 1 && this.elemInfo[5] == 0) {
+                    var1[0] = this.ordinates[0];
+                    var1[1] = this.ordinates[1];
+                    if (this.dim > 2) {
+                        var1[2] = this.ordinates[2];
+                    }
+
+                    return var1;
+                } else {
+                    double[] var3 = this.getMBR();
+                    if (var3 == null) {
+                        return null;
+                    } else {
+                        var1[0] = var3[0];
+                        var1[1] = var3[1];
+                        return var1;
+                    }
+                }
+            } else {
+                for(int var2 = 0; var2 < this.dim; ++var2) {
+                    var1[var2] = this.ordinates[var2];
+                }
+
+                return var1;
+            }
+        }
+    }
+
+    public Point2D getJavaPoint() {
+        if (this.gtype != 1) {
+            return null;
+        } else if (!Double.isNaN(this.x) && !Double.isNaN(this.y)) {
+            return new java.awt.geom.Point2D.Double(this.x, this.y);
+        } else if (this.elemInfo.length == 3) {
+            return new java.awt.geom.Point2D.Double(this.ordinates[0], this.ordinates[1]);
+        } else if (this.elemInfo.length == 6 && this.elemInfo[4] == 1 && this.elemInfo[5] == 0) {
+            return new java.awt.geom.Point2D.Double(this.ordinates[0], this.ordinates[1]);
+        } else {
+            double[] var1 = this.getMBR();
+            return var1 != null ? new java.awt.geom.Point2D.Double(var1[0], var1[1]) : null;
+        }
+    }
+
+    public Point2D[] getJavaPoints() {
+        int var1 = this.elemInfo[1] % 10;
+        int var2 = this.elemInfo[2];
+        int var3;
+        if (this.isOrientedMultiPoint()) {
+            var2 = this.elemInfo.length / 6;
+        } else if (this.isMultiPoint()) {
+            var2 = 0;
+
+            for(var3 = 0; var3 < this.elemInfo.length; var3 += 3) {
+                var2 += this.elemInfo[var3 + 2];
+            }
+        }
+
+        var3 = var2;
+        if (this.gtype == 5 && var1 == 1) {
+            Point2D[] var4 = new Point2D[var2];
+            int var5 = 0;
+            if (this.isOrientedMultiPoint()) {
+                var5 = this.getOrientMultiPointOffset();
+            }
+
+            for(int var6 = 0; var6 < var3; ++var6) {
+                var4[var6] = new java.awt.geom.Point2D.Double(this.ordinates[var6 * (this.dim + var5)], this.ordinates[var6 * (this.dim + var5) + 1]);
+            }
+
+            return var4;
+        } else {
+            return null;
+        }
+    }
+
+    public final boolean isPoint() {
+        return this.gtype == 1;
+    }
+
+    public final boolean isOrientedPoint() {
+        if (this.elemInfo != null && this.ordinates != null) {
+            return this.isPoint() && this.elemInfo.length == 6 && this.elemInfo[4] == 1 && this.elemInfo[5] == 0;
+        } else {
+            return false;
+        }
+    }
+
+    public final boolean isMultiPoint() {
+        return this.gtype == 5;
+    }
+
+    public final boolean isOrientedMultiPoint() {
+        if (this.elemInfo != null && this.ordinates != null) {
+            return this.isMultiPoint() && this.elemInfo.length > 3 && this.elemInfo[4] == 1 && this.elemInfo[5] == 0;
+        } else {
+            return false;
+        }
+    }
+
+    public final boolean isRectangle() {
+        if (this.elemInfo == null) {
+            return false;
+        } else {
+            return this.gtype == 3 && this.elemInfo[1] % 100 == 3 && this.elemInfo[2] == 3 && this.elemInfo.length == 3;
+        }
+    }
+
+    public final boolean isCircle() {
+        if (this.elemInfo == null) {
+            return false;
+        } else {
+            return this.gtype == 3 && this.elemInfo[1] % 100 == 3 && this.elemInfo[2] == 4 && this.elemInfo.length == 3;
+        }
+    }
+
+    public final boolean isGeodeticMBR() {
+        if (this.elemInfo == null) {
+            return false;
+        } else {
+            return this.gtype == 3 && this.elemInfo[1] % 100 == 3 && this.elemInfo[2] == 5 && this.elemInfo.length == 3;
+        }
+    }
+
+    public final boolean isLRSGeometry() {
+        return this.dim > 2 && this.linfo != 0 ? (this.dim == 3 ? this.linfo == 3 : (this.dim == 4 ? this.linfo == 3 || this.linfo == 4 : false)) : false;
+    }
+
+    public final boolean hasCircularArcs() {
+        if (this.elemInfo != null) {
+            for(int var1 = 1; var1 < this.elemInfo.length; var1 += 3) {
+                int var2 = this.elemInfo[var1];
+                int var3 = this.elemInfo[var1 + 1];
+                if (var3 == 2 && (var2 == 2 || var2 == 2003 || var2 == 3 || var2 == 1003) || var2 == 4 || var2 == 5 || var2 == 2005 || var2 == 1005) {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
+    public int getDimensions() {
+        return this.dim;
+    }
+
+    public double[] getOrdinatesArray() {
+        return this.ordinates;
+    }
+
+    public int[] getElemInfo() {
+        return this.elemInfo;
+    }
+
+    public final int getNumPoints() {
+        if (this.gtype == 1) {
+            return 1;
+        } else if (this.isOrientedMultiPoint()) {
+            int var1 = this.getOrientMultiPointOffset();
+            return this.ordinates.length / (this.dim + var1);
+        } else {
+            return this.ordinates.length / this.dim;
+        }
+    }
+
+    public double[] getFirstPoint() {
+        double[] var1 = new double[this.dim];
+        if (this.gtype == 1 && !Double.isNaN(this.x) && !Double.isNaN(this.y)) {
+            var1[0] = this.x;
+            var1[1] = this.y;
+            if (this.dim > 2) {
+                var1[2] = this.z;
+            }
+
+            return var1;
+        } else {
+            for(int var2 = 0; var2 < this.dim; ++var2) {
+                var1[var2] = this.ordinates[var2];
+            }
+
+            return var1;
+        }
+    }
+
+    public double[] getLastPoint() {
+        double[] var1 = new double[this.dim];
+        if (this.gtype == 1 && !Double.isNaN(this.x) && !Double.isNaN(this.y)) {
+            var1[0] = this.x;
+            var1[1] = this.y;
+            if (this.dim > 2) {
+                var1[2] = this.z;
+            }
+
+            return var1;
+        } else {
+            int var2;
+            if (this.isOrientedPoint()) {
+                for(var2 = 0; var2 < this.dim; ++var2) {
+                    var1[var2] = this.ordinates[var2];
+                }
+
+                return var1;
+            } else {
+                var2 = 0;
+                if (this.isOrientedMultiPoint()) {
+                    var2 = this.getOrientMultiPointOffset();
+                }
+
+                int var3 = this.ordinates.length - this.dim - var2;
+
+                for(int var4 = 0; var4 < this.dim; ++var4) {
+                    var1[var4] = this.ordinates[var3 + var4];
+                }
+
+                return var1;
+            }
+        }
+    }
+
+    public double[] getMBR() {
+        if (this.mbr != null) {
+            return this.mbr;
+        } else if (this.getDimensions() == 3 && this.linfo == 0) {
+            this.mbr = new double[6];
+            if (this.isOptimizedPoint()) {
+                this.mbr[0] = this.x;
+                this.mbr[1] = this.y;
+                this.mbr[2] = this.z;
+                this.mbr[3] = this.x;
+                this.mbr[4] = this.y;
+                this.mbr[5] = this.z;
+                return this.mbr;
+            } else if ((!this.isPoint() || this.elemInfo.length != 3) && !this.isOrientedPoint()) {
+                this.mbr[0] = 1.0D / 0.0;
+                this.mbr[1] = 1.0D / 0.0;
+                this.mbr[2] = 1.0D / 0.0;
+                this.mbr[3] = -1.0D / 0.0;
+                this.mbr[4] = -1.0D / 0.0;
+                this.mbr[5] = -1.0D / 0.0;
+                int var10;
+                int var12;
+                if (this.isOrientedMultiPoint()) {
+                    var10 = this.ordinates.length / (2 * this.dim);
+                    var12 = this.getOrientMultiPointOffset();
+
+                    for(int var6 = 0; var6 < var10; ++var6) {
+                        expandMBR(this.mbr, this.ordinates[var6 * (this.dim + var12)], this.ordinates[var6 * (this.dim + var12) + 1], this.ordinates[var6 * (this.dim + var12) + 2]);
+                    }
+
+                    return this.mbr;
+                } else {
+                    int[] var9 = new int[this.elemInfo.length];
+                    double[] var11 = new double[this.ordinates.length];
+
+                    for(var10 = 0; var10 < this.ordinates.length; ++var10) {
+                        var11[var10] = this.ordinates[var10];
+                    }
+
+                    for(var10 = 0; var10 < this.elemInfo.length; ++var10) {
+                        var9[var10] = this.elemInfo[var10];
+                    }
+
+                    J3D_Geometry var8 = new J3D_Geometry(this.gtype, this.srid, var9, var11);
+                    double[][] var13 = new double[3][2];
+                    var13 = J3D_Geometry.getMBH(var8);
+
+                    for(var12 = 0; var12 < 3; ++var12) {
+                        this.mbr[var12] = var13[var12][0];
+                        this.mbr[var12 + 3] = var13[var12][1];
+                    }
+
+                    return this.mbr;
+                }
+            } else {
+                this.mbr[0] = this.ordinates[0];
+                this.mbr[1] = this.ordinates[1];
+                this.mbr[2] = this.ordinates[2];
+                this.mbr[3] = this.ordinates[0];
+                this.mbr[4] = this.ordinates[1];
+                this.mbr[5] = this.ordinates[2];
+                return this.mbr;
+            }
+        } else {
+            this.mbr = new double[4];
+            if (this.isOptimizedPoint()) {
+                this.mbr[0] = this.x;
+                this.mbr[1] = this.y;
+                this.mbr[2] = this.x;
+                this.mbr[3] = this.y;
+                return this.mbr;
+            } else if ((!this.isPoint() || this.elemInfo.length != 3) && !this.isOrientedPoint()) {
+                if (!this.isRectangle() && !this.isGeodeticMBR()) {
+                    this.mbr[0] = 1.0D / 0.0;
+                    this.mbr[1] = 1.0D / 0.0;
+                    this.mbr[2] = -1.0D / 0.0;
+                    this.mbr[3] = -1.0D / 0.0;
+                    int var2;
+                    int var7;
+                    if (this.isMultiPoint() && this.elemInfo.length == 3) {
+                        var7 = this.elemInfo[2];
+
+                        for(var2 = 0; var2 < var7; ++var2) {
+                            expandMBR(this.mbr, this.ordinates[var2 * this.dim], this.ordinates[var2 * this.dim + 1]);
+                        }
+
+                        return this.mbr;
+                    } else {
+                        int var3;
+                        if (this.isOrientedMultiPoint()) {
+                            var7 = this.ordinates.length / (2 * this.dim);
+                            var2 = this.getOrientMultiPointOffset();
+
+                            for(var3 = 0; var3 < var7; ++var3) {
+                                expandMBR(this.mbr, this.ordinates[var3 * (this.dim + var2)], this.ordinates[var3 * (this.dim + var2) + 1]);
+                            }
+
+                            return this.mbr;
+                        } else {
+                            JGeometry.ElementIterator var1 = new JGeometry.ElementIterator(this);
+
+                            while(var1.next()) {
+                                var2 = var1.ord_offset;
+
+                                for(var3 = 0; var3 < var1.nCoord; ++var3) {
+                                    double[] var4;
+                                    if (var1.eitpr == 2) {
+                                        if (var2 + var3 * this.dim >= var1.next_ord_offset || var1.lastElem && var2 + var3 * this.dim >= var1.next_ord_offset - this.dim || var3 >= var1.nCoord - 1) {
+                                            break;
+                                        }
+
+                                        var4 = computeArcMBR(this.ordinates[var2 + var3 * this.dim], this.ordinates[var2 + var3 * this.dim + 1], this.ordinates[var2 + (var3 + 1) * this.dim], this.ordinates[var2 + (var3 + 1) * this.dim + 1], this.ordinates[var2 + (var3 + 2) * this.dim], this.ordinates[var2 + (var3 + 2) * this.dim + 1]);
+                                        this.expandMBR(this.mbr, var4, 2);
+                                        ++var3;
+                                    } else if (var1.eitpr == 4) {
+                                        if (var2 + var3 * this.dim >= var1.next_ord_offset || var1.lastElem && var2 + var3 * this.dim >= var1.next_ord_offset - this.dim) {
+                                            break;
+                                        }
+
+                                        var4 = computeArc(this.ordinates[var2 + var3 * this.dim], this.ordinates[var2 + var3 * this.dim + 1], this.ordinates[var2 + (var3 + 1) * this.dim], this.ordinates[var2 + (var3 + 1) * this.dim + 1], this.ordinates[var2 + (var3 + 2) * this.dim], this.ordinates[var2 + (var3 + 2) * this.dim + 1]);
+                                        double[] var5 = new double[]{var4[0] - var4[2], var4[1] - var4[2], var4[0] + var4[2], var4[1] + var4[2]};
+                                        this.expandMBR(this.mbr, var5, 2);
+                                        var3 += 2;
+                                    } else {
+                                        expandMBR(this.mbr, this.ordinates[var2 + var3 * this.dim], this.ordinates[var2 + var3 * this.dim + 1]);
+                                    }
+                                }
+                            }
+
+                            return this.mbr;
+                        }
+                    }
+                } else {
+                    this.mbr[0] = Math.min(this.ordinates[0], this.ordinates[2]);
+                    this.mbr[1] = Math.min(this.ordinates[1], this.ordinates[3]);
+                    this.mbr[2] = Math.max(this.ordinates[0], this.ordinates[2]);
+                    this.mbr[3] = Math.max(this.ordinates[1], this.ordinates[3]);
+                    return this.mbr;
+                }
+            } else {
+                this.mbr[0] = this.ordinates[0];
+                this.mbr[1] = this.ordinates[1];
+                this.mbr[2] = this.ordinates[0];
+                this.mbr[3] = this.ordinates[1];
+                return this.mbr;
+            }
+        }
+    }
+
+    public Object[] getOrdinatesOfElements() {
+        ArrayList var1 = new ArrayList();
+        int var2 = 0;
+        if (this.isOrientedMultiPoint()) {
+            var2 = this.getOrientMultiPointOffset();
+        }
+
+        JGeometry.ElementIterator var3 = new JGeometry.ElementIterator(this);
+
+        while(var3.next()) {
+            int var4 = var3.ord_offset;
+            double[] var5 = new double[var3.nCoord * this.dim];
+
+            for(int var6 = 0; var6 < var3.nCoord; ++var6) {
+                for(int var7 = 0; var7 < this.dim; ++var7) {
+                    var5[var6 * this.dim + var7] = this.ordinates[var4 + var6 * (this.dim + var2) + var7];
+                }
+            }
+
+            var1.add(var5);
+        }
+
+        return var1.toArray();
+    }
+
+    protected double[] getOrdinatesOfElement(int var1, int var2) {
+        double[] var3 = new double[var2 - var1];
+        int var4 = 0;
+
+        for(int var5 = var1; var5 < var2; ++var5) {
+            var3[var4] = this.ordinates[var5];
+            ++var4;
+        }
+
+        return var3;
+    }
+
+    protected int[] getElemInfoOfElement(int var1, int var2) {
+        int[] var3 = new int[var2 - var1];
+        int var4 = 0;
+        int var5 = this.elemInfo[var1] - 1;
+
+        for(int var6 = var1; var6 < var2; var6 += 3) {
+            var3[var4] = this.elemInfo[var6] - var5;
+            var3[var4 + 1] = this.elemInfo[var6 + 1];
+            var3[var4 + 2] = this.elemInfo[var6 + 2];
+            var4 += 3;
+        }
+
+        return var3;
+    }
+
+    protected JGeometry makeElementGeometry(int var1, int var2, int var3, int var4, int var5) {
+        int[] var6 = new int[var3 - var2];
+        var6 = this.getElemInfoOfElement(var2, var3);
+        double[] var7 = new double[var5 - var4];
+        var7 = this.getOrdinatesOfElement(var4, var5);
+        JGeometry var8 = new JGeometry(var1, this.srid, var6, var7);
+        return var8;
+    }
+
+    public JGeometry getElementAt(int var1) {
+        if (var1 >= 1) {
+            JGeometry[] var2 = this.getElements(var1);
+            return var2 != null ? var2[0] : null;
+        } else {
+            return null;
+        }
+    }
+
+    public JGeometry[] getElements() {
+        JGeometry[] var1 = this.getElements(-1);
+        return var1;
+    }
+
+    protected JGeometry[] getElements(int var1) {
+        ArrayList var2 = new ArrayList();
+        JGeometry var3 = null;
+        int var4 = 0;
+        if (this.gtype != 1 && this.gtype != 2 && this.gtype != 3) {
+            if (this.gtype == 6 || this.gtype == 7 || this.gtype == 4 || this.gtype == 5) {
+                if (this.elemInfo == null || this.ordinates == null) {
+                    return null;
+                }
+
+                boolean var5 = false;
+                boolean var6 = false;
+                boolean var7 = false;
+                int var8 = 0;
+
+                for(int var9 = 0; var9 < this.elemInfo.length; var9 += 3) {
+                    byte var10;
+                    int var17;
+                    if (this.elemInfo[var9 + 1] == 2) {
+                        ++var4;
+                        if (var4 == var1 || var1 == -1) {
+                            var10 = 2;
+                            var17 = this.elemInfo[var9] - 1;
+                            if (var9 + 3 < this.elemInfo.length) {
+                                var8 = this.elemInfo[var9 + 3] - 1;
+                            } else {
+                                var8 = this.ordinates.length;
+                            }
+
+                            var3 = this.makeElementGeometry(var10, var9, var9 + 3, var17, var8);
+                            var3.dim = this.dim;
+                            var3.linfo = this.linfo;
+                            var2.add(var3);
+                        }
+
+                        if (var4 == var1) {
+                            var9 = this.elemInfo.length;
+                        }
+                    } else {
+                        int var18;
+                        int var19;
+                        byte var20;
+                        if (this.elemInfo[var9 + 1] == 4) {
+                            ++var4;
+                            var19 = this.elemInfo[var9 + 2];
+                            if (var4 == var1 || var1 == -1) {
+                                var20 = 2;
+                                var17 = this.elemInfo[var9] - 1;
+                                if (var9 + 3 + 3 * var19 < this.elemInfo.length) {
+                                    var8 = this.elemInfo[var9 + 3 + 3 * var19] - 1;
+                                    var18 = var9 + 3 + 3 * var19;
+                                } else {
+                                    var8 = this.ordinates.length;
+                                    var18 = this.elemInfo.length;
+                                }
+
+                                var3 = this.makeElementGeometry(var20, var9, var18, var17, var8);
+                                var3.dim = this.dim;
+                                var3.linfo = this.linfo;
+                                var2.add(var3);
+                            }
+
+                            if (var4 == var1) {
+                                var9 = this.elemInfo.length;
+                            } else {
+                                var9 += 3 * var19;
+                            }
+                        } else {
+                            boolean var12;
+                            int var13;
+                            if (this.elemInfo[var9 + 1] != 1003 && this.elemInfo[var9 + 1] != 1005 && this.elemInfo[var9 + 1] != 3 && this.elemInfo[var9 + 1] != 5) {
+                                if (this.elemInfo[var9 + 1] == 1) {
+                                    var19 = this.elemInfo[var9 + 2];
+                                    var20 = 1;
+                                    var17 = this.elemInfo[var9] - 1;
+                                    var12 = false;
+                                    if (var19 < 1) {
+                                        return null;
+                                    }
+
+                                    if (var9 + 3 < this.elemInfo.length) {
+                                        if (var19 == 1 && this.elemInfo[var9 + 4] == 1 && this.elemInfo[var9 + 5] == 0) {
+                                            var12 = true;
+                                        }
+
+                                        if (var12 && var9 + 6 < this.elemInfo.length) {
+                                            var8 = this.elemInfo[var9 + 6] - 1;
+                                        } else if (var12) {
+                                            var8 = this.ordinates.length;
+                                        }
+                                    }
+
+                                    for(var13 = 0; var13 < var19; ++var13) {
+                                        ++var4;
+                                        if (this.dim == 2 && !var12) {
+                                            if (var4 == var1 || var1 == -1) {
+                                                var3 = new JGeometry(this.ordinates[var17], this.ordinates[var17 + 1], this.srid);
+                                                var2.add(var3);
+                                            }
+
+                                            if (var4 == var1) {
+                                                var13 = var19;
+                                                var9 = this.elemInfo.length;
+                                            } else {
+                                                var17 += 2;
+                                            }
+                                        } else if (this.dim == 3 && !var12) {
+                                            if (var4 == var1 || var1 == -1) {
+                                                var3 = new JGeometry(this.ordinates[var17], this.ordinates[var17 + 1], this.ordinates[var17 + 2], this.srid);
+                                                var2.add(var3);
+                                            }
+
+                                            if (var4 == var1) {
+                                                var13 = var19;
+                                                var9 = this.elemInfo.length;
+                                            } else {
+                                                var17 += 3;
+                                            }
+                                        } else if (!var12) {
+                                            if (var4 == var1 || var1 == -1) {
+                                                int[] var22 = new int[]{1, 1, 1};
+                                                double[] var23 = new double[this.dim];
+                                                var23 = this.getOrdinatesOfElement(var17, var17 + this.dim);
+                                                var3 = new JGeometry(var20, this.srid, var22, var23);
+                                                var3.dim = this.dim;
+                                                var2.add(var3);
+                                            }
+
+                                            if (var4 == var1) {
+                                                var13 = var19;
+                                                var9 = this.elemInfo.length;
+                                            } else {
+                                                var17 += this.dim;
+                                            }
+                                        } else if (var12) {
+                                            if (var4 == var1 || var1 == -1) {
+                                                var3 = this.makeElementGeometry(var20, var9, var9 + 6, var17, var8);
+                                                var3.dim = this.dim;
+                                                var2.add(var3);
+                                            }
+
+                                            if (var4 == var1) {
+                                                var13 = var19;
+                                                var9 = this.elemInfo.length;
+                                            } else {
+                                                var9 += 3;
+                                            }
+                                        }
+                                    }
+                                } else {
+                                    var9 += 3;
+                                }
+                            } else {
+                                ++var4;
+                                var10 = 3;
+                                int var11 = this.elemInfo[var9 + 1];
+                                var17 = this.elemInfo[var9] - 1;
+                                var12 = false;
+                                if ((var11 == 1003 || var11 == 3) && var9 + 3 < this.elemInfo.length) {
+                                    var8 = this.elemInfo[var9 + 3] - 1;
+                                    var18 = var9 + 3;
+                                    var12 = true;
+                                } else if ((var11 == 1005 || var11 == 5) && var9 + 3 + 3 * this.elemInfo[var9 + 2] < this.elemInfo.length) {
+                                    var13 = this.elemInfo[var9 + 2];
+                                    var8 = this.elemInfo[var9 + 3 + 3 * var13] - 1;
+                                    var18 = var9 + 3 + 3 * var13;
+                                    var9 += 3 * var13;
+                                    var12 = true;
+                                } else {
+                                    var8 = this.ordinates.length;
+                                    var18 = this.elemInfo.length;
+                                }
+
+                                boolean var21 = true;
+
+                                while(var12 && var21) {
+                                    if (var9 + 3 + 1 < this.elemInfo.length) {
+                                        int var14 = this.elemInfo[var9 + 3 + 1];
+                                        if (var14 == 2003) {
+                                            var9 += 3;
+                                            if (var9 + 3 + 1 > this.elemInfo.length) {
+                                                var8 = this.ordinates.length;
+                                                var18 = this.elemInfo.length;
+                                                var21 = false;
+                                            } else {
+                                                var8 = this.elemInfo[var9 + 3] - 1;
+                                                var18 = var9 + 3;
+                                                var21 = true;
+                                            }
+                                        } else if (var14 == 2005) {
+                                            var9 += 3;
+                                            int var15 = this.elemInfo[var9 + 2];
+                                            if (var9 + 3 + 3 * var15 < this.elemInfo.length) {
+                                                var8 = this.elemInfo[var9 + 3 + 3 * var15] - 1;
+                                                var18 = var9 + 3 + 3 * var15;
+                                                var21 = true;
+                                            } else {
+                                                var8 = this.ordinates.length;
+                                                var18 = this.elemInfo.length;
+                                                var21 = false;
+                                            }
+
+                                            var9 += 3 * var15;
+                                        } else {
+                                            var21 = false;
+                                        }
+                                    } else {
+                                        var12 = false;
+                                    }
+                                }
+
+                                if (var4 == var1 || var1 == -1) {
+                                    var3 = this.makeElementGeometry(var10, var9, var18, var17, var8);
+                                    var3.dim = this.dim;
+                                    var2.add(var3);
+                                }
+
+                                if (var4 == var1) {
+                                    var9 = this.elemInfo.length;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        } else {
+            var2.add(this);
+            ++var4;
+        }
+
+        if (var1 <= var4 && var4 != 0) {
+            JGeometry[] var16 = new JGeometry[var2.size()];
+            return (JGeometry[])((JGeometry[])var2.toArray(var16));
+        } else {
+            return null;
+        }
+    }
+
+    public int getOrientMultiPointOffset() {
+        byte var1 = 0;
+        if (this.isOrientedMultiPoint()) {
+            if (this.dim != 2 && (this.dim != 3 || this.linfo != 3)) {
+                var1 = 3;
+            } else {
+                var1 = 2;
+            }
+        }
+
+        return var1;
+    }
+
+    public final Shape createShape() {
+        GeneralPath var1 = null;
+        if (!this.isRectangle() && !this.isGeodeticMBR()) {
+            if (this.isCircle()) {
+                double[] var12 = computeArc(this.ordinates[0], this.ordinates[1], this.ordinates[this.dim], this.ordinates[this.dim + 1], this.ordinates[2 * this.dim], this.ordinates[2 * this.dim + 1]);
+                java.awt.geom.Ellipse2D.Double var13 = new java.awt.geom.Ellipse2D.Double(var12[0] - var12[2], var12[1] - var12[2], 2.0D * var12[2], 2.0D * var12[2]);
+                return var13;
+            } else {
+                int var10 = 0;
+                if (this.isOrientedMultiPoint()) {
+                    var10 = this.getOrientMultiPointOffset();
+                }
+
+                JGeometry.ElementIterator var11 = new JGeometry.ElementIterator(this);
+
+                while(var11.next()) {
+                    if (var1 == null) {
+                        var1 = new GeneralPath();
+                    }
+
+                    int var14 = var11.ord_offset;
+
+                    for(int var15 = 0; var15 < var11.nCoord; ++var15) {
+                        if (var11.etype != 1 && var11.eitpr == 1) {
+                            if (var15 != 0 || var11.isCompound && !var11.isFirstElemOfCompound) {
+                                var1.lineTo((float)this.ordinates[var14 + var15 * (this.dim + var10)], (float)this.ordinates[var14 + var15 * (this.dim + var10) + 1]);
+                            } else {
+                                var1.moveTo((float)this.ordinates[var14 + var15 * (this.dim + var10)], (float)this.ordinates[var14 + var15 * (this.dim + var10) + 1]);
+                            }
+
+                            if (var15 >= var11.nCoord - 1 && var11.top_etype == 3) {
+                                var1.closePath();
+                            }
+                        } else {
+                            double[] var16;
+                            if (var11.eitpr == 2) {
+                                if (var11.etype == 1) {
+                                    return null;
+                                }
+
+                                if (var14 + var15 * this.dim >= var11.next_ord_offset || var11.lastElem && var14 + var15 * this.dim >= var11.next_ord_offset - this.dim || (var11.next_ord_offset - (var14 + var15 * this.dim)) / this.dim < 2) {
+                                    break;
+                                }
+
+                                var16 = new double[]{this.ordinates[var14 + var15 * this.dim], this.ordinates[var14 + var15 * this.dim + 1], this.ordinates[var14 + (var15 + 1) * this.dim], this.ordinates[var14 + (var15 + 1) * this.dim + 1], this.ordinates[var14 + (var15 + 2) * this.dim], this.ordinates[var14 + (var15 + 2) * this.dim + 1]};
+                                double[] var18 = reFormulateArc(var16);
+                                if (var15 != 0 || var11.isCompound && !var11.isFirstElemOfCompound) {
+                                    var1.lineTo((float)this.ordinates[var14 + var15 * this.dim], (float)this.ordinates[var14 + var15 * this.dim + 1]);
+                                } else {
+                                    var1.moveTo((float)this.ordinates[var14 + var15 * this.dim], (float)this.ordinates[var14 + var15 * this.dim + 1]);
+                                }
+
+                                java.awt.geom.Arc2D.Double var19 = new java.awt.geom.Arc2D.Double(var18[0] - var18[2], var18[1] - var18[2], var18[2] * 2.0D, var18[2] * 2.0D, var18[3] / 3.141592653589793D * 180.0D, (var18[5] - var18[3]) / 3.141592653589793D * 180.0D, 0);
+                                var1.append(var19, true);
+                                ++var15;
+                                if (var15 >= var11.nCoord - 1 && (var11.top_etype == 3 || var11.top_etype == 5)) {
+                                    var1.closePath();
+                                }
+                            } else if (var11.eitpr == 3) {
+                                float var6 = (float)this.ordinates[var14 + 0];
+                                float var7 = (float)this.ordinates[var14 + 1];
+                                float var8 = (float)this.ordinates[var14 + this.dim];
+                                float var9 = (float)this.ordinates[var14 + this.dim + 1];
+                                if (var11.original_etype < 2000) {
+                                    var1.moveTo(var6, var7);
+                                    var1.lineTo(var8, var7);
+                                    var1.lineTo(var8, var9);
+                                    var1.lineTo(var6, var9);
+                                    var1.closePath();
+                                } else {
+                                    var1.moveTo(var6, var7);
+                                    var1.lineTo(var6, var9);
+                                    var1.lineTo(var8, var9);
+                                    var1.lineTo(var8, var7);
+                                    var1.closePath();
+                                }
+
+                                ++var15;
+                            } else if (var11.eitpr == 4) {
+                                if (var14 + var15 * this.dim >= var11.next_ord_offset || var11.lastElem && var14 + var15 * this.dim >= var11.next_ord_offset - this.dim) {
+                                    break;
+                                }
+
+                                var16 = computeArc(this.ordinates[var14 + var15 * this.dim], this.ordinates[var14 + var15 * this.dim + 1], this.ordinates[var14 + (var15 + 1) * this.dim], this.ordinates[var14 + (var15 + 1) * this.dim + 1], this.ordinates[var14 + (var15 + 2) * this.dim], this.ordinates[var14 + (var15 + 2) * this.dim + 1]);
+                                java.awt.geom.Ellipse2D.Double var17 = new java.awt.geom.Ellipse2D.Double(var16[0] - var16[2], var16[1] - var16[2], 2.0D * var16[2], 2.0D * var16[2]);
+                                var1.append(var17, false);
+                                if (var11.original_etype > 2000) {
+                                    var1.setWindingRule(0);
+                                }
+
+                                var15 += 2;
+                            }
+                        }
+                    }
+                }
+
+                return var1;
+            }
+        } else {
+            float var2 = (float)this.ordinates[0];
+            float var3 = (float)this.ordinates[1];
+            float var4 = (float)this.ordinates[2];
+            float var5 = (float)this.ordinates[3];
+            return new java.awt.geom.Rectangle2D.Double((double)var2, (double)Math.min(var3, var5), (double)(var4 - var2), (double)Math.abs(var5 - var3));
+        }
+    }
+
+    public final Shape createShape(AffineTransform var1) {
+        return this.createShape(var1, false);
+    }
+
+    public final Shape createShape(AffineTransform var1, boolean var2) {
+        if (var1 == null) {
+            return this.createShape();
+        } else {
+            java.awt.geom.Point2D.Double var3 = new java.awt.geom.Point2D.Double();
+            java.awt.geom.Point2D.Double var4 = new java.awt.geom.Point2D.Double();
+            GeneralPath var5 = null;
+            if (!this.isRectangle() && !this.isGeodeticMBR()) {
+                double[] var29;
+                if (this.isCircle()) {
+                    var3.setLocation(this.ordinates[0], this.ordinates[1]);
+                    var1.transform(var3, var4);
+                    double var24 = var4.getX();
+                    double var26 = var4.getY();
+                    var3.setLocation(this.ordinates[this.dim], this.ordinates[this.dim + 1]);
+                    var1.transform(var3, var4);
+                    double var10 = var4.getX();
+                    double var28 = var4.getY();
+                    var3.setLocation(this.ordinates[2 * this.dim], this.ordinates[2 * this.dim + 1]);
+                    var1.transform(var3, var4);
+                    double var14 = var4.getX();
+                    double var16 = var4.getY();
+                    var29 = computeArc(var24, var26, var10, var28, var14, var16);
+                    java.awt.geom.Ellipse2D.Double var32 = new java.awt.geom.Ellipse2D.Double(var29[0] - var29[2], var29[1] - var29[2], 2.0D * var29[2], 2.0D * var29[2]);
+                    return var32;
+                } else {
+                    int var23 = 0;
+                    if (this.isOrientedMultiPoint()) {
+                        var23 = this.getOrientMultiPointOffset();
+                    }
+
+                    double var25 = 0.0D;
+                    double var27 = 0.0D;
+                    JGeometry.ElementIterator var11 = new JGeometry.ElementIterator(this);
+
+                    while(var11.next()) {
+                        if (var5 == null) {
+                            var5 = new GeneralPath();
+                        }
+
+                        int var12 = var11.ord_offset;
+                        double var13 = 1.7976931348623157E308D;
+                        double var15 = 1.7976931348623157E308D;
+
+                        for(int var17 = 0; var17 < var11.nCoord; ++var17) {
+                            if (var11.etype != 1 && var11.eitpr == 1) {
+                                var25 = this.ordinates[var12 + var17 * (this.dim + var23)];
+                                var27 = this.ordinates[var12 + var17 * (this.dim + var23) + 1];
+                                var3.setLocation(var25, var27);
+                                var1.transform(var3, var4);
+                                var25 = var4.getX();
+                                var27 = var4.getY();
+                                if (var17 != 0 || var11.isCompound && !var11.isFirstElemOfCompound) {
+                                    double var30 = var25 - var13;
+                                    double var35 = var27 - var15;
+                                    boolean var22 = var30 < -0.25D || var30 > 0.25D || var35 < -0.25D || var35 > 0.25D;
+                                    if (!var2 || var22) {
+                                        var13 = var25;
+                                        var15 = var27;
+                                        var5.lineTo((float)var25, (float)var27);
+                                    }
+                                } else {
+                                    var13 = var25;
+                                    var15 = var27;
+                                    var5.moveTo((float)var25, (float)var27);
+                                }
+
+                                if (var17 >= var11.nCoord - 1 && var11.top_etype == 3) {
+                                    var5.closePath();
+                                }
+                            } else {
+                                double[] var31;
+                                if (var11.eitpr == 2) {
+                                    if (var11.etype == 1) {
+                                        return null;
+                                    }
+
+                                    if (var12 + var17 * this.dim >= var11.next_ord_offset || var11.lastElem && var12 + var17 * this.dim >= var11.next_ord_offset - this.dim || (var11.next_ord_offset - (var12 + var17 * this.dim)) / this.dim < 2) {
+                                        break;
+                                    }
+
+                                    var29 = new double[]{this.ordinates[var12 + var17 * this.dim], this.ordinates[var12 + var17 * this.dim + 1], this.ordinates[var12 + (var17 + 1) * this.dim], this.ordinates[var12 + (var17 + 1) * this.dim + 1], this.ordinates[var12 + (var17 + 2) * this.dim], this.ordinates[var12 + (var17 + 2) * this.dim + 1]};
+                                    var1.transform(var29, 0, var29, 0, 3);
+                                    var31 = reFormulateArc(var29);
+                                    if (var17 == 0 && (!var11.isCompound || var11.isFirstElemOfCompound)) {
+                                        var5.moveTo((float)var29[0], (float)var29[1]);
+                                    } else {
+                                        var5.lineTo((float)var29[0], (float)var29[1]);
+                                    }
+
+                                    java.awt.geom.Arc2D.Double var34 = new java.awt.geom.Arc2D.Double(var31[0] - var31[2], var31[1] - var31[2], var31[2] * 2.0D, var31[2] * 2.0D, var31[3] / 3.141592653589793D * 180.0D, (var31[5] - var31[3]) / 3.141592653589793D * 180.0D, 0);
+                                    var5.append(var34, true);
+                                    ++var17;
+                                    if (var17 >= var11.nCoord - 1 && (var11.top_etype == 3 || var11.top_etype == 5)) {
+                                        var5.closePath();
+                                    }
+                                } else if (var11.eitpr == 3) {
+                                    var3.setLocation(this.ordinates[var12 + 0], this.ordinates[var12 + 1]);
+                                    var1.transform(var3, var4);
+                                    float var18 = (float)var4.getX();
+                                    float var19 = (float)var4.getY();
+                                    var3.setLocation(this.ordinates[var12 + this.dim], this.ordinates[var12 + this.dim + 1]);
+                                    var1.transform(var3, var4);
+                                    float var20 = (float)var4.getX();
+                                    float var21 = (float)var4.getY();
+                                    if (var11.original_etype < 2000) {
+                                        var5.moveTo(var18, var19);
+                                        var5.lineTo(var20, var19);
+                                        var5.lineTo(var20, var21);
+                                        var5.lineTo(var18, var21);
+                                        var5.closePath();
+                                    } else {
+                                        var5.moveTo(var18, var19);
+                                        var5.lineTo(var18, var21);
+                                        var5.lineTo(var20, var21);
+                                        var5.lineTo(var20, var19);
+                                        var5.closePath();
+                                    }
+
+                                    ++var17;
+                                } else if (var11.eitpr == 4) {
+                                    if (var12 + var17 * this.dim >= var11.next_ord_offset || var11.lastElem && var12 + var17 * this.dim >= var11.next_ord_offset - this.dim) {
+                                        break;
+                                    }
+
+                                    var29 = new double[]{this.ordinates[var12 + var17 * this.dim], this.ordinates[var12 + var17 * this.dim + 1], this.ordinates[var12 + (var17 + 1) * this.dim], this.ordinates[var12 + (var17 + 1) * this.dim + 1], this.ordinates[var12 + (var17 + 2) * this.dim], this.ordinates[var12 + (var17 + 2) * this.dim + 1]};
+                                    var1.transform(var29, 0, var29, 0, 3);
+                                    var31 = computeArc(var29[0], var29[1], var29[2], var29[3], var29[4], var29[5]);
+                                    java.awt.geom.Ellipse2D.Double var33 = new java.awt.geom.Ellipse2D.Double(var31[0] - var31[2], var31[1] - var31[2], 2.0D * var31[2], 2.0D * var31[2]);
+                                    var5.append(var33, false);
+                                    if (var11.original_etype > 2000) {
+                                        var5.setWindingRule(0);
+                                    }
+
+                                    var17 += 2;
+                                }
+                            }
+                        }
+                    }
+
+                    return var5;
+                }
+            } else {
+                var3.setLocation(this.ordinates[0], this.ordinates[1]);
+                var1.transform(var3, var4);
+                float var6 = (float)var4.getX();
+                float var7 = (float)var4.getY();
+                var3.setLocation(this.ordinates[2], this.ordinates[3]);
+                var1.transform(var3, var4);
+                float var8 = (float)var4.getX();
+                float var9 = (float)var4.getY();
+                return new java.awt.geom.Rectangle2D.Double((double)var6, (double)Math.min(var7, var9), (double)(var8 - var6), (double)Math.abs(var9 - var7));
+            }
+        }
+    }
+
+    public static final JGeometry load(STRUCT var0) throws SQLException {
+        Datum[] var1 = var0.getOracleAttributes();
+        int var2 = var1[0] != null ? var1[0].intValue() : 0;
+        int var3 = var1[1] != null ? var1[1].intValue() : 0;
+        STRUCT var4 = (STRUCT)var1[2];
+        double var5 = 0.0D / 0.0;
+        double var7 = 0.0D / 0.0;
+        double var9 = 0.0D / 0.0;
+        if (var4 != null) {
+            Datum[] var11 = (Datum[])var4.getOracleAttributes();
+            if (var11[0] != null && var11[1] != null) {
+                var5 = var11[0].doubleValue();
+                var7 = var11[1].doubleValue();
+            }
+
+            if (var11[2] != null) {
+                var9 = var11[2].doubleValue();
+            }
+        }
+
+        int[] var18 = var1[3] != null ? ((ARRAY)var1[3]).getIntArray() : null;
+        double[] var12 = null;
+        if (var1[4] != null) {
+            if (var2 % 1000 / 100 == 0) {
+                var12 = ((ARRAY)var1[4]).getDoubleArray();
+            } else {
+                int var13 = var2 % 1000 / 100;
+                int var14 = var2 / 1000 > 0 ? var2 / 1000 : 2;
+                Datum[] var15 = ((ARRAY)var1[4]).getOracleArray();
+                int var16 = var15.length;
+                var12 = new double[var16];
+                if (var14 == 2 || (var14 != 3 || var14 != var13) && (var14 != 4 || var13 != 3 && var13 != 4)) {
+                    throw new SQLException("An invalid sdo_gtype is found");
+                }
+
+                for(int var17 = 0; var17 < var16; ++var17) {
+                    if (var15[var17] == null && var17 % var14 != var13 - 1) {
+                        throw new SQLException("An invalid null value is found in LRS sdo_ordinates");
+                    }
+
+                    if (var15[var17] != null) {
+                        var12[var17] = var15[var17].doubleValue();
+                    } else {
+                        var12[var17] = 0.0D / 0.0;
+                    }
+                }
+            }
+        }
+
+        if (var12 != null && var18 != null) {
+            return new JGeometry(var2, var3, var5, var7, var9, var18, var12);
+        } else if (!Double.isNaN(var5) && !Double.isNaN(var7)) {
+            if (!Double.isNaN(var9)) {
+                return new JGeometry(var5, var7, var9, var3);
+            } else {
+                return new JGeometry(var5, var7, var3);
+            }
+        } else {
+            return null;
+        }
+    }
+
+    private static boolean etype0_exists(int[] var0) {
+        boolean var1 = false;
+
+        for(int var2 = 0; var2 < var0.length / 3; ++var2) {
+            if (var0[3 * var2 + 1] == 0) {
+                var1 = true;
+                break;
+            }
+        }
+
+        return var1;
+    }
+
+    private static boolean ordOffset0_exists(int[] var0) {
+        boolean var1 = false;
+
+        for(int var2 = 0; var2 < var0.length / 3; ++var2) {
+            if (var0[3 * var2] < 1) {
+                var1 = true;
+                break;
+            }
+        }
+
+        return var1;
+    }
+
+    protected static void remove_etype0(int[] var0, double[] var1, ArrayList var2, ArrayList var3) {
+        int[] var4 = new int[var0.length];
+        double[] var5 = new double[var1.length];
+        boolean var6 = false;
+        boolean var7 = false;
+        int var8 = 0;
+        int var9 = 0;
+        int var10 = 0;
+        boolean var11 = false;
+        boolean var12 = false;
+
+        for(int var14 = 0; var14 < var0.length / 3; ++var14) {
+            int var16;
+            int var17;
+            if (var0[3 * var14 + 1] == 0) {
+                var16 = var0[3 * var14] - 1;
+                if (3 * (var14 + 1) <= var0.length - 1) {
+                    var17 = var0[3 * (var14 + 1)] - 2;
+                } else {
+                    var17 = var1.length - 1;
+                }
+
+                var10 += var17 - var16 + 1;
+            } else {
+                var16 = var0[3 * var14] - 1;
+                if (3 * (var14 + 1) <= var0.length - 1) {
+                    var17 = var0[3 * (var14 + 1)] - 2;
+                } else {
+                    var17 = var1.length - 1;
+                }
+
+                int var15;
+                for(var15 = var16; var15 <= var17; ++var15) {
+                    var5[var9] = var1[var15];
+                    ++var9;
+                }
+
+                var4[var8] = var0[3 * var14] - var10;
+                ++var8;
+
+                for(var15 = 1; var15 < 3; ++var15) {
+                    var4[var8] = var0[3 * var14 + var15];
+                    ++var8;
+                }
+            }
+        }
+
+        int var13;
+        for(var13 = 0; var13 < var8; ++var13) {
+            var2.add(var4[var13]);
+        }
+
+        for(var13 = 0; var13 < var9; ++var13) {
+            var3.add(var5[var13]);
+        }
+
+    }
+
+    static final JGeometry loadAndReorient(STRUCT var0) throws SQLException {
+        JGeometry var1 = load(var0);
+        if (var1 == null) {
+            return null;
+        } else {
+            if ((var1.gtype == 2 || var1.gtype == 6 || var1.gtype == 4) && !var1.hasCircularArcs()) {
+                var1.reOrientCurves();
+            }
+
+            return var1;
+        }
+    }
+
+    public static STRUCT store(JGeometry var0, Connection var1) throws SQLException {
+        return store((JGeometry)var0, (Connection)var1, (Object[])null);
+    }
+
+    public static STRUCT store(JGeometry var0, Connection var1, boolean var2) throws SQLException {
+        return store(var0, var1, (Object[])null, var2);
+    }
+
+    public static STRUCT store(JGeometry var0, Connection var1, Object[] var2) throws SQLException {
+        return store(var0, var1, var2, false);
+    }
+
+    public static STRUCT store(JGeometry var0, Connection var1, Object[] var2, boolean var3) throws SQLException {
+        StructDescriptor var4 = null;
+        StructDescriptor var5 = null;
+        ArrayDescriptor var6 = null;
+        ArrayDescriptor var7 = null;
+        if (var2 != null && var2.length >= 4) {
+            var4 = (StructDescriptor)var2[0];
+            var5 = (StructDescriptor)var2[1];
+            var6 = (ArrayDescriptor)var2[2];
+            var7 = (ArrayDescriptor)var2[3];
+        } else {
+            if (geomDesc == null) {
+                createDBDescriptors(var1);
+            }
+
+            var4 = geomDesc;
+            var5 = pointDesc;
+            var6 = elemInfoDesc;
+            var7 = ordinatesDesc;
+        }
+
+        if (var4 == null) {
+            throw new SQLException("sdo_geometry descriptor is null.");
+        } else if (var5 == null) {
+            throw new SQLException("sdo_point descriptor is null.");
+        } else if (var6 == null) {
+            throw new SQLException("elem_info descriptor is null.");
+        } else if (var7 == null) {
+            throw new SQLException("ordinates descriptor is null.");
+        } else {
+            NUMBER var8 = new NUMBER(var0.gtype + var0.linfo * 100 + var0.dim * 1000);
+            NUMBER var9 = var0.srid == 0 ? null : new NUMBER(var0.srid);
+            STRUCT var10 = null;
+            NUMBER[] var11;
+            if (var3) {
+                var11 = !Double.isNaN(var0.x) && !Double.isNaN(var0.y) ? new NUMBER[3] : null;
+                if (var11 != null) {
+                    var11[0] = new NUMBER(new BigDecimal(var0.x));
+                    var11[1] = new NUMBER(new BigDecimal(var0.y));
+                    var11[2] = Double.isNaN(var0.z) ? null : new NUMBER(new BigDecimal(var0.z));
+                    var10 = new STRUCT(var5, var1, var11);
+                }
+            } else {
+                var11 = !Double.isNaN(var0.x) && !Double.isNaN(var0.y) ? new NUMBER[3] : null;
+                if (var11 != null) {
+                    var11[0] = new NUMBER(var0.x);
+                    var11[1] = new NUMBER(var0.y);
+                    var11[2] = Double.isNaN(var0.z) ? null : new NUMBER(var0.z);
+                    var10 = new STRUCT(var5, var1, var11);
+                }
+            }
+
+            ARRAY var15 = var0.elemInfo == null ? null : new ARRAY(var6, var1, var0.elemInfo);
+            ARRAY var12;
+            int var14;
+            if (var3) {
+                BigDecimal[] var13 = null;
+                if (var0.ordinates != null) {
+                    var13 = new BigDecimal[var0.ordinates.length];
+                    if (var0.linfo == 0) {
+                        for(var14 = 0; var14 < var0.ordinates.length; ++var14) {
+                            var13[var14] = new BigDecimal(var0.ordinates[var14]);
+                        }
+                    } else {
+                        if (var0.dim == 2 || var0.dim == 3 && var0.linfo != 3 || var0.dim == 4 && var0.linfo != 3 && var0.linfo != 4) {
+                            throw new SQLException("An invalid gtype value for LRS is found");
+                        }
+
+                        for(var14 = 0; var14 < var0.ordinates.length; ++var14) {
+                            if (Double.isNaN(var0.ordinates[var14]) && var14 % var0.dim != var0.linfo - 1) {
+                                throw new SQLException("An invalid Double.NaN is found in LRS ordinates");
+                            }
+
+                            var13[var14] = Double.isNaN(var0.ordinates[var14]) ? null : new BigDecimal(var0.ordinates[var14]);
+                        }
+                    }
+                }
+
+                var12 = var0.ordinates == null ? null : new ARRAY(var7, var1, var13);
+            } else {
+                Double[] var16 = null;
+                if (var0.ordinates != null) {
+                    var16 = new Double[var0.ordinates.length];
+                    if (var0.linfo == 0) {
+                        for(var14 = 0; var14 < var0.ordinates.length; ++var14) {
+                            var16[var14] = new Double(var0.ordinates[var14]);
+                        }
+                    } else {
+                        if (var0.dim == 2 || var0.dim == 3 && var0.linfo != 3 || var0.dim == 4 && var0.linfo != 3 && var0.linfo != 4) {
+                            throw new SQLException("An invalid gtype value for LRS is found");
+                        }
+
+                        for(var14 = 0; var14 < var0.ordinates.length; ++var14) {
+                            if (Double.isNaN(var0.ordinates[var14]) && var14 % var0.dim != var0.linfo - 1) {
+                                throw new SQLException("An invalid Double.NaN is found in LRS ordinates");
+                            }
+
+                            var16[var14] = Double.isNaN(var0.ordinates[var14]) ? null : new Double(var0.ordinates[var14]);
+                        }
+                    }
+                }
+
+                var12 = var0.ordinates == null ? null : new ARRAY(var7, var1, var16);
+            }
+
+            Object[] var17 = new Object[]{var8, var9, var10, var15, var12};
+            return new STRUCT(var4, var1, var17);
+        }
+    }
+
+    public static Object[] getOracleDescriptors(Connection var0) throws SQLException {
+        StructDescriptor var1 = StructDescriptor.createDescriptor("MDSYS.SDO_GEOMETRY", var0);
+        StructDescriptor var2 = StructDescriptor.createDescriptor("MDSYS.SDO_POINT_TYPE", var0);
+        ArrayDescriptor var3 = ArrayDescriptor.createDescriptor("MDSYS.SDO_ELEM_INFO_ARRAY", var0);
+        ArrayDescriptor var4 = ArrayDescriptor.createDescriptor("MDSYS.SDO_ORDINATE_ARRAY", var0);
+        return new Object[]{var1, var2, var3, var4};
+    }
+
+    protected final boolean isOptimizedPoint() {
+        return this.gtype % 100 == 1 && this.ordinates == null && !Double.isNaN(this.x) && !Double.isNaN(this.y);
+    }
+
+    protected static final void createDBDescriptors(Connection var0) throws SQLException {
+        geomDesc = StructDescriptor.createDescriptor("MDSYS.SDO_GEOMETRY", var0);
+        pointDesc = StructDescriptor.createDescriptor("MDSYS.SDO_POINT_TYPE", var0);
+        elemInfoDesc = ArrayDescriptor.createDescriptor("MDSYS.SDO_ELEM_INFO_ARRAY", var0);
+        ordinatesDesc = ArrayDescriptor.createDescriptor("MDSYS.SDO_ORDINATE_ARRAY", var0);
+    }
+
+    protected final boolean isSimpleElement(int var1) {
+        return var1 == 1 || var1 == 2 || var1 % 10 == 3;
+    }
+
+    protected final boolean isCompoundElement(int var1) {
+        return var1 == 4 || var1 % 10 == 5;
+    }
+
+    protected static final void expandMBR(double[] var0, double var1, double var3) {
+        if (var0[0] > var1) {
+            var0[0] = var1;
+        }
+
+        if (var0[1] > var3) {
+            var0[1] = var3;
+        }
+
+        if (var0[2] < var1) {
+            var0[2] = var1;
+        }
+
+        if (var0[3] < var3) {
+            var0[3] = var3;
+        }
+
+    }
+
+    protected static final void expandMBR(double[] var0, double var1, double var3, double var5) {
+        if (var0[0] > var1) {
+            var0[0] = var1;
+        }
+
+        if (var0[1] > var3) {
+            var0[1] = var3;
+        }
+
+        if (var0[2] > var5) {
+            var0[2] = var5;
+        }
+
+        if (var0[3] < var1) {
+            var0[3] = var1;
+        }
+
+        if (var0[4] < var3) {
+            var0[4] = var3;
+        }
+
+        if (var0[5] < var5) {
+            var0[5] = var5;
+        }
+
+    }
+
+    protected final void expandMBR(double[] var1, double[] var2, int var3) {
+        for(int var4 = 0; var4 < var2.length / var3; ++var4) {
+            int var5 = var4 * var3;
+            if (var3 == 2) {
+                expandMBR(var1, var2[var5], var2[var5 + 1]);
+            } else {
+                expandMBR(var1, var2[var5], var2[var5 + 1], var2[var5 + 2]);
+            }
+        }
+
+    }
+
+    protected final void expandMBR(double[] var1, double[] var2, int var3, int var4, int var5) {
+        for(int var6 = 0; var6 < var4 / var5; ++var6) {
+            int var7 = var3 + var6 * var5;
+            if (var5 == 2) {
+                expandMBR(var1, var2[var7], var2[var7 + 1]);
+            } else {
+                expandMBR(var1, var2[var7], var2[var7 + 1], var2[var7 + 2]);
+            }
+        }
+
+    }
+
+    protected void reOrientCurves() {
+    }
+
+    public static final double[] computeArc(double var0, double var2, double var4, double var6, double var8, double var10) {
+        double var25 = var0 - var4;
+        double var27 = var4 - var8;
+        double var29 = var6 - var10;
+        double var31 = var2 - var6;
+        double var33 = var0 + var4;
+        double var35 = var4 + var8;
+        double var37 = var2 + var6;
+        double var39 = var6 + var10;
+        double var41 = var25 * var29 - var27 * var31;
+        if (var41 > -4.9E-323D && var41 < 4.9E-323D) {
+            return null;
+        } else {
+            double[] var43 = new double[6];
+            double var13 = (var29 * var33 * var25 - var31 * var35 * var27 + var31 * var29 * (var31 + var29)) / var41;
+            double var15;
+            if (Math.abs(var6 - var10) < 5.0E-8D) {
+                var15 = (var37 * var31 + (var33 - var13) * var25) / var31;
+            } else {
+                var15 = (var39 * var29 + (var35 - var13) * var27) / var29;
+            }
+
+            var13 *= 0.5D;
+            var15 *= 0.5D;
+            double var17 = Math.sqrt((var13 - var0) * (var13 - var0) + (var15 - var2) * (var15 - var2));
+            double var19 = Math.atan2(var2 - var15, var0 - var13);
+            if (var19 < 0.0D) {
+                var19 += 6.283185307179586D;
+            }
+
+            double var21 = Math.atan2(var6 - var15, var4 - var13);
+            if (var21 < 0.0D) {
+                var21 += 6.283185307179586D;
+            }
+
+            double var23 = Math.atan2(var10 - var15, var8 - var13);
+            if (var23 < 0.0D) {
+                var23 += 6.283185307179586D;
+            }
+
+            var43[0] = var13;
+            var43[1] = var15;
+            var43[2] = var17;
+            var43[3] = var19;
+            var43[4] = var21;
+            var43[5] = var23;
+            return var43;
+        }
+    }
+
+    protected static final double[] computeArcMBR(double var0, double var2, double var4, double var6, double var8, double var10) {
+        double[] var12 = computeArc(var0, var2, var4, var6, var8, var10);
+        if (var12 == null) {
+            var12 = new double[]{var0, var2, var4, var6, var8, var10};
+            return var12;
+        } else {
+            double var13 = var12[0];
+            double var15 = var12[1];
+            double var17 = var12[2];
+            double var19 = var12[3];
+            double var21 = var12[4];
+            double var23 = var12[5];
+            double var25 = orientation(var0, var2, var4, var6, var8, var10);
+            double[] var27 = new double[]{Math.min(var0, var8), Math.min(var2, var10), Math.max(var0, var8), Math.max(var2, var10)};
+            if (thetaInArc(0.0D, var19, var23, var25) != 0) {
+                expandMBR(var27, var13 + var17, var15);
+            }
+
+            if (thetaInArc(1.5707963267948966D, var19, var23, var25) != 0) {
+                expandMBR(var27, var13, var15 + var17);
+            }
+
+            if (thetaInArc(3.141592653589793D, var19, var23, var25) != 0) {
+                expandMBR(var27, var13 - var17, var15);
+            }
+
+            if (thetaInArc(4.71238898038469D, var19, var23, var25) != 0) {
+                expandMBR(var27, var13, var15 - var17);
+            }
+
+            var12 = new double[]{var27[0], var27[1], var27[0], var27[3], var27[2], var27[3], var27[2], var27[1]};
+            return var12;
+        }
+    }
+
+    protected static final short thetaInArc(double var0, double var2, double var4, double var6) {
+        if (var0 != var2 && var0 != var4 && var0 != var2 + 6.283185307179586D && var0 != var4 + 6.283185307179586D && var0 != var2 - 6.283185307179586D && var0 != var4 - 6.283185307179586D) {
+            short var8 = 0;
+            if (var6 > 0.0D) {
+                ++var8;
+            }
+
+            if (var4 > var2) {
+                ++var8;
+            }
+
+            if (var2 < var0 && var0 < var4 || var2 > var0 && var0 > var4) {
+                ++var8;
+            }
+
+            return (short)(var8 & 1);
+        } else {
+            return -1;
+        }
+    }
+
+    protected static final double orientation(double var0, double var2, double var4, double var6, double var8, double var10) {
+        return var0 * var6 + var4 * var10 + var8 * var2 - (var8 * var6 + var4 * var2 + var0 * var10);
+    }
+
+    public static double[] expandCircle(double var0, double var2, double var4, double var6, double var8, double var10) {
+        byte var12 = 4;
+        double[] var13 = computeArc(var0, var2, var4, var6, var8, var10);
+        if (var13 == null) {
+            var13 = new double[]{var0, var2, var4, var6, var8, var10};
+            return var13;
+        } else {
+            double var14 = var13[0];
+            double var16 = var13[1];
+            double var18 = var13[2];
+            double var20 = var13[3];
+            double var22 = var13[4];
+            double var24 = var13[3];
+            double var26 = orientation(var0, var2, var4, var6, var8, var10);
+            double var28 = var20;
+            double var30 = var24;
+            if (var26 > 0.0D) {
+                var30 = 1.0D;
+            } else if (var26 < 0.0D) {
+                var30 = -1.0D;
+            }
+
+            double[] var32 = new double[10];
+
+            for(int var33 = 0; var33 <= var12; ++var33) {
+                double var34 = var28 + (double)var33 * 1.5707963267948966D * var30;
+                var32[var33 * 2] = var14 + var18 * Math.cos(var34);
+                var32[var33 * 2 + 1] = var16 + var18 * Math.sin(var34);
+            }
+
+            var32[0] = var0;
+            var32[1] = var2;
+            var32[8] = var0;
+            var32[9] = var2;
+            return var32;
+        }
+    }
+
+    public static double[] linearizeArc(double var0, double var2, double var4, double var6, double var8, double var10, int var12) {
+        int var13 = var12 - 1;
+        double[] var14;
+        if (var13 < 1) {
+            var14 = new double[]{var0, var2, var4, var6, var8, var10};
+            return var14;
+        } else {
+            var14 = computeArc(var0, var2, var4, var6, var8, var10);
+            if (var14 == null) {
+                var14 = new double[]{var0, var2, var4, var6, var8, var10};
+                return var14;
+            } else {
+                double var15 = var14[0];
+                double var17 = var14[1];
+                double var19 = var14[2];
+                double var21 = var14[3];
+                double var23 = var14[4];
+                double var25 = var14[5];
+                double var27 = orientation(var0, var2, var4, var6, var8, var10);
+                double var31;
+                if (var27 > 0.0D && var25 < var21) {
+                    var31 = var25 + 6.283185307179586D;
+                } else if (var27 < 0.0D && var25 > var21) {
+                    var31 = var25 - 6.283185307179586D;
+                }
+
+                double var33 = var25 - var21;
+                if (var27 > 0.0D && var33 < 0.0D) {
+                    var33 += 6.283185307179586D;
+                } else if (var27 < 0.0D && var33 > 0.0D) {
+                    var33 -= 6.283185307179586D;
+                }
+
+                double var35 = Math.abs(var33) / (double)var13;
+                double var37 = Math.sin(var35);
+                double var39 = Math.cos(var35);
+                if (var27 > 0.0D) {
+                    var37 = -var37;
+                }
+
+                double var41 = var0 - var15;
+                double var43 = var2 - var17;
+                double[] var45 = new double[(var13 + 1) * 2];
+                var45[0] = var0;
+                var45[1] = var2;
+                double var46 = 0.0D;
+
+                for(int var48 = 1; var48 < var13; ++var48) {
+                    var46 = var41 * var39 + var43 * var37;
+                    var43 = -var41 * var37 + var43 * var39;
+                    var41 = var46;
+                    var45[2 * var48] = var15 + var46;
+                    var45[2 * var48 + 1] = var17 + var43;
+                }
+
+                var45[(var13 + 1) * 2 - 2] = var8;
+                var45[(var13 + 1) * 2 - 1] = var10;
+                return var45;
+            }
+        }
+    }
+
+    private static double[] linearizeArc(double var0, double var2, double var4, double var6, double var8, double var10, double var12, boolean var14) {
+        if (var12 <= 0.0D) {
+            return linearizeArc(var0, var2, var4, var6, var8, var10, 0);
+        } else {
+            double[] var15 = computeArc(var0, var2, var4, var6, var8, var10);
+            if (var15 == null) {
+                var15 = new double[]{var0, var2, var4, var6, var8, var10};
+                return var15;
+            } else {
+                double var16 = var15[0];
+                double var18 = var15[1];
+                double var20 = var15[2];
+                double var22 = var15[3];
+                double var24 = var15[4];
+                double var26 = var15[5];
+                double var28 = orientation(var0, var2, var4, var6, var8, var10);
+                if (var14) {
+                    var12 = var20 * (1.0D - Math.cos(Math.asin(var12 / (2.0D * var20))));
+                }
+
+                double var30 = var26 - var22;
+                if (var28 > 0.0D && var30 < 0.0D) {
+                    var30 += 6.283185307179586D;
+                } else if (var28 < 0.0D && var30 > 0.0D) {
+                    var30 -= 6.283185307179586D;
+                }
+
+                if (var30 < 0.0D) {
+                    var30 = -var30;
+                }
+
+                double var32 = Math.acos(1.0D - var12 / var20) * 2.0D;
+                int var34 = (int)Math.ceil(var30 / var32);
+                if (var34 > 1000) {
+                    var34 = 1000;
+                }
+
+                if (var34 < 2) {
+                    var15 = new double[]{var0, var2, var4, var6, var8, var10};
+                    return var15;
+                } else {
+                    double var35 = Math.abs(var30) / (double)var34;
+                    double var37 = Math.sin(var35);
+                    double var39 = Math.cos(var35);
+                    if (var28 > 0.0D) {
+                        var37 = -var37;
+                    }
+
+                    double var41 = var0 - var16;
+                    double var43 = var2 - var18;
+                    double[] var45 = new double[(var34 + 1) * 2];
+                    var45[0] = var0;
+                    var45[1] = var2;
+                    double var46 = 0.0D;
+
+                    for(int var48 = 1; var48 < var34; ++var48) {
+                        var46 = var41 * var39 + var43 * var37;
+                        var43 = -var41 * var37 + var43 * var39;
+                        var41 = var46;
+                        var45[2 * var48] = var16 + var46;
+                        var45[2 * var48 + 1] = var18 + var43;
+                    }
+
+                    var45[(var34 + 1) * 2 - 2] = var8;
+                    var45[(var34 + 1) * 2 - 1] = var10;
+                    return var45;
+                }
+            }
+        }
+    }
+
+    public static double[] linearizeArc(double var0, double var2, double var4, double var6, double var8, double var10) {
+        double[] var12 = computeArc(var0, var2, var4, var6, var8, var10);
+        double var13 = var12[2] / 250.0D;
+        return linearizeArc(var0, var2, var4, var6, var8, var10, var13, false);
+    }
+
+    public static double[] reFormulateArc(double[] var0) {
+        double[] var1 = computeArc(var0[0], var0[1], var0[2], var0[3], var0[4], var0[5]);
+        if (var1 == null) {
+            var1 = new double[]{var0[0], var0[1], var0[2], var0[3], var0[4], var0[5]};
+            return var1;
+        } else {
+            double var2 = var1[0];
+            double var4 = var1[1];
+            double var6 = var1[2];
+            double var8 = -var1[3];
+            double var10 = var1[4];
+            double var12 = -var1[5];
+            double var14 = -orientation(var0[0], var0[1], var0[2], var0[3], var0[4], var0[5]);
+            if (var14 > 0.0D && var12 < var8) {
+                var12 += 6.283185307179586D;
+                if (var12 > 6.283185307179586D) {
+                    var12 -= 6.283185307179586D;
+                    var8 -= 6.283185307179586D;
+                }
+            } else if (var14 < 0.0D && var12 > var8) {
+                var12 -= 6.283185307179586D;
+                if (var12 < -6.283185307179586D) {
+                    var12 += 6.283185307179586D;
+                    var8 += 6.283185307179586D;
+                }
+            }
+
+            double[] var16 = new double[]{var2, var4, var6, var8, var10, var12};
+            return var16;
+        }
+    }
+
+    protected static final double[] closeCoords(double[] var0, int var1) {
+        int var2 = var0.length / var1 - 1;
+        boolean var3 = true;
+
+        for(int var4 = 0; var4 < var1; ++var4) {
+            if (var0[0 + var4] != var0[var2 * var1 + var4]) {
+                var3 = false;
+            }
+        }
+
+        if (var3) {
+            return var0;
+        } else {
+            double[] var6 = new double[var0.length + var1];
+            System.arraycopy(var0, 0, var6, 0, var0.length);
+            ++var2;
+
+            for(int var5 = 0; var5 < var1; ++var5) {
+                var6[var2 * var1 + var5] = var6[var5];
+            }
+
+            return var6;
+        }
+    }
+
+    private void writeObject(ObjectOutputStream var1) throws IOException {
+        var1.writeInt(this.gtype);
+        var1.writeInt(this.linfo);
+        var1.writeInt(this.srid);
+        var1.writeDouble(this.x);
+        var1.writeDouble(this.y);
+        var1.writeDouble(this.z);
+        var1.writeObject(this.elemInfo);
+        var1.writeObject(this.ordinates);
+        var1.writeInt(this.dim);
+    }
+
+    private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException {
+        this.gtype = var1.readInt();
+        this.linfo = var1.readInt();
+        this.srid = var1.readInt();
+        this.x = var1.readDouble();
+        this.y = var1.readDouble();
+        this.z = var1.readDouble();
+        this.elemInfo = (int[])((int[])var1.readObject());
+        this.ordinates = (double[])((double[])var1.readObject());
+        this.dim = var1.readInt();
+    }
+
+    public long getSize() {
+        return (long)(40 + (this.elemInfo == null ? 0 : 4 * this.elemInfo.length) + (this.ordinates == null ? 0 : 8 * this.ordinates.length));
+    }
+
+    public String toString() {
+        String var1 = "JGeometry (gtype=" + this.gtype + ", dim=" + this.dim + ", srid=" + this.srid;
+        return var1;
+    }
+
+    public String toStringFull() {
+        if (this == null) {
+            return "NULL JGeometry";
+        } else {
+            String var1 = "JGeometry (gtype=" + this.gtype + ", dim=" + this.dim + ", srid=" + this.srid;
+            if (this.isOptimizedPoint()) {
+                var1 = var1 + ", Point=(";
+                var1 = var1 + this.x + "," + this.y;
+                if (this.dim > 2) {
+                    var1 = var1 + "," + this.z;
+                }
+
+                var1 = var1 + "))";
+                return var1;
+            } else {
+                var1 = var1 + ",  \n ElemInfo(";
+
+                int var2;
+                for(var2 = 0; var2 < this.elemInfo.length - 1; ++var2) {
+                    var1 = var1 + this.elemInfo[var2] + ",";
+                }
+
+                var1 = var1 + this.elemInfo[this.elemInfo.length - 1] + ")";
+                var1 = var1 + ",  \n Ordinates(";
+
+                for(var2 = 0; var2 < this.ordinates.length / this.dim; ++var2) {
+                    for(int var3 = 0; var3 < this.dim; ++var3) {
+                        var1 = var1 + this.ordinates[var3 + var2 * this.dim];
+                        if (var3 < this.dim - 1) {
+                            var1 = var1 + ",";
+                        }
+                    }
+
+                    var1 = var1 + "\n";
+                }
+
+                var1 = var1 + "))";
+                return var1;
+            }
+        }
+    }
+
+    public String toStringFull(int var1) {
+        if (this == null) {
+            return "NULL JGeometry";
+        } else {
+            DecimalFormat var2 = new DecimalFormat();
+            var2.setMaximumFractionDigits(var1);
+            var2.setMinimumFractionDigits(var1);
+            var2.setGroupingUsed(false);
+            String var3 = "JGeometry (gtype=" + this.gtype + ", dim=" + this.dim + ", srid=" + this.srid;
+            if (this.isOptimizedPoint()) {
+                String var9 = var2.format(this.x).toString();
+                String var10 = var2.format(this.y).toString();
+                var3 = var3 + ", Point=(";
+                var3 = var3 + var9 + "," + var10;
+                if (this.dim > 2) {
+                    var3 = var3 + "," + var2.format(this.z).toString();
+                }
+
+                var3 = var3 + "))";
+                return var3;
+            } else {
+                var3 = var3 + ",  \n ElemInfo(";
+
+                int var4;
+                for(var4 = 0; var4 < this.elemInfo.length - 1; ++var4) {
+                    var3 = var3 + this.elemInfo[var4] + ",";
+                }
+
+                var3 = var3 + this.elemInfo[this.elemInfo.length - 1] + ")";
+                var3 = var3 + ",  \n Ordinates(";
+
+                for(var4 = 0; var4 < this.ordinates.length / this.dim; ++var4) {
+                    for(int var5 = 0; var5 < this.dim; ++var5) {
+                        double var6 = this.ordinates[var5 + var4 * this.dim];
+                        String var8 = var2.format(var6).toString();
+                        var3 = var3 + var8;
+                        if (var5 < this.dim - 1) {
+                            var3 = var3 + ",";
+                        }
+                    }
+
+                    var3 = var3 + "\n";
+                }
+
+                var3 = var3 + "))";
+                return var3;
+            }
+        }
+    }
+
+    /** @deprecated */
+    public boolean equals(Object var1) {
+        if (var1 == null) {
+            return false;
+        } else if (!(var1 instanceof JGeometry)) {
+            return false;
+        } else {
+            JGeometry var2 = (JGeometry)var1;
+            return this.getType() == var2.getType() && Arrays.equals(this.getPoint(), var2.getPoint()) && Arrays.equals(this.getElemInfo(), var2.getElemInfo()) && Arrays.equals(this.getOrdinatesArray(), var2.getOrdinatesArray());
+        }
+    }
+
+    public static final JGeometry load(byte[] var0) throws Exception {
+        return var0 != null && var0.length >= 8 ? SdoPickler.unpickle(var0) : null;
+    }
+
+    public static byte[] store(JGeometry var0) throws Exception {
+        return SdoPickler.pickle(var0);
+    }
+
+    public static final STRUCT store(Connection var0, JGeometry var1) throws Exception {
+        Object[] var2 = getOracleDescriptors(var0);
+        return store(var1, var0, var2);
+    }
+
+    public static final STRUCT store(Connection var0, JGeometry var1, StructDescriptor var2) throws Exception {
+        if (var2 == null) {
+            geomDesc = getGeomDescriptor(var0);
+            return new STRUCT(geomDesc, SdoPickler.pickle(var1), var0);
+        } else {
+            return new STRUCT(var2, SdoPickler.pickle(var1), var0);
+        }
+    }
+
+    public static StructDescriptor getGeomDescriptor(Connection var0) throws SQLException {
+        return StructDescriptor.createDescriptor("MDSYS.SDO_GEOMETRY", var0);
+    }
+
+    public static String byteArrayToHexString(byte[] var0) {
+        boolean var1 = false;
+        int var2 = 0;
+        if (var0 != null && var0.length > 0) {
+            String[] var3 = new String[]{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"};
+
+            StringBuffer var4;
+            for(var4 = new StringBuffer(var0.length * 2); var2 < var0.length; ++var2) {
+                byte var6 = (byte)(var0[var2] & 240);
+                var6 = (byte)(var6 >>> 4);
+                var6 = (byte)(var6 & 15);
+                var4.append(var3[var6]);
+                var6 = (byte)(var0[var2] & 15);
+                var4.append(var3[var6]);
+            }
+
+            String var5 = new String(var4);
+            return var5;
+        } else {
+            return null;
+        }
+    }
+
+    public final JGeometry projectToLTP(double var1, double var3) throws DataException {
+        if (this.srid == 0) {
+            return null;
+        } else {
+            JGeometry.Gc_trans var6 = new JGeometry.Gc_trans(var1, var3);
+            JGeometry var5;
+            double[] var7;
+            double[] var9;
+            double[] var23;
+            if (this.isOptimizedPoint()) {
+                var5 = new JGeometry(this.x, this.y, 0);
+                var7 = new double[]{this.x, this.y, 0.0D};
+                this.lltogXYZ(var7, var6);
+                var9 = new double[]{var7[0], var7[1], var7[2], var7[0], var7[1], var7[2]};
+                var23 = new double[3];
+                this.gxyzgmcenter(var23, var9, var6);
+                JGeometry.LT_transform var25 = new JGeometry.LT_transform(var23[0], var23[1], var6);
+                this.ltxform(var7, var25);
+                var5.x = var7[0];
+                var5.y = var7[1];
+                var5.lttpH = var25;
+                var5.gtransH = var6;
+                return var5;
+            } else {
+                var7 = new double[3 * (this.ordinates.length / 2)];
+                var9 = new double[3];
+
+                for(int var10 = 0; var10 < var7.length / 3; ++var10) {
+                    var9[0] = this.ordinates[2 * var10];
+                    var9[1] = this.ordinates[2 * var10 + 1];
+                    var9[2] = 0.0D;
+                    this.lltogXYZ(var9, var6);
+                    var7[var10 * 3] = var9[0];
+                    var7[var10 * 3 + 1] = var9[1];
+                    var7[var10 * 3 + 2] = var9[2];
+                }
+
+                var23 = new double[6];
+                var23[0] = var23[3] = var7[0];
+                var23[1] = var23[4] = var7[1];
+                var23[2] = var23[5] = var7[2];
+
+                for(int var11 = 0; var11 < var7.length / 3; ++var11) {
+                    if (var23[0] > var7[var11 * 3]) {
+                        var23[0] = var7[var11 * 3];
+                    }
+
+                    if (var23[1] > var7[var11 * 3 + 1]) {
+                        var23[1] = var7[var11 * 3 + 1];
+                    }
+
+                    if (var23[2] > var7[var11 * 3 + 2]) {
+                        var23[2] = var7[var11 * 3 + 2];
+                    }
+
+                    if (var23[3] < var7[var11 * 3]) {
+                        var23[3] = var7[var11 * 3];
+                    }
+
+                    if (var23[4] < var7[var11 * 3 + 1]) {
+                        var23[4] = var7[var11 * 3 + 1];
+                    }
+
+                    if (var23[5] < var7[var11 * 3 + 2]) {
+                        var23[5] = var7[var11 * 3 + 2];
+                    }
+                }
+
+                double[] var24 = new double[3];
+                this.gxyzgmcenter(var24, var23, var6);
+                JGeometry.LT_transform var12 = new JGeometry.LT_transform(var24[0], var24[1], var6);
+                double[] var13 = new double[2 * (var7.length / 3)];
+                double var20 = 0.0D;
+                double var18 = 0.0D;
+                double var16 = 0.0D;
+                double var14 = 0.0D;
+
+                for(int var22 = 0; var22 < var7.length / 3; ++var22) {
+                    var9[0] = var7[var22 * 3];
+                    var9[1] = var7[var22 * 3 + 1];
+                    var9[2] = var7[var22 * 3 + 2];
+                    this.ltxform(var9, var12);
+                    var13[2 * var22] = var9[0];
+                    var13[2 * var22 + 1] = var9[1];
+                    if (var13[2 * var22] < var14) {
+                        var14 = var13[2 * var22];
+                    }
+
+                    if (var13[2 * var22] > var18) {
+                        var18 = var13[2 * var22];
+                    }
+
+                    if (var13[2 * var22 + 1] < var16) {
+                        var16 = var13[2 * var22 + 1];
+                    }
+
+                    if (var13[2 * var22 + 1] > var20) {
+                        var20 = var13[2 * var22 + 1];
+                    }
+                }
+
+                if (var18 - var14 <= 1.274E7D && var20 - var16 <= 1.274E7D) {
+                    var5 = new JGeometry(this.gtype, 0, this.elemInfo, var13);
+                    var5.lttpH = var12;
+                    var5.gtransH = var6;
+                    return var5;
+                } else {
+                    throw new DataException("Buffer Distance Too large for LTP");
+                }
+            }
+        }
+    }
+
+    public final JGeometry projectFromLTP() throws DataException {
+        JGeometry var1;
+        double[] var2;
+        if (this.isOptimizedPoint()) {
+            var1 = new JGeometry(this.x, this.y, this.gtransH.txsrid);
+            var2 = new double[]{this.x, this.y, 0.0D};
+            this.iltxform(var2, this.lttpH, this.gtransH);
+            this.gXYZtoll(var2, this.gtransH);
+            var1.x = var2[0] / this.gtransH.unitfactor;
+            var1.y = var2[1] / this.gtransH.unitfactor;
+            var1.setSRID(this.getSRID());
+            return var1;
+        } else {
+            var2 = new double[this.ordinates.length];
+            double[] var4 = new double[3];
+            double var11 = 0.0D;
+            double var9 = 0.0D;
+            double var7 = 0.0D;
+            double var5 = 0.0D;
+
+            int var13;
+            for(var13 = 0; var13 < this.ordinates.length / 2; ++var13) {
+                if (this.ordinates[2 * var13] < var5) {
+                    var5 = this.ordinates[2 * var13];
+                }
+
+                if (this.ordinates[2 * var13] > var9) {
+                    var9 = this.ordinates[2 * var13];
+                }
+
+                if (this.ordinates[2 * var13 + 1] < var7) {
+                    var7 = this.ordinates[2 * var13 + 1];
+                }
+
+                if (this.ordinates[2 * var13 + 1] > var11) {
+                    var11 = this.ordinates[2 * var13 + 1];
+                }
+            }
+
+            if (var9 - var5 <= 1.274E7D && var11 - var7 <= 1.274E7D) {
+                for(var13 = 0; var13 < this.ordinates.length / 2; ++var13) {
+                    var4[0] = this.ordinates[2 * var13];
+                    var4[1] = this.ordinates[2 * var13 + 1];
+                    var4[2] = 0.0D;
+                    this.iltxform(var4, this.lttpH, this.gtransH);
+                    this.gXYZtoll(var4, this.gtransH);
+                    var2[2 * var13] = var4[0] / this.gtransH.unitfactor;
+                    var2[2 * var13 + 1] = var4[1] / this.gtransH.unitfactor;
+                }
+
+                var1 = new JGeometry(this.gtype, this.getSRID(), this.elemInfo, var2);
+                return var1;
+            } else {
+                throw new DataException("Buffer Distance Too large for LTP");
+            }
+        }
+    }
+
+    public final JGeometry projectToGNM_longLat() throws DataException {
+        double var1 = 0.0D;
+        double var3 = 0.0D;
+        double[] var5 = this.getMBR();
+        double[] var6 = new double[var5.length / 2];
+
+        for(int var7 = 0; var7 < var5.length / 2; ++var7) {
+            var6[var7] = (var5[var7 + var5.length / 2] + var5[var7]) / 2.0D;
+        }
+
+        var1 = 0.017453292519943295D * var6[0];
+        var3 = 0.017453292519943295D * var6[1];
+        if (this.getType() == 1) {
+            var1 /= 2.0D;
+            var3 /= 2.0D;
+        }
+
+        return this.projectToGNM_longLat(var1, var3);
+    }
+
+    public final JGeometry projectToGNM_longLat(double var1, double var3) throws DataException {
+        JGeometry var9 = null;
+        double var13 = 6378000.0D;
+        int[] var10;
+        if (this.getElemInfo() == null) {
+            var10 = new int[]{1, 1, 1};
+        } else {
+            var10 = new int[this.getElemInfo().length];
+
+            for(int var5 = 0; var5 < this.getElemInfo().length; ++var5) {
+                var10[var5] = this.getElemInfo()[var5];
+            }
+        }
+
+        double[] var11;
+        double[] var12;
+        if (this.getOrdinatesArray() == null) {
+            if (this.dim == 2) {
+                var12 = new double[2];
+                var11 = new double[]{this.x, this.y};
+            } else {
+                var12 = new double[3];
+                var11 = new double[]{this.x, this.y, this.z};
+            }
+        } else {
+            var12 = new double[this.getOrdinatesArray().length];
+            var11 = new double[this.getOrdinatesArray().length];
+
+            for(int var8 = 0; var8 < this.getOrdinatesArray().length; ++var8) {
+                var11[var8] = this.getOrdinatesArray()[var8];
+            }
+        }
+
+        int var7 = 0;
+        double[] var15 = this.getMBR();
+
+        for(int var6 = 0; var6 < var11.length / (var15.length / 2); ++var6) {
+            double var16 = 0.017453292519943295D * var11[var15.length / 2 * var6];
+            double var18 = 0.017453292519943295D * var11[var15.length / 2 * var6 + 1];
+            double var20 = 0.0D;
+            if (var15.length == 6) {
+                var20 = var11[var15.length / 2 * var6 + 2];
+            }
+
+            double var22 = Math.sin(var3) * Math.sin(var18) + Math.cos(var3) * Math.cos(var18) * Math.cos(var16 - var1);
+            double var24 = 0.0D;
+            double var26 = 0.0D;
+            if (Math.abs(var3 - 1.5707963267948966D) <= 1.0E-16D) {
+                var24 = 1.0D / Math.tan(var18) * Math.sin(var16 - var1);
+                var26 = -1.0D / Math.tan(var18) * Math.cos(var16 - var1);
+            } else if (Math.abs(var3 - -1.5707963267948966D) <= 1.0E-16D) {
+                var24 = -1.0D / Math.tan(var18) * Math.sin(var16 - var1);
+                var26 = 1.0D / Math.tan(var18) * Math.cos(var16 - var1);
+            } else if (Math.abs(var3) <= 1.0E-16D) {
+                var24 = Math.tan(var16 - var1);
+                var26 = Math.tan(var18) / Math.cos(var16 - var1);
+            } else {
+                var24 = Math.cos(var18) * Math.sin(var16 - var1) / var22;
+                var26 = (Math.cos(var3) * Math.sin(var18) - Math.sin(var3) * Math.cos(var18) * Math.cos(var16 - var1)) / var22;
+            }
+
+            var12[var7] = var13 * var24;
+            ++var7;
+            var12[var7] = var13 * var26;
+            ++var7;
+            if (var15.length == 6) {
+                var12[var7] = var20;
+                ++var7;
+            }
+        }
+
+        var9 = new JGeometry(this.getType(), 0, var10, var12);
+        int var28 = this.dim;
+        int var17 = this.linfo;
+        var9.dim = var28;
+        var9.linfo = var17;
+        return var9;
+    }
+
+    public final JGeometry projectFromGNM_longLat(double var1, double var3) throws DataException {
+        JGeometry var9 = null;
+        double var13 = 6378000.0D;
+        int[] var10;
+        if (this.getElemInfo() == null) {
+            var10 = new int[]{1, 1, 1};
+        } else {
+            var10 = new int[this.getElemInfo().length];
+
+            for(int var5 = 0; var5 < this.getElemInfo().length; ++var5) {
+                var10[var5] = this.getElemInfo()[var5];
+            }
+        }
+
+        double[] var11;
+        double[] var12;
+        if (this.getOrdinatesArray() == null) {
+            if (this.dim == 2) {
+                var12 = new double[2];
+                var11 = new double[]{this.x, this.y};
+            } else {
+                var12 = new double[3];
+                var11 = new double[]{this.x, this.y, this.z};
+            }
+        } else {
+            var12 = new double[this.getOrdinatesArray().length];
+            var11 = new double[this.getOrdinatesArray().length];
+
+            for(int var8 = 0; var8 < this.getOrdinatesArray().length; ++var8) {
+                var11[var8] = this.getOrdinatesArray()[var8];
+            }
+        }
+
+        int var7 = 0;
+        double[] var15 = this.getMBR();
+
+        for(int var6 = 0; var6 < var11.length / (var15.length / 2); ++var6) {
+            double var16 = var11[var15.length / 2 * var6] / var13;
+            double var18 = var11[var15.length / 2 * var6 + 1] / var13;
+            double var20 = 0.0D;
+            if (var15.length == 6) {
+                var20 = var11[var15.length / 2 * var6 + 2];
+            }
+
+            double var22 = Math.sqrt(var16 * var16 + var18 * var18);
+            double var24 = Math.atan2(var22, 1.0D);
+            double var26 = 0.0D;
+            if (var22 <= 1.0E-16D) {
+                var26 = var3;
+            } else {
+                var26 = Math.asin(Math.cos(var24) * Math.sin(var3) + var18 * Math.sin(var24) * Math.cos(var3) / var22);
+            }
+
+            double var28 = 0.0D;
+            if (Math.abs(var3 - 1.5707963267948966D) <= 1.0E-16D) {
+                var28 = var1 + Math.atan2(var16, -var18);
+            } else if (Math.abs(var3 - -1.5707963267948966D) <= 1.0E-16D) {
+                var28 = var1 + Math.atan2(var16, var18);
+            } else {
+                var28 = var1 + Math.atan2(var16 * Math.sin(var24), var22 * Math.cos(var3) * Math.cos(var24) - var18 * Math.sin(var3) * Math.sin(var24));
+            }
+
+            var12[var7] = 57.29577951308232D * var28;
+            ++var7;
+            var12[var7] = 57.29577951308232D * var26;
+            ++var7;
+            if (var15.length == 6) {
+                var12[var7] = var20;
+                ++var7;
+            }
+        }
+
+        var9 = new JGeometry(this.getType(), this.getSRID(), var10, var12);
+        int var30 = this.dim;
+        int var17 = this.linfo;
+        var9.dim = var30;
+        var9.linfo = var17;
+        return var9;
+    }
+
+    public final JGeometry densifyArcs(double var1) {
+        return this.densifyArcs(var1, false);
+    }
+
+    public JGeometry densifyArcs(double var1, boolean var3) {
+        ArrayList var4 = new ArrayList();
+        ArrayList var5 = new ArrayList();
+        int var6 = this.dim * 1000 + this.linfo * 100 + this.gtype;
+        if (this.isOptimizedPoint()) {
+            return new JGeometry(this.x, this.y, this.srid);
+        } else if (!this.isPoint() && !this.isMultiPoint()) {
+            double[] var10;
+            int var11;
+            int var22;
+            if (this.isCircle()) {
+                double[] var18 = expandCircle(this.ordinates[0], this.ordinates[1], this.ordinates[this.dim], this.ordinates[this.dim + 1], this.ordinates[2 * this.dim], this.ordinates[2 * this.dim + 1]);
+                int[] var20 = new int[]{1, 1003, 1};
+                double[] var27 = linearizeArc(var18[0], var18[1], var18[2], var18[3], var18[4], var18[5], var1, var3);
+
+                for(var22 = 0; var22 < var27.length; ++var22) {
+                    var5.add(new Double(var27[var22]));
+                }
+
+                var10 = linearizeArc(var18[4], var18[5], var18[6], var18[7], var18[8], var18[9], var1, var3);
+
+                for(var11 = 2; var11 < var10.length; ++var11) {
+                    var5.add(new Double(var10[var11]));
+                }
+
+                double[] var23 = new double[var5.size()];
+
+                for(int var25 = 0; var25 < var5.size(); ++var25) {
+                    var23[var25] = (Double)var5.get(var25);
+                }
+
+                return new JGeometry(this.gtype, this.srid, var20, var23);
+            } else {
+                JGeometry.ElementIterator var7 = new JGeometry.ElementIterator(this);
+
+                int var9;
+                while(var7.next()) {
+                    int var8 = var7.ord_offset;
+                    if (var7.isCompound && var7.isFirstElemOfCompound || !var7.isCompound) {
+                        var4.add(new Integer(var5.size() + 1));
+                        var9 = var7.original_etype;
+                        if (var9 == 4) {
+                            var9 = 2;
+                        } else if (var9 == 1005) {
+                            var9 = 1003;
+                        } else if (var9 == 2005) {
+                            var9 = 2003;
+                        }
+
+                        var4.add(new Integer(var9));
+                        if (var7.eitpr == 3) {
+                            var4.add(new Integer(1));
+                        } else {
+                            var4.add(new Integer(1));
+                        }
+                    }
+
+                    for(var9 = 0; var9 < var7.nCoord - 1; ++var9) {
+                        if (var7.eitpr == 1) {
+                            var5.add(new Double(this.ordinates[var8 + var9 * this.dim]));
+                            var5.add(new Double(this.ordinates[var8 + var9 * this.dim + 1]));
+                            if (var7.lastElem && var9 == var7.nCoord - 2 || !var7.isCompound && var9 == var7.nCoord - 2 || var7.isCompound && var9 == var7.nCoord - 2 && var7.nSubElement == 1) {
+                                var5.add(new Double(this.ordinates[var8 + var9 * this.dim + 2]));
+                                var5.add(new Double(this.ordinates[var8 + var9 * this.dim + 3]));
+                            }
+                        } else if (var7.eitpr == 2) {
+                            if (var8 + var9 * this.dim >= var7.next_ord_offset || var7.lastElem && var8 + var9 * this.dim >= var7.next_ord_offset - this.dim || (var7.next_ord_offset - (var8 + var9 * this.dim)) / this.dim < 2) {
+                                break;
+                            }
+
+                            var10 = linearizeArc(this.ordinates[var8 + var9 * this.dim], this.ordinates[var8 + var9 * this.dim + 1], this.ordinates[var8 + (var9 + 1) * this.dim], this.ordinates[var8 + (var9 + 1) * this.dim + 1], this.ordinates[var8 + (var9 + 2) * this.dim], this.ordinates[var8 + (var9 + 2) * this.dim + 1], var1, var3);
+
+                            for(var11 = 0; var11 < var10.length - 2; ++var11) {
+                                var5.add(new Double(var10[var11]));
+                            }
+
+                            if (var7.lastElem && var9 == var7.nCoord - 3 || !var7.isCompound && var9 == var7.nCoord - 3 || var7.isCompound && var9 == var7.nCoord - 3 && var7.nSubElement == 1) {
+                                var5.add(new Double(var10[var10.length - 2]));
+                                var5.add(new Double(var10[var10.length - 1]));
+                            }
+
+                            ++var9;
+                            if (var9 >= var7.nCoord - 1 && var7.top_etype != 3 && var7.top_etype == 5) {
+                            }
+                        } else if (var7.eitpr == 3) {
+                            double var21 = this.ordinates[var8 + 0];
+                            double var24 = this.ordinates[var8 + 1];
+                            double var29 = this.ordinates[var8 + this.dim];
+                            double var16 = this.ordinates[var8 + this.dim + 1];
+                            var5.add(new Double(var21));
+                            var5.add(new Double(var24));
+                            var5.add(new Double(var29));
+                            var5.add(new Double(var24));
+                            var5.add(new Double(var29));
+                            var5.add(new Double(var16));
+                            var5.add(new Double(var21));
+                            var5.add(new Double(var16));
+                            var5.add(new Double(var21));
+                            var5.add(new Double(var24));
+                            ++var9;
+                        } else if (var7.eitpr == 4) {
+                            if (var8 + var9 * this.dim >= var7.next_ord_offset || var7.lastElem && var8 + var9 * this.dim >= var7.next_ord_offset - this.dim) {
+                                break;
+                            }
+
+                            var10 = expandCircle(this.ordinates[var8 + var9 * this.dim], this.ordinates[var8 + var9 * this.dim + 1], this.ordinates[var8 + (var9 + 1) * this.dim], this.ordinates[var8 + (var9 + 1) * this.dim + 1], this.ordinates[var8 + (var9 + 2) * this.dim], this.ordinates[var8 + (var9 + 2) * this.dim + 1]);
+                            int[] var10000 = new int[]{1, 1003, 1};
+                            double[] var12 = linearizeArc(var10[0], var10[1], var10[2], var10[3], var10[4], var10[5], var1, var3);
+
+                            for(int var13 = 0; var13 < var12.length; ++var13) {
+                                var5.add(new Double(var12[var13]));
+                            }
+
+                            double[] var28 = linearizeArc(var10[4], var10[5], var10[6], var10[7], var10[8], var10[9], var1, var3);
+
+                            for(int var14 = 2; var14 < var28.length; ++var14) {
+                                var5.add(new Double(var28[var14]));
+                            }
+
+                            var9 += 2;
+                        }
+                    }
+                }
+
+                double[] var19 = new double[var5.size()];
+
+                for(var9 = 0; var9 < var5.size(); ++var9) {
+                    var19[var9] = (Double)var5.get(var9);
+                }
+
+                int[] var26 = new int[var4.size()];
+
+                for(var22 = 0; var22 < var4.size(); ++var22) {
+                    var26[var22] = (Integer)var4.get(var22);
+                }
+
+                return new JGeometry(this.gtype, this.srid, var26, var19);
+            }
+        } else {
+            return new JGeometry(this.gtype, this.srid, this.elemInfo, this.ordinates);
+        }
+    }
+
+    private double[] simplify(double[] var1, double var2) {
+        int var4 = var1.length / this.dim;
+        int[] var6 = new int[var4];
+        double[] var5;
+        int var8;
+        if (var2 > 0.0D && var1.length >= 4) {
+            var8 = 0;
+            byte var7 = 0;
+            int var34 = var7 + 1;
+            var6[var7] = 0;
+            int var9 = var4 - 1;
+            var6[var9] = var4 - 1;
+            int var24 = 0;
+
+            do {
+                int var10 = var6[var9];
+                int var11 = 2 * var8;
+                int var12 = 2 * var10;
+                double var13 = var1[var12] - var1[var11];
+                double var15 = var1[var12 + 1] - var1[var11 + 1];
+                double var17 = Math.sqrt(var13 * var13 + var15 * var15);
+                double var19 = 0.0D;
+                double var21;
+                int var23;
+                int var33;
+                if (var17 <= var2) {
+                    for(var33 = var8 + 1; var33 < var10; ++var33) {
+                        var23 = 2 * var33;
+                        var13 = var1[var23] - var1[var11];
+                        var15 = var1[var23 + 1] - var1[var11 + 1];
+                        var21 = Math.sqrt(var13 * var13 + var15 * var15);
+                        if (var21 >= var19) {
+                            var19 = var21;
+                            var24 = var33;
+                        }
+                    }
+                } else if (Math.abs(var13) <= Math.abs(var15)) {
+                    double var25 = var13 / var15;
+                    double var29 = var25 * var1[var11 + 1];
+
+                    for(var33 = var8 + 1; var33 < var10; ++var33) {
+                        var23 = 2 * var33;
+                        var21 = Math.abs(var1[var23] - var1[var11] + var29 - var25 * var1[var23 + 1]);
+                        if (var21 >= var19) {
+                            var19 = var21;
+                            var24 = var33;
+                        }
+                    }
+
+                    var19 = Math.abs(var19 * var15 / var17);
+                } else {
+                    double var27 = var15 / var13;
+                    double var31 = var27 * var1[var11];
+
+                    for(var33 = var8 + 1; var33 < var10; ++var33) {
+                        var23 = 2 * var33;
+                        var21 = Math.abs(var1[var23 + 1] - var1[var11 + 1] + var31 - var27 * var1[var23]);
+                        if (var21 >= var19) {
+                            var19 = var21;
+                            var24 = var33;
+                        }
+                    }
+
+                    var19 = Math.abs(var19 * var13 / var17);
+                }
+
+                if (var19 > var2) {
+                    --var9;
+                    var6[var9] = var24;
+                } else {
+                    var6[var34++] = var10;
+                    ++var9;
+                    var8 = var10;
+                }
+            } while(var9 < var4);
+
+            var5 = new double[var34 * 2];
+
+            for(var9 = 0; var9 < var34; ++var9) {
+                var8 = var6[var9];
+                var5[var9 * 2] = var1[2 * var8];
+                var5[var9 * 2 + 1] = var1[2 * var8 + 1];
+            }
+
+            return var5;
+        } else {
+            var5 = new double[var1.length];
+
+            for(var8 = 0; var8 < var1.length; ++var8) {
+                var5[var8] = var1[var8];
+            }
+
+            return var5;
+        }
+    }
+
+    public JGeometry simplify(double var1, double var3, double var5) throws Exception, SQLException {
+        if (var3 != 0.0D && var5 != 0.0D) {
+            JGeometry var8;
+            try {
+                JGeometry var7 = this.projectToLTP(var3, 1.0D / var5);
+                var8 = var7.simplify(var1);
+                var8.lttpH = var7.lttpH;
+                var8.gtransH = var7.gtransH;
+                var8.setSRID(this.getSRID());
+            } catch (Exception var10) {
+                throw var10;
+            }
+
+            return var8.projectFromLTP();
+        } else {
+            return this.simplify(var1);
+        }
+    }
+
+    public final JGeometry simplify(double var1) {
+        int var3 = this.elemInfo.length / 3;
+        double[][] var6 = new double[var3][];
+
+        int var7;
+        double[] var8;
+        int var10;
+        for(var7 = 0; var7 < var3; ++var7) {
+            int var4 = var7 == var3 - 1 ? this.ordinates.length - 2 : this.elemInfo[3 * (var7 + 1)] - 3;
+            int var5 = this.elemInfo[3 * var7] - 1;
+            var8 = new double[var4 - var5 + 2];
+            int var9 = 0;
+
+            for(var10 = this.elemInfo[3 * var7] - 1; var10 <= var4; ++var9) {
+                var8[2 * var9] = this.ordinates[var10];
+                var8[2 * var9 + 1] = this.ordinates[var10 + 1];
+                var10 += 2;
+            }
+
+            var6[var7] = this.simplify(var8, var1);
+        }
+
+        var7 = 0;
+
+        for(int var16 = 0; var16 < var3; ++var16) {
+            if (this.elemInfo[3 * var16 + 1] != 1003 && this.elemInfo[3 * var16 + 1] != 2003) {
+                var7 += var6[var16].length;
+            } else if (var6[var16].length == 4) {
+                var7 += 4;
+            } else if (var6[var16].length == 6) {
+                var7 += 4;
+            } else {
+                var7 += var6[var16].length;
+            }
+        }
+
+        var8 = new double[var7];
+        int[] var17 = new int[3 * var3];
+        var10 = 1;
+
+        int var11;
+        int var12;
+        for(var11 = 0; var11 < var3; ++var11) {
+            if (this.elemInfo[3 * var11 + 1] != 1003 && this.elemInfo[3 * var11 + 1] != 2003) {
+                var17[3 * var11] = var10;
+                var17[3 * var11 + 1] = this.elemInfo[3 * var11 + 1];
+                var17[3 * var11 + 2] = 1;
+
+                for(var12 = 0; var12 < var6[var11].length; ++var12) {
+                    var8[var12 + var10 - 1] = var6[var11][var12];
+                }
+
+                var10 += var6[var11].length;
+            } else if (var6[var11].length == 4) {
+                var17[3 * var11] = var10;
+                var17[3 * var11 + 1] = 2;
+                var17[3 * var11 + 2] = 1;
+
+                for(var12 = 0; var12 < 2; ++var12) {
+                    var8[var12 + var10 - 1] = var6[var11][var12];
+                }
+
+                var10 += 2;
+                var8[var10 - 1] = this.ordinates[this.elemInfo[3 * var11] + 1];
+                var8[var10] = this.ordinates[this.elemInfo[3 * var11] + 2];
+                var10 += 2;
+            } else if (var6[var11].length == 6) {
+                var17[3 * var11] = var10;
+                var17[3 * var11 + 1] = 2;
+                var17[3 * var11 + 2] = 1;
+
+                for(var12 = 0; var12 < 4; ++var12) {
+                    var8[var12 + var10 - 1] = var6[var11][var12];
+                }
+
+                var10 += 4;
+            } else {
+                var17[3 * var11] = var10;
+                var17[3 * var11 + 1] = this.elemInfo[3 * var11 + 1];
+                var17[3 * var11 + 2] = 1;
+
+                for(var12 = 0; var12 < var6[var11].length; ++var12) {
+                    var8[var12 + var10 - 1] = var6[var11][var12];
+                }
+
+                var10 += var6[var11].length;
+            }
+        }
+
+        var11 = 0;
+        var12 = 0;
+        int var13 = 0;
+
+        int var14;
+        for(var14 = 0; var14 < var3; ++var14) {
+            if (var17[3 * var14 + 1] == 1003) {
+                ++var12;
+            } else if (var17[3 * var14 + 1] == 2) {
+                ++var13;
+            } else {
+                ++var11;
+            }
+        }
+
+        var14 = 0;
+        if (var12 > 0) {
+            ++var14;
+        }
+
+        if (var13 > 0) {
+            ++var14;
+        }
+
+        if (var11 > 0) {
+            ++var14;
+        }
+
+        short var15 = 2004;
+        if (var14 > 1) {
+            var15 = 2004;
+        } else if (var12 == 1) {
+            var15 = 2003;
+        } else if (var12 > 1) {
+            var15 = 2007;
+        } else if (var13 == 1) {
+            var15 = 2002;
+        } else if (var13 > 1) {
+            var15 = 2006;
+        } else if (var11 == 1) {
+            var15 = 2001;
+        } else if (var11 > 1) {
+            var15 = 2005;
+        }
+
+        return new JGeometry(var15, this.srid, var17, var8);
+    }
+
+    protected void finalize() {
+    }
+
+    private static double[][] translation(int var0, double var1, double var3, double var5) {
+        double[][] var9 = new double[var0 + 1][var0 + 1];
+
+        for(int var7 = 0; var7 < var0 + 1; ++var7) {
+            for(int var8 = 0; var8 < var0 + 1; ++var8) {
+                if (var7 == var8) {
+                    var9[var7][var8] = 1.0D;
+                } else {
+                    var9[var7][var8] = 0.0D;
+                }
+            }
+        }
+
+        var9[0][var0] = var1;
+        var9[1][var0] = var3;
+        if (var0 == 3) {
+            var9[2][var0] = var5;
+        }
+
+        return var9;
+    }
+
+    private static double[][] matrixMatrixMult(double[][] var0, double[][] var1) {
+        int var2 = var0.length;
+        int var3 = var0[0].length;
+        int var4 = var1[0].length;
+        double[][] var5 = new double[var2][var4];
+
+        int var6;
+        int var7;
+        for(var6 = 0; var6 < var2; ++var6) {
+            for(var7 = 0; var7 < var4; ++var7) {
+                var5[var6][var7] = 0.0D;
+            }
+        }
+
+        for(var6 = 0; var6 < var2; ++var6) {
+            for(var7 = 0; var7 < var4; ++var7) {
+                for(int var8 = 0; var8 < var3; ++var8) {
+                    var5[var6][var7] += var0[var6][var8] * var1[var8][var7];
+                }
+            }
+        }
+
+        return var5;
+    }
+
+    private static double[] matvecMult(double[][] var0, double[] var1) {
+        int var4 = var0.length;
+        int var5 = var0[0].length;
+        int var6 = var1.length;
+        double[] var7 = new double[var4];
+
+        int var2;
+        for(var2 = 0; var2 < var4; ++var2) {
+            var7[var2] = 0.0D;
+        }
+
+        for(var2 = 0; var2 < var4; ++var2) {
+            for(int var3 = 0; var3 < var5; ++var3) {
+                var7[var2] += var0[var2][var3] * var1[var3];
+            }
+        }
+
+        return var7;
+    }
+
+    private void convertOrientedPointsFw(int[] var1, double[] var2) {
+        for(int var3 = 0; var3 < var1.length; var3 += 3) {
+            if (var1[var3 + 1] == 1 && var1[var3 + 2] == 0) {
+                int var4 = var1[var3 + 0];
+                int var5;
+                if (this.getSRID() == 8307) {
+                    for(var5 = 0; var5 < this.getDimensions(); ++var5) {
+                        var2[var4 + var5] /= 100000.0D;
+                    }
+                }
+
+                for(var5 = 0; var5 < this.getDimensions(); ++var5) {
+                    var2[var4 + var5] += var2[var4 + var5 - 3];
+                }
+            }
+        }
+
+    }
+
+    private void convertOrientedPointsRv(int[] var1, double[] var2) {
+        for(int var3 = 0; var3 < var1.length; var3 += 3) {
+            if (var1[var3 + 1] == 1 && var1[var3 + 2] == 0) {
+                int var4 = var1[var3 + 0];
+
+                for(int var5 = 0; var5 < this.getDimensions(); ++var5) {
+                    var2[var4 + var5] -= var2[var4 + var5 - 3];
+                }
+
+                double var8 = Math.sqrt(var2[var4 + 0] * var2[var4 + 0] + var2[var4 + 1] * var2[var4 + 1]);
+
+                for(int var7 = 0; var7 < this.getDimensions(); ++var7) {
+                    var2[var4 + var7] /= var8;
+                }
+            }
+        }
+
+    }
+
+    private double tfm_8307_to_PopularMercator_x(double var1) {
+        return 0.0D + 6378137.0D * (var1 - 0.0D);
+    }
+
+    private double tfm_8307_to_PopularMercator_y(double var1, boolean var3) {
+        double var4 = var3 ? MERCATOR_e54004 : MERCATOR_e3785;
+        return 0.0D + 6378137.0D * Math.log(Math.tan(0.7853981633974483D + var1 / 2.0D) * Math.pow((1.0D - var4 * Math.sin(var1)) / (1.0D + var4 * Math.sin(var1)), var4 / 2.0D));
+    }
+
+    public void tfm_8307_to_PopularMercator(int[] var1, double[] var2, boolean var3) {
+        if (var1 != null) {
+            this.convertOrientedPointsFw(var1, var2);
+        }
+
+        if (var2 != null) {
+            for(int var4 = 0; var4 < var2.length; var4 += this.getDimensions()) {
+                var2[var4 + 0] = this.tfm_8307_to_PopularMercator_x(var2[var4 + 0] * 3.141592653589793D / 180.0D);
+                var2[var4 + 1] = this.tfm_8307_to_PopularMercator_y(var2[var4 + 1] * 3.141592653589793D / 180.0D, var3);
+            }
+        }
+
+        if (var1 != null) {
+            this.convertOrientedPointsRv(var1, var2);
+        }
+
+    }
+
+    public void tfm_8307_to_PopularMercator(boolean var1) {
+        if (this.getSRID() != 8307) {
+            throw new RuntimeException("Source geometry must be SRID 8307, when transforming to 3785/54004.");
+        } else if (this.hasCircularArcs()) {
+            throw new RuntimeException("Circular Arcs not allowed in 8307.");
+        } else {
+            double[] var2 = this.getPoint();
+            this.tfm_8307_to_PopularMercator((int[])null, var2, var1);
+            this.x = var2[0];
+            this.y = var2[1];
+            this.tfm_8307_to_PopularMercator(this.getElemInfo(), this.getOrdinatesArray(), var1);
+            this.setSRID(var1 ? '틴' : 3785);
+        }
+    }
+
+    private double tfm_PopularMercator_to_8307_lon(double var1) {
+        return (var1 - 0.0D) / 6378137.0D + 0.0D;
+    }
+
+    private double tfm_PopularMercator_to_8307_lat(double var1, boolean var3) {
+        double var4 = var3 ? MERCATOR_e54004 : MERCATOR_e3785;
+        return var1 + (var4 * var4 / 2.0D + Math.pow(var4, 6.0D) / 12.0D + 5.0D * Math.pow(var4, 4.0D) / 24.0D + 13.0D * Math.pow(var4, 8.0D) / 360.0D) * Math.sin(2.0D * var1) + (7.0D * Math.pow(var4, 4.0D) / 48.0D + 29.0D * Math.pow(var4, 6.0D) / 240.0D + 811.0D * Math.pow(var4, 8.0D) / 11520.0D) * Math.sin(4.0D * var1) + (7.0D * Math.pow(var4, 6.0D) / 120.0D + 81.0D * Math.pow(var4, 8.0D) / 1120.0D) * Math.sin(6.0D * var1) + 4279.0D * Math.pow(var4, 8.0D) / 161280.0D * Math.sin(8.0D * var1);
+    }
+
+    public void tfm_PopularMercator_to_8307(int[] var1, double[] var2, boolean var3) {
+        if (var1 != null) {
+            this.convertOrientedPointsFw(var1, var2);
+        }
+
+        if (var2 != null) {
+            for(int var4 = 0; var4 < var2.length; var4 += this.getDimensions()) {
+                double var5 = var2[var4 + 0];
+                double var7 = var2[var4 + 1];
+                double var9 = Math.pow(MERCATOR_B, (0.0D - var7) / 6378137.0D);
+                double var11 = 1.5707963267948966D - 2.0D * Math.atan2(var9, 1.0D);
+                var2[var4 + 1] = this.tfm_PopularMercator_to_8307_lat(var11, var3) * 180.0D / 3.141592653589793D;
+                var2[var4 + 0] = this.tfm_PopularMercator_to_8307_lon(var5) * 180.0D / 3.141592653589793D;
+            }
+        }
+
+        if (var1 != null) {
+            this.convertOrientedPointsRv(var1, var2);
+        }
+
+    }
+
+    public void tfm_PopularMercator_to_8307(boolean var1) {
+        if (this.getSRID() != (var1 ? '틴' : 3785)) {
+            throw new RuntimeException("Source geometry must be SRID 3785/54004, when transforming to 8307.");
+        } else if (this.hasCircularArcs()) {
+            throw new RuntimeException("Circular Arcs not allowed in 8307.");
+        } else {
+            double[] var2 = this.getPoint();
+            this.tfm_PopularMercator_to_8307((int[])null, var2, var1);
+            this.x = var2[0];
+            this.y = var2[1];
+            this.tfm_PopularMercator_to_8307(this.getElemInfo(), this.getOrdinatesArray(), var1);
+            this.setSRID(8307);
+        }
+    }
+
+    private class Ring {
+        JGeometry.Vertex startVertex;
+        int numVertices;
+        int numArcs;
+        int numSubElements;
+        ArrayList holeList = new ArrayList();
+
+        Ring(JGeometry.Vertex var2) {
+            this.startVertex = var2;
+        }
+
+        boolean pointInside(double var1, double var3) {
+            boolean var5 = false;
+            JGeometry.Vertex var6 = this.startVertex;
+
+            do {
+                if (var6.x < var1 != var6.next.x < var1 && (var6.y >= var3 || var6.next.y >= var3) && (var6.y >= var3 && var6.next.y >= var3 || var6.y + (var1 - var6.x) * (var6.next.y - var6.y) / (var6.next.x - var6.x) >= var3)) {
+                    var5 = !var5;
+                }
+
+                var6 = var6.next;
+            } while(var6 != this.startVertex);
+
+            return var5;
+        }
+
+        void addHole(JGeometry.Ring var1) {
+            this.holeList.add(var1);
+        }
+    }
+
+    private class ArcVertex extends JGeometry.Vertex {
+        JPoint2DD center;
+        boolean blackout;
+
+        ArcVertex(double var2, double var4, double var6, double var8) {
+            super(var2, var4);
+            this.center = new JPoint2DD(var6, var8);
+        }
+    }
+
+    private class Vertex {
+        public double x;
+        public double y;
+        boolean isInside = false;
+        boolean isIntersection = false;
+        boolean isStarterIntersection = false;
+        boolean isUsed = false;
+        JGeometry.Vertex matchIntersection = null;
+        JGeometry.Vertex prev = null;
+        JGeometry.Vertex next = null;
+
+        Vertex(double var2, double var4) {
+            this.x = var2;
+            this.y = var4;
+        }
+
+        void print() {
+            System.out.print(this.toString());
+            if (!(this instanceof JGeometry.ArcVertex)) {
+                System.out.print("   ");
+            }
+
+            System.out.print(" x " + this.x + " y " + this.y + " inside " + (this.isInside ? 't' : 'f') + " intscn " + (this.isIntersection ? 't' : 'f') + " starter " + (this.isStarterIntersection ? 't' : 'f') + " used " + (this.isUsed ? 't' : 'f'));
+            if (this instanceof JGeometry.ArcVertex) {
+                System.out.print(" blackout " + (((JGeometry.ArcVertex)this).blackout ? 't' : 'f'));
+            }
+
+            System.out.println();
+            if (!this.isStarterIntersection && this.isIntersection) {
+                System.out.println("match " + this.matchIntersection.toString());
+            }
+
+        }
+    }
+
+    protected static class ElementIterator {
+        public int ei = 0;
+        public int nextei = 0;
+        public int dim = 2;
+        public int gtype = 0;
+        public int[] elemInfo = null;
+        public double[] ordinates = null;
+        public int ord_offset = 0;
+        public int etype = 0;
+        public int original_etype = 0;
+        public int top_etype = 0;
+        public int eitpr = 0;
+        public int next_ord_offset = 0;
+        public int nCoord = 0;
+        public int nSubElement = 0;
+        public boolean lastElem = false;
+        public boolean isFirstElemOfCompound = false;
+        public boolean isCompound = false;
+        public boolean isOrientedPoint = false;
+        public int orient_offset = 2;
+
+        public ElementIterator(JGeometry var1) {
+            this.gtype = var1.gtype;
+            this.elemInfo = var1.elemInfo;
+            this.ordinates = var1.ordinates;
+            if (var1.dim > 0) {
+                this.dim = var1.dim;
+            }
+
+            if (var1.isOrientedPoint() || var1.isOrientedMultiPoint()) {
+                this.isOrientedPoint = true;
+                if (var1.isOrientedMultiPoint()) {
+                    this.orient_offset = var1.getOrientMultiPointOffset();
+                }
+            }
+
+        }
+
+        public boolean next() {
+            if (this.elemInfo == null) {
+                return false;
+            } else {
+                if (this.isFirstElemOfCompound && this.nSubElement > 0) {
+                    this.isFirstElemOfCompound = false;
+                }
+
+                if (this.nSubElement > 0) {
+                    --this.nSubElement;
+                }
+
+                if (this.nSubElement == 0) {
+                    this.isCompound = false;
+                }
+
+                while(this.ei <= this.elemInfo.length - 3 && (this.ei != 3 || !this.isOrientedPoint)) {
+                    this.etype = this.elemInfo[this.ei + 1] % 10;
+                    this.original_etype = this.elemInfo[this.ei + 1];
+                    if (!this.isCompound) {
+                        this.top_etype = this.etype;
+                    }
+
+                    if (this.etype == 1) {
+                        this.eitpr = 1;
+                    } else {
+                        this.eitpr = this.elemInfo[this.ei + 2];
+                    }
+
+                    if (this.etype != 0) {
+                        if (this.etype >= 4) {
+                            this.isFirstElemOfCompound = true;
+                            this.isCompound = true;
+                            this.nSubElement = this.eitpr;
+                            this.ei += 3;
+                            this.etype = this.elemInfo[this.ei + 1] % 10;
+                            this.eitpr = this.elemInfo[this.ei + 2];
+                        }
+
+                        this.nextei = this.ei + 3;
+                        this.ord_offset = this.elemInfo[this.ei] - 1;
+                        this.etype = this.elemInfo[this.ei + 1];
+                        if (this.etype == 1) {
+                            this.eitpr = 1;
+                        } else {
+                            this.eitpr = this.elemInfo[this.ei + 2];
+                        }
+
+                        this.lastElem = this.nextei > this.elemInfo.length - 3 || this.nextei == 3 && this.isOrientedPoint;
+                        if (this.isOrientedPoint) {
+                            this.nCoord = this.ordinates.length / (this.dim + this.orient_offset);
+                        } else {
+                            this.next_ord_offset = this.lastElem ? this.ordinates.length : this.elemInfo[this.nextei] - 1;
+                            this.nCoord = (this.next_ord_offset - this.ord_offset) / this.dim;
+                        }
+
+                        if (this.nSubElement > 1) {
+                            ++this.nCoord;
+                        }
+
+                        this.ei += 3;
+                        return true;
+                    }
+
+                    this.ei += 3;
+                }
+
+                return false;
+            }
+        }
+    }
+
+    public static class Point {
+        double x;
+        double y;
+        double z;
+        double m;
+
+        public Point() {
+            this.x = 0.0D;
+            this.y = 0.0D;
+        }
+
+        public Point(double var1, double var3) {
+            this.x = var1;
+            this.y = var3;
+        }
+
+        public final boolean equals(JGeometry.Point var1) {
+            return this.x == var1.x && this.y == var1.y;
+        }
+
+        public double getX() {
+            return this.x;
+        }
+
+        public double getY() {
+            return this.y;
+        }
+
+        public void set(double var1, double var3) {
+            this.x = var1;
+            this.y = var3;
+        }
+    }
+
+    private class LT_transform {
+        double ne;
+        double xc;
+        double yc;
+        double zc;
+        double[] xrow;
+        double[] yrow;
+        double[] zrow;
+
+        public LT_transform(double var2, double var4, JGeometry.Gc_trans var6) {
+            double var7 = Math.cos(var4);
+            double var9 = Math.sin(var4);
+            double var11 = Math.cos(var2);
+            double var13 = Math.sin(var2);
+            this.ne = var6.smax / Math.sqrt(1.0D - var6.esq * var9 * var9);
+            this.xc = var7 * var11 * this.ne;
+            this.yc = var7 * var13 * this.ne;
+            this.zc = var9 * (1.0D - var6.esq) * this.ne;
+            this.xrow = new double[3];
+            this.yrow = new double[3];
+            this.zrow = new double[3];
+            this.xrow[0] = -var13;
+            this.xrow[1] = var11;
+            this.xrow[2] = 0.0D;
+            this.yrow[0] = -var11 * var9;
+            this.yrow[1] = -var13 * var9;
+            this.yrow[2] = var7;
+            this.zrow[0] = var7 * var11;
+            this.zrow[1] = var7 * var13;
+            this.zrow[2] = var9;
+        }
+    }
+
+    private class Gc_trans {
+        double smax;
+        double smin;
+        double flat;
+        double esq;
+        double e;
+        double t;
+        double radius;
+        double area;
+        double unitfactor;
+        int txsrid;
+
+        public Gc_trans(double var2, double var4) {
+            this.txsrid = JGeometry.this.srid;
+            this.smax = var2;
+            this.flat = var4;
+            this.smin = this.smax * (1.0D - this.flat);
+            this.esq = this.flat * (-this.flat + 2.0D);
+            this.e = Math.sqrt(this.esq);
+            if (this.e < 1.0E-8D) {
+                this.radius = this.smax * (1.0D - this.e / 4.0D);
+            } else {
+                this.radius = this.smax * Math.sqrt((2.0D * this.e + (1.0D - this.esq) * (Math.log(1.0D + this.e) - Math.log(1.0D - this.e))) / (4.0D * this.e));
+            }
+
+            this.t = Math.sqrt(1.0D - this.esq);
+            this.unitfactor = 0.017453292519943295D;
+            this.area = 12.566370614359172D * this.radius * this.radius;
+        }
+    }
+}

+ 50 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/oracle/geometry/JPoint2DD.java

@@ -0,0 +1,50 @@
+package org.dbsyncer.connector.oracle.geometry;
+
+import java.io.Serializable;
+
+public class JPoint2DD implements Serializable {
+    public double x;
+    public double y;
+
+    public JPoint2DD() {
+        this.x = this.y = 0.0D;
+    }
+
+    public JPoint2DD(double var1, double var3) {
+        this.x = var1;
+        this.y = var3;
+    }
+
+    public JPoint2DD(JPoint2DD var1) {
+        this.x = var1.x;
+        this.y = var1.y;
+    }
+
+    public double[] getArray() {
+        return new double[]{this.x, this.y};
+    }
+
+    public double getX() {
+        return this.x;
+    }
+
+    public double getY() {
+        return this.y;
+    }
+
+    public void setX(double var1) {
+        this.x = var1;
+    }
+
+    public void setY(double var1) {
+        this.y = var1;
+    }
+
+    public String toString() {
+        return new String(this.x + " " + this.y);
+    }
+
+    public boolean equals(JPoint2DD var1) {
+        return var1.x == this.x && var1.y == this.y;
+    }
+}

+ 775 - 0
dbsyncer-connector/src/main/java/org/dbsyncer/connector/oracle/geometry/SdoPickler.java

@@ -0,0 +1,775 @@
+package org.dbsyncer.connector.oracle.geometry;
+
+import java.sql.SQLException;
+
+import oracle.sql.NUMBER;
+
+class SdoPickler {
+    private static final double[][] powerTable = new double[][]{{128.0D, 1.0E256D, 1.0E-256D}, {64.0D, 1.0E128D, 1.0E-128D}, {32.0D, 1.0E64D, 1.0E-64D}, {16.0D, 1.0E32D, 1.0E-32D}, {8.0D, 1.0E16D, 1.0E-16D}, {4.0D, 1.0E8D, 1.0E-8D}, {2.0D, 10000.0D, 1.0E-4D}, {1.0D, 100.0D, 0.01D}};
+
+    SdoPickler() {
+    }
+
+    static final JGeometry unpickle(byte[] var0) throws SQLException {
+        if (var0 != null && var0.length >= 7) {
+            SdoPickler.UnpickleHelper var1 = new SdoPickler.UnpickleHelper(var0);
+            var1.checkImageHeader();
+            var1.skipLength();
+            int var2 = getInt(var1);
+            int var3 = getInt0(var1);
+            double var5 = 0.0D / 0.0;
+            double var7 = 0.0D / 0.0;
+            double var9 = 0.0D / 0.0;
+            if ((var0[var1.offset] & 255) == 253) {
+                ++var1.offset;
+            } else {
+                var5 = getDouble0(var1);
+                var7 = getDouble0(var1);
+                var9 = getDouble0(var1);
+                if (Double.isNaN(var5) || Double.isNaN(var7)) {
+                    var5 = 0.0D / 0.0;
+                    var7 = 0.0D / 0.0;
+                }
+            }
+
+            int[] var11 = getElemInfoArray(var1);
+            double[] var12 = getOrdinates(var1, var2);
+            if (var12 != null && var11 != null) {
+                return new JGeometry(var2, var3, var5, var7, var9, var11, var12);
+            } else if (!Double.isNaN(var5) && !Double.isNaN(var7)) {
+                return !Double.isNaN(var9) ? new JGeometry(var5, var7, var9, var3) : new JGeometry(var5, var7, var3);
+            } else {
+                return new JGeometry(var2, var3, var11, var12);
+            }
+        } else {
+            throw new SQLException("Invalid geometry image");
+        }
+    }
+
+    private static final int getInt0(SdoPickler.UnpickleHelper var0) throws SQLException {
+        byte[] var1 = var0.image;
+        int var2 = var0.offset;
+        byte var3 = var1[var2];
+        if (var3 <= 0) {
+            ++var0.offset;
+            return 0;
+        } else {
+            var0.offset += 1 + var3;
+            if (var3 == 1 && var1[var2 + 1] == -128) {
+                return 0;
+            } else {
+                byte[] var4 = new byte[var3];
+                System.arraycopy(var1, var2 + 1, var4, 0, var3);
+                return NUMBER.toInt(var4);
+            }
+        }
+    }
+
+    private static final int getInt(SdoPickler.UnpickleHelper var0) throws SQLException {
+        byte[] var1 = var0.image;
+        int var2 = var0.offset;
+        byte var3 = var1[var2];
+        if (var3 <= 0) {
+            throw new SQLException("Invalid NULL value is found in sdo_gtype or sdo_elem_info");
+        } else {
+            var0.offset += 1 + var3;
+            if (var3 == 1 && var1[var2 + 1] == -128) {
+                return 0;
+            } else {
+                byte[] var4 = new byte[var3];
+                System.arraycopy(var1, var2 + 1, var4, 0, var3);
+                return NUMBER.toInt(var4);
+            }
+        }
+    }
+
+    private static final double getDouble0(SdoPickler.UnpickleHelper var0) {
+        byte[] var1 = var0.image;
+        int var2 = var0.offset;
+        byte var3 = var1[var2];
+        if (var3 <= 0) {
+            ++var0.offset;
+            return 0.0D / 0.0;
+        } else {
+            var0.offset += 1 + var3;
+            if (var3 == 1 && var1[var2 + 1] == -128) {
+                return 0.0D;
+            } else {
+                byte[] var4 = new byte[var3];
+                System.arraycopy(var1, var2 + 1, var4, 0, var3);
+                return NUMBER.toDouble(var4);
+            }
+        }
+    }
+
+    private static final double getDouble(SdoPickler.UnpickleHelper var0) throws SQLException {
+        double var1 = getDouble0(var0);
+        if (Double.isNaN(var1)) {
+            throw new SQLException("An invalid NULL value is found in sdo_ordinates");
+        } else {
+            return var1;
+        }
+    }
+
+    private static final int[] getElemInfoArray(SdoPickler.UnpickleHelper var0) throws SQLException {
+        byte var1 = var0.readByte();
+        if ((var1 & 255) == 255) {
+            return null;
+        } else {
+            var0.skipRestOfLength(var1);
+            var0.checkArrayHeader();
+            var0.readByte();
+            int var2 = var0.readLength();
+            if (var2 < 0) {
+                return null;
+            } else if (var2 % 3 != 0) {
+                throw new SQLException("Corrupted element info array");
+            } else {
+                int[] var3 = new int[var2];
+
+                for(int var4 = 0; var4 < var2; ++var4) {
+                    var3[var4] = getInt(var0);
+                }
+
+                return var3;
+            }
+        }
+    }
+
+    private static final double[] getOrdinates(SdoPickler.UnpickleHelper var0, int var1) throws SQLException {
+        byte var2 = var0.readByte();
+        if ((var2 & 255) == 255) {
+            return null;
+        } else {
+            var0.skipRestOfLength(var2);
+            var0.checkArrayHeader();
+            var0.readByte();
+            int var3 = var0.readLength();
+            if (var3 < 0) {
+                return null;
+            } else {
+                double[] var4 = new double[var3];
+                int var5;
+                if (var1 % 1000 / 100 == 0) {
+                    for(var5 = 0; var5 < var3; ++var5) {
+                        var4[var5] = getDouble(var0);
+                    }
+                } else {
+                    var5 = var1 % 1000 / 100;
+                    int var6 = var1 / 1000 > 0 ? var1 / 1000 : 2;
+                    if (var6 == 2 || (var6 != 3 || var6 != var5) && (var6 != 4 || var5 != 3 && var5 != 4)) {
+                        throw new SQLException("An invalid sdo_gtype is found");
+                    }
+
+                    for(int var7 = 0; var7 < var3; ++var7) {
+                        var4[var7] = getDouble0(var0);
+                        if (var4[var7] == 0.0D / 0.0 && var7 % var6 != var5 - 1) {
+                            throw new SQLException("An invalid null value is found in LRS sdo_ordinates");
+                        }
+                    }
+                }
+
+                return var4;
+            }
+        }
+    }
+
+    static final byte[] pickle(JGeometry var0) throws SQLException {
+        if (var0 == null) {
+            throw new SQLException("Found null geometry");
+        } else {
+            int var1 = var0.gtype + var0.linfo * 100 + var0.dim * 1000;
+            byte[] var2 = NUMBER.toBytes(var1);
+            int var3 = 1 + var2.length;
+            byte[] var4 = new byte[]{-1};
+            int var5 = 1;
+            if (var0.srid != 0) {
+                var4 = NUMBER.toBytes(var0.srid);
+                var5 += var4.length;
+            }
+
+            if (var0.gtype == 1 && var0.dim == 3 && Double.isNaN(var0.z)) {
+                throw new SQLException("Invalid z value in the JGeometry instance.");
+            } else {
+                byte[] var6 = new byte[]{-3};
+                byte var7 = 1;
+                int var8 = 1;
+                byte[] var9 = null;
+                byte[] var10 = new byte[]{-1};
+                if (var0.gtype == 1 && !Double.isNaN(var0.x) && !Double.isNaN(var0.y)) {
+                    var7 = 2;
+                    var6 = toBytes(var0.x);
+                    var8 = 1 + var6.length;
+                    var9 = toBytes(var0.y);
+                    var8 += 2 + var9.length;
+                    if (var0.dim == 3) {
+                        var10 = toBytes(var0.z);
+                        var7 = 3;
+                        var8 += var10.length;
+                    }
+                }
+
+                byte[] var11 = new byte[]{-1};
+                int var12 = 1;
+                int var14;
+                if (var0.elemInfo != null && var0.elemInfo.length > 0) {
+                    var11 = new byte[20 + var0.elemInfo.length * 22];
+                    var12 = 20;
+
+                    for(var14 = 0; var14 < var0.elemInfo.length; ++var14) {
+                        byte[] var13 = NUMBER.toBytes(var0.elemInfo[var14]);
+                        var11[var12] = (byte)var13.length;
+                        System.arraycopy(var13, 0, var11, var12 + 1, var13.length);
+                        var12 += var13.length + 1;
+                    }
+
+                    var11[5] = -120;
+                    var11[6] = 1;
+                    writeLength5(var12 - 5, var11, 7);
+                    var11[12] = 1;
+                    var11[13] = 1;
+                    var11[14] = 0;
+                    writeLength5(var0.elemInfo.length, var11, 15);
+                    writeLength5(var12 - 5, var11, 0);
+                }
+
+                int var21 = 7 + var3 + var5 + var8 + var12;
+                var14 = var0.ordinates != null && var0.ordinates.length > 0 ? 20 + var0.ordinates.length * 22 : 1;
+                byte[] var15 = new byte[var21 + var14];
+                var15[0] = -124;
+                var15[1] = 1;
+                writeLength5(var21 + var14, var15, 2);
+                byte var16 = 7;
+                var15[var16] = (byte)var2.length;
+                System.arraycopy(var2, 0, var15, var16 + 1, var2.length);
+                int var22 = var16 + var2.length + 1;
+                if (var0.srid != 0) {
+                    var15[var22++] = (byte)var4.length;
+                }
+
+                System.arraycopy(var4, 0, var15, var22, var4.length);
+                var22 += var4.length;
+                if (var7 == 1) {
+                    System.arraycopy(var6, 0, var15, var22++, 1);
+                } else {
+                    var15[var22++] = (byte)var6.length;
+                    System.arraycopy(var6, 0, var15, var22, var6.length);
+                    var22 += var6.length;
+                    var15[var22++] = (byte)var9.length;
+                    System.arraycopy(var9, 0, var15, var22, var9.length);
+                    var22 += var9.length;
+                    if (var7 == 3) {
+                        var15[var22++] = (byte)var10.length;
+                        System.arraycopy(var10, 0, var15, var22, var10.length);
+                        var22 += var10.length;
+                    } else {
+                        System.arraycopy(var10, 0, var15, var22++, 1);
+                    }
+                }
+
+                System.arraycopy(var11, 0, var15, var22, var12);
+                var22 += var12;
+                int var17 = 1;
+                if (var0.ordinates != null && var0.ordinates.length > 0) {
+                    var17 = 20;
+                    boolean var19 = false;
+                    byte[] var18;
+                    int var20;
+                    int var23;
+                    if (var0.linfo == 0) {
+                        for(var20 = 0; var20 < var0.ordinates.length; ++var20) {
+                            var18 = toBytes(var0.ordinates[var20]);
+                            var23 = var22 + var17;
+                            var15[var23] = (byte)var18.length;
+                            System.arraycopy(var18, 0, var15, var23 + 1, var18.length);
+                            var17 += var18.length + 1;
+                        }
+                    } else {
+                        if (var0.dim == 2 || var0.dim == 3 && var0.linfo != 3 || var0.dim == 4 && var0.linfo != 3 && var0.linfo != 4) {
+                            throw new SQLException("An invalid gtype value for LRS is found.");
+                        }
+
+                        for(var20 = 0; var20 < var0.ordinates.length; ++var20) {
+                            if (Double.isNaN(var0.ordinates[var20]) && var20 % var0.dim != var0.linfo - 1) {
+                                throw new SQLException("An invalid Double.NaN value is found in LRS ordinates");
+                            }
+
+                            if (Double.isNaN(var0.ordinates[var20])) {
+                                var15[var22 + var17] = -1;
+                                ++var17;
+                            } else {
+                                var18 = toBytes(var0.ordinates[var20]);
+                                var23 = var22 + var17;
+                                var15[var23] = (byte)var18.length;
+                                System.arraycopy(var18, 0, var15, var23 + 1, var18.length);
+                                var17 += var18.length + 1;
+                            }
+                        }
+                    }
+
+                    var15[var22 + 5] = -120;
+                    var15[var22 + 6] = 1;
+                    writeLength5(var17 - 5, var15, var22 + 7);
+                    var15[var22 + 12] = 1;
+                    var15[var22 + 13] = 1;
+                    var15[var22 + 14] = 0;
+                    writeLength5(var0.ordinates.length, var15, var22 + 15);
+                    writeLength5(var17 - 5, var15, var22);
+                } else {
+                    var15[var22] = -1;
+                }
+
+                var21 += var17;
+                writeLength5(var21, var15, 2);
+                return var15;
+            }
+        }
+    }
+
+    private static void writeLength5(int var0, byte[] var1, int var2) {
+        var1[var2] = -2;
+        var1[var2 + 1] = (byte)(var0 >> 24);
+        var0 &= 16777215;
+        var1[var2 + 2] = (byte)(var0 >> 16);
+        var0 &= 65535;
+        var1[var2 + 3] = (byte)(var0 >> 8);
+        var0 &= 255;
+        var1[var2 + 4] = (byte)var0;
+    }
+
+    private static byte[] toBytes(double var0) throws SQLException {
+        byte[] var2 = new byte[20];
+        int var3 = 0;
+        boolean var4 = false;
+        boolean var15 = false;
+        boolean var16 = false;
+        boolean var17 = false;
+        boolean var20 = false;
+        boolean var21 = false;
+        boolean var5 = var0 >= 0.0D;
+        var0 = Math.abs(var0);
+        String var18 = Double.toString(var0);
+        int var24 = var18.length();
+        int var25 = var18.indexOf(69);
+        byte var6;
+        int var8;
+        int var9;
+        int var10;
+        if (var25 != -1) {
+            if (var25 == var25 / 2 * 2) {
+                var4 = true;
+            }
+
+            var3 = Integer.valueOf(var18.substring(var25 + 1, var24));
+            if (var3 != var3 / 2 * 2) {
+                var9 = var3 / 2 + 1;
+            } else {
+                var9 = var3 / 2;
+            }
+
+            if (var9 > 62) {
+                throw new SQLException("Overflow");
+            }
+
+            if (var9 < -65) {
+                throw new SQLException("Underflow");
+            }
+
+            if (var3 != var3 / 2 * 2) {
+                ++var3;
+                var17 = true;
+                var4 = !var4;
+            }
+
+            var6 = var4 ? (byte)(var25 / 2) : (byte)((var25 + 1) / 2);
+            if (var17) {
+                var2[0] = (byte)Integer.parseInt(var18.substring(0, 1) + var18.substring(2, 3));
+                var9 = 3;
+            } else {
+                var2[0] = (byte)Integer.parseInt(var18.substring(0, 1));
+                var9 = 2;
+            }
+
+            if (var25 <= 3) {
+                if (var6 == 2) {
+                    var2[1] = (byte)(Integer.parseInt(var18.substring(2, 3)) * 10);
+                }
+            } else {
+                for(var8 = 1; var8 < var6 - 1; ++var8) {
+                    var2[var8] = (byte)Integer.parseInt(var18.substring(var9, var9 + 2));
+                    var9 += 2;
+                }
+
+                if (var4) {
+                    var2[var6 - 1] = (byte)Integer.parseInt(var18.substring(var25 - 2, var25));
+                } else {
+                    var2[var6 - 1] = (byte)(Integer.parseInt(var18.substring(var25 - 1, var25)) * 10);
+                }
+            }
+
+            var3 /= 2;
+
+            for(var8 = var6 - 1; var8 != 0 && var2[var8] == 0; --var8) {
+                --var6;
+            }
+        } else if (var24 >= 17) {
+            if (var0 >= 1.0D) {
+                for(var9 = 0; var9 < 8; ++var9) {
+                    if (powerTable[var9][1] <= var0) {
+                        var3 += (int)powerTable[var9][0];
+                        var0 *= powerTable[var9][2];
+                    }
+                }
+            } else {
+                for(var9 = 0; var9 < 8; ++var9) {
+                    if (powerTable[var9][2] >= var0) {
+                        var3 -= (int)powerTable[var9][0];
+                        var0 *= powerTable[var9][1];
+                    }
+                }
+
+                if (var0 < 1.0D) {
+                    --var3;
+                    var0 *= 100.0D;
+                }
+            }
+
+            if (var3 > 62) {
+                throw new SQLException("Overflow");
+            }
+
+            if (var3 < -65) {
+                throw new SQLException("Underflow");
+            }
+
+            boolean var22 = var0 >= 10.0D;
+            var10 = var18.indexOf(46);
+            if (var10 == -1) {
+                throw new SQLException("Invalid double value found: " + var18);
+            }
+
+            var9 = var24 - var10 - 1;
+            var4 = var9 == var9 / 2 * 2;
+            StringBuffer var23 = new StringBuffer(20);
+
+            for(var9 = 0; var9 < var24 && (var9 == var10 || var18.charAt(var9) == '0'); ++var9) {
+            }
+
+            for(; var9 < var24; ++var9) {
+                if (var9 != var10) {
+                    var23.append(var18.charAt(var9));
+                }
+            }
+
+            String var19 = var23.toString();
+            var25 = var19.length();
+            var6 = (byte)((var25 + 1) / 2);
+            if (var25 == 1) {
+                if (var22) {
+                    var2[0] = (byte)(Integer.parseInt(var19.substring(0, 1)) * 10);
+                } else {
+                    var2[0] = (byte)Integer.parseInt(var19.substring(0, 1));
+                }
+            } else if (var25 == 2) {
+                if (var22) {
+                    var2[0] = (byte)Integer.parseInt(var19.substring(0, 2));
+                } else if (var19.charAt(1) == '0') {
+                    var2[0] = (byte)Integer.parseInt(var19.substring(0, 1));
+                } else {
+                    ++var6;
+                    var2[0] = (byte)Integer.parseInt(var19.substring(0, 1));
+                    var2[1] = (byte)(Integer.parseInt(var19.substring(1, 2)) * 10);
+                }
+            } else {
+                if (!var22 && var25 == var25 / 2 * 2) {
+                    ++var6;
+                }
+
+                if (var22) {
+                    var2[0] = (byte)Integer.parseInt(var19.substring(0, 2));
+                    var9 = 2;
+                } else {
+                    var2[0] = (byte)Integer.parseInt(var18.substring(0, 1));
+                    var9 = 1;
+                }
+
+                for(var8 = 1; var8 < var6 - 1; ++var8) {
+                    var2[var8] = (byte)Integer.parseInt(var19.substring(var9, var9 + 2));
+                    var9 += 2;
+                }
+
+                if (var4) {
+                    var2[var6 - 1] = (byte)Integer.parseInt(var18.substring(var24 - 2, var24));
+                } else {
+                    var2[var6 - 1] = (byte)(Integer.parseInt(var18.substring(var24 - 1, var24)) * 10);
+                }
+
+                for(var8 = var6 - 1; var8 != 0 && var2[var8] == 0; --var8) {
+                    --var6;
+                }
+            }
+        } else {
+            if (var0 >= 1.0D) {
+                for(var9 = 0; var9 < 8; ++var9) {
+                    if (powerTable[var9][1] <= var0) {
+                        var3 += (int)powerTable[var9][0];
+                        var0 *= powerTable[var9][2];
+                    }
+                }
+            } else {
+                for(var9 = 0; var9 < 8; ++var9) {
+                    if (powerTable[var9][2] >= var0) {
+                        var3 -= (int)powerTable[var9][0];
+                        var0 *= powerTable[var9][1];
+                    }
+                }
+
+                if (var0 < 1.0D) {
+                    --var3;
+                    var0 *= 100.0D;
+                }
+            }
+
+            if (var3 != 256 && var3 > 62) {
+                System.out.println(" exponent = " + var3 + " lnxexpmx - lNXEXPBS -1 = " + 62);
+                throw new SQLException("Overflow");
+            }
+
+            if (var3 != -256 && var3 < -65) {
+                System.out.println(" value = " + var0 + " exponent = " + var3 + " LNXEXPMN - LNXEXPBS -1 = " + -65);
+                throw new SQLException("Underflow");
+            }
+
+            var4 = var0 < 10.0D;
+            var6 = 8;
+            var8 = 0;
+
+            byte var7;
+            for(var7 = (byte)((int)var0); var8 < var6; ++var8) {
+                var2[var8] = var7;
+                var0 = (var0 - (double)var7) * 100.0D;
+                var7 = (byte)((int)var0);
+            }
+
+            var8 = 7;
+            if (var4) {
+                if (var7 >= 50) {
+                    ++var2[var8];
+                }
+            } else if (var3 == 62 && (var2[var8] + 5) / 10 * 10 == 100) {
+                var2[var8] = (byte)((var2[var8] - 5) / 10 * 10);
+            } else {
+                var2[var8] = (byte)((var2[var8] + 5) / 10 * 10);
+            }
+
+            while(var2[var8] == 100) {
+                if (var8 == 0) {
+                    ++var3;
+                    var2[var8] = 1;
+                    break;
+                }
+
+                var2[var8] = 0;
+                --var8;
+                ++var2[var8];
+            }
+
+            for(var8 = 7; var8 != 0 && var2[var8] == 0; --var8) {
+                --var6;
+            }
+        }
+
+        byte[] var26;
+        if (var5) {
+            var10 = var6 + 1;
+            var26 = new byte[var10];
+            var26[0] = (byte)(var3 + 128 + 64 + 1);
+            if (var17) {
+                --var26[0];
+            }
+
+            for(var9 = 1; var9 < var10; ++var9) {
+                var26[var9] = (byte)(var2[var9 - 1] + 1);
+            }
+
+            return var26;
+        } else {
+            if (var6 < 20) {
+                var10 = var6 + 2;
+            } else {
+                var10 = var6 + 1;
+            }
+
+            var26 = new byte[var10];
+            var26[0] = (byte)(~(var3 + 128 + 64 + 1));
+            if (var17) {
+                ++var26[0];
+            }
+
+            for(var9 = 1; var9 < var10; ++var9) {
+                var26[var9] = (byte)(101 - var2[var9 - 1]);
+            }
+
+            if (var6 < 20) {
+                var26[var10 - 1] = 102;
+            }
+
+            return var26;
+        }
+    }
+
+    private static final class UnpickleHelper {
+        byte[] image = null;
+        int offset = 0;
+
+        protected UnpickleHelper(byte[] var1) {
+            this.image = var1;
+            this.offset = 0;
+        }
+
+        protected UnpickleHelper(byte[] var1, int var2) {
+            this.image = var1;
+            this.offset = var2;
+        }
+
+        protected int getOffset() {
+            return this.offset;
+        }
+
+        protected byte[] getImage() {
+            return this.image;
+        }
+
+        protected byte readByte() {
+            byte var1 = this.image[this.offset];
+            ++this.offset;
+            return var1;
+        }
+
+        protected byte[] readBytes(int var1) {
+            byte[] var2 = new byte[var1];
+            System.arraycopy(this.image, this.offset, var2, 0, var1);
+            this.offset += var1;
+            return var2;
+        }
+
+        protected final void checkImageHeader() throws SQLException {
+            byte var1 = this.image[0];
+            if ((var1 & 255 & 128) == 0) {
+                throw new SQLException("Image is not in 8.1 format");
+            } else if ((var1 & 255 & 8) != 0) {
+                throw new SQLException("Image is a collection image, expecting ADT");
+            } else {
+                byte var2 = this.image[1];
+                if ((var2 & 255) > 1) {
+                    throw new SQLException("Image version is not recognized");
+                } else {
+                    this.offset += 2;
+                }
+            }
+        }
+
+        protected final byte[] readDataValue() {
+            int var1 = this.image[this.offset] & 255;
+            if (var1 == 255) {
+                ++this.offset;
+                return null;
+            } else {
+                if (var1 > 245) {
+                    var1 = (((this.image[this.offset + 1] & 255) * 256 + (this.image[this.offset + 2] & 255)) * 256 + (this.image[this.offset + 3] & 255)) * 256 + (this.image[this.offset + 4] & 255);
+                    this.offset += 5;
+                } else {
+                    ++this.offset;
+                }
+
+                byte[] var2 = new byte[var1];
+                System.arraycopy(this.image, this.offset, var2, 0, var2.length);
+                this.offset += var2.length;
+                return var2;
+            }
+        }
+
+        protected byte[] readDataValue(int var1) {
+            if (var1 == 0) {
+                return null;
+            } else {
+                byte[] var2 = new byte[var1];
+                System.arraycopy(this.image, this.offset, var2, 0, var1);
+                this.offset += var1;
+                return var2;
+            }
+        }
+
+        protected boolean isElementNull(byte var1) {
+            return (var1 & 255) == 255;
+        }
+
+        protected final void skipLength() {
+            int var1 = this.image[this.offset] & 255;
+            if (var1 > 245) {
+                this.offset += 5;
+            } else {
+                ++this.offset;
+            }
+
+        }
+
+        protected final void skipTo(int var1) {
+            if (var1 > this.offset) {
+                this.offset = var1;
+            }
+
+        }
+
+        protected final int readLength() {
+            int var1 = this.image[this.offset] & 255;
+            if (var1 > 245) {
+                if (var1 == 255) {
+                    return -1;
+                }
+
+                var1 = (((this.image[this.offset + 1] & 255) * 256 + (this.image[this.offset + 2] & 255)) * 256 + (this.image[this.offset + 3] & 255)) * 256 + (this.image[this.offset + 4] & 255);
+                this.offset += 5;
+            } else {
+                ++this.offset;
+            }
+
+            return var1;
+        }
+
+        protected final void skipRestOfLength(byte var1) throws SQLException {
+            if ((var1 & 255) > 245) {
+                if ((var1 & 255) != 254) {
+                    throw new SQLException("Invalid first length byte");
+                }
+
+                this.offset += 4;
+            }
+
+        }
+
+        protected final void checkArrayHeader() throws SQLException {
+            byte var1 = this.readByte();
+            if ((var1 & 255 & 4) != 0) {
+                throw new SQLException("Array image has no prefix segment");
+            } else {
+                boolean var2 = true;
+                if ((var1 & 255 & 8) != 0) {
+                    var2 = true;
+                } else {
+                    if ((var1 & 255 & 16) == 0) {
+                        throw new SQLException("Image is not a collection image");
+                    }
+
+                    var2 = false;
+                }
+
+                this.readByte();
+                long var3 = (long)this.readLength();
+                int var5 = this.readLength();
+                byte var6 = this.readByte();
+                this.readDataValue(var5 - 1);
+            }
+        }
+    }
+}

+ 0 - 8
pom.xml

@@ -42,7 +42,6 @@
         <commons-io.version>2.5</commons-io.version>
         <lucene-analyzers-smartcn.version>8.8.0</lucene-analyzers-smartcn.version>
         <ojdbc6.version>11.2.0.4.0-atlassian-hosted</ojdbc6.version>
-        <sdoapi.version>11.2.0</sdoapi.version>
         <!--<mysql.version>5.1.40</mysql.version>-->
         <mysql.version>8.0.21</mysql.version>
         <mysql-binlog.version>0.21.0</mysql-binlog.version>
@@ -151,13 +150,6 @@
                 <version>${ojdbc6.version}</version>
             </dependency>
 
-            <!-- 如出现无法下载,请切换maven仓库地址:http://www.datanucleus.org/downloads/maven2/ -->
-            <dependency>
-                <groupId>oracle</groupId>
-                <artifactId>sdoapi</artifactId>
-                <version>${sdoapi.version}</version>
-            </dependency>
-
             <!-- sqlserver-driver -->
             <dependency>
                 <groupId>com.microsoft.sqlserver</groupId>