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 +8/−71
- Text/XML/Expat/Format.hs +0/−15
- Text/XML/Expat/IO.hs +0/−9
- Text/XML/Expat/Internal/Glue.c +245/−0
- Text/XML/Expat/Internal/IO.hs +108/−666
- Text/XML/Expat/Namespaced.hs +0/−9
- Text/XML/Expat/NodeClass.hs +0/−9
- Text/XML/Expat/Qualified.hs +0/−9
- Text/XML/Expat/SAX.hs +143/−307
- Text/XML/Expat/Tree.hs +14/−148
- hexpat.cabal +11/−17
- test/ROADS.xml +1008/−0
- test/readRoads.hs +20/−0
- test/suite/Text/XML/Expat/ParseFormat.hs +2/−2
- test/suite/Text/XML/Expat/UnitTests.hs +68/−29
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 "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>"++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