packages feed

hexpat 0.19.10 → 0.20.1

raw patch · 15 files changed

+1627/−1291 lines, 15 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

- Text.XML.Expat.Annotated: defaultParserOptions :: ParseOptions tag text
- Text.XML.Expat.Annotated: eAttrs :: Node a tag text -> [(tag, text)]
- Text.XML.Expat.Annotated: gxFromCStringLen :: GenericXMLString s => CStringLen -> IO s
- Text.XML.Expat.Annotated: parseSAX :: (GenericXMLString tag, GenericXMLString text) => Maybe Encoding -> ByteString -> [SAXEvent tag text]
- Text.XML.Expat.Annotated: parseSAXLocations :: (GenericXMLString tag, GenericXMLString text) => Maybe Encoding -> ByteString -> [(SAXEvent tag text, XMLParseLocation)]
- Text.XML.Expat.Annotated: parseSAXLocationsThrowing :: (GenericXMLString tag, GenericXMLString text) => Maybe Encoding -> ByteString -> [(SAXEvent tag text, XMLParseLocation)]
- Text.XML.Expat.Annotated: parseSAXThrowing :: (GenericXMLString tag, GenericXMLString text) => Maybe Encoding -> ByteString -> [SAXEvent tag text]
- Text.XML.Expat.Annotated: parseTree :: (GenericXMLString tag, GenericXMLString text) => Maybe Encoding -> ByteString -> (LNode tag text, Maybe XMLParseError)
- Text.XML.Expat.Annotated: parseTree' :: (GenericXMLString tag, GenericXMLString text) => Maybe Encoding -> ByteString -> Either XMLParseError (LNode tag text)
- Text.XML.Expat.Annotated: parseTreeThrowing :: (GenericXMLString tag, GenericXMLString text) => Maybe Encoding -> ByteString -> LNode tag text
- Text.XML.Expat.Annotated: type ParserOptions tag text = ParseOptions tag text
- Text.XML.Expat.Annotated: unannotate :: Functor c => NodeG a c tag text -> NodeG c tag text
- Text.XML.Expat.Extended: gxFromCStringLen :: GenericXMLString s => CStringLen -> IO s
- Text.XML.Expat.Format: formatTree :: (NodeClass n [], GenericXMLString tag, GenericXMLString text) => n [] tag text -> ByteString
- Text.XML.Expat.Format: formatTree' :: (NodeClass n [], GenericXMLString tag, GenericXMLString text) => n [] tag text -> ByteString
- Text.XML.Expat.Internal.IO: data ExpatHandlers
- Text.XML.Expat.Internal.IO: data Parser
- Text.XML.Expat.Internal.IO: data Parser_struct
- Text.XML.Expat.Internal.IO: getParseLocation :: ParserPtr -> IO XMLParseLocation
- Text.XML.Expat.Internal.IO: instance Show Parser
- Text.XML.Expat.Internal.IO: newParser :: Maybe Encoding -> IO Parser
- Text.XML.Expat.Internal.IO: parse :: Parser -> ByteString -> IO (Maybe XMLParseError)
- Text.XML.Expat.Internal.IO: parse' :: Parser -> ByteString -> IO (Maybe XMLParseError)
- Text.XML.Expat.Internal.IO: parseChunk :: ParserPtr -> ByteString -> Bool -> IO (Maybe XMLParseError)
- Text.XML.Expat.Internal.IO: parseExternalEntityReference :: Parser -> CString -> Maybe Encoding -> CStringLen -> IO Bool
- Text.XML.Expat.Internal.IO: setCharacterDataHandler :: Parser -> CharacterDataHandler -> IO ()
- Text.XML.Expat.Internal.IO: setCommentHandler :: Parser -> CommentHandler -> IO ()
- Text.XML.Expat.Internal.IO: setEndCDataHandler :: Parser -> EndCDataHandler -> IO ()
- Text.XML.Expat.Internal.IO: setEndElementHandler :: Parser -> EndElementHandler -> IO ()
- Text.XML.Expat.Internal.IO: setExternalEntityRefHandler :: Parser -> ExternalEntityRefHandler -> IO ()
- Text.XML.Expat.Internal.IO: setProcessingInstructionHandler :: Parser -> ProcessingInstructionHandler -> IO ()
- Text.XML.Expat.Internal.IO: setSkippedEntityHandler :: Parser -> SkippedEntityHandler -> IO ()
- Text.XML.Expat.Internal.IO: setStartCDataHandler :: Parser -> StartCDataHandler -> IO ()
- Text.XML.Expat.Internal.IO: setStartElementHandler :: Parser -> StartElementHandler -> IO ()
- Text.XML.Expat.Internal.IO: setUseForeignDTD :: Parser -> Bool -> IO ()
- Text.XML.Expat.Internal.IO: setXMLDeclarationHandler :: Parser -> XMLDeclarationHandler -> IO ()
- Text.XML.Expat.Internal.IO: type CharacterDataHandler = ParserPtr -> CStringLen -> IO Bool
- Text.XML.Expat.Internal.IO: type CommentHandler = ParserPtr -> CString -> IO Bool
- Text.XML.Expat.Internal.IO: type EndCDataHandler = ParserPtr -> IO Bool
- Text.XML.Expat.Internal.IO: type EndElementHandler = ParserPtr -> CString -> IO Bool
- Text.XML.Expat.Internal.IO: type ExternalEntityRefHandler = Parser -> CString -> CString -> CString -> CString -> IO Bool
- Text.XML.Expat.Internal.IO: type ParserPtr = Ptr Parser_struct
- Text.XML.Expat.Internal.IO: type ProcessingInstructionHandler = ParserPtr -> CString -> CString -> IO Bool
- Text.XML.Expat.Internal.IO: type SkippedEntityHandler = ParserPtr -> CString -> Int -> IO Bool
- Text.XML.Expat.Internal.IO: type StartCDataHandler = ParserPtr -> IO Bool
- Text.XML.Expat.Internal.IO: type StartElementHandler = ParserPtr -> CString -> [(CString, CString)] -> IO Bool
- Text.XML.Expat.Internal.IO: type XMLDeclarationHandler = ParserPtr -> CString -> CString -> CInt -> IO Bool
- Text.XML.Expat.Internal.IO: withParser :: Parser -> (ParserPtr -> IO a) -> IO a
- Text.XML.Expat.SAX: defaultParserOptions :: ParseOptions tag text
- Text.XML.Expat.SAX: gxFromCStringLen :: GenericXMLString s => CStringLen -> IO s
- Text.XML.Expat.SAX: parseSAX :: (GenericXMLString tag, GenericXMLString text) => Maybe Encoding -> ByteString -> [SAXEvent tag text]
- Text.XML.Expat.SAX: parseSAXLocations :: (GenericXMLString tag, GenericXMLString text) => Maybe Encoding -> ByteString -> [(SAXEvent tag text, XMLParseLocation)]
- Text.XML.Expat.SAX: parseSAXLocationsThrowing :: (GenericXMLString tag, GenericXMLString text) => Maybe Encoding -> ByteString -> [(SAXEvent tag text, XMLParseLocation)]
- Text.XML.Expat.SAX: parseSAXThrowing :: (GenericXMLString tag, GenericXMLString text) => Maybe Encoding -> ByteString -> [SAXEvent tag text]
- Text.XML.Expat.SAX: setEntityDecoder :: (GenericXMLString tag, GenericXMLString text) => Parser -> (tag -> Maybe text) -> (ParserPtr -> text -> IO ()) -> IO ()
- Text.XML.Expat.SAX: textFromCString :: GenericXMLString text => CString -> IO text
- Text.XML.Expat.SAX: type ParserOptions tag text = ParseOptions tag text
- Text.XML.Expat.Tree: defaultParserOptions :: ParseOptions tag text
- Text.XML.Expat.Tree: eAttrs :: Node tag text -> [(tag, text)]
- Text.XML.Expat.Tree: gxFromCStringLen :: GenericXMLString s => CStringLen -> IO s
- Text.XML.Expat.Tree: parseSAX :: (GenericXMLString tag, GenericXMLString text) => Maybe Encoding -> ByteString -> [SAXEvent tag text]
- Text.XML.Expat.Tree: parseSAXLocations :: (GenericXMLString tag, GenericXMLString text) => Maybe Encoding -> ByteString -> [(SAXEvent tag text, XMLParseLocation)]
- Text.XML.Expat.Tree: parseSAXLocationsThrowing :: (GenericXMLString tag, GenericXMLString text) => Maybe Encoding -> ByteString -> [(SAXEvent tag text, XMLParseLocation)]
- Text.XML.Expat.Tree: parseSAXThrowing :: (GenericXMLString tag, GenericXMLString text) => Maybe Encoding -> ByteString -> [SAXEvent tag text]
- Text.XML.Expat.Tree: parseTree :: (GenericXMLString tag, GenericXMLString text) => Maybe Encoding -> ByteString -> (Node tag text, Maybe XMLParseError)
- Text.XML.Expat.Tree: parseTree' :: (GenericXMLString tag, GenericXMLString text) => Maybe Encoding -> ByteString -> Either XMLParseError (Node tag text)
- Text.XML.Expat.Tree: parseTreeThrowing :: (GenericXMLString tag, GenericXMLString text) => Maybe Encoding -> ByteString -> Node tag text
- Text.XML.Expat.Tree: type NNodes text = [Node (NName text) text]
- Text.XML.Expat.Tree: type Nodes tag text = [Node tag text]
- Text.XML.Expat.Tree: type ParserOptions tag text = ParseOptions tag text
- Text.XML.Expat.Tree: type QNodes text = [Node (QName text) text]
- Text.XML.Expat.Tree: type UNodes text = Nodes text text
+ Text.XML.Expat.Annotated: gxFromByteString :: GenericXMLString s => ByteString -> s
+ Text.XML.Expat.Extended: gxFromByteString :: GenericXMLString s => ByteString -> s
+ Text.XML.Expat.Internal.IO: hexpatNewParser :: Maybe Encoding -> Maybe (ByteString -> Maybe ByteString) -> Bool -> IO (HParser, IO XMLParseLocation)
+ Text.XML.Expat.Internal.IO: type HParser = ByteString -> Bool -> IO (ForeignPtr Word8, CInt, Maybe XMLParseError)
+ Text.XML.Expat.SAX: gxFromByteString :: GenericXMLString s => ByteString -> s
+ Text.XML.Expat.Tree: gxFromByteString :: GenericXMLString s => ByteString -> s

Files

Text/XML/Expat/Annotated.hs view
@@ -49,24 +49,10 @@   saxToTreeG,    -- * Abstraction of string types-  GenericXMLString(..),--  -- * Deprecated-  eAttrs,-  parseSAX,-  parseSAXThrowing,-  parseSAXLocations,-  parseSAXLocationsThrowing,-  parseTree,-  parseTree',-  parseTreeThrowing,-  unannotate,-  ParserOptions,-  defaultParserOptions+  GenericXMLString(..)   ) where -import Control.Arrow-import qualified Text.XML.Expat.Tree as Tree+import Control.Arrow (first) import Text.XML.Expat.SAX ( Encoding(..)                           , GenericXMLString(..)                           , ParseOptions(..)@@ -74,13 +60,7 @@                           , SAXEvent(..)                           , XMLParseError(..)                           , XMLParseException(..)-                          , XMLParseLocation(..)-                          , parseSAX-                          , parseSAXThrowing-                          , parseSAXLocations-                          , parseSAXLocationsThrowing-                          , ParserOptions-                          , defaultParserOptions )+                          , XMLParseLocation(..) ) import qualified Text.XML.Expat.SAX as SAX import Text.XML.Expat.Internal.Namespaced import Text.XML.Expat.Internal.NodeClass@@ -99,8 +79,8 @@ -- that it has an extra piece of information of your choice attached to each -- Element. ----- @c@ is the container type for the element's children, which is [] in the--- @hexpat@ package, and a monadic list type for @hexpat-iteratee@.+-- @c@ is the container type for the element's children, which would normally be [],+-- but could potentially be a monadic list type to allow for chunked I/O. -- -- @tag@ is the tag type, which can either be one of several string types, -- or a special type from the @Text.XML.Expat.Namespaced@ or@@ -153,10 +133,6 @@     Text t1 == Text t2 = t1 == t2     _ == _ = False -eAttrs :: Node a tag text -> [(tag, text)]-{-# DEPRECATED eAttrs "use eAttributes instead" #-}-eAttrs = eAttributes- instance (NFData tag, NFData text, NFData a) => NFData (NodeG a [] tag text) where     rnf (Element nam att chi ann) = rnf (nam, att, chi, ann)     rnf (Text txt) = rnf txt@@ -223,13 +199,6 @@ instance (Functor c, List c) => MkElementClass (NodeG ()) c where     mkElement name attrs children = Element name attrs children () --- | Convert an annotated tree (/Annotated/ module) into a non-annotated--- tree (/Tree/ module).  DEPRECATED in favour of 'fromElement'.-unannotate :: Functor c => NodeG a c tag text -> Tree.NodeG c tag text-{-# DEPRECATED unannotate "use fromElement instead" #-}-unannotate (Element na at ch _) = (Tree.Element na at (fmap unannotate ch))-unannotate (Text t) = Tree.Text t- -- | Type alias for an annotated node with unqualified tag names where -- tag and text are the same string type type UNode a text = Node a text text@@ -339,18 +308,6 @@        -> ItemM l (NodeG XMLParseLocation l tag text) parseG opts = saxToTreeG . SAX.parseLocationsG opts --- | DEPRECATED: Use 'parse' instead.------ Lazily parse XML to tree. Note that forcing the XMLParseError return value--- will force the entire parse.  Therefore, to ensure lazy operation, don't--- check the error status until you have processed the tree.-parseTree :: (GenericXMLString tag, GenericXMLString text) =>-             Maybe Encoding      -- ^ Optional encoding override-          -> L.ByteString        -- ^ Input text (a lazy ByteString)-          -> (LNode tag text, Maybe XMLParseError)-{-# DEPRECATED parseTree "use Text.XML.Annotated.parse instead" #-}-parseTree mEnc = parse (ParseOptions mEnc Nothing)- -- | Lazily parse XML to tree. In the event of an error, throw 'XMLParseException'. -- -- @parseThrowing@ can throw an exception from pure code, which is generally a bad@@ -364,32 +321,12 @@               -> LNode tag text parseThrowing opts bs = fst $ saxToTree $ SAX.parseLocationsThrowing opts bs --- | DEPRECATED: use 'parseThrowing' instead------ Lazily parse XML to tree. In the event of an error, throw 'XMLParseException'.-parseTreeThrowing :: (GenericXMLString tag, GenericXMLString text) =>-             Maybe Encoding      -- ^ Optional encoding override-          -> L.ByteString        -- ^ Input text (a lazy ByteString)-          -> LNode tag text-{-# DEPRECATED parseTreeThrowing "use Text.XML.Annotated.parseThrowing instead" #-}-parseTreeThrowing mEnc = parseThrowing (ParseOptions mEnc Nothing)- -- | Strictly parse XML to tree. Returns error message or valid parsed tree. parse' :: (GenericXMLString tag, GenericXMLString text) =>           ParseOptions tag text   -- ^ Parse options        -> B.ByteString            -- ^ Input text (a strict ByteString)        -> Either XMLParseError (LNode tag text)-parse' opts bs = case parse opts (L.fromChunks [bs]) of-    (_, Just err)   -> Left err-    (root, Nothing) -> Right root ---- | DEPRECATED: use 'parse' instead.------ Strictly parse XML to tree. Returns error message or valid parsed tree.-parseTree' :: (GenericXMLString tag, GenericXMLString text) =>-              Maybe Encoding      -- ^ Optional encoding override-           -> B.ByteString        -- ^ Input text (a strict ByteString)-           -> Either XMLParseError (LNode tag text)-{-# DEPRECATED parseTree' "use Text.XML.Expat.parse' instead" #-}-parseTree' mEnc = parse' (ParseOptions mEnc Nothing)+parse' opts doc = case parse opts (L.fromChunks [doc]) of+    (xml, Nothing) -> Right xml+    (_, Just err)  -> Left err 
Text/XML/Expat/Format.hs view
@@ -28,9 +28,6 @@         formatDocument,         formatDocument',         formatDocumentG,-        -- * Deprecated names-        formatTree,-        formatTree',         -- * Low level         xmlHeader,         treeToSAX,@@ -58,12 +55,6 @@ import Data.Text (Text) import Text.XML.Expat.Tree (UNode) --- | DEPRECATED: Renamed to 'format'.-formatTree :: (NodeClass n [], GenericXMLString tag, GenericXMLString text) =>-              n [] tag text-           -> L.ByteString-formatTree = format- -- | Format document with <?xml.. header - lazy variant that returns lazy ByteString. format :: (NodeClass n [], GenericXMLString tag, GenericXMLString text) =>           n [] tag text@@ -77,12 +68,6 @@           n c tag text        -> c B.ByteString formatG node = cons xmlHeader $ formatNodeG node---- | DEPRECATED: Renamed to 'format''.-formatTree' :: (NodeClass n [], GenericXMLString tag, GenericXMLString text) =>-               n [] tag text-            -> B.ByteString-formatTree' = B.concat . L.toChunks . formatTree  -- | Format document with <?xml.. header - strict variant that returns strict ByteString. format' :: (NodeClass n [], GenericXMLString tag, GenericXMLString text) =>
− Text/XML/Expat/IO.hs
@@ -1,9 +0,0 @@-{-# OPTIONS_HADDOCK hide #-}-module Text.XML.Expat.IO-       {-# DEPRECATED "Renamed to Text.XML.Expat.Internal.IO" #-}-    (-        module Text.XML.Expat.Internal.IO-    ) where--import Text.XML.Expat.Internal.IO-
+ Text/XML/Expat/Internal/Glue.c view
@@ -0,0 +1,245 @@+#include <expat.h>+#include <unistd.h>+#include <stdint.h>+#include <string.h>++typedef struct {+    XML_Parser parser;+    XML_Char* (*decoder)(const XML_Char*);+    int locations;+} MyParser;++typedef struct {+    size_t offset;+    size_t capacity;+    uint8_t* block;+    MyParser* mp;+} Block;++/*!+ * Allocate the specified amount of room in the buffer.+ */+static void* alloc(Block* blk, size_t room)+{+    size_t minCapacity = blk->offset + room;+    size_t start = blk->offset;+    {+        int changed = 0;+        size_t capacity = blk->capacity;+        while (capacity < minCapacity) {+            capacity = capacity * 2;+            changed = 1;+        }+        if (changed) {+            blk->capacity = capacity;+            blk->block = realloc(blk->block, capacity);+        }+    }+    blk->offset += room;+    return blk->block + start;+}++static void pushType(Block* blk, uint32_t type)+{+    *(uint32_t*)alloc(blk, 4) = type;+    if (blk->mp->locations) {+        int64_t* loc = alloc(blk, 32);+        loc[0] = (int64_t)XML_GetCurrentLineNumber(blk->mp->parser);+        loc[1] = (int64_t)XML_GetCurrentColumnNumber(blk->mp->parser);+        loc[2] = (int64_t)XML_GetCurrentByteIndex(blk->mp->parser);+        loc[3] = (int64_t)XML_GetCurrentByteCount(blk->mp->parser);+    }+}++#define ROUND_UP_32(x) (((x) + 3) & ~3)++static void startElement(+    void *userData,+    const XML_Char *name,+    const XML_Char **atts)+{+    Block* blk = userData;+    size_t nameLen = strlen(name) + 1;+    size_t nAtts, i;+    for (nAtts = 0; atts[nAtts] != NULL; nAtts += 2) ;+    pushType(blk, 1);+    *(uint32_t*)alloc(blk, 4) = nAtts;+    memcpy(alloc(blk, nameLen), name, nameLen);+    for (i = 0; i < nAtts; i++) {+        size_t attLen = strlen(atts[i]) + 1;+        memcpy(alloc(blk, attLen), atts[i], attLen);+    }+    blk->offset = ROUND_UP_32(blk->offset);+}++static void endElement(void *userData, const XML_Char *name)+{+    Block* blk = userData;+    size_t nameLen = strlen(name) + 1;+    pushType(blk, 2);+    memcpy(alloc(blk, nameLen), name, nameLen);+    blk->offset = ROUND_UP_32(blk->offset);+}++static void characterData(+    void *userData,+    const XML_Char *s,+    int len)+{+    Block* blk = userData;+    pushType(blk, 3);+    *(uint32_t*)alloc(blk, 4) = len;+    memcpy(alloc(blk, (size_t)len), s, (size_t)len);+    blk->offset = ROUND_UP_32(blk->offset);+}++static void xmlDeclHandler(void           *userData,+                            const XML_Char *version,+                            const XML_Char *encoding,+                            int             standalone)+{+    Block* blk = userData;+    int verLen = strlen(version) + 1;+    pushType(blk, 4);+    memcpy(alloc(blk, verLen), version, verLen);+    if (encoding != NULL) {+        int encLen = strlen(encoding)+1;+        uint8_t* pEnc = alloc(blk, encLen+1);+        pEnc[0] = 1;+        memcpy(pEnc+1, encoding, encLen);+    }+    else+        *(uint8_t*)alloc(blk, 1) = 0;+    *(int8_t*)alloc(blk, 1) = (int8_t)standalone;+    blk->offset = ROUND_UP_32(blk->offset);+}++static void startCData(void* userData)+{+    Block* blk = userData;+    pushType(blk, 5);+}++static void endCData(void* userData)+{+    Block* blk = userData;+    pushType(blk, 6);+}++static void processingInstruction(void *userData, const XML_Char *target, const XML_Char *data)+{+    Block* blk = userData;+    int targetLen = strlen(target) + 1;+    int dataLen = strlen(data) + 1;+    pushType(blk, 7);+    memcpy(alloc(blk, targetLen), target, targetLen);+    memcpy(alloc(blk, dataLen), data, dataLen);+    blk->offset = ROUND_UP_32(blk->offset);+}++static void comment(void* userData, const XML_Char *text)+{+    Block* blk = userData;+    int textLen = strlen(text) + 1;+    pushType(blk, 8);+    memcpy(alloc(blk, textLen), text, textLen);+    blk->offset = ROUND_UP_32(blk->offset);+}++MyParser* hexpatNewParser(const XML_Char* encoding, int locations)+{+    MyParser* mp = malloc(sizeof(MyParser));+    XML_Parser p = XML_ParserCreate(encoding);+    XML_SetStartElementHandler(p, startElement);+    XML_SetEndElementHandler(p, endElement);+    XML_SetCharacterDataHandler(p, characterData);+    XML_SetXmlDeclHandler(p, xmlDeclHandler);+    XML_SetCdataSectionHandler(p, startCData, endCData);+    XML_SetProcessingInstructionHandler(p, processingInstruction);+    XML_SetCommentHandler(p, comment);+    mp->parser = p;+    mp->locations = locations;+    return mp;+}++void hexpatFreeParser(MyParser* mp)+{+    XML_ParserFree(mp->parser);+    free(mp);+}++static int externalEntityRef(XML_Parser parser,+                                const XML_Char *context,+                                const XML_Char *base,+                                const XML_Char *systemId,+                                const XML_Char *publicId)+{+    if (systemId == NULL && publicId == NULL) {+        XML_Parser eep = XML_ExternalEntityParserCreate(parser, context, NULL);+        enum XML_Status ret = XML_Parse(eep, "", 0, XML_TRUE);+        if (ret == XML_STATUS_OK) {+            XML_ParserFree(eep);+        }+        else {+            XML_ParserFree(eep);+            XML_StopParser(parser, 0);+        }+    }+    else+        XML_StopParser(parser, 0);+}++static void skippedEntity(void *userData,+                           const XML_Char *entityName,+                           int is_parameter_entity)+{+    Block* blk = userData;+    if (is_parameter_entity)+        XML_StopParser(blk->mp->parser, 0);+    else {+        XML_Char* out = blk->mp->decoder(entityName);+        if (out != NULL) {+            characterData(blk, out, strlen(out));+            free(out);+        }+        else+            XML_StopParser(blk->mp->parser, 0);+    }+}++enum XML_Status hexpatParse(+    MyParser* mp,+    const char* s,+    int len,+    int isFinal,+    uint8_t** buffer,+    int* length)+{+    enum XML_Status ret;+    Block blk;+    blk.offset = 0;+    blk.capacity = 256;+    blk.block = malloc(blk.capacity);+    blk.mp = mp;+    XML_SetUserData(mp->parser, &blk);+    ret = XML_Parse(mp->parser, s, len, isFinal);+    *(uint32_t*)alloc(&blk, 4) = 0;+    *buffer = blk.block;+    *length = (int)blk.offset;+    return ret;+}++void hexpatSetEntityHandler(+    MyParser* mp,+    XML_Char* (*decoder)(const XML_Char*))+{+    mp->decoder = decoder;+    XML_UseForeignDTD(mp->parser, XML_TRUE);+    XML_SetExternalEntityRefHandler(mp->parser, externalEntityRef);+    XML_SetSkippedEntityHandler(mp->parser, skippedEntity);+}++XML_Parser hexpatGetParser(MyParser* mp)+{+    return mp->parser;+}
Text/XML/Expat/Internal/IO.hs view
@@ -1,94 +1,32 @@ {-# LANGUAGE ForeignFunctionInterface, EmptyDataDecls #-}+{-# OPTIONS_GHC -fno-cse -fno-full-laziness #-} + -- | Low-level interface to Expat. Unless speed is paramount, this should -- normally be avoided in favour of the interfaces provided by--- 'Text.XML.Expat.SAX' and 'Text.XML.Expat.Tree', etc.  Basic usage is:------ (1) Make a new parser: 'newParser'.------ (2) Set up callbacks on the parser: 'setStartElementHandler', etc.------ (3) Feed data into the parser: 'parse', 'parse'' or 'parseChunk'.  Some of---     these functions must be wrapped in 'withParser'.-+-- 'Text.XML.Expat.SAX' and 'Text.XML.Expat.Tree', etc. module Text.XML.Expat.Internal.IO (-  -- ** Parser Setup-  Parser, newParser,--  -- ** Parsing-  parse, parse',-  withParser,-  ParserPtr, Parser_struct,-  parseChunk,+  HParser,+  hexpatNewParser,+  encodingToString,   Encoding(..),   XMLParseError(..),-  getParseLocation,-  XMLParseLocation(..),--  -- ** Parser Callbacks-  XMLDeclarationHandler,-  StartElementHandler,-  EndElementHandler,-  CharacterDataHandler,-  ExternalEntityRefHandler,-  SkippedEntityHandler,-  StartCDataHandler,-  EndCDataHandler,-  CommentHandler,-  ProcessingInstructionHandler,-  setXMLDeclarationHandler,-  setStartElementHandler,-  setEndElementHandler,-  setCharacterDataHandler,-  setStartCDataHandler,-  setEndCDataHandler,-  setProcessingInstructionHandler,-  setCommentHandler,-  setExternalEntityRefHandler,-  setSkippedEntityHandler,-  setUseForeignDTD,--  -- ** Lower-level interface-  parseExternalEntityReference,-  ExpatHandlers,--  -- ** Helpers-  encodingToString+  XMLParseLocation(..)   ) where -import Control.Concurrent-import Control.Exception (bracket)+import Control.Applicative import Control.DeepSeq-import Control.Monad-import qualified Data.ByteString as BS-import qualified Data.ByteString.Lazy as BSL-import Data.IORef-import Foreign hiding (unsafePerformIO)+import qualified Data.ByteString as B+import qualified Data.ByteString.Internal as I+import Data.Int+import Data.Word+import Foreign import Foreign.C-import System.IO.Unsafe (unsafePerformIO)  --- |Opaque parser type. data Parser_struct type ParserPtr = Ptr Parser_struct-data Parser = Parser-    { _parserObj                    :: ForeignPtr Parser_struct-    , _xmlDeclarationHandler        :: IORef CXMLDeclarationHandler-    , _startElementHandler          :: IORef CStartElementHandler-    , _endElementHandler            :: IORef CEndElementHandler-    , _cdataHandler                 :: IORef CCharacterDataHandler-    , _externalEntityRefHandler     :: IORef (Maybe CExternalEntityRefHandler)-    , _skippedEntityHandler         :: IORef (Maybe CSkippedEntityHandler)-    , _startCDataHandler            :: IORef CStartCDataHandler-    , _endCDataHandler              :: IORef CEndCDataHandler-    , _processingInstructionHandler :: IORef CProcessingInstructionHandler-    , _commentHandler               :: IORef CCommentHandler-    } -instance Show Parser where-    showsPrec _ (Parser fp _ _ _ _ _ _ _ _ _ _) = showsPrec 0 fp---- |Encoding types available for the document encoding. data Encoding = ASCII | UTF8 | UTF16 | ISO88591 encodingToString :: Encoding -> String encodingToString ASCII    = "US-ASCII"@@ -100,99 +38,16 @@ withOptEncoding Nothing    f = f nullPtr withOptEncoding (Just enc) f = withCString (encodingToString enc) f --parserCreate :: Maybe Encoding -> IO (ParserPtr)-parserCreate a1 =-  withOptEncoding a1 $ \a1' -> do-      pp <- parserCreate'_ a1'-      xmlSetUserData pp pp-      return pp---- | Create a 'Parser'.-newParser :: Maybe Encoding -> IO Parser-newParser enc = do-  ptr          <- parserCreate enc-  fptr         <- newForeignPtr parserFree ptr-  nullXMLDeclH <- newIORef nullCXMLDeclarationHandler-  nullStartH   <- newIORef nullCStartElementHandler-  nullEndH     <- newIORef nullCEndElementHandler-  nullCharH    <- newIORef nullCCharacterDataHandler-  extH         <- newIORef Nothing-  skipH        <- newIORef Nothing-  nullSCDataH  <- newIORef nullCStartCDataHandler-  nullECDataH  <- newIORef nullCEndCDataHandler-  nullPIH      <- newIORef nullCProcessingInstructionHandler-  nullCommentH <- newIORef nullCCommentHandler--  return $ Parser fptr nullXMLDeclH nullStartH nullEndH nullCharH extH skipH -    nullSCDataH nullECDataH nullPIH nullCommentH-  -setUseForeignDTD :: Parser -> Bool -> IO ()-setUseForeignDTD p b = withParser p $ \p' -> xmlUseForeignDTD p' b'-  where-    b' = if b then 1 else 0- -- ByteString.useAsCStringLen is almost what we need, but C2HS wants a CInt -- instead of an Int.-withBStringLen :: BS.ByteString -> ((CString, CInt) -> IO a) -> IO a+withBStringLen :: B.ByteString -> ((CString, CInt) -> IO a) -> IO a withBStringLen bs f = do-  BS.useAsCStringLen bs $ \(str, len) -> f (str, fromIntegral len)+  B.useAsCStringLen bs $ \(str, len) -> f (str, fromIntegral len)  unStatus :: CInt -> Bool unStatus 0 = False unStatus _ = True --- |@parse data@ feeds /lazy/ ByteString data into a 'Parser'. It returns--- Nothing on success, or Just the parse error.-parse :: Parser -> BSL.ByteString -> IO (Maybe XMLParseError)-parse parser bs = withParser parser $ \pp -> do-    let-        doParseChunks [] = doParseChunk pp BS.empty True-        doParseChunks (c:cs) = do-            ok <- doParseChunk pp c False-            if ok-                then doParseChunks cs-                else return False-    ok <- doParseChunks (BSL.toChunks bs)-    if ok-        then return Nothing-        else Just `fmap` getError pp---- |@parse data@ feeds /strict/ ByteString data into a 'Parser'. It returns--- Nothing on success, or Just the parse error.-parse' :: Parser -> BS.ByteString -> IO (Maybe XMLParseError)-parse' parser bs = withParser parser $ \pp -> do-    ok <- doParseChunk pp bs True-    if ok-        then return Nothing-        else Just `fmap` getError pp--parseExternalEntityReference :: Parser-                             -> CString         -- ^ context-                             -> Maybe Encoding  -- ^ encoding-                             -> CStringLen      -- ^ text-                             -> IO Bool-parseExternalEntityReference parser context encoding (text,sz) =-    withParser parser $ \pp -> do-        extp <- withOptEncoding encoding $-                xmlExternalEntityParserCreate pp context-        e <- doParseChunk'_ extp text (fromIntegral sz) 1-        parserFree' extp-        return $ e == 1---- |@parseChunk data False@ feeds /strict/ ByteString data into a--- 'Parser'.  The end of the data is indicated by passing @True@ for the--- final parameter.   It returns Nothing on success, or Just the parse error.-parseChunk :: ParserPtr-           -> BS.ByteString-           -> Bool-           -> IO (Maybe XMLParseError)-parseChunk pp xml final = do-    ok <- doParseChunk pp xml final-    if ok-        then return Nothing-        else Just `fmap` getError pp- getError :: ParserPtr -> IO XMLParseError getError pp = do     code <- xmlGetErrorCode pp@@ -201,146 +56,10 @@     loc <- getParseLocation pp     return $ XMLParseError err loc -data ExpatHandlers = ExpatHandlers-    (FunPtr CXMLDeclarationHandler)-    (FunPtr CStartElementHandler)-    (FunPtr CEndElementHandler)-    (FunPtr CCharacterDataHandler)-    (Maybe (FunPtr CExternalEntityRefHandler))-    (Maybe (FunPtr CSkippedEntityHandler))-    (FunPtr CStartCDataHandler)-    (FunPtr CEndCDataHandler)-    (FunPtr CProcessingInstructionHandler)-    (FunPtr CCommentHandler)---- | Most of the low-level functions take a ParserPtr so are required to be--- called inside @withParser@.-withParser :: Parser-           -> (ParserPtr -> IO a)  -- ^ Computation where parseChunk and other low-level functions may be used-           -> IO a-withParser parser@(Parser fp _ _ _ _ _ _ _ _ _ _) code = withForeignPtr fp $ \pp -> do-    bracket-        (unsafeSetHandlers parser pp)-        unsafeReleaseHandlers-        (\_ -> code pp)-  where-    unsafeSetHandlers :: Parser -> ParserPtr -> IO ExpatHandlers-    unsafeSetHandlers (Parser _ xmlDeclRef startRef endRef charRef extRef skipRef -        startCDataRef endCDataRef processingInstructionRef commentRef) pp =-      do-        cXMLDeclH <- mkCXMLDeclarationHandler =<< readIORef xmlDeclRef-        cStartH <- mkCStartElementHandler =<< readIORef startRef-        cEndH   <- mkCEndElementHandler =<< readIORef endRef-        cCharH  <- mkCCharacterDataHandler =<< readIORef charRef-        mExtH   <- readIORef extRef >>=-                       maybe (return Nothing)-                             (\h -> liftM Just $ mkCExternalEntityRefHandler h)-    -        mSkipH  <- readIORef skipRef >>=-                       maybe (return Nothing)-                             (\h -> liftM Just $ mkCSkippedEntityHandler h)-                             -        cStartCDataH <- mkCStartCDataHandler =<< readIORef startCDataRef-        cEndCDataH   <- mkCEndCDataHandler =<< readIORef endCDataRef-        -        cProcessingInstructionH   <- mkCProcessingInstructionHandler =<< readIORef processingInstructionRef-        cCommentH   <- mkCCommentHandler =<< readIORef commentRef-    -        xmlSetxmldeclhandler       pp cXMLDeclH-        xmlSetstartelementhandler  pp cStartH-        xmlSetendelementhandler    pp cEndH-        xmlSetcharacterdatahandler pp cCharH-        xmlSetstartcdatahandler  pp cStartCDataH-        xmlSetendcdatahandler    pp cEndCDataH-        xmlSetprocessinginstructionhandler pp cProcessingInstructionH-        xmlSetcommenthandler pp cCommentH-        maybe (return ())-              (xmlSetExternalEntityRefHandler pp)-              mExtH-        maybe (return ())-              (xmlSetSkippedEntityHandler pp)-              mSkipH-    -        return $ ExpatHandlers cXMLDeclH cStartH cEndH cCharH mExtH mSkipH -            cStartCDataH cEndCDataH cProcessingInstructionH cCommentH-    -    unsafeReleaseHandlers :: ExpatHandlers -> IO ()-    unsafeReleaseHandlers (ExpatHandlers cXMLDeclH cStartH cEndH cCharH mcExtH mcSkipH -            cStartCDataH cEndCDataH cProcessingInstructionH cCommentH) = do-        freeHaskellFunPtr cXMLDeclH-        freeHaskellFunPtr cStartH-        freeHaskellFunPtr cEndH-        freeHaskellFunPtr cCharH-        maybe (return ()) freeHaskellFunPtr mcExtH-        maybe (return ()) freeHaskellFunPtr mcSkipH-        freeHaskellFunPtr cStartCDataH-        freeHaskellFunPtr cEndCDataH-        freeHaskellFunPtr cProcessingInstructionH-        freeHaskellFunPtr cCommentH- -- |Obtain C value from Haskell 'Bool'. -- cFromBool :: Num a => Bool -> a-cFromBool  = fromBool--doParseChunk :: ParserPtr -> BS.ByteString -> Bool -> IO (Bool)-doParseChunk = ensureBoundThread $ \a1 a2 a3 ->-  withBStringLen a2 $ \(a2'1, a2'2) ->-  let {a3' = cFromBool a3} in-  doParseChunk'_ a1 a2'1  a2'2 a3' >>= \res ->-  let {res' = unStatus res} in-  return (res')--data WorkerIface = WorkerIface (MVar (ParserPtr, BS.ByteString, Bool)) (MVar Bool)--workerIfaceRef :: IORef (Maybe WorkerIface)-{-# NOINLINE workerIfaceRef #-}-workerIfaceRef = unsafePerformIO $ newIORef Nothing---- If the calling thread is not bound, we delegate to a bound thread, because--- otherwise we get a thread explosion (this is true in ghc-6.12.X).--- See test/thread-leak/ directory for a test case.-ensureBoundThread :: (ParserPtr -> BS.ByteString -> Bool -> IO Bool)-                  -> ParserPtr-                  -> BS.ByteString-                  -> Bool-                  -> IO Bool-ensureBoundThread doit p bs last = do-    bound <- isCurrentThreadBound-    if rtsSupportsBoundThreads && not bound-        then delegate-        else doit p bs last-  where-    delegate = do-        mIface <- readIORef workerIfaceRef-        case mIface of-            Just iface -> pipeTo iface-            Nothing -> do-                inV <- newEmptyMVar-                outV <- newEmptyMVar-                let iface = WorkerIface inV outV-                justSetItGlobally <- atomicModifyIORef workerIfaceRef $ \mIface ->-                    case mIface of-                        Just _  -> (mIface, False)-                        Nothing -> (Just iface, True) -                if justSetItGlobally-                    then do-                        _ <- forkOS $ worker iface-                        pipeTo iface-                    else-                        -- If it wasn't changed, then this is because we got a race-                        -- condition with another thread.  We resolve this by trying-                        -- again.  We'll succeed on the second attempt.  The mvars-                        -- we allocated here will be GC'd.-                        delegate--    pipeTo (WorkerIface inV outV) =-        putMVar inV (p, bs, last) >> takeMVar outV--    worker (WorkerIface inV outV) = forever $-        putMVar outV =<< uncurry3 doit =<< takeMVar inV-      where-        uncurry3 f (a, b, c) = f a b c +cFromBool = fromBool  -- | Parse error, consisting of message text and error location data XMLParseError = XMLParseError String XMLParseLocation deriving (Eq, Show)@@ -373,373 +92,6 @@             xmlByteCount = fromIntegral count         } --- | The type of the \"XML declaration\" callback.  Parameters are version,--- encoding (which can be nullPtr), and standalone declaration, where -1 = no--- declaration, 0 = "no" and 1 = "yes". Return True to continue parsing as--- normal, or False to terminate the parse.-type XMLDeclarationHandler = ParserPtr -> CString -> CString -> CInt -> IO Bool---- | The type of the \"element started\" callback.  The first parameter is the--- element name; the second are the (attribute, value) pairs. Return True to--- continue parsing as normal, or False to terminate the parse.-type StartElementHandler  = ParserPtr -> CString -> [(CString, CString)] -> IO Bool---- | The type of the \"element ended\" callback.  The parameter is the element--- name. Return True to continue parsing as normal, or False to terminate the--- parse.-type EndElementHandler    = ParserPtr -> CString -> IO Bool---- | The type of the \"character data\" callback.  The parameter is the--- character data processed.  This callback may be called more than once while--- processing a single conceptual block of text. Return True to continue--- parsing as normal, or False to terminate the parse.-type CharacterDataHandler = ParserPtr -> CStringLen -> IO Bool---- | The type of the \"start cdata\" callback.   Return True to continue--- parsing as normal, or False to terminate the parse.-type StartCDataHandler = ParserPtr -> IO Bool---- | The type of the \"end cdata\" callback.   Return True to continue--- parsing as normal, or False to terminate the parse.-type EndCDataHandler = ParserPtr -> IO Bool---- | The type of the \"processing instruction\" callback.  The first parameter--- is the first word in the processing instruction.  The second parameter is--- the rest of the characters in the processing instruction after skipping all--- whitespace after the initial word. Return True to continue parsing as normal,--- or False to terminate the parse.-type ProcessingInstructionHandler = ParserPtr -> CString -> CString -> IO Bool---- | The type of the \"comment\" callback.  The parameter is the comment text.--- Return True to continue parsing as normal, or False to terminate the parse.-type CommentHandler = ParserPtr -> CString -> IO Bool---- | The type of the \"external entity reference\" callback. See the expat--- documentation.-type ExternalEntityRefHandler =  Parser-                              -> CString   -- context-                              -> CString   -- base-                              -> CString   -- systemID-                              -> CString   -- publicID-                              -> IO Bool---- | Set a skipped entity handler. This is called in two situations:------ 1. An entity reference is encountered for which no declaration has been read--- and this is not an error.------ 2. An internal entity reference is read, but not expanded, because--- @XML_SetDefaultHandler@ has been called.-type SkippedEntityHandler =  ParserPtr-                          -> CString   -- entityName-                          -> Int       -- is a parameter entity?-                          -> IO Bool---type CXMLDeclarationHandler = ParserPtr -> CString -> CString -> CInt -> IO ()--nullCXMLDeclarationHandler :: CXMLDeclarationHandler-nullCXMLDeclarationHandler _ _ _ _ = return ()--foreign import ccall safe "wrapper"-  mkCXMLDeclarationHandler :: CXMLDeclarationHandler-                           -> IO (FunPtr CXMLDeclarationHandler)--wrapXMLDeclarationHandler :: Parser -> XMLDeclarationHandler -> CXMLDeclarationHandler-wrapXMLDeclarationHandler parser handler = h-  where-    h pp ver enc sd | ver /= nullPtr = do-        stillRunning <- handler pp ver enc sd-        unless stillRunning $ stopp parser-    {- From expat.h:-       The XML declaration handler is called for *both* XML declarations-       and text declarations. The way to distinguish is that the version-       parameter will be NULL for text declarations.-     -}-    h _ _ _ _ = return ()  -- text declaration (ignore)---- | Attach a XMLDeclarationHandler to a Parser.-setXMLDeclarationHandler :: Parser -> XMLDeclarationHandler -> IO ()-setXMLDeclarationHandler parser@(Parser _ xmlDeclRef _ _ _ _ _ _ _ _ _) handler =-    writeIORef xmlDeclRef $ wrapXMLDeclarationHandler parser handler---type CStartElementHandler = ParserPtr -> CString -> Ptr CString -> IO ()--nullCStartElementHandler :: CStartElementHandler-nullCStartElementHandler _ _ _ = return ()--foreign import ccall safe "wrapper"-  mkCStartElementHandler :: CStartElementHandler-                         -> IO (FunPtr CStartElementHandler)--wrapStartElementHandler :: Parser -> StartElementHandler -> CStartElementHandler-wrapStartElementHandler parser handler = h-  where-    h pp cname cattrs = do-        cattrlist <- peekArray0 nullPtr cattrs-        stillRunning <- handler pp cname (pairwise cattrlist)-        unless stillRunning $ stopp parser---- | Attach a StartElementHandler to a Parser.-setStartElementHandler :: Parser -> StartElementHandler -> IO ()-setStartElementHandler parser@(Parser _ _ startRef _ _ _ _ _ _ _ _) handler =-    writeIORef startRef $ wrapStartElementHandler parser handler---type CEndElementHandler = ParserPtr -> CString -> IO ()--nullCEndElementHandler :: CEndElementHandler-nullCEndElementHandler _ _ = return ()--foreign import ccall safe "wrapper"-  mkCEndElementHandler :: CEndElementHandler-                       -> IO (FunPtr CEndElementHandler)-wrapEndElementHandler :: Parser -> EndElementHandler -> CEndElementHandler-wrapEndElementHandler parser handler = h-  where-    h pp cname = do-        stillRunning <- handler pp cname-        unless stillRunning $ stopp parser---- | Attach an EndElementHandler to a Parser.-setEndElementHandler :: Parser -> EndElementHandler -> IO ()-setEndElementHandler parser@(Parser _ _ _ endRef _ _ _ _ _ _ _) handler =-    writeIORef endRef $ wrapEndElementHandler parser handler---type CCharacterDataHandler = ParserPtr -> CString -> CInt -> IO ()--nullCCharacterDataHandler :: CCharacterDataHandler-nullCCharacterDataHandler _ _ _ = return ()--foreign import ccall safe "wrapper"-  mkCCharacterDataHandler :: CCharacterDataHandler-                          -> IO (FunPtr CCharacterDataHandler)-wrapCharacterDataHandler :: Parser -> CharacterDataHandler -> CCharacterDataHandler-wrapCharacterDataHandler parser handler = h-  where-    h pp cdata len = do-        stillRunning <- handler pp (cdata, fromIntegral len)-        unless stillRunning $ stopp parser---- | Attach an CharacterDataHandler to a Parser.-setCharacterDataHandler :: Parser -> CharacterDataHandler -> IO ()-setCharacterDataHandler parser@(Parser _ _ _ _ charRef _ _ _ _ _ _) handler =-    writeIORef charRef $ wrapCharacterDataHandler parser handler---type CStartCDataHandler = ParserPtr -> IO ()--nullCStartCDataHandler :: CStartCDataHandler-nullCStartCDataHandler _ = return ()--foreign import ccall safe "wrapper"-  mkCStartCDataHandler :: CStartCDataHandler-                         -> IO (FunPtr CStartCDataHandler)--wrapStartCDataHandler :: Parser -> StartCDataHandler -> CStartCDataHandler-wrapStartCDataHandler parser handler = h-  where-    h pp = do-        stillRunning <- handler pp-        unless stillRunning $ stopp parser---- | Attach a StartCDataHandler to a Parser.-setStartCDataHandler :: Parser -> StartCDataHandler -> IO ()-setStartCDataHandler parser@(Parser _ _ _ _ _ _ _ startCData _ _ _) handler =-    writeIORef startCData $ wrapStartCDataHandler parser handler---type CEndCDataHandler = ParserPtr -> IO ()--nullCEndCDataHandler :: CEndCDataHandler-nullCEndCDataHandler _ = return ()--foreign import ccall safe "wrapper"-  mkCEndCDataHandler :: CEndCDataHandler-                         -> IO (FunPtr CEndCDataHandler)--wrapEndCDataHandler :: Parser -> EndCDataHandler -> CEndCDataHandler-wrapEndCDataHandler parser handler = h-  where-    h pp = do-        stillRunning <- handler pp-        unless stillRunning $ stopp parser---- | Attach a EndCDataHandler to a Parser.-setEndCDataHandler :: Parser -> EndCDataHandler -> IO ()-setEndCDataHandler parser@(Parser _ _ _ _ _ _ _ _ endCData _ _) handler =-    writeIORef endCData $ wrapEndCDataHandler parser handler---type CProcessingInstructionHandler = ParserPtr -> CString -> CString -> IO ()--nullCProcessingInstructionHandler :: CProcessingInstructionHandler-nullCProcessingInstructionHandler _ _ _ = return ()--foreign import ccall safe "wrapper"-  mkCProcessingInstructionHandler :: CProcessingInstructionHandler-                          -> IO (FunPtr CProcessingInstructionHandler)-                          -wrapProcessingInstructionHandler :: Parser -> ProcessingInstructionHandler -> CProcessingInstructionHandler-wrapProcessingInstructionHandler parser handler = h-  where-    h pp ctarget cdata = do-        stillRunning <- handler pp ctarget cdata-        unless stillRunning $ stopp parser---- | Attach a ProcessingInstructionHandler to a Parser.-setProcessingInstructionHandler :: Parser -> ProcessingInstructionHandler -> IO ()-setProcessingInstructionHandler parser@(Parser _ _ _ _ _ _ _ _ _ piRef _) handler =-    writeIORef piRef $ wrapProcessingInstructionHandler parser handler---type CCommentHandler = ParserPtr -> CString -> IO ()--nullCCommentHandler :: CCommentHandler-nullCCommentHandler _ _ = return ()--foreign import ccall safe "wrapper"-  mkCCommentHandler :: CCommentHandler-                          -> IO (FunPtr CCommentHandler)-                          -wrapCommentHandler :: Parser -> CommentHandler -> CCommentHandler-wrapCommentHandler parser handler = h-  where-    h pp cdata = do-        stillRunning <- handler pp cdata-        unless stillRunning $ stopp parser---- | Attach a CommentHandler to a Parser.-setCommentHandler :: Parser -> CommentHandler -> IO ()-setCommentHandler parser@(Parser _ _ _ _ _ _ _ _ _ _ commentRef) handler =-    writeIORef commentRef $ wrapCommentHandler parser handler---pairwise :: [a] -> [(a,a)]-pairwise (x1:x2:xs) = (x1,x2) : pairwise xs-pairwise _          = []--stopp :: Parser -> IO ()-stopp parser = withParser parser $ \p -> xmlStopParser p 0----------------------------------------------------------------------------------- C imports--foreign import ccall unsafe "XML_ParserCreate"-  parserCreate'_ :: Ptr CChar -> IO ParserPtr-  -foreign import ccall unsafe "XML_SetUserData"-  xmlSetUserData :: ParserPtr -> ParserPtr -> IO ()--foreign import ccall unsafe "XML_SetXmlDeclHandler"-  xmlSetxmldeclhandler :: ParserPtr -> FunPtr CXMLDeclarationHandler -> IO ()--foreign import ccall unsafe "XML_SetStartElementHandler"-  xmlSetstartelementhandler :: ParserPtr -> ((FunPtr (ParserPtr -> ((Ptr CChar) -> ((Ptr (Ptr CChar)) -> (IO ())))) -> (IO ())))--foreign import ccall unsafe "XML_SetEndElementHandler"-  xmlSetendelementhandler :: ParserPtr -> ((FunPtr (ParserPtr -> ((Ptr CChar) -> (IO ()))) -> (IO ())))-  -foreign import ccall unsafe "XML_SetCharacterDataHandler"-  xmlSetcharacterdatahandler :: ParserPtr -> ((FunPtr (ParserPtr -> ((Ptr CChar) -> (CInt -> (IO ())))) -> (IO ())))-  -foreign import ccall unsafe "XML_SetStartCdataSectionHandler"-  xmlSetstartcdatahandler :: ParserPtr -> FunPtr CStartCDataHandler -> IO ()--foreign import ccall unsafe "XML_SetEndCdataSectionHandler"-  xmlSetendcdatahandler :: ParserPtr -> FunPtr CStartCDataHandler -> IO ()-  -foreign import ccall unsafe "XML_SetCommentHandler"-  xmlSetcommenthandler :: ParserPtr -> ((FunPtr (ParserPtr -> ((Ptr CChar) -> (IO ()))) -> (IO ())))-  -foreign import ccall unsafe "XML_SetProcessingInstructionHandler"-  xmlSetprocessinginstructionhandler :: ParserPtr -> ((FunPtr (ParserPtr -> ((Ptr CChar) -> ((Ptr CChar) -> (IO ())))) -> (IO ())))--foreign import ccall safe "XML_Parse"-  doParseChunk'_ :: ParserPtr -> ((Ptr CChar) -> (CInt -> (CInt -> (IO CInt))))--foreign import ccall unsafe "XML_UseForeignDTD"-  xmlUseForeignDTD :: ParserPtr     -- ^ parser-                   -> CChar         -- ^ use foreign DTD? (external entity ref-                                    -- handler will be called with publicID &-                                    -- systemID set to null-                   -> IO ()--foreign import ccall "&XML_ParserFree" parserFree :: FunPtr (ParserPtr -> IO ())-foreign import ccall "XML_ParserFree" parserFree' :: ParserPtr -> IO ()--type CExternalEntityRefHandler = ParserPtr   -- parser-                              -> Ptr CChar   -- context-                              -> Ptr CChar   -- base-                              -> Ptr CChar   -- systemID-                              -> Ptr CChar   -- publicID-                              -> IO ()--foreign import ccall unsafe "wrapper"-  mkCExternalEntityRefHandler :: CExternalEntityRefHandler-                              -> IO (FunPtr CExternalEntityRefHandler)---foreign import ccall unsafe "XML_SetExternalEntityRefHandler"-  xmlSetExternalEntityRefHandler :: ParserPtr-                                 -> FunPtr CExternalEntityRefHandler-                                 -> IO ()--foreign import ccall unsafe "XML_SetSkippedEntityHandler"-  xmlSetSkippedEntityHandler :: ParserPtr-                             -> FunPtr CSkippedEntityHandler-                             -> IO ()--foreign import ccall unsafe "XML_ExternalEntityParserCreate"-  xmlExternalEntityParserCreate :: ParserPtr-                                -> CString   -- ^ context-                                -> CString   -- ^ encoding-                                -> IO ParserPtr--type CSkippedEntityHandler =  ParserPtr -- user data pointer-                           -> CString   -- entity name-                           -> CInt      -- is a parameter entity?-                           -> IO ()--foreign import ccall safe "wrapper"-  mkCSkippedEntityHandler :: CSkippedEntityHandler-                          -> IO (FunPtr CSkippedEntityHandler)---wrapExternalEntityRefHandler :: Parser-                             -> ExternalEntityRefHandler-                             -> CExternalEntityRefHandler-wrapExternalEntityRefHandler parser handler = h-  where-    h _ context base systemID publicID = do-        stillRunning <- handler parser context base systemID publicID-        unless stillRunning $ stopp parser---wrapSkippedEntityHandler :: Parser-                         -> SkippedEntityHandler-                         -> CSkippedEntityHandler-wrapSkippedEntityHandler parser handler = h-  where-    h pp entityName i = do-        stillRunning <- handler pp entityName (fromIntegral i)-        unless stillRunning $ stopp parser---setExternalEntityRefHandler :: Parser -> ExternalEntityRefHandler -> IO ()-setExternalEntityRefHandler parser h =-    writeIORef ref $ Just $ wrapExternalEntityRefHandler parser h-  where-    ref = _externalEntityRefHandler parser--setSkippedEntityHandler :: Parser -> SkippedEntityHandler -> IO ()-setSkippedEntityHandler parser h =-    writeIORef ref $ Just $ wrapSkippedEntityHandler parser h-  where-    ref = _skippedEntityHandler parser- -- Note on word sizes: -- -- on expat 2.0:@@ -774,6 +126,96 @@     :: ParserPtr -> IO CInt foreign import ccall unsafe "expat.h XML_ErrorString" xmlErrorString     :: CInt -> IO CString-foreign import ccall unsafe "expat.h XML_StopParser" xmlStopParser-    :: ParserPtr -> CInt -> IO ()++type HParser = B.ByteString -> Bool -> IO (ForeignPtr Word8, CInt, Maybe XMLParseError)++foreign import ccall unsafe "hexpatNewParser"+  _hexpatNewParser :: Ptr CChar -> CInt -> IO MyParserPtr++foreign import ccall unsafe "hexpatGetParser"+  _hexpatGetParser :: MyParserPtr -> ParserPtr++data MyParser_struct+type MyParserPtr = Ptr MyParser_struct++foreign import ccall "&hexpatFreeParser" hexpatFreeParser :: FunPtr (MyParserPtr -> IO ())++hexpatNewParser :: Maybe Encoding+                -> Maybe (B.ByteString -> Maybe B.ByteString)  -- ^ Entity decoder+                -> Bool        -- ^ Whether to include input locations+                -> IO (HParser, IO XMLParseLocation)+hexpatNewParser enc mDecoder locations =+    withOptEncoding enc $ \cEnc -> do+        parser <- newForeignPtr hexpatFreeParser =<< _hexpatNewParser cEnc (cFromBool locations)+        return (parse parser, withForeignPtr parser $ \mp -> getParseLocation $ _hexpatGetParser mp)+  where+    parse parser = case mDecoder of+        Nothing -> \text final ->+            alloca $ \ppData ->+            alloca $ \pLen ->+            withBStringLen text $ \(textBuf, textLen) ->+            withForeignPtr parser $ \pp -> do+                ok <- unStatus <$> _hexpatParseUnsafe pp textBuf textLen (cFromBool final) ppData pLen+                pData <- peek ppData+                len <- peek pLen+                err <- if ok+                    then return Nothing+                    else Just <$> getError (_hexpatGetParser pp)+                fpData <- newForeignPtr funPtrFree pData+                return (fpData, len, err)+        Just decoder -> \text final ->+            alloca $ \ppData ->+            alloca $ \pLen ->+            withBStringLen text $ \(textBuf, textLen) ->+            withForeignPtr parser $ \pp -> do+                eh <- mkCEntityHandler . wrapCEntityHandler $ decoder+                _hexpatSetEntityHandler pp eh+                ok <- unStatus <$> _hexpatParseSafe pp textBuf textLen (cFromBool final) ppData pLen+                freeHaskellFunPtr eh+                pData <- peek ppData+                len <- peek pLen+                err <- if ok+                    then return Nothing+                    else Just <$> getError (_hexpatGetParser pp)+                fpData <- newForeignPtr funPtrFree pData+                return (fpData, len, err)++foreign import ccall unsafe "hexpatParse"+  _hexpatParseUnsafe :: MyParserPtr -> Ptr CChar -> CInt -> CInt -> Ptr (Ptr Word8) -> Ptr CInt -> IO CInt++foreign import ccall safe "hexpatParse"+  _hexpatParseSafe :: MyParserPtr -> Ptr CChar -> CInt -> CInt -> Ptr (Ptr Word8) -> Ptr CInt -> IO CInt++type CEntityHandler = Ptr CChar -> IO (Ptr CChar)++foreign import ccall safe "wrapper"+  mkCEntityHandler :: CEntityHandler+                   -> IO (FunPtr CEntityHandler)++peekByteStringLen :: CStringLen -> IO B.ByteString+{-# INLINE peekByteStringLen #-}+peekByteStringLen (cstr, len) =+    I.create (fromIntegral len) $ \ptr ->+        I.memcpy ptr (castPtr cstr) (fromIntegral len)++wrapCEntityHandler :: (B.ByteString -> Maybe B.ByteString) -> CEntityHandler+wrapCEntityHandler handler = h+  where+    h cname = do+        sz <- fromIntegral <$> I.c_strlen cname+        name <- peekByteStringLen (cname, sz)+        case handler name of+            Just text -> do+                let (fp, offset, len) = I.toForeignPtr text+                withForeignPtr fp $ \ctextBS -> do+                    ctext <- mallocBytes (len + 1) :: IO CString+                    I.memcpy (castPtr ctext) (ctextBS `plusPtr` offset) (fromIntegral len)+                    poke (ctext `plusPtr` len) (0 :: CChar)+                    return ctext+            Nothing -> return nullPtr++foreign import ccall unsafe "hexpatSetEntityHandler"+  _hexpatSetEntityHandler :: MyParserPtr -> FunPtr CEntityHandler -> IO ()++foreign import ccall "&free" funPtrFree :: FunPtr (Ptr Word8 -> IO ()) 
− Text/XML/Expat/Namespaced.hs
@@ -1,9 +0,0 @@-{-# OPTIONS_HADDOCK hide #-}-module Text.XML.Expat.Namespaced-        {-# DEPRECATED "Use Text.XML.Expat.Text or Text.XML.Expat.Annotated instead" #-}-    (-        module Text.XML.Expat.Internal.Namespaced-    ) where--import Text.XML.Expat.Internal.Namespaced-
− Text/XML/Expat/NodeClass.hs
@@ -1,9 +0,0 @@-{-# OPTIONS_HADDOCK hide #-}-module Text.XML.Expat.NodeClass-       {-# DEPRECATED "Use Text.XML.Expat.Text or Text.XML.Expat.Annotated instead" #-}-    (-        module Text.XML.Expat.Internal.NodeClass-    ) where--import Text.XML.Expat.Internal.NodeClass-
− Text/XML/Expat/Qualified.hs
@@ -1,9 +0,0 @@-{-# OPTIONS_HADDOCK hide #-}-module Text.XML.Expat.Qualified-       {-# DEPRECATED "Use Text.XML.Expat.Text or Text.XML.Expat.Annotated instead" #-}-    (-        module Text.XML.Expat.Internal.Qualified-    ) where--import Text.XML.Expat.Internal.Qualified-
Text/XML/Expat/SAX.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE DeriveDataTypeable, TypeSynonymInstances, CPP, ScopedTypeVariables, FlexibleInstances #-}+{-# OPTIONS_GHC -fno-cse -fno-full-laziness #-}  -- hexpat, a Haskell wrapper for expat -- Copyright (C) 2008 Evan Martin <martine@danga.com>@@ -16,7 +17,6 @@   ParseOptions(..),   SAXEvent(..), -  textFromCString,   parse,   parseG,   parseLocations,@@ -28,41 +28,36 @@   -- * Variants that throw exceptions   XMLParseException(..), -  -- * Helpers-  setEntityDecoder,-   -- * Abstraction of string types-  GenericXMLString(..),--  -- * Deprecated parse functions-  parseSAX,-  parseSAXLocations,-  parseSAXLocationsThrowing,-  parseSAXThrowing,-  ParserOptions,-  defaultParserOptions+  GenericXMLString(..)   ) where -import Text.XML.Expat.Internal.IO hiding (parse)+import Control.Concurrent.MVar+import Text.XML.Expat.Internal.IO+import Data.Bits import Data.ByteString (ByteString) import qualified Data.ByteString as B import qualified Data.ByteString.Lazy as L import qualified Data.ByteString.Internal as I-import Data.IORef+import Data.Int import Data.ByteString.Internal (c2w, w2c, c_strlen) import qualified Data.Monoid as M import qualified Data.Text as T import qualified Data.Text.Encoding as TE import qualified Codec.Binary.UTF8.String as U8-import Data.Typeable import Data.List.Class hiding (tail)+import Data.Typeable+import Data.Word import Control.Exception.Extensible as Exc import Control.Applicative import Control.DeepSeq import Control.Monad import System.IO.Unsafe-import Foreign.C.String+import Foreign.C+import Foreign.ForeignPtr+import Foreign.Marshal.Array import Foreign.Ptr+import Foreign.Storable   data ParseOptions tag text = ParseOptions@@ -74,18 +69,10 @@           -- be decoded into text using the supplied lookup function     } -{-# DEPRECATED ParserOptions "renamed to ParseOptions" #-}-type ParserOptions tag text = ParseOptions tag text- defaultParseOptions :: ParseOptions tag text defaultParseOptions = ParseOptions Nothing Nothing --- | DEPRECATED. Renamed to defaultParseOptions.-defaultParserOptions :: ParseOptions tag text-{-# DEPRECATED defaultParserOptions "renamed to defaultParseOptions" #-}-defaultParserOptions = defaultParseOptions - -- | An abstraction for any string type you want to use as xml text (that is, -- attribute values or element text content). If you want to use a -- new string type with /hexpat/, you must make it an instance of@@ -98,7 +85,7 @@     gxHead :: s -> Char     gxTail :: s -> s     gxBreakOn :: Char -> s -> (s, s)-    gxFromCStringLen :: CStringLen -> IO s+    gxFromByteString :: B.ByteString -> s     gxToByteString :: s -> B.ByteString  instance GenericXMLString String where@@ -109,7 +96,7 @@     gxHead = head     gxTail = tail     gxBreakOn c = break (==c)-    gxFromCStringLen cstr = U8.decode . B.unpack <$> peekByteStringLen cstr+    gxFromByteString = U8.decode . B.unpack     gxToByteString = B.pack . map c2w . U8.encodeString  instance GenericXMLString B.ByteString where@@ -120,7 +107,7 @@     gxHead = w2c . B.head     gxTail = B.tail     gxBreakOn c = B.break (== c2w c)-    gxFromCStringLen = peekByteStringLen+    gxFromByteString = id     gxToByteString = id  instance GenericXMLString T.Text where@@ -140,16 +127,9 @@ #else     gxBreakOn c = T.breakBy (==c) #endif-    gxFromCStringLen cstr = TE.decodeUtf8 <$> peekByteStringLen cstr+    gxFromByteString = TE.decodeUtf8     gxToByteString = TE.encodeUtf8 -peekByteStringLen :: CStringLen -> IO B.ByteString-{-# INLINE peekByteStringLen #-}-peekByteStringLen (cstr, len) =-    I.create (fromIntegral len) $ \ptr ->-        I.memcpy ptr (castPtr cstr) (fromIntegral len)-- data SAXEvent tag text =     XMLDeclaration text (Maybe text) (Maybe Bool) |     StartElement tag [(tag, text)] |@@ -173,139 +153,150 @@     rnf (Comment text) = rnf text     rnf (FailDocument err) = rnf err --- | Converts a 'CString' to a 'GenericXMLString' type.-textFromCString :: GenericXMLString text => CString -> IO text-{-# INLINE textFromCString #-}-textFromCString cstr = do-    len <- c_strlen cstr-    gxFromCStringLen (cstr, fromIntegral len)---- | A helper for configuring the hexpat parser to use the specified entity--- decoder.-setEntityDecoder :: (GenericXMLString tag, GenericXMLString text)-                 => Parser-                 -> (tag -> Maybe text)   -- ^ Entity decoder-                 -> (ParserPtr -> text -> IO ())       -- ^ Code to insert character data into the document-                 -> IO ()-setEntityDecoder parser decoder insertText = do-    setUseForeignDTD parser True-    setExternalEntityRefHandler parser eh-    setSkippedEntityHandler parser skip--  where-    skip _  _ 1 = return False-    skip pp entityName 0 = do-        en <- textFromCString entityName-        let mbt = decoder en-        maybe (return False)-              (\t -> do-                   insertText pp t-                   return True)-              mbt-    skip _ _ _ = undefined--    eh pp ctx _ systemID publicID =-        if systemID == nullPtr && publicID == nullPtr-           then withCStringLen "" $ \c -> do-               parseExternalEntityReference pp ctx Nothing c-           else return False- -- | Parse a generalized list of ByteStrings containing XML to SAX events. -- In the event of an error, FailDocument is the last element of the output list. parseG :: forall tag text l . (GenericXMLString tag, GenericXMLString text, List l) =>           ParseOptions tag text -- ^ Parse options        -> l ByteString          -- ^ Input text (a lazy ByteString)        -> l (SAXEvent tag text)-parseG opts inputBlocks = runParser inputBlocks parser queueRef cacheRef-  where-    (parser, queueRef, cacheRef) = unsafePerformIO $ do-        let enc = overrideEncoding opts-        let mEntityDecoder = entityDecoder opts--        parser <- newParser enc-        queueRef <- newIORef []--        case mEntityDecoder of-            Just deco -> setEntityDecoder parser deco $ \_ txt -> do-                modifyIORef queueRef (CharacterData txt:)-            Nothing -> return ()--        setXMLDeclarationHandler parser $ \_ cVer cEnc cSd -> do-            ver <- textFromCString cVer-            mEnc <- if cEnc == nullPtr-                then return Nothing-                else Just <$> textFromCString cEnc-            let sd = if cSd < 0-                    then Nothing-                    else Just $ if cSd /= 0 then True else False-            modifyIORef queueRef (XMLDeclaration ver mEnc sd:)-            return True--        setStartElementHandler parser $ \_ cName cAttrs -> do-            name <- textFromCString cName-            attrs <- forM cAttrs $ \(cAttrName,cAttrValue) -> do-                attrName <- textFromCString cAttrName-                attrValue <- textFromCString cAttrValue-                return (attrName, attrValue)-            modifyIORef queueRef (StartElement name attrs:)-            return True+{-# NOINLINE parseG #-}+parseG opts inputBlocks = mapL (return . fst) $ parseImpl opts inputBlocks False noExtra failureA+  where noExtra _ offset = return ((), offset)+        failureA _ = return () -        setEndElementHandler parser $ \_ cName -> do-            name <- textFromCString cName-            modifyIORef queueRef (EndElement name:)-            return True+-- | Parse a generalized list of ByteStrings containing XML to SAX events.+-- In the event of an error, FailDocument is the last element of the output list.+parseLocationsG :: forall tag text l . (GenericXMLString tag, GenericXMLString text, List l) =>+                   ParseOptions tag text -- ^ Parse options+                -> l ByteString          -- ^ Input text (a lazy ByteString)+                -> l (SAXEvent tag text, XMLParseLocation)+{-# NOINLINE parseLocationsG #-}+parseLocationsG opts inputBlocks = parseImpl opts inputBlocks True fetchLocation id+  where+    fetchLocation pBuf offset = do+        [a, b, c, d] <- peekArray 4 (pBuf `plusPtr` offset :: Ptr Int64)+        return (XMLParseLocation a b c d, offset + 32) -        setCharacterDataHandler parser $ \_ cText -> do-            txt <- gxFromCStringLen cText-            modifyIORef queueRef (CharacterData txt:)-            return True-            -        setStartCDataHandler parser $ \_  -> do-            modifyIORef queueRef (StartCData :)-            return True-            -        setEndCDataHandler parser $ \_  -> do-            modifyIORef queueRef (EndCData :)-            return True-            -        setProcessingInstructionHandler parser $ \_ cTarget cText -> do-            target <- textFromCString cTarget-            txt <- textFromCString cText-            modifyIORef queueRef (ProcessingInstruction target txt :)-            return True-            -        setCommentHandler parser $ \_ cText -> do-            txt <- textFromCString cText-            modifyIORef queueRef (Comment txt :)-            return True+parseImpl :: forall a tag text l . (GenericXMLString tag, GenericXMLString text, List l) =>+             ParseOptions tag text -- ^ Parse options+          -> l ByteString          -- ^ Input text (a lazy ByteString)+          -> Bool                  -- ^ True to add locations to binary output+          -> (Ptr Word8 -> Int -> IO (a, Int)) -- ^ Fetch extra data+          -> (IO XMLParseLocation -> IO a)     -- ^ Fetch a value for failure case +          -> l (SAXEvent tag text, a)+parseImpl opts inputBlocks addLocations extra failureA = runParser inputBlocks parse cacheRef+  where+    (parse, getLocation, cacheRef) = unsafePerformIO $ do+        (parse, getLocation) <- hexpatNewParser+            (overrideEncoding opts)+            ((\decode -> fmap gxToByteString . decode . gxFromByteString) <$> entityDecoder opts)+            addLocations -        cacheRef <- newIORef Nothing-        return (parser, queueRef, cacheRef)+        cacheRef <- newMVar Nothing+        return (parse, getLocation, cacheRef) -    runParser iblks parser queueRef cacheRef = joinL $ do+    runParser iblks parse cacheRef = joinL $ do         li <- runList iblks         return $ unsafePerformIO $ do-            mCached <- readIORef cacheRef+            mCached <- takeMVar cacheRef             case mCached of-                Just l -> return l+                Just l -> do+                    putMVar cacheRef mCached+                    return l                 Nothing -> do-                    rema <- case li of-                            Nil         -> do-                                mError <- withParser parser $ \pp -> parseChunk pp B.empty True-                                return $ handleFailure mError mzero-                            Cons blk t -> unsafeInterleaveIO $ do-                                mError <- withParser parser $ \pp -> parseChunk pp blk False-                                cacheRef' <- newIORef Nothing-                                return $ handleFailure mError (runParser t parser queueRef cacheRef')-                    queue <- readIORef queueRef-                    writeIORef queueRef []-                    let l = fromList (reverse queue) `mplus` rema-                    writeIORef cacheRef (Just l)+                    (saxen, rema) <- case li of+                        Nil         -> do+                            (buf, len, mError) <- parse B.empty True+                            saxen <- parseBuf buf len extra+                            rema <- handleFailure mError mzero+                            return (saxen, rema)+                        Cons blk t -> {-unsafeInterleaveIO $-} do+                            (buf, len, mError) <- parse blk False+                            saxen <- parseBuf buf len extra+                            cacheRef' <- newMVar Nothing+                            rema <- handleFailure mError (runParser t parse cacheRef')+                            return (saxen, rema)+                    let l = fromList saxen `mplus` rema+                    putMVar cacheRef (Just l)                     return l       where-        handleFailure (Just err) _ = FailDocument err `cons` mzero-        handleFailure Nothing    l = l+        handleFailure (Just err) _ = do a <- failureA getLocation+                                        return $ (FailDocument err, a) `cons` mzero+        handleFailure Nothing    l = return l +parseBuf :: (GenericXMLString tag, GenericXMLString text) =>+            ForeignPtr Word8 -> CInt -> (Ptr Word8 -> Int -> IO (a, Int)) -> IO [(SAXEvent tag text, a)]+parseBuf buf _ processExtra = withForeignPtr buf $ \pBuf -> doit [] pBuf 0+  where+    roundUp32 offset = (offset + 3) .&. complement 3+    doit acc pBuf offset0 = offset0 `seq` do+        typ <- peek (pBuf `plusPtr` offset0 :: Ptr Word32)+        (a, offset) <- processExtra pBuf (offset0 + 4)+        case typ of+            0 -> return (reverse acc)+            1 -> do+                nAtts <- peek (pBuf `plusPtr` offset :: Ptr Word32)+                let pName = pBuf `plusPtr` (offset + 4)+                lName <- fromIntegral <$> c_strlen pName+                let name = gxFromByteString $ I.fromForeignPtr buf (offset + 4) lName+                (atts, offset') <- foldM (\(atts, offset) _ -> do+                        let pAtt = pBuf `plusPtr` offset+                        lAtt <- fromIntegral <$> c_strlen pAtt+                        let att = gxFromByteString $ I.fromForeignPtr buf offset lAtt+                            offset' = offset + lAtt + 1+                            pValue = pBuf `plusPtr` offset'+                        lValue <- fromIntegral <$> c_strlen pValue+                        let value = gxFromByteString $ I.fromForeignPtr buf offset' lValue+                        return ((att, value):atts, offset' + lValue + 1)+                    ) ([], offset + 4 + lName + 1) [1,3..nAtts]+                doit ((StartElement name (reverse atts), a) : acc) pBuf (roundUp32 offset')+            2 -> do+                let pName = pBuf `plusPtr` offset+                lName <- fromIntegral <$> c_strlen pName+                let name = gxFromByteString $ I.fromForeignPtr buf offset lName+                    offset' = offset + lName + 1+                doit ((EndElement name, a) : acc) pBuf (roundUp32 offset')+            3 -> do+                len <- fromIntegral <$> peek (pBuf `plusPtr` offset :: Ptr Word32)+                let text = gxFromByteString $ I.fromForeignPtr buf (offset + 4) len+                    offset' = offset + 4 + len+                doit ((CharacterData text, a) : acc) pBuf (roundUp32 offset')+            4 -> do+                let pEnc = pBuf `plusPtr` offset+                lEnc <- fromIntegral <$> c_strlen pEnc+                let enc = gxFromByteString $ I.fromForeignPtr buf offset lEnc+                    offset' = offset + lEnc + 1+                    pVer = pBuf `plusPtr` offset'+                pVerFirst <- peek (castPtr pVer :: Ptr Word8)+                (mVer, offset'') <- case pVerFirst of+                    0 -> return (Nothing, offset' + 1)+                    1 -> do+                        lVer <- fromIntegral <$> c_strlen (pVer `plusPtr` 1)+                        return (Just $ gxFromByteString $ I.fromForeignPtr buf (offset' + 1) lVer, offset' + 1 + lVer + 1)+                    _ -> error "hexpat: bad data from C land"+                cSta <- peek (pBuf `plusPtr` offset'' :: Ptr Int8)+                let sta = if cSta < 0  then Nothing else+                          if cSta == 0 then Just False else+                                            Just True+                doit ((XMLDeclaration enc mVer sta, a) : acc) pBuf (roundUp32 (offset'' + 1))+            5 -> doit ((StartCData, a) : acc) pBuf offset+            6 -> doit ((EndCData, a) : acc) pBuf offset+            7 -> do+                let pTarget = pBuf `plusPtr` offset+                lTarget <- fromIntegral <$> c_strlen pTarget+                let target = gxFromByteString $ I.fromForeignPtr buf offset lTarget+                    offset' = offset + lTarget + 1+                    pData = pBuf `plusPtr` offset'+                lData <- fromIntegral <$> c_strlen pData+                let dat = gxFromByteString $ I.fromForeignPtr buf offset' lData+                doit ((ProcessingInstruction target dat, a) : acc) pBuf (roundUp32 (offset' + lData + 1))+            8 -> do+                let pText = pBuf `plusPtr` offset+                lText <- fromIntegral <$> c_strlen pText+                let text = gxFromByteString $ I.fromForeignPtr buf offset lText+                doit ((Comment text, a) : acc) pBuf (roundUp32 (offset + lText + 1))+            _ -> error "hexpat: bad data from C land"+ -- | Lazily parse XML to SAX events. In the event of an error, FailDocument is -- the last element of the output list. parse :: (GenericXMLString tag, GenericXMLString text) =>@@ -315,132 +306,12 @@ parse opts input = parseG opts (L.toChunks input)  --- | DEPRECATED: Use 'parse' instead.------ Lazily parse XML to SAX events. In the event of an error, FailDocument is--- the last element of the output list. Deprecated in favour of new--- 'Text.XML.Expat.SAX.parse'-parseSAX :: (GenericXMLString tag, GenericXMLString text) =>-            Maybe Encoding      -- ^ Optional encoding override-         -> L.ByteString        -- ^ Input text (a lazy ByteString)-         -> [SAXEvent tag text]-{-# DEPRECATED parseSAX "use Text.XML.Expat.SAX.parse instead" #-}-parseSAX enc = parse (ParseOptions enc Nothing)-- -- | An exception indicating an XML parse error, used by the /..Throwing/ variants. data XMLParseException = XMLParseException XMLParseError     deriving (Eq, Show, Typeable)  instance Exception XMLParseException where ---- | Parse a generalized list of ByteStrings containing XML to SAX events.--- In the event of an error, FailDocument is the last element of the output list.-parseLocationsG :: forall tag text l . (GenericXMLString tag, GenericXMLString text, List l) =>-                   ParseOptions tag text -- ^ Parse options-                -> l ByteString          -- ^ Input text (a lazy ByteString)-                -> l (SAXEvent tag text, XMLParseLocation)-parseLocationsG opts inputBlocks = runParser inputBlocks parser queueRef cacheRef-  where-    (parser, queueRef, cacheRef) = unsafePerformIO $ do-        let enc = overrideEncoding opts-        let mEntityDecoder = entityDecoder opts--        parser <- newParser enc-        queueRef <- newIORef []--        case mEntityDecoder of-            Just deco -> setEntityDecoder parser deco $ \pp txt -> do-                loc <- getParseLocation pp-                modifyIORef queueRef ((CharacterData txt, loc):)-            Nothing -> return ()--        setXMLDeclarationHandler parser $ \pp cVer cEnc cSd -> do-            ver <- textFromCString cVer-            mEnc <- if cEnc == nullPtr-                then return Nothing-                else Just <$> textFromCString cEnc-            let sd = if cSd < 0-                    then Nothing-                    else Just $ if cSd /= 0 then True else False-            loc <- getParseLocation pp-            modifyIORef queueRef ((XMLDeclaration ver mEnc sd, loc):)-            return True--        setStartElementHandler parser $ \pp cName cAttrs -> do-            name <- textFromCString cName-            attrs <- forM cAttrs $ \(cAttrName,cAttrValue) -> do-                attrName <- textFromCString cAttrName-                attrValue <- textFromCString cAttrValue-                return (attrName, attrValue)-            loc <- getParseLocation pp-            modifyIORef queueRef ((StartElement name attrs,loc):)-            return True--        setEndElementHandler parser $ \pp cName -> do-            name <- textFromCString cName-            loc <- getParseLocation pp-            modifyIORef queueRef ((EndElement name, loc):)-            return True--        setCharacterDataHandler parser $ \pp cText -> do-            txt <- gxFromCStringLen cText-            loc <- getParseLocation pp-            modifyIORef queueRef ((CharacterData txt, loc):)-            return True-            -        setStartCDataHandler parser $ \pp -> do-            loc <- getParseLocation pp-            modifyIORef queueRef ((StartCData, loc):)-            return True-            -        setEndCDataHandler parser $ \pp -> do-            loc <- getParseLocation pp-            modifyIORef queueRef ((EndCData,loc):)-            return True-            -        setProcessingInstructionHandler parser $ \pp cTarget cText -> do-            target <- textFromCString cTarget-            txt <- textFromCString cText-            loc <- getParseLocation pp-            modifyIORef queueRef ((ProcessingInstruction target txt, loc):)-            return True-            -        setCommentHandler parser $ \pp cText -> do-            txt <- textFromCString cText-            loc <- getParseLocation pp-            modifyIORef queueRef ((Comment txt, loc):)-            return True--        cacheRef <- newIORef Nothing-        return (parser, queueRef, cacheRef)--    runParser iblks parser queueRef cacheRef = joinL $ do-        li <- runList iblks-        return $ unsafePerformIO $ do-            mCached <- readIORef cacheRef-            case mCached of-                Just l -> return l-                Nothing -> do-                    rema <- case li of-                            Nil         -> do-                                mError <- withParser parser $ \pp -> parseChunk pp B.empty True-                                handleFailure mError mzero-                            Cons blk t -> unsafeInterleaveIO $ do-                                mError <- withParser parser $ \pp -> parseChunk pp blk False-                                cacheRef' <- newIORef Nothing-                                handleFailure mError (runParser t parser queueRef cacheRef')-                    queue <- readIORef queueRef-                    writeIORef queueRef []-                    let l = fromList (reverse queue) `mplus` rema-                    writeIORef cacheRef (Just l)-                    return l-      where-        handleFailure (Just err) _ = do loc <- withParser parser getParseLocation-                                        return $ (FailDocument err, loc) `cons` mzero-        handleFailure Nothing    l = return l- -- | A variant of parseSAX that gives a document location with each SAX event. parseLocations :: (GenericXMLString tag, GenericXMLString text) =>                   ParseOptions tag text  -- ^ Parse options@@ -448,17 +319,7 @@                -> [(SAXEvent tag text, XMLParseLocation)] parseLocations opts input = parseLocationsG opts (L.toChunks input) --- | DEPRECATED: Use 'parseLocations' instead.------ A variant of parseSAX that gives a document location with each SAX event.-parseSAXLocations :: (GenericXMLString tag, GenericXMLString text) =>-            Maybe Encoding      -- ^ Optional encoding override-         -> L.ByteString        -- ^ Input text (a lazy ByteString)-         -> [(SAXEvent tag text, XMLParseLocation)]-{-# DEPRECATED parseSAXLocations "use Text.XML.Expat.SAX.parseLocations instead" #-}-parseSAXLocations enc = parseLocations (ParseOptions enc Nothing) - -- | Lazily parse XML to SAX events. In the event of an error, throw -- 'XMLParseException'. --@@ -477,18 +338,6 @@     freakOut other = other  --- | DEPRECATED: Use 'parseThrowing' instead.------ Lazily parse XML to SAX events. In the event of an error, throw--- 'XMLParseException'.-parseSAXThrowing :: (GenericXMLString tag, GenericXMLString text) =>-                    Maybe Encoding      -- ^ Optional encoding override-                 -> L.ByteString        -- ^ Input text (a lazy ByteString)-                 -> [SAXEvent tag text]-{-# DEPRECATED parseSAXThrowing "use Text.XML.Expat.SAX.parseThrowing instead" #-}-parseSAXThrowing mEnc = parseThrowing (ParseOptions mEnc Nothing)-- -- | A variant of parseSAX that gives a document location with each SAX event. -- In the event of an error, throw 'XMLParseException'. --@@ -505,16 +354,3 @@   where     freakOut (FailDocument err, _) = Exc.throw $ XMLParseException err     freakOut other = other----- | DEPRECATED: Used 'parseLocationsThrowing' instead.------ A variant of parseSAX that gives a document location with each SAX event.--- In the event of an error, throw 'XMLParseException'.-parseSAXLocationsThrowing :: (GenericXMLString tag, GenericXMLString text) =>-                             Maybe Encoding      -- ^ Optional encoding override-                          -> L.ByteString        -- ^ Input text (a lazy ByteString)-                          -> [(SAXEvent tag text, XMLParseLocation)]-{-# DEPRECATED parseSAXLocationsThrowing "use Text.XML.Expat.SAX.parseLocationsThrowing instead" #-}-parseSAXLocationsThrowing mEnc =-    parseLocationsThrowing (ParseOptions mEnc Nothing)
Text/XML/Expat/Tree.hs view
@@ -128,60 +128,35 @@   saxToTreeG,    -- * Abstraction of string types-  GenericXMLString(..),--  -- * Deprecated-  eAttrs,-  Nodes,-  UNodes,-  QNodes,-  NNodes,-  parseTree,-  parseTree',-  parseSAX,-  parseSAXLocations,-  parseTreeThrowing,-  parseSAXThrowing,-  parseSAXLocationsThrowing,-  ParserOptions,-  defaultParserOptions+  GenericXMLString(..)   ) where -import Text.XML.Expat.Internal.IO hiding (parse,parse')-import qualified Text.XML.Expat.Internal.IO as IO-import Text.XML.Expat.SAX ( ParseOptions(..)-                          , XMLParseException(..)-                          , SAXEvent(..)-                          , defaultParseOptions-                          , textFromCString-                          , parseSAX-                          , parseSAXLocations-                          , parseSAXLocationsThrowing-                          , parseSAXThrowing+import Text.XML.Expat.SAX ( Encoding(..)                           , GenericXMLString(..)-                          , setEntityDecoder-                          , ParserOptions-                          , defaultParserOptions )+                          , ParseOptions(..)+                          , defaultParseOptions+                          , SAXEvent(..)+                          , XMLParseError(..)+                          , XMLParseException(..)+                          , XMLParseLocation(..) ) import qualified Text.XML.Expat.SAX as SAX import Text.XML.Expat.Internal.Namespaced import Text.XML.Expat.Internal.NodeClass import Text.XML.Expat.Internal.Qualified  import Control.Arrow-import Control.Monad (forM, mplus, mzero)+import Control.Monad (mplus, mzero) import Data.ByteString (ByteString) import qualified Data.ByteString.Lazy as L-import Data.IORef import Data.List.Class import Data.Monoid (Monoid,mempty,mappend) import Control.DeepSeq-import System.IO.Unsafe   -- | The tree representation of the XML document. ----- @c@ is the container type for the element's children, which is [] in the--- @hexpat@ package, and a monadic list type for @hexpat-iteratee@.+-- @c@ is the container type for the element's children, which would normally be [],+-- but could potentially be a monadic list type to allow for chunked I/O. -- -- @tag@ is the tag type, which can either be one of several string types, -- or a special type from the @Text.XML.Expat.Namespaced@ or@@ -221,46 +196,17 @@ -- @ListOf (UNode Text)@. type Node tag text = NodeG [] tag text -eAttrs :: Node tag text -> [(tag, text)]-{-# DEPRECATED eAttrs "use eAttributes instead" #-}-eAttrs = eAttributes- instance (NFData tag, NFData text) => NFData (NodeG [] tag text) where     rnf (Element nam att chi) = rnf (nam, att, chi)     rnf (Text txt) = rnf txt --- | DEPRECATED: Use [Node tag text] instead.------ Type alias for nodes.-type Nodes tag text = [Node tag text]-{-# DEPRECATED Nodes "use [Node tag text] instead" #-}---- | DEPRECATED: Use [UNode text] instead.------ Type alias for nodes with unqualified tag names where tag and--- text are the same string type. DEPRECATED.-type UNodes text = Nodes text text-{-# DEPRECATED UNodes "use [UNode text] instead" #-}- -- | Type alias for a node with unqualified tag names where tag and -- text are the same string type. type UNode text = Node text text --- | DEPRECATED: Use [QNode text] instead.------ Type alias for nodes where qualified names are used for tags-{-# DEPRECATED QNodes "use [QNode text] instead" #-}-type QNodes text = [Node (QName text) text]- -- | Type alias for a node where qualified names are used for tags type QNode text = Node (QName text) text --- | DEPRECATED: Use [NNode text] instead.------ Type alias for nodes where namespaced names are used for tags.-{-# DEPRECATED NNodes "use [NNode text] instead" #-}-type NNodes text = [Node (NName text) text]- -- | Type alias for a node where namespaced names are used for tags type NNode text = Node (NName text) text @@ -328,65 +274,9 @@           ParseOptions tag text  -- ^ Parse options        -> ByteString              -- ^ Input text (a strict ByteString)        -> Either XMLParseError (Node tag text)-parse' opts doc = unsafePerformIO $ runParse where-  runParse = do-    let enc = overrideEncoding opts-    let mEntityDecoder = entityDecoder opts--    parser <- newParser enc--    -- We maintain the invariant that the stack always has one element,-    -- whose only child at the end of parsing is the root of the actual tree.-    let emptyString = gxFromString ""-    stack <- newIORef [Element emptyString [] []]--    case mEntityDecoder of-        Just deco -> setEntityDecoder parser deco $ \_ txt -> do-            modifyIORef stack (text txt)-        Nothing -> return ()--    setStartElementHandler parser $ \_ cName cAttrs -> do-        name <- textFromCString cName-        attrs <- forM cAttrs $ \(cAttrName,cAttrValue) -> do-            attrName <- textFromCString cAttrName-            attrValue <- textFromCString cAttrValue-            return (attrName, attrValue)-        modifyIORef stack (start name attrs)-        return True-    setEndElementHandler parser $ \_ _ -> do-        modifyIORef stack end-        return True-    setCharacterDataHandler parser $ \_ cText -> do-        txt <- gxFromCStringLen cText-        modifyIORef stack (text txt)-        return True-    mError <- IO.parse' parser doc-    case mError of-        Just err -> return $ Left err-        Nothing -> do-            [Element _ _ [root]] <- readIORef stack-            return $ Right root--  start name attrs stack = Element name attrs [] : stack-  text str (cur:rest) = modifyChildren (Text str:) cur : rest-  text _ [] = impossible-  end (cur:parent:rest) =-    let node = modifyChildren reverse cur in-    modifyChildren (node:) parent : rest-  end _ = impossible-  impossible = error "parse' impossible"----- | DEPRECATED: use 'parse' instead.------ Strictly parse XML to tree. Returns error message or valid parsed tree.-parseTree' :: (GenericXMLString tag, GenericXMLString text) =>-              Maybe Encoding      -- ^ Optional encoding override-           -> ByteString          -- ^ Input text (a strict ByteString)-           -> Either XMLParseError (Node tag text)-{-# DEPRECATED parseTree' "use Text.XML.Expat.parse' instead" #-}-parseTree' enc = parse' (ParseOptions enc Nothing)-+parse' opts doc = case parse opts (L.fromChunks [doc]) of+    (xml, Nothing) -> Right xml+    (_, Just err) -> Left err  -- | A lower level function that lazily converts a SAX stream into a tree structure. saxToTree :: GenericXMLString tag =>@@ -460,19 +350,6 @@        -> ItemM l (NodeG l tag text) parseG opts = saxToTreeG . SAX.parseG opts --- | DEPREACTED: Use 'parse' instead.------ Lazily parse XML to tree. Note that forcing the XMLParseError return value--- will force the entire parse.  Therefore, to ensure lazy operation, don't--- check the error status until you have processed the tree.-parseTree :: (GenericXMLString tag, GenericXMLString text) =>-             Maybe Encoding      -- ^ Optional encoding override-          -> L.ByteString        -- ^ Input text (a lazy ByteString)-          -> (Node tag text, Maybe XMLParseError)-{-# DEPRECATED parseTree "use Text.XML.Expat.Tree.parse instead" #-}-parseTree mEnc = parse (ParseOptions mEnc Nothing)-- -- | Lazily parse XML to tree. In the event of an error, throw 'XMLParseException'. -- -- @parseThrowing@ can throw an exception from pure code, which is generally a bad@@ -485,14 +362,3 @@       -> L.ByteString           -- ^ Input text (a lazy ByteString)       -> Node tag text parseThrowing opts bs = fst $ saxToTree $ SAX.parseThrowing opts bs----- | DEPRECATED: Use 'parseThrowing' instead.------ Lazily parse XML to tree. In the event of an error, throw 'XMLParseException'.-parseTreeThrowing :: (GenericXMLString tag, GenericXMLString text) =>-             Maybe Encoding      -- ^ Optional encoding override-          -> L.ByteString        -- ^ Input text (a lazy ByteString)-          -> Node tag text-{-# DEPRECATED parseTreeThrowing "use Text.XML.Expat.Tree.parseThrowing instead" #-}-parseTreeThrowing mEnc = parseThrowing (ParseOptions mEnc Nothing)
hexpat.cabal view
@@ -1,6 +1,6 @@ Cabal-Version: >= 1.6 Name: hexpat-Version: 0.19.10+Version: 0.20.1 Synopsis: XML parser/formatter based on expat Description:   This package provides a general purpose Haskell XML library using Expat to@@ -23,8 +23,9 @@   If you want to do interactive I\/O, an obvious option is to use lazy parsing   with one of the lazy I\/O functions such as hGetContents.  However, this can be   problematic in some applications because it doesn't handle I\/O errors properly-  and can give no guarantee of timely resource cleanup.  In these cases, chunked-  I\/O is a better approach: Take a look at the /hexpat-enumerator/ package.+  and can give no guarantee of timely resource cleanup. Because of the generalized+  list, Hexpat is designed to allow for chunked I/O, but as of this writing I haven't+  done a nice integration with enumerator and friends.   .   /IO/ is filed under /Internal/ because it's low-level and most users won't want   it.  The other /Internal/ modules are re-exported by /Annotated/, /Tree/ and /Extended/,@@ -33,14 +34,6 @@   Credits to Iavor Diatchki and the @xml@ (XML.Light) package for /Proc/ and /Cursor/.   Thanks to the many contributors.   .-  BOUND VS. UNBOUND THREADS: GHC (at least versions 6.12.X) will spawn threads-  if you call a safe FFI callback from an unbound thread.  This can get out of-  control in a busy application.  To avoid this, from version 0.19.1 we now delegate-  processing to a single worker thread if the calling thread is not bound.-  This essentially means that hexpat currently won't exploit multicores very well.-  It also means that hexpat may be more efficient on threads spawned with forkOS-  (to give you a bound thread) rather than forkIO.-  .   ChangeLog: 0.15 changes intended to fix a (rare) \"error: a C finalizer called back into Haskell.\"     that seemed only to happen only on ghc6.12.X; 0.15.1 Fix broken Annotated parse;     0.16 switch from mtl to transformers; 0.17 fix mapNodeContainer & rename some things.;@@ -52,7 +45,9 @@     which broke entity parsing; 0.19.4 bump version constraint for text; 0.19.5 bump text     to < 0.12 and fix text-0.10.0.1 breakage; 0.19.6 dependency breakage with List;     0.19.7 ghc-7.2.1 compatibility; 0.19.8 fix space leak on lazy parse under ghc-7.2.1;-    0.19.9 fix formatting of > character + improve performance; 0.9.10 ghc-7.4.x compatibility.+    0.19.9 fix formatting of > character + improve performance; 0.19.10 ghc-7.4.x compatibility;+    0.20.1 fix an unfortunate crash when used in parallel processing and greatly improve+    performance. Category: XML License: BSD3 License-File: LICENSE@@ -95,6 +90,8 @@   test/hexpat-leak/Parse.hs,   test/hexpat-leak/run.sh,   test/hexpat-leak/build.sh+  test/readRoads.hs,+  test/ROADS.xml,   cbits/amigaconfig.h,   cbits/asciitab.h,   cbits/expat.h,@@ -132,11 +129,7 @@     Text.XML.Expat.Cursor,     Text.XML.Expat.Extended,     Text.XML.Expat.Format,-    Text.XML.Expat.IO,-    Text.XML.Expat.Namespaced,-    Text.XML.Expat.NodeClass,     Text.XML.Expat.Proc,-    Text.XML.Expat.Qualified,     Text.XML.Expat.SAX,     Text.XML.Expat.Tree,     Text.XML.Expat.Internal.DocumentClass,@@ -152,6 +145,7 @@     cbits/xmlrole.c,     cbits/xmltok.c,     cbits/xmltok_impl.c,-    cbits/xmltok_ns.c+    cbits/xmltok_ns.c,+    Text/XML/Expat/Internal/Glue.c   cc-options: -DHAVE_MEMMOVE -DXML_NS -DXML_DTD 
+ test/ROADS.xml view
@@ -0,0 +1,1008 @@+<?xml version="1.0" encoding="UTF-8"?>+<shapes>+  <shape shapeType="polyLine" id="0" ADD_L_DIR="-1" ADD_L_MAX="17" ADD_L_MIN="3" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="26" ADD_R_MIN="6" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="WAIMEA LANE" ID="64" ISLAND="North Island" NAME="WAIMEA LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="64414" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Remuera" TOWN="Auckland" TURNRESLNK="ak66" URBANRURAL="U" ID1="1">+    <vertices>+      <vertex X="174.800917" Y="-36.874316"/>+      <vertex X="174.800705" Y="-36.874296"/>+      <vertex X="174.798671" Y="-36.874107"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="1" ADD_L_DIR="1" ADD_L_MAX="25" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="DENARIUS LANE" ID="65" ISLAND="North Island" NAME="DENARIUS LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64413" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Glendene" TOWN="Waitakere" TURNRESLNK="ak67" URBANRURAL="U" ID1="2">+    <vertices>+      <vertex X="174.657551" Y="-36.889236"/>+      <vertex X="174.656120" Y="-36.888354"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="2" ADD_L_DIR="1" ADD_L_MAX="46" ADD_L_MIN="1" ADD_L_TYPE="M" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="BOARDMAN LANE" ID="66" ISLAND="North Island" NAME="BOARDMAN LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64412" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Auckland City Centre" TOWN="Auckland" TURNRESLNK="ak92" URBANRURAL="U" ID1="3">+    <vertices>+      <vertex X="174.757249" Y="-36.857860"/>+      <vertex X="174.757058" Y="-36.857463"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="3" ADD_L_DIR="1" ADD_L_MAX="20" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="13" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="GARDEN LANE" ID="35" ISLAND="North Island" NAME="GARDEN LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64411" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Northcross" TOWN="North Shore" TURNRESLNK="ak35" URBANRURAL="U" ID1="4">+    <vertices>+      <vertex X="174.735888" Y="-36.707362"/>+      <vertex X="174.736360" Y="-36.707260"/>+      <vertex X="174.736581" Y="-36.707229"/>+      <vertex X="174.737098" Y="-36.707092"/>+      <vertex X="174.737294" Y="-36.706989"/>+      <vertex X="174.737303" Y="-36.706958"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="4" ADD_L_DIR="1" ADD_L_MAX="10" ADD_L_MIN="2" ADD_L_TYPE="M" ADD_R_DIR="1" ADD_R_MAX="3" ADD_R_MIN="3" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="EMILY LANE" ID="36" ISLAND="North Island" NAME="EMILY LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="64409" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Cuthill" TOWN="North Shore" TURNRESLNK="ak36" URBANRURAL="U" ID1="5">+    <vertices>+      <vertex X="174.704080" Y="-36.764450"/>+      <vertex X="174.703525" Y="-36.764050"/>+      <vertex X="174.703360" Y="-36.763845"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="5" ADD_L_DIR="1" ADD_L_MAX="22" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="15" ADD_R_MIN="5" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="DENE COURT LANE" ID="37" ISLAND="North Island" NAME="DENE COURT LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="64408" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Cuthill" TOWN="North Shore" TURNRESLNK="ak37" URBANRURAL="U" ID1="6">+    <vertices>+      <vertex X="174.706178" Y="-36.762460"/>+      <vertex X="174.707042" Y="-36.763011"/>+      <vertex X="174.707911" Y="-36.763718"/>+      <vertex X="174.708126" Y="-36.764282"/>+      <vertex X="174.708057" Y="-36.764526"/>+      <vertex X="174.707982" Y="-36.764789"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="6" ADD_L_DIR="1" ADD_L_MAX="22" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="23" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="REDFERN LANE" ID="38" ISLAND="North Island" NAME="REDFERN LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="64407" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Glenfield" TOWN="North Shore" TURNRESLNK="ak38" URBANRURAL="U" ID1="7">+    <vertices>+      <vertex X="174.708554" Y="-36.786916"/>+      <vertex X="174.709059" Y="-36.786575"/>+      <vertex X="174.709234" Y="-36.786400"/>+      <vertex X="174.709373" Y="-36.786128"/>+      <vertex X="174.709438" Y="-36.785949"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="7" ADD_L_DIR="-1" ADD_L_MAX="15" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="14" ADD_R_MIN="4" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="GLADFIELD LANE" ID="39" ISLAND="North Island" NAME="GLADFIELD LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64405" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Te Atatu Peninsula" TOWN="Waitakere" TURNRESLNK="ak39" URBANRURAL="U" ID1="8">+    <vertices>+      <vertex X="174.649093" Y="-36.835993"/>+      <vertex X="174.648993" Y="-36.836069"/>+      <vertex X="174.648946" Y="-36.836104"/>+      <vertex X="174.648276" Y="-36.836606"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="8" ADD_L_DIR="-1" ADD_L_MAX="9" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="10" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="GLENFORD LANE" ID="40" ISLAND="North Island" NAME="GLENFORD LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64404" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Te Atatu Peninsula" TOWN="Waitakere" TURNRESLNK="ak40" URBANRURAL="U" ID1="9">+    <vertices>+      <vertex X="174.646092" Y="-36.834602"/>+      <vertex X="174.645978" Y="-36.834622"/>+      <vertex X="174.645450" Y="-36.834975"/>+      <vertex X="174.645188" Y="-36.835258"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="9" ADD_L_DIR="-1" ADD_L_MAX="5" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="6" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="BRAEBANK LANE" ID="41" ISLAND="North Island" NAME="BRAEBANK LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64403" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Te Atatu South" TOWN="Waitakere" TURNRESLNK="ak41" URBANRURAL="U" ID1="10">+    <vertices>+      <vertex X="174.654567" Y="-36.860195"/>+      <vertex X="174.654041" Y="-36.861186"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="10" ADD_L_DIR="-1" ADD_L_MAX="8" ADD_L_MIN="4" ADD_L_TYPE="E" ADD_R_DIR="-1" ADD_R_MAX="7" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="SUNRISE LANE" ID="42" ISLAND="North Island" NAME="SUNRISE LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64402" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Te Atatu South" TOWN="Waitakere" TURNRESLNK="ak42" URBANRURAL="U" ID1="11">+    <vertices>+      <vertex X="174.651493" Y="-36.861550"/>+      <vertex X="174.650956" Y="-36.862099"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="11" ADD_L_DIR="-1" ADD_L_MAX="11" ADD_L_MIN="3" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="10" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="GANE LANE" ID="43" ISLAND="North Island" NAME="GANE LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64399" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Te Atatu Peninsula" TOWN="Waitakere" TURNRESLNK="ak45" URBANRURAL="U" ID1="12">+    <vertices>+      <vertex X="174.648910" Y="-36.846895"/>+      <vertex X="174.648532" Y="-36.847487"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="12" ADD_L_DIR="-1" ADD_L_MAX="7" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="6" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="GLENVIL LANE" ID="44" ISLAND="North Island" NAME="GLENVIL LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64398" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Te Atatu Peninsula" TOWN="Waitakere" TURNRESLNK="ak46" URBANRURAL="U" ID1="13">+    <vertices>+      <vertex X="174.648767" Y="-36.849879"/>+      <vertex X="174.648673" Y="-36.849839"/>+      <vertex X="174.648157" Y="-36.849209"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="13" ADD_L_DIR="-1" ADD_L_MAX="11" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="16" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="SPRINGBANK LANE" ID="45" ISLAND="North Island" NAME="SPRINGBANK LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64397" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Te Atatu Peninsula" TOWN="Waitakere" TURNRESLNK="ak47" URBANRURAL="U" ID1="14">+    <vertices>+      <vertex X="174.644889" Y="-36.843879"/>+      <vertex X="174.646215" Y="-36.843489"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="14" ADD_L_DIR="-1" ADD_L_MAX="11" ADD_L_MIN="3" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="14" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="SHAMROCK LANE" ID="46" ISLAND="North Island" NAME="SHAMROCK LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64396" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Te Atatu Peninsula" TOWN="Waitakere" TURNRESLNK="ak48" URBANRURAL="U" ID1="15">+    <vertices>+      <vertex X="174.649589" Y="-36.838069"/>+      <vertex X="174.649551" Y="-36.838033"/>+      <vertex X="174.648642" Y="-36.837629"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="15" ADD_L_DIR="-1" ADD_L_MAX="9" ADD_L_MIN="3" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="10" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="BEAUFIELD LANE" ID="47" ISLAND="North Island" NAME="BEAUFIELD LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64395" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Te Atatu Peninsula" TOWN="Waitakere" TURNRESLNK="ak49" URBANRURAL="U" ID1="16">+    <vertices>+      <vertex X="174.647448" Y="-36.837864"/>+      <vertex X="174.648140" Y="-36.838223"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="16" ADD_L_DIR="1" ADD_L_MAX="22" ADD_L_MIN="4" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="25" ADD_R_MIN="3" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="ELISA LANE" ID="48" ISLAND="North Island" NAME="ELISA LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64394" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Ranui" TOWN="Waitakere" TURNRESLNK="ak50" URBANRURAL="U" ID1="17">+    <vertices>+      <vertex X="174.602145" Y="-36.861159"/>+      <vertex X="174.602659" Y="-36.861093"/>+      <vertex X="174.603003" Y="-36.861153"/>+      <vertex X="174.603023" Y="-36.861149"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="17" ADD_L_DIR="-1" ADD_L_MAX="23" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="6" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="CONSTABLE LANE" ID="49" ISLAND="North Island" NAME="CONSTABLE LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="64393" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="West Harbour" TOWN="Waitakere" TURNRESLNK="ak51" URBANRURAL="U" ID1="18">+    <vertices>+      <vertex X="174.642384" Y="-36.818826"/>+      <vertex X="174.642240" Y="-36.818688"/>+      <vertex X="174.642098" Y="-36.818540"/>+      <vertex X="174.642057" Y="-36.818473"/>+      <vertex X="174.642042" Y="-36.818390"/>+      <vertex X="174.642085" Y="-36.818272"/>+      <vertex X="174.642163" Y="-36.818113"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="18" ADD_L_DIR="-1" ADD_L_MAX="9" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="8" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="STAFSON LANE" ID="50" ISLAND="North Island" NAME="STAFSON LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64392" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Te Atatu Peninsula" TOWN="Waitakere" TURNRESLNK="ak52" URBANRURAL="U" ID1="19">+    <vertices>+      <vertex X="174.645498" Y="-36.829736"/>+      <vertex X="174.645394" Y="-36.829932"/>+      <vertex X="174.644814" Y="-36.830599"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="19" ADD_L_DIR="-1" ADD_L_MAX="3" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="1" ADD_R_MAX="2" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="SPROSTON AVENUE" ID="83" ISLAND="North Island" NAME="SPROSTON AVE" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64391" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Ellerslie" TOWN="Auckland" TURNRESLNK="ak109" URBANRURAL="U" ID1="20">+    <vertices>+      <vertex X="174.804846" Y="-36.893312"/>+      <vertex X="174.805949" Y="-36.893695"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="20" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="SHELLY BEACH ROAD" ID="84" ISLAND="North Island" NAME="SHELLY BEACH RD" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="64388" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Saint Marys Bay" TOWN="Auckland" TURNRESLNK="ak110" URBANRURAL="U" ID1="21">+    <vertices>+      <vertex X="174.742966" Y="-36.835312"/>+      <vertex X="174.742938" Y="-36.835373"/>+      <vertex X="174.742907" Y="-36.835428"/>+      <vertex X="174.742885" Y="-36.835464"/>+      <vertex X="174.742868" Y="-36.835504"/>+      <vertex X="174.742830" Y="-36.835629"/>+      <vertex X="174.742809" Y="-36.835687"/>+      <vertex X="174.742779" Y="-36.835746"/>+      <vertex X="174.742666" Y="-36.835944"/>+      <vertex X="174.742452" Y="-36.836289"/>+      <vertex X="174.742391" Y="-36.836391"/>+      <vertex X="174.742328" Y="-36.836503"/>+      <vertex X="174.742293" Y="-36.836577"/>+      <vertex X="174.742261" Y="-36.836648"/>+      <vertex X="174.742233" Y="-36.836717"/>+      <vertex X="174.742211" Y="-36.836777"/>+      <vertex X="174.742183" Y="-36.836868"/>+      <vertex X="174.742153" Y="-36.836985"/>+      <vertex X="174.742136" Y="-36.837071"/>+      <vertex X="174.742106" Y="-36.837292"/>+      <vertex X="174.742080" Y="-36.837419"/>+      <vertex X="174.742054" Y="-36.837504"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="21" ADD_L_DIR="1" ADD_L_MAX="20" ADD_L_MIN="8" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="30" ADD_R_MIN="30" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="WHITAKER PLACE" ID="85" ISLAND="North Island" NAME="WHITAKER PL" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64386" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Auckland City Centre" TOWN="Auckland" TURNRESLNK="ak111" URBANRURAL="U" ID1="22">+    <vertices>+      <vertex X="174.766871" Y="-36.856923"/>+      <vertex X="174.766970" Y="-36.856946"/>+      <vertex X="174.767088" Y="-36.856905"/>+      <vertex X="174.767243" Y="-36.856747"/>+      <vertex X="174.767260" Y="-36.856668"/>+      <vertex X="174.766999" Y="-36.856464"/>+      <vertex X="174.767445" Y="-36.856063"/>+      <vertex X="174.767785" Y="-36.855951"/>+      <vertex X="174.768032" Y="-36.855830"/>+      <vertex X="174.768469" Y="-36.855183"/>+      <vertex X="174.768525" Y="-36.854709"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="22" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="DOMAIN DRIVE" ID="86" ISLAND="North Island" NAME="DOMAIN DR" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="64385" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Grafton" TOWN="Auckland" TURNRESLNK="ak112" URBANRURAL="U" ID1="23">+    <vertices>+      <vertex X="174.774820" Y="-36.858931"/>+      <vertex X="174.774130" Y="-36.858981"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="23" ADD_L_DIR="-1" ADD_L_MAX="14" ADD_L_MIN="7" ADD_L_TYPE="M" ADD_R_DIR="1" ADD_R_MAX="6" ADD_R_MIN="1" ADD_R_TYPE="M" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="DAVERN LANE" ID="90" ISLAND="North Island" NAME="DAVERN LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64383" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="New Lynn" TOWN="Waitakere" TURNRESLNK="ak71" URBANRURAL="U" ID1="24">+    <vertices>+      <vertex X="174.673713" Y="-36.920832"/>+      <vertex X="174.672945" Y="-36.920079"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="24" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="CLUB LANE" ID="1" ISLAND="North Island" NAME="CLUB LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64382" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Takapuna Beach" TOWN="North Shore" TURNRESLNK="ak91" URBANRURAL="U" ID1="25">+    <vertices>+      <vertex X="174.773774" Y="-36.790392"/>+      <vertex X="174.773267" Y="-36.789750"/>+      <vertex X="174.773144" Y="-36.789551"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="25" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="CENOTAPH ROAD" ID="2" ISLAND="North Island" NAME="CENOTAPH RD" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64380" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Grafton" TOWN="Auckland" TURNRESLNK="ak1" URBANRURAL="U" ID1="26">+    <vertices>+      <vertex X="174.776349" Y="-36.859527"/>+      <vertex X="174.777016" Y="-36.859524"/>+      <vertex X="174.777847" Y="-36.859529"/>+      <vertex X="174.778229" Y="-36.859538"/>+      <vertex X="174.778380" Y="-36.859585"/>+      <vertex X="174.778588" Y="-36.859740"/>+      <vertex X="174.778668" Y="-36.859853"/>+      <vertex X="174.778713" Y="-36.859979"/>+      <vertex X="174.778710" Y="-36.860295"/>+      <vertex X="174.778704" Y="-36.860951"/>+      <vertex X="174.778656" Y="-36.861033"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="26" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="MUSEUM CIRCUIT" ID="3" ISLAND="North Island" NAME="MUSEUM CIRCUIT" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64379" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Grafton" TOWN="Auckland" TURNRESLNK="ak2" URBANRURAL="U" ID1="27">+    <vertices>+      <vertex X="174.777198" Y="-36.860080"/>+      <vertex X="174.776455" Y="-36.860071"/>+      <vertex X="174.776317" Y="-36.860009"/>+      <vertex X="174.776212" Y="-36.859899"/>+      <vertex X="174.776200" Y="-36.859756"/>+      <vertex X="174.776239" Y="-36.859658"/>+      <vertex X="174.776291" Y="-36.859564"/>+      <vertex X="174.776349" Y="-36.859527"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="27" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="KIOSK ROAD" ID="5" ISLAND="North Island" NAME="KIOSK RD" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64378" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Grafton" TOWN="Auckland" TURNRESLNK="ak4" URBANRURAL="U" ID1="28">+    <vertices>+      <vertex X="174.774677" Y="-36.859587"/>+      <vertex X="174.774392" Y="-36.859701"/>+      <vertex X="174.774214" Y="-36.859776"/>+      <vertex X="174.773644" Y="-36.860015"/>+      <vertex X="174.773341" Y="-36.860152"/>+      <vertex X="174.773183" Y="-36.860250"/>+      <vertex X="174.773065" Y="-36.860346"/>+      <vertex X="174.772994" Y="-36.860449"/>+      <vertex X="174.772941" Y="-36.860568"/>+      <vertex X="174.772880" Y="-36.860701"/>+      <vertex X="174.772806" Y="-36.860780"/>+      <vertex X="174.772722" Y="-36.860833"/>+      <vertex X="174.772635" Y="-36.860870"/>+      <vertex X="174.772509" Y="-36.860898"/>+      <vertex X="174.771892" Y="-36.860896"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="28" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="THE CRESCENT" ID="6" ISLAND="North Island" NAME="THE CRESCENT" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64376" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Grafton" TOWN="Auckland" TURNRESLNK="ak5" URBANRURAL="U" ID1="29">+    <vertices>+      <vertex X="174.775859" Y="-36.859622"/>+      <vertex X="174.775569" Y="-36.859700"/>+      <vertex X="174.775344" Y="-36.859728"/>+      <vertex X="174.775129" Y="-36.859719"/>+      <vertex X="174.774952" Y="-36.859688"/>+      <vertex X="174.774677" Y="-36.859587"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="29" ADD_L_DIR="1" ADD_L_MAX="2" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="13" ADD_R_MIN="3" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="MERCURY LANE" ID="7" ISLAND="North Island" NAME="MERCURY LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="3" RD_SEG_LNK="63668" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Newton" TOWN="Auckland" TURNRESLNK="ak6" URBANRURAL="U" ID1="30">+    <vertices>+      <vertex X="174.759046" Y="-36.857703"/>+      <vertex X="174.759010" Y="-36.858434"/>+      <vertex X="174.759055" Y="-36.858534"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="30" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="1" ADD_R_MAX="2" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="FREYBERG PLACE" ID="13" ISLAND="North Island" NAME="FREYBERG PL" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63666" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Auckland City Centre" TOWN="Auckland" TURNRESLNK="ak12" URBANRURAL="U" ID1="31">+    <vertices>+      <vertex X="174.766620" Y="-36.847670"/>+      <vertex X="174.767098" Y="-36.847748"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="31" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="SAINT JAMES STREET" ID="14" ISLAND="North Island" NAME="ST JAMES ST" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63662" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Auckland City Centre" TOWN="Auckland" TURNRESLNK="ak13" URBANRURAL="U" ID1="32">+    <vertices>+      <vertex X="174.757675" Y="-36.856022"/>+      <vertex X="174.757645" Y="-36.855944"/>+      <vertex X="174.757642" Y="-36.855650"/>+      <vertex X="174.757668" Y="-36.855191"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="32" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="DOMAIN DRIVE" ID="15" ISLAND="North Island" NAME="DOMAIN DR" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64385" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Grafton" TOWN="Auckland" TURNRESLNK="ak14" URBANRURAL="U" ID1="33">+    <vertices>+      <vertex X="174.771892" Y="-36.860896"/>+      <vertex X="174.771686" Y="-36.860869"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="33" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="DOMAIN DRIVE" ID="16" ISLAND="North Island" NAME="DOMAIN DR" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="64385" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Grafton" TOWN="Auckland" TURNRESLNK="ak15" URBANRURAL="U" ID1="34">+    <vertices>+      <vertex X="174.770486" Y="-36.862104"/>+      <vertex X="174.771000" Y="-36.861930"/>+      <vertex X="174.771237" Y="-36.861723"/>+      <vertex X="174.771503" Y="-36.861320"/>+      <vertex X="174.771660" Y="-36.860995"/>+      <vertex X="174.771686" Y="-36.860869"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="34" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="DOMAIN DRIVE" ID="17" ISLAND="North Island" NAME="DOMAIN DR" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="64385" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Grafton" TOWN="Auckland" TURNRESLNK="ak16" URBANRURAL="U" ID1="35">+    <vertices>+      <vertex X="174.771686" Y="-36.860869"/>+      <vertex X="174.771735" Y="-36.860556"/>+      <vertex X="174.771747" Y="-36.860486"/>+      <vertex X="174.771949" Y="-36.860006"/>+      <vertex X="174.771972" Y="-36.859972"/>+      <vertex X="174.772085" Y="-36.859815"/>+      <vertex X="174.772274" Y="-36.859625"/>+      <vertex X="174.772397" Y="-36.859522"/>+      <vertex X="174.772529" Y="-36.859425"/>+      <vertex X="174.772670" Y="-36.859344"/>+      <vertex X="174.773031" Y="-36.859209"/>+      <vertex X="174.773325" Y="-36.859123"/>+      <vertex X="174.773592" Y="-36.859043"/>+      <vertex X="174.773705" Y="-36.859018"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="35" ADD_L_DIR="1" ADD_L_MAX="76" ADD_L_MIN="70" ADD_L_TYPE="E" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="SALE STREET" ID="19" ISLAND="North Island" NAME="SALE ST" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63657" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Freemans Bay" TOWN="Auckland" TURNRESLNK="ak18" URBANRURAL="U" ID1="36">+    <vertices>+      <vertex X="174.755025" Y="-36.849591"/>+      <vertex X="174.754814" Y="-36.849627"/>+      <vertex X="174.754580" Y="-36.849690"/>+      <vertex X="174.754515" Y="-36.849738"/>+      <vertex X="174.754489" Y="-36.849789"/>+      <vertex X="174.754489" Y="-36.849846"/>+      <vertex X="174.754505" Y="-36.849907"/>+      <vertex X="174.754562" Y="-36.849995"/>+      <vertex X="174.754712" Y="-36.850189"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="36" ADD_L_DIR="-1" ADD_L_MAX="47" ADD_L_MIN="31" ADD_L_TYPE="O" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="SALE STREET" ID="20" ISLAND="North Island" NAME="SALE ST" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63657" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Freemans Bay" TOWN="Auckland" TURNRESLNK="ak19" URBANRURAL="U" ID1="37">+    <vertices>+      <vertex X="174.753766" Y="-36.849635"/>+      <vertex X="174.753836" Y="-36.849684"/>+      <vertex X="174.753920" Y="-36.849716"/>+      <vertex X="174.753985" Y="-36.849723"/>+      <vertex X="174.755015" Y="-36.849549"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="37" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="1" ADD_R_MAX="22" ADD_R_MIN="22" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="DUNLOP LANE" ID="21" ISLAND="North Island" NAME="DUNLOP LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63651" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Panmure" TOWN="Auckland" TURNRESLNK="ak20" URBANRURAL="U" ID1="38">+    <vertices>+      <vertex X="174.851563" Y="-36.898649"/>+      <vertex X="174.851600" Y="-36.898659"/>+      <vertex X="174.854052" Y="-36.899122"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="38" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="KORMA LANE" ID="22" ISLAND="North Island" NAME="KORMA LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63650" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Panmure" TOWN="Auckland" TURNRESLNK="ak21" URBANRURAL="U" ID1="39">+    <vertices>+      <vertex X="174.853639" Y="-36.899839"/>+      <vertex X="174.853685" Y="-36.899839"/>+      <vertex X="174.853737" Y="-36.899847"/>+      <vertex X="174.854524" Y="-36.900038"/>+      <vertex X="174.854544" Y="-36.900065"/>+      <vertex X="174.854302" Y="-36.900260"/>+      <vertex X="174.854560" Y="-36.900441"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="39" ADD_L_DIR="-1" ADD_L_MAX="15" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Manukau City" FULL_NAME="FULTON CRESCENT" ID="23" ISLAND="North Island" NAME="FULTON CRES" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63649" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Otara" TOWN="Manukau" TURNRESLNK="ak22" URBANRURAL="U" ID1="40">+    <vertices>+      <vertex X="174.873543" Y="-36.962569"/>+      <vertex X="174.873564" Y="-36.962848"/>+      <vertex X="174.873522" Y="-36.962913"/>+      <vertex X="174.873430" Y="-36.962932"/>+      <vertex X="174.872717" Y="-36.962731"/>+      <vertex X="174.872602" Y="-36.962681"/>+      <vertex X="174.872539" Y="-36.962627"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="40" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="BOLLARD AVENUE" ID="24" ISLAND="North Island" NAME="BOLLARD AVE" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="0" OWNERSHIP="0" RC="6" RD_SEG_LNK="63647" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="2" SUBURB="One Tree Hill" TOWN="Auckland" TURNRESLNK="ak23" URBANRURAL="U" ID1="41">+    <vertices>+      <vertex X="174.787861" Y="-36.902871"/>+      <vertex X="174.788213" Y="-36.903178"/>+      <vertex X="174.788414" Y="-36.903353"/>+      <vertex X="174.788708" Y="-36.903665"/>+      <vertex X="174.788835" Y="-36.903807"/>+      <vertex X="174.788923" Y="-36.903984"/>+      <vertex X="174.788965" Y="-36.904094"/>+      <vertex X="174.788972" Y="-36.904131"/>+      <vertex X="174.789040" Y="-36.904486"/>+      <vertex X="174.789094" Y="-36.904569"/>+      <vertex X="174.789159" Y="-36.904644"/>+      <vertex X="174.789621" Y="-36.904889"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="41" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="BOLLARD AVENUE" ID="25" ISLAND="North Island" NAME="BOLLARD AVE" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="6" RD_SEG_LNK="63647" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="One Tree Hill" TOWN="Auckland" TURNRESLNK="ak24" URBANRURAL="U" ID1="42">+    <vertices>+      <vertex X="174.786526" Y="-36.902359"/>+      <vertex X="174.786637" Y="-36.902407"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="42" ADD_L_DIR="1" ADD_L_MAX="34" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="41" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="HONEYSUCKLE LANE" ID="26" ISLAND="North Island" NAME="HONEYSUCKLE LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63646" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Mairangi Bay" TOWN="North Shore" TURNRESLNK="ak25" URBANRURAL="U" ID1="43">+    <vertices>+      <vertex X="174.741128" Y="-36.736259"/>+      <vertex X="174.741358" Y="-36.736481"/>+      <vertex X="174.741422" Y="-36.736503"/>+      <vertex X="174.741459" Y="-36.736506"/>+      <vertex X="174.742485" Y="-36.736318"/>+      <vertex X="174.742653" Y="-36.736325"/>+      <vertex X="174.744429" Y="-36.736584"/>+      <vertex X="174.744678" Y="-36.736644"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="43" ADD_L_DIR="1" ADD_L_MAX="47" ADD_L_MIN="1" ADD_L_TYPE="M" ADD_R_DIR="1" ADD_R_MAX="42" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="PALLISER LANE" ID="27" ISLAND="North Island" NAME="PALLISER LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63643" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Browns Bay" TOWN="North Shore" TURNRESLNK="ak26" URBANRURAL="U" ID1="44">+    <vertices>+      <vertex X="174.728908" Y="-36.723964"/>+      <vertex X="174.728860" Y="-36.724225"/>+      <vertex X="174.728827" Y="-36.724343"/>+      <vertex X="174.728794" Y="-36.724425"/>+      <vertex X="174.728743" Y="-36.724477"/>+      <vertex X="174.728285" Y="-36.724653"/>+      <vertex X="174.727985" Y="-36.724765"/>+      <vertex X="174.727794" Y="-36.724862"/>+      <vertex X="174.727023" Y="-36.725360"/>+      <vertex X="174.726975" Y="-36.725391"/>+      <vertex X="174.726550" Y="-36.725542"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="44" ADD_L_DIR="1" ADD_L_MAX="43" ADD_L_MIN="33" ADD_L_TYPE="O" ADD_R_DIR="1" ADD_R_MAX="44" ADD_R_MIN="36" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Rodney" FULL_NAME="BERENICE LANE" ID="67" ISLAND="North Island" NAME="BERENICE LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63642" REGION="Auckland" ROUTE="" SH_NO="" SPEED="100" SR="0" SUBURB="Coatesville" TOWN="" TURNRESLNK="ak93" URBANRURAL="R" ID1="45">+    <vertices>+      <vertex X="174.609999" Y="-36.735115"/>+      <vertex X="174.610605" Y="-36.734742"/>+      <vertex X="174.613196" Y="-36.734630"/>+      <vertex X="174.613911" Y="-36.734341"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="45" ADD_L_DIR="1" ADD_L_MAX="22" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="27" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="MARTIN JUGUM LANE" ID="68" ISLAND="North Island" NAME="MARTIN JUGUM LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63641" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Ranui" TOWN="Waitakere" TURNRESLNK="ak94" URBANRURAL="U" ID1="46">+    <vertices>+      <vertex X="174.607807" Y="-36.866540"/>+      <vertex X="174.607892" Y="-36.866638"/>+      <vertex X="174.608251" Y="-36.866944"/>+      <vertex X="174.608487" Y="-36.867111"/>+      <vertex X="174.608763" Y="-36.867248"/>+      <vertex X="174.609359" Y="-36.867418"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="46" ADD_L_DIR="1" ADD_L_MAX="10" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="19" ADD_R_MIN="3" ADD_R_TYPE="M" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="SUMMERFIELD LANE" ID="69" ISLAND="North Island" NAME="SUMMERFIELD LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63640" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Albany" TOWN="North Shore" TURNRESLNK="ak95" URBANRURAL="U" ID1="47">+    <vertices>+      <vertex X="174.691313" Y="-36.734866"/>+      <vertex X="174.690747" Y="-36.734736"/>+      <vertex X="174.689931" Y="-36.734486"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="47" ADD_L_DIR="1" ADD_L_MAX="45" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="1" ADD_R_MAX="48" ADD_R_MIN="4" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Rodney" FULL_NAME="DYSART LANE" ID="70" ISLAND="North Island" NAME="DYSART LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63638" REGION="Auckland" ROUTE="" SH_NO="" SPEED="100" SR="0" SUBURB="Kumeu" TOWN="" TURNRESLNK="ak96" URBANRURAL="R" ID1="48">+    <vertices>+      <vertex X="174.540356" Y="-36.798417"/>+      <vertex X="174.542820" Y="-36.794720"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="48" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="1" ADD_R_MAX="69" ADD_R_MIN="69" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Rodney" FULL_NAME="CHERRY BLOSSOM LANE" ID="71" ISLAND="North Island" NAME="CHERRY BLOSSOM LN" NAMED_AREA="" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63637" REGION="Auckland" ROUTE="" SH_NO="" SPEED="100" SR="0" SUBURB="Te Pua" TOWN="" TURNRESLNK="ak97" URBANRURAL="R" ID1="49">+    <vertices>+      <vertex X="174.408949" Y="-36.683874"/>+      <vertex X="174.408647" Y="-36.684589"/>+      <vertex X="174.408495" Y="-36.684653"/>+      <vertex X="174.408054" Y="-36.684705"/>+      <vertex X="174.407883" Y="-36.684785"/>+      <vertex X="174.407781" Y="-36.684957"/>+      <vertex X="174.407799" Y="-36.685343"/>+      <vertex X="174.409682" Y="-36.689106"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="49" ADD_L_DIR="1" ADD_L_MAX="51" ADD_L_MIN="23" ADD_L_TYPE="O" ADD_R_DIR="1" ADD_R_MAX="61" ADD_R_MIN="34" ADD_R_TYPE="M" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Rodney" FULL_NAME="PIONEER LANE" ID="72" ISLAND="North Island" NAME="PIONEER LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63636" REGION="Auckland" ROUTE="" SH_NO="" SPEED="100" SR="0" SUBURB="Taupaki" TOWN="" TURNRESLNK="ak98" URBANRURAL="R" ID1="50">+    <vertices>+      <vertex X="174.521642" Y="-36.811908"/>+      <vertex X="174.520775" Y="-36.812576"/>+      <vertex X="174.519719" Y="-36.812978"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="50" ADD_L_DIR="1" ADD_L_MAX="81" ADD_L_MIN="45" ADD_L_TYPE="O" ADD_R_DIR="1" ADD_R_MAX="82" ADD_R_MIN="50" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Rodney" FULL_NAME="ROSS LANE" ID="73" ISLAND="North Island" NAME="ROSS LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63634" REGION="Auckland" ROUTE="" SH_NO="" SPEED="100" SR="0" SUBURB="Huapai" TOWN="" TURNRESLNK="ak99" URBANRURAL="R" ID1="51">+    <vertices>+      <vertex X="174.513874" Y="-36.792036"/>+      <vertex X="174.509156" Y="-36.793528"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="51" ADD_L_DIR="1" ADD_L_MAX="25" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="1" ADD_R_MAX="41" ADD_R_MIN="2" ADD_R_TYPE="M" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Rodney" FULL_NAME="SARAH TODD LANE" ID="74" ISLAND="North Island" NAME="SARAH TODD LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63632" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Waimauku" TOWN="" TURNRESLNK="ak100" URBANRURAL="R" ID1="52">+    <vertices>+      <vertex X="174.491722" Y="-36.769882"/>+      <vertex X="174.492339" Y="-36.770018"/>+      <vertex X="174.492473" Y="-36.770058"/>+      <vertex X="174.492585" Y="-36.770108"/>+      <vertex X="174.492673" Y="-36.770145"/>+      <vertex X="174.492751" Y="-36.770176"/>+      <vertex X="174.492872" Y="-36.770220"/>+      <vertex X="174.492974" Y="-36.770252"/>+      <vertex X="174.493106" Y="-36.770287"/>+      <vertex X="174.493237" Y="-36.770311"/>+      <vertex X="174.493256" Y="-36.770314"/>+      <vertex X="174.493276" Y="-36.770317"/>+      <vertex X="174.493376" Y="-36.770323"/>+      <vertex X="174.493492" Y="-36.770329"/>+      <vertex X="174.493583" Y="-36.770329"/>+      <vertex X="174.493612" Y="-36.770329"/>+      <vertex X="174.493742" Y="-36.770330"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="52" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="1" ADD_R_MAX="44" ADD_R_MIN="6" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Rodney" FULL_NAME="POYNTER LANE" ID="75" ISLAND="North Island" NAME="POYNTER LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63631" REGION="Auckland" ROUTE="" SH_NO="" SPEED="100" SR="0" SUBURB="Pine Valley" TOWN="" TURNRESLNK="ak101" URBANRURAL="R" ID1="53">+    <vertices>+      <vertex X="174.626114" Y="-36.630809"/>+      <vertex X="174.625650" Y="-36.630147"/>+      <vertex X="174.624725" Y="-36.628828"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="53" ADD_L_DIR="1" ADD_L_MAX="40" ADD_L_MIN="14" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="22" ADD_R_MIN="22" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Rodney" FULL_NAME="PETERS LANE" ID="76" ISLAND="North Island" NAME="PETERS LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63630" REGION="Auckland" ROUTE="" SH_NO="" SPEED="100" SR="0" SUBURB="Taupaki" TOWN="" TURNRESLNK="ak102" URBANRURAL="R" ID1="54">+    <vertices>+      <vertex X="174.536625" Y="-36.824937"/>+      <vertex X="174.536109" Y="-36.823184"/>+      <vertex X="174.534002" Y="-36.822798"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="54" ADD_L_DIR="1" ADD_L_MAX="10" ADD_L_MIN="1" ADD_L_TYPE="M" ADD_R_DIR="-1" ADD_R_MAX="15" ADD_R_MIN="11" ADD_R_TYPE="M" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="SIMMONDS LANE" ID="77" ISLAND="North Island" NAME="SIMMONDS LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63628" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Mount Wellington" TOWN="Auckland" TURNRESLNK="ak103" URBANRURAL="U" ID1="55">+    <vertices>+      <vertex X="174.837888" Y="-36.905740"/>+      <vertex X="174.837440" Y="-36.905565"/>+      <vertex X="174.837366" Y="-36.905529"/>+      <vertex X="174.837323" Y="-36.905485"/>+      <vertex X="174.837285" Y="-36.905432"/>+      <vertex X="174.837190" Y="-36.905230"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="55" ADD_L_DIR="1" ADD_L_MAX="19" ADD_L_MIN="8" ADD_L_TYPE="M" ADD_R_DIR="-1" ADD_R_MAX="7" ADD_R_MIN="1" ADD_R_TYPE="M" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="MARINE LANE" ID="78" ISLAND="North Island" NAME="MARINE LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63627" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Panmure" TOWN="Auckland" TURNRESLNK="ak104" URBANRURAL="U" ID1="56">+    <vertices>+      <vertex X="174.851022" Y="-36.908243"/>+      <vertex X="174.851100" Y="-36.908210"/>+      <vertex X="174.851197" Y="-36.908185"/>+      <vertex X="174.851424" Y="-36.908187"/>+      <vertex X="174.851546" Y="-36.908196"/>+      <vertex X="174.851632" Y="-36.908223"/>+      <vertex X="174.851696" Y="-36.908275"/>+      <vertex X="174.851731" Y="-36.908333"/>+      <vertex X="174.851739" Y="-36.908399"/>+      <vertex X="174.851736" Y="-36.908488"/>+      <vertex X="174.851734" Y="-36.908601"/>+      <vertex X="174.851747" Y="-36.908698"/>+      <vertex X="174.851787" Y="-36.908818"/>+      <vertex X="174.851886" Y="-36.909043"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="56" ADD_L_DIR="1" ADD_L_MAX="8" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="-1" ADD_R_MAX="12" ADD_R_MIN="10" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="CONVAMORE LANE" ID="79" ISLAND="North Island" NAME="CONVAMORE LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="0" OWNERSHIP="1" RC="6" RD_SEG_LNK="63626" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Mount Wellington" TOWN="Auckland" TURNRESLNK="ak105" URBANRURAL="U" ID1="57">+    <vertices>+      <vertex X="174.850544" Y="-36.909363"/>+      <vertex X="174.850607" Y="-36.908479"/>+      <vertex X="174.850588" Y="-36.908421"/>+      <vertex X="174.850526" Y="-36.908385"/>+      <vertex X="174.850149" Y="-36.908363"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="57" ADD_L_DIR="-1" ADD_L_MAX="53" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="24" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="CONVOY LANE" ID="80" ISLAND="North Island" NAME="CONVOY LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63625" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Otahuhu" TOWN="Auckland" TURNRESLNK="ak106" URBANRURAL="U" ID1="58">+    <vertices>+      <vertex X="174.854789" Y="-36.932748"/>+      <vertex X="174.854754" Y="-36.933246"/>+      <vertex X="174.854574" Y="-36.935832"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="58" ADD_L_DIR="-1" ADD_L_MAX="6" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="-1" ADD_R_MAX="11" ADD_R_MIN="1" ADD_R_TYPE="M" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="MELODY LANE" ID="81" ISLAND="North Island" NAME="MELODY LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63624" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Otahuhu" TOWN="Auckland" TURNRESLNK="ak107" URBANRURAL="U" ID1="59">+    <vertices>+      <vertex X="174.853044" Y="-36.945118"/>+      <vertex X="174.853225" Y="-36.945157"/>+      <vertex X="174.853855" Y="-36.945035"/>+      <vertex X="174.853956" Y="-36.944992"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="59" ADD_L_DIR="1" ADD_L_MAX="4" ADD_L_MIN="1" ADD_L_TYPE="M" ADD_R_DIR="-1" ADD_R_MAX="8" ADD_R_MIN="5" ADD_R_TYPE="M" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="DEBORAH HATTON LANE" ID="82" ISLAND="North Island" NAME="DEBORAH HATTON LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="0" OWNERSHIP="1" RC="6" RD_SEG_LNK="63616" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Otahuhu" TOWN="Auckland" TURNRESLNK="ak108" URBANRURAL="U" ID1="60">+    <vertices>+      <vertex X="174.849189" Y="-36.930396"/>+      <vertex X="174.849748" Y="-36.930387"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="60" ADD_L_DIR="-1" ADD_L_MAX="71" ADD_L_MIN="69" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="78" ADD_R_MIN="70" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="WOLVERTON STREET" ID="124" ISLAND="North Island" NAME="WOLVERTON ST" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="2" RD_SEG_LNK="63615" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Avondale" TOWN="Auckland" TURNRESLNK="ak254" URBANRURAL="U" ID1="61">+    <vertices>+      <vertex X="174.695523" Y="-36.909057"/>+      <vertex X="174.696334" Y="-36.908654"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="61" ADD_L_DIR="1" ADD_L_MAX="13" ADD_L_MIN="1" ADD_L_TYPE="M" ADD_R_DIR="-1" ADD_R_MAX="33" ADD_R_MIN="17" ADD_R_TYPE="M" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="COTSWOLD LANE" ID="51" ISLAND="North Island" NAME="COTSWOLD LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63614" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Mount Wellington" TOWN="Auckland" TURNRESLNK="ak53" URBANRURAL="U" ID1="62">+    <vertices>+      <vertex X="174.823371" Y="-36.911283"/>+      <vertex X="174.823512" Y="-36.911226"/>+      <vertex X="174.824201" Y="-36.911003"/>+      <vertex X="174.824304" Y="-36.910974"/>+      <vertex X="174.824402" Y="-36.910955"/>+      <vertex X="174.824497" Y="-36.910945"/>+      <vertex X="174.824604" Y="-36.910939"/>+      <vertex X="174.824727" Y="-36.910939"/>+      <vertex X="174.824982" Y="-36.910949"/>+      <vertex X="174.825108" Y="-36.910949"/>+      <vertex X="174.825223" Y="-36.910943"/>+      <vertex X="174.825305" Y="-36.910933"/>+      <vertex X="174.825411" Y="-36.910905"/>+      <vertex X="174.825519" Y="-36.910858"/>+      <vertex X="174.825621" Y="-36.910806"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="62" ADD_L_DIR="1" ADD_L_MAX="14" ADD_L_MIN="4" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="13" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="LEASIDE LANE" ID="52" ISLAND="North Island" NAME="LEASIDE LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63613" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Glen Innes" TOWN="Auckland" TURNRESLNK="ak54" URBANRURAL="U" ID1="63">+    <vertices>+      <vertex X="174.866100" Y="-36.874944"/>+      <vertex X="174.864949" Y="-36.874544"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="63" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="-1" ADD_R_MAX="4" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="HORNES LANE" ID="53" ISLAND="North Island" NAME="HORNES LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63612" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Onehunga" TOWN="Auckland" TURNRESLNK="ak55" URBANRURAL="U" ID1="64">+    <vertices>+      <vertex X="174.776373" Y="-36.922343"/>+      <vertex X="174.776316" Y="-36.922307"/>+      <vertex X="174.775964" Y="-36.922240"/>+      <vertex X="174.775859" Y="-36.922257"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="64" ADD_L_DIR="1" ADD_L_MAX="1" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="LOWER MUNICIPAL PLACE" ID="54" ISLAND="North Island" NAME="LOWER MUNICIPAL PL" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63611" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Onehunga" TOWN="Auckland" TURNRESLNK="ak56" URBANRURAL="U" ID1="65">+    <vertices>+      <vertex X="174.783876" Y="-36.923053"/>+      <vertex X="174.784036" Y="-36.924250"/>+      <vertex X="174.784055" Y="-36.924297"/>+      <vertex X="174.784084" Y="-36.924341"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="65" ADD_L_DIR="-1" ADD_L_MAX="11" ADD_L_MIN="3" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="10" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="TYNOR PLACE" ID="55" ISLAND="North Island" NAME="TYNOR PL" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63610" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Hillsborough" TOWN="Auckland" TURNRESLNK="ak57" URBANRURAL="U" ID1="66">+    <vertices>+      <vertex X="174.760577" Y="-36.923815"/>+      <vertex X="174.760323" Y="-36.923977"/>+      <vertex X="174.759957" Y="-36.924341"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="66" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="UPPER MUNICIPAL PLACE" ID="56" ISLAND="North Island" NAME="UPPER MUNICIPAL PL" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63609" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Onehunga" TOWN="Auckland" TURNRESLNK="ak58" URBANRURAL="U" ID1="67">+    <vertices>+      <vertex X="174.784562" Y="-36.922991"/>+      <vertex X="174.784745" Y="-36.924290"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="67" ADD_L_DIR="1" ADD_L_MAX="18" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="11" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="GEORGE LAURENSON LANE" ID="57" ISLAND="North Island" NAME="GEORGE LAURENSON LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63608" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Waikowhai" TOWN="Auckland" TURNRESLNK="ak59" URBANRURAL="U" ID1="68">+    <vertices>+      <vertex X="174.732340" Y="-36.932485"/>+      <vertex X="174.732194" Y="-36.932424"/>+      <vertex X="174.732039" Y="-36.932357"/>+      <vertex X="174.731943" Y="-36.932310"/>+      <vertex X="174.731750" Y="-36.932199"/>+      <vertex X="174.731692" Y="-36.932171"/>+      <vertex X="174.731617" Y="-36.932139"/>+      <vertex X="174.731547" Y="-36.932113"/>+      <vertex X="174.731478" Y="-36.932081"/>+      <vertex X="174.731427" Y="-36.932047"/>+      <vertex X="174.731401" Y="-36.932005"/>+      <vertex X="174.731383" Y="-36.931948"/>+      <vertex X="174.731360" Y="-36.931834"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="68" ADD_L_DIR="-1" ADD_L_MAX="41" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="43" ADD_R_MIN="2" ADD_R_TYPE="M" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="DANUBE LANE" ID="58" ISLAND="North Island" NAME="DANUBE LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63607" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Glen Eden" TOWN="Waitakere" TURNRESLNK="ak60" URBANRURAL="U" ID1="69">+    <vertices>+      <vertex X="174.631432" Y="-36.918479"/>+      <vertex X="174.631385" Y="-36.918487"/>+      <vertex X="174.630877" Y="-36.918290"/>+      <vertex X="174.629824" Y="-36.917887"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="69" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="BAKERS LANE" ID="59" ISLAND="North Island" NAME="BAKERS LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63606" REGION="Auckland" ROUTE="" SH_NO="" SPEED="100" SR="0" SUBURB="Whenuapai" TOWN="" TURNRESLNK="ak61" URBANRURAL="R" ID1="70">+    <vertices>+      <vertex X="174.602054" Y="-36.822786"/>+      <vertex X="174.604625" Y="-36.820273"/>+      <vertex X="174.604716" Y="-36.820154"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="70" ADD_L_DIR="1" ADD_L_MAX="8" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="11" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="RUBENS LANE" ID="60" ISLAND="North Island" NAME="RUBENS LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63605" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="West Harbour" TOWN="Waitakere" TURNRESLNK="ak62" URBANRURAL="U" ID1="71">+    <vertices>+      <vertex X="174.635083" Y="-36.821030"/>+      <vertex X="174.634745" Y="-36.820963"/>+      <vertex X="174.634522" Y="-36.821011"/>+      <vertex X="174.634200" Y="-36.821064"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="71" ADD_L_DIR="1" ADD_L_MAX="4" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="3" ADD_R_MIN="3" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="SWAN LANE" ID="61" ISLAND="North Island" NAME="SWAN LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63604" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Henderson" TOWN="Waitakere" TURNRESLNK="ak63" URBANRURAL="U" ID1="72">+    <vertices>+      <vertex X="174.637982" Y="-36.870826"/>+      <vertex X="174.637337" Y="-36.871554"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="72" ADD_L_DIR="-1" ADD_L_MAX="9" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="8" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="BASIN VIEW LANE" ID="62" ISLAND="North Island" NAME="BASIN VIEW LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63602" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Panmure" TOWN="Auckland" TURNRESLNK="ak64" URBANRURAL="U" ID1="73">+    <vertices>+      <vertex X="174.854626" Y="-36.900384"/>+      <vertex X="174.855122" Y="-36.899952"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="73" ADD_L_DIR="-1" ADD_L_MAX="15" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="16" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="GLENTIES LANE" ID="63" ISLAND="North Island" NAME="GLENTIES LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63601" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Ellerslie" TOWN="Auckland" TURNRESLNK="ak65" URBANRURAL="U" ID1="74">+    <vertices>+      <vertex X="174.823038" Y="-36.889889"/>+      <vertex X="174.823083" Y="-36.889757"/>+      <vertex X="174.823292" Y="-36.889157"/>+      <vertex X="174.823300" Y="-36.889114"/>+      <vertex X="174.823301" Y="-36.889071"/>+      <vertex X="174.823295" Y="-36.889021"/>+      <vertex X="174.823238" Y="-36.888703"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="74" ADD_L_DIR="1" ADD_L_MAX="24" ADD_L_MIN="24" ADD_L_TYPE="E" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="MERCURY LANE" ID="8" ISLAND="North Island" NAME="MERCURY LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="3" RD_SEG_LNK="63668" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Newton" TOWN="Auckland" TURNRESLNK="ak7" URBANRURAL="U" ID1="75">+    <vertices>+      <vertex X="174.759225" Y="-36.858848"/>+      <vertex X="174.759338" Y="-36.859103"/>+      <vertex X="174.759415" Y="-36.859210"/>+      <vertex X="174.759542" Y="-36.859290"/>+      <vertex X="174.759672" Y="-36.859371"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="75" ADD_L_DIR="1" ADD_L_MAX="1" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="12" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="SAINT MARTINS LANE" ID="9" ISLAND="North Island" NAME="ST MARTINS LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63600" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Auckland City Centre" TOWN="Auckland" TURNRESLNK="ak8" URBANRURAL="U" ID1="76">+    <vertices>+      <vertex X="174.764743" Y="-36.857990"/>+      <vertex X="174.765292" Y="-36.857534"/>+      <vertex X="174.764862" Y="-36.857203"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="76" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="MARKET LANE" ID="10" ISLAND="North Island" NAME="MARKET LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63599" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Auckland City Centre" TOWN="Auckland" TURNRESLNK="ak9" URBANRURAL="U" ID1="77">+    <vertices>+      <vertex X="174.762109" Y="-36.844683"/>+      <vertex X="174.762082" Y="-36.844587"/>+      <vertex X="174.762074" Y="-36.844527"/>+      <vertex X="174.762076" Y="-36.844486"/>+      <vertex X="174.762089" Y="-36.844443"/>+      <vertex X="174.762166" Y="-36.844249"/>+      <vertex X="174.762278" Y="-36.843958"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="77" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="MARKET LANE" ID="11" ISLAND="North Island" NAME="MARKET LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63599" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Auckland City Centre" TOWN="Auckland" TURNRESLNK="ak10" URBANRURAL="U" ID1="78">+    <vertices>+      <vertex X="174.762278" Y="-36.843958"/>+      <vertex X="174.762447" Y="-36.843521"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="78" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="BRADNOR LANE" ID="12" ISLAND="North Island" NAME="BRADNOR LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63598" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Auckland City Centre" TOWN="Auckland" TURNRESLNK="ak11" URBANRURAL="U" ID1="79">+    <vertices>+      <vertex X="174.761602" Y="-36.845360"/>+      <vertex X="174.761611" Y="-36.845392"/>+      <vertex X="174.761629" Y="-36.845423"/>+      <vertex X="174.761650" Y="-36.845446"/>+      <vertex X="174.761692" Y="-36.845467"/>+      <vertex X="174.762667" Y="-36.845767"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="79" ADD_L_DIR="1" ADD_L_MAX="14" ADD_L_MIN="4" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="15" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="SAINT THOMAS MORE LANE" ID="163" ISLAND="North Island" NAME="ST THOMAS MORE LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63597" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Glenfield" TOWN="North Shore" TURNRESLNK="ak146" URBANRURAL="U" ID1="80">+    <vertices>+      <vertex X="174.721762" Y="-36.770566"/>+      <vertex X="174.722295" Y="-36.770628"/>+      <vertex X="174.722843" Y="-36.771146"/>+      <vertex X="174.722944" Y="-36.771241"/>+      <vertex X="174.723064" Y="-36.771246"/>+      <vertex X="174.723102" Y="-36.771201"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="80" ADD_L_DIR="1" ADD_L_MAX="28" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="11" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="TYBURN LANE" ID="164" ISLAND="North Island" NAME="TYBURN LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63596" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Unsworth Heights" TOWN="North Shore" TURNRESLNK="ak147" URBANRURAL="U" ID1="81">+    <vertices>+      <vertex X="174.713292" Y="-36.759233"/>+      <vertex X="174.713272" Y="-36.759544"/>+      <vertex X="174.712937" Y="-36.759900"/>+      <vertex X="174.712843" Y="-36.759922"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="81" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="ROSEBERRY LANE" ID="165" ISLAND="North Island" NAME="ROSEBERRY LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63594" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Birkenhead" TOWN="North Shore" TURNRESLNK="ak148" URBANRURAL="U" ID1="82">+    <vertices>+      <vertex X="174.714800" Y="-36.809357"/>+      <vertex X="174.715762" Y="-36.809337"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="82" ADD_L_DIR="1" ADD_L_MAX="14" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="11" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="PELICAN LANE" ID="166" ISLAND="North Island" NAME="PELICAN LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63593" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="The Palms" TOWN="North Shore" TURNRESLNK="ak149" URBANRURAL="U" ID1="83">+    <vertices>+      <vertex X="174.716272" Y="-36.760730"/>+      <vertex X="174.716504" Y="-36.760433"/>+      <vertex X="174.716575" Y="-36.760095"/>+      <vertex X="174.716642" Y="-36.760028"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="83" ADD_L_DIR="1" ADD_L_MAX="89" ADD_L_MIN="21" ADD_L_TYPE="O" ADD_R_DIR="1" ADD_R_MAX="86" ADD_R_MIN="6" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Rodney" FULL_NAME="CROFT LANE" ID="167" ISLAND="North Island" NAME="CROFT LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63592" REGION="Auckland" ROUTE="" SH_NO="" SPEED="100" SR="0" SUBURB="Coatesville" TOWN="" TURNRESLNK="ak150" URBANRURAL="R" ID1="84">+    <vertices>+      <vertex X="174.608952" Y="-36.730269"/>+      <vertex X="174.608998" Y="-36.728435"/>+      <vertex X="174.611995" Y="-36.727512"/>+      <vertex X="174.614542" Y="-36.727276"/>+      <vertex X="174.616560" Y="-36.726837"/>+      <vertex X="174.616910" Y="-36.726860"/>+      <vertex X="174.617176" Y="-36.726997"/>+      <vertex X="174.617228" Y="-36.727194"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="84" ADD_L_DIR="-1" ADD_L_MAX="7" ADD_L_MIN="5" ADD_L_TYPE="M" ADD_R_DIR="-1" ADD_R_MAX="4" ADD_R_MIN="1" ADD_R_TYPE="M" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Rodney" FULL_NAME="LOGAN LANE" ID="168" ISLAND="North Island" NAME="LOGAN LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="HIBISCUS COAST" NAMED_ARE2="WHANGAPARAOA PENINSULA" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63591" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Stanmore Bay" TOWN="Whangaparaoa" TURNRESLNK="ak151" URBANRURAL="U" ID1="85">+    <vertices>+      <vertex X="174.721974" Y="-36.620861"/>+      <vertex X="174.722470" Y="-36.620454"/>+      <vertex X="174.722548" Y="-36.620444"/>+      <vertex X="174.722624" Y="-36.620466"/>+      <vertex X="174.722668" Y="-36.620511"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="85" ADD_L_DIR="-1" ADD_L_MAX="18" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="-1" ADD_R_MAX="37" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Rodney" FULL_NAME="BAKEHOUSE LANE" ID="169" ISLAND="North Island" NAME="BAKEHOUSE LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="HIBISCUS COAST" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63589" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Orewa" TOWN="Orewa" TURNRESLNK="ak152" URBANRURAL="U" ID1="86">+    <vertices>+      <vertex X="174.695998" Y="-36.587363"/>+      <vertex X="174.695576" Y="-36.586401"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="86" ADD_L_DIR="1" ADD_L_MAX="81" ADD_L_MIN="31" ADD_L_TYPE="O" ADD_R_DIR="1" ADD_R_MAX="88" ADD_R_MIN="44" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Rodney" FULL_NAME="BURNS LANE" ID="170" ISLAND="North Island" NAME="BURNS LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="0" OWNERSHIP="1" RC="6" RD_SEG_LNK="63588" REGION="Auckland" ROUTE="" SH_NO="" SPEED="100" SR="0" SUBURB="Kumeu" TOWN="" TURNRESLNK="ak153" URBANRURAL="R" ID1="87">+    <vertices>+      <vertex X="174.556592" Y="-36.765629"/>+      <vertex X="174.556029" Y="-36.765517"/>+      <vertex X="174.555933" Y="-36.765481"/>+      <vertex X="174.555869" Y="-36.765424"/>+      <vertex X="174.551561" Y="-36.761151"/>+      <vertex X="174.551470" Y="-36.761049"/>+      <vertex X="174.551412" Y="-36.760920"/>+      <vertex X="174.551402" Y="-36.760817"/>+      <vertex X="174.551403" Y="-36.760670"/>+      <vertex X="174.551464" Y="-36.760087"/>+      <vertex X="174.551439" Y="-36.759710"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="87" ADD_L_DIR="1" ADD_L_MAX="60" ADD_L_MIN="15" ADD_L_TYPE="M" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Rodney" FULL_NAME="GOLDFLATS LANE" ID="171" ISLAND="North Island" NAME="GOLDFLATS LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63587" REGION="Auckland" ROUTE="" SH_NO="" SPEED="100" SR="0" SUBURB="Coatesville" TOWN="" TURNRESLNK="ak154" URBANRURAL="R" ID1="88">+    <vertices>+      <vertex X="174.623641" Y="-36.733450"/>+      <vertex X="174.625973" Y="-36.736026"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="88" ADD_L_DIR="1" ADD_L_MAX="14" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="9" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="FALSTONE LANE" ID="172" ISLAND="North Island" NAME="FALSTONE LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63586" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Browns Bay" TOWN="North Shore" TURNRESLNK="ak155" URBANRURAL="U" ID1="89">+    <vertices>+      <vertex X="174.726189" Y="-36.721564"/>+      <vertex X="174.725102" Y="-36.721261"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="89" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="1" ADD_R_MAX="53" ADD_R_MIN="53" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="PENCARROW AVENUE" ID="132" ISLAND="North Island" NAME="PENCARROW AVE" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63585" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Epsom" TOWN="Auckland" TURNRESLNK="ak115" URBANRURAL="U" ID1="90">+    <vertices>+      <vertex X="174.766126" Y="-36.889163"/>+      <vertex X="174.766231" Y="-36.889204"/>+      <vertex X="174.766327" Y="-36.889264"/>+      <vertex X="174.766614" Y="-36.889485"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="90" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="1" ADD_R_MAX="17" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="SELBY SQUARE" ID="133" ISLAND="North Island" NAME="SELBY SQ" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63583" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Saint Marys Bay" TOWN="Auckland" TURNRESLNK="ak116" URBANRURAL="U" ID1="91">+    <vertices>+      <vertex X="174.743485" Y="-36.845338"/>+      <vertex X="174.743746" Y="-36.845500"/>+      <vertex X="174.743776" Y="-36.845513"/>+      <vertex X="174.743803" Y="-36.845518"/>+      <vertex X="174.743826" Y="-36.845516"/>+      <vertex X="174.743846" Y="-36.845512"/>+      <vertex X="174.743862" Y="-36.845501"/>+      <vertex X="174.743880" Y="-36.845484"/>+      <vertex X="174.744105" Y="-36.845225"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="91" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="UNION STREET" ID="134" ISLAND="North Island" NAME="UNION ST" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63565" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Freemans Bay" TOWN="Auckland" TURNRESLNK="ak117" URBANRURAL="U" ID1="92">+    <vertices>+      <vertex X="174.754498" Y="-36.850543"/>+      <vertex X="174.754557" Y="-36.850419"/>+      <vertex X="174.754610" Y="-36.850378"/>+      <vertex X="174.754695" Y="-36.850346"/>+      <vertex X="174.754819" Y="-36.850324"/>+      <vertex X="174.754952" Y="-36.850328"/>+      <vertex X="174.755257" Y="-36.850394"/>+      <vertex X="174.755372" Y="-36.850419"/>+      <vertex X="174.755711" Y="-36.850433"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="92" ADD_L_DIR="1" ADD_L_MAX="10" ADD_L_MIN="6" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="9" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="YARBOROUGH STREET" ID="136" ISLAND="North Island" NAME="YARBOROUGH ST" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63562" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Saint Marys Bay" TOWN="Auckland" TURNRESLNK="ak119" URBANRURAL="U" ID1="93">+    <vertices>+      <vertex X="174.745114" Y="-36.845546"/>+      <vertex X="174.744105" Y="-36.845225"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="93" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="SULTAN LANE" ID="87" ISLAND="North Island" NAME="SULTAN LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63561" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Ellerslie" TOWN="Auckland" TURNRESLNK="ak68" URBANRURAL="U" ID1="94">+    <vertices>+      <vertex X="174.807469" Y="-36.898926"/>+      <vertex X="174.807974" Y="-36.898539"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="94" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="-1" ADD_R_MAX="250" ADD_R_MIN="240" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="TANIWHA STREET" ID="88" ISLAND="North Island" NAME="TANIWHA ST" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63555" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Glen Innes" TOWN="Auckland" TURNRESLNK="ak69" URBANRURAL="U" ID1="95">+    <vertices>+      <vertex X="174.854332" Y="-36.878091"/>+      <vertex X="174.854497" Y="-36.878020"/>+      <vertex X="174.854715" Y="-36.877982"/>+      <vertex X="174.854783" Y="-36.877963"/>+      <vertex X="174.854823" Y="-36.877941"/>+      <vertex X="174.854855" Y="-36.877909"/>+      <vertex X="174.854876" Y="-36.877874"/>+      <vertex X="174.854887" Y="-36.877834"/>+      <vertex X="174.854889" Y="-36.877777"/>+      <vertex X="174.854877" Y="-36.877733"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="95" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="STRATTON LANE" ID="89" ISLAND="North Island" NAME="STRATTON LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63554" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Glen Innes" TOWN="Auckland" TURNRESLNK="ak70" URBANRURAL="U" ID1="96">+    <vertices>+      <vertex X="174.855619" Y="-36.879355"/>+      <vertex X="174.855667" Y="-36.879556"/>+      <vertex X="174.855826" Y="-36.879538"/>+      <vertex X="174.856320" Y="-36.879634"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="96" ADD_L_DIR="1" ADD_L_MAX="13" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="1" ADD_R_MAX="12" ADD_R_MIN="2" ADD_R_TYPE="M" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="TOSCA LANE" ID="143" ISLAND="North Island" NAME="TOSCA LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63553" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Point England" TOWN="Auckland" TURNRESLNK="ak126" URBANRURAL="U" ID1="97">+    <vertices>+      <vertex X="174.860267" Y="-36.879043"/>+      <vertex X="174.860411" Y="-36.879063"/>+      <vertex X="174.861071" Y="-36.879128"/>+      <vertex X="174.861522" Y="-36.879087"/>+      <vertex X="174.861436" Y="-36.878624"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="97" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="1" ADD_R_MAX="655" ADD_R_MIN="649" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="MANUKAU ROAD" ID="110" ISLAND="North Island" NAME="MANUKAU RD" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="2" RD_SEG_LNK="63549" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Royal Oak" TOWN="Auckland" TURNRESLNK="ak239" URBANRURAL="U" ID1="98">+    <vertices>+      <vertex X="174.774915" Y="-36.906935"/>+      <vertex X="174.775106" Y="-36.907725"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="98" ADD_L_DIR="1" ADD_L_MAX="104" ADD_L_MIN="96" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="119" ADD_R_MIN="115" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="NEWTON ROAD" ID="111" ISLAND="North Island" NAME="NEWTON RD" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="2" RD_SEG_LNK="63548" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Newton" TOWN="Auckland" TURNRESLNK="ak240" URBANRURAL="U" ID1="99">+    <vertices>+      <vertex X="174.757389" Y="-36.862992"/>+      <vertex X="174.757958" Y="-36.863119"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="99" ADD_L_DIR="-1" ADD_L_MAX="579" ADD_L_MIN="573" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="522" ADD_R_MIN="504" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="HILLSBOROUGH ROAD" ID="112" ISLAND="North Island" NAME="HILLSBOROUGH RD" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="1" RD_SEG_LNK="63535" REGION="Auckland" ROUTE="Urban Route 15" SH_NO="" SPEED="50" SR="0" SUBURB="Lynfield" TOWN="Auckland" TURNRESLNK="ak241" URBANRURAL="U" ID1="100">+    <vertices>+      <vertex X="174.724347" Y="-36.925631"/>+      <vertex X="174.724459" Y="-36.925724"/>+      <vertex X="174.724634" Y="-36.925874"/>+      <vertex X="174.724825" Y="-36.926035"/>+      <vertex X="174.725776" Y="-36.926815"/>+      <vertex X="174.725870" Y="-36.926887"/>+      <vertex X="174.725942" Y="-36.926940"/>+      <vertex X="174.726110" Y="-36.927055"/>+      <vertex X="174.726393" Y="-36.927246"/>+      <vertex X="174.726496" Y="-36.927315"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="100" ADD_L_DIR="-1" ADD_L_MAX="7" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="12" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="TRISTRAM AVENUE" ID="113" ISLAND="North Island" NAME="TRISTRAM AVE" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="1" RD_SEG_LNK="63534" REGION="Auckland" ROUTE="Urban Route 21" SH_NO="" SPEED="50" SR="0" SUBURB="Forrest Hill" TOWN="North Shore" TURNRESLNK="ak243" URBANRURAL="U" ID1="101">+    <vertices>+      <vertex X="174.747826" Y="-36.770445"/>+      <vertex X="174.749219" Y="-36.770040"/>+      <vertex X="174.749250" Y="-36.770034"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="101" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="1" ADD_R_MAX="659" ADD_R_MIN="657" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="MANUKAU ROAD" ID="114" ISLAND="North Island" NAME="MANUKAU RD" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="2" RD_SEG_LNK="63549" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Royal Oak" TOWN="Auckland" TURNRESLNK="ak244" URBANRURAL="U" ID1="102">+    <vertices>+      <vertex X="174.775106" Y="-36.907725"/>+      <vertex X="174.775199" Y="-36.908106"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="102" ADD_L_DIR="1" ADD_L_MAX="118" ADD_L_MIN="108" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="127" ADD_R_MIN="121" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="NEWTON ROAD" ID="115" ISLAND="North Island" NAME="NEWTON RD" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="2" RD_SEG_LNK="63548" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Newton" TOWN="Auckland" TURNRESLNK="ak245" URBANRURAL="U" ID1="103">+    <vertices>+      <vertex X="174.757958" Y="-36.863119"/>+      <vertex X="174.758606" Y="-36.863259"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="103" ADD_L_DIR="-1" ADD_L_MAX="8" ADD_L_MIN="1" ADD_L_TYPE="M" ADD_R_DIR="-1" ADD_R_MAX="11" ADD_R_MIN="9" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="CHERRY LANE" ID="33" ISLAND="North Island" NAME="CHERRY LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="0" OWNERSHIP="1" RC="6" RD_SEG_LNK="63533" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Glenfield" TOWN="North Shore" TURNRESLNK="ak33" URBANRURAL="U" ID1="104">+    <vertices>+      <vertex X="174.745740" Y="-36.780780"/>+      <vertex X="174.744841" Y="-36.779979"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="104" ADD_L_DIR="1" ADD_L_MAX="14" ADD_L_MIN="5" ADD_L_TYPE="M" ADD_R_DIR="-1" ADD_R_MAX="4" ADD_R_MIN="1" ADD_R_TYPE="M" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="ELDERWOOD LANE" ID="34" ISLAND="North Island" NAME="ELDERWOOD LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63526" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Belmont" TOWN="North Shore" TURNRESLNK="ak34" URBANRURAL="U" ID1="105">+    <vertices>+      <vertex X="174.785128" Y="-36.803494"/>+      <vertex X="174.784406" Y="-36.803101"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="105" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Manukau City" FULL_NAME="WATFORD STREET" ID="229" ISLAND="North Island" NAME="WATFORD ST" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63522" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Otara" TOWN="Manukau" TURNRESLNK="ak210" URBANRURAL="U" ID1="106">+    <vertices>+      <vertex X="174.872745" Y="-36.960379"/>+      <vertex X="174.872738" Y="-36.960413"/>+      <vertex X="174.872731" Y="-36.960486"/>+      <vertex X="174.872746" Y="-36.960670"/>+    </vertices>+  </shape>+  <shape shapeType="polyLine" id="106" ADD_L_DIR="1" ADD_L_MAX="484" ADD_L_MIN="140" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="411" ADD_R_MIN="75" ADD_R_TYPE="M" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Papakura" FULL_NAME="HUNUA ROAD" ID="230" ISLAND="North Island" NAME="HUNUA RD" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="3" RD_SEG_LNK="63521" REGION="Auckland" ROUTE="" SH_NO="" SPEED="100" SR="0" SUBURB="Red Hill" TOWN="Papakura" TURNRESLNK="ak211" URBANRURAL="R" ID1="107">+    <vertices>+      <vertex X="174.975798" Y="-37.075472"/>+      <vertex X="174.976585" Y="-37.075457"/>+      <vertex X="174.976789" Y="-37.075536"/>+      <vertex X="174.976827" Y="-37.075551"/>+      <vertex X="174.977052" Y="-37.075638"/>+      <vertex X="174.977470" Y="-37.075721"/>+      <vertex X="174.978963" Y="-37.075603"/>+      <vertex X="174.980279" Y="-37.075201"/>+      <vertex X="174.980735" Y="-37.075021"/>+      <vertex X="174.981142" Y="-37.074698"/>+      <vertex X="174.981180" Y="-37.074427"/>+      <vertex X="174.980887" Y="-37.073648"/>+      <vertex X="174.980700" Y="-37.073390"/>+      <vertex X="174.980648" Y="-37.073139"/>+      <vertex X="174.980690" Y="-37.073039"/>+      <vertex X="174.980847" Y="-37.073000"/>+      <vertex X="174.981197" Y="-37.073075"/>+      <vertex X="174.981701" Y="-37.072985"/>+      <vertex X="174.981914" Y="-37.072972"/>+      <vertex X="174.982619" Y="-37.072418"/>+      <vertex X="174.982929" Y="-37.072250"/>+      <vertex X="174.983356" Y="-37.072233"/>+      <vertex X="174.983724" Y="-37.072524"/>+      <vertex X="174.983981" Y="-37.072844"/>+      <vertex X="174.984317" Y="-37.073586"/>+      <vertex X="174.984488" Y="-37.073673"/>+      <vertex X="174.985129" Y="-37.073679"/>+      <vertex X="174.985819" Y="-37.073811"/>+      <vertex X="174.987735" Y="-37.074740"/>+      <vertex X="174.987897" Y="-37.074872"/>+      <vertex X="174.988529" Y="-37.075753"/>+      <vertex X="174.989204" Y="-37.076525"/>+      <vertex X="174.989827" Y="-37.076685"/>+      <vertex X="174.990158" Y="-37.076850"/>+      <vertex X="174.990654" Y="-37.077283"/>+      <vertex X="174.990747" Y="-37.077398"/>+      <vertex X="174.990887" Y="-37.077558"/>+      <vertex X="174.991457" Y="-37.077836"/>+      <vertex X="174.991798" Y="-37.077938"/>+      <vertex X="174.992227" Y="-37.078022"/>+    </vertices>+  </shape>+</shapes>
+ test/readRoads.hs view
@@ -0,0 +1,20 @@+{-# LANGUAGE OverloadedStrings #-}+import Text.XML.Expat.Tree+import Control.Monad+import Data.Text (Text)+import qualified Data.Text as T+import Data.ByteString (ByteString)+import qualified Data.ByteString.Lazy as L+import Data.Maybe+++-- Reads the contents of ROADS.xml from stdin+main :: IO ()+main = do+    bs <- L.getContents+    let Element _ _ chs = parseThrowing defaultParseOptions bs :: UNode Text+    forM_ chs $ \ch -> do+        case ch of+            elt@(Element "shape" _ _) -> do+                putStrLn $ T.unpack $ fromMaybe "" $ getAttribute elt "FULL_NAME"+            _ -> return ()
test/suite/Text/XML/Expat/ParseFormat.hs view
@@ -173,7 +173,7 @@                                 sbDoc = normalizeText $ fromElement (getRoot $ pfDoc pf)                             assertEqual "parse match" sbDoc (root :: Tree.UNode Text)                             let sb = fromMaybe (pfXML pf) (impl `lookup` pfOutXML pf)-                                bs = formatTree' root+                                bs = format' root                             assertEqual "format match" sb bs             ]         Annotated -> [@@ -185,7 +185,7 @@                                 sbDoc = normalizeText $ fromElement (getRoot $ pfDoc pf)                             assertEqual "parse match" sbDoc (root :: Annotated.UNode () Text)                             let sb = fromMaybe (pfXML pf) (impl `lookup` pfOutXML pf)-                                bs = formatTree' root+                                bs = format' root                             assertEqual "format match" sb bs             ]         Extended  -> [
test/suite/Text/XML/Expat/UnitTests.hs view
@@ -2,12 +2,14 @@  import Text.XML.Expat.Tree hiding (parse) import qualified Text.XML.Expat.Tree as Tree-import Text.XML.Expat.IO hiding (parse)-import qualified Text.XML.Expat.IO as IO+import Text.XML.Expat.SAX (SAXEvent(..))+import qualified Text.XML.Expat.SAX as SAX import Text.XML.Expat.Cursor import Text.XML.Expat.Format-import Text.XML.Expat.Qualified+import Text.XML.Expat.Extended (LDocument)+import qualified Text.XML.Expat.Extended as Extended import qualified Data.ByteString as B+import qualified Data.ByteString.Char8 as C import qualified Data.ByteString.Lazy.Char8 as LC import qualified Data.ByteString.Lazy as L import qualified Data.Text as T@@ -16,8 +18,10 @@ import Data.ByteString.Internal (c2w, w2c) import Data.Char import Data.Maybe+import Data.Monoid import Data.IORef import Control.Applicative+import Control.Arrow (first) import Control.Exception as E import Control.Monad import Control.DeepSeq@@ -98,30 +102,6 @@     assertEqual "error1" (Left $ XMLParseError "not well-formed (invalid token)"         (XMLParseLocation 1 0 0 0)) eDoc -test_parse :: IO ()-test_parse = do-    ref <- newIORef []-    let lazy = L.fromChunks [-            toByteString "<open><tes",-            toByteString "t1>Hello</test",-            toByteString "1><hello></he",-            toByteString "llo></open>"]-    parser <- newParser Nothing-    setStartElementHandler parser $ \_ cname cattrs -> do-        name <- peekCString cname-        ref <- modifyIORef ref $ \l -> ("start "++name):l-        return True-    setEndElementHandler parser $ \_ cname -> do-        name <- peekCString cname-        ref <- modifyIORef ref $ \l -> ("end "++name):l-        return True-    IO.parse parser lazy-    l <- reverse <$> readIORef ref-    assertEqual "parse"-        ["start open","start test1","end test1","start hello","end hello","end open"]-        l-- test_entities1 = do     assertEqual "parse error" merr Nothing     assertEqual "entity substitution" (Text "foo") c@@ -240,6 +220,63 @@ data ParseFormatTest = ParseFormatTest {     } +test_xmlDecl1 :: IO ()+test_xmlDecl1 = do+    assertEqual "plain" [XMLDeclaration "1.0" Nothing Nothing,StartElement "hello" [],EndElement "hello"]+        (SAX.parse defaultParseOptions (LC.pack "<?xml version=\"1.0\"?><hello/>") :: [SAXEvent String String])+    assertEqual "withEnc" [XMLDeclaration "1.0" (Just "UTF-8") Nothing,StartElement "hello" [],EndElement "hello"]+        (SAX.parse defaultParseOptions (LC.pack "<?xml version=\"1.0\" encoding=\"UTF-8\"?><hello/>") :: [SAXEvent String String])+    assertEqual "SA0" [XMLDeclaration "1.0" Nothing (Just False),StartElement "hello" [],EndElement "hello"]+        (SAX.parse defaultParseOptions (LC.pack "<?xml version=\"1.0\" standalone=\"no\"?><hello/>") :: [SAXEvent String String])+    assertEqual "SA1" [XMLDeclaration "1.0" Nothing (Just True),StartElement "hello" [],EndElement "hello"]+        (SAX.parse defaultParseOptions (LC.pack "<?xml version=\"1.0\" standalone=\"yes\"?><hello/>") :: [SAXEvent String String])+    assertEqual "SA0enc" [XMLDeclaration "1.0" (Just "UTF-8") (Just False),StartElement "hello" [],EndElement "hello"]+        (SAX.parse defaultParseOptions (LC.pack "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><hello/>") :: [SAXEvent String String])+    assertEqual "SA1enc" [XMLDeclaration "1.0" (Just "UTF-8") (Just True),StartElement "hello" [],EndElement "hello"]+        (SAX.parse defaultParseOptions (LC.pack "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><hello/>") :: [SAXEvent String String])++test_various :: IO ()+test_various =+    assertEqual "var1" [+            StartElement "test" [],+            StartElement "sample" [("id","5")],+            CharacterData "This \"text with quotations\" should be escaped.",+            EndElement "sample",+            StartElement "mytest" [],+            CharacterData "//",+            StartCData,+            CharacterData "This \"text with quotations\" should not be escaped.//",+            EndCData,+            EndElement "mytest",+            ProcessingInstruction "php" "somecode(); ",+            Comment " this is a comment ",+            EndElement "test"+        ]+        (SAX.parse defaultParseOptions (LC.pack variousText) :: [SAXEvent String String])++variousText =+    "<test>"+++    "<sample id=\"5\">This \"text with quotations\" should be escaped.</sample>"+++    "<mytest>"+++    "//<![CDATA["+++    "This \"text with quotations\" should not be escaped."+++    "//]]>"+++    "</mytest>"+++    "<?php somecode(); ?>"+++    "<!-- this is a comment -->"+++    "</test>"++quotationOut =+    "<test><sample id=\"5\">This &quot;text with quotations&quot; should be escaped.</sample>"+++    "<mytest>//<![CDATA[This \"text with quotations\" should not be escaped.//]]>"+++    "</mytest><?php somecode(); ?><!-- this is a comment --></test>"++test_quotation =+    assertEqual "quotation"+        (quotationOut, Nothing)+        $ first (C.unpack . mconcat . LC.toChunks . formatDocument)+        $ (Extended.parse defaultParseOptions (LC.pack variousText) :: (LDocument String String, Maybe XMLParseError))+ tests = hUnitTestToTests $     TestList [         t' ("String",@@ -276,12 +313,14 @@         TestLabel "error2" $ TestCase $ test_error2,         TestLabel "error3" $ TestCase $ test_error3,         TestLabel "error4" $ TestCase $ test_error4,-        TestLabel "parse" $ TestCase $ test_parse,         TestLabel "entities1" $ TestCase $ test_entities1,         TestLabel "entities2" $ TestCase $ test_entities2,         TestLabel "textContent" $ TestCase $ test_textContent,         TestLabel "indent" $ TestCase $ test_indent,-        TestLabel "setAttribute" $ TestCase $ test_setAttribute+        TestLabel "setAttribute" $ TestCase $ test_setAttribute,+        TestLabel "xmlDecl1" $ TestCase $ test_xmlDecl1,+        TestLabel "various" $ TestCase $ test_various,+        TestLabel "quotation" $ TestCase $ test_quotation       ]    where