[josm-plugins] 01/01: Imported Upstream version 0.0.svn28420+ds2

Bas Couwenberg sebastic at xs4all.nl
Sat Oct 18 12:06:29 UTC 2014


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

sebastic-guest pushed a commit to annotated tag upstream/0.0.svn28420+ds2
in repository josm-plugins.

commit 246bce6195c2a4dd8a4f16bd64687b4088ba231b
Author: David Paleino <dapal at debian.org>
Date:   Fri Nov 9 21:30:45 2012 +0100

    Imported Upstream version 0.0.svn28420+ds2
---
 livegps/.classpath                                 |    7 -
 livegps/.project                                   |   17 -
 livegps/README                                     |   14 -
 livegps/build.xml                                  |  182 ---
 livegps/images/autocentermenu.png                  |  Bin 577 -> 0 bytes
 livegps/images/capturemenu.png                     |  Bin 743 -> 0 bytes
 livegps/images/centermenu.png                      |  Bin 745 -> 0 bytes
 livegps/images/dialogs/livegps.png                 |  Bin 2778 -> 0 bytes
 livegps/josm-livegps.launch                        |   12 -
 livegps/src/livegps/AppendableGpxTrackSegment.java |   62 -
 livegps/src/livegps/LiveGpsAcquirer.java           |  347 -----
 livegps/src/livegps/LiveGpsData.java               |  238 ---
 livegps/src/livegps/LiveGpsDialog.java             |  108 --
 livegps/src/livegps/LiveGpsLayer.java              |  231 ---
 livegps/src/livegps/LiveGpsPlugin.java             |  234 ---
 livegps/src/livegps/LiveGpsStatus.java             |   49 -
 livegps/src/livegps/SingleSegmentGpxTrack.java     |   43 -
 livegps/src/org/json/JSONArray.java                |  918 ------------
 livegps/src/org/json/JSONException.java            |   31 -
 livegps/src/org/json/JSONObject.java               | 1584 --------------------
 livegps/src/org/json/JSONString.java               |   18 -
 livegps/src/org/json/JSONTokener.java              |  435 ------
 svn-info.xml                                       |   10 +-
 23 files changed, 5 insertions(+), 4535 deletions(-)

diff --git a/livegps/.classpath b/livegps/.classpath
deleted file mode 100644
index b5edc13..0000000
--- a/livegps/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/JOSM"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/livegps/.project b/livegps/.project
deleted file mode 100644
index 29f9c6a..0000000
--- a/livegps/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>livegps</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/livegps/README b/livegps/README
deleted file mode 100644
index 373df65..0000000
--- a/livegps/README
+++ /dev/null
@@ -1,14 +0,0 @@
-liveGPS plugin for josm
------------------------
-
-Author: Frederik Ramm <frederik at remote.org>
-Public Domain.
-
-* Install like any other plugin
-* start the unix program "gpsd" on any machine in the network
-  (http://gpsd.berlios.de/)
-* run josm
-* activate track acquisition in "LiveGPS" menu
-
-Some problems exist!
-
diff --git a/livegps/build.xml b/livegps/build.xml
deleted file mode 100644
index 96e45b6..0000000
--- a/livegps/build.xml
+++ /dev/null
@@ -1,182 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-** This is the build file for the livegps plugin
-**
-** Maintaining versions
-** ====================
-** see README.template
-**
-** Usage
-** =====
-** To build it run
-**
-**    > ant  dist
-**
-** To install the generated plugin locally (in your default plugin directory) run
-**
-**    > ant  install
-**
-** To build against the core in ../../core, create a correct manifest and deploy to
-** SVN,
-**    set the properties commit.message and plugin.main.version
-** and run
-**    > ant  publish
-**
-**
--->
-<project name="livegps" default="dist" basedir=".">
-    <property name="commit.message" value="Changed the constructor signature of the plugin main class"/>
-    <property name="plugin.main.version" value="4980"/>
-    <property name="josm" location="../../core/dist/josm-custom.jar"/>
-    <property name="plugin.dist.dir" value="../../dist"/>
-    <property name="plugin.build.dir" value="build"/>
-    <property name="plugin.jar" value="${plugin.dist.dir}/${ant.project.name}.jar"/>
-    <property name="ant.build.javac.target" value="1.5"/>
-    <target name="init">
-        <mkdir dir="${plugin.build.dir}"/>
-    </target>
-    <target name="compile" depends="init">
-        <echo message="creating ${plugin.jar}"/>
-        <javac srcdir="src" classpath="${josm}" debug="true" destdir="${plugin.build.dir}">
-            <compilerarg value="-Xlint:deprecation"/>
-            <compilerarg value="-Xlint:unchecked"/>
-        </javac>
-    </target>
-    <target name="dist" depends="compile,revision">
-        <copy todir="${plugin.build.dir}/images">
-            <fileset dir="images"/>
-        </copy>
-        <copy todir="${plugin.build.dir}/data">
-            <fileset dir="data"/>
-        </copy>
-        <jar destfile="${plugin.jar}" basedir="${plugin.build.dir}">
-            <manifest>
-                <attribute name="Author" value="Frederik Ramm"/>
-                <attribute name="Plugin-Class" value="livegps.LiveGpsPlugin"/>
-                <attribute name="Plugin-Date" value="${version.entry.commit.date}"/>
-                <attribute name="Plugin-Description" value="Support live GPS input (moving dot) through a connection to gpsd server."/>
-                <attribute name="Plugin-Icon" value="images/dialogs/livegps.png"/>
-                <attribute name="Plugin-Link" value="http://wiki.openstreetmap.org/index.php/JOSM/Plugins/LiveGPS"/>
-                <attribute name="Plugin-Mainversion" value="${plugin.main.version}"/>
-                <attribute name="Plugin-Stage" value="50"/>
-                <attribute name="Plugin-Version" value="${version.entry.commit.revision}"/>
-            </manifest>
-        </jar>
-    </target>
-    <target name="revision">
-        <exec append="false" output="REVISION" executable="svn" failifexecutionfails="false">
-            <env key="LANG" value="C"/>
-            <arg value="info"/>
-            <arg value="--xml"/>
-            <arg value="."/>
-        </exec>
-        <xmlproperty file="REVISION" prefix="version" keepRoot="false" collapseAttributes="true"/>
-        <delete file="REVISION"/>
-    </target>
-    <target name="clean">
-        <delete dir="${plugin.build.dir}"/>
-        <delete file="${plugin.jar}"/>
-    </target>
-    <target name="install" depends="dist">
-        <property environment="env"/>
-        <condition property="josm.plugins.dir" value="${env.APPDATA}/JOSM/plugins" else="${user.home}/.josm/plugins">
-            <and>
-                <os family="windows"/>
-            </and>
-        </condition>
-        <copy file="${plugin.jar}" todir="${josm.plugins.dir}"/>
-    </target>
-    <!--
-         ************************** Publishing the plugin ***********************************
-        -->
-    <!--
-        ** extracts the JOSM release for the JOSM version in ../core and saves it in the
-        ** property ${coreversion.info.entry.revision}
-        **
-        -->
-    <target name="core-info">
-        <exec append="false" output="core.info.xml" executable="svn" failifexecutionfails="false">
-            <env key="LANG" value="C"/>
-            <arg value="info"/>
-            <arg value="--xml"/>
-            <arg value="../../core"/>
-        </exec>
-        <xmlproperty file="core.info.xml" prefix="coreversion" keepRoot="true" collapseAttributes="true"/>
-        <echo>Building against core revision ${coreversion.info.entry.revision}.</echo>
-        <echo>Plugin-Mainversion is set to ${plugin.main.version}.</echo>
-        <delete file="core.info.xml"/>
-    </target>
-    <!--
-        ** commits the source tree for this plugin
-        -->
-    <target name="commit-current">
-        <echo>Commiting the plugin source with message '${commit.message}' ...</echo>
-        <exec append="true" output="svn.log" executable="svn" failifexecutionfails="false">
-            <env key="LANG" value="C"/>
-            <arg value="commit"/>
-            <arg value="-m '${commit.message}'"/>
-            <arg value="."/>
-        </exec>
-    </target>
-    <!--
-        ** updates (svn up) the source tree for this plugin
-        -->
-    <target name="update-current">
-        <echo>Updating plugin source ...</echo>
-        <exec append="true" output="svn.log" executable="svn" failifexecutionfails="false">
-            <env key="LANG" value="C"/>
-            <arg value="up"/>
-            <arg value="."/>
-        </exec>
-        <echo>Updating ${plugin.jar} ...</echo>
-        <exec append="true" output="svn.log" executable="svn" failifexecutionfails="false">
-            <env key="LANG" value="C"/>
-            <arg value="up"/>
-            <arg value="../dist/${plugin.jar}"/>
-        </exec>
-    </target>
-    <!--
-        ** commits the plugin.jar
-        -->
-    <target name="commit-dist">
-        <echo>
-    ***** Properties of published ${plugin.jar} *****
-    Commit message    : '${commit.message}'
-    Plugin-Mainversion: ${plugin.main.version}
-    JOSM build version: ${coreversion.info.entry.revision}
-    Plugin-Version    : ${version.entry.commit.revision}
-    ***** / Properties of published ${plugin.jar} *****
-
-    Now commiting ${plugin.jar} ...
-    </echo>
-        <exec append="true" output="svn.log" executable="svn" failifexecutionfails="false">
-            <env key="LANG" value="C"/>
-            <arg value="-m '${commit.message}'"/>
-            <arg value="commit"/>
-            <arg value="${plugin.jar}"/>
-        </exec>
-    </target>
-    <!-- ** make sure svn is present as a command line tool ** -->
-    <target name="ensure-svn-present">
-        <exec append="true" output="svn.log" executable="svn" failifexecutionfails="false" failonerror="false" resultproperty="svn.exit.code">
-            <env key="LANG" value="C"/>
-            <arg value="--version"/>
-        </exec>
-        <fail message="Fatal: command 'svn --version' failed. Please make sure svn is installed on your system.">
-            <!-- return code not set at all? Most likely svn isn't installed -->
-            <condition>
-                <not>
-                    <isset property="svn.exit.code"/>
-                </not>
-            </condition>
-        </fail>
-        <fail message="Fatal: command 'svn --version' failed. Please make sure a working copy of svn is installed on your system.">
-            <!-- error code from SVN? Most likely svn is not what we are looking on this system -->
-            <condition>
-                <isfailure code="${svn.exit.code}"/>
-            </condition>
-        </fail>
-    </target>
-    <target name="publish" depends="ensure-svn-present,core-info,commit-current,update-current,clean,dist,commit-dist">
-    </target>
-</project>
diff --git a/livegps/images/autocentermenu.png b/livegps/images/autocentermenu.png
deleted file mode 100644
index 2b83bcf..0000000
Binary files a/livegps/images/autocentermenu.png and /dev/null differ
diff --git a/livegps/images/capturemenu.png b/livegps/images/capturemenu.png
deleted file mode 100644
index 232dbcd..0000000
Binary files a/livegps/images/capturemenu.png and /dev/null differ
diff --git a/livegps/images/centermenu.png b/livegps/images/centermenu.png
deleted file mode 100644
index 37a8c65..0000000
Binary files a/livegps/images/centermenu.png and /dev/null differ
diff --git a/livegps/images/dialogs/livegps.png b/livegps/images/dialogs/livegps.png
deleted file mode 100644
index c2f281b..0000000
Binary files a/livegps/images/dialogs/livegps.png and /dev/null differ
diff --git a/livegps/josm-livegps.launch b/livegps/josm-livegps.launch
deleted file mode 100644
index d2780b6..0000000
--- a/livegps/josm-livegps.launch
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/JOSM/src/org/openstreetmap/josm/gui/MainApplication.java"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="1"/>
-</listAttribute>
-<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JDK 6"/>
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.openstreetmap.josm.gui.MainApplication"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="livegps"/>
-</launchConfiguration>
diff --git a/livegps/src/livegps/AppendableGpxTrackSegment.java b/livegps/src/livegps/AppendableGpxTrackSegment.java
deleted file mode 100644
index 1631cd3..0000000
--- a/livegps/src/livegps/AppendableGpxTrackSegment.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package livegps;
-
-import java.util.Collection;
-
-import org.openstreetmap.josm.data.Bounds;
-import org.openstreetmap.josm.data.gpx.GpxTrackSegment;
-import org.openstreetmap.josm.data.gpx.WayPoint;
-import org.openstreetmap.josm.tools.CopyList;
-
-/**
- * Thread safe implementation of GpxTrackSegement
- *
- */
-public class AppendableGpxTrackSegment implements GpxTrackSegment {
-
-    private WayPoint[] wayPoints = new WayPoint[16];
-    private int size;
-    private Bounds bounds;
-    private double length;
-
-    public Bounds getBounds() {
-        return bounds;
-    }
-
-    public Collection<WayPoint> getWayPoints() {
-        return new CopyList<WayPoint>(wayPoints, size);
-    }
-
-    public void addWaypoint(WayPoint p) {
-        if (wayPoints.length == size) {
-            WayPoint[] newWaypoints = new WayPoint[wayPoints.length * 2];
-            System.arraycopy(wayPoints, 0, newWaypoints, 0, wayPoints.length);
-            wayPoints = newWaypoints;
-        }
-
-        if (size > 0) {
-            Double distance = wayPoints[size - 1].getCoor().greatCircleDistance(p.getCoor());
-            if (!distance.isNaN() && !distance.isInfinite()) {
-                length += distance;
-            }
-        }
-
-        if (bounds == null) {
-            bounds = new Bounds(p.getCoor());
-        } else {
-            bounds.extend(p.getCoor());
-        }
-
-        wayPoints[size] = p;
-        size++;
-    }
-
-    public double length() {
-        return length;
-    }
-
-    @Override
-    public int getUpdateCount() {
-        return size;
-    }
-
-}
diff --git a/livegps/src/livegps/LiveGpsAcquirer.java b/livegps/src/livegps/LiveGpsAcquirer.java
deleted file mode 100644
index e3f06af..0000000
--- a/livegps/src/livegps/LiveGpsAcquirer.java
+++ /dev/null
@@ -1,347 +0,0 @@
-package livegps;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.lang.Float;
-
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.net.InetAddress;
-import java.net.Socket;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.coor.LatLon;
-
-import org.json.JSONObject;
-import org.json.JSONException;
-
-public class LiveGpsAcquirer implements Runnable {
-    private static final String DEFAULT_HOST = "localhost";
-    private static final int DEFAULT_PORT = 2947;
-    private static final String C_HOST = "livegps.gpsd.host";
-    private static final String C_PORT = "livegps.gpsd.port";
-    private String gpsdHost;
-    private int gpsdPort;
-
-    private Socket gpsdSocket;
-    private BufferedReader gpsdReader;
-    private boolean connected = false;
-    private boolean shutdownFlag = false;
-    private boolean JSONProtocol = true;
-
-    private final List<PropertyChangeListener> propertyChangeListener = new ArrayList<PropertyChangeListener>();
-    private PropertyChangeEvent lastStatusEvent;
-    private PropertyChangeEvent lastDataEvent;
-
-    /**
-     * Constructor, initializes the configurable settings.
-     */
-    public LiveGpsAcquirer() {
-        super();
-
-        gpsdHost = Main.pref.get(C_HOST, DEFAULT_HOST);
-        gpsdPort = Main.pref.getInteger(C_PORT, DEFAULT_PORT);
-        // put the settings back in to the preferences, makes keys appear.
-        Main.pref.put(C_HOST, gpsdHost);
-        Main.pref.putInteger(C_PORT, gpsdPort);
-    }
-
-    /**
-     * Adds a property change listener to the acquirer.
-     * @param listener the new listener
-     */
-    public void addPropertyChangeListener(PropertyChangeListener listener) {
-        if (!propertyChangeListener.contains(listener)) {
-            propertyChangeListener.add(listener);
-        }
-    }
-
-    /**
-     * Remove a property change listener from the acquirer.
-     * @param listener the new listener
-     */
-    public void removePropertyChangeListener(PropertyChangeListener listener) {
-        if (propertyChangeListener.contains(listener)) {
-            propertyChangeListener.remove(listener);
-        }
-    }
-
-    /**
-     * Fire a gps status change event. Fires events with key "gpsstatus" and a {@link LiveGpsStatus}
-     * object as value.
-     * The status event may be sent any time.
-     * @param status the status.
-     * @param statusMessage the status message.
-     */
-    public void fireGpsStatusChangeEvent(LiveGpsStatus.GpsStatus status,
-            String statusMessage) {
-        PropertyChangeEvent event = new PropertyChangeEvent(this, "gpsstatus",
-                null, new LiveGpsStatus(status, statusMessage));
-
-        if (!event.equals(lastStatusEvent)) {
-            firePropertyChangeEvent(event);
-            lastStatusEvent = event;
-        }
-    }
-
-    /**
-     * Fire a gps data change event to all listeners. Fires events with key "gpsdata" and a
-     * {@link LiveGpsData} object as values.
-     * This event is only sent, when the suppressor permits it. This
-     * event will cause the UI to re-draw itself, which has some performance penalty,
-     * @param oldData the old gps data.
-     * @param newData the new gps data.
-     */
-    public void fireGpsDataChangeEvent(LiveGpsData oldData, LiveGpsData newData) {
-        PropertyChangeEvent event = new PropertyChangeEvent(this, "gpsdata",
-                oldData, newData);
-
-        if (!event.equals(lastDataEvent)) {
-            firePropertyChangeEvent(event);
-            lastDataEvent = event;
-        }
-    }
-
-    /**
-     * Fires the given event to all listeners.
-     * @param event the event to fire.
-     */
-    protected void firePropertyChangeEvent(PropertyChangeEvent event) {
-        for (PropertyChangeListener listener : propertyChangeListener) {
-            listener.propertyChange(event);
-        }
-    }
-
-    public void run() {
-        LiveGpsData oldGpsData = null;
-        LiveGpsData gpsData = null;
-
-        shutdownFlag = false;
-        while (!shutdownFlag) {
-
-	    while (!connected) {
-		try {
-                    connect();
-		} catch (IOException iox) {
-		    fireGpsStatusChangeEvent( LiveGpsStatus.GpsStatus.CONNECTION_FAILED, tr("Connection Failed"));
-                    try {
-                        Thread.sleep(1000);
-                    } catch (InterruptedException ignore) {}
-		};
-	    }
-
-	    assert (connected);
-
-	    try {
-                    String line;
-
-                    // <FIXXME date="23.06.2007" author="cdaller">
-                    // TODO this read is blocking if gps is connected but has no
-                    // fix, so gpsd does not send positions
-                    line = gpsdReader.readLine();
-                    // </FIXXME>
-                    if (line == null)
-                        throw new IOException();
-
-                    if (JSONProtocol == true)
-                        gpsData = ParseJSON(line);
-                    else
-                        gpsData = ParseOld(line);
-
-                    if (gpsData == null)
-                        continue;
-
-                    fireGpsDataChangeEvent(oldGpsData, gpsData);
-                    oldGpsData = gpsData;
-            } catch (IOException iox) {
-                System.out.println("LiveGps: lost connection to gpsd");
-                fireGpsStatusChangeEvent(
-                        LiveGpsStatus.GpsStatus.CONNECTION_FAILED,
-                        tr("Connection Failed"));
-		disconnect();
-                try {
-                    Thread.sleep(1000);
-                } catch (InterruptedException ignore) {} ;
-                // send warning to layer
-            }
-        }
-
-	System.out.println("LiveGps: Disconnected from gpsd");
-        fireGpsStatusChangeEvent(LiveGpsStatus.GpsStatus.DISCONNECTED,
-                tr("Not connected"));
-	disconnect();
-    }
-
-    public void shutdown() {
-        shutdownFlag = true;
-    }
-
-    private void connect() throws IOException {
-        JSONObject greeting;
-        String line, type, release;
-
-        System.out.println("LiveGps: trying to connect to gpsd at " + gpsdHost + ":" + gpsdPort);
-        fireGpsStatusChangeEvent( LiveGpsStatus.GpsStatus.CONNECTING, tr("Connecting"));
-
-        InetAddress[] addrs = InetAddress.getAllByName(gpsdHost);
-        for (int i = 0; i < addrs.length && gpsdSocket == null; i++) {
-            try {
-                gpsdSocket = new Socket(addrs[i], gpsdPort);
-                break;
-            } catch (IOException e) {
-                System.out.println("LiveGps: Could not open connection to gpsd: " + e);
-                gpsdSocket = null;
-            }
-        }
-
-        if (gpsdSocket == null || gpsdSocket.isConnected() == false)
-            throw new IOException();
-
-        /*
-         * First emit the "w" symbol. The older version will activate, the newer one will ignore it.
-         */
-        gpsdSocket.getOutputStream().write(new byte[] { 'w', 13, 10 });
-
-        gpsdReader = new BufferedReader(new InputStreamReader(gpsdSocket.getInputStream()));
-        line = gpsdReader.readLine();
-        if (line == null)
-            return;
-
-        try {
-            greeting = new JSONObject(line);
-            type = greeting.getString("class");
-            if (type.equals("VERSION")) {
-                release = greeting.getString("release");
-                System.out.println("LiveGps: Connected to gpsd " + release);
-            } else
-                System.out.println("LiveGps: Unexpected JSON in gpsd greeting: " + line);
-        } catch (JSONException jex) {
-            if (line.startsWith("GPSD,")) {
-                connected = true;
-                JSONProtocol = false;
-                System.out.println("LiveGps: Connected to old gpsd protocol version.");
-                fireGpsStatusChangeEvent(LiveGpsStatus.GpsStatus.CONNECTED, tr("Connected"));
-            }
-        }
-
-        if (JSONProtocol == true) {
-            JSONObject Watch = new JSONObject();
-            try {
-                Watch.put("enable", true);
-                Watch.put("json", true);
-            } catch (JSONException je) {};
-
-            String Request = "?WATCH=" + Watch.toString() + ";\n";
-            gpsdSocket.getOutputStream().write(Request.getBytes());
-
-            connected = true;
-            fireGpsStatusChangeEvent(LiveGpsStatus.GpsStatus.CONNECTED, tr("Connected"));
-        }
-    }
-
-    private void disconnect() {
-	assert(gpsdSocket != null);
-
-	connected = false;
-
-        try {
-		gpsdSocket.close();
-		gpsdSocket = null;
-	} catch (Exception e) {
-		System.out.println("LiveGps: Unable to close socket; reconnection may not be possible");
-	}
-    }
-
-    private LiveGpsData ParseJSON(String line) {
-        JSONObject report;
-        String type;
-        double lat = 0;
-        double lon = 0;
-        float speed = 0;
-        float course = 0;
-        float epx = 0;
-        float epy = 0;
-
-        try {
-            report = new JSONObject(line);
-            type = report.getString("class");
-        } catch (JSONException jex) {
-            System.out.println("LiveGps: line read from gpsd is not a JSON object:" + line);
-            return null;
-        }
-        if (!type.equals("TPV"))
-            return null;
-
-        try {
-            lat = report.getDouble("lat");
-            lon = report.getDouble("lon");
-            speed = (new Float(report.getDouble("speed"))).floatValue();
-            course = (new Float(report.getDouble("track"))).floatValue();
-	    if (report.has("epx"))
-		epx = (new Float(report.getDouble("epx"))).floatValue();
-	    if (report.has("epy"))
-		epy = (new Float(report.getDouble("epy"))).floatValue();
-
-            return new LiveGpsData(lat, lon, course, speed, epx, epy);
-        } catch (JSONException je) {}
-
-        return null;
-    }
-
-    private LiveGpsData ParseOld(String line) {
-        String words[];
-        double lat = 0;
-        double lon = 0;
-        float speed = 0;
-        float course = 0;
-
-        words = line.split(",");
-        if ((words.length == 0) || (!words[0].equals("GPSD")))
-            return null;
-
-        for (int i = 1; i < words.length; i++) {
-            if ((words[i].length() < 2) || (words[i].charAt(1) != '=')) {
-                // unexpected response.
-                continue;
-            }
-
-            char what = words[i].charAt(0);
-            String value = words[i].substring(2);
-            switch (what) {
-            case 'O':
-                // full report, tab delimited.
-                String[] status = value.split("\\s+");
-                if (status.length >= 5) {
-                    lat = Double.parseDouble(status[3]);
-                    lon = Double.parseDouble(status[4]);
-                    try {
-                        speed = Float.parseFloat(status[9]);
-                        course = Float.parseFloat(status[8]);
-                    } catch (NumberFormatException nex) {}
-                    return new LiveGpsData(lat, lon, course, speed);
-                }
-                break;
-            case 'P':
-                // position report, tab delimited.
-                String[] pos = value.split("\\s+");
-                if (pos.length >= 2) {
-                    lat = Double.parseDouble(pos[0]);
-                    lon = Double.parseDouble(pos[1]);
-                    speed = Float.NaN;
-                    course = Float.NaN;
-                    return new LiveGpsData(lat, lon, course, speed);
-                }
-                break;
-            default:
-                // not interested
-            }
-        }
-
-        return null;
-    }
-}
diff --git a/livegps/src/livegps/LiveGpsData.java b/livegps/src/livegps/LiveGpsData.java
deleted file mode 100644
index c79ab9c..0000000
--- a/livegps/src/livegps/LiveGpsData.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/**
- *
- */
-package livegps;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.Point;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.coor.LatLon;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.Way;
-
-/**
- * @author cdaller
- *
- */
-public class LiveGpsData {
-    private boolean fix;
-    private LatLon latLon;
-    private float course;
-    private float speed;
-    private float epx, epy;
-    private String wayString;
-    private Way way;
-
-    /**
-     * @param latitude
-     * @param longitude
-     * @param course
-     * @param speed
-     * @param haveFix
-     */
-    public LiveGpsData(double latitude, double longitude, float course, float speed) {
-        super();
-        this.fix = true;
-        this.latLon = new LatLon(latitude, longitude);
-        this.course = course;
-        this.speed = speed;
-    }
-    /**
-     * @param latitude
-     * @param longitude
-     * @param course
-     * @param speed
-     * @param haveFix
-     * @param epx
-     * @param epy
-     */
-    public LiveGpsData(double latitude, double longitude, float course, float speed, float epx, float epy) {
-        super();
-        this.fix = true;
-        this.latLon = new LatLon(latitude, longitude);
-        this.course = course;
-        this.speed = speed;
-	this.epx = epx;
-	this.epy = epy;
-    }
-
-    /**
-     * @return the course
-     */
-    public float getCourse() {
-        return this.course;
-    }
-    /**
-     * @param course the course to set
-     */
-    public void setCourse(float course) {
-        this.course = course;
-    }
-    /**
-     * @return the haveFix
-     */
-    public boolean isFix() {
-        return this.fix;
-    }
-    /**
-     * @param haveFix the haveFix to set
-     */
-    public void setFix(boolean haveFix) {
-        this.fix = haveFix;
-    }
-    /**
-     * @return the latitude
-     */
-    public double getLatitude() {
-        return this.latLon.lat();
-    }
-    /**
-     * @return the longitude
-     */
-    public double getLongitude() {
-        return this.latLon.lon();
-    }
-    /**
-     * @return the speed in metres per second!
-     */
-    public float getSpeed() {
-        return this.speed;
-    }
-    /**
-     * @param speed the speed to set
-     */
-    public void setSpeed(float speed) {
-        this.speed = speed;
-    }
-
-    /**
-     * @return the latlon
-     */
-    public LatLon getLatLon() {
-        return this.latLon;
-    }
-
-    /**
-     * @param latLon
-     */
-    public void setLatLon(LatLon latLon) {
-        this.latLon = latLon;
-    }
-
-    public void setEpy(float epy) {
-	this.epy = epy;
-    }
-
-    public void setEpx(float epx) {
-	this.epx = epx;
-    }
-
-    public float getEpy() {
-	return this.epy;
-    }
-
-    public float getEpx() {
-	return this.epx;
-    }
-
-    public String toString() {
-        return getClass().getSimpleName() + "[fix=" + fix + ", lat=" + latLon.lat()
-        + ", long=" + latLon.lon() + ", speed=" + speed + ", course=" + course + "]";
-    }
-
-    /**
-     * Returns the name of the way that is closest to the current coordinates or an
-     * empty string if no way is around.
-     *
-     * @return the name of the way that is closest to the current coordinates.
-     */
-    public String getWayInfo() {
-        if(wayString == null) {
-            Way way = getWay();
-            if(way != null) {
-                StringBuilder builder = new StringBuilder();
-                String tmp = way.get("name");
-                if(tmp != null) {
-                    builder.append(tmp);
-                } else {
-                    builder.append(tr("no name"));
-                }
-                tmp = way.get("ref");
-                if(tmp != null) {
-                    builder.append(" (").append(tmp).append(")");
-                }
-                tmp = way.get("highway");
-                if(tmp != null) {
-                    builder.append(" {").append(tmp).append("}");
-                }
-                String type = "";
-                tmp = way.get("tunnel");
-                if(tmp != null) {
-                    type = type + "T";
-                }
-                tmp = way.get("bridge");
-                if(tmp != null) {
-                    type = type + "B";
-                }
-                if(type.length() > 0) {
-                    builder.append(" [").append(type).append("]");
-                }
-                wayString = builder.toString();
-            } else {
-                wayString = "";
-            }
-        }
-        return wayString;
-    }
-
-    /**
-     * Returns the closest way to this position.
-     * @return the closest way to this position.
-     */
-    public Way getWay() {
-        if(way == null && Main.map != null && Main.map.mapView != null) {
-            Point xy = Main.map.mapView.getPoint(getLatLon());
-            way = Main.map.mapView.getNearestWay(xy,
-                OsmPrimitive.isUsablePredicate);
-        }
-        return way;
-    }
-
-    /* (non-Javadoc)
-     * @see java.lang.Object#hashCode()
-     */
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + Float.floatToIntBits(this.course);
-        result = prime * result + ((this.latLon == null) ? 0 : this.latLon.hashCode());
-        result = prime * result + Float.floatToIntBits(this.speed);
-        return result;
-    }
-    /* (non-Javadoc)
-     * @see java.lang.Object#equals(java.lang.Object)
-     */
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        final LiveGpsData other = (LiveGpsData) obj;
-        if (Float.floatToIntBits(this.course) != Float.floatToIntBits(other.course))
-            return false;
-        if (this.latLon == null) {
-            if (other.latLon != null)
-                return false;
-        } else if (!this.latLon.equals(other.latLon))
-            return false;
-        if (Float.floatToIntBits(this.speed) != Float.floatToIntBits(other.speed))
-            return false;
-        return true;
-    }
-}
diff --git a/livegps/src/livegps/LiveGpsDialog.java b/livegps/src/livegps/LiveGpsDialog.java
deleted file mode 100644
index d495a63..0000000
--- a/livegps/src/livegps/LiveGpsDialog.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/**
- *
- */
-package livegps;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.GridLayout;
-import java.awt.event.KeyEvent;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-
-import org.openstreetmap.josm.gui.MapFrame;
-import org.openstreetmap.josm.gui.dialogs.ToggleDialog;
-import org.openstreetmap.josm.tools.Shortcut;
-
-/**
- * @author cdaller
- *
- */
-public class LiveGpsDialog extends ToggleDialog implements PropertyChangeListener {
-    private static final long serialVersionUID = 6183400754671501117L;
-    private JLabel statusLabel;
-    private JLabel wayLabel;
-    private JLabel latLabel;
-    private JLabel longLabel;
-    private JLabel courseLabel;
-    private JLabel speedLabel;
-    private JPanel panel;
-
-    /**
-     * @param name
-     * @param iconName
-     * @param tooltip
-     * @param shortcut
-     * @param preferredHeight
-     */
-    public LiveGpsDialog(final MapFrame mapFrame) {
-        super(tr("Live GPS"), "livegps", tr("Show GPS data."),
-        Shortcut.registerShortcut("subwindow:livegps", tr("Toggle: {0}", tr("Live GPS")),
-        KeyEvent.VK_G, Shortcut.ALT_CTRL_SHIFT), 100);
-        panel = new JPanel();
-        panel.setLayout(new GridLayout(6,2));
-        panel.add(new JLabel(tr("Status")));
-        panel.add(statusLabel = new JLabel());
-        panel.add(new JLabel(tr("Way Info")));
-        panel.add(wayLabel = new JLabel());
-        panel.add(new JLabel(tr("Latitude")));
-        panel.add(latLabel = new JLabel());
-        panel.add(new JLabel(tr("Longitude")));
-        panel.add(longLabel = new JLabel());
-        panel.add(new JLabel(tr("Speed")));
-        panel.add(speedLabel = new JLabel());
-        panel.add(new JLabel(tr("Course")));
-        panel.add(courseLabel = new JLabel());
-        createLayout(panel, true, null);
-    }
-
-    /* (non-Javadoc)
-     * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
-     */
-    public void propertyChange(PropertyChangeEvent evt) {
-        if (!isVisible())
-            return;
-        if("gpsdata".equals(evt.getPropertyName())) {
-            LiveGpsData data = (LiveGpsData) evt.getNewValue();
-            if(data.isFix()) {
-//                fixLabel.setText("fix");
-                panel.setBackground(Color.WHITE);
-                latLabel.setText(data.getLatitude() + "deg");
-                longLabel.setText(data.getLongitude() + "deg");
-                double mySpeed = data.getSpeed() * 3.6f;
-                speedLabel.setText((Math.round(mySpeed*100)/100) + "km/h"); // m(s to km/h
-                courseLabel.setText(data.getCourse() + "deg");
-
-                String wayString = data.getWayInfo();
-                if(wayString.length() > 0) {
-                    wayLabel.setText(wayString);
-                } else {
-                    wayLabel.setText(tr("unknown"));
-                }
-
-            } else {
-//                fixLabel.setText("no fix");
-                latLabel.setText("");
-                longLabel.setText("");
-                speedLabel.setText("");
-                courseLabel.setText("");
-                panel.setBackground(Color.RED);
-            }
-        } else if ("gpsstatus".equals(evt.getPropertyName())) {
-            LiveGpsStatus status = (LiveGpsStatus) evt.getNewValue();
-            statusLabel.setText(status.getStatusMessage());
-            if(status.getStatus() != LiveGpsStatus.GpsStatus.CONNECTED) {
-                panel.setBackground(Color.RED);
-            } else {
-                panel.setBackground(Color.WHITE);
-            }
-        }
-
-    }
-}
diff --git a/livegps/src/livegps/LiveGpsLayer.java b/livegps/src/livegps/LiveGpsLayer.java
deleted file mode 100644
index 22b1e0d..0000000
--- a/livegps/src/livegps/LiveGpsLayer.java
+++ /dev/null
@@ -1,231 +0,0 @@
-package livegps;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.Color;
-import java.awt.Graphics2D;
-import java.awt.Point;
-import java.awt.geom.Point2D;
-import java.awt.Rectangle;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.Bounds;
-import org.openstreetmap.josm.data.coor.LatLon;
-import org.openstreetmap.josm.data.gpx.GpxData;
-import org.openstreetmap.josm.data.gpx.GpxTrack;
-import org.openstreetmap.josm.data.gpx.WayPoint;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.layer.GpxLayer;
-
-public class LiveGpsLayer extends GpxLayer implements PropertyChangeListener {
-    public static final String LAYER_NAME = tr("LiveGPS layer");
-    public static final String C_LIVEGPS_COLOR_POSITION = "color.livegps.position";
-    public static final String C_LIVEGPS_COLOR_POSITION_ESTIMATE = "color.livegps.position_estimate";
-
-    private static final int DEFAULT_REFRESH_INTERVAL = 250;
-    private static final int DEFAULT_CENTER_INTERVAL = 5000;
-    private static final int DEFAULT_CENTER_FACTOR = 80;
-    private static final String oldC_REFRESH_INTERVAL = "livegps.refreshinterval";     /* in seconds */
-    private static final String C_REFRESH_INTERVAL = "livegps.refresh_interval_msec";  /* in msec */
-    private static final String C_CENTER_INTERVAL = "livegps.center_interval_msec";  /* in msec */
-    private static final String C_CENTER_FACTOR = "livegps.center_factor" /* in percent */;
-    private static final String C_CURSOR_H = "livegps.cursor_height"; /* in pixels */
-    private static final String C_CURSOR_W = "livegps.cursor_width"; /* in pixels */
-    private static final String C_CURSOR_T = "livegps.cursor_thickness"; /* in pixels */
-    private int refreshInterval;
-    private int centerInterval;
-    private double centerFactor;
-    private long lastRedraw = 0;
-    private long lastCenter = 0;
-
-    LiveGpsData lastData;
-    LatLon lastPos;
-    WayPoint lastPoint;
-    private final AppendableGpxTrackSegment trackSegment;
-    boolean autocenter;
-    private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
-
-    public LiveGpsLayer(GpxData data) {
-        super(data, LAYER_NAME);
-        trackSegment = new AppendableGpxTrackSegment();
-
-        Map<String, Object> attr = new HashMap<String, Object>();
-        attr.put("desc", "josm live gps");
-
-        GpxTrack trackBeingWritten = new SingleSegmentGpxTrack(trackSegment, attr);
-        data.tracks.add(trackBeingWritten);
-
-	initIntervals();
-    }
-
-    void setCurrentPosition(double lat, double lon) {
-        LatLon thisPos = new LatLon(lat, lon);
-        if ((lastPos != null) && (thisPos.equalsEpsilon(lastPos)))
-            // no change in position
-            // maybe show a "paused" cursor or some such
-            return;
-
-        lastPos = thisPos;
-        lastPoint = new WayPoint(thisPos);
-        lastPoint.attr.put("time", dateFormat.format(new Date()));
-        trackSegment.addWaypoint(lastPoint);
-
-	if (autocenter)
-		conditionalCenter(thisPos);
-    }
-
-    public void center() {
-        if (lastPoint != null)
-            Main.map.mapView.zoomTo(lastPoint.getCoor());
-    }
-
-    public void conditionalCenter(LatLon Pos) {
-	Point2D P = Main.map.mapView.getPoint2D(Pos);
-	Rectangle rv = Main.map.mapView.getBounds(null);
-	Date date = new Date();
-	long current = date.getTime();
-
-	rv.grow(-(int)(rv.getHeight() * centerFactor), -(int)(rv.getWidth() * centerFactor));
-
-	if (!rv.contains(P) || (centerInterval > 0 && current - lastCenter >= centerInterval)) {
-		Main.map.mapView.zoomTo(Pos);
-		lastCenter = current;
-	}
-    }
-
-    public void setAutoCenter(boolean ac) {
-        autocenter = ac;
-    }
-
-    @Override
-    public void paint(Graphics2D g, MapView mv, Bounds bounds) {
-        super.paint(g, mv, bounds);
-
-	if (lastPoint == null)
-		return;
-
-	Point screen = mv.getPoint(lastPoint.getCoor());
-
-	int TriaHeight = Main.pref.getInteger(C_CURSOR_H, 20);
-	int TriaWidth = Main.pref.getInteger(C_CURSOR_W, 10);
-	int TriaThick = Main.pref.getInteger(C_CURSOR_T, 4);
-
-	/*
-	 * Draw a bold triangle.
-	 * In case of deep zoom draw also a thin DOP oval.
-	 */
-
-	g.setColor(Main.pref.getColor(C_LIVEGPS_COLOR_POSITION_ESTIMATE, Color.CYAN));
-	int w, h;
-	double ppm = 100 / mv.getDist100Pixel();	/* pixels per metre */
-
-	w = (int )Math.round(lastData.getEpx() * ppm);
-	h = (int )Math.round(lastData.getEpy() * ppm);
-
-	if (w > TriaWidth || h > TriaWidth) {
-		int xo, yo;
-
-		yo = screen.y - Math.round(h/2);
-		xo = screen.x - Math.round(w/2);
-
-		g.drawOval(xo, yo, w, h);
-	}
-
-	int[] x = new int[4];
-	int[] y = new int[4];
-	float course = lastData.getCourse();
-	float csin = (float )Math.sin(Math.toRadians(course));
-	float ccos = (float )Math.cos(Math.toRadians(course));
-	float csin120 = (float )Math.sin(Math.toRadians(course + 120));
-	float ccos120 = (float )Math.cos(Math.toRadians(course + 120));
-	float csin240 = (float )Math.sin(Math.toRadians(course + 240));
-	float ccos240 = (float )Math.cos(Math.toRadians(course + 240));
-
-	g.setColor(Main.pref.getColor(C_LIVEGPS_COLOR_POSITION, Color.RED));
-
-	for (int i = 0; i < TriaThick; i++, TriaHeight--, TriaWidth--) {
-
-		x[0] = screen.x + Math.round(TriaHeight * csin);
-		y[0] = screen.y - Math.round(TriaHeight * ccos);
-		x[1] = screen.x + Math.round(TriaWidth * csin120);
-		y[1] = screen.y - Math.round(TriaWidth * ccos120);
-		x[2] = screen.x;
-		y[2] = screen.y;
-		x[3] = screen.x + Math.round(TriaWidth * csin240);
-		y[3] = screen.y - Math.round(TriaWidth * ccos240);
-
-		g.drawPolygon(x, y, 4);
-	}
-
-    }
-
-    /* (non-Javadoc)
-     * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
-     */
-    public void propertyChange(PropertyChangeEvent evt) {
-        if (!isVisible()) {
-            return;
-        }
-        if ("gpsdata".equals(evt.getPropertyName())) {
-            lastData = (LiveGpsData) evt.getNewValue();
-            if (lastData.isFix()) {
-                setCurrentPosition(lastData.getLatitude(), lastData.getLongitude());
-                if (allowRedraw())
-                    Main.map.repaint();
-            }
-        }
-    }
-
-    /**
-     * Check, if a redraw is currently allowed.
-     *
-     * @return true, if a redraw is permitted, false, if a re-draw
-     * should be suppressed.
-     */
-    private boolean allowRedraw() {
-	Date date = new Date();
-	long current = date.getTime();
-
-	if (current - lastRedraw >= refreshInterval) {
-		lastRedraw = current;
-		return true;
-	} else
-		return false;
-    }
-
-    /**
-     * Retrieve the refreshInterval and centerInterval from the configuration. Be compatible
-     * with old version that stored refreshInterval in seconds. If no such configuration key
-     * exists, it will be initialized here.
-     */
-    private void initIntervals() {
-	if ((refreshInterval = Main.pref.getInteger(oldC_REFRESH_INTERVAL, 0)) != 0) {
-		refreshInterval *= 1000;
-		Main.pref.put(oldC_REFRESH_INTERVAL, null);
-	} else
-		refreshInterval = Main.pref.getInteger(C_REFRESH_INTERVAL, DEFAULT_REFRESH_INTERVAL);
-
-	centerInterval = Main.pref.getInteger(C_CENTER_INTERVAL, DEFAULT_CENTER_INTERVAL);
-	centerFactor = Main.pref.getInteger(C_CENTER_FACTOR, DEFAULT_CENTER_FACTOR);
-	if (centerFactor <= 1 || centerFactor >= 99)
-		centerFactor = DEFAULT_CENTER_FACTOR;
-
-        Main.pref.putInteger(C_REFRESH_INTERVAL, refreshInterval);
-        Main.pref.putInteger(C_CENTER_INTERVAL, centerInterval);
-	Main.pref.putInteger(C_CENTER_FACTOR, (int )centerFactor);
-
-	/*
-	 * Do one time conversion of factor: user value means "how big is inner rectangle
-	 * comparing to screen in percent", machine value means "what is the shrink ratio
-	 * for each dimension on _both_ sides".
-	 */
-
-	centerFactor = (100 - centerFactor) / 2 / 100;
-    }
-}
diff --git a/livegps/src/livegps/LiveGpsPlugin.java b/livegps/src/livegps/LiveGpsPlugin.java
deleted file mode 100644
index c9e2373..0000000
--- a/livegps/src/livegps/LiveGpsPlugin.java
+++ /dev/null
@@ -1,234 +0,0 @@
-package livegps;
-
-import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
-import static org.openstreetmap.josm.tools.I18n.marktr;
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.event.ActionEvent;
-import java.awt.event.KeyEvent;
-import java.beans.PropertyChangeListener;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.swing.JCheckBoxMenuItem;
-import javax.swing.JMenu;
-import javax.swing.JMenuItem;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.actions.JosmAction;
-import org.openstreetmap.josm.data.gpx.GpxData;
-import org.openstreetmap.josm.gui.MainMenu;
-import org.openstreetmap.josm.gui.MapFrame;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
-import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.plugins.Plugin;
-import org.openstreetmap.josm.plugins.PluginInformation;
-import org.openstreetmap.josm.tools.Shortcut;
-
-public class LiveGpsPlugin extends Plugin implements LayerChangeListener {
-    private boolean enabled = false;
-    private LiveGpsAcquirer acquirer = null;
-    private Thread acquirerThread = null;
-    private JMenu lgpsmenu = null;
-    private JCheckBoxMenuItem lgpscapture;
-    private JCheckBoxMenuItem lgpsautocenter;
-    private LiveGpsDialog lgpsdialog;
-    /* List of foreign (e.g. other plugins) subscribers */
-    List<PropertyChangeListener> listenerQueue = new ArrayList<PropertyChangeListener>();
-
-    private GpxData data = new GpxData();
-    private LiveGpsLayer lgpslayer = null;
-
-    public class CaptureAction extends JosmAction {
-        public CaptureAction() {
-            super(
-                    tr("Capture GPS Track"),
-                    "capturemenu",
-                    tr("Connect to gpsd server and show current position in LiveGPS layer."),
-                    Shortcut.registerShortcut("menu:livegps:capture", tr(
-                            "Menu: {0}", tr("Capture GPS Track")),
-                            KeyEvent.VK_R, Shortcut.CTRL), true);
-        }
-
-        public void actionPerformed(ActionEvent e) {
-            enableTracking(lgpscapture.isSelected());
-        }
-    }
-
-    public class CenterAction extends JosmAction {
-        public CenterAction() {
-            super(tr("Center Once"), "centermenu",
-                    tr("Center the LiveGPS layer to current position."),
-                    Shortcut.registerShortcut("edit:centergps", tr("Edit: {0}",
-                            tr("Center Once")), KeyEvent.VK_HOME,
-                            Shortcut.DIRECT), true);
-        }
-
-        public void actionPerformed(ActionEvent e) {
-            if (lgpslayer != null) {
-                lgpslayer.center();
-            }
-        }
-    }
-
-    public class AutoCenterAction extends JosmAction {
-        public AutoCenterAction() {
-            super(
-                    tr("Auto-Center"),
-                    "autocentermenu",
-                    tr("Continuously center the LiveGPS layer to current position."),
-                    Shortcut.registerShortcut("menu:livegps:autocenter", tr(
-                            "Menu: {0}", tr("Capture GPS Track")),
-                            KeyEvent.VK_HOME, Shortcut.CTRL), true);
-        }
-
-        public void actionPerformed(ActionEvent e) {
-            if (lgpslayer != null) {
-                setAutoCenter(lgpsautocenter.isSelected());
-            }
-        }
-    }
-
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-    }
-
-    public void layerAdded(Layer newLayer) {
-    }
-
-    public void layerRemoved(Layer oldLayer) {
-        if (oldLayer != lgpslayer)
-		return;
-
-        enableTracking(false);
-        lgpscapture.setSelected(false);
-        MapView.removeLayerChangeListener(this);
-        lgpslayer = null;
-    }
-
-    public LiveGpsPlugin(PluginInformation info) {
-        super(info);
-        MainMenu menu = Main.main.menu;
-        lgpsmenu = menu.addMenu(marktr("LiveGPS"), KeyEvent.VK_G,
-                menu.defaultMenuPos, ht("/Plugin/LiveGPS"));
-
-        JosmAction captureAction = new CaptureAction();
-        lgpscapture = new JCheckBoxMenuItem(captureAction);
-        lgpsmenu.add(lgpscapture);
-        lgpscapture.setAccelerator(captureAction.getShortcut().getKeyStroke());
-
-        JosmAction centerAction = new CenterAction();
-        JMenuItem centerMenu = new JMenuItem(centerAction);
-        lgpsmenu.add(centerMenu);
-        centerMenu.setAccelerator(centerAction.getShortcut().getKeyStroke());
-
-        JosmAction autoCenterAction = new AutoCenterAction();
-        lgpsautocenter = new JCheckBoxMenuItem(autoCenterAction);
-        lgpsmenu.add(lgpsautocenter);
-        lgpsautocenter.setAccelerator(autoCenterAction.getShortcut().getKeyStroke());
-    }
-
-    /**
-     * Set to <code>true</code> if the current position should always be in the center of the map.
-     * @param autoCenter if <code>true</code> the map is always centered.
-     */
-    public void setAutoCenter(boolean autoCenter) {
-        lgpsautocenter.setSelected(autoCenter); // just in case this method was
-        // not called from the menu
-        if (lgpslayer != null) {
-            lgpslayer.setAutoCenter(autoCenter);
-            if (autoCenter)
-                lgpslayer.center();
-        }
-    }
-
-    /**
-     * Returns <code>true</code> if autocenter is selected.
-     * @return <code>true</code> if autocenter is selected.
-     */
-    public boolean isAutoCenter() {
-        return lgpsautocenter.isSelected();
-    }
-
-    /**
-     * Enable or disable gps tracking
-     * @param enable if <code>true</code> tracking is started.
-     */
-    public void enableTracking(boolean enable) {
-	
-        if (enable && !enabled) {
-            assert (acquirer == null);
-            assert (acquirerThread == null);
-
-            acquirer = new LiveGpsAcquirer();
-            acquirerThread = new Thread(acquirer);
-
-	    if (lgpslayer == null) {
-		lgpslayer = new LiveGpsLayer(data);
-		Main.main.addLayer(lgpslayer);
-		MapView.addLayerChangeListener(this);
-		lgpslayer.setAutoCenter(isAutoCenter());
-	    }
-
-            acquirer.addPropertyChangeListener(lgpslayer);
-            acquirer.addPropertyChangeListener(lgpsdialog);
-            for (PropertyChangeListener listener : listenerQueue)
-	        acquirer.addPropertyChangeListener(listener);
-
-            acquirerThread.start();
-
-	    enabled = true;
-
-        } else if (!enable && enabled) {
-	    assert (lgpslayer != null);
-            assert (acquirer != null);
-            assert (acquirerThread != null);
-
-	    acquirer.shutdown();
-	    acquirer = null;
-	    acquirerThread = null;
-
-	    enabled = false;
-	}
-    }
-
-    /** 
-     * Add a listener for gps events. 
-     * @param listener the listener. 
-     */ 
-    public void addPropertyChangeListener(PropertyChangeListener listener) { 
-        assert(!listenerQueue.contains(listener));
-
-        listenerQueue.add(listener); 
-        if (acquirer != null)
-            acquirer.addPropertyChangeListener(listener); 
-    } 
-
-    /** 
-     * Remove a listener for gps events. 
-     * @param listener the listener. 
-     */ 
-    public void removePropertyChangeListener(PropertyChangeListener listener) { 
-        assert(listenerQueue.contains(listener));
-
-        listenerQueue.remove(listener); 
-        if (acquirer != null) 
-            acquirer.removePropertyChangeListener(listener); 
-    }
-
-    /* (non-Javadoc)
-     * @see org.openstreetmap.josm.plugins.Plugin#mapFrameInitialized(org.openstreetmap.josm.gui.MapFrame, org.openstreetmap.josm.gui.MapFrame)
-     */
-    @Override
-    public void mapFrameInitialized(MapFrame oldFrame, MapFrame newFrame) {
-        if (newFrame != null)
-            newFrame.addToggleDialog(lgpsdialog = new LiveGpsDialog(newFrame));
-    }
-
-    /**
-     * @return the lgpsmenu
-     */
-    public JMenu getLgpsMenu() {
-        return this.lgpsmenu;
-    }
-}
diff --git a/livegps/src/livegps/LiveGpsStatus.java b/livegps/src/livegps/LiveGpsStatus.java
deleted file mode 100644
index 260298e..0000000
--- a/livegps/src/livegps/LiveGpsStatus.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- *
- */
-package livegps;
-
-/**
- * @author cdaller
- *
- */
-public class LiveGpsStatus {
-    public enum GpsStatus {CONNECTING, CONNECTED, DISCONNECTED, CONNECTION_FAILED};
-    private String statusMessage;
-    private GpsStatus status;
-
-    /**
-     * @param status
-     * @param statusMessage
-     */
-    public LiveGpsStatus(GpsStatus status, String statusMessage) {
-        super();
-        this.status = status;
-        this.statusMessage = statusMessage;
-    }
-/**
-     * @return the status
-     */
-    public GpsStatus getStatus() {
-        return this.status;
-    }
-    /**
-     * @param status the status to set
-     */
-    public void setStatus(GpsStatus status) {
-        this.status = status;
-    }
-    /**
-     * @return the statusMessage
-     */
-    public String getStatusMessage() {
-        return this.statusMessage;
-    }
-    /**
-     * @param statusMessage the statusMessage to set
-     */
-    public void setStatusMessage(String statusMessage) {
-        this.statusMessage = statusMessage;
-    }
-
-}
diff --git a/livegps/src/livegps/SingleSegmentGpxTrack.java b/livegps/src/livegps/SingleSegmentGpxTrack.java
deleted file mode 100644
index 4df90aa..0000000
--- a/livegps/src/livegps/SingleSegmentGpxTrack.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package livegps;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Map;
-
-import org.openstreetmap.josm.data.Bounds;
-import org.openstreetmap.josm.data.gpx.GpxTrack;
-import org.openstreetmap.josm.data.gpx.GpxTrackSegment;
-
-public class SingleSegmentGpxTrack implements GpxTrack {
-
-    private final Map<String, Object> attributes;
-    private final GpxTrackSegment trackSegment;
-
-    public SingleSegmentGpxTrack(GpxTrackSegment trackSegment, Map<String, Object> attributes) {
-        this.attributes = Collections.unmodifiableMap(attributes);
-        this.trackSegment = trackSegment;
-    }
-
-
-    public Map<String, Object> getAttributes() {
-        return attributes;
-    }
-
-    public Bounds getBounds() {
-        return trackSegment.getBounds();
-    }
-
-    public Collection<GpxTrackSegment> getSegments() {
-        return Collections.singleton(trackSegment);
-    }
-
-    public double length() {
-        return trackSegment.length();
-    }
-
-    @Override
-    public int getUpdateCount() {
-        return trackSegment.getUpdateCount();
-    }
-
-}
diff --git a/livegps/src/org/json/JSONArray.java b/livegps/src/org/json/JSONArray.java
deleted file mode 100644
index c3c1351..0000000
--- a/livegps/src/org/json/JSONArray.java
+++ /dev/null
@@ -1,918 +0,0 @@
-package org.json;
-
-/*
-Copyright (c) 2002 JSON.org
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-The Software shall be used for Good, not Evil.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-*/
-
-import java.io.IOException;
-import java.io.Writer;
-import java.lang.reflect.Array;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Map;
-
-/**
- * A JSONArray is an ordered sequence of values. Its external text form is a
- * string wrapped in square brackets with commas separating the values. The
- * internal form is an object having <code>get</code> and <code>opt</code>
- * methods for accessing the values by index, and <code>put</code> methods for
- * adding or replacing values. The values can be any of these types:
- * <code>Boolean</code>, <code>JSONArray</code>, <code>JSONObject</code>,
- * <code>Number</code>, <code>String</code>, or the
- * <code>JSONObject.NULL object</code>.
- * <p>
- * The constructor can convert a JSON text into a Java object. The
- * <code>toString</code> method converts to JSON text.
- * <p>
- * A <code>get</code> method returns a value if one can be found, and throws an
- * exception if one cannot be found. An <code>opt</code> method returns a
- * default value instead of throwing an exception, and so is useful for
- * obtaining optional values.
- * <p>
- * The generic <code>get()</code> and <code>opt()</code> methods return an
- * object which you can cast or query for type. There are also typed
- * <code>get</code> and <code>opt</code> methods that do type checking and type
- * coercion for you.
- * <p>
- * The texts produced by the <code>toString</code> methods strictly conform to
- * JSON syntax rules. The constructors are more forgiving in the texts they will
- * accept:
- * <ul>
- * <li>An extra <code>,</code> <small>(comma)</small> may appear just
- *     before the closing bracket.</li>
- * <li>The <code>null</code> value will be inserted when there
- *     is <code>,</code> <small>(comma)</small> elision.</li>
- * <li>Strings may be quoted with <code>'</code> <small>(single
- *     quote)</small>.</li>
- * <li>Strings do not need to be quoted at all if they do not begin with a quote
- *     or single quote, and if they do not contain leading or trailing spaces,
- *     and if they do not contain any of these characters:
- *     <code>{ } [ ] / \ : , = ; #</code> and if they do not look like numbers
- *     and if they are not the reserved words <code>true</code>,
- *     <code>false</code>, or <code>null</code>.</li>
- * <li>Values can be separated by <code>;</code> <small>(semicolon)</small> as
- *     well as by <code>,</code> <small>(comma)</small>.</li>
- * <li>Numbers may have the
- *     <code>0x-</code> <small>(hex)</small> prefix.</li>
- * </ul>
-
- * @author JSON.org
- * @version 2009-04-14
- */
-public class JSONArray {
-
-
-    /**
-     * The arrayList where the JSONArray's properties are kept.
-     */
-    private ArrayList myArrayList;
-
-
-    /**
-     * Construct an empty JSONArray.
-     */
-    public JSONArray() {
-        this.myArrayList = new ArrayList();
-    }
-
-    /**
-     * Construct a JSONArray from a JSONTokener.
-     * @param x A JSONTokener
-     * @throws JSONException If there is a syntax error.
-     */
-    public JSONArray(JSONTokener x) throws JSONException {
-        this();
-        char c = x.nextClean();
-        char q;
-        if (c == '[') {
-            q = ']';
-        } else if (c == '(') {
-            q = ')';
-        } else {
-            throw x.syntaxError("A JSONArray text must start with '['");
-        }
-        if (x.nextClean() == ']') {
-            return;
-        }
-        x.back();
-        for (;;) {
-            if (x.nextClean() == ',') {
-                x.back();
-                this.myArrayList.add(null);
-            } else {
-                x.back();
-                this.myArrayList.add(x.nextValue());
-            }
-            c = x.nextClean();
-            switch (c) {
-            case ';':
-            case ',':
-                if (x.nextClean() == ']') {
-                    return;
-                }
-                x.back();
-                break;
-            case ']':
-            case ')':
-                if (q != c) {
-                    throw x.syntaxError("Expected a '" + new Character(q) + "'");
-                }
-                return;
-            default:
-                throw x.syntaxError("Expected a ',' or ']'");
-            }
-        }
-    }
-
-
-    /**
-     * Construct a JSONArray from a source JSON text.
-     * @param source     A string that begins with
-     * <code>[</code> <small>(left bracket)</small>
-     *  and ends with <code>]</code> <small>(right bracket)</small>.
-     *  @throws JSONException If there is a syntax error.
-     */
-    public JSONArray(String source) throws JSONException {
-        this(new JSONTokener(source));
-    }
-
-
-    /**
-     * Construct a JSONArray from a Collection.
-     * @param collection     A Collection.
-     */
-    public JSONArray(Collection collection) {
-        this.myArrayList = new ArrayList();
-        if (collection != null) {
-            Iterator iter = collection.iterator();
-            while (iter.hasNext()) {
-                Object o = iter.next();
-                this.myArrayList.add(JSONObject.wrap(o));
-            }
-        }
-    }
-
-
-    /**
-     * Construct a JSONArray from an array
-     * @throws JSONException If not an array.
-     */
-    public JSONArray(Object array) throws JSONException {
-        this();
-        if (array.getClass().isArray()) {
-            int length = Array.getLength(array);
-            for (int i = 0; i < length; i += 1) {
-                this.put(JSONObject.wrap(Array.get(array, i)));
-            }
-        } else {
-            throw new JSONException(
-"JSONArray initial value should be a string or collection or array.");
-        }
-    }
-
-
-    /**
-     * Get the object value associated with an index.
-     * @param index
-     *  The index must be between 0 and length() - 1.
-     * @return An object value.
-     * @throws JSONException If there is no value for the index.
-     */
-    public Object get(int index) throws JSONException {
-        Object o = opt(index);
-        if (o == null) {
-            throw new JSONException("JSONArray[" + index + "] not found.");
-        }
-        return o;
-    }
-
-
-    /**
-     * Get the boolean value associated with an index.
-     * The string values "true" and "false" are converted to boolean.
-     *
-     * @param index The index must be between 0 and length() - 1.
-     * @return      The truth.
-     * @throws JSONException If there is no value for the index or if the
-     *  value is not convertable to boolean.
-     */
-    public boolean getBoolean(int index) throws JSONException {
-        Object o = get(index);
-        if (o.equals(Boolean.FALSE) ||
-                (o instanceof String &&
-                ((String)o).equalsIgnoreCase("false"))) {
-            return false;
-        } else if (o.equals(Boolean.TRUE) ||
-                (o instanceof String &&
-                ((String)o).equalsIgnoreCase("true"))) {
-            return true;
-        }
-        throw new JSONException("JSONArray[" + index + "] is not a Boolean.");
-    }
-
-
-    /**
-     * Get the double value associated with an index.
-     *
-     * @param index The index must be between 0 and length() - 1.
-     * @return      The value.
-     * @throws   JSONException If the key is not found or if the value cannot
-     *  be converted to a number.
-     */
-    public double getDouble(int index) throws JSONException {
-        Object o = get(index);
-        try {
-            return o instanceof Number ?
-                ((Number)o).doubleValue() :
-                Double.valueOf((String)o).doubleValue();
-        } catch (Exception e) {
-            throw new JSONException("JSONArray[" + index +
-                "] is not a number.");
-        }
-    }
-
-
-    /**
-     * Get the int value associated with an index.
-     *
-     * @param index The index must be between 0 and length() - 1.
-     * @return      The value.
-     * @throws   JSONException If the key is not found or if the value cannot
-     *  be converted to a number.
-     *  if the value cannot be converted to a number.
-     */
-    public int getInt(int index) throws JSONException {
-        Object o = get(index);
-        return o instanceof Number ?
-                ((Number)o).intValue() : (int)getDouble(index);
-    }
-
-
-    /**
-     * Get the JSONArray associated with an index.
-     * @param index The index must be between 0 and length() - 1.
-     * @return      A JSONArray value.
-     * @throws JSONException If there is no value for the index. or if the
-     * value is not a JSONArray
-     */
-    public JSONArray getJSONArray(int index) throws JSONException {
-        Object o = get(index);
-        if (o instanceof JSONArray) {
-            return (JSONArray)o;
-        }
-        throw new JSONException("JSONArray[" + index +
-                "] is not a JSONArray.");
-    }
-
-
-    /**
-     * Get the JSONObject associated with an index.
-     * @param index subscript
-     * @return      A JSONObject value.
-     * @throws JSONException If there is no value for the index or if the
-     * value is not a JSONObject
-     */
-    public JSONObject getJSONObject(int index) throws JSONException {
-        Object o = get(index);
-        if (o instanceof JSONObject) {
-            return (JSONObject)o;
-        }
-        throw new JSONException("JSONArray[" + index +
-            "] is not a JSONObject.");
-    }
-
-
-    /**
-     * Get the long value associated with an index.
-     *
-     * @param index The index must be between 0 and length() - 1.
-     * @return      The value.
-     * @throws   JSONException If the key is not found or if the value cannot
-     *  be converted to a number.
-     */
-    public long getLong(int index) throws JSONException {
-        Object o = get(index);
-        return o instanceof Number ?
-                ((Number)o).longValue() : (long)getDouble(index);
-    }
-
-
-    /**
-     * Get the string associated with an index.
-     * @param index The index must be between 0 and length() - 1.
-     * @return      A string value.
-     * @throws JSONException If there is no value for the index.
-     */
-    public String getString(int index) throws JSONException {
-        return get(index).toString();
-    }
-
-
-    /**
-     * Determine if the value is null.
-     * @param index The index must be between 0 and length() - 1.
-     * @return true if the value at the index is null, or if there is no value.
-     */
-    public boolean isNull(int index) {
-        return JSONObject.NULL.equals(opt(index));
-    }
-
-
-    /**
-     * Make a string from the contents of this JSONArray. The
-     * <code>separator</code> string is inserted between each element.
-     * Warning: This method assumes that the data structure is acyclical.
-     * @param separator A string that will be inserted between the elements.
-     * @return a string.
-     * @throws JSONException If the array contains an invalid number.
-     */
-    public String join(String separator) throws JSONException {
-        int len = length();
-        StringBuffer sb = new StringBuffer();
-
-        for (int i = 0; i < len; i += 1) {
-            if (i > 0) {
-                sb.append(separator);
-            }
-            sb.append(JSONObject.valueToString(this.myArrayList.get(i)));
-        }
-        return sb.toString();
-    }
-
-
-    /**
-     * Get the number of elements in the JSONArray, included nulls.
-     *
-     * @return The length (or size).
-     */
-    public int length() {
-        return this.myArrayList.size();
-    }
-
-
-    /**
-     * Get the optional object value associated with an index.
-     * @param index The index must be between 0 and length() - 1.
-     * @return      An object value, or null if there is no
-     *              object at that index.
-     */
-    public Object opt(int index) {
-        return (index < 0 || index >= length()) ?
-            null : this.myArrayList.get(index);
-    }
-
-
-    /**
-     * Get the optional boolean value associated with an index.
-     * It returns false if there is no value at that index,
-     * or if the value is not Boolean.TRUE or the String "true".
-     *
-     * @param index The index must be between 0 and length() - 1.
-     * @return      The truth.
-     */
-    public boolean optBoolean(int index)  {
-        return optBoolean(index, false);
-    }
-
-
-    /**
-     * Get the optional boolean value associated with an index.
-     * It returns the defaultValue if there is no value at that index or if
-     * it is not a Boolean or the String "true" or "false" (case insensitive).
-     *
-     * @param index The index must be between 0 and length() - 1.
-     * @param defaultValue     A boolean default.
-     * @return      The truth.
-     */
-    public boolean optBoolean(int index, boolean defaultValue)  {
-        try {
-            return getBoolean(index);
-        } catch (Exception e) {
-            return defaultValue;
-        }
-    }
-
-
-    /**
-     * Get the optional double value associated with an index.
-     * NaN is returned if there is no value for the index,
-     * or if the value is not a number and cannot be converted to a number.
-     *
-     * @param index The index must be between 0 and length() - 1.
-     * @return      The value.
-     */
-    public double optDouble(int index) {
-        return optDouble(index, Double.NaN);
-    }
-
-
-    /**
-     * Get the optional double value associated with an index.
-     * The defaultValue is returned if there is no value for the index,
-     * or if the value is not a number and cannot be converted to a number.
-     *
-     * @param index subscript
-     * @param defaultValue     The default value.
-     * @return      The value.
-     */
-    public double optDouble(int index, double defaultValue) {
-        try {
-            return getDouble(index);
-        } catch (Exception e) {
-            return defaultValue;
-        }
-    }
-
-
-    /**
-     * Get the optional int value associated with an index.
-     * Zero is returned if there is no value for the index,
-     * or if the value is not a number and cannot be converted to a number.
-     *
-     * @param index The index must be between 0 and length() - 1.
-     * @return      The value.
-     */
-    public int optInt(int index) {
-        return optInt(index, 0);
-    }
-
-
-    /**
-     * Get the optional int value associated with an index.
-     * The defaultValue is returned if there is no value for the index,
-     * or if the value is not a number and cannot be converted to a number.
-     * @param index The index must be between 0 and length() - 1.
-     * @param defaultValue     The default value.
-     * @return      The value.
-     */
-    public int optInt(int index, int defaultValue) {
-        try {
-            return getInt(index);
-        } catch (Exception e) {
-            return defaultValue;
-        }
-    }
-
-
-    /**
-     * Get the optional JSONArray associated with an index.
-     * @param index subscript
-     * @return      A JSONArray value, or null if the index has no value,
-     * or if the value is not a JSONArray.
-     */
-    public JSONArray optJSONArray(int index) {
-        Object o = opt(index);
-        return o instanceof JSONArray ? (JSONArray)o : null;
-    }
-
-
-    /**
-     * Get the optional JSONObject associated with an index.
-     * Null is returned if the key is not found, or null if the index has
-     * no value, or if the value is not a JSONObject.
-     *
-     * @param index The index must be between 0 and length() - 1.
-     * @return      A JSONObject value.
-     */
-    public JSONObject optJSONObject(int index) {
-        Object o = opt(index);
-        return o instanceof JSONObject ? (JSONObject)o : null;
-    }
-
-
-    /**
-     * Get the optional long value associated with an index.
-     * Zero is returned if there is no value for the index,
-     * or if the value is not a number and cannot be converted to a number.
-     *
-     * @param index The index must be between 0 and length() - 1.
-     * @return      The value.
-     */
-    public long optLong(int index) {
-        return optLong(index, 0);
-    }
-
-
-    /**
-     * Get the optional long value associated with an index.
-     * The defaultValue is returned if there is no value for the index,
-     * or if the value is not a number and cannot be converted to a number.
-     * @param index The index must be between 0 and length() - 1.
-     * @param defaultValue     The default value.
-     * @return      The value.
-     */
-    public long optLong(int index, long defaultValue) {
-        try {
-            return getLong(index);
-        } catch (Exception e) {
-            return defaultValue;
-        }
-    }
-
-
-    /**
-     * Get the optional string value associated with an index. It returns an
-     * empty string if there is no value at that index. If the value
-     * is not a string and is not null, then it is coverted to a string.
-     *
-     * @param index The index must be between 0 and length() - 1.
-     * @return      A String value.
-     */
-    public String optString(int index) {
-        return optString(index, "");
-    }
-
-
-    /**
-     * Get the optional string associated with an index.
-     * The defaultValue is returned if the key is not found.
-     *
-     * @param index The index must be between 0 and length() - 1.
-     * @param defaultValue     The default value.
-     * @return      A String value.
-     */
-    public String optString(int index, String defaultValue) {
-        Object o = opt(index);
-        return o != null ? o.toString() : defaultValue;
-    }
-
-
-    /**
-     * Append a boolean value. This increases the array's length by one.
-     *
-     * @param value A boolean value.
-     * @return this.
-     */
-    public JSONArray put(boolean value) {
-        put(value ? Boolean.TRUE : Boolean.FALSE);
-        return this;
-    }
-
-
-    /**
-     * Put a value in the JSONArray, where the value will be a
-     * JSONArray which is produced from a Collection.
-     * @param value A Collection value.
-     * @return      this.
-     */
-    public JSONArray put(Collection value) {
-        put(new JSONArray(value));
-        return this;
-    }
-
-
-    /**
-     * Append a double value. This increases the array's length by one.
-     *
-     * @param value A double value.
-     * @throws JSONException if the value is not finite.
-     * @return this.
-     */
-    public JSONArray put(double value) throws JSONException {
-        Double d = new Double(value);
-        JSONObject.testValidity(d);
-        put(d);
-        return this;
-    }
-
-
-    /**
-     * Append an int value. This increases the array's length by one.
-     *
-     * @param value An int value.
-     * @return this.
-     */
-    public JSONArray put(int value) {
-        put(new Integer(value));
-        return this;
-    }
-
-
-    /**
-     * Append an long value. This increases the array's length by one.
-     *
-     * @param value A long value.
-     * @return this.
-     */
-    public JSONArray put(long value) {
-        put(new Long(value));
-        return this;
-    }
-
-
-    /**
-     * Put a value in the JSONArray, where the value will be a
-     * JSONObject which is produced from a Map.
-     * @param value A Map value.
-     * @return      this.
-     */
-    public JSONArray put(Map value) {
-        put(new JSONObject(value));
-        return this;
-    }
-
-
-    /**
-     * Append an object value. This increases the array's length by one.
-     * @param value An object value.  The value should be a
-     *  Boolean, Double, Integer, JSONArray, JSONObject, Long, or String, or the
-     *  JSONObject.NULL object.
-     * @return this.
-     */
-    public JSONArray put(Object value) {
-        this.myArrayList.add(value);
-        return this;
-    }
-
-
-    /**
-     * Put or replace a boolean value in the JSONArray. If the index is greater
-     * than the length of the JSONArray, then null elements will be added as
-     * necessary to pad it out.
-     * @param index The subscript.
-     * @param value A boolean value.
-     * @return this.
-     * @throws JSONException If the index is negative.
-     */
-    public JSONArray put(int index, boolean value) throws JSONException {
-        put(index, value ? Boolean.TRUE : Boolean.FALSE);
-        return this;
-    }
-
-
-    /**
-     * Put a value in the JSONArray, where the value will be a
-     * JSONArray which is produced from a Collection.
-     * @param index The subscript.
-     * @param value A Collection value.
-     * @return      this.
-     * @throws JSONException If the index is negative or if the value is
-     * not finite.
-     */
-    public JSONArray put(int index, Collection value) throws JSONException {
-        put(index, new JSONArray(value));
-        return this;
-    }
-
-
-    /**
-     * Put or replace a double value. If the index is greater than the length of
-     *  the JSONArray, then null elements will be added as necessary to pad
-     *  it out.
-     * @param index The subscript.
-     * @param value A double value.
-     * @return this.
-     * @throws JSONException If the index is negative or if the value is
-     * not finite.
-     */
-    public JSONArray put(int index, double value) throws JSONException {
-        put(index, new Double(value));
-        return this;
-    }
-
-
-    /**
-     * Put or replace an int value. If the index is greater than the length of
-     *  the JSONArray, then null elements will be added as necessary to pad
-     *  it out.
-     * @param index The subscript.
-     * @param value An int value.
-     * @return this.
-     * @throws JSONException If the index is negative.
-     */
-    public JSONArray put(int index, int value) throws JSONException {
-        put(index, new Integer(value));
-        return this;
-    }
-
-
-    /**
-     * Put or replace a long value. If the index is greater than the length of
-     *  the JSONArray, then null elements will be added as necessary to pad
-     *  it out.
-     * @param index The subscript.
-     * @param value A long value.
-     * @return this.
-     * @throws JSONException If the index is negative.
-     */
-    public JSONArray put(int index, long value) throws JSONException {
-        put(index, new Long(value));
-        return this;
-    }
-
-
-    /**
-     * Put a value in the JSONArray, where the value will be a
-     * JSONObject which is produced from a Map.
-     * @param index The subscript.
-     * @param value The Map value.
-     * @return      this.
-     * @throws JSONException If the index is negative or if the value is
-     *  an invalid number.
-     */
-    public JSONArray put(int index, Map value) throws JSONException {
-        put(index, new JSONObject(value));
-        return this;
-    }
-
-
-    /**
-     * Put or replace an object value in the JSONArray. If the index is greater
-     *  than the length of the JSONArray, then null elements will be added as
-     *  necessary to pad it out.
-     * @param index The subscript.
-     * @param value The value to put into the array. The value should be a
-     *  Boolean, Double, Integer, JSONArray, JSONObject, Long, or String, or the
-     *  JSONObject.NULL object.
-     * @return this.
-     * @throws JSONException If the index is negative or if the value is
-     *  an invalid number.
-     */
-    public JSONArray put(int index, Object value) throws JSONException {
-        JSONObject.testValidity(value);
-        if (index < 0) {
-            throw new JSONException("JSONArray[" + index + "] not found.");
-        }
-        if (index < length()) {
-            this.myArrayList.set(index, value);
-        } else {
-            while (index != length()) {
-                put(JSONObject.NULL);
-            }
-            put(value);
-        }
-        return this;
-    }
-
-
-    /**
-     * Remove an index and close the hole.
-     * @param index The index of the element to be removed.
-     * @return The value that was associated with the index,
-     * or null if there was no value.
-     */
-    public Object remove(int index) {
-        Object o = opt(index);
-        this.myArrayList.remove(index);
-        return o;
-    }
-
-
-    /**
-     * Produce a JSONObject by combining a JSONArray of names with the values
-     * of this JSONArray.
-     * @param names A JSONArray containing a list of key strings. These will be
-     * paired with the values.
-     * @return A JSONObject, or null if there are no names or if this JSONArray
-     * has no values.
-     * @throws JSONException If any of the names are null.
-     */
-    public JSONObject toJSONObject(JSONArray names) throws JSONException {
-        if (names == null || names.length() == 0 || length() == 0) {
-            return null;
-        }
-        JSONObject jo = new JSONObject();
-        for (int i = 0; i < names.length(); i += 1) {
-            jo.put(names.getString(i), this.opt(i));
-        }
-        return jo;
-    }
-
-
-    /**
-     * Make a JSON text of this JSONArray. For compactness, no
-     * unnecessary whitespace is added. If it is not possible to produce a
-     * syntactically correct JSON text then null will be returned instead. This
-     * could occur if the array contains an invalid number.
-     * <p>
-     * Warning: This method assumes that the data structure is acyclical.
-     *
-     * @return a printable, displayable, transmittable
-     *  representation of the array.
-     */
-    public String toString() {
-        try {
-            return '[' + join(",") + ']';
-        } catch (Exception e) {
-            return null;
-        }
-    }
-
-
-    /**
-     * Make a prettyprinted JSON text of this JSONArray.
-     * Warning: This method assumes that the data structure is acyclical.
-     * @param indentFactor The number of spaces to add to each level of
-     *  indentation.
-     * @return a printable, displayable, transmittable
-     *  representation of the object, beginning
-     *  with <code>[</code> <small>(left bracket)</small> and ending
-     *  with <code>]</code> <small>(right bracket)</small>.
-     * @throws JSONException
-     */
-    public String toString(int indentFactor) throws JSONException {
-        return toString(indentFactor, 0);
-    }
-
-
-    /**
-     * Make a prettyprinted JSON text of this JSONArray.
-     * Warning: This method assumes that the data structure is acyclical.
-     * @param indentFactor The number of spaces to add to each level of
-     *  indentation.
-     * @param indent The indention of the top level.
-     * @return a printable, displayable, transmittable
-     *  representation of the array.
-     * @throws JSONException
-     */
-    String toString(int indentFactor, int indent) throws JSONException {
-        int len = length();
-        if (len == 0) {
-            return "[]";
-        }
-        int i;
-        StringBuffer sb = new StringBuffer("[");
-        if (len == 1) {
-            sb.append(JSONObject.valueToString(this.myArrayList.get(0),
-                    indentFactor, indent));
-        } else {
-            int newindent = indent + indentFactor;
-            sb.append('\n');
-            for (i = 0; i < len; i += 1) {
-                if (i > 0) {
-                    sb.append(",\n");
-                }
-                for (int j = 0; j < newindent; j += 1) {
-                    sb.append(' ');
-                }
-                sb.append(JSONObject.valueToString(this.myArrayList.get(i),
-                        indentFactor, newindent));
-            }
-            sb.append('\n');
-            for (i = 0; i < indent; i += 1) {
-                sb.append(' ');
-            }
-        }
-        sb.append(']');
-        return sb.toString();
-    }
-
-
-    /**
-     * Write the contents of the JSONArray as JSON text to a writer.
-     * For compactness, no whitespace is added.
-     * <p>
-     * Warning: This method assumes that the data structure is acyclical.
-     *
-     * @return The writer.
-     * @throws JSONException
-     */
-    public Writer write(Writer writer) throws JSONException {
-        try {
-            boolean b = false;
-            int     len = length();
-
-            writer.write('[');
-
-            for (int i = 0; i < len; i += 1) {
-                if (b) {
-                    writer.write(',');
-                }
-                Object v = this.myArrayList.get(i);
-                if (v instanceof JSONObject) {
-                    ((JSONObject)v).write(writer);
-                } else if (v instanceof JSONArray) {
-                    ((JSONArray)v).write(writer);
-                } else {
-                    writer.write(JSONObject.valueToString(v));
-                }
-                b = true;
-            }
-            writer.write(']');
-            return writer;
-        } catch (IOException e) {
-           throw new JSONException(e);
-        }
-    }
-}
\ No newline at end of file
diff --git a/livegps/src/org/json/JSONException.java b/livegps/src/org/json/JSONException.java
deleted file mode 100644
index 0c0c207..0000000
--- a/livegps/src/org/json/JSONException.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.json;
-
-/**
- * The JSONException is thrown by the JSON.org classes when things are amiss.
- * @author JSON.org
- * @version 2008-09-18
- */
-public class JSONException extends Exception {
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 0;
-    private Throwable cause;
-
-    /**
-     * Constructs a JSONException with an explanatory message.
-     * @param message Detail about the reason for the exception.
-     */
-    public JSONException(String message) {
-        super(message);
-    }
-
-    public JSONException(Throwable t) {
-        super(t.getMessage());
-        this.cause = t;
-    }
-
-    public Throwable getCause() {
-        return this.cause;
-    }
-}
diff --git a/livegps/src/org/json/JSONObject.java b/livegps/src/org/json/JSONObject.java
deleted file mode 100644
index e1194be..0000000
--- a/livegps/src/org/json/JSONObject.java
+++ /dev/null
@@ -1,1584 +0,0 @@
-package org.json;
-
-/*
-Copyright (c) 2002 JSON.org
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-The Software shall be used for Good, not Evil.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-*/
-
-import java.io.IOException;
-import java.io.Writer;
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.lang.reflect.Method;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.TreeSet;
-
-/**
- * A JSONObject is an unordered collection of name/value pairs. Its
- * external form is a string wrapped in curly braces with colons between the
- * names and values, and commas between the values and names. The internal form
- * is an object having <code>get</code> and <code>opt</code> methods for
- * accessing the values by name, and <code>put</code> methods for adding or
- * replacing values by name. The values can be any of these types:
- * <code>Boolean</code>, <code>JSONArray</code>, <code>JSONObject</code>,
- * <code>Number</code>, <code>String</code>, or the <code>JSONObject.NULL</code>
- * object. A JSONObject constructor can be used to convert an external form
- * JSON text into an internal form whose values can be retrieved with the
- * <code>get</code> and <code>opt</code> methods, or to convert values into a
- * JSON text using the <code>put</code> and <code>toString</code> methods.
- * A <code>get</code> method returns a value if one can be found, and throws an
- * exception if one cannot be found. An <code>opt</code> method returns a
- * default value instead of throwing an exception, and so is useful for
- * obtaining optional values.
- * <p>
- * The generic <code>get()</code> and <code>opt()</code> methods return an
- * object, which you can cast or query for type. There are also typed
- * <code>get</code> and <code>opt</code> methods that do type checking and type
- * coercion for you.
- * <p>
- * The <code>put</code> methods adds values to an object. For example, <pre>
- *     myString = new JSONObject().put("JSON", "Hello, World!").toString();</pre>
- * produces the string <code>{"JSON": "Hello, World"}</code>.
- * <p>
- * The texts produced by the <code>toString</code> methods strictly conform to
- * the JSON syntax rules.
- * The constructors are more forgiving in the texts they will accept:
- * <ul>
- * <li>An extra <code>,</code> <small>(comma)</small> may appear just
- *     before the closing brace.</li>
- * <li>Strings may be quoted with <code>'</code> <small>(single
- *     quote)</small>.</li>
- * <li>Strings do not need to be quoted at all if they do not begin with a quote
- *     or single quote, and if they do not contain leading or trailing spaces,
- *     and if they do not contain any of these characters:
- *     <code>{ } [ ] / \ : , = ; #</code> and if they do not look like numbers
- *     and if they are not the reserved words <code>true</code>,
- *     <code>false</code>, or <code>null</code>.</li>
- * <li>Keys can be followed by <code>=</code> or <code>=></code> as well as
- *     by <code>:</code>.</li>
- * <li>Values can be followed by <code>;</code> <small>(semicolon)</small> as
- *     well as by <code>,</code> <small>(comma)</small>.</li>
- * <li>Numbers may have the <code>0x-</code> <small>(hex)</small> prefix.</li>
- * </ul>
- * @author JSON.org
- * @version 2010-05-17
- */
-public class JSONObject {
-
-    /**
-     * JSONObject.NULL is equivalent to the value that JavaScript calls null,
-     * whilst Java's null is equivalent to the value that JavaScript calls
-     * undefined.
-     */
-     private static final class Null {
-
-        /**
-         * There is only intended to be a single instance of the NULL object,
-         * so the clone method returns itself.
-         * @return     NULL.
-         */
-        protected final Object clone() {
-            return this;
-        }
-
-
-        /**
-         * A Null object is equal to the null value and to itself.
-         * @param object    An object to test for nullness.
-         * @return true if the object parameter is the JSONObject.NULL object
-         *  or null.
-         */
-        public boolean equals(Object object) {
-            return object == null || object == this;
-        }
-
-
-        /**
-         * Get the "null" string value.
-         * @return The string "null".
-         */
-        public String toString() {
-            return "null";
-        }
-    }
-
-
-    /**
-     * The map where the JSONObject's properties are kept.
-     */
-    private Map map;
-
-
-    /**
-     * It is sometimes more convenient and less ambiguous to have a
-     * <code>NULL</code> object than to use Java's <code>null</code> value.
-     * <code>JSONObject.NULL.equals(null)</code> returns <code>true</code>.
-     * <code>JSONObject.NULL.toString()</code> returns <code>"null"</code>.
-     */
-    public static final Object NULL = new Null();
-
-
-    /**
-     * Construct an empty JSONObject.
-     */
-    public JSONObject() {
-        this.map = new HashMap();
-    }
-
-
-    /**
-     * Construct a JSONObject from a subset of another JSONObject.
-     * An array of strings is used to identify the keys that should be copied.
-     * Missing keys are ignored.
-     * @param jo A JSONObject.
-     * @param names An array of strings.
-     * @throws JSONException
-     * @exception JSONException If a value is a non-finite number or if a name is duplicated.
-     */
-    public JSONObject(JSONObject jo, String[] names) {
-        this();
-        for (int i = 0; i < names.length; i += 1) {
-            try {
-                putOnce(names[i], jo.opt(names[i]));
-            } catch (Exception ignore) {
-            }
-        }
-    }
-
-
-    /**
-     * Construct a JSONObject from a JSONTokener.
-     * @param x A JSONTokener object containing the source string.
-     * @throws JSONException If there is a syntax error in the source string
-     *  or a duplicated key.
-     */
-    public JSONObject(JSONTokener x) throws JSONException {
-        this();
-        char c;
-        String key;
-
-        if (x.nextClean() != '{') {
-            throw x.syntaxError("A JSONObject text must begin with '{'");
-        }
-        for (;;) {
-            c = x.nextClean();
-            switch (c) {
-            case 0:
-                throw x.syntaxError("A JSONObject text must end with '}'");
-            case '}':
-                return;
-            default:
-                x.back();
-                key = x.nextValue().toString();
-            }
-
-            /*
-             * The key is followed by ':'. We will also tolerate '=' or '=>'.
-             */
-
-            c = x.nextClean();
-            if (c == '=') {
-                if (x.next() != '>') {
-                    x.back();
-                }
-            } else if (c != ':') {
-                throw x.syntaxError("Expected a ':' after a key");
-            }
-            putOnce(key, x.nextValue());
-
-            /*
-             * Pairs are separated by ','. We will also tolerate ';'.
-             */
-
-            switch (x.nextClean()) {
-            case ';':
-            case ',':
-                if (x.nextClean() == '}') {
-                    return;
-                }
-                x.back();
-                break;
-            case '}':
-                return;
-            default:
-                throw x.syntaxError("Expected a ',' or '}'");
-            }
-        }
-    }
-
-
-    /**
-     * Construct a JSONObject from a Map.
-     *
-     * @param map A map object that can be used to initialize the contents of
-     *  the JSONObject.
-     * @throws JSONException
-     */
-    public JSONObject(Map map) {
-        this.map = new HashMap();
-        if (map != null) {
-            Iterator i = map.entrySet().iterator();
-            while (i.hasNext()) {
-                Map.Entry e = (Map.Entry)i.next();
-                this.map.put(e.getKey(), wrap(e.getValue()));
-            }
-        }
-    }
-
-
-    /**
-     * Construct a JSONObject from an Object using bean getters.
-     * It reflects on all of the public methods of the object.
-     * For each of the methods with no parameters and a name starting
-     * with <code>"get"</code> or <code>"is"</code> followed by an uppercase letter,
-     * the method is invoked, and a key and the value returned from the getter method
-     * are put into the new JSONObject.
-     *
-     * The key is formed by removing the <code>"get"</code> or <code>"is"</code> prefix.
-     * If the second remaining character is not upper case, then the first
-     * character is converted to lower case.
-     *
-     * For example, if an object has a method named <code>"getName"</code>, and
-     * if the result of calling <code>object.getName()</code> is <code>"Larry Fine"</code>,
-     * then the JSONObject will contain <code>"name": "Larry Fine"</code>.
-     *
-     * @param bean An object that has getter methods that should be used
-     * to make a JSONObject.
-     */
-    public JSONObject(Object bean) {
-        this();
-        populateMap(bean);
-    }
-
-
-    /**
-     * Construct a JSONObject from an Object, using reflection to find the
-     * public members. The resulting JSONObject's keys will be the strings
-     * from the names array, and the values will be the field values associated
-     * with those keys in the object. If a key is not found or not visible,
-     * then it will not be copied into the new JSONObject.
-     * @param object An object that has fields that should be used to make a
-     * JSONObject.
-     * @param names An array of strings, the names of the fields to be obtained
-     * from the object.
-     */
-    public JSONObject(Object object, String names[]) {
-        this();
-        Class c = object.getClass();
-        for (int i = 0; i < names.length; i += 1) {
-            String name = names[i];
-            try {
-                putOpt(name, c.getField(name).get(object));
-            } catch (Exception ignore) {
-            }
-        }
-    }
-
-
-    /**
-     * Construct a JSONObject from a source JSON text string.
-     * This is the most commonly used JSONObject constructor.
-     * @param source    A string beginning
-     *  with <code>{</code> <small>(left brace)</small> and ending
-     *  with <code>}</code> <small>(right brace)</small>.
-     * @exception JSONException If there is a syntax error in the source
-     *  string or a duplicated key.
-     */
-    public JSONObject(String source) throws JSONException {
-        this(new JSONTokener(source));
-    }
-
-
-    /**
-     * Accumulate values under a key. It is similar to the put method except
-     * that if there is already an object stored under the key then a
-     * JSONArray is stored under the key to hold all of the accumulated values.
-     * If there is already a JSONArray, then the new value is appended to it.
-     * In contrast, the put method replaces the previous value.
-     * @param key   A key string.
-     * @param value An object to be accumulated under the key.
-     * @return this.
-     * @throws JSONException If the value is an invalid number
-     *  or if the key is null.
-     */
-    public JSONObject accumulate(String key, Object value)
-            throws JSONException {
-        testValidity(value);
-        Object o = opt(key);
-        if (o == null) {
-            put(key, value instanceof JSONArray ?
-                    new JSONArray().put(value) :
-                    value);
-        } else if (o instanceof JSONArray) {
-            ((JSONArray)o).put(value);
-        } else {
-            put(key, new JSONArray().put(o).put(value));
-        }
-        return this;
-    }
-
-
-    /**
-     * Append values to the array under a key. If the key does not exist in the
-     * JSONObject, then the key is put in the JSONObject with its value being a
-     * JSONArray containing the value parameter. If the key was already
-     * associated with a JSONArray, then the value parameter is appended to it.
-     * @param key   A key string.
-     * @param value An object to be accumulated under the key.
-     * @return this.
-     * @throws JSONException If the key is null or if the current value
-     *  associated with the key is not a JSONArray.
-     */
-    public JSONObject append(String key, Object value) throws JSONException {
-        testValidity(value);
-        Object o = opt(key);
-        if (o == null) {
-            put(key, new JSONArray().put(value));
-        } else if (o instanceof JSONArray) {
-            put(key, ((JSONArray)o).put(value));
-        } else {
-            throw new JSONException("JSONObject[" + key +
-                    "] is not a JSONArray.");
-        }
-        return this;
-    }
-
-
-    /**
-     * Produce a string from a double. The string "null" will be returned if
-     * the number is not finite.
-     * @param  d A double.
-     * @return A String.
-     */
-    static public String doubleToString(double d) {
-        if (Double.isInfinite(d) || Double.isNaN(d)) {
-            return "null";
-        }
-
-// Shave off trailing zeros and decimal point, if possible.
-
-        String s = Double.toString(d);
-        if (s.indexOf('.') > 0 && s.indexOf('e') < 0 && s.indexOf('E') < 0) {
-            while (s.endsWith("0")) {
-                s = s.substring(0, s.length() - 1);
-            }
-            if (s.endsWith(".")) {
-                s = s.substring(0, s.length() - 1);
-            }
-        }
-        return s;
-    }
-
-
-    /**
-     * Get the value object associated with a key.
-     *
-     * @param key   A key string.
-     * @return      The object associated with the key.
-     * @throws   JSONException if the key is not found.
-     */
-    public Object get(String key) throws JSONException {
-        Object o = opt(key);
-        if (o == null) {
-            throw new JSONException("JSONObject[" + quote(key) +
-                    "] not found.");
-        }
-        return o;
-    }
-
-
-    /**
-     * Get the boolean value associated with a key.
-     *
-     * @param key   A key string.
-     * @return      The truth.
-     * @throws   JSONException
-     *  if the value is not a Boolean or the String "true" or "false".
-     */
-    public boolean getBoolean(String key) throws JSONException {
-        Object o = get(key);
-        if (o.equals(Boolean.FALSE) ||
-                (o instanceof String &&
-                ((String)o).equalsIgnoreCase("false"))) {
-            return false;
-        } else if (o.equals(Boolean.TRUE) ||
-                (o instanceof String &&
-                ((String)o).equalsIgnoreCase("true"))) {
-            return true;
-        }
-        throw new JSONException("JSONObject[" + quote(key) +
-                "] is not a Boolean.");
-    }
-
-
-    /**
-     * Get the double value associated with a key.
-     * @param key   A key string.
-     * @return      The numeric value.
-     * @throws JSONException if the key is not found or
-     *  if the value is not a Number object and cannot be converted to a number.
-     */
-    public double getDouble(String key) throws JSONException {
-        Object o = get(key);
-        try {
-            return o instanceof Number ?
-                ((Number)o).doubleValue() :
-                Double.valueOf((String)o).doubleValue();
-        } catch (Exception e) {
-            throw new JSONException("JSONObject[" + quote(key) +
-                "] is not a number.");
-        }
-    }
-
-
-    /**
-     * Get the int value associated with a key.
-     *
-     * @param key   A key string.
-     * @return      The integer value.
-     * @throws   JSONException if the key is not found or if the value cannot
-     *  be converted to an integer.
-     */
-    public int getInt(String key) throws JSONException {
-        Object o = get(key);
-        try {
-            return o instanceof Number ?
-                ((Number)o).intValue() :
-                Integer.parseInt((String)o);
-        } catch (Exception e) {
-            throw new JSONException("JSONObject[" + quote(key) +
-                "] is not an int.");
-        }
-    }
-
-
-    /**
-     * Get the JSONArray value associated with a key.
-     *
-     * @param key   A key string.
-     * @return      A JSONArray which is the value.
-     * @throws   JSONException if the key is not found or
-     *  if the value is not a JSONArray.
-     */
-    public JSONArray getJSONArray(String key) throws JSONException {
-        Object o = get(key);
-        if (o instanceof JSONArray) {
-            return (JSONArray)o;
-        }
-        throw new JSONException("JSONObject[" + quote(key) +
-                "] is not a JSONArray.");
-    }
-
-
-    /**
-     * Get the JSONObject value associated with a key.
-     *
-     * @param key   A key string.
-     * @return      A JSONObject which is the value.
-     * @throws   JSONException if the key is not found or
-     *  if the value is not a JSONObject.
-     */
-    public JSONObject getJSONObject(String key) throws JSONException {
-        Object o = get(key);
-        if (o instanceof JSONObject) {
-            return (JSONObject)o;
-        }
-        throw new JSONException("JSONObject[" + quote(key) +
-                "] is not a JSONObject.");
-    }
-
-
-    /**
-     * Get the long value associated with a key.
-     *
-     * @param key   A key string.
-     * @return      The long value.
-     * @throws   JSONException if the key is not found or if the value cannot
-     *  be converted to a long.
-     */
-    public long getLong(String key) throws JSONException {
-        Object o = get(key);
-        try {
-            return o instanceof Number ?
-                ((Number)o).longValue() :
-                Long.parseLong((String)o);
-        } catch (Exception e) {
-            throw new JSONException("JSONObject[" + quote(key) +
-                "] is not a long.");
-        }
-    }
-
-
-    /**
-     * Get an array of field names from a JSONObject.
-     *
-     * @return An array of field names, or null if there are no names.
-     */
-    public static String[] getNames(JSONObject jo) {
-        int length = jo.length();
-        if (length == 0) {
-            return null;
-        }
-        Iterator i = jo.keys();
-        String[] names = new String[length];
-        int j = 0;
-        while (i.hasNext()) {
-            names[j] = (String)i.next();
-            j += 1;
-        }
-        return names;
-    }
-
-
-    /**
-     * Get an array of field names from an Object.
-     *
-     * @return An array of field names, or null if there are no names.
-     */
-    public static String[] getNames(Object object) {
-        if (object == null) {
-            return null;
-        }
-        Class klass = object.getClass();
-        Field[] fields = klass.getFields();
-        int length = fields.length;
-        if (length == 0) {
-            return null;
-        }
-        String[] names = new String[length];
-        for (int i = 0; i < length; i += 1) {
-            names[i] = fields[i].getName();
-        }
-        return names;
-    }
-
-
-    /**
-     * Get the string associated with a key.
-     *
-     * @param key   A key string.
-     * @return      A string which is the value.
-     * @throws   JSONException if the key is not found.
-     */
-    public String getString(String key) throws JSONException {
-        return get(key).toString();
-    }
-
-
-    /**
-     * Determine if the JSONObject contains a specific key.
-     * @param key   A key string.
-     * @return      true if the key exists in the JSONObject.
-     */
-    public boolean has(String key) {
-        return this.map.containsKey(key);
-    }
-
-
-    /**
-     * Increment a property of a JSONObject. If there is no such property,
-     * create one with a value of 1. If there is such a property, and if
-     * it is an Integer, Long, Double, or Float, then add one to it.
-     * @param key  A key string.
-     * @return this.
-     * @throws JSONException If there is already a property with this name
-     * that is not an Integer, Long, Double, or Float.
-     */
-    public JSONObject increment(String key) throws JSONException {
-        Object value = opt(key);
-        if (value == null) {
-            put(key, 1);
-        } else {
-            if (value instanceof Integer) {
-                put(key, ((Integer)value).intValue() + 1);
-            } else if (value instanceof Long) {
-                put(key, ((Long)value).longValue() + 1);
-            } else if (value instanceof Double) {
-                put(key, ((Double)value).doubleValue() + 1);
-            } else if (value instanceof Float) {
-                put(key, ((Float)value).floatValue() + 1);
-            } else {
-                throw new JSONException("Unable to increment [" + key + "].");
-            }
-        }
-        return this;
-    }
-
-
-    /**
-     * Determine if the value associated with the key is null or if there is
-     *  no value.
-     * @param key   A key string.
-     * @return      true if there is no value associated with the key or if
-     *  the value is the JSONObject.NULL object.
-     */
-    public boolean isNull(String key) {
-        return JSONObject.NULL.equals(opt(key));
-    }
-
-
-    /**
-     * Get an enumeration of the keys of the JSONObject.
-     *
-     * @return An iterator of the keys.
-     */
-    public Iterator keys() {
-        return this.map.keySet().iterator();
-    }
-
-
-    /**
-     * Get the number of keys stored in the JSONObject.
-     *
-     * @return The number of keys in the JSONObject.
-     */
-    public int length() {
-        return this.map.size();
-    }
-
-
-    /**
-     * Produce a JSONArray containing the names of the elements of this
-     * JSONObject.
-     * @return A JSONArray containing the key strings, or null if the JSONObject
-     * is empty.
-     */
-    public JSONArray names() {
-        JSONArray ja = new JSONArray();
-        Iterator  keys = keys();
-        while (keys.hasNext()) {
-            ja.put(keys.next());
-        }
-        return ja.length() == 0 ? null : ja;
-    }
-
-    /**
-     * Produce a string from a Number.
-     * @param  n A Number
-     * @return A String.
-     * @throws JSONException If n is a non-finite number.
-     */
-    static public String numberToString(Number n)
-            throws JSONException {
-        if (n == null) {
-            throw new JSONException("Null pointer");
-        }
-        testValidity(n);
-
-// Shave off trailing zeros and decimal point, if possible.
-
-        String s = n.toString();
-        if (s.indexOf('.') > 0 && s.indexOf('e') < 0 && s.indexOf('E') < 0) {
-            while (s.endsWith("0")) {
-                s = s.substring(0, s.length() - 1);
-            }
-            if (s.endsWith(".")) {
-                s = s.substring(0, s.length() - 1);
-            }
-        }
-        return s;
-    }
-
-
-    /**
-     * Get an optional value associated with a key.
-     * @param key   A key string.
-     * @return      An object which is the value, or null if there is no value.
-     */
-    public Object opt(String key) {
-        return key == null ? null : this.map.get(key);
-    }
-
-
-    /**
-     * Get an optional boolean associated with a key.
-     * It returns false if there is no such key, or if the value is not
-     * Boolean.TRUE or the String "true".
-     *
-     * @param key   A key string.
-     * @return      The truth.
-     */
-    public boolean optBoolean(String key) {
-        return optBoolean(key, false);
-    }
-
-
-    /**
-     * Get an optional boolean associated with a key.
-     * It returns the defaultValue if there is no such key, or if it is not
-     * a Boolean or the String "true" or "false" (case insensitive).
-     *
-     * @param key              A key string.
-     * @param defaultValue     The default.
-     * @return      The truth.
-     */
-    public boolean optBoolean(String key, boolean defaultValue) {
-        try {
-            return getBoolean(key);
-        } catch (Exception e) {
-            return defaultValue;
-        }
-    }
-
-
-    /**
-     * Get an optional double associated with a key,
-     * or NaN if there is no such key or if its value is not a number.
-     * If the value is a string, an attempt will be made to evaluate it as
-     * a number.
-     *
-     * @param key   A string which is the key.
-     * @return      An object which is the value.
-     */
-    public double optDouble(String key) {
-        return optDouble(key, Double.NaN);
-    }
-
-
-    /**
-     * Get an optional double associated with a key, or the
-     * defaultValue if there is no such key or if its value is not a number.
-     * If the value is a string, an attempt will be made to evaluate it as
-     * a number.
-     *
-     * @param key   A key string.
-     * @param defaultValue     The default.
-     * @return      An object which is the value.
-     */
-    public double optDouble(String key, double defaultValue) {
-        try {
-            Object o = opt(key);
-            return o instanceof Number ? ((Number)o).doubleValue() :
-                new Double((String)o).doubleValue();
-        } catch (Exception e) {
-            return defaultValue;
-        }
-    }
-
-
-    /**
-     * Get an optional int value associated with a key,
-     * or zero if there is no such key or if the value is not a number.
-     * If the value is a string, an attempt will be made to evaluate it as
-     * a number.
-     *
-     * @param key   A key string.
-     * @return      An object which is the value.
-     */
-    public int optInt(String key) {
-        return optInt(key, 0);
-    }
-
-
-    /**
-     * Get an optional int value associated with a key,
-     * or the default if there is no such key or if the value is not a number.
-     * If the value is a string, an attempt will be made to evaluate it as
-     * a number.
-     *
-     * @param key   A key string.
-     * @param defaultValue     The default.
-     * @return      An object which is the value.
-     */
-    public int optInt(String key, int defaultValue) {
-        try {
-            return getInt(key);
-        } catch (Exception e) {
-            return defaultValue;
-        }
-    }
-
-
-    /**
-     * Get an optional JSONArray associated with a key.
-     * It returns null if there is no such key, or if its value is not a
-     * JSONArray.
-     *
-     * @param key   A key string.
-     * @return      A JSONArray which is the value.
-     */
-    public JSONArray optJSONArray(String key) {
-        Object o = opt(key);
-        return o instanceof JSONArray ? (JSONArray)o : null;
-    }
-
-
-    /**
-     * Get an optional JSONObject associated with a key.
-     * It returns null if there is no such key, or if its value is not a
-     * JSONObject.
-     *
-     * @param key   A key string.
-     * @return      A JSONObject which is the value.
-     */
-    public JSONObject optJSONObject(String key) {
-        Object o = opt(key);
-        return o instanceof JSONObject ? (JSONObject)o : null;
-    }
-
-
-    /**
-     * Get an optional long value associated with a key,
-     * or zero if there is no such key or if the value is not a number.
-     * If the value is a string, an attempt will be made to evaluate it as
-     * a number.
-     *
-     * @param key   A key string.
-     * @return      An object which is the value.
-     */
-    public long optLong(String key) {
-        return optLong(key, 0);
-    }
-
-
-    /**
-     * Get an optional long value associated with a key,
-     * or the default if there is no such key or if the value is not a number.
-     * If the value is a string, an attempt will be made to evaluate it as
-     * a number.
-     *
-     * @param key   A key string.
-     * @param defaultValue     The default.
-     * @return      An object which is the value.
-     */
-    public long optLong(String key, long defaultValue) {
-        try {
-            return getLong(key);
-        } catch (Exception e) {
-            return defaultValue;
-        }
-    }
-
-
-    /**
-     * Get an optional string associated with a key.
-     * It returns an empty string if there is no such key. If the value is not
-     * a string and is not null, then it is coverted to a string.
-     *
-     * @param key   A key string.
-     * @return      A string which is the value.
-     */
-    public String optString(String key) {
-        return optString(key, "");
-    }
-
-
-    /**
-     * Get an optional string associated with a key.
-     * It returns the defaultValue if there is no such key.
-     *
-     * @param key   A key string.
-     * @param defaultValue     The default.
-     * @return      A string which is the value.
-     */
-    public String optString(String key, String defaultValue) {
-        Object o = opt(key);
-        return o != null ? o.toString() : defaultValue;
-    }
-
-
-    private void populateMap(Object bean) {
-        Class klass = bean.getClass();
-
-// If klass is a System class then set includeSuperClass to false.
-
-        boolean includeSuperClass = klass.getClassLoader() != null;
-
-        Method[] methods = (includeSuperClass) ?
-                klass.getMethods() : klass.getDeclaredMethods();
-        for (int i = 0; i < methods.length; i += 1) {
-            try {
-                Method method = methods[i];
-                if (Modifier.isPublic(method.getModifiers())) {
-                    String name = method.getName();
-                    String key = "";
-                    if (name.startsWith("get")) {
-                        if (name.equals("getClass") ||
-                                name.equals("getDeclaringClass")) {
-                            key = "";
-                        } else {
-                            key = name.substring(3);
-                        }
-                    } else if (name.startsWith("is")) {
-                        key = name.substring(2);
-                    }
-                    if (key.length() > 0 &&
-                            Character.isUpperCase(key.charAt(0)) &&
-                            method.getParameterTypes().length == 0) {
-                        if (key.length() == 1) {
-                            key = key.toLowerCase();
-                        } else if (!Character.isUpperCase(key.charAt(1))) {
-                            key = key.substring(0, 1).toLowerCase() +
-                                key.substring(1);
-                        }
-
-                        Object result = method.invoke(bean, (Object[])null);
-
-                        map.put(key, wrap(result));
-                    }
-                }
-            } catch (Exception ignore) {
-            }
-        }
-    }
-
-
-    /**
-     * Put a key/boolean pair in the JSONObject.
-     *
-     * @param key   A key string.
-     * @param value A boolean which is the value.
-     * @return this.
-     * @throws JSONException If the key is null.
-     */
-    public JSONObject put(String key, boolean value) throws JSONException {
-        put(key, value ? Boolean.TRUE : Boolean.FALSE);
-        return this;
-    }
-
-
-    /**
-     * Put a key/value pair in the JSONObject, where the value will be a
-     * JSONArray which is produced from a Collection.
-     * @param key   A key string.
-     * @param value A Collection value.
-     * @return      this.
-     * @throws JSONException
-     */
-    public JSONObject put(String key, Collection value) throws JSONException {
-        put(key, new JSONArray(value));
-        return this;
-    }
-
-
-    /**
-     * Put a key/double pair in the JSONObject.
-     *
-     * @param key   A key string.
-     * @param value A double which is the value.
-     * @return this.
-     * @throws JSONException If the key is null or if the number is invalid.
-     */
-    public JSONObject put(String key, double value) throws JSONException {
-        put(key, new Double(value));
-        return this;
-    }
-
-
-    /**
-     * Put a key/int pair in the JSONObject.
-     *
-     * @param key   A key string.
-     * @param value An int which is the value.
-     * @return this.
-     * @throws JSONException If the key is null.
-     */
-    public JSONObject put(String key, int value) throws JSONException {
-        put(key, new Integer(value));
-        return this;
-    }
-
-
-    /**
-     * Put a key/long pair in the JSONObject.
-     *
-     * @param key   A key string.
-     * @param value A long which is the value.
-     * @return this.
-     * @throws JSONException If the key is null.
-     */
-    public JSONObject put(String key, long value) throws JSONException {
-        put(key, new Long(value));
-        return this;
-    }
-
-
-    /**
-     * Put a key/value pair in the JSONObject, where the value will be a
-     * JSONObject which is produced from a Map.
-     * @param key   A key string.
-     * @param value A Map value.
-     * @return      this.
-     * @throws JSONException
-     */
-    public JSONObject put(String key, Map value) throws JSONException {
-        put(key, new JSONObject(value));
-        return this;
-    }
-
-
-    /**
-     * Put a key/value pair in the JSONObject. If the value is null,
-     * then the key will be removed from the JSONObject if it is present.
-     * @param key   A key string.
-     * @param value An object which is the value. It should be of one of these
-     *  types: Boolean, Double, Integer, JSONArray, JSONObject, Long, String,
-     *  or the JSONObject.NULL object.
-     * @return this.
-     * @throws JSONException If the value is non-finite number
-     *  or if the key is null.
-     */
-    public JSONObject put(String key, Object value) throws JSONException {
-        if (key == null) {
-            throw new JSONException("Null key.");
-        }
-        if (value != null) {
-            testValidity(value);
-            this.map.put(key, value);
-        } else {
-            remove(key);
-        }
-        return this;
-    }
-
-
-    /**
-     * Put a key/value pair in the JSONObject, but only if the key and the
-     * value are both non-null, and only if there is not already a member
-     * with that name.
-     * @param key
-     * @param value
-     * @return his.
-     * @throws JSONException if the key is a duplicate
-     */
-    public JSONObject putOnce(String key, Object value) throws JSONException {
-        if (key != null && value != null) {
-            if (opt(key) != null) {
-                throw new JSONException("Duplicate key \"" + key + "\"");
-            }
-            put(key, value);
-        }
-        return this;
-    }
-
-
-    /**
-     * Put a key/value pair in the JSONObject, but only if the
-     * key and the value are both non-null.
-     * @param key   A key string.
-     * @param value An object which is the value. It should be of one of these
-     *  types: Boolean, Double, Integer, JSONArray, JSONObject, Long, String,
-     *  or the JSONObject.NULL object.
-     * @return this.
-     * @throws JSONException If the value is a non-finite number.
-     */
-    public JSONObject putOpt(String key, Object value) throws JSONException {
-        if (key != null && value != null) {
-            put(key, value);
-        }
-        return this;
-    }
-
-
-    /**
-     * Produce a string in double quotes with backslash sequences in all the
-     * right places. A backslash will be inserted within </, allowing JSON
-     * text to be delivered in HTML. In JSON text, a string cannot contain a
-     * control character or an unescaped quote or backslash.
-     * @param string A String
-     * @return  A String correctly formatted for insertion in a JSON text.
-     */
-    public static String quote(String string) {
-        if (string == null || string.length() == 0) {
-            return "\"\"";
-        }
-
-        char         b;
-        char         c = 0;
-        int          i;
-        int          len = string.length();
-        StringBuffer sb = new StringBuffer(len + 4);
-        String       t;
-
-        sb.append('"');
-        for (i = 0; i < len; i += 1) {
-            b = c;
-            c = string.charAt(i);
-            switch (c) {
-            case '\\':
-            case '"':
-                sb.append('\\');
-                sb.append(c);
-                break;
-            case '/':
-                if (b == '<') {
-                    sb.append('\\');
-                }
-                sb.append(c);
-                break;
-            case '\b':
-                sb.append("\\b");
-                break;
-            case '\t':
-                sb.append("\\t");
-                break;
-            case '\n':
-                sb.append("\\n");
-                break;
-            case '\f':
-                sb.append("\\f");
-                break;
-            case '\r':
-                sb.append("\\r");
-                break;
-            default:
-                if (c < ' ' || (c >= '\u0080' && c < '\u00a0') ||
-                               (c >= '\u2000' && c < '\u2100')) {
-                    t = "000" + Integer.toHexString(c);
-                    sb.append("\\u" + t.substring(t.length() - 4));
-                } else {
-                    sb.append(c);
-                }
-            }
-        }
-        sb.append('"');
-        return sb.toString();
-    }
-
-    /**
-     * Remove a name and its value, if present.
-     * @param key The name to be removed.
-     * @return The value that was associated with the name,
-     * or null if there was no value.
-     */
-    public Object remove(String key) {
-        return this.map.remove(key);
-    }
-
-    /**
-     * Get an enumeration of the keys of the JSONObject.
-     * The keys will be sorted alphabetically.
-     *
-     * @return An iterator of the keys.
-     */
-    public Iterator sortedKeys() {
-      return new TreeSet(this.map.keySet()).iterator();
-    }
-
-    /**
-     * Try to convert a string into a number, boolean, or null. If the string
-     * can't be converted, return the string.
-     * @param s A String.
-     * @return A simple JSON value.
-     */
-    static public Object stringToValue(String s) {
-        if (s.equals("")) {
-            return s;
-        }
-        if (s.equalsIgnoreCase("true")) {
-            return Boolean.TRUE;
-        }
-        if (s.equalsIgnoreCase("false")) {
-            return Boolean.FALSE;
-        }
-        if (s.equalsIgnoreCase("null")) {
-            return JSONObject.NULL;
-        }
-
-        /*
-         * If it might be a number, try converting it.
-         * We support the non-standard 0x- convention.
-         * If a number cannot be produced, then the value will just
-         * be a string. Note that the 0x-, plus, and implied string
-         * conventions are non-standard. A JSON parser may accept
-         * non-JSON forms as long as it accepts all correct JSON forms.
-         */
-
-        char b = s.charAt(0);
-        if ((b >= '0' && b <= '9') || b == '.' || b == '-' || b == '+') {
-            if (b == '0' && s.length() > 2 &&
-                        (s.charAt(1) == 'x' || s.charAt(1) == 'X')) {
-                try {
-                    return new Integer(Integer.parseInt(s.substring(2), 16));
-                } catch (Exception ignore) {
-                }
-            }
-            try {
-                if (s.indexOf('.') > -1 ||
-                        s.indexOf('e') > -1 || s.indexOf('E') > -1) {
-                    return Double.valueOf(s);
-                } else {
-                    Long myLong = new Long(s);
-                    if (myLong.longValue() == myLong.intValue()) {
-                        return new Integer(myLong.intValue());
-                    } else {
-                        return myLong;
-                    }
-                }
-            }  catch (Exception ignore) {
-            }
-        }
-        return s;
-    }
-
-
-    /**
-     * Throw an exception if the object is an NaN or infinite number.
-     * @param o The object to test.
-     * @throws JSONException If o is a non-finite number.
-     */
-    static void testValidity(Object o) throws JSONException {
-        if (o != null) {
-            if (o instanceof Double) {
-                if (((Double)o).isInfinite() || ((Double)o).isNaN()) {
-                    throw new JSONException(
-                        "JSON does not allow non-finite numbers.");
-                }
-            } else if (o instanceof Float) {
-                if (((Float)o).isInfinite() || ((Float)o).isNaN()) {
-                    throw new JSONException(
-                        "JSON does not allow non-finite numbers.");
-                }
-            }
-        }
-    }
-
-
-    /**
-     * Produce a JSONArray containing the values of the members of this
-     * JSONObject.
-     * @param names A JSONArray containing a list of key strings. This
-     * determines the sequence of the values in the result.
-     * @return A JSONArray of values.
-     * @throws JSONException If any of the values are non-finite numbers.
-     */
-    public JSONArray toJSONArray(JSONArray names) throws JSONException {
-        if (names == null || names.length() == 0) {
-            return null;
-        }
-        JSONArray ja = new JSONArray();
-        for (int i = 0; i < names.length(); i += 1) {
-            ja.put(this.opt(names.getString(i)));
-        }
-        return ja;
-    }
-
-    /**
-     * Make a JSON text of this JSONObject. For compactness, no whitespace
-     * is added. If this would not result in a syntactically correct JSON text,
-     * then null will be returned instead.
-     * <p>
-     * Warning: This method assumes that the data structure is acyclical.
-     *
-     * @return a printable, displayable, portable, transmittable
-     *  representation of the object, beginning
-     *  with <code>{</code> <small>(left brace)</small> and ending
-     *  with <code>}</code> <small>(right brace)</small>.
-     */
-    public String toString() {
-        try {
-            Iterator     keys = keys();
-            StringBuffer sb = new StringBuffer("{");
-
-            while (keys.hasNext()) {
-                if (sb.length() > 1) {
-                    sb.append(',');
-                }
-                Object o = keys.next();
-                sb.append(quote(o.toString()));
-                sb.append(':');
-                sb.append(valueToString(this.map.get(o)));
-            }
-            sb.append('}');
-            return sb.toString();
-        } catch (Exception e) {
-            return null;
-        }
-    }
-
-
-    /**
-     * Make a prettyprinted JSON text of this JSONObject.
-     * <p>
-     * Warning: This method assumes that the data structure is acyclical.
-     * @param indentFactor The number of spaces to add to each level of
-     *  indentation.
-     * @return a printable, displayable, portable, transmittable
-     *  representation of the object, beginning
-     *  with <code>{</code> <small>(left brace)</small> and ending
-     *  with <code>}</code> <small>(right brace)</small>.
-     * @throws JSONException If the object contains an invalid number.
-     */
-    public String toString(int indentFactor) throws JSONException {
-        return toString(indentFactor, 0);
-    }
-
-
-    /**
-     * Make a prettyprinted JSON text of this JSONObject.
-     * <p>
-     * Warning: This method assumes that the data structure is acyclical.
-     * @param indentFactor The number of spaces to add to each level of
-     *  indentation.
-     * @param indent The indentation of the top level.
-     * @return a printable, displayable, transmittable
-     *  representation of the object, beginning
-     *  with <code>{</code> <small>(left brace)</small> and ending
-     *  with <code>}</code> <small>(right brace)</small>.
-     * @throws JSONException If the object contains an invalid number.
-     */
-    String toString(int indentFactor, int indent) throws JSONException {
-        int j;
-        int n = length();
-        if (n == 0) {
-            return "{}";
-        }
-        Iterator     keys = sortedKeys();
-        StringBuffer sb = new StringBuffer("{");
-        int          newindent = indent + indentFactor;
-        Object       o;
-        if (n == 1) {
-            o = keys.next();
-            sb.append(quote(o.toString()));
-            sb.append(": ");
-            sb.append(valueToString(this.map.get(o), indentFactor,
-                    indent));
-        } else {
-            while (keys.hasNext()) {
-                o = keys.next();
-                if (sb.length() > 1) {
-                    sb.append(",\n");
-                } else {
-                    sb.append('\n');
-                }
-                for (j = 0; j < newindent; j += 1) {
-                    sb.append(' ');
-                }
-                sb.append(quote(o.toString()));
-                sb.append(": ");
-                sb.append(valueToString(this.map.get(o), indentFactor,
-                        newindent));
-            }
-            if (sb.length() > 1) {
-                sb.append('\n');
-                for (j = 0; j < indent; j += 1) {
-                    sb.append(' ');
-                }
-            }
-        }
-        sb.append('}');
-        return sb.toString();
-    }
-
-
-    /**
-     * Make a JSON text of an Object value. If the object has an
-     * value.toJSONString() method, then that method will be used to produce
-     * the JSON text. The method is required to produce a strictly
-     * conforming text. If the object does not contain a toJSONString
-     * method (which is the most common case), then a text will be
-     * produced by other means. If the value is an array or Collection,
-     * then a JSONArray will be made from it and its toJSONString method
-     * will be called. If the value is a MAP, then a JSONObject will be made
-     * from it and its toJSONString method will be called. Otherwise, the
-     * value's toString method will be called, and the result will be quoted.
-     *
-     * <p>
-     * Warning: This method assumes that the data structure is acyclical.
-     * @param value The value to be serialized.
-     * @return a printable, displayable, transmittable
-     *  representation of the object, beginning
-     *  with <code>{</code> <small>(left brace)</small> and ending
-     *  with <code>}</code> <small>(right brace)</small>.
-     * @throws JSONException If the value is or contains an invalid number.
-     */
-    static String valueToString(Object value) throws JSONException {
-        if (value == null || value.equals(null)) {
-            return "null";
-        }
-        if (value instanceof JSONString) {
-            Object o;
-            try {
-                o = ((JSONString)value).toJSONString();
-            } catch (Exception e) {
-                throw new JSONException(e);
-            }
-            if (o instanceof String) {
-                return (String)o;
-            }
-            throw new JSONException("Bad value from toJSONString: " + o);
-        }
-        if (value instanceof Number) {
-            return numberToString((Number) value);
-        }
-        if (value instanceof Boolean || value instanceof JSONObject ||
-                value instanceof JSONArray) {
-            return value.toString();
-        }
-        if (value instanceof Map) {
-            return new JSONObject((Map)value).toString();
-        }
-        if (value instanceof Collection) {
-            return new JSONArray((Collection)value).toString();
-        }
-        if (value.getClass().isArray()) {
-            return new JSONArray(value).toString();
-        }
-        return quote(value.toString());
-    }
-
-
-    /**
-     * Make a prettyprinted JSON text of an object value.
-     * <p>
-     * Warning: This method assumes that the data structure is acyclical.
-     * @param value The value to be serialized.
-     * @param indentFactor The number of spaces to add to each level of
-     *  indentation.
-     * @param indent The indentation of the top level.
-     * @return a printable, displayable, transmittable
-     *  representation of the object, beginning
-     *  with <code>{</code> <small>(left brace)</small> and ending
-     *  with <code>}</code> <small>(right brace)</small>.
-     * @throws JSONException If the object contains an invalid number.
-     */
-     static String valueToString(Object value, int indentFactor, int indent)
-            throws JSONException {
-        if (value == null || value.equals(null)) {
-            return "null";
-        }
-        try {
-            if (value instanceof JSONString) {
-                Object o = ((JSONString)value).toJSONString();
-                if (o instanceof String) {
-                    return (String)o;
-                }
-            }
-        } catch (Exception ignore) {
-        }
-        if (value instanceof Number) {
-            return numberToString((Number) value);
-        }
-        if (value instanceof Boolean) {
-            return value.toString();
-        }
-        if (value instanceof JSONObject) {
-            return ((JSONObject)value).toString(indentFactor, indent);
-        }
-        if (value instanceof JSONArray) {
-            return ((JSONArray)value).toString(indentFactor, indent);
-        }
-        if (value instanceof Map) {
-            return new JSONObject((Map)value).toString(indentFactor, indent);
-        }
-        if (value instanceof Collection) {
-            return new JSONArray((Collection)value).toString(indentFactor, indent);
-        }
-        if (value.getClass().isArray()) {
-            return new JSONArray(value).toString(indentFactor, indent);
-        }
-        return quote(value.toString());
-    }
-
-
-     /**
-      * Wrap an object, if necessary. If the object is null, return the NULL
-      * object. If it is an array or collection, wrap it in a JSONArray. If
-      * it is a map, wrap it in a JSONObject. If it is a standard property
-      * (Double, String, et al) then it is already wrapped. Otherwise, if it
-      * comes from one of the java packages, turn it into a string. And if
-      * it doesn't, try to wrap it in a JSONObject. If the wrapping fails,
-      * then null is returned.
-      *
-      * @param object The object to wrap
-      * @return The wrapped value
-      */
-     static Object wrap(Object object) {
-         try {
-             if (object == null) {
-                 return NULL;
-             }
-             if (object instanceof JSONObject || object instanceof JSONArray ||
-                     NULL.equals(object)      || object instanceof JSONString ||
-                     object instanceof Byte   || object instanceof Character ||
-                     object instanceof Short  || object instanceof Integer   ||
-                     object instanceof Long   || object instanceof Boolean   ||
-                     object instanceof Float  || object instanceof Double    ||
-                     object instanceof String) {
-                 return object;
-             }
-
-             if (object instanceof Collection) {
-                 return new JSONArray((Collection)object);
-             }
-             if (object.getClass().isArray()) {
-                 return new JSONArray(object);
-             }
-             if (object instanceof Map) {
-                 return new JSONObject((Map)object);
-             }
-             Package objectPackage = object.getClass().getPackage();
-             String objectPackageName = ( objectPackage != null ? objectPackage.getName() : "" );
-             if (objectPackageName.startsWith("java.") ||
-                     objectPackageName.startsWith("javax.") ||
-                     object.getClass().getClassLoader() == null) {
-                 return object.toString();
-             }
-             return new JSONObject(object);
-         } catch(Exception exception) {
-             return null;
-         }
-     }
-
-
-     /**
-      * Write the contents of the JSONObject as JSON text to a writer.
-      * For compactness, no whitespace is added.
-      * <p>
-      * Warning: This method assumes that the data structure is acyclical.
-      *
-      * @return The writer.
-      * @throws JSONException
-      */
-     public Writer write(Writer writer) throws JSONException {
-        try {
-            boolean  b = false;
-            Iterator keys = keys();
-            writer.write('{');
-
-            while (keys.hasNext()) {
-                if (b) {
-                    writer.write(',');
-                }
-                Object k = keys.next();
-                writer.write(quote(k.toString()));
-                writer.write(':');
-                Object v = this.map.get(k);
-                if (v instanceof JSONObject) {
-                    ((JSONObject)v).write(writer);
-                } else if (v instanceof JSONArray) {
-                    ((JSONArray)v).write(writer);
-                } else {
-                    writer.write(valueToString(v));
-                }
-                b = true;
-            }
-            writer.write('}');
-            return writer;
-        } catch (IOException exception) {
-            throw new JSONException(exception);
-        }
-     }
-}
\ No newline at end of file
diff --git a/livegps/src/org/json/JSONString.java b/livegps/src/org/json/JSONString.java
deleted file mode 100644
index 41726b1..0000000
--- a/livegps/src/org/json/JSONString.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.json;
-/**
- * The <code>JSONString</code> interface allows a <code>toJSONString()</code> 
- * method so that a class can change the behavior of 
- * <code>JSONObject.toString()</code>, <code>JSONArray.toString()</code>,
- * and <code>JSONWriter.value(</code>Object<code>)</code>. The 
- * <code>toJSONString</code> method will be used instead of the default behavior 
- * of using the Object's <code>toString()</code> method and quoting the result.
- */
-public interface JSONString {
-    /**
-     * The <code>toJSONString</code> method allows a class to produce its own JSON 
-     * serialization. 
-     * 
-     * @return A strictly syntactically correct JSON text.
-     */
-    public String toJSONString();
-}
diff --git a/livegps/src/org/json/JSONTokener.java b/livegps/src/org/json/JSONTokener.java
deleted file mode 100644
index 13d8936..0000000
--- a/livegps/src/org/json/JSONTokener.java
+++ /dev/null
@@ -1,435 +0,0 @@
-package org.json;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.Reader;
-import java.io.StringReader;
-
-/*
-Copyright (c) 2002 JSON.org
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-The Software shall be used for Good, not Evil.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-*/
-
-/**
- * A JSONTokener takes a source string and extracts characters and tokens from
- * it. It is used by the JSONObject and JSONArray constructors to parse
- * JSON source strings.
- * @author JSON.org
- * @version 2010-02-02
- */
-public class JSONTokener {
-
-    private int     character;
-    private boolean eof;
-    private int     index;
-    private int     line;
-    private char    previous;
-    private Reader  reader;
-    private boolean usePrevious;
-
-
-    /**
-     * Construct a JSONTokener from a reader.
-     *
-     * @param reader     A reader.
-     */
-    public JSONTokener(Reader reader) {
-        this.reader = reader.markSupported() ?
-                reader : new BufferedReader(reader);
-        this.eof = false;
-        this.usePrevious = false;
-        this.previous = 0;
-        this.index = 0;
-        this.character = 1;
-        this.line = 1;
-    }
-
-
-    /**
-     * Construct a JSONTokener from a string.
-     *
-     * @param s     A source string.
-     */
-    public JSONTokener(String s) {
-        this(new StringReader(s));
-    }
-
-
-    /**
-     * Back up one character. This provides a sort of lookahead capability,
-     * so that you can test for a digit or letter before attempting to parse
-     * the next number or identifier.
-     */
-    public void back() throws JSONException {
-        if (usePrevious || index <= 0) {
-            throw new JSONException("Stepping back two steps is not supported");
-        }
-        this.index -= 1;
-        this.character -= 1;
-        this.usePrevious = true;
-        this.eof = false;
-    }
-
-
-    /**
-     * Get the hex value of a character (base16).
-     * @param c A character between '0' and '9' or between 'A' and 'F' or
-     * between 'a' and 'f'.
-     * @return  An int between 0 and 15, or -1 if c was not a hex digit.
-     */
-    public static int dehexchar(char c) {
-        if (c >= '0' && c <= '9') {
-            return c - '0';
-        }
-        if (c >= 'A' && c <= 'F') {
-            return c - ('A' - 10);
-        }
-        if (c >= 'a' && c <= 'f') {
-            return c - ('a' - 10);
-        }
-        return -1;
-    }
-
-    public boolean end() {
-        return eof && !usePrevious;
-    }
-
-
-    /**
-     * Determine if the source string still contains characters that next()
-     * can consume.
-     * @return true if not yet at the end of the source.
-     */
-    public boolean more() throws JSONException {
-        next();
-        if (end()) {
-            return false;
-        }
-        back();
-        return true;
-    }
-
-
-    /**
-     * Get the next character in the source string.
-     *
-     * @return The next character, or 0 if past the end of the source string.
-     */
-    public char next() throws JSONException {
-        int c;
-        if (this.usePrevious) {
-            this.usePrevious = false;
-            c = this.previous;
-        } else {
-            try {
-                c = this.reader.read();
-            } catch (IOException exception) {
-                throw new JSONException(exception);
-            }
-
-            if (c <= 0) { // End of stream
-                this.eof = true;
-                c = 0;
-            }
-        }
-        this.index += 1;
-        if (this.previous == '\r') {
-            this.line += 1;
-            this.character = c == '\n' ? 0 : 1;
-        } else if (c == '\n') {
-            this.line += 1;
-            this.character = 0;
-        } else {
-            this.character += 1;
-        }
-        this.previous = (char) c;
-        return this.previous;
-    }
-
-
-    /**
-     * Consume the next character, and check that it matches a specified
-     * character.
-     * @param c The character to match.
-     * @return The character.
-     * @throws JSONException if the character does not match.
-     */
-    public char next(char c) throws JSONException {
-        char n = next();
-        if (n != c) {
-            throw syntaxError("Expected '" + c + "' and instead saw '" +
-                    n + "'");
-        }
-        return n;
-    }
-
-
-    /**
-     * Get the next n characters.
-     *
-     * @param n     The number of characters to take.
-     * @return      A string of n characters.
-     * @throws JSONException
-     *   Substring bounds error if there are not
-     *   n characters remaining in the source string.
-     */
-     public String next(int n) throws JSONException {
-         if (n == 0) {
-             return "";
-         }
-
-         char[] buffer = new char[n];
-         int pos = 0;
-
-         while (pos < n) {
-             buffer[pos] = next();
-             if (end()) {
-                 throw syntaxError("Substring bounds error");
-             }
-             pos += 1;
-         }
-         return new String(buffer);
-     }
-
-
-    /**
-     * Get the next char in the string, skipping whitespace.
-     * @throws JSONException
-     * @return  A character, or 0 if there are no more characters.
-     */
-    public char nextClean() throws JSONException {
-        for (;;) {
-            char c = next();
-            if (c == 0 || c > ' ') {
-                return c;
-            }
-        }
-    }
-
-
-    /**
-     * Return the characters up to the next close quote character.
-     * Backslash processing is done. The formal JSON format does not
-     * allow strings in single quotes, but an implementation is allowed to
-     * accept them.
-     * @param quote The quoting character, either
-     *      <code>"</code> <small>(double quote)</small> or
-     *      <code>'</code> <small>(single quote)</small>.
-     * @return      A String.
-     * @throws JSONException Unterminated string.
-     */
-    public String nextString(char quote) throws JSONException {
-        char c;
-        StringBuffer sb = new StringBuffer();
-        for (;;) {
-            c = next();
-            switch (c) {
-            case 0:
-            case '\n':
-            case '\r':
-                throw syntaxError("Unterminated string");
-            case '\\':
-                c = next();
-                switch (c) {
-                case 'b':
-                    sb.append('\b');
-                    break;
-                case 't':
-                    sb.append('\t');
-                    break;
-                case 'n':
-                    sb.append('\n');
-                    break;
-                case 'f':
-                    sb.append('\f');
-                    break;
-                case 'r':
-                    sb.append('\r');
-                    break;
-                case 'u':
-                    sb.append((char)Integer.parseInt(next(4), 16));
-                    break;
-                case '"':
-                case '\'':
-                case '\\':
-                case '/':
-                    sb.append(c);
-                    break;
-                default:
-                    throw syntaxError("Illegal escape.");
-                }
-                break;
-            default:
-                if (c == quote) {
-                    return sb.toString();
-                }
-                sb.append(c);
-            }
-        }
-    }
-
-
-    /**
-     * Get the text up but not including the specified character or the
-     * end of line, whichever comes first.
-     * @param  d A delimiter character.
-     * @return   A string.
-     */
-    public String nextTo(char d) throws JSONException {
-        StringBuffer sb = new StringBuffer();
-        for (;;) {
-            char c = next();
-            if (c == d || c == 0 || c == '\n' || c == '\r') {
-                if (c != 0) {
-                    back();
-                }
-                return sb.toString().trim();
-            }
-            sb.append(c);
-        }
-    }
-
-
-    /**
-     * Get the text up but not including one of the specified delimiter
-     * characters or the end of line, whichever comes first.
-     * @param delimiters A set of delimiter characters.
-     * @return A string, trimmed.
-     */
-    public String nextTo(String delimiters) throws JSONException {
-        char c;
-        StringBuffer sb = new StringBuffer();
-        for (;;) {
-            c = next();
-            if (delimiters.indexOf(c) >= 0 || c == 0 ||
-                    c == '\n' || c == '\r') {
-                if (c != 0) {
-                    back();
-                }
-                return sb.toString().trim();
-            }
-            sb.append(c);
-        }
-    }
-
-
-    /**
-     * Get the next value. The value can be a Boolean, Double, Integer,
-     * JSONArray, JSONObject, Long, or String, or the JSONObject.NULL object.
-     * @throws JSONException If syntax error.
-     *
-     * @return An object.
-     */
-    public Object nextValue() throws JSONException {
-        char c = nextClean();
-        String s;
-
-        switch (c) {
-            case '"':
-            case '\'':
-                return nextString(c);
-            case '{':
-                back();
-                return new JSONObject(this);
-            case '[':
-            case '(':
-                back();
-                return new JSONArray(this);
-        }
-
-        /*
-         * Handle unquoted text. This could be the values true, false, or
-         * null, or it can be a number. An implementation (such as this one)
-         * is allowed to also accept non-standard forms.
-         *
-         * Accumulate characters until we reach the end of the text or a
-         * formatting character.
-         */
-
-        StringBuffer sb = new StringBuffer();
-        while (c >= ' ' && ",:]}/\\\"[{;=#".indexOf(c) < 0) {
-            sb.append(c);
-            c = next();
-        }
-        back();
-
-        s = sb.toString().trim();
-        if (s.equals("")) {
-            throw syntaxError("Missing value");
-        }
-        return JSONObject.stringToValue(s);
-    }
-
-
-    /**
-     * Skip characters until the next character is the requested character.
-     * If the requested character is not found, no characters are skipped.
-     * @param to A character to skip to.
-     * @return The requested character, or zero if the requested character
-     * is not found.
-     */
-    public char skipTo(char to) throws JSONException {
-        char c;
-        try {
-            int startIndex = this.index;
-            int startCharacter = this.character;
-            int startLine = this.line;
-            reader.mark(Integer.MAX_VALUE);
-            do {
-                c = next();
-                if (c == 0) {
-                    reader.reset();
-                    this.index = startIndex;
-                    this.character = startCharacter;
-                    this.line = startLine;
-                    return c;
-                }
-            } while (c != to);
-        } catch (IOException exc) {
-            throw new JSONException(exc);
-        }
-
-        back();
-        return c;
-    }
-
-
-    /**
-     * Make a JSONException to signal a syntax error.
-     *
-     * @param message The error message.
-     * @return  A JSONException object, suitable for throwing
-     */
-    public JSONException syntaxError(String message) {
-        return new JSONException(message + toString());
-    }
-
-
-    /**
-     * Make a printable string of this JSONTokener.
-     *
-     * @return " at {index} [character {character} line {line}]"
-     */
-    public String toString() {
-        return " at " + index + " [character " + this.character + " line " + this.line + "]";
-    }
-}
\ No newline at end of file
diff --git a/svn-info.xml b/svn-info.xml
index df53156..13427f2 100644
--- a/svn-info.xml
+++ b/svn-info.xml
@@ -1,8 +1,8 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <info>
 <entry
    path="plugins"
-   revision="28431"
+   revision="28913"
    kind="dir">
 <url>http://svn.openstreetmap.org/applications/editors/josm/plugins</url>
 <repository>
@@ -10,9 +10,9 @@
 <uuid>b9d5c4c9-76e1-0310-9c85-f3177eceb1e4</uuid>
 </repository>
 <commit
-   revision="28420">
-<author>stoecker</author>
-<date>2012-06-01T08:18:19.345882Z</date>
+   revision="28912">
+<author>roland</author>
+<date>2012-11-09T17:38:59.505638Z</date>
 </commit>
 </entry>
 </info>

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



More information about the Pkg-grass-devel mailing list