From 45d762fb186388893cc8edc7f6a92d6c4b2f68f3 Mon Sep 17 00:00:00 2001 From: Tim Berners-Lee Date: Tue, 2 Feb 2016 15:52:04 +0000 Subject: [PATCH 01/23] Added code to parse arbitray XML files, currently crashes in xmldom :-( --- package.json | 9 +- rabel.js | 55 +++++ test/xml | 583 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 642 insertions(+), 5 deletions(-) create mode 100644 test/xml diff --git a/package.json b/package.json index f317fab..8fd4d4a 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,7 @@ "name": "Tim Berners-Lee", "email": "timbl@w3.org" }, - "maintainers": [ - ], + "maintainers": [], "license": "MIT", "repository": { "type": "git", @@ -16,9 +15,9 @@ "homepage": "http://github.com/timbl/rabel", "bugs": "http://github.com/timbl/rabel/issues", "dependencies": { - "rdflib": "^0.2.9" - }, - "devDependencies": { + "rdflib": "^0.2.9", + "xmldom": "^0.1.22" }, + "devDependencies": {}, "main": "rabel.js" } diff --git a/rabel.js b/rabel.js index cc4b1d9..4101f13 100644 --- a/rabel.js +++ b/rabel.js @@ -5,6 +5,23 @@ // // +var helpMessage = +"Utilty data converter for linked data\n\ +\n\ +Commands in unix option form are executed left to right, and include:\n\ +\n\ +-base=rrrr Set the current base URI (relative URI)\n\ +-clear Clear the current store\n\ +-dump Serialize the current store in current content type\n\ +-format=cccc Set the current content-type\n\ +-help This message \n\ +-in=uri Load a web resource or file\n\ +-out=filename Output in eth current content type\n\ +-size Give the current store\n\ +-version Give the version of this program\n\ +\n" + + $rdf = require('rdflib'); var fs = require('fs'); @@ -58,6 +75,10 @@ var doNext = function(remaining) { contentType = right; break; + case '-help': + condole.log(helpMessage); + break; + case '-in': targetDocument = $rdf.sym($rdf.uri.join(right, base)) //console.log("Document is " + targetDocument) @@ -68,6 +89,16 @@ var doNext = function(remaining) { }); // target, kb, base, contentType, callback return; // STOP processing at this level + case '-inXML': + targetDocument = $rdf.sym($rdf.uri.join(right, base)) + //console.log("Document is " + targetDocument) + readXML(targetDocument.uri, {}, function(ok, body, xhr) { + check(ok, body, xhr? xhr.status : undefined); + console.log("Loaded XML " + targetDocument); + doNext(remaining); + }); // target, kb, base, contentType, callback + return; // STOP processing at this level + case '-out': doc = $rdf.sym($rdf.uri.join(right, base)); try { @@ -98,12 +129,36 @@ var doNext = function(remaining) { default: console.log("Unknown command: " + left); + condole.log(helpMessage); process.exit(1); } } process.exit(0); } +readXML = function(uri, options, callback) { + var file = $rdf.Util.uri.refTo(base, uri); + fs.readFile(file, undefined, function(err,data){ + if (err) return callback(false, err); + var ns = options.ns || $rdf.uri.join(file, base) + var DOMParser = require('xmldom').DOMParser; + var doc = new DOMParser().parseFromString(data); + var root = kb.bnode(); + kb.add(kb.sum(uri), kb.sym('http://www.w3.org/2007/ont/link#xmlRoot'), root); + var convert = function(ele, node) { + if (ele.children) for(var i=0; i + + + + Link Relations + 2005-08-26 + 2016-01-22 + + + Link Relation Types + + Expert Review + Mark Nottingham, Julian Reschke, Jan Algermissen + + + about + Refers to a resource that is the subject of the link's context. + , section 2 + + + + alternate + Refers to a substitute for this context + + + + + appendix + Refers to an appendix. + + + + + archives + Refers to a collection of records, documents, or other + materials of historical interest. + + + + + author + Refers to the context's author. + + + + + blocked-by + Identifies the entity blocking access to a resource + folllowing on receipt of a legal demand. + + + + + bookmark + Gives a permanent link to use for bookmarking purposes. + + + + + canonical + Designates the preferred version of a resource (the IRI and its contents). + + + + + chapter + Refers to a chapter in a collection of resources. + + + + + collection + The target IRI points to a resource which represents the collection resource for the context IRI. + + + + + contents + Refers to a table of contents. + + + + + copyright + Refers to a copyright statement that applies to the + link's context. + + + + + create-form + The target IRI points to a resource where a submission form can be obtained. + + + + + current + Refers to a resource containing the most recent + item(s) in a collection of resources. + + + + + derivedfrom + The target IRI points to a resource from which this material was derived. + + + + + describedby + Refers to a resource providing information about the + link's context. + + + + + describes + The relationship A 'describes' B asserts that + resource A provides a description of resource B. There are no + constraints on the format or representation of either A or B, + neither are there any further constraints on either resource. + + This link relation type is the inverse of the 'describedby' + relation type. While 'describedby' establishes a relation from + the described resource back to the resource that describes it, + 'describes' established a relation from the describing resource to + the resource it describes. If B is 'describedby' A, then A + 'describes' B. + + + + disclosure + Refers to a list of patent disclosures made with respect to material for which 'disclosure' relation is specified. + + + + + duplicate + Refers to a resource whose available representations + are byte-for-byte identical with the corresponding representations of + the context IRI. + + This relation is for static resources. That is, an HTTP GET + request on any duplicate will return the same representation. It + does not make sense for dynamic or POSTable resources and should not + be used for them. + + + + + edit + Refers to a resource that can be used to edit the + link's context. + + + + + edit-form + The target IRI points to a resource where a submission form for + editing associated resource can be obtained. + + + + + edit-media + Refers to a resource that can be used to edit media + associated with the link's context. + + + + + enclosure + Identifies a related resource that is potentially + large and might require special handling. + + + + + first + An IRI that refers to the furthest preceding resource + in a series of resources. + + This relation type registration did not indicate a + reference. Originally requested by Mark Nottingham in December + 2004. + + + + + glossary + Refers to a glossary of terms. + + + + + help + Refers to context-sensitive help. + + + + + hosts + Refers to a resource hosted by the server indicated by + the link context. + + This relation is used in CoRE where links are retrieved as a + "/.well-known/core" resource representation, and is the default + relation type in the CoRE Link Format. + + + + hub + Refers to a hub that enables registration for + notification of updates to the context. + + This relation type was requested by Brett Slatkin. + + + + icon + Refers to an icon representing the link's context. + + + + + index + Refers to an index. + + + + + item + The target IRI points to a resource that is a member of the collection represented by the context IRI. + + + + + last + An IRI that refers to the furthest following resource + in a series of resources. + + This relation type registration did not indicate a + reference. Originally requested by Mark Nottingham in December + 2004. + + + + + latest-version + Points to a resource containing the latest (e.g., + current) version of the context. + + + + + license + Refers to a license associated with this context. + + For implications of use in HTML, see: + http://www.w3.org/TR/html5/links.html#link-type-license + + + + lrdd + Refers to further information about the link's context, + expressed as a LRDD ("Link-based Resource Descriptor Document") + resource. See for information about + processing this relation type in host-meta documents. When used + elsewhere, it refers to additional links and other metadata. + Multiple instances indicate additional LRDD resources. LRDD + resources MUST have an "application/xrd+xml" representation, and + MAY have others. + + + + + memento + The Target IRI points to a Memento, a fixed resource that will not change state anymore. + + A Memento for an Original Resource is a resource that + encapsulates a prior state of the Original Resource. + + + + monitor + Refers to a resource that can be used to monitor changes in an HTTP resource. + + + + + + monitor-group + Refers to a resource that can be used to monitor changes in a specified group of HTTP resources. + + + + + + next + Indicates that the link's context is a part of a series, and + that the next in the series is the link target. + + + + + + next-archive + Refers to the immediately following archive resource. + + + + + nofollow + Indicates that the context’s original author or publisher does not endorse the link target. + + + + + noreferrer + Indicates that no referrer information is to be leaked when following the link. + + + + + original + The Target IRI points to an Original Resource. + + An Original Resource is a resource that exists or used to + exist, and for which access to one of its prior states may be + required. + + + + + payment + Indicates a resource where payment is accepted. + + This relation type registration did not indicate a + reference. Requested by Joshua Kinberg and Robert Sayre. It is + meant as a general way to facilitate acts of payment, and thus + this specification makes no assumptions on the type of payment or + transaction protocol. Examples may include a web page where + donations are accepted or where goods and services are available + for purchase. rel="payment" is not intended to initiate an + automated transaction. In Atom documents, a link element with a + rel="payment" attribute may exist at the feed/channel level and/or + the entry/item level. For example, a rel="payment" link at the + feed/channel level may point to a "tip jar" URI, whereas an entry/ + item containing a book review may include a rel="payment" link + that points to the location where the book may be purchased + through an online retailer. + + + + + predecessor-version + Points to a resource containing the predecessor + version in the version history. + + + + + + prefetch + Indicates that the link target should be preemptively cached. + + + + + preload + Refers to a resource that should be loaded early in the processing of the link's context, without blocking rendering. + + Additional target attributes establish the detailed fetch properties of the link. + + + + prev + Indicates that the link's context is a part of a series, and + that the previous in the series is the link target. + + + + + + preview + Refers to a resource that provides a preview of the link's context. + , section 3 + + + + previous + Refers to the previous resource in an ordered series + of resources. Synonym for "prev". + + + + + prev-archive + Refers to the immediately preceding archive resource. + + + + + privacy-policy + Refers to a privacy policy associated with the link's context. + , section 4 + + + + profile + Identifying that a resource representation conforms +to a certain profile, without affecting the non-profile semantics +of the resource representation. + + Profile URIs are primarily intended to be used as +identifiers, and thus clients SHOULD NOT indiscriminately access +profile URIs. + + + + related + Identifies a related resource. + + + + + replies + Identifies a resource that is a reply to the context + of the link. + + + + + + search + Refers to a resource that can be used to search through + the link's context and related resources. + + + + + section + Refers to a section in a collection of resources. + + + + + self + Conveys an identifier for the link's context. + + + + + + service + Indicates a URI that can be used to retrieve a + service document. + + When used in an Atom document, this relation type specifies + Atom Publishing Protocol service documents by default. Requested + by James Snell. + + + + + start + Refers to the first resource in a collection of + resources. + + + + + stylesheet + Refers to a stylesheet. + + + + + subsection + Refers to a resource serving as a subsection in a + collection of resources. + + + + + successor-version + Points to a resource containing the successor version + in the version history. + + + + + + tag + Gives a tag (identified by the given address) that applies to + the current document. + + + + + + terms-of-service + Refers to the terms of service associated with the link's context. + , section 5 + + + + timegate + The Target IRI points to a TimeGate for an Original Resource. + + A TimeGate for an Original Resource is a resource that is + capable of datetime negotiation to support access to prior states + of the Original Resource. + + + + + timemap + The Target IRI points to a TimeMap for an Original Resource. + + A TimeMap for an Original Resource is a resource from which + a list of URIs of Mementos of the Original Resource is available. + + + + + type + Refers to a resource identifying the abstract semantic type of which the link's context is considered to be an instance. + , section 6 + + + + up + Refers to a parent document in a hierarchy of + documents. + + + This relation type registration did not indicate a + reference. Requested by Noah Slater. + + + + version-history + Points to a resource containing the version history + for the context. + + + + + + via + Identifies a resource that is the source of the + information in the link's context. + + + + + + working-copy + Points to a working copy for this resource. + + + + + working-copy-of + Points to the versioned resource from which this + working copy was obtained. + + + + + + + + Link Relation Application Data + + Expert Review + Mark Nottingham, Julian Reschke, Jan Algermissen + + + + + From ec4765b70b8b8c2c27d23b0068c9d343b11dfcd5 Mon Sep 17 00:00:00 2001 From: Tim Berners-Lee Date: Wed, 3 Feb 2016 19:31:36 -0500 Subject: [PATCH 02/23] seems to work converting IANA XML file now. See text/xml: --- package.json | 6 +- rabel.js | 186 +- test/xml/GPSKitData.gpx | 4691 ++++++++++++++++++++++++++ test/xml/GPSKitData.n3 | 4688 +++++++++++++++++++++++++ test/{xml => xml/link-relations.xml} | 0 test/xml/small.xml | 9 + 6 files changed, 9565 insertions(+), 15 deletions(-) create mode 100644 test/xml/GPSKitData.gpx create mode 100644 test/xml/GPSKitData.n3 rename test/{xml => xml/link-relations.xml} (100%) create mode 100644 test/xml/small.xml diff --git a/package.json b/package.json index 8fd4d4a..e9d7328 100644 --- a/package.json +++ b/package.json @@ -10,10 +10,10 @@ "license": "MIT", "repository": { "type": "git", - "url": "https://github.com/timbl/rabel" + "url": "https://github.com/linkeddata/rabel" }, - "homepage": "http://github.com/timbl/rabel", - "bugs": "http://github.com/timbl/rabel/issues", + "homepage": "http://github.com/linkeddata/rabel", + "bugs": "http://github.com/linkeddata/rabel/issues", "dependencies": { "rdflib": "^0.2.9", "xmldom": "^0.1.22" diff --git a/rabel.js b/rabel.js index 4101f13..a74c978 100644 --- a/rabel.js +++ b/rabel.js @@ -92,7 +92,7 @@ var doNext = function(remaining) { case '-inXML': targetDocument = $rdf.sym($rdf.uri.join(right, base)) //console.log("Document is " + targetDocument) - readXML(targetDocument.uri, {}, function(ok, body, xhr) { + readXML(targetDocument, {}, function(ok, body, xhr) { check(ok, body, xhr? xhr.status : undefined); console.log("Loaded XML " + targetDocument); doNext(remaining); @@ -136,21 +136,183 @@ var doNext = function(remaining) { process.exit(0); } -readXML = function(uri, options, callback) { +// Read An XML file +// +// Contains namespace-trigged specials for IANA registry data +// +readXML = function(targetDocument, options, callback) { + var uri = targetDocument.uri var file = $rdf.Util.uri.refTo(base, uri); - fs.readFile(file, undefined, function(err,data){ - if (err) return callback(false, err); - var ns = options.ns || $rdf.uri.join(file, base) + var ignore = { 7: true}; + var RDF = $rdf.Namespace('http://www.w3.org/1999/02/22-rdf-syntax-ns#'); + var RDFS = $rdf.Namespace('http://www.w3.org/2000/01/rdf-schema#'); + + fs.readFile(file, options.encoding || 'utf8', function(err,data){ + var defaultNamespace = null; + if (err) { + console.log("File read FAIL, error: " + err); + return callback(false, err); + } + console.log("File read ok, length: " + data.length); + var local = $rdf.uri.join(file, base) + '#' + var ns = options.ns || local var DOMParser = require('xmldom').DOMParser; var doc = new DOMParser().parseFromString(data); - var root = kb.bnode(); - kb.add(kb.sum(uri), kb.sym('http://www.w3.org/2007/ont/link#xmlRoot'), root); - var convert = function(ele, node) { - if (ele.children) for(var i=0; i 1 && options.iana && ch[i].nodeType === 1 && ch[i].nodeName === 'xref') { + text += ' ' + ch[i].attributes.getNamedItem('data').nodeValue + ' '; + } else { + return false; + } + } else { + text += ch[i].nodeValue; + } + } + + if (ele.attributes && ele.attributes.length > 0) { + return false; + } + if (!options.noTrim) { + text = text.trim(); + } + return text; + } + + + var IANA_predicateMap = { + created: { uri: 'http://purl.org/dc/terms/created', + type: 'http://www.w3.org/2001/XMLSchema#date'}, // @@CHECK + date: { uri: 'http://purl.org/dc/terms/date', + type: 'http://www.w3.org/2001/XMLSchema#date'}, // @@CHECK + description: { uri: 'http://purl.org/dc/terms/description'}, // @@CHECK + value: { uri: 'http://www.w3.org/2000/01/rdf-schema#label'}, + note:{ uri: 'http://www.w3.org/2000/01/rdf-schema#comment'} + }; + var magicIANAxref = function(ele) { + var ch = ele.childNodes; + if (ch.length === 1 && ch[0].nodeName === 'xref') { + var at = ch[0].attributes; + var ty = at.getNamedItem('type').nodeValue; + var data = at.getNamedItem('data').nodeValue; + if (ty === 'uri') return kb.sym(data); + if (ty === 'rfc') return kb.sym('https://tools.ietf.org/html/' + data); + if (ty === 'draft') return kb.sym('https://tools.ietf.org/html/' + data); + // RFCs are at e.g. https://tools.ietf.org/html/rfc5005 + // Internet Drafts are at e.g. + // https://tools.ietf.org/html/draft-ietf-httpbis-legally-restricted-status-04 + + } + return null; + } + + var magicIANAvalue = function(ele) { + var ch = ele.childNodes; + for (var i=0; i < ch.length; i++) { + if (ch[i].nodeName === 'value') { // a value subelement gives a local URI + var localid = justTextContent(ch[i]); + return kb.sym(local + localid); + } + } + return null; + } + + var convert = function(ele, node, indent) { + indent = indent || ''; + var pred, obj, type; + console.log(indent + "nodeName: " + ele.nodeName + " type " + ele.nodeType) + console.log(indent + "tagName: " + ele.tagName); + if (ele.nodeType in ignore) { // PI + return; + } + + var setPred = function(id) { + pred = kb.sym(ns + id); + if (options.predicateMap && options.predicateMap[id]) { + var p = options.predicateMap[id]; + console.log(indent + "Mapping to " + p.uri) + if (p.uri) { + pred = kb.sym(p.uri); + } + if (p.type) { + type = kb.sym(p.type); + } + } + } + + if (ele.attributes) { + var attrs = ele.attributes, a; + console.log(indent + 'attributes: ' + attrs.length) + for (var j=0; j < attrs.length; j++) { + a = attrs.item(j); + console.log(indent + j + ") " +a.nodeName + " = " + a.nodeValue); + if (a.nodeName === 'xmlns') { + defaultNamespace = a.nodeValue; + + if (defaultNamespace == 'http://www.iana.org/assignments') { + options.iana = true; + ns = 'https://www.w3.org/ns/assignments/reg#'; + options.predicateMap = IANA_predicateMap; + console.log('IANA MODE'); + + } else if (defaultNamespace === 'http://www.topografix.com/GPX/1/1') { + ns ='http://hackdiary.com/ns/gps#'; // @@@ u + } + continue; + } + setPred(a.nodeName); + kb.add(node, pred, $rdf.lit(a.nodeValue, undefined, type), targetDocument); + } + } + if (ele.childNodes) { + console.log(indent + "children " +ele.childNodes.length) + for(var i=0; i 0) { + kb.add(node, pred, $rdf.lit(txt, undefined, type), targetDocument) + console.log($rdf.lit(txt, undefined, type)) + } + } else if (options.iana && magicIANAxref(child)) { + kb.add(node, kb.sym(ns + child.nodeName), magicIANAxref(child), targetDocument); + console.log(indent + "Magic IANA xref " + magicIANAxref(child)) + } else { + if (child.attributes && child.attributes.getNamedItem('id')){ + obj = kb.sym(local + child.attributes.getNamedItem('id').nodeValue); + } else if (options.iana && magicIANAvalue(child)) { + obj = magicIANAvalue(child); + console.log(indent + "Magic IANA value " + obj) + kb.add(obj, RDF('type'), RDF('Property') , targetDocument); + } else { + obj = kb.bnode(); + } + kb.add(node, pred, obj, targetDocument); + convert(child, obj, indent + ' '); + } + } + } } } convert(doc, root); diff --git a/test/xml/GPSKitData.gpx b/test/xml/GPSKitData.gpx new file mode 100644 index 0000000..865f9a6 --- /dev/null +++ b/test/xml/GPSKitData.gpx @@ -0,0 +1,4691 @@ + + + + Sat Jan 09 2016 - 2 + + + 09/01/2016, 08:07:44 + + + 59 + + + + 59 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 59 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 61 + + + + 61 + + + + 61 + + + + 61 + + + + 61 + + + + 61 + + + + 61 + + + + 61 + + + + 61 + + + + 61 + + + + 61 + + + + 61 + + + + 60 + + + + 60 + + + + 60 + + + + 59 + + + + 59 + + + + 59 + + + + 60 + + + + 59 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 60 + + + + 59 + + + + 59 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 61 + + + + 61 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 58 + + + + 58 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 59 + + + + 60 + + + + 59 + + + + 59 + + + + 59 + + + + 58 + + + + 58 + + + + 58 + + + + 57 + + + + 58 + + + + 58 + + + + 57 + + + + 57 + + + + 57 + + + + 57 + + + + 57 + + + + 58 + + + + 58 + + + + 58 + + + + 58 + + + + 58 + + + + 58 + + + + 59 + + + + 59 + + + + 59 + + + + 60 + + + + 61 + + + + 61 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 61 + + + + 61 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 59 + + + + 60 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 61 + + + + 61 + + + + 61 + + + + 61 + + + + 61 + + + + 62 + + + + 62 + + + + 62 + + + + 62 + + + + 62 + + + + 62 + + + + 62 + + + + 62 + + + + 62 + + + + 63 + + + + 62 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 64 + + + + 64 + + + + 64 + + + + 64 + + + + 64 + + + + 64 + + + + 64 + + + + 64 + + + + 64 + + + + 65 + + + + 65 + + + + 65 + + + + 65 + + + + 65 + + + + 65 + + + + 65 + + + + 65 + + + + 65 + + + + 64 + + + + 64 + + + + 64 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 64 + + + + 63 + + + + 63 + + + + 63 + + + + 64 + + + + 64 + + + + 64 + + + + 64 + + + + 65 + + + + 65 + + + + 65 + + + + 65 + + + + 65 + + + + 65 + + + + 66 + + + + 66 + + + + 66 + + + + 66 + + + + 66 + + + + 66 + + + + 66 + + + + 66 + + + + 66 + + + + 66 + + + + 66 + + + + 66 + + + + 66 + + + + 67 + + + + 67 + + + + 68 + + + + 68 + + + + 68 + + + + 68 + + + + 69 + + + + 69 + + + + 70 + + + + 70 + + + + 70 + + + + 70 + + + + 70 + + + + 70 + + + + 70 + + + + 71 + + + + 71 + + + + 72 + + + + 72 + + + + 72 + + + + 73 + + + + 73 + + + + 73 + + + + 73 + + + + 73 + + + + 73 + + + + 73 + + + + 74 + + + + 74 + + + + 74 + + + + 74 + + + + 74 + + + + 74 + + + + 74 + + + + 74 + + + + 74 + + + + 74 + + + + 73 + + + + 73 + + + + 73 + + + + 73 + + + + 72 + + + + 72 + + + + 72 + + + + 72 + + + + 72 + + + + 71 + + + + 72 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 72 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 72 + + + + 72 + + + + 72 + + + + 72 + + + + 72 + + + + 72 + + + + 72 + + + + 72 + + + + 72 + + + + 72 + + + + 73 + + + + 73 + + + + 73 + + + + 74 + + + + 73 + + + + 74 + + + + 74 + + + + 74 + + + + 74 + + + + 74 + + + + 74 + + + + 74 + + + + 74 + + + + 73 + + + + 73 + + + + 74 + + + + 74 + + + + 74 + + + + 74 + + + + 74 + + + + 74 + + + + 75 + + + + 75 + + + + 75 + + + + 75 + + + + 76 + + + + 76 + + + + 76 + + + + 76 + + + + 76 + + + + 76 + + + + 76 + + + + 76 + + + + 76 + + + + 76 + + + + 76 + + + + 76 + + + + 76 + + + + 76 + + + + 76 + + + + 77 + + + + 76 + + + + 77 + + + + 77 + + + + 77 + + + + 77 + + + + 78 + + + + 78 + + + + 78 + + + + 78 + + + + 78 + + + + 78 + + + + 77 + + + + 78 + + + + 77 + + + + 77 + + + + 77 + + + + 77 + + + + 76 + + + + 76 + + + + 76 + + + + 76 + + + + 76 + + + + 76 + + + + 75 + + + + 76 + + + + 75 + + + + 75 + + + + 76 + + + + 76 + + + + 75 + + + + 75 + + + + 75 + + + + 75 + + + + 75 + + + + 75 + + + + 75 + + + + 75 + + + + 75 + + + + 75 + + + + 75 + + + + 75 + + + + 75 + + + + 75 + + + + 75 + + + + 75 + + + + 74 + + + + 74 + + + + 73 + + + + 73 + + + + 73 + + + + 73 + + + + 73 + + + + 72 + + + + 72 + + + + 72 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 71 + + + + 70 + + + + 70 + + + + 69 + + + + 69 + + + + 69 + + + + 69 + + + + 69 + + + + 69 + + + + 69 + + + + 68 + + + + 68 + + + + 68 + + + + 67 + + + + 67 + + + + 67 + + + + 66 + + + + 66 + + + + 65 + + + + 65 + + + + 65 + + + + 65 + + + + 64 + + + + 64 + + + + 64 + + + + 64 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 64 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 64 + + + + 64 + + + + 64 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 64 + + + + 64 + + + + 64 + + + + 64 + + + + 64 + + + + 64 + + + + 64 + + + + 63 + + + + 63 + + + + 63 + + + + 62 + + + + 61 + + + + 61 + + + + 60 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 58 + + + + 58 + + + + 58 + + + + 59 + + + + 59 + + + + 59 + + + + 60 + + + + 60 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 58 + + + + 58 + + + + 57 + + + + 58 + + + + 58 + + + + 58 + + + + 57 + + + + 57 + + + + 57 + + + + 58 + + + + 58 + + + + 58 + + + + 58 + + + + 58 + + + + 58 + + + + 58 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 61 + + + + 60 + + + + 61 + + + + 61 + + + + 61 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 58 + + + + 58 + + + + 58 + + + + 58 + + + + 58 + + + + 58 + + + + 58 + + + + 58 + + + + 58 + + + + 58 + + + + 59 + + + + 59 + + + + 59 + + + + 60 + + + + 60 + + + + 60 + + + + 61 + + + + 61 + + + + 61 + + + + 61 + + + + 61 + + + + 62 + + + + 62 + + + + 62 + + + + 62 + + + + 62 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 63 + + + + 62 + + + + 62 + + + + 62 + + + + 62 + + + + 61 + + + + 61 + + + + 61 + + + + 61 + + + + 61 + + + + 60 + + + + 59 + + + + 58 + + + + 58 + + + + 57 + + + + 57 + + + + 56 + + + + 56 + + + + 56 + + + + 56 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 54 + + + + 54 + + + + 54 + + + + 54 + + + + 54 + + + + 54 + + + + 54 + + + + 54 + + + + 54 + + + + 54 + + + + 54 + + + + 54 + + + + 54 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 54 + + + + 53 + + + + 53 + + + + 52 + + + + 52 + + + + 52 + + + + 51 + + + + 51 + + + + 51 + + + + 51 + + + + 51 + + + + 50 + + + + 50 + + + + 49 + + + + 49 + + + + 48 + + + + 48 + + + + 48 + + + + 47 + + + + 46 + + + + 46 + + + + 46 + + + + 45 + + + + 45 + + + + 44 + + + + 43 + + + + 43 + + + + 43 + + + + 42 + + + + 42 + + + + 42 + + + + 42 + + + + 42 + + + + 42 + + + + 42 + + + + 41 + + + + 41 + + + + 41 + + + + 41 + + + + 41 + + + + 41 + + + + 41 + + + + 41 + + + + 41 + + + + 41 + + + + 41 + + + + 41 + + + + 41 + + + + 41 + + + + 41 + + + + 41 + + + + 41 + + + + 41 + + + + 41 + + + + 41 + + + + 41 + + + + 41 + + + + 41 + + + + 40 + + + + 40 + + + + 40 + + + + 39 + + + + 39 + + + + 39 + + + + 39 + + + + 39 + + + + 39 + + + + 39 + + + + 39 + + + + 39 + + + + 40 + + + + 40 + + + + 40 + + + + 40 + + + + 40 + + + + 40 + + + + 40 + + + + 40 + + + + 40 + + + + 40 + + + + 40 + + + + 40 + + + + 40 + + + + 40 + + + + 41 + + + + 41 + + + + 42 + + + + 42 + + + + 41 + + + + 41 + + + + 42 + + + + 42 + + + + 42 + + + + 42 + + + + 42 + + + + 42 + + + + 42 + + + + 42 + + + + 43 + + + + 43 + + + + 43 + + + + 43 + + + + 43 + + + + 43 + + + + 43 + + + + 43 + + + + 43 + + + + 43 + + + + 43 + + + + 43 + + + + 42 + + + + 42 + + + + 42 + + + + 42 + + + + 42 + + + + 42 + + + + 42 + + + + 43 + + + + 44 + + + + 44 + + + + 44 + + + + 45 + + + + 45 + + + + 45 + + + + 44 + + + + 44 + + + + 44 + + + + 44 + + + + 44 + + + + 44 + + + + 45 + + + + 45 + + + + 45 + + + + 46 + + + + 48 + + + + 49 + + + + 50 + + + + 51 + + + + 52 + + + + 52 + + + + 52 + + + + 52 + + + + 52 + + + + 52 + + + + 54 + + + + 55 + + + + 56 + + + + 56 + + + + 56 + + + + 56 + + + + 57 + + + + 58 + + + + 59 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 61 + + + + 61 + + + + 61 + + + + 60 + + + + 60 + + + + 61 + + + + 61 + + + + 61 + + + + 62 + + + + 62 + + + + 63 + + + + 62 + + + + 63 + + + + 63 + + + + 62 + + + + 62 + + + + 61 + + + + 61 + + + + 60 + + + + 60 + + + + 60 + + + + 59 + + + + 59 + + + + 58 + + + + 57 + + + + 57 + + + + 57 + + + + 57 + + + + 57 + + + + 57 + + + + 60 + + + + 61 + + + + 62 + + + + 62 + + + + 62 + + + + 62 + + + + 62 + + + + 62 + + + + 62 + + + + 62 + + + + 62 + + + + 62 + + + + 62 + + + + 62 + + + + 62 + + + + 61 + + + + 61 + + + + 61 + + + + 61 + + + + 61 + + + + 61 + + + + 60 + + + + 60 + + + + 61 + + + + 61 + + + + 61 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 59 + + + + 59 + + + + 59 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 60 + + + + 59 + + + + 58 + + + + 57 + + + + 56 + + + + 56 + + + + 56 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 54 + + + + 54 + + + + 53 + + + + 53 + + + + 53 + + + + 53 + + + + 53 + + + + 52 + + + + 51 + + + + 51 + + + + 51 + + + + 50 + + + + 50 + + + + 50 + + + + 49 + + + + 48 + + + + 48 + + + + 47 + + + + 47 + + + + 47 + + + + 47 + + + + 47 + + + + 47 + + + + 47 + + + + 47 + + + + 48 + + + + 48 + + + + 47 + + + + 47 + + + + 47 + + + + 47 + + + + 46 + + + + 46 + + + + 46 + + + + 46 + + + + 46 + + + + 45 + + + + 45 + + + + 45 + + + + 45 + + + + 44 + + + + 45 + + + + 45 + + + + 44 + + + + 44 + + + + 44 + + + + 44 + + + + 44 + + + + 44 + + + + 44 + + + + 44 + + + + 44 + + + + 44 + + + + 44 + + + + 44 + + + + 44 + + + + 44 + + + + 43 + + + + 43 + + + + 44 + + + + 44 + + + + 44 + + + + 45 + + + + 45 + + + + 45 + + + + 46 + + + + 46 + + + + 46 + + + + 46 + + + + 46 + + + + 46 + + + + 46 + + + + 46 + + + + 46 + + + + 46 + + + + 46 + + + + 46 + + + + 46 + + + + 46 + + + + 47 + + + + 47 + + + + 47 + + + + 47 + + + + 47 + + + + 47 + + + + 47 + + + + 47 + + + + 47 + + + + 47 + + + + 48 + + + + 48 + + + + 48 + + + + 48 + + + + 49 + + + + 49 + + + + 50 + + + + 50 + + + + 50 + + + + 50 + + + + 50 + + + + 50 + + + + 50 + + + + 50 + + + + 50 + + + + 51 + + + + 50 + + + + 51 + + + + 51 + + + + 51 + + + + 51 + + + + 52 + + + + 53 + + + + 53 + + + + 53 + + + + 54 + + + + 54 + + + + 54 + + + + 54 + + + + 54 + + + + 54 + + + + 54 + + + + 55 + + + + 55 + + + + 55 + + + + 56 + + + + 56 + + + + 57 + + + + 58 + + + + 58 + + + + 58 + + + + 59 + + + + 59 + + + + 59 + + + + 59 + + + + 60 + + + + 60 + + + + 60 + + + + 61 + + + + 61 + + + + 61 + + + + 61 + + + + 61 + + + + 59 + + + + 59 + + + + 58 + + + + 58 + + + + 57 + + + + 57 + + + + 57 + + + + 57 + + + + 56 + + + + 56 + + + + 56 + + + + 56 + + + + 56 + + + + 56 + + + + 56 + + + + 56 + + + + 56 + + + + 56 + + + + 56 + + + + 56 + + + + 56 + + + + 56 + + + + 56 + + + + 56 + + + + 56 + + + + 56 + + + + 56 + + + + 56 + + + + 56 + + + + 56 + + + + 56 + + + + 56 + + + + 56 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 55 + + + + 56 + + + + 56 + + + + 56 + + + + + diff --git a/test/xml/GPSKitData.n3 b/test/xml/GPSKitData.n3 new file mode 100644 index 0000000..51cbf67 --- /dev/null +++ b/test/xml/GPSKitData.n3 @@ -0,0 +1,4688 @@ +@prefix gps: . +@prefix wgs84: . + +<#ThisRecord> a gps:Record; + wgs84:time "2016-02-03T21:12:55Z"; + gps:track [ +gps:trackpoint [wgs84:lat 42.479407000e+00; wgs84:long -71.359636000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:07:44.537Z"; +]; +gps:trackpoint [wgs84:lat 42.479456000e+00; wgs84:long -71.359622000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:07:52.075Z"; +]; +gps:trackpoint [wgs84:lat 42.479497000e+00; wgs84:long -71.359593000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:08:08.105Z"; +]; +gps:trackpoint [wgs84:lat 42.479541000e+00; wgs84:long -71.359568000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:08:14.372Z"; +]; +gps:trackpoint [wgs84:lat 42.479585000e+00; wgs84:long -71.359587000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:08:20.102Z"; +]; +gps:trackpoint [wgs84:lat 42.479638000e+00; wgs84:long -71.359567000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:08:26.103Z"; +]; +gps:trackpoint [wgs84:lat 42.479680000e+00; wgs84:long -71.359529000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:08:31.085Z"; +]; +gps:trackpoint [wgs84:lat 42.479714000e+00; wgs84:long -71.359478000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:08:36.083Z"; +]; +gps:trackpoint [wgs84:lat 42.479760000e+00; wgs84:long -71.359466000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:08:41.114Z"; +]; +gps:trackpoint [wgs84:lat 42.479801000e+00; wgs84:long -71.359413000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:08:46.078Z"; +]; +gps:trackpoint [wgs84:lat 42.479841000e+00; wgs84:long -71.359361000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:08:51.102Z"; +]; +gps:trackpoint [wgs84:lat 42.479883000e+00; wgs84:long -71.359309000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:08:56.096Z"; +]; +gps:trackpoint [wgs84:lat 42.479927000e+00; wgs84:long -71.359277000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:09:01.107Z"; +]; +gps:trackpoint [wgs84:lat 42.479973000e+00; wgs84:long -71.359250000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:09:06.105Z"; +]; +gps:trackpoint [wgs84:lat 42.480023000e+00; wgs84:long -71.359219000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:09:10.111Z"; +]; +gps:trackpoint [wgs84:lat 42.480064000e+00; wgs84:long -71.359195000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:09:13.109Z"; +]; +gps:trackpoint [wgs84:lat 42.480123000e+00; wgs84:long -71.359174000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:09:16.113Z"; +]; +gps:trackpoint [wgs84:lat 42.480166000e+00; wgs84:long -71.359154000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:09:18.114Z"; +]; +gps:trackpoint [wgs84:lat 42.480214000e+00; wgs84:long -71.359129000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:09:20.113Z"; +]; +gps:trackpoint [wgs84:lat 42.480258000e+00; wgs84:long -71.359103000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:09:22.115Z"; +]; +gps:trackpoint [wgs84:lat 42.480304000e+00; wgs84:long -71.359080000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:09:24.108Z"; +]; +gps:trackpoint [wgs84:lat 42.480362000e+00; wgs84:long -71.359046000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:09:27.105Z"; +]; +gps:trackpoint [wgs84:lat 42.480409000e+00; wgs84:long -71.359020000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:09:30.109Z"; +]; +gps:trackpoint [wgs84:lat 42.480456000e+00; wgs84:long -71.358966000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:09:34.109Z"; +]; +gps:trackpoint [wgs84:lat 42.480501000e+00; wgs84:long -71.358917000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:09:39.089Z"; +]; +gps:trackpoint [wgs84:lat 42.480558000e+00; wgs84:long -71.358873000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:09:42.098Z"; +]; +gps:trackpoint [wgs84:lat 42.480606000e+00; wgs84:long -71.358845000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:09:45.108Z"; +]; +gps:trackpoint [wgs84:lat 42.480648000e+00; wgs84:long -71.358798000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:09:48.089Z"; +]; +gps:trackpoint [wgs84:lat 42.480707000e+00; wgs84:long -71.358768000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:09:51.110Z"; +]; +gps:trackpoint [wgs84:lat 42.480761000e+00; wgs84:long -71.358740000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:09:54.114Z"; +]; +gps:trackpoint [wgs84:lat 42.480806000e+00; wgs84:long -71.358706000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:09:57.113Z"; +]; +gps:trackpoint [wgs84:lat 42.480851000e+00; wgs84:long -71.358691000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:10:00.102Z"; +]; +gps:trackpoint [wgs84:lat 42.480896000e+00; wgs84:long -71.358669000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:10:03.108Z"; +]; +gps:trackpoint [wgs84:lat 42.480921000e+00; wgs84:long -71.358618000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:10:07.106Z"; +]; +gps:trackpoint [wgs84:lat 42.480963000e+00; wgs84:long -71.358561000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:10:11.110Z"; +]; +gps:trackpoint [wgs84:lat 42.481019000e+00; wgs84:long -71.358514000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:10:15.114Z"; +]; +gps:trackpoint [wgs84:lat 42.481059000e+00; wgs84:long -71.358486000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:10:17.116Z"; +]; +gps:trackpoint [wgs84:lat 42.481107000e+00; wgs84:long -71.358437000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:10:20.106Z"; +]; +gps:trackpoint [wgs84:lat 42.481129000e+00; wgs84:long -71.358387000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:10:22.106Z"; +]; +gps:trackpoint [wgs84:lat 42.481152000e+00; wgs84:long -71.358331000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:10:24.114Z"; +]; +gps:trackpoint [wgs84:lat 42.481178000e+00; wgs84:long -71.358279000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:10:26.114Z"; +]; +gps:trackpoint [wgs84:lat 42.481202000e+00; wgs84:long -71.358222000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:10:28.121Z"; +]; +gps:trackpoint [wgs84:lat 42.481223000e+00; wgs84:long -71.358163000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:10:30.110Z"; +]; +gps:trackpoint [wgs84:lat 42.481251000e+00; wgs84:long -71.358106000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:10:32.100Z"; +]; +gps:trackpoint [wgs84:lat 42.481278000e+00; wgs84:long -71.358041000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:10:34.112Z"; +]; +gps:trackpoint [wgs84:lat 42.481304000e+00; wgs84:long -71.357981000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:10:36.111Z"; +]; +gps:trackpoint [wgs84:lat 42.481330000e+00; wgs84:long -71.357910000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:10:38.121Z"; +]; +gps:trackpoint [wgs84:lat 42.481362000e+00; wgs84:long -71.357827000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:10:41.117Z"; +]; +gps:trackpoint [wgs84:lat 42.481408000e+00; wgs84:long -71.357762000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:10:44.102Z"; +]; +gps:trackpoint [wgs84:lat 42.481448000e+00; wgs84:long -71.357699000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:10:47.107Z"; +]; +gps:trackpoint [wgs84:lat 42.481495000e+00; wgs84:long -71.357637000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:10:50.088Z"; +]; +gps:trackpoint [wgs84:lat 42.481533000e+00; wgs84:long -71.357572000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:10:53.090Z"; +]; +gps:trackpoint [wgs84:lat 42.481552000e+00; wgs84:long -71.357510000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:10:56.116Z"; +]; +gps:trackpoint [wgs84:lat 42.481584000e+00; wgs84:long -71.357454000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:10:59.110Z"; +]; +gps:trackpoint [wgs84:lat 42.481629000e+00; wgs84:long -71.357417000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:11:03.118Z"; +]; +gps:trackpoint [wgs84:lat 42.481687000e+00; wgs84:long -71.357401000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:11:06.116Z"; +]; +gps:trackpoint [wgs84:lat 42.481738000e+00; wgs84:long -71.357392000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:11:09.133Z"; +]; +gps:trackpoint [wgs84:lat 42.481784000e+00; wgs84:long -71.357405000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:11:12.124Z"; +]; +gps:trackpoint [wgs84:lat 42.481840000e+00; wgs84:long -71.357416000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:11:15.123Z"; +]; +gps:trackpoint [wgs84:lat 42.481895000e+00; wgs84:long -71.357441000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:11:18.122Z"; +]; +gps:trackpoint [wgs84:lat 42.481948000e+00; wgs84:long -71.357442000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:11:21.134Z"; +]; +gps:trackpoint [wgs84:lat 42.481999000e+00; wgs84:long -71.357444000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:11:24.123Z"; +]; +gps:trackpoint [wgs84:lat 42.482050000e+00; wgs84:long -71.357438000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:11:27.112Z"; +]; +gps:trackpoint [wgs84:lat 42.482111000e+00; wgs84:long -71.357438000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:11:30.126Z"; +]; +gps:trackpoint [wgs84:lat 42.482175000e+00; wgs84:long -71.357442000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:11:33.127Z"; +]; +gps:trackpoint [wgs84:lat 42.482236000e+00; wgs84:long -71.357442000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:11:36.129Z"; +]; +gps:trackpoint [wgs84:lat 42.482303000e+00; wgs84:long -71.357455000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:11:39.146Z"; +]; +gps:trackpoint [wgs84:lat 42.482354000e+00; wgs84:long -71.357466000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:11:42.129Z"; +]; +gps:trackpoint [wgs84:lat 42.482408000e+00; wgs84:long -71.357459000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:11:45.120Z"; +]; +gps:trackpoint [wgs84:lat 42.482456000e+00; wgs84:long -71.357434000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:11:48.127Z"; +]; +gps:trackpoint [wgs84:lat 42.482497000e+00; wgs84:long -71.357418000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:11:50.123Z"; +]; +gps:trackpoint [wgs84:lat 42.482561000e+00; wgs84:long -71.357408000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:11:53.128Z"; +]; +gps:trackpoint [wgs84:lat 42.482620000e+00; wgs84:long -71.357380000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:11:56.130Z"; +]; +gps:trackpoint [wgs84:lat 42.482680000e+00; wgs84:long -71.357355000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:11:59.116Z"; +]; +gps:trackpoint [wgs84:lat 42.482737000e+00; wgs84:long -71.357334000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:12:02.123Z"; +]; +gps:trackpoint [wgs84:lat 42.482788000e+00; wgs84:long -71.357290000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:12:05.127Z"; +]; +gps:trackpoint [wgs84:lat 42.482846000e+00; wgs84:long -71.357255000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:12:08.119Z"; +]; +gps:trackpoint [wgs84:lat 42.482888000e+00; wgs84:long -71.357234000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:12:10.127Z"; +]; +gps:trackpoint [wgs84:lat 42.482950000e+00; wgs84:long -71.357194000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:12:13.129Z"; +]; +gps:trackpoint [wgs84:lat 42.483004000e+00; wgs84:long -71.357174000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:12:16.141Z"; +]; +gps:trackpoint [wgs84:lat 42.483062000e+00; wgs84:long -71.357139000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:12:19.129Z"; +]; +gps:trackpoint [wgs84:lat 42.483113000e+00; wgs84:long -71.357112000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:12:22.126Z"; +]; +gps:trackpoint [wgs84:lat 42.483158000e+00; wgs84:long -71.357095000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:12:24.134Z"; +]; +gps:trackpoint [wgs84:lat 42.483206000e+00; wgs84:long -71.357044000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:12:27.123Z"; +]; +gps:trackpoint [wgs84:lat 42.483257000e+00; wgs84:long -71.357001000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:12:30.145Z"; +]; +gps:trackpoint [wgs84:lat 42.483299000e+00; wgs84:long -71.356965000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:12:33.132Z"; +]; +gps:trackpoint [wgs84:lat 42.483354000e+00; wgs84:long -71.356924000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:12:36.125Z"; +]; +gps:trackpoint [wgs84:lat 42.483397000e+00; wgs84:long -71.356905000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:12:38.127Z"; +]; +gps:trackpoint [wgs84:lat 42.483457000e+00; wgs84:long -71.356886000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:12:41.130Z"; +]; +gps:trackpoint [wgs84:lat 42.483502000e+00; wgs84:long -71.356865000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:12:43.125Z"; +]; +gps:trackpoint [wgs84:lat 42.483546000e+00; wgs84:long -71.356853000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:12:45.117Z"; +]; +gps:trackpoint [wgs84:lat 42.483592000e+00; wgs84:long -71.356838000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:12:47.121Z"; +]; +gps:trackpoint [wgs84:lat 42.483635000e+00; wgs84:long -71.356808000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:12:49.142Z"; +]; +gps:trackpoint [wgs84:lat 42.483678000e+00; wgs84:long -71.356792000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:12:51.127Z"; +]; +gps:trackpoint [wgs84:lat 42.483740000e+00; wgs84:long -71.356795000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:12:54.113Z"; +]; +gps:trackpoint [wgs84:lat 42.483782000e+00; wgs84:long -71.356780000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:12:56.110Z"; +]; +gps:trackpoint [wgs84:lat 42.483837000e+00; wgs84:long -71.356757000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:12:59.153Z"; +]; +gps:trackpoint [wgs84:lat 42.483882000e+00; wgs84:long -71.356747000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:13:01.105Z"; +]; +gps:trackpoint [wgs84:lat 42.483932000e+00; wgs84:long -71.356724000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:13:04.104Z"; +]; +gps:trackpoint [wgs84:lat 42.483977000e+00; wgs84:long -71.356720000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:13:06.132Z"; +]; +gps:trackpoint [wgs84:lat 42.484025000e+00; wgs84:long -71.356736000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:13:08.133Z"; +]; +gps:trackpoint [wgs84:lat 42.484068000e+00; wgs84:long -71.356757000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:13:10.118Z"; +]; +gps:trackpoint [wgs84:lat 42.484126000e+00; wgs84:long -71.356760000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:13:13.125Z"; +]; +gps:trackpoint [wgs84:lat 42.484191000e+00; wgs84:long -71.356737000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:13:16.125Z"; +]; +gps:trackpoint [wgs84:lat 42.484250000e+00; wgs84:long -71.356760000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:13:19.124Z"; +]; +gps:trackpoint [wgs84:lat 42.484286000e+00; wgs84:long -71.356794000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:13:21.126Z"; +]; +gps:trackpoint [wgs84:lat 42.484335000e+00; wgs84:long -71.356815000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:13:24.128Z"; +]; +gps:trackpoint [wgs84:lat 42.484386000e+00; wgs84:long -71.356837000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:13:27.117Z"; +]; +gps:trackpoint [wgs84:lat 42.484449000e+00; wgs84:long -71.356836000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:13:30.130Z"; +]; +gps:trackpoint [wgs84:lat 42.484505000e+00; wgs84:long -71.356815000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:13:33.128Z"; +]; +gps:trackpoint [wgs84:lat 42.484567000e+00; wgs84:long -71.356819000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:13:36.123Z"; +]; +gps:trackpoint [wgs84:lat 42.484622000e+00; wgs84:long -71.356812000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:13:39.122Z"; +]; +gps:trackpoint [wgs84:lat 42.484676000e+00; wgs84:long -71.356780000e+00; + wgs84:altitude 57.000000e0; + wgs84:time "2016-01-09T13:13:42.122Z"; +]; +gps:trackpoint [wgs84:lat 42.484718000e+00; wgs84:long -71.356718000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:13:45.130Z"; +]; +gps:trackpoint [wgs84:lat 42.484761000e+00; wgs84:long -71.356680000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:13:47.120Z"; +]; +gps:trackpoint [wgs84:lat 42.484805000e+00; wgs84:long -71.356650000e+00; + wgs84:altitude 57.000000e0; + wgs84:time "2016-01-09T13:13:49.130Z"; +]; +gps:trackpoint [wgs84:lat 42.484847000e+00; wgs84:long -71.356612000e+00; + wgs84:altitude 57.000000e0; + wgs84:time "2016-01-09T13:13:51.130Z"; +]; +gps:trackpoint [wgs84:lat 42.484908000e+00; wgs84:long -71.356559000e+00; + wgs84:altitude 57.000000e0; + wgs84:time "2016-01-09T13:13:54.139Z"; +]; +gps:trackpoint [wgs84:lat 42.484955000e+00; wgs84:long -71.356525000e+00; + wgs84:altitude 57.000000e0; + wgs84:time "2016-01-09T13:13:56.137Z"; +]; +gps:trackpoint [wgs84:lat 42.484997000e+00; wgs84:long -71.356491000e+00; + wgs84:altitude 57.000000e0; + wgs84:time "2016-01-09T13:13:58.121Z"; +]; +gps:trackpoint [wgs84:lat 42.485037000e+00; wgs84:long -71.356419000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:14:01.123Z"; +]; +gps:trackpoint [wgs84:lat 42.485066000e+00; wgs84:long -71.356377000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:14:03.146Z"; +]; +gps:trackpoint [wgs84:lat 42.485115000e+00; wgs84:long -71.356322000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:14:06.123Z"; +]; +gps:trackpoint [wgs84:lat 42.485160000e+00; wgs84:long -71.356280000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:14:09.135Z"; +]; +gps:trackpoint [wgs84:lat 42.485212000e+00; wgs84:long -71.356234000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:14:12.124Z"; +]; +gps:trackpoint [wgs84:lat 42.485259000e+00; wgs84:long -71.356223000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:14:15.111Z"; +]; +gps:trackpoint [wgs84:lat 42.485309000e+00; wgs84:long -71.356201000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:14:18.126Z"; +]; +gps:trackpoint [wgs84:lat 42.485364000e+00; wgs84:long -71.356202000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:14:22.121Z"; +]; +gps:trackpoint [wgs84:lat 42.485410000e+00; wgs84:long -71.356200000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:14:25.118Z"; +]; +gps:trackpoint [wgs84:lat 42.485455000e+00; wgs84:long -71.356208000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:14:30.125Z"; +]; +gps:trackpoint [wgs84:lat 42.485509000e+00; wgs84:long -71.356206000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:14:34.124Z"; +]; +gps:trackpoint [wgs84:lat 42.485552000e+00; wgs84:long -71.356228000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:14:38.123Z"; +]; +gps:trackpoint [wgs84:lat 42.485606000e+00; wgs84:long -71.356236000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:14:43.124Z"; +]; +gps:trackpoint [wgs84:lat 42.485652000e+00; wgs84:long -71.356223000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:14:46.105Z"; +]; +gps:trackpoint [wgs84:lat 42.485704000e+00; wgs84:long -71.356215000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:14:49.128Z"; +]; +gps:trackpoint [wgs84:lat 42.485763000e+00; wgs84:long -71.356226000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:14:52.125Z"; +]; +gps:trackpoint [wgs84:lat 42.485826000e+00; wgs84:long -71.356260000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:14:55.134Z"; +]; +gps:trackpoint [wgs84:lat 42.485882000e+00; wgs84:long -71.356304000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:14:58.132Z"; +]; +gps:trackpoint [wgs84:lat 42.485938000e+00; wgs84:long -71.356341000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:15:01.098Z"; +]; +gps:trackpoint [wgs84:lat 42.485976000e+00; wgs84:long -71.356381000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:15:04.138Z"; +]; +gps:trackpoint [wgs84:lat 42.486022000e+00; wgs84:long -71.356427000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:15:07.148Z"; +]; +gps:trackpoint [wgs84:lat 42.486057000e+00; wgs84:long -71.356475000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:15:11.115Z"; +]; +gps:trackpoint [wgs84:lat 42.486107000e+00; wgs84:long -71.356512000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:15:15.128Z"; +]; +gps:trackpoint [wgs84:lat 42.486155000e+00; wgs84:long -71.356537000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:15:18.111Z"; +]; +gps:trackpoint [wgs84:lat 42.486199000e+00; wgs84:long -71.356561000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:15:21.128Z"; +]; +gps:trackpoint [wgs84:lat 42.486249000e+00; wgs84:long -71.356573000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:15:24.119Z"; +]; +gps:trackpoint [wgs84:lat 42.486311000e+00; wgs84:long -71.356596000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:15:27.127Z"; +]; +gps:trackpoint [wgs84:lat 42.486371000e+00; wgs84:long -71.356608000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:15:30.126Z"; +]; +gps:trackpoint [wgs84:lat 42.486417000e+00; wgs84:long -71.356609000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:15:32.136Z"; +]; +gps:trackpoint [wgs84:lat 42.486478000e+00; wgs84:long -71.356588000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:15:35.142Z"; +]; +gps:trackpoint [wgs84:lat 42.486535000e+00; wgs84:long -71.356568000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:15:38.138Z"; +]; +gps:trackpoint [wgs84:lat 42.486589000e+00; wgs84:long -71.356562000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:15:41.129Z"; +]; +gps:trackpoint [wgs84:lat 42.486644000e+00; wgs84:long -71.356536000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:15:44.143Z"; +]; +gps:trackpoint [wgs84:lat 42.486687000e+00; wgs84:long -71.356506000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:15:46.117Z"; +]; +gps:trackpoint [wgs84:lat 42.486730000e+00; wgs84:long -71.356454000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:15:49.125Z"; +]; +gps:trackpoint [wgs84:lat 42.486774000e+00; wgs84:long -71.356404000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:15:52.113Z"; +]; +gps:trackpoint [wgs84:lat 42.486815000e+00; wgs84:long -71.356367000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:15:54.119Z"; +]; +gps:trackpoint [wgs84:lat 42.486855000e+00; wgs84:long -71.356331000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:15:56.141Z"; +]; +gps:trackpoint [wgs84:lat 42.486901000e+00; wgs84:long -71.356294000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:15:58.133Z"; +]; +gps:trackpoint [wgs84:lat 42.486950000e+00; wgs84:long -71.356277000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:16:00.106Z"; +]; +gps:trackpoint [wgs84:lat 42.486997000e+00; wgs84:long -71.356269000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:16:02.113Z"; +]; +gps:trackpoint [wgs84:lat 42.487046000e+00; wgs84:long -71.356257000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:16:04.126Z"; +]; +gps:trackpoint [wgs84:lat 42.487091000e+00; wgs84:long -71.356243000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:16:06.138Z"; +]; +gps:trackpoint [wgs84:lat 42.487135000e+00; wgs84:long -71.356216000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:16:08.132Z"; +]; +gps:trackpoint [wgs84:lat 42.487192000e+00; wgs84:long -71.356174000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:16:11.138Z"; +]; +gps:trackpoint [wgs84:lat 42.487247000e+00; wgs84:long -71.356143000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:16:14.122Z"; +]; +gps:trackpoint [wgs84:lat 42.487293000e+00; wgs84:long -71.356092000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:16:17.129Z"; +]; +gps:trackpoint [wgs84:lat 42.487339000e+00; wgs84:long -71.356039000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:16:20.140Z"; +]; +gps:trackpoint [wgs84:lat 42.487390000e+00; wgs84:long -71.356003000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:16:23.127Z"; +]; +gps:trackpoint [wgs84:lat 42.487441000e+00; wgs84:long -71.355964000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:16:26.133Z"; +]; +gps:trackpoint [wgs84:lat 42.487486000e+00; wgs84:long -71.355940000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:16:28.130Z"; +]; +gps:trackpoint [wgs84:lat 42.487538000e+00; wgs84:long -71.355912000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:16:31.127Z"; +]; +gps:trackpoint [wgs84:lat 42.487578000e+00; wgs84:long -71.355888000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:16:33.153Z"; +]; +gps:trackpoint [wgs84:lat 42.487638000e+00; wgs84:long -71.355863000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:16:36.135Z"; +]; +gps:trackpoint [wgs84:lat 42.487682000e+00; wgs84:long -71.355841000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:16:38.141Z"; +]; +gps:trackpoint [wgs84:lat 42.487732000e+00; wgs84:long -71.355803000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:16:41.138Z"; +]; +gps:trackpoint [wgs84:lat 42.487775000e+00; wgs84:long -71.355785000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:16:43.116Z"; +]; +gps:trackpoint [wgs84:lat 42.487832000e+00; wgs84:long -71.355766000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:16:46.157Z"; +]; +gps:trackpoint [wgs84:lat 42.487888000e+00; wgs84:long -71.355742000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:16:49.106Z"; +]; +gps:trackpoint [wgs84:lat 42.487948000e+00; wgs84:long -71.355724000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:16:52.114Z"; +]; +gps:trackpoint [wgs84:lat 42.487995000e+00; wgs84:long -71.355672000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:16:55.117Z"; +]; +gps:trackpoint [wgs84:lat 42.488035000e+00; wgs84:long -71.355637000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:16:57.100Z"; +]; +gps:trackpoint [wgs84:lat 42.488097000e+00; wgs84:long -71.355600000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:17:00.141Z"; +]; +gps:trackpoint [wgs84:lat 42.488154000e+00; wgs84:long -71.355565000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:17:03.134Z"; +]; +gps:trackpoint [wgs84:lat 42.488198000e+00; wgs84:long -71.355527000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:17:06.136Z"; +]; +gps:trackpoint [wgs84:lat 42.488244000e+00; wgs84:long -71.355514000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:17:08.138Z"; +]; +gps:trackpoint [wgs84:lat 42.488291000e+00; wgs84:long -71.355495000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:17:11.127Z"; +]; +gps:trackpoint [wgs84:lat 42.488339000e+00; wgs84:long -71.355486000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:17:13.138Z"; +]; +gps:trackpoint [wgs84:lat 42.488392000e+00; wgs84:long -71.355517000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:17:16.134Z"; +]; +gps:trackpoint [wgs84:lat 42.488437000e+00; wgs84:long -71.355531000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:17:18.131Z"; +]; +gps:trackpoint [wgs84:lat 42.488489000e+00; wgs84:long -71.355532000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:17:21.130Z"; +]; +gps:trackpoint [wgs84:lat 42.488532000e+00; wgs84:long -71.355521000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:17:23.133Z"; +]; +gps:trackpoint [wgs84:lat 42.488578000e+00; wgs84:long -71.355503000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:17:25.128Z"; +]; +gps:trackpoint [wgs84:lat 42.488640000e+00; wgs84:long -71.355473000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:17:28.119Z"; +]; +gps:trackpoint [wgs84:lat 42.488682000e+00; wgs84:long -71.355445000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:17:30.140Z"; +]; +gps:trackpoint [wgs84:lat 42.488740000e+00; wgs84:long -71.355412000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:17:33.140Z"; +]; +gps:trackpoint [wgs84:lat 42.488785000e+00; wgs84:long -71.355391000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:17:35.130Z"; +]; +gps:trackpoint [wgs84:lat 42.488831000e+00; wgs84:long -71.355378000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:17:37.133Z"; +]; +gps:trackpoint [wgs84:lat 42.488889000e+00; wgs84:long -71.355363000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:17:40.132Z"; +]; +gps:trackpoint [wgs84:lat 42.488939000e+00; wgs84:long -71.355346000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:17:42.127Z"; +]; +gps:trackpoint [wgs84:lat 42.488984000e+00; wgs84:long -71.355302000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:17:48.131Z"; +]; +gps:trackpoint [wgs84:lat 42.489033000e+00; wgs84:long -71.355269000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:17:51.116Z"; +]; +gps:trackpoint [wgs84:lat 42.489075000e+00; wgs84:long -71.355231000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:17:55.127Z"; +]; +gps:trackpoint [wgs84:lat 42.489122000e+00; wgs84:long -71.355217000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:17:58.131Z"; +]; +gps:trackpoint [wgs84:lat 42.489179000e+00; wgs84:long -71.355229000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:18:01.124Z"; +]; +gps:trackpoint [wgs84:lat 42.489224000e+00; wgs84:long -71.355232000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:18:03.136Z"; +]; +gps:trackpoint [wgs84:lat 42.489274000e+00; wgs84:long -71.355225000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:18:05.128Z"; +]; +gps:trackpoint [wgs84:lat 42.489317000e+00; wgs84:long -71.355220000e+00; + wgs84:altitude 65.000000e0; + wgs84:time "2016-01-09T13:18:07.129Z"; +]; +gps:trackpoint [wgs84:lat 42.489376000e+00; wgs84:long -71.355198000e+00; + wgs84:altitude 65.000000e0; + wgs84:time "2016-01-09T13:18:10.135Z"; +]; +gps:trackpoint [wgs84:lat 42.489435000e+00; wgs84:long -71.355173000e+00; + wgs84:altitude 65.000000e0; + wgs84:time "2016-01-09T13:18:13.126Z"; +]; +gps:trackpoint [wgs84:lat 42.489482000e+00; wgs84:long -71.355155000e+00; + wgs84:altitude 65.000000e0; + wgs84:time "2016-01-09T13:18:15.155Z"; +]; +gps:trackpoint [wgs84:lat 42.489542000e+00; wgs84:long -71.355120000e+00; + wgs84:altitude 65.000000e0; + wgs84:time "2016-01-09T13:18:18.141Z"; +]; +gps:trackpoint [wgs84:lat 42.489597000e+00; wgs84:long -71.355088000e+00; + wgs84:altitude 65.000000e0; + wgs84:time "2016-01-09T13:18:21.138Z"; +]; +gps:trackpoint [wgs84:lat 42.489658000e+00; wgs84:long -71.355082000e+00; + wgs84:altitude 65.000000e0; + wgs84:time "2016-01-09T13:18:24.120Z"; +]; +gps:trackpoint [wgs84:lat 42.489720000e+00; wgs84:long -71.355090000e+00; + wgs84:altitude 65.000000e0; + wgs84:time "2016-01-09T13:18:27.115Z"; +]; +gps:trackpoint [wgs84:lat 42.489781000e+00; wgs84:long -71.355070000e+00; + wgs84:altitude 65.000000e0; + wgs84:time "2016-01-09T13:18:30.113Z"; +]; +gps:trackpoint [wgs84:lat 42.489841000e+00; wgs84:long -71.355049000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:18:33.132Z"; +]; +gps:trackpoint [wgs84:lat 42.489891000e+00; wgs84:long -71.355036000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:18:35.133Z"; +]; +gps:trackpoint [wgs84:lat 42.489939000e+00; wgs84:long -71.355016000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:18:38.145Z"; +]; +gps:trackpoint [wgs84:lat 42.489995000e+00; wgs84:long -71.354996000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:18:41.130Z"; +]; +gps:trackpoint [wgs84:lat 42.490037000e+00; wgs84:long -71.354969000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:18:43.132Z"; +]; +gps:trackpoint [wgs84:lat 42.490078000e+00; wgs84:long -71.354936000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:18:45.143Z"; +]; +gps:trackpoint [wgs84:lat 42.490127000e+00; wgs84:long -71.354907000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:18:48.130Z"; +]; +gps:trackpoint [wgs84:lat 42.490186000e+00; wgs84:long -71.354898000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:18:51.124Z"; +]; +gps:trackpoint [wgs84:lat 42.490251000e+00; wgs84:long -71.354893000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:18:54.126Z"; +]; +gps:trackpoint [wgs84:lat 42.490294000e+00; wgs84:long -71.354881000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:18:56.133Z"; +]; +gps:trackpoint [wgs84:lat 42.490357000e+00; wgs84:long -71.354907000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:18:59.130Z"; +]; +gps:trackpoint [wgs84:lat 42.490415000e+00; wgs84:long -71.354923000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:19:02.129Z"; +]; +gps:trackpoint [wgs84:lat 42.490477000e+00; wgs84:long -71.354933000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:19:05.133Z"; +]; +gps:trackpoint [wgs84:lat 42.490536000e+00; wgs84:long -71.354955000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:19:08.130Z"; +]; +gps:trackpoint [wgs84:lat 42.490596000e+00; wgs84:long -71.354954000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:19:11.161Z"; +]; +gps:trackpoint [wgs84:lat 42.490642000e+00; wgs84:long -71.354949000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:19:13.136Z"; +]; +gps:trackpoint [wgs84:lat 42.490700000e+00; wgs84:long -71.354937000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:19:16.136Z"; +]; +gps:trackpoint [wgs84:lat 42.490750000e+00; wgs84:long -71.354897000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:19:19.135Z"; +]; +gps:trackpoint [wgs84:lat 42.490790000e+00; wgs84:long -71.354873000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:19:21.131Z"; +]; +gps:trackpoint [wgs84:lat 42.490831000e+00; wgs84:long -71.354826000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:19:24.139Z"; +]; +gps:trackpoint [wgs84:lat 42.490885000e+00; wgs84:long -71.354773000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:19:27.130Z"; +]; +gps:trackpoint [wgs84:lat 42.490934000e+00; wgs84:long -71.354744000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:19:29.136Z"; +]; +gps:trackpoint [wgs84:lat 42.490995000e+00; wgs84:long -71.354709000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:19:32.132Z"; +]; +gps:trackpoint [wgs84:lat 42.491044000e+00; wgs84:long -71.354689000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:19:34.142Z"; +]; +gps:trackpoint [wgs84:lat 42.491083000e+00; wgs84:long -71.354669000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:19:36.144Z"; +]; +gps:trackpoint [wgs84:lat 42.491142000e+00; wgs84:long -71.354608000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:19:39.164Z"; +]; +gps:trackpoint [wgs84:lat 42.491171000e+00; wgs84:long -71.354563000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:19:41.126Z"; +]; +gps:trackpoint [wgs84:lat 42.491213000e+00; wgs84:long -71.354526000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:19:43.137Z"; +]; +gps:trackpoint [wgs84:lat 42.491258000e+00; wgs84:long -71.354507000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:19:45.134Z"; +]; +gps:trackpoint [wgs84:lat 42.491303000e+00; wgs84:long -71.354485000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:19:47.138Z"; +]; +gps:trackpoint [wgs84:lat 42.491346000e+00; wgs84:long -71.354462000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:19:49.134Z"; +]; +gps:trackpoint [wgs84:lat 42.491397000e+00; wgs84:long -71.354457000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:19:52.129Z"; +]; +gps:trackpoint [wgs84:lat 42.491454000e+00; wgs84:long -71.354477000e+00; + wgs84:altitude 65.000000e0; + wgs84:time "2016-01-09T13:19:56.131Z"; +]; +gps:trackpoint [wgs84:lat 42.491511000e+00; wgs84:long -71.354511000e+00; + wgs84:altitude 65.000000e0; + wgs84:time "2016-01-09T13:19:59.145Z"; +]; +gps:trackpoint [wgs84:lat 42.491553000e+00; wgs84:long -71.354531000e+00; + wgs84:altitude 65.000000e0; + wgs84:time "2016-01-09T13:20:02.125Z"; +]; +gps:trackpoint [wgs84:lat 42.491614000e+00; wgs84:long -71.354553000e+00; + wgs84:altitude 65.000000e0; + wgs84:time "2016-01-09T13:20:06.122Z"; +]; +gps:trackpoint [wgs84:lat 42.491668000e+00; wgs84:long -71.354586000e+00; + wgs84:altitude 65.000000e0; + wgs84:time "2016-01-09T13:20:09.139Z"; +]; +gps:trackpoint [wgs84:lat 42.491712000e+00; wgs84:long -71.354617000e+00; + wgs84:altitude 65.000000e0; + wgs84:time "2016-01-09T13:20:11.126Z"; +]; +gps:trackpoint [wgs84:lat 42.491771000e+00; wgs84:long -71.354626000e+00; + wgs84:altitude 66.000000e0; + wgs84:time "2016-01-09T13:20:14.118Z"; +]; +gps:trackpoint [wgs84:lat 42.491818000e+00; wgs84:long -71.354619000e+00; + wgs84:altitude 66.000000e0; + wgs84:time "2016-01-09T13:20:16.131Z"; +]; +gps:trackpoint [wgs84:lat 42.491868000e+00; wgs84:long -71.354603000e+00; + wgs84:altitude 66.000000e0; + wgs84:time "2016-01-09T13:20:19.131Z"; +]; +gps:trackpoint [wgs84:lat 42.491920000e+00; wgs84:long -71.354599000e+00; + wgs84:altitude 66.000000e0; + wgs84:time "2016-01-09T13:20:22.131Z"; +]; +gps:trackpoint [wgs84:lat 42.491977000e+00; wgs84:long -71.354599000e+00; + wgs84:altitude 66.000000e0; + wgs84:time "2016-01-09T13:20:25.134Z"; +]; +gps:trackpoint [wgs84:lat 42.492034000e+00; wgs84:long -71.354622000e+00; + wgs84:altitude 66.000000e0; + wgs84:time "2016-01-09T13:20:28.131Z"; +]; +gps:trackpoint [wgs84:lat 42.492088000e+00; wgs84:long -71.354611000e+00; + wgs84:altitude 66.000000e0; + wgs84:time "2016-01-09T13:20:31.124Z"; +]; +gps:trackpoint [wgs84:lat 42.492143000e+00; wgs84:long -71.354594000e+00; + wgs84:altitude 66.000000e0; + wgs84:time "2016-01-09T13:20:34.139Z"; +]; +gps:trackpoint [wgs84:lat 42.492189000e+00; wgs84:long -71.354582000e+00; + wgs84:altitude 66.000000e0; + wgs84:time "2016-01-09T13:20:36.142Z"; +]; +gps:trackpoint [wgs84:lat 42.492240000e+00; wgs84:long -71.354594000e+00; + wgs84:altitude 66.000000e0; + wgs84:time "2016-01-09T13:20:39.121Z"; +]; +gps:trackpoint [wgs84:lat 42.492291000e+00; wgs84:long -71.354612000e+00; + wgs84:altitude 66.000000e0; + wgs84:time "2016-01-09T13:20:41.135Z"; +]; +gps:trackpoint [wgs84:lat 42.492339000e+00; wgs84:long -71.354617000e+00; + wgs84:altitude 66.000000e0; + wgs84:time "2016-01-09T13:20:44.166Z"; +]; +gps:trackpoint [wgs84:lat 42.492400000e+00; wgs84:long -71.354636000e+00; + wgs84:altitude 66.000000e0; + wgs84:time "2016-01-09T13:20:47.118Z"; +]; +gps:trackpoint [wgs84:lat 42.492452000e+00; wgs84:long -71.354650000e+00; + wgs84:altitude 67.000000e0; + wgs84:time "2016-01-09T13:20:50.134Z"; +]; +gps:trackpoint [wgs84:lat 42.492513000e+00; wgs84:long -71.354649000e+00; + wgs84:altitude 67.000000e0; + wgs84:time "2016-01-09T13:20:53.137Z"; +]; +gps:trackpoint [wgs84:lat 42.492567000e+00; wgs84:long -71.354651000e+00; + wgs84:altitude 68.000000e0; + wgs84:time "2016-01-09T13:20:56.125Z"; +]; +gps:trackpoint [wgs84:lat 42.492613000e+00; wgs84:long -71.354642000e+00; + wgs84:altitude 68.000000e0; + wgs84:time "2016-01-09T13:20:58.129Z"; +]; +gps:trackpoint [wgs84:lat 42.492670000e+00; wgs84:long -71.354645000e+00; + wgs84:altitude 68.000000e0; + wgs84:time "2016-01-09T13:21:01.138Z"; +]; +gps:trackpoint [wgs84:lat 42.492717000e+00; wgs84:long -71.354682000e+00; + wgs84:altitude 68.000000e0; + wgs84:time "2016-01-09T13:21:04.123Z"; +]; +gps:trackpoint [wgs84:lat 42.492772000e+00; wgs84:long -71.354728000e+00; + wgs84:altitude 69.000000e0; + wgs84:time "2016-01-09T13:21:07.138Z"; +]; +gps:trackpoint [wgs84:lat 42.492825000e+00; wgs84:long -71.354738000e+00; + wgs84:altitude 69.000000e0; + wgs84:time "2016-01-09T13:21:10.134Z"; +]; +gps:trackpoint [wgs84:lat 42.492874000e+00; wgs84:long -71.354752000e+00; + wgs84:altitude 70.000000e0; + wgs84:time "2016-01-09T13:21:13.142Z"; +]; +gps:trackpoint [wgs84:lat 42.492921000e+00; wgs84:long -71.354735000e+00; + wgs84:altitude 70.000000e0; + wgs84:time "2016-01-09T13:21:16.137Z"; +]; +gps:trackpoint [wgs84:lat 42.492984000e+00; wgs84:long -71.354741000e+00; + wgs84:altitude 70.000000e0; + wgs84:time "2016-01-09T13:21:19.138Z"; +]; +gps:trackpoint [wgs84:lat 42.493030000e+00; wgs84:long -71.354736000e+00; + wgs84:altitude 70.000000e0; + wgs84:time "2016-01-09T13:21:21.137Z"; +]; +gps:trackpoint [wgs84:lat 42.493079000e+00; wgs84:long -71.354726000e+00; + wgs84:altitude 70.000000e0; + wgs84:time "2016-01-09T13:21:24.134Z"; +]; +gps:trackpoint [wgs84:lat 42.493143000e+00; wgs84:long -71.354734000e+00; + wgs84:altitude 70.000000e0; + wgs84:time "2016-01-09T13:21:27.136Z"; +]; +gps:trackpoint [wgs84:lat 42.493201000e+00; wgs84:long -71.354764000e+00; + wgs84:altitude 70.000000e0; + wgs84:time "2016-01-09T13:21:30.141Z"; +]; +gps:trackpoint [wgs84:lat 42.493262000e+00; wgs84:long -71.354789000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:21:33.141Z"; +]; +gps:trackpoint [wgs84:lat 42.493329000e+00; wgs84:long -71.354789000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:21:36.147Z"; +]; +gps:trackpoint [wgs84:lat 42.493381000e+00; wgs84:long -71.354791000e+00; + wgs84:altitude 72.000000e0; + wgs84:time "2016-01-09T13:21:39.152Z"; +]; +gps:trackpoint [wgs84:lat 42.493432000e+00; wgs84:long -71.354807000e+00; + wgs84:altitude 72.000000e0; + wgs84:time "2016-01-09T13:21:42.145Z"; +]; +gps:trackpoint [wgs84:lat 42.493493000e+00; wgs84:long -71.354809000e+00; + wgs84:altitude 72.000000e0; + wgs84:time "2016-01-09T13:21:45.132Z"; +]; +gps:trackpoint [wgs84:lat 42.493545000e+00; wgs84:long -71.354811000e+00; + wgs84:altitude 73.000000e0; + wgs84:time "2016-01-09T13:21:48.148Z"; +]; +gps:trackpoint [wgs84:lat 42.493595000e+00; wgs84:long -71.354814000e+00; + wgs84:altitude 73.000000e0; + wgs84:time "2016-01-09T13:21:51.141Z"; +]; +gps:trackpoint [wgs84:lat 42.493642000e+00; wgs84:long -71.354830000e+00; + wgs84:altitude 73.000000e0; + wgs84:time "2016-01-09T13:21:54.122Z"; +]; +gps:trackpoint [wgs84:lat 42.493686000e+00; wgs84:long -71.354858000e+00; + wgs84:altitude 73.000000e0; + wgs84:time "2016-01-09T13:21:57.130Z"; +]; +gps:trackpoint [wgs84:lat 42.493745000e+00; wgs84:long -71.354896000e+00; + wgs84:altitude 73.000000e0; + wgs84:time "2016-01-09T13:22:00.125Z"; +]; +gps:trackpoint [wgs84:lat 42.493791000e+00; wgs84:long -71.354896000e+00; + wgs84:altitude 73.000000e0; + wgs84:time "2016-01-09T13:22:02.112Z"; +]; +gps:trackpoint [wgs84:lat 42.493824000e+00; wgs84:long -71.354847000e+00; + wgs84:altitude 73.000000e0; + wgs84:time "2016-01-09T13:22:21.129Z"; +]; +gps:trackpoint [wgs84:lat 42.493869000e+00; wgs84:long -71.354839000e+00; + wgs84:altitude 74.000000e0; + wgs84:time "2016-01-09T13:22:25.134Z"; +]; +gps:trackpoint [wgs84:lat 42.493920000e+00; wgs84:long -71.354859000e+00; + wgs84:altitude 74.000000e0; + wgs84:time "2016-01-09T13:22:28.132Z"; +]; +gps:trackpoint [wgs84:lat 42.493969000e+00; wgs84:long -71.354876000e+00; + wgs84:altitude 74.000000e0; + wgs84:time "2016-01-09T13:22:31.130Z"; +]; +gps:trackpoint [wgs84:lat 42.494023000e+00; wgs84:long -71.354896000e+00; + wgs84:altitude 74.000000e0; + wgs84:time "2016-01-09T13:22:34.133Z"; +]; +gps:trackpoint [wgs84:lat 42.494087000e+00; wgs84:long -71.354912000e+00; + wgs84:altitude 74.000000e0; + wgs84:time "2016-01-09T13:22:37.135Z"; +]; +gps:trackpoint [wgs84:lat 42.494148000e+00; wgs84:long -71.354930000e+00; + wgs84:altitude 74.000000e0; + wgs84:time "2016-01-09T13:22:40.140Z"; +]; +gps:trackpoint [wgs84:lat 42.494205000e+00; wgs84:long -71.354931000e+00; + wgs84:altitude 74.000000e0; + wgs84:time "2016-01-09T13:22:43.141Z"; +]; +gps:trackpoint [wgs84:lat 42.494265000e+00; wgs84:long -71.354941000e+00; + wgs84:altitude 74.000000e0; + wgs84:time "2016-01-09T13:22:46.135Z"; +]; +gps:trackpoint [wgs84:lat 42.494321000e+00; wgs84:long -71.354989000e+00; + wgs84:altitude 74.000000e0; + wgs84:time "2016-01-09T13:22:49.134Z"; +]; +gps:trackpoint [wgs84:lat 42.494378000e+00; wgs84:long -71.355028000e+00; + wgs84:altitude 74.000000e0; + wgs84:time "2016-01-09T13:22:52.141Z"; +]; +gps:trackpoint [wgs84:lat 42.494420000e+00; wgs84:long -71.355057000e+00; + wgs84:altitude 73.000000e0; + wgs84:time "2016-01-09T13:22:54.137Z"; +]; +gps:trackpoint [wgs84:lat 42.494466000e+00; wgs84:long -71.355065000e+00; + wgs84:altitude 73.000000e0; + wgs84:time "2016-01-09T13:22:56.141Z"; +]; +gps:trackpoint [wgs84:lat 42.494510000e+00; wgs84:long -71.355077000e+00; + wgs84:altitude 73.000000e0; + wgs84:time "2016-01-09T13:23:00.146Z"; +]; +gps:trackpoint [wgs84:lat 42.494564000e+00; wgs84:long -71.355093000e+00; + wgs84:altitude 73.000000e0; + wgs84:time "2016-01-09T13:23:03.137Z"; +]; +gps:trackpoint [wgs84:lat 42.494617000e+00; wgs84:long -71.355084000e+00; + wgs84:altitude 72.000000e0; + wgs84:time "2016-01-09T13:23:05.138Z"; +]; +gps:trackpoint [wgs84:lat 42.494664000e+00; wgs84:long -71.355084000e+00; + wgs84:altitude 72.000000e0; + wgs84:time "2016-01-09T13:23:07.137Z"; +]; +gps:trackpoint [wgs84:lat 42.494710000e+00; wgs84:long -71.355110000e+00; + wgs84:altitude 72.000000e0; + wgs84:time "2016-01-09T13:23:09.136Z"; +]; +gps:trackpoint [wgs84:lat 42.494758000e+00; wgs84:long -71.355133000e+00; + wgs84:altitude 72.000000e0; + wgs84:time "2016-01-09T13:23:11.139Z"; +]; +gps:trackpoint [wgs84:lat 42.494804000e+00; wgs84:long -71.355162000e+00; + wgs84:altitude 72.000000e0; + wgs84:time "2016-01-09T13:23:13.141Z"; +]; +gps:trackpoint [wgs84:lat 42.494851000e+00; wgs84:long -71.355197000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:23:15.136Z"; +]; +gps:trackpoint [wgs84:lat 42.494895000e+00; wgs84:long -71.355222000e+00; + wgs84:altitude 72.000000e0; + wgs84:time "2016-01-09T13:23:17.142Z"; +]; +gps:trackpoint [wgs84:lat 42.494946000e+00; wgs84:long -71.355279000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:23:20.147Z"; +]; +gps:trackpoint [wgs84:lat 42.494995000e+00; wgs84:long -71.355299000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:23:23.151Z"; +]; +gps:trackpoint [wgs84:lat 42.495051000e+00; wgs84:long -71.355304000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:23:26.140Z"; +]; +gps:trackpoint [wgs84:lat 42.495104000e+00; wgs84:long -71.355344000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:23:29.136Z"; +]; +gps:trackpoint [wgs84:lat 42.495149000e+00; wgs84:long -71.355383000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:23:32.125Z"; +]; +gps:trackpoint [wgs84:lat 42.495206000e+00; wgs84:long -71.355379000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:23:35.120Z"; +]; +gps:trackpoint [wgs84:lat 42.495260000e+00; wgs84:long -71.355403000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:23:38.111Z"; +]; +gps:trackpoint [wgs84:lat 42.495309000e+00; wgs84:long -71.355444000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:23:41.125Z"; +]; +gps:trackpoint [wgs84:lat 42.495367000e+00; wgs84:long -71.355479000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:23:44.135Z"; +]; +gps:trackpoint [wgs84:lat 42.495409000e+00; wgs84:long -71.355499000e+00; + wgs84:altitude 72.000000e0; + wgs84:time "2016-01-09T13:23:46.116Z"; +]; +gps:trackpoint [wgs84:lat 42.495479000e+00; wgs84:long -71.355528000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:23:49.109Z"; +]; +gps:trackpoint [wgs84:lat 42.495526000e+00; wgs84:long -71.355552000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:23:51.139Z"; +]; +gps:trackpoint [wgs84:lat 42.495571000e+00; wgs84:long -71.355566000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:23:53.117Z"; +]; +gps:trackpoint [wgs84:lat 42.495634000e+00; wgs84:long -71.355586000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:23:56.110Z"; +]; +gps:trackpoint [wgs84:lat 42.495688000e+00; wgs84:long -71.355585000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:23:59.111Z"; +]; +gps:trackpoint [wgs84:lat 42.495744000e+00; wgs84:long -71.355573000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:24:02.119Z"; +]; +gps:trackpoint [wgs84:lat 42.495804000e+00; wgs84:long -71.355568000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:24:05.125Z"; +]; +gps:trackpoint [wgs84:lat 42.495862000e+00; wgs84:long -71.355541000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:24:08.140Z"; +]; +gps:trackpoint [wgs84:lat 42.495924000e+00; wgs84:long -71.355528000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:24:11.141Z"; +]; +gps:trackpoint [wgs84:lat 42.495985000e+00; wgs84:long -71.355508000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:24:14.131Z"; +]; +gps:trackpoint [wgs84:lat 42.496033000e+00; wgs84:long -71.355496000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:24:16.122Z"; +]; +gps:trackpoint [wgs84:lat 42.496079000e+00; wgs84:long -71.355495000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:24:18.110Z"; +]; +gps:trackpoint [wgs84:lat 42.496123000e+00; wgs84:long -71.355510000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:24:20.117Z"; +]; +gps:trackpoint [wgs84:lat 42.496166000e+00; wgs84:long -71.355538000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:24:22.111Z"; +]; +gps:trackpoint [wgs84:lat 42.496221000e+00; wgs84:long -71.355572000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:24:25.116Z"; +]; +gps:trackpoint [wgs84:lat 42.496281000e+00; wgs84:long -71.355586000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:24:28.107Z"; +]; +gps:trackpoint [wgs84:lat 42.496333000e+00; wgs84:long -71.355582000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:24:31.190Z"; +]; +gps:trackpoint [wgs84:lat 42.496385000e+00; wgs84:long -71.355562000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:24:34.116Z"; +]; +gps:trackpoint [wgs84:lat 42.496436000e+00; wgs84:long -71.355547000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:24:36.107Z"; +]; +gps:trackpoint [wgs84:lat 42.496501000e+00; wgs84:long -71.355547000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:24:39.119Z"; +]; +gps:trackpoint [wgs84:lat 42.496553000e+00; wgs84:long -71.355551000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:24:41.113Z"; +]; +gps:trackpoint [wgs84:lat 42.496605000e+00; wgs84:long -71.355564000e+00; + wgs84:altitude 72.000000e0; + wgs84:time "2016-01-09T13:24:43.110Z"; +]; +gps:trackpoint [wgs84:lat 42.496654000e+00; wgs84:long -71.355573000e+00; + wgs84:altitude 72.000000e0; + wgs84:time "2016-01-09T13:24:45.211Z"; +]; +gps:trackpoint [wgs84:lat 42.496715000e+00; wgs84:long -71.355584000e+00; + wgs84:altitude 72.000000e0; + wgs84:time "2016-01-09T13:24:48.120Z"; +]; +gps:trackpoint [wgs84:lat 42.496775000e+00; wgs84:long -71.355570000e+00; + wgs84:altitude 72.000000e0; + wgs84:time "2016-01-09T13:24:51.128Z"; +]; +gps:trackpoint [wgs84:lat 42.496823000e+00; wgs84:long -71.355560000e+00; + wgs84:altitude 72.000000e0; + wgs84:time "2016-01-09T13:24:54.132Z"; +]; +gps:trackpoint [wgs84:lat 42.496863000e+00; wgs84:long -71.355612000e+00; + wgs84:altitude 72.000000e0; + wgs84:time "2016-01-09T13:24:57.111Z"; +]; +gps:trackpoint [wgs84:lat 42.496918000e+00; wgs84:long -71.355619000e+00; + wgs84:altitude 72.000000e0; + wgs84:time "2016-01-09T13:25:00.155Z"; +]; +gps:trackpoint [wgs84:lat 42.496971000e+00; wgs84:long -71.355605000e+00; + wgs84:altitude 72.000000e0; + wgs84:time "2016-01-09T13:25:03.140Z"; +]; +gps:trackpoint [wgs84:lat 42.497018000e+00; wgs84:long -71.355592000e+00; + wgs84:altitude 72.000000e0; + wgs84:time "2016-01-09T13:25:06.141Z"; +]; +gps:trackpoint [wgs84:lat 42.497062000e+00; wgs84:long -71.355550000e+00; + wgs84:altitude 72.000000e0; + wgs84:time "2016-01-09T13:25:10.143Z"; +]; +gps:trackpoint [wgs84:lat 42.497116000e+00; wgs84:long -71.355540000e+00; + wgs84:altitude 73.000000e0; + wgs84:time "2016-01-09T13:25:15.135Z"; +]; +gps:trackpoint [wgs84:lat 42.497160000e+00; wgs84:long -71.355563000e+00; + wgs84:altitude 73.000000e0; + wgs84:time "2016-01-09T13:25:21.132Z"; +]; +gps:trackpoint [wgs84:lat 42.497203000e+00; wgs84:long -71.355586000e+00; + wgs84:altitude 73.000000e0; + wgs84:time "2016-01-09T13:25:27.141Z"; +]; +gps:trackpoint [wgs84:lat 42.497248000e+00; wgs84:long -71.355591000e+00; + wgs84:altitude 74.000000e0; + wgs84:time "2016-01-09T13:25:30.143Z"; +]; +gps:trackpoint [wgs84:lat 42.497303000e+00; wgs84:long -71.355600000e+00; + wgs84:altitude 73.000000e0; + wgs84:time "2016-01-09T13:25:33.134Z"; +]; +gps:trackpoint [wgs84:lat 42.497347000e+00; wgs84:long -71.355605000e+00; + wgs84:altitude 74.000000e0; + wgs84:time "2016-01-09T13:25:35.167Z"; +]; +gps:trackpoint [wgs84:lat 42.497395000e+00; wgs84:long -71.355610000e+00; + wgs84:altitude 74.000000e0; + wgs84:time "2016-01-09T13:25:37.146Z"; +]; +gps:trackpoint [wgs84:lat 42.497440000e+00; wgs84:long -71.355618000e+00; + wgs84:altitude 74.000000e0; + wgs84:time "2016-01-09T13:25:39.147Z"; +]; +gps:trackpoint [wgs84:lat 42.497483000e+00; wgs84:long -71.355641000e+00; + wgs84:altitude 74.000000e0; + wgs84:time "2016-01-09T13:25:41.147Z"; +]; +gps:trackpoint [wgs84:lat 42.497525000e+00; wgs84:long -71.355669000e+00; + wgs84:altitude 74.000000e0; + wgs84:time "2016-01-09T13:25:43.134Z"; +]; +gps:trackpoint [wgs84:lat 42.497582000e+00; wgs84:long -71.355704000e+00; + wgs84:altitude 74.000000e0; + wgs84:time "2016-01-09T13:25:46.113Z"; +]; +gps:trackpoint [wgs84:lat 42.497636000e+00; wgs84:long -71.355713000e+00; + wgs84:altitude 74.000000e0; + wgs84:time "2016-01-09T13:25:49.111Z"; +]; +gps:trackpoint [wgs84:lat 42.497688000e+00; wgs84:long -71.355727000e+00; + wgs84:altitude 74.000000e0; + wgs84:time "2016-01-09T13:25:52.109Z"; +]; +gps:trackpoint [wgs84:lat 42.497737000e+00; wgs84:long -71.355752000e+00; + wgs84:altitude 73.000000e0; + wgs84:time "2016-01-09T13:25:55.126Z"; +]; +gps:trackpoint [wgs84:lat 42.497781000e+00; wgs84:long -71.355788000e+00; + wgs84:altitude 73.000000e0; + wgs84:time "2016-01-09T13:25:57.113Z"; +]; +gps:trackpoint [wgs84:lat 42.497834000e+00; wgs84:long -71.355822000e+00; + wgs84:altitude 74.000000e0; + wgs84:time "2016-01-09T13:26:00.110Z"; +]; +gps:trackpoint [wgs84:lat 42.497877000e+00; wgs84:long -71.355840000e+00; + wgs84:altitude 74.000000e0; + wgs84:time "2016-01-09T13:26:02.168Z"; +]; +gps:trackpoint [wgs84:lat 42.497934000e+00; wgs84:long -71.355876000e+00; + wgs84:altitude 74.000000e0; + wgs84:time "2016-01-09T13:26:05.120Z"; +]; +gps:trackpoint [wgs84:lat 42.497990000e+00; wgs84:long -71.355894000e+00; + wgs84:altitude 74.000000e0; + wgs84:time "2016-01-09T13:26:08.148Z"; +]; +gps:trackpoint [wgs84:lat 42.498034000e+00; wgs84:long -71.355936000e+00; + wgs84:altitude 74.000000e0; + wgs84:time "2016-01-09T13:26:11.147Z"; +]; +gps:trackpoint [wgs84:lat 42.498078000e+00; wgs84:long -71.355982000e+00; + wgs84:altitude 74.000000e0; + wgs84:time "2016-01-09T13:26:14.135Z"; +]; +gps:trackpoint [wgs84:lat 42.498126000e+00; wgs84:long -71.356017000e+00; + wgs84:altitude 75.000000e0; + wgs84:time "2016-01-09T13:26:17.140Z"; +]; +gps:trackpoint [wgs84:lat 42.498181000e+00; wgs84:long -71.356039000e+00; + wgs84:altitude 75.000000e0; + wgs84:time "2016-01-09T13:26:20.136Z"; +]; +gps:trackpoint [wgs84:lat 42.498241000e+00; wgs84:long -71.356011000e+00; + wgs84:altitude 75.000000e0; + wgs84:time "2016-01-09T13:26:23.141Z"; +]; +gps:trackpoint [wgs84:lat 42.498295000e+00; wgs84:long -71.355991000e+00; + wgs84:altitude 75.000000e0; + wgs84:time "2016-01-09T13:26:26.143Z"; +]; +gps:trackpoint [wgs84:lat 42.498340000e+00; wgs84:long -71.356013000e+00; + wgs84:altitude 76.000000e0; + wgs84:time "2016-01-09T13:26:29.142Z"; +]; +gps:trackpoint [wgs84:lat 42.498394000e+00; wgs84:long -71.356010000e+00; + wgs84:altitude 76.000000e0; + wgs84:time "2016-01-09T13:26:32.138Z"; +]; +gps:trackpoint [wgs84:lat 42.498452000e+00; wgs84:long -71.356039000e+00; + wgs84:altitude 76.000000e0; + wgs84:time "2016-01-09T13:26:35.145Z"; +]; +gps:trackpoint [wgs84:lat 42.498511000e+00; wgs84:long -71.356040000e+00; + wgs84:altitude 76.000000e0; + wgs84:time "2016-01-09T13:26:38.144Z"; +]; +gps:trackpoint [wgs84:lat 42.498566000e+00; wgs84:long -71.356028000e+00; + wgs84:altitude 76.000000e0; + wgs84:time "2016-01-09T13:26:41.142Z"; +]; +gps:trackpoint [wgs84:lat 42.498610000e+00; wgs84:long -71.356033000e+00; + wgs84:altitude 76.000000e0; + wgs84:time "2016-01-09T13:26:43.140Z"; +]; +gps:trackpoint [wgs84:lat 42.498668000e+00; wgs84:long -71.356032000e+00; + wgs84:altitude 76.000000e0; + wgs84:time "2016-01-09T13:26:46.125Z"; +]; +gps:trackpoint [wgs84:lat 42.498711000e+00; wgs84:long -71.356006000e+00; + wgs84:altitude 76.000000e0; + wgs84:time "2016-01-09T13:26:48.131Z"; +]; +gps:trackpoint [wgs84:lat 42.498770000e+00; wgs84:long -71.355958000e+00; + wgs84:altitude 76.000000e0; + wgs84:time "2016-01-09T13:26:51.146Z"; +]; +gps:trackpoint [wgs84:lat 42.498801000e+00; wgs84:long -71.355910000e+00; + wgs84:altitude 76.000000e0; + wgs84:time "2016-01-09T13:26:53.141Z"; +]; +gps:trackpoint [wgs84:lat 42.498848000e+00; wgs84:long -71.355842000e+00; + wgs84:altitude 76.000000e0; + wgs84:time "2016-01-09T13:26:56.131Z"; +]; +gps:trackpoint [wgs84:lat 42.498896000e+00; wgs84:long -71.355804000e+00; + wgs84:altitude 76.000000e0; + wgs84:time "2016-01-09T13:26:58.145Z"; +]; +gps:trackpoint [wgs84:lat 42.498936000e+00; wgs84:long -71.355755000e+00; + wgs84:altitude 76.000000e0; + wgs84:time "2016-01-09T13:27:00.124Z"; +]; +gps:trackpoint [wgs84:lat 42.498994000e+00; wgs84:long -71.355705000e+00; + wgs84:altitude 76.000000e0; + wgs84:time "2016-01-09T13:27:03.142Z"; +]; +gps:trackpoint [wgs84:lat 42.499021000e+00; wgs84:long -71.355655000e+00; + wgs84:altitude 76.000000e0; + wgs84:time "2016-01-09T13:27:06.123Z"; +]; +gps:trackpoint [wgs84:lat 42.499068000e+00; wgs84:long -71.355599000e+00; + wgs84:altitude 77.000000e0; + wgs84:time "2016-01-09T13:27:09.152Z"; +]; +gps:trackpoint [wgs84:lat 42.499107000e+00; wgs84:long -71.355550000e+00; + wgs84:altitude 76.000000e0; + wgs84:time "2016-01-09T13:27:12.144Z"; +]; +gps:trackpoint [wgs84:lat 42.499115000e+00; wgs84:long -71.355473000e+00; + wgs84:altitude 77.000000e0; + wgs84:time "2016-01-09T13:27:15.147Z"; +]; +gps:trackpoint [wgs84:lat 42.499125000e+00; wgs84:long -71.355416000e+00; + wgs84:altitude 77.000000e0; + wgs84:time "2016-01-09T13:27:17.124Z"; +]; +gps:trackpoint [wgs84:lat 42.499168000e+00; wgs84:long -71.355373000e+00; + wgs84:altitude 77.000000e0; + wgs84:time "2016-01-09T13:27:20.115Z"; +]; +gps:trackpoint [wgs84:lat 42.499218000e+00; wgs84:long -71.355336000e+00; + wgs84:altitude 77.000000e0; + wgs84:time "2016-01-09T13:27:23.127Z"; +]; +gps:trackpoint [wgs84:lat 42.499266000e+00; wgs84:long -71.355307000e+00; + wgs84:altitude 78.000000e0; + wgs84:time "2016-01-09T13:27:26.139Z"; +]; +gps:trackpoint [wgs84:lat 42.499319000e+00; wgs84:long -71.355290000e+00; + wgs84:altitude 78.000000e0; + wgs84:time "2016-01-09T13:27:28.129Z"; +]; +gps:trackpoint [wgs84:lat 42.499361000e+00; wgs84:long -71.355270000e+00; + wgs84:altitude 78.000000e0; + wgs84:time "2016-01-09T13:27:30.178Z"; +]; +gps:trackpoint [wgs84:lat 42.499393000e+00; wgs84:long -71.355214000e+00; + wgs84:altitude 78.000000e0; + wgs84:time "2016-01-09T13:27:33.129Z"; +]; +gps:trackpoint [wgs84:lat 42.499402000e+00; wgs84:long -71.355144000e+00; + wgs84:altitude 78.000000e0; + wgs84:time "2016-01-09T13:27:36.140Z"; +]; +gps:trackpoint [wgs84:lat 42.499354000e+00; wgs84:long -71.355086000e+00; + wgs84:altitude 78.000000e0; + wgs84:time "2016-01-09T13:27:39.116Z"; +]; +gps:trackpoint [wgs84:lat 42.499284000e+00; wgs84:long -71.355055000e+00; + wgs84:altitude 77.000000e0; + wgs84:time "2016-01-09T13:27:41.114Z"; +]; +gps:trackpoint [wgs84:lat 42.499238000e+00; wgs84:long -71.355006000e+00; + wgs84:altitude 78.000000e0; + wgs84:time "2016-01-09T13:27:43.147Z"; +]; +gps:trackpoint [wgs84:lat 42.499218000e+00; wgs84:long -71.354932000e+00; + wgs84:altitude 77.000000e0; + wgs84:time "2016-01-09T13:27:46.145Z"; +]; +gps:trackpoint [wgs84:lat 42.499215000e+00; wgs84:long -71.354851000e+00; + wgs84:altitude 77.000000e0; + wgs84:time "2016-01-09T13:27:49.137Z"; +]; +gps:trackpoint [wgs84:lat 42.499214000e+00; wgs84:long -71.354763000e+00; + wgs84:altitude 77.000000e0; + wgs84:time "2016-01-09T13:27:52.135Z"; +]; +gps:trackpoint [wgs84:lat 42.499221000e+00; wgs84:long -71.354694000e+00; + wgs84:altitude 77.000000e0; + wgs84:time "2016-01-09T13:27:54.130Z"; +]; +gps:trackpoint [wgs84:lat 42.499249000e+00; wgs84:long -71.354601000e+00; + wgs84:altitude 76.000000e0; + wgs84:time "2016-01-09T13:27:57.139Z"; +]; +gps:trackpoint [wgs84:lat 42.499277000e+00; wgs84:long -71.354527000e+00; + wgs84:altitude 76.000000e0; + wgs84:time "2016-01-09T13:27:59.154Z"; +]; +gps:trackpoint [wgs84:lat 42.499288000e+00; wgs84:long -71.354468000e+00; + wgs84:altitude 76.000000e0; + wgs84:time "2016-01-09T13:28:01.135Z"; +]; +gps:trackpoint [wgs84:lat 42.499291000e+00; wgs84:long -71.354406000e+00; + wgs84:altitude 76.000000e0; + wgs84:time "2016-01-09T13:28:03.143Z"; +]; +gps:trackpoint [wgs84:lat 42.499289000e+00; wgs84:long -71.354344000e+00; + wgs84:altitude 76.000000e0; + wgs84:time "2016-01-09T13:28:05.144Z"; +]; +gps:trackpoint [wgs84:lat 42.499283000e+00; wgs84:long -71.354284000e+00; + wgs84:altitude 76.000000e0; + wgs84:time "2016-01-09T13:28:07.141Z"; +]; +gps:trackpoint [wgs84:lat 42.499283000e+00; wgs84:long -71.354218000e+00; + wgs84:altitude 75.000000e0; + wgs84:time "2016-01-09T13:28:09.151Z"; +]; +gps:trackpoint [wgs84:lat 42.499279000e+00; wgs84:long -71.354160000e+00; + wgs84:altitude 76.000000e0; + wgs84:time "2016-01-09T13:28:11.129Z"; +]; +gps:trackpoint [wgs84:lat 42.499246000e+00; wgs84:long -71.354086000e+00; + wgs84:altitude 75.000000e0; + wgs84:time "2016-01-09T13:28:14.143Z"; +]; +gps:trackpoint [wgs84:lat 42.499208000e+00; wgs84:long -71.354040000e+00; + wgs84:altitude 75.000000e0; + wgs84:time "2016-01-09T13:28:17.136Z"; +]; +gps:trackpoint [wgs84:lat 42.499142000e+00; wgs84:long -71.353996000e+00; + wgs84:altitude 76.000000e0; + wgs84:time "2016-01-09T13:28:20.149Z"; +]; +gps:trackpoint [wgs84:lat 42.499101000e+00; wgs84:long -71.353970000e+00; + wgs84:altitude 76.000000e0; + wgs84:time "2016-01-09T13:28:22.141Z"; +]; +gps:trackpoint [wgs84:lat 42.499052000e+00; wgs84:long -71.353947000e+00; + wgs84:altitude 75.000000e0; + wgs84:time "2016-01-09T13:28:24.145Z"; +]; +gps:trackpoint [wgs84:lat 42.499002000e+00; wgs84:long -71.353950000e+00; + wgs84:altitude 75.000000e0; + wgs84:time "2016-01-09T13:28:26.131Z"; +]; +gps:trackpoint [wgs84:lat 42.498951000e+00; wgs84:long -71.353963000e+00; + wgs84:altitude 75.000000e0; + wgs84:time "2016-01-09T13:28:28.154Z"; +]; +gps:trackpoint [wgs84:lat 42.498900000e+00; wgs84:long -71.353968000e+00; + wgs84:altitude 75.000000e0; + wgs84:time "2016-01-09T13:28:30.128Z"; +]; +gps:trackpoint [wgs84:lat 42.498857000e+00; wgs84:long -71.353975000e+00; + wgs84:altitude 75.000000e0; + wgs84:time "2016-01-09T13:28:32.125Z"; +]; +gps:trackpoint [wgs84:lat 42.498812000e+00; wgs84:long -71.354001000e+00; + wgs84:altitude 75.000000e0; + wgs84:time "2016-01-09T13:28:34.153Z"; +]; +gps:trackpoint [wgs84:lat 42.498750000e+00; wgs84:long -71.354012000e+00; + wgs84:altitude 75.000000e0; + wgs84:time "2016-01-09T13:28:37.146Z"; +]; +gps:trackpoint [wgs84:lat 42.498704000e+00; wgs84:long -71.353987000e+00; + wgs84:altitude 75.000000e0; + wgs84:time "2016-01-09T13:28:39.144Z"; +]; +gps:trackpoint [wgs84:lat 42.498647000e+00; wgs84:long -71.353954000e+00; + wgs84:altitude 75.000000e0; + wgs84:time "2016-01-09T13:28:42.134Z"; +]; +gps:trackpoint [wgs84:lat 42.498591000e+00; wgs84:long -71.353906000e+00; + wgs84:altitude 75.000000e0; + wgs84:time "2016-01-09T13:28:45.140Z"; +]; +gps:trackpoint [wgs84:lat 42.498535000e+00; wgs84:long -71.353858000e+00; + wgs84:altitude 75.000000e0; + wgs84:time "2016-01-09T13:28:48.141Z"; +]; +gps:trackpoint [wgs84:lat 42.498488000e+00; wgs84:long -71.353793000e+00; + wgs84:altitude 75.000000e0; + wgs84:time "2016-01-09T13:28:51.151Z"; +]; +gps:trackpoint [wgs84:lat 42.498467000e+00; wgs84:long -71.353724000e+00; + wgs84:altitude 75.000000e0; + wgs84:time "2016-01-09T13:28:53.154Z"; +]; +gps:trackpoint [wgs84:lat 42.498467000e+00; wgs84:long -71.353648000e+00; + wgs84:altitude 75.000000e0; + wgs84:time "2016-01-09T13:28:55.140Z"; +]; +gps:trackpoint [wgs84:lat 42.498472000e+00; wgs84:long -71.353566000e+00; + wgs84:altitude 75.000000e0; + wgs84:time "2016-01-09T13:28:58.147Z"; +]; +gps:trackpoint [wgs84:lat 42.498466000e+00; wgs84:long -71.353507000e+00; + wgs84:altitude 75.000000e0; + wgs84:time "2016-01-09T13:29:00.146Z"; +]; +gps:trackpoint [wgs84:lat 42.498465000e+00; wgs84:long -71.353426000e+00; + wgs84:altitude 74.000000e0; + wgs84:time "2016-01-09T13:29:03.148Z"; +]; +gps:trackpoint [wgs84:lat 42.498478000e+00; wgs84:long -71.353358000e+00; + wgs84:altitude 74.000000e0; + wgs84:time "2016-01-09T13:29:06.170Z"; +]; +gps:trackpoint [wgs84:lat 42.498462000e+00; wgs84:long -71.353289000e+00; + wgs84:altitude 73.000000e0; + wgs84:time "2016-01-09T13:29:09.153Z"; +]; +gps:trackpoint [wgs84:lat 42.498459000e+00; wgs84:long -71.353213000e+00; + wgs84:altitude 73.000000e0; + wgs84:time "2016-01-09T13:29:12.142Z"; +]; +gps:trackpoint [wgs84:lat 42.498453000e+00; wgs84:long -71.353141000e+00; + wgs84:altitude 73.000000e0; + wgs84:time "2016-01-09T13:29:15.143Z"; +]; +gps:trackpoint [wgs84:lat 42.498416000e+00; wgs84:long -71.353090000e+00; + wgs84:altitude 73.000000e0; + wgs84:time "2016-01-09T13:29:18.146Z"; +]; +gps:trackpoint [wgs84:lat 42.498376000e+00; wgs84:long -71.353028000e+00; + wgs84:altitude 73.000000e0; + wgs84:time "2016-01-09T13:29:21.142Z"; +]; +gps:trackpoint [wgs84:lat 42.498348000e+00; wgs84:long -71.352964000e+00; + wgs84:altitude 72.000000e0; + wgs84:time "2016-01-09T13:29:24.118Z"; +]; +gps:trackpoint [wgs84:lat 42.498309000e+00; wgs84:long -71.352903000e+00; + wgs84:altitude 72.000000e0; + wgs84:time "2016-01-09T13:29:27.116Z"; +]; +gps:trackpoint [wgs84:lat 42.498315000e+00; wgs84:long -71.352833000e+00; + wgs84:altitude 72.000000e0; + wgs84:time "2016-01-09T13:29:29.117Z"; +]; +gps:trackpoint [wgs84:lat 42.498350000e+00; wgs84:long -71.352780000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:29:31.113Z"; +]; +gps:trackpoint [wgs84:lat 42.498395000e+00; wgs84:long -71.352729000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:29:33.122Z"; +]; +gps:trackpoint [wgs84:lat 42.498449000e+00; wgs84:long -71.352671000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:29:36.130Z"; +]; +gps:trackpoint [wgs84:lat 42.498500000e+00; wgs84:long -71.352609000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:29:39.147Z"; +]; +gps:trackpoint [wgs84:lat 42.498546000e+00; wgs84:long -71.352569000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:29:42.131Z"; +]; +gps:trackpoint [wgs84:lat 42.498598000e+00; wgs84:long -71.352541000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:29:45.141Z"; +]; +gps:trackpoint [wgs84:lat 42.498647000e+00; wgs84:long -71.352498000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:29:48.148Z"; +]; +gps:trackpoint [wgs84:lat 42.498658000e+00; wgs84:long -71.352438000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:29:51.135Z"; +]; +gps:trackpoint [wgs84:lat 42.498655000e+00; wgs84:long -71.352369000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:29:54.155Z"; +]; +gps:trackpoint [wgs84:lat 42.498655000e+00; wgs84:long -71.352286000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:29:57.147Z"; +]; +gps:trackpoint [wgs84:lat 42.498658000e+00; wgs84:long -71.352227000e+00; + wgs84:altitude 71.000000e0; + wgs84:time "2016-01-09T13:29:59.151Z"; +]; +gps:trackpoint [wgs84:lat 42.498628000e+00; wgs84:long -71.352150000e+00; + wgs84:altitude 70.000000e0; + wgs84:time "2016-01-09T13:30:02.146Z"; +]; +gps:trackpoint [wgs84:lat 42.498591000e+00; wgs84:long -71.352084000e+00; + wgs84:altitude 70.000000e0; + wgs84:time "2016-01-09T13:30:06.129Z"; +]; +gps:trackpoint [wgs84:lat 42.498596000e+00; wgs84:long -71.352009000e+00; + wgs84:altitude 69.000000e0; + wgs84:time "2016-01-09T13:30:09.131Z"; +]; +gps:trackpoint [wgs84:lat 42.498605000e+00; wgs84:long -71.351952000e+00; + wgs84:altitude 69.000000e0; + wgs84:time "2016-01-09T13:30:11.148Z"; +]; +gps:trackpoint [wgs84:lat 42.498607000e+00; wgs84:long -71.351872000e+00; + wgs84:altitude 69.000000e0; + wgs84:time "2016-01-09T13:30:14.144Z"; +]; +gps:trackpoint [wgs84:lat 42.498614000e+00; wgs84:long -71.351803000e+00; + wgs84:altitude 69.000000e0; + wgs84:time "2016-01-09T13:30:17.140Z"; +]; +gps:trackpoint [wgs84:lat 42.498624000e+00; wgs84:long -71.351732000e+00; + wgs84:altitude 69.000000e0; + wgs84:time "2016-01-09T13:30:20.145Z"; +]; +gps:trackpoint [wgs84:lat 42.498626000e+00; wgs84:long -71.351670000e+00; + wgs84:altitude 69.000000e0; + wgs84:time "2016-01-09T13:30:22.150Z"; +]; +gps:trackpoint [wgs84:lat 42.498644000e+00; wgs84:long -71.351581000e+00; + wgs84:altitude 69.000000e0; + wgs84:time "2016-01-09T13:30:25.151Z"; +]; +gps:trackpoint [wgs84:lat 42.498668000e+00; wgs84:long -71.351523000e+00; + wgs84:altitude 68.000000e0; + wgs84:time "2016-01-09T13:30:27.136Z"; +]; +gps:trackpoint [wgs84:lat 42.498703000e+00; wgs84:long -71.351451000e+00; + wgs84:altitude 68.000000e0; + wgs84:time "2016-01-09T13:30:30.144Z"; +]; +gps:trackpoint [wgs84:lat 42.498726000e+00; wgs84:long -71.351374000e+00; + wgs84:altitude 68.000000e0; + wgs84:time "2016-01-09T13:30:33.134Z"; +]; +gps:trackpoint [wgs84:lat 42.498727000e+00; wgs84:long -71.351299000e+00; + wgs84:altitude 67.000000e0; + wgs84:time "2016-01-09T13:30:36.159Z"; +]; +gps:trackpoint [wgs84:lat 42.498757000e+00; wgs84:long -71.351224000e+00; + wgs84:altitude 67.000000e0; + wgs84:time "2016-01-09T13:30:39.151Z"; +]; +gps:trackpoint [wgs84:lat 42.498775000e+00; wgs84:long -71.351143000e+00; + wgs84:altitude 67.000000e0; + wgs84:time "2016-01-09T13:30:42.145Z"; +]; +gps:trackpoint [wgs84:lat 42.498781000e+00; wgs84:long -71.351066000e+00; + wgs84:altitude 66.000000e0; + wgs84:time "2016-01-09T13:30:45.147Z"; +]; +gps:trackpoint [wgs84:lat 42.498784000e+00; wgs84:long -71.351005000e+00; + wgs84:altitude 66.000000e0; + wgs84:time "2016-01-09T13:30:48.131Z"; +]; +gps:trackpoint [wgs84:lat 42.498797000e+00; wgs84:long -71.350921000e+00; + wgs84:altitude 65.000000e0; + wgs84:time "2016-01-09T13:30:51.147Z"; +]; +gps:trackpoint [wgs84:lat 42.498804000e+00; wgs84:long -71.350861000e+00; + wgs84:altitude 65.000000e0; + wgs84:time "2016-01-09T13:30:54.149Z"; +]; +gps:trackpoint [wgs84:lat 42.498814000e+00; wgs84:long -71.350803000e+00; + wgs84:altitude 65.000000e0; + wgs84:time "2016-01-09T13:30:57.152Z"; +]; +gps:trackpoint [wgs84:lat 42.498860000e+00; wgs84:long -71.350757000e+00; + wgs84:altitude 65.000000e0; + wgs84:time "2016-01-09T13:31:00.152Z"; +]; +gps:trackpoint [wgs84:lat 42.498912000e+00; wgs84:long -71.350724000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:31:03.135Z"; +]; +gps:trackpoint [wgs84:lat 42.498966000e+00; wgs84:long -71.350692000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:31:06.151Z"; +]; +gps:trackpoint [wgs84:lat 42.499013000e+00; wgs84:long -71.350661000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:31:09.141Z"; +]; +gps:trackpoint [wgs84:lat 42.499051000e+00; wgs84:long -71.350613000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:31:12.112Z"; +]; +gps:trackpoint [wgs84:lat 42.499068000e+00; wgs84:long -71.350551000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:31:15.147Z"; +]; +gps:trackpoint [wgs84:lat 42.499107000e+00; wgs84:long -71.350508000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:31:18.191Z"; +]; +gps:trackpoint [wgs84:lat 42.499152000e+00; wgs84:long -71.350469000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:31:21.135Z"; +]; +gps:trackpoint [wgs84:lat 42.499202000e+00; wgs84:long -71.350413000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:31:24.123Z"; +]; +gps:trackpoint [wgs84:lat 42.499241000e+00; wgs84:long -71.350346000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:31:27.121Z"; +]; +gps:trackpoint [wgs84:lat 42.499259000e+00; wgs84:long -71.350273000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:31:30.122Z"; +]; +gps:trackpoint [wgs84:lat 42.499267000e+00; wgs84:long -71.350215000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:31:32.156Z"; +]; +gps:trackpoint [wgs84:lat 42.499290000e+00; wgs84:long -71.350148000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:31:35.136Z"; +]; +gps:trackpoint [wgs84:lat 42.499318000e+00; wgs84:long -71.350071000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:31:38.192Z"; +]; +gps:trackpoint [wgs84:lat 42.499331000e+00; wgs84:long -71.350015000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:31:40.137Z"; +]; +gps:trackpoint [wgs84:lat 42.499331000e+00; wgs84:long -71.349956000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:31:42.122Z"; +]; +gps:trackpoint [wgs84:lat 42.499327000e+00; wgs84:long -71.349895000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:31:44.119Z"; +]; +gps:trackpoint [wgs84:lat 42.499344000e+00; wgs84:long -71.349824000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:31:47.116Z"; +]; +gps:trackpoint [wgs84:lat 42.499369000e+00; wgs84:long -71.349753000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:31:50.118Z"; +]; +gps:trackpoint [wgs84:lat 42.499393000e+00; wgs84:long -71.349679000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:31:53.147Z"; +]; +gps:trackpoint [wgs84:lat 42.499393000e+00; wgs84:long -71.349608000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:31:56.146Z"; +]; +gps:trackpoint [wgs84:lat 42.499421000e+00; wgs84:long -71.349535000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:31:59.133Z"; +]; +gps:trackpoint [wgs84:lat 42.499444000e+00; wgs84:long -71.349474000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:32:02.146Z"; +]; +gps:trackpoint [wgs84:lat 42.499442000e+00; wgs84:long -71.349414000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:32:05.154Z"; +]; +gps:trackpoint [wgs84:lat 42.499423000e+00; wgs84:long -71.349344000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:32:08.157Z"; +]; +gps:trackpoint [wgs84:lat 42.499371000e+00; wgs84:long -71.349286000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:32:11.154Z"; +]; +gps:trackpoint [wgs84:lat 42.499332000e+00; wgs84:long -71.349239000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:32:13.136Z"; +]; +gps:trackpoint [wgs84:lat 42.499278000e+00; wgs84:long -71.349175000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:32:16.151Z"; +]; +gps:trackpoint [wgs84:lat 42.499230000e+00; wgs84:long -71.349140000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:32:18.148Z"; +]; +gps:trackpoint [wgs84:lat 42.499172000e+00; wgs84:long -71.349118000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:32:20.188Z"; +]; +gps:trackpoint [wgs84:lat 42.499124000e+00; wgs84:long -71.349090000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:32:22.134Z"; +]; +gps:trackpoint [wgs84:lat 42.499067000e+00; wgs84:long -71.349073000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:32:25.142Z"; +]; +gps:trackpoint [wgs84:lat 42.499008000e+00; wgs84:long -71.349057000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:32:28.134Z"; +]; +gps:trackpoint [wgs84:lat 42.498950000e+00; wgs84:long -71.349021000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:32:31.146Z"; +]; +gps:trackpoint [wgs84:lat 42.498894000e+00; wgs84:long -71.348972000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:32:34.149Z"; +]; +gps:trackpoint [wgs84:lat 42.498846000e+00; wgs84:long -71.348926000e+00; + wgs84:altitude 64.000000e0; + wgs84:time "2016-01-09T13:32:37.149Z"; +]; +gps:trackpoint [wgs84:lat 42.498810000e+00; wgs84:long -71.348887000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:32:39.149Z"; +]; +gps:trackpoint [wgs84:lat 42.498768000e+00; wgs84:long -71.348838000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:32:42.148Z"; +]; +gps:trackpoint [wgs84:lat 42.498746000e+00; wgs84:long -71.348764000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:32:45.144Z"; +]; +gps:trackpoint [wgs84:lat 42.498703000e+00; wgs84:long -71.348698000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:32:48.163Z"; +]; +gps:trackpoint [wgs84:lat 42.498658000e+00; wgs84:long -71.348650000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:32:51.148Z"; +]; +gps:trackpoint [wgs84:lat 42.498620000e+00; wgs84:long -71.348601000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:32:54.149Z"; +]; +gps:trackpoint [wgs84:lat 42.498594000e+00; wgs84:long -71.348550000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:32:57.154Z"; +]; +gps:trackpoint [wgs84:lat 42.498542000e+00; wgs84:long -71.348510000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:33:00.145Z"; +]; +gps:trackpoint [wgs84:lat 42.498497000e+00; wgs84:long -71.348456000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:33:03.154Z"; +]; +gps:trackpoint [wgs84:lat 42.498463000e+00; wgs84:long -71.348400000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:33:06.152Z"; +]; +gps:trackpoint [wgs84:lat 42.498420000e+00; wgs84:long -71.348351000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:33:09.154Z"; +]; +gps:trackpoint [wgs84:lat 42.498373000e+00; wgs84:long -71.348300000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:33:12.149Z"; +]; +gps:trackpoint [wgs84:lat 42.498336000e+00; wgs84:long -71.348244000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:33:15.146Z"; +]; +gps:trackpoint [wgs84:lat 42.498283000e+00; wgs84:long -71.348223000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:33:18.174Z"; +]; +gps:trackpoint [wgs84:lat 42.498223000e+00; wgs84:long -71.348208000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:33:21.138Z"; +]; +gps:trackpoint [wgs84:lat 42.498176000e+00; wgs84:long -71.348180000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:33:23.128Z"; +]; +gps:trackpoint [wgs84:lat 42.498120000e+00; wgs84:long -71.348168000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:33:26.125Z"; +]; +gps:trackpoint [wgs84:lat 42.498077000e+00; wgs84:long -71.348122000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:33:29.124Z"; +]; +gps:trackpoint [wgs84:lat 42.498060000e+00; wgs84:long -71.348044000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:33:32.148Z"; +]; +gps:trackpoint [wgs84:lat 42.498058000e+00; wgs84:long -71.347981000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:33:34.143Z"; +]; +gps:trackpoint [wgs84:lat 42.498058000e+00; wgs84:long -71.347919000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:33:36.141Z"; +]; +gps:trackpoint [wgs84:lat 42.498050000e+00; wgs84:long -71.347854000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:33:39.140Z"; +]; +gps:trackpoint [wgs84:lat 42.498029000e+00; wgs84:long -71.347800000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:33:41.128Z"; +]; +gps:trackpoint [wgs84:lat 42.497990000e+00; wgs84:long -71.347740000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:33:44.150Z"; +]; +gps:trackpoint [wgs84:lat 42.497950000e+00; wgs84:long -71.347702000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:33:48.116Z"; +]; +gps:trackpoint [wgs84:lat 42.497928000e+00; wgs84:long -71.347648000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:33:51.153Z"; +]; +gps:trackpoint [wgs84:lat 42.497896000e+00; wgs84:long -71.347601000e+00; + wgs84:altitude 57.000000e0; + wgs84:time "2016-01-09T13:33:57.143Z"; +]; +gps:trackpoint [wgs84:lat 42.497891000e+00; wgs84:long -71.347532000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:34:02.129Z"; +]; +gps:trackpoint [wgs84:lat 42.497880000e+00; wgs84:long -71.347468000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:34:06.128Z"; +]; +gps:trackpoint [wgs84:lat 42.497881000e+00; wgs84:long -71.347399000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:34:10.136Z"; +]; +gps:trackpoint [wgs84:lat 42.497896000e+00; wgs84:long -71.347330000e+00; + wgs84:altitude 57.000000e0; + wgs84:time "2016-01-09T13:34:15.129Z"; +]; +gps:trackpoint [wgs84:lat 42.497902000e+00; wgs84:long -71.347260000e+00; + wgs84:altitude 57.000000e0; + wgs84:time "2016-01-09T13:34:19.141Z"; +]; +gps:trackpoint [wgs84:lat 42.497889000e+00; wgs84:long -71.347196000e+00; + wgs84:altitude 57.000000e0; + wgs84:time "2016-01-09T13:34:22.152Z"; +]; +gps:trackpoint [wgs84:lat 42.497851000e+00; wgs84:long -71.347153000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:34:26.173Z"; +]; +gps:trackpoint [wgs84:lat 42.497803000e+00; wgs84:long -71.347128000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:34:30.136Z"; +]; +gps:trackpoint [wgs84:lat 42.497763000e+00; wgs84:long -71.347094000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:34:33.150Z"; +]; +gps:trackpoint [wgs84:lat 42.497708000e+00; wgs84:long -71.347054000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:34:36.158Z"; +]; +gps:trackpoint [wgs84:lat 42.497667000e+00; wgs84:long -71.347026000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:34:38.141Z"; +]; +gps:trackpoint [wgs84:lat 42.497607000e+00; wgs84:long -71.346975000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:34:41.152Z"; +]; +gps:trackpoint [wgs84:lat 42.497553000e+00; wgs84:long -71.346938000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:34:44.157Z"; +]; +gps:trackpoint [wgs84:lat 42.497500000e+00; wgs84:long -71.346929000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:34:47.138Z"; +]; +gps:trackpoint [wgs84:lat 42.497443000e+00; wgs84:long -71.346934000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:34:50.153Z"; +]; +gps:trackpoint [wgs84:lat 42.497400000e+00; wgs84:long -71.346942000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:34:52.151Z"; +]; +gps:trackpoint [wgs84:lat 42.497342000e+00; wgs84:long -71.346955000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:34:55.152Z"; +]; +gps:trackpoint [wgs84:lat 42.497279000e+00; wgs84:long -71.346962000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:34:58.149Z"; +]; +gps:trackpoint [wgs84:lat 42.497232000e+00; wgs84:long -71.346952000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:35:01.147Z"; +]; +gps:trackpoint [wgs84:lat 42.497167000e+00; wgs84:long -71.346935000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:35:04.147Z"; +]; +gps:trackpoint [wgs84:lat 42.497104000e+00; wgs84:long -71.346909000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:35:07.159Z"; +]; +gps:trackpoint [wgs84:lat 42.497041000e+00; wgs84:long -71.346906000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:35:10.152Z"; +]; +gps:trackpoint [wgs84:lat 42.496980000e+00; wgs84:long -71.346905000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:35:13.163Z"; +]; +gps:trackpoint [wgs84:lat 42.496928000e+00; wgs84:long -71.346894000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:35:15.147Z"; +]; +gps:trackpoint [wgs84:lat 42.496883000e+00; wgs84:long -71.346880000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:35:17.148Z"; +]; +gps:trackpoint [wgs84:lat 42.496830000e+00; wgs84:long -71.346872000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:35:20.138Z"; +]; +gps:trackpoint [wgs84:lat 42.496779000e+00; wgs84:long -71.346874000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:35:23.144Z"; +]; +gps:trackpoint [wgs84:lat 42.496729000e+00; wgs84:long -71.346866000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:35:26.153Z"; +]; +gps:trackpoint [wgs84:lat 42.496677000e+00; wgs84:long -71.346862000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:35:29.143Z"; +]; +gps:trackpoint [wgs84:lat 42.496631000e+00; wgs84:long -71.346875000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:35:32.138Z"; +]; +gps:trackpoint [wgs84:lat 42.496571000e+00; wgs84:long -71.346860000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:35:35.184Z"; +]; +gps:trackpoint [wgs84:lat 42.496508000e+00; wgs84:long -71.346853000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:35:38.186Z"; +]; +gps:trackpoint [wgs84:lat 42.496441000e+00; wgs84:long -71.346854000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:35:41.142Z"; +]; +gps:trackpoint [wgs84:lat 42.496397000e+00; wgs84:long -71.346837000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:35:43.117Z"; +]; +gps:trackpoint [wgs84:lat 42.496343000e+00; wgs84:long -71.346808000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:35:46.245Z"; +]; +gps:trackpoint [wgs84:lat 42.496283000e+00; wgs84:long -71.346773000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:35:49.149Z"; +]; +gps:trackpoint [wgs84:lat 42.496232000e+00; wgs84:long -71.346735000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:35:52.152Z"; +]; +gps:trackpoint [wgs84:lat 42.496181000e+00; wgs84:long -71.346724000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:35:55.153Z"; +]; +gps:trackpoint [wgs84:lat 42.496138000e+00; wgs84:long -71.346726000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:35:57.150Z"; +]; +gps:trackpoint [wgs84:lat 42.496078000e+00; wgs84:long -71.346726000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:36:02.161Z"; +]; +gps:trackpoint [wgs84:lat 42.496030000e+00; wgs84:long -71.346729000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:36:05.156Z"; +]; +gps:trackpoint [wgs84:lat 42.495969000e+00; wgs84:long -71.346730000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:36:08.155Z"; +]; +gps:trackpoint [wgs84:lat 42.495914000e+00; wgs84:long -71.346744000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:36:13.160Z"; +]; +gps:trackpoint [wgs84:lat 42.495858000e+00; wgs84:long -71.346748000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:36:16.157Z"; +]; +gps:trackpoint [wgs84:lat 42.495808000e+00; wgs84:long -71.346745000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:36:18.164Z"; +]; +gps:trackpoint [wgs84:lat 42.495763000e+00; wgs84:long -71.346748000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:36:20.155Z"; +]; +gps:trackpoint [wgs84:lat 42.495716000e+00; wgs84:long -71.346739000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:36:22.157Z"; +]; +gps:trackpoint [wgs84:lat 42.495665000e+00; wgs84:long -71.346711000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:36:24.147Z"; +]; +gps:trackpoint [wgs84:lat 42.495614000e+00; wgs84:long -71.346686000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:36:27.168Z"; +]; +gps:trackpoint [wgs84:lat 42.495557000e+00; wgs84:long -71.346692000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:36:30.155Z"; +]; +gps:trackpoint [wgs84:lat 42.495503000e+00; wgs84:long -71.346691000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:36:33.149Z"; +]; +gps:trackpoint [wgs84:lat 42.495458000e+00; wgs84:long -71.346675000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:36:36.150Z"; +]; +gps:trackpoint [wgs84:lat 42.495398000e+00; wgs84:long -71.346659000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:36:40.143Z"; +]; +gps:trackpoint [wgs84:lat 42.495340000e+00; wgs84:long -71.346661000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:36:44.129Z"; +]; +gps:trackpoint [wgs84:lat 42.495279000e+00; wgs84:long -71.346624000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:36:47.125Z"; +]; +gps:trackpoint [wgs84:lat 42.495227000e+00; wgs84:long -71.346585000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:36:49.121Z"; +]; +gps:trackpoint [wgs84:lat 42.495183000e+00; wgs84:long -71.346545000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:36:51.120Z"; +]; +gps:trackpoint [wgs84:lat 42.495129000e+00; wgs84:long -71.346503000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:36:54.148Z"; +]; +gps:trackpoint [wgs84:lat 42.495083000e+00; wgs84:long -71.346481000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:36:57.149Z"; +]; +gps:trackpoint [wgs84:lat 42.495026000e+00; wgs84:long -71.346492000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:37:00.153Z"; +]; +gps:trackpoint [wgs84:lat 42.494977000e+00; wgs84:long -71.346472000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:37:04.149Z"; +]; +gps:trackpoint [wgs84:lat 42.494916000e+00; wgs84:long -71.346442000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:37:07.154Z"; +]; +gps:trackpoint [wgs84:lat 42.494859000e+00; wgs84:long -71.346468000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:37:10.145Z"; +]; +gps:trackpoint [wgs84:lat 42.494808000e+00; wgs84:long -71.346521000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:37:13.155Z"; +]; +gps:trackpoint [wgs84:lat 42.494751000e+00; wgs84:long -71.346518000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:37:16.158Z"; +]; +gps:trackpoint [wgs84:lat 42.494691000e+00; wgs84:long -71.346515000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:37:19.156Z"; +]; +gps:trackpoint [wgs84:lat 42.494630000e+00; wgs84:long -71.346519000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:37:22.151Z"; +]; +gps:trackpoint [wgs84:lat 42.494585000e+00; wgs84:long -71.346533000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:37:24.151Z"; +]; +gps:trackpoint [wgs84:lat 42.494528000e+00; wgs84:long -71.346540000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:37:27.163Z"; +]; +gps:trackpoint [wgs84:lat 42.494474000e+00; wgs84:long -71.346494000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:37:30.139Z"; +]; +gps:trackpoint [wgs84:lat 42.494454000e+00; wgs84:long -71.346434000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:37:33.138Z"; +]; +gps:trackpoint [wgs84:lat 42.494412000e+00; wgs84:long -71.346391000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:37:35.126Z"; +]; +gps:trackpoint [wgs84:lat 42.494366000e+00; wgs84:long -71.346356000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:37:37.138Z"; +]; +gps:trackpoint [wgs84:lat 42.494321000e+00; wgs84:long -71.346317000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:37:39.153Z"; +]; +gps:trackpoint [wgs84:lat 42.494281000e+00; wgs84:long -71.346279000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:37:41.149Z"; +]; +gps:trackpoint [wgs84:lat 42.494241000e+00; wgs84:long -71.346258000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:37:43.147Z"; +]; +gps:trackpoint [wgs84:lat 42.494181000e+00; wgs84:long -71.346241000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:37:46.148Z"; +]; +gps:trackpoint [wgs84:lat 42.494124000e+00; wgs84:long -71.346221000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:37:49.144Z"; +]; +gps:trackpoint [wgs84:lat 42.494074000e+00; wgs84:long -71.346211000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:37:54.120Z"; +]; +gps:trackpoint [wgs84:lat 42.494019000e+00; wgs84:long -71.346191000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:37:57.141Z"; +]; +gps:trackpoint [wgs84:lat 42.493973000e+00; wgs84:long -71.346170000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:37:59.192Z"; +]; +gps:trackpoint [wgs84:lat 42.493914000e+00; wgs84:long -71.346173000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:38:02.187Z"; +]; +gps:trackpoint [wgs84:lat 42.493873000e+00; wgs84:long -71.346153000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:38:04.154Z"; +]; +gps:trackpoint [wgs84:lat 42.493821000e+00; wgs84:long -71.346108000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:38:07.153Z"; +]; +gps:trackpoint [wgs84:lat 42.493767000e+00; wgs84:long -71.346108000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:38:09.160Z"; +]; +gps:trackpoint [wgs84:lat 42.493720000e+00; wgs84:long -71.346108000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:38:11.143Z"; +]; +gps:trackpoint [wgs84:lat 42.493676000e+00; wgs84:long -71.346110000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:38:13.154Z"; +]; +gps:trackpoint [wgs84:lat 42.493626000e+00; wgs84:long -71.346132000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:38:16.159Z"; +]; +gps:trackpoint [wgs84:lat 42.493573000e+00; wgs84:long -71.346150000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:38:19.163Z"; +]; +gps:trackpoint [wgs84:lat 42.493532000e+00; wgs84:long -71.346121000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:38:22.158Z"; +]; +gps:trackpoint [wgs84:lat 42.493474000e+00; wgs84:long -71.346083000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:38:25.147Z"; +]; +gps:trackpoint [wgs84:lat 42.493412000e+00; wgs84:long -71.346064000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:38:28.167Z"; +]; +gps:trackpoint [wgs84:lat 42.493367000e+00; wgs84:long -71.346079000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:38:30.155Z"; +]; +gps:trackpoint [wgs84:lat 42.493309000e+00; wgs84:long -71.346115000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:38:33.159Z"; +]; +gps:trackpoint [wgs84:lat 42.493244000e+00; wgs84:long -71.346119000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:38:36.155Z"; +]; +gps:trackpoint [wgs84:lat 42.493197000e+00; wgs84:long -71.346132000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:38:38.151Z"; +]; +gps:trackpoint [wgs84:lat 42.493139000e+00; wgs84:long -71.346128000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:38:41.154Z"; +]; +gps:trackpoint [wgs84:lat 42.493085000e+00; wgs84:long -71.346126000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:38:44.156Z"; +]; +gps:trackpoint [wgs84:lat 42.493033000e+00; wgs84:long -71.346132000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:38:47.141Z"; +]; +gps:trackpoint [wgs84:lat 42.492992000e+00; wgs84:long -71.346101000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:38:49.155Z"; +]; +gps:trackpoint [wgs84:lat 42.492937000e+00; wgs84:long -71.346070000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:38:52.152Z"; +]; +gps:trackpoint [wgs84:lat 42.492885000e+00; wgs84:long -71.346071000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:38:56.157Z"; +]; +gps:trackpoint [wgs84:lat 42.492836000e+00; wgs84:long -71.346115000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:39:00.162Z"; +]; +gps:trackpoint [wgs84:lat 42.492795000e+00; wgs84:long -71.346151000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:39:03.152Z"; +]; +gps:trackpoint [wgs84:lat 42.492746000e+00; wgs84:long -71.346208000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:39:07.151Z"; +]; +gps:trackpoint [wgs84:lat 42.492699000e+00; wgs84:long -71.346255000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:39:10.160Z"; +]; +gps:trackpoint [wgs84:lat 42.492653000e+00; wgs84:long -71.346289000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:39:13.153Z"; +]; +gps:trackpoint [wgs84:lat 42.492612000e+00; wgs84:long -71.346319000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:39:17.149Z"; +]; +gps:trackpoint [wgs84:lat 42.492559000e+00; wgs84:long -71.346325000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:39:22.133Z"; +]; +gps:trackpoint [wgs84:lat 42.492509000e+00; wgs84:long -71.346327000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:39:25.125Z"; +]; +gps:trackpoint [wgs84:lat 42.492465000e+00; wgs84:long -71.346303000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:39:30.142Z"; +]; +gps:trackpoint [wgs84:lat 42.492416000e+00; wgs84:long -71.346307000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:39:33.156Z"; +]; +gps:trackpoint [wgs84:lat 42.492372000e+00; wgs84:long -71.346321000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:39:36.154Z"; +]; +gps:trackpoint [wgs84:lat 42.492308000e+00; wgs84:long -71.346324000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:39:40.154Z"; +]; +gps:trackpoint [wgs84:lat 42.492259000e+00; wgs84:long -71.346324000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:39:42.160Z"; +]; +gps:trackpoint [wgs84:lat 42.492217000e+00; wgs84:long -71.346346000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:39:45.151Z"; +]; +gps:trackpoint [wgs84:lat 42.492172000e+00; wgs84:long -71.346369000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:39:47.145Z"; +]; +gps:trackpoint [wgs84:lat 42.492104000e+00; wgs84:long -71.346396000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:39:50.138Z"; +]; +gps:trackpoint [wgs84:lat 42.492056000e+00; wgs84:long -71.346411000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:39:52.154Z"; +]; +gps:trackpoint [wgs84:lat 42.492014000e+00; wgs84:long -71.346436000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:39:55.154Z"; +]; +gps:trackpoint [wgs84:lat 42.491962000e+00; wgs84:long -71.346425000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:39:58.160Z"; +]; +gps:trackpoint [wgs84:lat 42.491920000e+00; wgs84:long -71.346396000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:40:00.154Z"; +]; +gps:trackpoint [wgs84:lat 42.491874000e+00; wgs84:long -71.346390000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:40:02.160Z"; +]; +gps:trackpoint [wgs84:lat 42.491818000e+00; wgs84:long -71.346416000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:40:05.159Z"; +]; +gps:trackpoint [wgs84:lat 42.491773000e+00; wgs84:long -71.346416000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:40:07.156Z"; +]; +gps:trackpoint [wgs84:lat 42.491724000e+00; wgs84:long -71.346418000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:40:10.160Z"; +]; +gps:trackpoint [wgs84:lat 42.491669000e+00; wgs84:long -71.346438000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:40:13.152Z"; +]; +gps:trackpoint [wgs84:lat 42.491627000e+00; wgs84:long -71.346468000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:40:15.158Z"; +]; +gps:trackpoint [wgs84:lat 42.491585000e+00; wgs84:long -71.346497000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:40:17.165Z"; +]; +gps:trackpoint [wgs84:lat 42.491532000e+00; wgs84:long -71.346524000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:40:20.150Z"; +]; +gps:trackpoint [wgs84:lat 42.491470000e+00; wgs84:long -71.346509000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:40:23.143Z"; +]; +gps:trackpoint [wgs84:lat 42.491413000e+00; wgs84:long -71.346477000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:40:26.157Z"; +]; +gps:trackpoint [wgs84:lat 42.491360000e+00; wgs84:long -71.346506000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:40:29.158Z"; +]; +gps:trackpoint [wgs84:lat 42.491311000e+00; wgs84:long -71.346514000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:40:32.149Z"; +]; +gps:trackpoint [wgs84:lat 42.491256000e+00; wgs84:long -71.346470000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:40:35.157Z"; +]; +gps:trackpoint [wgs84:lat 42.491216000e+00; wgs84:long -71.346447000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:40:37.155Z"; +]; +gps:trackpoint [wgs84:lat 42.491156000e+00; wgs84:long -71.346436000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:40:40.150Z"; +]; +gps:trackpoint [wgs84:lat 42.491099000e+00; wgs84:long -71.346389000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:40:43.161Z"; +]; +gps:trackpoint [wgs84:lat 42.491042000e+00; wgs84:long -71.346363000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:40:46.164Z"; +]; +gps:trackpoint [wgs84:lat 42.490996000e+00; wgs84:long -71.346349000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:40:48.143Z"; +]; +gps:trackpoint [wgs84:lat 42.490951000e+00; wgs84:long -71.346341000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:40:50.170Z"; +]; +gps:trackpoint [wgs84:lat 42.490903000e+00; wgs84:long -71.346335000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:40:52.141Z"; +]; +gps:trackpoint [wgs84:lat 42.490852000e+00; wgs84:long -71.346337000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:40:54.165Z"; +]; +gps:trackpoint [wgs84:lat 42.490795000e+00; wgs84:long -71.346352000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:40:57.157Z"; +]; +gps:trackpoint [wgs84:lat 42.490754000e+00; wgs84:long -71.346375000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:40:59.157Z"; +]; +gps:trackpoint [wgs84:lat 42.490698000e+00; wgs84:long -71.346414000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:41:02.167Z"; +]; +gps:trackpoint [wgs84:lat 42.490645000e+00; wgs84:long -71.346428000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:41:05.151Z"; +]; +gps:trackpoint [wgs84:lat 42.490596000e+00; wgs84:long -71.346421000e+00; + wgs84:altitude 57.000000e0; + wgs84:time "2016-01-09T13:41:08.202Z"; +]; +gps:trackpoint [wgs84:lat 42.490559000e+00; wgs84:long -71.346372000e+00; + wgs84:altitude 57.000000e0; + wgs84:time "2016-01-09T13:41:14.128Z"; +]; +gps:trackpoint [wgs84:lat 42.490532000e+00; wgs84:long -71.346309000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T13:41:17.146Z"; +]; +gps:trackpoint [wgs84:lat 42.490488000e+00; wgs84:long -71.346266000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T13:41:20.155Z"; +]; +gps:trackpoint [wgs84:lat 42.490441000e+00; wgs84:long -71.346248000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T13:41:22.163Z"; +]; +gps:trackpoint [wgs84:lat 42.490387000e+00; wgs84:long -71.346225000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T13:41:24.137Z"; +]; +gps:trackpoint [wgs84:lat 42.490334000e+00; wgs84:long -71.346192000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:41:26.156Z"; +]; +gps:trackpoint [wgs84:lat 42.490279000e+00; wgs84:long -71.346150000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:41:28.174Z"; +]; +gps:trackpoint [wgs84:lat 42.490233000e+00; wgs84:long -71.346113000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:41:30.155Z"; +]; +gps:trackpoint [wgs84:lat 42.490189000e+00; wgs84:long -71.346092000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:41:32.161Z"; +]; +gps:trackpoint [wgs84:lat 42.490157000e+00; wgs84:long -71.346044000e+00; + wgs84:altitude 54.000000e0; + wgs84:time "2016-01-09T13:41:35.151Z"; +]; +gps:trackpoint [wgs84:lat 42.490120000e+00; wgs84:long -71.345989000e+00; + wgs84:altitude 54.000000e0; + wgs84:time "2016-01-09T13:41:38.153Z"; +]; +gps:trackpoint [wgs84:lat 42.490064000e+00; wgs84:long -71.346015000e+00; + wgs84:altitude 54.000000e0; + wgs84:time "2016-01-09T13:41:41.148Z"; +]; +gps:trackpoint [wgs84:lat 42.490031000e+00; wgs84:long -71.346069000e+00; + wgs84:altitude 54.000000e0; + wgs84:time "2016-01-09T13:41:43.126Z"; +]; +gps:trackpoint [wgs84:lat 42.490035000e+00; wgs84:long -71.346162000e+00; + wgs84:altitude 54.000000e0; + wgs84:time "2016-01-09T13:41:46.128Z"; +]; +gps:trackpoint [wgs84:lat 42.490034000e+00; wgs84:long -71.346221000e+00; + wgs84:altitude 54.000000e0; + wgs84:time "2016-01-09T13:41:48.128Z"; +]; +gps:trackpoint [wgs84:lat 42.489999000e+00; wgs84:long -71.346305000e+00; + wgs84:altitude 54.000000e0; + wgs84:time "2016-01-09T13:41:51.146Z"; +]; +gps:trackpoint [wgs84:lat 42.489954000e+00; wgs84:long -71.346366000e+00; + wgs84:altitude 54.000000e0; + wgs84:time "2016-01-09T13:41:53.125Z"; +]; +gps:trackpoint [wgs84:lat 42.489915000e+00; wgs84:long -71.346443000e+00; + wgs84:altitude 54.000000e0; + wgs84:time "2016-01-09T13:41:56.154Z"; +]; +gps:trackpoint [wgs84:lat 42.489882000e+00; wgs84:long -71.346498000e+00; + wgs84:altitude 54.000000e0; + wgs84:time "2016-01-09T13:41:58.162Z"; +]; +gps:trackpoint [wgs84:lat 42.489881000e+00; wgs84:long -71.346579000e+00; + wgs84:altitude 54.000000e0; + wgs84:time "2016-01-09T13:42:01.161Z"; +]; +gps:trackpoint [wgs84:lat 42.489892000e+00; wgs84:long -71.346650000e+00; + wgs84:altitude 54.000000e0; + wgs84:time "2016-01-09T13:42:03.181Z"; +]; +gps:trackpoint [wgs84:lat 42.489890000e+00; wgs84:long -71.346709000e+00; + wgs84:altitude 54.000000e0; + wgs84:time "2016-01-09T13:42:05.153Z"; +]; +gps:trackpoint [wgs84:lat 42.489871000e+00; wgs84:long -71.346791000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:42:08.138Z"; +]; +gps:trackpoint [wgs84:lat 42.489854000e+00; wgs84:long -71.346871000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:42:11.143Z"; +]; +gps:trackpoint [wgs84:lat 42.489808000e+00; wgs84:long -71.346924000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:42:14.165Z"; +]; +gps:trackpoint [wgs84:lat 42.489757000e+00; wgs84:long -71.346942000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:42:17.164Z"; +]; +gps:trackpoint [wgs84:lat 42.489707000e+00; wgs84:long -71.346952000e+00; + wgs84:altitude 54.000000e0; + wgs84:time "2016-01-09T13:42:20.155Z"; +]; +gps:trackpoint [wgs84:lat 42.489657000e+00; wgs84:long -71.346960000e+00; + wgs84:altitude 53.000000e0; + wgs84:time "2016-01-09T13:42:23.160Z"; +]; +gps:trackpoint [wgs84:lat 42.489611000e+00; wgs84:long -71.346988000e+00; + wgs84:altitude 53.000000e0; + wgs84:time "2016-01-09T13:42:26.160Z"; +]; +gps:trackpoint [wgs84:lat 42.489564000e+00; wgs84:long -71.347029000e+00; + wgs84:altitude 52.000000e0; + wgs84:time "2016-01-09T13:42:29.157Z"; +]; +gps:trackpoint [wgs84:lat 42.489528000e+00; wgs84:long -71.347087000e+00; + wgs84:altitude 52.000000e0; + wgs84:time "2016-01-09T13:42:32.158Z"; +]; +gps:trackpoint [wgs84:lat 42.489485000e+00; wgs84:long -71.347139000e+00; + wgs84:altitude 52.000000e0; + wgs84:time "2016-01-09T13:42:35.155Z"; +]; +gps:trackpoint [wgs84:lat 42.489455000e+00; wgs84:long -71.347194000e+00; + wgs84:altitude 51.000000e0; + wgs84:time "2016-01-09T13:42:38.162Z"; +]; +gps:trackpoint [wgs84:lat 42.489413000e+00; wgs84:long -71.347237000e+00; + wgs84:altitude 51.000000e0; + wgs84:time "2016-01-09T13:42:41.159Z"; +]; +gps:trackpoint [wgs84:lat 42.489365000e+00; wgs84:long -71.347260000e+00; + wgs84:altitude 51.000000e0; + wgs84:time "2016-01-09T13:42:44.161Z"; +]; +gps:trackpoint [wgs84:lat 42.489305000e+00; wgs84:long -71.347263000e+00; + wgs84:altitude 51.000000e0; + wgs84:time "2016-01-09T13:42:47.166Z"; +]; +gps:trackpoint [wgs84:lat 42.489244000e+00; wgs84:long -71.347278000e+00; + wgs84:altitude 51.000000e0; + wgs84:time "2016-01-09T13:42:50.151Z"; +]; +gps:trackpoint [wgs84:lat 42.489198000e+00; wgs84:long -71.347268000e+00; + wgs84:altitude 50.000000e0; + wgs84:time "2016-01-09T13:42:52.137Z"; +]; +gps:trackpoint [wgs84:lat 42.489134000e+00; wgs84:long -71.347259000e+00; + wgs84:altitude 50.000000e0; + wgs84:time "2016-01-09T13:42:55.166Z"; +]; +gps:trackpoint [wgs84:lat 42.489078000e+00; wgs84:long -71.347248000e+00; + wgs84:altitude 49.000000e0; + wgs84:time "2016-01-09T13:42:58.158Z"; +]; +gps:trackpoint [wgs84:lat 42.489020000e+00; wgs84:long -71.347264000e+00; + wgs84:altitude 49.000000e0; + wgs84:time "2016-01-09T13:43:01.142Z"; +]; +gps:trackpoint [wgs84:lat 42.488976000e+00; wgs84:long -71.347294000e+00; + wgs84:altitude 48.000000e0; + wgs84:time "2016-01-09T13:43:03.170Z"; +]; +gps:trackpoint [wgs84:lat 42.488909000e+00; wgs84:long -71.347321000e+00; + wgs84:altitude 48.000000e0; + wgs84:time "2016-01-09T13:43:07.024Z"; +]; +gps:trackpoint [wgs84:lat 42.488864000e+00; wgs84:long -71.347336000e+00; + wgs84:altitude 48.000000e0; + wgs84:time "2016-01-09T13:43:08.150Z"; +]; +gps:trackpoint [wgs84:lat 42.488824000e+00; wgs84:long -71.347358000e+00; + wgs84:altitude 47.000000e0; + wgs84:time "2016-01-09T13:43:10.165Z"; +]; +gps:trackpoint [wgs84:lat 42.488768000e+00; wgs84:long -71.347395000e+00; + wgs84:altitude 46.000000e0; + wgs84:time "2016-01-09T13:43:13.145Z"; +]; +gps:trackpoint [wgs84:lat 42.488711000e+00; wgs84:long -71.347412000e+00; + wgs84:altitude 46.000000e0; + wgs84:time "2016-01-09T13:43:16.173Z"; +]; +gps:trackpoint [wgs84:lat 42.488662000e+00; wgs84:long -71.347415000e+00; + wgs84:altitude 46.000000e0; + wgs84:time "2016-01-09T13:43:19.153Z"; +]; +gps:trackpoint [wgs84:lat 42.488609000e+00; wgs84:long -71.347421000e+00; + wgs84:altitude 45.000000e0; + wgs84:time "2016-01-09T13:43:22.129Z"; +]; +gps:trackpoint [wgs84:lat 42.488557000e+00; wgs84:long -71.347436000e+00; + wgs84:altitude 45.000000e0; + wgs84:time "2016-01-09T13:43:25.147Z"; +]; +gps:trackpoint [wgs84:lat 42.488506000e+00; wgs84:long -71.347456000e+00; + wgs84:altitude 44.000000e0; + wgs84:time "2016-01-09T13:43:29.151Z"; +]; +gps:trackpoint [wgs84:lat 42.488448000e+00; wgs84:long -71.347470000e+00; + wgs84:altitude 43.000000e0; + wgs84:time "2016-01-09T13:43:33.160Z"; +]; +gps:trackpoint [wgs84:lat 42.488390000e+00; wgs84:long -71.347497000e+00; + wgs84:altitude 43.000000e0; + wgs84:time "2016-01-09T13:43:36.162Z"; +]; +gps:trackpoint [wgs84:lat 42.488335000e+00; wgs84:long -71.347524000e+00; + wgs84:altitude 43.000000e0; + wgs84:time "2016-01-09T13:43:39.158Z"; +]; +gps:trackpoint [wgs84:lat 42.488284000e+00; wgs84:long -71.347510000e+00; + wgs84:altitude 42.000000e0; + wgs84:time "2016-01-09T13:43:42.174Z"; +]; +gps:trackpoint [wgs84:lat 42.488242000e+00; wgs84:long -71.347480000e+00; + wgs84:altitude 42.000000e0; + wgs84:time "2016-01-09T13:43:45.170Z"; +]; +gps:trackpoint [wgs84:lat 42.488197000e+00; wgs84:long -71.347424000e+00; + wgs84:altitude 42.000000e0; + wgs84:time "2016-01-09T13:43:48.158Z"; +]; +gps:trackpoint [wgs84:lat 42.488166000e+00; wgs84:long -71.347376000e+00; + wgs84:altitude 42.000000e0; + wgs84:time "2016-01-09T13:43:50.173Z"; +]; +gps:trackpoint [wgs84:lat 42.488127000e+00; wgs84:long -71.347339000e+00; + wgs84:altitude 42.000000e0; + wgs84:time "2016-01-09T13:43:52.160Z"; +]; +gps:trackpoint [wgs84:lat 42.488081000e+00; wgs84:long -71.347304000e+00; + wgs84:altitude 42.000000e0; + wgs84:time "2016-01-09T13:43:55.165Z"; +]; +gps:trackpoint [wgs84:lat 42.488029000e+00; wgs84:long -71.347250000e+00; + wgs84:altitude 42.000000e0; + wgs84:time "2016-01-09T13:43:58.163Z"; +]; +gps:trackpoint [wgs84:lat 42.487993000e+00; wgs84:long -71.347180000e+00; + wgs84:altitude 41.000000e0; + wgs84:time "2016-01-09T13:44:02.162Z"; +]; +gps:trackpoint [wgs84:lat 42.487962000e+00; wgs84:long -71.347131000e+00; + wgs84:altitude 41.000000e0; + wgs84:time "2016-01-09T13:44:05.153Z"; +]; +gps:trackpoint [wgs84:lat 42.487915000e+00; wgs84:long -71.347100000e+00; + wgs84:altitude 41.000000e0; + wgs84:time "2016-01-09T13:44:08.167Z"; +]; +gps:trackpoint [wgs84:lat 42.487871000e+00; wgs84:long -71.347102000e+00; + wgs84:altitude 41.000000e0; + wgs84:time "2016-01-09T13:44:10.158Z"; +]; +gps:trackpoint [wgs84:lat 42.487821000e+00; wgs84:long -71.347125000e+00; + wgs84:altitude 41.000000e0; + wgs84:time "2016-01-09T13:44:12.158Z"; +]; +gps:trackpoint [wgs84:lat 42.487780000e+00; wgs84:long -71.347154000e+00; + wgs84:altitude 41.000000e0; + wgs84:time "2016-01-09T13:44:14.153Z"; +]; +gps:trackpoint [wgs84:lat 42.487730000e+00; wgs84:long -71.347185000e+00; + wgs84:altitude 41.000000e0; + wgs84:time "2016-01-09T13:44:16.171Z"; +]; +gps:trackpoint [wgs84:lat 42.487680000e+00; wgs84:long -71.347206000e+00; + wgs84:altitude 41.000000e0; + wgs84:time "2016-01-09T13:44:18.161Z"; +]; +gps:trackpoint [wgs84:lat 42.487620000e+00; wgs84:long -71.347213000e+00; + wgs84:altitude 41.000000e0; + wgs84:time "2016-01-09T13:44:21.138Z"; +]; +gps:trackpoint [wgs84:lat 42.487577000e+00; wgs84:long -71.347206000e+00; + wgs84:altitude 41.000000e0; + wgs84:time "2016-01-09T13:44:23.158Z"; +]; +gps:trackpoint [wgs84:lat 42.487525000e+00; wgs84:long -71.347217000e+00; + wgs84:altitude 41.000000e0; + wgs84:time "2016-01-09T13:44:26.159Z"; +]; +gps:trackpoint [wgs84:lat 42.487468000e+00; wgs84:long -71.347234000e+00; + wgs84:altitude 41.000000e0; + wgs84:time "2016-01-09T13:44:29.158Z"; +]; +gps:trackpoint [wgs84:lat 42.487418000e+00; wgs84:long -71.347269000e+00; + wgs84:altitude 41.000000e0; + wgs84:time "2016-01-09T13:44:32.165Z"; +]; +gps:trackpoint [wgs84:lat 42.487368000e+00; wgs84:long -71.347298000e+00; + wgs84:altitude 41.000000e0; + wgs84:time "2016-01-09T13:44:35.166Z"; +]; +gps:trackpoint [wgs84:lat 42.487323000e+00; wgs84:long -71.347315000e+00; + wgs84:altitude 41.000000e0; + wgs84:time "2016-01-09T13:44:37.166Z"; +]; +gps:trackpoint [wgs84:lat 42.487268000e+00; wgs84:long -71.347327000e+00; + wgs84:altitude 41.000000e0; + wgs84:time "2016-01-09T13:44:40.152Z"; +]; +gps:trackpoint [wgs84:lat 42.487203000e+00; wgs84:long -71.347354000e+00; + wgs84:altitude 41.000000e0; + wgs84:time "2016-01-09T13:44:43.163Z"; +]; +gps:trackpoint [wgs84:lat 42.487151000e+00; wgs84:long -71.347371000e+00; + wgs84:altitude 41.000000e0; + wgs84:time "2016-01-09T13:44:46.175Z"; +]; +gps:trackpoint [wgs84:lat 42.487094000e+00; wgs84:long -71.347357000e+00; + wgs84:altitude 41.000000e0; + wgs84:time "2016-01-09T13:44:49.156Z"; +]; +gps:trackpoint [wgs84:lat 42.487029000e+00; wgs84:long -71.347335000e+00; + wgs84:altitude 41.000000e0; + wgs84:time "2016-01-09T13:44:52.164Z"; +]; +gps:trackpoint [wgs84:lat 42.486972000e+00; wgs84:long -71.347317000e+00; + wgs84:altitude 41.000000e0; + wgs84:time "2016-01-09T13:44:55.165Z"; +]; +gps:trackpoint [wgs84:lat 42.486907000e+00; wgs84:long -71.347296000e+00; + wgs84:altitude 41.000000e0; + wgs84:time "2016-01-09T13:44:58.161Z"; +]; +gps:trackpoint [wgs84:lat 42.486862000e+00; wgs84:long -71.347286000e+00; + wgs84:altitude 41.000000e0; + wgs84:time "2016-01-09T13:45:00.158Z"; +]; +gps:trackpoint [wgs84:lat 42.486817000e+00; wgs84:long -71.347277000e+00; + wgs84:altitude 40.000000e0; + wgs84:time "2016-01-09T13:45:02.146Z"; +]; +gps:trackpoint [wgs84:lat 42.486765000e+00; wgs84:long -71.347274000e+00; + wgs84:altitude 40.000000e0; + wgs84:time "2016-01-09T13:45:05.159Z"; +]; +gps:trackpoint [wgs84:lat 42.486709000e+00; wgs84:long -71.347274000e+00; + wgs84:altitude 40.000000e0; + wgs84:time "2016-01-09T13:45:08.171Z"; +]; +gps:trackpoint [wgs84:lat 42.486660000e+00; wgs84:long -71.347255000e+00; + wgs84:altitude 39.000000e0; + wgs84:time "2016-01-09T13:45:11.149Z"; +]; +gps:trackpoint [wgs84:lat 42.486605000e+00; wgs84:long -71.347206000e+00; + wgs84:altitude 39.000000e0; + wgs84:time "2016-01-09T13:45:14.148Z"; +]; +gps:trackpoint [wgs84:lat 42.486559000e+00; wgs84:long -71.347166000e+00; + wgs84:altitude 39.000000e0; + wgs84:time "2016-01-09T13:45:17.150Z"; +]; +gps:trackpoint [wgs84:lat 42.486513000e+00; wgs84:long -71.347151000e+00; + wgs84:altitude 39.000000e0; + wgs84:time "2016-01-09T13:45:20.144Z"; +]; +gps:trackpoint [wgs84:lat 42.486465000e+00; wgs84:long -71.347108000e+00; + wgs84:altitude 39.000000e0; + wgs84:time "2016-01-09T13:45:23.163Z"; +]; +gps:trackpoint [wgs84:lat 42.486410000e+00; wgs84:long -71.347078000e+00; + wgs84:altitude 39.000000e0; + wgs84:time "2016-01-09T13:45:26.162Z"; +]; +gps:trackpoint [wgs84:lat 42.486371000e+00; wgs84:long -71.347055000e+00; + wgs84:altitude 39.000000e0; + wgs84:time "2016-01-09T13:45:28.166Z"; +]; +gps:trackpoint [wgs84:lat 42.486317000e+00; wgs84:long -71.347049000e+00; + wgs84:altitude 39.000000e0; + wgs84:time "2016-01-09T13:45:31.162Z"; +]; +gps:trackpoint [wgs84:lat 42.486262000e+00; wgs84:long -71.347034000e+00; + wgs84:altitude 39.000000e0; + wgs84:time "2016-01-09T13:45:34.154Z"; +]; +gps:trackpoint [wgs84:lat 42.486218000e+00; wgs84:long -71.347015000e+00; + wgs84:altitude 40.000000e0; + wgs84:time "2016-01-09T13:45:37.164Z"; +]; +gps:trackpoint [wgs84:lat 42.486161000e+00; wgs84:long -71.347006000e+00; + wgs84:altitude 40.000000e0; + wgs84:time "2016-01-09T13:45:40.166Z"; +]; +gps:trackpoint [wgs84:lat 42.486110000e+00; wgs84:long -71.346986000e+00; + wgs84:altitude 40.000000e0; + wgs84:time "2016-01-09T13:45:43.163Z"; +]; +gps:trackpoint [wgs84:lat 42.486065000e+00; wgs84:long -71.346961000e+00; + wgs84:altitude 40.000000e0; + wgs84:time "2016-01-09T13:45:47.168Z"; +]; +gps:trackpoint [wgs84:lat 42.486002000e+00; wgs84:long -71.346926000e+00; + wgs84:altitude 40.000000e0; + wgs84:time "2016-01-09T13:45:50.131Z"; +]; +gps:trackpoint [wgs84:lat 42.485958000e+00; wgs84:long -71.346897000e+00; + wgs84:altitude 40.000000e0; + wgs84:time "2016-01-09T13:45:52.148Z"; +]; +gps:trackpoint [wgs84:lat 42.485899000e+00; wgs84:long -71.346841000e+00; + wgs84:altitude 40.000000e0; + wgs84:time "2016-01-09T13:45:55.143Z"; +]; +gps:trackpoint [wgs84:lat 42.485843000e+00; wgs84:long -71.346787000e+00; + wgs84:altitude 40.000000e0; + wgs84:time "2016-01-09T13:45:58.167Z"; +]; +gps:trackpoint [wgs84:lat 42.485811000e+00; wgs84:long -71.346744000e+00; + wgs84:altitude 40.000000e0; + wgs84:time "2016-01-09T13:46:00.164Z"; +]; +gps:trackpoint [wgs84:lat 42.485774000e+00; wgs84:long -71.346674000e+00; + wgs84:altitude 40.000000e0; + wgs84:time "2016-01-09T13:46:03.251Z"; +]; +gps:trackpoint [wgs84:lat 42.485737000e+00; wgs84:long -71.346627000e+00; + wgs84:altitude 40.000000e0; + wgs84:time "2016-01-09T13:46:06.176Z"; +]; +gps:trackpoint [wgs84:lat 42.485694000e+00; wgs84:long -71.346566000e+00; + wgs84:altitude 40.000000e0; + wgs84:time "2016-01-09T13:46:09.165Z"; +]; +gps:trackpoint [wgs84:lat 42.485641000e+00; wgs84:long -71.346518000e+00; + wgs84:altitude 40.000000e0; + wgs84:time "2016-01-09T13:46:12.167Z"; +]; +gps:trackpoint [wgs84:lat 42.485604000e+00; wgs84:long -71.346477000e+00; + wgs84:altitude 40.000000e0; + wgs84:time "2016-01-09T13:46:14.170Z"; +]; +gps:trackpoint [wgs84:lat 42.485556000e+00; wgs84:long -71.346433000e+00; + wgs84:altitude 41.000000e0; + wgs84:time "2016-01-09T13:46:18.167Z"; +]; +gps:trackpoint [wgs84:lat 42.485516000e+00; wgs84:long -71.346382000e+00; + wgs84:altitude 41.000000e0; + wgs84:time "2016-01-09T13:46:21.159Z"; +]; +gps:trackpoint [wgs84:lat 42.485484000e+00; wgs84:long -71.346312000e+00; + wgs84:altitude 42.000000e0; + wgs84:time "2016-01-09T13:46:24.175Z"; +]; +gps:trackpoint [wgs84:lat 42.485439000e+00; wgs84:long -71.346258000e+00; + wgs84:altitude 42.000000e0; + wgs84:time "2016-01-09T13:46:27.171Z"; +]; +gps:trackpoint [wgs84:lat 42.485393000e+00; wgs84:long -71.346212000e+00; + wgs84:altitude 41.000000e0; + wgs84:time "2016-01-09T13:46:30.152Z"; +]; +gps:trackpoint [wgs84:lat 42.485349000e+00; wgs84:long -71.346168000e+00; + wgs84:altitude 41.000000e0; + wgs84:time "2016-01-09T13:46:33.167Z"; +]; +gps:trackpoint [wgs84:lat 42.485302000e+00; wgs84:long -71.346158000e+00; + wgs84:altitude 42.000000e0; + wgs84:time "2016-01-09T13:46:36.162Z"; +]; +gps:trackpoint [wgs84:lat 42.485246000e+00; wgs84:long -71.346141000e+00; + wgs84:altitude 42.000000e0; + wgs84:time "2016-01-09T13:46:39.149Z"; +]; +gps:trackpoint [wgs84:lat 42.485199000e+00; wgs84:long -71.346111000e+00; + wgs84:altitude 42.000000e0; + wgs84:time "2016-01-09T13:46:42.156Z"; +]; +gps:trackpoint [wgs84:lat 42.485147000e+00; wgs84:long -71.346082000e+00; + wgs84:altitude 42.000000e0; + wgs84:time "2016-01-09T13:46:45.140Z"; +]; +gps:trackpoint [wgs84:lat 42.485097000e+00; wgs84:long -71.346073000e+00; + wgs84:altitude 42.000000e0; + wgs84:time "2016-01-09T13:46:49.135Z"; +]; +gps:trackpoint [wgs84:lat 42.485039000e+00; wgs84:long -71.346053000e+00; + wgs84:altitude 42.000000e0; + wgs84:time "2016-01-09T13:46:52.156Z"; +]; +gps:trackpoint [wgs84:lat 42.484976000e+00; wgs84:long -71.346025000e+00; + wgs84:altitude 42.000000e0; + wgs84:time "2016-01-09T13:46:55.140Z"; +]; +gps:trackpoint [wgs84:lat 42.484929000e+00; wgs84:long -71.345989000e+00; + wgs84:altitude 42.000000e0; + wgs84:time "2016-01-09T13:46:58.186Z"; +]; +gps:trackpoint [wgs84:lat 42.484868000e+00; wgs84:long -71.345962000e+00; + wgs84:altitude 43.000000e0; + wgs84:time "2016-01-09T13:47:01.166Z"; +]; +gps:trackpoint [wgs84:lat 42.484821000e+00; wgs84:long -71.345970000e+00; + wgs84:altitude 43.000000e0; + wgs84:time "2016-01-09T13:47:03.152Z"; +]; +gps:trackpoint [wgs84:lat 42.484775000e+00; wgs84:long -71.345967000e+00; + wgs84:altitude 43.000000e0; + wgs84:time "2016-01-09T13:47:05.212Z"; +]; +gps:trackpoint [wgs84:lat 42.484722000e+00; wgs84:long -71.345958000e+00; + wgs84:altitude 43.000000e0; + wgs84:time "2016-01-09T13:47:08.182Z"; +]; +gps:trackpoint [wgs84:lat 42.484671000e+00; wgs84:long -71.345965000e+00; + wgs84:altitude 43.000000e0; + wgs84:time "2016-01-09T13:47:11.181Z"; +]; +gps:trackpoint [wgs84:lat 42.484618000e+00; wgs84:long -71.345940000e+00; + wgs84:altitude 43.000000e0; + wgs84:time "2016-01-09T13:47:14.148Z"; +]; +gps:trackpoint [wgs84:lat 42.484566000e+00; wgs84:long -71.345917000e+00; + wgs84:altitude 43.000000e0; + wgs84:time "2016-01-09T13:47:17.181Z"; +]; +gps:trackpoint [wgs84:lat 42.484505000e+00; wgs84:long -71.345895000e+00; + wgs84:altitude 43.000000e0; + wgs84:time "2016-01-09T13:47:20.171Z"; +]; +gps:trackpoint [wgs84:lat 42.484445000e+00; wgs84:long -71.345886000e+00; + wgs84:altitude 43.000000e0; + wgs84:time "2016-01-09T13:47:24.167Z"; +]; +gps:trackpoint [wgs84:lat 42.484412000e+00; wgs84:long -71.345937000e+00; + wgs84:altitude 43.000000e0; + wgs84:time "2016-01-09T13:47:27.165Z"; +]; +gps:trackpoint [wgs84:lat 42.484409000e+00; wgs84:long -71.346003000e+00; + wgs84:altitude 43.000000e0; + wgs84:time "2016-01-09T13:47:29.187Z"; +]; +gps:trackpoint [wgs84:lat 42.484410000e+00; wgs84:long -71.346080000e+00; + wgs84:altitude 43.000000e0; + wgs84:time "2016-01-09T13:47:32.161Z"; +]; +gps:trackpoint [wgs84:lat 42.484415000e+00; wgs84:long -71.346140000e+00; + wgs84:altitude 42.000000e0; + wgs84:time "2016-01-09T13:47:35.161Z"; +]; +gps:trackpoint [wgs84:lat 42.484416000e+00; wgs84:long -71.346216000e+00; + wgs84:altitude 42.000000e0; + wgs84:time "2016-01-09T13:47:38.166Z"; +]; +gps:trackpoint [wgs84:lat 42.484399000e+00; wgs84:long -71.346284000e+00; + wgs84:altitude 42.000000e0; + wgs84:time "2016-01-09T13:47:41.162Z"; +]; +gps:trackpoint [wgs84:lat 42.484363000e+00; wgs84:long -71.346336000e+00; + wgs84:altitude 42.000000e0; + wgs84:time "2016-01-09T13:47:45.182Z"; +]; +gps:trackpoint [wgs84:lat 42.484327000e+00; wgs84:long -71.346402000e+00; + wgs84:altitude 42.000000e0; + wgs84:time "2016-01-09T13:47:48.166Z"; +]; +gps:trackpoint [wgs84:lat 42.484299000e+00; wgs84:long -71.346465000e+00; + wgs84:altitude 42.000000e0; + wgs84:time "2016-01-09T13:47:51.164Z"; +]; +gps:trackpoint [wgs84:lat 42.484280000e+00; wgs84:long -71.346537000e+00; + wgs84:altitude 42.000000e0; + wgs84:time "2016-01-09T13:47:55.169Z"; +]; +gps:trackpoint [wgs84:lat 42.484243000e+00; wgs84:long -71.346616000e+00; + wgs84:altitude 43.000000e0; + wgs84:time "2016-01-09T13:47:58.218Z"; +]; +gps:trackpoint [wgs84:lat 42.484204000e+00; wgs84:long -71.346657000e+00; + wgs84:altitude 44.000000e0; + wgs84:time "2016-01-09T13:48:00.172Z"; +]; +gps:trackpoint [wgs84:lat 42.484158000e+00; wgs84:long -71.346687000e+00; + wgs84:altitude 44.000000e0; + wgs84:time "2016-01-09T13:48:02.171Z"; +]; +gps:trackpoint [wgs84:lat 42.484132000e+00; wgs84:long -71.346742000e+00; + wgs84:altitude 44.000000e0; + wgs84:time "2016-01-09T13:48:04.169Z"; +]; +gps:trackpoint [wgs84:lat 42.484131000e+00; wgs84:long -71.346802000e+00; + wgs84:altitude 45.000000e0; + wgs84:time "2016-01-09T13:48:06.156Z"; +]; +gps:trackpoint [wgs84:lat 42.484169000e+00; wgs84:long -71.346878000e+00; + wgs84:altitude 45.000000e0; + wgs84:time "2016-01-09T13:48:09.166Z"; +]; +gps:trackpoint [wgs84:lat 42.484222000e+00; wgs84:long -71.346921000e+00; + wgs84:altitude 45.000000e0; + wgs84:time "2016-01-09T13:48:11.168Z"; +]; +gps:trackpoint [wgs84:lat 42.484271000e+00; wgs84:long -71.346940000e+00; + wgs84:altitude 44.000000e0; + wgs84:time "2016-01-09T13:48:13.170Z"; +]; +gps:trackpoint [wgs84:lat 42.484331000e+00; wgs84:long -71.346959000e+00; + wgs84:altitude 44.000000e0; + wgs84:time "2016-01-09T13:48:15.171Z"; +]; +gps:trackpoint [wgs84:lat 42.484388000e+00; wgs84:long -71.346991000e+00; + wgs84:altitude 44.000000e0; + wgs84:time "2016-01-09T13:48:17.146Z"; +]; +gps:trackpoint [wgs84:lat 42.484437000e+00; wgs84:long -71.347024000e+00; + wgs84:altitude 44.000000e0; + wgs84:time "2016-01-09T13:48:19.172Z"; +]; +gps:trackpoint [wgs84:lat 42.484478000e+00; wgs84:long -71.347058000e+00; + wgs84:altitude 44.000000e0; + wgs84:time "2016-01-09T13:48:21.149Z"; +]; +gps:trackpoint [wgs84:lat 42.484523000e+00; wgs84:long -71.347114000e+00; + wgs84:altitude 44.000000e0; + wgs84:time "2016-01-09T13:48:24.177Z"; +]; +gps:trackpoint [wgs84:lat 42.484538000e+00; wgs84:long -71.347194000e+00; + wgs84:altitude 45.000000e0; + wgs84:time "2016-01-09T13:48:27.167Z"; +]; +gps:trackpoint [wgs84:lat 42.484521000e+00; wgs84:long -71.347264000e+00; + wgs84:altitude 45.000000e0; + wgs84:time "2016-01-09T13:48:30.147Z"; +]; +gps:trackpoint [wgs84:lat 42.484498000e+00; wgs84:long -71.347317000e+00; + wgs84:altitude 45.000000e0; + wgs84:time "2016-01-09T13:48:32.164Z"; +]; +gps:trackpoint [wgs84:lat 42.484466000e+00; wgs84:long -71.347384000e+00; + wgs84:altitude 46.000000e0; + wgs84:time "2016-01-09T13:48:35.166Z"; +]; +gps:trackpoint [wgs84:lat 42.484485000e+00; wgs84:long -71.347445000e+00; + wgs84:altitude 48.000000e0; + wgs84:time "2016-01-09T13:48:41.161Z"; +]; +gps:trackpoint [wgs84:lat 42.484487000e+00; wgs84:long -71.347514000e+00; + wgs84:altitude 49.000000e0; + wgs84:time "2016-01-09T13:48:46.170Z"; +]; +gps:trackpoint [wgs84:lat 42.484468000e+00; wgs84:long -71.347578000e+00; + wgs84:altitude 50.000000e0; + wgs84:time "2016-01-09T13:48:51.169Z"; +]; +gps:trackpoint [wgs84:lat 42.484452000e+00; wgs84:long -71.347653000e+00; + wgs84:altitude 51.000000e0; + wgs84:time "2016-01-09T13:48:55.165Z"; +]; +gps:trackpoint [wgs84:lat 42.484464000e+00; wgs84:long -71.347721000e+00; + wgs84:altitude 52.000000e0; + wgs84:time "2016-01-09T13:48:59.159Z"; +]; +gps:trackpoint [wgs84:lat 42.484486000e+00; wgs84:long -71.347770000e+00; + wgs84:altitude 52.000000e0; + wgs84:time "2016-01-09T13:49:02.164Z"; +]; +gps:trackpoint [wgs84:lat 42.484488000e+00; wgs84:long -71.347841000e+00; + wgs84:altitude 52.000000e0; + wgs84:time "2016-01-09T13:49:05.163Z"; +]; +gps:trackpoint [wgs84:lat 42.484480000e+00; wgs84:long -71.347914000e+00; + wgs84:altitude 52.000000e0; + wgs84:time "2016-01-09T13:49:08.161Z"; +]; +gps:trackpoint [wgs84:lat 42.484477000e+00; wgs84:long -71.347977000e+00; + wgs84:altitude 52.000000e0; + wgs84:time "2016-01-09T13:49:11.171Z"; +]; +gps:trackpoint [wgs84:lat 42.484481000e+00; wgs84:long -71.348042000e+00; + wgs84:altitude 52.000000e0; + wgs84:time "2016-01-09T13:49:15.161Z"; +]; +gps:trackpoint [wgs84:lat 42.484489000e+00; wgs84:long -71.348107000e+00; + wgs84:altitude 54.000000e0; + wgs84:time "2016-01-09T13:49:21.145Z"; +]; +gps:trackpoint [wgs84:lat 42.484506000e+00; wgs84:long -71.348165000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:49:27.165Z"; +]; +gps:trackpoint [wgs84:lat 42.484525000e+00; wgs84:long -71.348227000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T13:49:32.160Z"; +]; +gps:trackpoint [wgs84:lat 42.484545000e+00; wgs84:long -71.348306000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T13:49:36.170Z"; +]; +gps:trackpoint [wgs84:lat 42.484555000e+00; wgs84:long -71.348373000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T13:49:40.158Z"; +]; +gps:trackpoint [wgs84:lat 42.484556000e+00; wgs84:long -71.348434000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T13:49:43.154Z"; +]; +gps:trackpoint [wgs84:lat 42.484581000e+00; wgs84:long -71.348495000e+00; + wgs84:altitude 57.000000e0; + wgs84:time "2016-01-09T13:49:48.158Z"; +]; +gps:trackpoint [wgs84:lat 42.484614000e+00; wgs84:long -71.348544000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:49:52.138Z"; +]; +gps:trackpoint [wgs84:lat 42.484607000e+00; wgs84:long -71.348607000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:49:57.148Z"; +]; +gps:trackpoint [wgs84:lat 42.484578000e+00; wgs84:long -71.348671000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:50:01.162Z"; +]; +gps:trackpoint [wgs84:lat 42.484541000e+00; wgs84:long -71.348736000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:50:04.164Z"; +]; +gps:trackpoint [wgs84:lat 42.484518000e+00; wgs84:long -71.348798000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:50:07.149Z"; +]; +gps:trackpoint [wgs84:lat 42.484492000e+00; wgs84:long -71.348862000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:50:10.163Z"; +]; +gps:trackpoint [wgs84:lat 42.484454000e+00; wgs84:long -71.348912000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:50:13.164Z"; +]; +gps:trackpoint [wgs84:lat 42.484405000e+00; wgs84:long -71.348942000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:50:17.174Z"; +]; +gps:trackpoint [wgs84:lat 42.484371000e+00; wgs84:long -71.348998000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:50:20.173Z"; +]; +gps:trackpoint [wgs84:lat 42.484312000e+00; wgs84:long -71.349039000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:50:24.166Z"; +]; +gps:trackpoint [wgs84:lat 42.484269000e+00; wgs84:long -71.349075000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:50:27.169Z"; +]; +gps:trackpoint [wgs84:lat 42.484238000e+00; wgs84:long -71.349119000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:50:30.156Z"; +]; +gps:trackpoint [wgs84:lat 42.484195000e+00; wgs84:long -71.349151000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:50:33.167Z"; +]; +gps:trackpoint [wgs84:lat 42.484155000e+00; wgs84:long -71.349186000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:50:37.164Z"; +]; +gps:trackpoint [wgs84:lat 42.484112000e+00; wgs84:long -71.349216000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:50:40.164Z"; +]; +gps:trackpoint [wgs84:lat 42.484067000e+00; wgs84:long -71.349259000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:50:44.168Z"; +]; +gps:trackpoint [wgs84:lat 42.484026000e+00; wgs84:long -71.349299000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:50:48.158Z"; +]; +gps:trackpoint [wgs84:lat 42.483993000e+00; wgs84:long -71.349356000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:50:52.165Z"; +]; +gps:trackpoint [wgs84:lat 42.483952000e+00; wgs84:long -71.349387000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:50:55.165Z"; +]; +gps:trackpoint [wgs84:lat 42.483898000e+00; wgs84:long -71.349404000e+00; + wgs84:altitude 63.000000e0; + wgs84:time "2016-01-09T13:50:58.178Z"; +]; +gps:trackpoint [wgs84:lat 42.483843000e+00; wgs84:long -71.349438000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:51:03.175Z"; +]; +gps:trackpoint [wgs84:lat 42.483796000e+00; wgs84:long -71.349492000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:51:06.151Z"; +]; +gps:trackpoint [wgs84:lat 42.483757000e+00; wgs84:long -71.349570000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:51:09.156Z"; +]; +gps:trackpoint [wgs84:lat 42.483735000e+00; wgs84:long -71.349644000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:51:12.165Z"; +]; +gps:trackpoint [wgs84:lat 42.483706000e+00; wgs84:long -71.349708000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:51:15.163Z"; +]; +gps:trackpoint [wgs84:lat 42.483685000e+00; wgs84:long -71.349770000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:51:18.135Z"; +]; +gps:trackpoint [wgs84:lat 42.483661000e+00; wgs84:long -71.349830000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:51:22.152Z"; +]; +gps:trackpoint [wgs84:lat 42.483652000e+00; wgs84:long -71.349902000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:51:25.140Z"; +]; +gps:trackpoint [wgs84:lat 42.483637000e+00; wgs84:long -71.349966000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:51:28.158Z"; +]; +gps:trackpoint [wgs84:lat 42.483639000e+00; wgs84:long -71.350040000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:51:31.138Z"; +]; +gps:trackpoint [wgs84:lat 42.483640000e+00; wgs84:long -71.350113000e+00; + wgs84:altitude 57.000000e0; + wgs84:time "2016-01-09T13:51:35.170Z"; +]; +gps:trackpoint [wgs84:lat 42.483634000e+00; wgs84:long -71.350181000e+00; + wgs84:altitude 57.000000e0; + wgs84:time "2016-01-09T13:51:38.169Z"; +]; +gps:trackpoint [wgs84:lat 42.483618000e+00; wgs84:long -71.350245000e+00; + wgs84:altitude 57.000000e0; + wgs84:time "2016-01-09T13:51:41.168Z"; +]; +gps:trackpoint [wgs84:lat 42.483634000e+00; wgs84:long -71.350303000e+00; + wgs84:altitude 57.000000e0; + wgs84:time "2016-01-09T13:51:44.169Z"; +]; +gps:trackpoint [wgs84:lat 42.483667000e+00; wgs84:long -71.350365000e+00; + wgs84:altitude 57.000000e0; + wgs84:time "2016-01-09T13:51:47.163Z"; +]; +gps:trackpoint [wgs84:lat 42.483719000e+00; wgs84:long -71.350398000e+00; + wgs84:altitude 57.000000e0; + wgs84:time "2016-01-09T13:51:50.167Z"; +]; +gps:trackpoint [wgs84:lat 42.483770000e+00; wgs84:long -71.350424000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:51:53.167Z"; +]; +gps:trackpoint [wgs84:lat 42.483821000e+00; wgs84:long -71.350477000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:51:56.173Z"; +]; +gps:trackpoint [wgs84:lat 42.483836000e+00; wgs84:long -71.350562000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:51:59.174Z"; +]; +gps:trackpoint [wgs84:lat 42.483824000e+00; wgs84:long -71.350644000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:52:03.169Z"; +]; +gps:trackpoint [wgs84:lat 42.483819000e+00; wgs84:long -71.350725000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:52:06.166Z"; +]; +gps:trackpoint [wgs84:lat 42.483820000e+00; wgs84:long -71.350791000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:52:10.166Z"; +]; +gps:trackpoint [wgs84:lat 42.483780000e+00; wgs84:long -71.350834000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:52:19.056Z"; +]; +gps:trackpoint [wgs84:lat 42.483732000e+00; wgs84:long -71.350842000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:52:23.085Z"; +]; +gps:trackpoint [wgs84:lat 42.483686000e+00; wgs84:long -71.350852000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:52:27.107Z"; +]; +gps:trackpoint [wgs84:lat 42.483624000e+00; wgs84:long -71.350857000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:52:31.112Z"; +]; +gps:trackpoint [wgs84:lat 42.483578000e+00; wgs84:long -71.350840000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:52:34.122Z"; +]; +gps:trackpoint [wgs84:lat 42.483523000e+00; wgs84:long -71.350823000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:52:39.115Z"; +]; +gps:trackpoint [wgs84:lat 42.483477000e+00; wgs84:long -71.350818000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:52:43.129Z"; +]; +gps:trackpoint [wgs84:lat 42.483424000e+00; wgs84:long -71.350833000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:52:47.118Z"; +]; +gps:trackpoint [wgs84:lat 42.483372000e+00; wgs84:long -71.350846000e+00; + wgs84:altitude 62.000000e0; + wgs84:time "2016-01-09T13:52:50.118Z"; +]; +gps:trackpoint [wgs84:lat 42.483325000e+00; wgs84:long -71.350865000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:52:53.122Z"; +]; +gps:trackpoint [wgs84:lat 42.483267000e+00; wgs84:long -71.350883000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:52:56.120Z"; +]; +gps:trackpoint [wgs84:lat 42.483222000e+00; wgs84:long -71.350893000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:52:58.120Z"; +]; +gps:trackpoint [wgs84:lat 42.483164000e+00; wgs84:long -71.350915000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:53:01.122Z"; +]; +gps:trackpoint [wgs84:lat 42.483113000e+00; wgs84:long -71.350934000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:53:04.126Z"; +]; +gps:trackpoint [wgs84:lat 42.483048000e+00; wgs84:long -71.350948000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:53:07.129Z"; +]; +gps:trackpoint [wgs84:lat 42.483000000e+00; wgs84:long -71.350945000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:53:09.130Z"; +]; +gps:trackpoint [wgs84:lat 42.482956000e+00; wgs84:long -71.350937000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:53:11.117Z"; +]; +gps:trackpoint [wgs84:lat 42.482899000e+00; wgs84:long -71.350920000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:53:14.121Z"; +]; +gps:trackpoint [wgs84:lat 42.482848000e+00; wgs84:long -71.350886000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:53:17.121Z"; +]; +gps:trackpoint [wgs84:lat 42.482809000e+00; wgs84:long -71.350845000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T13:53:20.123Z"; +]; +gps:trackpoint [wgs84:lat 42.482764000e+00; wgs84:long -71.350789000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:53:23.125Z"; +]; +gps:trackpoint [wgs84:lat 42.482730000e+00; wgs84:long -71.350749000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:53:25.124Z"; +]; +gps:trackpoint [wgs84:lat 42.482689000e+00; wgs84:long -71.350685000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:53:28.128Z"; +]; +gps:trackpoint [wgs84:lat 42.482639000e+00; wgs84:long -71.350659000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:53:31.126Z"; +]; +gps:trackpoint [wgs84:lat 42.482593000e+00; wgs84:long -71.350663000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:53:33.124Z"; +]; +gps:trackpoint [wgs84:lat 42.482554000e+00; wgs84:long -71.350697000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:53:35.121Z"; +]; +gps:trackpoint [wgs84:lat 42.482517000e+00; wgs84:long -71.350738000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:53:37.136Z"; +]; +gps:trackpoint [wgs84:lat 42.482462000e+00; wgs84:long -71.350792000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:53:40.132Z"; +]; +gps:trackpoint [wgs84:lat 42.482419000e+00; wgs84:long -71.350823000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:53:42.128Z"; +]; +gps:trackpoint [wgs84:lat 42.482378000e+00; wgs84:long -71.350845000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:53:44.146Z"; +]; +gps:trackpoint [wgs84:lat 42.482315000e+00; wgs84:long -71.350868000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:53:47.098Z"; +]; +gps:trackpoint [wgs84:lat 42.482275000e+00; wgs84:long -71.350931000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:53:50.126Z"; +]; +gps:trackpoint [wgs84:lat 42.482261000e+00; wgs84:long -71.350993000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:53:52.136Z"; +]; +gps:trackpoint [wgs84:lat 42.482251000e+00; wgs84:long -71.351053000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:53:54.112Z"; +]; +gps:trackpoint [wgs84:lat 42.482232000e+00; wgs84:long -71.351109000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T13:53:56.136Z"; +]; +gps:trackpoint [wgs84:lat 42.482192000e+00; wgs84:long -71.351172000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T13:53:59.119Z"; +]; +gps:trackpoint [wgs84:lat 42.482140000e+00; wgs84:long -71.351195000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T13:54:02.128Z"; +]; +gps:trackpoint [wgs84:lat 42.482085000e+00; wgs84:long -71.351190000e+00; + wgs84:altitude 57.000000e0; + wgs84:time "2016-01-09T13:54:06.121Z"; +]; +gps:trackpoint [wgs84:lat 42.482033000e+00; wgs84:long -71.351183000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T13:54:09.124Z"; +]; +gps:trackpoint [wgs84:lat 42.481983000e+00; wgs84:long -71.351186000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T13:54:12.132Z"; +]; +gps:trackpoint [wgs84:lat 42.481926000e+00; wgs84:long -71.351193000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T13:54:15.120Z"; +]; +gps:trackpoint [wgs84:lat 42.481872000e+00; wgs84:long -71.351217000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:54:18.120Z"; +]; +gps:trackpoint [wgs84:lat 42.481820000e+00; wgs84:long -71.351244000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:54:21.116Z"; +]; +gps:trackpoint [wgs84:lat 42.481777000e+00; wgs84:long -71.351290000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:54:24.119Z"; +]; +gps:trackpoint [wgs84:lat 42.481724000e+00; wgs84:long -71.351338000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:54:27.182Z"; +]; +gps:trackpoint [wgs84:lat 42.481668000e+00; wgs84:long -71.351384000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:54:30.127Z"; +]; +gps:trackpoint [wgs84:lat 42.481604000e+00; wgs84:long -71.351404000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:54:33.128Z"; +]; +gps:trackpoint [wgs84:lat 42.481556000e+00; wgs84:long -71.351404000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:54:36.126Z"; +]; +gps:trackpoint [wgs84:lat 42.481509000e+00; wgs84:long -71.351372000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:54:39.146Z"; +]; +gps:trackpoint [wgs84:lat 42.481473000e+00; wgs84:long -71.351317000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:54:42.130Z"; +]; +gps:trackpoint [wgs84:lat 42.481434000e+00; wgs84:long -71.351256000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:54:45.124Z"; +]; +gps:trackpoint [wgs84:lat 42.481378000e+00; wgs84:long -71.351235000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:54:48.113Z"; +]; +gps:trackpoint [wgs84:lat 42.481328000e+00; wgs84:long -71.351192000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:54:51.124Z"; +]; +gps:trackpoint [wgs84:lat 42.481275000e+00; wgs84:long -71.351159000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:54:54.132Z"; +]; +gps:trackpoint [wgs84:lat 42.481218000e+00; wgs84:long -71.351134000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:54:57.127Z"; +]; +gps:trackpoint [wgs84:lat 42.481165000e+00; wgs84:long -71.351101000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:55:00.125Z"; +]; +gps:trackpoint [wgs84:lat 42.481120000e+00; wgs84:long -71.351080000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:55:03.127Z"; +]; +gps:trackpoint [wgs84:lat 42.481065000e+00; wgs84:long -71.351111000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:55:07.143Z"; +]; +gps:trackpoint [wgs84:lat 42.481013000e+00; wgs84:long -71.351157000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:55:10.126Z"; +]; +gps:trackpoint [wgs84:lat 42.480983000e+00; wgs84:long -71.351230000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:55:13.130Z"; +]; +gps:trackpoint [wgs84:lat 42.480958000e+00; wgs84:long -71.351303000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:55:16.136Z"; +]; +gps:trackpoint [wgs84:lat 42.480938000e+00; wgs84:long -71.351385000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:55:19.125Z"; +]; +gps:trackpoint [wgs84:lat 42.480910000e+00; wgs84:long -71.351461000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T13:55:22.133Z"; +]; +gps:trackpoint [wgs84:lat 42.480883000e+00; wgs84:long -71.351542000e+00; + wgs84:altitude 54.000000e0; + wgs84:time "2016-01-09T13:55:25.128Z"; +]; +gps:trackpoint [wgs84:lat 42.480859000e+00; wgs84:long -71.351594000e+00; + wgs84:altitude 54.000000e0; + wgs84:time "2016-01-09T13:55:27.137Z"; +]; +gps:trackpoint [wgs84:lat 42.480828000e+00; wgs84:long -71.351661000e+00; + wgs84:altitude 53.000000e0; + wgs84:time "2016-01-09T13:55:30.111Z"; +]; +gps:trackpoint [wgs84:lat 42.480791000e+00; wgs84:long -71.351719000e+00; + wgs84:altitude 53.000000e0; + wgs84:time "2016-01-09T13:55:33.126Z"; +]; +gps:trackpoint [wgs84:lat 42.480743000e+00; wgs84:long -71.351769000e+00; + wgs84:altitude 53.000000e0; + wgs84:time "2016-01-09T13:55:36.116Z"; +]; +gps:trackpoint [wgs84:lat 42.480704000e+00; wgs84:long -71.351833000e+00; + wgs84:altitude 53.000000e0; + wgs84:time "2016-01-09T13:55:39.107Z"; +]; +gps:trackpoint [wgs84:lat 42.480686000e+00; wgs84:long -71.351902000e+00; + wgs84:altitude 53.000000e0; + wgs84:time "2016-01-09T13:55:42.116Z"; +]; +gps:trackpoint [wgs84:lat 42.480664000e+00; wgs84:long -71.351975000e+00; + wgs84:altitude 52.000000e0; + wgs84:time "2016-01-09T13:55:45.130Z"; +]; +gps:trackpoint [wgs84:lat 42.480631000e+00; wgs84:long -71.352036000e+00; + wgs84:altitude 51.000000e0; + wgs84:time "2016-01-09T13:55:48.124Z"; +]; +gps:trackpoint [wgs84:lat 42.480602000e+00; wgs84:long -71.352091000e+00; + wgs84:altitude 51.000000e0; + wgs84:time "2016-01-09T13:55:51.124Z"; +]; +gps:trackpoint [wgs84:lat 42.480571000e+00; wgs84:long -71.352153000e+00; + wgs84:altitude 51.000000e0; + wgs84:time "2016-01-09T13:55:55.127Z"; +]; +gps:trackpoint [wgs84:lat 42.480545000e+00; wgs84:long -71.352215000e+00; + wgs84:altitude 50.000000e0; + wgs84:time "2016-01-09T13:55:58.100Z"; +]; +gps:trackpoint [wgs84:lat 42.480519000e+00; wgs84:long -71.352279000e+00; + wgs84:altitude 50.000000e0; + wgs84:time "2016-01-09T13:56:00.116Z"; +]; +gps:trackpoint [wgs84:lat 42.480489000e+00; wgs84:long -71.352329000e+00; + wgs84:altitude 50.000000e0; + wgs84:time "2016-01-09T13:56:02.128Z"; +]; +gps:trackpoint [wgs84:lat 42.480439000e+00; wgs84:long -71.352378000e+00; + wgs84:altitude 49.000000e0; + wgs84:time "2016-01-09T13:56:05.132Z"; +]; +gps:trackpoint [wgs84:lat 42.480395000e+00; wgs84:long -71.352442000e+00; + wgs84:altitude 48.000000e0; + wgs84:time "2016-01-09T13:56:08.131Z"; +]; +gps:trackpoint [wgs84:lat 42.480344000e+00; wgs84:long -71.352493000e+00; + wgs84:altitude 48.000000e0; + wgs84:time "2016-01-09T13:56:11.124Z"; +]; +gps:trackpoint [wgs84:lat 42.480283000e+00; wgs84:long -71.352545000e+00; + wgs84:altitude 47.000000e0; + wgs84:time "2016-01-09T13:56:14.124Z"; +]; +gps:trackpoint [wgs84:lat 42.480233000e+00; wgs84:long -71.352597000e+00; + wgs84:altitude 47.000000e0; + wgs84:time "2016-01-09T13:56:17.137Z"; +]; +gps:trackpoint [wgs84:lat 42.480184000e+00; wgs84:long -71.352649000e+00; + wgs84:altitude 47.000000e0; + wgs84:time "2016-01-09T13:56:20.123Z"; +]; +gps:trackpoint [wgs84:lat 42.480132000e+00; wgs84:long -71.352695000e+00; + wgs84:altitude 47.000000e0; + wgs84:time "2016-01-09T13:56:23.104Z"; +]; +gps:trackpoint [wgs84:lat 42.480097000e+00; wgs84:long -71.352731000e+00; + wgs84:altitude 47.000000e0; + wgs84:time "2016-01-09T13:56:25.108Z"; +]; +gps:trackpoint [wgs84:lat 42.480066000e+00; wgs84:long -71.352778000e+00; + wgs84:altitude 47.000000e0; + wgs84:time "2016-01-09T13:56:27.387Z"; +]; +gps:trackpoint [wgs84:lat 42.480024000e+00; wgs84:long -71.352835000e+00; + wgs84:altitude 47.000000e0; + wgs84:time "2016-01-09T13:56:30.124Z"; +]; +gps:trackpoint [wgs84:lat 42.479989000e+00; wgs84:long -71.352896000e+00; + wgs84:altitude 47.000000e0; + wgs84:time "2016-01-09T13:56:33.125Z"; +]; +gps:trackpoint [wgs84:lat 42.479951000e+00; wgs84:long -71.352950000e+00; + wgs84:altitude 48.000000e0; + wgs84:time "2016-01-09T13:56:36.137Z"; +]; +gps:trackpoint [wgs84:lat 42.479913000e+00; wgs84:long -71.353009000e+00; + wgs84:altitude 48.000000e0; + wgs84:time "2016-01-09T13:56:39.133Z"; +]; +gps:trackpoint [wgs84:lat 42.479872000e+00; wgs84:long -71.353049000e+00; + wgs84:altitude 47.000000e0; + wgs84:time "2016-01-09T13:56:42.130Z"; +]; +gps:trackpoint [wgs84:lat 42.479842000e+00; wgs84:long -71.353096000e+00; + wgs84:altitude 47.000000e0; + wgs84:time "2016-01-09T13:56:45.129Z"; +]; +gps:trackpoint [wgs84:lat 42.479804000e+00; wgs84:long -71.353152000e+00; + wgs84:altitude 47.000000e0; + wgs84:time "2016-01-09T13:56:48.126Z"; +]; +gps:trackpoint [wgs84:lat 42.479764000e+00; wgs84:long -71.353212000e+00; + wgs84:altitude 47.000000e0; + wgs84:time "2016-01-09T13:56:51.126Z"; +]; +gps:trackpoint [wgs84:lat 42.479720000e+00; wgs84:long -71.353268000e+00; + wgs84:altitude 46.000000e0; + wgs84:time "2016-01-09T13:56:54.132Z"; +]; +gps:trackpoint [wgs84:lat 42.479678000e+00; wgs84:long -71.353318000e+00; + wgs84:altitude 46.000000e0; + wgs84:time "2016-01-09T13:56:57.128Z"; +]; +gps:trackpoint [wgs84:lat 42.479622000e+00; wgs84:long -71.353330000e+00; + wgs84:altitude 46.000000e0; + wgs84:time "2016-01-09T13:57:00.131Z"; +]; +gps:trackpoint [wgs84:lat 42.479572000e+00; wgs84:long -71.353365000e+00; + wgs84:altitude 46.000000e0; + wgs84:time "2016-01-09T13:57:03.127Z"; +]; +gps:trackpoint [wgs84:lat 42.479530000e+00; wgs84:long -71.353418000e+00; + wgs84:altitude 46.000000e0; + wgs84:time "2016-01-09T13:57:06.135Z"; +]; +gps:trackpoint [wgs84:lat 42.479484000e+00; wgs84:long -71.353470000e+00; + wgs84:altitude 45.000000e0; + wgs84:time "2016-01-09T13:57:09.134Z"; +]; +gps:trackpoint [wgs84:lat 42.479446000e+00; wgs84:long -71.353507000e+00; + wgs84:altitude 45.000000e0; + wgs84:time "2016-01-09T13:57:11.134Z"; +]; +gps:trackpoint [wgs84:lat 42.479402000e+00; wgs84:long -71.353556000e+00; + wgs84:altitude 45.000000e0; + wgs84:time "2016-01-09T13:57:14.125Z"; +]; +gps:trackpoint [wgs84:lat 42.479343000e+00; wgs84:long -71.353581000e+00; + wgs84:altitude 45.000000e0; + wgs84:time "2016-01-09T13:57:17.134Z"; +]; +gps:trackpoint [wgs84:lat 42.479297000e+00; wgs84:long -71.353607000e+00; + wgs84:altitude 44.000000e0; + wgs84:time "2016-01-09T13:57:20.127Z"; +]; +gps:trackpoint [wgs84:lat 42.479259000e+00; wgs84:long -71.353642000e+00; + wgs84:altitude 45.000000e0; + wgs84:time "2016-01-09T13:57:23.129Z"; +]; +gps:trackpoint [wgs84:lat 42.479219000e+00; wgs84:long -71.353667000e+00; + wgs84:altitude 45.000000e0; + wgs84:time "2016-01-09T13:57:25.143Z"; +]; +gps:trackpoint [wgs84:lat 42.479166000e+00; wgs84:long -71.353719000e+00; + wgs84:altitude 44.000000e0; + wgs84:time "2016-01-09T13:57:28.131Z"; +]; +gps:trackpoint [wgs84:lat 42.479110000e+00; wgs84:long -71.353769000e+00; + wgs84:altitude 44.000000e0; + wgs84:time "2016-01-09T13:57:31.136Z"; +]; +gps:trackpoint [wgs84:lat 42.479062000e+00; wgs84:long -71.353800000e+00; + wgs84:altitude 44.000000e0; + wgs84:time "2016-01-09T13:57:34.147Z"; +]; +gps:trackpoint [wgs84:lat 42.479008000e+00; wgs84:long -71.353828000e+00; + wgs84:altitude 44.000000e0; + wgs84:time "2016-01-09T13:57:37.129Z"; +]; +gps:trackpoint [wgs84:lat 42.478952000e+00; wgs84:long -71.353872000e+00; + wgs84:altitude 44.000000e0; + wgs84:time "2016-01-09T13:57:40.133Z"; +]; +gps:trackpoint [wgs84:lat 42.478910000e+00; wgs84:long -71.353907000e+00; + wgs84:altitude 44.000000e0; + wgs84:time "2016-01-09T13:57:42.135Z"; +]; +gps:trackpoint [wgs84:lat 42.478855000e+00; wgs84:long -71.353945000e+00; + wgs84:altitude 44.000000e0; + wgs84:time "2016-01-09T13:57:45.131Z"; +]; +gps:trackpoint [wgs84:lat 42.478813000e+00; wgs84:long -71.353978000e+00; + wgs84:altitude 44.000000e0; + wgs84:time "2016-01-09T13:57:47.143Z"; +]; +gps:trackpoint [wgs84:lat 42.478765000e+00; wgs84:long -71.354018000e+00; + wgs84:altitude 44.000000e0; + wgs84:time "2016-01-09T13:57:50.125Z"; +]; +gps:trackpoint [wgs84:lat 42.478721000e+00; wgs84:long -71.354063000e+00; + wgs84:altitude 44.000000e0; + wgs84:time "2016-01-09T13:57:53.129Z"; +]; +gps:trackpoint [wgs84:lat 42.478684000e+00; wgs84:long -71.354100000e+00; + wgs84:altitude 44.000000e0; + wgs84:time "2016-01-09T13:57:56.179Z"; +]; +gps:trackpoint [wgs84:lat 42.478643000e+00; wgs84:long -71.354161000e+00; + wgs84:altitude 44.000000e0; + wgs84:time "2016-01-09T13:57:59.133Z"; +]; +gps:trackpoint [wgs84:lat 42.478604000e+00; wgs84:long -71.354218000e+00; + wgs84:altitude 44.000000e0; + wgs84:time "2016-01-09T13:58:02.115Z"; +]; +gps:trackpoint [wgs84:lat 42.478573000e+00; wgs84:long -71.354290000e+00; + wgs84:altitude 44.000000e0; + wgs84:time "2016-01-09T13:58:06.122Z"; +]; +gps:trackpoint [wgs84:lat 42.478584000e+00; wgs84:long -71.354383000e+00; + wgs84:altitude 43.000000e0; + wgs84:time "2016-01-09T13:58:09.120Z"; +]; +gps:trackpoint [wgs84:lat 42.478575000e+00; wgs84:long -71.354471000e+00; + wgs84:altitude 43.000000e0; + wgs84:time "2016-01-09T13:58:12.132Z"; +]; +gps:trackpoint [wgs84:lat 42.478594000e+00; wgs84:long -71.354530000e+00; + wgs84:altitude 44.000000e0; + wgs84:time "2016-01-09T13:58:15.126Z"; +]; +gps:trackpoint [wgs84:lat 42.478605000e+00; wgs84:long -71.354593000e+00; + wgs84:altitude 44.000000e0; + wgs84:time "2016-01-09T13:58:18.133Z"; +]; +gps:trackpoint [wgs84:lat 42.478613000e+00; wgs84:long -71.354668000e+00; + wgs84:altitude 44.000000e0; + wgs84:time "2016-01-09T13:58:21.133Z"; +]; +gps:trackpoint [wgs84:lat 42.478646000e+00; wgs84:long -71.354727000e+00; + wgs84:altitude 45.000000e0; + wgs84:time "2016-01-09T13:58:24.133Z"; +]; +gps:trackpoint [wgs84:lat 42.478694000e+00; wgs84:long -71.354773000e+00; + wgs84:altitude 45.000000e0; + wgs84:time "2016-01-09T13:58:27.157Z"; +]; +gps:trackpoint [wgs84:lat 42.478738000e+00; wgs84:long -71.354795000e+00; + wgs84:altitude 45.000000e0; + wgs84:time "2016-01-09T13:58:29.134Z"; +]; +gps:trackpoint [wgs84:lat 42.478798000e+00; wgs84:long -71.354822000e+00; + wgs84:altitude 46.000000e0; + wgs84:time "2016-01-09T13:58:32.126Z"; +]; +gps:trackpoint [wgs84:lat 42.478851000e+00; wgs84:long -71.354851000e+00; + wgs84:altitude 46.000000e0; + wgs84:time "2016-01-09T13:58:35.129Z"; +]; +gps:trackpoint [wgs84:lat 42.478894000e+00; wgs84:long -71.354897000e+00; + wgs84:altitude 46.000000e0; + wgs84:time "2016-01-09T13:58:38.141Z"; +]; +gps:trackpoint [wgs84:lat 42.478942000e+00; wgs84:long -71.354950000e+00; + wgs84:altitude 46.000000e0; + wgs84:time "2016-01-09T13:58:41.125Z"; +]; +gps:trackpoint [wgs84:lat 42.478989000e+00; wgs84:long -71.355014000e+00; + wgs84:altitude 46.000000e0; + wgs84:time "2016-01-09T13:58:44.179Z"; +]; +gps:trackpoint [wgs84:lat 42.479020000e+00; wgs84:long -71.355061000e+00; + wgs84:altitude 46.000000e0; + wgs84:time "2016-01-09T13:58:46.123Z"; +]; +gps:trackpoint [wgs84:lat 42.479053000e+00; wgs84:long -71.355109000e+00; + wgs84:altitude 46.000000e0; + wgs84:time "2016-01-09T13:58:48.137Z"; +]; +gps:trackpoint [wgs84:lat 42.479091000e+00; wgs84:long -71.355175000e+00; + wgs84:altitude 46.000000e0; + wgs84:time "2016-01-09T13:58:51.141Z"; +]; +gps:trackpoint [wgs84:lat 42.479114000e+00; wgs84:long -71.355245000e+00; + wgs84:altitude 46.000000e0; + wgs84:time "2016-01-09T13:58:54.125Z"; +]; +gps:trackpoint [wgs84:lat 42.479125000e+00; wgs84:long -71.355310000e+00; + wgs84:altitude 46.000000e0; + wgs84:time "2016-01-09T13:58:57.139Z"; +]; +gps:trackpoint [wgs84:lat 42.479129000e+00; wgs84:long -71.355372000e+00; + wgs84:altitude 46.000000e0; + wgs84:time "2016-01-09T13:58:59.107Z"; +]; +gps:trackpoint [wgs84:lat 42.479123000e+00; wgs84:long -71.355440000e+00; + wgs84:altitude 46.000000e0; + wgs84:time "2016-01-09T13:59:02.137Z"; +]; +gps:trackpoint [wgs84:lat 42.479117000e+00; wgs84:long -71.355517000e+00; + wgs84:altitude 46.000000e0; + wgs84:time "2016-01-09T13:59:06.137Z"; +]; +gps:trackpoint [wgs84:lat 42.479152000e+00; wgs84:long -71.355588000e+00; + wgs84:altitude 46.000000e0; + wgs84:time "2016-01-09T13:59:09.135Z"; +]; +gps:trackpoint [wgs84:lat 42.479194000e+00; wgs84:long -71.355644000e+00; + wgs84:altitude 47.000000e0; + wgs84:time "2016-01-09T13:59:12.139Z"; +]; +gps:trackpoint [wgs84:lat 42.479215000e+00; wgs84:long -71.355724000e+00; + wgs84:altitude 47.000000e0; + wgs84:time "2016-01-09T13:59:15.137Z"; +]; +gps:trackpoint [wgs84:lat 42.479244000e+00; wgs84:long -71.355785000e+00; + wgs84:altitude 47.000000e0; + wgs84:time "2016-01-09T13:59:18.129Z"; +]; +gps:trackpoint [wgs84:lat 42.479292000e+00; wgs84:long -71.355836000e+00; + wgs84:altitude 47.000000e0; + wgs84:time "2016-01-09T13:59:21.128Z"; +]; +gps:trackpoint [wgs84:lat 42.479330000e+00; wgs84:long -71.355871000e+00; + wgs84:altitude 47.000000e0; + wgs84:time "2016-01-09T13:59:23.159Z"; +]; +gps:trackpoint [wgs84:lat 42.479370000e+00; wgs84:long -71.355898000e+00; + wgs84:altitude 47.000000e0; + wgs84:time "2016-01-09T13:59:25.135Z"; +]; +gps:trackpoint [wgs84:lat 42.479417000e+00; wgs84:long -71.355912000e+00; + wgs84:altitude 47.000000e0; + wgs84:time "2016-01-09T13:59:27.128Z"; +]; +gps:trackpoint [wgs84:lat 42.479464000e+00; wgs84:long -71.355925000e+00; + wgs84:altitude 47.000000e0; + wgs84:time "2016-01-09T13:59:29.130Z"; +]; +gps:trackpoint [wgs84:lat 42.479510000e+00; wgs84:long -71.355940000e+00; + wgs84:altitude 47.000000e0; + wgs84:time "2016-01-09T13:59:31.136Z"; +]; +gps:trackpoint [wgs84:lat 42.479550000e+00; wgs84:long -71.356002000e+00; + wgs84:altitude 47.000000e0; + wgs84:time "2016-01-09T13:59:34.132Z"; +]; +gps:trackpoint [wgs84:lat 42.479550000e+00; wgs84:long -71.356086000e+00; + wgs84:altitude 48.000000e0; + wgs84:time "2016-01-09T13:59:37.132Z"; +]; +gps:trackpoint [wgs84:lat 42.479577000e+00; wgs84:long -71.356145000e+00; + wgs84:altitude 48.000000e0; + wgs84:time "2016-01-09T13:59:40.130Z"; +]; +gps:trackpoint [wgs84:lat 42.479600000e+00; wgs84:long -71.356198000e+00; + wgs84:altitude 48.000000e0; + wgs84:time "2016-01-09T13:59:43.135Z"; +]; +gps:trackpoint [wgs84:lat 42.479621000e+00; wgs84:long -71.356276000e+00; + wgs84:altitude 48.000000e0; + wgs84:time "2016-01-09T13:59:46.141Z"; +]; +gps:trackpoint [wgs84:lat 42.479644000e+00; wgs84:long -71.356333000e+00; + wgs84:altitude 49.000000e0; + wgs84:time "2016-01-09T13:59:49.131Z"; +]; +gps:trackpoint [wgs84:lat 42.479664000e+00; wgs84:long -71.356401000e+00; + wgs84:altitude 49.000000e0; + wgs84:time "2016-01-09T13:59:52.131Z"; +]; +gps:trackpoint [wgs84:lat 42.479678000e+00; wgs84:long -71.356466000e+00; + wgs84:altitude 50.000000e0; + wgs84:time "2016-01-09T13:59:54.135Z"; +]; +gps:trackpoint [wgs84:lat 42.479677000e+00; wgs84:long -71.356538000e+00; + wgs84:altitude 50.000000e0; + wgs84:time "2016-01-09T13:59:56.173Z"; +]; +gps:trackpoint [wgs84:lat 42.479679000e+00; wgs84:long -71.356608000e+00; + wgs84:altitude 50.000000e0; + wgs84:time "2016-01-09T13:59:58.125Z"; +]; +gps:trackpoint [wgs84:lat 42.479685000e+00; wgs84:long -71.356679000e+00; + wgs84:altitude 50.000000e0; + wgs84:time "2016-01-09T14:00:00.118Z"; +]; +gps:trackpoint [wgs84:lat 42.479697000e+00; wgs84:long -71.356740000e+00; + wgs84:altitude 50.000000e0; + wgs84:time "2016-01-09T14:00:02.138Z"; +]; +gps:trackpoint [wgs84:lat 42.479725000e+00; wgs84:long -71.356819000e+00; + wgs84:altitude 50.000000e0; + wgs84:time "2016-01-09T14:00:05.134Z"; +]; +gps:trackpoint [wgs84:lat 42.479772000e+00; wgs84:long -71.356873000e+00; + wgs84:altitude 50.000000e0; + wgs84:time "2016-01-09T14:00:08.117Z"; +]; +gps:trackpoint [wgs84:lat 42.479824000e+00; wgs84:long -71.356897000e+00; + wgs84:altitude 50.000000e0; + wgs84:time "2016-01-09T14:00:10.127Z"; +]; +gps:trackpoint [wgs84:lat 42.479879000e+00; wgs84:long -71.356912000e+00; + wgs84:altitude 50.000000e0; + wgs84:time "2016-01-09T14:00:12.132Z"; +]; +gps:trackpoint [wgs84:lat 42.479937000e+00; wgs84:long -71.356913000e+00; + wgs84:altitude 51.000000e0; + wgs84:time "2016-01-09T14:00:14.135Z"; +]; +gps:trackpoint [wgs84:lat 42.479999000e+00; wgs84:long -71.356937000e+00; + wgs84:altitude 50.000000e0; + wgs84:time "2016-01-09T14:00:17.128Z"; +]; +gps:trackpoint [wgs84:lat 42.480045000e+00; wgs84:long -71.356980000e+00; + wgs84:altitude 51.000000e0; + wgs84:time "2016-01-09T14:00:20.133Z"; +]; +gps:trackpoint [wgs84:lat 42.480099000e+00; wgs84:long -71.356989000e+00; + wgs84:altitude 51.000000e0; + wgs84:time "2016-01-09T14:00:23.132Z"; +]; +gps:trackpoint [wgs84:lat 42.480146000e+00; wgs84:long -71.356987000e+00; + wgs84:altitude 51.000000e0; + wgs84:time "2016-01-09T14:00:25.136Z"; +]; +gps:trackpoint [wgs84:lat 42.480190000e+00; wgs84:long -71.356996000e+00; + wgs84:altitude 51.000000e0; + wgs84:time "2016-01-09T14:00:27.134Z"; +]; +gps:trackpoint [wgs84:lat 42.480253000e+00; wgs84:long -71.357020000e+00; + wgs84:altitude 52.000000e0; + wgs84:time "2016-01-09T14:00:30.127Z"; +]; +gps:trackpoint [wgs84:lat 42.480311000e+00; wgs84:long -71.357070000e+00; + wgs84:altitude 53.000000e0; + wgs84:time "2016-01-09T14:00:33.133Z"; +]; +gps:trackpoint [wgs84:lat 42.480352000e+00; wgs84:long -71.357142000e+00; + wgs84:altitude 53.000000e0; + wgs84:time "2016-01-09T14:00:36.141Z"; +]; +gps:trackpoint [wgs84:lat 42.480395000e+00; wgs84:long -71.357160000e+00; + wgs84:altitude 53.000000e0; + wgs84:time "2016-01-09T14:00:39.133Z"; +]; +gps:trackpoint [wgs84:lat 42.480442000e+00; wgs84:long -71.357160000e+00; + wgs84:altitude 54.000000e0; + wgs84:time "2016-01-09T14:00:41.132Z"; +]; +gps:trackpoint [wgs84:lat 42.480511000e+00; wgs84:long -71.357168000e+00; + wgs84:altitude 54.000000e0; + wgs84:time "2016-01-09T14:00:44.132Z"; +]; +gps:trackpoint [wgs84:lat 42.480552000e+00; wgs84:long -71.357195000e+00; + wgs84:altitude 54.000000e0; + wgs84:time "2016-01-09T14:00:46.133Z"; +]; +gps:trackpoint [wgs84:lat 42.480609000e+00; wgs84:long -71.357205000e+00; + wgs84:altitude 54.000000e0; + wgs84:time "2016-01-09T14:00:52.132Z"; +]; +gps:trackpoint [wgs84:lat 42.480667000e+00; wgs84:long -71.357235000e+00; + wgs84:altitude 54.000000e0; + wgs84:time "2016-01-09T14:00:55.136Z"; +]; +gps:trackpoint [wgs84:lat 42.480714000e+00; wgs84:long -71.357261000e+00; + wgs84:altitude 54.000000e0; + wgs84:time "2016-01-09T14:00:57.133Z"; +]; +gps:trackpoint [wgs84:lat 42.480776000e+00; wgs84:long -71.357301000e+00; + wgs84:altitude 54.000000e0; + wgs84:time "2016-01-09T14:01:00.142Z"; +]; +gps:trackpoint [wgs84:lat 42.480830000e+00; wgs84:long -71.357336000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T14:01:03.131Z"; +]; +gps:trackpoint [wgs84:lat 42.480887000e+00; wgs84:long -71.357373000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T14:01:06.132Z"; +]; +gps:trackpoint [wgs84:lat 42.480941000e+00; wgs84:long -71.357396000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T14:01:08.135Z"; +]; +gps:trackpoint [wgs84:lat 42.481009000e+00; wgs84:long -71.357396000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:01:11.137Z"; +]; +gps:trackpoint [wgs84:lat 42.481069000e+00; wgs84:long -71.357371000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:01:14.144Z"; +]; +gps:trackpoint [wgs84:lat 42.481114000e+00; wgs84:long -71.357386000e+00; + wgs84:altitude 57.000000e0; + wgs84:time "2016-01-09T14:01:18.138Z"; +]; +gps:trackpoint [wgs84:lat 42.481150000e+00; wgs84:long -71.357348000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T14:01:21.136Z"; +]; +gps:trackpoint [wgs84:lat 42.481211000e+00; wgs84:long -71.357306000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T14:01:24.141Z"; +]; +gps:trackpoint [wgs84:lat 42.481254000e+00; wgs84:long -71.357281000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T14:01:26.139Z"; +]; +gps:trackpoint [wgs84:lat 42.481300000e+00; wgs84:long -71.357275000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T14:01:28.135Z"; +]; +gps:trackpoint [wgs84:lat 42.481360000e+00; wgs84:long -71.357296000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T14:01:31.133Z"; +]; +gps:trackpoint [wgs84:lat 42.481427000e+00; wgs84:long -71.357310000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T14:01:34.131Z"; +]; +gps:trackpoint [wgs84:lat 42.481472000e+00; wgs84:long -71.357308000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T14:01:36.133Z"; +]; +gps:trackpoint [wgs84:lat 42.481522000e+00; wgs84:long -71.357305000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T14:01:39.133Z"; +]; +gps:trackpoint [wgs84:lat 42.481569000e+00; wgs84:long -71.357308000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T14:01:42.139Z"; +]; +gps:trackpoint [wgs84:lat 42.481623000e+00; wgs84:long -71.357299000e+00; + wgs84:altitude 60.000000e0; + wgs84:time "2016-01-09T14:01:45.176Z"; +]; +gps:trackpoint [wgs84:lat 42.481682000e+00; wgs84:long -71.357269000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T14:01:48.115Z"; +]; +gps:trackpoint [wgs84:lat 42.481723000e+00; wgs84:long -71.357238000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T14:01:52.142Z"; +]; +gps:trackpoint [wgs84:lat 42.481686000e+00; wgs84:long -71.357307000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T14:01:57.107Z"; +]; +gps:trackpoint [wgs84:lat 42.481654000e+00; wgs84:long -71.357366000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T14:02:00.133Z"; +]; +gps:trackpoint [wgs84:lat 42.481620000e+00; wgs84:long -71.357434000e+00; + wgs84:altitude 61.000000e0; + wgs84:time "2016-01-09T14:02:03.155Z"; +]; +gps:trackpoint [wgs84:lat 42.481583000e+00; wgs84:long -71.357504000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T14:02:06.131Z"; +]; +gps:trackpoint [wgs84:lat 42.481539000e+00; wgs84:long -71.357573000e+00; + wgs84:altitude 59.000000e0; + wgs84:time "2016-01-09T14:02:09.132Z"; +]; +gps:trackpoint [wgs84:lat 42.481508000e+00; wgs84:long -71.357627000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T14:02:11.142Z"; +]; +gps:trackpoint [wgs84:lat 42.481479000e+00; wgs84:long -71.357680000e+00; + wgs84:altitude 58.000000e0; + wgs84:time "2016-01-09T14:02:13.133Z"; +]; +gps:trackpoint [wgs84:lat 42.481453000e+00; wgs84:long -71.357739000e+00; + wgs84:altitude 57.000000e0; + wgs84:time "2016-01-09T14:02:15.121Z"; +]; +gps:trackpoint [wgs84:lat 42.481427000e+00; wgs84:long -71.357803000e+00; + wgs84:altitude 57.000000e0; + wgs84:time "2016-01-09T14:02:17.136Z"; +]; +gps:trackpoint [wgs84:lat 42.481380000e+00; wgs84:long -71.357861000e+00; + wgs84:altitude 57.000000e0; + wgs84:time "2016-01-09T14:02:20.138Z"; +]; +gps:trackpoint [wgs84:lat 42.481323000e+00; wgs84:long -71.357919000e+00; + wgs84:altitude 57.000000e0; + wgs84:time "2016-01-09T14:02:23.136Z"; +]; +gps:trackpoint [wgs84:lat 42.481292000e+00; wgs84:long -71.357968000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:02:25.149Z"; +]; +gps:trackpoint [wgs84:lat 42.481254000e+00; wgs84:long -71.358035000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:02:28.142Z"; +]; +gps:trackpoint [wgs84:lat 42.481224000e+00; wgs84:long -71.358081000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:02:30.136Z"; +]; +gps:trackpoint [wgs84:lat 42.481202000e+00; wgs84:long -71.358128000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:02:32.138Z"; +]; +gps:trackpoint [wgs84:lat 42.481170000e+00; wgs84:long -71.358198000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:02:35.163Z"; +]; +gps:trackpoint [wgs84:lat 42.481137000e+00; wgs84:long -71.358277000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:02:38.128Z"; +]; +gps:trackpoint [wgs84:lat 42.481107000e+00; wgs84:long -71.358323000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:02:40.143Z"; +]; +gps:trackpoint [wgs84:lat 42.481068000e+00; wgs84:long -71.358387000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:02:43.137Z"; +]; +gps:trackpoint [wgs84:lat 42.481045000e+00; wgs84:long -71.358434000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:02:45.139Z"; +]; +gps:trackpoint [wgs84:lat 42.481002000e+00; wgs84:long -71.358505000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:02:48.122Z"; +]; +gps:trackpoint [wgs84:lat 42.480962000e+00; wgs84:long -71.358569000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:02:51.132Z"; +]; +gps:trackpoint [wgs84:lat 42.480908000e+00; wgs84:long -71.358623000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:02:54.134Z"; +]; +gps:trackpoint [wgs84:lat 42.480863000e+00; wgs84:long -71.358660000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:02:56.124Z"; +]; +gps:trackpoint [wgs84:lat 42.480826000e+00; wgs84:long -71.358702000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:02:59.139Z"; +]; +gps:trackpoint [wgs84:lat 42.480779000e+00; wgs84:long -71.358747000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:03:03.162Z"; +]; +gps:trackpoint [wgs84:lat 42.480724000e+00; wgs84:long -71.358786000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:03:07.139Z"; +]; +gps:trackpoint [wgs84:lat 42.480682000e+00; wgs84:long -71.358809000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:03:10.137Z"; +]; +gps:trackpoint [wgs84:lat 42.480635000e+00; wgs84:long -71.358832000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:03:14.141Z"; +]; +gps:trackpoint [wgs84:lat 42.480590000e+00; wgs84:long -71.358858000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:03:17.141Z"; +]; +gps:trackpoint [wgs84:lat 42.480553000e+00; wgs84:long -71.358916000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:03:20.127Z"; +]; +gps:trackpoint [wgs84:lat 42.480511000e+00; wgs84:long -71.358969000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:03:23.140Z"; +]; +gps:trackpoint [wgs84:lat 42.480461000e+00; wgs84:long -71.359002000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:03:26.136Z"; +]; +gps:trackpoint [wgs84:lat 42.480417000e+00; wgs84:long -71.359010000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:03:28.145Z"; +]; +gps:trackpoint [wgs84:lat 42.480363000e+00; wgs84:long -71.359049000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:03:32.140Z"; +]; +gps:trackpoint [wgs84:lat 42.480319000e+00; wgs84:long -71.359076000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:03:35.147Z"; +]; +gps:trackpoint [wgs84:lat 42.480275000e+00; wgs84:long -71.359107000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T14:03:39.133Z"; +]; +gps:trackpoint [wgs84:lat 42.480219000e+00; wgs84:long -71.359139000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T14:03:43.136Z"; +]; +gps:trackpoint [wgs84:lat 42.480174000e+00; wgs84:long -71.359161000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T14:03:46.138Z"; +]; +gps:trackpoint [wgs84:lat 42.480122000e+00; wgs84:long -71.359174000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T14:03:49.137Z"; +]; +gps:trackpoint [wgs84:lat 42.480071000e+00; wgs84:long -71.359201000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T14:03:52.128Z"; +]; +gps:trackpoint [wgs84:lat 42.480024000e+00; wgs84:long -71.359240000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T14:03:55.140Z"; +]; +gps:trackpoint [wgs84:lat 42.479975000e+00; wgs84:long -71.359274000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T14:03:58.145Z"; +]; +gps:trackpoint [wgs84:lat 42.479915000e+00; wgs84:long -71.359304000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T14:04:01.136Z"; +]; +gps:trackpoint [wgs84:lat 42.479869000e+00; wgs84:long -71.359335000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T14:04:04.143Z"; +]; +gps:trackpoint [wgs84:lat 42.479817000e+00; wgs84:long -71.359366000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T14:04:07.145Z"; +]; +gps:trackpoint [wgs84:lat 42.479764000e+00; wgs84:long -71.359413000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T14:04:10.139Z"; +]; +gps:trackpoint [wgs84:lat 42.479725000e+00; wgs84:long -71.359450000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T14:04:13.136Z"; +]; +gps:trackpoint [wgs84:lat 42.479686000e+00; wgs84:long -71.359486000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T14:04:16.135Z"; +]; +gps:trackpoint [wgs84:lat 42.479625000e+00; wgs84:long -71.359509000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T14:04:20.139Z"; +]; +gps:trackpoint [wgs84:lat 42.479577000e+00; wgs84:long -71.359534000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T14:04:23.142Z"; +]; +gps:trackpoint [wgs84:lat 42.479530000e+00; wgs84:long -71.359527000e+00; + wgs84:altitude 55.000000e0; + wgs84:time "2016-01-09T14:04:27.141Z"; +]; +gps:trackpoint [wgs84:lat 42.479490000e+00; wgs84:long -71.359553000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:04:36.231Z"; +]; +gps:trackpoint [wgs84:lat 42.479452000e+00; wgs84:long -71.359586000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:04:41.101Z"; +]; +gps:trackpoint [wgs84:lat 42.479414000e+00; wgs84:long -71.359602000e+00; + wgs84:altitude 56.000000e0; + wgs84:time "2016-01-09T14:04:46.925Z"; +]; +]; +. diff --git a/test/xml b/test/xml/link-relations.xml similarity index 100% rename from test/xml rename to test/xml/link-relations.xml diff --git a/test/xml/small.xml b/test/xml/small.xml new file mode 100644 index 0000000..083da2f --- /dev/null +++ b/test/xml/small.xml @@ -0,0 +1,9 @@ + + + + + Link Relations + 2005-08-26 + 2016-01-22 + + From 4224a6635cb1f4483acd567831b242759379c2bf Mon Sep 17 00:00:00 2001 From: Tim Berners-Lee Date: Wed, 3 Feb 2016 19:45:04 -0500 Subject: [PATCH 03/23] 0.2.13 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e9d7328..bc9e49e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "rabel", "description": "Linked Data command line utility", - "version": "0.2.12", + "version": "0.2.13", "author": { "name": "Tim Berners-Lee", "email": "timbl@w3.org" From 72f1cb029708c5bb270ad147658312be61c5e30e Mon Sep 17 00:00:00 2001 From: Tim Berners-Lee Date: Thu, 4 Feb 2016 22:39:43 -0500 Subject: [PATCH 04/23] Add command line command rabel using the bin link --- .gitignore | 1 + package.json | 4 ++++ rabel.js | 6 +++--- 3 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 .gitignore mode change 100644 => 100755 rabel.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/package.json b/package.json index bc9e49e..a5a8b49 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,10 @@ "rdflib": "^0.2.9", "xmldom": "^0.1.22" }, + "bin": { + "rabel": "rabel.js" + }, + "devDependencies": {}, "main": "rabel.js" } diff --git a/rabel.js b/rabel.js old mode 100644 new mode 100755 index a74c978..c880f14 --- a/rabel.js +++ b/rabel.js @@ -1,4 +1,4 @@ - +#!/usr/local/bin/node // Utility Data conversion program. // // Test platform for parsers and serializers @@ -76,7 +76,7 @@ var doNext = function(remaining) { break; case '-help': - condole.log(helpMessage); + console.log(helpMessage); break; case '-in': @@ -129,7 +129,7 @@ var doNext = function(remaining) { default: console.log("Unknown command: " + left); - condole.log(helpMessage); + console.log(helpMessage); process.exit(1); } } From 51362267473d2669db8428afa949db83040fe25e Mon Sep 17 00:00:00 2001 From: Tim Berners-Lee Date: Sun, 7 Feb 2016 09:17:08 -0500 Subject: [PATCH 05/23] Remove -inXML as command, add application/xml as format. Add data island test --- README.md | 53 ++++++++++- rabel.js | 95 ++++++++++++------- test/html/xml-data-island.html | 32 +++++++ .../{GPSKitData.n3 => trail-reference.ttl} | 0 test/xml/{GPSKitData.gpx => trail.gpx} | 0 5 files changed, 145 insertions(+), 35 deletions(-) create mode 100644 test/html/xml-data-island.html rename test/xml/{GPSKitData.n3 => trail-reference.ttl} (100%) rename test/xml/{GPSKitData.gpx => trail.gpx} (100%) diff --git a/README.md b/README.md index 04ac6f4..706a11c 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,51 @@ -# rabel -Program for reading and writing linked data in various formats. Short for "RDF Babel". +# rabel - linked data format converter + +Program for reading and writing linked data in various formats. + +To install, + + npm install -g rabel + +## Command line + +Commands look like unix options are executed *in order* from left to right. They include: +``` +-base=rrrr Set the current base URI (relative URI) +-clear Clear the current store +-dump Serialize the store in current content-type to the console +-format=cccc Set the current content-type +-help This message +-in=uri Load a web resource or file +-out=filename Output in the current content type +-size Give the current store size in triples +-version Give the version of this program +``` + +Formats cccc are given as MIME types. These can be used for input or output: + + * text/turtle *(default)* + * application/rdf+xml + +whereas these can only input: + + * application/rdfa + * application/xml + + #### Example + +``` + rabel -format=application/xml -in=foo.xml -format=text/turtle -out=foo.ttl + + rabel part*.ttl -out=whole.ttl +``` +## Details +Currently rabel can read from the web or files, and write only to files. Filenames are deemed to be relative URIs just taken relative to file:///{pwd}/ where {pwd} is the current working directory. + +One use case is testing the all the parsers. Another is providing a stable serialization. The output serialization is designed to be stable under small changes of the the data, to allow data files to be checked into source code control systems. + +The name comes from RDF and Babel. + +### XML + +When loading XML, elements are mapped to arcs, and text content to trimmed RDF strings. For the XML namespace used for IANA registry documents, custom mapping is done, both of properties and datatypes, and local identifier generation. +(See the source for details!) diff --git a/rabel.js b/rabel.js index c880f14..0d254fe 100755 --- a/rabel.js +++ b/rabel.js @@ -19,6 +19,8 @@ Commands in unix option form are executed left to right, and include:\n\ -out=filename Output in eth current content type\n\ -size Give the current store\n\ -version Give the version of this program\n\ +\n\ +Formats are given as MIME types, such as text/turtle (default), application/rdf+xml, etc\n\ \n" @@ -46,12 +48,36 @@ var exitMessage = function(message) { } var doNext = function(remaining) { + + var loadResource = function(right) { + targetDocument = $rdf.sym($rdf.uri.join(right, base)) + //console.log("Document is " + targetDocument) + if (contentType == 'application/xml') { + readXML(targetDocument, {}, function(ok, body, xhr) { + check(ok, body, xhr? xhr.status : undefined); + console.log("Loaded XML " + targetDocument); + doNext(remaining); + }); // target, kb, base, contentType, callback + } else { + fetcher.nowOrWhenFetched(targetDocument, {}, function(ok, body, xhr) { + check(ok, body, xhr? xhr.status : undefined); + console.log("Loaded " + targetDocument); + doNext(remaining); + }); // target, kb, base, contentType, callback + } + } + + while (remaining.length) { // console.log("... remaining " + remaining.join(' ')); var command = remaining.shift().split('='); var left = command[0], right = command[1]; + if (left.slice(0,1) !== '-') { + loadResource(left); + return; + } switch(left) { case '-base': base = $rdf.uri.join(right, base) @@ -80,24 +106,8 @@ var doNext = function(remaining) { break; case '-in': - targetDocument = $rdf.sym($rdf.uri.join(right, base)) - //console.log("Document is " + targetDocument) - fetcher.nowOrWhenFetched(targetDocument, {}, function(ok, body, xhr) { - check(ok, body, xhr? xhr.status : undefined); - console.log("Loaded " + targetDocument); - doNext(remaining); - }); // target, kb, base, contentType, callback - return; // STOP processing at this level - - case '-inXML': - targetDocument = $rdf.sym($rdf.uri.join(right, base)) - //console.log("Document is " + targetDocument) - readXML(targetDocument, {}, function(ok, body, xhr) { - check(ok, body, xhr? xhr.status : undefined); - console.log("Loaded XML " + targetDocument); - doNext(remaining); - }); // target, kb, base, contentType, callback - return; // STOP processing at this level + loadResource(right); + return; case '-out': doc = $rdf.sym($rdf.uri.join(right, base)); @@ -114,7 +124,7 @@ var doNext = function(remaining) { if (err) { exitMessage("Error writing file <"+right+"> :" + err); } - console.log("Written " + fileName); + console.log("Written " + doc); doNext(remaining); }); return; @@ -184,7 +194,22 @@ readXML = function(targetDocument, options, callback) { return text; } - + /////////////////////////// GPX SPECIAL + + + var GPX_predicateMap = { + time: { uri: 'http://www.w3.org/2003/01/geo/wgs84_pos#time', + type: 'http://www.w3.org/2001/XMLSchema#dateTime'}, + + lat: { uri: 'http://www.w3.org/2003/01/geo/wgs84_pos#lat'}, + lon: { uri: 'http://www.w3.org/2003/01/geo/wgs84_pos#long'}, + ele: { uri: 'http://www.w3.org/2003/01/geo/wgs84_pos#altitude'} + }; + + + + /////////////////////////// IANA SPECIAL + var IANA_predicateMap = { created: { uri: 'http://purl.org/dc/terms/created', type: 'http://www.w3.org/2001/XMLSchema#date'}, // @@CHECK @@ -222,12 +247,14 @@ readXML = function(targetDocument, options, callback) { } return null; } + + ////////////////////////////////// var convert = function(ele, node, indent) { indent = indent || ''; var pred, obj, type; - console.log(indent + "nodeName: " + ele.nodeName + " type " + ele.nodeType) - console.log(indent + "tagName: " + ele.tagName); + //console.log(indent + "nodeName: " + ele.nodeName + " type " + ele.nodeType) + //console.log(indent + "tagName: " + ele.tagName); if (ele.nodeType in ignore) { // PI return; } @@ -236,7 +263,7 @@ readXML = function(targetDocument, options, callback) { pred = kb.sym(ns + id); if (options.predicateMap && options.predicateMap[id]) { var p = options.predicateMap[id]; - console.log(indent + "Mapping to " + p.uri) + // console.log(indent + "Mapping to " + p.uri) if (p.uri) { pred = kb.sym(p.uri); } @@ -248,10 +275,10 @@ readXML = function(targetDocument, options, callback) { if (ele.attributes) { var attrs = ele.attributes, a; - console.log(indent + 'attributes: ' + attrs.length) + // console.log(indent + 'attributes: ' + attrs.length) for (var j=0; j < attrs.length; j++) { a = attrs.item(j); - console.log(indent + j + ") " +a.nodeName + " = " + a.nodeValue); + // console.log(indent + j + ") " +a.nodeName + " = " + a.nodeValue); if (a.nodeName === 'xmlns') { defaultNamespace = a.nodeValue; @@ -263,6 +290,8 @@ readXML = function(targetDocument, options, callback) { } else if (defaultNamespace === 'http://www.topografix.com/GPX/1/1') { ns ='http://hackdiary.com/ns/gps#'; // @@@ u + options.predicateMap = GPX_predicateMap; + console.log('GPX Mode'); } continue; } @@ -271,39 +300,39 @@ readXML = function(targetDocument, options, callback) { } } if (ele.childNodes) { - console.log(indent + "children " +ele.childNodes.length) + // console.log(indent + "children " +ele.childNodes.length) for(var i=0; i 0) { kb.add(node, pred, $rdf.lit(txt, undefined, type), targetDocument) - console.log($rdf.lit(txt, undefined, type)) + // console.log($rdf.lit(txt, undefined, type)) } } else if (options.iana && magicIANAxref(child)) { kb.add(node, kb.sym(ns + child.nodeName), magicIANAxref(child), targetDocument); - console.log(indent + "Magic IANA xref " + magicIANAxref(child)) + // console.log(indent + "Magic IANA xref " + magicIANAxref(child)) } else { if (child.attributes && child.attributes.getNamedItem('id')){ obj = kb.sym(local + child.attributes.getNamedItem('id').nodeValue); } else if (options.iana && magicIANAvalue(child)) { obj = magicIANAvalue(child); - console.log(indent + "Magic IANA value " + obj) + // console.log(indent + "Magic IANA value " + obj) kb.add(obj, RDF('type'), RDF('Property') , targetDocument); } else { obj = kb.bnode(); diff --git a/test/html/xml-data-island.html b/test/html/xml-data-island.html new file mode 100644 index 0000000..b86624d --- /dev/null +++ b/test/html/xml-data-island.html @@ -0,0 +1,32 @@ + + + +XML Data Block Demo + + + + + +Demo did not run + + diff --git a/test/xml/GPSKitData.n3 b/test/xml/trail-reference.ttl similarity index 100% rename from test/xml/GPSKitData.n3 rename to test/xml/trail-reference.ttl diff --git a/test/xml/GPSKitData.gpx b/test/xml/trail.gpx similarity index 100% rename from test/xml/GPSKitData.gpx rename to test/xml/trail.gpx From 45e745a104cc8801fcd9a3dce25e7f5ea0b24ece Mon Sep 17 00:00:00 2001 From: Tim Berners-Lee Date: Sun, 26 Mar 2017 23:39:44 -0400 Subject: [PATCH 06/23] Added embryonic RDF validation feature. Validate like: node rabel.js mydata.ttl -report=result.ttl -validate=shapes.ttl. WIP --- README.md | 7 +- package.json | 5 +- rabel.js | 835 ++++++++++++++++++++++++--------------- test/shapes/Makefile | 5 + test/shapes/alicebob.ttl | 102 +++++ test/shapes/expected.ttl | 48 +++ test/shapes/result.ttl | 48 +++ 7 files changed, 729 insertions(+), 321 deletions(-) create mode 100644 test/shapes/Makefile create mode 100644 test/shapes/alicebob.ttl create mode 100644 test/shapes/expected.ttl create mode 100644 test/shapes/result.ttl diff --git a/README.md b/README.md index 706a11c..a36fb57 100644 --- a/README.md +++ b/README.md @@ -31,12 +31,13 @@ whereas these can only input: * application/rdfa * application/xml - #### Example + #### Examples ``` - rabel -format=application/xml -in=foo.xml -format=text/turtle -out=foo.ttl - rabel part*.ttl -out=whole.ttl +rabel -format=application/xml -in=foo.xml -format=text/turtle -out=foo.ttl + +rabel part*.ttl -out=whole.ttl ``` ## Details Currently rabel can read from the web or files, and write only to files. Filenames are deemed to be relative URIs just taken relative to file:///{pwd}/ where {pwd} is the current working directory. diff --git a/package.json b/package.json index a5a8b49..cd24874 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "rabel", "description": "Linked Data command line utility", - "version": "0.2.13", + "version": "0.3.1", "author": { "name": "Tim Berners-Lee", "email": "timbl@w3.org" @@ -15,7 +15,8 @@ "homepage": "http://github.com/linkeddata/rabel", "bugs": "http://github.com/linkeddata/rabel/issues", "dependencies": { - "rdflib": "^0.2.9", + "rdflib": "^0.15.0", + "shacl-check": "^0.0.1", "xmldom": "^0.1.22" }, "bin": { diff --git a/rabel.js b/rabel.js index 0d254fe..3fbd48c 100755 --- a/rabel.js +++ b/rabel.js @@ -5,355 +5,558 @@ // // -var helpMessage = -"Utilty data converter for linked data\n\ -\n\ -Commands in unix option form are executed left to right, and include:\n\ -\n\ --base=rrrr Set the current base URI (relative URI)\n\ --clear Clear the current store\n\ --dump Serialize the current store in current content type\n\ --format=cccc Set the current content-type\n\ --help This message \n\ --in=uri Load a web resource or file\n\ --out=filename Output in eth current content type\n\ --size Give the current store\n\ --version Give the version of this program\n\ -\n\ -Formats are given as MIME types, such as text/turtle (default), application/rdf+xml, etc\n\ -\n" - - -$rdf = require('rdflib'); -var fs = require('fs'); - -var kb = $rdf.graph(); -var fetcher = $rdf.fetcher(kb); - -var contentType = 'text/turtle'; var base = 'file://' + process.cwd() + '/' -var uri; -var targetDocument; +var helpMessage = +'Utilty data converter for linked data\n' + +'\n' + +'Commands in unix option form are executed left to right, and include:\n' + +'\n' + +'-base=rrrr Set the current base URI (relative URI, default is ' + base + ')\n' + +'-clear Clear the current store\n' + +'-dump Serialize the current store in current content type\n' + +'-format=cccc Set the current content-type\n' + +'-help This message \n' + +'-in=uri Load a web resource or file\n' + +'-out=filename Output in eth current content type\n' + +'-report=file set the report file desiation for future validation\n' + +'-size Give the current store\n' + +'-spray=base Write out linked data to lots of different linked files CAREFUL!\n' + +'-test=manifest Run tests as described in the test manifest\n' + +'-validate=shapeFile Run a SHACL validator on the data loaded by previous in=x\n' + +'-version Give the version of this program\n' + +'\n' + +'Formats are given as MIME types, such as text/turtle (default), application/rdf+xml, etc\n' + +'In input only, can parse application/xml, with smarts about IANA and GPX files.\n' + +'\n' -var check = function(ok, message, status) { - if (!ok) { - console.log("Failed " + status + ": " + message); - process.exit(2); - } +var $rdf = require('rdflib') +var fs = require('fs') +var ShapeChecker = require('./../shacl-check/src/shacl-check.js') + +var kb = $rdf.graph() +var fetcher = $rdf.fetcher(kb) + +var RDF = $rdf.Namespace('http://www.w3.org/1999/02/22-rdf-syntax-ns#') +var a = RDF('type') + +var contentType = 'text/turtle' +var reportDocument, targetDocument + +var check = function (ok, message, status) { + if (!ok) { + console.log('Failed ' + status + ': ' + message) + process.exit(2) + } } -var exitMessage = function(message) { - console.log(message); - process.exit(4); +var exitMessage = function (message) { + console.log(message) + process.exit(4) } -var doNext = function(remaining) { - - var loadResource = function(right) { - targetDocument = $rdf.sym($rdf.uri.join(right, base)) - //console.log("Document is " + targetDocument) - if (contentType == 'application/xml') { - readXML(targetDocument, {}, function(ok, body, xhr) { - check(ok, body, xhr? xhr.status : undefined); - console.log("Loaded XML " + targetDocument); - doNext(remaining); - }); // target, kb, base, contentType, callback - } else { - fetcher.nowOrWhenFetched(targetDocument, {}, function(ok, body, xhr) { - check(ok, body, xhr? xhr.status : undefined); - console.log("Loaded " + targetDocument); - doNext(remaining); - }); // target, kb, base, contentType, callback - } +var doNext = function (remaining) { + + var loadDocument = function (right) { + var doc = $rdf.sym($rdf.uri.join(right, base)) + targetDocument = targetDocument || doc // remember first doc + // console.log("Document is " + targetDocument) + if (contentType === 'application/xml') { + readXML(doc, {}, function (ok, body, xhr) { + check(ok, body, xhr ? xhr.status : undefined) + console.log('Loaded XML ' + targetDocument) + doNext(remaining) + }) // target, kb, base, contentType, callback + } else { + fetcher.nowOrWhenFetched(doc, {}, function (ok, body, xhr) { + check(ok, body, xhr ? xhr.status : undefined) + console.log('Loaded ' + doc) + doNext(remaining) + }) // target, kb, base, contentType, callback + } + } + // Writes the data we have in the store under targetDocument out to file doc + var writeDocument = function (targetDocument, doc) { + console.log(' writing ... ' + doc) + try { + var outText = $rdf.serialize(targetDocument, kb, targetDocument.uri, contentType) + } catch (e) { + exitMessage('Error in serializer: ' + e) } + if (doc.uri.slice(0, 8) !== 'file:///') { + exitMessage('Can only write files just now, sorry: ' + doc.uri) + } + var fileName = doc.uri.slice(7) // + fs.writeFile(fileName, outText, function (err) { + if (err) { + exitMessage('Error writing file <' + right + '> :' + err) + } + console.log('Written ' + doc) + doNext(remaining) + }) + } + + while (remaining.length) { + let arg = remaining.shift() + let command = arg.split('=') + let left = command[0] + let right = command[1] + if (left.slice(0, 1) !== '-') { + loadDocument(arg) + return + } + let doc + switch (left) { + case '-base': + base = $rdf.uri.join(right, base) + break - while (remaining.length) { - // console.log("... remaining " + remaining.join(' ')); + case '-clear': + kb = $rdf.graph() + break - var command = remaining.shift().split('='); - var left = command[0], - right = command[1]; - if (left.slice(0,1) !== '-') { - loadResource(left); - return; + case '-dump': + console.log('Serialize ' + targetDocument + ' as ' + contentType) + try { + var out = $rdf.serialize(targetDocument, kb, targetDocument.uri, contentType) + } catch (e) { + exitMessage('Error in serializer: ' + e) } - switch(left) { - case '-base': - base = $rdf.uri.join(right, base) - break; - - case '-clear': - kb = $rdf.graph(); - break; - - case '-dump': - console.log("Serialize " + targetDocument + " as " + contentType); - try { - var out = $rdf.serialize(targetDocument, kb, targetDocument.uri, contentType); - } catch(e) { - exitMessage("Error in serializer: " + e); - } - console.log("Result: " +out); - break; - - case '-format': - contentType = right; - break; - - case '-help': - console.log(helpMessage); - break; - - case '-in': - loadResource(right); - return; - - case '-out': - doc = $rdf.sym($rdf.uri.join(right, base)); - try { - var out = $rdf.serialize(targetDocument, kb, targetDocument.uri, contentType); - } catch(e) { - exitMessage("Error in serializer: " + e); - } - if (doc.uri.slice(0, 8) !== 'file:///' ) { - exitMessage("Can only write files just now, sorry: " + doc.uri); - } - var fileName = doc.uri.slice(7); // - fs.writeFile(fileName, out, function (err) { - if (err) { - exitMessage("Error writing file <"+right+"> :" + err); - } - console.log("Written " + doc); - doNext(remaining); - }); - return; - - case '-size': - console.log(kb.statements.length + ' triples'); - break; - - case '-version': - console.log("rdflib built: " + $rdf.buildTime); - break; - - default: - console.log("Unknown command: " + left); - console.log(helpMessage); - process.exit(1); + console.log('Result: ' + out) + break + + case '-format': + contentType = right + break + + case '-report': + reportDocument = $rdf.sym($rdf.uri.join(right, base)) + break + + case '-validate': + if (!targetDocument) { + console.log('Load data to be validated before -validate=shapefile') + process.exit(1) + } + let shapeDoc = $rdf.sym($rdf.uri.join(right, base)) + console.log('shapeDoc ' + shapeDoc) + fetcher.nowOrWhenFetched(shapeDoc, {}, function (ok, body, xhr) { + if (!ok) { + console.log("Error loading " + doc + ": " + body) + process.exit(1) + } else { + console.log("Loaded shape file " + shapeDoc) + let checker = new ShapeChecker(kb, shapeDoc, targetDocument, reportDocument) + checker.execute() + console.log('Validation done.') + targetDocument = reportDocument + writeDocument(reportDocument, reportDocument) // and move on to next command + } + }) + return + + case '-help': + console.log(helpMessage) + break + + case '-in': + doc = $rdf.sym($rdf.uri.join(right, base)) + loadDocument(doc) + return + + case '-out': + doc = $rdf.sym($rdf.uri.join(right, base)) + writeDocument(targetDocument, doc) + return + + case '-spray': + doc = $rdf.sym($rdf.uri.join(right, base)) // go back to folder + if (doc.uri.slice(0, 8) !== 'file:///') { + exitMessage('Can only write files just now, sorry: ' + doc.uri) + } + try { + spray(doc.uri) + } catch (e) { + exitMessage('Error in spray: ' + e) + } + return + + case '-size': + console.log(kb.statements.length + ' triples') + doNext(remaining) + break + + case '-test': + doc = $rdf.sym($rdf.uri.join(right, base)) + console.log("Loading " + doc) + fetcher.load(doc).then(function (xhr) { + runTests(doc) + doNext(remaining) + }).catch(function (e) { + console.log(e) + process.exit(1) + }) + break + + case '-version': + console.log('rdflib built: ' + $rdf.buildTime) + break + + default: + console.log('Unknown command: ' + left) + console.log(helpMessage) + process.exit(1) + } + } + process.exit(0) +} + +var statementsToTurtle = function (statements, base) { + var sz = new $rdf.Serializer(kb) + sz.suggestNamespaces(kb.namespaces) + sz.setBase(base) + sz.setFlags('si') // Suppress = for sameAs and => for implies + return sz.statementsToN3(statements) +} + +var runTests = function (testDocument) { + const sht = $rdf.Namespace('http://www.w3.org/ns/shacl/test-suite#') + + var forwardTree = function (x) { + var sts = [] + var f = function (x) { + var s = kb.statementsMatching(x) + sts = sts.concat(s) + s.forEach(function (st) { + f(st.object) + }) + } + } + + const mf = $rdf.Namespace('http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#') + // var context = 'In test document ' + testDocument + var runManifest = function (doc, indent) { + indent = indent || '' + console.log(indent + 'Manifest: ' + testDocument) + let comment = kb.anyValue(testDocument, kb.sym('http://www.w3.org/2000/01/rdf-schema#comment')) + if (comment) console.log(indent + comment) + var action, dataGraph, shapesGraph, expected, actualGraph + + kb.each(testDocument, mf('entries')).forEach(function (test) { + if (kb.holds(test, a, sht('Validate'))) { + console.log('Validation test ' + test) + action = kb.the(test, mf('action')) + dataGraph = kb.the(action, mf('dataGraph')) + shapesGraph = kb.the(action, mf('shapesGraph')) // A doc + actualGraph = kb.sym(test.uri + '__results') + ;(new ShapeChecker(kb, shapesGraph, dataGraph, actualGraph)).execute() + + expected = kb.the(test, mf('result')) // Node + let expectedStatements = forwardTree(expected) + let expectedString = $rdf.serialize(expectedStatements) + let actalString = $rdf.serialize(actualGraph.statements) + if (expectedString === actalString) { + console.log(indent + ' -> passed') + } else { + console.log(indent + ' -> FAILED') + let ul = '\n__________________________________________________\n' + console.log(ul + expectedString + ul + actalString + ul) } + } + }) + + kb.each(testDocument, mf('include')) + .forEach(function (doc) { runManifest(indent + ' ', doc) }) + console.log(indent + 'Done ' + doc) + } + runManifest(testDocument) +} + +// Store linked data in separe files +// +// Caution: use with care! This will build a complete linked data +// database of linked files from master data + +var spray = function (rootURI, doubleLinked) { + var docs = [] + console.log('Spray: Root is ' + rootURI) + var docURI + var check = function (x) { + if (x.uri && x.uri.startsWith(rootURI)) { + var docURI = x.uri.split('#')[0] + docs[docURI] = docs[docURI] || [] + if (!docs[docURI][x.uri]) console.log('target ' + x) + docs[docURI][x.uri] = true } - process.exit(0); + } + kb.statements.forEach(function (st) { check(st.subject); check(st.object) }) // Not predicates + + for (docURI in docs) { + var sts = [] + console.log('Document: ' + docURI) + for (var uri in docs[docURI]) { + var thing = $rdf.sym(uri) + var connected = kb.connectedStatements(thing) + console.log(' We have ' + connected.length + ' statements around ' + thing) + sts = sts.concat(connected) + } + console.log('We have ' + sts.length + ' total statements in document ' + docURI) + var fileName = docURI.slice(7) // + var out = statementsToTurtle(sts, docURI) + console.log('To be written to ' + fileName + ':\n' + out + '\n') + /* + fs.writeFile(fileName, out, function (err) { + if (err) { + exitMessage("Error writing file <"+right+"> :" + err) + } + console.log("Written " + docURI) + doNext(remaining) + }) + */ + } } // Read An XML file // // Contains namespace-trigged specials for IANA registry data // -readXML = function(targetDocument, options, callback) { - var uri = targetDocument.uri - var file = $rdf.Util.uri.refTo(base, uri); - var ignore = { 7: true}; - var RDF = $rdf.Namespace('http://www.w3.org/1999/02/22-rdf-syntax-ns#'); - var RDFS = $rdf.Namespace('http://www.w3.org/2000/01/rdf-schema#'); - - fs.readFile(file, options.encoding || 'utf8', function(err,data){ - var defaultNamespace = null; - if (err) { - console.log("File read FAIL, error: " + err); - return callback(false, err); - } - console.log("File read ok, length: " + data.length); - var local = $rdf.uri.join(file, base) + '#' - var ns = options.ns || local - var DOMParser = require('xmldom').DOMParser; - var doc = new DOMParser().parseFromString(data); - var root = kb.sym(uri); - - var justTextContent = function(ele) { - var ch = ele.childNodes; - var text = ''; - if (ch) for (var i=0; i< ch.length; i++) { - if (ch[i].nodeType !== 3) { - if (ch.length > 1 && options.iana && ch[i].nodeType === 1 && ch[i].nodeName === 'xref') { - text += ' ' + ch[i].attributes.getNamedItem('data').nodeValue + ' '; - } else { - return false; - } - } else { - text += ch[i].nodeValue; - } - } +var readXML = function (targetDocument, options, callback) { + var uri = targetDocument.uri + var file = $rdf.Util.uri.refTo(base, uri) + var ignore = { 7: true } - if (ele.attributes && ele.attributes.length > 0) { - return false; - } - if (!options.noTrim) { - text = text.trim(); + fs.readFile(file, options.encoding || 'utf8', function (err, data) { + var defaultNamespace = null + if (err) { + console.log('File read FAIL, error: ' + err) + return callback(false, err) + } + console.log('File read ok, length: ' + data.length) + var local = $rdf.uri.join(file, base) + '#' + var ns = options.ns || local + var DOMParser = require('xmldom').DOMParser + var doc = new DOMParser().parseFromString(data) + var root = kb.sym(uri) + + var justTextContent = function (ele) { + var ch = ele.childNodes + var text = '' + if (ch) { + for (let i = 0; i < ch.length; i++) { + if (ch[i].nodeType !== 3) { + if (ch.length > 1 && options.iana && ch[i].nodeType === 1 && ch[i].nodeName === 'xref') { + text += ' ' + ch[i].attributes.getNamedItem('data').nodeValue + ' ' + } else { + return false } - return text; + } else { + text += ch[i].nodeValue + } } + } - /////////////////////////// GPX SPECIAL - - - var GPX_predicateMap = { - time: { uri: 'http://www.w3.org/2003/01/geo/wgs84_pos#time', - type: 'http://www.w3.org/2001/XMLSchema#dateTime'}, - - lat: { uri: 'http://www.w3.org/2003/01/geo/wgs84_pos#lat'}, - lon: { uri: 'http://www.w3.org/2003/01/geo/wgs84_pos#long'}, - ele: { uri: 'http://www.w3.org/2003/01/geo/wgs84_pos#altitude'} - }; - - - - /////////////////////////// IANA SPECIAL - - var IANA_predicateMap = { - created: { uri: 'http://purl.org/dc/terms/created', - type: 'http://www.w3.org/2001/XMLSchema#date'}, // @@CHECK - date: { uri: 'http://purl.org/dc/terms/date', - type: 'http://www.w3.org/2001/XMLSchema#date'}, // @@CHECK - description: { uri: 'http://purl.org/dc/terms/description'}, // @@CHECK - value: { uri: 'http://www.w3.org/2000/01/rdf-schema#label'}, - note:{ uri: 'http://www.w3.org/2000/01/rdf-schema#comment'} - }; - var magicIANAxref = function(ele) { - var ch = ele.childNodes; - if (ch.length === 1 && ch[0].nodeName === 'xref') { - var at = ch[0].attributes; - var ty = at.getNamedItem('type').nodeValue; - var data = at.getNamedItem('data').nodeValue; - if (ty === 'uri') return kb.sym(data); - if (ty === 'rfc') return kb.sym('https://tools.ietf.org/html/' + data); - if (ty === 'draft') return kb.sym('https://tools.ietf.org/html/' + data); - - // RFCs are at e.g. https://tools.ietf.org/html/rfc5005 - // Internet Drafts are at e.g. - // https://tools.ietf.org/html/draft-ietf-httpbis-legally-restricted-status-04 - - } - return null; + if (ele.attributes && ele.attributes.length > 0) { + return false + } + if (!options.noTrim) { + text = text.trim() + } + return text + } + + // ///////////////////////// GPX SPECIAL + + var GPX_predicateMap = { + time: { uri: 'http://www.w3.org/2003/01/geo/wgs84_pos#time', + type: 'http://www.w3.org/2001/XMLSchema#dateTime' }, + + lat: { uri: 'http://www.w3.org/2003/01/geo/wgs84_pos#lat' }, + lon: { uri: 'http://www.w3.org/2003/01/geo/wgs84_pos#long' }, + ele: { uri: 'http://www.w3.org/2003/01/geo/wgs84_pos#altitude' } + } + + // ///////////////////////// IANA SPECIAL + + var IANA_predicateMap = { + created: { uri: 'http://purl.org/dc/terms/created', + type: 'http://www.w3.org/2001/XMLSchema#date' }, // @@CHECK + date: { uri: 'http://purl.org/dc/terms/date', + type: 'http://www.w3.org/2001/XMLSchema#date' }, // @@CHECK + description: { uri: 'http://purl.org/dc/terms/description' }, // @@CHECK + value: { uri: 'http://www.w3.org/2000/01/rdf-schema#label' }, + note: { uri: 'http://www.w3.org/2000/01/rdf-schema#comment' } + } +/* + var magicIANAxref_Original = function (ele, local) { + var ch = ele.childNodes + if (ch.length === 1 && ch[0].nodeName === 'xref') { + var at = ch[0].attributes + var ty = at.getNamedItem('type').nodeValue + var data = at.getNamedItem('data').nodeValue + if (ty === 'uri') return kb.sym(data) + if (ty === 'rfc') return kb.sym('https://tools.ietf.org/html/' + data) + if (ty === 'draft') return kb.sym('https://tools.ietf.org/html/' + data) + if (ty === 'person') return kb.sym($rdf.uri.join('../person/', local) + data + '#') + + // RFCs are at e.g. https://tools.ietf.org/html/rfc5005 + // Internet Drafts are at e.g. + // https://tools.ietf.org/html/draft-ietf-httpbis-legally-restricted-status-04 + } + return null + } +*/ + var magicIANAxref = function (ele, local) { + if (ele.nodeName !== 'xref') return null + var at = ele.attributes + + var ty = at.getNamedItem('type').nodeValue + if (ty === 'text') return $rdf.lit(justTextContent(ele)) // eg "ISO JTC-1" + + var data = at.getNamedItem('data').nodeValue + if (ty === 'uri') return kb.sym(data) + if (ty === 'rfc') return kb.sym('https://tools.ietf.org/html/' + data) + if (ty === 'draft') return kb.sym('https://tools.ietf.org/html/' + data) + if (ty === 'person') return kb.sym($rdf.uri.join('../person/', local) + data + '#') + + // RFCs are at e.g. https://tools.ietf.org/html/rfc5005 + // Internet Drafts are at e.g. + // https://tools.ietf.org/html/draft-ietf-httpbis-legally-restricted-status-04 + + return null + } + + var magicIANAsubject = function (ele, local) { + var ch = ele.childNodes + for (let i = 0; i < ch.length; i++) { + if (ch[i].nodeName === 'value') { // a value subelement gives a local URI + var localid = justTextContent(ch[i]) + return kb.sym(local + localid) + } + } + /* + vnd.ascii-art + + text/vnd.ascii-art + + */ + for (let i = 0; i < ch.length; i++) { + var child = ch[i] + if (child.nodeName === 'file' && child.attributes && child.attributes.getNamedItem('type')) { + return kb.sym($rdf.uri.join(child.textContent, local) + '#') } + } + return null + } - var magicIANAvalue = function(ele) { - var ch = ele.childNodes; - for (var i=0; i < ch.length; i++) { - if (ch[i].nodeName === 'value') { // a value subelement gives a local URI - var localid = justTextContent(ch[i]); - return kb.sym(local + localid); - } - } - return null; + // //////////////////////////////// + + var convert = function (ele, subject, indent) { + indent = indent || '' + var pred, obj, type + // console.log(indent + "nodeName: " + ele.nodeName + " type " + ele.nodeType) + console.log(indent + 'tagName: ' + ele.tagName) + if (ele.nodeType in ignore) { // PI + return + } + + var setPred = function (id) { + pred = kb.sym(ns + id) + if (options.predicateMap && options.predicateMap[id]) { + var p = options.predicateMap[id] + // console.log(indent + "Mapping to " + p.uri) + if (p.uri) { + pred = kb.sym(p.uri) + } + if (p.type) { + type = kb.sym(p.type) + } } - - ////////////////////////////////// - - var convert = function(ele, node, indent) { - indent = indent || ''; - var pred, obj, type; - //console.log(indent + "nodeName: " + ele.nodeName + " type " + ele.nodeType) - //console.log(indent + "tagName: " + ele.tagName); - if (ele.nodeType in ignore) { // PI - return; + } + + if (ele.attributes) { + var attrs = ele.attributes + var atr + // console.log(indent + 'attributes: ' + attrs.length) + for (var j = 0; j < attrs.length; j++) { + atr = attrs.item(j) + // console.log(indent + j + ") " +atr.nodeName + " = " + atr.nodeValue) + if (atr.nodeName === 'xmlns') { + defaultNamespace = atr.nodeValue + + if (defaultNamespace === 'http://www.iana.org/assignments') { + options.iana = true + ns = 'https://www.w3.org/ns/assignments/reg#' + options.predicateMap = IANA_predicateMap + console.log('IANA MODE') + } else if (defaultNamespace === 'http://www.topografix.com/GPX/1/1') { + ns = 'http://hackdiary.com/ns/gps#' // @@@ u + options.predicateMap = GPX_predicateMap + console.log('GPX Mode') } - - var setPred = function(id) { - pred = kb.sym(ns + id); - if (options.predicateMap && options.predicateMap[id]) { - var p = options.predicateMap[id]; - // console.log(indent + "Mapping to " + p.uri) - if (p.uri) { - pred = kb.sym(p.uri); - } - if (p.type) { - type = kb.sym(p.type); - } - } + continue + } + setPred(atr.nodeName) + kb.add(subject, pred, $rdf.lit(atr.nodeValue, undefined, type), targetDocument) + } + } + if (ele.childNodes) { + // console.log(indent + "children " +ele.childNodes.length) + for (var i = 0; i < ele.childNodes.length; i++) { + // console.log(indent + ' i ' + i) + var child = ele.childNodes[i] + type = null + setPred(child.nodeName) + if (child.nodeType === 3) { // text + obj = child.nodeValue.trim() // @@ optional + if (obj.length !== 0) { + console.log($rdf.lit(obj, undefined, type)) + kb.add(subject, kb.sym(ns + ele.nodeName), $rdf.lit(obj, undefined, type), targetDocument) + // console.log(indent + 'actual text ' + obj) + } else { + // console.log(indent + 'whitespace') } - - if (ele.attributes) { - var attrs = ele.attributes, a; - // console.log(indent + 'attributes: ' + attrs.length) - for (var j=0; j < attrs.length; j++) { - a = attrs.item(j); - // console.log(indent + j + ") " +a.nodeName + " = " + a.nodeValue); - if (a.nodeName === 'xmlns') { - defaultNamespace = a.nodeValue; - - if (defaultNamespace == 'http://www.iana.org/assignments') { - options.iana = true; - ns = 'https://www.w3.org/ns/assignments/reg#'; - options.predicateMap = IANA_predicateMap; - console.log('IANA MODE'); - - } else if (defaultNamespace === 'http://www.topografix.com/GPX/1/1') { - ns ='http://hackdiary.com/ns/gps#'; // @@@ u - options.predicateMap = GPX_predicateMap; - console.log('GPX Mode'); - } - continue; - } - setPred(a.nodeName); - kb.add(node, pred, $rdf.lit(a.nodeValue, undefined, type), targetDocument); + } else if (!(child.nodeType in ignore)) { + var txt = justTextContent(child) + if (txt !== false) { + if (txt.length > 0) { + kb.add(subject, pred, $rdf.lit(txt, undefined, type), targetDocument) + // console.log($rdf.lit(txt, undefined, type)) + } + } else if (options.iana && magicIANAxref(child, local)) { + kb.add(subject, kb.sym(ns + child.nodeName), magicIANAxref(child, local), targetDocument) + console.log(indent + 'Magic IANA xref ' + child.nodeName + ': ' + magicIANAxref(child, local)) + } else { + if (child.attributes && child.attributes.getNamedItem('id')) { + if (options.iana && child.nodeName === 'person') { + obj = kb.sym($rdf.uri.join('../person/', local) + + child.attributes.getNamedItem('id').nodeValue + '#') + console.log(indent + 'Person is ' + obj) + } else { + obj = kb.sym(local + child.attributes.getNamedItem('id').nodeValue) + console.log(indent + 'Local thing is ' + obj) } + } else if (options.iana && magicIANAsubject(child, local)) { + obj = magicIANAsubject(child, local) + console.log(indent + 'Magic IANA URI ' + obj) + // kb.add(obj, RDF('type'), RDF('Property') , targetDocument) + } else { + obj = kb.bnode() + } + kb.add(subject, pred, obj, targetDocument) + convert(child, obj, indent + ' ') } - if (ele.childNodes) { - // console.log(indent + "children " +ele.childNodes.length) - for(var i=0; i 0) { - kb.add(node, pred, $rdf.lit(txt, undefined, type), targetDocument) - // console.log($rdf.lit(txt, undefined, type)) - } - } else if (options.iana && magicIANAxref(child)) { - kb.add(node, kb.sym(ns + child.nodeName), magicIANAxref(child), targetDocument); - // console.log(indent + "Magic IANA xref " + magicIANAxref(child)) - } else { - if (child.attributes && child.attributes.getNamedItem('id')){ - obj = kb.sym(local + child.attributes.getNamedItem('id').nodeValue); - } else if (options.iana && magicIANAvalue(child)) { - obj = magicIANAvalue(child); - // console.log(indent + "Magic IANA value " + obj) - kb.add(obj, RDF('type'), RDF('Property') , targetDocument); - } else { - obj = kb.bnode(); - } - kb.add(node, pred, obj, targetDocument); - convert(child, obj, indent + ' '); - } - } - } - } + } } - convert(doc, root); - callback(true); - }); - + } + } + convert(doc, root) + callback(true) + }) } -doNext(process.argv.slice(2)); - +doNext(process.argv.slice(2)) - // {'forceContentType': 'application/rdfa'} +// {'forceContentType': 'application/rdfa'} // http://melvincarvalho.com/ -// http://schema.org/Person +// http://schema.org/ diff --git a/test/shapes/Makefile b/test/shapes/Makefile new file mode 100644 index 0000000..3b349ff --- /dev/null +++ b/test/shapes/Makefile @@ -0,0 +1,5 @@ + + +t1: + node ../../rabel.js alicebob.ttl -report=result.ttl -validate=alicebob.ttl + diff result.ttl expected.ttl diff --git a/test/shapes/alicebob.ttl b/test/shapes/alicebob.ttl new file mode 100644 index 0000000..02b62ef --- /dev/null +++ b/test/shapes/alicebob.ttl @@ -0,0 +1,102 @@ +@prefix dash: . +@prefix ex: . +@prefix mf: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix sh: . +@prefix sht: . +@prefix xsd: . + +ex:Alice + rdf:type ex:Person ; + ex:ssn "987-65-432A" ; +. +ex:Bob + rdf:type ex:Person ; + ex:ssn "123-45-6789" ; + ex:ssn "124-35-6789" ; +. +ex:Calvin + rdf:type ex:Person ; + ex:birthDate "1999-09-09"^^xsd:date ; + ex:worksFor ex:UntypedCompany ; +. +ex:PersonShape + rdf:type sh:NodeShape ; + sh:closed "true"^^xsd:boolean ; + sh:ignoredProperties ( + rdf:type + ) ; + sh:property [ + sh:path ex:ssn ; + sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:pattern "^\\d{3}-\\d{2}-\\d{4}$" ; + ] ; + sh:property [ + sh:path ex:worksFor ; + sh:class ex:Company ; + sh:nodeKind sh:IRI ; + ] ; + sh:property [ + sh:path [ + sh:inversePath ex:worksFor ; + ] ; + sh:name "employee" ; + ] ; + sh:targetClass ex:Person ; +. +<> + rdf:type mf:Manifest ; + mf:entries ( + + ) ; +. + + rdf:type ; + mf:action [ + <> ; + <> ; + ] ; + mf:result [ + rdf:type sh:ValidationReport ; + sh:conforms "false"^^xsd:boolean ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:Alice ; + sh:resultPath ex:ssn ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:PatternConstraintComponent ; + sh:sourceShape _:b61064 ; + sh:value "987-65-432A" ; + ] ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:Bob ; + sh:resultPath ex:ssn ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:MaxCountConstraintComponent ; + sh:sourceShape _:b61064 ; + ] ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:Calvin ; + sh:resultPath ex:birthDate ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:ClosedConstraintComponent ; + sh:sourceShape ex:PersonShape ; + sh:value "1999-09-09"^^xsd:date ; + ] ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:Calvin ; + sh:resultPath ex:worksFor ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:ClassConstraintComponent ; + sh:sourceShape [] ; + sh:value ex:UntypedCompany ; + ] ; + ] ; + mf:status ; +. diff --git a/test/shapes/expected.ttl b/test/shapes/expected.ttl new file mode 100644 index 0000000..72f1ed3 --- /dev/null +++ b/test/shapes/expected.ttl @@ -0,0 +1,48 @@ +@prefix : <#>. +@prefix sh: . +@prefix per: . +@prefix XML: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode per:Alice; + sh:resultMessage + "Error 987-65-432A should match pattern ^\\d{3}-\\d{2}-\\d{4}$"; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:PatternConstraintComponent; + sh:sourceShape per:PersonShape; + sh:value "987-65-432A" + ], + [ + a sh:ValidationResult; + sh:focusNode per:Bob; + sh:resultMessage + "Too many (2) on "; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MaxCountConstraintComponent; + sh:sourceShape per:PersonShape + ], + [ + a sh:ValidationResult; + sh:focusNode per:Calvin; + sh:resultMessage + """Closed node has extra data: "1999-09-09"^^ ."""; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:ClosedConstraintComponent; + sh:sourceShape per:PersonShape; + sh:value "1999-09-09"^^XML:date + ], + [ + a sh:ValidationResult; + sh:focusNode per:Calvin; + sh:resultMessage + "Error should be in class "; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:ClassConstraintComponent; + sh:sourceShape per:PersonShape + ] +]. diff --git a/test/shapes/result.ttl b/test/shapes/result.ttl new file mode 100644 index 0000000..72f1ed3 --- /dev/null +++ b/test/shapes/result.ttl @@ -0,0 +1,48 @@ +@prefix : <#>. +@prefix sh: . +@prefix per: . +@prefix XML: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode per:Alice; + sh:resultMessage + "Error 987-65-432A should match pattern ^\\d{3}-\\d{2}-\\d{4}$"; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:PatternConstraintComponent; + sh:sourceShape per:PersonShape; + sh:value "987-65-432A" + ], + [ + a sh:ValidationResult; + sh:focusNode per:Bob; + sh:resultMessage + "Too many (2) on "; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MaxCountConstraintComponent; + sh:sourceShape per:PersonShape + ], + [ + a sh:ValidationResult; + sh:focusNode per:Calvin; + sh:resultMessage + """Closed node has extra data: "1999-09-09"^^ ."""; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:ClosedConstraintComponent; + sh:sourceShape per:PersonShape; + sh:value "1999-09-09"^^XML:date + ], + [ + a sh:ValidationResult; + sh:focusNode per:Calvin; + sh:resultMessage + "Error should be in class "; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:ClassConstraintComponent; + sh:sourceShape per:PersonShape + ] +]. From ae824cf97150ec28cd3196e4d05bc45da34671df Mon Sep 17 00:00:00 2001 From: Tim Berners-Lee Date: Mon, 27 Mar 2017 00:04:09 -0400 Subject: [PATCH 07/23] Add missing path prop in results --- test/shapes/expected.ttl | 3 +++ test/shapes/result.ttl | 3 +++ 2 files changed, 6 insertions(+) diff --git a/test/shapes/expected.ttl b/test/shapes/expected.ttl index 72f1ed3..bf740db 100644 --- a/test/shapes/expected.ttl +++ b/test/shapes/expected.ttl @@ -12,6 +12,7 @@ sh:focusNode per:Alice; sh:resultMessage "Error 987-65-432A should match pattern ^\\d{3}-\\d{2}-\\d{4}$"; + sh:resultPath per:ssn; sh:resultSeverity sh:Violation; sh:sourceConstraintComponent sh:PatternConstraintComponent; sh:sourceShape per:PersonShape; @@ -22,6 +23,7 @@ sh:focusNode per:Bob; sh:resultMessage "Too many (2) on "; + sh:resultPath per:ssn; sh:resultSeverity sh:Violation; sh:sourceConstraintComponent sh:MaxCountConstraintComponent; sh:sourceShape per:PersonShape @@ -41,6 +43,7 @@ sh:focusNode per:Calvin; sh:resultMessage "Error should be in class "; + sh:resultPath per:worksFor; sh:resultSeverity sh:Violation; sh:sourceConstraintComponent sh:ClassConstraintComponent; sh:sourceShape per:PersonShape diff --git a/test/shapes/result.ttl b/test/shapes/result.ttl index 72f1ed3..bf740db 100644 --- a/test/shapes/result.ttl +++ b/test/shapes/result.ttl @@ -12,6 +12,7 @@ sh:focusNode per:Alice; sh:resultMessage "Error 987-65-432A should match pattern ^\\d{3}-\\d{2}-\\d{4}$"; + sh:resultPath per:ssn; sh:resultSeverity sh:Violation; sh:sourceConstraintComponent sh:PatternConstraintComponent; sh:sourceShape per:PersonShape; @@ -22,6 +23,7 @@ sh:focusNode per:Bob; sh:resultMessage "Too many (2) on "; + sh:resultPath per:ssn; sh:resultSeverity sh:Violation; sh:sourceConstraintComponent sh:MaxCountConstraintComponent; sh:sourceShape per:PersonShape @@ -41,6 +43,7 @@ sh:focusNode per:Calvin; sh:resultMessage "Error should be in class "; + sh:resultPath per:worksFor; sh:resultSeverity sh:Violation; sh:sourceConstraintComponent sh:ClassConstraintComponent; sh:sourceShape per:PersonShape From 0df2bfa2b0095ae07c298c37a0a72ae57f4c9c59 Mon Sep 17 00:00:00 2001 From: Tim Berners-Lee Date: Mon, 27 Mar 2017 17:10:12 -0400 Subject: [PATCH 08/23] Starting to work on some of the Validation tests, still many holes in validator --- rabel.js | 138 ++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 95 insertions(+), 43 deletions(-) diff --git a/rabel.js b/rabel.js index 3fbd48c..2cdbd6b 100755 --- a/rabel.js +++ b/rabel.js @@ -36,12 +36,20 @@ var ShapeChecker = require('./../shacl-check/src/shacl-check.js') var kb = $rdf.graph() var fetcher = $rdf.fetcher(kb) -var RDF = $rdf.Namespace('http://www.w3.org/1999/02/22-rdf-syntax-ns#') -var a = RDF('type') +const RDF = $rdf.Namespace('http://www.w3.org/1999/02/22-rdf-syntax-ns#') +const a = RDF('type') +const mf = $rdf.Namespace('http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#') +const sht = $rdf.Namespace('http://www.w3.org/ns/shacl/test-suite#') + var contentType = 'text/turtle' var reportDocument, targetDocument +var testHandlers = [] +var registerTest = function(klass, handler){ + testHandlers[klass.uri || klass] = handler +} + var check = function (ok, message, status) { if (!ok) { console.log('Failed ' + status + ': ' + message) @@ -189,14 +197,12 @@ var doNext = function (remaining) { case '-test': doc = $rdf.sym($rdf.uri.join(right, base)) console.log("Loading " + doc) - fetcher.load(doc).then(function (xhr) { + fetcher.nowOrWhenFetched(doc, {}, function(ok, message){ + if (!ok) exitMessage("Error loading tests " + doc + ": " + message) runTests(doc) doNext(remaining) - }).catch(function (e) { - console.log(e) - process.exit(1) }) - break + return case '-version': console.log('rdflib built: ' + $rdf.buildTime) @@ -208,10 +214,15 @@ var doNext = function (remaining) { process.exit(1) } } - process.exit(0) +/* + (function wait () { + if (true) setTimeout(wait, 3000); + })(); +*/ + // process.exit(0) No!!! node must wait for stuff to finish } -var statementsToTurtle = function (statements, base) { +var statementsToTurtle = function (kb, statements, base) { var sz = new $rdf.Serializer(kb) sz.suggestNamespaces(kb.namespaces) sz.setBase(base) @@ -219,57 +230,98 @@ var statementsToTurtle = function (statements, base) { return sz.statementsToN3(statements) } -var runTests = function (testDocument) { - const sht = $rdf.Namespace('http://www.w3.org/ns/shacl/test-suite#') - +var validationTest = function(test, indent){ var forwardTree = function (x) { var sts = [] var f = function (x) { var s = kb.statementsMatching(x) sts = sts.concat(s) s.forEach(function (st) { - f(st.object) + if (st.object.termType === 'BlankNode') { + f(st.object) + } }) } + f(x) + return sts } - - const mf = $rdf.Namespace('http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#') - // var context = 'In test document ' + testDocument - var runManifest = function (doc, indent) { + console.log(indent + 'Validation test ' + test) + action = kb.the(test, mf('action')) + if (!action) throw new Error("Need action") + dataGraph = kb.the(action, sht('dataGraph')) + shapesGraph = kb.the(action, sht('shapesGraph')) // A doc + actualGraph = kb.sym(test.uri + '__results') + if (!dataGraph || !shapesGraph || !actualGraph) throw new Error("Need all params") + let opts = { noResultMessage: true } // must be excludded from tests + ;(new ShapeChecker(kb, shapesGraph, dataGraph, actualGraph, opts)).execute() + + expected = kb.the(test, mf('result')) // Node + var expectedDoc = kb.statementsMatching(expected)[0].graph // whare is that data anyway? + var base = expected.doc? expected.doc().uri : dataGraph.uri + let expectedStatements = forwardTree(expected) + console.log(indent + 'Expected statements: ' + expectedStatements.length) + let expectedString = statementsToTurtle(kb, expectedStatements, expectedDoc.uri) + let actualStatements = kb.statementsMatching(null, null, null, actualGraph) + console.log(indent + 'Actual statements: ' + actualStatements.length) + let actalString = statementsToTurtle(kb, actualStatements, actualGraph.uri) + if (expectedString === actalString) { + console.log(indent + ' Match -> passed') + } else { + console.log(indent + ' -> FAILED, expected:') + let ul = '\n__________________________________________________\n' + console.log(ul + expectedString + ul + actalString + ul) + // process.exit(3) // @@ if stop on first fail + } +} +registerTest(sht('Validate'), validationTest) + +// See https://www.w3.org/TR/rdf11-testcases/ +var runTests = function (doc, indent) { + indent = indent || '' + // console.log(indent + " .... loading " + doc) + kb.fetcher.nowOrWhenFetched(doc, {}, function(ok, message){ + if (!ok) exitMessage(message) indent = indent || '' - console.log(indent + 'Manifest: ' + testDocument) - let comment = kb.anyValue(testDocument, kb.sym('http://www.w3.org/2000/01/rdf-schema#comment')) + console.log(indent + 'Manifest: ' + doc) + let comment = kb.anyValue(doc, kb.sym('http://www.w3.org/2000/01/rdf-schema#comment')) if (comment) console.log(indent + comment) var action, dataGraph, shapesGraph, expected, actualGraph - kb.each(testDocument, mf('entries')).forEach(function (test) { - if (kb.holds(test, a, sht('Validate'))) { - console.log('Validation test ' + test) - action = kb.the(test, mf('action')) - dataGraph = kb.the(action, mf('dataGraph')) - shapesGraph = kb.the(action, mf('shapesGraph')) // A doc - actualGraph = kb.sym(test.uri + '__results') - ;(new ShapeChecker(kb, shapesGraph, dataGraph, actualGraph)).execute() - - expected = kb.the(test, mf('result')) // Node - let expectedStatements = forwardTree(expected) - let expectedString = $rdf.serialize(expectedStatements) - let actalString = $rdf.serialize(actualGraph.statements) - if (expectedString === actalString) { - console.log(indent + ' -> passed') + kb.each(doc, mf('entries')).forEach(function (testList) { + console.log(indent + ' entries: ' + testList.elements.length) + testList.elements.forEach(function (test) { + console.log(indent + ' entry ' + $rdf.Util.uri.refTo(doc.uri, test.uri)) // refto + var testDoc + if (test.uri.includes('#')){ + testDoc = test.doc() } else { - console.log(indent + ' -> FAILED') - let ul = '\n__________________________________________________\n' - console.log(ul + expectedString + ul + actalString + ul) + if (test.uri.endsWith('.ttl')) { + testDoc = test + } else { + testDoc = kb.sym(test.uri + '.ttl') /// needed for shacl tests in file space + } } - } + console.log(indent + "loading... " + testDoc) + kb.fetcher.nowOrWhenFetched(testDoc, {}, function(ok, message){ + console.log(indent + "Loaded " + testDoc) + if (!ok) exitStatus(message) + var klasses = kb.each(test, a) + for (let j=0; j Date: Mon, 27 Mar 2017 18:52:07 -0400 Subject: [PATCH 09/23] Pre switch to Promises for the test harness --- rabel.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/rabel.js b/rabel.js index 2cdbd6b..425fcf1 100755 --- a/rabel.js +++ b/rabel.js @@ -150,8 +150,7 @@ var doNext = function (remaining) { console.log('shapeDoc ' + shapeDoc) fetcher.nowOrWhenFetched(shapeDoc, {}, function (ok, body, xhr) { if (!ok) { - console.log("Error loading " + doc + ": " + body) - process.exit(1) + exitMessage("Error loading " + doc + ": " + body) } else { console.log("Loaded shape file " + shapeDoc) let checker = new ShapeChecker(kb, shapeDoc, targetDocument, reportDocument) @@ -219,7 +218,7 @@ var doNext = function (remaining) { if (true) setTimeout(wait, 3000); })(); */ - // process.exit(0) No!!! node must wait for stuff to finish + process.exit(0) // No!!! node must wait for stuff to finish } var statementsToTurtle = function (kb, statements, base) { From 33050c2cad0fd99d43162f9af0b6ee78c1c88bcc Mon Sep 17 00:00:00 2001 From: Tim Berners-Lee Date: Thu, 12 Oct 2017 10:03:33 -0400 Subject: [PATCH 10/23] As used to spray iana files --- rabel.js | 246 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 161 insertions(+), 85 deletions(-) diff --git a/rabel.js b/rabel.js index 425fcf1..8cead2f 100755 --- a/rabel.js +++ b/rabel.js @@ -27,7 +27,7 @@ var helpMessage = '\n' + 'Formats are given as MIME types, such as text/turtle (default), application/rdf+xml, etc\n' + 'In input only, can parse application/xml, with smarts about IANA and GPX files.\n' + -'\n' +'\n' + 'Default base URI: ' + base + '\n' var $rdf = require('rdflib') var fs = require('fs') @@ -65,6 +65,7 @@ var exitMessage = function (message) { var doNext = function (remaining) { var loadDocument = function (right) { + var doc = $rdf.sym($rdf.uri.join(right, base)) targetDocument = targetDocument || doc // remember first doc // console.log("Document is " + targetDocument) @@ -96,7 +97,7 @@ var doNext = function (remaining) { var fileName = doc.uri.slice(7) // fs.writeFile(fileName, outText, function (err) { if (err) { - exitMessage('Error writing file <' + right + '> :' + err) + exitMessage('Error writing file ' + doc + ' :' + err) } console.log('Written ' + doc) doNext(remaining) @@ -167,8 +168,7 @@ var doNext = function (remaining) { break case '-in': - doc = $rdf.sym($rdf.uri.join(right, base)) - loadDocument(doc) + loadDocument(right) return case '-out': @@ -177,12 +177,12 @@ var doNext = function (remaining) { return case '-spray': - doc = $rdf.sym($rdf.uri.join(right, base)) // go back to folder - if (doc.uri.slice(0, 8) !== 'file:///') { + var root = $rdf.sym($rdf.uri.join(right, base)) // go back to folder + if (root.uri.slice(0, 8) !== 'file:///') { exitMessage('Can only write files just now, sorry: ' + doc.uri) } try { - spray(doc.uri) + spray(root.uri, targetDocument) } catch (e) { exitMessage('Error in spray: ' + e) } @@ -198,8 +198,13 @@ var doNext = function (remaining) { console.log("Loading " + doc) fetcher.nowOrWhenFetched(doc, {}, function(ok, message){ if (!ok) exitMessage("Error loading tests " + doc + ": " + message) - runTests(doc) - doNext(remaining) + runTests(doc).then(function(issues){ + console.log("DONE ALL TESTS. Issue array length: " + issues.length) + issues.forEach(function(issue){ + console.log(' Test: ' + issue.test) + }) + doNext(remaining) + }) }) return @@ -229,7 +234,9 @@ var statementsToTurtle = function (kb, statements, base) { return sz.statementsToN3(statements) } -var validationTest = function(test, indent){ +// Returns a promise of an issues list +var validationTest = function(test){ + const indent = ' ' var forwardTree = function (x) { var sts = [] var f = function (x) { @@ -262,64 +269,91 @@ var validationTest = function(test, indent){ let expectedString = statementsToTurtle(kb, expectedStatements, expectedDoc.uri) let actualStatements = kb.statementsMatching(null, null, null, actualGraph) console.log(indent + 'Actual statements: ' + actualStatements.length) - let actalString = statementsToTurtle(kb, actualStatements, actualGraph.uri) - if (expectedString === actalString) { + let actualString = statementsToTurtle(kb, actualStatements, actualGraph.uri) + let issues = [] + if (expectedString === actualString) { console.log(indent + ' Match -> passed') } else { console.log(indent + ' -> FAILED, expected:') let ul = '\n__________________________________________________\n' - console.log(ul + expectedString + ul + actalString + ul) - // process.exit(3) // @@ if stop on first fail + console.log(ul + expectedString + ul + actualString + ul) + issues.push({ test, expectedString, actualString, // generic + dataGraph, shapesGraph, actualGraph}) // test type specific } + return Promise.resolve(issues) } registerTest(sht('Validate'), validationTest) -// See https://www.w3.org/TR/rdf11-testcases/ -var runTests = function (doc, indent) { - indent = indent || '' - // console.log(indent + " .... loading " + doc) - kb.fetcher.nowOrWhenFetched(doc, {}, function(ok, message){ - if (!ok) exitMessage(message) - indent = indent || '' - console.log(indent + 'Manifest: ' + doc) - let comment = kb.anyValue(doc, kb.sym('http://www.w3.org/2000/01/rdf-schema#comment')) - if (comment) console.log(indent + comment) - var action, dataGraph, shapesGraph, expected, actualGraph - - kb.each(doc, mf('entries')).forEach(function (testList) { - console.log(indent + ' entries: ' + testList.elements.length) - testList.elements.forEach(function (test) { - console.log(indent + ' entry ' + $rdf.Util.uri.refTo(doc.uri, test.uri)) // refto - var testDoc - if (test.uri.includes('#')){ - testDoc = test.doc() - } else { - if (test.uri.endsWith('.ttl')) { - testDoc = test - } else { - testDoc = kb.sym(test.uri + '.ttl') /// needed for shacl tests in file space - } +// Returns promise of issues array +var doAppropriateTest = function (test){ + return new Promise(function(resolve, reject){ + console.log(' -- Do approp test for ' + test) + var testDoc + if (test.uri.includes('#')){ + testDoc = test.doc() + } else { + if (test.uri.endsWith('.ttl')) { + testDoc = test + } else { + testDoc = kb.sym(test.uri + '.ttl') /// needed for shacl tests in file space + } + } + console.log( "loading... " + testDoc) + fetcher.load(testDoc).then(function (xhr) { + var klasses = kb.each(test, a) + var ppp = [] + for (let j=0; j :" + err) - } - console.log("Written " + docURI) - doNext(remaining) + + var foo = function (fileName, out){ + var f = fileName + fs.writeFile(f, out, function (err) { + if (err) { + exitMessage("***** Error writing file <" + f + "> :" + err) + } + console.log("Written ok: " + f) }) - */ + } + + foo(fileName, out) + } } @@ -388,6 +434,7 @@ var readXML = function (targetDocument, options, callback) { var DOMParser = require('xmldom').DOMParser var doc = new DOMParser().parseFromString(data) var root = kb.sym(uri) + var nextId = 0 var justTextContent = function (ele) { var ch = ele.childNodes @@ -396,7 +443,7 @@ var readXML = function (targetDocument, options, callback) { for (let i = 0; i < ch.length; i++) { if (ch[i].nodeType !== 3) { if (ch.length > 1 && options.iana && ch[i].nodeType === 1 && ch[i].nodeName === 'xref') { - text += ' ' + ch[i].attributes.getNamedItem('data').nodeValue + ' ' + text += ' ' + ch[i].getAttribute('data') + ' ' } else { return false } @@ -415,6 +462,10 @@ var readXML = function (targetDocument, options, callback) { return text } + var randomNamedNode = function(){ + return kb.sym(root.uri + '#n' + (nextId++)) + } + // ///////////////////////// GPX SPECIAL var GPX_predicateMap = { @@ -430,10 +481,11 @@ var readXML = function (targetDocument, options, callback) { var IANA_predicateMap = { created: { uri: 'http://purl.org/dc/terms/created', - type: 'http://www.w3.org/2001/XMLSchema#date' }, // @@CHECK + type: 'http://www.w3.org/2001/XMLSchema#date' }, // @@CHECK date: { uri: 'http://purl.org/dc/terms/date', - type: 'http://www.w3.org/2001/XMLSchema#date' }, // @@CHECK + type: 'http://www.w3.org/2001/XMLSchema#date' }, // @@CHECK description: { uri: 'http://purl.org/dc/terms/description' }, // @@CHECK + title: { uri: 'http://purl.org/dc/terms/title' }, value: { uri: 'http://www.w3.org/2000/01/rdf-schema#label' }, note: { uri: 'http://www.w3.org/2000/01/rdf-schema#comment' } } @@ -484,7 +536,8 @@ var readXML = function (targetDocument, options, callback) { return kb.sym(local + localid) } } - /* + /* Data looks like: + vnd.ascii-art text/vnd.ascii-art @@ -492,8 +545,25 @@ var readXML = function (targetDocument, options, callback) { */ for (let i = 0; i < ch.length; i++) { var child = ch[i] - if (child.nodeName === 'file' && child.attributes && child.attributes.getNamedItem('type')) { - return kb.sym($rdf.uri.join(child.textContent, local) + '#') + if (child.nodeName === 'file' && child.attributes && child.getAttribute('type')) { + return kb.sym($rdf.uri.join(child.textContent, local) + '#Resource') + } + } + /* Data looks like: + + rfc822 + + + + */ + let parent = ele.parentNode + // console.log('@@ 3 magicIANAsubject tag: ' + ele.tagName + ' parent: ' + parent.tagName ) + if (ele.tagName === 'record' && parent.tagName === 'registry') { + for (let i = 0; i < ch.length; i++) { + var child = ch[i] + if (child.nodeName === 'name') { + return kb.sym($rdf.uri.join(parent.getAttribute('id') + '/' + child.textContent, local) + '#Resource') + } } } return null @@ -560,30 +630,33 @@ var readXML = function (targetDocument, options, callback) { if (child.nodeType === 3) { // text obj = child.nodeValue.trim() // @@ optional if (obj.length !== 0) { - console.log($rdf.lit(obj, undefined, type)) + // console.log($rdf.lit(obj, undefined, type)) kb.add(subject, kb.sym(ns + ele.nodeName), $rdf.lit(obj, undefined, type), targetDocument) // console.log(indent + 'actual text ' + obj) } else { // console.log(indent + 'whitespace') } } else if (!(child.nodeType in ignore)) { + console.log(indent + '-> ' + child.tagName) var txt = justTextContent(child) if (txt !== false) { if (txt.length > 0) { kb.add(subject, pred, $rdf.lit(txt, undefined, type), targetDocument) - // console.log($rdf.lit(txt, undefined, type)) } } else if (options.iana && magicIANAxref(child, local)) { kb.add(subject, kb.sym(ns + child.nodeName), magicIANAxref(child, local), targetDocument) console.log(indent + 'Magic IANA xref ' + child.nodeName + ': ' + magicIANAxref(child, local)) } else { - if (child.attributes && child.attributes.getNamedItem('id')) { + if (child.attributes && child.getAttribute('id')) { if (options.iana && child.nodeName === 'person') { - obj = kb.sym($rdf.uri.join('../person/', local) + - child.attributes.getNamedItem('id').nodeValue + '#') + let who = child.getAttribute('id') + if (!who) throw new Error("Person has no ID") + obj = kb.sym($rdf.uri.join('../person/', local) + who + '#') console.log(indent + 'Person is ' + obj) } else { - obj = kb.sym(local + child.attributes.getNamedItem('id').nodeValue) + let who = child.getAttribute('id') + if (!who) throw new Error("Thing has no ID") + obj = kb.sym(local + child.getAttribute('id')) console.log(indent + 'Local thing is ' + obj) } } else if (options.iana && magicIANAsubject(child, local)) { @@ -591,7 +664,13 @@ var readXML = function (targetDocument, options, callback) { console.log(indent + 'Magic IANA URI ' + obj) // kb.add(obj, RDF('type'), RDF('Property') , targetDocument) } else { - obj = kb.bnode() + if (options.iana && child.nodeName === 'uri'){ + obj = kb.sym(justTextContent(child)) + } else if (options.iana && child.nodeName === 'people') { + obj = randomNamedNode() + } else { + obj = kb.bnode() + } } kb.add(subject, pred, obj, targetDocument) convert(child, obj, indent + ' ') @@ -607,7 +686,4 @@ var readXML = function (targetDocument, options, callback) { doNext(process.argv.slice(2)) -// {'forceContentType': 'application/rdfa'} - -// http://melvincarvalho.com/ -// http://schema.org/ +// ends From 5f605eb98d93720598859766dc6f9a727303f721 Mon Sep 17 00:00:00 2001 From: Tim Berners-Lee Date: Thu, 12 Oct 2017 10:58:21 -0400 Subject: [PATCH 11/23] 0.3.2 --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index cd24874..df34353 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "rabel", "description": "Linked Data command line utility", - "version": "0.3.1", + "version": "0.3.2", "author": { "name": "Tim Berners-Lee", "email": "timbl@w3.org" @@ -22,7 +22,6 @@ "bin": { "rabel": "rabel.js" }, - "devDependencies": {}, "main": "rabel.js" } From b9cd2c2bfcdd2f30acc0bd1366d6358e787e024b Mon Sep 17 00:00:00 2001 From: Tim Berners-Lee Date: Thu, 12 Oct 2017 11:04:03 -0400 Subject: [PATCH 12/23] doc --- README.md | 10 +++++++--- rabel.js | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index a36fb57..2b4e668 100644 --- a/README.md +++ b/README.md @@ -10,14 +10,18 @@ To install, Commands look like unix options are executed *in order* from left to right. They include: ``` --base=rrrr Set the current base URI (relative URI) +-base=rrrr Set the current base URI (relative URI, default is file:///$PWD) -clear Clear the current store --dump Serialize the store in current content-type to the console +-dump Serialize the current store in current content type -format=cccc Set the current content-type -help This message -in=uri Load a web resource or file -out=filename Output in the current content type --size Give the current store size in triples +-report=file set the report file destination for future validation +-size Give the current store +-spray=base Write out linked data to lots of different linked files CAREFUL! +-test=manifest Run tests as described in the test manifest +-validate=shapeFile Run a SHACL validator on the data loaded by previous in=x -version Give the version of this program ``` diff --git a/rabel.js b/rabel.js index 8cead2f..319fb4e 100755 --- a/rabel.js +++ b/rabel.js @@ -18,7 +18,7 @@ var helpMessage = '-help This message \n' + '-in=uri Load a web resource or file\n' + '-out=filename Output in eth current content type\n' + -'-report=file set the report file desiation for future validation\n' + +'-report=file set the report file destination for future validation\n' + '-size Give the current store\n' + '-spray=base Write out linked data to lots of different linked files CAREFUL!\n' + '-test=manifest Run tests as described in the test manifest\n' + From b774dfbe779253cb588075f59646580219d6f57e Mon Sep 17 00:00:00 2001 From: Tim Berners-Lee Date: Thu, 12 Oct 2017 11:04:48 -0400 Subject: [PATCH 13/23] 1.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index df34353..185a05e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "rabel", "description": "Linked Data command line utility", - "version": "0.3.2", + "version": "1.0.0", "author": { "name": "Tim Berners-Lee", "email": "timbl@w3.org" From e5db665b080b9d82611ed9cdb32eab7fe917843a Mon Sep 17 00:00:00 2001 From: Eric Prud'hommeaux Date: Tue, 24 Oct 2017 09:07:52 -0400 Subject: [PATCH 14/23] + FHIR Observation example --- package.json | 1 + rabel.js | 11 +- .../observation-example-bloodpressure.ttl | 159 ++++++++++++++++++ test/pwn-FHIR.sh | 5 + 4 files changed, 171 insertions(+), 5 deletions(-) create mode 100644 test/named-resources/observation-example-bloodpressure.ttl create mode 100755 test/pwn-FHIR.sh diff --git a/package.json b/package.json index 185a05e..d125da4 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "bugs": "http://github.com/linkeddata/rabel/issues", "dependencies": { "rdflib": "^0.15.0", + "fs-extra": "^4.0.2", "shacl-check": "^0.0.1", "xmldom": "^0.1.22" }, diff --git a/rabel.js b/rabel.js index 319fb4e..77ce8ec 100755 --- a/rabel.js +++ b/rabel.js @@ -31,7 +31,9 @@ var helpMessage = var $rdf = require('rdflib') var fs = require('fs') -var ShapeChecker = require('./../shacl-check/src/shacl-check.js') +var ensurePath = require('fs-extra').ensureDirSync +var path = require('path') +// var ShapeChecker = require('./../shacl-check/src/shacl-check.js') var kb = $rdf.graph() var fetcher = $rdf.fetcher(kb) @@ -164,6 +166,7 @@ var doNext = function (remaining) { return case '-help': + case '--help': console.log(helpMessage) break @@ -178,9 +181,6 @@ var doNext = function (remaining) { case '-spray': var root = $rdf.sym($rdf.uri.join(right, base)) // go back to folder - if (root.uri.slice(0, 8) !== 'file:///') { - exitMessage('Can only write files just now, sorry: ' + doc.uri) - } try { spray(root.uri, targetDocument) } catch (e) { @@ -364,7 +364,7 @@ var runTests = function (doc) { var spray = function (rootURI, original, doubleLinked) { var docs = [] - console.log('Spray: Root is ' + rootURI) + console.log('Spray: Stripping ' + rootURI + ' from ' + original.value) var docURI var check = function (x) { // console.log('check x= ' + x) @@ -400,6 +400,7 @@ var spray = function (rootURI, original, doubleLinked) { var foo = function (fileName, out){ var f = fileName + ensurePath(path.dirname(f)) fs.writeFile(f, out, function (err) { if (err) { exitMessage("***** Error writing file <" + f + "> :" + err) diff --git a/test/named-resources/observation-example-bloodpressure.ttl b/test/named-resources/observation-example-bloodpressure.ttl new file mode 100644 index 0000000..ea3eac0 --- /dev/null +++ b/test/named-resources/observation-example-bloodpressure.ttl @@ -0,0 +1,159 @@ +@prefix fhir: . +@prefix loinc: . +@prefix owl: . +@prefix rdfs: . +@prefix sct: . +@prefix xsd: . + +# - resource ------------------------------------------------------------------- + + a fhir:Observation; + fhir:nodeRole fhir:treeRoot; + fhir:Resource-id [ fhir:value "blood-pressure"]; + fhir:Resource-meta [ + fhir:Meta-profile [ + fhir:value "http://hl7.org/fhir/StructureDefinition/vitalsigns"; + fhir:index 0 + ] + ]; + fhir:DomainResource-text [ + fhir:Narrative-status [ fhir:value "generated" ]; + fhir:Narrative-div "

Generated Narrative with Details

id: blood-pressure

meta:

identifier: urn:uuid:187e0c12-8dd2-67e2-99b2-bf273c878281

basedOn:

status: final

category: Vital Signs (Details : {http://hl7.org/fhir/observation-category code 'vital-signs' = 'Vital Signs', given as 'Vital Signs'})

code: Blood pressure systolic & diastolic (Details : {LOINC code '85354-9' = 'lood pressure panel with all children optional', given as 'Bood pressure panel with all children optional'})

subject: Patient/example

effective: 17/09/2012

performer: Practitioner/example

interpretation: Below low normal (Details : {http://hl7.org/fhir/v2/0078 code 'L' = 'Low', given as 'low'})

bodySite: Right arm (Details : {SNOMED CT code '368209003' = 'Right upper arm', given as 'Right arm'})

component

code: Systolic blood pressure (Details : {LOINC code '8480-6' = 'Systolic blood pressure', given as 'Systolic blood pressure'}; {SNOMED CT code '271649006' = 'Systolic blood pressure', given as 'Systolic blood pressure'}; {http://acme.org/devices/clinical-codes code 'bp-s' = 'bp-s', given as 'Systolic Blood pressure'})

value: 107 mmHg (Details: UCUM code mm[Hg] = 'mmHg')

interpretation: Normal (Details : {http://hl7.org/fhir/v2/0078 code 'N' = 'Normal', given as 'normal'})

component

code: Diastolic blood pressure (Details : {LOINC code '8462-4' = 'Diastolic blood pressure', given as 'Diastolic blood pressure'})

value: 60 mmHg (Details: UCUM code mm[Hg] = 'mmHg')

interpretation: Below low normal (Details : {http://hl7.org/fhir/v2/0078 code 'L' = 'Low', given as 'low'})

" + ]; + fhir:Observation-identifier [ + fhir:index 0; + fhir:Identifier-system [ fhir:value "urn:ietf:rfc:3986" ]; + fhir:Identifier-value [ fhir:value "urn:uuid:187e0c12-8dd2-67e2-99b2-bf273c878281" ] + ]; + fhir:Observation-basedOn [ + fhir:index 0; + fhir:Reference-identifier [ + fhir:Identifier-system [ fhir:value "https://acme.org/identifiers" ]; + fhir:Identifier-value [ fhir:value "1234" ] + ] + ]; + fhir:Observation-status [ fhir:value "final"]; + fhir:Observation-category [ + fhir:index 0; + fhir:CodeableConcept-coding [ + fhir:index 0; + fhir:Coding-system [ fhir:value "http://hl7.org/fhir/observation-category" ]; + fhir:Coding-code [ fhir:value "vital-signs" ]; + fhir:Coding-display [ fhir:value "Vital Signs" ] + ] + ]; + fhir:Observation-code [ + fhir:CodeableConcept-coding [ + fhir:index 0; + a loinc:85354-9; + fhir:Coding-system [ fhir:value "http://loinc.org" ]; + fhir:Coding-code [ fhir:value "85354-9" ]; + fhir:Coding-display [ fhir:value "Bood pressure panel with all children optional" ] + ]; + fhir:CodeableConcept-text [ fhir:value "Blood pressure systolic & diastolic" ] + ]; + fhir:Observation-subject [ + fhir:link ; + fhir:Reference-reference [ fhir:value "Patient/example" ] + ]; + fhir:Observation-effectiveDateTime [ fhir:value "2012-09-17"^^xsd:date]; + fhir:Observation-performer [ + fhir:index 0; + fhir:link ; + fhir:Reference-reference [ fhir:value "Practitioner/example" ] + ]; + fhir:Observation-interpretation [ + fhir:CodeableConcept-coding [ + fhir:index 0; + fhir:Coding-system [ fhir:value "http://hl7.org/fhir/v2/0078" ]; + fhir:Coding-code [ fhir:value "L" ]; + fhir:Coding-display [ fhir:value "low" ] + ]; + fhir:CodeableConcept-text [ fhir:value "Below low normal" ] + ]; + fhir:Observation-bodySite [ + fhir:CodeableConcept-coding [ + fhir:index 0; + a sct:368209003; + fhir:Coding-system [ fhir:value "http://snomed.info/sct" ]; + fhir:Coding-code [ fhir:value "368209003" ]; + fhir:Coding-display [ fhir:value "Right arm" ] + ] + ]; + fhir:Observation-component [ + fhir:index 0; + fhir:Observation-component-code [ + fhir:CodeableConcept-coding [ + fhir:index 0; + a loinc:8480-6; + fhir:Coding-system [ fhir:value "http://loinc.org" ]; + fhir:Coding-code [ fhir:value "8480-6" ]; + fhir:Coding-display [ fhir:value "Systolic blood pressure" ] + ], [ + fhir:index 1; + a sct:271649006; + fhir:Coding-system [ fhir:value "http://snomed.info/sct" ]; + fhir:Coding-code [ fhir:value "271649006" ]; + fhir:Coding-display [ fhir:value "Systolic blood pressure" ] + ], [ + fhir:index 2; + fhir:Coding-system [ fhir:value "http://acme.org/devices/clinical-codes" ]; + fhir:Coding-code [ fhir:value "bp-s" ]; + fhir:Coding-display [ fhir:value "Systolic Blood pressure" ] + ] + ]; + fhir:Observation-component-valueQuantity [ + fhir:Quantity-value [ fhir:value "107"^^xsd:decimal ]; + fhir:Quantity-unit [ fhir:value "mmHg" ]; + fhir:Quantity-system [ fhir:value "http://unitsofmeasure.org" ]; + fhir:Quantity-code [ fhir:value "mm[Hg]" ] + ]; + fhir:Observation-component-interpretation [ + fhir:CodeableConcept-coding [ + fhir:index 0; + fhir:Coding-system [ fhir:value "http://hl7.org/fhir/v2/0078" ]; + fhir:Coding-code [ fhir:value "N" ]; + fhir:Coding-display [ fhir:value "normal" ] + ]; + fhir:CodeableConcept-text [ fhir:value "Normal" ] + ] + ], [ + fhir:index 1; + fhir:Observation-component-code [ + fhir:CodeableConcept-coding [ + fhir:index 0; + a loinc:8462-4; + fhir:Coding-system [ fhir:value "http://loinc.org" ]; + fhir:Coding-code [ fhir:value "8462-4" ]; + fhir:Coding-display [ fhir:value "Diastolic blood pressure" ] + ] + ]; + fhir:Observation-component-valueQuantity [ + fhir:Quantity-value [ fhir:value "60"^^xsd:decimal ]; + fhir:Quantity-unit [ fhir:value "mmHg" ]; + fhir:Quantity-system [ fhir:value "http://unitsofmeasure.org" ]; + fhir:Quantity-code [ fhir:value "mm[Hg]" ] + ]; + fhir:Observation-component-interpretation [ + fhir:CodeableConcept-coding [ + fhir:index 0; + fhir:Coding-system [ fhir:value "http://hl7.org/fhir/v2/0078" ]; + fhir:Coding-code [ fhir:value "L" ]; + fhir:Coding-display [ fhir:value "low" ] + ]; + fhir:CodeableConcept-text [ fhir:value "Below low normal" ] + ] + ] . + + a fhir:Patient . + + a fhir:Practitioner . + +# - ontology header ------------------------------------------------------------ + + a owl:Ontology; + owl:imports fhir:fhir-ttl; + owl:versionIRI . + +# ------------------------------------------------------------------------------------- + diff --git a/test/pwn-FHIR.sh b/test/pwn-FHIR.sh new file mode 100755 index 0000000..ce6e866 --- /dev/null +++ b/test/pwn-FHIR.sh @@ -0,0 +1,5 @@ +echo from-file/ +mkdir -p from-file/ && (cd from-file/ && ../../rabel.js -in=../named-resources/observation-example-bloodpressure.ttl -spray=http://hl7.org/fhir/) + +echo from-http/ +mkdir -p from-http/ && (cd from-http/ && ../../rabel.js -in=http://build.fhir.org/observation-example.ttl -spray=http://hl7.org/fhir/) From 414cfbd2b7e000b4bf7c1b388dfdc24c674c6b15 Mon Sep 17 00:00:00 2001 From: Eric Prud'hommeaux Date: Tue, 24 Oct 2017 09:15:58 -0400 Subject: [PATCH 15/23] + test output --- test/from-file/hl7.org/fhir/Observation.ttl | 4 + .../fhir/Observation/blood-pressure.ttl | 192 ++++++++++++++++++ .../fhir/Observation/blood-pressure.ttl.ttl | 9 + test/from-file/hl7.org/fhir/Patient.ttl | 4 + .../hl7.org/fhir/Patient/example.ttl | 11 + test/from-file/hl7.org/fhir/Practitioner.ttl | 4 + .../hl7.org/fhir/Practitioner/example.ttl | 13 ++ .../STU3/Observation/blood-pressure.ttl.ttl | 3 + test/from-file/hl7.org/fhir/fhir-ttl.ttl | 4 + test/from-file/hl7.org/fhir/treeRoot.ttl | 4 + test/from-file/obs.ntriples | 167 +++++++++++++++ test/from-http/hl7.org/fhir/Observation.ttl | 6 + .../hl7.org/fhir/Observation/example.ttl | 6 + test/from-http/hl7.org/fhir/treeRoot.ttl | 6 + test/pwn-FHIR.sh | 7 +- test/pwn-FHIR.stats | 15 ++ 16 files changed, 453 insertions(+), 2 deletions(-) create mode 100644 test/from-file/hl7.org/fhir/Observation.ttl create mode 100644 test/from-file/hl7.org/fhir/Observation/blood-pressure.ttl create mode 100644 test/from-file/hl7.org/fhir/Observation/blood-pressure.ttl.ttl create mode 100644 test/from-file/hl7.org/fhir/Patient.ttl create mode 100644 test/from-file/hl7.org/fhir/Patient/example.ttl create mode 100644 test/from-file/hl7.org/fhir/Practitioner.ttl create mode 100644 test/from-file/hl7.org/fhir/Practitioner/example.ttl create mode 100644 test/from-file/hl7.org/fhir/STU3/Observation/blood-pressure.ttl.ttl create mode 100644 test/from-file/hl7.org/fhir/fhir-ttl.ttl create mode 100644 test/from-file/hl7.org/fhir/treeRoot.ttl create mode 100644 test/from-file/obs.ntriples create mode 100644 test/from-http/hl7.org/fhir/Observation.ttl create mode 100644 test/from-http/hl7.org/fhir/Observation/example.ttl create mode 100644 test/from-http/hl7.org/fhir/treeRoot.ttl create mode 100644 test/pwn-FHIR.stats diff --git a/test/from-file/hl7.org/fhir/Observation.ttl b/test/from-file/hl7.org/fhir/Observation.ttl new file mode 100644 index 0000000..6cf06f0 --- /dev/null +++ b/test/from-file/hl7.org/fhir/Observation.ttl @@ -0,0 +1,4 @@ +@prefix fhir: <./>. +@prefix Obs: . + + Obs:blood-pressure a fhir:Observation . diff --git a/test/from-file/hl7.org/fhir/Observation/blood-pressure.ttl b/test/from-file/hl7.org/fhir/Observation/blood-pressure.ttl new file mode 100644 index 0000000..32a3483 --- /dev/null +++ b/test/from-file/hl7.org/fhir/Observation/blood-pressure.ttl @@ -0,0 +1,192 @@ +@prefix fhir: <../>. +@prefix Obs: <./>. +@prefix id: . +@prefix owl: . +@prefix XML: . +@prefix Pr: <../Practitioner/>. +@prefix P: <../Patient/>. + +Obs:blood-pressure + fhir:DomainResource-text + [ fhir:Narrative-div + """

Generated Narrative with Details

id: blood-pressure

meta:

identifier: urn:uuid:187e0c12-8dd2-67e2-99b2-bf273c878281

basedOn:

status: final

category: Vital Signs (Details : {http://hl7.org/fhir/observation-category code 'vital-signs' = 'Vital Signs', given as 'Vital Signs'})

code: Blood pressure systolic & diastolic (Details : {LOINC code '85354-9' = 'lood pressure panel with all children optional', given as 'Bood pressure panel with all children optional'})

subject: Patient/example

effective: 17/09/2012

performer: Practitioner/example

interpretation: Below low normal (Details : {http://hl7.org/fhir/v2/0078 code 'L' = 'Low', given as 'low'})

bodySite: Right arm (Details : {SNOMED CT code '368209003' = 'Right upper arm', given as 'Right arm'})

component

code: Systolic blood pressure (Details : {LOINC code '8480-6' = 'Systolic blood pressure', given as 'Systolic blood pressure'}; {SNOMED CT code '271649006' = 'Systolic blood pressure', given as 'Systolic blood pressure'}; {http://acme.org/devices/clinical-codes code 'bp-s' = 'bp-s', given as 'Systolic Blood pressure'})

value: 107 mmHg (Details: UCUM code mm[Hg] = 'mmHg')

interpretation: Normal (Details : {http://hl7.org/fhir/v2/0078 code 'N' = 'Normal', given as 'normal'})

component

code: Diastolic blood pressure (Details : {LOINC code '8462-4' = 'Diastolic blood pressure', given as 'Diastolic blood pressure'})

value: 60 mmHg (Details: UCUM code mm[Hg] = 'mmHg')

interpretation: Below low normal (Details : {http://hl7.org/fhir/v2/0078 code 'L' = 'Low', given as 'low'})

"""; + fhir:Narrative-status + [ fhir:value "generated" ] ]; + fhir:Observation-basedOn + [ fhir:Reference-identifier + [ fhir:Identifier-system + [ fhir:value "https://acme.org/identifiers" ]; + fhir:Identifier-value + [ fhir:value "1234" ] ]; + fhir:index + 0 ]; + fhir:Observation-bodySite + [ fhir:CodeableConcept-coding + [ fhir:Coding-code + [ fhir:value "368209003" ]; + fhir:Coding-display + [ fhir:value "Right arm" ]; + fhir:Coding-system + [ fhir:value "http://snomed.info/sct" ]; + fhir:index + 0; + a id:368209003 ] ]; + fhir:Observation-category + [ fhir:CodeableConcept-coding + [ fhir:Coding-code + [ fhir:value "vital-signs" ]; + fhir:Coding-display + [ fhir:value "Vital Signs" ]; + fhir:Coding-system + [ fhir:value "http://hl7.org/fhir/observation-category" ]; + fhir:index + 0 ]; + fhir:index + 0 ]; + fhir:Observation-code + [ fhir:CodeableConcept-coding + [ fhir:Coding-code + [ fhir:value "85354-9" ]; + fhir:Coding-display + [ fhir:value + "Bood pressure panel with all children optional" ]; + fhir:Coding-system + [ fhir:value "http://loinc.org" ]; + fhir:index + 0; + a owl:85354-9 ]; + fhir:CodeableConcept-text + [ fhir:value "Blood pressure systolic & diastolic" ] ]; + fhir:Observation-component + [ fhir:Observation-component-code + [ fhir:CodeableConcept-coding + [ fhir:Coding-code + [ fhir:value "8480-6" ]; + fhir:Coding-display + [ fhir:value "Systolic blood pressure" ]; + fhir:Coding-system + [ fhir:value "http://loinc.org" ]; + fhir:index + 0; + a owl:8480-6 ], + [ fhir:Coding-code + [ fhir:value "271649006" ]; + fhir:Coding-display + [ fhir:value "Systolic blood pressure" ]; + fhir:Coding-system + [ fhir:value "http://snomed.info/sct" ]; + fhir:index + 1; + a id:271649006 ], + [ fhir:Coding-code + [ fhir:value "bp-s" ]; + fhir:Coding-display + [ fhir:value "Systolic Blood pressure" ]; + fhir:Coding-system + [ fhir:value + "http://acme.org/devices/clinical-codes" ]; + fhir:index + 2 ] ]; + fhir:Observation-component-interpretation + [ fhir:CodeableConcept-coding + [ fhir:Coding-code + [ fhir:value "N" ]; + fhir:Coding-display + [ fhir:value "normal" ]; + fhir:Coding-system + [ fhir:value "http://hl7.org/fhir/v2/0078" ]; + fhir:index + 0 ]; + fhir:CodeableConcept-text + [ fhir:value "Normal" ] ]; + fhir:Observation-component-valueQuantity + [ fhir:Quantity-code + [ fhir:value "mm[Hg]" ]; + fhir:Quantity-system + [ fhir:value "http://unitsofmeasure.org" ]; + fhir:Quantity-unit + [ fhir:value "mmHg" ]; + fhir:Quantity-value + [ fhir:value "107"^^XML:decimal ] ]; + fhir:index + 0 ], + [ fhir:Observation-component-code + [ fhir:CodeableConcept-coding + [ fhir:Coding-code + [ fhir:value "8462-4" ]; + fhir:Coding-display + [ fhir:value "Diastolic blood pressure" ]; + fhir:Coding-system + [ fhir:value "http://loinc.org" ]; + fhir:index + 0; + a owl:8462-4 ] ]; + fhir:Observation-component-interpretation + [ fhir:CodeableConcept-coding + [ fhir:Coding-code + [ fhir:value "L" ]; + fhir:Coding-display + [ fhir:value "low" ]; + fhir:Coding-system + [ fhir:value "http://hl7.org/fhir/v2/0078" ]; + fhir:index + 0 ]; + fhir:CodeableConcept-text + [ fhir:value "Below low normal" ] ]; + fhir:Observation-component-valueQuantity + [ fhir:Quantity-code + [ fhir:value "mm[Hg]" ]; + fhir:Quantity-system + [ fhir:value "http://unitsofmeasure.org" ]; + fhir:Quantity-unit + [ fhir:value "mmHg" ]; + fhir:Quantity-value + [ fhir:value "60"^^XML:decimal ] ]; + fhir:index + 1 ]; + fhir:Observation-effectiveDateTime + [ fhir:value "2012-09-17"^^XML:date ]; + fhir:Observation-identifier + [ fhir:Identifier-system + [ fhir:value "urn:ietf:rfc:3986" ]; + fhir:Identifier-value + [ fhir:value "urn:uuid:187e0c12-8dd2-67e2-99b2-bf273c878281" ]; + fhir:index + 0 ]; + fhir:Observation-interpretation + [ fhir:CodeableConcept-coding + [ fhir:Coding-code + [ fhir:value "L" ]; + fhir:Coding-display + [ fhir:value "low" ]; + fhir:Coding-system + [ fhir:value "http://hl7.org/fhir/v2/0078" ]; + fhir:index + 0 ]; + fhir:CodeableConcept-text + [ fhir:value "Below low normal" ] ]; + fhir:Observation-performer + [ fhir:Reference-reference + [ fhir:value "Practitioner/example" ]; + fhir:index + 0; + fhir:link + Pr:example ]; + fhir:Observation-status + [ fhir:value "final" ]; + fhir:Observation-subject + [ fhir:Reference-reference + [ fhir:value "Patient/example" ]; + fhir:link + P:example ]; + fhir:Resource-id + [ fhir:value "blood-pressure" ]; + fhir:Resource-meta + [ fhir:Meta-profile + [ fhir:index + 0; + fhir:value + "http://hl7.org/fhir/StructureDefinition/vitalsigns" ] ]; + fhir:nodeRole + fhir:treeRoot; + a fhir:Observation. diff --git a/test/from-file/hl7.org/fhir/Observation/blood-pressure.ttl.ttl b/test/from-file/hl7.org/fhir/Observation/blood-pressure.ttl.ttl new file mode 100644 index 0000000..baa852f --- /dev/null +++ b/test/from-file/hl7.org/fhir/Observation/blood-pressure.ttl.ttl @@ -0,0 +1,9 @@ +@prefix fhir: <../>. +@prefix owl: . + +<> + a owl:Ontology; + owl:imports + fhir:fhir-ttl; + owl:versionIRI + <../STU3/Observation/blood-pressure.ttl>. diff --git a/test/from-file/hl7.org/fhir/Patient.ttl b/test/from-file/hl7.org/fhir/Patient.ttl new file mode 100644 index 0000000..a4720c6 --- /dev/null +++ b/test/from-file/hl7.org/fhir/Patient.ttl @@ -0,0 +1,4 @@ +@prefix fhir: <./>. +@prefix P: . + + P:example a fhir:Patient . diff --git a/test/from-file/hl7.org/fhir/Patient/example.ttl b/test/from-file/hl7.org/fhir/Patient/example.ttl new file mode 100644 index 0000000..1331137 --- /dev/null +++ b/test/from-file/hl7.org/fhir/Patient/example.ttl @@ -0,0 +1,11 @@ +@prefix fhir: <../>. +@prefix P: <./>. +@prefix Obs: <../Observation/>. + + P:example a fhir:Patient . +Obs:blood-pressure + fhir:Observation-subject + [ fhir:Reference-reference + [ fhir:value "Patient/example" ]; + fhir:link + P:example ]. diff --git a/test/from-file/hl7.org/fhir/Practitioner.ttl b/test/from-file/hl7.org/fhir/Practitioner.ttl new file mode 100644 index 0000000..d2d4b25 --- /dev/null +++ b/test/from-file/hl7.org/fhir/Practitioner.ttl @@ -0,0 +1,4 @@ +@prefix fhir: <./>. +@prefix Pr: . + + Pr:example a fhir:Practitioner . diff --git a/test/from-file/hl7.org/fhir/Practitioner/example.ttl b/test/from-file/hl7.org/fhir/Practitioner/example.ttl new file mode 100644 index 0000000..c02dde5 --- /dev/null +++ b/test/from-file/hl7.org/fhir/Practitioner/example.ttl @@ -0,0 +1,13 @@ +@prefix fhir: <../>. +@prefix Pr: <./>. +@prefix Obs: <../Observation/>. + + Pr:example a fhir:Practitioner . +Obs:blood-pressure + fhir:Observation-performer + [ fhir:Reference-reference + [ fhir:value "Practitioner/example" ]; + fhir:index + 0; + fhir:link + Pr:example ]. diff --git a/test/from-file/hl7.org/fhir/STU3/Observation/blood-pressure.ttl.ttl b/test/from-file/hl7.org/fhir/STU3/Observation/blood-pressure.ttl.ttl new file mode 100644 index 0000000..e3ec06f --- /dev/null +++ b/test/from-file/hl7.org/fhir/STU3/Observation/blood-pressure.ttl.ttl @@ -0,0 +1,3 @@ +@prefix owl: . + + <../../Observation/blood-pressure.ttl> owl:versionIRI <> . diff --git a/test/from-file/hl7.org/fhir/fhir-ttl.ttl b/test/from-file/hl7.org/fhir/fhir-ttl.ttl new file mode 100644 index 0000000..a21891c --- /dev/null +++ b/test/from-file/hl7.org/fhir/fhir-ttl.ttl @@ -0,0 +1,4 @@ +@prefix fhir: <./>. +@prefix owl: . + + owl:imports fhir:fhir-ttl . diff --git a/test/from-file/hl7.org/fhir/treeRoot.ttl b/test/from-file/hl7.org/fhir/treeRoot.ttl new file mode 100644 index 0000000..2d891d5 --- /dev/null +++ b/test/from-file/hl7.org/fhir/treeRoot.ttl @@ -0,0 +1,4 @@ +@prefix fhir: <./>. +@prefix Obs: . + + Obs:blood-pressure fhir:nodeRole fhir:treeRoot . diff --git a/test/from-file/obs.ntriples b/test/from-file/obs.ntriples new file mode 100644 index 0000000..5cd2851 --- /dev/null +++ b/test/from-file/obs.ntriples @@ -0,0 +1,167 @@ + . + . +_:b0x2b99670 "blood-pressure" . + _:b0x2b99670 . +_:b0x2b9c4e0 "http://hl7.org/fhir/StructureDefinition/vitalsigns" . +_:b0x2b9c4e0 0 . +_:b0x2b9bd90 _:b0x2b9c4e0 . + _:b0x2b9bd90 . +_:b0x2b9d4a0 "generated" . +_:b0x2b9c5f0 _:b0x2b9d4a0 . +_:b0x2b9c5f0 "

Generated Narrative with Details

id: blood-pressure

meta:

identifier: urn:uuid:187e0c12-8dd2-67e2-99b2-bf273c878281

basedOn:

status: final

category: Vital Signs (Details : {http://hl7.org/fhir/observation-category code 'vital-signs' = 'Vital Signs', given as 'Vital Signs'})

code: Blood pressure systolic & diastolic (Details : {LOINC code '85354-9' = 'lood pressure panel with all children optional', given as 'Bood pressure panel with all children optional'})

subject: Patient/example

effective: 17/09/2012

performer: Practitioner/example

interpretation: Below low normal (Details : {http://hl7.org/fhir/v2/0078 code 'L' = 'Low', given as 'low'})

bodySite: Right arm (Details : {SNOMED CT code '368209003' = 'Right upper arm', given as 'Right arm'})

component

code: Systolic blood pressure (Details : {LOINC code '8480-6' = 'Systolic blood pressure', given as 'Systolic blood pressure'}; {SNOMED CT code '271649006' = 'Systolic blood pressure', given as 'Systolic blood pressure'}; {http://acme.org/devices/clinical-codes code 'bp-s' = 'bp-s', given as 'Systolic Blood pressure'})

value: 107 mmHg (Details: UCUM code mm[Hg] = 'mmHg')

interpretation: Normal (Details : {http://hl7.org/fhir/v2/0078 code 'N' = 'Normal', given as 'normal'})

component

code: Diastolic blood pressure (Details : {LOINC code '8462-4' = 'Diastolic blood pressure', given as 'Diastolic blood pressure'})

value: 60 mmHg (Details: UCUM code mm[Hg] = 'mmHg')

interpretation: Below low normal (Details : {http://hl7.org/fhir/v2/0078 code 'L' = 'Low', given as 'low'})

" . + _:b0x2b9c5f0 . +_:b0x2ba4170 0 . +_:b0x2ba4370 "urn:ietf:rfc:3986" . +_:b0x2ba4170 _:b0x2ba4370 . +_:b0x2ba45b0 "urn:uuid:187e0c12-8dd2-67e2-99b2-bf273c878281" . +_:b0x2ba4170 _:b0x2ba45b0 . + _:b0x2ba4170 . +_:b0x2b9e700 0 . +_:b0x2b9f0f0 "https://acme.org/identifiers" . +_:b0x2b9f060 _:b0x2b9f0f0 . +_:b0x2b9f180 "1234" . +_:b0x2b9f060 _:b0x2b9f180 . +_:b0x2b9e700 _:b0x2b9f060 . + _:b0x2b9e700 . +_:b0x2b9fac0 "final" . + _:b0x2b9fac0 . +_:b0x2ba0270 0 . +_:b0x2ba0b40 0 . +_:b0x2ba0cf0 "http://hl7.org/fhir/observation-category" . +_:b0x2ba0b40 _:b0x2ba0cf0 . +_:b0x2ba1030 "vital-signs" . +_:b0x2ba0b40 _:b0x2ba1030 . +_:b0x2ba12d0 "Vital Signs" . +_:b0x2ba0b40 _:b0x2ba12d0 . +_:b0x2ba0270 _:b0x2ba0b40 . + _:b0x2ba0270 . +_:b0x2ba26e0 0 . +_:b0x2ba26e0 . +_:b0x2ba29f0 "http://loinc.org" . +_:b0x2ba26e0 _:b0x2ba29f0 . +_:b0x2ba2c50 "85354-9" . +_:b0x2ba26e0 _:b0x2ba2c50 . +_:b0x2ba30b0 "Bood pressure panel with all children optional" . +_:b0x2ba26e0 _:b0x2ba30b0 . +_:b0x2ba1df0 _:b0x2ba26e0 . +_:b0x2ba5340 "Blood pressure systolic & diastolic" . +_:b0x2ba1df0 _:b0x2ba5340 . + _:b0x2ba1df0 . +_:b0x2ba5b50 . +_:b0x2ba6090 "Patient/example" . +_:b0x2ba5b50 _:b0x2ba6090 . + _:b0x2ba5b50 . +_:b0x2ba6930 "2012-09-17"^^ . + _:b0x2ba6930 . +_:b0x2ba71b0 0 . +_:b0x2ba71b0 . +_:b0x2ba7480 "Practitioner/example" . +_:b0x2ba71b0 _:b0x2ba7480 . + _:b0x2ba71b0 . +_:b0x2ba87c0 0 . +_:b0x2ba8730 "http://hl7.org/fhir/v2/0078" . +_:b0x2ba87c0 _:b0x2ba8730 . +_:b0x2ba8990 "L" . +_:b0x2ba87c0 _:b0x2ba8990 . +_:b0x2ba8b60 "low" . +_:b0x2ba87c0 _:b0x2ba8b60 . +_:b0x2ba8050 _:b0x2ba87c0 . +_:b0x2ba9630 "Below low normal" . +_:b0x2ba8050 _:b0x2ba9630 . + _:b0x2ba8050 . +_:b0x2baa480 0 . +_:b0x2baa480 . +_:b0x2baa510 "http://snomed.info/sct" . +_:b0x2baa480 _:b0x2baa510 . +_:b0x2baa7d0 "368209003" . +_:b0x2baa480 _:b0x2baa7d0 . +_:b0x2bab160 "Right arm" . +_:b0x2baa480 _:b0x2bab160 . +_:b0x2ba9f10 _:b0x2baa480 . + _:b0x2ba9f10 . +_:b0x2babca0 0 . +_:b0x2bac100 0 . +_:b0x2bac100 . +_:b0x2bac090 "http://loinc.org" . +_:b0x2bac100 _:b0x2bac090 . +_:b0x2bac8e0 "8480-6" . +_:b0x2bac100 _:b0x2bac8e0 . +_:b0x2bacbd0 "Systolic blood pressure" . +_:b0x2bac100 _:b0x2bacbd0 . +_:b0x2bac000 _:b0x2bac100 . +_:b0x2bad040 1 . +_:b0x2bad040 . +_:b0x2bad8e0 "http://snomed.info/sct" . +_:b0x2bad040 _:b0x2bad8e0 . +_:b0x2b9c8c0 "271649006" . +_:b0x2bad040 _:b0x2b9c8c0 . +_:b0x2b9c990 "Systolic blood pressure" . +_:b0x2bad040 _:b0x2b9c990 . +_:b0x2bac000 _:b0x2bad040 . +_:b0x2baf060 2 . +_:b0x2baf1e0 "http://acme.org/devices/clinical-codes" . +_:b0x2baf060 _:b0x2baf1e0 . +_:b0x2bafa70 "bp-s" . +_:b0x2baf060 _:b0x2bafa70 . +_:b0x2bafb50 "Systolic Blood pressure" . +_:b0x2baf060 _:b0x2bafb50 . +_:b0x2bac000 _:b0x2baf060 . +_:b0x2babca0 _:b0x2bac000 . +_:b0x2bb0a00 "107"^^ . +_:b0x2bb0900 _:b0x2bb0a00 . +_:b0x2bb0ca0 "mmHg" . +_:b0x2bb0900 _:b0x2bb0ca0 . +_:b0x2bb1450 "http://unitsofmeasure.org" . +_:b0x2bb0900 _:b0x2bb1450 . +_:b0x2bb1ae0 "mm[Hg]" . +_:b0x2bb0900 _:b0x2bb1ae0 . +_:b0x2babca0 _:b0x2bb0900 . +_:b0x2bb2bb0 0 . +_:b0x2bb2750 "http://hl7.org/fhir/v2/0078" . +_:b0x2bb2bb0 _:b0x2bb2750 . +_:b0x2bb2f60 "N" . +_:b0x2bb2bb0 _:b0x2bb2f60 . +_:b0x2bb3250 "normal" . +_:b0x2bb2bb0 _:b0x2bb3250 . +_:b0x2bb2480 _:b0x2bb2bb0 . +_:b0x2bb3920 "Normal" . +_:b0x2bb2480 _:b0x2bb3920 . +_:b0x2babca0 _:b0x2bb2480 . + _:b0x2babca0 . +_:b0x2bb40c0 1 . +_:b0x2bb4ce0 0 . +_:b0x2bb4ce0 . +_:b0x2bb4a20 "http://loinc.org" . +_:b0x2bb4ce0 _:b0x2bb4a20 . +_:b0x2bb54c0 "8462-4" . +_:b0x2bb4ce0 _:b0x2bb54c0 . +_:b0x2bb57b0 "Diastolic blood pressure" . +_:b0x2bb4ce0 _:b0x2bb57b0 . +_:b0x2ba94a0 _:b0x2bb4ce0 . +_:b0x2bb40c0 _:b0x2ba94a0 . +_:b0x2bb6110 "60"^^ . +_:b0x2bb6860 _:b0x2bb6110 . +_:b0x2bb68f0 "mmHg" . +_:b0x2bb6860 _:b0x2bb68f0 . +_:b0x2bb6da0 "http://unitsofmeasure.org" . +_:b0x2bb6860 _:b0x2bb6da0 . +_:b0x2bb7190 "mm[Hg]" . +_:b0x2bb6860 _:b0x2bb7190 . +_:b0x2bb40c0 _:b0x2bb6860 . +_:b0x2bb7960 0 . +_:b0x2bb7c00 "http://hl7.org/fhir/v2/0078" . +_:b0x2bb7960 _:b0x2bb7c00 . +_:b0x2bb79e0 "L" . +_:b0x2bb7960 _:b0x2bb79e0 . +_:b0x2bb8090 "low" . +_:b0x2bb7960 _:b0x2bb8090 . +_:b0x2bb7c90 _:b0x2bb7960 . +_:b0x2bb8830 "Below low normal" . +_:b0x2bb7c90 _:b0x2bb8830 . +_:b0x2bb40c0 _:b0x2bb7c90 . + _:b0x2bb40c0 . + . + . + . + . + . diff --git a/test/from-http/hl7.org/fhir/Observation.ttl b/test/from-http/hl7.org/fhir/Observation.ttl new file mode 100644 index 0000000..78f0ab4 --- /dev/null +++ b/test/from-http/hl7.org/fhir/Observation.ttl @@ -0,0 +1,6 @@ +@prefix : <#>. +@prefix fhir: <./>. +@prefix Obs: . + +Obs:example a fhir:Observation. + diff --git a/test/from-http/hl7.org/fhir/Observation/example.ttl b/test/from-http/hl7.org/fhir/Observation/example.ttl new file mode 100644 index 0000000..be45aa7 --- /dev/null +++ b/test/from-http/hl7.org/fhir/Observation/example.ttl @@ -0,0 +1,6 @@ +@prefix : <#>. +@prefix fhir: <../>. +@prefix Obs: <./>. + +Obs:example a fhir:Observation; fhir:nodeRole fhir:treeRoot. + diff --git a/test/from-http/hl7.org/fhir/treeRoot.ttl b/test/from-http/hl7.org/fhir/treeRoot.ttl new file mode 100644 index 0000000..2f0fd24 --- /dev/null +++ b/test/from-http/hl7.org/fhir/treeRoot.ttl @@ -0,0 +1,6 @@ +@prefix : <#>. +@prefix fhir: <./>. +@prefix Obs: . + +Obs:example fhir:nodeRole fhir:treeRoot. + diff --git a/test/pwn-FHIR.sh b/test/pwn-FHIR.sh index ce6e866..fe1d860 100755 --- a/test/pwn-FHIR.sh +++ b/test/pwn-FHIR.sh @@ -1,5 +1,8 @@ -echo from-file/ +echo from-file mkdir -p from-file/ && (cd from-file/ && ../../rabel.js -in=../named-resources/observation-example-bloodpressure.ttl -spray=http://hl7.org/fhir/) -echo from-http/ +echo from-http mkdir -p from-http/ && (cd from-http/ && ../../rabel.js -in=http://build.fhir.org/observation-example.ttl -spray=http://hl7.org/fhir/) + +echo doing stats +find named-resources/observation-example-bloodpressure.ttl from-file from-http -type f | while read f; do (echo -n "$f - " && stat -c %s $f); done > pwn-FHIR.stats diff --git a/test/pwn-FHIR.stats b/test/pwn-FHIR.stats new file mode 100644 index 0000000..5ac921f --- /dev/null +++ b/test/pwn-FHIR.stats @@ -0,0 +1,15 @@ +named-resources/observation-example-bloodpressure.ttl - 8226 +from-file/hl7.org/fhir/Observation.ttl - 93 +from-file/hl7.org/fhir/Practitioner.ttl - 86 +from-file/hl7.org/fhir/treeRoot.ttl - 102 +from-file/hl7.org/fhir/Patient/example.ttl - 287 +from-file/hl7.org/fhir/fhir-ttl.ttl - 132 +from-file/hl7.org/fhir/Observation/blood-pressure.ttl.ttl - 201 +from-file/hl7.org/fhir/Observation/blood-pressure.ttl - 10256 +from-file/hl7.org/fhir/Practitioner/example.ttl - 343 +from-file/hl7.org/fhir/Patient.ttl - 74 +from-file/hl7.org/fhir/STU3/Observation/blood-pressure.ttl.ttl - 110 +from-file/obs.ntriples - 14020 +from-http/hl7.org/fhir/Observation.ttl - 98 +from-http/hl7.org/fhir/treeRoot.ttl - 107 +from-http/hl7.org/fhir/Observation/example.ttl - 118 From 3bbec4cfc3968350547b70bafacee2c9883eeae0 Mon Sep 17 00:00:00 2001 From: Tim Berners-Lee Date: Mon, 30 Oct 2017 08:44:55 +0000 Subject: [PATCH 16/23] Log counts --- rabel.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/rabel.js b/rabel.js index 77ce8ec..440e565 100755 --- a/rabel.js +++ b/rabel.js @@ -33,7 +33,7 @@ var $rdf = require('rdflib') var fs = require('fs') var ensurePath = require('fs-extra').ensureDirSync var path = require('path') -// var ShapeChecker = require('./../shacl-check/src/shacl-check.js') +var ShapeChecker = require('./../shacl-check/src/shacl-check.js') var kb = $rdf.graph() var fetcher = $rdf.fetcher(kb) @@ -152,13 +152,19 @@ var doNext = function (remaining) { let shapeDoc = $rdf.sym($rdf.uri.join(right, base)) console.log('shapeDoc ' + shapeDoc) fetcher.nowOrWhenFetched(shapeDoc, {}, function (ok, body, xhr) { + const sh = $rdf.Namespace('http://www.w3.org/ns/shacl#') if (!ok) { exitMessage("Error loading " + doc + ": " + body) } else { console.log("Loaded shape file " + shapeDoc) let checker = new ShapeChecker(kb, shapeDoc, targetDocument, reportDocument) checker.execute() - console.log('Validation done.') + let count = kb.each(null, RDF('type'), sh('ValidationResult')).length + let levels = [ 'Info', 'Warning', 'Violation'] + .map( z => z + ': ' + kb.each(null, sh('resultSeverity'), sh(z)).length ) + .join(', ') + console.log('Validation done, ' + count + ' issues. ' + levels) + console.log('' + kb.each(null, null, null, reportDocument).length + ' triples in report.') targetDocument = reportDocument writeDocument(reportDocument, reportDocument) // and move on to next command } From f648e6fd4a124ce8bd76f789d52fc1538bd31cbe Mon Sep 17 00:00:00 2001 From: Eric Prud'hommeaux Date: Fri, 1 Dec 2017 04:58:16 -0500 Subject: [PATCH 17/23] + spray test --- rabel.js => index.js | 226 ++++--------------------------------------- package.json | 10 +- test/rabel.js | 92 ++++++++++++++++++ test/resource1.ttl | 4 + 4 files changed, 124 insertions(+), 208 deletions(-) rename rabel.js => index.js (72%) mode change 100755 => 100644 create mode 100644 test/rabel.js create mode 100644 test/resource1.ttl diff --git a/rabel.js b/index.js old mode 100755 new mode 100644 similarity index 72% rename from rabel.js rename to index.js index 77ce8ec..9c71865 --- a/rabel.js +++ b/index.js @@ -5,48 +5,18 @@ // // -var base = 'file://' + process.cwd() + '/' -var helpMessage = -'Utilty data converter for linked data\n' + -'\n' + -'Commands in unix option form are executed left to right, and include:\n' + -'\n' + -'-base=rrrr Set the current base URI (relative URI, default is ' + base + ')\n' + -'-clear Clear the current store\n' + -'-dump Serialize the current store in current content type\n' + -'-format=cccc Set the current content-type\n' + -'-help This message \n' + -'-in=uri Load a web resource or file\n' + -'-out=filename Output in eth current content type\n' + -'-report=file set the report file destination for future validation\n' + -'-size Give the current store\n' + -'-spray=base Write out linked data to lots of different linked files CAREFUL!\n' + -'-test=manifest Run tests as described in the test manifest\n' + -'-validate=shapeFile Run a SHACL validator on the data loaded by previous in=x\n' + -'-version Give the version of this program\n' + -'\n' + -'Formats are given as MIME types, such as text/turtle (default), application/rdf+xml, etc\n' + -'In input only, can parse application/xml, with smarts about IANA and GPX files.\n' + -'\n' + 'Default base URI: ' + base + '\n' - var $rdf = require('rdflib') var fs = require('fs') var ensurePath = require('fs-extra').ensureDirSync var path = require('path') // var ShapeChecker = require('./../shacl-check/src/shacl-check.js') -var kb = $rdf.graph() -var fetcher = $rdf.fetcher(kb) - const RDF = $rdf.Namespace('http://www.w3.org/1999/02/22-rdf-syntax-ns#') const a = RDF('type') const mf = $rdf.Namespace('http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#') const sht = $rdf.Namespace('http://www.w3.org/ns/shacl/test-suite#') -var contentType = 'text/turtle' -var reportDocument, targetDocument - var testHandlers = [] var registerTest = function(klass, handler){ testHandlers[klass.uri || klass] = handler @@ -59,173 +29,6 @@ var check = function (ok, message, status) { } } -var exitMessage = function (message) { - console.log(message) - process.exit(4) -} - -var doNext = function (remaining) { - - var loadDocument = function (right) { - - var doc = $rdf.sym($rdf.uri.join(right, base)) - targetDocument = targetDocument || doc // remember first doc - // console.log("Document is " + targetDocument) - if (contentType === 'application/xml') { - readXML(doc, {}, function (ok, body, xhr) { - check(ok, body, xhr ? xhr.status : undefined) - console.log('Loaded XML ' + targetDocument) - doNext(remaining) - }) // target, kb, base, contentType, callback - } else { - fetcher.nowOrWhenFetched(doc, {}, function (ok, body, xhr) { - check(ok, body, xhr ? xhr.status : undefined) - console.log('Loaded ' + doc) - doNext(remaining) - }) // target, kb, base, contentType, callback - } - } - // Writes the data we have in the store under targetDocument out to file doc - var writeDocument = function (targetDocument, doc) { - console.log(' writing ... ' + doc) - try { - var outText = $rdf.serialize(targetDocument, kb, targetDocument.uri, contentType) - } catch (e) { - exitMessage('Error in serializer: ' + e) - } - if (doc.uri.slice(0, 8) !== 'file:///') { - exitMessage('Can only write files just now, sorry: ' + doc.uri) - } - var fileName = doc.uri.slice(7) // - fs.writeFile(fileName, outText, function (err) { - if (err) { - exitMessage('Error writing file ' + doc + ' :' + err) - } - console.log('Written ' + doc) - doNext(remaining) - }) - } - - while (remaining.length) { - let arg = remaining.shift() - let command = arg.split('=') - let left = command[0] - let right = command[1] - - if (left.slice(0, 1) !== '-') { - loadDocument(arg) - return - } - let doc - switch (left) { - case '-base': - base = $rdf.uri.join(right, base) - break - - case '-clear': - kb = $rdf.graph() - break - - case '-dump': - console.log('Serialize ' + targetDocument + ' as ' + contentType) - try { - var out = $rdf.serialize(targetDocument, kb, targetDocument.uri, contentType) - } catch (e) { - exitMessage('Error in serializer: ' + e) - } - console.log('Result: ' + out) - break - - case '-format': - contentType = right - break - - case '-report': - reportDocument = $rdf.sym($rdf.uri.join(right, base)) - break - - case '-validate': - if (!targetDocument) { - console.log('Load data to be validated before -validate=shapefile') - process.exit(1) - } - let shapeDoc = $rdf.sym($rdf.uri.join(right, base)) - console.log('shapeDoc ' + shapeDoc) - fetcher.nowOrWhenFetched(shapeDoc, {}, function (ok, body, xhr) { - if (!ok) { - exitMessage("Error loading " + doc + ": " + body) - } else { - console.log("Loaded shape file " + shapeDoc) - let checker = new ShapeChecker(kb, shapeDoc, targetDocument, reportDocument) - checker.execute() - console.log('Validation done.') - targetDocument = reportDocument - writeDocument(reportDocument, reportDocument) // and move on to next command - } - }) - return - - case '-help': - case '--help': - console.log(helpMessage) - break - - case '-in': - loadDocument(right) - return - - case '-out': - doc = $rdf.sym($rdf.uri.join(right, base)) - writeDocument(targetDocument, doc) - return - - case '-spray': - var root = $rdf.sym($rdf.uri.join(right, base)) // go back to folder - try { - spray(root.uri, targetDocument) - } catch (e) { - exitMessage('Error in spray: ' + e) - } - return - - case '-size': - console.log(kb.statements.length + ' triples') - doNext(remaining) - break - - case '-test': - doc = $rdf.sym($rdf.uri.join(right, base)) - console.log("Loading " + doc) - fetcher.nowOrWhenFetched(doc, {}, function(ok, message){ - if (!ok) exitMessage("Error loading tests " + doc + ": " + message) - runTests(doc).then(function(issues){ - console.log("DONE ALL TESTS. Issue array length: " + issues.length) - issues.forEach(function(issue){ - console.log(' Test: ' + issue.test) - }) - doNext(remaining) - }) - }) - return - - case '-version': - console.log('rdflib built: ' + $rdf.buildTime) - break - - default: - console.log('Unknown command: ' + left) - console.log(helpMessage) - process.exit(1) - } - } -/* - (function wait () { - if (true) setTimeout(wait, 3000); - })(); -*/ - process.exit(0) // No!!! node must wait for stuff to finish -} - var statementsToTurtle = function (kb, statements, base) { var sz = new $rdf.Serializer(kb) sz.suggestNamespaces(kb.namespaces) @@ -235,7 +38,7 @@ var statementsToTurtle = function (kb, statements, base) { } // Returns a promise of an issues list -var validationTest = function(test){ +var validationTest = function(test, kb){ const indent = ' ' var forwardTree = function (x) { var sts = [] @@ -285,7 +88,7 @@ var validationTest = function(test){ registerTest(sht('Validate'), validationTest) // Returns promise of issues array -var doAppropriateTest = function (test){ +var doAppropriateTest = function (test, kb){ return new Promise(function(resolve, reject){ console.log(' -- Do approp test for ' + test) var testDoc @@ -305,7 +108,7 @@ var doAppropriateTest = function (test){ for (let j=0; j doAppropriateTest(test, kb)) } let includes = kb.each(doc, mf('include')) console.log(indent + ' includes: ' + includes.length + ' for ' + doc ) @@ -362,7 +168,7 @@ var runTests = function (doc) { // Caution: use with care! This will build a complete linked data // database of linked files from master data -var spray = function (rootURI, original, doubleLinked) { +var spray = function (rootURI, original, exitMessage, kb, finished) { var docs = [] console.log('Spray: Stripping ' + rootURI + ' from ' + original.value) var docURI @@ -381,7 +187,9 @@ var spray = function (rootURI, original, doubleLinked) { } kb.statements.forEach(function (st) { check(st.subject); check(st.object) }) // Not predicates + var waitingFor = 0 for (docURI in docs) { + ++waitingFor var sts = [] console.log('Document: ' + docURI) for (var uri in docs[docURI]) { @@ -406,6 +214,9 @@ var spray = function (rootURI, original, doubleLinked) { exitMessage("***** Error writing file <" + f + "> :" + err) } console.log("Written ok: " + f) + if (--waitingFor === 0) { + finished() + } }) } @@ -418,7 +229,7 @@ var spray = function (rootURI, original, doubleLinked) { // // Contains namespace-trigged specials for IANA registry data // -var readXML = function (targetDocument, options, callback) { +var readXML = function (targetDocument, options, callback, kb) { var uri = targetDocument.uri var file = $rdf.Util.uri.refTo(base, uri) var ignore = { 7: true } @@ -685,6 +496,11 @@ var readXML = function (targetDocument, options, callback) { }) } -doNext(process.argv.slice(2)) - // ends + +module.exports = { + check: check, + spray: spray, + readXML: readXML, +} + diff --git a/package.json b/package.json index d125da4..89ff02f 100644 --- a/package.json +++ b/package.json @@ -21,8 +21,12 @@ "xmldom": "^0.1.22" }, "bin": { - "rabel": "rabel.js" + "rabel": "./bin/rabel" }, - "devDependencies": {}, - "main": "rabel.js" + "devDependencies": { + "fs-extra": "^4.0.2", + "mocha": "^4.0.1", + "mock-http-server": "^0.2.0" + }, + "main": "index.js" } diff --git a/test/rabel.js b/test/rabel.js new file mode 100644 index 0000000..d1a8bb9 --- /dev/null +++ b/test/rabel.js @@ -0,0 +1,92 @@ +let fetch = require('node-fetch') +let assert = require('assert') +let path = require('path') +let fs = require('fs-extra') +let $rdf = require('rdflib') +let rabel = require('../') +const TARGET_DIR = 'target-dir' + +/* +package.json: + "dependencies": { + "node-fetch": "^1.7.3" + }, + "devDependencies": { + "mocha": "^4.0.1" + }, +*/ + +xdescribe('fetch', () => { + [ + // These will pass. + { url: 'http://localhost/', status: 200 }, + { url: 'http://localhost/999', status: 404 }, + { url: 'http://localhost:999/', catchString: 'ECONNREFUSED' }, + { url: 'http //localhost/999', catchString: 'absolute urls' }, + { url: '', catchString: 'absolute urls' }, + { url: null, catchString: 'must be a string' }, + { url: undefined, catchString: 'must be a string' }, + + // These will fail without timeout. + { url: 'http://localhost:999', status: 404 }, + { url: 'http://localhost/999', catchString: 'ECONNREFUSED' }, + { url: 'http //localhost:999', status: 404 }, + { url: 'http //localhost/999', catchString: 'ECONNREFUSED' } + ].forEach(t => { + if ('status' in t) { + let msg = JSON.stringify(t.url) + ' should fetch a ' + t.status + it(msg, () => { + return fetch(t.url).then(res => { + assert.equal(res.status, t.status) + }) + }) + } else { + let msg = JSON.stringify(t.url) + ' should fail with ' + t.catchString + it(msg, done => { + fetch(t.url) + .then(res => { + done(Error('unexpected success with status ' + res.status)) + }).catch(e => { + assert.notEqual(e.message.indexOf(t.catchString), -1, + '"' + t.catchString + '" not found in "' + e.message + '"') + done() + }).catch(e => { + done(e) // report failed assertion from previous block. + // Without this catch, done isn't called and mocha times out. + }) + }) + } + }) +}) + +describe('rabel', () => { + [ + { file: 'resource1.ttl' } + ].forEach(t => { + if ('file' in t) { + let filePath = path.join(__dirname, t.file) + it('should load and spray ' + filePath, done => { + let kb = $rdf.graph() + let fetcher = $rdf.fetcher(kb, {a:1}) + let doc = kb.sym('file://' + filePath) + try { + fs.removeSync(TARGET_DIR) + } catch (e) { + } + fs.mkdirSync(TARGET_DIR) + process.chdir(TARGET_DIR) + fetcher.nowOrWhenFetched(doc, {}, function (ok, body, xhr) { + // rabel.check(ok, body, xhr ? xhr.status : undefined) + console.log('Loaded ' + doc) + rabel.spray( + 'http://a.example/', + doc, + msg => done(msg), + kb, + () => done() + ) + }) + }) + } + }) +}) diff --git a/test/resource1.ttl b/test/resource1.ttl new file mode 100644 index 0000000..b207217 --- /dev/null +++ b/test/resource1.ttl @@ -0,0 +1,4 @@ +@prefix foaf: . + a foaf:Person ; + foaf:name "Alice" ; + foaf:mbox . From 899c547d2250f3b7cce09c11ab16a35c833226af Mon Sep 17 00:00:00 2001 From: Tim Berners-Lee Date: Tue, 21 May 2019 08:48:20 -0400 Subject: [PATCH 18/23] add test files --- test/shapes/,log2.txt | 2346 ++++++++++++++++++++++++++++++++++ test/shapes/bnodetest.js | 27 + test/shapes/nodeKind-001.ttl | 370 ++++++ test/turtle/README.txt | 10 + test/turtle/manifest.ttl | 9 + test/turtle/rdf:type | 0 6 files changed, 2762 insertions(+) create mode 100644 test/shapes/,log2.txt create mode 100644 test/shapes/bnodetest.js create mode 100644 test/shapes/nodeKind-001.ttl create mode 100644 test/turtle/README.txt create mode 100644 test/turtle/manifest.ttl create mode 100644 test/turtle/rdf:type diff --git a/test/shapes/,log2.txt b/test/shapes/,log2.txt new file mode 100644 index 0000000..8a24911 --- /dev/null +++ b/test/shapes/,log2.txt @@ -0,0 +1,2346 @@ +Loading +runTests +Manifest loaded: +SHACL Test suite + includes: 1 for +runTests +Manifest loaded: + includes: 3 for +runTests +runTests +runTests +Manifest loaded: + includes: 5 for +runTests +runTests +runTests +runTests +runTests +Masked error - status 0 for file:///devel/github.com/w3c/data-shapes/data-shapes-test-suite/tests/dash/core/target/manifest.ttl +Manifest loaded: + includes: 2 for +runTests +runTests +Manifest loaded: + includes: 5 for +runTests +runTests +runTests +runTests +runTests +Masked error - status 0 for file:///devel/github.com/w3c/data-shapes/data-shapes-test-suite/tests/dash/sparql/target/manifest.ttl +Manifest loaded: + includes: 1 for +runTests +Manifest loaded: + includes: 3 for +runTests +runTests +runTests +Manifest loaded: + includes: 36 for +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +Manifest loaded: + includes: 16 for +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +runTests +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test +Target class +Target class member + Applying shape _:n164 + to node + closed: false + Checking property _:n165: + -> Too few (0) on +Target class member + Applying shape _:n164 + to node + closed: false + Checking property _:n165: + Expected statements: 9 + Actual statements: 9 + Match -> passed +1 +Manifest loaded: + includes: 1 for +runTests +Manifest loaded: + includes: 1 for +runTests +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test +Target node + Applying shape _:n180 + to node + closed: false + Checking property _:n181: + -> Too few (0) on +Target node + Applying shape _:n180 + to node + closed: false + Checking property _:n181: + Expected statements: 9 + Actual statements: 9 + Match -> passed +1 +2 +Manifest loaded: + includes: 0 for +0 +Manifest loaded: + includes: 1 for +runTests +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test +Target class +Target class member + Applying shape + to node + closed: true + Ignoreable: + Checking property _:n190: + -> Error 987-65-432A should match pattern ^\d{3}-\d{2}-\d{4}$ + Checking property _:n191: + Checking property _:n192: _:n193 +Target class member + Applying shape + to node + closed: true + Ignoreable: + Checking property _:n190: + -> Too many (2) on + Checking property _:n191: + Checking property _:n192: _:n193 +Target class member + Applying shape + to node + closed: true + Ignoreable: + Checking property _:n190: + Checking property _:n191: + -> Error should be in class + Checking property _:n192: _:n193 + -> Closed node has extra data: "1999-09-09"^^ . + Expected statements: 33 + Actual statements: 31 + -> FAILED, expected: + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix per: . +@prefix XML: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode per:Alice; + sh:resultPath per:ssn; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:PatternConstraintComponent; + sh:sourceShape []; + sh:value "987-65-432A" + ], + [ + a sh:ValidationResult; + sh:focusNode per:Bob; + sh:resultPath per:ssn; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MaxCountConstraintComponent; + sh:sourceShape [] + ], + [ + a sh:ValidationResult; + sh:focusNode per:Calvin; + sh:resultPath per:birthDate; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:ClosedConstraintComponent; + sh:sourceShape per:PersonShape; + sh:value "1999-09-09"^^XML:date + ], + [ + a sh:ValidationResult; + sh:focusNode per:Calvin; + sh:resultPath per:worksFor; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:ClassConstraintComponent; + sh:sourceShape []; + sh:value per:UntypedCompany + ] +]. + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix per: . +@prefix XML: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode per:Alice; + sh:resultPath per:ssn; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:PatternConstraintComponent; + sh:sourceShape per:PersonShape; + sh:value "987-65-432A" + ], + [ + a sh:ValidationResult; + sh:focusNode per:Bob; + sh:resultPath per:ssn; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MaxCountConstraintComponent; + sh:sourceShape per:PersonShape + ], + [ + a sh:ValidationResult; + sh:focusNode per:Calvin; + sh:resultPath per:worksFor; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:ClassConstraintComponent; + sh:sourceShape per:PersonShape + ], + [ + a sh:ValidationResult; + sh:focusNode per:Calvin; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:ClosedConstraintComponent; + sh:sourceShape per:PersonShape; + sh:value "1999-09-09"^^XML:date + ] +]. + +__________________________________________________ + +1 +1 +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test +Target node + Applying shape + to node + closed: false + Checking property : ( ) + -> Too many (2) ( ) on + -> Error value should be of node kind: + -> Error value should be of node kind: + Expected statements: 10 + Actual statements: 25 + -> FAILED, expected: + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix p: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode p:A; + sh:resultPath ( p:p1 p:p2 ); + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent; + sh:sourceShape p:SP; + sh:value "value" + ] +]. + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix p: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode p:A; + sh:resultPath ( p:p1 p:p2 ); + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MaxCountConstraintComponent; + sh:sourceShape p:S + ], + [ + a sh:ValidationResult; + sh:focusNode p:A; + sh:resultPath ( p:p1 p:p2 ); + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent; + sh:sourceShape p:S; + sh:value "value" + ], + [ + a sh:ValidationResult; + sh:focusNode p:A; + sh:resultPath ( p:p1 p:p2 ); + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent; + sh:sourceShape p:S; + sh:value "value" + ] +]. + +__________________________________________________ + +1 +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test +Target class +Target class member + Applying shape + to node + closed: false + Checking property : _:n222 + -> Too few (1) _:n222 on +Target class member + Applying shape + to node + closed: false + Checking property : _:n222 + -> Too many (3) _:n222 on +Target class member + Applying shape + to node + closed: false + Checking property : _:n222 + Expected statements: 18 + Actual statements: 16 + -> FAILED, expected: + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix p: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode p:InvalidResource1; + sh:resultPath [ sh:inversePath p:child ]; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MinCountConstraintComponent; + sh:sourceShape p:TestShape-P + ], + [ + a sh:ValidationResult; + sh:focusNode p:InvalidResource2; + sh:resultPath [ sh:inversePath p:child ]; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MaxCountConstraintComponent; + sh:sourceShape p:TestShape-P + ] +]. + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix p: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode p:InvalidResource1; + sh:resultPath []; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MinCountConstraintComponent; + sh:sourceShape p:TestShape + ], + [ + a sh:ValidationResult; + sh:focusNode p:InvalidResource2; + sh:resultPath []; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MaxCountConstraintComponent; + sh:sourceShape p:TestShape + ] +]. + +__________________________________________________ + +1 +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test +Target node + Applying shape + to node + closed: false + Checking property : +Target node + Applying shape + to node + closed: false + Checking property : +Target node + Applying shape + to node + closed: false + Checking property : + Expected statements: 16 + Actual statements: 2 + -> FAILED, expected: + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix p: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode p:InvalidResource1; + sh:resultPath p:property; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:HasValueConstraintComponent; + sh:sourceShape p:TestShape-P + ], + [ + a sh:ValidationResult; + sh:focusNode p:InvalidResource2; + sh:resultPath p:property; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:HasValueConstraintComponent; + sh:sourceShape p:TestShape-P + ] +]. + +__________________________________________________ +@prefix : <#>. +@prefix sh: . + +[ a sh:ValidationReport; sh:conforms true ]. + + +__________________________________________________ + +1 +3 +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test +Target node + Applying shape + to node + closed: false + Checking property : + Applying shape _:n241 + to node _:n246 + closed: false + Checking property _:n242: + -> Too few (0) on _:n246 + Applying shape _:n243 + to node _:n246 + closed: false + Checking property _:n244: + -> Too few (0) on _:n246 + -> Error _:n246 does not match ALL shapes (_:n241 _:n243) +Target node + Applying shape + to node + closed: false + Checking property : + Applying shape _:n241 + to node _:n247 + closed: false + Checking property _:n242: + -> Too few (0) on _:n247 + Applying shape _:n243 + to node _:n247 + closed: false + Checking property _:n244: + -> Too few (0) on _:n247 + -> Error _:n247 does not match ALL shapes (_:n241 _:n243) +Target node + Applying shape + to node + closed: false + Checking property : + Applying shape _:n241 + to node _:n248 + closed: false + Checking property _:n242: + -> Too few (0) on _:n248 + Applying shape _:n243 + to node _:n248 + closed: false + Checking property _:n244: + -> Too few (0) on _:n248 + -> Error _:n248 does not match ALL shapes (_:n241 _:n243) +Target node + Applying shape + to node + closed: false + Checking property : + Applying shape _:n241 + to node _:n249 + closed: false + Checking property _:n242: + Applying shape _:n243 + to node _:n249 + closed: false + Checking property _:n244: + Expected statements: 26 + Actual statements: 68 + -> FAILED, expected: + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix n0: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode n0:InvalidResource1; + sh:resultPath n0:address; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:AndConstraintComponent; + sh:sourceShape n0:AddressShape-address; + sh:value [] + ], + [ + a sh:ValidationResult; + sh:focusNode n0:InvalidResource2; + sh:resultPath n0:address; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:AndConstraintComponent; + sh:sourceShape n0:AddressShape-address; + sh:value [] + ], + [ + a sh:ValidationResult; + sh:focusNode n0:InvalidResource3; + sh:resultPath n0:address; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:AndConstraintComponent; + sh:sourceShape n0:AddressShape-address; + sh:value [] + ] +]. + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix n0: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode n0:InvalidResource1; + sh:resultPath n0:address; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:AndConstraintComponent; + sh:sourceShape n0:AddressShape; + sh:value [] + ], + [ + a sh:ValidationResult; + sh:focusNode n0:InvalidResource2; + sh:resultPath n0:address; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:AndConstraintComponent; + sh:sourceShape n0:AddressShape; + sh:value [] + ], + [ + a sh:ValidationResult; + sh:focusNode n0:InvalidResource3; + sh:resultPath n0:address; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:AndConstraintComponent; + sh:sourceShape n0:AddressShape; + sh:value [] + ], + [ + a sh:ValidationResult; + sh:focusNode []; + sh:resultPath n0:postalCode; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MinCountConstraintComponent; + sh:sourceShape [] + ], + [ + a sh:ValidationResult; + sh:focusNode []; + sh:resultPath n0:postalCode; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MinCountConstraintComponent; + sh:sourceShape [] + ], + [ + a sh:ValidationResult; + sh:focusNode []; + sh:resultPath n0:postalCode; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MinCountConstraintComponent; + sh:sourceShape [] + ], + [ + a sh:ValidationResult; + sh:focusNode []; + sh:resultPath n0:suburb; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MinCountConstraintComponent; + sh:sourceShape [] + ], + [ + a sh:ValidationResult; + sh:focusNode []; + sh:resultPath n0:suburb; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MinCountConstraintComponent; + sh:sourceShape [] + ], + [ + a sh:ValidationResult; + sh:focusNode []; + sh:resultPath n0:suburb; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MinCountConstraintComponent; + sh:sourceShape [] + ] +]. + +__________________________________________________ + +1 +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test +Target node + Applying shape + to node + closed: false + Checking property : + -> Error should be in class + -> Error A string should be in class +Target node + Applying shape + to node + closed: false + Checking property : + -> Error should be in class +Target node + Applying shape + to node + closed: false + Checking property : + -> Error _:n267 should be in class + Expected statements: 18 + Actual statements: 30 + -> FAILED, expected: + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix cl: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode cl:InvalidResource1; + sh:resultPath cl:testProperty; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:ClassConstraintComponent; + sh:sourceShape cl:TestShape-testProperty; + sh:value cl:InvalidResource1 + ], + [ + a sh:ValidationResult; + sh:focusNode cl:InvalidResource1; + sh:resultPath cl:testProperty; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:ClassConstraintComponent; + sh:sourceShape cl:TestShape-testProperty; + sh:value "A string" + ] +]. + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix cl: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode cl:InvalidResource1; + sh:resultPath cl:testProperty; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:ClassConstraintComponent; + sh:sourceShape cl:TestShape + ], + [ + a sh:ValidationResult; + sh:focusNode cl:InvalidResource1; + sh:resultPath cl:testProperty; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:ClassConstraintComponent; + sh:sourceShape cl:TestShape + ], + [ + a sh:ValidationResult; + sh:focusNode cl:ValidResource1; + sh:resultPath cl:testProperty; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:ClassConstraintComponent; + sh:sourceShape cl:TestShape + ], + [ + a sh:ValidationResult; + sh:focusNode cl:ValidResource2; + sh:resultPath cl:testProperty; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:ClassConstraintComponent; + sh:sourceShape cl:TestShape + ] +]. + +__________________________________________________ + +1 +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test + Expected statements: 18 + Actual statements: 2 + -> FAILED, expected: + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix d: . +@prefix XML: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode d:InvalidResource1; + sh:resultPath d:dateProperty; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:DatatypeConstraintComponent; + sh:sourceShape d:TestShape-dateProperty; + sh:value "2011-01-01"^^XML:dateTime + ], + [ + a sh:ValidationResult; + sh:focusNode d:InvalidResource1; + sh:resultPath d:integerProperty; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:DatatypeConstraintComponent; + sh:sourceShape d:TestShape-integerProperty; + sh:value 11.1 + ] +]. + +__________________________________________________ +@prefix : <#>. +@prefix sh: . + +[ a sh:ValidationReport; sh:conforms true ]. + + +__________________________________________________ + +1 +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test +Target node + Applying shape + to node + closed: false + Checking property : + Applying shape _:n287 + to node 42 + closed: false + Applying shape _:n288 + to node 42 + closed: false +Target node + Applying shape + to node + closed: false + Checking property : + Applying shape _:n287 + to node A + closed: false + Applying shape _:n288 + to node A + closed: false +Target node + Applying shape + to node + closed: false + Checking property : + Applying shape _:n287 + to node A + closed: false + Applying shape _:n288 + to node A + closed: false +Target node + Applying shape + to node + closed: false + Checking property : + Applying shape _:n287 + to node A + closed: false + Applying shape _:n288 + to node A + closed: false + Expected statements: 10 + Actual statements: 2 + -> FAILED, expected: + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix d: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode d:InvalidInstance1; + sh:resultPath d:value; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:OrConstraintComponent; + sh:sourceShape d:TestShape-value; + sh:value 42 + ] +]. + +__________________________________________________ +@prefix : <#>. +@prefix sh: . + +[ a sh:ValidationReport; sh:conforms true ]. + + +__________________________________________________ + +1 +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test +Target node + Applying shape + to node + closed: false + Checking property : + -> Error A should be datatype +Target node + Applying shape + to node + closed: false + Checking property : + -> Error 42 should be datatype +Target node + Applying shape + to node + closed: false + Checking property : +Target node + Applying shape + to node + closed: false + Checking property : + Expected statements: 18 + Actual statements: 18 + -> FAILED, expected: + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix d: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode d:InvalidInstance1; + sh:resultPath d:value; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:DatatypeConstraintComponent; + sh:sourceShape d:TestShape-value; + sh:value "A"@en + ], + [ + a sh:ValidationResult; + sh:focusNode d:InvalidInstance2; + sh:resultPath d:value; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:DatatypeConstraintComponent; + sh:sourceShape d:TestShape-value; + sh:value 42 + ] +]. + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix d: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode d:InvalidInstance1; + sh:resultPath d:value; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:DatatypeConstraintComponent; + sh:sourceShape d:TestShape; + sh:value "A"@en + ], + [ + a sh:ValidationResult; + sh:focusNode d:InvalidInstance2; + sh:resultPath d:value; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:DatatypeConstraintComponent; + sh:sourceShape d:TestShape; + sh:value 42 + ] +]. + +__________________________________________________ + +1 +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test +Target node + Applying shape + to node + closed: false + Checking property : +Target node + Applying shape + to node + closed: false + Checking property : +Target node + Applying shape + to node + closed: false + Checking property : +Target node + Applying shape + to node + closed: false + Checking property : + Expected statements: 18 + Actual statements: 2 + -> FAILED, expected: + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix dis: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode dis:InvalidResource1; + sh:resultPath dis:property1; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:DisjointConstraintComponent; + sh:sourceShape dis:TestShape-property1; + sh:value "A" + ], + [ + a sh:ValidationResult; + sh:focusNode dis:InvalidResource2; + sh:resultPath dis:property1; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:DisjointConstraintComponent; + sh:sourceShape dis:TestShape-property1; + sh:value "A" + ] +]. + +__________________________________________________ +@prefix : <#>. +@prefix sh: . + +[ a sh:ValidationReport; sh:conforms true ]. + + +__________________________________________________ + +1 +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test +Target node + Applying shape + to node + closed: false + Checking property : +Target node + Applying shape + to node + closed: false + Checking property : +Target node + Applying shape + to node + closed: false + Checking property : +Target node + Applying shape + to node + closed: false + Checking property : +Target node + Applying shape + to node + closed: false + Checking property : +Target node + Applying shape + to node + closed: false + Checking property : + Expected statements: 42 + Actual statements: 2 + -> FAILED, expected: + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix equ: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode equ:InvalidResource1; + sh:resultPath equ:property1; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:EqualsConstraintComponent; + sh:sourceShape equ:TestShape-property1; + sh:value "A" + ], + [ + a sh:ValidationResult; + sh:focusNode equ:InvalidResource1; + sh:resultPath equ:property1; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:EqualsConstraintComponent; + sh:sourceShape equ:TestShape-property1; + sh:value "B" + ], + [ + a sh:ValidationResult; + sh:focusNode equ:InvalidResource2; + sh:resultPath equ:property1; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:EqualsConstraintComponent; + sh:sourceShape equ:TestShape-property1; + sh:value "A" + ], + [ + a sh:ValidationResult; + sh:focusNode equ:InvalidResource3; + sh:resultPath equ:property1; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:EqualsConstraintComponent; + sh:sourceShape equ:TestShape-property1; + sh:value "A" + ], + [ + a sh:ValidationResult; + sh:focusNode equ:InvalidResource4; + sh:resultPath equ:property1; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:EqualsConstraintComponent; + sh:sourceShape equ:TestShape-property1; + sh:value "B" + ] +]. + +__________________________________________________ +@prefix : <#>. +@prefix sh: . + +[ a sh:ValidationReport; sh:conforms true ]. + + +__________________________________________________ + +1 +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test + Expected statements: 10 + Actual statements: 2 + -> FAILED, expected: + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix in: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode in:InvalidInstance1; + sh:resultPath in:property; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:InConstraintComponent; + sh:sourceShape in:ShapeClass-property; + sh:value "D" + ] +]. + +__________________________________________________ +@prefix : <#>. +@prefix sh: . + +[ a sh:ValidationReport; sh:conforms true ]. + + +__________________________________________________ + +1 +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test +Target node + Applying shape + to node + closed: false + Checking property : +Target node + Applying shape + to node + closed: false + Checking property : +Target node + Applying shape + to node + closed: false + Checking property : +Target node + Applying shape + to node + closed: false + Checking property : +Target node + Applying shape + to node + closed: false + Checking property : + Expected statements: 26 + Actual statements: 2 + -> FAILED, expected: + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix les: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode les:InvalidResource1; + sh:resultPath les:property1; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:LessThanConstraintComponent; + sh:sourceShape les:TestShape-property1; + sh:value 4 + ], + [ + a sh:ValidationResult; + sh:focusNode les:InvalidResource2; + sh:resultPath les:property1; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:LessThanConstraintComponent; + sh:sourceShape les:TestShape-property1; + sh:value 6 + ], + [ + a sh:ValidationResult; + sh:focusNode les:InvalidResource3; + sh:resultPath les:property1; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:LessThanConstraintComponent; + sh:sourceShape les:TestShape-property1; + sh:value 5 + ] +]. + +__________________________________________________ +@prefix : <#>. +@prefix sh: . + +[ a sh:ValidationReport; sh:conforms true ]. + + +__________________________________________________ + +1 +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test +Target node + Applying shape + to node + closed: false + Checking property : +Target node + Applying shape + to node + closed: false + Checking property : + Expected statements: 26 + Actual statements: 2 + -> FAILED, expected: + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix l: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode l:Berg; + sh:resultPath l:prefLabel; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:LanguageInConstraintComponent; + sh:sourceShape l:NewZealandLanguagesShape-prefLabel; + sh:value l:BergLabel + ], + [ + a sh:ValidationResult; + sh:focusNode l:Berg; + sh:resultPath l:prefLabel; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:LanguageInConstraintComponent; + sh:sourceShape l:NewZealandLanguagesShape-prefLabel; + sh:value "Berg" + ], + [ + a sh:ValidationResult; + sh:focusNode l:Berg; + sh:resultPath l:prefLabel; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:LanguageInConstraintComponent; + sh:sourceShape l:NewZealandLanguagesShape-prefLabel; + sh:value "Berg"@de + ] +]. + +__________________________________________________ +@prefix : <#>. +@prefix sh: . + +[ a sh:ValidationReport; sh:conforms true ]. + + +__________________________________________________ + +1 +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test +Target class +Target class member + Applying shape + to node + closed: false + Checking property : +Target class member + Applying shape + to node + closed: false + Checking property : +Target class member + Applying shape + to node + closed: false + Checking property : + Expected statements: 9 + Actual statements: 2 + -> FAILED, expected: + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix h: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode h:InvalidMalePerson; + sh:resultPath h:gender; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:HasValueConstraintComponent; + sh:sourceShape h:PersonShape-gender + ] +]. + +__________________________________________________ +@prefix : <#>. +@prefix sh: . + +[ a sh:ValidationReport; sh:conforms true ]. + + +__________________________________________________ + +1 +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test +Target node + Applying shape + to node + closed: false + Checking property : + Expected statements: 34 + Actual statements: 2 + -> FAILED, expected: + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix les: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode les:InvalidInstance1; + sh:resultPath les:first; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:LessThanConstraintComponent; + sh:sourceShape les:TestShape-first; + sh:value 1 + ], + [ + a sh:ValidationResult; + sh:focusNode les:InvalidInstance1; + sh:resultPath les:first; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:LessThanConstraintComponent; + sh:sourceShape les:TestShape-first; + sh:value 1 + ], + [ + a sh:ValidationResult; + sh:focusNode les:InvalidInstance1; + sh:resultPath les:first; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:LessThanConstraintComponent; + sh:sourceShape les:TestShape-first; + sh:value 2 + ], + [ + a sh:ValidationResult; + sh:focusNode les:InvalidInstance1; + sh:resultPath les:first; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:LessThanConstraintComponent; + sh:sourceShape les:TestShape-first; + sh:value 2 + ] +]. + +__________________________________________________ +@prefix : <#>. +@prefix sh: . + +[ a sh:ValidationReport; sh:conforms true ]. + + +__________________________________________________ + +1 +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test +Target node + Applying shape + to node + closed: false + Checking property : +Target node + Applying shape + to node + closed: false + Checking property : +Target node + Applying shape + to node + closed: false + Checking property : +Target node + Applying shape + to node + closed: false + Checking property : +Target node + Applying shape + to node + closed: false + Checking property : + Expected statements: 18 + Actual statements: 2 + -> FAILED, expected: + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix les: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode les:InvalidResource1; + sh:resultPath les:property1; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent + sh:LessThanOrEqualsConstraintComponent; + sh:sourceShape les:TestShape-property1; + sh:value 5 + ], + [ + a sh:ValidationResult; + sh:focusNode les:InvalidResource2; + sh:resultPath les:property1; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent + sh:LessThanOrEqualsConstraintComponent; + sh:sourceShape les:TestShape-property1; + sh:value 6 + ] +]. + +__________________________________________________ +@prefix : <#>. +@prefix sh: . + +[ a sh:ValidationReport; sh:conforms true ]. + + +__________________________________________________ + +1 +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test +Target class +Target class member + Applying shape + to node + closed: false + Checking property : + -> Too many (2) on +Target class member + Applying shape + to node + closed: false + Checking property : +Target node + Applying shape + to node + closed: false + Checking property : + Expected statements: 9 + Actual statements: 9 + -> FAILED, expected: + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix m: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode m:InvalidPerson; + sh:resultPath m:firstName; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MaxCountConstraintComponent; + sh:sourceShape m:PersonShape-firstName + ] +]. + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix m: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode m:InvalidPerson; + sh:resultPath m:firstName; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MaxCountConstraintComponent; + sh:sourceShape m:PersonShape + ] +]. + +__________________________________________________ + +1 +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test +Target node + Applying shape + to node + closed: false + Checking property : + -> Too many (1) on +Target node + Applying shape + to node + closed: false + Checking property : + Expected statements: 9 + Actual statements: 9 + -> FAILED, expected: + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix m: . +@prefix owl: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode m:InvalidResource; + sh:resultPath owl:versionInfo; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MaxCountConstraintComponent; + sh:sourceShape m:TestShape-versionInfo + ] +]. + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix m: . +@prefix owl: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode m:InvalidResource; + sh:resultPath owl:versionInfo; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MaxCountConstraintComponent; + sh:sourceShape m:TestShape + ] +]. + +__________________________________________________ + +1 +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test +Target node + Applying shape + to node + closed: false + Checking property : + -> Error 1 should less than or equal to 1 +Target node + Applying shape + to node + closed: false + Checking property : + -> Error 2 should less than or equal to 1 +Target node + Applying shape + to node + closed: false + Checking property : + -> Error a should less than or equal to 1 +Target node + Applying shape + to node + closed: false + Checking property : +Target node + Applying shape + to node + closed: false + Checking property : + Expected statements: 26 + Actual statements: 26 + -> FAILED, expected: + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix m: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode m:InvalidResource1; + sh:resultPath m:property; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MaxExclusiveConstraintComponent; + sh:sourceShape m:TestShape-property; + sh:value 1 + ], + [ + a sh:ValidationResult; + sh:focusNode m:InvalidResource2; + sh:resultPath m:property; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MaxExclusiveConstraintComponent; + sh:sourceShape m:TestShape-property; + sh:value 2 + ], + [ + a sh:ValidationResult; + sh:focusNode m:InvalidResource3; + sh:resultPath m:property; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MaxExclusiveConstraintComponent; + sh:sourceShape m:TestShape-property; + sh:value "a" + ] +]. + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix m: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode m:InvalidResource1; + sh:resultPath m:property; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MaxExclusiveConstraintComponent; + sh:sourceShape m:TestShape; + sh:value 1 + ], + [ + a sh:ValidationResult; + sh:focusNode m:InvalidResource2; + sh:resultPath m:property; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MaxExclusiveConstraintComponent; + sh:sourceShape m:TestShape; + sh:value 2 + ], + [ + a sh:ValidationResult; + sh:focusNode m:InvalidResource3; + sh:resultPath m:property; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MaxExclusiveConstraintComponent; + sh:sourceShape m:TestShape; + sh:value "a" + ] +]. + +__________________________________________________ + +1 +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test +Target node + Applying shape + to node + closed: false + Checking property : + -> Error 2 should less than or equal to 1 +Target node + Applying shape + to node + closed: false + Checking property : + -> Error a should less than or equal to 1 +Target node + Applying shape + to node + closed: false + Checking property : +Target node + Applying shape + to node + closed: false + Checking property : + Expected statements: 18 + Actual statements: 18 + -> FAILED, expected: + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix m: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode m:InvalidResource1; + sh:resultPath m:property; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MaxInclusiveConstraintComponent; + sh:sourceShape m:TestShape-property; + sh:value 2 + ], + [ + a sh:ValidationResult; + sh:focusNode m:InvalidResource2; + sh:resultPath m:property; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MaxInclusiveConstraintComponent; + sh:sourceShape m:TestShape-property; + sh:value "a" + ] +]. + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix m: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode m:InvalidResource1; + sh:resultPath m:property; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MaxInclusiveConstraintComponent; + sh:sourceShape m:TestShape; + sh:value 2 + ], + [ + a sh:ValidationResult; + sh:focusNode m:InvalidResource2; + sh:resultPath m:property; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MaxInclusiveConstraintComponent; + sh:sourceShape m:TestShape; + sh:value "a" + ] +]. + +__________________________________________________ + +1 +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test + Expected statements: 10 + Actual statements: 2 + -> FAILED, expected: + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix m: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode m:InvalidInstance1; + sh:resultPath m:testProperty; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MaxLengthConstraintComponent; + sh:sourceShape m:TestShape-testProperty; + sh:value "ABC" + ] +]. + +__________________________________________________ +@prefix : <#>. +@prefix sh: . + +[ a sh:ValidationReport; sh:conforms true ]. + + +__________________________________________________ + +1 +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test +Target class +Target class member + Applying shape + to node + closed: false + Checking property : + -> Too few (0) on +Target class member + Applying shape + to node + closed: false + Checking property : +Target node + Applying shape + to node + closed: false + Checking property : + Expected statements: 9 + Actual statements: 9 + -> FAILED, expected: + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix min: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode min:InvalidPerson; + sh:resultPath min:firstName; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MinCountConstraintComponent; + sh:sourceShape min:PersonShape-firstName + ] +]. + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix min: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode min:InvalidPerson; + sh:resultPath min:firstName; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MinCountConstraintComponent; + sh:sourceShape min:PersonShape + ] +]. + +__________________________________________________ + +1 +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test +Target node + Applying shape + to node + closed: false + Checking property _:n415: + Expected statements: 2 + Actual statements: 2 + Match -> passed +1 +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test + Expected statements: 18 + Actual statements: 2 + -> FAILED, expected: + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix min: . +@prefix rd: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode min:InvalidInstance1; + sh:resultPath min:testProperty; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MinExclusiveConstraintComponent; + sh:sourceShape min:TestShape-testProperty; + sh:value "A string" + ], + [ + a sh:ValidationResult; + sh:focusNode min:InvalidInstance2; + sh:resultPath min:testProperty; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MinExclusiveConstraintComponent; + sh:sourceShape min:TestShape-testProperty; + sh:value rd:Resource + ] +]. + +__________________________________________________ +@prefix : <#>. +@prefix sh: . + +[ a sh:ValidationReport; sh:conforms true ]. + + +__________________________________________________ + +1 +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test + Expected statements: 10 + Actual statements: 2 + -> FAILED, expected: + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix min: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode min:InvalidInstance1; + sh:resultPath min:testProperty; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MinLengthConstraintComponent; + sh:sourceShape min:TestShape-testProperty; + sh:value "A" + ] +]. + +__________________________________________________ +@prefix : <#>. +@prefix sh: . + +[ a sh:ValidationReport; sh:conforms true ]. + + +__________________________________________________ + +1 +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test + Expected statements: 10 + Actual statements: 2 + -> FAILED, expected: + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix nod: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode nod:Issue_1; + sh:resultPath nod:assignedTo; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:NodeConstraintComponent; + sh:sourceShape nod:Issue-assignedTo; + sh:value nod:Anon + ] +]. + +__________________________________________________ +@prefix : <#>. +@prefix sh: . + +[ a sh:ValidationReport; sh:conforms true ]. + + +__________________________________________________ + +1 +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test + Expected statements: 18 + Actual statements: 2 + -> FAILED, expected: + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix min: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode min:InvalidInstance1; + sh:resultPath min:testProperty; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MinExclusiveConstraintComponent; + sh:sourceShape min:TestShape-testProperty; + sh:value 40 + ], + [ + a sh:ValidationResult; + sh:focusNode min:InvalidInstance2; + sh:resultPath min:testProperty; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:MinExclusiveConstraintComponent; + sh:sourceShape min:TestShape-testProperty; + sh:value 39 + ] +]. + +__________________________________________________ +@prefix : <#>. +@prefix sh: . + +[ a sh:ValidationReport; sh:conforms true ]. + + +__________________________________________________ + +1 +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test +Target class +Target class member + Applying shape + to node + closed: false + Checking property : + Applying shape + to node + closed: false + Checking property : + -> Error should match shape +Target class member + Applying shape + to node + closed: false + Checking property : + Applying shape + to node + closed: false + Checking property : + -> Error 5678 should be datatype + Expected statements: 10 + Actual statements: 10 + -> FAILED, expected: + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix nod: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode nod:Reto; + sh:resultPath nod:address; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:NodeConstraintComponent; + sh:sourceShape nod:PersonShape-address; + sh:value nod:RetosAddress + ] +]. + +__________________________________________________ +@prefix : <#>. +@prefix sh: . +@prefix nod: . + +[ + a sh:ValidationReport; + sh:conforms true; + sh:result + [ + a sh:ValidationResult; + sh:focusNode nod:Bob; + sh:resultPath nod:address; + sh:resultSeverity sh:Violation; + sh:sourceConstraintComponent sh:NodeConstraintComponent; + sh:sourceShape nod:PersonShape; + sh:value nod:BobsAddress + ] +]. + +__________________________________________________ + +1 +Manifest loaded: +Entries 1 + -- Do approp test for +loading... + includes: 0 for + Validation test +Target class +Target class member + Applying shape + to node + closed: false +@@ NO PATH! 0 +as subject: 0 +as object: 0 +property: _:n463 +shape: +about shape: ., _:n463 ., . +node: diff --git a/test/shapes/bnodetest.js b/test/shapes/bnodetest.js new file mode 100644 index 0000000..35ce8c1 --- /dev/null +++ b/test/shapes/bnodetest.js @@ -0,0 +1,27 @@ + +const $rdf = require('rdflib') + +const kb = $rdf.graph() +const fetcher = $rdf.fetcher(kb) + +const sh = $rdf.Namespace('http://www.w3.org/ns/shacl#') + +const here = 'file:///devel/github.com/linkeddata/rabel/test/shapes/' + +const doc = $rdf.sym(here + 'nodeKind-001.ttl') + + +const ex0 = $rdf.Namespace(doc.uri + '#') +const ex = $rdf.Namespace('http://datashapes.org/sh/tests/core/property/nodeKind-001.test#') +const log = console.log + +fetcher.load(doc).then(function(xhr){ + log("loaded") + let shape = ex('ShapeWithBlankNode') + log('shape: ' + shape) + let property = kb.the(shape, sh('property')) + log('property: ' + property) + let path = kb.the(property, sh('path')) + log('path: ' + path) + process.exit(0) +}) diff --git a/test/shapes/nodeKind-001.ttl b/test/shapes/nodeKind-001.ttl new file mode 100644 index 0000000..f31e5ea --- /dev/null +++ b/test/shapes/nodeKind-001.ttl @@ -0,0 +1,370 @@ +@prefix dash: . +@prefix ex: . +@prefix mf: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix sh: . +@prefix sht: . +@prefix xsd: . + +ex:InstanceWithBlankNode + rdf:type ex:MyClass ; + ex:myProperty _:b55454 ; +. +ex:InstanceWithBlankNodeAndIRI + rdf:type ex:MyClass ; + ex:myProperty rdfs:Class ; + ex:myProperty _:b67098 ; +. +ex:InstanceWithBlankNodeAndLiteral + rdf:type ex:MyClass ; + ex:myProperty "Literal" ; + ex:myProperty _:b99026 ; +. +ex:InstanceWithIRI + rdf:type ex:MyClass ; + ex:myProperty rdfs:Class ; +. +ex:InstanceWithIRIAndLiteral + rdf:type ex:MyClass ; + ex:myProperty rdfs:Class ; + ex:myProperty "Literal" ; +. +ex:InstanceWithLiteral + rdf:type ex:MyClass ; + ex:myProperty "Literal" ; +. +ex:MyClass + rdf:type rdfs:Class ; + rdfs:label "My class" ; +. +ex:ShapeWithBlankNode + rdf:type sh:NodeShape ; + sh:property _:b38619 ; + sh:targetClass ex:MyClass ; +. +ex:ShapeWithBlankNodeOrIRI + rdf:type sh:NodeShape ; + sh:property _:b3078 ; + sh:targetClass ex:MyClass ; +. +ex:ShapeWithBlankNodeOrLiteral + rdf:type sh:NodeShape ; + sh:property _:b14975 ; + sh:targetClass ex:MyClass ; +. +ex:ShapeWithIRI + rdf:type sh:NodeShape ; + sh:property _:b97614 ; + sh:targetClass ex:MyClass ; +. +ex:ShapeWithIRIOrLiteral + rdf:type sh:NodeShape ; + sh:property _:b97860 ; + sh:targetClass ex:MyClass ; +. +ex:ShapeWithLiteral + rdf:type sh:NodeShape ; + sh:property _:b79526 ; + sh:targetClass ex:MyClass ; +. +ex:myProperty + rdf:type rdf:Property ; + rdfs:domain ex:MyClass ; + rdfs:label "my property" ; +. +<> + rdf:type mf:Manifest ; + mf:entries ( + + ) ; +. + + rdf:type sht:Validate ; + mf:action [ + sht:dataGraph <> ; + sht:shapesGraph <> ; + ] ; + mf:result [ + rdf:type sh:ValidationReport ; + sh:conforms "false"^^xsd:boolean ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:InstanceWithBlankNode ; + sh:resultPath ex:myProperty ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape _:b79526 ; + sh:value _:b55454 ; + ] ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:InstanceWithBlankNode ; + sh:resultPath ex:myProperty ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape _:b97614 ; + sh:value _:b55454 ; + ] ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:InstanceWithBlankNode ; + sh:resultPath ex:myProperty ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape _:b97860 ; + sh:value _:b55454 ; + ] ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:InstanceWithBlankNodeAndIRI ; + sh:resultPath ex:myProperty ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape _:b14975 ; + sh:value rdfs:Class ; + ] ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:InstanceWithBlankNodeAndIRI ; + sh:resultPath ex:myProperty ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape _:b38619 ; + sh:value rdfs:Class ; + ] ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:InstanceWithBlankNodeAndIRI ; + sh:resultPath ex:myProperty ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape _:b79526 ; + sh:value rdfs:Class ; + ] ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:InstanceWithBlankNodeAndIRI ; + sh:resultPath ex:myProperty ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape _:b79526 ; + sh:value _:b67098 ; + ] ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:InstanceWithBlankNodeAndIRI ; + sh:resultPath ex:myProperty ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape _:b97614 ; + sh:value _:b67098 ; + ] ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:InstanceWithBlankNodeAndIRI ; + sh:resultPath ex:myProperty ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape _:b97860 ; + sh:value _:b67098 ; + ] ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:InstanceWithBlankNodeAndLiteral ; + sh:resultPath ex:myProperty ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape _:b3078 ; + sh:value "Literal" ; + ] ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:InstanceWithBlankNodeAndLiteral ; + sh:resultPath ex:myProperty ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape _:b38619 ; + sh:value "Literal" ; + ] ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:InstanceWithBlankNodeAndLiteral ; + sh:resultPath ex:myProperty ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape _:b79526 ; + sh:value _:b99026 ; + ] ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:InstanceWithBlankNodeAndLiteral ; + sh:resultPath ex:myProperty ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape _:b97614 ; + sh:value "Literal" ; + ] ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:InstanceWithBlankNodeAndLiteral ; + sh:resultPath ex:myProperty ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape _:b97614 ; + sh:value _:b99026 ; + ] ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:InstanceWithBlankNodeAndLiteral ; + sh:resultPath ex:myProperty ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape _:b97860 ; + sh:value _:b99026 ; + ] ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:InstanceWithIRI ; + sh:resultPath ex:myProperty ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape _:b14975 ; + sh:value rdfs:Class ; + ] ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:InstanceWithIRI ; + sh:resultPath ex:myProperty ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape _:b38619 ; + sh:value rdfs:Class ; + ] ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:InstanceWithIRI ; + sh:resultPath ex:myProperty ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape _:b79526 ; + sh:value rdfs:Class ; + ] ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:InstanceWithIRIAndLiteral ; + sh:resultPath ex:myProperty ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape _:b3078 ; + sh:value "Literal" ; + ] ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:InstanceWithIRIAndLiteral ; + sh:resultPath ex:myProperty ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape _:b14975 ; + sh:value rdfs:Class ; + ] ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:InstanceWithIRIAndLiteral ; + sh:resultPath ex:myProperty ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape _:b38619 ; + sh:value rdfs:Class ; + ] ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:InstanceWithIRIAndLiteral ; + sh:resultPath ex:myProperty ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape _:b38619 ; + sh:value "Literal" ; + ] ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:InstanceWithIRIAndLiteral ; + sh:resultPath ex:myProperty ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape _:b79526 ; + sh:value rdfs:Class ; + ] ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:InstanceWithIRIAndLiteral ; + sh:resultPath ex:myProperty ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape _:b97614 ; + sh:value "Literal" ; + ] ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:InstanceWithLiteral ; + sh:resultPath ex:myProperty ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape _:b3078 ; + sh:value "Literal" ; + ] ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:InstanceWithLiteral ; + sh:resultPath ex:myProperty ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape _:b38619 ; + sh:value "Literal" ; + ] ; + sh:result [ + rdf:type sh:ValidationResult ; + sh:focusNode ex:InstanceWithLiteral ; + sh:resultPath ex:myProperty ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape _:b97614 ; + sh:value "Literal" ; + ] ; + ] ; + mf:status sht:proposed ; +. +_:b3078 + sh:path ex:myProperty ; + sh:nodeKind sh:BlankNodeOrIRI ; +. +_:b14975 + sh:path ex:myProperty ; + sh:nodeKind sh:BlankNodeOrLiteral ; +. +_:b38619 + sh:path ex:myProperty ; + sh:nodeKind sh:BlankNode ; +. +_:b55454 + rdf:type rdfs:Resource ; +. +_:b67098 + rdf:type rdfs:Resource ; +. +_:b79526 + sh:path ex:myProperty ; + sh:nodeKind sh:Literal ; +. +_:b97614 + sh:path ex:myProperty ; + sh:nodeKind sh:IRI ; +. +_:b97860 + sh:path ex:myProperty ; + sh:nodeKind sh:IRIOrLiteral ; +. +_:b99026 + rdf:type rdfs:Resource ; +. diff --git a/test/turtle/README.txt b/test/turtle/README.txt new file mode 100644 index 0000000..06e481d --- /dev/null +++ b/test/turtle/README.txt @@ -0,0 +1,10 @@ + +See https://www.w3.org/2013/TurtleTests/ +and +https://www.w3.org/2013/TurtleTests/manifest.ttl + +/devel/github.com/w3c/data-shapes/data-shapes-test-suite/tests/dash/core/manifest.ttl + + +http://w3c.github.io/data-shapes/data-shapes-test-suite/tests/dash/core/manifest.ttl + diff --git a/test/turtle/manifest.ttl b/test/turtle/manifest.ttl new file mode 100644 index 0000000..babcde4 --- /dev/null +++ b/test/turtle/manifest.ttl @@ -0,0 +1,9 @@ +@prefix rdf: . +@prefix rdfs: . +@prefix mf: . + +@prefix rdft: . + +<> a mf:Manifest; + rdfs:label "Turtle tests - (pointer to)"; + mf:include . diff --git a/test/turtle/rdf:type b/test/turtle/rdf:type new file mode 100644 index 0000000..e69de29 From fa4eac726e406e3c85c5f618f0d580d00bead0f1 Mon Sep 17 00:00:00 2001 From: Tim Berners-Lee Date: Tue, 21 May 2019 16:17:51 -0400 Subject: [PATCH 19/23] Upgrade shacl-check to 1.0.3 as earlier broken --- index.js | 103 ++-- package-lock.json | 909 +++++++++++++++++++++++++++++++ package.json | 11 +- test/shapes/bnodetest.js | 5 +- test/{rabel.js => test-rabel.js} | 5 +- 5 files changed, 974 insertions(+), 59 deletions(-) create mode 100644 package-lock.json rename test/{rabel.js => test-rabel.js} (94%) diff --git a/index.js b/index.js index 9c71865..f87a11e 100644 --- a/index.js +++ b/index.js @@ -9,6 +9,7 @@ var $rdf = require('rdflib') var fs = require('fs') var ensurePath = require('fs-extra').ensureDirSync var path = require('path') +const ShapeChecker = require('shacl-check') // var ShapeChecker = require('./../shacl-check/src/shacl-check.js') const RDF = $rdf.Namespace('http://www.w3.org/1999/02/22-rdf-syntax-ns#') @@ -16,9 +17,8 @@ const a = RDF('type') const mf = $rdf.Namespace('http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#') const sht = $rdf.Namespace('http://www.w3.org/ns/shacl/test-suite#') - var testHandlers = [] -var registerTest = function(klass, handler){ +var registerTest = function (klass, handler) { testHandlers[klass.uri || klass] = handler } @@ -38,7 +38,8 @@ var statementsToTurtle = function (kb, statements, base) { } // Returns a promise of an issues list -var validationTest = function(test, kb){ +var validationTest = function (test, kb) { + var actualGraph, expected, shapesGraph, action, dataGraph const indent = ' ' var forwardTree = function (x) { var sts = [] @@ -56,17 +57,17 @@ var validationTest = function(test, kb){ } console.log(indent + 'Validation test ' + test) action = kb.the(test, mf('action')) - if (!action) throw new Error("Need action") + if (!action) throw new Error('Need action') dataGraph = kb.the(action, sht('dataGraph')) shapesGraph = kb.the(action, sht('shapesGraph')) // A doc actualGraph = kb.sym(test.uri + '__results') - if (!dataGraph || !shapesGraph || !actualGraph) throw new Error("Need all params") + if (!dataGraph || !shapesGraph || !actualGraph) throw new Error('Need all params') let opts = { noResultMessage: true } // must be excludded from tests ;(new ShapeChecker(kb, shapesGraph, dataGraph, actualGraph, opts)).execute() expected = kb.the(test, mf('result')) // Node var expectedDoc = kb.statementsMatching(expected)[0].graph // whare is that data anyway? - var base = expected.doc? expected.doc().uri : dataGraph.uri + // var base = expected.doc ? expected.doc().uri : dataGraph.uri let expectedStatements = forwardTree(expected) console.log(indent + 'Expected statements: ' + expectedStatements.length) let expectedString = statementsToTurtle(kb, expectedStatements, expectedDoc.uri) @@ -80,19 +81,23 @@ var validationTest = function(test, kb){ console.log(indent + ' -> FAILED, expected:') let ul = '\n__________________________________________________\n' console.log(ul + expectedString + ul + actualString + ul) - issues.push({ test, expectedString, actualString, // generic - dataGraph, shapesGraph, actualGraph}) // test type specific + issues.push({ test, + expectedString, + actualString, // generic + dataGraph, + shapesGraph, + actualGraph}) // test type specific } return Promise.resolve(issues) } registerTest(sht('Validate'), validationTest) // Returns promise of issues array -var doAppropriateTest = function (test, kb){ - return new Promise(function(resolve, reject){ +var doAppropriateTest = function (test, kb) { + return new Promise(function (resolve, reject) { console.log(' -- Do approp test for ' + test) var testDoc - if (test.uri.includes('#')){ + if (test.uri.includes('#')) { testDoc = test.doc() } else { if (test.uri.endsWith('.ttl')) { @@ -101,13 +106,12 @@ var doAppropriateTest = function (test, kb){ testDoc = kb.sym(test.uri + '.ttl') /// needed for shacl tests in file space } } - console.log( "loading... " + testDoc) - fetcher.load(testDoc).then(function (xhr) { + console.log('loading... ' + testDoc) + kb.fetcher.load(testDoc).then(function (xhr) { var klasses = kb.each(test, a) - var ppp = [] - for (let j=0; j doAppropriateTest(test, kb)) } let includes = kb.each(doc, mf('include')) - console.log(indent + ' includes: ' + includes.length + ' for ' + doc ) + console.log(indent + ' includes: ' + includes.length + ' for ' + doc) promises = promises.concat(includes.map(runTests)) - Promise.all(promises).then(function(issues){ - console.log('Done with ' + doc + ': ' + issues ? issues.length : "ISSUES ERROR @@@") + Promise.all(promises).then(function (issues) { + console.log('Done with ' + doc + ': ' + issues ? issues.length : 'ISSUES ERROR @@@') resolve(issues) // @@ mayeb have to concat subarrays }) .catch(function (e) { - const message = "ERROR in runTests loading " + doc + ': ' + e + const message = 'ERROR in runTests loading ' + doc + ': ' + e console.log(message) console.log('stack: ' + e.strack.toString()) reject(new Error(message)) @@ -201,19 +203,19 @@ var spray = function (rootURI, original, exitMessage, kb, finished) { sts = sts.concat(connected) } console.log('We have ' + sts.length + ' total statements in document ' + docURI) - var fileName = docURI.slice(7) + '.ttl' + var fileName = docURI.slice(7) + '.ttl' var out = statementsToTurtle(kb, sts, docURI) console.log('To be written to ' + fileName + ':\n' + out + '\n') - var foo = function (fileName, out){ + var foo = function (fileName, out) { var f = fileName ensurePath(path.dirname(f)) fs.writeFile(f, out, function (err) { if (err) { - exitMessage("***** Error writing file <" + f + "> :" + err) + exitMessage('***** Error writing file <' + f + '> :' + err) } - console.log("Written ok: " + f) + console.log('Written ok: ' + f) if (--waitingFor === 0) { finished() } @@ -221,7 +223,6 @@ var spray = function (rootURI, original, exitMessage, kb, finished) { } foo(fileName, out) - } } @@ -229,16 +230,17 @@ var spray = function (rootURI, original, exitMessage, kb, finished) { // // Contains namespace-trigged specials for IANA registry data // -var readXML = function (targetDocument, options, callback, kb) { - var uri = targetDocument.uri - var file = $rdf.Util.uri.refTo(base, uri) +var readXML = function (targetDocument, options, callbackFunction, kb) { + const uri = targetDocument.uri + const base = 'file:///' + const file = $rdf.Util.uri.refTo(base, uri) var ignore = { 7: true } fs.readFile(file, options.encoding || 'utf8', function (err, data) { var defaultNamespace = null if (err) { console.log('File read FAIL, error: ' + err) - return callback(false, err) + return callbackFunction(false, err) } console.log('File read ok, length: ' + data.length) var local = $rdf.uri.join(file, base) + '#' @@ -274,15 +276,15 @@ var readXML = function (targetDocument, options, callback, kb) { return text } - var randomNamedNode = function(){ + var randomNamedNode = function () { return kb.sym(root.uri + '#n' + (nextId++)) } // ///////////////////////// GPX SPECIAL - var GPX_predicateMap = { + var predicateMapForGPX = { time: { uri: 'http://www.w3.org/2003/01/geo/wgs84_pos#time', - type: 'http://www.w3.org/2001/XMLSchema#dateTime' }, + type: 'http://www.w3.org/2001/XMLSchema#dateTime' }, lat: { uri: 'http://www.w3.org/2003/01/geo/wgs84_pos#lat' }, lon: { uri: 'http://www.w3.org/2003/01/geo/wgs84_pos#long' }, @@ -291,11 +293,11 @@ var readXML = function (targetDocument, options, callback, kb) { // ///////////////////////// IANA SPECIAL - var IANA_predicateMap = { + var predicateMapForIANA = { created: { uri: 'http://purl.org/dc/terms/created', - type: 'http://www.w3.org/2001/XMLSchema#date' }, // @@CHECK + type: 'http://www.w3.org/2001/XMLSchema#date' }, // @@CHECK date: { uri: 'http://purl.org/dc/terms/date', - type: 'http://www.w3.org/2001/XMLSchema#date' }, // @@CHECK + type: 'http://www.w3.org/2001/XMLSchema#date' }, // @@CHECK description: { uri: 'http://purl.org/dc/terms/description' }, // @@CHECK title: { uri: 'http://purl.org/dc/terms/title' }, value: { uri: 'http://www.w3.org/2000/01/rdf-schema#label' }, @@ -372,7 +374,7 @@ var readXML = function (targetDocument, options, callback, kb) { // console.log('@@ 3 magicIANAsubject tag: ' + ele.tagName + ' parent: ' + parent.tagName ) if (ele.tagName === 'record' && parent.tagName === 'registry') { for (let i = 0; i < ch.length; i++) { - var child = ch[i] + let child = ch[i] if (child.nodeName === 'name') { return kb.sym($rdf.uri.join(parent.getAttribute('id') + '/' + child.textContent, local) + '#Resource') } @@ -419,11 +421,11 @@ var readXML = function (targetDocument, options, callback, kb) { if (defaultNamespace === 'http://www.iana.org/assignments') { options.iana = true ns = 'https://www.w3.org/ns/assignments/reg#' - options.predicateMap = IANA_predicateMap + options.predicateMap = predicateMapForIANA console.log('IANA MODE') } else if (defaultNamespace === 'http://www.topografix.com/GPX/1/1') { ns = 'http://hackdiary.com/ns/gps#' // @@@ u - options.predicateMap = GPX_predicateMap + options.predicateMap = predicateMapForGPX console.log('GPX Mode') } continue @@ -462,12 +464,12 @@ var readXML = function (targetDocument, options, callback, kb) { if (child.attributes && child.getAttribute('id')) { if (options.iana && child.nodeName === 'person') { let who = child.getAttribute('id') - if (!who) throw new Error("Person has no ID") + if (!who) throw new Error('Person has no ID') obj = kb.sym($rdf.uri.join('../person/', local) + who + '#') console.log(indent + 'Person is ' + obj) } else { let who = child.getAttribute('id') - if (!who) throw new Error("Thing has no ID") + if (!who) throw new Error('Thing has no ID') obj = kb.sym(local + child.getAttribute('id')) console.log(indent + 'Local thing is ' + obj) } @@ -476,7 +478,7 @@ var readXML = function (targetDocument, options, callback, kb) { console.log(indent + 'Magic IANA URI ' + obj) // kb.add(obj, RDF('type'), RDF('Property') , targetDocument) } else { - if (options.iana && child.nodeName === 'uri'){ + if (options.iana && child.nodeName === 'uri') { obj = kb.sym(justTextContent(child)) } else if (options.iana && child.nodeName === 'people') { obj = randomNamedNode() @@ -492,7 +494,7 @@ var readXML = function (targetDocument, options, callback, kb) { } } convert(doc, root) - callback(true) + callbackFunction(true) }) } @@ -501,6 +503,5 @@ var readXML = function (targetDocument, options, callback, kb) { module.exports = { check: check, spray: spray, - readXML: readXML, + readXML: readXML } - diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..8926495 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,909 @@ +{ + "name": "rabel", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "diff": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "es6-promise": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz", + "integrity": "sha1-lu258v2wGZWCKyY92KratnSBgbw=" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonld": { + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/jsonld/-/jsonld-0.4.12.tgz", + "integrity": "sha1-oC8gXVNBQU3xtthBTxuWenEgc+g=", + "requires": { + "es6-promise": "^2.0.0", + "pkginfo": "~0.4.0", + "request": "^2.61.0", + "xmldom": "0.1.19" + }, + "dependencies": { + "xmldom": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.19.tgz", + "integrity": "sha1-Yx/Ad3bv2EEYvyUXGzftTQdaCrw=" + } + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "requires": { + "mime-db": "1.40.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", + "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.3.1", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + } + }, + "mock-http-server": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/mock-http-server/-/mock-http-server-0.2.0.tgz", + "integrity": "sha1-7e/sDoC+i8oobx4MAN6Nv+vw7JA=", + "dev": true, + "requires": { + "body-parser": "^1.18.1", + "connect": "^3.4.0", + "multiparty": "^4.1.2", + "underscore": "^1.8.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multiparty": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/multiparty/-/multiparty-4.2.1.tgz", + "integrity": "sha512-AvESCnNoQlZiOfP9R4mxN8M9csy2L16EIbWIkt3l4FuGti9kXBS8QVzlfyg4HEnarJhrzZilgNFlZtqmoiAIIA==", + "dev": true, + "requires": { + "fd-slicer": "1.1.0", + "http-errors": "~1.7.0", + "safe-buffer": "5.1.2", + "uid-safe": "2.1.5" + } + }, + "n3": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/n3/-/n3-0.4.5.tgz", + "integrity": "sha1-W3DTq2ohyejUyb2io9TZCQm+tQg=" + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pkginfo": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", + "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=" + }, + "psl": { + "version": "1.1.31", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==" + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rdflib": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/rdflib/-/rdflib-0.15.0.tgz", + "integrity": "sha1-onFe4Q8TN84rCw2hzTsQeZqu3gc=", + "requires": { + "async": "^0.9.x", + "jsonld": "^0.4.5", + "n3": "^0.4.1", + "xmldom": "^0.1.22", + "xmlhttprequest": "^1.7.0" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "shacl-check": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/shacl-check/-/shacl-check-1.0.3.tgz", + "integrity": "sha512-ouvSHK2LpEF2JzGq2ic3tI3EUnQS3URwVri8E5f94aMVcrveIr9a4J0vgE3SGwUEHy3Ywl0IKbXQlLQjUdy0TQ==", + "requires": { + "rdflib": ">=0.15.0" + } + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "dev": true, + "requires": { + "random-bytes": "~1.0.0" + } + }, + "underscore": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", + "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==", + "dev": true + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xmldom": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", + "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=" + }, + "xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" + } + } +} diff --git a/package.json b/package.json index 89ff02f..a1f4d64 100644 --- a/package.json +++ b/package.json @@ -15,18 +15,21 @@ "homepage": "http://github.com/linkeddata/rabel", "bugs": "http://github.com/linkeddata/rabel/issues", "dependencies": { - "rdflib": "^0.15.0", "fs-extra": "^4.0.2", - "shacl-check": "^0.0.1", + "node-fetch": "^2.6.0", + "rdflib": "^0.15.0", + "shacl-check": "^1.0.3", "xmldom": "^0.1.22" }, "bin": { "rabel": "./bin/rabel" }, "devDependencies": { - "fs-extra": "^4.0.2", "mocha": "^4.0.1", "mock-http-server": "^0.2.0" }, - "main": "index.js" + "main": "index.js", + "scripts": { + "test": "mocha" + } } diff --git a/test/shapes/bnodetest.js b/test/shapes/bnodetest.js index 35ce8c1..e1e6085 100644 --- a/test/shapes/bnodetest.js +++ b/test/shapes/bnodetest.js @@ -10,13 +10,12 @@ const here = 'file:///devel/github.com/linkeddata/rabel/test/shapes/' const doc = $rdf.sym(here + 'nodeKind-001.ttl') - const ex0 = $rdf.Namespace(doc.uri + '#') const ex = $rdf.Namespace('http://datashapes.org/sh/tests/core/property/nodeKind-001.test#') const log = console.log -fetcher.load(doc).then(function(xhr){ - log("loaded") +fetcher.load(doc).then(function (xhr) { + log('loaded') let shape = ex('ShapeWithBlankNode') log('shape: ' + shape) let property = kb.the(shape, sh('property')) diff --git a/test/rabel.js b/test/test-rabel.js similarity index 94% rename from test/rabel.js rename to test/test-rabel.js index d1a8bb9..2cc273e 100644 --- a/test/rabel.js +++ b/test/test-rabel.js @@ -1,3 +1,5 @@ +/* TEST the rabel utility +*/ let fetch = require('node-fetch') let assert = require('assert') let path = require('path') @@ -16,6 +18,7 @@ package.json: }, */ +// rabel -test=../../w3c/data-shapes/data-shapes-test-suite/tests/dash/core/node/manifest.ttl" xdescribe('fetch', () => { [ // These will pass. @@ -67,7 +70,7 @@ describe('rabel', () => { let filePath = path.join(__dirname, t.file) it('should load and spray ' + filePath, done => { let kb = $rdf.graph() - let fetcher = $rdf.fetcher(kb, {a:1}) + let fetcher = $rdf.fetcher(kb, {a: 1}) let doc = kb.sym('file://' + filePath) try { fs.removeSync(TARGET_DIR) From 762d9fcbe23e021129472d09c8bca0fcc1970cb1 Mon Sep 17 00:00:00 2001 From: Tim Berners-Lee Date: Tue, 21 May 2019 16:18:06 -0400 Subject: [PATCH 20/23] 1.0.1 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8926495..d34fc63 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "rabel", - "version": "1.0.0", + "version": "1.0.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index a1f4d64..f70ee14 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "rabel", "description": "Linked Data command line utility", - "version": "1.0.0", + "version": "1.0.1", "author": { "name": "Tim Berners-Lee", "email": "timbl@w3.org" From 925f691edf8a8bf43f392dc1e03874c05521ddc8 Mon Sep 17 00:00:00 2001 From: Tim Berners-Lee Date: Tue, 21 May 2019 18:43:24 -0400 Subject: [PATCH 21/23] sigh - npm caret problem gave us very old rdflib --- bin/rabel | 5 +- package-lock.json | 576 ++++++++++++++++++++++++++++++++++++++++++++-- package.json | 2 +- 3 files changed, 564 insertions(+), 19 deletions(-) diff --git a/bin/rabel b/bin/rabel index 888d132..d6c4f7a 100755 --- a/bin/rabel +++ b/bin/rabel @@ -1,8 +1,8 @@ -#!/usr/bin/env node +// #!/usr/bin/env node 'use strict'; -/** +/** COMMAND LINE TOOL FOR LINKED DATA: rabel */ let path = require('path') @@ -256,4 +256,3 @@ try { console.error('stack' in e ? e.stack : e) process.exit(4) } - diff --git a/package-lock.json b/package-lock.json index d34fc63..68c924a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,183 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/runtime": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz", + "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "@solid/cli": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@solid/cli/-/cli-0.1.0.tgz", + "integrity": "sha512-+VYDgDxsAKa48MGnoaX2CUwh0gLrTdqYY6lrxxWGwCHiFChGsg95RRbHOYz9c97+QcCltcHpMZ2AelGZrU673A==", + "requires": { + "@trust/oidc-rp": "0.6.0" + } + }, + "@solid/jose": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@solid/jose/-/jose-0.1.8.tgz", + "integrity": "sha512-JuP3z2Yuyolv7P0w7MPhjWltWbVzV0vHBFw+ZhxG2v2WOPdbGT+CvUMhCMdMG/csavceV+IpwMXMybMd8nC4sA==", + "requires": { + "@trust/json-document": "^0.1.4", + "@trust/webcrypto": "^0.9.2", + "base64url": "^3.0.0", + "text-encoding": "^0.6.4" + }, + "dependencies": { + "@trust/webcrypto": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@trust/webcrypto/-/webcrypto-0.9.2.tgz", + "integrity": "sha512-5iMAVcGYKhqLJGjefB1nzuQSqUJTru0nG4CytpBT/GGp1Piz/MVnj2jORdYf4JBYzggCIa8WZUr2rchP2Ngn/w==", + "requires": { + "@trust/keyto": "^0.3.4", + "base64url": "^3.0.0", + "elliptic": "^6.4.0", + "node-rsa": "^0.4.0", + "text-encoding": "^0.6.1" + } + }, + "base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" + } + } + }, + "@solid/oidc-rp": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@solid/oidc-rp/-/oidc-rp-0.8.0.tgz", + "integrity": "sha512-AAHd+J1IiASDmqDQkU8ou8Gxmc7+VfpcgGFW1rCul/obCsNzSemwvEslxjstK7Yy725HtucoAbZN2BGKujeQAg==", + "requires": { + "@solid/jose": "0.1.8", + "@trust/json-document": "^0.1.4", + "@trust/webcrypto": "0.9.2", + "base64url": "^3.0.0", + "node-fetch": "^2.1.2", + "standard-http-error": "^2.0.1", + "text-encoding": "^0.6.4", + "whatwg-url": "^6.4.1" + }, + "dependencies": { + "@trust/webcrypto": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@trust/webcrypto/-/webcrypto-0.9.2.tgz", + "integrity": "sha512-5iMAVcGYKhqLJGjefB1nzuQSqUJTru0nG4CytpBT/GGp1Piz/MVnj2jORdYf4JBYzggCIa8WZUr2rchP2Ngn/w==", + "requires": { + "@trust/keyto": "^0.3.4", + "base64url": "^3.0.0", + "elliptic": "^6.4.0", + "node-rsa": "^0.4.0", + "text-encoding": "^0.6.1" + } + }, + "base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" + } + } + }, + "@trust/jose": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@trust/jose/-/jose-0.1.7.tgz", + "integrity": "sha512-JlWY97+Q1pU2CN08Ux5oN1/CXcvxLtQ5YkL4UhgVs4z9TR/+I4rKqhqoZQ0TDGPvCLP1QaT7F6bHbKswbDwgOQ==", + "requires": { + "@trust/json-document": "^0.1.4", + "@trust/webcrypto": "^0.0.2", + "base64url": "^2.0.0", + "text-encoding": "^0.6.1" + }, + "dependencies": { + "@trust/webcrypto": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@trust/webcrypto/-/webcrypto-0.0.2.tgz", + "integrity": "sha1-53xpouYSudOSJRxZZscxaFN+Jmc=", + "requires": { + "base64url": "^2.0.0", + "node-rsa": "^0.4.0", + "pem-jwk": "^1.5.1", + "text-encoding": "^0.6.1" + } + } + } + }, + "@trust/json-document": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@trust/json-document/-/json-document-0.1.4.tgz", + "integrity": "sha1-sgI7HhRbp2hb0fNux7aRKJQAc+k=" + }, + "@trust/keyto": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/@trust/keyto/-/keyto-0.3.7.tgz", + "integrity": "sha512-t5kWWCTkPgg24JWVuCTPMx7l13F7YHdxBeJkT1vmoHjROgiOIEAN8eeY+iRmP1Hwsx+S7U55HyuqSsECr08a8A==", + "requires": { + "asn1.js": "^5.0.1", + "base64url": "^3.0.1", + "elliptic": "^6.4.1" + }, + "dependencies": { + "asn1.js": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.0.1.tgz", + "integrity": "sha512-aO8EaEgbgqq77IEw+1jfx5c9zTbzvkfuRBuZsSsPnTHMkmd5AI4J6OtITLZFa381jReeaQL67J0GBTUu0+ZTVw==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + } + } + }, + "@trust/oidc-rp": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@trust/oidc-rp/-/oidc-rp-0.6.0.tgz", + "integrity": "sha512-6PgV0WI+gq6nGMjlg8oSxj7VgmS/m8Y61s6HPNBu3mX/NSVvnrXk+MqqR7KdxlBk84ti65O76HGSRNelJrRbeA==", + "requires": { + "@trust/jose": "^0.1.7", + "@trust/json-document": "^0.1.4", + "@trust/webcrypto": "0.4.0", + "base64url": "^2.0.0", + "node-fetch": "^1.7.3", + "text-encoding": "^0.6.4", + "whatwg-url": "^6.2.1" + }, + "dependencies": { + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + } + } + }, + "@trust/webcrypto": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@trust/webcrypto/-/webcrypto-0.4.0.tgz", + "integrity": "sha1-zIcSyomn5x01P877ZrJwemec9jU=", + "requires": { + "@trust/keyto": "^0.3.0", + "base64url": "^2.0.0", + "node-rsa": "^0.4.0", + "text-encoding": "^0.6.1" + } + }, "ajv": { "version": "6.10.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", @@ -23,6 +200,16 @@ "safer-buffer": "~2.1.0" } }, + "asn1.js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-1.0.3.tgz", + "integrity": "sha1-KBuj7B8kSP52X5Kk7s+IP+E2S1Q=", + "requires": { + "bn.js": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", @@ -38,6 +225,11 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, + "auth-header": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/auth-header/-/auth-header-1.0.0.tgz", + "integrity": "sha512-CPPazq09YVDUNNVWo4oSPTQmtwIzHusZhQmahCKvIsk0/xH6U3QsMAv3sM+7+Q0B1K2KJ/Q38OND317uXs4NHA==" + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -54,6 +246,11 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "base64url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz", + "integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs=" + }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -62,6 +259,12 @@ "tweetnacl": "^0.14.3" } }, + "bn.js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-1.3.0.tgz", + "integrity": "sha1-DbTL+W+PI7dC9by50ap6mZSgXoM=", + "optional": true + }, "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -107,12 +310,22 @@ "concat-map": "0.0.1" } }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, "browser-stdout": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", "dev": true }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -135,8 +348,7 @@ "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" }, "concat-map": { "version": "0.0.1", @@ -144,6 +356,17 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, "connect": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", @@ -227,12 +450,41 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, + "elliptic": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + } + } + }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "dev": true }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "~0.4.13" + } + }, "es6-promise": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz", @@ -279,6 +531,17 @@ "pend": "~1.2.0" } }, + "file-fetch": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/file-fetch/-/file-fetch-1.2.0.tgz", + "integrity": "sha512-DzwKhcH/afS7thk5hao1kVJXIqMNB2pz0DFpjpA5IlIAA0nSqi/fqFQpX++NP9IK+Te7Z1ZxA5KTWKmdzio+tA==", + "requires": { + "concat-stream": "^2.0.0", + "mime-types": "^2.1.17", + "node-fetch": "^2.3.0", + "readable-error": "^1.0.0" + } + }, "finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", @@ -320,6 +583,11 @@ "mime-types": "^2.1.12" } }, + "fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=" + }, "fs-extra": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", @@ -389,12 +657,31 @@ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", "dev": true }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", "dev": true }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, "http-errors": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", @@ -422,7 +709,6 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -440,14 +726,43 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + }, + "dependencies": { + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + } + } + }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -510,6 +825,16 @@ "verror": "1.10.0" } }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -529,6 +854,16 @@ "mime-db": "1.40.0" } }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -611,6 +946,26 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" }, + "node-forge": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.8.3.tgz", + "integrity": "sha512-5lv9UKmvTBog+m4AWL8XpZnr3WbNKxYL2M77i903ylY/huJIooSTDHyUWQ/OppFuKQpAGMk6qNtDymSJNRIEIg==" + }, + "node-rsa": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/node-rsa/-/node-rsa-0.4.2.tgz", + "integrity": "sha1-1jkXKewWqDDtWjgEKzFX0tXXJTA=", + "requires": { + "asn1": "0.2.3" + }, + "dependencies": { + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + } + } + }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -646,6 +1001,14 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, + "pem-jwk": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pem-jwk/-/pem-jwk-1.5.1.tgz", + "integrity": "sha1-eoY3/S9nqCflfAxC4cI8P9Us+wE=", + "requires": { + "asn1.js": "1.0.3" + } + }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -662,6 +1025,11 @@ "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=" }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, "psl": { "version": "1.1.31", "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", @@ -695,18 +1063,75 @@ "unpipe": "1.0.0" } }, + "rdf-canonize": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-1.0.3.tgz", + "integrity": "sha512-piLMOB5Q6LJSVx2XzmdpHktYVb8TmVTy8coXJBFtdkcMC96DknZOuzpAYqCWx2ERZX7xEW+mMi8/wDuMJS/95w==", + "requires": { + "node-forge": "^0.8.1", + "semver": "^5.6.0" + } + }, "rdflib": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/rdflib/-/rdflib-0.15.0.tgz", - "integrity": "sha1-onFe4Q8TN84rCw2hzTsQeZqu3gc=", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/rdflib/-/rdflib-0.20.1.tgz", + "integrity": "sha512-5G1t7rURqPdsYE+mjpDW2e9/H19XFMuChTIjPFPtH2tI0fma+xlJYwrSgmd1aOm45SOYKpqwJfTSIvFpmP2n+g==", "requires": { "async": "^0.9.x", "jsonld": "^0.4.5", "n3": "^0.4.1", - "xmldom": "^0.1.22", - "xmlhttprequest": "^1.7.0" + "solid-auth-cli": "^0.1.12", + "solid-auth-client": "^2.3.0", + "xmldom": "^0.1.22" + } + }, + "readable-error": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/readable-error/-/readable-error-1.0.0.tgz", + "integrity": "sha512-CLnInu5bUphmFiZ3pD/BC6+Cg4/BzK6ZMvWfd0b2QMzYo159Z/f/nVFQ9L5IeMrqUxy0EFsp3XJ+BRfLfY13IQ==", + "requires": { + "readable-stream": "^2.3.3" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "readable-stream": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz", + "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, + "regenerator-runtime": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", + "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" + }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", @@ -744,6 +1169,11 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + }, "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", @@ -758,6 +1188,63 @@ "rdflib": ">=0.15.0" } }, + "solid-auth-cli": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/solid-auth-cli/-/solid-auth-cli-0.1.13.tgz", + "integrity": "sha512-mRZ4eaWniGd9jLRzSWD3n9EwMfTcmwlfXK5MggIzSQOyXa1XJCWxHnJDL0DWTX5sMi1ovYa6RI4u6TNOzsEZiw==", + "requires": { + "@solid/cli": "^0.1.0", + "async": "^2.6.1", + "file-fetch": "^1.1.1", + "fs": "0.0.1-security", + "isomorphic-fetch": "^2.2.1", + "jsonld": "^1.4.0", + "n3": "^1.0.3" + }, + "dependencies": { + "async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "requires": { + "lodash": "^4.17.11" + } + }, + "jsonld": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/jsonld/-/jsonld-1.6.2.tgz", + "integrity": "sha512-eMzFHqhF2kPMrMUjw8+Lz9IF1QkrxTOIfVndkP/OpuoZs31VdDtfDs8mLa5EOC/ROdemFTQGLdYPZbRtmMe2Yw==", + "requires": { + "rdf-canonize": "^1.0.2", + "request": "^2.88.0", + "semver": "^5.6.0", + "xmldom": "0.1.19" + } + }, + "n3": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/n3/-/n3-1.1.1.tgz", + "integrity": "sha512-GEJXn+wc0f4l2noP1N/rMUH9Gei1DQ8IDN03eBsH+uQKkNQUOLgL7ZJVaDjY+pP3LmbLxL1LpUg/AvZ7Kc7KVw==" + }, + "xmldom": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.19.tgz", + "integrity": "sha1-Yx/Ad3bv2EEYvyUXGzftTQdaCrw=" + } + } + }, + "solid-auth-client": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/solid-auth-client/-/solid-auth-client-2.3.0.tgz", + "integrity": "sha512-+9RfqC64oWpH4afoWYhCtieuAziFyWiiW/isB9XEV6N+yb2jZ69UCJxpX7iBCpxK0j36bDeisdbp0zHRp/F46A==", + "requires": { + "@babel/runtime": "^7.0.0", + "@solid/oidc-rp": "^0.8.0", + "auth-header": "^1.0.0", + "commander": "^2.11.0", + "isomorphic-fetch": "^2.2.1" + } + }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -774,12 +1261,33 @@ "tweetnacl": "~0.14.0" } }, + "standard-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/standard-error/-/standard-error-1.1.0.tgz", + "integrity": "sha1-I+UWj6HAggGJ5YEnAaeQWFENDTQ=" + }, + "standard-http-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/standard-http-error/-/standard-http-error-2.0.1.tgz", + "integrity": "sha1-+K6RcuPO+cs40ucIShkl9Xp8NL0=", + "requires": { + "standard-error": ">= 1.1.0 < 2" + } + }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, + "string_decoder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", + "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, "supports-color": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", @@ -789,6 +1297,11 @@ "has-flag": "^2.0.0" } }, + "text-encoding": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", + "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=" + }, "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", @@ -811,6 +1324,14 @@ } } }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "requires": { + "punycode": "^2.1.0" + } + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -834,6 +1355,11 @@ "mime-types": "~2.1.24" } }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, "uid-safe": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", @@ -868,6 +1394,11 @@ "punycode": "^2.1.0" } }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -889,6 +1420,26 @@ "extsprintf": "^1.2.0" } }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "whatwg-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -899,11 +1450,6 @@ "version": "0.1.27", "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=" - }, - "xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" } } } diff --git a/package.json b/package.json index f70ee14..361ea4f 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "dependencies": { "fs-extra": "^4.0.2", "node-fetch": "^2.6.0", - "rdflib": "^0.15.0", + "rdflib": ">=0.20.1", "shacl-check": "^1.0.3", "xmldom": "^0.1.22" }, From 707d0327a98e1639ef2f75abb1ddb390596f05e8 Mon Sep 17 00:00:00 2001 From: Tim Berners-Lee Date: Tue, 21 May 2019 18:44:29 -0400 Subject: [PATCH 22/23] 1.0.2 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 68c924a..cafc3d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "rabel", - "version": "1.0.1", + "version": "1.0.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 361ea4f..073d025 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "rabel", "description": "Linked Data command line utility", - "version": "1.0.1", + "version": "1.0.2", "author": { "name": "Tim Berners-Lee", "email": "timbl@w3.org" From dc1cadb8bdfb82feac6fcefe799b8c7ddfa4c696 Mon Sep 17 00:00:00 2001 From: Tim Berners-Lee Date: Thu, 10 Oct 2024 15:43:04 +0100 Subject: [PATCH 23/23] save changes before proibably abandonning this ericP-FHIR branch --- index.js | 9 ++++++--- package.json | 7 +++++-- test/test-rabel.js | 3 ++- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/index.js b/index.js index f87a11e..ee60a26 100644 --- a/index.js +++ b/index.js @@ -1,4 +1,4 @@ -#!/usr/local/bin/node +//!/usr/local/bin/node // Utility Data conversion program. // // Test platform for parsers and serializers @@ -131,8 +131,10 @@ var doAppropriateTest = function (test, kb) { // See https://www.w3.org/TR/rdf11-testcases/ // Returns a promise of set of issues -var runTests = function (doc) { - var kb = $rdf.graph() +function runTests (doc) { + const kb = $rdf.graph() + const fetcher = $rdf.fetcher(kb) + // var fetcher = $rdf.fetcher(kb, {a: 1}) const indent = '' console.log('runTests ' + doc) @@ -501,6 +503,7 @@ var readXML = function (targetDocument, options, callbackFunction, kb) { // ends module.exports = { + runTests, check: check, spray: spray, readXML: readXML diff --git a/package.json b/package.json index 073d025..376ddbc 100644 --- a/package.json +++ b/package.json @@ -17,8 +17,10 @@ "dependencies": { "fs-extra": "^4.0.2", "node-fetch": "^2.6.0", - "rdflib": ">=0.20.1", + "rdflib": ">=2.0.0", "shacl-check": "^1.0.3", + "solid-auth-cli": "^1.0.8", + "solid-auth-client": "^2.3.0", "xmldom": "^0.1.22" }, "bin": { @@ -30,6 +32,7 @@ }, "main": "index.js", "scripts": { - "test": "mocha" + "test": "mocha", + "hard-install": "rm -r node_modules; rm package-lock.json; npm install" } } diff --git a/test/test-rabel.js b/test/test-rabel.js index 2cc273e..e613bbe 100644 --- a/test/test-rabel.js +++ b/test/test-rabel.js @@ -75,11 +75,12 @@ describe('rabel', () => { try { fs.removeSync(TARGET_DIR) } catch (e) { + console.log('file removed failed for ' + TARGET_DIR) } fs.mkdirSync(TARGET_DIR) process.chdir(TARGET_DIR) fetcher.nowOrWhenFetched(doc, {}, function (ok, body, xhr) { - // rabel.check(ok, body, xhr ? xhr.status : undefined) + rabel.check(ok, body, xhr ? xhr.status : undefined) console.log('Loaded ' + doc) rabel.spray( 'http://a.example/',