diff --git a/modules/library/referencing/pom.xml b/modules/library/referencing/pom.xml
index 80e1e60..2ef6308 100644
--- a/modules/library/referencing/pom.xml
+++ b/modules/library/referencing/pom.xml
@@ -189,6 +189,11 @@
       <artifactId>gt-metadata</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>jgridshift</groupId>
+      <artifactId>jgridshift</artifactId>
+      <version>1.0</version>
+    </dependency>
 
     <!-- Test dependencies -->
     <dependency>
diff --git a/modules/library/referencing/src/main/java/org/geotools/referencing/ReferencingFactoryFinder.java b/modules/library/referencing/src/main/java/org/geotools/referencing/ReferencingFactoryFinder.java
index 9240d28..40ed772 100644
--- a/modules/library/referencing/src/main/java/org/geotools/referencing/ReferencingFactoryFinder.java
+++ b/modules/library/referencing/src/main/java/org/geotools/referencing/ReferencingFactoryFinder.java
@@ -18,36 +18,37 @@ package org.geotools.referencing;
 
 import java.io.IOException;
 import java.io.Writer;
-import java.util.Set;
-import java.util.Locale;
 import java.util.Collections;
 import java.util.LinkedHashSet;
+import java.util.Locale;
+import java.util.Set;
+
 import javax.imageio.spi.ServiceRegistry;
 
+import org.geotools.factory.FactoryCreator;
+import org.geotools.factory.FactoryFinder;
+import org.geotools.factory.FactoryRegistry;
+import org.geotools.factory.FactoryRegistryException;
+import org.geotools.factory.GeoTools;
+import org.geotools.factory.Hints;
+import org.geotools.metadata.iso.citation.Citations;
+import org.geotools.referencing.factory.gridshift.GridShiftLocator;
+import org.geotools.resources.Arguments;
+import org.geotools.resources.LazySet;
 import org.opengis.metadata.Identifier;
 import org.opengis.metadata.citation.Citation;
-import org.opengis.referencing.Factory;
 import org.opengis.referencing.AuthorityFactory;
-import org.opengis.referencing.crs.CRSFactory;
+import org.opengis.referencing.Factory;
 import org.opengis.referencing.crs.CRSAuthorityFactory;
-import org.opengis.referencing.cs.CSFactory;
+import org.opengis.referencing.crs.CRSFactory;
 import org.opengis.referencing.cs.CSAuthorityFactory;
-import org.opengis.referencing.datum.DatumFactory;
+import org.opengis.referencing.cs.CSFactory;
 import org.opengis.referencing.datum.DatumAuthorityFactory;
-import org.opengis.referencing.operation.CoordinateOperationFactory;
+import org.opengis.referencing.datum.DatumFactory;
 import org.opengis.referencing.operation.CoordinateOperationAuthorityFactory;
+import org.opengis.referencing.operation.CoordinateOperationFactory;
 import org.opengis.referencing.operation.MathTransformFactory;
 
-import org.geotools.factory.Hints;
-import org.geotools.factory.GeoTools;
-import org.geotools.factory.FactoryFinder;
-import org.geotools.factory.FactoryCreator;
-import org.geotools.factory.FactoryRegistry;
-import org.geotools.factory.FactoryRegistryException;
-import org.geotools.metadata.iso.citation.Citations;
-import org.geotools.resources.Arguments;
-import org.geotools.resources.LazySet;
-
 
 /**
  * Defines static methods used to access the application's default {@linkplain Factory
@@ -120,7 +121,8 @@ public final class ReferencingFactoryFinder extends FactoryFinder {
                     CRSAuthorityFactory.class,
                     MathTransformFactory.class,
                     CoordinateOperationFactory.class,
-                    CoordinateOperationAuthorityFactory.class});
+                    CoordinateOperationAuthorityFactory.class,
+                    GridShiftLocator.class});
         }
         return registry;
     }
@@ -486,7 +488,20 @@ loop:       for (int i=0; ; i++) {
     {
         return getFactories(CoordinateOperationAuthorityFactory.class, hints);
     }
-
+    
+    /**
+     * Returns a set of all available implementations for the
+     * {@link GridShiftLocator} interface.
+     *
+     * @param  hints An optional map of hints, or {@code null} if none.
+     * @return Set of available grid shift factory implementations.
+     */
+    public static Set<GridShiftLocator> getGridShiftLocators(
+            final Hints hints)
+    {
+        return getFactories(GridShiftLocator.class, hints);
+    }
+    
     /**
      * Returns the first implementation of {@link MathTransformFactory} matching the specified
      * hints. If no implementation matches, a new one is created if possible or an exception is
diff --git a/modules/library/referencing/src/main/java/org/geotools/referencing/factory/gridshift/ClasspathGridShiftLocator.java b/modules/library/referencing/src/main/java/org/geotools/referencing/factory/gridshift/ClasspathGridShiftLocator.java
new file mode 100644
index 0000000..6b42908
--- /dev/null
+++ b/modules/library/referencing/src/main/java/org/geotools/referencing/factory/gridshift/ClasspathGridShiftLocator.java
@@ -0,0 +1,42 @@
+/*
+ *    GeoTools - The Open Source Java GIS Toolkit
+ *    http://geotools.org
+ * 
+ *    (C) 2002-2012, Open Source Geospatial Foundation (OSGeo)
+ *
+ *    This library is free software; you can redistribute it and/or
+ *    modify it under the terms of the GNU Lesser General Public
+ *    License as published by the Free Software Foundation;
+ *    version 2.1 of the License.
+ *
+ *    This library is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *    Lesser General Public License for more details.
+ */
+package org.geotools.referencing.factory.gridshift;
+
+import java.net.URL;
+
+import org.geotools.metadata.iso.citation.Citations;
+import org.opengis.metadata.citation.Citation;
+
+/**
+ * Default grid shift file locator, looks up grids in the classpath
+ *  
+ * @author Andrea Aime - GeoSolutions
+ *
+ */
+public class ClasspathGridShiftLocator implements GridShiftLocator {
+
+    @Override
+    public Citation getVendor() {
+        return Citations.GEOTOOLS;
+    }
+
+    @Override
+    public URL locateGrid(String grid) {
+        return getClass().getResource(grid);
+    }
+
+}
diff --git a/modules/library/referencing/src/main/java/org/geotools/referencing/factory/gridshift/GridShiftLocator.java b/modules/library/referencing/src/main/java/org/geotools/referencing/factory/gridshift/GridShiftLocator.java
new file mode 100644
index 0000000..282308a
--- /dev/null
+++ b/modules/library/referencing/src/main/java/org/geotools/referencing/factory/gridshift/GridShiftLocator.java
@@ -0,0 +1,38 @@
+/*
+ *    GeoTools - The Open Source Java GIS Toolkit
+ *    http://geotools.org
+ * 
+ *    (C) 2002-2012, Open Source Geospatial Foundation (OSGeo)
+ *
+ *    This library is free software; you can redistribute it and/or
+ *    modify it under the terms of the GNU Lesser General Public
+ *    License as published by the Free Software Foundation;
+ *    version 2.1 of the License.
+ *
+ *    This library is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *    Lesser General Public License for more details.
+ */
+package org.geotools.referencing.factory.gridshift;
+
+import java.net.URL;
+
+import org.opengis.referencing.Factory;
+
+
+/**
+ * Provides a hook to locate grid shift files, such as NTv1, NTv2 and NADCON ones
+ * 
+ * Andrea Aime - Geosolutions
+ */
+public interface GridShiftLocator extends Factory {
+	
+	/**
+	 * Locate the specified resource.
+	 * 
+	 * @param grid the grid name/location
+	 * @return the fully resolved URL of the grid or null, if the resource cannot be located.
+	 */
+	URL locateGrid(String grid);
+}
diff --git a/modules/library/referencing/src/main/java/org/geotools/referencing/factory/gridshift/NADCONGridShiftFactory.java b/modules/library/referencing/src/main/java/org/geotools/referencing/factory/gridshift/NADCONGridShiftFactory.java
new file mode 100644
index 0000000..fafda54
--- /dev/null
+++ b/modules/library/referencing/src/main/java/org/geotools/referencing/factory/gridshift/NADCONGridShiftFactory.java
@@ -0,0 +1,440 @@
+/*
+ *    GeoTools - The Open Source Java GIS Toolkit
+ *    http://geotools.org
+ * 
+ *    (C) 2002-2012, Open Source Geospatial Foundation (OSGeo)
+ *
+ *    This library is free software; you can redistribute it and/or
+ *    modify it under the terms of the GNU Lesser General Public
+ *    License as published by the Free Software Foundation;
+ *    version 2.1 of the License.
+ *
+ *    This library is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *    Lesser General Public License for more details.
+ */
+package org.geotools.referencing.factory.gridshift;
+
+import java.io.BufferedReader;
+import java.io.EOFException;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.channels.Channels;
+import java.nio.channels.ReadableByteChannel;
+import java.util.StringTokenizer;
+import java.util.logging.Logger;
+
+import org.geotools.factory.BufferedFactory;
+import org.geotools.referencing.factory.ReferencingFactory;
+import org.geotools.resources.i18n.ErrorKeys;
+import org.geotools.resources.i18n.Errors;
+import org.geotools.util.SoftValueHashMap;
+import org.geotools.util.logging.Logging;
+import org.opengis.referencing.FactoryException;
+
+/**
+ * Loads and caches NADCON grid shifts
+ * 
+ * @author Andrea Aime - GeoSolutions
+ *
+ */
+public class NADCONGridShiftFactory extends ReferencingFactory implements BufferedFactory {
+
+    static final class NADCONKey {
+        String latFile;
+
+        String longFile;
+
+        public NADCONKey(String latFile, String longFile) {
+            super();
+            this.latFile = latFile;
+            this.longFile = longFile;
+        }
+
+        @Override
+        public int hashCode() {
+            final int prime = 31;
+            int result = 1;
+            result = prime * result + ((latFile == null) ? 0 : latFile.hashCode());
+            result = prime * result + ((longFile == null) ? 0 : longFile.hashCode());
+            return result;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj)
+                return true;
+            if (obj == null)
+                return false;
+            if (getClass() != obj.getClass())
+                return false;
+            NADCONKey other = (NADCONKey) obj;
+            if (latFile == null) {
+                if (other.latFile != null)
+                    return false;
+            } else if (!latFile.equals(other.latFile))
+                return false;
+            if (longFile == null) {
+                if (other.longFile != null)
+                    return false;
+            } else if (!longFile.equals(other.longFile))
+                return false;
+            return true;
+        }
+
+    }
+
+    /**
+     * The number of hard references to hold internally.
+     */
+    private static final int GRID_CACHE_HARD_REFERENCES = 10;
+
+    /**
+     * Logger.
+     */
+    protected static final Logger LOGGER = Logging.getLogger("org.geotools.referencing");
+
+    /**
+     * The soft cache that holds loaded grids.
+     */
+    private SoftValueHashMap<NADCONKey, NADConGridShift> gridCache;
+
+    /**
+     * Constructs a factory with the default priority.
+     */
+    public NADCONGridShiftFactory() {
+        gridCache = new SoftValueHashMap<NADCONKey, NADConGridShift>(GRID_CACHE_HARD_REFERENCES);
+    }
+
+    public NADConGridShift loadGridShift(URL latGridURL, URL longGridURL) throws FactoryException {
+        NADCONKey key = new NADCONKey(latGridURL.toExternalForm(), longGridURL.toExternalForm());
+        synchronized (gridCache) { // Prevent simultaneous threads trying to load same grid
+            NADConGridShift grid = gridCache.get(key);
+            if (grid != null) { // Cached:
+                return grid; // - Return
+            } else { // Not cached:
+                grid = loadGridShiftInternal(latGridURL, longGridURL); // - Load
+                if (grid != null) {
+                    gridCache.put(key, grid); // - Cache
+                    return grid; // - Return
+                }
+            }
+            throw new FactoryException("NTv2 Grid " + latGridURL + ", " + longGridURL
+                    + " could not be created.");
+        }
+    }
+
+    private NADConGridShift loadGridShiftInternal(URL latGridURL, URL longGridURL)
+            throws FactoryException {
+        // decide if text or binary grid will be used
+        String latGridName = latGridURL.getFile();
+        String longGridName = longGridURL.getFile();
+        try {
+            if ((latGridName.endsWith(".las") && longGridName.endsWith(".los"))
+                    || (latGridName.endsWith(".LAS") && longGridName.endsWith(".LOS"))) {
+                return loadBinaryGrid(latGridURL, longGridURL);
+            } else if ((latGridName.endsWith(".laa") && longGridName.endsWith(".loa"))
+                    || (latGridName.endsWith(".LAA") && longGridName.endsWith(".LOA"))) {
+                return loadTextGrid(latGridURL, longGridURL);
+            } else {
+                throw new FactoryException(Errors.format(ErrorKeys.UNSUPPORTED_FILE_TYPE_$2,
+                        latGridName.substring(latGridName.lastIndexOf('.') + 1),
+                        longGridName.substring(longGridName.lastIndexOf('.') + 1)));
+                // Note: the +1 above hide the dot, but also make sure that the code is
+                // valid even if the path do not contains '.' at all (-1 + 1 == 0).
+            }
+        } catch (IOException exception) {
+            final Throwable cause = exception.getCause();
+            if (cause instanceof FactoryException) {
+                throw (FactoryException) cause;
+            }
+            throw new FactoryException(exception.getLocalizedMessage(), exception);
+        }
+    }
+
+    /**
+     * Reads latitude and longitude binary grid shift file data into {@link grid}. The file is
+     * organized into records, with the first record containing the header information, followed by
+     * the shift data. The header values are: text describing grid (64 bytes), num. columns (int),
+     * num. rows (int), num. z (int), min x (float), delta x (float), min y (float), delta y (float)
+     * and angle (float). Each record is num. columns 4 bytes + 4 byte separator long and the file
+     * contains num. rows + 1 (for the header) records. The data records (with the grid shift
+     * values) are all floats and have a 4 byte separator (0's) before the data. Row records are
+     * organized from low y (latitude) to high and columns are orderd from low longitude to high.
+     * Everything is written in low byte order.
+     * 
+     * @param latGridUrl URL to the binary latitude shift file (.las extention).
+     * @param longGridUrl URL to the binary longitude shift file (.los extention).
+     * @throws IOException if the data files cannot be read.
+     * @throws FactoryException if there is an inconsistency in the data
+     */
+    private NADConGridShift loadBinaryGrid(final URL latGridUrl, final URL longGridUrl)
+            throws IOException, FactoryException {
+        final int HEADER_BYTES = 96;
+        final int SEPARATOR_BYTES = 4;
+        final int DESCRIPTION_LENGTH = 64;
+        ReadableByteChannel latChannel;
+        ReadableByteChannel longChannel;
+        ByteBuffer latBuffer;
+        ByteBuffer longBuffer;
+
+        // //////////////////////
+        // setup
+        // //////////////////////
+        latChannel = getReadChannel(latGridUrl);
+        latBuffer = fillBuffer(latChannel, HEADER_BYTES);
+
+        longChannel = getReadChannel(longGridUrl);
+        longBuffer = fillBuffer(longChannel, HEADER_BYTES);
+
+        // //////////////////////
+        // read header info
+        // //////////////////////
+        // skip the header description
+        latBuffer.position(latBuffer.position() + DESCRIPTION_LENGTH);
+
+        int nc = latBuffer.getInt();
+        int nr = latBuffer.getInt();
+        int nz = latBuffer.getInt();
+
+        float xmin = latBuffer.getFloat();
+        float dx = latBuffer.getFloat();
+        float ymin = latBuffer.getFloat();
+        float dy = latBuffer.getFloat();
+
+        float angle = latBuffer.getFloat();
+        float xmax = xmin + ((nc - 1) * dx);
+        float ymax = ymin + ((nr - 1) * dy);
+
+        // skip the longitude header description
+        longBuffer.position(longBuffer.position() + DESCRIPTION_LENGTH);
+
+        // check that latitude grid header is the same as for latitude grid
+        if ((nc != longBuffer.getInt()) || (nr != longBuffer.getInt())
+                || (nz != longBuffer.getInt()) || (xmin != longBuffer.getFloat())
+                || (dx != longBuffer.getFloat()) || (ymin != longBuffer.getFloat())
+                || (dy != longBuffer.getFloat()) || (angle != longBuffer.getFloat())) {
+            throw new FactoryException(Errors.format(ErrorKeys.GRID_LOCATIONS_UNEQUAL));
+        }
+
+        // //////////////////////
+        // read grid shift data into LocalizationGrid
+        // //////////////////////
+        final int RECORD_LENGTH = (nc * 4) + SEPARATOR_BYTES;
+        final int NUM_BYTES_LEFT = ((nr + 1) * RECORD_LENGTH) - HEADER_BYTES;
+        final int START_OF_DATA = RECORD_LENGTH - HEADER_BYTES;
+
+        latBuffer = fillBuffer(latChannel, NUM_BYTES_LEFT);
+        latBuffer.position(START_OF_DATA); // start of second record (data)
+
+        longBuffer = fillBuffer(longChannel, NUM_BYTES_LEFT);
+        longBuffer.position(START_OF_DATA);
+
+        NADConGridShift gridShift = new NADConGridShift(xmin, ymin, xmax, ymax, dx, dy, nc, nr);
+
+        int i = 0;
+        int j = 0;
+        for (i = 0; i < nr; i++) {
+            latBuffer.position(latBuffer.position() + SEPARATOR_BYTES); // skip record separator
+            longBuffer.position(longBuffer.position() + SEPARATOR_BYTES);
+
+            for (j = 0; j < nc; j++) {
+                gridShift.setLocalizationPoint(j, i, longBuffer.getFloat(), latBuffer.getFloat());
+            }
+        }
+
+        assert i == nr : i;
+        assert j == nc : j;
+
+        return gridShift;
+    }
+
+    /**
+     * Returns a new bytebuffer, of numBytes length and little endian byte order, filled from the
+     * channel.
+     * 
+     * @param channel the channel to fill the buffer from
+     * @param numBytes number of bytes to read
+     * @return a new bytebuffer filled from the channel
+     * @throws IOException if there is a problem reading the channel
+     * @throws EOFException if the end of the channel is reached
+     */
+    private ByteBuffer fillBuffer(ReadableByteChannel channel, int numBytes) throws IOException {
+        ByteBuffer buf = ByteBuffer.allocate(numBytes);
+
+        if (fill(buf, channel) == -1) {
+            throw new EOFException(Errors.format(ErrorKeys.END_OF_DATA_FILE));
+        }
+
+        buf.flip();
+        buf.order(ByteOrder.LITTLE_ENDIAN);
+
+        return buf;
+    }
+
+    /**
+     * Fills the bytebuffer from the channel. Code was lifted from ShapefileDataStore.
+     * 
+     * @param buffer bytebuffer to fill from the channel
+     * @param channel channel to fill the buffer from
+     * @return number of bytes read
+     * @throws IOException if there is a problem reading the channel
+     */
+    private int fill(ByteBuffer buffer, ReadableByteChannel channel) throws IOException {
+        int r = buffer.remaining();
+
+        // channel reads return -1 when EOF or other error
+        // because they a non-blocking reads, 0 is a valid return value!!
+        while ((buffer.remaining() > 0) && (r != -1)) {
+            r = channel.read(buffer);
+        }
+
+        if (r == -1) {
+            buffer.limit(buffer.position());
+        }
+
+        return r;
+    }
+
+    /**
+     * Obtain a ReadableByteChannel from the given URL. If the url protocol is file, a FileChannel
+     * will be returned. Otherwise a generic channel will be obtained from the urls input stream.
+     * Code swiped from ShapefileDataStore.
+     * 
+     * @param url URL to create the channel from
+     * @return a new PeadableByteChannel from the input url
+     * @throws IOException if there is a problem creating the channel
+     */
+    private ReadableByteChannel getReadChannel(URL url) throws IOException {
+        ReadableByteChannel channel = null;
+
+        if (url.getProtocol().equals("file")) {
+            File file = new File(url.getFile());
+
+            if (!file.exists() || !file.canRead()) {
+                throw new IOException(Errors.format(ErrorKeys.FILE_DOES_NOT_EXIST_$1, file));
+            }
+
+            FileInputStream in = new FileInputStream(file);
+            channel = in.getChannel();
+        } else {
+            InputStream in = url.openConnection().getInputStream();
+            channel = Channels.newChannel(in);
+        }
+
+        return channel;
+    }
+
+    /**
+     * Reads latitude and longitude text grid shift file data into {@link grid}. The first two lines
+     * of the shift data file contain the header, with the first being a description of the grid.
+     * The second line contains 8 values separated by spaces: num. columns, num. rows, num. z, min
+     * x, delta x, min y, delta y and angle. Shift data values follow this and are also separated by
+     * spaces. Row records are organized from low y (latitude) to high and columns are orderd from
+     * low longitude to high.
+     * 
+     * @param latGridUrl URL to the text latitude shift file (.laa extention).
+     * @param longGridUrl URL to the text longitude shift file (.loa extention).
+     * @throws IOException if the data files cannot be read.
+     * @throws FactoryException if there is an inconsistency in the data
+     */
+    private NADConGridShift loadTextGrid(URL latGridUrl, URL longGridUrl) throws IOException,
+            FactoryException {
+        String latLine;
+        String longLine;
+        StringTokenizer latSt;
+        StringTokenizer longSt;
+
+        // //////////////////////
+        // setup
+        // //////////////////////
+        InputStreamReader latIsr = new InputStreamReader(latGridUrl.openStream());
+        BufferedReader latBr = new BufferedReader(latIsr);
+
+        InputStreamReader longIsr = new InputStreamReader(longGridUrl.openStream());
+        BufferedReader longBr = new BufferedReader(longIsr);
+
+        // //////////////////////
+        // read header info
+        // //////////////////////
+        latLine = latBr.readLine(); // skip header description
+        latLine = latBr.readLine();
+        latSt = new StringTokenizer(latLine, " ");
+
+        if (latSt.countTokens() != 8) {
+            throw new FactoryException(Errors.format(ErrorKeys.HEADER_UNEXPECTED_LENGTH_$1,
+                    String.valueOf(latSt.countTokens())));
+        }
+
+        int nc = Integer.parseInt(latSt.nextToken());
+        int nr = Integer.parseInt(latSt.nextToken());
+        int nz = Integer.parseInt(latSt.nextToken());
+
+        float xmin = Float.parseFloat(latSt.nextToken());
+        float dx = Float.parseFloat(latSt.nextToken());
+        float ymin = Float.parseFloat(latSt.nextToken());
+        float dy = Float.parseFloat(latSt.nextToken());
+
+        float angle = Float.parseFloat(latSt.nextToken());
+        float xmax = xmin + ((nc - 1) * dx);
+        float ymax = ymin + ((nr - 1) * dy);
+
+        // now read long shift grid
+        longLine = longBr.readLine(); // skip header description
+        longLine = longBr.readLine();
+        longSt = new StringTokenizer(longLine, " ");
+
+        if (longSt.countTokens() != 8) {
+            throw new FactoryException(Errors.format(ErrorKeys.HEADER_UNEXPECTED_LENGTH_$1,
+                    String.valueOf(longSt.countTokens())));
+        }
+
+        // check that latitude grid header is the same as for latitude grid
+        if ((nc != Integer.parseInt(longSt.nextToken()))
+                || (nr != Integer.parseInt(longSt.nextToken()))
+                || (nz != Integer.parseInt(longSt.nextToken()))
+                || (xmin != Float.parseFloat(longSt.nextToken()))
+                || (dx != Float.parseFloat(longSt.nextToken()))
+                || (ymin != Float.parseFloat(longSt.nextToken()))
+                || (dy != Float.parseFloat(longSt.nextToken()))
+                || (angle != Float.parseFloat(longSt.nextToken()))) {
+            throw new FactoryException(Errors.format(ErrorKeys.GRID_LOCATIONS_UNEQUAL));
+        }
+
+        // //////////////////////
+        // read grid shift data into LocalizationGrid
+        // //////////////////////
+        NADConGridShift gridShift = new NADConGridShift(xmin, ymin, xmax, ymax, dx, dy, nc, nr);
+
+        int i = 0;
+        int j = 0;
+        for (i = 0; i < nr; i++) {
+            for (j = 0; j < nc;) {
+                latLine = latBr.readLine();
+                latSt = new StringTokenizer(latLine, " ");
+                longLine = longBr.readLine();
+                longSt = new StringTokenizer(longLine, " ");
+
+                while (latSt.hasMoreTokens() && longSt.hasMoreTokens()) {
+                    gridShift.setLocalizationPoint(j, i,
+                            (double) Float.parseFloat(longSt.nextToken()),
+                            (double) Float.parseFloat(latSt.nextToken()));
+                    ++j;
+                }
+            }
+        }
+
+        assert i == nr : i;
+        assert j == nc : j;
+
+        return gridShift;
+    }
+
+}
diff --git a/modules/library/referencing/src/main/java/org/geotools/referencing/factory/gridshift/NADConGridShift.java b/modules/library/referencing/src/main/java/org/geotools/referencing/factory/gridshift/NADConGridShift.java
new file mode 100644
index 0000000..6520f9d
--- /dev/null
+++ b/modules/library/referencing/src/main/java/org/geotools/referencing/factory/gridshift/NADConGridShift.java
@@ -0,0 +1,157 @@
+/*
+ *    GeoTools - The Open Source Java GIS Toolkit
+ *    http://geotools.org
+ *
+ *    (C) 2002-2012, Open Source Geospatial Foundation (OSGeo)
+ *
+ *    This library is free software; you can redistribute it and/or
+ *    modify it under the terms of the GNU Lesser General Public
+ *    License as published by the Free Software Foundation;
+ *    version 2.1 of the License.
+ *
+ *    This library is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *    Lesser General Public License for more details.
+ */
+package org.geotools.referencing.factory.gridshift;
+
+import org.geotools.referencing.operation.builder.LocalizationGrid;
+
+/**
+ * A NADCON localization grid
+ * 
+ * @author Andrea Aime - GeoSolutions
+ * @author Rueben Schulz
+ */
+public class NADConGridShift extends LocalizationGrid {
+    
+    /**
+     * The minimum longitude value covered by this grid (decimal degrees)
+     */
+    private double minX;
+
+    /**
+     * The minimum latitude value covered by this grid (decimal degrees)
+     */
+    private double minY;
+
+    /**
+     * The maximum longitude value covered by this grid (decimal degrees)
+     */
+    private double maxX;
+
+    /**
+     * The maximum latitude value covered by this grid (decimal degrees)
+     */
+    private double maxY;
+
+    /**
+     * The difference between longitude grid points (decimal degrees)
+     */
+    private double dx;
+
+    /**
+     * The difference between latitude grid points (decimal degrees)
+     */
+    private double dy;
+
+    public NADConGridShift(double xmin, double ymin, double xmax, double ymax, double dx, double dy, int width, int height) {
+        super(width, height);
+        this.minX = xmin;
+        this.maxX = xmax;
+        this.minY = ymin;
+        this.maxY = ymax;
+        this.dx = dx;
+        this.dy = dy;
+    }
+    
+    /**
+     * Returns a hash value for this transform. To make this faster it does not
+     * check the grid values.
+     *
+     * @return a hash value for this transform.
+     */
+    @Override
+    public final int hashCode() {
+        final long code = Double.doubleToLongBits(minX)
+            + (37 * (Double.doubleToLongBits(minY)
+            + (37 * (Double.doubleToLongBits(maxX)
+            + (37 * (Double.doubleToLongBits(maxY)
+            + (37 * (Double.doubleToLongBits(dx)
+            + (37 * (Double.doubleToLongBits(dy)))))))))));
+
+        return (int) code ^ (int) (code >>> 32);
+    }
+
+    /**
+     * Compares the specified object with this math transform for equality.
+     *
+     * @param object the object to compare to
+     * @return {@code true} if the objects are equal.
+     */
+    @Override
+    public final boolean equals(final Object object) {
+        if (object == this) {
+            // Slight optimization
+            return true;
+        }
+
+        if (super.equals(object)) {
+            final NADConGridShift that = (NADConGridShift) object;
+
+            return (Double.doubleToLongBits(this.minX) == Double.doubleToLongBits(that.minX))
+                && (Double.doubleToLongBits(this.minY) == Double.doubleToLongBits(that.minY))
+                && (Double.doubleToLongBits(this.maxX) == Double.doubleToLongBits(that.maxX))
+                && (Double.doubleToLongBits(this.maxY) == Double.doubleToLongBits(that.maxY))
+                && (Double.doubleToLongBits(this.dx)   == Double.doubleToLongBits(that.dx))
+                && (Double.doubleToLongBits(this.dy)   == Double.doubleToLongBits(that.dy));
+        }
+
+        return false;
+    }
+
+    /**
+     * The minimum longitude value covered by this grid (decimal degrees)
+     */
+    public double getMinX() {
+        return minX;
+    }
+
+    /**
+     * The minimum latitude value covered by this grid (decimal degrees)
+     */
+    public double getMinY() {
+        return minY;
+    }
+
+    /**
+     * The maximum longitude value covered by this grid (decimal degrees)
+     */
+    public double getMaxX() {
+        return maxX;
+    }
+
+    /**
+     * The maximum latitude value covered by this grid (decimal degrees)
+     */
+    public double getMaxY() {
+        return maxY;
+    }
+
+    /**
+     * The difference between longitude grid points (decimal degrees)
+     */
+    public double getDx() {
+        return dx;
+    }
+
+    /**
+     * The difference between latitude grid points (decimal degrees)
+     */
+    public double getDy() {
+        return dy;
+    }
+
+
+}
diff --git a/modules/library/referencing/src/main/java/org/geotools/referencing/factory/gridshift/NTv2GridShiftFactory.java b/modules/library/referencing/src/main/java/org/geotools/referencing/factory/gridshift/NTv2GridShiftFactory.java
new file mode 100644
index 0000000..d9bcedd
--- /dev/null
+++ b/modules/library/referencing/src/main/java/org/geotools/referencing/factory/gridshift/NTv2GridShiftFactory.java
@@ -0,0 +1,223 @@
+/*
+ *    GeoTools - The Open Source Java GIS Toolkit
+ *    http://geotools.org
+ *
+ *    (C) 2002-2012, Open Source Geospatial Foundation (OSGeo)
+ *
+ *    This library is free software; you can redistribute it and/or
+ *    modify it under the terms of the GNU Lesser General Public
+ *    License as published by the Free Software Foundation;
+ *    version 2.1 of the License.
+ *
+ *    This library is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *    Lesser General Public License for more details.
+ */
+package org.geotools.referencing.factory.gridshift;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.RandomAccessFile;
+import java.net.URL;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.geotools.factory.AbstractFactory;
+import org.geotools.factory.BufferedFactory;
+import org.geotools.referencing.factory.ReferencingFactory;
+import org.geotools.resources.i18n.ErrorKeys;
+import org.geotools.resources.i18n.Errors;
+import org.geotools.util.SoftValueHashMap;
+import org.geotools.util.logging.Logging;
+import org.opengis.referencing.FactoryException;
+
+import au.com.objectix.jgridshift.GridShiftFile;
+
+/**
+ * Loads and caches NTv2 grid files. Thisthat incorporates a soft cache mechanism to keep grids in
+ * memory when first loaded. It also checks NTv2 grid file format in {@link #isNTv2Grid(String)}
+ * method.
+ * 
+ * @author Oscar Fonts
+ */
+public class NTv2GridShiftFactory extends ReferencingFactory implements BufferedFactory {
+
+    /**
+     * The number of hard references to hold internally.
+     */
+    private static final int GRID_CACHE_HARD_REFERENCES = 10;
+
+    /**
+     * Logger.
+     */
+    protected static final Logger LOGGER = Logging.getLogger("org.geotools.referencing");
+
+    /**
+     * The soft cache that holds loaded grids.
+     */
+    private SoftValueHashMap<String, GridShiftFile> ntv2GridCache;
+
+    /**
+     * Constructs a factory with the default priority.
+     */
+    public NTv2GridShiftFactory() {
+        super();
+        ntv2GridCache = new SoftValueHashMap<String, GridShiftFile>(GRID_CACHE_HARD_REFERENCES);
+    }
+
+    /**
+     * Constructs an instance using the specified priority level.
+     * 
+     * @param priority The priority for this factory, as a number between
+     *        {@link AbstractFactory#MINIMUM_PRIORITY MINIMUM_PRIORITY} and
+     *        {@link AbstractFactory#MAXIMUM_PRIORITY MAXIMUM_PRIORITY} inclusive.
+     */
+    public NTv2GridShiftFactory(final int priority) {
+        super(priority);
+        ntv2GridCache = new SoftValueHashMap<String, GridShiftFile>(GRID_CACHE_HARD_REFERENCES);
+    }
+
+    /**
+     * Performs a NTv2 grid file lookup given its name, and checks for file format correctness.
+     * 
+     * @param name The NTv2 grid file name
+     * @return {@code true} if file exists and is valid, {@code false} otherwise
+     */
+    public boolean isNTv2Grid(URL location) {
+        if (location != null) {
+            return isNTv2GridFileValid(location); // Check
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * Creates a NTv2 Grid.
+     * 
+     * @param name The NTv2 grid name
+     * @return the grid
+     * @throws FactoryException if grid cannot be created
+     */
+    public GridShiftFile createNTv2Grid(URL gridLocation) throws FactoryException {
+        if(gridLocation == null) {
+            throw new FactoryException("The grid location must be not null");
+        }
+        
+        synchronized (ntv2GridCache) { // Prevent simultaneous threads trying to load same grid
+            GridShiftFile grid = ntv2GridCache.get(gridLocation.toExternalForm());
+            if (grid != null) { // Cached:
+                return grid; // - Return
+            } else { // Not cached:
+                if (gridLocation != null) {
+                    grid = loadNTv2Grid(gridLocation); // - Load
+                    if (grid != null) {
+                        ntv2GridCache.put(gridLocation.toExternalForm(), grid); // - Cache
+                        return grid; // - Return
+                    }
+                }
+                throw new FactoryException("NTv2 Grid " + gridLocation + " could not be created.");
+            }
+        }
+    }
+
+    
+
+    /**
+     * Checks if a given resource is a valid NTv2 file without fully loading it.
+     * 
+     * If file is not valid, the cause is logged at {@link Level#WARNING warning level}.
+     * 
+     * @param location the NTv2 file absolute path
+     * @return true if file has NTv2 format, false otherwise
+     */
+    protected boolean isNTv2GridFileValid(URL url) {
+        RandomAccessFile raf = null;
+        InputStream is = null;
+        try {
+
+            // Loading as RandomAccessFile doesn't load the full grid
+            // in memory, but is a quick method to see if file format
+            // is NTv2.
+            if (url.getProtocol().equals("file")) {
+                File file = new File(url.getFile());
+
+                if (!file.exists() || !file.canRead()) {
+                    throw new IOException(Errors.format(ErrorKeys.FILE_DOES_NOT_EXIST_$1, file));
+                }
+
+                raf = new RandomAccessFile(file, "r");
+
+                // will throw an exception if not a valid file
+                new GridShiftFile().loadGridShiftFile(raf);
+            } else {
+                InputStream in = url.openConnection().getInputStream();
+
+                // will throw an exception if not a valid file
+                new GridShiftFile().loadGridShiftFile(in, false);
+            }
+
+            return true; // No exception thrown => valid file.
+        } catch (IllegalArgumentException e) {
+            // This usually means resource is not a valid NTv2 file.
+            // Let exception message describe the cause.
+            LOGGER.log(Level.WARNING, e.getLocalizedMessage(), e);
+            return false;
+        } catch (IOException e) {
+            LOGGER.log(Level.WARNING, e.getLocalizedMessage(), e);
+            return false;
+        } finally {
+            try {
+                if (raf != null)
+                    raf.close();
+            } catch (IOException e) {
+            }
+
+            try {
+                if (is != null)
+                    is.close();
+            } catch (IOException e) {
+            }
+        }
+    }
+
+    /**
+     * Loads the grid in memory.
+     * 
+     * If file cannot be loaded, the cause is logged at {@link Level#SEVERE severe level}.
+     * 
+     * @param location the NTv2 file absolute path
+     * @return the grid, or {@code null} on error
+     * @throws FactoryException
+     */
+    private GridShiftFile loadNTv2Grid(URL location) throws FactoryException {
+        InputStream in = null;
+        try {
+            GridShiftFile grid = new GridShiftFile();
+            in = location.openStream();
+            grid.loadGridShiftFile(in, false); // Load full grid in memory
+            in.close();
+            return grid;
+        } catch (FileNotFoundException e) {
+            LOGGER.log(Level.SEVERE, e.getLocalizedMessage(), e);
+            return null;
+        } catch (IOException e) {
+            LOGGER.log(Level.SEVERE, e.getLocalizedMessage(), e);
+            return null;
+        } catch (IllegalArgumentException e) {
+            LOGGER.log(Level.SEVERE, e.getLocalizedMessage(), e);
+            throw new FactoryException(e.getLocalizedMessage(), e);
+        } finally {
+            try {
+                if (in != null) {
+                    in.close();
+                }
+            } catch (IOException e) {
+                // never mind
+            }
+        }
+    }
+
+}
diff --git a/modules/library/referencing/src/main/java/org/geotools/referencing/operation/MathTransformProvider.java b/modules/library/referencing/src/main/java/org/geotools/referencing/operation/MathTransformProvider.java
index dc01761..eb01af2 100644
--- a/modules/library/referencing/src/main/java/org/geotools/referencing/operation/MathTransformProvider.java
+++ b/modules/library/referencing/src/main/java/org/geotools/referencing/operation/MathTransformProvider.java
@@ -238,7 +238,7 @@ public abstract class MathTransformProvider extends DefaultOperationMethod {
      * Put the identifiers into a properties map suitable for {@link IdentifiedObject}
      * constructor.
      */
-    private static Map<String,Object> toMap(final ReferenceIdentifier[] identifiers) {
+    protected static Map<String,Object> toMap(final ReferenceIdentifier[] identifiers) {
         ensureNonNull("identifiers", identifiers);
         if (identifiers.length == 0) {
             throw new IllegalArgumentException(Errors.format(ErrorKeys.EMPTY_ARRAY));
diff --git a/modules/library/referencing/src/main/java/org/geotools/referencing/operation/transform/NADCONTransform.java b/modules/library/referencing/src/main/java/org/geotools/referencing/operation/transform/NADCONTransform.java
index 84b31ad..dbee749 100644
--- a/modules/library/referencing/src/main/java/org/geotools/referencing/operation/transform/NADCONTransform.java
+++ b/modules/library/referencing/src/main/java/org/geotools/referencing/operation/transform/NADCONTransform.java
@@ -16,49 +16,42 @@
  */
 package org.geotools.referencing.operation.transform;
 
-import java.io.BufferedReader;
-import java.io.EOFException;
-import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
 import java.io.ObjectInputStream;
 import java.io.PrintWriter;
 import java.io.Serializable;
+import java.net.URI;
 import java.net.URL;
-import java.net.MalformedURLException;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.nio.channels.Channels;
-import java.nio.channels.ReadableByteChannel;
-import java.util.StringTokenizer;
 import java.util.prefs.Preferences;
 
-import org.opengis.parameter.GeneralParameterValue;
-import org.opengis.parameter.ParameterDescriptor;
-import org.opengis.parameter.ParameterDescriptorGroup;
-import org.opengis.parameter.ParameterNotFoundException;
-import org.opengis.parameter.ParameterValue;
-import org.opengis.parameter.ParameterValueGroup;
-import org.opengis.referencing.FactoryException;
-import org.opengis.referencing.operation.MathTransform;
-import org.opengis.referencing.operation.MathTransform2D;
-import org.opengis.referencing.operation.Transformation;
-import org.opengis.referencing.operation.TransformException;
-
 import org.geotools.metadata.iso.citation.Citations;
 import org.geotools.parameter.DefaultParameterDescriptor;
 import org.geotools.parameter.Parameter;
 import org.geotools.parameter.ParameterGroup;
 import org.geotools.referencing.NamedIdentifier;
+import org.geotools.referencing.ReferencingFactoryFinder;
+import org.geotools.referencing.factory.gridshift.GridShiftLocator;
+import org.geotools.referencing.factory.gridshift.NADCONGridShiftFactory;
+import org.geotools.referencing.factory.gridshift.NADConGridShift;
 import org.geotools.referencing.operation.MathTransformProvider;
 import org.geotools.referencing.operation.builder.LocalizationGrid;
 import org.geotools.resources.Arguments;
-import org.geotools.resources.i18n.Errors;
 import org.geotools.resources.i18n.ErrorKeys;
+import org.geotools.resources.i18n.Errors;
 import org.geotools.resources.i18n.Vocabulary;
 import org.geotools.resources.i18n.VocabularyKeys;
+import org.opengis.parameter.GeneralParameterValue;
+import org.opengis.parameter.ParameterDescriptor;
+import org.opengis.parameter.ParameterDescriptorGroup;
+import org.opengis.parameter.ParameterNotFoundException;
+import org.opengis.parameter.ParameterValue;
+import org.opengis.parameter.ParameterValueGroup;
+import org.opengis.referencing.FactoryException;
+import org.opengis.referencing.NoSuchIdentifierException;
+import org.opengis.referencing.operation.MathTransform;
+import org.opengis.referencing.operation.MathTransform2D;
+import org.opengis.referencing.operation.TransformException;
+import org.opengis.referencing.operation.Transformation;
 
 
 /**
@@ -140,6 +133,11 @@ public class NADCONTransform extends AbstractMathTransform implements MathTransf
      * Serial number for interoperability with different versions.
      */
     private static final long serialVersionUID = -4707304160205218546L;
+    
+    /**
+     * The factory that loads the NADCON grids
+     */
+    private static NADCONGridShiftFactory FACTORY = new NADCONGridShiftFactory();
 
     /**
      * Preference node for the grid shift file location.
@@ -170,43 +168,14 @@ public class NADCONTransform extends AbstractMathTransform implements MathTransf
     /**
      * Latitude grid shift file names. Output in WKT.
      */
-    private final String latGridName;
+    private final URI latGridName;
 
     /**
      * Longitude grid shift file names. Output in WKT.
      */
-    private final String longGridName;
-
-    /**
-     * The minimum longitude value covered by this grid (decimal degrees)
-     */
-    private double xmin;
-
-    /**
-     * The minimum latitude value covered by this grid (decimal degrees)
-     */
-    private double ymin;
-
-    /**
-     * The maximum longitude value covered by this grid (decimal degrees)
-     */
-    private double xmax;
-
-    /**
-     * The maximum latitude value covered by this grid (decimal degrees)
-     */
-    private double ymax;
-
-    /**
-     * The difference between longitude grid points (decimal degrees)
-     */
-    private double dx;
-
-    /**
-     * The difference between latitude grid points (decimal degrees)
-     */
-    private double dy;
+    private final URI longGridName;
 
+   
     /**
      * Longitude and latitude grid shift values. Values are organized from low
      * to high longitude (low x index to high) and low to high latitude (low y
@@ -226,6 +195,12 @@ public class NADCONTransform extends AbstractMathTransform implements MathTransf
     private transient MathTransform2D inverse;
 
     /**
+     * The grid driving this transform
+     */
+    NADConGridShift grid;
+
+
+    /**
      * Constructs a {@code NADCONTransform} from the specified grid shift files.
      *
      * @param latGridName path and name (or just name if {@link #GRID_LOCATION}
@@ -240,42 +215,40 @@ public class NADCONTransform extends AbstractMathTransform implements MathTransf
      *         (ie file extentions are unknown or there is an error reading the
      *          grid files)
      */
-    public NADCONTransform(final String latGridName, final String longGridName)
+    public NADCONTransform(final URI latGridName, final URI longGridName)
             throws ParameterNotFoundException, FactoryException
     {
+        if(latGridName == null) {
+            throw new NoSuchIdentifierException("Latitud grid shift file name is null", null);
+        }
+        
+        if(longGridName == null) {
+            throw new NoSuchIdentifierException("Latitud grid shift file name is null", null);
+        }
+        
         this.latGridName  = latGridName;
         this.longGridName = longGridName;
-
-        //decide if text or binary grid will be used
-        try {
-            final URL latGridURL  = makeURL(latGridName);
-            final URL longGridURL = makeURL(longGridName);
-
-            if ((latGridName.endsWith(".las") && longGridName.endsWith(".los"))
-                    || (latGridName.endsWith(".LAS") && longGridName.endsWith(".LOS"))) {
-                loadBinaryGrid(latGridURL, longGridURL);
-            } else if ((latGridName.endsWith(".laa") && longGridName.endsWith(".loa"))
-                    || (latGridName.endsWith(".LAA") && longGridName.endsWith(".LOA"))) {
-                loadTextGrid(latGridURL, longGridURL);
-            } else {
-                throw new FactoryException(Errors.format(ErrorKeys.UNSUPPORTED_FILE_TYPE_$2,
-                        latGridName.substring(latGridName.lastIndexOf('.') + 1),
-                        longGridName.substring(longGridName.lastIndexOf('.') + 1)));
-                // Note: the +1 above hide the dot, but also make sure that the code is
-                //       valid even if the path do not contains '.' at all (-1 + 1 == 0).
-            }
-
-            gridShiftTransform = gridShift.getMathTransform();
-        } catch (IOException exception) {
-            final Throwable cause = exception.getCause();
-            if (cause instanceof FactoryException) {
-                throw (FactoryException) cause;
+        
+        URL latGridURL = locateGrid(latGridName);
+        URL longGridURL = locateGrid(longGridName);
+        
+        this.grid = FACTORY.loadGridShift(latGridURL, longGridURL);
+        this.gridShiftTransform = grid.getMathTransform();
+    }
+    
+    URL locateGrid(URI uri ) throws FactoryException {
+        String grid = uri.toString();
+        for (GridShiftLocator locator : ReferencingFactoryFinder.getGridShiftLocators(null)) {
+            URL result = locator.locateGrid(grid);
+            if(result != null) {
+                return result;
             }
-            throw new FactoryException(exception.getLocalizedMessage(),
-                exception);
-        }
+        };
+        
+        throw new FactoryException("Could not locate grid file " + grid);
     }
 
+
     /**
      * Returns the parameter descriptors for this math transform.
      */
@@ -320,332 +293,6 @@ public class NADCONTransform extends AbstractMathTransform implements MathTransf
     }
 
     /**
-     * Returns a URL from the string representation. If the string has no
-     * path, the default path preferece is added.
-     *
-     * @param str a string representation of a URL
-     * @return a URL created from the string representation
-     * @throws MalformedURLException if the URL cannot be created
-     */
-    private URL makeURL(final String str) throws MalformedURLException {
-        //has '/' or '\' or ':', so probably full path to file
-        if ((str.indexOf('\\') >= 0) || (str.indexOf('/') >= 0) || (str.indexOf(':') >= 0)) {
-            return makeURLfromString(str);
-        } else {
-            // just a file name , prepend base location
-            final Preferences prefs = Preferences.userNodeForPackage(NADCONTransform.class);
-            final String baseLocation = prefs.get(GRID_LOCATION, DEFAULT_GRID_LOCATION);
-            return makeURLfromString(baseLocation + "/" + str);
-        }
-    }
-
-    /**
-     * Returns a URL based on a string representation. If no protocol is given,
-     * it is assumed to be a local file.
-     *
-     * @param str a string representation of a URL
-     * @return a URL created from the string representation
-     * @throws MalformedURLException if the URL cannot be created
-     */
-    private URL makeURLfromString(final String str) throws MalformedURLException {
-        try {
-            return new URL(str);
-        } catch (MalformedURLException e) {
-            //try making this with a file protocal
-            return new URL("file", "", str);
-        }
-    }
-
-    /**
-     * Reads latitude and longitude binary grid shift file data into {@link
-     * grid}.  The file is organized into records, with the first record
-     * containing the  header information, followed by the shift data. The
-     * header values are: text describing grid (64 bytes), num. columns (int),
-     * num. rows (int),  num. z (int), min x (float), delta x (float), min y
-     * (float), delta y (float)  and angle (float). Each record is num.
-     * columns  4 bytes + 4 byte separator long and the file contains num.
-     * rows + 1 (for the header) records. The data records (with the grid
-     * shift values) are all floats and have a 4 byte  separator (0's) before
-     * the data. Row records are organized from low  y (latitude) to high and
-     * columns are orderd from low longitude to high.  Everything is written
-     * in low byte order.
-     *
-     * @param latGridUrl URL to the binary latitude shift file (.las extention).
-     * @param longGridUrl URL to the binary longitude shift file (.los extention).
-     * @throws IOException if the data files cannot be read.
-     * @throws FactoryException if there is an inconsistency in the data
-     */
-    private void loadBinaryGrid(final URL latGridUrl, final URL longGridUrl)
-            throws IOException, FactoryException
-    {
-        final int HEADER_BYTES = 96;
-        final int SEPARATOR_BYTES = 4;
-        final int DESCRIPTION_LENGTH = 64;
-        ReadableByteChannel latChannel;
-        ReadableByteChannel longChannel;
-        ByteBuffer latBuffer;
-        ByteBuffer longBuffer;
-
-        ////////////////////////
-        //setup
-        ////////////////////////
-        latChannel = getReadChannel(latGridUrl);
-        latBuffer = fillBuffer(latChannel, HEADER_BYTES);
-
-        longChannel = getReadChannel(longGridUrl);
-        longBuffer = fillBuffer(longChannel, HEADER_BYTES);
-
-        ////////////////////////
-        //read header info
-        ////////////////////////
-        //skip the header description
-        latBuffer.position(latBuffer.position() + DESCRIPTION_LENGTH);
-
-        int nc = latBuffer.getInt();
-        int nr = latBuffer.getInt();
-        int nz = latBuffer.getInt();
-
-        xmin = latBuffer.getFloat();
-        dx   = latBuffer.getFloat();
-        ymin = latBuffer.getFloat();
-        dy   = latBuffer.getFloat();
-
-        float angle = latBuffer.getFloat();
-        xmax = xmin + ((nc - 1) * dx);
-        ymax = ymin + ((nr - 1) * dy);
-
-        //skip the longitude header description
-        longBuffer.position(longBuffer.position() + DESCRIPTION_LENGTH);
-
-        //check that latitude grid header is the same as for latitude grid
-        if (       (nc    != longBuffer.getInt())
-                || (nr    != longBuffer.getInt())
-                || (nz    != longBuffer.getInt())
-                || (xmin  != longBuffer.getFloat())
-                || (dx    != longBuffer.getFloat())
-                || (ymin  != longBuffer.getFloat())
-                || (dy    != longBuffer.getFloat())
-                || (angle != longBuffer.getFloat())) {
-            throw new FactoryException(Errors.format(ErrorKeys.GRID_LOCATIONS_UNEQUAL));
-        }
-
-        ////////////////////////
-        //read grid shift data into LocalizationGrid
-        ////////////////////////
-        final int RECORD_LENGTH = (nc * 4) + SEPARATOR_BYTES;
-        final int NUM_BYTES_LEFT = ((nr + 1) * RECORD_LENGTH) - HEADER_BYTES;
-        final int START_OF_DATA = RECORD_LENGTH - HEADER_BYTES;
-
-        latBuffer = fillBuffer(latChannel, NUM_BYTES_LEFT);
-        latBuffer.position(START_OF_DATA); //start of second record (data)
-
-        longBuffer = fillBuffer(longChannel, NUM_BYTES_LEFT);
-        longBuffer.position(START_OF_DATA);
-
-        gridShift = new LocalizationGrid(nc, nr);
-
-        int i = 0;
-        int j = 0;
-        for (i = 0; i < nr; i++) {
-            latBuffer.position(latBuffer.position() + SEPARATOR_BYTES); //skip record separator
-            longBuffer.position(longBuffer.position() + SEPARATOR_BYTES);
-
-            for (j = 0; j < nc; j++) {
-                gridShift.setLocalizationPoint(j, i, longBuffer.getFloat(), latBuffer.getFloat());
-            }
-        }
-
-        assert i == nr : i;
-        assert j == nc : j;
-    }
-
-    /**
-     * Returns a new bytebuffer, of numBytes length and little endian byte
-     * order, filled from the channel.
-     *
-     * @param channel the channel to fill the buffer from
-     * @param numBytes number of bytes to read
-     * @return a new bytebuffer filled from the channel
-     * @throws IOException if there is a problem reading the channel
-     * @throws EOFException if the end of the channel is reached
-     */
-    private ByteBuffer fillBuffer(ReadableByteChannel channel, int numBytes)
-        throws IOException {
-        ByteBuffer buf = ByteBuffer.allocate(numBytes);
-
-        if (fill(buf, channel) == -1) {
-            throw new EOFException(Errors.format(ErrorKeys.END_OF_DATA_FILE));
-        }
-
-        buf.flip();
-        buf.order(ByteOrder.LITTLE_ENDIAN);
-
-        return buf;
-    }
-
-    /**
-     * Fills the bytebuffer from the channel. Code was lifted from
-     * ShapefileDataStore.
-     *
-     * @param buffer bytebuffer to fill from the channel
-     * @param channel channel to fill the buffer from
-     * @return number of bytes read
-     * @throws IOException if there is a problem reading the channel
-     */
-    private int fill(ByteBuffer buffer, ReadableByteChannel channel)
-        throws IOException {
-        int r = buffer.remaining();
-
-        // channel reads return -1 when EOF or other error
-        // because they a non-blocking reads, 0 is a valid return value!!
-        while ((buffer.remaining() > 0) && (r != -1)) {
-            r = channel.read(buffer);
-        }
-
-        if (r == -1) {
-            buffer.limit(buffer.position());
-        }
-
-        return r;
-    }
-
-    /**
-     * Obtain a ReadableByteChannel from the given URL. If the url protocol is
-     * file, a FileChannel will be returned. Otherwise a generic channel will
-     * be obtained from the urls input stream. Code swiped from
-     * ShapefileDataStore.
-     *
-     * @param url URL to create the channel from
-     * @return a new PeadableByteChannel from the input url
-     * @throws IOException if there is a problem creating the channel
-     */
-    private ReadableByteChannel getReadChannel(URL url)
-        throws IOException {
-        ReadableByteChannel channel = null;
-
-        if (url.getProtocol().equals("file")) {
-            File file = new File(url.getFile());
-
-            if (!file.exists() || !file.canRead()) {
-                throw new IOException(Errors.format(ErrorKeys.FILE_DOES_NOT_EXIST_$1, file));
-            }
-
-            FileInputStream in = new FileInputStream(file);
-            channel = in.getChannel();
-        } else {
-            InputStream in = url.openConnection().getInputStream();
-            channel = Channels.newChannel(in);
-        }
-
-        return channel;
-    }
-
-    /**
-     * Reads latitude and longitude text grid shift file data into {@link
-     * grid}.    The first two lines of the shift data file contain the
-     * header, with the first being a description of the grid. The second line
-     * contains 8 values separated by spaces: num. columns, num. rows, num. z,
-     * min x, delta x, min y, delta y and angle. Shift data values follow this
-     * and are also  separated by spaces. Row records are organized from low y
-     * (latitude) to  high and columns are orderd from low longitude to high.
-     *
-     * @param latGridUrl URL to the text latitude shift file (.laa extention).
-     * @param longGridUrl URL to the text longitude shift file (.loa
-     *        extention).
-     * @throws IOException if the data files cannot be read.
-     * @throws FactoryException if there is an inconsistency in the data
-     */
-    private void loadTextGrid(URL latGridUrl, URL longGridUrl)
-        throws IOException, FactoryException {
-        String latLine;
-        String longLine;
-        StringTokenizer latSt;
-        StringTokenizer longSt;
-
-        ////////////////////////
-        //setup
-        ////////////////////////
-        InputStreamReader latIsr = new InputStreamReader(latGridUrl.openStream());
-        BufferedReader latBr = new BufferedReader(latIsr);
-
-        InputStreamReader longIsr = new InputStreamReader(longGridUrl.openStream());
-        BufferedReader longBr = new BufferedReader(longIsr);
-
-        ////////////////////////
-        //read header info
-        ////////////////////////
-        latLine = latBr.readLine(); //skip header description
-        latLine = latBr.readLine();
-        latSt = new StringTokenizer(latLine, " ");
-
-        if (latSt.countTokens() != 8) {
-            throw new FactoryException(Errors.format(ErrorKeys.HEADER_UNEXPECTED_LENGTH_$1,
-                                       String.valueOf(latSt.countTokens())));
-        }
-
-        int nc = Integer.parseInt(latSt.nextToken());
-        int nr = Integer.parseInt(latSt.nextToken());
-        int nz = Integer.parseInt(latSt.nextToken());
-
-        xmin = Float.parseFloat(latSt.nextToken());
-        dx = Float.parseFloat(latSt.nextToken());
-        ymin = Float.parseFloat(latSt.nextToken());
-        dy = Float.parseFloat(latSt.nextToken());
-
-        float angle = Float.parseFloat(latSt.nextToken());
-        xmax = xmin + ((nc - 1) * dx);
-        ymax = ymin + ((nr - 1) * dy);
-
-        //now read long shift grid
-        longLine = longBr.readLine(); //skip header description
-        longLine = longBr.readLine();
-        longSt = new StringTokenizer(longLine, " ");
-
-        if (longSt.countTokens() != 8) {
-            throw new FactoryException(Errors.format(ErrorKeys.HEADER_UNEXPECTED_LENGTH_$1,
-                                       String.valueOf(longSt.countTokens())));
-        }
-
-        //check that latitude grid header is the same as for latitude grid
-        if (       (nc    != Integer.parseInt(longSt.nextToken()))
-                || (nr    != Integer.parseInt(longSt.nextToken()))
-                || (nz    != Integer.parseInt(longSt.nextToken()))
-                || (xmin  != Float.parseFloat(longSt.nextToken()))
-                || (dx    != Float.parseFloat(longSt.nextToken()))
-                || (ymin  != Float.parseFloat(longSt.nextToken()))
-                || (dy    != Float.parseFloat(longSt.nextToken()))
-                || (angle != Float.parseFloat(longSt.nextToken()))) {
-            throw new FactoryException(Errors.format(ErrorKeys.GRID_LOCATIONS_UNEQUAL));
-        }
-
-        ////////////////////////
-        //read grid shift data into LocalizationGrid
-        ////////////////////////
-        gridShift = new LocalizationGrid(nc, nr);
-
-        int i = 0;
-        int j = 0;
-        for (i = 0; i < nr; i++) {
-            for (j = 0; j < nc;) {
-                latLine = latBr.readLine();
-                latSt = new StringTokenizer(latLine, " ");
-                longLine = longBr.readLine();
-                longSt = new StringTokenizer(longLine, " ");
-
-                while (latSt.hasMoreTokens() && longSt.hasMoreTokens()) {
-                    gridShift.setLocalizationPoint(j, i,
-                        (double) Float.parseFloat(longSt.nextToken()),
-                        (double) Float.parseFloat(latSt.nextToken()));
-                    ++j;
-                }
-            }
-        }
-
-        assert i == nr : i;
-        assert j == nc : j;
-    }
-
-    /**
      * Transforms a list of coordinate point ordinal values. This method is
      * provided for efficiently transforming many points. The supplied array
      * of ordinal values will contain packed ordinal values.  For example, if
@@ -685,15 +332,14 @@ public class NADCONTransform extends AbstractMathTransform implements MathTransf
             double y = srcPts[srcOff++];
 
             //check bounding box
-//issue of bbox crossing +- 180 degrees (ie input point of -188 longitude);
-//abs(x - xmin) > 0 , rollLongitude() ???
-            if (((x < xmin) || (x > xmax)) || ((y < ymin) || (y > ymax))) {
-                throw new TransformException(Errors.format(ErrorKeys.POINT_OUTSIDE_GRID));
+            if (((x < grid.getMinX()) || (x > grid.getMaxX())) || ((y < grid.getMinY()) || (y > grid.getMaxY()))) {
+                throw new TransformException("Point (" + x + " " + y + ") is not outside of ((" + grid.getMinX() 
+                        + " " + grid.getMinY() + ")(" + grid.getMaxX() + " " + grid.getMaxY() + "))"); 
             }
 
             //find the grid the point is in (index is 0 based)
-            final double xgrid = (x - xmin) / dx;
-            final double ygrid = (y - ymin) / dy;
+            final double xgrid = (x - grid.getMinX()) / grid.getDx();
+            final double ygrid = (y - grid.getMinY()) / grid.getDy();
             double[] array = new double[] { xgrid, ygrid };
 
             //use the LocalizationGridTransform2D transform method (bilineal interpolation)
@@ -784,32 +430,13 @@ public class NADCONTransform extends AbstractMathTransform implements MathTransf
         return inverse;
     }
 
-    /**
-     * Returns a hash value for this transform. To make this faster it does not
-     * check the grid values.
-     *
-     * @return a hash value for this transform.
-     */
     @Override
-    public final int hashCode() {
-        final long code = Double.doubleToLongBits(xmin)
-            + (37 * (Double.doubleToLongBits(ymin)
-            + (37 * (Double.doubleToLongBits(xmax)
-            + (37 * (Double.doubleToLongBits(ymax)
-            + (37 * (Double.doubleToLongBits(dx)
-            + (37 * (Double.doubleToLongBits(dy)))))))))));
-
-        return (int) code ^ (int) (code >>> 32);
+    public int hashCode() {
+        return grid.hashCode();
     }
-
-    /**
-     * Compares the specified object with this math transform for equality.
-     *
-     * @param object the object to compare to
-     * @return {@code true} if the objects are equal.
-     */
+    
     @Override
-    public final boolean equals(final Object object) {
+    public boolean equals(Object object) {
         if (object == this) {
             // Slight optimization
             return true;
@@ -817,17 +444,11 @@ public class NADCONTransform extends AbstractMathTransform implements MathTransf
 
         if (super.equals(object)) {
             final NADCONTransform that = (NADCONTransform) object;
-
-            return (Double.doubleToLongBits(this.xmin) == Double.doubleToLongBits(that.xmin))
-                && (Double.doubleToLongBits(this.ymin) == Double.doubleToLongBits(that.ymin))
-                && (Double.doubleToLongBits(this.xmax) == Double.doubleToLongBits(that.xmax))
-                && (Double.doubleToLongBits(this.ymax) == Double.doubleToLongBits(that.ymax))
-                && (Double.doubleToLongBits(this.dx)   == Double.doubleToLongBits(that.dx))
-                && (Double.doubleToLongBits(this.dy)   == Double.doubleToLongBits(that.dy))
-                && (this.gridShiftTransform).equals(that.gridShiftTransform);
+            
+            return this.grid.equals(that.grid);
+        } else {
+            return false;
         }
-
-        return false;
     }
 
     /**
@@ -964,14 +585,14 @@ public class NADCONTransform extends AbstractMathTransform implements MathTransf
          * parameter value. The default value is "conus.las".
          */
         public static final ParameterDescriptor LAT_DIFF_FILE = new DefaultParameterDescriptor(
-                "Latitude_difference_file", String.class, null, "conus.las");
+                "Latitude difference file", URI.class, null, null);
 
         /**
          * The operation parameter descriptor for the "Longitude_difference_file"
          * parameter value. The default value is "conus.los".
          */
         public static final ParameterDescriptor LONG_DIFF_FILE = new DefaultParameterDescriptor(
-                "Longitude_difference_file", String.class, null, "conus.los");
+                "Longitude difference file", URI.class, null, null);
 
         /**
          * The parameters group.
@@ -1017,8 +638,8 @@ public class NADCONTransform extends AbstractMathTransform implements MathTransf
                 throws ParameterNotFoundException, FactoryException
         {
             return new NADCONTransform(
-                stringValue(LAT_DIFF_FILE,  values),
-                stringValue(LONG_DIFF_FILE, values));
+                    (URI) getParameter(LAT_DIFF_FILE, values).getValue(),
+                    (URI) getParameter(LONG_DIFF_FILE, values).getValue());
         }
     }
 }
diff --git a/modules/library/referencing/src/main/java/org/geotools/referencing/operation/transform/NTv2Transform.java b/modules/library/referencing/src/main/java/org/geotools/referencing/operation/transform/NTv2Transform.java
new file mode 100644
index 0000000..5548917
--- /dev/null
+++ b/modules/library/referencing/src/main/java/org/geotools/referencing/operation/transform/NTv2Transform.java
@@ -0,0 +1,409 @@
+/*
+ *    GeoTools - The Open Source Java GIS Toolkit
+ *    http://geotools.org
+ *
+ *    (C) 2002-2012, Open Source Geospatial Foundation (OSGeo)
+ *
+ *    This library is free software; you can redistribute it and/or
+ *    modify it under the terms of the GNU Lesser General Public
+ *    License as published by the Free Software Foundation;
+ *    version 2.1 of the License.
+ *
+ *    This library is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *    Lesser General Public License for more details.
+ */
+package org.geotools.referencing.operation.transform;
+
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.Serializable;
+import java.net.URI;
+import java.net.URL;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.geotools.metadata.iso.citation.Citations;
+import org.geotools.parameter.DefaultParameterDescriptor;
+import org.geotools.parameter.Parameter;
+import org.geotools.parameter.ParameterGroup;
+import org.geotools.referencing.NamedIdentifier;
+import org.geotools.referencing.ReferencingFactoryFinder;
+import org.geotools.referencing.factory.IdentifiedObjectSet;
+import org.geotools.referencing.factory.gridshift.GridShiftLocator;
+import org.geotools.referencing.factory.gridshift.NTv2GridShiftFactory;
+import org.geotools.referencing.operation.MathTransformProvider;
+import org.geotools.util.logging.Logging;
+import org.opengis.parameter.ParameterDescriptor;
+import org.opengis.parameter.ParameterDescriptorGroup;
+import org.opengis.parameter.ParameterNotFoundException;
+import org.opengis.parameter.ParameterValue;
+import org.opengis.parameter.ParameterValueGroup;
+import org.opengis.referencing.FactoryException;
+import org.opengis.referencing.NoSuchIdentifierException;
+import org.opengis.referencing.operation.MathTransform;
+import org.opengis.referencing.operation.MathTransform2D;
+import org.opengis.referencing.operation.TransformException;
+import org.opengis.referencing.operation.Transformation;
+
+import au.com.objectix.jgridshift.GridShift;
+import au.com.objectix.jgridshift.GridShiftFile;
+
+/**
+ * The "<cite>NTv2</cite>" coordinate transformation method (EPSG:9615).
+ * <p>
+ * This transformation depends on an external resource (the NTv2 grid file). If the file
+ * is not available, a {@link NoSuchIdentifierException recoverable NoSuchIdentifierException}
+ * will be thrown on instantiation.
+ * 
+ * @see {@link IdentifiedObjectSet IdentifiedObjectSet exception handling}.
+ * @source $URL$
+ * @version $Id$
+ * @author Oscar Fonts
+ */
+public class NTv2Transform extends AbstractMathTransform implements MathTransform2D, Serializable {
+
+    /** Serial number for interoperability with different versions. */
+    private static final long serialVersionUID = -3082112044314062512L;
+    
+    /** Logger */
+    protected static final Logger LOGGER = Logging.getLogger("org.geotools.referencing");
+    
+    /**
+     * The original grid name
+     */
+    private URI grid = null;
+
+    /** The grid file name as set in the constructor. */
+    private URL gridLocation = null;
+    
+    /**
+     * The grid shift to be used
+     */
+    private GridShiftFile gridShift; 
+    
+    /**
+     * The factory that loads the grid shift files
+     */
+    private static NTv2GridShiftFactory FACTORY = new NTv2GridShiftFactory();
+    
+    /**
+     * The inverse of this transform. Will be created only when needed.
+     */
+    private transient MathTransform2D inverse;
+    
+    /**
+     * Constructs a {@code NTv2Transform} from the specified grid shift file.
+     * 
+     * This constructor checks for grid shift file availability, but
+     * doesn't actually load the full grid into memory to preserve resources.
+     *
+     * @param file NTv2 grid file name
+     * @throws NoSuchIdentifierException if the grid is not available.
+     */
+    public NTv2Transform(URI file) throws NoSuchIdentifierException {
+        if (file == null) {
+            throw new NoSuchIdentifierException("No NTv2 Grid File specified.", null);
+        }
+        
+        this.grid = file;
+        
+        gridLocation = locateGrid(grid.toString());
+        if(gridLocation == null) {
+            throw new NoSuchIdentifierException("Could not locate NTv2 Grid File " + file, null);
+        }
+        
+        // Search for grid file
+        if (!FACTORY.isNTv2Grid(gridLocation)) {
+            throw new NoSuchIdentifierException("NTv2 Grid File not available.",
+                    file.toString());
+        }
+    }
+    
+    URL locateGrid(String grid) {
+        for (GridShiftLocator locator : ReferencingFactoryFinder.getGridShiftLocators(null)) {
+            URL result = locator.locateGrid(grid);
+            if(result != null) {
+                return result;
+            }
+        };
+        
+        return null;
+    }
+    
+    /**
+     * Returns the inverse of this transform.
+     *
+     * @return the inverse of this transform
+     */
+    @Override
+    public synchronized MathTransform2D inverse() {
+        if (inverse == null) {
+            inverse = new Inverse();
+        }
+        return inverse;
+    }
+    
+    /**
+     * Transforms a list of coordinate point ordinal values. This method is
+     * provided for efficiently transforming many points. The supplied array
+     * of ordinal values will contain packed ordinal values.  For example, if
+     * the source dimension is 3, then the ordinals will be packed in this
+     * order:
+     * (<var>x<sub>0</sub></var>,<var>y<sub>0</sub></var>,<var>z<sub>0</sub></var>,
+     *
+     * <var>x<sub>1</sub></var>,<var>y<sub>1</sub></var>,<var>z<sub>1</sub></var>
+     * ...).
+     *
+     * @param srcPts the array containing the source point coordinates.
+     * @param srcOff the offset to the first point to be transformed in the
+     *        source array.
+     * @param dstPts the array into which the transformed point coordinates are
+     *        returned. May be the same than {@code srcPts}.
+     * @param dstOff the offset to the location of the first transformed point
+     *        that is stored in the destination array.
+     * @param numPts the number of point objects to be transformed.
+     *
+     * @throws TransformException if an IO error occurs reading the grid file.
+     */
+    @Override
+    public void transform(double[] srcPts, int srcOff, double[] dstPts,
+            int dstOff, int numPts) throws TransformException {
+        bidirectionalTransform(srcPts,srcOff, dstPts, dstOff, numPts, true);
+    }
+    
+    /**
+     * Inverse transform. See {@link #transform(double[], int, double[],
+     *       int, int)}
+     *
+     * @param srcPts the array containing the source point coordinates.
+     * @param srcOff the offset to the first point to be transformed in the
+     *        source array.
+     * @param dstPts the array into which the transformed point coordinates are
+     *        returned. May be the same than {@code srcPts}.
+     * @param dstOff the offset to the location of the first transformed point
+     *        that is stored in the destination array.
+     * @param numPts the number of point objects to be transformed.
+     *
+     * @throws TransformException if an IO error occurs reading the grid file.
+     */
+    public void inverseTransform(double[] srcPts, int srcOff, double[] dstPts,
+            int dstOff, int numPts) throws TransformException {
+        bidirectionalTransform(srcPts,srcOff, dstPts, dstOff, numPts, false);
+    }
+
+    /**
+     * Performs the actual transformation.
+     *
+     * @param srcPts the array containing the source point coordinates.
+     * @param srcOff the offset to the first point to be transformed in the
+     *        source array.
+     * @param dstPts the array into which the transformed point coordinates are
+     *        returned. May be the same than {@code srcPts}.
+     * @param dstOff the offset to the location of the first transformed point
+     *        that is stored in the destination array.
+     * @param numPts the number of point objects to be transformed.
+     * @param forward {@code true} for direct transform, {@code false} for inverse transform.
+     *
+     * @throws TransformException if an IO error occurs reading the grid file.
+     */
+    private void bidirectionalTransform(double[] srcPts, int srcOff, double[] dstPts,
+            int dstOff, int numPts, boolean forward) throws TransformException {
+
+        boolean shifted;
+        
+        if (gridShift == null) { // Create grid when first needed.
+            try {
+                gridShift = FACTORY.createNTv2Grid(gridLocation);
+            } catch (FactoryException e) {
+                throw new TransformException("NTv2 Grid " + gridLocation +
+                        " Could not be created", e);
+            }
+        }
+        
+        try {
+            GridShift shift = new GridShift();
+            for (int i=0; i<srcPts.length; i=i+2) {
+                shift.setLonPositiveEastDegrees(srcPts[i]);
+                shift.setLatDegrees(srcPts[i+1]);
+                if (forward) {
+                    shifted = gridShift.gridShiftForward(shift);
+                } else {
+                    shifted = gridShift.gridShiftReverse(shift);
+                }
+                if (shifted) {
+                    dstPts[i]=shift.getShiftedLonPositiveEastDegrees();
+                    dstPts[i+1]=shift.getShiftedLatDegrees();
+                } else {
+                    LOGGER.log(Level.WARNING, "Point (" + srcPts[i] + ", " + srcPts[i+1] +
+                            ") is not covered by '" + this.gridShift + "' NTv2 grid, " +
+            		    " it will not be shifted.");
+                    dstPts[i]=srcPts[i];
+                    dstPts[i+1]=srcPts[i+1];                    
+                }
+            }
+        } catch (IOException e) {
+            throw new TransformException(e.getLocalizedMessage(), e);
+        }
+    }
+
+    @Override
+    public int getSourceDimensions() {
+        return 2;
+    }
+
+    @Override
+    public int getTargetDimensions() {
+        return 2;
+    }
+    
+    /**
+     * Returns the parameter values for this math transform.
+     *
+     * @return A copy of the parameter values for this math transform.
+     */
+    @Override
+    public ParameterValueGroup getParameterValues() {
+        final ParameterValue<URI> file = new Parameter<URI>(Provider.FILE);
+        file.setValue(grid);
+
+        return new ParameterGroup(Provider.PARAMETERS,
+            new ParameterValue[] { file }
+        );
+    }
+    
+    /**
+     * Inverse of a {@link NTv2Transform}.
+     *
+     * @version $Id$
+     * @author Oscar Fonts
+     */
+    private final class Inverse extends AbstractMathTransform.Inverse
+            implements MathTransform2D, Serializable
+    {
+        /** Serial number for interoperability with different versions. */
+        private static final long serialVersionUID = -4707304160205218546L;
+
+        /**
+         * Default constructor.
+         */
+        public Inverse() {
+            NTv2Transform.this.super();
+        }
+
+        /**
+         * Returns the parameter values for this math transform.
+         *
+         * @return A copy of the parameter values for this math transform.
+         */
+        @Override
+        public ParameterValueGroup getParameterValues() {
+            return null;
+        }
+
+        /**
+         * Inverse transform an array of points.
+         *
+         * @param source
+         * @param srcOffset
+         * @param dest
+         * @param dstOffset
+         * @param length
+         *
+         * @throws TransformException if the input point is outside the area
+         *         covered by this grid.
+         */
+        public void transform(final double[] source, final int srcOffset,
+            final double[] dest, final int dstOffset, final int length)
+            throws TransformException {
+            NTv2Transform.this.inverseTransform(source, srcOffset, dest,
+                dstOffset, length);
+        }
+
+        /**
+         * Returns the original transform.
+         */
+        @Override
+        public MathTransform2D inverse() {
+            return (MathTransform2D) super.inverse();
+        }
+
+        /**
+         * Restore reference to this object after deserialization.
+         *
+         * @param in DOCUMENT ME!
+         * @throws IOException DOCUMENT ME!
+         * @throws ClassNotFoundException DOCUMENT ME!
+         */
+        private void readObject(ObjectInputStream in)
+            throws IOException, ClassNotFoundException {
+            in.defaultReadObject();
+            NTv2Transform.this.inverse = this;
+        }
+    }
+
+    /**
+     * The {@link NTv2Transform} provider.
+     * 
+     * @author Oscar Fonts
+     */
+    public static class Provider extends MathTransformProvider {
+        
+        private static final long serialVersionUID = -3710592152744574801L;
+
+        /**
+         * The operation parameter descriptor for the "Latitude and longitude difference file"
+         * parameter value. The default value is "".
+         */
+        public static final DefaultParameterDescriptor<URI> FILE = new DefaultParameterDescriptor<URI>(
+            toMap(new NamedIdentifier[] {
+                new NamedIdentifier(Citations.EPSG, "Latitude and longitude difference file"),
+                new NamedIdentifier(Citations.EPSG, "8656")
+            }),
+            URI.class, null, null, null, null, null, true);
+        
+        /**
+         * The parameters group.
+         */
+        static final ParameterDescriptorGroup PARAMETERS = createDescriptorGroup(new NamedIdentifier[] {
+                new NamedIdentifier(Citations.EPSG, "NTv2"),
+                new NamedIdentifier(Citations.EPSG, "9615")
+            }, new ParameterDescriptor[] {
+                FILE
+            });
+        
+        /**
+         * Constructs a provider.
+         */
+        public Provider() {
+            super(2, 2, PARAMETERS);
+        }
+        
+        /**
+         * Returns the operation type.
+         */
+        @Override
+        public Class<Transformation> getOperationType() {
+            return Transformation.class;
+        }
+        
+        /**
+         * Creates a math transform from the specified group of parameter
+         * values.
+         *
+         * @param values The group of parameter values.
+         * @return The created math transform.
+         * @throws ParameterNotFoundException if a required parameter was not
+         *         found.
+         * @throws FactoryException if there is a problem creating this
+         *         math transform.
+         */
+        protected MathTransform createMathTransform(final ParameterValueGroup values)
+                throws ParameterNotFoundException, FactoryException
+        {
+            return new NTv2Transform(value(FILE, values));
+        }
+    }
+}
diff --git a/modules/library/referencing/src/main/resources/META-INF/services/org.geotools.referencing.factory.gridshift.GridShiftLocator b/modules/library/referencing/src/main/resources/META-INF/services/org.geotools.referencing.factory.gridshift.GridShiftLocator
new file mode 100644
index 0000000..b0a85b9
--- /dev/null
+++ b/modules/library/referencing/src/main/resources/META-INF/services/org.geotools.referencing.factory.gridshift.GridShiftLocator
@@ -0,0 +1 @@
+org.geotools.referencing.factory.gridshift.ClasspathGridShiftLocator
\ No newline at end of file
diff --git a/modules/library/referencing/src/main/resources/META-INF/services/org.geotools.referencing.operation.MathTransformProvider b/modules/library/referencing/src/main/resources/META-INF/services/org.geotools.referencing.operation.MathTransformProvider
index b190d22..eef231d 100644
--- a/modules/library/referencing/src/main/resources/META-INF/services/org.geotools.referencing.operation.MathTransformProvider
+++ b/modules/library/referencing/src/main/resources/META-INF/services/org.geotools.referencing.operation.MathTransformProvider
@@ -10,6 +10,7 @@ org.geotools.referencing.operation.transform.GeocentricTransform$ProviderInverse
 org.geotools.referencing.operation.transform.MolodenskiTransform$Provider
 org.geotools.referencing.operation.transform.MolodenskiTransform$ProviderAbridged
 org.geotools.referencing.operation.transform.NADCONTransform$Provider
+org.geotools.referencing.operation.transform.NTv2Transform$Provider
 org.geotools.referencing.operation.transform.SimilarityTransformProvider
 org.geotools.referencing.operation.transform.WarpTransform2D$Provider
 org.geotools.referencing.operation.projection.EquidistantCylindrical$Provider
diff --git a/modules/library/referencing/src/test/java/org/geotools/referencing/factory/gridshift/NTv2GridShiftFactoryTest.java b/modules/library/referencing/src/test/java/org/geotools/referencing/factory/gridshift/NTv2GridShiftFactoryTest.java
new file mode 100644
index 0000000..7e26600
--- /dev/null
+++ b/modules/library/referencing/src/test/java/org/geotools/referencing/factory/gridshift/NTv2GridShiftFactoryTest.java
@@ -0,0 +1,111 @@
+/*
+ *    GeoTools - The Open Source Java GIS Toolkit
+ *    http://geotools.org
+ *
+ *    (C) 2002-2012, Open Source Geospatial Foundation (OSGeo)
+ *
+ *    This library is free software; you can redistribute it and/or
+ *    modify it under the terms of the GNU Lesser General Public
+ *    License as published by the Free Software Foundation;
+ *    version 2.1 of the License.
+ *
+ *    This library is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *    Lesser General Public License for more details.
+ */
+package org.geotools.referencing.factory.gridshift;
+
+import static org.junit.Assert.*;
+
+import java.net.URL;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.opengis.referencing.FactoryException;
+
+import au.com.objectix.jgridshift.GridShiftFile;
+
+
+/**
+ * Unit tests for {@link NTv2GridShiftFactory} public methods
+ * 
+ * @author Oscar Fonts
+ */
+public class NTv2GridShiftFactoryTest {
+
+    private static final URL TEST_GRID = NTv2GridShiftFactoryTest.class.getResource("BALR2009.gsb");
+    private static final URL INEXISTENT_GRID = NTv2GridShiftFactoryTest.class.getResource("this_NTv2_grid_does_not_exist");
+    private static final URL MALFORMED_GRID = NTv2GridShiftFactoryTest.class.getResource("malformedNTv2grid.gsb");
+
+    private NTv2GridShiftFactory factory;
+
+    /**
+     * Instantiates the test {@link NTv2GridShiftFactory}
+     * 
+     * @throws java.lang.Exception
+     */
+    @Before
+    public void setUp() throws Exception {
+        factory = new NTv2GridShiftFactory();
+    }
+    
+    
+    /**
+     * Test method for {@link org.geotools.referencing.factory.gridshift.NTv2GridShiftFactory#isNTv2Grid(java.lang.String)}.
+     */
+    @Test
+    public void testIsNTv2GridAvailable() {
+        assertFalse(factory.isNTv2Grid(null));
+        assertFalse(factory.isNTv2Grid(INEXISTENT_GRID)); // Will log a FINEST message
+        assertFalse(factory.isNTv2Grid(MALFORMED_GRID));  // Will log a WARNING message
+        assertTrue(factory.isNTv2Grid(TEST_GRID));
+    }
+    
+    /**
+     * Test method for {@link org.geotools.referencing.factory.gridshift.NTv2GridShiftFactory#createNTv2Grid(java.lang.String)}.
+     */
+    @Test
+    public void testCreateNTv2Grid() {
+        
+        // Try to create a null grid
+        boolean factoryExceptionThrown = false;
+        try {
+            factory.createNTv2Grid(null);
+        } catch (FactoryException e) {
+            factoryExceptionThrown = true;
+        }
+        assertTrue(factoryExceptionThrown);
+
+        // Try to create a grid from an inexistent resource
+        factoryExceptionThrown = false;
+        try {
+            factory.createNTv2Grid(INEXISTENT_GRID); // Will log a FINEST message
+        } catch (FactoryException e) {
+            factoryExceptionThrown = true;
+        }
+        assertTrue(factoryExceptionThrown);
+        
+        // Try to create a grid from a corrupt NTv2 grid file
+        factoryExceptionThrown = false;
+        try {
+            factory.createNTv2Grid(MALFORMED_GRID);  // Will log a SEVERE message
+        } catch (FactoryException e) {
+            factoryExceptionThrown = true;
+        }
+        assertTrue(factoryExceptionThrown);
+    
+        // Create a grid from the test file
+        factoryExceptionThrown = false;
+        GridShiftFile grid = null;
+        try {
+            grid = factory.createNTv2Grid(TEST_GRID);
+        } catch (FactoryException e) {
+            factoryExceptionThrown = true;
+        }
+        assertFalse(factoryExceptionThrown);
+        assertNotNull(grid);
+        assertTrue(grid.isLoaded());
+    }
+
+}
diff --git a/modules/library/referencing/src/test/java/org/geotools/referencing/factory/gridshift/TestGridShiftLocator.java b/modules/library/referencing/src/test/java/org/geotools/referencing/factory/gridshift/TestGridShiftLocator.java
new file mode 100644
index 0000000..75e4d2c
--- /dev/null
+++ b/modules/library/referencing/src/test/java/org/geotools/referencing/factory/gridshift/TestGridShiftLocator.java
@@ -0,0 +1,68 @@
+package org.geotools.referencing.factory.gridshift;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.zip.GZIPInputStream;
+
+import org.geotools.metadata.iso.citation.Citations;
+import org.geotools.util.logging.Logging;
+import org.opengis.metadata.citation.Citation;
+
+/**
+ * Test helper that can load compressed grids
+ */
+public class TestGridShiftLocator implements GridShiftLocator {
+
+    static final Logger LOGGER = Logging.getLogger(TestGridShiftLocator.class);
+
+    @Override
+    public Citation getVendor() {
+        return Citations.GEOTOOLS;
+    }
+
+    @Override
+    public URL locateGrid(String grid) {
+        GZIPInputStream is = null;
+        FileOutputStream fos = null;
+        try {
+            URL compressed = getClass().getResource(grid + ".gz");
+            if (compressed != null) {
+                is = new GZIPInputStream(compressed.openStream());
+                File out = new File("./target/" + grid);
+                fos = new FileOutputStream(out);
+                byte[] buf = new byte[1024];
+                int read;
+                while ((read = is.read(buf)) > 0) {
+                    fos.write(buf, 0, read);
+                }
+
+                return out.toURI().toURL();
+            }
+        } catch (IOException e) {
+            LOGGER.log(Level.SEVERE, "Failed to unpack the grid", e);
+        } finally {
+            try {
+                if (is != null) {
+                    is.close();
+                }
+            } catch (IOException e) {
+                //
+            }
+
+            try {
+                if (fos != null) {
+                    fos.close();
+                }
+            } catch (IOException e) {
+                //
+            }
+        }
+
+        return null;
+    }
+
+}
diff --git a/modules/library/referencing/src/test/java/org/geotools/referencing/operation/transform/NADCONTransformTest.java b/modules/library/referencing/src/test/java/org/geotools/referencing/operation/transform/NADCONTransformTest.java
new file mode 100644
index 0000000..4d056ae
--- /dev/null
+++ b/modules/library/referencing/src/test/java/org/geotools/referencing/operation/transform/NADCONTransformTest.java
@@ -0,0 +1,148 @@
+/*
+ *    GeoTools - The Open Source Java GIS Toolkit
+ *    http://geotools.org
+ *
+ *    (C) 2002-2012, Open Source Geospatial Foundation (OSGeo)
+ *
+ *    This library is free software; you can redistribute it and/or
+ *    modify it under the terms of the GNU Lesser General Public
+ *    License as published by the Free Software Foundation;
+ *    version 2.1 of the License.
+ *
+ *    This library is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *    Lesser General Public License for more details.
+ */
+package org.geotools.referencing.operation.transform;
+
+import static org.junit.Assert.*;
+
+import java.net.URI;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.opengis.parameter.ParameterValueGroup;
+import org.opengis.referencing.NoSuchIdentifierException;
+import org.opengis.referencing.operation.TransformException;
+
+/**
+ * Unit tests for {@link NADCONTransform} public methods
+ * 
+ * @author Andrea Aime - GeoSolutions
+ */
+public class NADCONTransformTest {
+    
+    private static final String STPAUL_LAS = "stpaul.las";
+    private static final String STPAUL_LOS = "stpaul.los";
+    private static final double TOLERANCE = 18E-7;
+    
+    private static final double[] TEST_POINT_SRC = {-170.25, 57.125};
+    private static final double[] TEST_POINT_DST = {-170.252283, 57.125655};
+
+    
+    private NADCONTransform transform;
+    
+    /**
+     * Instantiates the test {@link NADCONTransform}
+     * 
+     * @throws java.lang.Exception
+     */
+    @Before
+    public void setUp() throws Exception {
+        transform = new NADCONTransform(new URI(STPAUL_LAS), new URI(STPAUL_LOS));
+    }
+        
+    /**
+     * Test method for {@link org.geotools.referencing.operation.transform.NADCONTransform#getSourceDimensions()}.
+     */
+    @Test
+    public void testGetSourceDimensions() {
+        assertEquals(transform.getSourceDimensions(), 2);
+    }
+    
+    /**
+     * Test method for {@link org.geotools.referencing.operation.transform.NADCONTransform#getTargetDimensions()}.
+     */
+    @Test
+    public void testGetTargetDimensions() {
+        assertEquals(transform.getTargetDimensions(), 2);
+    }
+    
+    /**
+     * Test method for {@link org.geotools.referencing.operation.transform.NADCONTransform#getParameterValues()}.
+     */
+    @Test
+    public void testGetParameterValues() {
+        ParameterValueGroup pvg = transform.getParameterValues();
+        
+        // Descriptor is the same as provider's
+        assertEquals(pvg.getDescriptor(), NADCONTransform.Provider.PARAMETERS);
+
+        // One single value
+        assertEquals(pvg.values().size(), 2);
+        
+        Object value = pvg.parameter("Latitude difference file").getValue();
+        assertTrue(value instanceof URI);
+        assertEquals(value.toString(), STPAUL_LAS);
+        
+        value = pvg.parameter("Longitude difference file").getValue();
+        assertTrue(value instanceof URI);
+        assertEquals(value.toString(), STPAUL_LOS);
+    }
+    
+    /**
+     * Test method for {@link org.geotools.referencing.operation.transform.NADCONTransform#NADCONTransform(java.net.URI)}.
+     */
+    @Test
+    public void testNADCONTransform() throws Exception {
+
+        try {
+            new NADCONTransform(null, null);
+        } catch (NoSuchIdentifierException e) {
+            assert true;
+        }
+    }
+    
+    /**
+     * Test method for {@link org.geotools.referencing.operation.transform.NADCONTransform#inverse()}.
+     * @throws TransformException 
+     */
+    @Test
+    public void testInverse() throws TransformException {
+        assertSame(transform, transform.inverse().inverse());
+        
+        double[] p1 = new double[2];
+        double[] p2 = new double[2];
+        
+        transform.inverse().transform(TEST_POINT_DST, 0, p1, 0, 1);
+        transform.inverseTransform(TEST_POINT_DST, 0, p2, 0, 1);
+        assertEquals(p1[0], p2[0], TOLERANCE);
+        assertEquals(p1[1], p2[1], TOLERANCE);
+    }
+    
+    /**
+     * Test method for {@link org.geotools.referencing.operation.transform.NADCONTransform#transform(double[], int, double[], int, int)}.
+     * @throws TransformException 
+     */
+    @Test
+    public void testTransform() throws TransformException {
+        double[] p = new double[2];
+        transform.transform(TEST_POINT_SRC, 0, p, 0, 1);
+        assertEquals(p[0], TEST_POINT_DST[0], TOLERANCE);
+        assertEquals(p[1], TEST_POINT_DST[1], TOLERANCE);
+    }
+    
+    /**
+     * Test method for {@link org.geotools.referencing.operation.transform.NADCONTransform#inverseTransform(double[], int, double[], int, int)}.
+     * @throws TransformException 
+     */
+    @Test
+    public void testInverseTransform() throws TransformException {
+        double[] p = new double[2];
+        transform.inverseTransform(TEST_POINT_DST, 0, p, 0, 1);
+        assertEquals(p[0], TEST_POINT_SRC[0], TOLERANCE);
+        assertEquals(p[1], TEST_POINT_SRC[1], TOLERANCE);
+    }
+
+}
diff --git a/modules/library/referencing/src/test/java/org/geotools/referencing/operation/transform/NTv2TransformTest.java b/modules/library/referencing/src/test/java/org/geotools/referencing/operation/transform/NTv2TransformTest.java
new file mode 100644
index 0000000..1f53afb
--- /dev/null
+++ b/modules/library/referencing/src/test/java/org/geotools/referencing/operation/transform/NTv2TransformTest.java
@@ -0,0 +1,153 @@
+/*
+ *    GeoTools - The Open Source Java GIS Toolkit
+ *    http://geotools.org
+ *
+ *    (C) 2002-2012, Open Source Geospatial Foundation (OSGeo)
+ *
+ *    This library is free software; you can redistribute it and/or
+ *    modify it under the terms of the GNU Lesser General Public
+ *    License as published by the Free Software Foundation;
+ *    version 2.1 of the License.
+ *
+ *    This library is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *    Lesser General Public License for more details.
+ */
+package org.geotools.referencing.operation.transform;
+
+import static org.junit.Assert.*;
+
+import java.net.URI;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.opengis.parameter.ParameterValueGroup;
+import org.opengis.referencing.NoSuchIdentifierException;
+import org.opengis.referencing.operation.TransformException;
+
+/**
+ * Unit tests for {@link NTv2Transform} public methods
+ * 
+ * @author Oscar Fonts
+ */
+public class NTv2TransformTest {
+    
+    private static final String TEST_GRID = "BALR2009.gsb";
+    private static final String INEXISTENT_GRID = "this_NTv2_grid_does_not_exist";
+    private static final double[] TEST_POINT_SRC = {3.084896111, 39.592654167};
+    private static final double[] TEST_POINT_DST = {3.083801819, 39.5914804};
+    private static final double TOLERANCE = 18E-7;
+    
+    private NTv2Transform transform;
+    
+    /**
+     * Instantiates the test {@link NTv2Transform}
+     * 
+     * @throws java.lang.Exception
+     */
+    @Before
+    public void setUp() throws Exception {
+        transform = new NTv2Transform(new URI(TEST_GRID));
+    }
+        
+    /**
+     * Test method for {@link org.geotools.referencing.operation.transform.NTv2Transform#getSourceDimensions()}.
+     */
+    @Test
+    public void testGetSourceDimensions() {
+        assertEquals(transform.getSourceDimensions(), 2);
+    }
+    
+    /**
+     * Test method for {@link org.geotools.referencing.operation.transform.NTv2Transform#getTargetDimensions()}.
+     */
+    @Test
+    public void testGetTargetDimensions() {
+        assertEquals(transform.getTargetDimensions(), 2);
+    }
+    
+    /**
+     * Test method for {@link org.geotools.referencing.operation.transform.NTv2Transform#getParameterValues()}.
+     */
+    @Test
+    public void testGetParameterValues() {
+        ParameterValueGroup pvg = transform.getParameterValues();
+        
+        // Descriptor is the same as provider's
+        assertEquals(pvg.getDescriptor(), NTv2Transform.Provider.PARAMETERS);
+
+        // One single value
+        assertEquals(pvg.values().size(), 1);
+        
+        // Value accessible through its identifiers
+        Object value = pvg.parameter("8656").getValue();
+        assertTrue(value instanceof URI);
+        assertEquals(value.toString(), TEST_GRID);
+
+        value = pvg.parameter("Latitude and longitude difference file").getValue();
+        assertTrue(value instanceof URI);
+        assertEquals(value.toString(), TEST_GRID);
+    }
+    
+    /**
+     * Test method for {@link org.geotools.referencing.operation.transform.NTv2Transform#NTv2Transform(java.net.URI)}.
+     */
+    @Test
+    public void testNTv2Transform() throws Exception {
+
+        try {
+            new NTv2Transform(null);
+        } catch (NoSuchIdentifierException e) {
+            assert true;
+        }
+        
+        try {
+            new NTv2Transform(new URI(INEXISTENT_GRID));
+        } catch (NoSuchIdentifierException e) {
+            return;
+        }            
+    }
+    
+    /**
+     * Test method for {@link org.geotools.referencing.operation.transform.NTv2Transform#inverse()}.
+     * @throws TransformException 
+     */
+    @Test
+    public void testInverse() throws TransformException {
+        assertSame(transform, transform.inverse().inverse());
+        
+        double[] p1 = new double[2];
+        double[] p2 = new double[2];
+        
+        transform.inverse().transform(TEST_POINT_SRC, 0, p1, 0, 1);
+        transform.inverseTransform(TEST_POINT_SRC, 0, p2, 0, 1);
+        assertEquals(p1[0], p2[0], TOLERANCE);
+        assertEquals(p1[1], p2[1], TOLERANCE);
+    }
+    
+    /**
+     * Test method for {@link org.geotools.referencing.operation.transform.NTv2Transform#transform(double[], int, double[], int, int)}.
+     * @throws TransformException 
+     */
+    @Test
+    public void testTransform() throws TransformException {
+        double[] p = new double[2];
+        transform.transform(TEST_POINT_SRC, 0, p, 0, 1);
+        assertEquals(p[0], TEST_POINT_DST[0], TOLERANCE);
+        assertEquals(p[1], TEST_POINT_DST[1], TOLERANCE);
+    }
+    
+    /**
+     * Test method for {@link org.geotools.referencing.operation.transform.NTv2Transform#inverseTransform(double[], int, double[], int, int)}.
+     * @throws TransformException 
+     */
+    @Test
+    public void testInverseTransform() throws TransformException {
+        double[] p = new double[2];
+        transform.inverseTransform(TEST_POINT_DST, 0, p, 0, 1);
+        assertEquals(p[0], TEST_POINT_SRC[0], TOLERANCE);
+        assertEquals(p[1], TEST_POINT_SRC[1], TOLERANCE);
+    }
+
+}
diff --git a/modules/library/referencing/src/test/resources/org/geotools/referencing/factory/gridshift/BALR2009.gsb b/modules/library/referencing/src/test/resources/org/geotools/referencing/factory/gridshift/BALR2009.gsb
new file mode 100755
index 0000000000000000000000000000000000000000..5aa0b70a91ce3e93416ccbef24b48aa5f273906c
GIT binary patch
literal 101552
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
beRS>V@TRz5Xe8aj_FMm*b{RgfrSadtG0%oM

literal 0
HcmV?d00001

diff --git a/modules/library/referencing/src/test/resources/org/geotools/referencing/factory/gridshift/BALR2009_copyright_and_disclaimer.txt b/modules/library/referencing/src/test/resources/org/geotools/referencing/factory/gridshift/BALR2009_copyright_and_disclaimer.txt
new file mode 100755
index 0000000..19a3798
--- /dev/null
+++ b/modules/library/referencing/src/test/resources/org/geotools/referencing/factory/gridshift/BALR2009_copyright_and_disclaimer.txt
@@ -0,0 +1,25 @@
+BALR2009.gsb - Copyright and disclaimer
+=======================================
+
+
+Thi grid file is free ; you can redistribute or include 
+in commercial/personal applications.
+
+Creative Commons License CC-By FjgMatesanz
+
+In the event that you wish to alter the grid file which 
+appears at this ZIP file , for a purpose other than 
+personal, in-house or non-commercial use, you can apply to 
+the Instituto Geográfico Nacional at the following address 
+for formal permission.
+
+Instituto Geográfico Nacional 
+General Ibañez Ibero 3 
+28003 
+Madrid, Spain 
+Subdirección General de Producción Cartográfica
+
+Whilst all effort is made to ensure the accuracy and 
+currency of this grid file, IGN and CNIG does not accept 
+responsibility for any actions arising from the use of 
+this data.
diff --git a/modules/library/referencing/src/test/resources/org/geotools/referencing/factory/gridshift/malformedNTv2grid.gsb b/modules/library/referencing/src/test/resources/org/geotools/referencing/factory/gridshift/malformedNTv2grid.gsb
new file mode 100644
index 0000000..0665830
--- /dev/null
+++ b/modules/library/referencing/src/test/resources/org/geotools/referencing/factory/gridshift/malformedNTv2grid.gsb
@@ -0,0 +1 @@
+This is *not* a NTv2 grid file.
\ No newline at end of file
diff --git a/modules/library/referencing/src/test/resources/org/geotools/referencing/factory/gridshift/stpaul.las b/modules/library/referencing/src/test/resources/org/geotools/referencing/factory/gridshift/stpaul.las
new file mode 100644
index 0000000000000000000000000000000000000000..f55268d7cf89b4218b6bdbe3ffb4acc75b97fbb8
GIT binary patch
literal 3696
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

literal 0
HcmV?d00001

diff --git a/modules/library/referencing/src/test/resources/org/geotools/referencing/factory/gridshift/stpaul.los b/modules/library/referencing/src/test/resources/org/geotools/referencing/factory/gridshift/stpaul.los
new file mode 100644
index 0000000000000000000000000000000000000000..dace63103c3f41df404a6820b5f3b1e0ac3555ff
GIT binary patch
literal 3696
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

literal 0
HcmV?d00001

diff --git a/modules/plugin/epsg-hsql/src/test/java/org/geotools/referencing/CRSTest.java b/modules/plugin/epsg-hsql/src/test/java/org/geotools/referencing/CRSTest.java
index fc8a7f2..8674815 100644
--- a/modules/plugin/epsg-hsql/src/test/java/org/geotools/referencing/CRSTest.java
+++ b/modules/plugin/epsg-hsql/src/test/java/org/geotools/referencing/CRSTest.java
@@ -458,4 +458,19 @@ public class CRSTest extends TestCase {
         assertEquals(source, co.getSourceCRS());
         assertEquals(target, co.getTargetCRS());
     }
+    
+    public void testNadCon() throws Exception {
+        CoordinateReferenceSystem crs4138 = CRS.decode("EPSG:4138");
+        CoordinateReferenceSystem crs4326 = CRS.decode("EPSG:4326");
+        MathTransform mt = CRS.findMathTransform(crs4138, crs4326);
+        
+        assertTrue(mt.toWKT().contains("NADCON"));
+     
+        double[] src = new double[] {56.575, -169.625};
+        double[] expected = new double [] {56.576034, -169.62744};
+        double[] p = new double[2];
+        mt.transform(src, 0, p, 0, 1);
+        assertEquals(expected[0], p[0], 1e-6);
+        assertEquals(expected[1], p[1], 1e-6);
+    }
 }
diff --git a/modules/plugin/epsg-hsql/src/test/resources/org/geotools/referencing/factory/gridshift/stgeorge.las b/modules/plugin/epsg-hsql/src/test/resources/org/geotools/referencing/factory/gridshift/stgeorge.las
new file mode 100644
index 0000000000000000000000000000000000000000..68c13b7d42db8008eeccd889b3ed1deb350357a7
GIT binary patch
literal 30256
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

literal 0
HcmV?d00001

diff --git a/modules/plugin/epsg-hsql/src/test/resources/org/geotools/referencing/factory/gridshift/stgeorge.los b/modules/plugin/epsg-hsql/src/test/resources/org/geotools/referencing/factory/gridshift/stgeorge.los
new file mode 100644
index 0000000000000000000000000000000000000000..4e3337fae2072deab703e779dfe2f87e2321c049
GIT binary patch
literal 30256
zcmeFZRg}|b8}%KRe>|DN-L1G6$;OKnFYfLR#odd0ad(H}Uc9&!EAFL0ahZ94efZA5
z)A!(=wbGen($y~ZeQmq$P+6r){#ZFx>Do1_sbr1PrBYQZUG@iF`2YK=tWssGl}eTB
zXOqcPl!uvz$&~fbhzX;Lm`sgJeEa^t7ysWs{xA6x$p52LeZO~VcSff^M4ZZPa;n{P
zhn8G*==NcUl5TXU)?A0Cj^=p}hq5<ys9$A=P8N13O-6?XL>#&sZ&$_Vc5T0ESC-%H
zTDH-ywDas*JjSjJz3f`w%&sC;>^fG&t{R!`x)W<xM~hwWUf9(4x=p5IHVxWh)29VC
zb^gVsJ3rg>V@sPhRkJCkxJ_NN+H^LdP3dhm^?Yg7u^U#UIBr$XtyZ00XjO*sR*mgr
z)yI}rwXJT|<Kk9z&t{b;u~i%FR<(X@(f5B@l;)I0Np@J2ZJ9;or&#p!Ad9wku*h7`
zqNe36I-Ad;N@*=R7qqBdoLR<mvo`%{R@0+qCE9A%=|yG@nP^tt0cPE8XV%C%W~D1@
z*0#K66;5N;s(@MEuO>BoYSNr5CLKF$(zT5y-I!<6k+CMt?QK%y7A6I&nY6i>NhPwH
zv@fAaS!^Z+?!-se?TC*SnH(S8*fu^IDH$Jalr%m%=HIyJhLds8GmGP*fA)=w-mD%M
zJ)1Qyy4M;PU48v)bn51>(LQ6pMr$<t8qNOw*XY;q*XXgQU!wC4eu)m6{Uutz>zC+%
zM{VX}r>;+MDp^0LYPEK1at)`BM4gJy=2X$dPW^0mYV#|HUf*=6=n02LZFA`IB8Rd~
zaA<g6hyH5iP>C82t&cjC<U5DPBzDN^aA?qLyW(%zHRz;W?(KF>T4Gn?Np>yhZ&#+a
zc5SF-SMHK_ZOUO+_GES~aoLsRtxaR^*!1QPo9geh>9=LzJjJGV18v&d&ZbapUN2?S
z+MG7UC9|oT+osiTt#aM9s?%w!Ztb+H#&WB!PqC`wAge+htlC${sv%{pYM#fcW~sp6
zXVt7v7X9(aqR1tS+8(s%(t3+(%(dwD7>oM!wkShOi>_9;Xu2$FlEb1r$t`kwEV}c-
ztSt}C8g$XD@(0awZ!l~3T(g>tHS29}v%0l3>t1!UO317++4)^kvo5>Ly8hOrLw8M@
ze#WHQyG=5$G-=i}lTr;aX-Y?vUe-0KXjzj6=P_wdN|T;>ObWe>kA8nFK3ZWxe6&*U
z_-KhL@zE@q;-djmeDv;>xahX^anX?@<Dyj>#YIB};-csManVr^zeWr0{Th8a?Q3*(
zhp*8NrN2h=Cja_BoZr27s?dF>dY^S_({87pu5c>#G^c70c4}$|r_R)IDp<y;>baeo
zlftRThEsXpJ2c`R^L@slV!IuhzrrEUG>3W*cIa^jhnm-Q=tdcbYUgq2T1tl+dL4T3
z!LC*h?0SCAuFiYydbP@~_A~5yIMlAXo$WeZ->$+x*tIC1UA8oKHTT=K^OH@%M__xw
zrWN~`_tiE<XWBGom`&F@+mx+=O~Zb$>25xo%BQhux8J6MpRGFl$f`yctuhYq^IEH>
z&9-XvNULUcw`xxltKL_(s!S29mSu()5?ZyyW>ryU{s}X`><^2&?6RozN{iCYu*g5$
zB2zbu-Zr-AMP<%H5sOY_v1m;qi-tKYs{V$#ziZZpGiDXtW7f`9W~H5JR?p#PZSHE;
z*+yoauV~i3LSUc4ta1^v{*E`P-*b~bUp1-G?<Q?v=HJgXDaRO-8uT=&cT<x_R_0OI
zq~RG%>K111zr;sJT#S#FUK1bvcW8WcPQCbO<vj7xI3qr~;BH)0JL96aC&fj3wTX+y
zC@#7&QCzgq%dgSEv2QrnuISS2f-YT4=TbQ2Qu(h=4SM3#Z<m~UdBCZx>zryk+o^RU
zoO;{UsWOe2`3g?mFW^-1bWY6+Iu-ZDq1I0vx^l^(G6x;nx6Yx0zdE#Kq(iy8JG8m6
zL-{K?w5^asg);Cx4FALRE1ogKaQ(=`;J(3*KG?Nwv|ZtzcC~KG&y~Uad%G%Uv}<a_
zuAA{TrFw2t^Q$&(IBb(;qfNEv+O&N%oZi!>=}m1)@S{yDzqhG!CiEcIrXyyX7QL`)
z#dWKWAG6A|&8o_at=c%zsvHBXI@r#tcFcUrvR3__*Q%3gtlAv3YH1u;KDX$%YZje4
zX3^bk7JXS_kq^F)9Sr`Rz`ub-56WA#sh~w2GVr??i)NZFGX62E^$oL@9yjacHn3i7
z)-L#dcz^i4ty$M<!2u=BI+w$&?~=g-%>0@+CSAF0(m$t6`m&ufu*9Sn6HU6>&!pd4
zn>4kCNv)zL<;iB!C%FEg6|Vm)K00q(d^FSe_~_CW@zK0R;ry8RXo2T((LINl^<U$n
zPrAnaZ=QE8aOvwfmkRvsQs)*fEvxF%jiN3k%HmSB1TKxSxODV|Q?BbyRXOU^+|5qC
znD11Ham;sbr@l0Is&Q4PP84;jU>2vACqM(NPEG&Eq2LXN#vXIXy%oM+=#XPPeBQ^Q
z4=o+)SRKwU?oh>S4sA%pd+iQ&eP!2)n|7r<VOQI2aQY&<-j8R_``XpJ75ZP@u8+mh
z`fPR$No3a<n_U@S*);N|O)rnz)Owpu&lfS{6Ku-a&!)dy+qA!?P3uZ9>p6H2TwmC*
zY4&@o5<Wn?&s)`Wzg6kiS@q>ttDcOu>QOJN-n6jFTf?ecC9G<g)2b;ctop-?K76*Q
z@Dqy~Ua_eA?-upjY*Fup7B!fF=J&VgueKKTsLkw`=CwQ)%}-^~F&`T7$*kWVnKcx?
z&vC%4-`AQ|e70GON0{}Jna{$^*REhz*8*nsOKVnlbiUbVlgd0YDa{3wUhOr(6DIYa
zZc<^m{$&S~me+v`N}H4<mr3W6nKaa8Qjf>+(VP3?qh)5qM|X6LkLE5DAKjKb{(m?p
zf9q1+J1$NB!=+O@T(T^4sqkc%x({$^LtB@g)^aIBNtasYaA{pqmp(gPs_@3CCAY!&
zlvDL~IJIx7Q<)|^HG6<lMmv1nPfool=~Ty@PTfo9RDHKoSKm5R<E}%;PCHb1mqY88
zJCtCmLwyIq?d=`PQ^%okr5(DJ%b`pu9BOYkwC0^%&+gil<_z4v%dUyb?K(TfF8?6A
zer#{o%-ZNcDLh~<I6k>uIStOjJDcj<v&nbXrc1kR+Om?_pKjBsp=dxCn_4u4=PTIM
zuaHeSGTQV$#-_^_n@-~I{=5aor>si53oT#CIheuxkFcr^e80V^RWViZba=ew-&u7t
zsa0RyRs}y;<ar3EU$AKX0eBp(zcmLxht|*TWzpg0@Ih6JHWag{S5}LX!uQK;e1BzD
z=bOwiGk+bA_hF$~=J96z`?FbpwJ_^IRkJ1)HLG4`vy#R#`zEu7!S(sz`s;__^YtcW
z{nez)BhdA(CS`7D()k}u>YLA`w5d%x<2A|jDn8l;jW_Yt>j$^C=5y;+YPT}^-D>#B
zrCASMI(yzF_da-hwM)ZhxO8}^OP<ay)v52&s&X!w^0`z$wM)BvE~Wb9)QE@p_47`(
z-{;h=)#&+5r;ZJCs#q5|zkyTf$}|7@o${x3YCyoLN1q)k_t>H37acMkaH!f^JpL?)
zo)32@XIF4;=+KJt4qeahkSnc21p*GW`;2}+vg_IfyAtdN`!#m0oN1S9xLrNE*!8l3
zU46>im8yVUx6|6SE@;>6uQn}yYSZZ}Hl_F-pSQ`T)cE>y`1+ZBZ5r6dranK}G`=+a
zpU0*TsnPl%UO&#NG=HP%@O|<VRxRFcRVqB*lxbGI9cop{u2v0h4CZM4Z)p9RELIIl
zWL18LRj2;7sQ4X=CY`ouKU#l$g+=S8S=4EWMPB%R9RB`IS&NF~#n&_QBfS>=g2x+j
z->jBr&5G_e%d-N1KLu<Dnw1Z4e-*C(xrABC@pn5Cn^nVZ*7KL(eS?`lX43x6Ce@v9
z(pxlsIvQUXjek(dqzQ$<o3AT#-HMEHt9(zlhBb9-XJxlu7IrIRMz<PA+*%Ot((Px=
z^i`MI9d>Ek2A5oOU1~HMjC;WEO<fvL*`-H?U8<hZr4tdCikRSn=T4>h)2V5{J7wGC
zRL^-%Jsjgy&0b`<W=^H7;#9vPPF={v8HjbNv)QTbf5Yj2g7Xpdev?Bp=Q(tEj6=_Q
zIuvf^Q1nNKI(_fZJo4OS@?6B^P-F7kUNk-{d2ZE4IGsFqZ;V~b$#a96+tsV8UE_+`
zbvUbC=@Z+v+CjE^gO1;|>D?Kd-tMu<zs3fS+BA9;+>Xw-X<^gH>NZV*@AKud>1Ils
zM&R)>e6?!FGpnN4z!j~x{$`byTGa}F-(|2>bvvQ+4Xip;p7#{AYI=HnU>MxvnP;@V
z!=Dy?g6}(SvgqJEi{hC1)XaRQX5_seEqY&=*+=Imgvov6x{puHnsW(`hwCq`F{?TL
z?&DCiMt3qRQjg!2F)L$kykBzszuT-UXnY$q-h#$2_|2q3i<$TF-*7JU+O4j)+*)$N
ztv|Q96<!SH6TrN$Tf1Ai^}f1W1*2{a%;wgyL~g~{-D>&DrQJ7ON_xVj-rLagMJ|<_
z;L@hPE@f)%(##qz8FH!bcP>3k>{4xqOTWK%D(7EL%{mF+|AwDm!kkaU!}W8jY#XOW
z)pY8(oHA!8!zY339dN{JhgRKk=nwMTbMl;ju|s($;NSZ?G?_ei3XM-dp6iUpUqj>T
zqwz0Z*)@ke*NQw>cDr5WmfF>3vRzvT+Lf+@UAybr)w3MDpWm)h>F|DGyC#_Ix=WU?
zj?Vve(xxF~x<c^%ml-x49>J{lu&H5l_yFwB3C_=HQvmD-`pEj9!S*S5U&XT@A<Jzc
z%aQ3zPq1oUKYU#qtIpQqT$KE#_4kumRSv!%`_`gu%=}UO{T?#?oTV1Em}F5(bpA|h
zbiam0iK7;+g6j(>gcmFpm3U#+-ao<pcl<k<PIJuKKaw2R&8#C0%_>vgtTXw{YLwcn
z*Iu&*elRJ~{cku=FJtJB+=i?v4dwM1YWv=;h4<XLe#WiX-ELJ|;nvitZe1JXR)!9o
zi8^i_F6~y5+-~(r;nr2dt?%EvwBnviF=t&GvfHKCD_m+i&872$T`JMhr8RZ=U0HC?
z<6<`Od|sEve{kydeRTaCz04k`7O!;bPx7312)V5zS-vh=k32Uyw^OUga|g(CSKl%3
zXncw@_%}3u7#e?S3VjV4KN5|%q49Ij_)57QN=%+Jc^xu7;^Q9LH6E@H9zeg>*)?ho
z{Lah|?QPfQmUdZcGWTTpP;R?^Pi5CH0lPZHk<b4o$K9|gKiFph`vBNK1N%*2-vaF8
zn$hpj<=l+g6vpSJO>UFZW7DAzc>0IrwF_2Vz~`MO+bt&Bl_lHl>t<CLzOPu(sus+A
zope?e#@}1MShSN&-xQrU?XzgcDrS8;T0Ypq`Q#kn?*gUpemN|9mIR;Ypw~g;OQZ3-
zj^XdNn6-R9^G%jt+taN4O*s>l%&JVD`;WKZ%r=x|q@jl042^GO=wJmy?+O^onGVc@
zhSq#>>-l51@?K)554d$^ty^hlgYgKrE_G$r8@V;Ff?LjlZgo%R*4?06KYnH2pTPB(
zU7C8(rMPu2HT#vB9*LHBcd2J%myVI={DoZlF}+LU$aDM2b5F^0k;}~UL8r=-=bDq}
zx{~Jxbp`K+oCP#~HyVFEjZ;=MJ`WoI^CP;s3*@x@4lP~d(D!Kk3p9Qo8o!~DL;EXo
zHVQdZ2d;k-<In;N{mx6coSENr$}SWBuKh~89O(Rk5q8b$Vb>V=ehl7zMhUw%=EB#5
z{bR8I1om-Y{{-w0g8cxnPXYG7g8kFsc)#v8nVZ4^KiX8YC_X=nO@AiD<JoMQ@QU6J
zpEm=ozfQJ`U&Ld)Rk!<a9$H#evzk?(idr=>vsFoAt(s%9$`98M#oPZwms4|{MZ0EM
zlx#RycP7W9@jsyPTXI{JJcUK0-Q+&9e7oCpH7Ct#^&9%V$gEy?yZ>;m`H!J-*A4AH
zYUssgLn#*+sy2?-dK)^{+>o=Xp|V8{{`-b*#2U(GF*M`_^L@>&+(+G-w%M&O^WADS
z&aI2R-BJs;R#$Z^K{3un7PlTIaI3P_txf;9<h_BeA9HET7O*GJMSp?!$#ZMSb2rFy
zapbv#<hktRxuWE`isZQ(*PN<*#HmJTd@D4*7aBjgr&C*+I(4J6Qz__d+tS${r?V|V
zXM6s+Lxa)yT4;Rv%?>qN;LyTf(090gb!&%u)<WY;;q96EGpWe+_`8E&?HY{E*S~I8
zgA;aj+F{qU6=Xbm9REnWYLe&Yx3KG04ZFOh=yda-^=a%fLUx@b(>I3m_ksP#6L9@@
zGCMt9^{I4qgYkbI$#nH>>RpaAlGmoX_`J#R{eq8Hjd{R4pR>xg$Evw2tjatUejkY6
zBh!z8>tD#K@_75ji8upRy1subT11}zh{jjmXweFMy?>NNZMvcB4K2!Bo-9Xq8%%A{
z7`&YaZ#VMZH=MVX^yq00kCG(wsJzRg0dEYgyKU&<DMM*?7;3T9(9%hqf&PXHwly@W
zmZ94v3>C;>XmV0R|2hrTegl`^b}QE(Zq3=jY%g=G%VaoxfLle{;pKkfER=MsdQN;m
zGPhp1+{#0q>qwrPPo6tTo_o2Jb3mR;MxM(|p36p_`>upbIkSU%5_BJp&+?zf-*PH?
z!l^pjoa(;_yvO77`#AMeD<^u*nV_?Ee8(9`?9^p6{>{J4_#KBflIQBu-4$5nQ0bWt
z^%~*O1v;GC_&aAcI{GM&9B@B;U&K$}2lh|EzTOSH&ZG4enEM^8>`FG<uEumZqu~7U
zt>A)Mb|o)Oj|29%Qj_zT`yF5L?9XhPL!Yw~kG}wqUw%GwJ{IopjkiPVvs9tSDMIce
z+f|6zbRK_S7M)*ziJX1_EnfrX<hu7mtY{y&)8(8m1?Q9Je<IT@aPYfV7FD<jw)8lk
zH(OL^KHQJD%hc1NSxxA3D&g%5q62&-oe93fJnG%qqh<9yx?avBe?E^&ruL|x&!gQR
z4aGe$RPMZ?se29GUuCGs3`5h08v3V`p{n%_Z7XLebv}4MHJtA=)Z~*}#~-?t^@3aD
z_u=1H<Lzd;HEWn#k2|}Sy#Zd1JohVk?kIWgsn0DNc`hM&E){t$-Cmbcu5u|d9X~h3
zr7s=O{5p8L(k?y7g||=c(mOZ2|Bg=XE;;SAQx|tSRcg6Ym!|N1kW<y@Y|Gar=aq%)
z^U~GB_3z;NdtV(gGxO!IIkcM&r|xfb^~)SePj6dtm_tLmIds3NLyf@xU*Y-5^W{?W
zbI_qlCcFTgKm9K}{b_ppy>?mGvY+|YuAk8RHDG@Py`Rh6=YsPG<gjZp-F*i)yg;t+
zkH_C~nywzcU%<>an2hJ|Z&Met-IE$Nl|$!eWTn$hU{gZNfBwL#3HZCChphTcms1dp
z?=ak|MV+m>Q_rd_ba<U|<L{G$Ki;m@8!{Z-ZRV3?I{G{3B8&R}@(t(y&pldk)uSti
zJ+f`|sK8v0+K={VUJs8hH}NP^*`wNpJzA8(qkqC46^}PG^O>PnR}57?Y-qy<Ly@_L
z297rLv<I&>1^3E^l6?=qXEby-VyKvjGx8kmzUo%C-`#4xkr^k?of_@d>mF_y<hi8e
zxzyyjv>EVtVYj?-E`31b?_YB1^a1pKt&4o^(!}8|jp~A?H=wWm0bS4M(#O=~d_Q{d
z$*IDR=-@Aa?SB0HTBpv<b}GXtb}>EReDYimy1T{2zxn!6bU4L5PG$Z?W}~+qz>e<0
zQMx*?Pl3mKG@V?>+^_BF&@U|=Y6|D4EaTAjd~`YK$$sd4A1j=|&gRQ)yPBLq_xI4{
zt){P?1>d9hO}p8Zr?Fi}E0XIA;qlYkRRF$^`(o4l$LRY-n?~)k>Gmp{GSTNWhU+J^
zC(HlDYvejtcAK&$wy6dhKky&&I+^a$?^ZcBT2*Wg86IzUlq~OSXjPLR=<oAdl`NH2
z13dJ5?<}f!_Z!YPqF&j*^D1v*ubSDtn)1q{BR4(zbljud+dS&L$fHf;J^I{-xo_ps
z?CRiM+@lKFJX)E^Bd?wJyfSq4rlC?N46WK`D7e^A_X&os^fi>HHCkT-u8-pPzBAM=
zv7se)LziE{<u~0*MxM(?p3Ad{IUf(seaLPt-TI8i-z-YD%k0+7Shsqc-KzPwO9lVL
z-~CRe+sMq%b?N)jF1799(&i?3`pPa%BgcPFjyGb^dvbhgG`=UDZQwYw4A(y=&t+!j
zCk=KgTW6;};qN|G!qd^)&SpoK4ealM{SiFgv1jaKt~>PZB)%Qa599Mb{Yqaymf1(|
z=eKp}G#>v@IXpoDhrWP)0kBVt*E{l$U8!%fr$z5yY$MApw(GYEb{*`C*Msj%<MU3D
z>vLwYs~>yX9VR#euD4#H$2n+I?zPPKOq-g}<8?#h$JDWDX(_k>U;iM9O@@Q)hqvo;
z!>Ub3t@?Kp*=`=YxY7Jfe^(Pvzo!D4Uw}@JuY%LOYC71f$sN4fTgR)XrM*g)+pB6R
zyc%bCb?O~h-eacE!0Wp_`mh|lr+Tzx5cA)`qt<miI$7GIJh?rZn}XLoy!PJE>3ewg
zvxdg(#=ot=zfCjLZ7|y3!O*=rhWzBYY~;BTDGXIKc)UZ)?~>h4yXDylzb|!b?<BV-
z^mnUK8_qyYx7ZHq204CrA~)S3KK~_MEZ*)6-p;?(rREFqbHC8r^l_<7E6xNtzP?;q
zkH%L{=2BL}rDEi{ArINfTy$#TA*Y7n?-nj3)05@L!}nFdzG!2<S8-}+)Txs>$pES8
zcSBB%GjkT$(f*9yXF7+k+waiV_256>p?~mt!}~dO73}}4&3=}-f0W0er+B@^K8He|
z>?-)suFU7{y3fpaz~f(<${uHsUFF-s0qA^xq5Ik3goJ#z;Q8_Pzo79G4%swqolVPT
zv8x@%F1{0ePF=d5GB%Z=#~GE(rejW<y#HF&7*D_bxK)X_($6ih>cQA=I8T4#)&5K1
zd%&xhbzYU8?N#p)Uajlu)#HX<Wvt*;>jGYFO6!#==v9p`9xZ?Dk>!#{jSqNqXst(?
zW_vVo1ZSYDNA(+dw7-H!=?Z!@ES*QUf*xi2YN*!}JpCm@uMZeXvCiPXW2o*3L#?`!
z-x?ZfT;5QH{D!ioF=X-^y7&=K_rR?t=iExS$E_#i_$}o4e&qOy?cK^;8&6+~2i`6V
z-mVVbZrK}V`VPJ9AI$hpmwsAKPd^o(H`t|4o$&8)eWMEezK~1lGr4pJUw_|@CwNO=
zPnNF__LUCP%WuKoG4~0`^J9iPWy0TgXzA4NwVZli2A{{S?qLR}W+dP}4yPK@-8a5Z
zXLEr&7zenM0rnNSo3VThIj)yOrJ6f5ql!Zdi#XIJ6FXdHzBBu}ZBOZNFR`oJZ`VI?
z{iEr2{W;jK<L&v~Pj)Ru<EMXT*N8-R4Yab?djal$qV0#__4VlZY<PWyO-1SL`_yM=
zQ<iK;ciSR`O$XdIWqfPZxZB@weqYq5R9So~o4}{e7M~Wr@ap_EuRKS+DzVwCf%CmO
zIF{$Vz51!SS8J+xWiIMfgUrl-tXC;5UJZNU(X(qF)i~<W_RSupSb&EchvxV8C`${E
zdRFylUr~?DSv<;{fU{unsLu<$`!ziK5qNzQJU`D+tuf4aPeUJ?a3(4l>Rkv<NN?y7
zIes2Fz8*O~_98wWZ?^((H*5yI%}}y@Cp=v}x}CCcLSA~iRBjEx+cm@6^?u~ik&Dba
zIX+5fTYa8Oi`ma*qr3ashTax`*P|RBklpMj_&!l0mm0e81k8P1^87ox+Zp)#+`F9G
zL2sX8j#Ew8)%B;xYu6s_ukX}?3V8j(PA$#M^F&Vl0QUAb^mEL8X?*_aoesq>Bfn2}
zXvzSGEX;hVnhy4iboN>Cd<nR#VMhD$_a83f@9A?ktf8kP*L4_T$5X=dwe2cFms2vk
zT~!j>)zW6y=zr*JuGw@8PoH2Td-^#xtr|&&?`G3a4Q<--1KmwNd_7<FCi^sKfKN-?
z`gFRMPw^#u`Ywl0&6D~x$LZ6b|9X|=Hr#%S8Q<=eb*Wd4CV91^zgNlIdeyI%7r)?D
zxg4B<q+W$xUUh%t(fQjRW&OjWzB|zSr5?E^dxSYq*R~$btcB*6@aVVfoQotLt#WuY
z=Cz?_w+wxU#=qQZX!%0&+AqxZ&xTfz<A1CI{&>43c)NOdyCm^$-G54+yX@AUgKnK(
z=a%VLw`z>!=WghEW4EeQa;rYxZb?RZ9yH!fj!*K6&gL&LX6EnH-6dH=PfLeWcdSeG
zz<z2wm(2BfjUK0bQS<=Lzny}<J^&}6_eozlwd{^lp7T!Wpi}wb{fF>=kx5P!fcH;!
z<ZOWbDmtCNnfu-8oXQC2=f~%NdCXmmiw^DD2fwePqsQa#9mM>%qsPJHrI17Sz<o8i
z_XGFx;GX0P*n|6Ba6bp`XTkj%xc>w00kV7{Jblw7%)Oo0U)q%U27c|RO*hDLh3B!u
z8T}3Cy$^l5f8Hm@KA*C#_Nn#^pT-UK>0l?HKGyRoZ#kcO=JjcBDxds5pBjJkYUcy5
z5}x;}*IuvwT;(Nac{OjSSB}nbe0{Hum-8w^KF&aD^xX&cpFFDe(4!IO!FR7mXIFXj
za5}kth)1_OdUUWZ+Fr&(Mu6kd_<L@2;4L2Rj-j*U__o^(#pCU!<Lz?d?Jl)6G_;zb
zXfZ?HES!s2^uTN=@B*B#xwY?zTeazL(kyT*#V=rux4Ykp{sxWTNRD^V*{);emj=jm
z`1%1a!1$I+T~52SZ?8+m*OTSuyL4sZx9;|SS8`l4m#j5ivX^n`Nq!f*6nr4FU!B>{
z&+Ko;=O4c8R8#gg!!|pW9_%ZT?LYTH?_05}sqWOCVot?maVl3VeXog5@0mkKFFDj7
zozJ|Qjvm}6gL^q}cZ2&e=6xc#w*>b};Ql?h7XkN@2ie7t=Q_>A(+$PTceLwk9bPBL
zPswT5-%0JN<Rs_4wkdM!8_p@d_p4M!zuHFpni%iXZ_j*seg!T+>{E>mK24nC(}ht!
zrRd>P`zAi^ujEsL!f<>BpU#Il2k~Cbc;?l|E6n*}w0?tEspfk1^JuUB=;2k;ro3L+
ztJ#IUI+4Mv*I}=`@g606MmKZCBj+J-T?hWN$?#}=Ry6)v1AhJi|3{9WoeHh@lKt>@
zIq`P8P8%w})6fI@n~C%{<>_w{w=ra^X((2PO5*8%#nY#9;OSp8?|-@V_LN&4@OBx|
z_|((kd2)PKW<EE0ZaBU^1^(_UI-i~_KPrUwTkw4Uy5zf$reAVt<q`ONyGx^2y7bR%
zdK-AZaDQ;`$lZ*FF7>L+&bAo1f5$#ADSp81Qmyy!JDUIGEc-h8`$OEv$}tr!7zqAt
zok~@cKA(Ko7u*wp`}%l?syxNpGw%zS_gc(*0Nl?Hq|b%t$JJ!U!M!KA4*~b7;JzK)
zZ-aZ_5O;3q?Wd6C9uEWW&fLMQ$G*0#U0vwx|Ksf;6Z~4%*RSKP{CZp6uVhg_cRc(W
zkjSr1HosoH1k0N~^*Zj;?^}IJy2z()<9#~U$EWPAd>UWfr`N@Os+P^C?TLI!Z1<`6
zE3Z!91n(1GwciHcFY@Z)c&`%lW%gTnRk1pLzBpW;)vFu{;Q^~x$I$pe*O=!c9-Sh`
z*C)r{9pzEe?%<BMtAe*XlHa3f8oC?$o9IVyyl<#4p1uH{K7glpPo=jVgr{qd->+?`
zQ)xp#<Tlij9nEpCp&p;y>Ws!8h3kJN#}C*-U%wa~pW;>tbiM=FKWxU_*KlilX}4Sj
z+?tWet)G%`CcJJXjC1KB{p}#U-X;2+vxm^~E%fzE*wy3r60@UUNVcEf$fX38nEk?Z
zei>Y99p?T<96cU-UlOlp>~m_{N<2Nd-x$DoXyeo~=Dq)a^Nz-Ej=&3X=rx)CCf;t-
zUWcZw1na3hz<nmTZvpok;O@@G{mg{i(;>_K@i+Ht{<LfOVY<Ba?BwWg_L1TL!};Mo
zzZ_@%%DUUnZpyDdQ~g>o$gk_|{R-Cs^U{7z$mQ4h<bI_z{ObPBr!#kb%67)5vAcYF
zw%o`6uTPr>`4rp1r|xxpI$PSObh+XC6!5*_lj*%z`R{q@5xg3-%d0WVy&5$I-XG{y
z?RIedPhS0n#!txZRkkEv?IFjPBFFE&0q(~<nu@pkFwdj9V>~)cf0K>=W^P4~lH=*u
zq(u_~9)&-{-w)yM^M(@bGt_=HdQNZm+b~1hyTJQ+`neSiO(<;WRwg`PLPG<X`TcL*
zDu=I6dx>5a?C)%4KeLRProX#Lk8^_k?3WJgX3+a3)!cNC_<{Uxl>+~oiO~bMTYrCa
zslyZW`zoBy?B4<V9~aTtPT<}Zn%}yWOMg|v=b`uK@cEtC(Z{j3`S~&TEztQ|%=`J}
zborC%c<^^4;Q4&jxSv-9-=C4^Vfr2Py$kx@6Wqsw`+9J{0q&teczbw$20Z^5eXsl-
zXMi1TG8@^B4FBcYH=L^!45(wefF=e5+VsV*YmfbMUh=E(0lzx0^=s8EKf4$|cRZN!
zhJKwb?^m`0evL}&XNTig*)Kk=d5m^ng3AwZ2G*kUvwiA6!lx5meF`=5sd5FpUICw0
zr1j}=z^7xMy*lv7tJN34eV<olR(thfx>s|Cc$K}QSDVT4*~szJb9(g-Z&%Uj)%@2U
z?iPDgn*L_i7I2?Wt{Y2d*OTu}$?cVy_d@V{dc0l8qnBj4#!n5|uh7#Sg4;J5T85_|
zJI>JIKKMGgK07o2Q(5-1<hf-T404vCSx!SIKQP;PyuLTc@#Og_2i&U5?8hu;Z!^oS
z^<z03<oX{vvY%<lYn9p4)9E}V+jmOpRxhys_|B#0>}r2tSDP5W*K0XhZ!-K3-%kYh
zk5yf&T7-^|dH)*Z4##IOe!zYXo)6>g_b+v7_(bky^kq-m(y6pn(R^^v2kzCueHgg!
z0rz-tFAdMng6H4B^K}M0bfP_4PKIAq(xFsz_W#ZEws8TS>mAU`<^d(B8c>m<0kzH?
z(Dc}V&X@!8zF?-W`N=<i-P+_=_W6E|9P8KpUg&yrzZO-24~qKLKC@qEV*Scu@oV@C
zpRQi>DdSO}T5cw*&Bx1+h2MMm<ZAAdw~9|+zW3>NM$SmYr?zN(7>!?k86H2#_q9Bq
z<yGflWV%jXIqQLS8Lvj?^6GFhuPk`_a{qcX<CaJ7z`fa4kDim|CX(f9ljVMB?oq=k
z`1m3o<;={Pi1jFF^=Rlz`WQTY+f#<lq46VD(#g*>^nN7WT`xnq=<X8Lp`$I&+!sOf
z+11=iZRk^sq4X}!#b>u3{SANLrmH8{x5np>+(e(Z$gOsh;Qv9~(;(y3Zs1m`3T~Ay
z=+?n>aDR}w|LoF^hjex4TpF><rJYOB0OmbeAD0?5cWDnApO0L>D=nVT?^58SQ#bFC
z<>>BL?chP4-^xAvi}<=vE%5f>-Ur-|fqN==zCS#F2cEBZiLQ1(IgRda_YCgh4gH35
ziaP=2|0AFpI|AyrG@u2O0y@?|pm%Ko%2_L*_9X&Zo1Jrzgfrj_XxzVkJ^0J7=qbMz
zZ1<D1{AxVOuS5O)%GB1cA+<OUCH!PFG$5&8d!2rEM)<nhJ{3FVQ^oB*RaoLvfr&mv
z`uTLN75*NL&w|EpBgf|^$ImnS^!d40<*(Ao9m3nK^Xe72CmZfnSv-A5aGwY6XTd#^
zoW2&^&w_jHzdZVS!lUEc;QU4SyYU{C>g&-X`q~FIJStqmqZ{nzP9`VI<L$<MLbK^_
zE?hOV?-={n9qi{;8A>;YJU`x0@xgR>-O2B*c)gyX^_2~c#OtlfL%*L6-N)x=pu_F{
zhEC@me10CDXZELWAj{9=9E{`6-OpsX7W6n(@cG}nRW-d^P4W5l;rgn~dqeWwkl(m(
zwa}%!_`BUb$@)#`amaP?`1+@*+245Kd3;?`a4!Sy1Ht_yxF=)Y`!Me}nD>(K{8qZ#
zoap<;7&rhwzwH_K>#uynd1$_%W~B~lhcBob9|MYi5KzYR0oC3Mm#+%w$n=05Lj(G;
zQ-Cfapr>U6DxNoh4-V*yH$cwvYyShk(wz5e*j~T>TIE;48Gelz3deUs<LmoXrkr10
z^7=I{m0wf5evSQrcHj4@{8=Bpu}@o;)6-0W=gIMf$?<b)`t&qPj>p^8P3Y4Ai%-A)
z?bQZwKLYNT!ToP=H^4n7xHkj$_23>uUpp1tzju4(f9p};jz?w5@CV88vzO7`O`)?N
z%<Omc=mopEAMkbw3VYO%neUp|qr?V3qw}r)W*7IDp*LuKiz8%pX8+P!c5@326~gO%
zKf+Lc=07j^cdKP^zZR_X8hVnJtWUPDYUK>z^~W>!oByD<*@2&50-sNCt0%bU!Ry_s
z=+-23zFjIFhFi1Wz~#5dc*ohtqVHekv6mZ-zwb_-=Uzrydb~Q|J_FqEgL`qZ+(K{<
zoMAt=lgtj!_aMW6M&HM_b}C^F?pWjJ^Jk^c<Lk-jpsYQEO4T%|qLqVcUO1><G6c0Z
z9Mqe*fHFM`sMVE#)*lM!^ZI})%n4}zsDM6n=PWb{Xji2Gd!~Q}WeDhQIG|`e9RJLZ
z-}fu?VZT~!@N4!Q&cZ0aE_e6qMq}`==-0M_oQrgR6$$d*&px$#^exAi-|N$Yl|J3V
z+xhTz+1mM3oc`tq`BVnn%Yb_ca4!Px0{6<`-V)q@0rwN|d`56z0q)hxdX*^;{x79h
zLp<pI2anP`@Te9U{@gx~ex<KH_A4GAZ+GKoaBt($I&yq+{9T4(9_`A>`|x-*6MFQW
z$D>&GbcbFW`uzdk4bAVx{J;9m(3EBDZNWZ%C|-cszeK0AmyGuc>|cQWaC+Q*e)c>c
z-Q+Ykovd4N+uSO-fSwkgR~(O@5T4Ic)~&(0==SMw4>{bLPoJ~k27G?hrN^7V8Qj}|
z`(bcT2kz6r-CMw=k!f6V!t;~i`7{ssd<FVmc{g|Lm*d~2IF*_l_aDwRZUxouL{P)G
z1+`>RP=AaE-#$U5XcbhA>OqYu9@L4fK?M>8Ro@oWnwJ4tZU$8MctF2x4JhHFfCh{Y
z=&wG^c`N3;Ivig-AY}{C%LcUH#`Bkc#oT1(kNcH&t6vEg`t@#{UpsrF>u9_Sjh{%4
zkIUd!-7uQ})u+pNyLT79^*63nKK?9ydN>fBXWq9k?~|GLep%6Wc)l?_-wd7~N`~Ku
zzK6km0=VaA-V=3U7uSHU?gu)({NSG!uOH;~IP&{*x_Gi&BDg;DPP&^_bar#-YT^3{
zgUImR$aXC~+5`T7;`6S+`}xUs%`$lupU9&xPJG~7b~X2yX=Xp$A%oBM849m3v}cx~
zMWgBOnEQ{-*yX_an+nqVq~>*l`Tv(3kIy@c$M3fu&o_%b?NGNG;O$b?q2I;V=gfiT
zlj&C2@%%68=E40OxR>AT(gkp@I|g27S2qxzPfU*ctsvT-&Ls!FZWF%lr$<hGJ^u~o
z{kcQBnj)l^Mo6CbLAr<_yD4zr71ZwKLA{*9YlDL7(LShswS)4N4ytLcpmrq>Dv=RX
z&vyY`zYE4^0-Cccpij#Ksyr3E2Z4S2fD+dUs7&dATILF<SMq?myW#q`aQhv<-lOqL
z(D;H&m~V1?GID(9mVWLX`E{v?Uk~YT9)bHsaNh>*zkquK<~<wp{u-X&4bP8i<5R;L
zK9xe>i=gjSV|^N8qQk-0l>_&8;C>z41HUrYBk}Rw>1&&K)wQx$KNj)oMi#Hqk>w(W
zS4%$8#Xj?>5WYSe`?>k-X}00*hpu4W!GGu^^4xHbdf@fyG5^-u9=$1r&gbHOMoN!X
z<MS`u>HX0Ct8o8BJl_L6Uru!Y)MD;p{9<Tf4@1`*kon7SXCpgYkdS`g%&z_!_if2`
zJ@<3>lJ36AbnagccI#eyx5~1!*<O<Smf-$7xYuUhKQZsKZ{q9V`N#15ga!2X==-}~
z?B|+s5A#Pl+V43J`1$|lIn&6HqTNEO+bE=76+)U;Af(-CLwXVjDb<&tYCR5W>P57B
ze^43L2GxC5P)CNt^Ie1FEM6}U-xmmKUfLl0te_fx325VEwEH3)egIt81~hM0KzoM=
z^hX!;zCl2%eh8?4zJLm*=8T~6EkBUg$?@Nx!K?2CbG+S!iEuo)p9S}I;64D{i-G(5
zke|DWKGlQgo%FSv(D&Bpd)CS1^!{{tt$cb}&8I*yv^_I;$N1C-+}ktn)8YBIbawML
z($CNHs@*s*eUDd9+K}7ou)ksEo73AB$?8>Ge0^%aSKCZp)q4YXKVh!%_XRJ4Gnu{&
z^KV*7pEnKfH;~NNo}GOok1EyjC|4!+HOzkbJYb(19-!Ar^}*0J?qjWn?|;~U&g1i!
z)9EZF-+fn|j<=|x1sM(138U{{-Re)DbM6B7?bz8IUWJbX_b=eSge+f;dH0qEb2_{M
z@O&|sTOa7}_R!l8KIu|ve4VkFUT!@6j-USz=PB1iT6r|2Lz_doF+Zd)V?#>QJEY3Z
zLmF5G%!`EdIa5f*V?&%f-t%`**{=mP>PS!zHw9I4K72nmC|hr|y?Idks{|D+8syIy
ze-|6nIdf27{thV7wSZC{A-iot+vkG!Xt3@PP!cqLens*dIlggP{JuY+qj<Y(_tA53
z-wE!c!Mz-~zw6`I%ofZ)Jb$XNU-i@b^)lespilVu2lO*^HxqXH)M}|u_3`uF`f?6h
z`jiITFBbJ_Ex7Mx-czIRaWB}v-tcN6on6-*bn+{_>NXS2ALZ3|y}hd58ZQU-x5|4}
ztQb0g*3V(~%cOxH5|IPEaKIOjrafZj&!Xw<=4-F_sK|1U{+LgWo9@v<dfeyTJ@Pcc
z8{qj0f_tqb9(6O*`{MJ5pEEQAk5_gHz20~--OuPe9H06}_`finPkLrOWGElFKLPjE
z7wPku_d;vXaeACv@cf2Obhq{3d-Od|9`0YIr02ocEhoSCzUxw@)8BCZnj@@mvam9{
z!YcJ9q?Wfs8ha|FZQDb7yd<RblR|3VpR>>=q}Me=Dpn$-8QDX6o+Lzn5z?xEgYw)C
zl1YO)xt%#*8dRrALGA1x)TcH<<){_ZPbGrtm>up<f){WERrYm2{#(pA8eboczqNqb
zA4g{E70~ZZ1AJa2pvT~T72G#~duMP@2JX8~gZB<{`eHvj0>2KU?**GN-<ABzSkSNa
zY3OZye!YHA2TNx+{|}#*ljCkJ#=lMY*40i2_if-_37#K<uWOKmZpTH&r?Z>>kUcEB
z`0C7j!OdQ6Sp@b|;P(;uyMA7!r>{Rro<Gj~4{z+%m8xJ~lrBGmS3S`Dn`W=>;`i#j
z;{Me`kGfn&?|=7b@<y^9p0CPKcpbh!Otzm?5Wml?@5AGtdxO5??@OLA)ERw0xxi2j
z`kb$5`yOx~5AH3#C;Kz++41v<+0~ih`KOoNx=e;YypFzRwp(*YFyCGI>=fNiw7gp>
z^MiXD_IP}?9Trxf&S6ceAJ)2ZVV%z#)`wJKrSgSU?IV~!2<g<hkV1Pys=X?tWz$27
z9}-fHP9bfm7gD%fh)faE`BWk0^o2CyV^9|#1eNSOzHM)iY!=kk=|P<u64cp_XnbAf
zyi8Dya|dOl2x_65_r49N?`?2D8Q^ml0a@{Oao~O*+}DA7Q*e(f5WrjF0eu1Wd=ICi
z?*-BK3ER-|1%4H$yII@=zlWcnL1&jWpI>)U`nAOX|F=H<ahuML{66M4^c>vRf%{bQ
zdop}oqS|EoGIaQPed>^g=Rv&QSFetu@ma64i}?eL@%4?^&&}M8uixp_+^t^KS;?88
z$J^N-PG~`oU!6Nx%>RQDWPp5L{ln}Z4RMF#t4BrQ{p)Cc@onHd*Q2(~`nyit(ZJ(f
zL*pOjfa{ZbwAleK;OkSM?H`Ym-NF41dG0pa{*ZZp+yXCOm5vvlf18>2#KHmSyY+=z
z@qh9;IegunjrhB{+{eMsukG;-=RdE8_4sgDaT~%)IycOHtFW5(2y0A}FuVS+-WCcg
zZ-%gXhr>D?7gEf#klJ1eY44$s5^V^n_neS!jtZ%8kC0|I3F$?pkO~%t^E2?CFwf(H
ziaZM{%M~7nf{Ixm)Qj0ctsjB*qw$X$;Ol+}@^?Q3^)_Wt$vx---tNEt<_)-S0r$EK
z!GA10T~9i?#sOum5KtfVeRoQHAHFW{8$X{N0@Gu7b~?M-bIEZd{VLJbue;>;#by2K
zm)ozt$^F{k;(WaEsSvoI0r!_X$aLttV;a5f5T6EiqMNVp)3kCv)yYSmqpLj~q1SQq
zeh2Si_QxCS<$0bM-9HKcU%EiH{|!B7{-@*fmrnKSS2A9Fd*=Now4o$DZ%(hCCjfJN
ze)q@RvmxL8v4@=;8b5ZbNBQvg@$Edi^OHxHN^&N^{Ux{?E;2v!{uA2XA5XV%JJ}AN
zzctYyD|6oxea~By`?z9X{~f%Ln1`J^x3A#xn>>zx!@1md5!Ff@QG0ttqh5uz{AO6E
zkB9YsYgm~Uh1FzySo8XXb*p7qS*nNCuXtGJvWAs0QCLH4VcmX-kGmPtyyIy5){v?!
z3TeUkkRJ6x=UXxN)j12rLmHDcq|pgO>TC_E)IVhQ>p`tR;|rqkYv!Wiqk_uY9qb$7
z<?wc8>2G3F!2@{urp)_;zXGaxBA_)}=<4PLlm&gS)(yPzb#v)%_TuO7Bn`;!ptpPJ
zSMO_R_+h^at@rETEWa8J^DAj5zx;Lms!`f6BbQ(0!9CvXml>XS(A!+3x5>7LeauR{
z{8XP-4)SR(yP1>VKC%i}^O#uOC-+ah&SOzk`nys--OB*~JIMfey*>}{cihXkc9EX`
zAbZ&Pba_MR@zHx1n7=QD=cmtknS%F{>+iltx9{WS(fB`hbH5hctK#iu4fg0s2Y$!A
zk1XTSncN;F#M9Rz%TIl8=*&HOS$1`K+0`{B$BmfEXJ_zrr`mG{YQqDixMQ7@OrM;)
z8hmXZ9MQ235#6X0(VNl{I;DsTr--Pz5z*9lVRlntdCr9SJX2UxmxpzKN|<{S@O=9)
zcN%!TbXco$g=I?-Rx=~a=Z`~j-3zJGnUF^A3TfB!5Px3?dOi@nZx_<ppF)~n5`Ui~
zBvaCmesP4z2tk#<8C1VxLCxG8)U<izwb4Np2lr<UgX+b+KhG0XRd{~3E2uN*`|BG4
zxsKxRHU^aLS7sbPpOen606DH)$$*-D7tq**bhu{x-*fu8%YJ#-%^X}!M?2lG+(X#E
zb!7hr?k47ad>;B5c>cHte+TYo(f7@#*~hVyd%oHy+d?>fo=<<z_vsZsH|9~|SA733
zK5gypW4GtiM)4jvAQ!ryGNn%zk54(le$i>K;?VmY3%sg7ft?LJpPX4ghtEq#pOYgm
ze9xVXJwC7Mexk2M+gn}0!|n5^<r-#uCfJkbwsr9+)X<|g<?;UcnRR-cN&&Jy9o~sY
zaQ8)g`+n|UtufRUKR<pL{aoj7IA^;YQPG1D{kSfoma`)oF(RVXT_d{OFd}<}h@u4|
z>X|m89f62UU&8wFaac<(hGjYsR{gbM?VJ@>%!sf$b`9%9!?03R2&;X8u(qV-90bBj
z`6Z+xk3%YdF{E<)L(0Aed}oHVeP~Ga(fIpy@%Cjxnw=}8lgUE5gSWf#I;c(H-V@vt
zf%~t_yMuYJ56{o3Pp(7XFXtrF;p?u`-JE?vFLyPdr3V9=v?ico(*qhzejm}69A5)(
zUkqK(98j%DKo`FHHTSV!zhCgH#Xh=uaGyX=yN{msF!MgNo?l78{S-W(3)~Cf>oUbL
z+y8<+`<YIE`?TY^Pj8;^8fPJNi9OtY&IB9~3-|v!9A4<{liHB?YOuE}<kN@b^gcH7
z{Y&mx+`_k?Vi&)Q{vLhLIK!)zaQt2RoF@&vI#Yq%SCI3Np1nMGGS<NJ70C2gxRX)m
zF!!-G(AlH!>qmomPwv_`rO&0q34hPtHY2;82>W}wyRY1_PkR+UKl}~n6<K1mIYEq$
zSYmYjMMR&jMU?DlMCCSv@BE0?j*aMHuZXfXkEmOfi1rqVD402-F0m1vGDno*MOeeG
zg>~mh7>^p(*!f{y9*frZ4y$%^epe-|rA5F!Q&<~f-~<!;|2)LsOG0KlgnwU;x0{WQ
z4-YA27tTTbkTR5I#=(6vxK{!9)69F$8$tDk=htpvp3(O!!-9Nv313flGZR1GIU8J`
z0DU(F_4-Lbr!EAveGfj4-e&tGbiHptA6o=esY*ci=xNWU4=6(@pi5uy@!-DcqF+<@
z`_*6#_|EjJ9z5Tv3%xA9ZYTNuK^ed7QNK>o+ZDyzf5-f9%7Wg*{UyD;PG_I_A$M=U
z{l_EhXtpx*3)s($@+l#j-xi*4U4nCxgKi((_c80HPwd_vGv|2xT==|B8`#ay<uQg`
zT`#XnHuuVnr~kbu&&hPYgkCMMvaf&1{`CeO?QxHO*~&g{A!mRNZ%ZFEz9n9-x<><x
zd$c1fKA+z9Ki*C@Foq5}M#X-LQLU0O{C~t~O41niOfh=?Z-hNlMD<Ta*iC`=l8Ew5
zV&?ltbiWO=UMr&6B_ev4J)$Z}BU<5%=;OcSv)f^fJQddO+rxUXBrNZwu#)vBzqJYL
zON}u1p28ZC4Ns58FS3T^{3oOzuZ7h2_mD>6?fU!*?~h>a!F?K@-ow1N%^A|_By@K+
zy1N%a{d1LBK8Sx?Lzc(SR~>}MYm3*f9@ONbWVwv=Iw5lXXL{HB__)&necc{VuEhZ@
z`6Zx6y~*#*0(w@N9W1zapr5ZuKVKxyuhvh=arE;i(DyW3{5nQ{uQ;3g7n9(4eEl=d
zz_I>hIQsgvt>|)VljS%EtMT|TWcnU4WP0|qRhj=USA4q5y!Tq=(`@EFJ6>-KxG!zs
z)A|ZNEn(gpXY}cx7_y#)e(xWzR*~yB9>>pZ<1X!DxO^h_YT^2`<hj1JxSLm!4nK!i
zxs%c3xV*~8&Su3OJ}-3|zTfH5)@AJDrtsORf#8j|`w!>I7h<$<UyQb`j?w8EF?u>Q
zM#0W8%3D81&C11SM&1~mO%<bvFGjULMzrKXL|@KDRDEwmn^r~SpAk`;p%Lxx6j7vp
zgnuWZ4SCV}R1szOMO5cwSiK&EHR4=YgZ6~gdL{mST38Rz_+e<g8;$Q)68_H~*1g1G
zy~Nwy0QVK(UJKkGGw%(U_szpX`nO|9N$Z4^6@5?lT}Tdm-4#<vbDn}Lot<|tJq=xL
zd-8jlzVJG|&7#Ud{ag?)mnNtt-k=8I<<F7fI^pH(<K<`J<&%N?9dJL-4*nzaKB6c-
zKMT1&5n0ZK2l&LU^>5~y&MtD@udC<T$DV-y;r%q5xp%dMUS}#hS@5@keGHl24+jh`
z$|Dn85T@(->XQeq@5{U|JqWLF;5mAKZ7d$|XR;hU-Y|In92#$B=2IoZ6T0bi-m#av
z$DP_U;7+D%2G=K;PL><uRh3R~Jv*B|<<NgLz9Slc5slA{#*aqhui)uZq4EFW?8+3Y
z<T0_zX^K^u=P_!0HAce@$7s!l7~Ply=A&a&u1Ac1X%eH0m12~la13_<WBB_RVw5^Q
zqJGaJXh%fZ4o5U#Lqw<N!26>kYTP42&Wh-8rHJkpis)tfh@OWcbk$)kd=gfTOJTj<
zA6Cybc=j21`=Mb~?TF^rfe%WB<)^>d1MZc<eg6w``kx_Hh3C7k4XOVOeEVQ@9bcD(
z?&e}Kc!16>4>|7YXZ#%bJslnWd3u|1i}3K{g38mA`EHEA$IA~O!<oo%C&=y(-UL(?
z+})=FiZJg#FJTV{&;K<bpcWkh%7>qy$jmQPKt=Q8^|J=#A;+J@<4y5$F5>a*ul)M=
zF5Vu^|8&r=<eU8Zae-gWe(|f_&)mCd?pI4Xyn1xE*TDUHEZNQq*T3|s%Pssn`EJ|}
z_BPAN@l(n8gPHk`<hgq2I{EH&KAxxHJprE@eeo*o6Lzz3{b2lj#`WxK>F(={BHwlQ
z>Ib^}t(BO0`rEGbH@~Ct|KU8WU#w=fj@7CfvDzPv)zxgV`jRMC>Fu$q_9{jrZpP@~
z@fbO_#i;zE7)>7^qq}`#l)qIB83S%F9>cycM!zPC(Q6z0|B8HeGoq8nBeHFaDEA^f
z-uQ^>^&!8tjHp;OIG|WWN6`4@X#7)CMAe>$HRB3+9t`Ug-fr7WG8?$(2KU3vdtT;!
z)OTSWN*LB%GkKp3fBjNOTlc~BD?`eSpTFG?f8R2sj8#H9TqvZbY4QE^HoM+|`)%g^
zL{JsB1XTwwKMPN1bPMWm13X<hW*^*df%|8&`=k%_^A7?VioO@e*CnN=EdbXqn#Oms
z+`|6g-<95`CEl(cv(6b%G@$Xh@ciJP3GN?+$9ItJ*50JAXYOy(<@gr+)nS5PvHh6$
zHhxvFh4(8-#?OWSPr*GcG=Ba^pWdVK#V*p>9$+W8&Zkv)`n72Mk{)!rP4V+T`V=jK
zm(NW0izUxn$npQs-O=ah824|s(B&<J*METr`q0<3{D$+_v#|>9iB-Clu_`hRYzN1x
zdxuzh{aBqU9jo|UvE-~+^)+I3@LdcX0)L-j-gm{ww1S_f#%RN!7`Z#dsA(O3E*+x}
zxnlTtn0q5e3*O<~?nZRtG}!LM*DZ@^(Bz2n55Uu-@%3x+dK7P$Euw-6BPwNyDA(U%
zS+3&Uz`fLexHIqGAz_t+=iAf@t26rEI7?WC@O37-o9&P2X3vG>CdVzIt1U);zuJp4
zKyQ<&0$HBE?r;iv8yB4pUOpLKe$3IJijdt4;N{1Id+F}vH|9NirJ(v3X67>mRWBjE
zturVm*x$k1%_Ga%&jz&PP(V$7<2-N=qs82Sx=je^3jTgZmw@&)A=g!9ClB_@&h9oT
z?}z*Qyk!r=%qKg;{kq+FfR)^}A>U<(>woP+o^QmCwxXXqZg74^vOOCAv)QjXX#9rj
z^z_GkTD_GHZxMGbC-_vdAA1};{mGi#!zcmI!}Z&ea$m#c(~&oH@^|p@e|Qz7yZdjR
zd!<jno#h1j^=qs)KZ(`pOR;)&AXdrN#j5=5SPd8vtKYiD>RrQFeP1C~Lkh&|Oxjqb
z3C61Dml&OT9HVrXV)$H9j4rR`=h-o8KO#nJyE69;W8|+8qbvntR3I%J5P<hT!{HAj
zT6I36@@V||mCX3Gh<+JFc54^WLA>2IMKliFqu_oXPyYk+zW6fy4$s?GgE{*CX+T()
zTI1uYh1C#0AE2|_M2@RYSNqT1ZykO1Z6W>1Zf4%-kcM@mlWh>v`v1?%cg4%6!^@`w
z_nzRM?>IPb4Jr!Hub2?TXVKrZ52^(@?rTN%GR1=GN|tl5m%Gh=W{)eVR(QOPf0N<p
zaL$7NlmqPKHgf-JVL;O+q5}g1GQ<5t>f-t7axUa0_opWB2iVc!^Y=aRD+7LS{9*QR
z8`-_j_iO7odYeA<`1rfQHRx>R*B{y0-zCKtxZwJ?<n_BgO*zA7W_J6OV<mTQruj5$
z2)V5jejl!{2iITA%RSuG>}`DbdcNNMoItjg36!W>0%b3jKozqjQ0D{*G{cfWhhM<q
z*J73LC^Nn}R@>+Ed~B>r^^Vny=COKSg`bPY>i?8<*3nfRS`#l;D3W{c@pEx^D7+R6
zPzFkoqAA6SyS2F6$D_ChDTF|2ap#rb4nbQqcyT8b4KC&Tv0yD0izNTenb|Y5_dSWp
zZ|kYed{1sG`T=wOyrqo$Ek&)h_<R<e9%pG;UrUQyTXgc4+C?(k^IFUfOLhK*?{`gQ
zIAtnwr>Ppt;q(lA{xDPLz`Yx|--GWp3Yr>=&aZh-AIp6IBf(HKzOD`3O&<LG1v<MC
zZ44EvMW0ua44>VQla4vSZYK5;UEBfw{UfA=SbF$TA;sb4yEh4`2e=<#2R{zJpJE5U
zoE>~F=6kJ#pbFvV_x+Dv4(ubQlH<v8W0~`D9fC@1%#4To=fJ-)`1j%VDvuFV^W;Hg
zeZubTYCze*zQcC*?_~P(>}J0nh3@wX=vhnduxi8gviuBwZw#|ODJ8z(2^sHlgo203
z^_$`O;s_nb-#r@!-^uo76EweCgwmJ559DBH8{j76Ew`3;;qz(ku6DD3U5&>_>xZHB
zZ+gM~mLGBMd&JStn;p$q<Y-N_qa#BcJ?aGR4IJLi?Px$zN9!{3wbYJ2e+u4LY;F6?
zR)$Tsnk@wTDd_$XTkSg8T3_E*ib}R>6ty)rqpkSVwjLx|GOobmzbs|ii0&`2bY+sI
z*nyV5X2ze0;@|R?rscQvr)B9n-tI!8sm<Wt58OR)kAd&W;d`}Ce61c_XTFcl$1`A<
z`j+k{;uakZo!yX4h6>I%bY?vBy$`)z3vygFLka&ebT~7;O=?3Wo`kgcLP(YOhZF?&
z@ErE;qeH6LE2N1nLh3?4f4xjdsq%+(96w(f&PRd$quW8HIR~ei^MS2k%`U#qujKd1
zLERt5uC537H?7I|<hqiT@PEb82e5w`V2AfFneJXdi_g);)8TE5qr3Y(pylX&PUig-
z`kZ791L{<n++RGPBH8GAGSKhf^WWWOCv%EihresJ8f}l|7Gq3=n)M;K<Lk5H?-I*K
zXlZ`3zeC2y-~IlO{B{AoN9zlt^&j~BGKZ@)0T(@WRN}Uys02qncQ}e!?r7gHj-C$(
z-)@e6YT{@`RYwoM;ODYC8lJ(?=~uRj+_E+Ngss!tZ53K>tKToSwhy=Ux~ok#vw5#I
z-~Yna<ZN&~y{%y{Ej77eDf2P98D@Ng#g>jn!|x#$HyRc=S{jJAYes*Q%jSFF-Vodm
zoy5oQAkU%mU8b7qL56SLo<658&q5^6MlPO*2vhZ5f;(O9zCR6(r=xF1Z&QAZp~^kU
zcTIT)su*fioGusK?}7VgNqBhpUhz;!Gtl{-^F!<i$mm1h|BoTvg!3C~g!qgo`?<m)
zt%Ua{0wJYf7heR;FMB;G=OjD1cyb-OZ?Tu%Hw|pzem1<`!ItPl9k7S@Mj^U8Kd1rB
ze1pz@-nD>o!}$f<xVu?SPdk&{&4_@S(%WxrftSPMRgMg(Up{=G%?(y^vfo4W`vUhi
z2k~#~$@KWUev_H~<oVYfBeb|axgLLaxhS8d$`ql;X#EGA2laI|v9+t;YrEPU>FQ)&
zm-nrM`zNld{^O|MSx2km9VM=Dly44rk8u>&+tI%*9o4Gk=+`oilJYpbZ`e`nds}z!
zk<rfDygSg=!Zo%|#@c!@+E&WmHv4v)S;sR`%2sSHc+ZT#_6B@!)5)E{uWz&DF9lz`
zU0^8s5AM<6o)g?-;rmO|QY1Rx=8mae%=g|~!5UvzVX}$0B(t@q&mqTkD2dO{Zt^ZK
zQ@5WQI(vz}<^aBZt)WG83{@CyC>6NB0`~&&eaRPO`E2}LdP6Ii@1NZc@%e7}O^#at
z=S#7hDG|+`1^d`M%=w$GL)ug?r2kgt>m@?kn}<0M_p8GFVsQVjTX?<GLFL>V)YY|k
zeRO{!ypI`zzhmZCMDw3l;Rc6YO-bhco*?%caDFG8FAnE_;~wMvTJ|)|`Phlv+zjLn
zqazuwK7C%LfEs<yvyeHUI%xwc!;Us|gM5DszrKyn)GUk8n;8+jKZZNZZp?uuA8}6p
zmn&<dtGo+bm7naY$sm{AimUncTpg?6>Rln1_hYzfm&(<G$Byn^WR4#K|MiXz{_e<`
z<fz?1N88&wyyMnUg9>0@$k7##@1;WfAKU73(bnLD@OquCp1;|uH^El8zfCW}^T3S1
z7YXKhZA~}u^zYDeyxraeOLMpL41oLFsTQBzwREEcUhX?foy%Do%Y2_1;yJ+A4WPTJ
zf7DdrO{UV!H+6NqsU3ajbXu62QQg!WdYeD9n9BMY&p{HI9NhCBB)7#G>JQ)3($hXd
z=f7@k$fT!jS`K|L$exb;J}Ql&^DpS-z&_>-etkb$&JD))CFJ#4A<e<#CHAMY>qJ-E
zh#Xffq{z}C`jL=^gMGD6(f_A#8{Strj<4VG@&4)+-R)X@ek11nlh#2EtBbGyihtq!
zOE~`noZmvWPY36tj?&$14bY+E<z}$E8&1d9jT`Hx^tRRcdP#IXS3uQ6>~`q$Hqz%c
z#NWN#!+qtNk2sIc=4obnPb*%!+H=F@xp0+io2xuaT}4fIHF%h-l|Q<=(a2SfZ(Ox0
z?rKpMR}a(jT)c2J;ku*CM;#U0>S*W^w0@eS48t7N`4J!A$kFD?j;<AR^enT(`)!%?
z&%pO8x$Us6`pozj3-I)l!FnLMuDz|FqL}S?yOH!a?Mz$6|Fv`p+<yZ1tML7+C6<Px
z^Q#6i&)d=6)Ir<nZno#b=S7g|Uz!?7j_X2K+hM(_pXQkwHP+P8UU0lQe!iNi|AKq3
ztULp0>Fu78-LI0*598&S?{gQ?&rdZpc^H1KtD#}+W@gr8R|EDZ3o++28M+1UgYVeK
z-sk@2B7W{L`?qcE<5%M6@p+-~+*u7o2f+SSLp)v;?(Mz|DSNJvzBJ%G9iB;ddxhO>
z3_ic&hM>+bz`sWab$2Kp|3~hv;Cz{?=m4BQmm{dq2hP7^h9`pQ8D@Gs{SDrJ$Xqhs
zxPVIc3n*pVfa1w?{mL`<3o_sFckS?ZA9Op|+f%NVo=Vm9ct@b8wz)n19P+g6ovVbq
zu0A>K>hs;M+O9&|V_aPw=_+?mSDl-?+W4)jl%-tN$>nNZ(AA^2j!NBiH29RGt-Bn(
zUJ3VOnE4|ex&=qQnxXsE9n~x0C}$2wmzeP*nepyTTjP$|y0yht&c(K>M%$`AnA}c(
z6Y-s`J>cF3+;7A8DEPhvoxgFMu5PQPqKhn*oouNB-A!a0`r2BSikGtVWe)nA^p@H@
zXTN%dKIRa5zs}UB;C>F=uk|+Nwlp=O2D!Zyy*=}NOwiOf@9^r0hCU^~XJR)q8_o~F
z+x;)vP%$$6?e6q+E$Q^?@+^q^i(-bp$<7Q2^8Zf^y`!_ObQ#=_z<aQNvmCvrw|$J)
zE76x7UE7e_e#c&3Ar&YZ($h?Iy!iZ@FS)nF=XXwE7rPUluOi#cM*GLGqk;2l;QUqQ
zd^+ZQ!Gb}R_IN&01r>?6&q}U)`6oA58}aT7@%PaIJs!g6Dms(l@pm6^o_WyI%5|RN
zfAe&9f~Uv*J*98wsc4j^hULM$fTuXe)1Bm=az1p`@^3KR55L#CDm>3s|M9L4^mFC3
zb=9h_t7YZjdVZb_$K`jO@Ussb?LUu>?}N*KFz4qwIyu(SvOZwm%26g}d|YWqMal8g
zf{y-vV=Mh_^7#o{&NlcC?mNM~Gq}Hj?|q_dT_|g-KweuNLUeh|_YF7c;OTCzZL*X!
zpYD#%E^|Lim0DTqRm0+4k(P32C)201)DhfkUNzMozOUF|swg`Dh`#O#^Zi?VU9x(n
z!ot%PVPBKUBx{)(`U-u&V`vkdU6K8Uwy&qBhxeIg;P*xtYS$Z2N2ZIaXDEj5E*_t^
z2kd_Z``YhAIt}m3;PL;9*IW5P^B2+OO+)jU_dj(DsZcX|ditE6=zXfZWIziYz~^=3
z9%CPSItP#66wc3r^YL`|*O~K4or8McFsN6RgSw5k-<6dct@LEPS9rQx^s*=5^$xmw
zGTjH9b7b*($GopP&poxd=4sFoPg6I8?IKTCqCKS@3fDV(>e9f|f=Ya?sHZHMJhe*W
zX~|PpkFU7;>aa^c>+1YMv^^SaAA+`b;#sH<{*}=8qRjn_;GP;CNOJfbl%p^Hbo9vv
zhj-?~?}?7iljEzlbu_n*qqC8Yp5pD^(BIsBYikF%_XT$k+!um-MsOcGh)$;+nXay_
zO3e3exxqZZGx5sO{p;lSBjk5-T+Hv5UX8cZm;CO5`%Q2^Pj8bvCtV&oe}~;n9P@n}
zyBTM@sr}1LCH!Kl;t06klbH|a7uV*wAj@?uY-%ppKgQoRe`Dwzysyhnb_=uKLGv3g
zF*KC!Zv04gGhiPH_Lt~!TEP3A^z~`7;0e(DYOh18a)-Y5G~H}`h;D_>o<1l01okxp
z(EAQN5A^mKE79q(r#q54L>Itb2hNX$^UF?fXUClXa|O@AEOvGygPMxB??j*XA2NMX
zX?`XTGv4G`c>fXSH9dUoY3A!}bzhH4`1C!#G6j5<d*i9~ZBJtpJZ;|LaZ}+b$4pO6
ze)bgG&C`V@{J)x~_FsBhpWRc62z39otLR%U`y7`H<f_4P@c#vUAMWZ*S66p_aP^>y
zt84#pwL7b;sp(wRV8%bcMutCvhu`F=$wEi-Cp$WZx4YGj*<aVup0W<U%Tc7kGXU-_
z!2R#zwkm9;uUTa42J<}^^Sw=5o`c%xe`#BJ@bi5m=<CUG--7$4!*uiD-V?s}hwm%<
zlk3~k-!k7vl(jS~pQUHy_t<1~^$$!X{cS4tpsA^F{^~+gou{Gg!`avLFjWcc2e6CZ
z`<1EmMbQB~-T-!UGs*I?_Y6%0`xYOt-)Lw#yw5h>(BR>QcA@!qn$zVm@BfW7l$hV(
z_ZpG)QyD5pzPoh=ywUrVTSFSO6n{4Z56_-%7M;#jIPa0~YQgz#`1=Vacel*>8TZNR
z=eecbA5_gaI-TFR!I%)__dEqvzCB$3jy{J!W%m23w$@jRUw!o%=WB9bUrSp1ymQva
z2m1=<^Hss})%_D+3;zM%vz{{UMbrQ1ap&Rb#u!gU`grQ!%G35*9-j#W@4TKSo1Tum
zca{7fH2f?xJRY8}an&u>Rj1MXzZV|Ag{wqn{H&6$isW?lM}(`auO0Qc>1gROM@P3f
zy10n$W{RUlgYfludN&H42X}${7WiHm+$WLY?=s)Te4j>lb7vCW+yGn4@$)&reL1+-
z2lp)SJ@A^`hR(Mkzn>w$_b0#qfS>PAjyvAjQlEzSc{=*l#VwU%ADa%&=YLBtlV~dA
zIdVET7`yRzyTSe}*xv*DWbi(1EBH^AzX$fa(EP!fO=VBdPX0BX?Jl^Z`E&Qu<&o_U
z|HfVIBrqOqXliHlzLB8}<ob=|yQmz7E(Z+Ne;3k@#E`OZkI|j|><04PQ#hX=&R2)?
zt=sc;vRzl^eA^=I@-mX=(~t+Bq3u`M-5lZWa!XLB7JtO~K*q36rw%JI$ybUizWl#@
zeZJ9Gtp&b%PWCl@5Pa|8E2*BZJo44Fu&)^3*U41AtS9jM5_*2f)BW|HzMPNlPx7>L
zpr>RVJbtg0r+yVYEiB~ekmu=IN>5K7;nyy>x^lqPjyP9inDG^u@z==l-O2HZwcvOe
zGJS41kGH$<2ETU8;kFn}-|DEvVn@Mfx;t<exbK7S6~H|XozDsG6PfR?@pWCm{h!Uu
zb8t7|djhzxh3|27Y@J8vb2Hx;8u&W=e3?W`jZa(bO)S+~O?Hd5)OL)ebA2q0$J-5$
zvh+s<OKwq1^E2~Y;O`2O=R#or;;gC5V80jaXM=rPu+IYa@!d_{$!F?tEmOJ6p$GJ~
zbA3~5Q=8g@$KQ3GEPosyw}T#sUCq-NLvzUWrO0>jt<ijZ-h%S<`FQ+>KA!(m{63sd
zel?_=aK0ito2VrreLo%Cne!#Pa*Nv}q<d9ET7|dokRyaHhj_2yN1PjX3#&_$u!d9(
zYuXoKEy)(v&h%mQ&ey9OzOo$mRec*=UkcBs`?@g9m+_OYsK#*r8(#^<eR)}ZwMyq}
z#S3t}?&*tT9vz0KbxS-wnufj)^HlvuG`^9i0hM_cih1gh*;9khJQaNA>K-$G=3lOg
zZ*;Y8zN=i5T=f~?Y75@(dL4Qj`kSYDTwM&gihGN1zwIc`33v|foxuI|6#6-EPXq1~
z!QBA&+2CFr+)sl0X!!mEI$sN&Z^nF|#(ckzuj|{94)1&By=;{)Y-^TptMI3Ew@J)*
zy4pTyy#eQMljZKsKnF&!oA1ePhB^O1@0-)#WGQ0lVkS#-@OZUeb5BEuGxLn8ocl~I
zjDzR+yzi%&nljYnci*v_`+<8avfb{Id_Ol`kI8*rGE)y97@B^8e*Tc5wHxSf7t-J3
z@soy<>wl!jX^hW@^NDai1DwwV=Zn8(mf!t2=QGjiyj@LJk0s}m>Ff0gDJ^}@mfGCq
z@aIl^Sg+TFm2OU0S;mA_s&`m*T87oBW>}+3hqWwsSjR$Py?o~@U!t!jr+rP`?d#Yo
zU+HJV`%%84d-}X9##go);9bhsqFiWx&{u(X9vwUL{FJ8yyFA@n=_zH5r-+g0dk>z8
zrk;*6<71fdQOx)k<oHo9U8Nw$w>#=;!)CaTxAUfu<>+rRws-Yu6dW&$&&$gkFz9&R
zk>S9-F}S|~_o?7s1il{w_d(!ZBFfQwaKDw;(LV-S@UN|!?B(K4vV+-aE7=O0_n4sX
zKij;&+*azQ?BlB0I#<G$kJd-y>8reF=XRgm_P3?p2l4hB$Z_PkczU}=!!14PZfQ&l
zOWA6(m!-ogUWgl=u%$Gg@%<O%^qb(Cz?|R3t;K3Ox;fltjKlx+H}x|f|LgBfJ*#MH
z*5{@^XV$O5=Vim=kG^H-Zi1mNcftErhE~od+r#<ic)SQW@6+jICD%LbXg^`j-%Nq_
zKf>2vB-`WdU#%z4&;N*XKR=^JrOK$8kHhT6!-_u$m)C{$^tZ4gCWcjHKv+@j!WtL_
z*UN`>sQ{_N4XbvFu*N;~b>MGbX%FDn<G_0!er`M(&>y_p`kG(Y*OhX<!UcS8^n7(q
z?rZD=a6ixAeV(TM;c4((Pv4LAWHIC8TY73nj=xsQW1iyq1D=w<ad|JMtA@wHb*l>>
zU44tEFErTIzu>+b+=r6oO60@mf%|N5uXD#yYI^zu+Z^6s?r7jtM}67POz!AtC!Jkt
zI=j9F;l1nVTymZX_HxhJ%hla)>kNCjsq<`2ptIYG)@LHauY&U(+0T4e%vS5Hd_RM&
zOXRuI=>6|!;rxE?G1k%B;qkiA;hg$Eo{O%`{HB&ReQV(hEv3Zgd5)!UO7!3fH+7dy
z9Y1Vp`W9~MmYQ^x==#sxTH*6nG$-5DG&Q^oGa;|3{5E|Ld--_}4ef{Xcky`1;C#9T
hA8+s8Gw1JhVwcmv(7dk=bt2Oj!rLdNWuHrz_y5K?=Wzf4

literal 0
HcmV?d00001

