diff --git a/.travis.yml b/.travis.yml index 45f1505d59d..28cabffac05 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,7 +13,7 @@ notifications: branches: only: - master - - "5.19" + - "5.20.1" # enable building tags - /^v\d+\.\d+(\.\d+)?(-\S*)?$/ @@ -155,6 +155,14 @@ matrix: packages: ['g++-6', 'libbz2-dev', 'libxml2-dev', 'libzip-dev', 'liblua5.2-dev', 'libtbb-dev', 'libboost-all-dev', 'ccache'] env: CCOMPILER='gcc-6' CXXCOMPILER='g++-6' BUILD_TYPE='Release' + - os: osx + osx_image: xcode9.2 + compiler: "mason-osx-release-node-10" + # we use the xcode provides clang and don't install our own + env: ENABLE_MASON=ON BUILD_TYPE='Release' CUCUMBER_TIMEOUT=60000 CCOMPILER='clang' CXXCOMPILER='clang++' ENABLE_ASSERTIONS=ON ENABLE_LTO=ON NODE="10" + after_success: + - ./scripts/travis/publish.sh + - os: osx osx_image: xcode9.2 compiler: "mason-osx-release-node-8" @@ -277,6 +285,54 @@ matrix: after_success: - ./scripts/travis/publish.sh + - os: linux + sudo: false + compiler: "node-10-mason-linux-release" + addons: + apt: + sources: ['ubuntu-toolchain-r-test'] + packages: ['libstdc++-4.9-dev'] + env: CLANG_VERSION='5.0.0' BUILD_TYPE='Release' ENABLE_MASON=ON ENABLE_LTO=ON JOBS=3 NODE="10" + install: + - pushd ${OSRM_BUILD_DIR} + - | + cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \ + -DENABLE_MASON=${ENABLE_MASON:-OFF} \ + -DENABLE_NODE_BINDINGS=${ENABLE_NODE_BINDINGS:-OFF} \ + -DENABLE_CCACHE=ON \ + -DCMAKE_INSTALL_PREFIX=${OSRM_INSTALL_DIR} \ + -DENABLE_GLIBC_WORKAROUND=ON + - make --jobs=${JOBS} + - popd + script: + - npm run nodejs-tests + after_success: + - ./scripts/travis/publish.sh + + - os: linux + sudo: false + compiler: "node-10-mason-linux-debug" + addons: + apt: + sources: ['ubuntu-toolchain-r-test'] + packages: ['libstdc++-4.9-dev'] + env: CLANG_VERSION='5.0.0' BUILD_TYPE='Debug' ENABLE_MASON=ON ENABLE_LTO=ON JOBS=3 NODE="10" + install: + - pushd ${OSRM_BUILD_DIR} + - | + cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \ + -DENABLE_MASON=${ENABLE_MASON:-OFF} \ + -DENABLE_NODE_BINDINGS=${ENABLE_NODE_BINDINGS:-OFF} \ + -DENABLE_CCACHE=ON \ + -DCMAKE_INSTALL_PREFIX=${OSRM_INSTALL_DIR} \ + -DENABLE_GLIBC_WORKAROUND=ON + - make --jobs=${JOBS} + - popd + script: + - npm run nodejs-tests + after_success: + - ./scripts/travis/publish.sh + before_install: - source $NVM_DIR/nvm.sh - nvm install $NODE @@ -297,7 +353,7 @@ before_install: fi - | if [[ ! -f $(which yarn) ]]; then - npm install -g yarn + npm install -g yarn@1.11.1 fi - export PACKAGE_JSON_VERSION=$(node -e "console.log(require('./package.json').version)") - export PUBLISH=$([[ "${TRAVIS_TAG:-}" == "v${PACKAGE_JSON_VERSION}" ]] && echo "On" || echo "Off") diff --git a/CHANGELOG.md b/CHANGELOG.md index aa0bc5cc884..699d2187188 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,26 @@ +# 5.20.1 RC 4 + - Changes from 5.20.0 + - Features: + - ADDED: all waypoints in responses now contain a distance property between the original coordinate and the snapped location. [#5255](https://github.com/Project-OSRM/osrm-backend/pull/5255) + - ADDED: if `fallback_speed` is used, a new structure `fallback_speed_cells` will describe which cells contain estimated values [#5259](https://github.com/Project-OSRM/osrm-backend/pull/5259) + - Table: + - ADDED: new parameter `scale_factor` which will scale the cell `duration` values by this factor. [#5298](https://github.com/Project-OSRM/osrm-backend/pull/5298) + - FIXED: only trigger `scale_factor` code to scan matrix when necessary. [#5303](https://github.com/Project-OSRM/osrm-backend/pull/5303) + +# 5.20.0 + - Changes from 5.19.0: + - Table: + - CHANGED: switch to pre-calculated distances for table responses for large speedup and 10% memory increase. [#5251](https://github.com/Project-OSRM/osrm-backend/pull/5251) + - ADDED: new parameter `fallback_speed` which will fill `null` cells with estimated value [#5257](https://github.com/Project-OSRM/osrm-backend/pull/5257) + - CHANGED: Remove API check for matrix sources/destination length to be less than or equal to coordinates length. [#5298](https://github.com/Project-OSRM/osrm-backend/pull/5289) + - FIXED: Fix crashing bug when using fallback_speed parameter with more sources than destinations. [#5291](https://github.com/Project-OSRM/osrm-backend/pull/5291) + - Features: + - ADDED: direct mmapping of datafiles is now supported via the `--mmap` switch. [#5242](https://github.com/Project-OSRM/osrm-backend/pull/5242) + - REMOVED: the previous `--memory_file` switch is now deprecated and will fallback to `--mmap` [#5242](https://github.com/Project-OSRM/osrm-backend/pull/5242) + - ADDED: Now publishing Node 10.x LTS binary modules [#5246](https://github.com/Project-OSRM/osrm-backend/pull/5246) + - Windows: + - FIXED: Windows builds again. [#5249](https://github.com/Project-OSRM/osrm-backend/pull/5249) + # 5.19.0 - Changes from 5.18.0: - Optimizations: diff --git a/docker/Dockerfile b/docker/Dockerfile index 50f531ed63f..1180896bb2e 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,15 +1,13 @@ -FROM alpine:3.6 as buildstage - +FROM debian:buster-slim as builder ARG DOCKER_TAG RUN mkdir -p /src && mkdir -p /opt COPY . /src WORKDIR /src RUN NPROC=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || 1) && \ - echo "@testing http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories && \ - apk update && \ - apk upgrade && \ - apk add git cmake wget make libc-dev gcc g++ bzip2-dev boost-dev zlib-dev expat-dev lua5.2-dev libtbb@testing libtbb-dev@testing && \ + apt-get update && \ + apt-get -y --no-install-recommends install cmake make git gcc g++ libbz2-dev libstxxl-dev libstxxl1v5 libxml2-dev \ + libzip-dev libboost-all-dev lua5.2 liblua5.2-dev libtbb-dev -o APT::Install-Suggests=0 -o APT::Install-Recommends=0 && \ NPROC=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || 1) && \ echo "Building OSRM ${DOCKER_TAG}" && \ git show --format="%H" | head -n1 > /opt/OSRM_GITSHA && \ @@ -33,13 +31,16 @@ RUN NPROC=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || 1) && \ # Multistage build to reduce image size - https://docs.docker.com/engine/userguide/eng-image/multistage-build/#use-multi-stage-builds # Only the content below ends up in the image, this helps remove /src from the image (which is large) -FROM alpine:3.6 as runstage +FROM debian:buster-slim as runstage RUN mkdir -p /src && mkdir -p /opt -RUN echo "@testing http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories && \ - apk update && \ - apk add boost-filesystem boost-program_options boost-regex boost-iostreams boost-thread libgomp lua5.2 expat libtbb@testing -COPY --from=buildstage /usr/local /usr/local -COPY --from=buildstage /opt /opt +RUN apt-get update && \ +apt-get install -y --no-install-recommends libboost-program-options1.62.0 libboost-regex1.62.0 \ +libboost-date-time1.62.0 libboost-chrono1.62.0 libboost-filesystem1.62.0 \ +libboost-iostreams1.62.0 libboost-thread1.62.0 expat liblua5.2-0 libtbb2 &&\ +rm -rf /var/lib/apt/lists/* +COPY --from=builder /usr/local /usr/local +COPY --from=builder /opt /opt +RUN chmod 0644 -R /opt WORKDIR /opt EXPOSE 5000 diff --git a/docs/http.md b/docs/http.md index 3cb2b811bd6..56c29051225 100644 --- a/docs/http.md +++ b/docs/http.md @@ -119,7 +119,6 @@ In addition to the [general options](#general-options) the following options are - `code` if the request was successful `Ok` otherwise see the service dependent and general status codes. - `waypoints` array of `Waypoint` objects sorted by distance to the input coordinate. Each object has at least the following additional properties: - - `distance`: Distance in meters to the supplied input coordinate. - `nodes`: Array of OpenStreetMap node ids. #### Example Requests @@ -236,8 +235,10 @@ In addition to the [general options](#general-options) the following options are |------------|--------------------------------------------------|---------------------------------------------| |sources |`{index};{index}[;{index} ...]` or `all` (default)|Use location with given index as source. | |destinations|`{index};{index}[;{index} ...]` or `all` (default)|Use location with given index as destination.| -|annotations |`duration` (default), `distance`, or `duration,distance`|Return the requested table or tables in response. Note that computing the `distances` table is currently only implemented for CH. If `annotations=distance` or `annotations=duration,distance` is requested when running a MLD router, a `NotImplemented` error will be returned. -| +|annotations |`duration` (default), `distance`, or `duration,distance`|Return the requested table or tables in response. | +|fallback_speed|`double > 0`| If no route found between a source/destination pair, calculate the as-the-crow-flies distance, then use this speed to estimate duration.| +|fallback_coordinate|`input` (default), or `snapped`| When using a `fallback_speed`, use the user-supplied coordinate (`input`), or the snapped location (`snapped`) for calculating distances.| +|scale_factor|`double > 0`| Use in conjunction with `annotations=durations`. Scales the table `duration` values by this number.| Unlike other array encoded options, the length of `sources` and `destinations` can be **smaller or equal** to number of input locations; @@ -283,6 +284,7 @@ curl 'http://router.project-osrm.org/table/v1/driving/13.388860,52.517037;13.397 the i-th waypoint to the j-th waypoint. Values are given in meters. Can be `null` if no route between `i` and `j` can be found. Note that computing the `distances` table is currently only implemented for CH. If `annotations=distance` or `annotations=duration,distance` is requested when running a MLD router, a `NotImplemented` error will be returned. - `sources` array of `Waypoint` objects describing all sources in order - `destinations` array of `Waypoint` objects describing all destinations in order +- `fallback_speed_cells` (optional) array of arrays containing `i,j` pairs indicating which cells contain estimated values based on `fallback_speed`. Will be absent if `fallback_speed` is not used. In case of error the following `code`s are supported in addition to the general ones: @@ -383,6 +385,10 @@ All other properties might be undefined. 2361.73, 0 ] + ], + "fallback_speed_cells": [ + [ 0, 1 ], + [ 1, 0 ] ] } ``` @@ -905,6 +911,7 @@ Object used to describe waypoint on a route. - `name` Name of the street the coordinate snapped to - `location` Array that contains the `[longitude, latitude]` pair of the snapped coordinate +- `distance` The distance, in metres, from the input coordinate to the snapped coordinate - `hint` Unique internal identifier of the segment (ephemeral, not constant over data updates) This can be used on subsequent request to significantly speed up the query and to connect multiple services. E.g. you can use the `hint` value obtained by the `nearest` query as `hint` values for `route` inputs. diff --git a/docs/nodejs/api.md b/docs/nodejs/api.md index e729962f013..ba3f18bd850 100644 --- a/docs/nodejs/api.md +++ b/docs/nodejs/api.md @@ -25,7 +25,9 @@ var osrm = new OSRM('network.osrm'); Make sure you prepared the dataset with the correct toolchain. - `options.shared_memory` **[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?** Connects to the persistent shared memory datastore. This requires you to run `osrm-datastore` prior to creating an `OSRM` object. - - `options.memory_file` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)?** Path to a file on disk to store the memory using mmap. + - `options.memory_file` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)?** *DEPRECATED* + Old behaviour: Path to a file on disk to store the memory using mmap. Current behaviour: setting this value is the same as setting `mmap_memory: true`. + - `options.mmap_memory` **[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?** Map on-disk files to virtual memory addresses (mmap), rather than loading into RAM. - `options.path` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)?** The path to the `.osrm` files. This is mutually exclusive with setting {options.shared_memory} to true. - `options.max_locations_trip` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)?** Max. locations supported in trip query (default: unlimited). - `options.max_locations_viaroute` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)?** Max. locations supported in viaroute query (default: unlimited). @@ -56,7 +58,7 @@ Returns the fastest route between two or more coordinates while visiting the way - `options.continue_straight` **[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?** Forces the route to keep going straight at waypoints and don't do a uturn even if it would be faster. Default value depends on the profile. - `options.approaches` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)?** Keep waypoints on curb side. Can be `null` (unrestricted, default) or `curb`. `null`/`true`/`false` -- `callback` **[Function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function)** +- `callback` **[Function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function)** **Examples** @@ -88,7 +90,7 @@ Note: `coordinates` in the general options only supports a single `{longitude},{ - `options.number` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** Number of nearest segments that should be returned. Must be an integer greater than or equal to `1`. (optional, default `1`) - `options.approaches` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)?** Keep waypoints on curb side. Can be `null` (unrestricted, default) or `curb`. -- `callback` **[Function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function)** +- `callback` **[Function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function)** **Examples** @@ -127,7 +129,10 @@ tables. Optionally returns distance table. - `options.destinations` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)?** An array of `index` elements (`0 <= integer < #coordinates`) to use location with given index as destination. Default is to use all. - `options.approaches` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)?** Keep waypoints on curb side. Can be `null` (unrestricted, default) or `curb`. -- `callback` **[Function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function)** + - `options.fallback_speed` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)?** Replace `null` responses in result with as-the-crow-flies estimates based on `fallback_speed`. Value is in metres/second. + - `options.fallback_coordinate` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)?** Either `input` (default) or `snapped`. If using a `fallback_speed`, use either the user-supplied coordinate (`input`), or the snapped coordinate (`snapped`) for calculating the as-the-crow-flies diestance between two points. + - `options.scale_factor` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)?** Multiply the table duration values in the table by this number for more controlled input into a route optimization solver. +- `callback` **[Function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function)** **Examples** @@ -152,6 +157,7 @@ Returns **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refer Values are given in seconds. **`sources`**: array of [`Ẁaypoint`](#waypoint) objects describing all sources in order. **`destinations`**: array of [`Ẁaypoint`](#waypoint) objects describing all destinations in order. +**`fallback_speed_cells`**: (optional) if `fallback_speed` is used, will be an array of arrays of `row,column` values, indicating which cells contain estimated values. ### tile @@ -167,7 +173,7 @@ and what weights they have applied. - `ZXY` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)** an array consisting of `x`, `y`, and `z` values representing tile coordinates like [wiki.openstreetmap.org/wiki/Slippy_map_tilenames](https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames) and are supported by vector tile viewers like [Mapbox GL JS](https://www.mapbox.com/mapbox-gl-js/api/). -- `callback` **[Function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function)** +- `callback` **[Function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function)** **Examples** @@ -204,7 +210,7 @@ if they can not be matched successfully. - `options.radiuses` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)?** Standard deviation of GPS precision used for map matching. If applicable use GPS accuracy. Can be `null` for default value `5` meters or `double >= 0`. - `options.gaps` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)?** Allows the input track splitting based on huge timestamp gaps between points. Either `split` or `ignore` (optional, default `split`). - `options.tidy` **[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?** Allows the input track modification to obtain better matching quality for noisy tracks (optional, default `false`). -- `callback` **[Function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function)** +- `callback` **[Function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function)** **Examples** @@ -268,7 +274,7 @@ Right now, the following combinations are possible: - `options.source` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** Return route starts at `any` or `first` coordinate. (optional, default `any`) - `options.destination` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** Return route ends at `any` or `last` coordinate. (optional, default `any`) - `options.approaches` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)?** Keep waypoints on curb side. Can be `null` (unrestricted, default) or `curb`. -- `callback` **[Function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function)** +- `callback` **[Function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function)** **Examples** @@ -322,16 +328,14 @@ osrm.route(options, { format: "json_buffer" }, function(err, response) { ## Responses -Responses - ### Route Represents a route through (potentially multiple) waypoints. **Parameters** -- `exteral` **documentation** in - [`osrm-backend`](../http.md#route) +- **documentation** in + [`osrm-backend`](../http.md#route-object) ### RouteLeg @@ -339,8 +343,8 @@ Represents a route between two waypoints. **Parameters** -- `exteral` **documentation** in - [`osrm-backend`](../http.md#routeleg) +- **documentation** in + [`osrm-backend`](../http.md#routeleg-object) ### RouteStep @@ -349,15 +353,15 @@ single way to the subsequent step. **Parameters** -- `exteral` **documentation** in - [`osrm-backend`](https://github.com/Project-OSRM/osrm-backend/blob/master/docs/http.md#routestep) +- **documentation** in + [`osrm-backend`](../http.md#routestep-object) ### StepManeuver **Parameters** -- `exteral` **documentation** in - [`osrm-backend`](https://github.com/Project-OSRM/osrm-backend/blob/master/docs/http.md#stepmaneuver) +- **documentation** in + [`osrm-backend`](../http.md#stepmaneuver-object) ### Waypoint @@ -365,5 +369,5 @@ Object used to describe waypoint on a route. **Parameters** -- `exteral` **documentation** in - [`osrm-backend`](https://github.com/Project-OSRM/osrm-backend/blob/master/docs/http.md#waypoint) +- **documentation** in + [`osrm-backend`](../http.md#waypoint-object) diff --git a/features/lib/osrm_loader.js b/features/lib/osrm_loader.js index 51410d22875..a29d53b8e33 100644 --- a/features/lib/osrm_loader.js +++ b/features/lib/osrm_loader.js @@ -84,7 +84,47 @@ class OSRMDirectLoader extends OSRMBaseLoader { throw new Error(util.format('osrm-routed %s: %s', errorReason(err), err.cmd)); } }); - callback(); + + this.child.readyFunc = (data) => { + if (/running and waiting for requests/.test(data)) { + this.child.stdout.removeListener('data', this.child.readyFunc); + callback(); + } + }; + this.child.stdout.on('data',this.child.readyFunc); + } +}; + +class OSRMmmapLoader extends OSRMBaseLoader { + constructor (scope) { + super(scope); + } + + load (inputFile, callback) { + this.inputFile = inputFile; + this.shutdown(() => { + this.launch(callback); + }); + } + + osrmUp (callback) { + if (this.osrmIsRunning()) return callback(new Error("osrm-routed already running!")); + + const command_arguments = util.format('%s -p %d -i %s -a %s --mmap', this.inputFile, this.scope.OSRM_PORT, this.scope.OSRM_IP, this.scope.ROUTING_ALGORITHM); + this.child = this.scope.runBin('osrm-routed', command_arguments, this.scope.environment, (err) => { + if (err && err.signal !== 'SIGINT') { + this.child = null; + throw new Error(util.format('osrm-routed %s: %s', errorReason(err), err.cmd)); + } + }); + + this.child.readyFunc = (data) => { + if (/running and waiting for requests/.test(data)) { + this.child.stdout.removeListener('data', this.child.readyFunc); + callback(); + } + }; + this.child.stdout.on('data',this.child.readyFunc); } }; @@ -135,22 +175,32 @@ class OSRMLoader { this.scope = scope; this.sharedLoader = new OSRMDatastoreLoader(this.scope); this.directLoader = new OSRMDirectLoader(this.scope); + this.mmapLoader = new OSRMmmapLoader(this.scope); this.method = scope.DEFAULT_LOAD_METHOD; } load (inputFile, callback) { + if (!this.loader) { + this.loader = {shutdown: (cb) => cb() }; + } if (this.method === 'datastore') { - this.directLoader.shutdown((err) => { + this.loader.shutdown((err) => { if (err) return callback(err); this.loader = this.sharedLoader; this.sharedLoader.load(inputFile, callback); }); } else if (this.method === 'directly') { - this.sharedLoader.shutdown((err) => { + this.loader.shutdown((err) => { if (err) return callback(err); this.loader = this.directLoader; this.directLoader.load(inputFile, callback); }); + } else if (this.method === 'mmap') { + this.loader.shutdown((err) => { + if (err) return callback(err); + this.loader = this.mmapLoader; + this.mmapLoader.load(inputFile, callback); + }); } else { callback(new Error('*** Unknown load method ' + method)); } diff --git a/features/step_definitions/distance_matrix.js b/features/step_definitions/distance_matrix.js index fde80679f5f..594268d50fa 100644 --- a/features/step_definitions/distance_matrix.js +++ b/features/step_definitions/distance_matrix.js @@ -3,22 +3,25 @@ var util = require('util'); module.exports = function () { const durationsRegex = new RegExp(/^I request a travel time matrix I should get$/); const distancesRegex = new RegExp(/^I request a travel distance matrix I should get$/); + const estimatesRegex = new RegExp(/^I request a travel time matrix I should get estimates for$/); const DURATIONS_NO_ROUTE = 2147483647; // MAX_INT const DISTANCES_NO_ROUTE = 3.40282e+38; // MAX_FLOAT this.When(durationsRegex, function(table, callback) {tableParse.call(this, table, DURATIONS_NO_ROUTE, 'durations', callback);}.bind(this)); this.When(distancesRegex, function(table, callback) {tableParse.call(this, table, DISTANCES_NO_ROUTE, 'distances', callback);}.bind(this)); + this.When(estimatesRegex, function(table, callback) {tableParse.call(this, table, DISTANCES_NO_ROUTE, 'fallback_speed_cells', callback);}.bind(this)); }; const durationsParse = function(v) { return isNaN(parseInt(v)); }; const distancesParse = function(v) { return isNaN(parseFloat(v)); }; +const estimatesParse = function(v) { return isNaN(parseFloat(v)); }; function tableParse(table, noRoute, annotation, callback) { - const parse = annotation == 'distances' ? distancesParse : durationsParse; + const parse = annotation == 'distances' ? distancesParse : (annotation == 'durations' ? durationsParse : estimatesParse); const params = this.queryParams; - params.annotations = annotation == 'distances' ? 'distance' : 'duration'; + params.annotations = ['durations','fallback_speed_cells'].indexOf(annotation) !== -1 ? 'duration' : 'distance'; var tableRows = table.raw(); @@ -61,11 +64,26 @@ function tableParse(table, noRoute, annotation, callback) { var json = JSON.parse(response.body); - var result = json[annotation].map(row => { - var hashes = {}; - row.forEach((v, i) => { hashes[tableRows[0][i+1]] = parse(v) ? '' : v; }); - return hashes; - }); + var result = {}; + if (annotation === 'fallback_speed_cells') { + result = table.raw().map(row => row.map(() => '')); + json[annotation].forEach(pair => { + result[pair[0]+1][pair[1]+1] = 'Y'; + }); + result = result.slice(1).map(row => { + var hashes = {}; + row.slice(1).forEach((v,i) => { + hashes[tableRows[0][i+1]] = v; + }); + return hashes; + }); + } else { + result = json[annotation].map(row => { + var hashes = {}; + row.forEach((v, i) => { hashes[tableRows[0][i+1]] = parse(v) ? '' : v; }); + return hashes; + }); + } var testRow = (row, ri, cb) => { for (var k in result[ri]) { diff --git a/features/support/env.js b/features/support/env.js index 7866e0756c3..a76938c16f1 100644 --- a/features/support/env.js +++ b/features/support/env.js @@ -32,7 +32,7 @@ module.exports = function () { this.DEFAULT_ENVIRONMENT = Object.assign({STXXLCFG: stxxl_config}, process.env); this.DEFAULT_PROFILE = 'bicycle'; this.DEFAULT_INPUT_FORMAT = 'osm'; - this.DEFAULT_LOAD_METHOD = 'datastore'; + this.DEFAULT_LOAD_METHOD = process.argv[process.argv.indexOf('-m') +1].match('mmap') ? 'mmap' : 'datastore'; this.DEFAULT_ORIGIN = [1,1]; this.OSM_USER = 'osrm'; this.OSM_UID = 1; @@ -80,7 +80,7 @@ module.exports = function () { // eslint-disable-next-line no-console console.info(util.format('Node Version', process.version)); - if (parseInt(process.version.match(/v(\d)/)[1]) < 4) throw new Error('*** Please upgrade to Node 4.+ to run OSRM cucumber tests'); + if (parseInt(process.version.match(/v(\d+)/)[1]) < 4) throw new Error('*** Please upgrade to Node 4.+ to run OSRM cucumber tests'); fs.exists(this.TEST_PATH, (exists) => { if (exists) diff --git a/features/testbot/distance_matrix.feature b/features/testbot/distance_matrix.feature index d97f50924ee..399698ad66e 100644 --- a/features/testbot/distance_matrix.feature +++ b/features/testbot/distance_matrix.feature @@ -5,21 +5,49 @@ Feature: Basic Distance Matrix Background: Given the profile "testbot" And the partition extra arguments "--small-component-size 1 --max-cell-sizes 2,4,8,16" + Scenario: Testbot - Travel distance matrix of small grid + Given the node map + """ + a b c + d e f + """ + + And the ways + | nodes | + | abc | + | def | + | ad | + | be | + | cf | + + When I request a travel distance matrix I should get + | | a | b | e | f | + | a | 0 | 100.1 | 199.5 | 299.5 | + | b | 100.1 | 0 | 99.4 | 199.5 | + | e | 199.5 | 99.4 | 0 | 100.1 | + | f | 299.5 | 199.5 | 100.1 | 0 | - Scenario: Testbot - Travel distance matrix of minimal network + Scenario: Testbot - Travel distance matrix of minimal network exact distances Given the node map """ - a b + a z + b + c + d """ And the ways | nodes | - | ab | + | az | + | zbcd | When I request a travel distance matrix I should get - | | a | b | - | a | 0 | 100+-1 | - | b | 100+-1 | 0 | + | | a | z | b | c | d | + | a | 0 | 100.1 | 199.5 | 298.9 | 398.3 | + | z | 100.1 | 0 | 99.4 | 198.8 | 298.2 | + | b | 199.5 | 99.4 | 0 | 99.4 | 198.8 | + | c | 298.9 | 198.8 | 99.4 | 0 | 99.4 | + | d | 398.3 | 298.2 | 198.8 | 99.4 | 0 | Scenario: Testbot - Travel distance matrix of minimal network with toll exclude Given the query options @@ -39,11 +67,11 @@ Feature: Basic Distance Matrix | bd | motorway | yes | not drivable for exclude=toll and exclude=motorway,toll | When I request a travel distance matrix I should get - | | a | b | c | d | - | a | 0 | 100+-1 | | | - | b | 100+-1 | 0 | | | - | c | | | 0 | 100+-1 | - | d | | | 100+-1 | 0 | + | | a | b | c | d | + | a | 0 | 100.1 | | | + | b | 100.1 | 0 | | | + | c | | | 0 | 100.1 | + | d | | | 100.1 | 0 | Scenario: Testbot - Travel distance matrix of minimal network with motorway exclude Given the query options @@ -63,8 +91,8 @@ Feature: Basic Distance Matrix | bd | residential | | When I request a travel distance matrix I should get - | | a | b | c | d | - | a | 0 | 300+-2 | 100+-2 | 200+-2 | + | | a | b | c | d | + | a | 0 | 298.9 | 99.4 | 199.5 | Scenario: Testbot - Travel distance matrix of minimal network disconnected motorway exclude Given the query options @@ -84,8 +112,8 @@ Feature: Basic Distance Matrix | efgh | residential | | When I request a travel distance matrix I should get - | | a | b | e | - | a | 0 | 50+-1 | | + | | a | b | e | + | a | 0 | 50.1 | | Scenario: Testbot - Travel distance matrix of minimal network with motorway and toll excludes Given the query options @@ -106,7 +134,7 @@ Feature: Basic Distance Matrix When I request a travel distance matrix I should get | | a | b | e | g | - | a | 0 | 100+-1 | | | + | a | 0 | 100.1 | | | Scenario: Testbot - Travel distance matrix with different way speeds Given the node map @@ -121,22 +149,22 @@ Feature: Basic Distance Matrix | cd | tertiary | When I request a travel distance matrix I should get - | | a | b | c | d | - | a | 0 | 100+-1 | 200+-1 | 300+-1 | - | b | 100+-1 | 0 | 100+-1 | 200+-1 | - | c | 200+-1 | 100+-1 | 0 | 100+-1 | - | d | 300+-1 | 200+-1 | 100+-1 | 0 | + | | a | b | c | d | + | a | 0 | 100.1 | 200.1 | 300.2 | + | b | 100.1 | 0 | 100.1 | 200.1 | + | c | 200.1 | 100.1 | 0 | 100.1 | + | d | 300.2 | 200.1 | 100.1 | 0 | When I request a travel distance matrix I should get - | | a | b | c | d | - | a | 0 | 100+-1 | 200+-1 | 300+-1 | + | | a | b | c | d | + | a | 0 | 100.1 | 200.1 | 300.2 | When I request a travel distance matrix I should get - | | a | - | a | 0 | - | b | 100+-1 | - | c | 200+-1 | - | d | 300+-1 | + | | a | + | a | 0 | + | b | 100.1 | + | c | 200.1 | + | d | 300.2 | Scenario: Testbot - Travel distance matrix of small grid Given the node map @@ -154,11 +182,11 @@ Feature: Basic Distance Matrix | cf | When I request a travel distance matrix I should get - | | a | b | e | f | - | a | 0 | 100+-1 | 200+-1 | 300+-1 | - | b | 100+-1 | 0 | 100+-1 | 200+-1 | - | e | 200+-1 | 100+-1 | 0 | 100+-1 | - | f | 300+-1 | 200+-1 | 100+-1 | 0 | + | | a | b | e | f | + | a | 0 | 100.1 | 199.5 | 299.5 | + | b | 100.1 | 0 | 99.4 | 199.5 | + | e | 199.5 | 99.4 | 0 | 100.1 | + | f | 299.5 | 199.5 | 100.1 | 0 | Scenario: Testbot - Travel distance matrix of network with unroutable parts Given the node map @@ -172,7 +200,7 @@ Feature: Basic Distance Matrix When I request a travel distance matrix I should get | | a | b | - | a | 0 | 100+-1 | + | a | 0 | 100.1 | | b | | 0 | Scenario: Testbot - Travel distance matrix of network with oneways @@ -189,11 +217,11 @@ Feature: Basic Distance Matrix | by | | When I request a travel distance matrix I should get - | | x | y | d | e | - | x | 0 | 300+-2 | 400+-2 | 300+-2 | - | y | 500+-2 | 0 | 300+-2 | 200+-2 | - | d | 200+-2 | 300+-2 | 0 | 300+-2 | - | e | 300+-2 | 400+-2 | 100+-2 | 0 | + | | x | y | d | e | + | x | 0 | 300.2 | 399.6 | 299.5 | + | y | 499 | 0 | 299.5 | 199.5 | + | d | 199.5 | 299.5 | 0 | 298.9 | + | e | 299.5 | 399.6 | 100.1 | 0 | Scenario: Testbot - Rectangular travel distance matrix Given the node map @@ -212,53 +240,53 @@ Feature: Basic Distance Matrix When I route I should get | from | to | distance | - | e | a | 200m +- 1 | - | e | b | 100m +- 1 | - | f | a | 300m +- 1 | - | f | b | 200m +- 1 | + | e | a | 200m | + | e | b | 100m | + | f | a | 299.9m | + | f | b | 200m | When I request a travel distance matrix I should get | | a | b | e | f | - | a | 0 | 100+-1 | 200+-1 | 300+-1 | + | a | 0 | 100.1 | 199.5 | 299.5 | When I request a travel distance matrix I should get - | | a | - | a | 0 | - | b | 100+-1 | - | e | 200+-1 | - | f | 300+-1 | + | | a | + | a | 0 | + | b | 100.1 | + | e | 199.5 | + | f | 299.5 | When I request a travel distance matrix I should get - | | a | b | e | f | - | a | 0 | 100+-1 | 200+-1 | 300+-1 | - | b | 100+-1 | 0 | 100+-1 | 200+-1 | + | | a | b | e | f | + | a | 0 | 100.1 | 199.5 | 299.5 | + | b | 100.1 | 0 | 99.4 | 199.5 | When I request a travel distance matrix I should get - | | a | b | - | a | 0 | 100+-1 | - | b | 100+-1 | 0 | - | e | 200+-1 | 100+-1 | - | f | 300+-1 | 200+-1 | + | | a | b | + | a | 0 | 100.1 | + | b | 100.1 | 0 | + | e | 199.5 | 99.4 | + | f | 299.5 | 199.5 | When I request a travel distance matrix I should get - | | a | b | e | f | - | a | 0 | 100+-1 | 200+-1 | 300+-1 | - | b | 100+-1 | 0 | 100+-1 | 200+-1 | - | e | 200+-1 | 100+-1 | 0 | 100+-1 | + | | a | b | e | f | + | a | 0 | 100.1 | 199.5 | 299.5 | + | b | 100.1 | 0 | 99.4 | 199.5 | + | e | 199.5 | 99.4 | 0 | 100.1 | When I request a travel distance matrix I should get - | | a | b | e | - | a | 0 | 100+-1 | 200+-1 | - | b | 100+-1 | 0 | 100+-1 | - | e | 200+-1 | 100+-1 | 0 | - | f | 300+-1 | 200+-1 | 100+-1 | + | | a | b | e | + | a | 0 | 100.1 | 199.5 | + | b | 100.1 | 0 | 99.4 | + | e | 199.5 | 99.4 | 0 | + | f | 299.5 | 199.5 | 100.1 | When I request a travel distance matrix I should get - | | a | b | e | f | - | a | 0 | 100+-1 | 200+-1 | 300+-1 | - | b | 100+-1 | 0 | 100+-1 | 200+-1 | - | e | 200+-1 | 100+-1 | 0 | 100+-1 | - | f | 300+-1 | 200+-1 | 100+-1 | 0 | + | | a | b | e | f | + | a | 0 | 100.1 | 199.5 | 299.5 | + | b | 100.1 | 0 | 99.4 | 199.5 | + | e | 199.5 | 99.4 | 0 | 100.1 | + | f | 299.5 | 199.5 | 100.1 | 0 | Scenario: Testbot - Travel distance 3x2 matrix Given the node map @@ -277,9 +305,9 @@ Feature: Basic Distance Matrix When I request a travel distance matrix I should get - | | b | e | f | - | a | 100+-1 | 200+-1 | 300+-1 | - | b | 0 | 100+-1 | 200+-1 | + | | b | e | f | + | a | 100.1 | 199.5 | 299.5 | + | b | 0 | 99.4 | 199.5 | Scenario: Testbot - All coordinates are from same small component Given a grid size of 300 meters @@ -299,9 +327,9 @@ Feature: Basic Distance Matrix | fg | When I request a travel distance matrix I should get - | | f | g | - | f | 0 | 300+-2 | - | g | 300+-2 | 0 | + | | f | g | + | f | 0 | 298.2 | + | g | 298.2 | 0 | Scenario: Testbot - Coordinates are from different small component and snap to big CC Given a grid size of 300 meters @@ -333,11 +361,11 @@ Feature: Basic Distance Matrix | i | h | 300m | When I request a travel distance matrix I should get - | | f | g | h | i | - | f | 0 | 300+-2 | 0 | 300+-2 | - | g | 300+-2 | 0 | 300+-2 | 0 | - | h | 0 | 300+-2 | 0 | 300+-2 | - | i | 300+-2 | 0 | 300+-2 | 0 | + | | f | g | h | i | + | f | 0 | 298.2 | 0 | 298.2 | + | g | 298.2 | 0 | 298.2 | 0 | + | h | 0 | 298.2 | 0 | 298.2 | + | i | 298.2 | 0 | 298.2 | 0 | Scenario: Testbot - Travel distance matrix with loops Given the node map @@ -354,11 +382,11 @@ Feature: Basic Distance Matrix | da | yes | When I request a travel distance matrix I should get - | | 1 | 2 | 3 | 4 | - | 1 | 0 | 100+-1 | 400+-1 | 500+-1 | - | 2 | 700+-1 | 0 | 300+-1 | 400+-1 | - | 3 | 400+-1 | 500+-1 | 0 | 100+-1 | - | 4 | 300+-1 | 400+-1 | 700+-1 | 0 | + | | 1 | 2 | 3 | 4 | + | 1 | 0 | 100.1 | 399.6 | 499.7 | + | 2 | 699.1 | 0 | 299.5 | 399.6 | + | 3 | 399.6 | 499.7 | 0 | 100.1 | + | 4 | 299.5 | 399.6 | 699.1 | 0 | Scenario: Testbot - Travel distance matrix based on segment durations @@ -395,12 +423,12 @@ Feature: Basic Distance Matrix | ce | When I request a travel distance matrix I should get - | | a | b | c | d | e | - | a | 0 | 100+-2 | 200+-2 | 300+-2 | 400+-2 | - | b | 100+-2 | 0 | 100+-2 | 200+-2 | 300+-2 | - | c | 200+-2 | 100+-2 | 0 | 100+-2 | 200+-2 | - | d | 300+-2 | 200+-2 | 100+-2 | 0 | 300+-2 | - | e | 400+-2 | 300+-2 | 200+-2 | 300+-2 | 0 | + | | a | b | c | d | e | + | a | 0 | 100.1 | 200.1 | 300.2 | 398.9 | + | b | 100.1 | 0 | 100.1 | 200.1 | 298.9 | + | c | 200.1 | 100.1 | 0 | 100.1 | 198.8 | + | d | 300.2 | 200.1 | 100.1 | 0 | 298.9 | + | e | 398.9 | 298.9 | 198.8 | 298.9 | 0 | Scenario: Testbot - Travel distance matrix for alternative loop paths Given the profile file @@ -439,26 +467,26 @@ Feature: Basic Distance Matrix | ca | yes | When I request a travel distance matrix I should get - | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | - | 1 | 0 | 1100+-5 | 300+-5 | 200+-5 | 600+-5 | 500+-5 | 900+-5 | 800+-5 | - | 2 | 100+-5 | 0 | 400+-5 | 300+-5 | 700+-5 | 600+-5 | 1000+-5 | 900+-5 | - | 3 | 900+-5 | 800+-5 | 0 | 1100+-5 | 300+-5 | 200+-5 | 600+-5 | 500+-5 | - | 4 | 1000+-5 | 900+-5 | 100+-5 | 0 | 400+-5 | 300+-5 | 700+-5 | 600+-5 | - | 5 | 600+-5 | 500+-5 | 900+-5 | 800+-5 | 0 | 1100+-5 | 300+-5 | 200+-5 | - | 6 | 700+-5 | 600+-5 | 1000+-5 | 900+-5 | 100+-5 | 0 | 400+-5 | 300+-5 | - | 7 | 300+-5 | 200+-5 | 600+-5 | 500+-5 | 900+-5 | 800+-5 | 0 | 1100+-5 | - | 8 | 400+-5 | 300+-5 | 700+-5 | 600+-5 | 1000+-5 | 900+-5 | 100+-5 | 0 | + | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | + | 1 | 0 | 1096.7 | 298.9 | 199.5 | 598.4 | 498.3 | 897.3 | 797.9 | + | 2 | 100.1 | 0 | 398.9 | 299.5 | 698.5 | 598.4 | 997.3 | 897.9 | + | 3 | 897.9 | 797.9 | 0 | 1097.4 | 299.5 | 199.5 | 598.4 | 499 | + | 4 | 997.3 | 897.3 | 99.4 | 0 | 398.9 | 298.9 | 697.8 | 598.4 | + | 5 | 598.4 | 498.3 | 897.3 | 797.9 | 0 | 1096.7 | 298.9 | 199.5 | + | 6 | 698.5 | 598.4 | 997.3 | 897.9 | 100.1 | 0 | 398.9 | 299.5 | + | 7 | 299.5 | 199.5 | 598.4 | 499 | 897.9 | 797.9 | 0 | 1097.4 | + | 8 | 398.9 | 298.9 | 697.8 | 598.4 | 997.3 | 897.3 | 99.4 | 0 | When I request a travel distance matrix I should get - | | 1 | - | 1 | 0 | - | 2 | 100+-5 | - | 3 | 900+-5 | - | 4 | 1000+-5 | - | 5 | 600+-5 | - | 6 | 700+-5 | - | 7 | 300+-5 | - | 8 | 400+-5 | + | | 1 | + | 1 | 0 | + | 2 | 100.1 | + | 3 | 897.9 | + | 4 | 997.3 | + | 5 | 598.4 | + | 6 | 698.5 | + | 7 | 299.5 | + | 8 | 398.9 | Scenario: Testbot - Travel distance matrix with ties Given the node map @@ -480,26 +508,26 @@ Feature: Basic Distance Matrix | a | c | ac,ac | 200m | 20s | 20 | When I route I should get - | from | to | route | distance | - | a | b | ab,ab | 450m | - | a | c | ac,ac | 200m | - | a | d | ac,dc,dc | 500m +- 1 | + | from | to | route | distance | + | a | b | ab,ab | 450m | + | a | c | ac,ac | 200m | + | a | d | ac,dc,dc | 499.9m | When I request a travel distance matrix I should get - | | a | b | c | d | - | a | 0 | 450+-2 | 200+-2 | 500+-2 | + | | a | b | c | d | + | a | 0 | 450.3 | 198.8 | 499 | When I request a travel distance matrix I should get - | | a | - | a | 0 | - | b | 450+-2 | - | c | 200+-2 | - | d | 500+-2 | + | | a | + | a | 0 | + | b | 450.3 | + | c | 198.8 | + | d | 499 | When I request a travel distance matrix I should get - | | a | c | - | a | 0 | 200+-2 | - | c | 200+-2 | 0 | + | | a | c | + | a | 0 | 198.8 | + | c | 198.8 | 0 | # Check rounding errors @@ -515,8 +543,8 @@ Feature: Basic Distance Matrix | abcd | When I request a travel distance matrix I should get - | | a | b | c | d | - | a | 0 | 1000+-3 | 2000+-3 | 3000+-3 | + | | a | b | c | d | + | a | 0 | 1000.7 | 2001.4 | 3002.1 | Scenario: Testbot - OneToMany vs ManyToOne @@ -560,10 +588,116 @@ Feature: Basic Distance Matrix | fd | | When I request a travel distance matrix I should get - | | a | b | c | d | e | f | - | a | 0 | 100+-1 | 300+-1 | 650+-1 | 1930+-1 | 1533+-1 | - | b | 760+-1 | 0 | 200+-1 | 550+-1 | 1830+-1 | 1433+-1 | - | c | 560+-2 | 660+-2 | 0 | 350+-1 | 1630+-1 | 1233+-1 | - | d | 1480+-2 | 1580+-1 | 1780+-1 | 0 | 1280+-1 | 883+-1 | - | e | 200+-2 | 300+-2 | 500+-1 | 710+-1 | 0 | 1593+-1 | - | f | 597+-1 | 696+-1 | 896+-1 | 1108+-1 | 400+-3 | 0 | + | | a | b | c | d | e | f | + | a | 0 | 100.1 | 300.2 | 650.5 | 1930.6 | 1533 | + | b | 759 | 0 | 200.1 | 550.4 | 1830.5 | 1432.9 | + | c | 558.8 | 658.9 | 0 | 350.3 | 1630.4 | 1232.8 | + | d | 1478.9 | 1579 | 1779.1 | 0 | 1280.1 | 882.5 | + | e | 198.8 | 298.9 | 499 | 710.3 | 0 | 1592.8 | + | f | 596.4 | 696.5 | 896.6 | 1107.9 | 397.6 | 0 | + + Scenario: Testbot - Filling in noroutes with estimates (defaults to input coordinate location) + Given a grid size of 300 meters + Given the extract extra arguments "--small-component-size 4" + Given the query options + | fallback_speed | 5 | + Given the node map + """ + a b f h 1 + d e g i + """ + + And the ways + | nodes | + | abeda | + | fhigf | + + When I request a travel distance matrix I should get + | | a | b | f | 1 | + | a | 0 | 300.2 | 900.7 | 1501.1 | + | b | 300.2 | 0 | 600.5 | 1200.9 | + | f | 900.7 | 600.5 | 0 | 302.2 | + | 1 | 1501.1 | 1200.9 | 300.2 | 0 | + + When I request a travel distance matrix I should get + | | a | b | f | 1 | + | a | 0 | 300.2 | 900.7 | 1501.1 | + + When I request a travel distance matrix I should get + | | a | + | a | 0 | + | b | 300.2 | + | f | 900.7 | + | 1 | 1501.1 | + + Scenario: Testbot - Fise input coordinate + Given a grid size of 300 meters + Given the extract extra arguments "--small-component-size 4" + Given the query options + | fallback_speed | 5 | + | fallback_coordinate | input | + Given the node map + """ + a b f h 1 + d e g i + """ + + And the ways + | nodes | + | abeda | + | fhigf | + + When I request a travel distance matrix I should get + | | a | b | f | 1 | + | a | 0 | 300.2 | 900.7 | 1501.1 | + | b | 300.2 | 0 | 600.5 | 1200.9 | + | f | 900.7 | 600.5 | 0 | 302.2 | + | 1 | 1501.1 | 1200.9 | 300.2 | 0 | + + When I request a travel distance matrix I should get + | | a | b | f | 1 | + | a | 0 | 300.2 | 900.7 | 1501.1 | + + When I request a travel distance matrix I should get + | | a | + | a | 0 | + | b | 300.2 | + | f | 900.7 | + | 1 | 1501.1 | + + + Scenario: Testbot - Filling in noroutes with estimates - use snapped coordinate + Given a grid size of 300 meters + Given the extract extra arguments "--small-component-size 4" + Given the query options + | fallback_speed | 5 | + | fallback_coordinate | snapped | + Given the node map + """ + a b f h 1 + d e g i + """ + + And the ways + | nodes | + | abeda | + | fhigf | + + When I request a travel distance matrix I should get + | | a | b | f | 1 | + | a | 0 | 300.2 | 900.7 | 1200.9 | + | b | 300.2 | 0 | 600.5 | 900.7 | + | f | 900.7 | 600.5 | 0 | 302.2 | + | 1 | 1200.9 | 900.7 | 300.2 | 0 | + + When I request a travel distance matrix I should get + | | a | b | f | 1 | + | a | 0 | 300.2 | 900.7 | 1200.9 | + + When I request a travel distance matrix I should get + | | a | + | a | 0 | + | b | 300.2 | + | f | 900.7 | + | 1 | 1200.9 | + diff --git a/features/testbot/duration_matrix.feature b/features/testbot/duration_matrix.feature index c6977dfabd9..dce1b177c08 100644 --- a/features/testbot/duration_matrix.feature +++ b/features/testbot/duration_matrix.feature @@ -510,3 +510,268 @@ Feature: Basic Duration Matrix | | a | | a | 0 | | b | 24.1 | + + Scenario: Testbot - Filling in noroutes with estimates (defaults to input coordinate location) + Given a grid size of 300 meters + Given the extract extra arguments "--small-component-size 4" + Given the query options + | fallback_speed | 5 | + Given the node map + """ + a b f h 1 + d e g i + """ + + And the ways + | nodes | + | abeda | + | fhigf | + + When I request a travel time matrix I should get + | | a | b | f | 1 | + | a | 0 | 30 | 18 | 30 | + | b | 30 | 0 | 12 | 24 | + | f | 18 | 12 | 0 | 30 | + | 1 | 30 | 24 | 30 | 0 | + + When I request a travel time matrix I should get + | | a | b | f | 1 | + | a | 0 | 30 | 18 | 30 | + + When I request a travel time matrix I should get + | | a | + | a | 0 | + | b | 30 | + | f | 18 | + | 1 | 30 | + + When I request a travel time matrix I should get estimates for + | | a | b | f | 1 | + | a | | | Y | Y | + | b | | | Y | Y | + | f | Y | Y | | | + | 1 | Y | Y | | | + + When I request a travel time matrix I should get estimates for + | | a | b | f | 1 | + | a | | | Y | Y | + + When I request a travel time matrix I should get estimates for + | | a | + | a | | + | b | | + | f | Y | + | 1 | Y | + + Scenario: Testbot - Filling in noroutes with estimates - use input coordinate + Given a grid size of 300 meters + Given the extract extra arguments "--small-component-size 4" + Given the query options + | fallback_speed | 5 | + | fallback_coordinate | input | + Given the node map + """ + a b f h 1 + d e g i + """ + + And the ways + | nodes | + | abeda | + | fhigf | + + When I request a travel time matrix I should get + | | a | b | f | 1 | + | a | 0 | 30 | 18 | 30 | + | b | 30 | 0 | 12 | 24 | + | f | 18 | 12 | 0 | 30 | + | 1 | 30 | 24 | 30 | 0 | + + When I request a travel time matrix I should get + | | a | b | f | 1 | + | a | 0 | 30 | 18 | 30 | + + When I request a travel time matrix I should get + | | a | + | a | 0 | + | b | 30 | + | f | 18 | + | 1 | 30 | + + When I request a travel time matrix I should get estimates for + | | a | b | f | 1 | + | a | | | Y | Y | + | b | | | Y | Y | + | f | Y | Y | | | + | 1 | Y | Y | | | + + When I request a travel time matrix I should get estimates for + | | a | b | f | 1 | + | a | | | Y | Y | + + When I request a travel time matrix I should get estimates for + | | a | + | a | | + | b | | + | f | Y | + | 1 | Y | + + + Scenario: Testbot - Filling in noroutes with estimates - use snapped coordinate + Given a grid size of 300 meters + Given the extract extra arguments "--small-component-size 4" + Given the query options + | fallback_speed | 5 | + | fallback_coordinate | snapped | + Given the node map + """ + a b f h 1 + d e g i + """ + + And the ways + | nodes | + | abeda | + | fhigf | + + When I request a travel time matrix I should get + | | a | b | f | 1 | + | a | 0 | 30 | 18 | 24 | + | b | 30 | 0 | 12 | 18 | + | f | 18 | 12 | 0 | 30 | + | 1 | 24 | 18 | 30 | 0 | + + When I request a travel time matrix I should get + | | a | b | f | 1 | + | a | 0 | 30 | 18 | 24 | + + When I request a travel time matrix I should get + | | a | + | a | 0 | + | b | 30 | + | f | 18 | + | 1 | 24 | + + When I request a travel time matrix I should get estimates for + | | a | b | f | 1 | + | a | | | Y | Y | + | b | | | Y | Y | + | f | Y | Y | | | + | 1 | Y | Y | | | + + When I request a travel time matrix I should get estimates for + | | a | b | f | 1 | + | a | | | Y | Y | + + When I request a travel time matrix I should get estimates for + | | a | + | a | | + | b | | + | f | Y | + | 1 | Y | + + Scenario: Testbot - Travel time matrix of minimal network with scale factor + Given the query options + | scale_factor | 2 | + Given the node map + """ + a b + """ + And the ways + | nodes | + | ab | + When I request a travel time matrix I should get + | | a | b | + | a | 0 | 20 | + | b | 20 | 0 | + Scenario: Testbot - Test fallback speeds and scale factor + Given a grid size of 300 meters + Given the extract extra arguments "--small-component-size 4" + Given the query options + | scale_factor | 2 | + | fallback_speed | 5 | + | fallback_coordinate | snapped | + + Given the node map + """ + a b f h 1 + d e g i + """ + + And the ways + | nodes | + | abeda | + | fhigf | + + When I request a travel time matrix I should get + | | a | b | f | 1 | + | a | 0 | 60 | 36 | 48 | + | b | 60 | 0 | 24 | 36 | + | f | 36 | 24 | 0 | 60 | + | 1 | 48 | 36 | 60 | 0 | + + When I request a travel time matrix I should get + | | a | b | f | 1 | + | a | 0 | 60 | 36 | 48 | + + When I request a travel time matrix I should get + | | a | + | a | 0 | + | b | 60 | + | f | 36 | + | 1 | 48 | + + When I request a travel time matrix I should get estimates for + | | a | b | f | 1 | + | a | | | Y | Y | + | b | | | Y | Y | + | f | Y | Y | | | + | 1 | Y | Y | | | + + When I request a travel time matrix I should get estimates for + | | a | b | f | 1 | + | a | | | Y | Y | + + When I request a travel time matrix I should get estimates for + | | a | + | a | | + | b | | + | f | Y | + | 1 | Y | + + + Scenario: Testbot - Travel time matrix of minimal network with overflow scale factor + Given the query options + | scale_factor | 2147483647 | + + Given the node map + """ + a b + """ + + And the ways + | nodes | + | ab | + + When I request a travel time matrix I should get + | | a | b | + | a | 0 | 214748364.6 | + | b | 214748364.6 | 0 | + + Scenario: Testbot - Travel time matrix of minimal network with fraction scale factor + Given the query options + | scale_factor | 0.5 | + + Given the node map + """ + a b + """ + + And the ways + | nodes | + | ab | + + When I request a travel time matrix I should get + | | a | b | + | a | 0 | 5 | + | b | 5 | 0 | diff --git a/features/testbot/multi_level_routing.feature b/features/testbot/multi_level_routing.feature index 1fd0ab3999b..35e0408bcde 100644 --- a/features/testbot/multi_level_routing.feature +++ b/features/testbot/multi_level_routing.feature @@ -38,15 +38,15 @@ Feature: Multi level routing Scenario: Testbot - Multi level routing Given the node map """ - a───b e───f - │ │ │ │ + a────b e─────f + \ │ │ / d───c h───g ╲ ╱ ╳ ╱ ╲ i───j m───n - │ │ │ │ - l───k───p───o + / │ │ \ + l─────k───p─────o """ And the nodes @@ -67,78 +67,76 @@ Feature: Multi level routing When I route I should get | from | to | route | time | - | a | b | abcda,abcda | 20s | - | a | f | abcda,cm,mnopm,kp,ijkli,hj,efghe,efghe | 229.4s | - | a | l | abcda,cm,mnopm,kp,ijkli,ijkli | 144.7s | - | a | o | abcda,cm,mnopm,mnopm,mnopm | 124.7s | - | f | l | efghe,hj,ijkli,ijkli,ijkli | 124.7s | - | f | o | efghe,hj,ijkli,kp,mnopm,mnopm | 144.7s | - | l | o | ijkli,kp,mnopm,mnopm | 60s | + | a | b | abcda,abcda | 25s | + | a | f | abcda,cm,mnopm,kp,ijkli,hj,efghe,efghe | 239.2s | + | a | l | abcda,cm,mnopm,kp,ijkli,ijkli | 157.1s | + | a | o | abcda,cm,mnopm,mnopm,mnopm | 137.1s | + | f | l | efghe,hj,ijkli,ijkli | 136.7s | + | f | o | efghe,hj,ijkli,kp,mnopm,mnopm | 162.1s | + | l | o | ijkli,kp,mnopm,mnopm | 80s | | c | m | cm,cm | 44.7s | + | f | a | efghe,hj,ijkli,kp,mnopm,cm,abcda,abcda | 239.2s | + | l | a | ijkli,kp,mnopm,cm,abcda,abcda | 157.1s | When I request a travel time matrix I should get - | | a | f | l | o | - | a | 0 | 229.4 | 144.7 | 124.7 | - | f | 229.4 | 0 | 124.7 | 144.7 | - | l | 144.7 | 124.7 | 0 | 60 | - | o | 124.7 | 144.7 | 60 | 0 | + | | a | f | l | o | + | a | 0 | 239.2 | 157.1 | 137.1 | + | f | 239.2 | 0 | 136.7 | 162.1 | + | l | 157.1 | 136.7 | 0 | 80 | + | o | 137.1 | 162.1 | 80 | 0 | When I request a travel time matrix I should get - | | a | f | l | o | - | a | 0 | 229.4 | 144.7 | 124.7 | + | | a | f | l | o | + | a | 0 | 239.2 | 157.1 | 137.1 | When I request a travel time matrix I should get - | | a | - | a | 0 | - | f | 229.4 | - | l | 144.7 | - | o | 124.7 | + | | a | + | a | 0 | + | f | 239.2 | + | l | 157.1 | + | o | 137.1 | When I request a travel time matrix I should get - | | a | f | l | o | - | a | 0 | 229.4 | 144.7 | 124.7 | - | o | 124.7 | 144.7 | 60 | 0 | + | | a | f | l | o | + | a | 0 | 239.2 | 157.1 | 137.1 | + | o | 137.1 | 162.1 | 80 | 0 | When I request a travel time matrix I should get | | a | o | - | a | 0 | 124.7 | - | f | 229.4 | 144.7 | - | l | 144.7 | 60 | - | o | 124.7 | 0 | - + | a | 0 | 137.1 | + | f | 239.2 | 162.1 | + | l | 157.1 | 80 | + | o | 137.1 | 0 | When I request a travel distance matrix I should get - | | a | f | l | o | - | a | 0+-2 | 2287+-2 | 1443+-2 | 1243+-2 | - | f | 2284+-2 | 0+-2 | 1241+-2 | 1443+-2 | - | l | 1443+-2 | 1244+-2 | 0+-2 | 600+-2 | - | o | 1243+-2 | 1444+-2 | 600+-2 | 0+-2 | + | | a | f | l | o | + | a | 0 | 2383.7 | 1566.9 | 1366.8 | + | f | 2339.9 | 0 | 1198.1 | 1522.1 | + | l | 1618.3 | 1293.3 | 0 | 800.5 | + | o | 1418.2 | 1617.3 | 800.5 | 0 | When I request a travel distance matrix I should get - | | a | f | l | o | - | a | 0 | 2287.2+-2 | 1443+-2 | 1243+-2 | + | | a | f | l | o | + | a | 0 | 2383.7 | 1566.9 | 1366.8 | When I request a travel distance matrix I should get - | | a | - | a | 0 | - | f | 2284.5+-2 | - | l | 1443.1 | - | o | 1243 | + | | a | + | a | 0 | + | f | 2339.9 | + | l | 1618.3 | + | o | 1418.2 | When I request a travel distance matrix I should get - | | a | f | l | o | - | a | 0 | 2287+-2 | 1443+-2 | 1243+-2 | - | o | 1243 | 1444+-2 | 600+-2 | 0+-2 | - + | | a | f | l | o | + | a | 0 | 2383.7 | 1566.9 | 1366.8 | + | f | 2339.9 | 0 | 1198.1 | 1522.1 | When I request a travel distance matrix I should get - | | a | o | - | a | 0+-2 | 1243+-2 | - | f | 2284+-2 | 1443+-2 | - | l | 1443+-2 | 600+-2 | - | o | 1243+-2 | 0+-2 | - - + | | a | o | + | a | 0 | 1366.8 | + | f | 2339.9 | 1522.1 | + | l | 1618.3 | 800.5 | + | o | 1418.2 | 0 | Scenario: Testbot - Multi level routing: horizontal road Given the node map diff --git a/include/contractor/contractor_graph.hpp b/include/contractor/contractor_graph.hpp index 3424568a6f7..02cad2e0840 100644 --- a/include/contractor/contractor_graph.hpp +++ b/include/contractor/contractor_graph.hpp @@ -12,23 +12,26 @@ namespace contractor struct ContractorEdgeData { ContractorEdgeData() - : weight(0), duration(0), id(0), originalEdges(0), shortcut(0), forward(0), backward(0) + : weight(0), duration(0), distance(0), id(0), originalEdges(0), shortcut(0), forward(0), + backward(0) { } ContractorEdgeData(EdgeWeight weight, EdgeWeight duration, + EdgeDistance distance, unsigned original_edges, unsigned id, bool shortcut, bool forward, bool backward) - : weight(weight), duration(duration), id(id), + : weight(weight), duration(duration), distance(distance), id(id), originalEdges(std::min((1u << 29) - 1u, original_edges)), shortcut(shortcut), forward(forward), backward(backward) { } EdgeWeight weight; EdgeWeight duration; + EdgeDistance distance; unsigned id; unsigned originalEdges : 29; bool shortcut : 1; diff --git a/include/contractor/graph_contractor_adaptors.hpp b/include/contractor/graph_contractor_adaptors.hpp index 11d96af580e..94dc7e62b2a 100644 --- a/include/contractor/graph_contractor_adaptors.hpp +++ b/include/contractor/graph_contractor_adaptors.hpp @@ -41,6 +41,7 @@ ContractorGraph toContractorGraph(NodeID number_of_nodes, InputEdgeContainer inp input_edge.target, std::max(input_edge.data.weight, 1), input_edge.data.duration, + input_edge.data.distance, 1, input_edge.data.turn_id, false, @@ -51,6 +52,7 @@ ContractorGraph toContractorGraph(NodeID number_of_nodes, InputEdgeContainer inp input_edge.source, std::max(input_edge.data.weight, 1), input_edge.data.duration, + input_edge.data.distance, 1, input_edge.data.turn_id, false, @@ -82,6 +84,7 @@ ContractorGraph toContractorGraph(NodeID number_of_nodes, InputEdgeContainer inp forward_edge.data.originalEdges = reverse_edge.data.originalEdges = 1; forward_edge.data.weight = reverse_edge.data.weight = INVALID_EDGE_WEIGHT; forward_edge.data.duration = reverse_edge.data.duration = MAXIMAL_EDGE_DURATION; + forward_edge.data.distance = reverse_edge.data.distance = MAXIMAL_EDGE_DISTANCE; // remove parallel edges while (i < edges.size() && edges[i].source == source && edges[i].target == target) { @@ -90,12 +93,16 @@ ContractorGraph toContractorGraph(NodeID number_of_nodes, InputEdgeContainer inp forward_edge.data.weight = std::min(edges[i].data.weight, forward_edge.data.weight); forward_edge.data.duration = std::min(edges[i].data.duration, forward_edge.data.duration); + forward_edge.data.distance = + std::min(edges[i].data.distance, forward_edge.data.distance); } if (edges[i].data.backward) { reverse_edge.data.weight = std::min(edges[i].data.weight, reverse_edge.data.weight); reverse_edge.data.duration = std::min(edges[i].data.duration, reverse_edge.data.duration); + reverse_edge.data.distance = + std::min(edges[i].data.distance, reverse_edge.data.distance); } ++i; } @@ -151,6 +158,7 @@ template inline std::vector toEdges(GraphT g BOOST_ASSERT_MSG(SPECIAL_NODEID != new_edge.target, "Target id invalid"); new_edge.data.weight = data.weight; new_edge.data.duration = data.duration; + new_edge.data.distance = data.distance; new_edge.data.shortcut = data.shortcut; new_edge.data.turn_id = data.id; BOOST_ASSERT_MSG(new_edge.data.turn_id != INT_MAX, // 2^31 diff --git a/include/contractor/query_edge.hpp b/include/contractor/query_edge.hpp index a1d24f861a0..74d38e79ecb 100644 --- a/include/contractor/query_edge.hpp +++ b/include/contractor/query_edge.hpp @@ -17,7 +17,8 @@ struct QueryEdge struct EdgeData { explicit EdgeData() - : turn_id(0), shortcut(false), weight(0), duration(0), forward(false), backward(false) + : turn_id(0), shortcut(false), weight(0), duration(0), forward(false), backward(false), + distance(0) { } @@ -25,10 +26,11 @@ struct QueryEdge const bool shortcut, const EdgeWeight weight, const EdgeWeight duration, + const EdgeDistance distance, const bool forward, const bool backward) : turn_id(turn_id), shortcut(shortcut), weight(weight), duration(duration), - forward(forward), backward(backward) + forward(forward), backward(backward), distance(distance) { } @@ -40,6 +42,7 @@ struct QueryEdge turn_id = other.id; forward = other.forward; backward = other.backward; + distance = other.distance; } // this ID is either the middle node of the shortcut, or the ID of the edge based node (node // based edge) storing the appropriate data. If `shortcut` is set to true, we get the middle @@ -50,6 +53,7 @@ struct QueryEdge EdgeWeight duration : 30; std::uint32_t forward : 1; std::uint32_t backward : 1; + EdgeDistance distance; } data; QueryEdge() : source(SPECIAL_NODEID), target(SPECIAL_NODEID) {} @@ -69,7 +73,8 @@ struct QueryEdge return (source == right.source && target == right.target && data.weight == right.data.weight && data.duration == right.data.duration && data.shortcut == right.data.shortcut && data.forward == right.data.forward && - data.backward == right.data.backward && data.turn_id == right.data.turn_id); + data.backward == right.data.backward && data.turn_id == right.data.turn_id && + data.distance == right.data.distance); } }; } diff --git a/include/customizer/cell_customizer.hpp b/include/customizer/cell_customizer.hpp index 01e65e5826c..df549957998 100644 --- a/include/customizer/cell_customizer.hpp +++ b/include/customizer/cell_customizer.hpp @@ -22,6 +22,7 @@ class CellCustomizer { bool from_clique; EdgeDuration duration; + EdgeDistance distance; }; public: @@ -60,7 +61,7 @@ class CellCustomizer } } heap.Clear(); - heap.Insert(source, 0, {false, 0}); + heap.Insert(source, 0, {false, 0, 0}); // explore search space while (!heap.Empty() && !destinations_set.empty()) @@ -68,8 +69,18 @@ class CellCustomizer const NodeID node = heap.DeleteMin(); const EdgeWeight weight = heap.GetKey(node); const EdgeDuration duration = heap.GetData(node).duration; - - RelaxNode(graph, cells, allowed_nodes, metric, heap, level, node, weight, duration); + const EdgeDistance distance = heap.GetData(node).distance; + + RelaxNode(graph, + cells, + allowed_nodes, + metric, + heap, + level, + node, + weight, + duration, + distance); destinations_set.erase(node); } @@ -77,21 +88,27 @@ class CellCustomizer // fill a map of destination nodes to placeholder pointers auto weights = cell.GetOutWeight(source); auto durations = cell.GetOutDuration(source); + auto distances = cell.GetOutDistance(source); for (auto &destination : destinations) { BOOST_ASSERT(!weights.empty()); BOOST_ASSERT(!durations.empty()); + BOOST_ASSERT(!distances.empty()); const bool inserted = heap.WasInserted(destination); weights.front() = inserted ? heap.GetKey(destination) : INVALID_EDGE_WEIGHT; durations.front() = inserted ? heap.GetData(destination).duration : MAXIMAL_EDGE_DURATION; + distances.front() = + inserted ? heap.GetData(destination).distance : INVALID_EDGE_DISTANCE; weights.advance_begin(1); durations.advance_begin(1); + distances.advance_begin(1); } BOOST_ASSERT(weights.empty()); BOOST_ASSERT(durations.empty()); + BOOST_ASSERT(distances.empty()); } } @@ -128,7 +145,8 @@ class CellCustomizer LevelID level, NodeID node, EdgeWeight weight, - EdgeDuration duration) const + EdgeDuration duration, + EdgeDistance distance) const { auto first_level = level == 1; BOOST_ASSERT(heap.WasInserted(node)); @@ -149,6 +167,7 @@ class CellCustomizer auto subcell = cells.GetCell(metric, level - 1, subcell_id); auto subcell_destination = subcell.GetDestinationNodes().begin(); auto subcell_duration = subcell.GetOutDuration(node).begin(); + auto subcell_distance = subcell.GetOutDistance(node).begin(); for (auto subcell_weight : subcell.GetOutWeight(node)) { if (subcell_weight != INVALID_EDGE_WEIGHT) @@ -161,20 +180,24 @@ class CellCustomizer const EdgeWeight to_weight = weight + subcell_weight; const EdgeDuration to_duration = duration + *subcell_duration; + const EdgeDistance to_distance = distance + *subcell_distance; if (!heap.WasInserted(to)) { - heap.Insert(to, to_weight, {true, to_duration}); + heap.Insert(to, to_weight, {true, to_duration, to_distance}); } - else if (std::tie(to_weight, to_duration) < - std::tie(heap.GetKey(to), heap.GetData(to).duration)) + else if (std::tie(to_weight, to_duration, to_distance) < + std::tie(heap.GetKey(to), + heap.GetData(to).duration, + heap.GetData(to).distance)) { heap.DecreaseKey(to, to_weight); - heap.GetData(to) = {true, to_duration}; + heap.GetData(to) = {true, to_duration, to_distance}; } } ++subcell_destination; ++subcell_duration; + ++subcell_distance; } } } @@ -195,15 +218,18 @@ class CellCustomizer { const EdgeWeight to_weight = weight + data.weight; const EdgeDuration to_duration = duration + data.duration; + const EdgeDistance to_distance = distance + data.distance; if (!heap.WasInserted(to)) { - heap.Insert(to, to_weight, {false, duration + data.duration}); + heap.Insert( + to, to_weight, {false, duration + data.duration, distance + data.distance}); } - else if (std::tie(to_weight, to_duration) < - std::tie(heap.GetKey(to), heap.GetData(to).duration)) + else if (std::tie(to_weight, to_duration, to_distance) < + std::tie( + heap.GetKey(to), heap.GetData(to).duration, heap.GetData(to).distance)) { heap.DecreaseKey(to, to_weight); - heap.GetData(to) = {false, to_duration}; + heap.GetData(to) = {false, to_duration, to_distance}; } } } diff --git a/include/customizer/cell_metric.hpp b/include/customizer/cell_metric.hpp index 530a18559c0..7674174feda 100644 --- a/include/customizer/cell_metric.hpp +++ b/include/customizer/cell_metric.hpp @@ -20,6 +20,7 @@ template struct CellMetricImpl Vector weights; Vector durations; + Vector distances; }; } diff --git a/include/customizer/edge_based_graph.hpp b/include/customizer/edge_based_graph.hpp index 8414c594283..840a8429984 100644 --- a/include/customizer/edge_based_graph.hpp +++ b/include/customizer/edge_based_graph.hpp @@ -58,8 +58,10 @@ class MultiLevelGraph : public partitioner::MultiLevelGraph node_weights_, - Vector node_durations_) - : node_weights(std::move(node_weights_)), node_durations(std::move(node_durations_)) + Vector node_durations_, + Vector node_distances_) + : node_weights(std::move(node_weights_)), node_durations(std::move(node_durations_)), + node_distances(std::move(node_distances_)) { util::ViewOrVector original_edge_array; @@ -83,11 +85,13 @@ class MultiLevelGraph : public partitioner::MultiLevelGraph node_to_edge_offset_, Vector node_weights_, Vector node_durations_, + Vector node_distances_, Vector is_forward_edge_, Vector is_backward_edge_) : SuperT(std::move(node_array_), std::move(edge_array_), std::move(node_to_edge_offset_)), node_weights(std::move(node_weights_)), node_durations(std::move(node_durations_)), - is_forward_edge(is_forward_edge_), is_backward_edge(is_backward_edge_) + node_distances(std::move(node_distances_)), is_forward_edge(is_forward_edge_), + is_backward_edge(is_backward_edge_) { } @@ -95,6 +99,8 @@ class MultiLevelGraph : public partitioner::MultiLevelGraph node_weights; Vector node_durations; + Vector node_distances; Vector is_forward_edge; Vector is_backward_edge; }; diff --git a/include/customizer/serialization.hpp b/include/customizer/serialization.hpp index c5c5fdee28e..afe23cf9bba 100644 --- a/include/customizer/serialization.hpp +++ b/include/customizer/serialization.hpp @@ -23,6 +23,7 @@ inline void read(storage::tar::FileReader &reader, { storage::serialization::read(reader, name + "/weights", metric.weights); storage::serialization::read(reader, name + "/durations", metric.durations); + storage::serialization::read(reader, name + "/distances", metric.distances); } template @@ -32,6 +33,7 @@ inline void write(storage::tar::FileWriter &writer, { storage::serialization::write(writer, name + "/weights", metric.weights); storage::serialization::write(writer, name + "/durations", metric.durations); + storage::serialization::write(writer, name + "/distances", metric.distances); } template @@ -42,6 +44,7 @@ inline void read(storage::tar::FileReader &reader, storage::serialization::read(reader, name + "/node_array", graph.node_array); storage::serialization::read(reader, name + "/node_weights", graph.node_weights); storage::serialization::read(reader, name + "/node_durations", graph.node_durations); + storage::serialization::read(reader, name + "/node_distances", graph.node_distances); storage::serialization::read(reader, name + "/edge_array", graph.edge_array); storage::serialization::read(reader, name + "/is_forward_edge", graph.is_forward_edge); storage::serialization::read(reader, name + "/is_backward_edge", graph.is_backward_edge); @@ -56,6 +59,7 @@ inline void write(storage::tar::FileWriter &writer, storage::serialization::write(writer, name + "/node_array", graph.node_array); storage::serialization::write(writer, name + "/node_weights", graph.node_weights); storage::serialization::write(writer, name + "/node_durations", graph.node_durations); + storage::serialization::write(writer, name + "/node_distances", graph.node_distances); storage::serialization::write(writer, name + "/edge_array", graph.edge_array); storage::serialization::write(writer, name + "/is_forward_edge", graph.is_forward_edge); storage::serialization::write(writer, name + "/is_backward_edge", graph.is_backward_edge); diff --git a/include/engine/api/base_api.hpp b/include/engine/api/base_api.hpp index 0e0dad33b1f..e0c924348d1 100644 --- a/include/engine/api/base_api.hpp +++ b/include/engine/api/base_api.hpp @@ -6,6 +6,7 @@ #include "engine/api/json_factory.hpp" #include "engine/hint.hpp" +#include "util/coordinate_calculation.hpp" #include #include @@ -53,6 +54,8 @@ class BaseAPI // TODO: check forward/reverse return json::makeWaypoint( phantom.location, + util::coordinate_calculation::fccApproximateDistance(phantom.location, + phantom.input_location), facade.GetNameForID(facade.GetNameIndex(phantom.forward_segment_id.id)).to_string(), Hint{phantom, facade.GetCheckSum()}); } @@ -61,6 +64,8 @@ class BaseAPI // TODO: check forward/reverse return json::makeWaypoint( phantom.location, + util::coordinate_calculation::fccApproximateDistance(phantom.location, + phantom.input_location), facade.GetNameForID(facade.GetNameIndex(phantom.forward_segment_id.id)) .to_string()); } diff --git a/include/engine/api/json_factory.hpp b/include/engine/api/json_factory.hpp index 627a59eadbd..db30ecc9efc 100644 --- a/include/engine/api/json_factory.hpp +++ b/include/engine/api/json_factory.hpp @@ -33,7 +33,7 @@ namespace json namespace detail { -util::json::Array coordinateToLonLat(const util::Coordinate coordinate); +util::json::Array coordinateToLonLat(const util::Coordinate &coordinate); /** * Ensures that a bearing value is a whole number, and clamped to the range 0-359 @@ -86,11 +86,14 @@ util::json::Object makeRoute(const guidance::Route &route, const char *weight_name); // Creates a Waypoint without Hint, see the Hint overload below -util::json::Object makeWaypoint(const util::Coordinate location, std::string name); +util::json::Object +makeWaypoint(const util::Coordinate &location, const double &distance, std::string name); // Creates a Waypoint with Hint, see the overload above when Hint is not needed -util::json::Object -makeWaypoint(const util::Coordinate location, std::string name, const Hint &hint); +util::json::Object makeWaypoint(const util::Coordinate &location, + const double &distance, + std::string name, + const Hint &hint); util::json::Object makeRouteLeg(guidance::RouteLeg leg, util::json::Array steps); diff --git a/include/engine/api/nearest_api.hpp b/include/engine/api/nearest_api.hpp index 8793af6ca70..bb55b0634e5 100644 --- a/include/engine/api/nearest_api.hpp +++ b/include/engine/api/nearest_api.hpp @@ -41,7 +41,6 @@ class NearestAPI final : public BaseAPI [this](const PhantomNodeWithDistance &phantom_with_distance) { auto &phantom_node = phantom_with_distance.phantom_node; auto waypoint = MakeWaypoint(phantom_node); - waypoint.values["distance"] = phantom_with_distance.distance; util::json::Array nodes; diff --git a/include/engine/api/table_api.hpp b/include/engine/api/table_api.hpp index 7f8cb770615..7f94bfbe02c 100644 --- a/include/engine/api/table_api.hpp +++ b/include/engine/api/table_api.hpp @@ -31,6 +31,15 @@ namespace api class TableAPI final : public BaseAPI { public: + struct TableCellRef + { + TableCellRef(const std::size_t &row, const std::size_t &column) : row{row}, column{column} + { + } + std::size_t row; + std::size_t column; + }; + TableAPI(const datafacade::BaseDataFacade &facade_, const TableParameters ¶meters_) : BaseAPI(facade_, parameters_), parameters(parameters_) { @@ -39,6 +48,7 @@ class TableAPI final : public BaseAPI virtual void MakeResponse(const std::pair, std::vector> &tables, const std::vector &phantoms, + const std::vector &fallback_speed_cells, util::json::Object &response) const { auto number_of_sources = parameters.sources.size(); @@ -77,6 +87,11 @@ class TableAPI final : public BaseAPI MakeDistanceTable(tables.second, number_of_sources, number_of_destinations); } + if (parameters.fallback_speed != INVALID_FALLBACK_SPEED && parameters.fallback_speed > 0) + { + response.values["fallback_speed_cells"] = MakeEstimatesTable(fallback_speed_cells); + } + response.values["code"] = "Ok"; } @@ -163,6 +178,20 @@ class TableAPI final : public BaseAPI return json_table; } + virtual util::json::Array + MakeEstimatesTable(const std::vector &fallback_speed_cells) const + { + util::json::Array json_table; + std::for_each( + fallback_speed_cells.begin(), fallback_speed_cells.end(), [&](const auto &cell) { + util::json::Array row; + row.values.push_back(util::json::Number(cell.row)); + row.values.push_back(util::json::Number(cell.column)); + json_table.values.push_back(std::move(row)); + }); + return json_table; + } + const TableParameters ¶meters; }; diff --git a/include/engine/api/table_parameters.hpp b/include/engine/api/table_parameters.hpp index 4f1a496bd6f..fbbf6831e9d 100644 --- a/include/engine/api/table_parameters.hpp +++ b/include/engine/api/table_parameters.hpp @@ -59,6 +59,15 @@ struct TableParameters : public BaseParameters { std::vector sources; std::vector destinations; + double fallback_speed = INVALID_FALLBACK_SPEED; + + enum class FallbackCoordinateType + { + Input = 0, + Snapped = 1 + }; + + FallbackCoordinateType fallback_coordinate_type = FallbackCoordinateType::Input; enum class AnnotationsType { @@ -70,6 +79,8 @@ struct TableParameters : public BaseParameters AnnotationsType annotations = AnnotationsType::Duration; + double scale_factor = 1; + TableParameters() = default; template TableParameters(std::vector sources_, @@ -90,6 +101,22 @@ struct TableParameters : public BaseParameters { } + template + TableParameters(std::vector sources_, + std::vector destinations_, + const AnnotationsType annotations_, + double fallback_speed_, + FallbackCoordinateType fallback_coordinate_type_, + double scale_factor_, + Args... args_) + : BaseParameters{std::forward(args_)...}, sources{std::move(sources_)}, + destinations{std::move(destinations_)}, fallback_speed{fallback_speed_}, + fallback_coordinate_type{fallback_coordinate_type_}, annotations{annotations_}, + scale_factor{scale_factor_} + + { + } + bool IsValid() const { if (!BaseParameters::IsValid()) @@ -101,14 +128,7 @@ struct TableParameters : public BaseParameters // 1/ The user is able to specify duplicates in srcs and dsts, in that case it's their fault - // 2/ len(srcs) and len(dsts) smaller or equal to len(locations) - if (sources.size() > coordinates.size()) - return false; - - if (destinations.size() > coordinates.size()) - return false; - - // 3/ 0 <= index < len(locations) + // 2/ 0 <= index < len(locations) const auto not_in_range = [this](const std::size_t x) { return x >= coordinates.size(); }; if (std::any_of(begin(sources), end(sources), not_in_range)) @@ -117,6 +137,12 @@ struct TableParameters : public BaseParameters if (std::any_of(begin(destinations), end(destinations), not_in_range)) return false; + if (fallback_speed <= 0) + return false; + + if (scale_factor <= 0) + return false; + return true; } }; diff --git a/include/engine/datafacade/algorithm_datafacade.hpp b/include/engine/datafacade/algorithm_datafacade.hpp index ef910d4ac22..a83a5340c70 100644 --- a/include/engine/datafacade/algorithm_datafacade.hpp +++ b/include/engine/datafacade/algorithm_datafacade.hpp @@ -78,6 +78,8 @@ template <> class AlgorithmDataFacade virtual EdgeWeight GetNodeDuration(const NodeID node) const = 0; // TODO: to be removed + virtual EdgeDistance GetNodeDistance(const NodeID node) const = 0; + virtual bool IsForwardEdge(EdgeID edge) const = 0; virtual bool IsBackwardEdge(EdgeID edge) const = 0; diff --git a/include/engine/datafacade/contiguous_internalmem_datafacade.hpp b/include/engine/datafacade/contiguous_internalmem_datafacade.hpp index 6befce6d08d..936d40f9961 100644 --- a/include/engine/datafacade/contiguous_internalmem_datafacade.hpp +++ b/include/engine/datafacade/contiguous_internalmem_datafacade.hpp @@ -697,6 +697,11 @@ template <> class ContiguousInternalMemoryAlgorithmDataFacade : public Algo return query_graph.GetNodeDuration(node); } + EdgeDistance GetNodeDistance(const NodeID node) const override final + { + return query_graph.GetNodeDistance(node); + } + bool IsForwardEdge(const NodeID node) const override final { return query_graph.IsForwardEdge(node); diff --git a/include/engine/datafacade/mmap_memory_allocator.hpp b/include/engine/datafacade/mmap_memory_allocator.hpp index 4a9742a4422..60df71e90b5 100644 --- a/include/engine/datafacade/mmap_memory_allocator.hpp +++ b/include/engine/datafacade/mmap_memory_allocator.hpp @@ -10,6 +10,7 @@ #include #include +#include namespace osrm { @@ -24,8 +25,7 @@ namespace datafacade class MMapMemoryAllocator : public ContiguousBlockAllocator { public: - explicit MMapMemoryAllocator(const storage::StorageConfig &config, - const boost::filesystem::path &memory_file); + explicit MMapMemoryAllocator(const storage::StorageConfig &config); ~MMapMemoryAllocator() override final; // interface to give access to the datafacades @@ -33,8 +33,8 @@ class MMapMemoryAllocator : public ContiguousBlockAllocator private: storage::SharedDataIndex index; - util::vector_view mapped_memory; - boost::iostreams::mapped_file mapped_memory_file; + std::vector mapped_memory_files; + std::string rtree_filename; }; } // namespace datafacade diff --git a/include/engine/datafacade_provider.hpp b/include/engine/datafacade_provider.hpp index a624ee009e6..0f1441f6a39 100644 --- a/include/engine/datafacade_provider.hpp +++ b/include/engine/datafacade_provider.hpp @@ -32,9 +32,8 @@ class ExternalProvider final : public DataFacadeProvider public: using Facade = typename DataFacadeProvider::Facade; - ExternalProvider(const storage::StorageConfig &config, - const boost::filesystem::path &memory_file) - : facade_factory(std::make_shared(config, memory_file)) + ExternalProvider(const storage::StorageConfig &config) + : facade_factory(std::make_shared(config)) { } diff --git a/include/engine/engine.hpp b/include/engine/engine.hpp index 025dc2deb96..9121c7b0e0a 100644 --- a/include/engine/engine.hpp +++ b/include/engine/engine.hpp @@ -63,12 +63,16 @@ template class Engine final : public EngineInterface << "\" with algorithm " << routing_algorithms::name(); facade_provider = std::make_unique>(config.dataset_name); } - else if (!config.memory_file.empty()) + else if (!config.memory_file.empty() || config.use_mmap) { - util::Log(logDEBUG) << "Using memory mapped filed at " << config.memory_file - << " with algorithm " << routing_algorithms::name(); - facade_provider = std::make_unique>(config.storage_config, - config.memory_file); + if (!config.memory_file.empty()) + { + util::Log(logWARNING) + << "The 'memory_file' option is DEPRECATED - using direct mmaping instead"; + } + util::Log(logDEBUG) << "Using direct memory mapping with algorithm " + << routing_algorithms::name(); + facade_provider = std::make_unique>(config.storage_config); } else { diff --git a/include/engine/engine_config.hpp b/include/engine/engine_config.hpp index 149cdbd390c..cc0cc4a932b 100644 --- a/include/engine/engine_config.hpp +++ b/include/engine/engine_config.hpp @@ -89,6 +89,7 @@ struct EngineConfig final int max_alternatives = 3; // set an arbitrary upper bound; can be adjusted by user bool use_shared_memory = true; boost::filesystem::path memory_file; + bool use_mmap = true; Algorithm algorithm = Algorithm::CH; std::string verbosity; std::string dataset_name; diff --git a/include/engine/routing_algorithms.hpp b/include/engine/routing_algorithms.hpp index aec19f753d3..5d4a8a956b0 100644 --- a/include/engine/routing_algorithms.hpp +++ b/include/engine/routing_algorithms.hpp @@ -34,8 +34,7 @@ class RoutingAlgorithmsInterface ManyToManySearch(const std::vector &phantom_nodes, const std::vector &source_indices, const std::vector &target_indices, - const bool calculate_distance, - const bool calculate_duration) const = 0; + const bool calculate_distance) const = 0; virtual routing_algorithms::SubMatchingList MapMatching(const routing_algorithms::CandidateLists &candidates_list, @@ -88,8 +87,7 @@ template class RoutingAlgorithms final : public RoutingAlgo ManyToManySearch(const std::vector &phantom_nodes, const std::vector &source_indices, const std::vector &target_indices, - const bool calculate_distance, - const bool calculate_duration) const final override; + const bool calculate_distance) const final override; routing_algorithms::SubMatchingList MapMatching(const routing_algorithms::CandidateLists &candidates_list, @@ -198,8 +196,7 @@ std::pair, std::vector> RoutingAlgorithms::ManyToManySearch(const std::vector &phantom_nodes, const std::vector &_source_indices, const std::vector &_target_indices, - const bool calculate_distance, - const bool calculate_duration) const + const bool calculate_distance) const { BOOST_ASSERT(!phantom_nodes.empty()); @@ -222,8 +219,7 @@ RoutingAlgorithms::ManyToManySearch(const std::vector &p phantom_nodes, std::move(source_indices), std::move(target_indices), - calculate_distance, - calculate_duration); + calculate_distance); } template diff --git a/include/engine/routing_algorithms/many_to_many.hpp b/include/engine/routing_algorithms/many_to_many.hpp index 281844abd18..ddd861f0602 100644 --- a/include/engine/routing_algorithms/many_to_many.hpp +++ b/include/engine/routing_algorithms/many_to_many.hpp @@ -25,15 +25,17 @@ struct NodeBucket unsigned from_clique_arc : 1; EdgeWeight weight; EdgeDuration duration; + EdgeDistance distance; NodeBucket(NodeID middle_node, NodeID parent_node, bool from_clique_arc, unsigned column_index, EdgeWeight weight, - EdgeDuration duration) + EdgeDuration duration, + EdgeDistance distance) : middle_node(middle_node), parent_node(parent_node), column_index(column_index), - from_clique_arc(from_clique_arc), weight(weight), duration(duration) + from_clique_arc(from_clique_arc), weight(weight), duration(duration), distance(distance) { } @@ -41,9 +43,10 @@ struct NodeBucket NodeID parent_node, unsigned column_index, EdgeWeight weight, - EdgeDuration duration) + EdgeDuration duration, + EdgeDistance distance) : middle_node(middle_node), parent_node(parent_node), column_index(column_index), - from_clique_arc(false), weight(weight), duration(duration) + from_clique_arc(false), weight(weight), duration(duration), distance(distance) { } @@ -94,8 +97,7 @@ manyToManySearch(SearchEngineData &engine_working_data, const std::vector &phantom_nodes, const std::vector &source_indices, const std::vector &target_indices, - const bool calculate_distance, - const bool calculate_duration); + const bool calculate_distance); } // namespace routing_algorithms } // namespace engine diff --git a/include/engine/routing_algorithms/routing_base.hpp b/include/engine/routing_algorithms/routing_base.hpp index 0c0808a3f49..4afaae71fc6 100644 --- a/include/engine/routing_algorithms/routing_base.hpp +++ b/include/engine/routing_algorithms/routing_base.hpp @@ -85,13 +85,17 @@ void insertSourceInHeap(ManyToManyQueryHeap &heap, const PhantomNode &phantom_no { heap.Insert(phantom_node.forward_segment_id.id, -phantom_node.GetForwardWeightPlusOffset(), - {phantom_node.forward_segment_id.id, -phantom_node.GetForwardDuration()}); + {phantom_node.forward_segment_id.id, + -phantom_node.GetForwardDuration(), + -phantom_node.GetForwardDistance()}); } if (phantom_node.IsValidReverseSource()) { heap.Insert(phantom_node.reverse_segment_id.id, -phantom_node.GetReverseWeightPlusOffset(), - {phantom_node.reverse_segment_id.id, -phantom_node.GetReverseDuration()}); + {phantom_node.reverse_segment_id.id, + -phantom_node.GetReverseDuration(), + -phantom_node.GetReverseDistance()}); } } @@ -102,13 +106,17 @@ void insertTargetInHeap(ManyToManyQueryHeap &heap, const PhantomNode &phantom_no { heap.Insert(phantom_node.forward_segment_id.id, phantom_node.GetForwardWeightPlusOffset(), - {phantom_node.forward_segment_id.id, phantom_node.GetForwardDuration()}); + {phantom_node.forward_segment_id.id, + phantom_node.GetForwardDuration(), + phantom_node.GetForwardDistance()}); } if (phantom_node.IsValidReverseTarget()) { heap.Insert(phantom_node.reverse_segment_id.id, phantom_node.GetReverseWeightPlusOffset(), - {phantom_node.reverse_segment_id.id, phantom_node.GetReverseDuration()}); + {phantom_node.reverse_segment_id.id, + phantom_node.GetReverseDuration(), + phantom_node.GetReverseDistance()}); } } diff --git a/include/engine/routing_algorithms/routing_base_ch.hpp b/include/engine/routing_algorithms/routing_base_ch.hpp index 051b5f8c4a6..79044c8d65b 100644 --- a/include/engine/routing_algorithms/routing_base_ch.hpp +++ b/include/engine/routing_algorithms/routing_base_ch.hpp @@ -186,9 +186,10 @@ void routingStep(const DataFacade &facade, } template -EdgeWeight getLoopWeight(const DataFacade &facade, NodeID node) +std::tuple getLoopWeight(const DataFacade &facade, NodeID node) { EdgeWeight loop_weight = UseDuration ? MAXIMAL_EDGE_DURATION : INVALID_EDGE_WEIGHT; + EdgeDistance loop_distance = MAXIMAL_EDGE_DISTANCE; for (auto edge : facade.GetAdjacentEdgeRange(node)) { const auto &data = facade.GetEdgeData(edge); @@ -198,11 +199,15 @@ EdgeWeight getLoopWeight(const DataFacade &facade, NodeID node) if (to == node) { const auto value = UseDuration ? data.duration : data.weight; - loop_weight = std::min(loop_weight, value); + if (value < loop_weight) + { + loop_weight = value; + loop_distance = data.distance; + } } } } - return loop_weight; + return std::make_tuple(loop_weight, loop_distance); } /** diff --git a/include/engine/routing_algorithms/routing_base_mld.hpp b/include/engine/routing_algorithms/routing_base_mld.hpp index ce9b23d70a0..c3462039c71 100644 --- a/include/engine/routing_algorithms/routing_base_mld.hpp +++ b/include/engine/routing_algorithms/routing_base_mld.hpp @@ -509,90 +509,6 @@ UnpackedPath search(SearchEngineData &engine_working_data, return std::make_tuple(weight, std::move(unpacked_nodes), std::move(unpacked_edges)); } -// With (s, middle, t) we trace back the paths middle -> s and middle -> t. -// This gives us a packed path (node ids) from the base graph around s and t, -// and overlay node ids otherwise. We then have to unpack the overlay clique -// edges by recursively descending unpacking the path down to the base graph. - -using UnpackedNodes = std::vector; -using UnpackedEdges = std::vector; -using UnpackedPath = std::tuple; - -template -UnpackedPath -unpackPathAndCalculateDistance(SearchEngineData &engine_working_data, - const DataFacade &facade, - typename SearchEngineData::QueryHeap &forward_heap, - typename SearchEngineData::QueryHeap &reverse_heap, - const bool force_loop_forward, - const bool force_loop_reverse, - EdgeWeight weight_upper_bound, - PackedPath packed_path, - NodeID middle, - Args... args) -{ - EdgeWeight weight = weight_upper_bound; - const auto &partition = facade.GetMultiLevelPartition(); - const NodeID source_node = !packed_path.empty() ? std::get<0>(packed_path.front()) : middle; - - // Unpack path - std::vector unpacked_nodes; - std::vector unpacked_edges; - unpacked_nodes.reserve(packed_path.size()); - unpacked_edges.reserve(packed_path.size()); - - unpacked_nodes.push_back(source_node); - - for (auto const &packed_edge : packed_path) - { - NodeID source, target; - bool overlay_edge; - std::tie(source, target, overlay_edge) = packed_edge; - if (!overlay_edge) - { // a base graph edge - unpacked_nodes.push_back(target); - unpacked_edges.push_back(facade.FindEdge(source, target)); - } - else - { // an overlay graph edge - LevelID level = getNodeQueryLevel(partition, source, args...); - CellID parent_cell_id = partition.GetCell(level, source); - BOOST_ASSERT(parent_cell_id == partition.GetCell(level, target)); - - LevelID sublevel = level - 1; - - // Here heaps can be reused, let's go deeper! - forward_heap.Clear(); - reverse_heap.Clear(); - forward_heap.Insert(source, 0, {source}); - reverse_heap.Insert(target, 0, {target}); - - // TODO: when structured bindings will be allowed change to - // auto [subpath_weight, subpath_source, subpath_target, subpath] = ... - EdgeWeight subpath_weight; - std::vector subpath_nodes; - std::vector subpath_edges; - std::tie(subpath_weight, subpath_nodes, subpath_edges) = search(engine_working_data, - facade, - forward_heap, - reverse_heap, - force_loop_forward, - force_loop_reverse, - weight_upper_bound, - sublevel, - parent_cell_id); - BOOST_ASSERT(!subpath_edges.empty()); - BOOST_ASSERT(subpath_nodes.size() > 1); - BOOST_ASSERT(subpath_nodes.front() == source); - BOOST_ASSERT(subpath_nodes.back() == target); - unpacked_nodes.insert( - unpacked_nodes.end(), std::next(subpath_nodes.begin()), subpath_nodes.end()); - unpacked_edges.insert(unpacked_edges.end(), subpath_edges.begin(), subpath_edges.end()); - } - } - return std::make_tuple(weight, std::move(unpacked_nodes), std::move(unpacked_edges)); -} - // Alias to be compatible with the CH-based search template inline void search(SearchEngineData &engine_working_data, diff --git a/include/engine/search_engine_data.hpp b/include/engine/search_engine_data.hpp index db2c5122478..35307616249 100644 --- a/include/engine/search_engine_data.hpp +++ b/include/engine/search_engine_data.hpp @@ -30,7 +30,11 @@ struct HeapData struct ManyToManyHeapData : HeapData { EdgeWeight duration; - ManyToManyHeapData(NodeID p, EdgeWeight duration) : HeapData(p), duration(duration) {} + EdgeDistance distance; + ManyToManyHeapData(NodeID p, EdgeWeight duration, EdgeDistance distance) + : HeapData(p), duration(duration), distance(distance) + { + } }; template <> struct SearchEngineData @@ -75,12 +79,16 @@ struct MultiLayerDijkstraHeapData struct ManyToManyMultiLayerDijkstraHeapData : MultiLayerDijkstraHeapData { EdgeWeight duration; - ManyToManyMultiLayerDijkstraHeapData(NodeID p, EdgeWeight duration) - : MultiLayerDijkstraHeapData(p), duration(duration) + EdgeDistance distance; + ManyToManyMultiLayerDijkstraHeapData(NodeID p, EdgeWeight duration, EdgeDistance distance) + : MultiLayerDijkstraHeapData(p), duration(duration), distance(distance) { } - ManyToManyMultiLayerDijkstraHeapData(NodeID p, bool from, EdgeWeight duration) - : MultiLayerDijkstraHeapData(p, from), duration(duration) + ManyToManyMultiLayerDijkstraHeapData(NodeID p, + bool from, + EdgeWeight duration, + EdgeDistance distance) + : MultiLayerDijkstraHeapData(p, from), duration(duration), distance(distance) { } }; diff --git a/include/extractor/edge_based_edge.hpp b/include/extractor/edge_based_edge.hpp index 1a58fc2b753..28ebf934ac5 100644 --- a/include/extractor/edge_based_edge.hpp +++ b/include/extractor/edge_based_edge.hpp @@ -15,20 +15,25 @@ struct EdgeBasedEdge public: struct EdgeData { - EdgeData() : turn_id(0), weight(0), duration(0), forward(false), backward(false) {} + EdgeData() + : turn_id(0), weight(0), distance(0), duration(0), forward(false), backward(false) + { + } EdgeData(const NodeID turn_id, const EdgeWeight weight, + const EdgeDistance distance, const EdgeWeight duration, const bool forward, const bool backward) - : turn_id(turn_id), weight(weight), duration(duration), forward(forward), - backward(backward) + : turn_id(turn_id), weight(weight), distance(distance), duration(duration), + forward(forward), backward(backward) { } NodeID turn_id; // ID of the edge based node (node based edge) EdgeWeight weight; + EdgeDistance distance; EdgeWeight duration : 30; std::uint32_t forward : 1; std::uint32_t backward : 1; @@ -43,6 +48,7 @@ struct EdgeBasedEdge const NodeID edge_id, const EdgeWeight weight, const EdgeWeight duration, + const EdgeDistance distance, const bool forward, const bool backward); EdgeBasedEdge(const NodeID source, const NodeID target, const EdgeBasedEdge::EdgeData &data); @@ -53,7 +59,7 @@ struct EdgeBasedEdge NodeID target; EdgeData data; }; -static_assert(sizeof(extractor::EdgeBasedEdge) == 20, +static_assert(sizeof(extractor::EdgeBasedEdge) == 24, "Size of extractor::EdgeBasedEdge type is " "bigger than expected. This will influence " "memory consumption."); @@ -67,9 +73,10 @@ inline EdgeBasedEdge::EdgeBasedEdge(const NodeID source, const NodeID turn_id, const EdgeWeight weight, const EdgeWeight duration, + const EdgeDistance distance, const bool forward, const bool backward) - : source(source), target(target), data{turn_id, weight, duration, forward, backward} + : source(source), target(target), data{turn_id, weight, distance, duration, forward, backward} { } diff --git a/include/extractor/edge_based_graph_factory.hpp b/include/extractor/edge_based_graph_factory.hpp index d8e8aeedc88..388e0d75e71 100644 --- a/include/extractor/edge_based_graph_factory.hpp +++ b/include/extractor/edge_based_graph_factory.hpp @@ -92,6 +92,7 @@ class EdgeBasedGraphFactory void GetStartPointMarkers(std::vector &node_is_startpoint); void GetEdgeBasedNodeWeights(std::vector &output_node_weights); void GetEdgeBasedNodeDurations(std::vector &output_node_durations); + void GetEdgeBasedNodeDistances(std::vector &output_node_distances); std::uint32_t GetConnectivityChecksum() const; std::uint64_t GetNumberOfEdgeBasedNodes() const; @@ -119,6 +120,7 @@ class EdgeBasedGraphFactory //! edge-based node std::vector m_edge_based_node_weights; std::vector m_edge_based_node_durations; + std::vector m_edge_based_node_distances; //! list of edge based nodes (compressed segments) std::vector m_edge_based_node_segments; diff --git a/include/extractor/extractor.hpp b/include/extractor/extractor.hpp index 31b1576586b..db571475b90 100644 --- a/include/extractor/extractor.hpp +++ b/include/extractor/extractor.hpp @@ -88,6 +88,7 @@ class Extractor std::vector &node_is_startpoint, std::vector &edge_based_node_weights, std::vector &edge_based_node_durations, + std::vector &edge_based_node_distances, util::DeallocatingVector &edge_based_edge_list, std::uint32_t &connectivity_checksum); diff --git a/include/extractor/files.hpp b/include/extractor/files.hpp index 91f98825af8..0807e5c5651 100644 --- a/include/extractor/files.hpp +++ b/include/extractor/files.hpp @@ -453,8 +453,8 @@ void writeNames(const boost::filesystem::path &path, const NameTableT &table) serialization::write(writer, "/common/names", table); } -template -void readEdgeBasedNodeWeights(const boost::filesystem::path &path, NodeWeigtsVectorT &weights) +template +void readEdgeBasedNodeWeights(const boost::filesystem::path &path, NodeWeightsVectorT &weights) { const auto fingerprint = storage::tar::FileReader::VerifyFingerprint; storage::tar::FileReader reader{path, fingerprint}; @@ -462,9 +462,33 @@ void readEdgeBasedNodeWeights(const boost::filesystem::path &path, NodeWeigtsVec storage::serialization::read(reader, "/extractor/edge_based_node_weights", weights); } -template +template +void readEdgeBasedNodeDistances(const boost::filesystem::path &path, + NodeDistancesVectorT &distances) +{ + const auto fingerprint = storage::tar::FileReader::VerifyFingerprint; + storage::tar::FileReader reader{path, fingerprint}; + + storage::serialization::read(reader, "/extractor/edge_based_node_distances", distances); +} + +template +void writeEdgeBasedNodeWeightsDurationsDistances(const boost::filesystem::path &path, + const NodeWeightsVectorT &weights, + const NodeDurationsVectorT &durations, + const NodeDistancesVectorT &distances) +{ + const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint; + storage::tar::FileWriter writer{path, fingerprint}; + + storage::serialization::write(writer, "/extractor/edge_based_node_weights", weights); + storage::serialization::write(writer, "/extractor/edge_based_node_durations", durations); + storage::serialization::write(writer, "/extractor/edge_based_node_distances", distances); +} + +template void readEdgeBasedNodeWeightsDurations(const boost::filesystem::path &path, - NodeWeigtsVectorT &weights, + NodeWeightsVectorT &weights, NodeDurationsVectorT &durations) { const auto fingerprint = storage::tar::FileReader::VerifyFingerprint; @@ -474,9 +498,9 @@ void readEdgeBasedNodeWeightsDurations(const boost::filesystem::path &path, storage::serialization::read(reader, "/extractor/edge_based_node_durations", durations); } -template +template void writeEdgeBasedNodeWeightsDurations(const boost::filesystem::path &path, - const NodeWeigtsVectorT &weights, + const NodeWeightsVectorT &weights, const NodeDurationsVectorT &durations) { const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint; diff --git a/include/extractor/internal_extractor_edge.hpp b/include/extractor/internal_extractor_edge.hpp index ef296b4f99f..7ba4a9bf22f 100644 --- a/include/extractor/internal_extractor_edge.hpp +++ b/include/extractor/internal_extractor_edge.hpp @@ -63,7 +63,7 @@ struct InternalExtractorEdge WeightData weight_data, DurationData duration_data, util::Coordinate source_coordinate) - : result(source, target, 0, 0, {}, -1, {}), weight_data(std::move(weight_data)), + : result(source, target, 0, 0, 0, {}, -1, {}), weight_data(std::move(weight_data)), duration_data(std::move(duration_data)), source_coordinate(std::move(source_coordinate)) { } diff --git a/include/extractor/node_based_edge.hpp b/include/extractor/node_based_edge.hpp index 6ac0d0343e1..5abcd08d355 100644 --- a/include/extractor/node_based_edge.hpp +++ b/include/extractor/node_based_edge.hpp @@ -97,6 +97,7 @@ struct NodeBasedEdge NodeID target, EdgeWeight weight, EdgeDuration duration, + EdgeDistance distance, GeometryID geometry_id, AnnotationID annotation_data, NodeBasedEdgeClassification flags); @@ -107,6 +108,7 @@ struct NodeBasedEdge NodeID target; // 32 4 EdgeWeight weight; // 32 4 EdgeDuration duration; // 32 4 + EdgeDistance distance; // 32 4 GeometryID geometry_id; // 32 4 AnnotationID annotation_data; // 32 4 NodeBasedEdgeClassification flags; // 32 4 @@ -120,6 +122,7 @@ struct NodeBasedEdgeWithOSM : NodeBasedEdge OSMNodeID target, EdgeWeight weight, EdgeDuration duration, + EdgeDistance distance, GeometryID geometry_id, AnnotationID annotation_data, NodeBasedEdgeClassification flags); @@ -137,7 +140,8 @@ inline NodeBasedEdgeClassification::NodeBasedEdgeClassification() } inline NodeBasedEdge::NodeBasedEdge() - : source(SPECIAL_NODEID), target(SPECIAL_NODEID), weight(0), duration(0), annotation_data(-1) + : source(SPECIAL_NODEID), target(SPECIAL_NODEID), weight(0), duration(0), distance(0), + annotation_data(-1) { } @@ -145,11 +149,12 @@ inline NodeBasedEdge::NodeBasedEdge(NodeID source, NodeID target, EdgeWeight weight, EdgeDuration duration, + EdgeDistance distance, GeometryID geometry_id, AnnotationID annotation_data, NodeBasedEdgeClassification flags) - : source(source), target(target), weight(weight), duration(duration), geometry_id(geometry_id), - annotation_data(annotation_data), flags(flags) + : source(source), target(target), weight(weight), duration(duration), distance(distance), + geometry_id(geometry_id), annotation_data(annotation_data), flags(flags) { } @@ -175,11 +180,18 @@ inline NodeBasedEdgeWithOSM::NodeBasedEdgeWithOSM(OSMNodeID source, OSMNodeID target, EdgeWeight weight, EdgeDuration duration, + EdgeDistance distance, GeometryID geometry_id, AnnotationID annotation_data, NodeBasedEdgeClassification flags) - : NodeBasedEdge( - SPECIAL_NODEID, SPECIAL_NODEID, weight, duration, geometry_id, annotation_data, flags), + : NodeBasedEdge(SPECIAL_NODEID, + SPECIAL_NODEID, + weight, + duration, + distance, + geometry_id, + annotation_data, + flags), osm_source_id(std::move(source)), osm_target_id(std::move(target)) { } @@ -189,7 +201,7 @@ inline NodeBasedEdgeWithOSM::NodeBasedEdgeWithOSM() { } -static_assert(sizeof(extractor::NodeBasedEdge) == 28, +static_assert(sizeof(extractor::NodeBasedEdge) == 32, "Size of extractor::NodeBasedEdge type is " "bigger than expected. This will influence " "memory consumption."); diff --git a/include/nodejs/node_osrm_support.hpp b/include/nodejs/node_osrm_support.hpp index 4a93eb7a74c..4ff69757660 100644 --- a/include/nodejs/node_osrm_support.hpp +++ b/include/nodejs/node_osrm_support.hpp @@ -142,6 +142,10 @@ inline engine_config_ptr argumentsToEngineConfig(const Nan::FunctionCallbackInfo if (shared_memory.IsEmpty()) return engine_config_ptr(); + auto mmap_memory = params->Get(Nan::New("mmap_memory").ToLocalChecked()); + if (mmap_memory.IsEmpty()) + return engine_config_ptr(); + if (!memory_file->IsUndefined()) { if (path->IsUndefined()) @@ -190,6 +194,18 @@ inline engine_config_ptr argumentsToEngineConfig(const Nan::FunctionCallbackInfo return engine_config_ptr(); } } + if (!mmap_memory->IsUndefined()) + { + if (mmap_memory->IsBoolean()) + { + engine_config->use_mmap = Nan::To(mmap_memory).FromJust(); + } + else + { + Nan::ThrowError("mmap_memory option must be a boolean"); + return engine_config_ptr(); + } + } if (path->IsUndefined() && !engine_config->use_shared_memory) { @@ -1167,6 +1183,70 @@ argumentsToTableParameter(const Nan::FunctionCallbackInfo &args, } } + if (obj->Has(Nan::New("fallback_speed").ToLocalChecked())) + { + auto fallback_speed = obj->Get(Nan::New("fallback_speed").ToLocalChecked()); + + if (!fallback_speed->IsNumber()) + { + Nan::ThrowError("fallback_speed must be a number"); + return table_parameters_ptr(); + } + else if (fallback_speed->NumberValue() <= 0) + { + Nan::ThrowError("fallback_speed must be > 0"); + return table_parameters_ptr(); + } + + params->fallback_speed = static_cast(fallback_speed->NumberValue()); + } + + if (obj->Has(Nan::New("fallback_coordinate").ToLocalChecked())) + { + auto fallback_coordinate = obj->Get(Nan::New("fallback_coordinate").ToLocalChecked()); + + if (!fallback_coordinate->IsString()) + { + Nan::ThrowError("fallback_coordinate must be a string: [input, snapped]"); + return table_parameters_ptr(); + } + + std::string fallback_coordinate_str = *v8::String::Utf8Value(fallback_coordinate); + + if (fallback_coordinate_str == "snapped") + { + params->fallback_coordinate_type = + osrm::TableParameters::FallbackCoordinateType::Snapped; + } + else if (fallback_coordinate_str == "input") + { + params->fallback_coordinate_type = osrm::TableParameters::FallbackCoordinateType::Input; + } + else + { + Nan::ThrowError("'fallback_coordinate' param must be one of [input, snapped]"); + return table_parameters_ptr(); + } + } + + if (obj->Has(Nan::New("scale_factor").ToLocalChecked())) + { + auto scale_factor = obj->Get(Nan::New("scale_factor").ToLocalChecked()); + + if (!scale_factor->IsNumber()) + { + Nan::ThrowError("scale_factor must be a number"); + return table_parameters_ptr(); + } + else if (scale_factor->NumberValue() <= 0) + { + Nan::ThrowError("scale_factor must be > 0"); + return table_parameters_ptr(); + } + + params->scale_factor = static_cast(scale_factor->NumberValue()); + } + return params; } diff --git a/include/partitioner/cell_storage.hpp b/include/partitioner/cell_storage.hpp index b3ad7d7bcfd..b2839331966 100644 --- a/include/partitioner/cell_storage.hpp +++ b/include/partitioner/cell_storage.hpp @@ -75,28 +75,35 @@ template class CellStorageImpl // Implementation of the cell view. We need a template parameter here // because we need to derive a read-only and read-write view from this. - template class CellImpl + template + class CellImpl { private: using WeightPtrT = WeightValueT *; using DurationPtrT = DurationValueT *; + using DistancePtrT = DistanceValueT *; BoundarySize num_source_nodes; BoundarySize num_destination_nodes; WeightPtrT const weights; DurationPtrT const durations; + DistancePtrT const distances; const NodeID *const source_boundary; const NodeID *const destination_boundary; using RowIterator = WeightPtrT; // Possibly replace with // http://www.boost.org/doc/libs/1_55_0/libs/range/doc/html/range/reference/adaptors/reference/strided.html - class ColumnIterator : public boost::iterator_facade + class ColumnIterator : public boost::iterator_facade, + decltype(*std::declval()), boost::random_access_traversal_tag> { - typedef boost::iterator_facade()); + typedef boost::iterator_facade, + ValueT, boost::random_access_traversal_tag> base_t; @@ -108,7 +115,7 @@ template class CellStorageImpl explicit ColumnIterator() : current(nullptr), stride(1) {} - explicit ColumnIterator(WeightPtrT begin, std::size_t row_length) + explicit ColumnIterator(ValuePtrT begin, std::size_t row_length) : current(begin), stride(row_length) { BOOST_ASSERT(begin != nullptr); @@ -126,7 +133,7 @@ template class CellStorageImpl } friend class ::boost::iterator_core_access; - WeightPtrT current; + ValuePtrT current; const std::size_t stride; }; @@ -147,12 +154,13 @@ template class CellStorageImpl auto iter = std::find(destination_boundary, destination_boundary + num_destination_nodes, node); if (iter == destination_boundary + num_destination_nodes) - return boost::make_iterator_range(ColumnIterator{}, ColumnIterator{}); + return boost::make_iterator_range(ColumnIterator{}, + ColumnIterator{}); auto column = std::distance(destination_boundary, iter); - auto begin = ColumnIterator{ptr + column, num_destination_nodes}; - auto end = ColumnIterator{ptr + column + num_source_nodes * num_destination_nodes, - num_destination_nodes}; + auto begin = ColumnIterator{ptr + column, num_destination_nodes}; + auto end = ColumnIterator{ + ptr + column + num_source_nodes * num_destination_nodes, num_destination_nodes}; return boost::make_iterator_range(begin, end); } @@ -165,6 +173,10 @@ template class CellStorageImpl auto GetInDuration(NodeID node) const { return GetInRange(durations, node); } + auto GetInDistance(NodeID node) const { return GetInRange(distances, node); } + + auto GetOutDistance(NodeID node) const { return GetOutRange(distances, node); } + auto GetSourceNodes() const { return boost::make_iterator_range(source_boundary, source_boundary + num_source_nodes); @@ -179,17 +191,20 @@ template class CellStorageImpl CellImpl(const CellData &data, WeightPtrT const all_weights, DurationPtrT const all_durations, + DistancePtrT const all_distances, const NodeID *const all_sources, const NodeID *const all_destinations) : num_source_nodes{data.num_source_nodes}, num_destination_nodes{data.num_destination_nodes}, weights{all_weights + data.value_offset}, durations{all_durations + data.value_offset}, + distances{all_distances + data.value_offset}, source_boundary{all_sources + data.source_boundary_offset}, destination_boundary{all_destinations + data.destination_boundary_offset} { BOOST_ASSERT(all_weights != nullptr); BOOST_ASSERT(all_durations != nullptr); + BOOST_ASSERT(all_distances != nullptr); BOOST_ASSERT(num_source_nodes == 0 || all_sources != nullptr); BOOST_ASSERT(num_destination_nodes == 0 || all_destinations != nullptr); } @@ -201,7 +216,8 @@ template class CellStorageImpl const NodeID *const all_destinations) : num_source_nodes{data.num_source_nodes}, num_destination_nodes{data.num_destination_nodes}, weights{nullptr}, - durations{nullptr}, source_boundary{all_sources + data.source_boundary_offset}, + durations{nullptr}, distances{nullptr}, + source_boundary{all_sources + data.source_boundary_offset}, destination_boundary{all_destinations + data.destination_boundary_offset} { BOOST_ASSERT(num_source_nodes == 0 || all_sources != nullptr); @@ -212,8 +228,8 @@ template class CellStorageImpl std::size_t LevelIDToIndex(LevelID level) const { return level - 1; } public: - using Cell = CellImpl; - using ConstCell = CellImpl; + using Cell = CellImpl; + using ConstCell = CellImpl; CellStorageImpl() {} @@ -361,6 +377,7 @@ template class CellStorageImpl metric.weights.resize(total_size + 1, INVALID_EDGE_WEIGHT); metric.durations.resize(total_size + 1, MAXIMAL_EDGE_DURATION); + metric.distances.resize(total_size + 1, INVALID_EDGE_DISTANCE); return metric; } @@ -388,6 +405,7 @@ template class CellStorageImpl return ConstCell{cells[cell_index], metric.weights.data(), metric.durations.data(), + metric.distances.data(), source_boundary.empty() ? nullptr : source_boundary.data(), destination_boundary.empty() ? nullptr : destination_boundary.data()}; } @@ -415,6 +433,7 @@ template class CellStorageImpl return Cell{cells[cell_index], metric.weights.data(), metric.durations.data(), + metric.distances.data(), source_boundary.data(), destination_boundary.data()}; } diff --git a/include/partitioner/edge_based_graph_reader.hpp b/include/partitioner/edge_based_graph_reader.hpp index 9480112d0e4..bc5ba8b9620 100644 --- a/include/partitioner/edge_based_graph_reader.hpp +++ b/include/partitioner/edge_based_graph_reader.hpp @@ -43,6 +43,7 @@ splitBidirectionalEdges(const std::vector &edges) edge.data.turn_id, std::max(edge.data.weight, 1), edge.data.duration, + edge.data.distance, edge.data.forward, edge.data.backward); @@ -51,6 +52,7 @@ splitBidirectionalEdges(const std::vector &edges) edge.data.turn_id, std::max(edge.data.weight, 1), edge.data.duration, + edge.data.distance, edge.data.backward, edge.data.forward); } diff --git a/include/server/api/base_parameters_grammar.hpp b/include/server/api/base_parameters_grammar.hpp index f5b59e91b98..eec78c9f53f 100644 --- a/include/server/api/base_parameters_grammar.hpp +++ b/include/server/api/base_parameters_grammar.hpp @@ -180,6 +180,8 @@ struct BaseParametersGrammar : boost::spirit::qi::grammar qi::rule base_rule; qi::rule query_rule; + qi::real_parser double_; + private: qi::rule bearings_rule; qi::rule radiuses_rule; @@ -197,7 +199,6 @@ struct BaseParametersGrammar : boost::spirit::qi::grammar qi::rule base64_char; qi::rule polyline_chars; qi::rule unlimited_rule; - qi::real_parser double_; qi::symbols approach_type; }; diff --git a/include/server/api/table_parameter_grammar.hpp b/include/server/api/table_parameter_grammar.hpp index 5be79364501..dc1a073f97a 100644 --- a/include/server/api/table_parameter_grammar.hpp +++ b/include/server/api/table_parameter_grammar.hpp @@ -48,10 +48,28 @@ struct TableParametersGrammar : public BaseParametersGrammar - -('?' > (table_rule(qi::_r1) | base_rule(qi::_r1)) % '&'); + -('?' > (table_rule(qi::_r1) | base_rule(qi::_r1) | scale_factor_rule(qi::_r1) | + fallback_speed_rule(qi::_r1) | + (qi::lit("fallback_coordinate=") > + fallback_coordinate_type + [ph::bind(&engine::api::TableParameters::fallback_coordinate_type, + qi::_r1) = qi::_1])) % + '&'); } TableParametersGrammar(qi::rule &root_rule_) : BaseGrammar(root_rule_) @@ -73,13 +91,20 @@ struct TableParametersGrammar : public BaseParametersGrammar base_rule; private: + using json_policy = no_trailing_dot_policy; + qi::rule root_rule; qi::rule table_rule; qi::rule sources_rule; qi::rule destinations_rule; + qi::rule fallback_speed_rule; + qi::rule scale_factor_rule; qi::rule size_t_; qi::symbols annotations; qi::rule annotations_list; + qi::symbols + fallback_coordinate_type; + qi::real_parser double_; }; } } diff --git a/include/storage/block.hpp b/include/storage/block.hpp index 47478e5eb18..60271f4eaa0 100644 --- a/include/storage/block.hpp +++ b/include/storage/block.hpp @@ -16,10 +16,15 @@ struct Block { std::uint64_t num_entries; std::uint64_t byte_size; + std::uint64_t offset; - Block() : num_entries(0), byte_size(0) {} + Block() : num_entries(0), byte_size(0), offset(0) {} + Block(std::uint64_t num_entries, std::uint64_t byte_size, std::uint64_t offset) + : num_entries(num_entries), byte_size(byte_size), offset(offset) + { + } Block(std::uint64_t num_entries, std::uint64_t byte_size) - : num_entries(num_entries), byte_size(byte_size) + : num_entries(num_entries), byte_size(byte_size), offset(0) { } }; @@ -29,7 +34,7 @@ using NamedBlock = std::tuple; template Block make_block(uint64_t num_entries) { static_assert(sizeof(T) % alignof(T) == 0, "aligned T* can't be used as an array pointer"); - return Block{num_entries, sizeof(T) * num_entries}; + return Block{num_entries, sizeof(T) * num_entries, 0}; } } } diff --git a/include/storage/serialization.hpp b/include/storage/serialization.hpp index 92ee9600c0d..97cba94efe4 100644 --- a/include/storage/serialization.hpp +++ b/include/storage/serialization.hpp @@ -9,6 +9,7 @@ #include "storage/shared_datatype.hpp" #include "storage/tar.hpp" +#include #include #include @@ -30,22 +31,37 @@ namespace serialization namespace detail { template -inline BlockT packBits(const T &data, std::size_t index, std::size_t count) +inline BlockT packBits(const T &data, std::size_t base_index, const std::size_t count) { static_assert(std::is_same::value, "value_type is not bool"); + static_assert(std::is_unsigned::value, "BlockT must be unsigned type"); + static_assert(std::is_integral::value, "BlockT must be an integral type"); + static_assert(CHAR_BIT == 8, "Non-8-bit bytes not supported, sorry!"); + BOOST_ASSERT(sizeof(BlockT) * CHAR_BIT >= count); + + // Note: if this packing is changed, be sure to update vector_view + // as well, so that on-disk and in-memory layouts match. BlockT value = 0; - for (std::size_t bit = 0; bit < count; ++bit, ++index) - value = (value << 1) | data[index]; + for (std::size_t bit = 0; bit < count; ++bit) + { + value |= (data[base_index + bit] ? BlockT{1} : BlockT{0}) << bit; + } return value; } template -inline void unpackBits(T &data, std::size_t index, std::size_t count, BlockT value) +inline void +unpackBits(T &data, const std::size_t base_index, const std::size_t count, const BlockT value) { static_assert(std::is_same::value, "value_type is not bool"); - const BlockT mask = BlockT{1} << (count - 1); - for (std::size_t bit = 0; bit < count; value <<= 1, ++bit, ++index) - data[index] = value & mask; + static_assert(std::is_unsigned::value, "BlockT must be unsigned type"); + static_assert(std::is_integral::value, "BlockT must be an integral type"); + static_assert(CHAR_BIT == 8, "Non-8-bit bytes not supported, sorry!"); + BOOST_ASSERT(sizeof(BlockT) * CHAR_BIT >= count); + for (std::size_t bit = 0; bit < count; ++bit) + { + data[base_index + bit] = value & (BlockT{1} << bit); + } } template @@ -55,15 +71,16 @@ void readBoolVector(tar::FileReader &reader, const std::string &name, VectorT &d data.resize(count); std::uint64_t index = 0; - constexpr std::uint64_t WORD_BITS = CHAR_BIT * sizeof(std::uint64_t); + using BlockType = std::uint64_t; + constexpr std::uint64_t BLOCK_BITS = CHAR_BIT * sizeof(BlockType); - const auto decode = [&](const std::uint64_t block) { - auto read_size = std::min(count - index, WORD_BITS); - unpackBits(data, index, read_size, block); - index += WORD_BITS; + const auto decode = [&](const BlockType block) { + auto read_size = std::min(count - index, BLOCK_BITS); + unpackBits(data, index, read_size, block); + index += BLOCK_BITS; }; - reader.ReadStreaming(name, boost::make_function_output_iterator(decode)); + reader.ReadStreaming(name, boost::make_function_output_iterator(decode)); } template @@ -73,19 +90,20 @@ void writeBoolVector(tar::FileWriter &writer, const std::string &name, const Vec writer.WriteElementCount64(name, count); std::uint64_t index = 0; - constexpr std::uint64_t WORD_BITS = CHAR_BIT * sizeof(std::uint64_t); + using BlockType = std::uint64_t; + constexpr std::uint64_t BLOCK_BITS = CHAR_BIT * sizeof(BlockType); // FIXME on old boost version the function_input_iterator does not work with lambdas // so we need to wrap it in a function here. - const std::function encode_function = [&]() -> std::uint64_t { - auto write_size = std::min(count - index, WORD_BITS); - auto packed = packBits(data, index, write_size); - index += WORD_BITS; + const std::function encode_function = [&]() -> BlockType { + auto write_size = std::min(count - index, BLOCK_BITS); + auto packed = packBits(data, index, write_size); + index += BLOCK_BITS; return packed; }; - std::uint64_t number_of_blocks = (count + WORD_BITS - 1) / WORD_BITS; - writer.WriteStreaming( + std::uint64_t number_of_blocks = (count + BLOCK_BITS - 1) / BLOCK_BITS; + writer.WriteStreaming( name, boost::make_function_input_iterator(encode_function, boost::infinite()), number_of_blocks); @@ -266,9 +284,9 @@ template void write(io::BufferWriter &writer, const std } } -inline void read(io::BufferReader &reader, DataLayout &layout) { read(reader, layout.blocks); } +inline void read(io::BufferReader &reader, BaseDataLayout &layout) { read(reader, layout.blocks); } -inline void write(io::BufferWriter &writer, const DataLayout &layout) +inline void write(io::BufferWriter &writer, const BaseDataLayout &layout) { write(writer, layout.blocks); } diff --git a/include/storage/shared_data_index.hpp b/include/storage/shared_data_index.hpp index 94f78182ac7..9041bc100b4 100644 --- a/include/storage/shared_data_index.hpp +++ b/include/storage/shared_data_index.hpp @@ -5,6 +5,7 @@ #include +#include #include namespace osrm @@ -19,8 +20,8 @@ class SharedDataIndex public: struct AllocatedRegion { - char *memory_ptr; - DataLayout layout; + void *memory_ptr; + std::unique_ptr layout; }; SharedDataIndex() = default; @@ -29,10 +30,10 @@ class SharedDataIndex // Build mapping from block name to region for (auto index : util::irange(0, regions.size())) { - regions[index].layout.List("", - boost::make_function_output_iterator([&](const auto &name) { - block_to_region[name] = index; - })); + regions[index].layout->List("", + boost::make_function_output_iterator([&](const auto &name) { + block_to_region[name] = index; + })); } } @@ -40,32 +41,44 @@ class SharedDataIndex { for (const auto ®ion : regions) { - region.layout.List(name_prefix, out); + region.layout->List(name_prefix, out); } } template auto GetBlockPtr(const std::string &name) const { +#if !defined(__GNUC__) || (__GNUC__ > 4) + // is_tivially_copyable only exists in GCC >=5 + static_assert(std::is_trivially_copyable::value, + "Block-based data must be a trivially copyable type"); + static_assert(sizeof(T) % alignof(T) == 0, "aligned T* can't be used as an array pointer"); +#endif const auto ®ion = GetBlockRegion(name); - return region.layout.GetBlockPtr(region.memory_ptr, name); + return reinterpret_cast(region.layout->GetBlockPtr(region.memory_ptr, name)); } template auto GetBlockPtr(const std::string &name) { +#if !defined(__GNUC__) || (__GNUC__ > 4) + // is_tivially_copyable only exists in GCC >=5 + static_assert(std::is_trivially_copyable::value, + "Block-based data must be a trivially copyable type"); + static_assert(sizeof(T) % alignof(T) == 0, "aligned T* can't be used as an array pointer"); +#endif const auto ®ion = GetBlockRegion(name); - return region.layout.GetBlockPtr(region.memory_ptr, name); + return reinterpret_cast(region.layout->GetBlockPtr(region.memory_ptr, name)); } std::size_t GetBlockEntries(const std::string &name) const { const auto ®ion = GetBlockRegion(name); - return region.layout.GetBlockEntries(name); + return region.layout->GetBlockEntries(name); } std::size_t GetBlockSize(const std::string &name) const { const auto ®ion = GetBlockRegion(name); - return region.layout.GetBlockSize(name); + return region.layout->GetBlockSize(name); } private: diff --git a/include/storage/shared_datatype.hpp b/include/storage/shared_datatype.hpp index 926ca1deddf..65addcffce1 100644 --- a/include/storage/shared_datatype.hpp +++ b/include/storage/shared_datatype.hpp @@ -20,12 +20,12 @@ namespace osrm namespace storage { -class DataLayout; +class BaseDataLayout; namespace serialization { -inline void read(io::BufferReader &reader, DataLayout &layout); +inline void read(io::BufferReader &reader, BaseDataLayout &layout); -inline void write(io::BufferWriter &writer, const DataLayout &layout); +inline void write(io::BufferWriter &writer, const BaseDataLayout &layout); } // namespace serialization namespace detail @@ -54,42 +54,26 @@ inline std::string trimName(const std::string &name_prefix, const std::string &n } } // namespace detail -class DataLayout +class BaseDataLayout { public: - DataLayout() : blocks{} {} + virtual ~BaseDataLayout() = default; inline void SetBlock(const std::string &name, Block block) { blocks[name] = std::move(block); } - inline uint64_t GetBlockEntries(const std::string &name) const + inline std::uint64_t GetBlockEntries(const std::string &name) const { return GetBlock(name).num_entries; } - inline uint64_t GetBlockSize(const std::string &name) const { return GetBlock(name).byte_size; } - - inline bool HasBlock(const std::string &name) const + inline std::uint64_t GetBlockSize(const std::string &name) const { - return blocks.find(name) != blocks.end(); + return GetBlock(name).byte_size; } - inline uint64_t GetSizeOfLayout() const - { - uint64_t result = 0; - for (const auto &name_and_block : blocks) - { - result += GetBlockSize(name_and_block.first) + BLOCK_ALIGNMENT; - } - return result; - } - - template inline T *GetBlockPtr(char *shared_memory, const std::string &name) const + inline bool HasBlock(const std::string &name) const { - static_assert(BLOCK_ALIGNMENT % std::alignment_of::value == 0, - "Datatype does not fit alignment constraints."); - - char *ptr = (char *)GetAlignedBlockPtr(shared_memory, name); - return (T *)ptr; + return blocks.find(name) != blocks.end(); } // Depending on the name prefix this function either lists all blocks with the same prefix @@ -115,10 +99,10 @@ class DataLayout } } - private: - friend void serialization::read(io::BufferReader &reader, DataLayout &layout); - friend void serialization::write(io::BufferWriter &writer, const DataLayout &layout); + virtual inline void *GetBlockPtr(void *base_ptr, const std::string &name) const = 0; + virtual inline std::uint64_t GetSizeOfLayout() const = 0; + protected: const Block &GetBlock(const std::string &name) const { auto iter = blocks.find(name); @@ -130,10 +114,42 @@ class DataLayout return iter->second; } + friend void serialization::read(io::BufferReader &reader, BaseDataLayout &layout); + friend void serialization::write(io::BufferWriter &writer, const BaseDataLayout &layout); + + std::map blocks; +}; + +class ContiguousDataLayout final : public BaseDataLayout +{ + public: + inline std::uint64_t GetSizeOfLayout() const override final + { + std::uint64_t result = 0; + for (const auto &name_and_block : blocks) + { + result += GetBlockSize(name_and_block.first) + BLOCK_ALIGNMENT; + } + return result; + } + + inline void *GetBlockPtr(void *base_ptr, const std::string &name) const override final + { + // TODO: re-enable this alignment checking somehow + // static_assert(BLOCK_ALIGNMENT % std::alignment_of::value == 0, + // "Datatype does not fit alignment constraints."); + + return GetAlignedBlockPtr(base_ptr, name); + } + + private: + friend void serialization::read(io::BufferReader &reader, BaseDataLayout &layout); + friend void serialization::write(io::BufferWriter &writer, const BaseDataLayout &layout); + // Fit aligned storage in buffer to 64 bytes to conform with AVX 512 types inline void *align(void *&ptr) const noexcept { - const auto intptr = reinterpret_cast(ptr); + const auto intptr = reinterpret_cast(ptr); const auto aligned = (intptr - 1u + BLOCK_ALIGNMENT) & -BLOCK_ALIGNMENT; return ptr = reinterpret_cast(aligned); } @@ -157,7 +173,27 @@ class DataLayout } static constexpr std::size_t BLOCK_ALIGNMENT = 64; - std::map blocks; +}; + +class TarDataLayout final : public BaseDataLayout +{ + public: + inline std::uint64_t GetSizeOfLayout() const override final + { + std::uint64_t result = 0; + for (const auto &name_and_block : blocks) + { + result += GetBlockSize(name_and_block.first); + } + return result; + } + + inline void *GetBlockPtr(void *base_ptr, const std::string &name) const override final + { + auto offset = GetBlock(name).offset; + const auto offset_address = reinterpret_cast(base_ptr) + offset; + return reinterpret_cast(offset_address); + } }; struct SharedRegion diff --git a/include/storage/storage.hpp b/include/storage/storage.hpp index 2c8ae02bc61..b03669db05f 100644 --- a/include/storage/storage.hpp +++ b/include/storage/storage.hpp @@ -35,22 +35,28 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +#include namespace osrm { namespace storage { + +void populateLayoutFromFile(const boost::filesystem::path &path, storage::BaseDataLayout &layout); + class Storage { public: Storage(StorageConfig config); int Run(int max_wait, const std::string &name, bool only_metric); - - void PopulateStaticLayout(DataLayout &layout); - void PopulateUpdatableLayout(DataLayout &layout); void PopulateStaticData(const SharedDataIndex &index); void PopulateUpdatableData(const SharedDataIndex &index); + void PopulateLayout(storage::BaseDataLayout &layout, + const std::vector> &files); + std::string PopulateLayoutWithRTree(storage::BaseDataLayout &layout); + std::vector> GetUpdatableFiles(); + std::vector> GetStaticFiles(); private: StorageConfig config; diff --git a/include/storage/view_factory.hpp b/include/storage/view_factory.hpp index f6c8e213739..b04e3026ec2 100644 --- a/include/storage/view_factory.hpp +++ b/include/storage/view_factory.hpp @@ -294,11 +294,14 @@ inline auto make_filtered_cell_metric_view(const SharedDataIndex &index, auto prefix = name + "/exclude/" + std::to_string(exclude_index); auto weights_block_id = prefix + "/weights"; auto durations_block_id = prefix + "/durations"; + auto distances_block_id = prefix + "/distances"; auto weights = make_vector_view(index, weights_block_id); auto durations = make_vector_view(index, durations_block_id); + auto distances = make_vector_view(index, distances_block_id); - return customizer::CellMetricView{std::move(weights), std::move(durations)}; + return customizer::CellMetricView{ + std::move(weights), std::move(durations), std::move(distances)}; } inline auto make_cell_metric_view(const SharedDataIndex &index, const std::string &name) @@ -311,12 +314,14 @@ inline auto make_cell_metric_view(const SharedDataIndex &index, const std::strin { auto weights_block_id = prefix + "/weights"; auto durations_block_id = prefix + "/durations"; + auto distances_block_id = prefix + "/distances"; auto weights = make_vector_view(index, weights_block_id); auto durations = make_vector_view(index, durations_block_id); + auto distances = make_vector_view(index, distances_block_id); - cell_metric_excludes.push_back( - customizer::CellMetricView{std::move(weights), std::move(durations)}); + cell_metric_excludes.push_back(customizer::CellMetricView{ + std::move(weights), std::move(durations), std::move(distances)}); } return cell_metric_excludes; @@ -332,6 +337,7 @@ inline auto make_multi_level_graph_view(const SharedDataIndex &index, const std: index, name + "/node_to_edge_offset"); auto node_weights = make_vector_view(index, name + "/node_weights"); auto node_durations = make_vector_view(index, name + "/node_durations"); + auto node_distances = make_vector_view(index, name + "/node_distances"); auto is_forward_edge = make_vector_view(index, name + "/is_forward_edge"); auto is_backward_edge = make_vector_view(index, name + "/is_backward_edge"); @@ -340,6 +346,7 @@ inline auto make_multi_level_graph_view(const SharedDataIndex &index, const std: std::move(node_to_offset), std::move(node_weights), std::move(node_durations), + std::move(node_distances), std::move(is_forward_edge), std::move(is_backward_edge)); } diff --git a/include/updater/updater.hpp b/include/updater/updater.hpp index dcaf5f638a8..565b293cb6c 100644 --- a/include/updater/updater.hpp +++ b/include/updater/updater.hpp @@ -22,11 +22,17 @@ class Updater std::vector &node_weights, std::uint32_t &connectivity_checksum) const; - EdgeID - LoadAndUpdateEdgeExpandedGraph(std::vector &edge_based_edge_list, - std::vector &node_weights, - std::vector &node_durations, // TODO: to be deleted - std::uint32_t &connectivity_checksum) const; + EdgeID LoadAndUpdateEdgeExpandedGraph( + std::vector &edge_based_edge_list, + std::vector &node_weights, + std::vector &node_durations, // TODO: remove when optional + std::uint32_t &connectivity_checksum) const; + EdgeID LoadAndUpdateEdgeExpandedGraph( + std::vector &edge_based_edge_list, + std::vector &node_weights, + std::vector &node_durations, // TODO: remove when optional + std::vector &node_distances, // TODO: remove when optional + std::uint32_t &connectivity_checksum) const; private: UpdaterConfig config; diff --git a/include/util/debug.hpp b/include/util/debug.hpp index 9c6582dad2b..001e31e8262 100644 --- a/include/util/debug.hpp +++ b/include/util/debug.hpp @@ -1,9 +1,11 @@ #ifndef OSRM_UTIL_DEBUG_HPP_ #define OSRM_UTIL_DEBUG_HPP_ +#include "extractor/edge_based_edge.hpp" #include "extractor/node_data_container.hpp" #include "extractor/query_node.hpp" #include "guidance/intersection.hpp" +#include "guidance/turn_instruction.hpp" #include "guidance/turn_lane_data.hpp" #include "engine/guidance/route_step.hpp" #include "util/node_based_graph.hpp" @@ -186,6 +188,23 @@ inline std::ostream &operator<<(std::ostream &out, const LaneDataVector &turn_la } } } + +namespace extractor +{ +inline std::ostream &operator<<(std::ostream &out, const EdgeBasedEdge &edge) +{ + out << " EdgeBasedEdge {"; + out << " source " << edge.source << ", target: " << edge.target; + out << " EdgeBasedEdgeData data {"; + out << " turn_id: " << edge.data.turn_id << ", weight: " << edge.data.weight; + out << " distance: " << edge.data.distance << ", duration: " << edge.data.duration; + out << " forward: " << (edge.data.forward == 0 ? "false" : "true") + << ", backward: " << (edge.data.backward == 0 ? "false" : "true"); + out << " }"; + out << "}"; + return out; +} +} } #endif /*OSRM_ENGINE_GUIDANCE_DEBUG_HPP_*/ diff --git a/include/util/ieee754.hpp b/include/util/ieee754.hpp index 6a05c26f47d..16f37e15d45 100644 --- a/include/util/ieee754.hpp +++ b/include/util/ieee754.hpp @@ -29,7 +29,7 @@ THE SOFTWARE. #include #if defined(_MSC_VER) -#include "msinttypes/stdint.h" +#include "rapidjson/msinttypes/stdint.h" #include #else #include diff --git a/include/util/mmap_file.hpp b/include/util/mmap_file.hpp index 46984d94848..d55203d7228 100644 --- a/include/util/mmap_file.hpp +++ b/include/util/mmap_file.hpp @@ -15,14 +15,14 @@ namespace util namespace detail { -template -util::vector_view mmapFile(const boost::filesystem::path &file, RegionT ®ion) +template +util::vector_view mmapFile(const boost::filesystem::path &file, MmapContainerT &mmap_container) { try { - region.open(file); - std::size_t num_objects = region.size() / sizeof(T); - auto data_ptr = region.data(); + mmap_container.open(file); + std::size_t num_objects = mmap_container.size() / sizeof(T); + auto data_ptr = mmap_container.data(); BOOST_ASSERT(reinterpret_cast(data_ptr) % alignof(T) == 0); return util::vector_view(reinterpret_cast(data_ptr), num_objects); } @@ -34,9 +34,10 @@ util::vector_view mmapFile(const boost::filesystem::path &file, RegionT ®i } } -template -util::vector_view -mmapFile(const boost::filesystem::path &file, RegionT ®ion, const std::size_t size) +template +util::vector_view mmapFile(const boost::filesystem::path &file, + MmapContainerT &mmap_container, + const std::size_t size) { try { @@ -45,10 +46,10 @@ mmapFile(const boost::filesystem::path &file, RegionT ®ion, const std::size_t params.path = file.string(); params.flags = boost::iostreams::mapped_file::readwrite; params.new_file_size = size; - region.open(params); + mmap_container.open(params); std::size_t num_objects = size / sizeof(T); - auto data_ptr = region.data(); + auto data_ptr = mmap_container.data(); BOOST_ASSERT(reinterpret_cast(data_ptr) % alignof(T) == 0); return util::vector_view(reinterpret_cast(data_ptr), num_objects); } @@ -63,24 +64,24 @@ mmapFile(const boost::filesystem::path &file, RegionT ®ion, const std::size_t template util::vector_view mmapFile(const boost::filesystem::path &file, - boost::iostreams::mapped_file_source ®ion) + boost::iostreams::mapped_file_source &mmap_container) { - return detail::mmapFile(file, region); + return detail::mmapFile(file, mmap_container); } template util::vector_view mmapFile(const boost::filesystem::path &file, - boost::iostreams::mapped_file ®ion) + boost::iostreams::mapped_file &mmap_container) { - return detail::mmapFile(file, region); + return detail::mmapFile(file, mmap_container); } template util::vector_view mmapFile(const boost::filesystem::path &file, - boost::iostreams::mapped_file ®ion, + boost::iostreams::mapped_file &mmap_container, std::size_t size) { - return detail::mmapFile(file, region, size); + return detail::mmapFile(file, mmap_container, size); } } } diff --git a/include/util/node_based_graph.hpp b/include/util/node_based_graph.hpp index 587bb8ab458..1c31f8f7d26 100644 --- a/include/util/node_based_graph.hpp +++ b/include/util/node_based_graph.hpp @@ -9,6 +9,7 @@ #include +#include #include #include @@ -20,24 +21,27 @@ namespace util struct NodeBasedEdgeData { NodeBasedEdgeData() - : weight(INVALID_EDGE_WEIGHT), duration(INVALID_EDGE_WEIGHT), geometry_id({0, false}), - reversed(false), annotation_data(-1) + : weight(INVALID_EDGE_WEIGHT), duration(INVALID_EDGE_WEIGHT), + distance(INVALID_EDGE_DISTANCE), geometry_id({0, false}), reversed(false), + annotation_data(-1) { } NodeBasedEdgeData(EdgeWeight weight, EdgeWeight duration, + EdgeDistance distance, GeometryID geometry_id, bool reversed, extractor::NodeBasedEdgeClassification flags, AnnotationID annotation_data) - : weight(weight), duration(duration), geometry_id(geometry_id), reversed(reversed), - flags(flags), annotation_data(annotation_data) + : weight(weight), duration(duration), distance(distance), geometry_id(geometry_id), + reversed(reversed), flags(flags), annotation_data(annotation_data) { } EdgeWeight weight; EdgeWeight duration; + EdgeDistance distance; GeometryID geometry_id; bool reversed : 1; extractor::NodeBasedEdgeClassification flags; @@ -80,11 +84,13 @@ NodeBasedDynamicGraphFromEdges(NodeID number_of_nodes, const extractor::NodeBasedEdge &input_edge) { output_edge.data.weight = input_edge.weight; output_edge.data.duration = input_edge.duration; + output_edge.data.distance = input_edge.distance; output_edge.data.flags = input_edge.flags; output_edge.data.annotation_data = input_edge.annotation_data; BOOST_ASSERT(output_edge.data.weight > 0); BOOST_ASSERT(output_edge.data.duration > 0); + BOOST_ASSERT(output_edge.data.distance >= 0); }); tbb::parallel_sort(edges_list.begin(), edges_list.end()); diff --git a/include/util/typedefs.hpp b/include/util/typedefs.hpp index f0104e7b258..d647a7db713 100644 --- a/include/util/typedefs.hpp +++ b/include/util/typedefs.hpp @@ -113,8 +113,10 @@ static const SegmentWeight MAX_SEGMENT_WEIGHT = INVALID_SEGMENT_WEIGHT - 1; static const SegmentDuration MAX_SEGMENT_DURATION = INVALID_SEGMENT_DURATION - 1; static const EdgeWeight INVALID_EDGE_WEIGHT = std::numeric_limits::max(); static const EdgeDuration MAXIMAL_EDGE_DURATION = std::numeric_limits::max(); +static const EdgeDistance MAXIMAL_EDGE_DISTANCE = std::numeric_limits::max(); static const TurnPenalty INVALID_TURN_PENALTY = std::numeric_limits::max(); static const EdgeDistance INVALID_EDGE_DISTANCE = std::numeric_limits::max(); +static const EdgeDistance INVALID_FALLBACK_SPEED = std::numeric_limits::max(); // FIXME the bitfields we use require a reduced maximal duration, this should be kept consistent // within the code base. For now we have to ensure that we don't case 30 bit to -1 and break any diff --git a/include/util/vector_view.hpp b/include/util/vector_view.hpp index ab6e91fd607..260cc511eb3 100644 --- a/include/util/vector_view.hpp +++ b/include/util/vector_view.hpp @@ -195,7 +195,10 @@ template <> class vector_view { BOOST_ASSERT_MSG(index < m_size, "invalid size"); const std::size_t bucket = index / WORD_BITS; + // Note: ordering of bits here should match packBits in storage/serialization.hpp + // so that directly mmap-ing data is possible const auto offset = index % WORD_BITS; + BOOST_ASSERT(WORD_BITS > offset); return m_ptr[bucket] & (static_cast(1) << offset); } @@ -224,11 +227,23 @@ template <> class vector_view { BOOST_ASSERT(index < m_size); const auto bucket = index / WORD_BITS; + // Note: ordering of bits here should match packBits in storage/serialization.hpp + // so that directly mmap-ing data is possible const auto offset = index % WORD_BITS; + BOOST_ASSERT(WORD_BITS > offset); return reference{m_ptr + bucket, static_cast(1) << offset}; } template friend void swap(vector_view &, vector_view &) noexcept; + + friend std::ostream &operator<<(std::ostream &os, const vector_view &rhs) + { + for (std::size_t i = 0; i < rhs.size(); ++i) + { + os << (i > 0 ? " " : "") << rhs.at(i); + } + return os; + } }; // Both vector_view and the vector_view specializations share this impl. diff --git a/package-lock.json b/package-lock.json index 47935735f34..6544e2cd83a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8 +1,19 @@ { "name": "osrm", - "version": "5.13.0-latest.1", + "version": "5.20.0-latest.1", "lockfileVersion": 1, + "requires": true, "dependencies": { + "JSONStream": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz", + "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -19,6 +30,9 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, + "requires": { + "acorn": "^3.0.4" + }, "dependencies": { "acorn": { "version": "3.3.0", @@ -37,7 +51,11 @@ "ajv": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=" + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } }, "ajv-keywords": { "version": "2.1.0", @@ -49,7 +67,12 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true + "dev": true, + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } }, "alphanum-sort": { "version": "1.0.2", @@ -90,7 +113,11 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true + "dev": true, + "requires": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } }, "aproba": { "version": "1.2.0", @@ -100,19 +127,29 @@ "are-we-there-yet": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=" + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } }, "argparse": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "dev": true + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } }, "arr-diff": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } }, "arr-flatten": { "version": "1.1.0", @@ -154,7 +191,11 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", - "dev": true + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } }, "array-iterate": { "version": "1.1.1", @@ -178,7 +219,10 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } }, "array-uniq": { "version": "1.0.3", @@ -213,13 +257,21 @@ "version": "4.9.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz", "integrity": "sha1-SLokC0WpKA6UdImQull9IWYX/UA=", - "dev": true + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } }, "assert": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "dev": true + "dev": true, + "requires": { + "util": "0.10.3" + } }, "assert-plus": { "version": "0.2.0", @@ -231,6 +283,9 @@ "resolved": "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz", "integrity": "sha1-e9QXhNMkk5h66yOba04cV6hzuRc=", "dev": true, + "requires": { + "acorn": "^4.0.3" + }, "dependencies": { "acorn": { "version": "4.0.13", @@ -267,13 +322,25 @@ "version": "6.7.7", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", - "dev": true + "dev": true, + "requires": { + "browserslist": "^1.7.6", + "caniuse-db": "^1.0.30000634", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^5.2.16", + "postcss-value-parser": "^3.2.3" + } }, "aws-sdk": { "version": "2.0.31", "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.0.31.tgz", "integrity": "sha1-5yzx/caQFb2f0r3z07iMFlB9Jo4=", "dev": true, + "requires": { + "xml2js": "0.2.6", + "xmlbuilder": "0.4.2" + }, "dependencies": { "xmlbuilder": { "version": "0.4.2", @@ -297,49 +364,115 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz", "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=", - "dev": true + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-polyfill": "^6.26.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "chokidar": "^1.6.1", + "commander": "^2.11.0", + "convert-source-map": "^1.5.0", + "fs-readdir-recursive": "^1.0.0", + "glob": "^7.1.2", + "lodash": "^4.17.4", + "output-file-sync": "^1.1.2", + "path-is-absolute": "^1.0.1", + "slash": "^1.0.0", + "source-map": "^0.5.6", + "v8flags": "^2.1.1" + } }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } }, "babel-core": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", - "dev": true + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.0", + "debug": "^2.6.8", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.7", + "slash": "^1.0.0", + "source-map": "^0.5.6" + } }, "babel-eslint": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.0.1.tgz", "integrity": "sha512-h3moF6PCTQE06UjMMG+ydZSBvZ4Q7rqPE/5WAUOvUyHYUTqxm8JVhjZRiG1avI/tGVOK4BnZLDQapyLzh8DeKg==", "dev": true, + "requires": { + "babel-code-frame": "7.0.0-beta.0", + "babel-traverse": "7.0.0-beta.0", + "babel-types": "7.0.0-beta.0", + "babylon": "7.0.0-beta.22" + }, "dependencies": { "ansi-styles": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } }, "babel-code-frame": { "version": "7.0.0-beta.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.0.tgz", "integrity": "sha512-/xr1ADm5bnTjjN+xwoXb7lF4v2rnxMzNZzFU7h8SxB+qB6+IqSTOOqVcpaPTUC2Non/MbQxS3OIZnJpQ2X21aQ==", - "dev": true + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^3.0.0" + } }, "babel-helper-function-name": { "version": "7.0.0-beta.0", "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.0.tgz", "integrity": "sha512-DaQccFBBWBEzMdqbKmNXamY0m1yLHJGOdbbEsNoGdJrrU7wAF3wwowtDDPzF0ZT3SqJXPgZW/P2kgBX9moMuAA==", - "dev": true + "dev": true, + "requires": { + "babel-helper-get-function-arity": "7.0.0-beta.0", + "babel-template": "7.0.0-beta.0", + "babel-traverse": "7.0.0-beta.0", + "babel-types": "7.0.0-beta.0" + } }, "babel-helper-get-function-arity": { "version": "7.0.0-beta.0", "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.0.tgz", "integrity": "sha512-csqAic15/2Vm1951nJxkkL9K8E6ojyNF/eAOjk7pqJlO8kvgrccGNFCV9eDwcGHDPe5AjvJGwVSAcQ5fit9wuA==", - "dev": true + "dev": true, + "requires": { + "babel-types": "7.0.0-beta.0" + } }, "babel-messages": { "version": "7.0.0-beta.0", @@ -351,19 +484,41 @@ "version": "7.0.0-beta.0", "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.0.tgz", "integrity": "sha512-tmdH+MmmU0F6Ur8humpevSmFzYKbrN3Oru0g5Qyg4R6+sxjnzZmnvzUbsP0aKMr7tB0Ua6xhEb9arKTOsEMkyA==", - "dev": true + "dev": true, + "requires": { + "babel-traverse": "7.0.0-beta.0", + "babel-types": "7.0.0-beta.0", + "babylon": "7.0.0-beta.22", + "lodash": "^4.2.0" + } }, "babel-traverse": { "version": "7.0.0-beta.0", "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.0.tgz", "integrity": "sha512-IKzuTqUcQtMRZ0Vv5RjIrGGj33eBKmNTNeRexWSyjPPuAciyNkva1rt7WXPfHfkb+dX7coRAIUhzeTUEzhnwdA==", - "dev": true + "dev": true, + "requires": { + "babel-code-frame": "7.0.0-beta.0", + "babel-helper-function-name": "7.0.0-beta.0", + "babel-messages": "7.0.0-beta.0", + "babel-types": "7.0.0-beta.0", + "babylon": "7.0.0-beta.22", + "debug": "^3.0.1", + "globals": "^10.0.0", + "invariant": "^2.2.0", + "lodash": "^4.2.0" + } }, "babel-types": { "version": "7.0.0-beta.0", "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.0.tgz", "integrity": "sha512-rJc2kV9iPJGLlqIY71AM3nPcdkoeLRCDuR07GFgfd3lFl4TsBQq76TxYQQIZ2MONg1HpsqmuoCXr9aZ1Oa4wYw==", - "dev": true + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.2.0", + "to-fast-properties": "^2.0.0" + } }, "babylon": { "version": "7.0.0-beta.22", @@ -375,13 +530,21 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", - "dev": true + "dev": true, + "requires": { + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.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 + "dev": true, + "requires": { + "ms": "2.0.0" + } }, "globals": { "version": "10.1.0", @@ -393,7 +556,10 @@ "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 + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } }, "to-fast-properties": { "version": "2.0.0", @@ -407,109 +573,206 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", - "dev": true + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.6", + "trim-right": "^1.0.1" + } }, "babel-helper-bindify-decorators": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", - "dev": true + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } }, "babel-helper-builder-binary-assignment-operator-visitor": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "dev": true + "dev": true, + "requires": { + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } }, "babel-helper-builder-react-jsx": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", - "dev": true + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "esutils": "^2.0.2" + } }, "babel-helper-call-delegate": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } }, "babel-helper-define-map": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "dev": true + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } }, "babel-helper-explode-assignable-expression": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "dev": true + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } }, "babel-helper-explode-class": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", - "dev": true + "dev": true, + "requires": { + "babel-helper-bindify-decorators": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } }, "babel-helper-function-name": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true + "dev": true, + "requires": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } }, "babel-helper-get-function-arity": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } }, "babel-helper-hoist-variables": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dev": true + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } }, "babel-helper-optimise-call-expression": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } }, "babel-helper-regex": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "dev": true + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } }, "babel-helper-remap-async-to-generator": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "dev": true + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } }, "babel-helper-replace-supers": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } }, "babel-helpers": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } }, "babel-messages": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } }, "babel-plugin-check-es2015-constants": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } }, "babel-plugin-syntax-async-functions": { "version": "6.13.0", @@ -599,253 +862,444 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-system-import-transformer/-/babel-plugin-system-import-transformer-3.1.0.tgz", "integrity": "sha1-038Mro5h7zkGAggzHZMbXmMNfF8=", - "dev": true + "dev": true, + "requires": { + "babel-plugin-syntax-dynamic-import": "^6.18.0" + } }, "babel-plugin-transform-async-generator-functions": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", - "dev": true + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-generators": "^6.5.0", + "babel-runtime": "^6.22.0" + } }, "babel-plugin-transform-async-to-generator": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "dev": true + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" + } }, "babel-plugin-transform-class-constructor-call": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz", "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=", - "dev": true + "dev": true, + "requires": { + "babel-plugin-syntax-class-constructor-call": "^6.18.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } }, "babel-plugin-transform-class-properties": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", - "dev": true + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } }, "babel-plugin-transform-decorators": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", - "dev": true + "dev": true, + "requires": { + "babel-helper-explode-class": "^6.24.1", + "babel-plugin-syntax-decorators": "^6.13.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-types": "^6.24.1" + } }, "babel-plugin-transform-decorators-legacy": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.4.tgz", "integrity": "sha1-dBtY9sW86eYCfgiC2cmU8E82aSU=", - "dev": true + "dev": true, + "requires": { + "babel-plugin-syntax-decorators": "^6.1.18", + "babel-runtime": "^6.2.0", + "babel-template": "^6.3.0" + } }, "babel-plugin-transform-do-expressions": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz", "integrity": "sha1-KMyvkoEtlJws0SgfaQyP3EaK6bs=", - "dev": true + "dev": true, + "requires": { + "babel-plugin-syntax-do-expressions": "^6.8.0", + "babel-runtime": "^6.22.0" + } }, "babel-plugin-transform-es2015-arrow-functions": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } }, "babel-plugin-transform-es2015-block-scoped-functions": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } }, "babel-plugin-transform-es2015-block-scoping": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "dev": true + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } }, "babel-plugin-transform-es2015-classes": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true + "dev": true, + "requires": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } }, "babel-plugin-transform-es2015-computed-properties": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } }, "babel-plugin-transform-es2015-destructuring": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } }, "babel-plugin-transform-es2015-duplicate-keys": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } }, "babel-plugin-transform-es2015-for-of": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } }, "babel-plugin-transform-es2015-function-name": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } }, "babel-plugin-transform-es2015-literals": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } }, "babel-plugin-transform-es2015-modules-amd": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } }, "babel-plugin-transform-es2015-modules-commonjs": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", - "dev": true + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } }, "babel-plugin-transform-es2015-modules-systemjs": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } }, "babel-plugin-transform-es2015-modules-umd": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } }, "babel-plugin-transform-es2015-object-super": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true + "dev": true, + "requires": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" + } }, "babel-plugin-transform-es2015-parameters": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true + "dev": true, + "requires": { + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } }, "babel-plugin-transform-es2015-shorthand-properties": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } }, "babel-plugin-transform-es2015-spread": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } }, "babel-plugin-transform-es2015-sticky-regex": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true + "dev": true, + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } }, "babel-plugin-transform-es2015-template-literals": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } }, "babel-plugin-transform-es2015-typeof-symbol": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } }, "babel-plugin-transform-es2015-unicode-regex": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true + "dev": true, + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" + } }, "babel-plugin-transform-exponentiation-operator": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "dev": true + "dev": true, + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" + } }, "babel-plugin-transform-export-extensions": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz", "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", - "dev": true + "dev": true, + "requires": { + "babel-plugin-syntax-export-extensions": "^6.8.0", + "babel-runtime": "^6.22.0" + } }, "babel-plugin-transform-flow-strip-types": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", - "dev": true + "dev": true, + "requires": { + "babel-plugin-syntax-flow": "^6.18.0", + "babel-runtime": "^6.22.0" + } }, "babel-plugin-transform-function-bind": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz", "integrity": "sha1-xvuOlqwpajELjPjqQBRiQH3fapc=", - "dev": true + "dev": true, + "requires": { + "babel-plugin-syntax-function-bind": "^6.8.0", + "babel-runtime": "^6.22.0" + } }, "babel-plugin-transform-object-rest-spread": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "dev": true + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } }, "babel-plugin-transform-react-display-name": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", - "dev": true + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } }, "babel-plugin-transform-react-jsx": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", - "dev": true + "dev": true, + "requires": { + "babel-helper-builder-react-jsx": "^6.24.1", + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" + } }, "babel-plugin-transform-react-jsx-self": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", - "dev": true + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" + } }, "babel-plugin-transform-react-jsx-source": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", - "dev": true + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" + } }, "babel-plugin-transform-regenerator": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "dev": true + "dev": true, + "requires": { + "regenerator-transform": "^0.10.0" + } }, "babel-plugin-transform-strict-mode": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } }, "babel-polyfill": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "regenerator-runtime": "^0.10.5" + }, "dependencies": { "regenerator-runtime": { "version": "0.10.5", @@ -859,79 +1313,180 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "dev": true + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.24.1", + "babel-plugin-transform-es2015-classes": "^6.24.1", + "babel-plugin-transform-es2015-computed-properties": "^6.24.1", + "babel-plugin-transform-es2015-destructuring": "^6.22.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", + "babel-plugin-transform-es2015-for-of": "^6.22.0", + "babel-plugin-transform-es2015-function-name": "^6.24.1", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-umd": "^6.24.1", + "babel-plugin-transform-es2015-object-super": "^6.24.1", + "babel-plugin-transform-es2015-parameters": "^6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", + "babel-plugin-transform-regenerator": "^6.24.1" + } }, "babel-preset-flow": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", - "dev": true + "dev": true, + "requires": { + "babel-plugin-transform-flow-strip-types": "^6.22.0" + } }, "babel-preset-react": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", - "dev": true + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "^6.3.13", + "babel-plugin-transform-react-display-name": "^6.23.0", + "babel-plugin-transform-react-jsx": "^6.24.1", + "babel-plugin-transform-react-jsx-self": "^6.22.0", + "babel-plugin-transform-react-jsx-source": "^6.22.0", + "babel-preset-flow": "^6.23.0" + } }, "babel-preset-stage-0": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz", "integrity": "sha1-VkLRUEL5E4TX5a+LyIsduVsDnmo=", - "dev": true + "dev": true, + "requires": { + "babel-plugin-transform-do-expressions": "^6.22.0", + "babel-plugin-transform-function-bind": "^6.22.0", + "babel-preset-stage-1": "^6.24.1" + } }, "babel-preset-stage-1": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz", "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=", - "dev": true + "dev": true, + "requires": { + "babel-plugin-transform-class-constructor-call": "^6.24.1", + "babel-plugin-transform-export-extensions": "^6.22.0", + "babel-preset-stage-2": "^6.24.1" + } }, "babel-preset-stage-2": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", - "dev": true + "dev": true, + "requires": { + "babel-plugin-syntax-dynamic-import": "^6.18.0", + "babel-plugin-transform-class-properties": "^6.24.1", + "babel-plugin-transform-decorators": "^6.24.1", + "babel-preset-stage-3": "^6.24.1" + } }, "babel-preset-stage-3": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", - "dev": true + "dev": true, + "requires": { + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-generator-functions": "^6.24.1", + "babel-plugin-transform-async-to-generator": "^6.24.1", + "babel-plugin-transform-exponentiation-operator": "^6.24.1", + "babel-plugin-transform-object-rest-spread": "^6.22.0" + } }, "babel-register": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + } }, "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } }, "babel-template": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } }, "babel-traverse": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } }, "babel-types": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } }, "babelify": { "version": "7.3.0", "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", - "dev": true + "dev": true, + "requires": { + "babel-core": "^6.0.14", + "object-assign": "^4.0.0" + } }, "babylon": { "version": "6.18.0", @@ -955,6 +1510,15 @@ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, "dependencies": { "isobject": { "version": "3.0.1", @@ -974,7 +1538,10 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "optional": true + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } }, "binary-extensions": { "version": "1.10.0", @@ -985,7 +1552,10 @@ "block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=" + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "requires": { + "inherits": "~2.0.0" + } }, "bn.js": { "version": "4.11.8", @@ -997,7 +1567,13 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz", "integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=", - "dev": true + "dev": true, + "requires": { + "continuable-cache": "^0.3.1", + "error": "^7.0.0", + "raw-body": "~1.1.0", + "safe-json-parse": "~1.0.1" + } }, "boolbase": { "version": "1.0.0", @@ -1008,24 +1584,42 @@ "boom": { "version": "2.10.1", "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=" + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "requires": { + "hoek": "2.x.x" + } }, "brace-expansion": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=" + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, "braces": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } }, "brfs": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.4.3.tgz", "integrity": "sha1-22ddb16SPm3wh/ylhZyQkKrtMhY=", - "dev": true + "dev": true, + "requires": { + "quote-stream": "^1.0.1", + "resolve": "^1.1.5", + "static-module": "^1.1.0", + "through2": "^2.0.0" + } }, "brorand": { "version": "1.1.0", @@ -1037,13 +1631,23 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.0.2.tgz", "integrity": "sha1-+GzWzvT1MAyOY+B6TVEvZfv/RTE=", - "dev": true + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "combine-source-map": "~0.7.1", + "defined": "^1.0.0", + "through2": "^2.0.0", + "umd": "^3.0.0" + } }, "browser-resolve": { "version": "1.11.2", "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", "dev": true, + "requires": { + "resolve": "1.1.7" + }, "dependencies": { "resolve": { "version": "1.1.7", @@ -1058,18 +1662,80 @@ "resolved": "https://registry.npmjs.org/browserify/-/browserify-14.4.0.tgz", "integrity": "sha1-CJo0Y69Y0OSNjNQHCz90ZU1avKk=", "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^1.11.0", + "browserify-zlib": "~0.1.2", + "buffer": "^5.0.2", + "cached-path-relative": "^1.0.0", + "concat-stream": "~1.5.1", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.0", + "domain-browser": "~1.1.0", + "duplexer2": "~0.1.2", + "events": "~1.1.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.0.0", + "labeled-stream-splicer": "^2.0.0", + "module-deps": "^4.0.8", + "os-browserify": "~0.1.1", + "parents": "^1.0.1", + "path-browserify": "~0.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^2.0.0", + "stream-http": "^2.0.0", + "string_decoder": "~1.0.0", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "~0.0.0", + "url": "~0.11.0", + "util": "~0.10.1", + "vm-browserify": "~0.0.1", + "xtend": "^4.0.0" + }, "dependencies": { "concat-stream": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz", "integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=", "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "~2.0.0", + "typedarray": "~0.0.5" + }, "dependencies": { "readable-stream": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } }, "string_decoder": { "version": "0.10.31", @@ -1083,7 +1749,10 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } } } }, @@ -1091,49 +1760,91 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.8.tgz", "integrity": "sha512-WYCMOT/PtGTlpOKFht0YJFYcPy6pLCR98CtWfzK13zoynLlBMvAdEMSRGmgnJCw2M2j/5qxBkinZQFobieM8dQ==", - "dev": true + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } }, "browserify-cipher": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", - "dev": true + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } }, "browserify-des": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", - "dev": true + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1" + } }, "browserify-rsa": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } }, "browserify-sign": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } }, "browserify-zlib": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", - "dev": true + "dev": true, + "requires": { + "pako": "~0.2.0" + } }, "browserslist": { "version": "1.7.7", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "dev": true + "dev": true, + "requires": { + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" + } }, "buffer": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.0.8.tgz", "integrity": "sha512-xXvjQhVNz50v2nPeoOsNqWCLGfiv4ji/gXZM28jnVwdLJxH4mFyqgqCKfaK9zf1KUbG6zTkjLOy7ou+jSMarGA==", - "dev": true + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } }, "buffer-equal": { "version": "0.0.1", @@ -1175,6 +1886,17 @@ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, "dependencies": { "isobject": { "version": "3.0.1", @@ -1194,7 +1916,10 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true + "dev": true, + "requires": { + "callsites": "^0.2.0" + } }, "callsites": { "version": "0.2.0", @@ -1206,7 +1931,11 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "dev": true + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } }, "camelcase": { "version": "3.0.0", @@ -1218,6 +1947,10 @@ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, "dependencies": { "camelcase": { "version": "2.1.1", @@ -1232,6 +1965,12 @@ "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", "dev": true, + "requires": { + "browserslist": "^1.3.6", + "caniuse-db": "^1.0.30000529", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + }, "dependencies": { "lodash.memoize": { "version": "4.1.2", @@ -1262,13 +2001,24 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true + "dev": true, + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } }, "character-entities": { "version": "1.2.1", @@ -1298,13 +2048,28 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true + "dev": true, + "requires": { + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + } }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } }, "circular-json": { "version": "0.3.3", @@ -1316,25 +2081,43 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", - "dev": true + "dev": true, + "requires": { + "chalk": "^1.1.3" + } }, "class-utils": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.5.tgz", "integrity": "sha1-F+eTEDdQ+WJ7IXbqNM/RtWWQPIA=", "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "lazy-cache": "^2.0.2", + "static-extend": "^0.1.1" + }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } }, "isobject": { "version": "3.0.1", @@ -1352,7 +2135,10 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "dev": true + "dev": true, + "requires": { + "set-getter": "^0.1.0" + } } } }, @@ -1360,13 +2146,19 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } }, "cli-table": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", "dev": true, + "requires": { + "colors": "1.0.3" + }, "dependencies": { "colors": { "version": "1.0.3", @@ -1385,7 +2177,12 @@ "cliui": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=" + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } }, "clone": { "version": "1.0.2", @@ -1409,7 +2206,12 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.0.0.tgz", "integrity": "sha1-pikNQT8hemEjL5XkWP84QYz7ARc=", - "dev": true + "dev": true, + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^1.0.6", + "through2": "^2.0.1" + } }, "co": { "version": "4.6.0", @@ -1420,7 +2222,10 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", - "dev": true + "dev": true, + "requires": { + "q": "^1.1.2" + } }, "code-point-at": { "version": "1.1.0", @@ -1437,19 +2242,31 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } }, "color": { "version": "0.11.4", "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", - "dev": true + "dev": true, + "requires": { + "clone": "^1.0.2", + "color-convert": "^1.3.0", + "color-string": "^0.3.0" + } }, "color-convert": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", - "dev": true + "dev": true, + "requires": { + "color-name": "^1.1.1" + } }, "color-name": { "version": "1.1.3", @@ -1461,13 +2278,21 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "dev": true + "dev": true, + "requires": { + "color-name": "^1.0.0" + } }, "colormin": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", - "dev": true + "dev": true, + "requires": { + "color": "^0.11.0", + "css-color-names": "0.0.4", + "has": "^1.0.1" + } }, "colors": { "version": "1.1.2", @@ -1480,6 +2305,12 @@ "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.7.2.tgz", "integrity": "sha1-CHAxKFazB6h8xKxIbzqaYq7MwJ4=", "dev": true, + "requires": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + }, "dependencies": { "convert-source-map": { "version": "1.1.3", @@ -1492,13 +2323,19 @@ "combined-stream": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=" + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "requires": { + "delayed-stream": "~1.0.0" + } }, "comma-separated-tokens": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.4.tgz", "integrity": "sha1-cgg+WNSkYvAYZvZhf02Yo807ikY=", - "dev": true + "dev": true, + "requires": { + "trim": "0.0.1" + } }, "commander": { "version": "2.11.0", @@ -1510,7 +2347,11 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz", "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=", - "dev": true + "dev": true, + "requires": { + "array-ify": "^1.0.0", + "dot-prop": "^3.0.0" + } }, "component-emitter": { "version": "1.2.1", @@ -1527,13 +2368,21 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "dev": true + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } }, "console-browserify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true + "dev": true, + "requires": { + "date-now": "^0.1.4" + } }, "console-control-strings": { "version": "1.1.0", @@ -1556,91 +2405,181 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-1.1.6.tgz", "integrity": "sha512-AaQRALJYQVbfMs0UYJ3jf5yIAJwGnm/E7ETwzZMwF/3JDMyDaa4agLQomz94pcYiGH7zcrxFcwHApSODOYnunA==", - "dev": true + "dev": true, + "requires": { + "conventional-changelog-angular": "^1.5.1", + "conventional-changelog-atom": "^0.1.1", + "conventional-changelog-codemirror": "^0.2.0", + "conventional-changelog-core": "^1.9.2", + "conventional-changelog-ember": "^0.2.8", + "conventional-changelog-eslint": "^0.2.0", + "conventional-changelog-express": "^0.2.0", + "conventional-changelog-jquery": "^0.1.0", + "conventional-changelog-jscs": "^0.1.0", + "conventional-changelog-jshint": "^0.2.0" + } }, "conventional-changelog-angular": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.5.1.tgz", "integrity": "sha512-AnjnPyqHp8yR2IOWsXYOCv6Ly0WC2rLRK04fgAS/5QoA3ovYLSoz9PKB5pcSG3M9lAf40IqZwU3R3G6Hy7XCSA==", - "dev": true + "dev": true, + "requires": { + "compare-func": "^1.3.1", + "q": "^1.4.1" + } }, "conventional-changelog-atom": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-0.1.1.tgz", "integrity": "sha512-6Nlu/+MiD4gi7k3Z+N1vMJWpaPSdvFPWzPGnH4OXewHAxiAl0L/TT9CGgA01fosPxmYr4hMNtD7kyN0tkg8vIA==", - "dev": true + "dev": true, + "requires": { + "q": "^1.4.1" + } }, "conventional-changelog-codemirror": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.2.0.tgz", "integrity": "sha512-jUbY98JoKdAOR5k3pOBiKZ+Iz9t2F84hL7x4WjSRW6x7FdeCEUOjyfml+YClE2h/h62Tf3mwur5jSO8upxxc1g==", - "dev": true + "dev": true, + "requires": { + "q": "^1.4.1" + } }, "conventional-changelog-core": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-1.9.2.tgz", "integrity": "sha512-L/boGKXaKWrlCU8bHa1QM36Pb/JopCPmekj5SFqqAuBfjya860xX2fAC5Ggelse++Bw39AZ2NrHwBnJrdwLlLw==", - "dev": true + "dev": true, + "requires": { + "conventional-changelog-writer": "^2.0.1", + "conventional-commits-parser": "^2.0.0", + "dateformat": "^1.0.12", + "get-pkg-repo": "^1.0.0", + "git-raw-commits": "^1.2.0", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^1.2.2", + "lodash": "^4.0.0", + "normalize-package-data": "^2.3.5", + "q": "^1.4.1", + "read-pkg": "^1.1.0", + "read-pkg-up": "^1.0.1", + "through2": "^2.0.0" + } }, "conventional-changelog-ember": { "version": "0.2.8", "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-0.2.8.tgz", "integrity": "sha512-smsh0o/S95n22lrQZrSHYjJrxIGoFl+OFHK+q2KGHA2zRFrW7QilYM7VUjgmB+emzwqFguPjrq+D2U8iPhMNJg==", - "dev": true + "dev": true, + "requires": { + "q": "^1.4.1" + } }, "conventional-changelog-eslint": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-0.2.0.tgz", "integrity": "sha512-WGKnC0bGPD6BHGiRBfYqNGfy6DZDn2jGs1yxPRT8I2796wYdGqsbDF4477o4fdsxUJvckoW2OFPqkmRMQaCHSA==", - "dev": true + "dev": true, + "requires": { + "q": "^1.4.1" + } }, "conventional-changelog-express": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-0.2.0.tgz", "integrity": "sha512-ujSEmbWfozC1iIjH5Pl7AKtREowvAl10whs1q6c7nZLnoNZK5CmdB2PQ/V42O6rCgUzaLX+ACRW2+g0A/Htqvw==", - "dev": true + "dev": true, + "requires": { + "q": "^1.4.1" + } }, "conventional-changelog-jquery": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz", "integrity": "sha1-Agg5cWLjhGmG5xJztsecW1+A9RA=", - "dev": true + "dev": true, + "requires": { + "q": "^1.4.1" + } }, "conventional-changelog-jscs": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz", "integrity": "sha1-BHnrRDzH1yxYvwvPDvHURKkvDlw=", - "dev": true + "dev": true, + "requires": { + "q": "^1.4.1" + } }, "conventional-changelog-jshint": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-0.2.0.tgz", "integrity": "sha512-uUP4c0et6F2teapl+YY2JHFAHD401U5CkgI+P8PyU0y1zS8BdBy6EnhqgZEXhFOp9fPzUdic+Wv/9alOqw3agQ==", - "dev": true + "dev": true, + "requires": { + "compare-func": "^1.3.1", + "q": "^1.4.1" + } }, "conventional-changelog-writer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-2.0.1.tgz", "integrity": "sha512-X4qC758celQOKw0iUPAsH5sJX6fH6N5dboFc3elXb1/SIKhsYMukhhaxWmxRdtVUSqGt9rZg8giwBQG5B2GeKg==", - "dev": true + "dev": true, + "requires": { + "compare-func": "^1.3.1", + "conventional-commits-filter": "^1.0.0", + "dateformat": "^1.0.11", + "handlebars": "^4.0.2", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.0.0", + "meow": "^3.3.0", + "semver": "^5.0.1", + "split": "^1.0.0", + "through2": "^2.0.0" + } }, "conventional-commits-filter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-1.0.0.tgz", "integrity": "sha1-b8KmWTcrw/IznPn//34bA0S5MDk=", - "dev": true + "dev": true, + "requires": { + "is-subset": "^0.1.1", + "modify-values": "^1.0.0" + } }, "conventional-commits-parser": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.0.0.tgz", "integrity": "sha512-8od6g684Fhi5Vpp4ABRv/RBsW1AY6wSHbJHEK6FGTv+8jvAAnlABniZu/FVmX9TcirkHepaEsa1QGkRvbg0CKw==", - "dev": true + "dev": true, + "requires": { + "JSONStream": "^1.0.4", + "is-text-path": "^1.0.0", + "lodash": "^4.2.1", + "meow": "^3.3.0", + "split2": "^2.0.0", + "through2": "^2.0.0", + "trim-off-newlines": "^1.0.0" + } }, "conventional-recommended-bump": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-1.0.2.tgz", "integrity": "sha512-kC4EvXsc+flKpmD0Aa98qVGG7qGqLsVswVT0ijicXiNPBkGQAOMPYg+JoFjBXAWYWw4Y6RsiEDL+JKLrp0RqXQ==", - "dev": true + "dev": true, + "requires": { + "concat-stream": "^1.4.10", + "conventional-commits-filter": "^1.0.0", + "conventional-commits-parser": "^2.0.0", + "git-raw-commits": "^1.2.0", + "git-semver-tags": "^1.2.2", + "meow": "^3.3.0", + "object-assign": "^4.0.1" + } }, "convert-source-map": { "version": "1.5.0", @@ -1669,42 +2608,85 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", - "dev": true + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } }, "create-hash": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", - "dev": true + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "sha.js": "^2.4.0" + } }, "create-hmac": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", - "dev": true + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } }, "create-react-class": { "version": "15.6.2", "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.2.tgz", "integrity": "sha1-zx7RXxKq1/FO9fLf4F5sQvke8Co=", - "dev": true + "dev": true, + "requires": { + "fbjs": "^0.8.9", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } }, "cross-spawn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } }, "cryptiles": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=" + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "requires": { + "boom": "2.x.x" + } }, "crypto-browserify": { "version": "3.11.1", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz", "integrity": "sha512-Na7ZlwCOqoaW5RwUK1WpXws2kv8mNhWdTlzob0UXulk6G9BDbyiJaGTYBIX61Ozn9l1EPPJpICZb4DaOpT9NlQ==", - "dev": true + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0" + } }, "css-color-names": { "version": "0.0.4", @@ -1722,31 +2704,90 @@ "version": "3.10.0", "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", - "dev": true + "dev": true, + "requires": { + "autoprefixer": "^6.3.1", + "decamelize": "^1.1.2", + "defined": "^1.0.0", + "has": "^1.0.1", + "object-assign": "^4.0.1", + "postcss": "^5.0.14", + "postcss-calc": "^5.2.0", + "postcss-colormin": "^2.1.8", + "postcss-convert-values": "^2.3.4", + "postcss-discard-comments": "^2.0.4", + "postcss-discard-duplicates": "^2.0.1", + "postcss-discard-empty": "^2.0.1", + "postcss-discard-overridden": "^0.1.1", + "postcss-discard-unused": "^2.2.1", + "postcss-filter-plugins": "^2.0.0", + "postcss-merge-idents": "^2.1.5", + "postcss-merge-longhand": "^2.0.1", + "postcss-merge-rules": "^2.0.3", + "postcss-minify-font-values": "^1.0.2", + "postcss-minify-gradients": "^1.0.1", + "postcss-minify-params": "^1.0.4", + "postcss-minify-selectors": "^2.0.4", + "postcss-normalize-charset": "^1.1.0", + "postcss-normalize-url": "^3.0.7", + "postcss-ordered-values": "^2.1.0", + "postcss-reduce-idents": "^2.2.2", + "postcss-reduce-initial": "^1.0.0", + "postcss-reduce-transforms": "^1.0.3", + "postcss-svgo": "^2.1.1", + "postcss-unique-selectors": "^2.0.2", + "postcss-value-parser": "^3.2.3", + "postcss-zindex": "^2.0.1" + } }, "csso": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", - "dev": true + "dev": true, + "requires": { + "clap": "^1.0.9", + "source-map": "^0.5.3" + } }, "cucumber": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/cucumber/-/cucumber-1.3.3.tgz", "integrity": "sha1-Za+2Xy+T9y2teN8qterPFGCf7C8=", - "dev": true + "dev": true, + "requires": { + "camel-case": "^3.0.0", + "cli-table": "^0.3.1", + "co": "^4.6.0", + "colors": "^1.1.2", + "commander": "^2.9.0", + "duration": "^0.2.0", + "figures": "1.7.0", + "gherkin": "^4.1.0", + "glob": "^7.0.0", + "is-generator": "^1.0.2", + "lodash": "^4.0.0", + "stack-chain": "^1.3.5", + "stacktrace-js": "^1.3.0" + } }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } }, "d": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", "integrity": "sha1-2hhMU10Y2O57oqoim5FACfrhEwk=", - "dev": true + "dev": true, + "requires": { + "es5-ext": "~0.10.2" + } }, "d3-queue": { "version": "2.0.3", @@ -1758,12 +2799,18 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", - "dev": true + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } }, "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" + }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -1782,12 +2829,19 @@ "version": "1.0.12", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "meow": "^3.3.0" + } }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==" + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } }, "decamelize": { "version": "1.2.0", @@ -1815,13 +2869,20 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", - "dev": true + "dev": true, + "requires": { + "foreach": "^2.0.5", + "object-keys": "^1.0.8" + } }, "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } }, "defined": { "version": "1.0.0", @@ -1833,7 +2894,16 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true + "dev": true, + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + } }, "delayed-stream": { "version": "1.0.0", @@ -1849,31 +2919,51 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", - "dev": true + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "shasum": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" + } }, "des.js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } }, "detab": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.1.tgz", "integrity": "sha512-/hhdqdQc5thGrqzjyO/pz76lDZ5GSuAs6goxOaKTsvPk7HNnzAyFN5lyHgqpX4/s1i66K8qMGj+VhA9504x7DQ==", - "dev": true + "dev": true, + "requires": { + "repeat-string": "^1.5.4" + } }, "detect-indent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true + "dev": true, + "requires": { + "repeating": "^2.0.0" + } }, "detective": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/detective/-/detective-4.5.0.tgz", "integrity": "sha1-blqMaybmx6JUsca210kNmOyR7dE=", "dev": true, + "requires": { + "acorn": "^4.0.3", + "defined": "^1.0.0" + }, "dependencies": { "acorn": { "version": "4.0.13", @@ -1893,25 +2983,72 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", - "dev": true + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } }, "disparity": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/disparity/-/disparity-2.0.0.tgz", "integrity": "sha1-V92stHMkrl9Y0swNqIbbTOnutxg=", - "dev": true + "dev": true, + "requires": { + "ansi-styles": "^2.0.1", + "diff": "^1.3.2" + } }, "docbox": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/docbox/-/docbox-1.0.8.tgz", "integrity": "sha512-qO0e1t4lHXmvxVjD0Jz0LsOdBqDqEN+gE3QPoUrdvOdOkApUi1qRoTXfNlDDNPu3VoS9NlsI4ylJbUYvJcZ+Yw==", "dev": true, + "requires": { + "babel-cli": "^6.4.0", + "babel-eslint": "^8.0.0", + "babel-plugin-transform-class-properties": "^6.24.1", + "babel-polyfill": "^6.3.14", + "babel-preset-es2015": "^6.3.13", + "babel-preset-react": "^6.3.13", + "babel-preset-stage-0": "^6.3.13", + "babelify": "^7.2.0", + "brfs": "^1.4.2", + "browserify": "^14.3.0", + "cssnano": "^3.4.0", + "es6-promise": "^4.1.0", + "eslint": "^4.1.0", + "eslint-plugin-babel": "^4.1.1", + "eslint-plugin-react": "^7.0.0", + "github-slugger": "^1.0.1", + "highlight.js": "^9.2.0", + "isomorphic-fetch": "^2.2.0", + "lodash.debounce": "^4.0.3", + "minifyify": "^7.1.0", + "prop-types": "^15.5.9", + "react": "^15.0.2", + "react-dom": "^15.0.2", + "remark": "^8.0.0", + "remark-html": "^6.0.0", + "remark-slug": "^4.1.0", + "standard-changelog": "^1.0.1", + "standard-version": "^4.0.0", + "unist-util-select": "^1.3.0", + "unist-util-visit": "^1.0.0" + }, "dependencies": { "ajv": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.3.tgz", "integrity": "sha1-wG9Zh3jETGsWGrr+NGa4GtGBTtI=", - "dev": true + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "json-schema-traverse": "^0.3.0", + "json-stable-stringify": "^1.0.1" + } }, "ansi-regex": { "version": "3.0.0", @@ -1923,25 +3060,75 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } }, "chalk": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", - "dev": true + "dev": true, + "requires": { + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.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 + "dev": true, + "requires": { + "ms": "2.0.0" + } }, "eslint": { "version": "4.8.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.8.0.tgz", "integrity": "sha1-Ip7w41Tg5h2DfHqA/fuoJeGZgV4=", - "dev": true + "dev": true, + "requires": { + "ajv": "^5.2.0", + "babel-code-frame": "^6.22.0", + "chalk": "^2.1.0", + "concat-stream": "^1.6.0", + "cross-spawn": "^5.1.0", + "debug": "^3.0.1", + "doctrine": "^2.0.0", + "eslint-scope": "^3.7.1", + "espree": "^3.5.1", + "esquery": "^1.0.0", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^9.17.0", + "ignore": "^3.3.3", + "imurmurhash": "^0.1.4", + "inquirer": "^3.0.6", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "require-uncached": "^1.0.3", + "semver": "^5.3.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "~2.0.1", + "table": "^4.0.1", + "text-table": "~0.2.0" + } }, "esprima": { "version": "4.0.0", @@ -1959,19 +3146,29 @@ "version": "3.10.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", - "dev": true + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } }, "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 + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } } } }, @@ -1979,25 +3176,87 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", - "dev": true + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } }, "doctrine-temporary-fork": { "version": "2.0.0-alpha-allowarrayindex", "resolved": "https://registry.npmjs.org/doctrine-temporary-fork/-/doctrine-temporary-fork-2.0.0-alpha-allowarrayindex.tgz", "integrity": "sha1-QAFahn6yfnWybIKLcVJPE3+J+fA=", - "dev": true + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } }, "documentation": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/documentation/-/documentation-4.0.0.tgz", "integrity": "sha1-moqajjiWm/1J008137J/HHW2R8A=", "dev": true, + "requires": { + "ansi-html": "^0.0.7", + "babel-core": "^6.17.0", + "babel-generator": "6.25.0", + "babel-plugin-system-import-transformer": "3.1.0", + "babel-plugin-transform-decorators-legacy": "^1.3.4", + "babel-preset-es2015": "^6.16.0", + "babel-preset-react": "^6.16.0", + "babel-preset-stage-0": "^6.16.0", + "babel-traverse": "^6.16.0", + "babel-types": "^6.16.0", + "babelify": "^7.3.0", + "babylon": "^6.17.2", + "chalk": "^2.0.0", + "chokidar": "^1.2.0", + "concat-stream": "^1.5.0", + "disparity": "^2.0.0", + "doctrine-temporary-fork": "2.0.0-alpha-allowarrayindex", + "get-comments": "^1.0.1", + "get-port": "^3.1.0", + "git-url-parse": "^6.0.1", + "github-slugger": "1.1.3", + "glob": "^7.0.0", + "globals-docs": "^2.3.0", + "highlight.js": "^9.1.0", + "js-yaml": "^3.8.4", + "lodash": "^4.11.1", + "mdast-util-inject": "^1.1.0", + "micromatch": "^3.0.0", + "mime": "^1.3.4", + "module-deps-sortable": "4.0.6", + "parse-filepath": "^1.0.1", + "pify": "^3.0.0", + "read-pkg-up": "^2.0.0", + "remark": "^8.0.0", + "remark-html": "6.0.1", + "remark-toc": "^4.0.0", + "remote-origin-url": "0.4.0", + "shelljs": "^0.7.5", + "stream-array": "^1.1.0", + "strip-json-comments": "^2.0.0", + "tiny-lr": "^1.0.3", + "unist-builder": "^1.0.0", + "unist-util-visit": "^1.0.1", + "vfile": "^2.0.0", + "vfile-reporter": "^4.0.0", + "vfile-sort": "^2.0.0", + "vinyl": "^2.0.0", + "vinyl-fs": "^2.3.1", + "yargs": "^6.0.1" + }, "dependencies": { "ansi-styles": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } }, "arr-diff": { "version": "4.0.0", @@ -2015,25 +3274,56 @@ "version": "6.25.0", "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz", "integrity": "sha1-M6GvcNXyiQrrRlpKd5PB32qeqfw=", - "dev": true + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-types": "^6.25.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.2.0", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } }, "braces": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.2.2.tgz", "integrity": "sha1-JB+GjCsmkNn+vu5afIP7vyXQCxs=", - "dev": true + "dev": true, + "requires": { + "arr-flatten": "^1.0.3", + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.0", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^2.1.0", + "to-regex": "^3.0.1" + } }, "chalk": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", - "dev": true + "dev": true, + "requires": { + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" + } }, "duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } }, "esprima": { "version": "4.0.0", @@ -2046,12 +3336,24 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } } } }, @@ -2059,43 +3361,76 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.2.tgz", "integrity": "sha512-I0+eZBH+jFGL8F5BnIz2ON2nKCjTS3AS3H/5PeSmCp7UVC70Ym8IhdRiQly2juKYQ//f7z1aj1BRpQniFJoU1w==", - "dev": true + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } }, "github-slugger": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.1.3.tgz", "integrity": "sha1-MUpudZoYwrDMV2DVEsy6tUnFSac=", - "dev": true + "dev": true, + "requires": { + "emoji-regex": ">=6.0.0 <=6.1.1" + } }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } } } }, @@ -2109,7 +3444,11 @@ "version": "3.10.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", - "dev": true + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } }, "kind-of": { "version": "5.0.2", @@ -2122,6 +3461,12 @@ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, "dependencies": { "pify": { "version": "2.3.0", @@ -2135,25 +3480,69 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.0.tgz", "integrity": "sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==", - "dev": true + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.2.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "extglob": "^2.0.2", + "fragment-cache": "^0.2.1", + "kind-of": "^5.0.2", + "nanomatch": "^1.2.1", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } }, "module-deps-sortable": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/module-deps-sortable/-/module-deps-sortable-4.0.6.tgz", "integrity": "sha1-ElGkuixEqS32mJvQKdoSGk8hCbA=", "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "browser-resolve": "^1.7.0", + "concat-stream": "~1.5.0", + "defined": "^1.0.0", + "detective": "^4.0.0", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.3", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + }, "dependencies": { "concat-stream": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz", "integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=", "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "~2.0.0", + "typedarray": "~0.0.5" + }, "dependencies": { "readable-stream": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } } } } @@ -2164,6 +3553,9 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, + "requires": { + "pify": "^2.0.0" + }, "dependencies": { "pify": { "version": "2.3.0", @@ -2183,13 +3575,22 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } }, "read-pkg-up": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } }, "string_decoder": { "version": "0.10.31", @@ -2207,31 +3608,65 @@ "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 + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } }, "yargs": { "version": "6.6.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^4.2.0" + }, "dependencies": { "find-up": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } }, "path-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } }, "pify": { "version": "2.3.0", @@ -2243,19 +3678,31 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } }, "read-pkg-up": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } }, "strip-bom": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } } } }, @@ -2263,7 +3710,10 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "dev": true + "dev": true, + "requires": { + "camelcase": "^3.0.0" + } } } }, @@ -2277,7 +3727,10 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", - "dev": true + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } }, "duplexer": { "version": "0.1.1", @@ -2290,6 +3743,9 @@ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", "dev": true, + "requires": { + "readable-stream": "~1.1.9" + }, "dependencies": { "isarray": { "version": "0.0.1", @@ -2301,7 +3757,13 @@ "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } }, "string_decoder": { "version": "0.10.31", @@ -2315,19 +3777,32 @@ "version": "3.5.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.1.tgz", "integrity": "sha512-j5goxHTwVED1Fpe5hh3q9R93Kip0Bg2KVAt4f8CEYM3UEwYcPSvWbXaUQOzdX/HtiNomipv+gU7ASQPDbV7pGQ==", - "dev": true + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } }, "duration": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/duration/-/duration-0.2.0.tgz", "integrity": "sha1-X5xN+q//ZV3phhEu/iXFl43YUUY=", - "dev": true + "dev": true, + "requires": { + "d": "~0.1.1", + "es5-ext": "~0.10.2" + } }, "ecc-jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "optional": true + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } }, "electron-to-chromium": { "version": "1.3.24", @@ -2339,7 +3814,16 @@ "version": "6.4.0", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", - "dev": true + "dev": true, + "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" + } }, "emoji-regex": { "version": "6.1.1", @@ -2351,60 +3835,100 @@ "version": "0.1.12", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "dev": true + "dev": true, + "requires": { + "iconv-lite": "~0.4.13" + } }, "end-of-stream": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", - "dev": true + "dev": true, + "requires": { + "once": "^1.4.0" + } }, "error": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz", "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=", - "dev": true + "dev": true, + "requires": { + "string-template": "~0.2.1", + "xtend": "~4.0.0" + } }, "error-ex": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=" + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "requires": { + "is-arrayish": "^0.2.1" + } }, "error-stack-parser": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-1.3.6.tgz", "integrity": "sha1-4Oc7k+QXE40c18C3RrGkoUhUwpI=", - "dev": true + "dev": true, + "requires": { + "stackframe": "^0.3.1" + } }, "es-abstract": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.9.0.tgz", "integrity": "sha512-kk3IJoKo7A3pWJc0OV8yZ/VEX2oSUytfekrJiqoxBlKJMFAJVJVpGdHClCCTdv+Fn2zHfpDHHIelMFhZVfef3Q==", - "dev": true + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } }, "es-to-primitive": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", - "dev": true + "dev": true, + "requires": { + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" + } }, "es5-ext": { "version": "0.10.30", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.30.tgz", "integrity": "sha1-cUGhaDZpfbq/qq7uQUlc4p9SyTk=", - "dev": true + "dev": true, + "requires": { + "es6-iterator": "2", + "es6-symbol": "~3.1" + } }, "es6-iterator": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.14", + "es6-symbol": "^3.1" + }, "dependencies": { "d": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true + "dev": true, + "requires": { + "es5-ext": "^0.10.9" + } } } }, @@ -2413,12 +3937,23 @@ "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + }, "dependencies": { "d": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true + "dev": true, + "requires": { + "es5-ext": "^0.10.9" + } } } }, @@ -2433,12 +3968,22 @@ "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" + }, "dependencies": { "d": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true + "dev": true, + "requires": { + "es5-ext": "^0.10.9" + } } } }, @@ -2447,12 +3992,19 @@ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + }, "dependencies": { "d": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true + "dev": true, + "requires": { + "es5-ext": "^0.10.9" + } } } }, @@ -2461,12 +4013,21 @@ "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + }, "dependencies": { "d": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true + "dev": true, + "requires": { + "es5-ext": "^0.10.9" + } } } }, @@ -2481,6 +4042,12 @@ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.3.3.tgz", "integrity": "sha1-8CQBb1qI4Eb9EgBQVek5gC5sXyM=", "dev": true, + "requires": { + "esprima": "~1.1.1", + "estraverse": "~1.5.0", + "esutils": "~1.0.0", + "source-map": "~0.1.33" + }, "dependencies": { "esutils": { "version": "1.0.0", @@ -2493,7 +4060,10 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", "dev": true, - "optional": true + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } } } }, @@ -2502,6 +4072,12 @@ "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "dev": true, + "requires": { + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, "dependencies": { "estraverse": { "version": "4.2.0", @@ -2516,6 +4092,41 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-2.13.1.tgz", "integrity": "sha1-5MyPoPAJ+4KaquI4VaKTYL4fbBE=", "dev": true, + "requires": { + "chalk": "^1.1.3", + "concat-stream": "^1.4.6", + "debug": "^2.1.1", + "doctrine": "^1.2.2", + "es6-map": "^0.1.3", + "escope": "^3.6.0", + "espree": "^3.1.6", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^1.1.1", + "glob": "^7.0.3", + "globals": "^9.2.0", + "ignore": "^3.1.2", + "imurmurhash": "^0.1.4", + "inquirer": "^0.12.0", + "is-my-json-valid": "^2.10.0", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.5.1", + "json-stable-stringify": "^1.0.0", + "levn": "^0.3.0", + "lodash": "^4.0.0", + "mkdirp": "^0.5.0", + "optionator": "^0.8.1", + "path-is-absolute": "^1.0.0", + "path-is-inside": "^1.0.1", + "pluralize": "^1.2.1", + "progress": "^1.1.8", + "require-uncached": "^1.0.2", + "shelljs": "^0.6.0", + "strip-json-comments": "~1.0.1", + "table": "^3.7.8", + "text-table": "~0.2.0", + "user-home": "^2.0.0" + }, "dependencies": { "ajv-keywords": { "version": "1.5.1", @@ -2533,13 +4144,20 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } }, "doctrine": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } }, "estraverse": { "version": "4.2.0", @@ -2551,13 +4169,32 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-1.3.1.tgz", "integrity": "sha1-RMYepgeuS+nBQC9B9EJwy/4zT/g=", - "dev": true + "dev": true, + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } }, "inquirer": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", - "dev": true + "dev": true, + "requires": { + "ansi-escapes": "^1.1.0", + "ansi-regex": "^2.0.0", + "chalk": "^1.0.0", + "cli-cursor": "^1.0.1", + "cli-width": "^2.0.0", + "figures": "^1.3.5", + "lodash": "^4.3.0", + "readline2": "^1.0.1", + "run-async": "^0.1.0", + "rx-lite": "^3.1.2", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" + } }, "is-fullwidth-code-point": { "version": "2.0.0", @@ -2587,13 +4224,20 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } }, "run-async": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", - "dev": true + "dev": true, + "requires": { + "once": "^1.3.0" + } }, "rx-lite": { "version": "3.1.2", @@ -2624,6 +4268,14 @@ "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", "dev": true, + "requires": { + "ajv": "^4.7.0", + "ajv-keywords": "^1.0.0", + "chalk": "^1.1.1", + "lodash": "^4.0.0", + "slice-ansi": "0.0.4", + "string-width": "^2.0.0" + }, "dependencies": { "ansi-regex": { "version": "3.0.0", @@ -2635,13 +4287,20 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } } } }, @@ -2649,7 +4308,10 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", - "dev": true + "dev": true, + "requires": { + "os-homedir": "^1.0.0" + } } } }, @@ -2663,13 +4325,23 @@ "version": "7.4.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.4.0.tgz", "integrity": "sha512-tvjU9u3VqmW2vVuYnE8Qptq+6ji4JltjOjJ9u7VAOxVYkUkyBZWRvNYKbDv5fN+L6wiA+4we9+qQahZ0m63XEA==", - "dev": true + "dev": true, + "requires": { + "doctrine": "^2.0.0", + "has": "^1.0.1", + "jsx-ast-utils": "^2.0.0", + "prop-types": "^15.5.10" + } }, "eslint-scope": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, "dependencies": { "estraverse": { "version": "4.2.0", @@ -2683,7 +4355,11 @@ "version": "3.5.1", "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.1.tgz", "integrity": "sha1-DJiLirRttTEAoZVK5LqZXd0n2H4=", - "dev": true + "dev": true, + "requires": { + "acorn": "^5.1.1", + "acorn-jsx": "^3.0.0" + } }, "esprima": { "version": "1.1.1", @@ -2696,6 +4372,9 @@ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", "dev": true, + "requires": { + "estraverse": "^4.0.0" + }, "dependencies": { "estraverse": { "version": "4.2.0", @@ -2710,6 +4389,10 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", "dev": true, + "requires": { + "estraverse": "^4.1.0", + "object-assign": "^4.0.1" + }, "dependencies": { "estraverse": { "version": "4.2.0", @@ -2736,12 +4419,19 @@ "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + }, "dependencies": { "d": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true + "dev": true, + "requires": { + "es5-ext": "^0.10.9" + } } } }, @@ -2755,13 +4445,26 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } }, "execa": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } }, "exit-hook": { "version": "1.1.1", @@ -2773,13 +4476,19 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } }, "expand-range": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true + "dev": true, + "requires": { + "fill-range": "^2.1.0" + } }, "extend": { "version": "3.0.1", @@ -2790,19 +4499,30 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } }, "external-editor": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.0.5.tgz", "integrity": "sha512-Msjo64WT5W+NhOpQXh0nOHm+n0RfU1QUwDnKYvJ8dEJ8zlwLrqXNTv5mSUTJpepf41PDJGyhueTw2vNZW+Fr/w==", - "dev": true + "dev": true, + "requires": { + "iconv-lite": "^0.4.17", + "jschardet": "^1.4.2", + "tmp": "^0.0.33" + } }, "extglob": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } }, "extsprintf": { "version": "1.3.0", @@ -2814,6 +4534,12 @@ "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz", "integrity": "sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw=", "dev": true, + "requires": { + "acorn": "^5.0.0", + "foreach": "^2.0.5", + "isarray": "0.0.1", + "object-keys": "^1.0.6" + }, "dependencies": { "isarray": { "version": "0.0.1", @@ -2840,6 +4566,15 @@ "resolved": "https://registry.npmjs.org/faucet/-/faucet-0.0.1.tgz", "integrity": "sha1-WX3PHSGJosBiMhtZHo8VHtIDnZw=", "dev": true, + "requires": { + "defined": "0.0.0", + "duplexer": "~0.1.1", + "minimist": "0.0.5", + "sprintf": "~0.1.3", + "tap-parser": "~0.4.0", + "tape": "~2.3.2", + "through2": "~0.2.3" + }, "dependencies": { "defined": { "version": "0.0.0", @@ -2869,7 +4604,13 @@ "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } }, "string_decoder": { "version": "0.10.31", @@ -2881,19 +4622,34 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/tape/-/tape-2.3.3.tgz", "integrity": "sha1-Lnzgox3wn41oUWZKcYQuDKUFevc=", - "dev": true + "dev": true, + "requires": { + "deep-equal": "~0.1.0", + "defined": "~0.0.0", + "inherits": "~2.0.1", + "jsonify": "~0.0.0", + "resumer": "~0.0.0", + "through": "~2.3.4" + } }, "through2": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz", "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", - "dev": true + "dev": true, + "requires": { + "readable-stream": "~1.1.9", + "xtend": "~2.1.1" + } }, "xtend": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "dev": true + "dev": true, + "requires": { + "object-keys": "~0.4.0" + } } } }, @@ -2901,13 +4657,25 @@ "version": "0.10.0", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } }, "fbjs": { "version": "0.8.16", "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", "dev": true, + "requires": { + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.9" + }, "dependencies": { "core-js": { "version": "1.2.7", @@ -2921,13 +4689,21 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } }, "file-entry-cache": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true + "dev": true, + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } }, "filename-regex": { "version": "2.0.1", @@ -2939,12 +4715,23 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } }, "find-up": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=" + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } }, "first-chunk-stream": { "version": "1.0.0", @@ -2956,7 +4743,13 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", - "dev": true + "dev": true, + "requires": { + "circular-json": "^0.3.1", + "del": "^2.0.2", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" + } }, "flatten": { "version": "1.0.2", @@ -2968,7 +4761,10 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.2.tgz", "integrity": "sha1-LEBFC5NI6X8oEyJZO6lnBLmr1NQ=", - "dev": true + "dev": true, + "requires": { + "is-function": "~1.0.0" + } }, "for-in": { "version": "1.0.2", @@ -2980,7 +4776,10 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true + "dev": true, + "requires": { + "for-in": "^1.0.1" + } }, "foreach": { "version": "2.0.5", @@ -2996,19 +4795,30 @@ "form-data": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=" + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + } }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } }, "fs-access": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", - "dev": true + "dev": true, + "requires": { + "null-check": "^1.0.0" + } }, "fs-readdir-recursive": { "version": "1.0.0", @@ -3027,6 +4837,10 @@ "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", "dev": true, "optional": true, + "requires": { + "nan": "^2.3.0", + "node-pre-gyp": "^0.6.36" + }, "dependencies": { "abbrev": { "version": "1.1.0", @@ -3038,7 +4852,11 @@ "version": "4.11.8", "bundled": true, "dev": true, - "optional": true + "optional": true, + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } }, "ansi-regex": { "version": "2.1.1", @@ -3055,7 +4873,11 @@ "version": "1.1.4", "bundled": true, "dev": true, - "optional": true + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } }, "asn1": { "version": "0.2.3", @@ -3096,22 +4918,35 @@ "version": "1.0.1", "bundled": true, "dev": true, - "optional": true + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } }, "block-stream": { "version": "0.0.9", "bundled": true, - "dev": true + "dev": true, + "requires": { + "inherits": "~2.0.0" + } }, "boom": { "version": "2.10.1", "bundled": true, - "dev": true + "dev": true, + "requires": { + "hoek": "2.x.x" + } }, "brace-expansion": { "version": "1.1.7", "bundled": true, - "dev": true + "dev": true, + "requires": { + "balanced-match": "^0.4.1", + "concat-map": "0.0.1" + } }, "buffer-shims": { "version": "1.0.0", @@ -3138,7 +4973,10 @@ "combined-stream": { "version": "1.0.5", "bundled": true, - "dev": true + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } }, "concat-map": { "version": "0.0.1", @@ -3159,13 +4997,19 @@ "version": "2.0.5", "bundled": true, "dev": true, - "optional": true + "optional": true, + "requires": { + "boom": "2.x.x" + } }, "dashdash": { "version": "1.14.1", "bundled": true, "dev": true, "optional": true, + "requires": { + "assert-plus": "^1.0.0" + }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -3179,7 +5023,10 @@ "version": "2.6.8", "bundled": true, "dev": true, - "optional": true + "optional": true, + "requires": { + "ms": "2.0.0" + } }, "deep-extend": { "version": "0.4.2", @@ -3202,7 +5049,10 @@ "version": "0.1.1", "bundled": true, "dev": true, - "optional": true + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } }, "extend": { "version": "3.0.1", @@ -3225,7 +5075,12 @@ "version": "2.1.4", "bundled": true, "dev": true, - "optional": true + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + } }, "fs.realpath": { "version": "1.0.0", @@ -3235,25 +5090,49 @@ "fstream": { "version": "1.0.11", "bundled": true, - "dev": true + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } }, "fstream-ignore": { "version": "1.0.5", "bundled": true, "dev": true, - "optional": true + "optional": true, + "requires": { + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" + } }, "gauge": { "version": "2.7.4", "bundled": true, "dev": true, - "optional": true + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } }, "getpass": { "version": "0.1.7", "bundled": true, "dev": true, "optional": true, + "requires": { + "assert-plus": "^1.0.0" + }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -3266,7 +5145,15 @@ "glob": { "version": "7.1.2", "bundled": true, - "dev": true + "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.11", @@ -3283,7 +5170,11 @@ "version": "4.2.1", "bundled": true, "dev": true, - "optional": true + "optional": true, + "requires": { + "ajv": "^4.9.1", + "har-schema": "^1.0.5" + } }, "has-unicode": { "version": "2.0.1", @@ -3295,7 +5186,13 @@ "version": "3.1.3", "bundled": true, "dev": true, - "optional": true + "optional": true, + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } }, "hoek": { "version": "2.16.3", @@ -3306,12 +5203,21 @@ "version": "1.1.1", "bundled": true, "dev": true, - "optional": true + "optional": true, + "requires": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } }, "inflight": { "version": "1.0.6", "bundled": true, - "dev": true + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } }, "inherits": { "version": "2.0.3", @@ -3327,7 +5233,10 @@ "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } }, "is-typedarray": { "version": "1.0.0", @@ -3350,7 +5259,10 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } }, "jsbn": { "version": "0.1.1", @@ -3368,7 +5280,10 @@ "version": "1.0.1", "bundled": true, "dev": true, - "optional": true + "optional": true, + "requires": { + "jsonify": "~0.0.0" + } }, "json-stringify-safe": { "version": "5.0.1", @@ -3387,6 +5302,12 @@ "bundled": true, "dev": true, "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -3404,12 +5325,18 @@ "mime-types": { "version": "2.1.15", "bundled": true, - "dev": true + "dev": true, + "requires": { + "mime-db": "~1.27.0" + } }, "minimatch": { "version": "3.0.4", "bundled": true, - "dev": true + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } }, "minimist": { "version": "0.0.8", @@ -3419,7 +5346,10 @@ "mkdirp": { "version": "0.5.1", "bundled": true, - "dev": true + "dev": true, + "requires": { + "minimist": "0.0.8" + } }, "ms": { "version": "2.0.0", @@ -3431,19 +5361,40 @@ "version": "0.6.36", "bundled": true, "dev": true, - "optional": true + "optional": true, + "requires": { + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "request": "^2.81.0", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^2.2.1", + "tar-pack": "^3.4.0" + } }, "nopt": { "version": "4.0.1", "bundled": true, "dev": true, - "optional": true + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } }, "npmlog": { "version": "4.1.0", "bundled": true, "dev": true, - "optional": true + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } }, "number-is-nan": { "version": "1.0.1", @@ -3465,7 +5416,10 @@ "once": { "version": "1.4.0", "bundled": true, - "dev": true + "dev": true, + "requires": { + "wrappy": "1" + } }, "os-homedir": { "version": "1.0.2", @@ -3483,7 +5437,11 @@ "version": "0.1.4", "bundled": true, "dev": true, - "optional": true + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } }, "path-is-absolute": { "version": "1.0.1", @@ -3518,6 +5476,12 @@ "bundled": true, "dev": true, "optional": true, + "requires": { + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, "dependencies": { "minimist": { "version": "1.2.0", @@ -3530,18 +5494,54 @@ "readable-stream": { "version": "2.2.9", "bundled": true, - "dev": true + "dev": true, + "requires": { + "buffer-shims": "~1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~1.0.0", + "util-deprecate": "~1.0.1" + } }, "request": { "version": "2.81.0", "bundled": true, "dev": true, - "optional": true + "optional": true, + "requires": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" + } }, "rimraf": { "version": "2.6.1", "bundled": true, - "dev": true + "dev": true, + "requires": { + "glob": "^7.0.5" + } }, "safe-buffer": { "version": "5.0.1", @@ -3570,13 +5570,27 @@ "version": "1.0.9", "bundled": true, "dev": true, - "optional": true + "optional": true, + "requires": { + "hoek": "2.x.x" + } }, "sshpk": { "version": "1.13.0", "bundled": true, "dev": true, "optional": true, + "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", + "jodid25519": "^1.0.0", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" + }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -3586,15 +5600,23 @@ } } }, - "string_decoder": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, "string-width": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } }, "stringstream": { "version": "0.0.5", @@ -3605,7 +5627,10 @@ "strip-ansi": { "version": "3.0.1", "bundled": true, - "dev": true + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } }, "strip-json-comments": { "version": "2.0.1", @@ -3616,25 +5641,46 @@ "tar": { "version": "2.2.1", "bundled": true, - "dev": true + "dev": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } }, "tar-pack": { "version": "3.4.0", "bundled": true, "dev": true, - "optional": true + "optional": true, + "requires": { + "debug": "^2.2.0", + "fstream": "^1.0.10", + "fstream-ignore": "^1.0.5", + "once": "^1.3.3", + "readable-stream": "^2.1.4", + "rimraf": "^2.5.1", + "tar": "^2.2.1", + "uid-number": "^0.0.6" + } }, "tough-cookie": { "version": "2.3.2", "bundled": true, "dev": true, - "optional": true + "optional": true, + "requires": { + "punycode": "^1.4.1" + } }, "tunnel-agent": { "version": "0.6.0", "bundled": true, "dev": true, - "optional": true + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } }, "tweetnacl": { "version": "0.14.5", @@ -3663,13 +5709,19 @@ "version": "1.3.6", "bundled": true, "dev": true, - "optional": true + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } }, "wide-align": { "version": "1.1.2", "bundled": true, "dev": true, - "optional": true + "optional": true, + "requires": { + "string-width": "^1.0.2" + } }, "wrappy": { "version": "1.0.2", @@ -3681,12 +5733,23 @@ "fstream": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=" + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } }, "fstream-ignore": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", - "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=" + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", + "requires": { + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" + } }, "function-bind": { "version": "1.1.1", @@ -3703,7 +5766,17 @@ "gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=" + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } }, "generate-function": { "version": "2.0.0", @@ -3715,7 +5788,10 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true + "dev": true, + "requires": { + "is-property": "^1.0.0" + } }, "get-caller-file": { "version": "1.0.2", @@ -3732,7 +5808,14 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", - "dev": true + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "meow": "^3.3.0", + "normalize-package-data": "^2.3.0", + "parse-github-repo-url": "^1.3.0", + "through2": "^2.0.0" + } }, "get-port": { "version": "3.2.0", @@ -3762,6 +5845,9 @@ "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" + }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -3780,78 +5866,142 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.2.0.tgz", "integrity": "sha1-DzqL/ZmuDy2LkiTViJKXXppS0Dw=", - "dev": true + "dev": true, + "requires": { + "dargs": "^4.0.1", + "lodash.template": "^4.0.2", + "meow": "^3.3.0", + "split2": "^2.0.0", + "through2": "^2.0.0" + } }, "git-remote-origin-url": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", - "dev": true + "dev": true, + "requires": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + } }, "git-semver-tags": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-1.2.2.tgz", "integrity": "sha512-fhINopzKBQ8m6YlQt7gPf6T6hFnTF84O7U+8kYJmfjjKk7gbmKGj+BLcKNWi+japPbBwCeXXnfKwThpJpR9ZnQ==", - "dev": true + "dev": true, + "requires": { + "meow": "^3.3.0", + "semver": "^5.0.1" + } }, "git-up": { "version": "2.0.9", "resolved": "https://registry.npmjs.org/git-up/-/git-up-2.0.9.tgz", "integrity": "sha1-IZv9J8gtrurYSVvrOG3Bjq5jY20=", - "dev": true + "dev": true, + "requires": { + "is-ssh": "^1.3.0", + "parse-url": "^1.3.0" + } }, "git-url-parse": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-6.2.2.tgz", "integrity": "sha1-vkkCThS4SHVTQ2tFcri0OVMvqHE=", - "dev": true + "dev": true, + "requires": { + "git-up": "^2.0.0" + } }, "gitconfiglocal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", - "dev": true + "dev": true, + "requires": { + "ini": "^1.3.2" + } }, "github-slugger": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.2.0.tgz", "integrity": "sha512-wIaa75k1vZhyPm9yWrD08A5Xnx/V+RmzGrpjQuLemGKSb77Qukiaei58Bogrl/LZSADDfPzKJX8jhLs4CRTl7Q==", - "dev": true + "dev": true, + "requires": { + "emoji-regex": ">=6.0.0 <=6.1.1" + } }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==" + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "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" + } }, "glob-base": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } }, "glob-parent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } }, "glob-stream": { "version": "5.3.5", "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", "dev": true, + "requires": { + "extend": "^3.0.0", + "glob": "^5.0.3", + "glob-parent": "^3.0.0", + "micromatch": "^2.3.7", + "ordered-read-streams": "^0.3.0", + "through2": "^0.6.0", + "to-absolute-glob": "^0.1.1", + "unique-stream": "^2.0.2" + }, "dependencies": { "glob": { "version": "5.0.15", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } }, "is-extglob": { "version": "2.1.1", @@ -3863,7 +6013,10 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } }, "isarray": { "version": "0.0.1", @@ -3875,7 +6028,13 @@ "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } }, "string_decoder": { "version": "0.10.31", @@ -3887,7 +6046,11 @@ "version": "0.6.5", "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true + "dev": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } } } }, @@ -3907,7 +6070,15 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } }, "graceful-fs": { "version": "4.1.11", @@ -3919,6 +6090,13 @@ "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", "dev": true, + "requires": { + "convert-source-map": "^1.1.1", + "graceful-fs": "^4.1.2", + "strip-bom": "^2.0.0", + "through2": "^2.0.0", + "vinyl": "^1.0.0" + }, "dependencies": { "clone-stats": { "version": "0.0.1", @@ -3936,7 +6114,12 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true + "dev": true, + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } } } }, @@ -3945,12 +6128,21 @@ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", "dev": true, + "requires": { + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" + }, "dependencies": { "source-map": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } } } }, @@ -3962,19 +6154,29 @@ "har-validator": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=" + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "requires": { + "ajv": "^4.9.1", + "har-schema": "^1.0.5" + } }, "has": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", - "dev": true + "dev": true, + "requires": { + "function-bind": "^1.0.2" + } }, "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } }, "has-flag": { "version": "2.0.0", @@ -3992,6 +6194,11 @@ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, "dependencies": { "isobject": { "version": "3.0.1", @@ -4006,18 +6213,28 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, "dependencies": { "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } } } }, @@ -4025,7 +6242,10 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } } } }, @@ -4033,13 +6253,20 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", - "dev": true + "dev": true, + "requires": { + "inherits": "^2.0.1" + } }, "hash.js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "dev": true + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } }, "hast-util-is-element": { "version": "1.0.0", @@ -4051,13 +6278,29 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-1.1.2.tgz", "integrity": "sha1-0QvWdXoh5ZwTq8iuNTDdO219Z54=", - "dev": true + "dev": true, + "requires": { + "xtend": "^4.0.1" + } }, "hast-util-to-html": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-3.1.0.tgz", "integrity": "sha1-iCyZhJ5AEw6ZHAQuRW1FPZXDbP8=", - "dev": true + "dev": true, + "requires": { + "ccount": "^1.0.0", + "comma-separated-tokens": "^1.0.1", + "hast-util-is-element": "^1.0.0", + "hast-util-whitespace": "^1.0.0", + "html-void-elements": "^1.0.0", + "kebab-case": "^1.0.0", + "property-information": "^3.1.0", + "space-separated-tokens": "^1.0.0", + "stringify-entities": "^1.0.1", + "unist-util-is": "^2.0.0", + "xtend": "^4.0.1" + } }, "hast-util-whitespace": { "version": "1.0.0", @@ -4068,7 +6311,13 @@ "hawk": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=" + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } }, "highlight.js": { "version": "9.12.0", @@ -4080,7 +6329,12 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } }, "hoek": { "version": "2.16.3", @@ -4091,7 +6345,11 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } }, "hosted-git-info": { "version": "2.5.0", @@ -4125,7 +6383,12 @@ "http-signature": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=" + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "requires": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } }, "https-browserify": { "version": "1.0.0", @@ -4161,7 +6424,10 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true + "dev": true, + "requires": { + "repeating": "^2.0.0" + } }, "indexes-of": { "version": "1.0.1", @@ -4178,7 +6444,11 @@ "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=" + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } }, "inherits": { "version": "2.0.3", @@ -4194,13 +6464,32 @@ "version": "0.6.2", "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", - "dev": true + "dev": true, + "requires": { + "source-map": "~0.5.3" + } }, "inquirer": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + }, "dependencies": { "ansi-regex": { "version": "3.0.0", @@ -4212,19 +6501,30 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } }, "chalk": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", - "dev": true + "dev": true, + "requires": { + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" + } }, "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } }, "is-fullwidth-code-point": { "version": "2.0.0", @@ -4236,19 +6536,29 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } }, "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 + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } } } }, @@ -4257,18 +6567,41 @@ "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.0.1.tgz", "integrity": "sha1-wDv04BywhtW15azorQr+eInWOMM=", "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "combine-source-map": "~0.7.1", + "concat-stream": "~1.5.1", + "is-buffer": "^1.1.0", + "lexical-scope": "^1.2.0", + "process": "~0.11.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + }, "dependencies": { "concat-stream": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz", "integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=", - "dev": true + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "~2.0.0", + "typedarray": "~0.0.5" + } }, "readable-stream": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } }, "string_decoder": { "version": "0.10.31", @@ -4288,7 +6621,10 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", - "dev": true + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } }, "invert-kv": { "version": "1.0.0", @@ -4299,7 +6635,11 @@ "version": "0.2.6", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", - "dev": true + "dev": true, + "requires": { + "is-relative": "^0.2.1", + "is-windows": "^0.2.0" + } }, "is-absolute-url": { "version": "2.1.0", @@ -4311,7 +6651,10 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } }, "is-alphabetical": { "version": "1.0.1", @@ -4329,7 +6672,11 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.1.tgz", "integrity": "sha1-37SqTRCF4zvbYcLe6cgOnGwZ9Ts=", - "dev": true + "dev": true, + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } }, "is-arrayish": { "version": "0.2.1", @@ -4340,7 +6687,10 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } }, "is-buffer": { "version": "1.1.5", @@ -4351,7 +6701,10 @@ "is-builtin-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=" + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "requires": { + "builtin-modules": "^1.0.0" + } }, "is-callable": { "version": "1.1.3", @@ -4363,7 +6716,10 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } }, "is-date-object": { "version": "1.0.1", @@ -4382,6 +6738,11 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.1.tgz", "integrity": "sha512-G3fFVFTqfaqu7r4YuSBHKBAuOaLz8Sy7ekklUpFEliaLMP1Y2ZjoN9jS62YWCAPQrQpMUQSitRlrzibbuCZjdA==", "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, "dependencies": { "kind-of": { "version": "5.0.2", @@ -4401,7 +6762,10 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } }, "is-extendable": { "version": "0.1.1", @@ -4419,12 +6783,18 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=" + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } }, "is-function": { "version": "1.0.1", @@ -4442,7 +6812,10 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } }, "is-hexadecimal": { "version": "1.0.1", @@ -4454,13 +6827,22 @@ "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", - "dev": true + "dev": true, + "requires": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" + } }, "is-number": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } }, "is-obj": { "version": "1.0.1", @@ -4473,12 +6855,18 @@ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-1.0.0.tgz", "integrity": "sha1-O4qTLrAos3dcObsJ6RdnrM22kIg=", "dev": true, + "requires": { + "is-number": "^3.0.0" + }, "dependencies": { "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } } } }, @@ -4492,13 +6880,19 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", - "dev": true + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } }, "is-path-inside": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", - "dev": true + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } }, "is-plain-obj": { "version": "1.1.0", @@ -4511,6 +6905,9 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, + "requires": { + "isobject": "^3.0.1" + }, "dependencies": { "isobject": { "version": "3.0.1", @@ -4548,25 +6945,37 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true + "dev": true, + "requires": { + "has": "^1.0.1" + } }, "is-relative": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", - "dev": true + "dev": true, + "requires": { + "is-unc-path": "^0.1.1" + } }, "is-resolvable": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", - "dev": true + "dev": true, + "requires": { + "tryit": "^1.0.1" + } }, "is-ssh": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.0.tgz", "integrity": "sha1-6+oRaaJhTaOSpjdANmw84EnY3/Y=", - "dev": true + "dev": true, + "requires": { + "protocols": "^1.1.0" + } }, "is-stream": { "version": "1.1.0", @@ -4584,7 +6993,10 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", - "dev": true + "dev": true, + "requires": { + "html-comment-regex": "^1.1.0" + } }, "is-symbol": { "version": "1.0.1", @@ -4596,7 +7008,10 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", - "dev": true + "dev": true, + "requires": { + "text-extensions": "^1.0.0" + } }, "is-typedarray": { "version": "1.0.0", @@ -4607,7 +7022,10 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", - "dev": true + "dev": true, + "requires": { + "unc-path-regex": "^0.1.0" + } }, "is-utf8": { "version": "0.2.1", @@ -4652,13 +7070,20 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true + "dev": true, + "requires": { + "isarray": "1.0.0" + } }, "isomorphic-fetch": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "dev": true + "dev": true, + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } }, "isstream": { "version": "0.1.2", @@ -4682,6 +7107,10 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^2.6.0" + }, "dependencies": { "esprima": { "version": "2.7.3", @@ -4723,7 +7152,10 @@ "json-stable-stringify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=" + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "requires": { + "jsonify": "~0.0.0" + } }, "json-stringify-safe": { "version": "5.0.1", @@ -4753,16 +7185,16 @@ "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", "dev": true }, - "JSONStream": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz", - "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=", - "dev": true - }, "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" + }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -4775,7 +7207,10 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", - "dev": true + "dev": true, + "requires": { + "array-includes": "^3.0.3" + } }, "kebab-case": { "version": "1.0.0", @@ -4787,13 +7222,21 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } }, "labeled-stream-splicer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz", "integrity": "sha1-pS4dE4AkwAuGscDJH2d5GLiuClk=", "dev": true, + "requires": { + "inherits": "^2.0.1", + "isarray": "~0.0.1", + "stream-splicer": "^2.0.0" + }, "dependencies": { "isarray": { "version": "0.0.1", @@ -4813,24 +7256,37 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + } }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=" + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } }, "lexical-scope": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz", "integrity": "sha1-/Ope3HBKSzqHls3KQZw6CvryLfQ=", - "dev": true + "dev": true, + "requires": { + "astw": "^2.0.0" + } }, "livereload-js": { "version": "2.2.2", @@ -4841,13 +7297,24 @@ "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=" + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, "dependencies": { "path-exists": { "version": "3.0.0", @@ -4915,13 +7382,20 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", - "dev": true + "dev": true, + "requires": { + "lodash._reinterpolate": "~3.0.0", + "lodash.templatesettings": "^4.0.0" + } }, "lodash.templatesettings": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", - "dev": true + "dev": true, + "requires": { + "lodash._reinterpolate": "~3.0.0" + } }, "lodash.uniq": { "version": "4.5.0", @@ -4945,13 +7419,20 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "dev": true + "dev": true, + "requires": { + "js-tokens": "^3.0.0" + } }, "loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } }, "lower-case": { "version": "1.1.4", @@ -4963,7 +7444,11 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", - "dev": true + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } }, "macaddress": { "version": "0.2.8", @@ -4987,7 +7472,10 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } }, "markdown-escapes": { "version": "1.0.1", @@ -5012,12 +7500,20 @@ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + }, "dependencies": { "hash-base": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } } } }, @@ -5025,25 +7521,48 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.1.tgz", "integrity": "sha1-zbX4TitqLTEU3zO9BdnLMuPECDo=", - "dev": true + "dev": true, + "requires": { + "unist-util-modify-children": "^1.0.0", + "unist-util-visit": "^1.1.0" + } }, "mdast-util-definitions": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-1.2.2.tgz", "integrity": "sha512-9NloPSwaB9f1PKcGqaScfqRf6zKOEjTIXVIbPOmgWI/JKxznlgVXC5C+8qgl3AjYg2vJBRgLYfLICaNiac89iA==", - "dev": true + "dev": true, + "requires": { + "unist-util-visit": "^1.0.0" + } }, "mdast-util-inject": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mdast-util-inject/-/mdast-util-inject-1.1.0.tgz", "integrity": "sha1-2wa4tYW+lZotzS+H9HK6m3VvNnU=", - "dev": true + "dev": true, + "requires": { + "mdast-util-to-string": "^1.0.0" + } }, "mdast-util-to-hast": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-2.4.3.tgz", "integrity": "sha1-zXh0yYMmJ/E0/TdWFjhz+T8rHeM=", - "dev": true + "dev": true, + "requires": { + "collapse-white-space": "^1.0.0", + "detab": "^2.0.0", + "mdast-util-definitions": "^1.2.0", + "mdurl": "^1.0.1", + "trim": "0.0.1", + "trim-lines": "^1.0.0", + "unist-builder": "^1.0.1", + "unist-util-generated": "^1.1.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^1.1.0", + "xtend": "^4.0.1" + } }, "mdast-util-to-string": { "version": "1.0.4", @@ -5055,7 +7574,12 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-toc/-/mdast-util-toc-2.0.1.tgz", "integrity": "sha1-sdLLI7+wH4Evp7Vb/+iwqL7fbyE=", - "dev": true + "dev": true, + "requires": { + "github-slugger": "^1.1.1", + "mdast-util-to-string": "^1.0.2", + "unist-util-visit": "^1.1.0" + } }, "mdurl": { "version": "1.0.1", @@ -5067,13 +7591,28 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } }, "meow": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, "dependencies": { "minimist": { "version": "1.2.0", @@ -5087,19 +7626,41 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } }, "micromatch": { "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } }, "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } }, "mime": { "version": "1.4.1", @@ -5115,7 +7676,10 @@ "mime-types": { "version": "2.1.17", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=" + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "requires": { + "mime-db": "~1.30.0" + } }, "mimic-fn": { "version": "1.1.0", @@ -5128,12 +7692,29 @@ "resolved": "https://registry.npmjs.org/minifyify/-/minifyify-7.3.5.tgz", "integrity": "sha1-n0uwyGklAkeNjuhbEL1ySFcGKa4=", "dev": true, + "requires": { + "concat-stream": "^1.4.7", + "convert-source-map": "^1.0.0", + "lodash.assign": "^4.0.0", + "lodash.bind": "^4.0.0", + "lodash.defaults": "^4.0.0", + "lodash.foreach": "^4.0.0", + "mkdirp": "^0.5.0", + "source-map": "^0.5.3", + "through": "^2.3.6", + "tmp": "0.0.28", + "transform-filter": "^0.1.1", + "uglify-js": "^2.6.1" + }, "dependencies": { "tmp": { "version": "0.0.28", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.28.tgz", "integrity": "sha1-Fyc1t/YU6nrzlmT6hM8N5OUV0SA=", - "dev": true + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } } } }, @@ -5152,7 +7733,10 @@ "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==" + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } }, "minimist": { "version": "0.0.8", @@ -5163,12 +7747,19 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.2.0.tgz", "integrity": "sha1-0CuMb4ttS49ZgtP9AJxJGYUcP+I=", - "dev": true + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^0.1.1" + } }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=" + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } }, "modify-values": { "version": "1.0.0", @@ -5181,18 +7772,48 @@ "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-4.1.1.tgz", "integrity": "sha1-IyFYM/HaE/1gbMuAh7RIUty4If0=", "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "browser-resolve": "^1.7.0", + "cached-path-relative": "^1.0.0", + "concat-stream": "~1.5.0", + "defined": "^1.0.0", + "detective": "^4.0.0", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.3", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + }, "dependencies": { "concat-stream": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz", "integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=", "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "~2.0.0", + "typedarray": "~0.0.5" + }, "dependencies": { "readable-stream": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } } } }, @@ -5200,7 +7821,10 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } }, "string_decoder": { "version": "0.10.31", @@ -5219,7 +7843,13 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", - "dev": true + "dev": true, + "requires": { + "array-differ": "^1.0.0", + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "minimatch": "^3.0.0" + } }, "mute-stream": { "version": "0.0.7", @@ -5228,15 +7858,28 @@ "dev": true }, "nan": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", - "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=" + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", + "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==" }, "nanomatch": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.3.tgz", "integrity": "sha512-HqDMQWJlwpXbfKDpAnkc6AJQh5PFqVlrjYbruDjYVAS+05TQUb1qhIde4G9jMzHbs/u6bgEok1jMAV4yJzoh+w==", "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "is-odd": "^1.0.0", + "kind-of": "^5.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, "dependencies": { "arr-diff": { "version": "4.0.0", @@ -5268,45 +7911,85 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dev": true + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } }, "node-cmake": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/node-cmake/-/node-cmake-2.3.2.tgz", - "integrity": "sha1-4PvFSxFAWwdwXk1tQYZa6VrSidA=" + "integrity": "sha1-4PvFSxFAWwdwXk1tQYZa6VrSidA=", + "requires": { + "nan": "*", + "which": "^1.2.14", + "yargs": "^7.0.2" + } }, "node-fetch": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "dev": true + "dev": true, + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } }, "node-pre-gyp": { "version": "0.6.38", "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.38.tgz", - "integrity": "sha1-6Sog+DQWQVu0CG9tH7eLPac9ET0=" + "integrity": "sha1-6Sog+DQWQVu0CG9tH7eLPac9ET0=", + "requires": { + "hawk": "3.1.3", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "request": "2.81.0", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^2.2.1", + "tar-pack": "^3.4.0" + } }, "node-timeout": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/node-timeout/-/node-timeout-0.0.4.tgz", "integrity": "sha1-ASw2SKvjCOB2aPB4B/h5loL9PJc=", - "dev": true + "dev": true, + "requires": { + "options": "0.0.6" + } }, "nopt": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=" + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==" + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } }, "normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } }, "normalize-range": { "version": "0.1.2", @@ -5318,24 +8001,42 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true + "dev": true, + "requires": { + "path-key": "^2.0.0" + } }, "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==" + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } }, "nth-check": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", - "dev": true + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } }, "null-check": { "version": "1.0.0", @@ -5369,18 +8070,31 @@ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, "dependencies": { "kind-of": { "version": "5.0.2", @@ -5409,6 +8123,9 @@ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, + "requires": { + "isobject": "^3.0.0" + }, "dependencies": { "isobject": { "version": "3.0.1", @@ -5422,13 +8139,20 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, + "requires": { + "isobject": "^3.0.1" + }, "dependencies": { "isobject": { "version": "3.0.1", @@ -5441,19 +8165,29 @@ "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=" + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } }, "onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, "dependencies": { "wordwrap": { "version": "0.0.3", @@ -5467,7 +8201,15 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } }, "options": { "version": "0.0.6", @@ -5479,7 +8221,11 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", - "dev": true + "dev": true, + "requires": { + "is-stream": "^1.0.1", + "readable-stream": "^2.0.1" + } }, "os-browserify": { "version": "0.1.2", @@ -5495,7 +8241,10 @@ "os-locale": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=" + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } }, "os-tmpdir": { "version": "1.0.2", @@ -5505,13 +8254,22 @@ "osenv": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", - "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=" + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } }, "output-file-sync": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", - "dev": true + "dev": true, + "requires": { + "graceful-fs": "^4.1.4", + "mkdirp": "^0.5.1", + "object-assign": "^4.1.0" + } }, "p-finally": { "version": "1.0.0", @@ -5529,7 +8287,10 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } }, "pako": { "version": "0.2.9", @@ -5541,31 +8302,57 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", - "dev": true + "dev": true, + "requires": { + "path-platform": "~0.11.15" + } }, "parse-asn1": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", - "dev": true + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" + } }, "parse-entities": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.1.1.tgz", "integrity": "sha1-gRLYhHExnyerrk1klksSL+ThuJA=", - "dev": true + "dev": true, + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } }, "parse-filepath": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.1.tgz", "integrity": "sha1-FZ1hVdQ5BNFsEO9piRHaHpGWm3M=", - "dev": true + "dev": true, + "requires": { + "is-absolute": "^0.2.3", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } }, "parse-git-config": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-0.2.0.tgz", "integrity": "sha1-Jygz/dFf6hRvt10zbSNrljtv9wY=", - "dev": true + "dev": true, + "requires": { + "ini": "^1.3.3" + } }, "parse-github-repo-url": { "version": "1.4.1", @@ -5577,18 +8364,31 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + } }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=" + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } }, "parse-url": { "version": "1.3.11", "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-1.3.11.tgz", "integrity": "sha1-V8FUKKuKiSsfQ4aWRccR0OFEtVQ=", - "dev": true + "dev": true, + "requires": { + "is-ssh": "^1.3.0", + "protocols": "^1.4.0" + } }, "pascalcase": { "version": "0.1.1", @@ -5611,7 +8411,10 @@ "path-exists": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=" + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } }, "path-is-absolute": { "version": "1.0.1", @@ -5646,7 +8449,10 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true + "dev": true, + "requires": { + "path-root-regex": "^0.1.0" + } }, "path-root-regex": { "version": "0.1.2", @@ -5657,13 +8463,25 @@ "path-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=" + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } }, "pbkdf2": { "version": "3.0.14", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", - "dev": true + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } }, "performance-now": { "version": "0.2.0", @@ -5683,7 +8501,10 @@ "pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=" + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } }, "pluralize": { "version": "7.0.0", @@ -5708,6 +8529,12 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, "dependencies": { "has-flag": { "version": "1.0.0", @@ -5719,7 +8546,10 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } } } }, @@ -5727,73 +8557,122 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", - "dev": true + "dev": true, + "requires": { + "postcss": "^5.0.2", + "postcss-message-helpers": "^2.0.0", + "reduce-css-calc": "^1.2.6" + } }, "postcss-colormin": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", - "dev": true + "dev": true, + "requires": { + "colormin": "^1.0.5", + "postcss": "^5.0.13", + "postcss-value-parser": "^3.2.3" + } }, "postcss-convert-values": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", - "dev": true + "dev": true, + "requires": { + "postcss": "^5.0.11", + "postcss-value-parser": "^3.1.2" + } }, "postcss-discard-comments": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", - "dev": true + "dev": true, + "requires": { + "postcss": "^5.0.14" + } }, "postcss-discard-duplicates": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", - "dev": true + "dev": true, + "requires": { + "postcss": "^5.0.4" + } }, "postcss-discard-empty": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", - "dev": true + "dev": true, + "requires": { + "postcss": "^5.0.14" + } }, "postcss-discard-overridden": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", - "dev": true + "dev": true, + "requires": { + "postcss": "^5.0.16" + } }, "postcss-discard-unused": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", - "dev": true + "dev": true, + "requires": { + "postcss": "^5.0.14", + "uniqs": "^2.0.0" + } }, "postcss-filter-plugins": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=", - "dev": true + "dev": true, + "requires": { + "postcss": "^5.0.4", + "uniqid": "^4.0.0" + } }, "postcss-merge-idents": { "version": "2.1.7", "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", - "dev": true + "dev": true, + "requires": { + "has": "^1.0.1", + "postcss": "^5.0.10", + "postcss-value-parser": "^3.1.1" + } }, "postcss-merge-longhand": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", - "dev": true + "dev": true, + "requires": { + "postcss": "^5.0.4" + } }, "postcss-merge-rules": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", - "dev": true + "dev": true, + "requires": { + "browserslist": "^1.5.2", + "caniuse-api": "^1.5.2", + "postcss": "^5.0.4", + "postcss-selector-parser": "^2.2.2", + "vendors": "^1.0.0" + } }, "postcss-message-helpers": { "version": "2.0.0", @@ -5805,79 +8684,141 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", - "dev": true + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" + } }, "postcss-minify-gradients": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", - "dev": true + "dev": true, + "requires": { + "postcss": "^5.0.12", + "postcss-value-parser": "^3.3.0" + } }, "postcss-minify-params": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", - "dev": true + "dev": true, + "requires": { + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.2", + "postcss-value-parser": "^3.0.2", + "uniqs": "^2.0.0" + } }, "postcss-minify-selectors": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", - "dev": true + "dev": true, + "requires": { + "alphanum-sort": "^1.0.2", + "has": "^1.0.1", + "postcss": "^5.0.14", + "postcss-selector-parser": "^2.0.0" + } }, "postcss-normalize-charset": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", - "dev": true + "dev": true, + "requires": { + "postcss": "^5.0.5" + } }, "postcss-normalize-url": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", - "dev": true + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^1.4.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3" + } }, "postcss-ordered-values": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", - "dev": true + "dev": true, + "requires": { + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.1" + } }, "postcss-reduce-idents": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", - "dev": true + "dev": true, + "requires": { + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" + } }, "postcss-reduce-initial": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", - "dev": true + "dev": true, + "requires": { + "postcss": "^5.0.4" + } }, "postcss-reduce-transforms": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", - "dev": true + "dev": true, + "requires": { + "has": "^1.0.1", + "postcss": "^5.0.8", + "postcss-value-parser": "^3.0.1" + } }, "postcss-selector-parser": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", - "dev": true + "dev": true, + "requires": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } }, "postcss-svgo": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", - "dev": true + "dev": true, + "requires": { + "is-svg": "^2.0.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3", + "svgo": "^0.7.0" + } }, "postcss-unique-selectors": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", - "dev": true + "dev": true, + "requires": { + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" + } }, "postcss-value-parser": { "version": "3.3.0", @@ -5889,7 +8830,12 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", - "dev": true + "dev": true, + "requires": { + "has": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" + } }, "prelude-ls": { "version": "1.1.2", @@ -5936,13 +8882,21 @@ "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true + "dev": true, + "requires": { + "asap": "~2.0.3" + } }, "prop-types": { "version": "15.6.0", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", - "dev": true + "dev": true, + "requires": { + "fbjs": "^0.8.16", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } }, "property-information": { "version": "3.2.0", @@ -5966,7 +8920,14 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", - "dev": true + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1" + } }, "punycode": { "version": "1.4.1", @@ -5988,7 +8949,11 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } }, "querystring": { "version": "0.2.0", @@ -6007,6 +8972,11 @@ "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", "integrity": "sha1-hJY/jJwmuULhU/7rU6rnRlK34LI=", "dev": true, + "requires": { + "buffer-equal": "0.0.1", + "minimist": "^1.1.3", + "through2": "^2.0.0" + }, "dependencies": { "minimist": { "version": "1.2.0", @@ -6021,18 +8991,28 @@ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, "dependencies": { "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } } } }, @@ -6040,7 +9020,10 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } } } }, @@ -6048,13 +9031,20 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", - "dev": true + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } }, "raw-body": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=", "dev": true, + "requires": { + "bytes": "1", + "string_decoder": "0.10" + }, "dependencies": { "string_decoder": { "version": "0.10.31", @@ -6068,6 +9058,12 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "requires": { + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, "dependencies": { "minimist": { "version": "1.2.0", @@ -6080,46 +9076,91 @@ "version": "15.6.2", "resolved": "https://registry.npmjs.org/react/-/react-15.6.2.tgz", "integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=", - "dev": true + "dev": true, + "requires": { + "create-react-class": "^15.6.0", + "fbjs": "^0.8.9", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.0", + "prop-types": "^15.5.10" + } }, "react-dom": { "version": "15.6.2", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.2.tgz", "integrity": "sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA=", - "dev": true + "dev": true, + "requires": { + "fbjs": "^0.8.9", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.0", + "prop-types": "^15.5.10" + } }, "read-only-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", - "dev": true + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } }, "read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=" + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } }, "read-pkg-up": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=" + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } }, "readable-stream": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==" + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" + } }, "readdirp": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" + } }, "readline2": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "mute-stream": "0.0.5" + }, "dependencies": { "mute-stream": { "version": "0.0.5", @@ -6133,19 +9174,31 @@ "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true + "dev": true, + "requires": { + "resolve": "^1.1.6" + } }, "redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } }, "reduce-css-calc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", "dev": true, + "requires": { + "balanced-match": "^0.4.2", + "math-expression-evaluator": "^1.2.14", + "reduce-function-call": "^1.0.1" + }, "dependencies": { "balanced-match": { "version": "0.4.2", @@ -6160,6 +9213,9 @@ "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", "dev": true, + "requires": { + "balanced-match": "^0.4.2" + }, "dependencies": { "balanced-match": { "version": "0.4.2", @@ -6185,25 +9241,41 @@ "version": "0.10.1", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "dev": true + "dev": true, + "requires": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" + } }, "regex-cache": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } }, "regex-not": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.0.tgz", "integrity": "sha1-Qvg+OXcWIt+CawKvF2Ul1qXxV/k=", - "dev": true + "dev": true, + "requires": { + "extend-shallow": "^2.0.1" + } }, "regexpu-core": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } }, "regjsgen": { "version": "0.2.0", @@ -6216,6 +9288,9 @@ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, "dependencies": { "jsesc": { "version": "0.5.0", @@ -6229,43 +9304,99 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/remark/-/remark-8.0.0.tgz", "integrity": "sha512-K0PTsaZvJlXTl9DN6qYlvjTkqSZBFELhROZMrblm2rB+085flN84nz4g/BscKRMqDvhzlK1oQ/xnWQumdeNZYw==", - "dev": true + "dev": true, + "requires": { + "remark-parse": "^4.0.0", + "remark-stringify": "^4.0.0", + "unified": "^6.0.0" + } }, "remark-html": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/remark-html/-/remark-html-6.0.1.tgz", "integrity": "sha1-UJTSxx95Qf2yroZbrHZid1fOCcE=", - "dev": true + "dev": true, + "requires": { + "hast-util-sanitize": "^1.0.0", + "hast-util-to-html": "^3.0.0", + "mdast-util-to-hast": "^2.1.1", + "xtend": "^4.0.1" + } }, "remark-parse": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-4.0.0.tgz", "integrity": "sha512-XZgICP2gJ1MHU7+vQaRM+VA9HEL3X253uwUM/BGgx3iv6TH2B3bF3B8q00DKcyP9YrJV+/7WOWEWBFF/u8cIsw==", - "dev": true + "dev": true, + "requires": { + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^1.0.2", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^1.0.0", + "vfile-location": "^2.0.0", + "xtend": "^4.0.1" + } }, "remark-slug": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/remark-slug/-/remark-slug-4.2.3.tgz", "integrity": "sha1-jZh9Dl5j1KSeo3uQ/pmaPc/IG3I=", - "dev": true + "dev": true, + "requires": { + "github-slugger": "^1.0.0", + "mdast-util-to-string": "^1.0.0", + "unist-util-visit": "^1.0.0" + } }, "remark-stringify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-4.0.0.tgz", "integrity": "sha512-xLuyKTnuQer3ke9hkU38SUYLiTmS078QOnoFavztmbt/pAJtNSkNtFgR0U//uCcmG0qnyxao+PDuatQav46F1w==", - "dev": true + "dev": true, + "requires": { + "ccount": "^1.0.0", + "is-alphanumeric": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "longest-streak": "^2.0.1", + "markdown-escapes": "^1.0.0", + "markdown-table": "^1.1.0", + "mdast-util-compact": "^1.0.0", + "parse-entities": "^1.0.2", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "stringify-entities": "^1.0.1", + "unherit": "^1.0.4", + "xtend": "^4.0.1" + } }, "remark-toc": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/remark-toc/-/remark-toc-4.0.1.tgz", "integrity": "sha1-/zb/beVOoH3Vnj9TNKSjqsHpMYU=", - "dev": true + "dev": true, + "requires": { + "mdast-util-toc": "^2.0.0", + "remark-slug": "^4.0.0" + } }, "remote-origin-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/remote-origin-url/-/remote-origin-url-0.4.0.tgz", "integrity": "sha1-TT4pAvNOLTfRwmPYdxC3frQIajA=", - "dev": true + "dev": true, + "requires": { + "parse-git-config": "^0.2.0" + } }, "remove-trailing-separator": { "version": "1.1.0", @@ -6289,7 +9420,10 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } }, "replace-ext": { "version": "1.0.0", @@ -6300,7 +9434,31 @@ "request": { "version": "2.81.0", "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=" + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "requires": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" + } }, "require-directory": { "version": "2.1.1", @@ -6316,13 +9474,20 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true + "dev": true, + "requires": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + } }, "resolve": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", - "dev": true + "dev": true, + "requires": { + "path-parse": "^1.0.5" + } }, "resolve-from": { "version": "1.0.1", @@ -6340,36 +9505,56 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } }, "resumer": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", - "dev": true + "dev": true, + "requires": { + "through": "~2.3.4" + } }, "right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true + "dev": true, + "requires": { + "align-text": "^0.1.1" + } }, "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==" + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "^7.0.5" + } }, "ripemd160": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", - "dev": true + "dev": true, + "requires": { + "hash-base": "^2.0.0", + "inherits": "^2.0.1" + } }, "run-async": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } }, "rx-lite": { "version": "4.0.8", @@ -6381,7 +9566,10 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true + "dev": true, + "requires": { + "rx-lite": "*" + } }, "safe-buffer": { "version": "5.1.1", @@ -6414,7 +9602,10 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", - "dev": true + "dev": true, + "requires": { + "to-object-path": "^0.3.0" + } }, "set-immediate-shim": { "version": "1.0.1", @@ -6427,12 +9618,21 @@ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, "dependencies": { "split-string": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.0.2.tgz", "integrity": "sha512-d6myUSfwmBz1izkY4r7r7I0PL41rh21qUDYK1OgclmGHeoqQoujduGxMbzw6BlF3HKmJR4sMpbWVo7/Xzg4YBQ==", - "dev": true + "dev": true, + "requires": { + "extend-shallow": "^2.0.1" + } } } }, @@ -6446,7 +9646,11 @@ "version": "2.4.9", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", - "dev": true + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } }, "shallow-copy": { "version": "0.0.1", @@ -6459,12 +9663,19 @@ "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", "dev": true, + "requires": { + "json-stable-stringify": "~0.0.0", + "sha.js": "~2.4.4" + }, "dependencies": { "json-stable-stringify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", - "dev": true + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } } } }, @@ -6472,7 +9683,10 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } }, "shebang-regex": { "version": "1.0.0", @@ -6484,13 +9698,24 @@ "version": "1.6.1", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", - "dev": true + "dev": true, + "requires": { + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" + } }, "shelljs": { "version": "0.7.8", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", - "dev": true + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } }, "signal-exit": { "version": "3.0.2", @@ -6508,6 +9733,9 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0" + }, "dependencies": { "is-fullwidth-code-point": { "version": "2.0.0", @@ -6522,18 +9750,36 @@ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.1.tgz", "integrity": "sha1-4StUh/re0+PeoKyR6UAL91tAE3A=", "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^2.0.0" + }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } }, "kind-of": { "version": "5.0.2", @@ -6548,6 +9794,11 @@ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, "dependencies": { "isobject": { "version": "3.0.1", @@ -6561,18 +9812,27 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true + "dev": true, + "requires": { + "kind-of": "^3.2.0" + } }, "sntp": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=" + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "requires": { + "hoek": "2.x.x" + } }, "sort-keys": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } }, "source-map": { "version": "0.5.6", @@ -6584,13 +9844,22 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.0.tgz", "integrity": "sha1-/K0LZLcK+ydpnkJZUMtevNQQvCA=", - "dev": true + "dev": true, + "requires": { + "atob": "^2.0.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } }, "source-map-support": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true + "dev": true, + "requires": { + "source-map": "^0.5.6" + } }, "source-map-url": { "version": "0.4.0", @@ -6602,12 +9871,18 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.1.tgz", "integrity": "sha1-lpW5355lrsGBHUw/nOUlILwvfk0=", - "dev": true + "dev": true, + "requires": { + "trim": "0.0.1" + } }, "spdx-correct": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=" + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "requires": { + "spdx-license-ids": "^1.0.2" + } }, "spdx-expression-parse": { "version": "1.0.4", @@ -6623,19 +9898,28 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true + "dev": true, + "requires": { + "through": "2" + } }, "split-string": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/split-string/-/split-string-2.1.1.tgz", "integrity": "sha1-r0sG2CFWBCZEbDzZMc2mGJQNN9A=", - "dev": true + "dev": true, + "requires": { + "extend-shallow": "^2.0.1" + } }, "split2": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", - "dev": true + "dev": true, + "requires": { + "through2": "^2.0.2" + } }, "sprintf": { "version": "0.1.5", @@ -6653,6 +9937,16 @@ "version": "1.13.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "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", + "tweetnacl": "~0.14.0" + }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -6672,6 +9966,9 @@ "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-1.1.0.tgz", "integrity": "sha1-NvapIHUabBD0maE8Msu19RoLiyU=", "dev": true, + "requires": { + "stackframe": "^1.0.2" + }, "dependencies": { "stackframe": { "version": "1.0.4", @@ -6691,25 +9988,56 @@ "version": "2.4.4", "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-2.4.4.tgz", "integrity": "sha1-acgn6dbW9Bz0ONfxleLjy/zyjEQ=", - "dev": true + "dev": true, + "requires": { + "source-map": "0.5.6", + "stackframe": "~0.3" + } }, "stacktrace-js": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-1.3.1.tgz", "integrity": "sha1-Z8qyWJr1xBe5Yvc2mUAne7O2oYs=", - "dev": true + "dev": true, + "requires": { + "error-stack-parser": "^1.3.6", + "stack-generator": "^1.0.7", + "stacktrace-gps": "^2.4.3" + } }, "standard-changelog": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/standard-changelog/-/standard-changelog-1.0.4.tgz", "integrity": "sha512-a/xyMweEfC0A2ONYeT0lRok3Hz6D6I8aqc1OcidfCtip8CpU+x6k7XdkPq1s57MD0dZyhEpLuham1XOC5o+yFw==", - "dev": true + "dev": true, + "requires": { + "add-stream": "^1.0.0", + "chalk": "^1.1.3", + "conventional-changelog-angular": "^1.5.1", + "conventional-changelog-core": "^1.9.2", + "figures": "^1.5.0", + "fs-access": "^1.0.0", + "lodash": "^4.1.0", + "meow": "^3.7.0", + "rimraf": "^2.5.2", + "sprintf": "^0.1.5", + "tempfile": "^1.1.1" + } }, "standard-version": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-4.2.0.tgz", "integrity": "sha1-MBfoxc7SqS23UBeQJVw7qFFXN10=", "dev": true, + "requires": { + "chalk": "^1.1.3", + "conventional-changelog": "^1.1.0", + "conventional-recommended-bump": "^1.0.0", + "figures": "^1.5.0", + "fs-access": "^1.0.0", + "semver": "^5.1.0", + "yargs": "^8.0.1" + }, "dependencies": { "ansi-regex": { "version": "3.0.0", @@ -6727,7 +10055,10 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } }, "is-fullwidth-code-point": { "version": "2.0.0", @@ -6739,43 +10070,73 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } }, "os-locale": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } }, "path-type": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true + "dev": true, + "requires": { + "pify": "^2.0.0" + } }, "read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } }, "read-pkg-up": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } }, "strip-bom": { "version": "3.0.0", @@ -6793,13 +10154,31 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "dev": true + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" + } }, "yargs-parser": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } } } }, @@ -6814,12 +10193,20 @@ "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-0.2.4.tgz", "integrity": "sha1-t9NNg4k3uWn5ZBygfUj47eJj6ns=", "dev": true, + "requires": { + "escodegen": "~0.0.24" + }, "dependencies": { "escodegen": { "version": "0.0.28", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-0.0.28.tgz", "integrity": "sha1-Dk/xcV8yh3XWyrUaxEpAbNer/9M=", - "dev": true + "dev": true, + "requires": { + "esprima": "~1.0.2", + "estraverse": "~1.3.0", + "source-map": ">= 0.1.2" + } }, "esprima": { "version": "1.0.4", @@ -6840,18 +10227,30 @@ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } }, "kind-of": { "version": "5.0.2", @@ -6866,6 +10265,19 @@ "resolved": "https://registry.npmjs.org/static-module/-/static-module-1.5.0.tgz", "integrity": "sha1-J9qYg8QajNCSNvhC8MHrxu32PYY=", "dev": true, + "requires": { + "concat-stream": "~1.6.0", + "duplexer2": "~0.0.2", + "escodegen": "~1.3.2", + "falafel": "^2.1.0", + "has": "^1.0.0", + "object-inspect": "~0.4.0", + "quote-stream": "~0.0.0", + "readable-stream": "~1.0.27-1", + "shallow-copy": "~0.0.1", + "static-eval": "~0.2.0", + "through2": "~0.4.1" + }, "dependencies": { "isarray": { "version": "0.0.1", @@ -6883,13 +10295,23 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-0.0.0.tgz", "integrity": "sha1-zeKelMQJsW4Z3HCYuJtmWPlyHTs=", - "dev": true + "dev": true, + "requires": { + "minimist": "0.0.8", + "through2": "~0.4.1" + } }, "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } }, "string_decoder": { "version": "0.10.31", @@ -6901,13 +10323,20 @@ "version": "0.4.2", "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", - "dev": true + "dev": true, + "requires": { + "readable-stream": "~1.0.17", + "xtend": "~2.1.1" + } }, "xtend": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "dev": true + "dev": true, + "requires": { + "object-keys": "~0.4.0" + } } } }, @@ -6916,12 +10345,24 @@ "resolved": "https://registry.npmjs.org/stream-array/-/stream-array-1.1.2.tgz", "integrity": "sha1-nl9zRfITfDDuO0mLkRToC1K7frU=", "dev": true, + "requires": { + "readable-stream": "~2.1.0" + }, "dependencies": { "readable-stream": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", - "dev": true + "dev": true, + "requires": { + "buffer-shims": "^1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } }, "string_decoder": { "version": "0.10.31", @@ -6935,19 +10376,30 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "dev": true + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } }, "stream-combiner2": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", "dev": true, + "requires": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + }, "dependencies": { "duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } } } }, @@ -6955,7 +10407,14 @@ "version": "2.7.2", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", - "dev": true + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.2.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } }, "stream-shift": { "version": "1.0.0", @@ -6967,7 +10426,11 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=", - "dev": true + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } }, "strict-uri-encode": { "version": "1.1.0", @@ -6975,11 +10438,6 @@ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", "dev": true }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==" - }, "string-template": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", @@ -6989,19 +10447,43 @@ "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=" + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } }, "string.prototype.trim": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", - "dev": true + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.0", + "function-bind": "^1.0.2" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "~5.1.0" + } }, "stringify-entities": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.1.tgz", "integrity": "sha1-sVDsLXKsTBtfMktR+2soyc3/BYw=", - "dev": true + "dev": true, + "requires": { + "character-entities-html4": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } }, "stringstream": { "version": "0.0.5", @@ -7011,18 +10493,28 @@ "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=" + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } }, "strip-bom": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=" + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } }, "strip-bom-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", - "dev": true + "dev": true, + "requires": { + "first-chunk-stream": "^1.0.0", + "strip-bom": "^2.0.0" + } }, "strip-eof": { "version": "1.0.0", @@ -7034,7 +10526,10 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } }, "strip-json-comments": { "version": "2.0.1", @@ -7046,6 +10541,9 @@ "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", "dev": true, + "requires": { + "minimist": "^1.1.0" + }, "dependencies": { "minimist": { "version": "1.2.0", @@ -7066,6 +10564,15 @@ "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", "dev": true, + "requires": { + "coa": "~1.0.1", + "colors": "~1.1.2", + "csso": "~2.3.1", + "js-yaml": "~3.7.0", + "mkdirp": "~0.5.1", + "sax": "~1.2.1", + "whet.extend": "~0.9.9" + }, "dependencies": { "sax": { "version": "1.2.4", @@ -7080,6 +10587,9 @@ "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.3.0.tgz", "integrity": "sha1-HtkmbE1AvnXcVb+bsct3Biu5bKE=", "dev": true, + "requires": { + "acorn": "^4.0.3" + }, "dependencies": { "acorn": { "version": "4.0.13", @@ -7094,12 +10604,26 @@ "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", "dev": true, + "requires": { + "ajv": "^5.2.3", + "ajv-keywords": "^2.1.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" + }, "dependencies": { "ajv": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.3.tgz", "integrity": "sha1-wG9Zh3jETGsWGrr+NGa4GtGBTtI=", - "dev": true + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "json-schema-traverse": "^0.3.0", + "json-stable-stringify": "^1.0.1" + } }, "ansi-regex": { "version": "3.0.0", @@ -7111,13 +10635,21 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } }, "chalk": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", - "dev": true + "dev": true, + "requires": { + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" + } }, "is-fullwidth-code-point": { "version": "2.0.0", @@ -7129,19 +10661,29 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } }, "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 + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } } } }, @@ -7150,6 +10692,10 @@ "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-0.4.3.tgz", "integrity": "sha1-pOrhkMENdsehEZIf84u+TVjwnuo=", "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "~1.1.11" + }, "dependencies": { "isarray": { "version": "0.0.1", @@ -7161,7 +10707,13 @@ "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } }, "string_decoder": { "version": "0.10.31", @@ -7176,6 +10728,21 @@ "resolved": "https://registry.npmjs.org/tape/-/tape-4.8.0.tgz", "integrity": "sha512-TWILfEnvO7I8mFe35d98F6T5fbLaEtbFTG/lxWvid8qDfFTxt19EBijWmB4j3+Hoh5TfHE2faWs73ua+EphuBA==", "dev": true, + "requires": { + "deep-equal": "~1.0.1", + "defined": "~1.0.0", + "for-each": "~0.3.2", + "function-bind": "~1.1.0", + "glob": "~7.1.2", + "has": "~1.0.1", + "inherits": "~2.0.3", + "minimist": "~1.2.0", + "object-inspect": "~1.3.0", + "resolve": "~1.4.0", + "resumer": "~0.0.0", + "string.prototype.trim": "~1.1.2", + "through": "~2.3.8" + }, "dependencies": { "deep-equal": { "version": "1.0.1", @@ -7200,18 +10767,37 @@ "tar": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=" + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } }, "tar-pack": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz", - "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=" + "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=", + "requires": { + "debug": "^2.2.0", + "fstream": "^1.0.10", + "fstream-ignore": "^1.0.5", + "once": "^1.3.3", + "readable-stream": "^2.1.4", + "rimraf": "^2.5.1", + "tar": "^2.2.1", + "uid-number": "^0.0.6" + } }, "tempfile": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-1.1.1.tgz", "integrity": "sha1-W8xOrsxKsscH2LwR2ZzMmiyyh/I=", "dev": true, + "requires": { + "os-tmpdir": "^1.0.0", + "uuid": "^2.0.1" + }, "dependencies": { "uuid": { "version": "2.0.3", @@ -7243,37 +10829,62 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true + "dev": true, + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + } }, "through2-filter": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", - "dev": true + "dev": true, + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } }, "timers-browserify": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", - "dev": true + "dev": true, + "requires": { + "process": "~0.11.0" + } }, "tiny-lr": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.0.5.tgz", "integrity": "sha512-YrxUSiMgOVh3PnAqtdAUQuUVEVRnqcRCxJ3BHrl/aaWV2fplKKB60oClM0GH2Gio2hcXvkxMUxsC/vXZrQePlg==", - "dev": true + "dev": true, + "requires": { + "body": "^5.1.0", + "debug": "~2.6.7", + "faye-websocket": "~0.10.0", + "livereload-js": "^2.2.2", + "object-assign": "^4.1.0", + "qs": "^6.4.0" + } }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } }, "to-absolute-glob": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", - "dev": true + "dev": true, + "requires": { + "extend-shallow": "^2.0.1" + } }, "to-arraybuffer": { "version": "1.0.1", @@ -7291,25 +10902,41 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } }, "to-regex": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.1.tgz", "integrity": "sha1-FTWL7kosg712N3uh3ASdDxiDeq4=", "dev": true, + "requires": { + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "regex-not": "^1.0.0" + }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } }, "kind-of": { "version": "5.0.2", @@ -7324,25 +10951,39 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, "dependencies": { "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } } } }, "tough-cookie": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=" + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "requires": { + "punycode": "^1.4.1" + } }, "transform-filter": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/transform-filter/-/transform-filter-0.1.1.tgz", "integrity": "sha1-gG+FG25ECyN4j9OMoEMbUCAlulk=", - "dev": true + "dev": true, + "requires": { + "multimatch": "^2.0.0", + "through": "^2.3.6" + } }, "trim": { "version": "0.0.1", @@ -7401,7 +11042,10 @@ "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=" + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } }, "tweetnacl": { "version": "0.14.5", @@ -7413,7 +11057,10 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } }, "typedarray": { "version": "0.0.6", @@ -7432,6 +11079,11 @@ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "dev": true, + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, "dependencies": { "camelcase": { "version": "1.2.1", @@ -7443,7 +11095,12 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true + "dev": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } }, "wordwrap": { "version": "0.0.2", @@ -7455,7 +11112,13 @@ "version": "3.10.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true + "dev": true, + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } } } }, @@ -7487,25 +11150,50 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.0.tgz", "integrity": "sha1-a5qu379z3xdWrZ4xbdmBiFhAzX0=", - "dev": true + "dev": true, + "requires": { + "inherits": "^2.0.1", + "xtend": "^4.0.1" + } }, "unified": { "version": "6.1.5", "resolved": "https://registry.npmjs.org/unified/-/unified-6.1.5.tgz", "integrity": "sha1-cWk3hyYhpjE15iztLzrGoGPG+4c=", - "dev": true + "dev": true, + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^1.1.0", + "trough": "^1.0.0", + "vfile": "^2.0.0", + "x-is-function": "^1.0.4", + "x-is-string": "^0.1.0" + } }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, "dependencies": { "set-value": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } } } }, @@ -7519,7 +11207,10 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", - "dev": true + "dev": true, + "requires": { + "macaddress": "^0.2.8" + } }, "uniqs": { "version": "2.0.0", @@ -7531,13 +11222,20 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", - "dev": true + "dev": true, + "requires": { + "json-stable-stringify": "^1.0.0", + "through2-filter": "^2.0.0" + } }, "unist-builder": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-1.0.2.tgz", "integrity": "sha1-jDuZA+9kvPsRfdfPal2Y/Bs7J7Y=", - "dev": true + "dev": true, + "requires": { + "object-assign": "^4.1.0" + } }, "unist-util-generated": { "version": "1.1.1", @@ -7555,7 +11253,10 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-1.1.1.tgz", "integrity": "sha1-ZtfmpEnm9nIguXarPLi166w55R0=", - "dev": true + "dev": true, + "requires": { + "array-iterate": "^1.0.0" + } }, "unist-util-position": { "version": "3.0.0", @@ -7567,13 +11268,21 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.1.tgz", "integrity": "sha1-WoXBVV/BugwQG4ZwfRXlD6TIcbs=", - "dev": true + "dev": true, + "requires": { + "unist-util-visit": "^1.1.0" + } }, "unist-util-select": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/unist-util-select/-/unist-util-select-1.5.0.tgz", "integrity": "sha1-qTwr6MD2U4J4A7gTMa3sKqJM2TM=", - "dev": true + "dev": true, + "requires": { + "css-selector-parser": "^1.1.0", + "debug": "^2.2.0", + "nth-check": "^1.0.1" + } }, "unist-util-stringify-position": { "version": "1.1.1", @@ -7592,18 +11301,30 @@ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, "dependencies": { "has-value": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, "dependencies": { "isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true + "dev": true, + "requires": { + "isarray": "1.0.0" + } } } }, @@ -7638,6 +11359,10 @@ "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, "dependencies": { "punycode": { "version": "1.3.2", @@ -7652,18 +11377,31 @@ "resolved": "https://registry.npmjs.org/use/-/use-2.0.2.tgz", "integrity": "sha1-riig1y+TvyJCKhii43mZMRLeyOg=", "dev": true, + "requires": { + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "lazy-cache": "^2.0.2" + }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } }, "isobject": { "version": "3.0.1", @@ -7681,7 +11419,10 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "dev": true + "dev": true, + "requires": { + "set-getter": "^0.1.0" + } } } }, @@ -7696,6 +11437,9 @@ "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, + "requires": { + "inherits": "2.0.1" + }, "dependencies": { "inherits": { "version": "2.0.1", @@ -7719,7 +11463,10 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", - "dev": true + "dev": true, + "requires": { + "user-home": "^1.1.1" + } }, "vali-date": { "version": "1.0.0", @@ -7730,7 +11477,11 @@ "validate-npm-package-license": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=" + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "requires": { + "spdx-correct": "~1.0.0", + "spdx-expression-parse": "~1.0.0" + } }, "vendors": { "version": "1.0.1", @@ -7742,6 +11493,11 @@ "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" + }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -7754,7 +11510,12 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.2.0.tgz", "integrity": "sha1-zkek+zNZIrIz5TXbD32BIdj87U4=", - "dev": true + "dev": true, + "requires": { + "is-buffer": "^1.1.4", + "replace-ext": "1.0.0", + "unist-util-stringify-position": "^1.0.0" + } }, "vfile-location": { "version": "2.0.2", @@ -7767,12 +11528,22 @@ "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-4.0.0.tgz", "integrity": "sha1-6m8K4TQvSEFXOYXgX5QXNvJ96do=", "dev": true, + "requires": { + "repeat-string": "^1.5.0", + "string-width": "^1.0.0", + "supports-color": "^4.1.0", + "unist-util-stringify-position": "^1.0.0", + "vfile-statistics": "^1.1.0" + }, "dependencies": { "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 + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } } } }, @@ -7793,6 +11564,14 @@ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, "dependencies": { "clone": { "version": "2.1.1", @@ -7807,6 +11586,25 @@ "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", "dev": true, + "requires": { + "duplexify": "^3.2.0", + "glob-stream": "^5.3.2", + "graceful-fs": "^4.0.0", + "gulp-sourcemaps": "1.6.0", + "is-valid-glob": "^0.3.0", + "lazystream": "^1.0.0", + "lodash.isequal": "^4.0.0", + "merge-stream": "^1.0.0", + "mkdirp": "^0.5.0", + "object-assign": "^4.0.0", + "readable-stream": "^2.0.4", + "strip-bom": "^2.0.0", + "strip-bom-stream": "^1.0.0", + "through2": "^2.0.0", + "through2-filter": "^2.0.0", + "vali-date": "^1.0.0", + "vinyl": "^1.0.0" + }, "dependencies": { "clone-stats": { "version": "0.0.1", @@ -7824,7 +11622,12 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true + "dev": true, + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } } } }, @@ -7832,13 +11635,20 @@ "version": "0.0.4", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true + "dev": true, + "requires": { + "indexof": "0.0.1" + } }, "websocket-driver": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", - "dev": true + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0", + "websocket-extensions": ">=0.1.1" + } }, "websocket-extensions": { "version": "0.1.2", @@ -7861,7 +11671,10 @@ "which": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==" + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "requires": { + "isexe": "^2.0.0" + } }, "which-module": { "version": "1.0.0", @@ -7871,7 +11684,10 @@ "wide-align": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==" + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "requires": { + "string-width": "^1.0.2" + } }, "window-size": { "version": "0.1.0", @@ -7888,7 +11704,11 @@ "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=" + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } }, "wrappy": { "version": "1.0.2", @@ -7899,7 +11719,10 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } }, "x-is-function": { "version": "1.0.4", @@ -7917,13 +11740,19 @@ "version": "0.2.6", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.2.6.tgz", "integrity": "sha1-0gnE5N2h/JxFIUHvQcB39a399sQ=", - "dev": true + "dev": true, + "requires": { + "sax": "0.4.2" + } }, "xmlbuilder": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz", "integrity": "sha1-qlijBBoGb5DqoWwvU4n/GfP0YaU=", - "dev": true + "dev": true, + "requires": { + "lodash": "^4.0.0" + } }, "xtend": { "version": "4.0.1", @@ -7945,12 +11774,30 @@ "yargs": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=" + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + } }, "yargs-parser": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=" + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "requires": { + "camelcase": "^3.0.0" + } } } } diff --git a/package.json b/package.json index 6f95cd55382..1b1344445d9 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,11 @@ { "name": "osrm", - "version": "5.19.0", + "version": "5.20.1-rc.4", "private": false, "description": "The Open Source Routing Machine is a high performance routing engine written in C++14 designed to run on OpenStreetMap data.", "dependencies": { "mkdirp": "^0.5.1", - "nan": "^2.6.2", + "nan": "^2.11.1", "node-cmake": "^2.3.2", "node-pre-gyp": "^0.6.36", "rimraf": "^2.5.4" @@ -18,7 +18,7 @@ }, "scripts": { "lint": "node ./node_modules/eslint/bin/eslint.js -c ./.eslintrc features/step_definitions/ features/support/", - "test": "npm run lint && node ./node_modules/cucumber/bin/cucumber.js features/ -p verify && node ./node_modules/cucumber/bin/cucumber.js features/ -p mld", + "test": "npm run lint && node ./node_modules/cucumber/bin/cucumber.js features/ -p verify && node ./node_modules/cucumber/bin/cucumber.js features/ -p verify -m mmap && node ./node_modules/cucumber/bin/cucumber.js features/ -p mld && node ./node_modules/cucumber/bin/cucumber.js features/ -p mld -m mmap", "clean": "rm -rf test/cache", "docs": "./scripts/build_api_docs.sh", "install": "node-pre-gyp install --fallback-to-build=false || ./scripts/node_install.sh", diff --git a/scripts/timer.js b/scripts/timer.js index 47fb280a92f..894310d6f86 100755 --- a/scripts/timer.js +++ b/scripts/timer.js @@ -6,8 +6,12 @@ var fs = require('fs'); var name = process.argv[2]; var cmd = process.argv.slice(3).join(' '); var start = Date.now(); -exec(cmd, (err) => { - if (err) return console.log(err); +exec(cmd, (err, stdout, stderr) => { + if (err) { + console.log(stdout); + console.log(stderr); + return process.exit(err.code); + } var stop = +new Date(); var time = (stop - start) / 1000.; fs.appendFileSync('/tmp/osrm.timings', `${name}\t${time}`, 'utf-8'); diff --git a/src/contractor/graph_contractor.cpp b/src/contractor/graph_contractor.cpp index 221e629e911..8615156dd25 100644 --- a/src/contractor/graph_contractor.cpp +++ b/src/contractor/graph_contractor.cpp @@ -215,6 +215,7 @@ void ContractNode(ContractorThreadData *data, target, path_weight, in_data.duration + out_data.duration, + in_data.distance + out_data.distance, out_data.originalEdges + in_data.originalEdges, node, SHORTCUT_ARC, @@ -225,6 +226,7 @@ void ContractNode(ContractorThreadData *data, source, path_weight, in_data.duration + out_data.duration, + in_data.distance + out_data.distance, out_data.originalEdges + in_data.originalEdges, node, SHORTCUT_ARC, @@ -280,6 +282,7 @@ void ContractNode(ContractorThreadData *data, target, path_weight, in_data.duration + out_data.duration, + in_data.distance + out_data.distance, out_data.originalEdges + in_data.originalEdges, node, SHORTCUT_ARC, @@ -290,6 +293,7 @@ void ContractNode(ContractorThreadData *data, source, path_weight, in_data.duration + out_data.duration, + in_data.distance + out_data.distance, out_data.originalEdges + in_data.originalEdges, node, SHORTCUT_ARC, diff --git a/src/customize/customizer.cpp b/src/customize/customizer.cpp index 2c4f57ab893..d7e2af90dbb 100644 --- a/src/customize/customizer.cpp +++ b/src/customize/customizer.cpp @@ -76,6 +76,7 @@ auto LoadAndUpdateEdgeExpandedGraph(const CustomizationConfig &config, const partitioner::MultiLevelPartition &mlp, std::vector &node_weights, std::vector &node_durations, + std::vector &node_distances, std::uint32_t &connectivity_checksum) { updater::Updater updater(config.updater_config); @@ -84,6 +85,8 @@ auto LoadAndUpdateEdgeExpandedGraph(const CustomizationConfig &config, EdgeID num_nodes = updater.LoadAndUpdateEdgeExpandedGraph( edge_based_edge_list, node_weights, node_durations, connectivity_checksum); + extractor::files::readEdgeBasedNodeDistances(config.GetPath(".osrm.enw"), node_distances); + auto directed = partitioner::splitBidirectionalEdges(edge_based_edge_list); auto tidied = partitioner::prepareEdgesForUsageInGraph< @@ -124,10 +127,11 @@ int Customizer::Run(const CustomizationConfig &config) partitioner::files::readPartition(config.GetPath(".osrm.partition"), mlp); std::vector node_weights; - std::vector node_durations; // TODO: to be removed later + std::vector node_durations; // TODO: remove when durations are optional + std::vector node_distances; // TODO: remove when distances are optional std::uint32_t connectivity_checksum = 0; auto graph = LoadAndUpdateEdgeExpandedGraph( - config, mlp, node_weights, node_durations, connectivity_checksum); + config, mlp, node_weights, node_durations, node_distances, connectivity_checksum); BOOST_ASSERT(graph.GetNumberOfNodes() == node_weights.size()); std::for_each(node_weights.begin(), node_weights.end(), [](auto &w) { w &= 0x7fffffff; }); util::Log() << "Loaded edge based graph: " << graph.GetNumberOfEdges() << " edges, " @@ -166,8 +170,10 @@ int Customizer::Run(const CustomizationConfig &config) util::Log() << "MLD customization writing took " << TIMER_SEC(writing_mld_data) << " seconds"; TIMER_START(writing_graph); - MultiLevelEdgeBasedGraph shaved_graph{ - std::move(graph), std::move(node_weights), std::move(node_durations)}; + MultiLevelEdgeBasedGraph shaved_graph{std::move(graph), + std::move(node_weights), + std::move(node_durations), + std::move(node_distances)}; customizer::files::writeGraph( config.GetPath(".osrm.mldgr"), shaved_graph, connectivity_checksum); TIMER_STOP(writing_graph); diff --git a/src/engine/api/json_factory.cpp b/src/engine/api/json_factory.cpp index 88d59f72492..dc887f853f9 100644 --- a/src/engine/api/json_factory.cpp +++ b/src/engine/api/json_factory.cpp @@ -94,7 +94,7 @@ std::string waypointTypeToString(const guidance::WaypointType waypoint_type) return waypoint_type_names[static_cast(waypoint_type)]; } -util::json::Array coordinateToLonLat(const util::Coordinate coordinate) +util::json::Array coordinateToLonLat(const util::Coordinate &coordinate) { util::json::Array array; array.values.push_back(static_cast(util::toFloating(coordinate.lon))); @@ -240,17 +240,22 @@ util::json::Object makeRoute(const guidance::Route &route, return json_route; } -util::json::Object makeWaypoint(const util::Coordinate location, std::string name) +util::json::Object +makeWaypoint(const util::Coordinate &location, const double &distance, std::string name) { util::json::Object waypoint; waypoint.values["location"] = detail::coordinateToLonLat(location); waypoint.values["name"] = std::move(name); + waypoint.values["distance"] = distance; return waypoint; } -util::json::Object makeWaypoint(const util::Coordinate location, std::string name, const Hint &hint) +util::json::Object makeWaypoint(const util::Coordinate &location, + const double &distance, + std::string name, + const Hint &hint) { - auto waypoint = makeWaypoint(location, name); + auto waypoint = makeWaypoint(location, distance, name); waypoint.values["hint"] = hint.ToBase64(); return waypoint; } diff --git a/src/engine/datafacade/mmap_memory_allocator.cpp b/src/engine/datafacade/mmap_memory_allocator.cpp index 9b0902fd390..fd87cc42ab0 100644 --- a/src/engine/datafacade/mmap_memory_allocator.cpp +++ b/src/engine/datafacade/mmap_memory_allocator.cpp @@ -1,5 +1,6 @@ #include "engine/datafacade/mmap_memory_allocator.hpp" +#include "storage/block.hpp" #include "storage/io.hpp" #include "storage/serialization.hpp" #include "storage/storage.hpp" @@ -7,7 +8,7 @@ #include "util/log.hpp" #include "util/mmap_file.hpp" -#include "boost/assert.hpp" +#include namespace osrm { @@ -16,46 +17,50 @@ namespace engine namespace datafacade { -MMapMemoryAllocator::MMapMemoryAllocator(const storage::StorageConfig &config, - const boost::filesystem::path &memory_file) +MMapMemoryAllocator::MMapMemoryAllocator(const storage::StorageConfig &config) { storage::Storage storage(config); + std::vector allocated_regions; - if (!boost::filesystem::exists(memory_file)) { - storage::DataLayout initial_layout; - storage.PopulateStaticLayout(initial_layout); - storage.PopulateUpdatableLayout(initial_layout); - - auto data_size = initial_layout.GetSizeOfLayout(); - - storage::io::BufferWriter writer; - storage::serialization::write(writer, initial_layout); - auto encoded_layout = writer.GetBuffer(); - - auto total_size = data_size + encoded_layout.size(); - - mapped_memory = util::mmapFile(memory_file, mapped_memory_file, total_size); - - std::copy(encoded_layout.begin(), encoded_layout.end(), mapped_memory.data()); - - index = storage::SharedDataIndex( - {{mapped_memory.data() + encoded_layout.size(), std::move(initial_layout)}}); - - storage.PopulateStaticData(index); - storage.PopulateUpdatableData(index); + std::unique_ptr fake_layout = + std::make_unique(); + + // Convert the boost::filesystem::path object into a plain string + // that's stored as a member of this allocator object + rtree_filename = storage.PopulateLayoutWithRTree(*fake_layout); + + // Now, we add one more AllocatedRegion, with it's start address as the start + // of the rtree_filename string we've saved. In the fake_layout, we've + // stated that the data is at offset 0, which is where the string starts + // at it's own memory address. + // The syntax &(rtree_filename[0]) gets the memory address of the first char. + // We can't use the convenient `.data()` or `.c_str()` methods, because + // prior to C++17 (which we're not using), those return a `const char *`, + // which isn't compatible with the `char *` that AllocatedRegion expects + // for it's memory_ptr + allocated_regions.push_back({&(rtree_filename[0]), std::move(fake_layout)}); } - else - { - mapped_memory = util::mmapFile(memory_file, mapped_memory_file); - storage::DataLayout layout; - storage::io::BufferReader reader(mapped_memory.data(), mapped_memory.size()); - storage::serialization::read(reader, layout); - auto layout_size = reader.GetPosition(); + auto files = storage.GetStaticFiles(); + auto updatable_files = storage.GetUpdatableFiles(); + files.insert(files.end(), updatable_files.begin(), updatable_files.end()); - index = storage::SharedDataIndex({{mapped_memory.data() + layout_size, std::move(layout)}}); + for (const auto &file : files) + { + if (boost::filesystem::exists(file.second)) + { + std::unique_ptr layout = + std::make_unique(); + boost::iostreams::mapped_file mapped_memory_file; + util::mmapFile(file.second, mapped_memory_file); + mapped_memory_files.push_back(std::move(mapped_memory_file)); + storage::populateLayoutFromFile(file.second, *layout); + allocated_regions.push_back({mapped_memory_file.data(), std::move(layout)}); + } } + + index = storage::SharedDataIndex{std::move(allocated_regions)}; } MMapMemoryAllocator::~MMapMemoryAllocator() {} diff --git a/src/engine/datafacade/process_memory_allocator.cpp b/src/engine/datafacade/process_memory_allocator.cpp index 4e20ee8b6fe..ed07d669fbe 100644 --- a/src/engine/datafacade/process_memory_allocator.cpp +++ b/src/engine/datafacade/process_memory_allocator.cpp @@ -15,14 +15,20 @@ ProcessMemoryAllocator::ProcessMemoryAllocator(const storage::StorageConfig &con storage::Storage storage(config); // Calculate the layout/size of the memory block - storage::DataLayout layout; - storage.PopulateStaticLayout(layout); - storage.PopulateUpdatableLayout(layout); + auto static_files = storage.GetStaticFiles(); + auto updatable_files = storage.GetUpdatableFiles(); + std::unique_ptr layout = + std::make_unique(); + storage.PopulateLayoutWithRTree(*layout); + storage.PopulateLayout(*layout, static_files); + storage.PopulateLayout(*layout, updatable_files); // Allocate the memory block, then load data from files into it - internal_memory = std::make_unique(layout.GetSizeOfLayout()); + internal_memory = std::make_unique(layout->GetSizeOfLayout()); - index = storage::SharedDataIndex({{internal_memory.get(), std::move(layout)}}); + std::vector regions; + regions.push_back({internal_memory.get(), std::move(layout)}); + index = {std::move(regions)}; storage.PopulateStaticData(index); storage.PopulateUpdatableData(index); diff --git a/src/engine/datafacade/shared_memory_allocator.cpp b/src/engine/datafacade/shared_memory_allocator.cpp index 6105034983a..d90302bf9d2 100644 --- a/src/engine/datafacade/shared_memory_allocator.cpp +++ b/src/engine/datafacade/shared_memory_allocator.cpp @@ -25,8 +25,9 @@ SharedMemoryAllocator::SharedMemoryAllocator( auto mem = storage::makeSharedMemory(shm_key); storage::io::BufferReader reader(reinterpret_cast(mem->Ptr()), mem->Size()); - storage::DataLayout layout; - storage::serialization::read(reader, layout); + std::unique_ptr layout = + std::make_unique(); + storage::serialization::read(reader, *layout); auto layout_size = reader.GetPosition(); regions.push_back({reinterpret_cast(mem->Ptr()) + layout_size, std::move(layout)}); diff --git a/src/engine/engine_config.cpp b/src/engine/engine_config.cpp index 94f1f0a56ff..ac7723ba92a 100644 --- a/src/engine/engine_config.cpp +++ b/src/engine/engine_config.cpp @@ -23,7 +23,9 @@ bool EngineConfig::IsValid() const unlimited_or_more_than(max_results_nearest, 0) && max_alternatives >= 0; - return ((use_shared_memory && all_path_are_empty) || storage_config.IsValid()) && limits_valid; + return ((use_shared_memory && all_path_are_empty) || (use_mmap && storage_config.IsValid()) || + storage_config.IsValid()) && + limits_valid; } } } diff --git a/src/engine/plugins/table.cpp b/src/engine/plugins/table.cpp index e10b5461ace..f78645c9d5e 100644 --- a/src/engine/plugins/table.cpp +++ b/src/engine/plugins/table.cpp @@ -4,6 +4,7 @@ #include "engine/api/table_parameters.hpp" #include "engine/routing_algorithms/many_to_many.hpp" #include "engine/search_engine_data.hpp" +#include "util/coordinate_calculation.hpp" #include "util/json_container.hpp" #include "util/string_util.hpp" @@ -86,7 +87,7 @@ Status TablePlugin::HandleRequest(const RoutingAlgorithmsInterface &algorithms, bool request_duration = params.annotations & api::TableParameters::AnnotationsType::Duration; auto result_tables_pair = algorithms.ManyToManySearch( - snapped_phantoms, params.sources, params.destinations, request_distance, request_duration); + snapped_phantoms, params.sources, params.destinations, request_distance); if ((request_duration && result_tables_pair.first.empty()) || (request_distance && result_tables_pair.second.empty())) @@ -94,8 +95,66 @@ Status TablePlugin::HandleRequest(const RoutingAlgorithmsInterface &algorithms, return Error("NoTable", "No table found", result); } + std::vector estimated_pairs; + + // Scan table for null results - if any exist, replace with distance estimates + if (params.fallback_speed != INVALID_FALLBACK_SPEED || params.scale_factor != 1) + { + for (std::size_t row = 0; row < num_sources; row++) + { + for (std::size_t column = 0; column < num_destinations; column++) + { + const auto &table_index = row * num_destinations + column; + BOOST_ASSERT(table_index < result_tables_pair.first.size()); + if (params.fallback_speed != INVALID_FALLBACK_SPEED && params.fallback_speed > 0 && + result_tables_pair.first[table_index] == MAXIMAL_EDGE_DURATION) + { + const auto &source = + snapped_phantoms[params.sources.empty() ? row : params.sources[row]]; + const auto &destination = + snapped_phantoms[params.destinations.empty() ? column + : params.destinations[column]]; + + auto distance_estimate = + params.fallback_coordinate_type == + api::TableParameters::FallbackCoordinateType::Input + ? util::coordinate_calculation::fccApproximateDistance( + source.input_location, destination.input_location) + : util::coordinate_calculation::fccApproximateDistance( + source.location, destination.location); + + result_tables_pair.first[table_index] = + distance_estimate / (double)params.fallback_speed; + if (!result_tables_pair.second.empty()) + { + result_tables_pair.second[table_index] = distance_estimate; + } + + estimated_pairs.emplace_back(row, column); + } + if (params.scale_factor > 0 && params.scale_factor != 1 && + result_tables_pair.first[table_index] != MAXIMAL_EDGE_DURATION && + result_tables_pair.first[table_index] != 0) + { + EdgeDuration diff = + MAXIMAL_EDGE_DURATION / result_tables_pair.first[table_index]; + + if (params.scale_factor >= diff) + { + result_tables_pair.first[table_index] = MAXIMAL_EDGE_DURATION - 1; + } + else + { + result_tables_pair.first[table_index] = std::lround( + result_tables_pair.first[table_index] * params.scale_factor); + } + } + } + } + } + api::TableAPI table_api{facade, params}; - table_api.MakeResponse(result_tables_pair, snapped_phantoms, result); + table_api.MakeResponse(result_tables_pair, snapped_phantoms, estimated_pairs, result); return Status::Ok; } diff --git a/src/engine/plugins/trip.cpp b/src/engine/plugins/trip.cpp index 8914c3e4834..f402a0c067e 100644 --- a/src/engine/plugins/trip.cpp +++ b/src/engine/plugins/trip.cpp @@ -217,10 +217,7 @@ Status TripPlugin::HandleRequest(const RoutingAlgorithmsInterface &algorithms, // compute the duration table of all phantom nodes auto result_duration_table = util::DistTableWrapper( - algorithms - .ManyToManySearch( - snapped_phantoms, {}, {}, /*requestDistance*/ false, /*requestDuration*/ true) - .first, + algorithms.ManyToManySearch(snapped_phantoms, {}, {}, /*requestDistance*/ false).first, number_of_locations); if (result_duration_table.size() == 0) diff --git a/src/engine/routing_algorithms/alternative_path_ch.cpp b/src/engine/routing_algorithms/alternative_path_ch.cpp index 0fafa24477a..2efd6fe1906 100644 --- a/src/engine/routing_algorithms/alternative_path_ch.cpp +++ b/src/engine/routing_algorithms/alternative_path_ch.cpp @@ -90,7 +90,7 @@ void alternativeRoutingStep(const DataFacade &facade, else { // check whether there is a loop present at the node - const auto loop_weight = getLoopWeight(facade, node); + const auto loop_weight = std::get<0>(getLoopWeight(facade, node)); const EdgeWeight new_weight_with_loop = new_weight + loop_weight; if (loop_weight != INVALID_EDGE_WEIGHT && new_weight_with_loop <= *upper_bound_to_shortest_path_weight) diff --git a/src/engine/routing_algorithms/many_to_many_ch.cpp b/src/engine/routing_algorithms/many_to_many_ch.cpp index 8ee02b5ec92..f9fa8e50920 100644 --- a/src/engine/routing_algorithms/many_to_many_ch.cpp +++ b/src/engine/routing_algorithms/many_to_many_ch.cpp @@ -21,18 +21,21 @@ namespace ch inline bool addLoopWeight(const DataFacade &facade, const NodeID node, EdgeWeight &weight, - EdgeDuration &duration) + EdgeDuration &duration, + EdgeDistance &distance) { // Special case for CH when contractor creates a loop edge node->node BOOST_ASSERT(weight < 0); const auto loop_weight = ch::getLoopWeight(facade, node); - if (loop_weight != INVALID_EDGE_WEIGHT) + if (std::get<0>(loop_weight) != INVALID_EDGE_WEIGHT) { - const auto new_weight_with_loop = weight + loop_weight; + const auto new_weight_with_loop = weight + std::get<0>(loop_weight); if (new_weight_with_loop >= 0) { weight = new_weight_with_loop; - duration += ch::getLoopWeight(facade, node); + auto result = ch::getLoopWeight(facade, node); + duration += std::get<0>(result); + distance += std::get<1>(result); return true; } } @@ -46,6 +49,7 @@ void relaxOutgoingEdges(const DataFacade &facade, const NodeID node, const EdgeWeight weight, const EdgeDuration duration, + const EdgeDistance distance, typename SearchEngineData::ManyToManyQueryHeap &query_heap, const PhantomNode &) { @@ -63,21 +67,23 @@ void relaxOutgoingEdges(const DataFacade &facade, const auto edge_weight = data.weight; const auto edge_duration = data.duration; + const auto edge_distance = data.distance; BOOST_ASSERT_MSG(edge_weight > 0, "edge_weight invalid"); const auto to_weight = weight + edge_weight; const auto to_duration = duration + edge_duration; + const auto to_distance = distance + edge_distance; // New Node discovered -> Add to Heap + Node Info Storage if (!query_heap.WasInserted(to)) { - query_heap.Insert(to, to_weight, {node, to_duration}); + query_heap.Insert(to, to_weight, {node, to_duration, to_distance}); } // Found a shorter Path -> Update weight and set new parent else if (std::tie(to_weight, to_duration) < std::tie(query_heap.GetKey(to), query_heap.GetData(to).duration)) { - query_heap.GetData(to) = {node, to_duration}; + query_heap.GetData(to) = {node, to_duration, to_distance}; query_heap.DecreaseKey(to, to_weight); } } @@ -91,12 +97,14 @@ void forwardRoutingStep(const DataFacade &facade, const std::vector &search_space_with_buckets, std::vector &weights_table, std::vector &durations_table, + std::vector &distances_table, std::vector &middle_nodes_table, const PhantomNode &phantom_node) { const auto node = query_heap.DeleteMin(); const auto source_weight = query_heap.GetKey(node); const auto source_duration = query_heap.GetData(node).duration; + const auto source_distance = query_heap.GetData(node).distance; // Check if each encountered node has an entry const auto &bucket_list = std::equal_range(search_space_with_buckets.begin(), @@ -109,20 +117,29 @@ void forwardRoutingStep(const DataFacade &facade, const auto column_index = current_bucket.column_index; const auto target_weight = current_bucket.weight; const auto target_duration = current_bucket.duration; + const auto target_distance = current_bucket.distance; auto ¤t_weight = weights_table[row_index * number_of_targets + column_index]; + + EdgeDistance nulldistance = 0; + auto ¤t_duration = durations_table[row_index * number_of_targets + column_index]; + auto ¤t_distance = + distances_table.empty() ? nulldistance + : distances_table[row_index * number_of_targets + column_index]; // Check if new weight is better auto new_weight = source_weight + target_weight; auto new_duration = source_duration + target_duration; + auto new_distance = source_distance + target_distance; if (new_weight < 0) { - if (addLoopWeight(facade, node, new_weight, new_duration)) + if (addLoopWeight(facade, node, new_weight, new_duration, new_distance)) { current_weight = std::min(current_weight, new_weight); current_duration = std::min(current_duration, new_duration); + current_distance = std::min(current_distance, new_distance); middle_nodes_table[row_index * number_of_targets + column_index] = node; } } @@ -130,12 +147,13 @@ void forwardRoutingStep(const DataFacade &facade, { current_weight = new_weight; current_duration = new_duration; + current_distance = new_distance; middle_nodes_table[row_index * number_of_targets + column_index] = node; } } relaxOutgoingEdges( - facade, node, source_weight, source_duration, query_heap, phantom_node); + facade, node, source_weight, source_duration, source_distance, query_heap, phantom_node); } void backwardRoutingStep(const DataFacade &facade, @@ -147,172 +165,19 @@ void backwardRoutingStep(const DataFacade &facade, const auto node = query_heap.DeleteMin(); const auto target_weight = query_heap.GetKey(node); const auto target_duration = query_heap.GetData(node).duration; + const auto target_distance = query_heap.GetData(node).distance; const auto parent = query_heap.GetData(node).parent; // Store settled nodes in search space bucket search_space_with_buckets.emplace_back( - node, parent, column_index, target_weight, target_duration); + node, parent, column_index, target_weight, target_duration, target_distance); relaxOutgoingEdges( - facade, node, target_weight, target_duration, query_heap, phantom_node); + facade, node, target_weight, target_duration, target_distance, query_heap, phantom_node); } } // namespace ch -void retrievePackedPathFromSearchSpace(const NodeID middle_node_id, - const unsigned column_index, - const std::vector &search_space_with_buckets, - std::vector &packed_leg) -{ - auto bucket_list = std::equal_range(search_space_with_buckets.begin(), - search_space_with_buckets.end(), - middle_node_id, - NodeBucket::ColumnCompare(column_index)); - - NodeID current_node_id = middle_node_id; - - BOOST_ASSERT_MSG(std::distance(bucket_list.first, bucket_list.second) == 1, - "The pointers are not pointing to the same element."); - - while (bucket_list.first->parent_node != current_node_id && - bucket_list.first != search_space_with_buckets.end()) - { - current_node_id = bucket_list.first->parent_node; - - packed_leg.emplace_back(current_node_id); - - bucket_list = std::equal_range(search_space_with_buckets.begin(), - search_space_with_buckets.end(), - current_node_id, - NodeBucket::ColumnCompare(column_index)); - } -} - -void calculateDistances(typename SearchEngineData::ManyToManyQueryHeap &query_heap, - const DataFacade &facade, - const std::vector &phantom_nodes, - const std::vector &target_indices, - const std::size_t row_index, - const std::size_t source_index, - const PhantomNode &source_phantom, - const std::size_t number_of_targets, - const std::vector &search_space_with_buckets, - std::vector &distances_table, - const std::vector &middle_nodes_table) -{ - std::vector packed_leg; - - for (auto column_index : util::irange(0, number_of_targets)) - { - const auto target_index = target_indices[column_index]; - const auto &target_phantom = phantom_nodes[target_index]; - - if (source_index == target_index) - { - distances_table[row_index * number_of_targets + column_index] = 0.0; - continue; - } - - NodeID middle_node_id = middle_nodes_table[row_index * number_of_targets + column_index]; - - if (middle_node_id == SPECIAL_NODEID) // takes care of one-ways - { - distances_table[row_index * number_of_targets + column_index] = INVALID_EDGE_DISTANCE; - continue; - } - - // Step 1: Find path from source to middle node - ch::retrievePackedPathFromSingleManyToManyHeap(query_heap, middle_node_id, packed_leg); - std::reverse(packed_leg.begin(), packed_leg.end()); - - packed_leg.push_back(middle_node_id); - - // Step 2: Find path from middle to target node - retrievePackedPathFromSearchSpace( - middle_node_id, column_index, search_space_with_buckets, packed_leg); - - if (packed_leg.size() == 1 && (needsLoopForward(source_phantom, target_phantom) || - needsLoopBackwards(source_phantom, target_phantom))) - { - auto weight = ch::getLoopWeight(facade, packed_leg.front()); - if (weight != INVALID_EDGE_WEIGHT) - packed_leg.push_back(packed_leg.front()); - } - if (!packed_leg.empty()) - { - auto annotation = - ch::calculateEBGNodeAnnotations(facade, packed_leg.begin(), packed_leg.end()); - - distances_table[row_index * number_of_targets + column_index] = annotation; - - // check the direction of travel to figure out how to calculate the offset to/from - // the source/target - if (source_phantom.forward_segment_id.id == packed_leg.front()) - { - // ............ <-- calculateEGBAnnotation returns distance from 0 to 3 - // -->s <-- subtract offset to start at source - // ......... <-- want this distance as result - // entry 0---1---2---3--- <-- 3 is exit node - EdgeDistance offset = source_phantom.GetForwardDistance(); - distances_table[row_index * number_of_targets + column_index] -= offset; - } - else if (source_phantom.reverse_segment_id.id == packed_leg.front()) - { - // ............ <-- calculateEGBAnnotation returns distance from 0 to 3 - // s<------- <-- subtract offset to start at source - // ... <-- want this distance - // entry 0---1---2---3 <-- 3 is exit node - EdgeDistance offset = source_phantom.GetReverseDistance(); - distances_table[row_index * number_of_targets + column_index] -= offset; - } - if (target_phantom.forward_segment_id.id == packed_leg.back()) - { - // ............ <-- calculateEGBAnnotation returns distance from 0 to 3 - // ++>t <-- add offset to get to target - // ................ <-- want this distance as result - // entry 0---1---2---3--- <-- 3 is exit node - EdgeDistance offset = target_phantom.GetForwardDistance(); - distances_table[row_index * number_of_targets + column_index] += offset; - } - else if (target_phantom.reverse_segment_id.id == packed_leg.back()) - { - // ............ <-- calculateEGBAnnotation returns distance from 0 to 3 - // <++t <-- add offset to get from target - // ................ <-- want this distance as result - // entry 0---1---2---3--- <-- 3 is exit node - EdgeDistance offset = target_phantom.GetReverseDistance(); - distances_table[row_index * number_of_targets + column_index] += offset; - } - } - else - { - // there is no shortcut to unpack. source and target are on the same EBG Node. - // if the offset of the target is greater than the offset of the source, subtract it - if (target_phantom.GetForwardDistance() > source_phantom.GetForwardDistance()) - { - // --------->t <-- offsets - // ->s <-- subtract source offset from target offset - // ......... <-- want this distance as result - // entry 0---1---2---3--- <-- 3 is exit node - EdgeDistance offset = - target_phantom.GetForwardDistance() - source_phantom.GetForwardDistance(); - distances_table[row_index * number_of_targets + column_index] = offset; - } - else - { - // s<--- <-- offsets - // t<--------- <-- subtract source offset from target offset - // ...... <-- want this distance as result - // entry 0---1---2---3--- <-- 3 is exit node - EdgeDistance offset = - target_phantom.GetReverseDistance() - source_phantom.GetReverseDistance(); - distances_table[row_index * number_of_targets + column_index] = offset; - } - } - packed_leg.clear(); - } -} - template <> std::pair, std::vector> manyToManySearch(SearchEngineData &engine_working_data, @@ -320,18 +185,16 @@ manyToManySearch(SearchEngineData &engine_working_data, const std::vector &phantom_nodes, const std::vector &source_indices, const std::vector &target_indices, - const bool calculate_distance, - const bool calculate_duration) + const bool calculate_distance) { - (void)calculate_duration; // TODO: stub to use when computing durations become optional - const auto number_of_sources = source_indices.size(); const auto number_of_targets = target_indices.size(); const auto number_of_entries = number_of_sources * number_of_targets; std::vector weights_table(number_of_entries, INVALID_EDGE_WEIGHT); std::vector durations_table(number_of_entries, MAXIMAL_EDGE_DURATION); - std::vector distances_table; + std::vector distances_table(calculate_distance ? number_of_entries : 0, + MAXIMAL_EDGE_DISTANCE); std::vector middle_nodes_table(number_of_entries, SPECIAL_NODEID); std::vector search_space_with_buckets; @@ -380,25 +243,10 @@ manyToManySearch(SearchEngineData &engine_working_data, search_space_with_buckets, weights_table, durations_table, + distances_table, middle_nodes_table, source_phantom); } - - if (calculate_distance) - { - distances_table.resize(number_of_entries, INVALID_EDGE_DISTANCE); - calculateDistances(query_heap, - facade, - phantom_nodes, - target_indices, - row_index, - source_index, - source_phantom, - number_of_targets, - search_space_with_buckets, - distances_table, - middle_nodes_table); - } } return std::make_pair(durations_table, distances_table); diff --git a/src/engine/routing_algorithms/many_to_many_mld.cpp b/src/engine/routing_algorithms/many_to_many_mld.cpp index 91033abd7e3..55544c4bbf7 100644 --- a/src/engine/routing_algorithms/many_to_many_mld.cpp +++ b/src/engine/routing_algorithms/many_to_many_mld.cpp @@ -41,6 +41,7 @@ void relaxOutgoingEdges(const DataFacade &facade, const NodeID node, const EdgeWeight weight, const EdgeDuration duration, + const EdgeDistance distance, typename SearchEngineData::ManyToManyQueryHeap &query_heap, Args... args) { @@ -65,65 +66,77 @@ void relaxOutgoingEdges(const DataFacade &facade, { // Shortcuts in forward direction auto destination = cell.GetDestinationNodes().begin(); auto shortcut_durations = cell.GetOutDuration(node); + auto shortcut_distances = cell.GetOutDistance(node); for (auto shortcut_weight : cell.GetOutWeight(node)) { BOOST_ASSERT(destination != cell.GetDestinationNodes().end()); BOOST_ASSERT(!shortcut_durations.empty()); + BOOST_ASSERT(!shortcut_distances.empty()); const NodeID to = *destination; if (shortcut_weight != INVALID_EDGE_WEIGHT && node != to) { const auto to_weight = weight + shortcut_weight; const auto to_duration = duration + shortcut_durations.front(); + const auto to_distance = distance + shortcut_distances.front(); if (!query_heap.WasInserted(to)) { - query_heap.Insert(to, to_weight, {node, true, to_duration}); + query_heap.Insert(to, to_weight, {node, true, to_duration, to_distance}); } - else if (std::tie(to_weight, to_duration, node) < + else if (std::tie(to_weight, to_duration, to_distance, node) < std::tie(query_heap.GetKey(to), query_heap.GetData(to).duration, + query_heap.GetData(to).distance, query_heap.GetData(to).parent)) { - query_heap.GetData(to) = {node, true, to_duration}; + query_heap.GetData(to) = {node, true, to_duration, to_distance}; query_heap.DecreaseKey(to, to_weight); } } ++destination; shortcut_durations.advance_begin(1); + shortcut_distances.advance_begin(1); } BOOST_ASSERT(shortcut_durations.empty()); + BOOST_ASSERT(shortcut_distances.empty()); } else { // Shortcuts in backward direction auto source = cell.GetSourceNodes().begin(); auto shortcut_durations = cell.GetInDuration(node); + auto shortcut_distances = cell.GetInDistance(node); for (auto shortcut_weight : cell.GetInWeight(node)) { BOOST_ASSERT(source != cell.GetSourceNodes().end()); BOOST_ASSERT(!shortcut_durations.empty()); + BOOST_ASSERT(!shortcut_distances.empty()); const NodeID to = *source; if (shortcut_weight != INVALID_EDGE_WEIGHT && node != to) { const auto to_weight = weight + shortcut_weight; const auto to_duration = duration + shortcut_durations.front(); + const auto to_distance = distance + shortcut_distances.front(); if (!query_heap.WasInserted(to)) { - query_heap.Insert(to, to_weight, {node, true, to_duration}); + query_heap.Insert(to, to_weight, {node, true, to_duration, to_distance}); } - else if (std::tie(to_weight, to_duration, node) < + else if (std::tie(to_weight, to_duration, to_distance, node) < std::tie(query_heap.GetKey(to), query_heap.GetData(to).duration, + query_heap.GetData(to).distance, query_heap.GetData(to).parent)) { - query_heap.GetData(to) = {node, true, to_duration}; + query_heap.GetData(to) = {node, true, to_duration, to_distance}; query_heap.DecreaseKey(to, to_weight); } } ++source; shortcut_durations.advance_begin(1); + shortcut_distances.advance_begin(1); } BOOST_ASSERT(shortcut_durations.empty()); + BOOST_ASSERT(shortcut_distances.empty()); } } @@ -143,25 +156,28 @@ void relaxOutgoingEdges(const DataFacade &facade, const auto node_id = DIRECTION == FORWARD_DIRECTION ? node : facade.GetTarget(edge); const auto node_weight = facade.GetNodeWeight(node_id); const auto node_duration = facade.GetNodeDuration(node_id); + const auto node_distance = facade.GetNodeDistance(node_id); const auto turn_weight = node_weight + facade.GetWeightPenaltyForEdgeID(turn_id); const auto turn_duration = node_duration + facade.GetDurationPenaltyForEdgeID(turn_id); BOOST_ASSERT_MSG(node_weight + turn_weight > 0, "edge weight is invalid"); const auto to_weight = weight + turn_weight; const auto to_duration = duration + turn_duration; + const auto to_distance = distance + node_distance; // New Node discovered -> Add to Heap + Node Info Storage if (!query_heap.WasInserted(to)) { - query_heap.Insert(to, to_weight, {node, false, to_duration}); + query_heap.Insert(to, to_weight, {node, false, to_duration, to_distance}); } // Found a shorter Path -> Update weight and set new parent - else if (std::tie(to_weight, to_duration, node) < + else if (std::tie(to_weight, to_duration, to_distance, node) < std::tie(query_heap.GetKey(to), query_heap.GetData(to).duration, + query_heap.GetData(to).distance, query_heap.GetData(to).parent)) { - query_heap.GetData(to) = {node, false, to_duration}; + query_heap.GetData(to) = {node, false, to_duration, to_distance}; query_heap.DecreaseKey(to, to_weight); } } @@ -182,11 +198,12 @@ oneToManySearch(SearchEngineData &engine_working_data, { std::vector weights(phantom_indices.size(), INVALID_EDGE_WEIGHT); std::vector durations(phantom_indices.size(), MAXIMAL_EDGE_DURATION); - std::vector distances_table; + std::vector distances_table(calculate_distance ? phantom_indices.size() : 0, + MAXIMAL_EDGE_DISTANCE); std::vector middle_nodes_table(phantom_indices.size(), SPECIAL_NODEID); // Collect destination (source) nodes into a map - std::unordered_multimap> + std::unordered_multimap> target_nodes_index; target_nodes_index.reserve(phantom_indices.size()); for (std::size_t index = 0; index < phantom_indices.size(); ++index) @@ -201,13 +218,15 @@ oneToManySearch(SearchEngineData &engine_working_data, {phantom_node.forward_segment_id.id, std::make_tuple(index, phantom_node.GetForwardWeightPlusOffset(), - phantom_node.GetForwardDuration())}); + phantom_node.GetForwardDuration(), + phantom_node.GetForwardDistance())}); if (phantom_node.IsValidReverseTarget()) target_nodes_index.insert( {phantom_node.reverse_segment_id.id, std::make_tuple(index, phantom_node.GetReverseWeightPlusOffset(), - phantom_node.GetReverseDuration())}); + phantom_node.GetReverseDuration(), + phantom_node.GetReverseDistance())}); } else if (DIRECTION == REVERSE_DIRECTION) { @@ -216,13 +235,15 @@ oneToManySearch(SearchEngineData &engine_working_data, {phantom_node.forward_segment_id.id, std::make_tuple(index, -phantom_node.GetForwardWeightPlusOffset(), - -phantom_node.GetForwardDuration())}); + -phantom_node.GetForwardDuration(), + -phantom_node.GetForwardDistance())}); if (phantom_node.IsValidReverseSource()) target_nodes_index.insert( {phantom_node.reverse_segment_id.id, std::make_tuple(index, -phantom_node.GetReverseWeightPlusOffset(), - -phantom_node.GetReverseDuration())}); + -phantom_node.GetReverseDuration(), + -phantom_node.GetReverseDistance())}); } } @@ -232,44 +253,55 @@ oneToManySearch(SearchEngineData &engine_working_data, auto &query_heap = *(engine_working_data.many_to_many_heap); // Check if node is in the destinations list and update weights/durations - auto update_values = [&](NodeID node, EdgeWeight weight, EdgeDuration duration) { - auto candidates = target_nodes_index.equal_range(node); - for (auto it = candidates.first; it != candidates.second;) - { - std::size_t index; - EdgeWeight target_weight; - EdgeDuration target_duration; - std::tie(index, target_weight, target_duration) = it->second; - - const auto path_weight = weight + target_weight; - if (path_weight >= 0) + auto update_values = + [&](NodeID node, EdgeWeight weight, EdgeDuration duration, EdgeDistance distance) { + auto candidates = target_nodes_index.equal_range(node); + for (auto it = candidates.first; it != candidates.second;) { - const auto path_duration = duration + target_duration; + std::size_t index; + EdgeWeight target_weight; + EdgeDuration target_duration; + EdgeDistance target_distance; + std::tie(index, target_weight, target_duration, target_distance) = it->second; + + const auto path_weight = weight + target_weight; + if (path_weight >= 0) + { + const auto path_duration = duration + target_duration; + const auto path_distance = distance + target_distance; + + EdgeDistance nulldistance = 0; + auto ¤t_distance = + distances_table.empty() ? nulldistance : distances_table[index]; - if (std::tie(path_weight, path_duration) < - std::tie(weights[index], durations[index])) + if (std::tie(path_weight, path_duration, path_distance) < + std::tie(weights[index], durations[index], current_distance)) + { + weights[index] = path_weight; + durations[index] = path_duration; + current_distance = path_distance; + middle_nodes_table[index] = node; + } + + // Remove node from destinations list + it = target_nodes_index.erase(it); + } + else { - weights[index] = path_weight; - durations[index] = path_duration; - middle_nodes_table[index] = node; + ++it; } - - // Remove node from destinations list - it = target_nodes_index.erase(it); - } - else - { - ++it; } - } - }; + }; - auto insert_node = [&](NodeID node, EdgeWeight initial_weight, EdgeDuration initial_duration) { + auto insert_node = [&](NodeID node, + EdgeWeight initial_weight, + EdgeDuration initial_duration, + EdgeDistance initial_distance) { // Update single node paths - update_values(node, initial_weight, initial_duration); + update_values(node, initial_weight, initial_duration, initial_distance); - query_heap.Insert(node, initial_weight, {node, initial_duration}); + query_heap.Insert(node, initial_weight, {node, initial_duration, initial_distance}); // Place adjacent nodes into heap for (auto edge : facade.GetAdjacentEdgeRange(node)) @@ -292,8 +324,9 @@ oneToManySearch(SearchEngineData &engine_working_data, facade.GetWeightPenaltyForEdgeID(turn_id); const auto edge_duration = initial_duration + facade.GetNodeDuration(node_id) + facade.GetDurationPenaltyForEdgeID(turn_id); + const auto edge_distance = initial_distance + facade.GetNodeDistance(node_id); - query_heap.Insert(to, edge_weight, {node, edge_duration}); + query_heap.Insert(to, edge_weight, {node, edge_duration, edge_distance}); } } }; @@ -307,14 +340,16 @@ oneToManySearch(SearchEngineData &engine_working_data, { insert_node(phantom_node.forward_segment_id.id, -phantom_node.GetForwardWeightPlusOffset(), - -phantom_node.GetForwardDuration()); + -phantom_node.GetForwardDuration(), + -phantom_node.GetForwardDistance()); } if (phantom_node.IsValidReverseSource()) { insert_node(phantom_node.reverse_segment_id.id, -phantom_node.GetReverseWeightPlusOffset(), - -phantom_node.GetReverseDuration()); + -phantom_node.GetReverseDuration(), + -phantom_node.GetReverseDistance()); } } else if (DIRECTION == REVERSE_DIRECTION) @@ -323,14 +358,16 @@ oneToManySearch(SearchEngineData &engine_working_data, { insert_node(phantom_node.forward_segment_id.id, phantom_node.GetForwardWeightPlusOffset(), - phantom_node.GetForwardDuration()); + phantom_node.GetForwardDuration(), + phantom_node.GetForwardDistance()); } if (phantom_node.IsValidReverseTarget()) { insert_node(phantom_node.reverse_segment_id.id, phantom_node.GetReverseWeightPlusOffset(), - phantom_node.GetReverseDuration()); + phantom_node.GetReverseDuration(), + phantom_node.GetReverseDistance()); } } } @@ -341,141 +378,23 @@ oneToManySearch(SearchEngineData &engine_working_data, const auto node = query_heap.DeleteMin(); const auto weight = query_heap.GetKey(node); const auto duration = query_heap.GetData(node).duration; + const auto distance = query_heap.GetData(node).distance; // Update values - update_values(node, weight, duration); + update_values(node, weight, duration, distance); // Relax outgoing edges relaxOutgoingEdges(facade, node, weight, duration, + distance, query_heap, phantom_nodes, phantom_index, phantom_indices); } - if (calculate_distance) - { - // Initialize unpacking heaps - engine_working_data.InitializeOrClearFirstThreadLocalStorage( - facade.GetNumberOfNodes(), facade.GetMaxBorderNodeID() + 1); - - distances_table.resize(phantom_indices.size(), INVALID_EDGE_DISTANCE); - - for (unsigned location = 0; location < phantom_indices.size(); ++location) - { - // Get the "middle" node that is the last node of a path - const NodeID middle_node_id = middle_nodes_table[location]; - if (middle_node_id == SPECIAL_NODEID) // takes care of one-ways - { - continue; - } - - // Retrieve the packed path from the heap - PackedPath packed_path = mld::retrievePackedPathFromSingleManyToManyHeap( - query_heap, middle_node_id); - - // ... and reverse it to have packed edges in the correct order, - if (DIRECTION == FORWARD_DIRECTION) - { - std::reverse(packed_path.begin(), packed_path.end()); - } - - // ... unpack path - auto &forward_heap = *engine_working_data.forward_heap_1; - auto &reverse_heap = *engine_working_data.reverse_heap_1; - EdgeWeight weight = INVALID_EDGE_WEIGHT; - std::vector unpacked_nodes; - std::vector unpacked_edges; - - std::tie(weight, unpacked_nodes, unpacked_edges) = - unpackPathAndCalculateDistance(engine_working_data, - facade, - forward_heap, - reverse_heap, - DO_NOT_FORCE_LOOPS, - DO_NOT_FORCE_LOOPS, - INVALID_EDGE_WEIGHT, - packed_path, - middle_node_id, - phantom_nodes, - phantom_index, - phantom_indices); - - // Accumulate the path length without the last node - auto annotation = 0.0; - - BOOST_ASSERT(!unpacked_nodes.empty()); - for (auto node = unpacked_nodes.begin(), last_node = std::prev(unpacked_nodes.end()); - node != last_node; - ++node) - { - annotation += computeEdgeDistance(facade, *node); - } - - // ... and add negative source and positive target offsets - // ⚠ for REVERSE_DIRECTION original source and target phantom nodes are swapped - // Get source and target phantom nodes - // * 1-to-N: source is a single index, target is the corresponding from the indices list - // * N-to-1: source is the corresponding from the indices list, target is a single index - auto source_phantom_index = phantom_index; - auto target_phantom_index = phantom_indices[location]; - if (DIRECTION == REVERSE_DIRECTION) - { - std::swap(source_phantom_index, target_phantom_index); - } - const auto &source_phantom = phantom_nodes[source_phantom_index]; - const auto &target_phantom = phantom_nodes[target_phantom_index]; - const NodeID source_node = unpacked_nodes.front(); - const NodeID target_node = unpacked_nodes.back(); - - EdgeDistance source_offset = 0., target_offset = 0.; - if (source_phantom.IsValidForwardSource() && - source_phantom.forward_segment_id.id == source_node) - { - // ............ <-- calculateEGBAnnotation returns distance from 0 - // to 3 - // -->s <-- subtract offset to start at source - // ......... <-- want this distance as result - // entry 0---1---2---3--- <-- 3 is exit node - source_offset = source_phantom.GetForwardDistance(); - } - else if (source_phantom.IsValidReverseSource() && - source_phantom.reverse_segment_id.id == source_node) - { - // ............ <-- calculateEGBAnnotation returns distance from 0 to 3 - // s<------- <-- subtract offset to start at source - // ... <-- want this distance - // entry 0---1---2---3 <-- 3 is exit node - source_offset = source_phantom.GetReverseDistance(); - } - if (target_phantom.IsValidForwardTarget() && - target_phantom.forward_segment_id.id == target_node) - { - // ............ <-- calculateEGBAnnotation returns distance from 0 - // to 3 - // ++>t <-- add offset to get to target - // ................ <-- want this distance as result - // entry 0---1---2---3--- <-- 3 is exit node - target_offset = target_phantom.GetForwardDistance(); - } - else if (target_phantom.IsValidReverseTarget() && - target_phantom.reverse_segment_id.id == target_node) - { - // ............ <-- calculateEGBAnnotation returns distance from 0 - // to 3 - // <++t <-- add offset to get from target - // ................ <-- want this distance as result - // entry 0---1---2---3--- <-- 3 is exit node - target_offset = target_phantom.GetReverseDistance(); - } - - distances_table[location] = -source_offset + annotation + target_offset; - } - } - return std::make_pair(durations, distances_table); } @@ -491,12 +410,14 @@ void forwardRoutingStep(const DataFacade &facade, const std::vector &search_space_with_buckets, std::vector &weights_table, std::vector &durations_table, + std::vector &distances_table, std::vector &middle_nodes_table, const PhantomNode &phantom_node) { const auto node = query_heap.DeleteMin(); const auto source_weight = query_heap.GetKey(node); const auto source_duration = query_heap.GetData(node).duration; + const auto source_distance = query_heap.GetData(node).distance; // Check if each encountered node has an entry const auto &bucket_list = std::equal_range(search_space_with_buckets.begin(), @@ -509,6 +430,7 @@ void forwardRoutingStep(const DataFacade &facade, const auto column_idx = current_bucket.column_index; const auto target_weight = current_bucket.weight; const auto target_duration = current_bucket.duration; + const auto target_distance = current_bucket.distance; // Get the value location in the results tables: // * row-major direct (row_idx, column_idx) index for forward direction @@ -519,21 +441,27 @@ void forwardRoutingStep(const DataFacade &facade, auto ¤t_weight = weights_table[location]; auto ¤t_duration = durations_table[location]; + EdgeDistance nulldistance = 0; + auto ¤t_distance = distances_table.empty() ? nulldistance : distances_table[location]; + // Check if new weight is better auto new_weight = source_weight + target_weight; auto new_duration = source_duration + target_duration; + auto new_distance = source_distance + target_distance; if (new_weight >= 0 && - std::tie(new_weight, new_duration) < std::tie(current_weight, current_duration)) + std::tie(new_weight, new_duration, new_distance) < + std::tie(current_weight, current_duration, current_distance)) { current_weight = new_weight; current_duration = new_duration; + current_distance = new_distance; middle_nodes_table[location] = node; } } relaxOutgoingEdges( - facade, node, source_weight, source_duration, query_heap, phantom_node); + facade, node, source_weight, source_duration, source_distance, query_heap, phantom_node); } template @@ -546,18 +474,25 @@ void backwardRoutingStep(const DataFacade &facade, const auto node = query_heap.DeleteMin(); const auto target_weight = query_heap.GetKey(node); const auto target_duration = query_heap.GetData(node).duration; + const auto target_distance = query_heap.GetData(node).distance; const auto parent = query_heap.GetData(node).parent; const auto from_clique_arc = query_heap.GetData(node).from_clique_arc; // Store settled nodes in search space bucket search_space_with_buckets.emplace_back( - node, parent, from_clique_arc, column_idx, target_weight, target_duration); + node, parent, from_clique_arc, column_idx, target_weight, target_duration, target_distance); const auto &partition = facade.GetMultiLevelPartition(); const auto maximal_level = partition.GetNumberOfLevels() - 1; - relaxOutgoingEdges( - facade, node, target_weight, target_duration, query_heap, phantom_node, maximal_level); + relaxOutgoingEdges(facade, + node, + target_weight, + target_duration, + target_distance, + query_heap, + phantom_node, + maximal_level); } template @@ -596,182 +531,6 @@ void retrievePackedPathFromSearchSpace(NodeID middle_node_id, } } -template -void calculateDistances(typename SearchEngineData::ManyToManyQueryHeap &query_heap, - const DataFacade &facade, - const std::vector &phantom_nodes, - const std::vector &target_indices, - const unsigned row_idx, - const std::size_t source_index, - const unsigned number_of_sources, - const unsigned number_of_targets, - const std::vector &search_space_with_buckets, - std::vector &distances_table, - const std::vector &middle_nodes_table, - SearchEngineData &engine_working_data) -{ - engine_working_data.InitializeOrClearFirstThreadLocalStorage(facade.GetNumberOfNodes(), - facade.GetMaxBorderNodeID() + 1); - - for (unsigned column_idx = 0; column_idx < number_of_targets; ++column_idx) - { - // Step 1: Get source and target phantom nodes that were used in the bucketed search - auto source_phantom_index = source_index; - auto target_phantom_index = target_indices[column_idx]; - const auto &source_phantom = phantom_nodes[source_phantom_index]; - const auto &target_phantom = phantom_nodes[target_phantom_index]; - - const auto location = DIRECTION == FORWARD_DIRECTION - ? row_idx * number_of_targets + column_idx - : row_idx + column_idx * number_of_sources; - - if (source_phantom_index == target_phantom_index) - { - distances_table[location] = 0.0; - continue; - } - - NodeID middle_node_id = middle_nodes_table[location]; - - if (middle_node_id == SPECIAL_NODEID) // takes care of one-ways - { - distances_table[location] = INVALID_EDGE_DISTANCE; - continue; - } - - // Step 2: Find path from source to middle node - PackedPath packed_path = - mld::retrievePackedPathFromSingleManyToManyHeap(query_heap, middle_node_id); - - if (DIRECTION == FORWARD_DIRECTION) - { - std::reverse(packed_path.begin(), packed_path.end()); - } - - auto &forward_heap = *engine_working_data.forward_heap_1; - auto &reverse_heap = *engine_working_data.reverse_heap_1; - EdgeWeight weight = INVALID_EDGE_WEIGHT; - std::vector unpacked_nodes_from_source; - std::vector unpacked_edges; - std::tie(weight, unpacked_nodes_from_source, unpacked_edges) = - unpackPathAndCalculateDistance(engine_working_data, - facade, - forward_heap, - reverse_heap, - DO_NOT_FORCE_LOOPS, - DO_NOT_FORCE_LOOPS, - INVALID_EDGE_WEIGHT, - packed_path, - middle_node_id, - source_phantom); - - // Step 3: Find path from middle to target node - packed_path.clear(); - retrievePackedPathFromSearchSpace( - middle_node_id, column_idx, search_space_with_buckets, packed_path); - - if (DIRECTION == REVERSE_DIRECTION) - { - std::reverse(packed_path.begin(), packed_path.end()); - } - - std::vector unpacked_nodes_to_target; - std::tie(weight, unpacked_nodes_to_target, unpacked_edges) = - unpackPathAndCalculateDistance(engine_working_data, - facade, - forward_heap, - reverse_heap, - DO_NOT_FORCE_LOOPS, - DO_NOT_FORCE_LOOPS, - INVALID_EDGE_WEIGHT, - packed_path, - middle_node_id, - target_phantom); - - if (DIRECTION == REVERSE_DIRECTION) - { - std::swap(unpacked_nodes_to_target, unpacked_nodes_from_source); - } - - // Step 4: Compute annotation value along the path nodes without the target node - auto annotation = 0.0; - - for (auto node = unpacked_nodes_from_source.begin(), - last_node = std::prev(unpacked_nodes_from_source.end()); - node != last_node; - ++node) - { - annotation += computeEdgeDistance(facade, *node); - } - - for (auto node = unpacked_nodes_to_target.begin(), - last_node = std::prev(unpacked_nodes_to_target.end()); - node != last_node; - ++node) - { - annotation += computeEdgeDistance(facade, *node); - } - - // Step 5: Get phantom node offsets and compute the annotation value - EdgeDistance source_offset = 0., target_offset = 0.; - { - // ⚠ for REVERSE_DIRECTION original source and target phantom nodes are swapped - if (DIRECTION == REVERSE_DIRECTION) - { - std::swap(source_phantom_index, target_phantom_index); - } - const auto &source_phantom = phantom_nodes[source_phantom_index]; - const auto &target_phantom = phantom_nodes[target_phantom_index]; - - NodeID source_node = unpacked_nodes_from_source.front(); - NodeID target_node = unpacked_nodes_to_target.back(); - - if (source_phantom.IsValidForwardSource() && - source_phantom.forward_segment_id.id == source_node) - { - // ............ <-- calculateEGBAnnotation returns distance from 0 - // to 3 - // -->s <-- subtract offset to start at source - // ......... <-- want this distance as result - // entry 0---1---2---3--- <-- 3 is exit node - source_offset = source_phantom.GetForwardDistance(); - } - else if (source_phantom.IsValidReverseSource() && - source_phantom.reverse_segment_id.id == source_node) - { - // ............ <-- calculateEGBAnnotation returns distance from 0 to 3 - // s<------- <-- subtract offset to start at source - // ... <-- want this distance - // entry 0---1---2---3 <-- 3 is exit node - source_offset = source_phantom.GetReverseDistance(); - } - - if (target_phantom.IsValidForwardTarget() && - target_phantom.forward_segment_id.id == target_node) - { - // ............ <-- calculateEGBAnnotation returns distance from 0 - // to 3 - // ++>t <-- add offset to get to target - // ................ <-- want this distance as result - // entry 0---1---2---3--- <-- 3 is exit node - target_offset = target_phantom.GetForwardDistance(); - } - else if (target_phantom.IsValidReverseTarget() && - target_phantom.reverse_segment_id.id == target_node) - { - // ............ <-- calculateEGBAnnotation returns distance from 0 - // to 3 - // <++t <-- add offset to get from target - // ................ <-- want this distance as result - // entry 0---1---2---3--- <-- 3 is exit node - target_offset = target_phantom.GetReverseDistance(); - } - } - - distances_table[location] = -source_offset + annotation + target_offset; - } -} - template std::pair, std::vector> manyToManySearch(SearchEngineData &engine_working_data, @@ -787,7 +546,8 @@ manyToManySearch(SearchEngineData &engine_working_data, std::vector weights_table(number_of_entries, INVALID_EDGE_WEIGHT); std::vector durations_table(number_of_entries, MAXIMAL_EDGE_DURATION); - std::vector distances_table; + std::vector distances_table(calculate_distance ? number_of_entries : 0, + INVALID_EDGE_DISTANCE); std::vector middle_nodes_table(number_of_entries, SPECIAL_NODEID); std::vector search_space_with_buckets; @@ -846,25 +606,9 @@ manyToManySearch(SearchEngineData &engine_working_data, search_space_with_buckets, weights_table, durations_table, - middle_nodes_table, - source_phantom); - } - - if (calculate_distance) - { - distances_table.resize(number_of_entries, INVALID_EDGE_DISTANCE); - calculateDistances(query_heap, - facade, - phantom_nodes, - target_indices, // source_indices - row_idx, - source_index, - number_of_sources, - number_of_targets, - search_space_with_buckets, distances_table, middle_nodes_table, - engine_working_data); + source_phantom); } } @@ -892,12 +636,8 @@ manyToManySearch(SearchEngineData &engine_working_data, const std::vector &phantom_nodes, const std::vector &source_indices, const std::vector &target_indices, - const bool calculate_distance, - const bool calculate_duration) + const bool calculate_distance) { - (void)calculate_duration; // flag stub to use for calculating distances in matrix in mld in the - // future - if (source_indices.size() == 1) { // TODO: check if target_indices.size() == 1 and do a bi-directional search return mld::oneToManySearch(engine_working_data, diff --git a/src/extractor/edge_based_graph_factory.cpp b/src/extractor/edge_based_graph_factory.cpp index 8d77e20743d..a5d5b605b3c 100644 --- a/src/extractor/edge_based_graph_factory.cpp +++ b/src/extractor/edge_based_graph_factory.cpp @@ -114,6 +114,13 @@ void EdgeBasedGraphFactory::GetEdgeBasedNodeDurations( swap(m_edge_based_node_durations, output_node_durations); } +void EdgeBasedGraphFactory::GetEdgeBasedNodeDistances( + std::vector &output_node_distances) +{ + using std::swap; // Koenig swap + swap(m_edge_based_node_distances, output_node_distances); +} + std::uint32_t EdgeBasedGraphFactory::GetConnectivityChecksum() const { return m_connectivity_checksum; @@ -291,8 +298,12 @@ unsigned EdgeBasedGraphFactory::LabelEdgeBasedNodes() { // heuristic: node-based graph node is a simple intersection with four edges // (edge-based nodes) - m_edge_based_node_weights.reserve(4 * m_node_based_graph.GetNumberOfNodes()); - m_edge_based_node_durations.reserve(4 * m_node_based_graph.GetNumberOfNodes()); + constexpr std::size_t ESTIMATED_EDGE_COUNT = 4; + m_edge_based_node_weights.reserve(ESTIMATED_EDGE_COUNT * m_node_based_graph.GetNumberOfNodes()); + m_edge_based_node_durations.reserve(ESTIMATED_EDGE_COUNT * + m_node_based_graph.GetNumberOfNodes()); + m_edge_based_node_distances.reserve(ESTIMATED_EDGE_COUNT * + m_node_based_graph.GetNumberOfNodes()); nbe_to_ebn_mapping.resize(m_node_based_graph.GetEdgeCapacity(), SPECIAL_NODEID); // renumber edge based node of outgoing edges @@ -310,6 +321,7 @@ unsigned EdgeBasedGraphFactory::LabelEdgeBasedNodes() m_edge_based_node_weights.push_back(edge_data.weight); m_edge_based_node_durations.push_back(edge_data.duration); + m_edge_based_node_distances.push_back(edge_data.distance); BOOST_ASSERT(numbered_edges_count < m_node_based_graph.GetNumberOfEdges()); nbe_to_ebn_mapping[current_edge] = numbered_edges_count; @@ -407,6 +419,8 @@ EdgeBasedGraphFactory::GenerateEdgeExpandedNodes(const WayRestrictionMap &way_re m_edge_based_node_weights.push_back(ebn_weight); m_edge_based_node_durations.push_back( m_edge_based_node_durations[nbe_to_ebn_mapping[eid]]); + m_edge_based_node_distances.push_back( + m_edge_based_node_distances[nbe_to_ebn_mapping[eid]]); edge_based_node_id++; progress.PrintStatus(progress_counter++); @@ -416,6 +430,7 @@ EdgeBasedGraphFactory::GenerateEdgeExpandedNodes(const WayRestrictionMap &way_re BOOST_ASSERT(m_edge_based_node_segments.size() == m_edge_based_node_is_startpoint.size()); BOOST_ASSERT(m_number_of_edge_based_nodes == m_edge_based_node_weights.size()); BOOST_ASSERT(m_number_of_edge_based_nodes == m_edge_based_node_durations.size()); + BOOST_ASSERT(m_number_of_edge_based_nodes == m_edge_based_node_distances.size()); util::Log() << "Generated " << m_number_of_edge_based_nodes << " nodes (" << way_restriction_map.NumberOfDuplicatedNodes() @@ -652,16 +667,17 @@ void EdgeBasedGraphFactory::GenerateEdgeExpandedEdges( // auto turn_id = m_edge_based_edge_list.size(); auto weight = boost::numeric_cast(edge_data1.weight + weight_penalty); auto duration = boost::numeric_cast(edge_data1.duration + duration_penalty); - - EdgeBasedEdge edge_based_edge = { - edge_based_node_from, - edge_based_node_to, - SPECIAL_NODEID, // This will be updated once the main loop - // completes! - weight, - duration, - true, - false}; + auto distance = boost::numeric_cast(edge_data1.distance); + + EdgeBasedEdge edge_based_edge = {edge_based_node_from, + edge_based_node_to, + SPECIAL_NODEID, // This will be updated once the main + // loop completes! + weight, + duration, + distance, + true, + false}; // We write out the mapping between the edge-expanded edges and the original nodes. // Since each edge represents a possible maneuver, external programs can use this to diff --git a/src/extractor/extraction_containers.cpp b/src/extractor/extraction_containers.cpp index 6f5668bb3c7..be4264825ee 100644 --- a/src/extractor/extraction_containers.cpp +++ b/src/extractor/extraction_containers.cpp @@ -387,12 +387,16 @@ void ExtractionContainers::PrepareEdges(ScriptingEnvironment &scripting_environm const auto weight = edge_iterator->weight_data(distance); const auto duration = edge_iterator->duration_data(distance); + const auto accurate_distance = + util::coordinate_calculation::fccApproximateDistance(source_coord, target_coord); + ExtractionSegment segment(source_coord, target_coord, distance, weight, duration); scripting_environment.ProcessSegment(segment); auto &edge = edge_iterator->result; edge.weight = std::max(1, std::round(segment.weight * weight_multiplier)); edge.duration = std::max(1, std::round(segment.duration * 10.)); + edge.distance = accurate_distance; // assign new node id const auto node_id = mapExternalToInternalNodeID( diff --git a/src/extractor/extractor.cpp b/src/extractor/extractor.cpp index f62bb1b39cc..dc92f7011b8 100644 --- a/src/extractor/extractor.cpp +++ b/src/extractor/extractor.cpp @@ -242,6 +242,7 @@ int Extractor::run(ScriptingEnvironment &scripting_environment) std::vector node_is_startpoint; std::vector edge_based_node_weights; std::vector edge_based_node_durations; + std::vector edge_based_node_distances; std::uint32_t ebg_connectivity_checksum = 0; // Create a node-based graph from the OSRM file @@ -322,6 +323,7 @@ int Extractor::run(ScriptingEnvironment &scripting_environment) node_is_startpoint, edge_based_node_weights, edge_based_node_durations, + edge_based_node_distances, edge_based_edge_list, ebg_connectivity_checksum); @@ -345,8 +347,10 @@ int Extractor::run(ScriptingEnvironment &scripting_environment) util::Log() << "Saving edge-based node weights to file."; TIMER_START(timer_write_node_weights); - extractor::files::writeEdgeBasedNodeWeightsDurations( - config.GetPath(".osrm.enw"), edge_based_node_weights, edge_based_node_durations); + extractor::files::writeEdgeBasedNodeWeightsDurationsDistances(config.GetPath(".osrm.enw"), + edge_based_node_weights, + edge_based_node_durations, + edge_based_node_distances); TIMER_STOP(timer_write_node_weights); util::Log() << "Done writing. (" << TIMER_SEC(timer_write_node_weights) << ")"; @@ -736,6 +740,7 @@ EdgeID Extractor::BuildEdgeExpandedGraph( std::vector &node_is_startpoint, std::vector &edge_based_node_weights, std::vector &edge_based_node_durations, + std::vector &edge_based_node_distances, util::DeallocatingVector &edge_based_edge_list, std::uint32_t &connectivity_checksum) { @@ -786,6 +791,7 @@ EdgeID Extractor::BuildEdgeExpandedGraph( edge_based_graph_factory.GetStartPointMarkers(node_is_startpoint); edge_based_graph_factory.GetEdgeBasedNodeWeights(edge_based_node_weights); edge_based_graph_factory.GetEdgeBasedNodeDurations(edge_based_node_durations); + edge_based_graph_factory.GetEdgeBasedNodeDistances(edge_based_node_distances); connectivity_checksum = edge_based_graph_factory.GetConnectivityChecksum(); return number_of_edge_based_nodes; diff --git a/src/extractor/extractor_callbacks.cpp b/src/extractor/extractor_callbacks.cpp index c34f67ded0b..cfe98310646 100644 --- a/src/extractor/extractor_callbacks.cpp +++ b/src/extractor/extractor_callbacks.cpp @@ -415,6 +415,7 @@ void ExtractorCallbacks::ProcessWay(const osmium::Way &input_way, const Extracti OSMNodeID{static_cast(last_node.ref())}, 0, // weight 0, // duration + 0, // distance {}, // geometry id static_cast(annotation_data_id), {true, @@ -450,6 +451,7 @@ void ExtractorCallbacks::ProcessWay(const osmium::Way &input_way, const Extracti OSMNodeID{static_cast(last_node.ref())}, 0, // weight 0, // duration + 0, // distance {}, // geometry id static_cast(annotation_data_id), {false, diff --git a/src/extractor/graph_compressor.cpp b/src/extractor/graph_compressor.cpp index fefda38e102..73700600644 100644 --- a/src/extractor/graph_compressor.cpp +++ b/src/extractor/graph_compressor.cpp @@ -259,6 +259,7 @@ void GraphCompressor::Compress( const auto forward_weight2 = fwd_edge_data2.weight; const auto forward_duration1 = fwd_edge_data1.duration; const auto forward_duration2 = fwd_edge_data2.duration; + const auto forward_distance2 = fwd_edge_data2.distance; BOOST_ASSERT(0 != forward_weight1); BOOST_ASSERT(0 != forward_weight2); @@ -267,6 +268,17 @@ void GraphCompressor::Compress( const auto reverse_weight2 = rev_edge_data2.weight; const auto reverse_duration1 = rev_edge_data1.duration; const auto reverse_duration2 = rev_edge_data2.duration; + const auto reverse_distance2 = rev_edge_data2.distance; + +#ifndef NDEBUG + // Because distances are symmetrical, we only need one + // per edge - here we double-check that they match + // their mirrors. + const auto reverse_distance1 = rev_edge_data1.distance; + const auto forward_distance1 = fwd_edge_data1.distance; + BOOST_ASSERT(forward_distance1 == reverse_distance2); + BOOST_ASSERT(forward_distance2 == reverse_distance1); +#endif BOOST_ASSERT(0 != reverse_weight1); BOOST_ASSERT(0 != reverse_weight2); @@ -279,6 +291,10 @@ void GraphCompressor::Compress( graph.GetEdgeData(forward_e1).duration += forward_duration2; graph.GetEdgeData(reverse_e1).duration += reverse_duration2; + // add distance of e2's to e1 + graph.GetEdgeData(forward_e1).distance += forward_distance2; + graph.GetEdgeData(reverse_e1).distance += reverse_distance2; + if (node_weight_penalty != INVALID_EDGE_WEIGHT && node_duration_penalty != MAXIMAL_EDGE_DURATION) { @@ -286,6 +302,7 @@ void GraphCompressor::Compress( graph.GetEdgeData(reverse_e1).weight += node_weight_penalty; graph.GetEdgeData(forward_e1).duration += node_duration_penalty; graph.GetEdgeData(reverse_e1).duration += node_duration_penalty; + // Note: no penalties for distances } // extend e1's to targets of e2's diff --git a/src/nodejs/node_osrm.cpp b/src/nodejs/node_osrm.cpp index 14d970c775a..445c185ede4 100644 --- a/src/nodejs/node_osrm.cpp +++ b/src/nodejs/node_osrm.cpp @@ -363,7 +363,7 @@ NAN_METHOD(Engine::nearest) // * @param {Function} callback * - * @returns {Object} containing `durations`, `sources`, and `destinations`. + * @returns {Object} containing `durations`, `distances`, `sources`, and `destinations`. * **`durations`**: array of arrays that stores the matrix in row-major order. `durations[i][j]` gives the travel time from the i-th waypoint to the j-th waypoint. * Values are given in seconds. * **`distances`**: array of arrays that stores the matrix in row-major order. `distances[i][j]` gives the travel time from the i-th waypoint to the j-th waypoint. diff --git a/src/partitioner/partitioner.cpp b/src/partitioner/partitioner.cpp index c180893863e..bac7e6d66f3 100644 --- a/src/partitioner/partitioner.cpp +++ b/src/partitioner/partitioner.cpp @@ -147,12 +147,15 @@ int Partitioner::Run(const PartitionerConfig &config) { std::vector node_weights; std::vector node_durations; + std::vector node_distances; extractor::files::readEdgeBasedNodeWeightsDurations( config.GetPath(".osrm.enw"), node_weights, node_durations); + extractor::files::readEdgeBasedNodeDistances(config.GetPath(".osrm.enw"), node_distances); util::inplacePermutation(node_weights.begin(), node_weights.end(), permutation); util::inplacePermutation(node_durations.begin(), node_durations.end(), permutation); - extractor::files::writeEdgeBasedNodeWeightsDurations( - config.GetPath(".osrm.enw"), node_weights, node_durations); + util::inplacePermutation(node_distances.begin(), node_distances.end(), permutation); + extractor::files::writeEdgeBasedNodeWeightsDurationsDistances( + config.GetPath(".osrm.enw"), node_weights, node_durations, node_distances); } { const auto &filename = config.GetPath(".osrm.maneuver_overrides"); diff --git a/src/server/service/table_service.cpp b/src/server/service/table_service.cpp index 9a9ce0ab218..ad5f16ab14d 100644 --- a/src/server/service/table_service.cpp +++ b/src/server/service/table_service.cpp @@ -56,6 +56,16 @@ std::string getWrongOptionHelp(const engine::api::TableParameters ¶meters) help = "Number of coordinates needs to be at least two."; } + if (parameters.fallback_speed <= 0) + { + help = "fallback_speed must be > 0"; + } + + if (parameters.scale_factor <= 0) + { + help = "scale_factor must be > 0"; + } + return help; } } // anon. ns diff --git a/src/storage/storage.cpp b/src/storage/storage.cpp index 213217425f8..503b1c10ef4 100644 --- a/src/storage/storage.cpp +++ b/src/storage/storage.cpp @@ -44,24 +44,6 @@ namespace { using Monitor = SharedMonitor; -void readBlocks(const boost::filesystem::path &path, DataLayout &layout) -{ - tar::FileReader reader(path, tar::FileReader::VerifyFingerprint); - - std::vector entries; - reader.List(std::back_inserter(entries)); - - for (const auto &entry : entries) - { - const auto name_end = entry.name.rfind(".meta"); - if (name_end == std::string::npos) - { - auto number_of_elements = reader.ReadElementCount64(entry.name); - layout.SetBlock(entry.name, Block{number_of_elements, entry.size}); - } - } -} - struct RegionHandle { std::unique_ptr memory; @@ -69,7 +51,8 @@ struct RegionHandle std::uint16_t shm_key; }; -auto setupRegion(SharedRegionRegister &shared_register, const DataLayout &layout) +RegionHandle setupRegion(SharedRegionRegister &shared_register, + const storage::BaseDataLayout &layout) { // This is safe because we have an exclusive lock for all osrm-datastore processes. auto shm_key = shared_register.ReserveKey(); @@ -184,6 +167,24 @@ bool swapData(Monitor &monitor, } } +void populateLayoutFromFile(const boost::filesystem::path &path, storage::BaseDataLayout &layout) +{ + tar::FileReader reader(path, tar::FileReader::VerifyFingerprint); + + std::vector entries; + reader.List(std::back_inserter(entries)); + + for (const auto &entry : entries) + { + const auto name_end = entry.name.rfind(".meta"); + if (name_end == std::string::npos) + { + auto number_of_elements = reader.ReadElementCount64(entry.name); + layout.SetBlock(entry.name, Block{number_of_elements, entry.size, entry.offset}); + } + } +} + Storage::Storage(StorageConfig config_) : config(std::move(config_)) {} int Storage::Run(int max_wait, const std::string &dataset_name, bool only_metric) @@ -243,29 +244,35 @@ int Storage::Run(int max_wait, const std::string &dataset_name, bool only_metric auto static_region = shared_register.GetRegion(region_id); auto static_memory = makeSharedMemory(static_region.shm_key); - DataLayout static_layout; + std::unique_ptr static_layout = + std::make_unique(); io::BufferReader reader(reinterpret_cast(static_memory->Ptr()), static_memory->Size()); - serialization::read(reader, static_layout); + serialization::read(reader, *static_layout); auto layout_size = reader.GetPosition(); auto *data_ptr = reinterpret_cast(static_memory->Ptr()) + layout_size; - regions.push_back({data_ptr, static_layout}); + regions.push_back({data_ptr, std::move(static_layout)}); readonly_handles.push_back({std::move(static_memory), data_ptr, static_region.shm_key}); } else { - DataLayout static_layout; - PopulateStaticLayout(static_layout); - auto static_handle = setupRegion(shared_register, static_layout); - regions.push_back({static_handle.data_ptr, static_layout}); + std::unique_ptr static_layout = + std::make_unique(); + Storage::PopulateLayoutWithRTree(*static_layout); + std::vector> files = Storage::GetStaticFiles(); + Storage::PopulateLayout(*static_layout, files); + auto static_handle = setupRegion(shared_register, *static_layout); + regions.push_back({static_handle.data_ptr, std::move(static_layout)}); handles[dataset_name + "/static"] = std::move(static_handle); } - DataLayout updatable_layout; - PopulateUpdatableLayout(updatable_layout); - auto updatable_handle = setupRegion(shared_register, updatable_layout); - regions.push_back({updatable_handle.data_ptr, updatable_layout}); + std::unique_ptr updatable_layout = + std::make_unique(); + std::vector> files = Storage::GetUpdatableFiles(); + Storage::PopulateLayout(*updatable_layout, files); + auto updatable_handle = setupRegion(shared_register, *updatable_layout); + regions.push_back({updatable_handle.data_ptr, std::move(updatable_layout)}); handles[dataset_name + "/updatable"] = std::move(updatable_handle); SharedDataIndex index{std::move(regions)}; @@ -281,24 +288,12 @@ int Storage::Run(int max_wait, const std::string &dataset_name, bool only_metric return EXIT_SUCCESS; } -/** - * This function examines all our data files and figures out how much - * memory needs to be allocated, and the position of each data structure - * in that big block. It updates the fields in the DataLayout parameter. - */ -void Storage::PopulateStaticLayout(DataLayout &static_layout) +std::vector> Storage::GetStaticFiles() { - { - auto absolute_file_index_path = - boost::filesystem::absolute(config.GetPath(".osrm.fileIndex")); - - static_layout.SetBlock("/common/rtree/file_index_path", - make_block(absolute_file_index_path.string().length() + 1)); - } - constexpr bool REQUIRED = true; constexpr bool OPTIONAL = false; - std::vector> tar_files = { + + std::vector> files = { {OPTIONAL, config.GetPath(".osrm.cells")}, {OPTIONAL, config.GetPath(".osrm.partition")}, {REQUIRED, config.GetPath(".osrm.icd")}, @@ -310,53 +305,73 @@ void Storage::PopulateStaticLayout(DataLayout &static_layout) {REQUIRED, config.GetPath(".osrm.maneuver_overrides")}, {REQUIRED, config.GetPath(".osrm.edges")}, {REQUIRED, config.GetPath(".osrm.names")}, - {REQUIRED, config.GetPath(".osrm.ramIndex")}, - }; + {REQUIRED, config.GetPath(".osrm.ramIndex")}}; - for (const auto &file : tar_files) + for (const auto &file : files) { - if (boost::filesystem::exists(file.second)) - { - readBlocks(file.second, static_layout); - } - else + if (file.first == REQUIRED && !boost::filesystem::exists(file.second)) { - if (file.first == REQUIRED) - { - throw util::exception("Could not find required filed: " + - std::get<1>(file).string()); - } + throw util::exception("Could not find required filed: " + std::get<1>(file).string()); } } + + return files; } -void Storage::PopulateUpdatableLayout(DataLayout &updatable_layout) +std::vector> Storage::GetUpdatableFiles() { constexpr bool REQUIRED = true; constexpr bool OPTIONAL = false; - std::vector> tar_files = { + + std::vector> files = { {OPTIONAL, config.GetPath(".osrm.mldgr")}, {OPTIONAL, config.GetPath(".osrm.cell_metrics")}, {OPTIONAL, config.GetPath(".osrm.hsgr")}, {REQUIRED, config.GetPath(".osrm.datasource_names")}, {REQUIRED, config.GetPath(".osrm.geometry")}, {REQUIRED, config.GetPath(".osrm.turn_weight_penalties")}, - {REQUIRED, config.GetPath(".osrm.turn_duration_penalties")}, - }; + {REQUIRED, config.GetPath(".osrm.turn_duration_penalties")}}; - for (const auto &file : tar_files) + for (const auto &file : files) { - if (boost::filesystem::exists(file.second)) + if (file.first == REQUIRED && !boost::filesystem::exists(file.second)) { - readBlocks(file.second, updatable_layout); + throw util::exception("Could not find required filed: " + std::get<1>(file).string()); } - else + } + + return files; +} + +std::string Storage::PopulateLayoutWithRTree(storage::BaseDataLayout &layout) +{ + // Figure out the path to the rtree file (it's not a tar file) + auto absolute_file_index_path = boost::filesystem::absolute(config.GetPath(".osrm.fileIndex")); + + // Convert the boost::filesystem::path object into a plain string + // that can then be stored as a member of an allocator object + auto rtree_filename = absolute_file_index_path.string(); + + // Here, we hardcode the special file_index_path block name. + // The important bit here is that the "offset" is set to zero + layout.SetBlock("/common/rtree/file_index_path", make_block(rtree_filename.length() + 1)); + + return rtree_filename; +} + +/** + * This function examines all our data files and figures out how much + * memory needs to be allocated, and the position of each data structure + * in that big block. It updates the fields in the layout parameter. + */ +void Storage::PopulateLayout(storage::BaseDataLayout &layout, + const std::vector> &files) +{ + for (const auto &file : files) + { + if (boost::filesystem::exists(file.second)) { - if (file.first == REQUIRED) - { - throw util::exception("Could not find required filed: " + - std::get<1>(file).string()); - } + populateLayoutFromFile(file.second, layout); } } } diff --git a/src/tools/routed.cpp b/src/tools/routed.cpp index 25a62b03aae..718e3e4d09a 100644 --- a/src/tools/routed.cpp +++ b/src/tools/routed.cpp @@ -119,7 +119,10 @@ inline unsigned generateServerProgramOptions(const int argc, "Load data from shared memory") // ("memory_file", value(&config.memory_file), - "Store data in a memory mapped file rather than in process memory.") // + "DEPRECATED: Will behave the same as --mmap.")( + "mmap,m", + value(&config.use_mmap)->implicit_value(true)->default_value(false), + "Map datafiles directly, do not use any additional memory.") // ("dataset-name", value(&config.dataset_name), "Name of the shared memory dataset to connect to.") // diff --git a/src/tools/store.cpp b/src/tools/store.cpp index bd21c9b4b1d..533f0d01026 100644 --- a/src/tools/store.cpp +++ b/src/tools/store.cpp @@ -52,14 +52,14 @@ void listRegions(bool show_blocks) auto memory = makeSharedMemory(region.shm_key); io::BufferReader reader(reinterpret_cast(memory->Ptr()), memory->Size()); - DataLayout layout; - serialization::read(reader, layout); + std::unique_ptr layout = std::make_unique(); + serialization::read(reader, *layout); std::vector block_names; - layout.List("", std::back_inserter(block_names)); + layout->List("", std::back_inserter(block_names)); for (auto &name : block_names) { - osrm::util::Log() << " " << name << " " << layout.GetBlockSize(name); + osrm::util::Log() << " " << name << " " << layout->GetBlockSize(name); } } } diff --git a/src/util/coordinate_calculation.cpp b/src/util/coordinate_calculation.cpp index cb9adb10a9b..10e64c6cbf5 100644 --- a/src/util/coordinate_calculation.cpp +++ b/src/util/coordinate_calculation.cpp @@ -153,7 +153,7 @@ double perpendicularDistance(const Coordinate segment_source, web_mercator::fromWGS84(query_location)); nearest_location = web_mercator::toWGS84(projected_nearest); - const double approximate_distance = greatCircleDistance(query_location, nearest_location); + const double approximate_distance = fccApproximateDistance(query_location, nearest_location); BOOST_ASSERT(0.0 <= approximate_distance); return approximate_distance; } diff --git a/test/nodejs/table.js b/test/nodejs/table.js index e763eea866e..7f7fea006f7 100644 --- a/test/nodejs/table.js +++ b/test/nodejs/table.js @@ -234,7 +234,7 @@ tables.forEach(function(annotation) { }); test('table: ' + annotation + ' table in Monaco without motorways', function(assert) { - assert.plan(1); + assert.plan(2); var osrm = new OSRM({path: mld_data_path, algorithm: 'MLD'}); var options = { coordinates: two_test_coordinates, @@ -243,7 +243,65 @@ tables.forEach(function(annotation) { }; osrm.table(options, function(err, response) { assert.equal(response[annotation].length, 2); + assert.strictEqual(response.fallback_speed_cells, undefined); + }); + }); + + test('table: ' + annotation + ' table in Monaco with fallback speeds', function(assert) { + assert.plan(2); + var osrm = new OSRM({path: mld_data_path, algorithm: 'MLD'}); + var options = { + coordinates: two_test_coordinates, + annotations: [annotation.slice(0,-1)], + fallback_speed: 1, + fallback_coordinate: 'input' + }; + osrm.table(options, function(err, response) { + assert.equal(response[annotation].length, 2); + assert.equal(response['fallback_speed_cells'].length, 0); }); }); + + test('table: ' + annotation + ' table in Monaco with invalid fallback speeds and fallback coordinates', function(assert) { + assert.plan(4); + var osrm = new OSRM({path: mld_data_path, algorithm: 'MLD'}); + var options = { + coordinates: two_test_coordinates, + annotations: [annotation.slice(0,-1)], + fallback_speed: -1 + }; + + assert.throws(()=>osrm.table(options, (err, res) => {}), /fallback_speed must be > 0/, "should throw on invalid fallback_speeds"); + + options.fallback_speed = '10'; + assert.throws(()=>osrm.table(options, (err, res) => {}), /fallback_speed must be a number/, "should throw on invalid fallback_speeds"); + + options.fallback_speed = 10; + options.fallback_coordinate = 'bla'; + assert.throws(()=>osrm.table(options, (err, res) => {}), /fallback_coordinate' param must be one of \[input, snapped\]/, "should throw on invalid fallback_coordinate"); + + options.fallback_coordinate = 10; + assert.throws(()=>osrm.table(options, (err, res) => {}), /fallback_coordinate must be a string: \[input, snapped\]/, "should throw on invalid fallback_coordinate"); + + }); + + test('table: ' + annotation + ' table in Monaco with invalid scale factor', function(assert) { + assert.plan(3); + var osrm = new OSRM({path: mld_data_path, algorithm: 'MLD'}); + var options = { + coordinates: two_test_coordinates, + annotations: [annotation.slice(0,-1)], + scale_factor: -1 + }; + + assert.throws(()=>osrm.table(options, (err, res) => {}), /scale_factor must be > 0/, "should throw on invalid scale_factor value"); + + options.scale_factor = '-1'; + assert.throws(()=>osrm.table(options, (err, res) => {}), /scale_factor must be a number/, "should throw on invalid scale_factor value"); + + options.scale_factor = 0; + assert.throws(()=>osrm.table(options, (err, res) => {}), /scale_factor must be > 0/, "should throw on invalid scale_factor value"); + + }); }); diff --git a/unit_tests/contractor/contracted_edge_container.cpp b/unit_tests/contractor/contracted_edge_container.cpp index 04f8a3523fb..9418f73a48b 100644 --- a/unit_tests/contractor/contracted_edge_container.cpp +++ b/unit_tests/contractor/contracted_edge_container.cpp @@ -17,7 +17,8 @@ bool operator!=(const QueryEdge &lhs, const QueryEdge &rhs) { return !(lhs == rh std::ostream &operator<<(std::ostream &out, const QueryEdge::EdgeData &data) { out << "{" << data.turn_id << ", " << data.shortcut << ", " << data.duration << ", " - << data.weight << ", " << data.forward << ", " << data.backward << "}"; + << data.distance << ", " << data.weight << ", " << data.forward << ", " << data.backward + << "}"; return out; } @@ -36,31 +37,31 @@ BOOST_AUTO_TEST_CASE(merge_edge_of_multiple_graph) ContractedEdgeContainer container; std::vector edges; - edges.push_back(QueryEdge{0, 1, {1, false, 3, 6, true, false}}); - edges.push_back(QueryEdge{1, 2, {2, false, 3, 6, true, false}}); - edges.push_back(QueryEdge{2, 0, {3, false, 3, 6, false, true}}); - edges.push_back(QueryEdge{2, 1, {4, false, 3, 6, false, true}}); + edges.push_back(QueryEdge{0, 1, {1, false, 3, 3, 6, true, false}}); + edges.push_back(QueryEdge{1, 2, {2, false, 3, 3, 6, true, false}}); + edges.push_back(QueryEdge{2, 0, {3, false, 3, 3, 6, false, true}}); + edges.push_back(QueryEdge{2, 1, {4, false, 3, 3, 6, false, true}}); container.Insert(edges); edges.clear(); - edges.push_back(QueryEdge{0, 1, {1, false, 3, 6, true, false}}); - edges.push_back(QueryEdge{1, 2, {2, false, 3, 6, true, false}}); - edges.push_back(QueryEdge{2, 0, {3, false, 12, 24, false, true}}); - edges.push_back(QueryEdge{2, 1, {4, false, 12, 24, false, true}}); + edges.push_back(QueryEdge{0, 1, {1, false, 3, 3, 6, true, false}}); + edges.push_back(QueryEdge{1, 2, {2, false, 3, 3, 6, true, false}}); + edges.push_back(QueryEdge{2, 0, {3, false, 12, 12, 24, false, true}}); + edges.push_back(QueryEdge{2, 1, {4, false, 12, 12, 24, false, true}}); container.Merge(edges); edges.clear(); - edges.push_back(QueryEdge{1, 4, {5, false, 3, 6, true, false}}); + edges.push_back(QueryEdge{1, 4, {5, false, 3, 3, 6, true, false}}); container.Merge(edges); std::vector reference_edges; - reference_edges.push_back(QueryEdge{0, 1, {1, false, 3, 6, true, false}}); - reference_edges.push_back(QueryEdge{1, 2, {2, false, 3, 6, true, false}}); - reference_edges.push_back(QueryEdge{1, 4, {5, false, 3, 6, true, false}}); - reference_edges.push_back(QueryEdge{2, 0, {3, false, 3, 6, false, true}}); - reference_edges.push_back(QueryEdge{2, 0, {3, false, 12, 24, false, true}}); - reference_edges.push_back(QueryEdge{2, 1, {4, false, 3, 6, false, true}}); - reference_edges.push_back(QueryEdge{2, 1, {4, false, 12, 24, false, true}}); + reference_edges.push_back(QueryEdge{0, 1, {1, false, 3, 3, 6, true, false}}); + reference_edges.push_back(QueryEdge{1, 2, {2, false, 3, 3, 6, true, false}}); + reference_edges.push_back(QueryEdge{1, 4, {5, false, 3, 3, 6, true, false}}); + reference_edges.push_back(QueryEdge{2, 0, {3, false, 3, 3, 6, false, true}}); + reference_edges.push_back(QueryEdge{2, 0, {3, false, 12, 12, 24, false, true}}); + reference_edges.push_back(QueryEdge{2, 1, {4, false, 3, 3, 6, false, true}}); + reference_edges.push_back(QueryEdge{2, 1, {4, false, 12, 12, 24, false, true}}); CHECK_EQUAL_COLLECTIONS(container.edges, reference_edges); auto filters = container.MakeEdgeFilters(); @@ -78,22 +79,22 @@ BOOST_AUTO_TEST_CASE(merge_edge_of_multiple_disjoint_graph) ContractedEdgeContainer container; std::vector edges; - edges.push_back(QueryEdge{0, 1, {1, false, 3, 6, true, false}}); - edges.push_back(QueryEdge{1, 2, {2, false, 3, 6, true, false}}); - edges.push_back(QueryEdge{2, 0, {3, false, 12, 24, false, true}}); - edges.push_back(QueryEdge{2, 1, {4, false, 12, 24, false, true}}); + edges.push_back(QueryEdge{0, 1, {1, false, 3, 3, 6, true, false}}); + edges.push_back(QueryEdge{1, 2, {2, false, 3, 3, 6, true, false}}); + edges.push_back(QueryEdge{2, 0, {3, false, 12, 12, 24, false, true}}); + edges.push_back(QueryEdge{2, 1, {4, false, 12, 12, 24, false, true}}); container.Merge(edges); edges.clear(); - edges.push_back(QueryEdge{1, 4, {5, false, 3, 6, true, false}}); + edges.push_back(QueryEdge{1, 4, {5, false, 3, 3, 6, true, false}}); container.Merge(edges); std::vector reference_edges; - reference_edges.push_back(QueryEdge{0, 1, {1, false, 3, 6, true, false}}); - reference_edges.push_back(QueryEdge{1, 2, {2, false, 3, 6, true, false}}); - reference_edges.push_back(QueryEdge{1, 4, {5, false, 3, 6, true, false}}); - reference_edges.push_back(QueryEdge{2, 0, {3, false, 12, 24, false, true}}); - reference_edges.push_back(QueryEdge{2, 1, {4, false, 12, 24, false, true}}); + reference_edges.push_back(QueryEdge{0, 1, {1, false, 3, 3, 6, true, false}}); + reference_edges.push_back(QueryEdge{1, 2, {2, false, 3, 3, 6, true, false}}); + reference_edges.push_back(QueryEdge{1, 4, {5, false, 3, 3, 6, true, false}}); + reference_edges.push_back(QueryEdge{2, 0, {3, false, 12, 12, 24, false, true}}); + reference_edges.push_back(QueryEdge{2, 1, {4, false, 12, 12, 24, false, true}}); CHECK_EQUAL_COLLECTIONS(container.edges, reference_edges); auto filters = container.MakeEdgeFilters(); diff --git a/unit_tests/contractor/graph_contractor.cpp b/unit_tests/contractor/graph_contractor.cpp index f1aeb775261..1993d1e5fa1 100644 --- a/unit_tests/contractor/graph_contractor.cpp +++ b/unit_tests/contractor/graph_contractor.cpp @@ -89,7 +89,7 @@ BOOST_AUTO_TEST_CASE(contract_graph) reference_graph.DeleteEdgesTo(1, 3); reference_graph.DeleteEdgesTo(4, 3); // Insert shortcut - reference_graph.InsertEdge(4, 1, {2, 4, 3, 0, true, true, false}); + reference_graph.InsertEdge(4, 1, {2, 4, 1.0, 3, 0, true, true, false}); /* After contracting 4: * diff --git a/unit_tests/contractor/helper.hpp b/unit_tests/contractor/helper.hpp index 7ea6c4a51d1..de9f6b6189c 100644 --- a/unit_tests/contractor/helper.hpp +++ b/unit_tests/contractor/helper.hpp @@ -20,15 +20,19 @@ inline contractor::ContractorGraph makeGraph(const std::vector &edges) unsigned target; int weight; std::tie(start, target, weight) = edge; + int duration = weight * 2; + float distance = 1.0; max_id = std::max(std::max(start, target), max_id); input_edges.push_back(contractor::ContractorEdge{ start, target, - contractor::ContractorEdgeData{weight, weight * 2, id++, 0, false, true, false}}); + contractor::ContractorEdgeData{ + weight, duration, distance, id++, 0, false, true, false}}); input_edges.push_back(contractor::ContractorEdge{ target, start, - contractor::ContractorEdgeData{weight, weight * 2, id++, 0, false, false, true}}); + contractor::ContractorEdgeData{ + weight, duration, distance, id++, 0, false, false, true}}); } std::sort(input_edges.begin(), input_edges.end()); diff --git a/unit_tests/customizer/cell_customization.cpp b/unit_tests/customizer/cell_customization.cpp index b51e36797bf..d5a3f9eb801 100644 --- a/unit_tests/customizer/cell_customization.cpp +++ b/unit_tests/customizer/cell_customization.cpp @@ -27,6 +27,7 @@ auto makeGraph(const MultiLevelPartition &mlp, const std::vector &mock { EdgeWeight weight; EdgeDuration duration; + EdgeDistance distance; bool forward; bool backward; }; @@ -36,8 +37,20 @@ auto makeGraph(const MultiLevelPartition &mlp, const std::vector &mock for (const auto &m : mock_edges) { max_id = std::max(max_id, std::max(m.start, m.target)); - edges.push_back(Edge{m.start, m.target, m.weight, 2 * m.weight, true, false}); - edges.push_back(Edge{m.target, m.start, m.weight, 2 * m.weight, false, true}); + edges.push_back(Edge{m.start, + m.target, + m.weight, + 2 * m.weight, + static_cast(1.0), + true, + false}); + edges.push_back(Edge{m.target, + m.start, + m.weight, + 2 * m.weight, + static_cast(1.0), + false, + true}); } std::sort(edges.begin(), edges.end()); return partitioner::MultiLevelGraph( diff --git a/unit_tests/extractor/graph_compressor.cpp b/unit_tests/extractor/graph_compressor.cpp index b402d795c39..ec2f93dd63d 100644 --- a/unit_tests/extractor/graph_compressor.cpp +++ b/unit_tests/extractor/graph_compressor.cpp @@ -31,6 +31,7 @@ inline InputEdge MakeUnitEdge(const NodeID from, const NodeID to) to, // target 1, // weight 1, // duration + 1, // distance GeometryID{0, false}, // geometry_id false, // reversed NodeBasedEdgeClassification(), // default flags diff --git a/unit_tests/extractor/intersection_analysis_tests.cpp b/unit_tests/extractor/intersection_analysis_tests.cpp index e655c93ab1d..8d8fd7d78cc 100644 --- a/unit_tests/extractor/intersection_analysis_tests.cpp +++ b/unit_tests/extractor/intersection_analysis_tests.cpp @@ -47,6 +47,7 @@ BOOST_AUTO_TEST_CASE(simple_intersection_connectivity) to, 1, 1, + 1, GeometryID{0, false}, !allowed, NodeBasedEdgeClassification(), @@ -174,6 +175,7 @@ BOOST_AUTO_TEST_CASE(roundabout_intersection_connectivity) to, 1, 1, + 1, GeometryID{0, false}, !allowed, NodeBasedEdgeClassification{ @@ -277,7 +279,7 @@ BOOST_AUTO_TEST_CASE(skip_degree_two_nodes) // const auto unit_edge = [](const NodeID from, const NodeID to, bool allowed) { return InputEdge{ - from, to, 1, 1, GeometryID{0, false}, !allowed, NodeBasedEdgeClassification{}, 0}; + from, to, 1, 1, 1, GeometryID{0, false}, !allowed, NodeBasedEdgeClassification{}, 0}; }; std::vector edges = {unit_edge(0, 1, true), // 0 unit_edge(1, 0, true), diff --git a/unit_tests/library/route.cpp b/unit_tests/library/route.cpp index 2ce75b0e015..6a6faad96fc 100644 --- a/unit_tests/library/route.cpp +++ b/unit_tests/library/route.cpp @@ -1,6 +1,8 @@ #include #include +#include + #include "coordinates.hpp" #include "equal_json.hpp" #include "fixture.hpp" @@ -32,18 +34,28 @@ BOOST_AUTO_TEST_CASE(test_route_same_coordinates_fixture) // unset snapping dependent hint for (auto &itr : result.values["waypoints"].get().values) + { + // Hint values aren't stable, so blank it out itr.get().values["hint"] = ""; + // Round value to 6 decimal places for double comparison later + itr.get().values["distance"] = + round(itr.get().values["distance"].get().value * 1000000); + } + const auto location = json::Array{{{7.437070}, {43.749248}}}; json::Object reference{ {{"code", "Ok"}, {"waypoints", - json::Array{ - {json::Object{ - {{"name", "Boulevard du Larvotto"}, {"location", location}, {"hint", ""}}}, - json::Object{ - {{"name", "Boulevard du Larvotto"}, {"location", location}, {"hint", ""}}}}}}, + json::Array{{json::Object{{{"name", "Boulevard du Larvotto"}, + {"location", location}, + {"distance", round(0.137249 * 1000000)}, + {"hint", ""}}}, + json::Object{{{"name", "Boulevard du Larvotto"}, + {"location", location}, + {"distance", round(0.137249 * 1000000)}, + {"hint", ""}}}}}}, {"routes", json::Array{{json::Object{ {{"distance", 0.}, diff --git a/unit_tests/partitioner/renumber.cpp b/unit_tests/partitioner/renumber.cpp index b070e5371fe..391220eae8a 100644 --- a/unit_tests/partitioner/renumber.cpp +++ b/unit_tests/partitioner/renumber.cpp @@ -32,9 +32,9 @@ auto makeGraph(const std::vector &mock_edges) max_id = std::max(max_id, std::max(m.start, m.target)); edges.push_back(InputEdge{ - m.start, m.target, EdgeBasedGraphEdgeData{SPECIAL_NODEID, 1, 1, true, false}}); + m.start, m.target, EdgeBasedGraphEdgeData{SPECIAL_NODEID, 1, 1, 1, true, false}}); edges.push_back(InputEdge{ - m.target, m.start, EdgeBasedGraphEdgeData{SPECIAL_NODEID, 1, 1, false, true}}); + m.target, m.start, EdgeBasedGraphEdgeData{SPECIAL_NODEID, 1, 1, 1, false, true}}); } std::sort(edges.begin(), edges.end()); return DynamicEdgeBasedGraph(max_id + 1, edges); diff --git a/unit_tests/server/parameters_parser.cpp b/unit_tests/server/parameters_parser.cpp index 4d3b8c53b59..42a4284b228 100644 --- a/unit_tests/server/parameters_parser.cpp +++ b/unit_tests/server/parameters_parser.cpp @@ -89,6 +89,25 @@ BOOST_AUTO_TEST_CASE(invalid_table_urls) BOOST_CHECK_EQUAL( testInvalidOptions("1,2;3,4?sources=all&destinations=all&annotations=bla"), 49UL); + BOOST_CHECK_EQUAL(testInvalidOptions("1,2;3,4?fallback_coordinate=asdf"), + 28UL); + BOOST_CHECK_EQUAL(testInvalidOptions("1,2;3,4?fallback_coordinate=10"), 28UL); + BOOST_CHECK_EQUAL( + testInvalidOptions("1,2;3,4?annotations=durations&scale_factor=-1"), 28UL); + BOOST_CHECK_EQUAL( + testInvalidOptions("1,2;3,4?annotations=durations&scale_factor=0"), 28UL); + BOOST_CHECK_EQUAL( + testInvalidOptions("1,2;3,4?annotations=durations&fallback_speed=0"), + 28UL); + BOOST_CHECK_EQUAL( + testInvalidOptions("1,2;3,4?annotations=durations&fallback_speed=-1"), + 28UL); + BOOST_CHECK_EQUAL( + testInvalidOptions("1,2;3,4?annotations=durations&fallback_speed=0"), + 28UL); + BOOST_CHECK_EQUAL( + testInvalidOptions("1,2;3,4?annotations=durations&fallback_speed=-1"), + 28UL); } BOOST_AUTO_TEST_CASE(valid_route_hint) @@ -563,6 +582,44 @@ BOOST_AUTO_TEST_CASE(valid_table_urls) BOOST_CHECK_EQUAL(result_7->annotations & TableParameters::AnnotationsType::Distance, true); CHECK_EQUAL_RANGE(reference_7.sources, result_7->sources); CHECK_EQUAL_RANGE(reference_7.destinations, result_7->destinations); + + TableParameters reference_8{}; + reference_8.coordinates = coords_1; + auto result_8 = + parseParameters("1,2;3,4?annotations=distance&fallback_speed=2.5"); + BOOST_CHECK(result_8); + BOOST_CHECK_EQUAL(result_8->annotations & TableParameters::AnnotationsType::Distance, true); + CHECK_EQUAL_RANGE(reference_8.sources, result_8->sources); + CHECK_EQUAL_RANGE(reference_8.destinations, result_8->destinations); + + TableParameters reference_9{}; + reference_9.coordinates = coords_1; + auto result_9 = parseParameters( + "1,2;3,4?annotations=distance&fallback_speed=2.5&fallback_coordinate=input"); + BOOST_CHECK(result_9); + BOOST_CHECK_EQUAL(result_9->annotations & TableParameters::AnnotationsType::Distance, true); + CHECK_EQUAL_RANGE(reference_9.sources, result_9->sources); + CHECK_EQUAL_RANGE(reference_9.destinations, result_9->destinations); + + TableParameters reference_10{}; + reference_10.coordinates = coords_1; + auto result_10 = parseParameters( + "1,2;3,4?annotations=distance&fallback_speed=20&fallback_coordinate=snapped"); + BOOST_CHECK(result_10); + BOOST_CHECK_EQUAL(result_10->annotations & TableParameters::AnnotationsType::Distance, true); + CHECK_EQUAL_RANGE(reference_10.sources, result_10->sources); + CHECK_EQUAL_RANGE(reference_10.destinations, result_10->destinations); + + auto result_11 = parseParameters("1,2;3,4?sources=all&destinations=all&" + "annotations=duration&fallback_speed=1&" + "fallback_coordinate=snapped&scale_factor=2"); + BOOST_CHECK(result_11); + CHECK_EQUAL_RANGE(reference_1.sources, result_11->sources); + CHECK_EQUAL_RANGE(reference_1.destinations, result_11->destinations); + CHECK_EQUAL_RANGE(reference_1.bearings, result_11->bearings); + CHECK_EQUAL_RANGE(reference_1.radiuses, result_11->radiuses); + CHECK_EQUAL_RANGE(reference_1.approaches, result_11->approaches); + CHECK_EQUAL_RANGE(reference_1.coordinates, result_11->coordinates); } BOOST_AUTO_TEST_CASE(valid_match_urls) diff --git a/unit_tests/storage/data_layout.cpp b/unit_tests/storage/data_layout.cpp index 2aa0b40ee4b..b9ef8e8ba45 100644 --- a/unit_tests/storage/data_layout.cpp +++ b/unit_tests/storage/data_layout.cpp @@ -15,86 +15,89 @@ using namespace osrm::storage; BOOST_AUTO_TEST_CASE(layout_write_test) { - DataLayout layout; + std::unique_ptr layout = std::make_unique(); Block block_1{20, 8 * 20}; Block block_2{1, 4 * 1}; Block block_3{100, static_cast(std::ceil(100 / 64.))}; - layout.SetBlock("block1", block_1); - layout.SetBlock("block2", block_2); - layout.SetBlock("block3", block_3); + layout->SetBlock("block1", block_1); + layout->SetBlock("block2", block_2); + layout->SetBlock("block3", block_3); // Canary and alignment change layout size - BOOST_CHECK_GT(layout.GetSizeOfLayout(), + BOOST_CHECK_GT(layout->GetSizeOfLayout(), block_1.byte_size + block_2.byte_size + block_3.byte_size); - BOOST_CHECK_EQUAL(layout.GetBlockSize("block1"), block_1.byte_size); - BOOST_CHECK_EQUAL(layout.GetBlockSize("block2"), block_2.byte_size); - BOOST_CHECK_EQUAL(layout.GetBlockSize("block3"), block_3.byte_size); + BOOST_CHECK_EQUAL(layout->GetBlockSize("block1"), block_1.byte_size); + BOOST_CHECK_EQUAL(layout->GetBlockSize("block2"), block_2.byte_size); + BOOST_CHECK_EQUAL(layout->GetBlockSize("block3"), block_3.byte_size); - std::vector buffer(layout.GetSizeOfLayout()); + std::vector buffer(layout->GetSizeOfLayout()); auto smallest_addr = buffer.data(); auto biggest_addr = buffer.data() + buffer.size(); { - auto block_1_ptr = layout.GetBlockPtr(buffer.data(), "block1"); - auto block_2_ptr = layout.GetBlockPtr(buffer.data(), "block2"); - auto block_3_ptr = layout.GetBlockPtr(buffer.data(), "block3"); - - BOOST_CHECK_LT(reinterpret_cast(smallest_addr), + auto block_1_ptr = + reinterpret_cast(layout->GetBlockPtr(buffer.data(), "block1")); + auto block_2_ptr = + reinterpret_cast(layout->GetBlockPtr(buffer.data(), "block2")); + auto block_3_ptr = + reinterpret_cast(layout->GetBlockPtr(buffer.data(), "block3")); + + BOOST_CHECK_LE(reinterpret_cast(smallest_addr), reinterpret_cast(block_1_ptr)); BOOST_CHECK_GT( reinterpret_cast(biggest_addr), - reinterpret_cast(block_1_ptr + layout.GetBlockEntries("block1"))); + reinterpret_cast(block_1_ptr + layout->GetBlockEntries("block1"))); BOOST_CHECK_LT(reinterpret_cast(smallest_addr), reinterpret_cast(block_2_ptr)); BOOST_CHECK_GT( reinterpret_cast(biggest_addr), - reinterpret_cast(block_2_ptr + layout.GetBlockEntries("block2"))); + reinterpret_cast(block_2_ptr + layout->GetBlockEntries("block2"))); BOOST_CHECK_LT(reinterpret_cast(smallest_addr), reinterpret_cast(block_3_ptr)); BOOST_CHECK_GT(reinterpret_cast(biggest_addr), reinterpret_cast( block_3_ptr + static_cast( - std::ceil(layout.GetBlockEntries("block3") / 64)))); + std::ceil(layout->GetBlockEntries("block3") / 64)))); } } BOOST_AUTO_TEST_CASE(layout_list_test) { - DataLayout layout; + std::unique_ptr layout = std::make_unique(); Block block_1{20, 8 * 20}; Block block_2{1, 4 * 1}; Block block_3{100, static_cast(std::ceil(100 / 64.))}; - layout.SetBlock("/ch/edge_filter/block1", block_1); - layout.SetBlock("/ch/edge_filter/block2", block_2); - layout.SetBlock("/ch/edge_filter/block3", block_3); - layout.SetBlock("/mld/metrics/0/durations", block_2); - layout.SetBlock("/mld/metrics/0/weights", block_3); - layout.SetBlock("/mld/metrics/1/durations", block_2); - layout.SetBlock("/mld/metrics/1/weights", block_3); + layout->SetBlock("/ch/edge_filter/block1", block_1); + layout->SetBlock("/ch/edge_filter/block2", block_2); + layout->SetBlock("/ch/edge_filter/block3", block_3); + layout->SetBlock("/mld/metrics/0/durations", block_2); + layout->SetBlock("/mld/metrics/0/weights", block_3); + layout->SetBlock("/mld/metrics/1/durations", block_2); + layout->SetBlock("/mld/metrics/1/weights", block_3); std::vector results_1; std::vector results_2; std::vector results_3; - layout.List("/ch/edge_filter", std::back_inserter(results_1)); - layout.List("/ch/edge_filter/", std::back_inserter(results_2)); - layout.List("/ch/", std::back_inserter(results_3)); + layout->List("/ch/edge_filter", std::back_inserter(results_1)); + layout->List("/ch/edge_filter/", std::back_inserter(results_2)); + layout->List("/ch/", std::back_inserter(results_3)); std::vector results_4; std::vector results_5; std::vector results_6; - layout.List("/mld/metrics", std::back_inserter(results_4)); - layout.List("/mld/metrics/", std::back_inserter(results_5)); - layout.List("/mld/", std::back_inserter(results_6)); + layout->List("/mld/metrics", std::back_inserter(results_4)); + layout->List("/mld/metrics/", std::back_inserter(results_5)); + layout->List("/mld/", std::back_inserter(results_6)); std::vector results_7; - layout.List("", std::back_inserter(results_7)); + layout->List("", std::back_inserter(results_7)); BOOST_CHECK_EQUAL(results_7.size(), 7); CHECK_EQUAL_RANGE( diff --git a/unit_tests/storage/serialization.cpp b/unit_tests/storage/serialization.cpp index e42f8ea8e5c..760f1faeabd 100644 --- a/unit_tests/storage/serialization.cpp +++ b/unit_tests/storage/serialization.cpp @@ -1,11 +1,15 @@ #include "storage/serialization.hpp" +#include "util/vector_view.hpp" + #include "../common/range_tools.hpp" #include "../common/temporary_file.hpp" #include #include +#include + BOOST_AUTO_TEST_SUITE(serialization) using namespace osrm; @@ -15,20 +19,48 @@ BOOST_AUTO_TEST_CASE(pack_test) { std::vector v = {0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1}; - BOOST_CHECK_EQUAL(storage::serialization::detail::packBits(v, 0, 8), 0x2e); - BOOST_CHECK_EQUAL(storage::serialization::detail::packBits(v, 5, 7), 0x65); - BOOST_CHECK_EQUAL(storage::serialization::detail::packBits(v, 6, 8), 0x95); + BOOST_CHECK_EQUAL(storage::serialization::detail::packBits(v, 0, 8), 0x74); + BOOST_CHECK_EQUAL(storage::serialization::detail::packBits(v, 5, 7), 0x53); + BOOST_CHECK_EQUAL(storage::serialization::detail::packBits(v, 6, 8), 0xa9); BOOST_CHECK_EQUAL(storage::serialization::detail::packBits(v, 11, 1), 0x01); } +BOOST_AUTO_TEST_CASE(vector_view_pack_test) +{ + // Verifies that the packing generated by packBits matches + // what vector_view expects + + // 1. Generate a random bool vector that covers several uint64_t bytes + constexpr unsigned RANDOM_SEED = 42; + std::mt19937 g(RANDOM_SEED); + std::uniform_int_distribution<> binary_distribution(0, 1); + std::vector v(150); + for (std::size_t i = 0; i < v.size(); ++i) + v[i] = binary_distribution(g) == 1; + + // 2. Pack the vector into a contiguous set of bytes + std::uint64_t data[3]; + data[0] = storage::serialization::detail::packBits(v, 0, 64); + data[1] = storage::serialization::detail::packBits(v, 64, 64); + data[2] = storage::serialization::detail::packBits(v, 128, 22); + + // 3. Make a vector_view of that memory, and see if the bit sequence is + // interpreted correctly by vector_view + util::vector_view view(data, v.size()); + for (std::size_t index = 0; index < v.size(); ++index) + { + BOOST_CHECK_EQUAL(v[index], view[index]); + } +} + BOOST_AUTO_TEST_CASE(unpack_test) { std::vector v(14), expected = {0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1}; - storage::serialization::detail::unpackBits(v, 0, 8, 0x2e); - storage::serialization::detail::unpackBits(v, 5, 7, 0x65); - storage::serialization::detail::unpackBits(v, 6, 8, 0x95); - storage::serialization::detail::unpackBits(v, 11, 1, 0x01); + storage::serialization::detail::unpackBits(v, 0, 8, 0x74u); + storage::serialization::detail::unpackBits(v, 5, 7, 0x53u); + storage::serialization::detail::unpackBits(v, 6, 8, 0xa9u); + storage::serialization::detail::unpackBits(v, 11, 1, 0x01u); BOOST_CHECK_EQUAL_COLLECTIONS(v.begin(), v.end(), expected.begin(), expected.end()); }