├── .gitignore ├── LICENSE.md ├── README.md ├── dist ├── geojson-equality.js ├── geojson-equality.js.map └── geojson-equality.min.js ├── index.js ├── package-lock.json ├── package.json └── test ├── mocha.opts └── test.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | 3 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Gagan Bansal 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # geojson-equality 2 | 3 | Check two valid geojson geometries for equality. 4 | 5 | ## installation 6 | 7 | ``` 8 | npm install geojson-equality 9 | ``` 10 | 11 | ## usage 12 | ```javascript 13 | var GeojsonEquality = require('geojson-equality'); 14 | var eq = new GeojsonEquality(); 15 | 16 | var g1 = { "type": "Polygon", "coordinates": [ 17 | [[30, 10], [40, 40], [20, 40], [10, 20], [30, 10]] 18 | ]}; 19 | var g2 = { "type": "Polygon", "coordinates": [ 20 | [[30, 10], [40, 40], [20, 40], [10, 20], [30, 10]] 21 | ]}; 22 | 23 | eq.compare(g1,g2); // returns true 24 | var g3 = { "type": "Polygon", "coordinates": [ 25 | [[300, 100], [400, 400], [200, 400], [100, 200], [300, 100]] 26 | ]}; 27 | 28 | eq.compare(g1,g3); // returns false 29 | ``` 30 | For including in browser, download file [geojson-equality.min.js](//raw.githubusercontent.com/geosquare/geojson-equality/master/dist/geojson-equality.min.js) 31 | ```html 32 | 33 | ``` 34 | This create a global variable 'GeojsonEquality' 35 | GeojsonEquality class can be initiated with many options that are used to match the geojson. 36 | * **precision** number as floating points precision required. Defualt is **17** 37 | ```javascript 38 | var g1 = { "type": "Point", "coordinates": [30.2, 10] }; 39 | var g2 = { "type": "Point", "coordinates": [30.22233, 10] }; 40 | var eq = new GeojsonEquality({precision: 3}); 41 | eq.compare(g1,g2); // returns false 42 | var eq = new GeojsonEquality({precision: 1}); 43 | eq.compare(g1,g2); // returns true 44 | ``` 45 | * **direction** true | false, direction of LineString or Polygon (orientation) is ignored if false. Default is **false**. 46 | ```javascript 47 | var g1 = { "type": "LineString", "coordinates": 48 | [ [30, 10], [10, 30], [40, 40] ] }; 49 | var g2 = { "type": "LineString", "coordinates": 50 | [ [40, 40], [10, 30], [30, 10] ] }; 51 | var eq = new GeojsonEquality({direction: false}); 52 | eq.compare(g1,g2); // returns true 53 | var eq = new GeojsonEquality({direction: true}); 54 | eq.compare(g1,g2); // returns false 55 | ``` 56 | 57 | * **objectComparator** function, custom function for use in comparing Feature properties. Default is a shallow comparison. 58 | ```javascript 59 | // using lodash isEqual to deep comparison 60 | var isEqual = require('lodash/lang/isEqual') 61 | var eq = new GeojsonEquality({objectComparator: isEqual}); 62 | ``` 63 | 64 | ## developing 65 | Once you run 66 | 67 | ```npm install``` 68 | 69 | then for running test 70 | 71 | ```npm run test``` 72 | 73 | to create build 74 | 75 | ```npm run build``` 76 | 77 | ## license 78 | This project is licensed under the terms of the MIT license. 79 | -------------------------------------------------------------------------------- /dist/geojson-equality.js: -------------------------------------------------------------------------------- 1 | !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var o;"undefined"!=typeof window?o=window:"undefined"!=typeof global?o=global:"undefined"!=typeof self&&(o=self),o.GeojsonEquality=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= 0) { 106 | correctPath = [].concat( 107 | sourcePath.slice(ind,sourcePath.length), 108 | sourcePath.slice(1,ind+1)); 109 | } 110 | return correctPath; 111 | }; 112 | Equality.prototype.comparePath = function (p1,p2) { 113 | var cont = this; 114 | return p1.every(function(c,i) { 115 | return cont.compareCoord(c,this[i]); 116 | },p2); 117 | }; 118 | 119 | Equality.prototype.comparePolygon = function(g1,g2) { 120 | if (this.compareLine(g1.coordinates[0],g2.coordinates[0],1,true)) { 121 | var holes1 = g1.coordinates.slice(1,g1.coordinates.length); 122 | var holes2 = g2.coordinates.slice(1,g2.coordinates.length); 123 | var cont = this; 124 | return holes1.every(function(h1) { 125 | return this.some(function(h2) { 126 | return cont.compareLine(h1,h2,1,true); 127 | }); 128 | },holes2); 129 | } else { 130 | return false; 131 | } 132 | }; 133 | 134 | Equality.prototype.compareGeometryCollection= function(g1,g2) { 135 | if ( 136 | !sameLength(g1.geometries, g2.geometries) || 137 | !this.compareBBox(g1,g2) 138 | ) { 139 | return false; 140 | } 141 | for (var i=0; i < g1.geometries.length; i++) { 142 | if (!this.compare(g1.geometries[i], g2.geometries[i])) { 143 | return false; 144 | } 145 | } 146 | return true 147 | }; 148 | 149 | Equality.prototype.compareFeature = function(g1,g2) { 150 | if ( 151 | g1.id !== g2.id || 152 | !this.objectComparator(g1.properties, g2.properties) || 153 | !this.compareBBox(g1,g2) 154 | ) { 155 | return false; 156 | } 157 | return this.compare(g1.geometry, g2.geometry); 158 | }; 159 | 160 | Equality.prototype.compareFeatureCollection = function(g1,g2) { 161 | if ( 162 | !sameLength(g1.features, g2.features) || 163 | !this.compareBBox(g1,g2) 164 | ) { 165 | return false; 166 | } 167 | for (var i=0; i < g1.features.length; i++) { 168 | if (!this.compare(g1.features[i], g2.features[i])) { 169 | return false; 170 | } 171 | } 172 | return true 173 | }; 174 | 175 | Equality.prototype.compareBBox = function(g1,g2) { 176 | if ( 177 | (!g1.bbox && !g2.bbox) || 178 | ( 179 | g1.bbox && g2.bbox && 180 | this.compareCoord(g1.bbox, g2.bbox) 181 | ) 182 | ) { 183 | return true; 184 | } 185 | return false; 186 | }; 187 | Equality.prototype.removePseudo = function(path) { 188 | //TODO to be implement 189 | return path; 190 | }; 191 | 192 | function objectComparator(obj1, obj2) { 193 | return deepEqual(obj1, obj2, {strict: true}); 194 | } 195 | 196 | module.exports = Equality; 197 | 198 | },{"deep-equal":2}],2:[function(require,module,exports){ 199 | var pSlice = Array.prototype.slice; 200 | var objectKeys = require('./lib/keys.js'); 201 | var isArguments = require('./lib/is_arguments.js'); 202 | 203 | var deepEqual = module.exports = function (actual, expected, opts) { 204 | if (!opts) opts = {}; 205 | // 7.1. All identical values are equivalent, as determined by ===. 206 | if (actual === expected) { 207 | return true; 208 | 209 | } else if (actual instanceof Date && expected instanceof Date) { 210 | return actual.getTime() === expected.getTime(); 211 | 212 | // 7.3. Other pairs that do not both pass typeof value == 'object', 213 | // equivalence is determined by ==. 214 | } else if (!actual || !expected || typeof actual != 'object' && typeof expected != 'object') { 215 | return opts.strict ? actual === expected : actual == expected; 216 | 217 | // 7.4. For all other Object pairs, including Array objects, equivalence is 218 | // determined by having the same number of owned properties (as verified 219 | // with Object.prototype.hasOwnProperty.call), the same set of keys 220 | // (although not necessarily the same order), equivalent values for every 221 | // corresponding key, and an identical 'prototype' property. Note: this 222 | // accounts for both named and indexed properties on Arrays. 223 | } else { 224 | return objEquiv(actual, expected, opts); 225 | } 226 | } 227 | 228 | function isUndefinedOrNull(value) { 229 | return value === null || value === undefined; 230 | } 231 | 232 | function isBuffer (x) { 233 | if (!x || typeof x !== 'object' || typeof x.length !== 'number') return false; 234 | if (typeof x.copy !== 'function' || typeof x.slice !== 'function') { 235 | return false; 236 | } 237 | if (x.length > 0 && typeof x[0] !== 'number') return false; 238 | return true; 239 | } 240 | 241 | function objEquiv(a, b, opts) { 242 | var i, key; 243 | if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) 244 | return false; 245 | // an identical 'prototype' property. 246 | if (a.prototype !== b.prototype) return false; 247 | //~~~I've managed to break Object.keys through screwy arguments passing. 248 | // Converting to array solves the problem. 249 | if (isArguments(a)) { 250 | if (!isArguments(b)) { 251 | return false; 252 | } 253 | a = pSlice.call(a); 254 | b = pSlice.call(b); 255 | return deepEqual(a, b, opts); 256 | } 257 | if (isBuffer(a)) { 258 | if (!isBuffer(b)) { 259 | return false; 260 | } 261 | if (a.length !== b.length) return false; 262 | for (i = 0; i < a.length; i++) { 263 | if (a[i] !== b[i]) return false; 264 | } 265 | return true; 266 | } 267 | try { 268 | var ka = objectKeys(a), 269 | kb = objectKeys(b); 270 | } catch (e) {//happens when one is a string literal and the other isn't 271 | return false; 272 | } 273 | // having the same number of owned properties (keys incorporates 274 | // hasOwnProperty) 275 | if (ka.length != kb.length) 276 | return false; 277 | //the same set of keys (although not necessarily the same order), 278 | ka.sort(); 279 | kb.sort(); 280 | //~~~cheap key test 281 | for (i = ka.length - 1; i >= 0; i--) { 282 | if (ka[i] != kb[i]) 283 | return false; 284 | } 285 | //equivalent values for every corresponding key, and 286 | //~~~possibly expensive deep test 287 | for (i = ka.length - 1; i >= 0; i--) { 288 | key = ka[i]; 289 | if (!deepEqual(a[key], b[key], opts)) return false; 290 | } 291 | return typeof a === typeof b; 292 | } 293 | 294 | },{"./lib/is_arguments.js":3,"./lib/keys.js":4}],3:[function(require,module,exports){ 295 | var supportsArgumentsClass = (function(){ 296 | return Object.prototype.toString.call(arguments) 297 | })() == '[object Arguments]'; 298 | 299 | exports = module.exports = supportsArgumentsClass ? supported : unsupported; 300 | 301 | exports.supported = supported; 302 | function supported(object) { 303 | return Object.prototype.toString.call(object) == '[object Arguments]'; 304 | }; 305 | 306 | exports.unsupported = unsupported; 307 | function unsupported(object){ 308 | return object && 309 | typeof object == 'object' && 310 | typeof object.length == 'number' && 311 | Object.prototype.hasOwnProperty.call(object, 'callee') && 312 | !Object.prototype.propertyIsEnumerable.call(object, 'callee') || 313 | false; 314 | }; 315 | 316 | },{}],4:[function(require,module,exports){ 317 | exports = module.exports = typeof Object.keys === 'function' 318 | ? Object.keys : shim; 319 | 320 | exports.shim = shim; 321 | function shim (obj) { 322 | var keys = []; 323 | for (var key in obj) keys.push(key); 324 | return keys; 325 | } 326 | 327 | },{}]},{},[1])(1) 328 | }); 329 | //# sourceMappingURL=geojson-equality.js.map 330 | -------------------------------------------------------------------------------- /dist/geojson-equality.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": [ 4 | "node_modules/browser-pack/_prelude.js", 5 | "/home/gaganb/projects/geosquare/geojson-equality/index.js", 6 | "/home/gaganb/projects/geosquare/geojson-equality/node_modules/deep-equal/index.js", 7 | "/home/gaganb/projects/geosquare/geojson-equality/node_modules/deep-equal/lib/is_arguments.js", 8 | "/home/gaganb/projects/geosquare/geojson-equality/node_modules/deep-equal/lib/keys.js" 9 | ], 10 | "names": [], 11 | "mappings": "AAAA;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA", 12 | "file": "generated.js", 13 | "sourceRoot": "", 14 | "sourcesContent": [ 15 | "(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o= 0) {\n correctPath = [].concat(\n sourcePath.slice(ind,sourcePath.length),\n sourcePath.slice(1,ind+1));\n }\n return correctPath;\n};\nEquality.prototype.comparePath = function (p1,p2) {\n var cont = this;\n return p1.every(function(c,i) {\n return cont.compareCoord(c,this[i]);\n },p2);\n};\n\nEquality.prototype.comparePolygon = function(g1,g2) {\n if (this.compareLine(g1.coordinates[0],g2.coordinates[0],1,true)) {\n var holes1 = g1.coordinates.slice(1,g1.coordinates.length);\n var holes2 = g2.coordinates.slice(1,g2.coordinates.length);\n var cont = this;\n return holes1.every(function(h1) {\n return this.some(function(h2) {\n return cont.compareLine(h1,h2,1,true);\n });\n },holes2);\n } else {\n return false;\n }\n};\n\nEquality.prototype.compareGeometryCollection= function(g1,g2) {\n if (\n !sameLength(g1.geometries, g2.geometries) ||\n !this.compareBBox(g1,g2)\n ) {\n return false;\n }\n for (var i=0; i < g1.geometries.length; i++) {\n if (!this.compare(g1.geometries[i], g2.geometries[i])) {\n return false;\n }\n }\n return true\n};\n\nEquality.prototype.compareFeature = function(g1,g2) {\n if (\n g1.id !== g2.id ||\n !this.objectComparator(g1.properties, g2.properties) ||\n !this.compareBBox(g1,g2)\n ) {\n return false;\n }\n return this.compare(g1.geometry, g2.geometry);\n};\n\nEquality.prototype.compareFeatureCollection = function(g1,g2) {\n if (\n !sameLength(g1.features, g2.features) ||\n !this.compareBBox(g1,g2)\n ) {\n return false;\n }\n for (var i=0; i < g1.features.length; i++) {\n if (!this.compare(g1.features[i], g2.features[i])) {\n return false;\n }\n }\n return true\n};\n\nEquality.prototype.compareBBox = function(g1,g2) {\n if (\n (!g1.bbox && !g2.bbox) || \n (\n g1.bbox && g2.bbox &&\n this.compareCoord(g1.bbox, g2.bbox)\n )\n ) {\n return true;\n }\n return false;\n};\nEquality.prototype.removePseudo = function(path) {\n //TODO to be implement\n return path;\n};\n\nfunction objectComparator(obj1, obj2) {\n return deepEqual(obj1, obj2, {strict: true});\n}\n\nmodule.exports = Equality;\n", 17 | "var pSlice = Array.prototype.slice;\nvar objectKeys = require('./lib/keys.js');\nvar isArguments = require('./lib/is_arguments.js');\n\nvar deepEqual = module.exports = function (actual, expected, opts) {\n if (!opts) opts = {};\n // 7.1. All identical values are equivalent, as determined by ===.\n if (actual === expected) {\n return true;\n\n } else if (actual instanceof Date && expected instanceof Date) {\n return actual.getTime() === expected.getTime();\n\n // 7.3. Other pairs that do not both pass typeof value == 'object',\n // equivalence is determined by ==.\n } else if (!actual || !expected || typeof actual != 'object' && typeof expected != 'object') {\n return opts.strict ? actual === expected : actual == expected;\n\n // 7.4. For all other Object pairs, including Array objects, equivalence is\n // determined by having the same number of owned properties (as verified\n // with Object.prototype.hasOwnProperty.call), the same set of keys\n // (although not necessarily the same order), equivalent values for every\n // corresponding key, and an identical 'prototype' property. Note: this\n // accounts for both named and indexed properties on Arrays.\n } else {\n return objEquiv(actual, expected, opts);\n }\n}\n\nfunction isUndefinedOrNull(value) {\n return value === null || value === undefined;\n}\n\nfunction isBuffer (x) {\n if (!x || typeof x !== 'object' || typeof x.length !== 'number') return false;\n if (typeof x.copy !== 'function' || typeof x.slice !== 'function') {\n return false;\n }\n if (x.length > 0 && typeof x[0] !== 'number') return false;\n return true;\n}\n\nfunction objEquiv(a, b, opts) {\n var i, key;\n if (isUndefinedOrNull(a) || isUndefinedOrNull(b))\n return false;\n // an identical 'prototype' property.\n if (a.prototype !== b.prototype) return false;\n //~~~I've managed to break Object.keys through screwy arguments passing.\n // Converting to array solves the problem.\n if (isArguments(a)) {\n if (!isArguments(b)) {\n return false;\n }\n a = pSlice.call(a);\n b = pSlice.call(b);\n return deepEqual(a, b, opts);\n }\n if (isBuffer(a)) {\n if (!isBuffer(b)) {\n return false;\n }\n if (a.length !== b.length) return false;\n for (i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n }\n try {\n var ka = objectKeys(a),\n kb = objectKeys(b);\n } catch (e) {//happens when one is a string literal and the other isn't\n return false;\n }\n // having the same number of owned properties (keys incorporates\n // hasOwnProperty)\n if (ka.length != kb.length)\n return false;\n //the same set of keys (although not necessarily the same order),\n ka.sort();\n kb.sort();\n //~~~cheap key test\n for (i = ka.length - 1; i >= 0; i--) {\n if (ka[i] != kb[i])\n return false;\n }\n //equivalent values for every corresponding key, and\n //~~~possibly expensive deep test\n for (i = ka.length - 1; i >= 0; i--) {\n key = ka[i];\n if (!deepEqual(a[key], b[key], opts)) return false;\n }\n return typeof a === typeof b;\n}\n", 18 | "var supportsArgumentsClass = (function(){\n return Object.prototype.toString.call(arguments)\n})() == '[object Arguments]';\n\nexports = module.exports = supportsArgumentsClass ? supported : unsupported;\n\nexports.supported = supported;\nfunction supported(object) {\n return Object.prototype.toString.call(object) == '[object Arguments]';\n};\n\nexports.unsupported = unsupported;\nfunction unsupported(object){\n return object &&\n typeof object == 'object' &&\n typeof object.length == 'number' &&\n Object.prototype.hasOwnProperty.call(object, 'callee') &&\n !Object.prototype.propertyIsEnumerable.call(object, 'callee') ||\n false;\n};\n", 19 | "exports = module.exports = typeof Object.keys === 'function'\n ? Object.keys : shim;\n\nexports.shim = shim;\nfunction shim (obj) {\n var keys = [];\n for (var key in obj) keys.push(key);\n return keys;\n}\n" 20 | ] 21 | } -------------------------------------------------------------------------------- /dist/geojson-equality.min.js: -------------------------------------------------------------------------------- 1 | !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;"undefined"!=typeof window?t=window:"undefined"!=typeof global?t=global:"undefined"!=typeof self&&(t=self),t.GeojsonEquality=e()}}(function(){return function e(t,r,o){function n(c,u){if(!r[c]){if(!t[c]){var s="function"==typeof require&&require;if(!u&&s)return s(c,!0);if(i)return i(c,!0);var p=new Error("Cannot find module '"+c+"'");throw p.code="MODULE_NOT_FOUND",p}var a=r[c]={exports:{}};t[c][0].call(a.exports,function(e){var r=t[c][1][e];return n(r?r:e)},a,a.exports,e,t,r,o)}return r[c].exports}for(var i="function"==typeof require&&require,c=0;c=0&&(r=[].concat(e.slice(o,e.length),e.slice(1,o+1))),r},u.prototype.comparePath=function(e,t){var r=this;return e.every(function(e,t){return r.compareCoord(e,this[t])},t)},u.prototype.comparePolygon=function(e,t){if(this.compareLine(e.coordinates[0],t.coordinates[0],1,!0)){var r=e.coordinates.slice(1,e.coordinates.length),o=t.coordinates.slice(1,t.coordinates.length),n=this;return r.every(function(e){return this.some(function(t){return n.compareLine(e,t,1,!0)})},o)}return!1},u.prototype.compareGeometryCollection=function(e,t){if(!n(e.geometries,t.geometries)||!this.compareBBox(e,t))return!1;for(var r=0;r0&&"number"!=typeof e[0]?!1:!0:!1}function i(e,t,r){var i,a;if(o(e)||o(t))return!1;if(e.prototype!==t.prototype)return!1;if(s(e))return s(t)?(e=c.call(e),t=c.call(t),p(e,t,r)):!1;if(n(e)){if(!n(t))return!1;if(e.length!==t.length)return!1;for(i=0;i=0;i--)if(f[i]!=l[i])return!1;for(i=f.length-1;i>=0;i--)if(a=f[i],!p(e[a],t[a],r))return!1;return typeof e==typeof t}var c=Array.prototype.slice,u=e("./lib/keys.js"),s=e("./lib/is_arguments.js"),p=t.exports=function(e,t,r){return r||(r={}),e===t?!0:e instanceof Date&&t instanceof Date?e.getTime()===t.getTime():!e||!t||"object"!=typeof e&&"object"!=typeof t?r.strict?e===t:e==t:i(e,t,r)}},{"./lib/is_arguments.js":3,"./lib/keys.js":4}],3:[function(e,t,r){function o(e){return"[object Arguments]"==Object.prototype.toString.call(e)}function n(e){return e&&"object"==typeof e&&"number"==typeof e.length&&Object.prototype.hasOwnProperty.call(e,"callee")&&!Object.prototype.propertyIsEnumerable.call(e,"callee")||!1}var i="[object Arguments]"==function(){return Object.prototype.toString.call(arguments)}();r=t.exports=i?o:n,r.supported=o,r.unsupported=n},{}],4:[function(e,t,r){function o(e){var t=[];for(var r in e)t.push(r);return t}r=t.exports="function"==typeof Object.keys?Object.keys:o,r.shim=o},{}]},{},[1])(1)}); 2 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | //index.js 2 | var {dequal: deepEqual} = require('dequal'); 3 | 4 | var Equality = function(opt) { 5 | this.precision = opt && opt.precision ? opt.precision : 17; 6 | this.direction = opt && opt.direction ? opt.direction : false; 7 | this.pseudoNode = opt && opt.pseudoNode ? opt.pseudoNode : false; 8 | this.objectComparator = opt && opt.objectComparator ? opt.objectComparator : objectComparator; 9 | }; 10 | 11 | Equality.prototype.compare = function(g1,g2) { 12 | if (g1.type !== g2.type || !sameLength(g1,g2)) return false; 13 | 14 | switch(g1.type) { 15 | case 'Point': 16 | return this.compareCoord(g1.coordinates, g2.coordinates); 17 | break; 18 | case 'LineString': 19 | return this.compareLine(g1.coordinates, g2.coordinates,0,false); 20 | break; 21 | case 'Polygon': 22 | return this.comparePolygon(g1,g2); 23 | break; 24 | case 'GeometryCollection': 25 | return this.compareGeometryCollection(g1, g2); 26 | case 'Feature': 27 | return this.compareFeature(g1, g2); 28 | case 'FeatureCollection': 29 | return this.compareFeatureCollection(g1, g2); 30 | default: 31 | if (g1.type.indexOf('Multi') === 0) { 32 | var context = this; 33 | var g1s = explode(g1); 34 | var g2s = explode(g2); 35 | return g1s.every(function(g1part) { 36 | return this.some(function(g2part) { 37 | return context.compare(g1part,g2part); 38 | }); 39 | },g2s); 40 | } 41 | } 42 | return false; 43 | }; 44 | 45 | function explode(g) { 46 | return g.coordinates.map(function(part) { 47 | return { 48 | type: g.type.replace('Multi', ''), 49 | coordinates: part} 50 | }); 51 | } 52 | //compare length of coordinates/array 53 | function sameLength(g1,g2) { 54 | return g1.hasOwnProperty('coordinates') ? 55 | g1.coordinates.length === g2.coordinates.length 56 | : g1.length === g2.length; 57 | } 58 | 59 | // compare the two coordinates [x,y] 60 | Equality.prototype.compareCoord = function(c1,c2) { 61 | if (c1.length !== c2.length) { 62 | return false; 63 | } 64 | 65 | for (var i=0; i < c1.length; i++) { 66 | if (c1[i].toFixed(this.precision) !== c2[i].toFixed(this.precision)) { 67 | return false; 68 | } 69 | } 70 | return true; 71 | }; 72 | 73 | Equality.prototype.compareLine = function(path1,path2,ind,isPoly) { 74 | if (!sameLength(path1,path2)) return false; 75 | var p1 = this.pseudoNode ? path1 : this.removePseudo(path1); 76 | var p2 = this.pseudoNode ? path2 : this.removePseudo(path2); 77 | if (isPoly && !this.compareCoord(p1[0],p2[0])) { 78 | // fix start index of both to same point 79 | p2 = this.fixStartIndex(p2,p1); 80 | if(!p2) return; 81 | } 82 | // for linestring ind =0 and for polygon ind =1 83 | var sameDirection = this.compareCoord(p1[ind],p2[ind]); 84 | if (this.direction || sameDirection 85 | ) { 86 | return this.comparePath(p1, p2); 87 | } else { 88 | if (this.compareCoord(p1[ind],p2[p2.length - (1+ind)]) 89 | ) { 90 | return this.comparePath(p1.slice().reverse(), p2); 91 | } 92 | return false; 93 | } 94 | }; 95 | Equality.prototype.fixStartIndex = function(sourcePath,targetPath) { 96 | //make sourcePath first point same as of targetPath 97 | var correctPath,ind = -1; 98 | for (var i=0; i< sourcePath.length; i++) { 99 | if(this.compareCoord(sourcePath[i],targetPath[0])) { 100 | ind = i; 101 | break; 102 | } 103 | } 104 | if (ind >= 0) { 105 | correctPath = [].concat( 106 | sourcePath.slice(ind,sourcePath.length), 107 | sourcePath.slice(1,ind+1)); 108 | } 109 | return correctPath; 110 | }; 111 | Equality.prototype.comparePath = function (p1,p2) { 112 | var cont = this; 113 | return p1.every(function(c,i) { 114 | return cont.compareCoord(c,this[i]); 115 | },p2); 116 | }; 117 | 118 | Equality.prototype.comparePolygon = function(g1,g2) { 119 | if (this.compareLine(g1.coordinates[0],g2.coordinates[0],1,true)) { 120 | var holes1 = g1.coordinates.slice(1,g1.coordinates.length); 121 | var holes2 = g2.coordinates.slice(1,g2.coordinates.length); 122 | var cont = this; 123 | return holes1.every(function(h1) { 124 | return this.some(function(h2) { 125 | return cont.compareLine(h1,h2,1,true); 126 | }); 127 | },holes2); 128 | } else { 129 | return false; 130 | } 131 | }; 132 | 133 | Equality.prototype.compareGeometryCollection= function(g1,g2) { 134 | if ( 135 | !sameLength(g1.geometries, g2.geometries) || 136 | !this.compareBBox(g1,g2) 137 | ) { 138 | return false; 139 | } 140 | for (var i=0; i < g1.geometries.length; i++) { 141 | if (!this.compare(g1.geometries[i], g2.geometries[i])) { 142 | return false; 143 | } 144 | } 145 | return true 146 | }; 147 | 148 | Equality.prototype.compareFeature = function(g1,g2) { 149 | if ( 150 | g1.id !== g2.id || 151 | !this.objectComparator(g1.properties, g2.properties) || 152 | !this.compareBBox(g1,g2) 153 | ) { 154 | return false; 155 | } 156 | return this.compare(g1.geometry, g2.geometry); 157 | }; 158 | 159 | Equality.prototype.compareFeatureCollection = function(g1,g2) { 160 | if ( 161 | !sameLength(g1.features, g2.features) || 162 | !this.compareBBox(g1,g2) 163 | ) { 164 | return false; 165 | } 166 | for (var i=0; i < g1.features.length; i++) { 167 | if (!this.compare(g1.features[i], g2.features[i])) { 168 | return false; 169 | } 170 | } 171 | return true 172 | }; 173 | 174 | Equality.prototype.compareBBox = function(g1,g2) { 175 | if ( 176 | (!g1.bbox && !g2.bbox) || 177 | ( 178 | g1.bbox && g2.bbox && 179 | this.compareCoord(g1.bbox, g2.bbox) 180 | ) 181 | ) { 182 | return true; 183 | } 184 | return false; 185 | }; 186 | Equality.prototype.removePseudo = function(path) { 187 | //TODO to be implement 188 | return path; 189 | }; 190 | 191 | function objectComparator(obj1, obj2) { 192 | return deepEqual(obj1, obj2, {strict: true}); 193 | } 194 | 195 | module.exports = Equality; 196 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "geojson-equality", 3 | "version": "0.2.1", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "geojson-equality", 9 | "version": "0.2.1", 10 | "license": "MIT", 11 | "dependencies": { 12 | "dequal": "^2.0.3" 13 | }, 14 | "devDependencies": { 15 | "browserify": "~5.10.1", 16 | "chai": "~1.9.1", 17 | "exorcist": "^0.4.0", 18 | "mocha": "~1.21.4", 19 | "uglify-js": "^2.6.0", 20 | "watchify": "~1.0.2" 21 | } 22 | }, 23 | "node_modules/acorn": { 24 | "version": "4.0.13", 25 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", 26 | "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==", 27 | "dev": true, 28 | "bin": { 29 | "acorn": "bin/acorn" 30 | }, 31 | "engines": { 32 | "node": ">=0.4.0" 33 | } 34 | }, 35 | "node_modules/acorn-node": { 36 | "version": "1.8.2", 37 | "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", 38 | "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", 39 | "dev": true, 40 | "dependencies": { 41 | "acorn": "^7.0.0", 42 | "acorn-walk": "^7.0.0", 43 | "xtend": "^4.0.2" 44 | } 45 | }, 46 | "node_modules/acorn-node/node_modules/acorn": { 47 | "version": "7.4.1", 48 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 49 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 50 | "dev": true, 51 | "bin": { 52 | "acorn": "bin/acorn" 53 | }, 54 | "engines": { 55 | "node": ">=0.4.0" 56 | } 57 | }, 58 | "node_modules/acorn-node/node_modules/xtend": { 59 | "version": "4.0.2", 60 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 61 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 62 | "dev": true, 63 | "engines": { 64 | "node": ">=0.4" 65 | } 66 | }, 67 | "node_modules/acorn-walk": { 68 | "version": "7.2.0", 69 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", 70 | "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", 71 | "dev": true, 72 | "engines": { 73 | "node": ">=0.4.0" 74 | } 75 | }, 76 | "node_modules/align-text": { 77 | "version": "0.1.4", 78 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", 79 | "integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==", 80 | "dev": true, 81 | "dependencies": { 82 | "kind-of": "^3.0.2", 83 | "longest": "^1.0.1", 84 | "repeat-string": "^1.5.2" 85 | }, 86 | "engines": { 87 | "node": ">=0.10.0" 88 | } 89 | }, 90 | "node_modules/amdefine": { 91 | "version": "1.0.1", 92 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 93 | "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", 94 | "dev": true, 95 | "engines": { 96 | "node": ">=0.4.2" 97 | } 98 | }, 99 | "node_modules/asn1.js": { 100 | "version": "4.10.1", 101 | "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", 102 | "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", 103 | "dev": true, 104 | "dependencies": { 105 | "bn.js": "^4.0.0", 106 | "inherits": "^2.0.1", 107 | "minimalistic-assert": "^1.0.0" 108 | } 109 | }, 110 | "node_modules/asn1.js/node_modules/bn.js": { 111 | "version": "4.12.0", 112 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 113 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 114 | "dev": true 115 | }, 116 | "node_modules/assert": { 117 | "version": "1.1.2", 118 | "resolved": "https://registry.npmjs.org/assert/-/assert-1.1.2.tgz", 119 | "integrity": "sha512-pSLN/C6u6JFR8L+0TzQ0Elc+VboxUXFtNw11RI1UcTcHEktQqIKIKK5S4nAZX4j8mpTpnCtmqpR+thPfqT11Kg==", 120 | "dev": true, 121 | "dependencies": { 122 | "util": "0.10.3" 123 | } 124 | }, 125 | "node_modules/assert/node_modules/inherits": { 126 | "version": "2.0.1", 127 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", 128 | "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", 129 | "dev": true 130 | }, 131 | "node_modules/assert/node_modules/util": { 132 | "version": "0.10.3", 133 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", 134 | "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", 135 | "dev": true, 136 | "dependencies": { 137 | "inherits": "2.0.1" 138 | } 139 | }, 140 | "node_modules/assertion-error": { 141 | "version": "1.0.0", 142 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.0.tgz", 143 | "integrity": "sha512-g/gZV+G476cnmtYI+Ko9d5khxSoCSoom/EaNmmCfwpOvBXEJ18qwFrxfP1/CsIqk2no1sAKKwxndV0tP7ROOFQ==", 144 | "dev": true, 145 | "engines": { 146 | "node": "*" 147 | } 148 | }, 149 | "node_modules/astw": { 150 | "version": "2.2.0", 151 | "resolved": "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz", 152 | "integrity": "sha512-E/4z//dvN0lfr8zAx8hXeQ8o3nRoQaL/wqI7fAALEvh/40mnyUxfFB9MwyDHYKVDtS3cp3Pow5s96djZR5lkWw==", 153 | "dev": true, 154 | "dependencies": { 155 | "acorn": "^4.0.3" 156 | } 157 | }, 158 | "node_modules/async": { 159 | "version": "0.2.10", 160 | "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", 161 | "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==", 162 | "dev": true 163 | }, 164 | "node_modules/balanced-match": { 165 | "version": "1.0.2", 166 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 167 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 168 | "dev": true 169 | }, 170 | "node_modules/Base64": { 171 | "version": "0.2.1", 172 | "resolved": "https://registry.npmjs.org/Base64/-/Base64-0.2.1.tgz", 173 | "integrity": "sha512-reGEWshDmTDQDsCec/HduOO9Wyj6yMOupMfhIf3ugN1TDlK2NQW4DDJSqNNtp380SNcvRfXtO8HSCQot0d0SMw==", 174 | "dev": true 175 | }, 176 | "node_modules/base64-js": { 177 | "version": "0.0.7", 178 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.7.tgz", 179 | "integrity": "sha512-0nMfGOwe+glKQmfi9trLwlSMeLuTkupKQ6scwrlRP4TdfZR87kwZwMBNYOz8xdtXqefa2uI7rQy6n8GxxtYFvw==", 180 | "dev": true, 181 | "engines": { 182 | "node": ">= 0.4" 183 | } 184 | }, 185 | "node_modules/bn.js": { 186 | "version": "5.2.1", 187 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", 188 | "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", 189 | "dev": true 190 | }, 191 | "node_modules/brace-expansion": { 192 | "version": "1.1.11", 193 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 194 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 195 | "dev": true, 196 | "dependencies": { 197 | "balanced-match": "^1.0.0", 198 | "concat-map": "0.0.1" 199 | } 200 | }, 201 | "node_modules/brorand": { 202 | "version": "1.1.0", 203 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", 204 | "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", 205 | "dev": true 206 | }, 207 | "node_modules/browser-pack": { 208 | "version": "3.2.0", 209 | "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-3.2.0.tgz", 210 | "integrity": "sha512-BHla5EbbxjNyLMFUMamVjeTY+q1QwHbrYNXlWOkw71QcBqAQF7maJyNh3OI/V0d5YyNdMYD6tiPhJB9ukBo99Q==", 211 | "dev": true, 212 | "dependencies": { 213 | "combine-source-map": "~0.3.0", 214 | "concat-stream": "~1.4.1", 215 | "defined": "~0.0.0", 216 | "JSONStream": "~0.8.4", 217 | "through2": "~0.5.1", 218 | "umd": "^2.1.0" 219 | }, 220 | "bin": { 221 | "browser-pack": "bin/cmd.js" 222 | } 223 | }, 224 | "node_modules/browser-pack/node_modules/readable-stream": { 225 | "version": "1.0.34", 226 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 227 | "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", 228 | "dev": true, 229 | "dependencies": { 230 | "core-util-is": "~1.0.0", 231 | "inherits": "~2.0.1", 232 | "isarray": "0.0.1", 233 | "string_decoder": "~0.10.x" 234 | } 235 | }, 236 | "node_modules/browser-pack/node_modules/string_decoder": { 237 | "version": "0.10.31", 238 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 239 | "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", 240 | "dev": true 241 | }, 242 | "node_modules/browser-pack/node_modules/through2": { 243 | "version": "0.5.1", 244 | "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", 245 | "integrity": "sha512-zexCrAOTbjkBCXGyozn7hhS3aEaqdrc59mAD2E3dKYzV1vFuEGQ1hEDJN2oQMQFwy4he2zyLqPZV+AlfS8ZWJA==", 246 | "dev": true, 247 | "dependencies": { 248 | "readable-stream": "~1.0.17", 249 | "xtend": "~3.0.0" 250 | } 251 | }, 252 | "node_modules/browser-resolve": { 253 | "version": "1.11.3", 254 | "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", 255 | "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", 256 | "dev": true, 257 | "dependencies": { 258 | "resolve": "1.1.7" 259 | } 260 | }, 261 | "node_modules/browser-resolve/node_modules/resolve": { 262 | "version": "1.1.7", 263 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", 264 | "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", 265 | "dev": true 266 | }, 267 | "node_modules/browserify": { 268 | "version": "5.10.1", 269 | "resolved": "https://registry.npmjs.org/browserify/-/browserify-5.10.1.tgz", 270 | "integrity": "sha512-7IMyX884ExLV3N7YVBOfBVKcIsx0pKg3pTG6Cvlp896yuxlPWQBez8T1J4MmES55++a+qp3C0+rWvq6XYHRSCg==", 271 | "dev": true, 272 | "dependencies": { 273 | "assert": "~1.1.0", 274 | "browser-pack": "^3.0.0", 275 | "browser-resolve": "^1.3.0", 276 | "browserify-zlib": "~0.1.2", 277 | "buffer": "^2.3.0", 278 | "builtins": "~0.0.3", 279 | "commondir": "0.0.1", 280 | "concat-stream": "~1.4.1", 281 | "console-browserify": "^1.1.0", 282 | "constants-browserify": "~0.0.1", 283 | "crypto-browserify": "^3.0.0", 284 | "deep-equal": "~0.2.1", 285 | "defined": "~0.0.0", 286 | "deps-sort": "^1.3.5", 287 | "domain-browser": "~1.1.0", 288 | "duplexer2": "~0.0.2", 289 | "events": "~1.0.0", 290 | "glob": "^4.0.5", 291 | "http-browserify": "^1.4.0", 292 | "https-browserify": "~0.0.0", 293 | "inherits": "~2.0.1", 294 | "insert-module-globals": "^6.1.0", 295 | "isarray": "0.0.1", 296 | "JSONStream": "~0.8.3", 297 | "labeled-stream-splicer": "^1.0.0", 298 | "module-deps": "^3.5.0", 299 | "os-browserify": "~0.1.1", 300 | "parents": "~0.0.1", 301 | "path-browserify": "~0.0.0", 302 | "process": "^0.7.0", 303 | "punycode": "~1.2.3", 304 | "querystring-es3": "~0.2.0", 305 | "readable-stream": "^1.0.27-1", 306 | "resolve": "~0.7.1", 307 | "shallow-copy": "0.0.1", 308 | "shasum": "^1.0.0", 309 | "shell-quote": "~0.0.1", 310 | "stream-browserify": "^1.0.0", 311 | "stream-combiner": "~0.0.2", 312 | "string_decoder": "~0.0.0", 313 | "subarg": "0.0.1", 314 | "syntax-error": "^1.1.1", 315 | "through2": "^1.0.0", 316 | "timers-browserify": "^1.0.1", 317 | "tty-browserify": "~0.0.0", 318 | "umd": "~2.1.0", 319 | "url": "~0.10.1", 320 | "util": "~0.10.1", 321 | "vm-browserify": "~0.0.1", 322 | "xtend": "^3.0.0" 323 | }, 324 | "bin": { 325 | "browserify": "bin/cmd.js" 326 | } 327 | }, 328 | "node_modules/browserify-aes": { 329 | "version": "1.2.0", 330 | "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", 331 | "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", 332 | "dev": true, 333 | "dependencies": { 334 | "buffer-xor": "^1.0.3", 335 | "cipher-base": "^1.0.0", 336 | "create-hash": "^1.1.0", 337 | "evp_bytestokey": "^1.0.3", 338 | "inherits": "^2.0.1", 339 | "safe-buffer": "^5.0.1" 340 | } 341 | }, 342 | "node_modules/browserify-cipher": { 343 | "version": "1.0.1", 344 | "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", 345 | "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", 346 | "dev": true, 347 | "dependencies": { 348 | "browserify-aes": "^1.0.4", 349 | "browserify-des": "^1.0.0", 350 | "evp_bytestokey": "^1.0.0" 351 | } 352 | }, 353 | "node_modules/browserify-des": { 354 | "version": "1.0.2", 355 | "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", 356 | "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", 357 | "dev": true, 358 | "dependencies": { 359 | "cipher-base": "^1.0.1", 360 | "des.js": "^1.0.0", 361 | "inherits": "^2.0.1", 362 | "safe-buffer": "^5.1.2" 363 | } 364 | }, 365 | "node_modules/browserify-rsa": { 366 | "version": "4.1.0", 367 | "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", 368 | "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", 369 | "dev": true, 370 | "dependencies": { 371 | "bn.js": "^5.0.0", 372 | "randombytes": "^2.0.1" 373 | } 374 | }, 375 | "node_modules/browserify-sign": { 376 | "version": "4.2.3", 377 | "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", 378 | "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", 379 | "dev": true, 380 | "dependencies": { 381 | "bn.js": "^5.2.1", 382 | "browserify-rsa": "^4.1.0", 383 | "create-hash": "^1.2.0", 384 | "create-hmac": "^1.1.7", 385 | "elliptic": "^6.5.5", 386 | "hash-base": "~3.0", 387 | "inherits": "^2.0.4", 388 | "parse-asn1": "^5.1.7", 389 | "readable-stream": "^2.3.8", 390 | "safe-buffer": "^5.2.1" 391 | }, 392 | "engines": { 393 | "node": ">= 0.12" 394 | } 395 | }, 396 | "node_modules/browserify-sign/node_modules/isarray": { 397 | "version": "1.0.0", 398 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 399 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", 400 | "dev": true 401 | }, 402 | "node_modules/browserify-sign/node_modules/readable-stream": { 403 | "version": "2.3.8", 404 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", 405 | "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", 406 | "dev": true, 407 | "dependencies": { 408 | "core-util-is": "~1.0.0", 409 | "inherits": "~2.0.3", 410 | "isarray": "~1.0.0", 411 | "process-nextick-args": "~2.0.0", 412 | "safe-buffer": "~5.1.1", 413 | "string_decoder": "~1.1.1", 414 | "util-deprecate": "~1.0.1" 415 | } 416 | }, 417 | "node_modules/browserify-sign/node_modules/readable-stream/node_modules/safe-buffer": { 418 | "version": "5.1.2", 419 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 420 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 421 | "dev": true 422 | }, 423 | "node_modules/browserify-sign/node_modules/string_decoder": { 424 | "version": "1.1.1", 425 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 426 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 427 | "dev": true, 428 | "dependencies": { 429 | "safe-buffer": "~5.1.0" 430 | } 431 | }, 432 | "node_modules/browserify-sign/node_modules/string_decoder/node_modules/safe-buffer": { 433 | "version": "5.1.2", 434 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 435 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 436 | "dev": true 437 | }, 438 | "node_modules/browserify-zlib": { 439 | "version": "0.1.4", 440 | "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", 441 | "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", 442 | "dev": true, 443 | "dependencies": { 444 | "pako": "~0.2.0" 445 | } 446 | }, 447 | "node_modules/browserify/node_modules/deep-equal": { 448 | "version": "0.2.2", 449 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz", 450 | "integrity": "sha512-FXgye2Jr6oEk01S7gmSrHrPEQ1ontR7wwl+nYiZ8h4SXlHVm0DYda74BIPcHz2s2qPz4+375IcAz1vsWLwddgQ==", 451 | "dev": true 452 | }, 453 | "node_modules/buffer": { 454 | "version": "2.8.3", 455 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-2.8.3.tgz", 456 | "integrity": "sha512-dyatqxbSWlkhnG5lthQ7TDh2NfShsKesnKiGyt5DmiJfvKJ1zBq1AvC3+neSY565BziAiYwbothV2tizAr2WRg==", 457 | "dev": true, 458 | "dependencies": { 459 | "base64-js": "0.0.7", 460 | "ieee754": "^1.1.4", 461 | "is-array": "^1.0.1" 462 | } 463 | }, 464 | "node_modules/buffer-xor": { 465 | "version": "1.0.3", 466 | "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", 467 | "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", 468 | "dev": true 469 | }, 470 | "node_modules/builtins": { 471 | "version": "0.0.7", 472 | "resolved": "https://registry.npmjs.org/builtins/-/builtins-0.0.7.tgz", 473 | "integrity": "sha512-T8uCGKc0/2aLVt6omt8JxDRBoWEMkku+wFesxnhxnt4NygVZG99zqxo7ciK8eebszceKamGoUiLdkXCgGQyrQw==", 474 | "dev": true 475 | }, 476 | "node_modules/callsite": { 477 | "version": "1.0.0", 478 | "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", 479 | "integrity": "sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==", 480 | "dev": true, 481 | "engines": { 482 | "node": "*" 483 | } 484 | }, 485 | "node_modules/camelcase": { 486 | "version": "1.2.1", 487 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", 488 | "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==", 489 | "dev": true, 490 | "engines": { 491 | "node": ">=0.10.0" 492 | } 493 | }, 494 | "node_modules/center-align": { 495 | "version": "0.1.3", 496 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", 497 | "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", 498 | "dev": true, 499 | "dependencies": { 500 | "align-text": "^0.1.3", 501 | "lazy-cache": "^1.0.3" 502 | }, 503 | "engines": { 504 | "node": ">=0.10.0" 505 | } 506 | }, 507 | "node_modules/chai": { 508 | "version": "1.9.2", 509 | "resolved": "https://registry.npmjs.org/chai/-/chai-1.9.2.tgz", 510 | "integrity": "sha512-olRoaitftnzWHFEAza6MXR4w+FfZrOVyV7r7U/Z8ObJefCgL8IuWkAuASJjSXrpP9wvgoL8+1dB9RbMLc2FkNg==", 511 | "dev": true, 512 | "dependencies": { 513 | "assertion-error": "1.0.0", 514 | "deep-eql": "0.1.3" 515 | }, 516 | "engines": { 517 | "node": ">= 0.4.0" 518 | } 519 | }, 520 | "node_modules/chokidar": { 521 | "version": "0.8.4", 522 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-0.8.4.tgz", 523 | "integrity": "sha512-auWFkYQV6w4821+YQATR3ueTMRPMAK9qVzl9cyE1O7dM7l2/NI6IIDcvPrER+RzdgoCi5b9aCy3btoZFsLVJbw==", 524 | "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", 525 | "dev": true, 526 | "optionalDependencies": { 527 | "fsevents": "pipobscure/fsevents#7dcdf9fa3f8956610fd6f69f72c67bace2de7138", 528 | "recursive-readdir": "0.0.2" 529 | } 530 | }, 531 | "node_modules/cipher-base": { 532 | "version": "1.0.4", 533 | "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", 534 | "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", 535 | "dev": true, 536 | "dependencies": { 537 | "inherits": "^2.0.1", 538 | "safe-buffer": "^5.0.1" 539 | } 540 | }, 541 | "node_modules/cliui": { 542 | "version": "2.1.0", 543 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", 544 | "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==", 545 | "dev": true, 546 | "dependencies": { 547 | "center-align": "^0.1.1", 548 | "right-align": "^0.1.1", 549 | "wordwrap": "0.0.2" 550 | } 551 | }, 552 | "node_modules/combine-source-map": { 553 | "version": "0.3.0", 554 | "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.3.0.tgz", 555 | "integrity": "sha512-HRKa6g9SC1xd6ifto8ay6SxvyHaaQ50/8NO1ZONXx2hsIF9t/52qXa7Eeivaf5KFOSowK7Nm8TkIL/VC4khdBA==", 556 | "dev": true, 557 | "dependencies": { 558 | "convert-source-map": "~0.3.0", 559 | "inline-source-map": "~0.3.0", 560 | "source-map": "~0.1.31" 561 | } 562 | }, 563 | "node_modules/commander": { 564 | "version": "2.3.0", 565 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", 566 | "integrity": "sha512-CD452fnk0jQyk3NfnK+KkR/hUPoHt5pVaKHogtyyv3N0U4QfAal9W0/rXLOg/vVZgQKa7jdtXypKs1YAip11uQ==", 567 | "dev": true, 568 | "engines": { 569 | "node": ">= 0.6.x" 570 | } 571 | }, 572 | "node_modules/commondir": { 573 | "version": "0.0.1", 574 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-0.0.1.tgz", 575 | "integrity": "sha512-Ghe1LmLv3G3c0XJYu+c88MCRIPqWQ67qaqKY1KvuN4uPAjfUj+y4hvcpZ2kCPrjpRNyklW4dpAZZ8a7vOh50tg==", 576 | "dev": true, 577 | "engines": { 578 | "node": "*" 579 | } 580 | }, 581 | "node_modules/concat-map": { 582 | "version": "0.0.1", 583 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 584 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 585 | "dev": true 586 | }, 587 | "node_modules/concat-stream": { 588 | "version": "1.4.11", 589 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.4.11.tgz", 590 | "integrity": "sha512-X3JMh8+4je3U1cQpG87+f9lXHDrqcb2MVLg9L7o8b1UZ0DzhRrUpdn65ttzu10PpJPPI3MQNkis+oha6TSA9Mw==", 591 | "dev": true, 592 | "engines": [ 593 | "node >= 0.8" 594 | ], 595 | "dependencies": { 596 | "inherits": "~2.0.1", 597 | "readable-stream": "~1.1.9", 598 | "typedarray": "~0.0.5" 599 | } 600 | }, 601 | "node_modules/console-browserify": { 602 | "version": "1.2.0", 603 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", 604 | "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", 605 | "dev": true 606 | }, 607 | "node_modules/constants-browserify": { 608 | "version": "0.0.1", 609 | "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-0.0.1.tgz", 610 | "integrity": "sha512-FL+diDS9AKR5BAA2M+GNk8lnH64tRE3zepTG9hucxc7o04LgCRhkQZhF7u/OKHZT8LLRT+sZEi9qFzXUchq9pA==", 611 | "dev": true 612 | }, 613 | "node_modules/convert-source-map": { 614 | "version": "0.3.5", 615 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", 616 | "integrity": "sha512-+4nRk0k3oEpwUB7/CalD7xE2z4VmtEnnq0GO2IPTkrooTrAhEsWvuLF5iWP1dXrwluki/azwXV1ve7gtYuPldg==", 617 | "dev": true 618 | }, 619 | "node_modules/core-util-is": { 620 | "version": "1.0.3", 621 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 622 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", 623 | "dev": true 624 | }, 625 | "node_modules/create-ecdh": { 626 | "version": "4.0.4", 627 | "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", 628 | "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", 629 | "dev": true, 630 | "dependencies": { 631 | "bn.js": "^4.1.0", 632 | "elliptic": "^6.5.3" 633 | } 634 | }, 635 | "node_modules/create-ecdh/node_modules/bn.js": { 636 | "version": "4.12.0", 637 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 638 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 639 | "dev": true 640 | }, 641 | "node_modules/create-hash": { 642 | "version": "1.2.0", 643 | "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", 644 | "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", 645 | "dev": true, 646 | "dependencies": { 647 | "cipher-base": "^1.0.1", 648 | "inherits": "^2.0.1", 649 | "md5.js": "^1.3.4", 650 | "ripemd160": "^2.0.1", 651 | "sha.js": "^2.4.0" 652 | } 653 | }, 654 | "node_modules/create-hmac": { 655 | "version": "1.1.7", 656 | "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", 657 | "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", 658 | "dev": true, 659 | "dependencies": { 660 | "cipher-base": "^1.0.3", 661 | "create-hash": "^1.1.0", 662 | "inherits": "^2.0.1", 663 | "ripemd160": "^2.0.0", 664 | "safe-buffer": "^5.0.1", 665 | "sha.js": "^2.4.8" 666 | } 667 | }, 668 | "node_modules/crypto-browserify": { 669 | "version": "3.12.0", 670 | "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", 671 | "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", 672 | "dev": true, 673 | "dependencies": { 674 | "browserify-cipher": "^1.0.0", 675 | "browserify-sign": "^4.0.0", 676 | "create-ecdh": "^4.0.0", 677 | "create-hash": "^1.1.0", 678 | "create-hmac": "^1.1.0", 679 | "diffie-hellman": "^5.0.0", 680 | "inherits": "^2.0.1", 681 | "pbkdf2": "^3.0.3", 682 | "public-encrypt": "^4.0.0", 683 | "randombytes": "^2.0.0", 684 | "randomfill": "^1.0.3" 685 | }, 686 | "engines": { 687 | "node": "*" 688 | } 689 | }, 690 | "node_modules/debug": { 691 | "version": "2.0.0", 692 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.0.0.tgz", 693 | "integrity": "sha512-jRxFR0Fb657ikmm6IjHY32v/Nqp9Ndcx4LBISXPfpguNaHh5JJnb+x37qalKPTu4fxMFnVBIyEGi72mmvl0BCw==", 694 | "dev": true, 695 | "dependencies": { 696 | "ms": "0.6.2" 697 | } 698 | }, 699 | "node_modules/decamelize": { 700 | "version": "1.2.0", 701 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 702 | "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", 703 | "dev": true, 704 | "engines": { 705 | "node": ">=0.10.0" 706 | } 707 | }, 708 | "node_modules/deep-eql": { 709 | "version": "0.1.3", 710 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", 711 | "integrity": "sha512-6sEotTRGBFiNcqVoeHwnfopbSpi5NbH1VWJmYCVkmxMmaVTT0bUTrNaGyBwhgP4MZL012W/mkzIn3Da+iDYweg==", 712 | "dev": true, 713 | "dependencies": { 714 | "type-detect": "0.1.1" 715 | }, 716 | "engines": { 717 | "node": "*" 718 | } 719 | }, 720 | "node_modules/defined": { 721 | "version": "0.0.0", 722 | "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz", 723 | "integrity": "sha512-zpqiCT8bODLu3QSmLLic8xJnYWBFjOSu/fBCm189oAiTtPq/PSanNACKZDS7kgSyCJY7P+IcODzlIogBK/9RBg==", 724 | "dev": true 725 | }, 726 | "node_modules/deps-sort": { 727 | "version": "1.3.9", 728 | "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-1.3.9.tgz", 729 | "integrity": "sha512-aEnmQuu/Hf5h8akL8QshYWzk9MVBg/JYMyNq/Lz68i69nR17tunjP6o/AC6Tn48c8ayzG6aeKs6OoFOtVCtvrQ==", 730 | "dev": true, 731 | "dependencies": { 732 | "JSONStream": "^1.0.3", 733 | "shasum": "^1.0.0", 734 | "subarg": "^1.0.0", 735 | "through2": "^1.0.0" 736 | }, 737 | "bin": { 738 | "deps-sort": "bin/cmd.js" 739 | } 740 | }, 741 | "node_modules/deps-sort/node_modules/jsonparse": { 742 | "version": "1.3.1", 743 | "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", 744 | "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", 745 | "dev": true, 746 | "engines": [ 747 | "node >= 0.2.0" 748 | ] 749 | }, 750 | "node_modules/deps-sort/node_modules/JSONStream": { 751 | "version": "1.3.5", 752 | "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", 753 | "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", 754 | "dev": true, 755 | "dependencies": { 756 | "jsonparse": "^1.2.0", 757 | "through": ">=2.2.7 <3" 758 | }, 759 | "bin": { 760 | "JSONStream": "bin.js" 761 | }, 762 | "engines": { 763 | "node": "*" 764 | } 765 | }, 766 | "node_modules/deps-sort/node_modules/minimist": { 767 | "version": "1.2.8", 768 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 769 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 770 | "dev": true, 771 | "funding": { 772 | "url": "https://github.com/sponsors/ljharb" 773 | } 774 | }, 775 | "node_modules/deps-sort/node_modules/subarg": { 776 | "version": "1.0.0", 777 | "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", 778 | "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==", 779 | "dev": true, 780 | "dependencies": { 781 | "minimist": "^1.1.0" 782 | } 783 | }, 784 | "node_modules/dequal": { 785 | "version": "2.0.3", 786 | "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", 787 | "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", 788 | "engines": { 789 | "node": ">=6" 790 | } 791 | }, 792 | "node_modules/des.js": { 793 | "version": "1.1.0", 794 | "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", 795 | "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", 796 | "dev": true, 797 | "dependencies": { 798 | "inherits": "^2.0.1", 799 | "minimalistic-assert": "^1.0.0" 800 | } 801 | }, 802 | "node_modules/detective": { 803 | "version": "4.7.1", 804 | "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", 805 | "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", 806 | "dev": true, 807 | "dependencies": { 808 | "acorn": "^5.2.1", 809 | "defined": "^1.0.0" 810 | } 811 | }, 812 | "node_modules/detective/node_modules/acorn": { 813 | "version": "5.7.4", 814 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", 815 | "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", 816 | "dev": true, 817 | "bin": { 818 | "acorn": "bin/acorn" 819 | }, 820 | "engines": { 821 | "node": ">=0.4.0" 822 | } 823 | }, 824 | "node_modules/detective/node_modules/defined": { 825 | "version": "1.0.1", 826 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", 827 | "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", 828 | "dev": true, 829 | "funding": { 830 | "url": "https://github.com/sponsors/ljharb" 831 | } 832 | }, 833 | "node_modules/diff": { 834 | "version": "1.0.8", 835 | "resolved": "https://registry.npmjs.org/diff/-/diff-1.0.8.tgz", 836 | "integrity": "sha512-1zEb73vemXFpUmfh3fsta4YHz3lwebxXvaWmPbFv9apujQBWDnkrPDLXLQs1gZo4RCWMDsT89r0Pf/z8/02TGA==", 837 | "dev": true, 838 | "engines": { 839 | "node": ">=0.3.1" 840 | } 841 | }, 842 | "node_modules/diffie-hellman": { 843 | "version": "5.0.3", 844 | "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", 845 | "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", 846 | "dev": true, 847 | "dependencies": { 848 | "bn.js": "^4.1.0", 849 | "miller-rabin": "^4.0.0", 850 | "randombytes": "^2.0.0" 851 | } 852 | }, 853 | "node_modules/diffie-hellman/node_modules/bn.js": { 854 | "version": "4.12.0", 855 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 856 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 857 | "dev": true 858 | }, 859 | "node_modules/domain-browser": { 860 | "version": "1.1.7", 861 | "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", 862 | "integrity": "sha512-fJ5MoHxe69h3E4/lJtFRhcWwLb04bhIBSfvCEMS1YDH+/9yEZTqBHTSTgch8nCP5tE5k2gdQEjodUqJzy7qJ9Q==", 863 | "dev": true, 864 | "engines": { 865 | "node": ">=0.4", 866 | "npm": ">=1.2" 867 | } 868 | }, 869 | "node_modules/duplexer": { 870 | "version": "0.1.2", 871 | "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", 872 | "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", 873 | "dev": true 874 | }, 875 | "node_modules/duplexer2": { 876 | "version": "0.0.2", 877 | "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", 878 | "integrity": "sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==", 879 | "dev": true, 880 | "dependencies": { 881 | "readable-stream": "~1.1.9" 882 | } 883 | }, 884 | "node_modules/elliptic": { 885 | "version": "6.5.6", 886 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.6.tgz", 887 | "integrity": "sha512-mpzdtpeCLuS3BmE3pO3Cpp5bbjlOPY2Q0PgoF+Od1XZrHLYI28Xe3ossCmYCQt11FQKEYd9+PF8jymTvtWJSHQ==", 888 | "dev": true, 889 | "dependencies": { 890 | "bn.js": "^4.11.9", 891 | "brorand": "^1.1.0", 892 | "hash.js": "^1.0.0", 893 | "hmac-drbg": "^1.0.1", 894 | "inherits": "^2.0.4", 895 | "minimalistic-assert": "^1.0.1", 896 | "minimalistic-crypto-utils": "^1.0.1" 897 | } 898 | }, 899 | "node_modules/elliptic/node_modules/bn.js": { 900 | "version": "4.12.0", 901 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 902 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 903 | "dev": true 904 | }, 905 | "node_modules/escape-string-regexp": { 906 | "version": "1.0.2", 907 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", 908 | "integrity": "sha512-cQpUid7bdTUnFin8S7BnNdOk+/eDqQmKgCANSyd/jAhrKEvxUvr9VQ8XZzXiOtest8NLfk3FSBZzwvemZNQ6Vg==", 909 | "dev": true, 910 | "engines": { 911 | "node": ">=0.8.0" 912 | } 913 | }, 914 | "node_modules/events": { 915 | "version": "1.0.2", 916 | "resolved": "https://registry.npmjs.org/events/-/events-1.0.2.tgz", 917 | "integrity": "sha512-XK19KwlDJo8XsceooxNDK1pObtcT44+Xte6V/jQc4a+fHq1qEouThyyX2ePmS0hS8RcCulmRxzg+T8jiLKAFFQ==", 918 | "dev": true, 919 | "engines": { 920 | "node": ">=0.4.x" 921 | } 922 | }, 923 | "node_modules/evp_bytestokey": { 924 | "version": "1.0.3", 925 | "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", 926 | "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", 927 | "dev": true, 928 | "dependencies": { 929 | "md5.js": "^1.3.4", 930 | "safe-buffer": "^5.1.1" 931 | } 932 | }, 933 | "node_modules/exorcist": { 934 | "version": "0.4.0", 935 | "resolved": "https://registry.npmjs.org/exorcist/-/exorcist-0.4.0.tgz", 936 | "integrity": "sha512-J6L1tiHjvHkhjHXsulQg9fDoO6ck+9/pdycyp6ZfGKoItkX9iom0vwifIBaOdb+w7h7Y6W7MbqyIBfbhs3JfFQ==", 937 | "dev": true, 938 | "dependencies": { 939 | "minimist": "0.0.5", 940 | "mold-source-map": "~0.4.0", 941 | "nave": "~0.5.1" 942 | }, 943 | "bin": { 944 | "exorcist": "bin/exorcist.js" 945 | } 946 | }, 947 | "node_modules/function-bind": { 948 | "version": "1.1.2", 949 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 950 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 951 | "dev": true, 952 | "funding": { 953 | "url": "https://github.com/sponsors/ljharb" 954 | } 955 | }, 956 | "node_modules/glob": { 957 | "version": "4.5.3", 958 | "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", 959 | "integrity": "sha512-I0rTWUKSZKxPSIAIaqhSXTM/DiII6wame+rEC3cFA5Lqmr9YmdL7z6Hj9+bdWtTvoY1Su4/OiMLmb37Y7JzvJQ==", 960 | "deprecated": "Glob versions prior to v9 are no longer supported", 961 | "dev": true, 962 | "dependencies": { 963 | "inflight": "^1.0.4", 964 | "inherits": "2", 965 | "minimatch": "^2.0.1", 966 | "once": "^1.3.0" 967 | }, 968 | "engines": { 969 | "node": "*" 970 | } 971 | }, 972 | "node_modules/graceful-fs": { 973 | "version": "2.0.3", 974 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", 975 | "integrity": "sha512-hcj/NTUWv+C3MbqrVb9F+aH6lvTwEHJdx2foBxlrVq5h6zE8Bfu4pv4CAAqbDcZrw/9Ak5lsRXlY9Ao8/F0Tuw==", 976 | "deprecated": "please upgrade to graceful-fs 4 for compatibility with current and future versions of Node.js", 977 | "dev": true, 978 | "engines": { 979 | "node": ">=0.4.0" 980 | } 981 | }, 982 | "node_modules/growl": { 983 | "version": "1.8.1", 984 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.8.1.tgz", 985 | "integrity": "sha512-Hq61svqhXHBTY80KsuLrItJ9A0YP1PSeiS4hhi77NcPQf+F+yagOSkhuhZdND7NfAcpHm495FKUTmRcygzF0OA==", 986 | "dev": true 987 | }, 988 | "node_modules/hash-base": { 989 | "version": "3.0.4", 990 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", 991 | "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", 992 | "dev": true, 993 | "dependencies": { 994 | "inherits": "^2.0.1", 995 | "safe-buffer": "^5.0.1" 996 | }, 997 | "engines": { 998 | "node": ">=4" 999 | } 1000 | }, 1001 | "node_modules/hash.js": { 1002 | "version": "1.1.7", 1003 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", 1004 | "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", 1005 | "dev": true, 1006 | "dependencies": { 1007 | "inherits": "^2.0.3", 1008 | "minimalistic-assert": "^1.0.1" 1009 | } 1010 | }, 1011 | "node_modules/hasown": { 1012 | "version": "2.0.2", 1013 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 1014 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 1015 | "dev": true, 1016 | "dependencies": { 1017 | "function-bind": "^1.1.2" 1018 | }, 1019 | "engines": { 1020 | "node": ">= 0.4" 1021 | } 1022 | }, 1023 | "node_modules/hmac-drbg": { 1024 | "version": "1.0.1", 1025 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", 1026 | "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", 1027 | "dev": true, 1028 | "dependencies": { 1029 | "hash.js": "^1.0.3", 1030 | "minimalistic-assert": "^1.0.0", 1031 | "minimalistic-crypto-utils": "^1.0.1" 1032 | } 1033 | }, 1034 | "node_modules/http-browserify": { 1035 | "version": "1.7.0", 1036 | "resolved": "https://registry.npmjs.org/http-browserify/-/http-browserify-1.7.0.tgz", 1037 | "integrity": "sha512-Irf/LJXmE3cBzU1eaR4+NEX6bmVLqt1wkmDiA7kBwH7zmb0D8kBAXsDmQ88hhj/qv9iEZKlyGx/hrMcFi8sOHw==", 1038 | "dev": true, 1039 | "dependencies": { 1040 | "Base64": "~0.2.0", 1041 | "inherits": "~2.0.1" 1042 | } 1043 | }, 1044 | "node_modules/https-browserify": { 1045 | "version": "0.0.1", 1046 | "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", 1047 | "integrity": "sha512-EjDQFbgJr1vDD/175UJeSX3ncQ3+RUnCL5NkthQGHvF4VNHlzTy8ifJfTqz47qiPRqaFH58+CbuG3x51WuB1XQ==", 1048 | "dev": true 1049 | }, 1050 | "node_modules/ieee754": { 1051 | "version": "1.2.1", 1052 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 1053 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 1054 | "dev": true, 1055 | "funding": [ 1056 | { 1057 | "type": "github", 1058 | "url": "https://github.com/sponsors/feross" 1059 | }, 1060 | { 1061 | "type": "patreon", 1062 | "url": "https://www.patreon.com/feross" 1063 | }, 1064 | { 1065 | "type": "consulting", 1066 | "url": "https://feross.org/support" 1067 | } 1068 | ] 1069 | }, 1070 | "node_modules/indexof": { 1071 | "version": "0.0.1", 1072 | "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", 1073 | "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==", 1074 | "dev": true 1075 | }, 1076 | "node_modules/inflight": { 1077 | "version": "1.0.6", 1078 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1079 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1080 | "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", 1081 | "dev": true, 1082 | "dependencies": { 1083 | "once": "^1.3.0", 1084 | "wrappy": "1" 1085 | } 1086 | }, 1087 | "node_modules/inherits": { 1088 | "version": "2.0.4", 1089 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1090 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1091 | "dev": true 1092 | }, 1093 | "node_modules/inline-source-map": { 1094 | "version": "0.3.1", 1095 | "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.3.1.tgz", 1096 | "integrity": "sha512-RNlldBXZ7BBcVm3HjXIXiwKxih1lnuKbzeLBRDSB/qaqk8/g4JEZBjxpBQMhqEthQyGv7ycu8r/8PKGgBdIqrA==", 1097 | "dev": true, 1098 | "dependencies": { 1099 | "source-map": "~0.3.0" 1100 | } 1101 | }, 1102 | "node_modules/inline-source-map/node_modules/source-map": { 1103 | "version": "0.3.0", 1104 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.3.0.tgz", 1105 | "integrity": "sha512-jz8leTIGS8+qJywWiO9mKza0hJxexdeIYXhDHw9avTQcXSNAGk3hiiRMpmI2Qf9dOrZDrDpgH9VNefzuacWC9A==", 1106 | "dev": true, 1107 | "dependencies": { 1108 | "amdefine": ">=0.0.4" 1109 | }, 1110 | "engines": { 1111 | "node": ">=0.8.0" 1112 | } 1113 | }, 1114 | "node_modules/insert-module-globals": { 1115 | "version": "6.6.3", 1116 | "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-6.6.3.tgz", 1117 | "integrity": "sha512-ryk8hTKUZCc300SPOOwx30WhE5oRUssPDVlIoO8vtoMNBy5HGeesVRl3HF7ra4ll42T0IdnwD9XR9svh6+RRhg==", 1118 | "dev": true, 1119 | "dependencies": { 1120 | "combine-source-map": "~0.6.1", 1121 | "concat-stream": "~1.4.1", 1122 | "is-buffer": "^1.1.0", 1123 | "JSONStream": "^1.0.3", 1124 | "lexical-scope": "^1.2.0", 1125 | "process": "~0.11.0", 1126 | "through2": "^1.0.0", 1127 | "xtend": "^4.0.0" 1128 | }, 1129 | "bin": { 1130 | "insert-module-globals": "bin/cmd.js" 1131 | } 1132 | }, 1133 | "node_modules/insert-module-globals/node_modules/combine-source-map": { 1134 | "version": "0.6.1", 1135 | "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.6.1.tgz", 1136 | "integrity": "sha512-XKRNtuZRlVDTuSGKsfZpXYz80y0XDbYS4a+FzafTgmYHy/ckruFBx7Nd6WaQnFHVI3O6IseWVdXUvZutMpjSkQ==", 1137 | "dev": true, 1138 | "dependencies": { 1139 | "convert-source-map": "~1.1.0", 1140 | "inline-source-map": "~0.5.0", 1141 | "lodash.memoize": "~3.0.3", 1142 | "source-map": "~0.4.2" 1143 | } 1144 | }, 1145 | "node_modules/insert-module-globals/node_modules/convert-source-map": { 1146 | "version": "1.1.3", 1147 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", 1148 | "integrity": "sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==", 1149 | "dev": true 1150 | }, 1151 | "node_modules/insert-module-globals/node_modules/inline-source-map": { 1152 | "version": "0.5.0", 1153 | "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.5.0.tgz", 1154 | "integrity": "sha512-2WtHG0qX9OH9TVcxsLVfq3Tzr+qtL6PtWgoh0XAAKe4KkdA/57Q+OGJuRJHA4mZ2OZnkJ/ZAaXf9krLB12/nIg==", 1155 | "dev": true, 1156 | "dependencies": { 1157 | "source-map": "~0.4.0" 1158 | } 1159 | }, 1160 | "node_modules/insert-module-globals/node_modules/jsonparse": { 1161 | "version": "1.3.1", 1162 | "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", 1163 | "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", 1164 | "dev": true, 1165 | "engines": [ 1166 | "node >= 0.2.0" 1167 | ] 1168 | }, 1169 | "node_modules/insert-module-globals/node_modules/JSONStream": { 1170 | "version": "1.3.5", 1171 | "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", 1172 | "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", 1173 | "dev": true, 1174 | "dependencies": { 1175 | "jsonparse": "^1.2.0", 1176 | "through": ">=2.2.7 <3" 1177 | }, 1178 | "bin": { 1179 | "JSONStream": "bin.js" 1180 | }, 1181 | "engines": { 1182 | "node": "*" 1183 | } 1184 | }, 1185 | "node_modules/insert-module-globals/node_modules/process": { 1186 | "version": "0.11.10", 1187 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 1188 | "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", 1189 | "dev": true, 1190 | "engines": { 1191 | "node": ">= 0.6.0" 1192 | } 1193 | }, 1194 | "node_modules/insert-module-globals/node_modules/source-map": { 1195 | "version": "0.4.4", 1196 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", 1197 | "integrity": "sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A==", 1198 | "dev": true, 1199 | "dependencies": { 1200 | "amdefine": ">=0.0.4" 1201 | }, 1202 | "engines": { 1203 | "node": ">=0.8.0" 1204 | } 1205 | }, 1206 | "node_modules/insert-module-globals/node_modules/xtend": { 1207 | "version": "4.0.2", 1208 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1209 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 1210 | "dev": true, 1211 | "engines": { 1212 | "node": ">=0.4" 1213 | } 1214 | }, 1215 | "node_modules/is-array": { 1216 | "version": "1.0.1", 1217 | "resolved": "https://registry.npmjs.org/is-array/-/is-array-1.0.1.tgz", 1218 | "integrity": "sha512-gxiZ+y/u67AzpeFmAmo4CbtME/bs7J2C++su5zQzvQyaxUqVzkh69DI+jN+KZuSO6JaH6TIIU6M6LhqxMjxEpw==", 1219 | "dev": true 1220 | }, 1221 | "node_modules/is-buffer": { 1222 | "version": "1.1.6", 1223 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1224 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 1225 | "dev": true 1226 | }, 1227 | "node_modules/is-core-module": { 1228 | "version": "2.15.0", 1229 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", 1230 | "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", 1231 | "dev": true, 1232 | "dependencies": { 1233 | "hasown": "^2.0.2" 1234 | }, 1235 | "engines": { 1236 | "node": ">= 0.4" 1237 | }, 1238 | "funding": { 1239 | "url": "https://github.com/sponsors/ljharb" 1240 | } 1241 | }, 1242 | "node_modules/isarray": { 1243 | "version": "0.0.1", 1244 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 1245 | "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", 1246 | "dev": true 1247 | }, 1248 | "node_modules/jade": { 1249 | "version": "0.26.3", 1250 | "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", 1251 | "integrity": "sha512-mkk3vzUHFjzKjpCXeu+IjXeZD+QOTjUUdubgmHtHTDwvAO2ZTkMTTVrapts5CWz3JvJryh/4KWZpjeZrCepZ3A==", 1252 | "deprecated": "Jade has been renamed to pug, please install the latest version of pug instead of jade", 1253 | "dev": true, 1254 | "dependencies": { 1255 | "commander": "0.6.1", 1256 | "mkdirp": "0.3.0" 1257 | }, 1258 | "bin": { 1259 | "jade": "bin/jade" 1260 | } 1261 | }, 1262 | "node_modules/jade/node_modules/commander": { 1263 | "version": "0.6.1", 1264 | "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", 1265 | "integrity": "sha512-0fLycpl1UMTGX257hRsu/arL/cUbcvQM4zMKwvLvzXtfdezIV4yotPS2dYtknF+NmEfWSoCEF6+hj9XLm/6hEw==", 1266 | "dev": true, 1267 | "engines": { 1268 | "node": ">= 0.4.x" 1269 | } 1270 | }, 1271 | "node_modules/jade/node_modules/mkdirp": { 1272 | "version": "0.3.0", 1273 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", 1274 | "integrity": "sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew==", 1275 | "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", 1276 | "dev": true, 1277 | "engines": { 1278 | "node": "*" 1279 | } 1280 | }, 1281 | "node_modules/json-stable-stringify": { 1282 | "version": "0.0.1", 1283 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", 1284 | "integrity": "sha512-nKtD/Qxm7tWdZqJoldEC7fF0S41v0mWbeaXG3637stOWfyGxTgWTYE2wtfKmjzpvxv2MA2xzxsXOIiwUpkX6Qw==", 1285 | "dev": true, 1286 | "dependencies": { 1287 | "jsonify": "~0.0.0" 1288 | } 1289 | }, 1290 | "node_modules/jsonify": { 1291 | "version": "0.0.1", 1292 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", 1293 | "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", 1294 | "dev": true, 1295 | "funding": { 1296 | "url": "https://github.com/sponsors/ljharb" 1297 | } 1298 | }, 1299 | "node_modules/jsonparse": { 1300 | "version": "0.0.5", 1301 | "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", 1302 | "integrity": "sha512-fw7Q/8gFR8iSekUi9I+HqWIap6mywuoe7hQIg3buTVjuZgALKj4HAmm0X6f+TaL4c9NJbvyFQdaI2ppr5p6dnQ==", 1303 | "dev": true, 1304 | "engines": [ 1305 | "node >= 0.2.0" 1306 | ] 1307 | }, 1308 | "node_modules/JSONStream": { 1309 | "version": "0.8.4", 1310 | "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", 1311 | "integrity": "sha512-l0NN3IcqrZfZBJp7JWDJIHsnPV7yzJWqsYxQzL8Fwdx1BmEMjLuvtYkv+P9pbvpyfP75/f4MeDZhWNU4is32uA==", 1312 | "dev": true, 1313 | "dependencies": { 1314 | "jsonparse": "0.0.5", 1315 | "through": ">=2.2.7 <3" 1316 | }, 1317 | "bin": { 1318 | "JSONStream": "index.js" 1319 | }, 1320 | "engines": { 1321 | "node": "*" 1322 | } 1323 | }, 1324 | "node_modules/kind-of": { 1325 | "version": "3.2.2", 1326 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1327 | "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", 1328 | "dev": true, 1329 | "dependencies": { 1330 | "is-buffer": "^1.1.5" 1331 | }, 1332 | "engines": { 1333 | "node": ">=0.10.0" 1334 | } 1335 | }, 1336 | "node_modules/labeled-stream-splicer": { 1337 | "version": "1.0.2", 1338 | "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-1.0.2.tgz", 1339 | "integrity": "sha512-3KBjPRnXrYC5h2jEf/d6hO7Lcl+38QzRVTOyHA2sFzZVMYwsUFuejlrOMwAjmz13hVBr9ruDS1RwE4YEz8P58w==", 1340 | "dev": true, 1341 | "dependencies": { 1342 | "inherits": "^2.0.1", 1343 | "isarray": "~0.0.1", 1344 | "stream-splicer": "^1.1.0" 1345 | } 1346 | }, 1347 | "node_modules/lazy-cache": { 1348 | "version": "1.0.4", 1349 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", 1350 | "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", 1351 | "dev": true, 1352 | "engines": { 1353 | "node": ">=0.10.0" 1354 | } 1355 | }, 1356 | "node_modules/lexical-scope": { 1357 | "version": "1.2.0", 1358 | "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz", 1359 | "integrity": "sha512-ntJ8IcBCuKwudML7vAuT/L0aIMU0+9vO25K4CjLPYgzf1NZ0bAhJJBZrvkO+oUGgKcbdkH8UZdRsaEg+wULLRw==", 1360 | "dev": true, 1361 | "dependencies": { 1362 | "astw": "^2.0.0" 1363 | } 1364 | }, 1365 | "node_modules/lodash.memoize": { 1366 | "version": "3.0.4", 1367 | "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", 1368 | "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==", 1369 | "dev": true 1370 | }, 1371 | "node_modules/longest": { 1372 | "version": "1.0.1", 1373 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", 1374 | "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==", 1375 | "dev": true, 1376 | "engines": { 1377 | "node": ">=0.10.0" 1378 | } 1379 | }, 1380 | "node_modules/lru-cache": { 1381 | "version": "2.7.3", 1382 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", 1383 | "integrity": "sha512-WpibWJ60c3AgAz8a2iYErDrcT2C7OmKnsWhIcHOjkUHFjkXncJhtLxNSqUmxRxRunpb5I8Vprd7aNSd2NtksJQ==", 1384 | "dev": true 1385 | }, 1386 | "node_modules/md5.js": { 1387 | "version": "1.3.5", 1388 | "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", 1389 | "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", 1390 | "dev": true, 1391 | "dependencies": { 1392 | "hash-base": "^3.0.0", 1393 | "inherits": "^2.0.1", 1394 | "safe-buffer": "^5.1.2" 1395 | } 1396 | }, 1397 | "node_modules/miller-rabin": { 1398 | "version": "4.0.1", 1399 | "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", 1400 | "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", 1401 | "dev": true, 1402 | "dependencies": { 1403 | "bn.js": "^4.0.0", 1404 | "brorand": "^1.0.1" 1405 | }, 1406 | "bin": { 1407 | "miller-rabin": "bin/miller-rabin" 1408 | } 1409 | }, 1410 | "node_modules/miller-rabin/node_modules/bn.js": { 1411 | "version": "4.12.0", 1412 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 1413 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 1414 | "dev": true 1415 | }, 1416 | "node_modules/minimalistic-assert": { 1417 | "version": "1.0.1", 1418 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", 1419 | "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", 1420 | "dev": true 1421 | }, 1422 | "node_modules/minimalistic-crypto-utils": { 1423 | "version": "1.0.1", 1424 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", 1425 | "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", 1426 | "dev": true 1427 | }, 1428 | "node_modules/minimatch": { 1429 | "version": "2.0.10", 1430 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", 1431 | "integrity": "sha512-jQo6o1qSVLEWaw3l+bwYA2X0uLuK2KjNh2wjgO7Q/9UJnXr1Q3yQKR8BI0/Bt/rPg75e6SMW4hW/6cBHVTZUjA==", 1432 | "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", 1433 | "dev": true, 1434 | "dependencies": { 1435 | "brace-expansion": "^1.0.0" 1436 | }, 1437 | "engines": { 1438 | "node": "*" 1439 | } 1440 | }, 1441 | "node_modules/minimist": { 1442 | "version": "0.0.5", 1443 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.5.tgz", 1444 | "integrity": "sha512-rSJ0cdmCj3qmKdObcnMcWgPVOyaOWlazLhZAJW0s6G6lx1ZEuFkraWmEH5LTvX90btkfHPclQBjvjU7A/kYRFg==", 1445 | "dev": true 1446 | }, 1447 | "node_modules/mkdirp": { 1448 | "version": "0.5.0", 1449 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", 1450 | "integrity": "sha512-xjjNGy+ry1lhtIKcr2PT6ok3aszhQfgrUDp4OZLHacgRgFmF6XR9XCOJVcXlVGQonIqXcK1DvqgKKQOPWYGSfw==", 1451 | "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", 1452 | "dev": true, 1453 | "dependencies": { 1454 | "minimist": "0.0.8" 1455 | }, 1456 | "bin": { 1457 | "mkdirp": "bin/cmd.js" 1458 | } 1459 | }, 1460 | "node_modules/mkdirp/node_modules/minimist": { 1461 | "version": "0.0.8", 1462 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1463 | "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==", 1464 | "dev": true 1465 | }, 1466 | "node_modules/mocha": { 1467 | "version": "1.21.5", 1468 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-1.21.5.tgz", 1469 | "integrity": "sha512-ng2r0YrLCHtmp8W7HyLzSmbdidt3g1I63HhCmOqZH4vzFhmtHcYwcoAmpsJKL142He9NA2HJpmsz9amYDxoZ1Q==", 1470 | "deprecated": "Mocha v1.x is no longer supported.", 1471 | "dev": true, 1472 | "dependencies": { 1473 | "commander": "2.3.0", 1474 | "debug": "2.0.0", 1475 | "diff": "1.0.8", 1476 | "escape-string-regexp": "1.0.2", 1477 | "glob": "3.2.3", 1478 | "growl": "1.8.1", 1479 | "jade": "0.26.3", 1480 | "mkdirp": "0.5.0" 1481 | }, 1482 | "bin": { 1483 | "_mocha": "bin/_mocha", 1484 | "mocha": "bin/mocha" 1485 | }, 1486 | "engines": { 1487 | "node": ">= 0.4.x" 1488 | } 1489 | }, 1490 | "node_modules/mocha/node_modules/glob": { 1491 | "version": "3.2.3", 1492 | "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.3.tgz", 1493 | "integrity": "sha512-WPaLsMHD1lYEqAmIQI6VOJSPwuBdGShDWnj1yUo0vQqEO809R8W3LM9OVU13CnnDhyv/EiNwOtxEW74SmrzS6w==", 1494 | "deprecated": "Glob versions prior to v9 are no longer supported", 1495 | "dev": true, 1496 | "dependencies": { 1497 | "graceful-fs": "~2.0.0", 1498 | "inherits": "2", 1499 | "minimatch": "~0.2.11" 1500 | }, 1501 | "engines": { 1502 | "node": "*" 1503 | } 1504 | }, 1505 | "node_modules/mocha/node_modules/minimatch": { 1506 | "version": "0.2.14", 1507 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", 1508 | "integrity": "sha512-zZ+Jy8lVWlvqqeM8iZB7w7KmQkoJn8djM585z88rywrEbzoqawVa9FR5p2hwD+y74nfuKOjmNvi9gtWJNLqHvA==", 1509 | "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", 1510 | "dev": true, 1511 | "dependencies": { 1512 | "lru-cache": "2", 1513 | "sigmund": "~1.0.0" 1514 | }, 1515 | "engines": { 1516 | "node": "*" 1517 | } 1518 | }, 1519 | "node_modules/module-deps": { 1520 | "version": "3.9.1", 1521 | "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-3.9.1.tgz", 1522 | "integrity": "sha512-EbWWlSGaCVidEsLsSzkY6l/jm0IcGDSQ8tGwtjM8joTrxqxP0om02Px9Np8D7FMZ/vZFdsOGbio+WqkKQxYuTA==", 1523 | "dev": true, 1524 | "dependencies": { 1525 | "browser-resolve": "^1.7.0", 1526 | "concat-stream": "~1.4.5", 1527 | "defined": "^1.0.0", 1528 | "detective": "^4.0.0", 1529 | "duplexer2": "0.0.2", 1530 | "inherits": "^2.0.1", 1531 | "JSONStream": "^1.0.3", 1532 | "parents": "^1.0.0", 1533 | "readable-stream": "^1.1.13", 1534 | "resolve": "^1.1.3", 1535 | "stream-combiner2": "~1.0.0", 1536 | "subarg": "^1.0.0", 1537 | "through2": "^1.0.0", 1538 | "xtend": "^4.0.0" 1539 | }, 1540 | "bin": { 1541 | "module-deps": "bin/cmd.js" 1542 | }, 1543 | "engines": { 1544 | "node": ">= 0.6" 1545 | } 1546 | }, 1547 | "node_modules/module-deps/node_modules/defined": { 1548 | "version": "1.0.1", 1549 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", 1550 | "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", 1551 | "dev": true, 1552 | "funding": { 1553 | "url": "https://github.com/sponsors/ljharb" 1554 | } 1555 | }, 1556 | "node_modules/module-deps/node_modules/jsonparse": { 1557 | "version": "1.3.1", 1558 | "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", 1559 | "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", 1560 | "dev": true, 1561 | "engines": [ 1562 | "node >= 0.2.0" 1563 | ] 1564 | }, 1565 | "node_modules/module-deps/node_modules/JSONStream": { 1566 | "version": "1.3.5", 1567 | "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", 1568 | "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", 1569 | "dev": true, 1570 | "dependencies": { 1571 | "jsonparse": "^1.2.0", 1572 | "through": ">=2.2.7 <3" 1573 | }, 1574 | "bin": { 1575 | "JSONStream": "bin.js" 1576 | }, 1577 | "engines": { 1578 | "node": "*" 1579 | } 1580 | }, 1581 | "node_modules/module-deps/node_modules/minimist": { 1582 | "version": "1.2.8", 1583 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 1584 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 1585 | "dev": true, 1586 | "funding": { 1587 | "url": "https://github.com/sponsors/ljharb" 1588 | } 1589 | }, 1590 | "node_modules/module-deps/node_modules/parents": { 1591 | "version": "1.0.1", 1592 | "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", 1593 | "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==", 1594 | "dev": true, 1595 | "dependencies": { 1596 | "path-platform": "~0.11.15" 1597 | } 1598 | }, 1599 | "node_modules/module-deps/node_modules/path-platform": { 1600 | "version": "0.11.15", 1601 | "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", 1602 | "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==", 1603 | "dev": true, 1604 | "engines": { 1605 | "node": ">= 0.8.0" 1606 | } 1607 | }, 1608 | "node_modules/module-deps/node_modules/resolve": { 1609 | "version": "1.22.8", 1610 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", 1611 | "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", 1612 | "dev": true, 1613 | "dependencies": { 1614 | "is-core-module": "^2.13.0", 1615 | "path-parse": "^1.0.7", 1616 | "supports-preserve-symlinks-flag": "^1.0.0" 1617 | }, 1618 | "bin": { 1619 | "resolve": "bin/resolve" 1620 | }, 1621 | "funding": { 1622 | "url": "https://github.com/sponsors/ljharb" 1623 | } 1624 | }, 1625 | "node_modules/module-deps/node_modules/subarg": { 1626 | "version": "1.0.0", 1627 | "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", 1628 | "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==", 1629 | "dev": true, 1630 | "dependencies": { 1631 | "minimist": "^1.1.0" 1632 | } 1633 | }, 1634 | "node_modules/module-deps/node_modules/xtend": { 1635 | "version": "4.0.2", 1636 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1637 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 1638 | "dev": true, 1639 | "engines": { 1640 | "node": ">=0.4" 1641 | } 1642 | }, 1643 | "node_modules/mold-source-map": { 1644 | "version": "0.4.1", 1645 | "resolved": "https://registry.npmjs.org/mold-source-map/-/mold-source-map-0.4.1.tgz", 1646 | "integrity": "sha512-oPowVpTm8p3jsK2AKI+NzoS6TBKv7gWY/Hj4ZNh5YWiB3S4eP54y8vSEEgVUdrqgTbjwEzIunNAVQJGRW0bakQ==", 1647 | "dev": true, 1648 | "dependencies": { 1649 | "convert-source-map": "^1.1.0", 1650 | "through": "~2.2.7" 1651 | } 1652 | }, 1653 | "node_modules/mold-source-map/node_modules/convert-source-map": { 1654 | "version": "1.9.0", 1655 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", 1656 | "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", 1657 | "dev": true 1658 | }, 1659 | "node_modules/mold-source-map/node_modules/through": { 1660 | "version": "2.2.7", 1661 | "resolved": "https://registry.npmjs.org/through/-/through-2.2.7.tgz", 1662 | "integrity": "sha512-JIR0m0ybkmTcR8URann+HbwKmodP+OE8UCbsifQDYMLD5J3em1Cdn3MYPpbEd5elGDwmP98T+WbqP/tvzA5Mjg==", 1663 | "dev": true 1664 | }, 1665 | "node_modules/ms": { 1666 | "version": "0.6.2", 1667 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", 1668 | "integrity": "sha512-/pc3eh7TWorTtbvXg8je4GvrvEqCfH7PA3P7iW01yL2E53FKixzgMBaQi0NOPbMJqY34cBSvR0tZtmlTkdUG4A==", 1669 | "dev": true 1670 | }, 1671 | "node_modules/nave": { 1672 | "version": "0.5.3", 1673 | "resolved": "https://registry.npmjs.org/nave/-/nave-0.5.3.tgz", 1674 | "integrity": "sha512-XvRScGzPb4fm+lRqLovWfKBMxh2fa03+rAJGbGpm3ZkBfcQfGpRAv3FiuXvBfRytVfhmkqhIUnobkrBK6vVosg==", 1675 | "dev": true, 1676 | "bin": { 1677 | "nave": "nave.sh" 1678 | } 1679 | }, 1680 | "node_modules/once": { 1681 | "version": "1.4.0", 1682 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1683 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1684 | "dev": true, 1685 | "dependencies": { 1686 | "wrappy": "1" 1687 | } 1688 | }, 1689 | "node_modules/optimist": { 1690 | "version": "0.3.7", 1691 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", 1692 | "integrity": "sha512-TCx0dXQzVtSCg2OgY/bO9hjM9cV4XYx09TVK+s3+FhkjT6LovsLe+pPMzpWf+6yXK/hUizs2gUoTw3jHM0VaTQ==", 1693 | "dev": true, 1694 | "dependencies": { 1695 | "wordwrap": "~0.0.2" 1696 | } 1697 | }, 1698 | "node_modules/os-browserify": { 1699 | "version": "0.1.2", 1700 | "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz", 1701 | "integrity": "sha512-aZicJZccvxWOZ0Bja2eAch2L8RIJWBuRYmM8Gwl/JjNtRltH0Itcz4eH/ESyuIWfse8cc93ZCf0XrzhXK2HEDA==", 1702 | "dev": true 1703 | }, 1704 | "node_modules/pako": { 1705 | "version": "0.2.9", 1706 | "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", 1707 | "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", 1708 | "dev": true 1709 | }, 1710 | "node_modules/parents": { 1711 | "version": "0.0.3", 1712 | "resolved": "https://registry.npmjs.org/parents/-/parents-0.0.3.tgz", 1713 | "integrity": "sha512-ASkdjFPS2nrxujzSBZGt8ZCKeG0/K2ZZVKveqXt7XGtXfu+ssnk4DQhnK91KRvt83f36LjfxOfwi0cv1+Re0eA==", 1714 | "dev": true, 1715 | "dependencies": { 1716 | "path-platform": "^0.0.1" 1717 | } 1718 | }, 1719 | "node_modules/parse-asn1": { 1720 | "version": "5.1.7", 1721 | "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", 1722 | "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", 1723 | "dev": true, 1724 | "dependencies": { 1725 | "asn1.js": "^4.10.1", 1726 | "browserify-aes": "^1.2.0", 1727 | "evp_bytestokey": "^1.0.3", 1728 | "hash-base": "~3.0", 1729 | "pbkdf2": "^3.1.2", 1730 | "safe-buffer": "^5.2.1" 1731 | }, 1732 | "engines": { 1733 | "node": ">= 0.10" 1734 | } 1735 | }, 1736 | "node_modules/path-browserify": { 1737 | "version": "0.0.1", 1738 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", 1739 | "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", 1740 | "dev": true 1741 | }, 1742 | "node_modules/path-parse": { 1743 | "version": "1.0.7", 1744 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1745 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1746 | "dev": true 1747 | }, 1748 | "node_modules/path-platform": { 1749 | "version": "0.0.1", 1750 | "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.0.1.tgz", 1751 | "integrity": "sha512-ydK1VKZFYwy0mT2JvimJfxt5z6Z6sjBbLfsFMoJczbwZ/ul0AjgpXLHinUzclf4/XYC8mtsWGuFERZ95Rnm8wA==", 1752 | "dev": true, 1753 | "engines": { 1754 | "node": ">= 0.8.0" 1755 | } 1756 | }, 1757 | "node_modules/pbkdf2": { 1758 | "version": "3.1.2", 1759 | "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", 1760 | "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", 1761 | "dev": true, 1762 | "dependencies": { 1763 | "create-hash": "^1.1.2", 1764 | "create-hmac": "^1.1.4", 1765 | "ripemd160": "^2.0.1", 1766 | "safe-buffer": "^5.0.1", 1767 | "sha.js": "^2.4.8" 1768 | }, 1769 | "engines": { 1770 | "node": ">=0.12" 1771 | } 1772 | }, 1773 | "node_modules/process": { 1774 | "version": "0.7.0", 1775 | "resolved": "https://registry.npmjs.org/process/-/process-0.7.0.tgz", 1776 | "integrity": "sha512-zJYE4ZXy79hFghxwR6iYQfa6u6hU/790qdv0QKnU5RhUYYDmX0XwPGwGUARR4JGZcIiidlh3q+rjqUNEDlg7nw==", 1777 | "dev": true, 1778 | "engines": { 1779 | "node": ">= 0.6.0" 1780 | } 1781 | }, 1782 | "node_modules/process-nextick-args": { 1783 | "version": "2.0.1", 1784 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1785 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 1786 | "dev": true 1787 | }, 1788 | "node_modules/public-encrypt": { 1789 | "version": "4.0.3", 1790 | "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", 1791 | "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", 1792 | "dev": true, 1793 | "dependencies": { 1794 | "bn.js": "^4.1.0", 1795 | "browserify-rsa": "^4.0.0", 1796 | "create-hash": "^1.1.0", 1797 | "parse-asn1": "^5.0.0", 1798 | "randombytes": "^2.0.1", 1799 | "safe-buffer": "^5.1.2" 1800 | } 1801 | }, 1802 | "node_modules/public-encrypt/node_modules/bn.js": { 1803 | "version": "4.12.0", 1804 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 1805 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 1806 | "dev": true 1807 | }, 1808 | "node_modules/punycode": { 1809 | "version": "1.2.4", 1810 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.2.4.tgz", 1811 | "integrity": "sha512-h/vscxLPvI2l7k/0dFUKZ5I5TgMCJ/Pl+J6rw77PDuQM6UApf/GaRVkjv/YSm2k+fbp7Yw8dxsoe29DolT7h7w==", 1812 | "dev": true, 1813 | "engines": [ 1814 | "node", 1815 | "rhino" 1816 | ] 1817 | }, 1818 | "node_modules/querystring": { 1819 | "version": "0.2.0", 1820 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 1821 | "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", 1822 | "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", 1823 | "dev": true, 1824 | "engines": { 1825 | "node": ">=0.4.x" 1826 | } 1827 | }, 1828 | "node_modules/querystring-es3": { 1829 | "version": "0.2.1", 1830 | "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", 1831 | "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", 1832 | "dev": true, 1833 | "engines": { 1834 | "node": ">=0.4.x" 1835 | } 1836 | }, 1837 | "node_modules/randombytes": { 1838 | "version": "2.1.0", 1839 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 1840 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 1841 | "dev": true, 1842 | "dependencies": { 1843 | "safe-buffer": "^5.1.0" 1844 | } 1845 | }, 1846 | "node_modules/randomfill": { 1847 | "version": "1.0.4", 1848 | "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", 1849 | "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", 1850 | "dev": true, 1851 | "dependencies": { 1852 | "randombytes": "^2.0.5", 1853 | "safe-buffer": "^5.1.0" 1854 | } 1855 | }, 1856 | "node_modules/readable-stream": { 1857 | "version": "1.1.14", 1858 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 1859 | "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", 1860 | "dev": true, 1861 | "dependencies": { 1862 | "core-util-is": "~1.0.0", 1863 | "inherits": "~2.0.1", 1864 | "isarray": "0.0.1", 1865 | "string_decoder": "~0.10.x" 1866 | } 1867 | }, 1868 | "node_modules/readable-stream/node_modules/string_decoder": { 1869 | "version": "0.10.31", 1870 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 1871 | "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", 1872 | "dev": true 1873 | }, 1874 | "node_modules/readable-wrap": { 1875 | "version": "1.0.0", 1876 | "resolved": "https://registry.npmjs.org/readable-wrap/-/readable-wrap-1.0.0.tgz", 1877 | "integrity": "sha512-/8n0Mr10S+HGKFygQ42Z40JIXwafPH3A72pwmlNClThgsImV5LJJiCue5Je1asxwY082sYxq/+kTxH6nTn0w3g==", 1878 | "dev": true, 1879 | "dependencies": { 1880 | "readable-stream": "^1.1.13-1" 1881 | } 1882 | }, 1883 | "node_modules/recursive-readdir": { 1884 | "version": "0.0.2", 1885 | "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-0.0.2.tgz", 1886 | "integrity": "sha512-h/GBQZmT5LPqJvuTRDJKruc0SLd/ZvCgwUgwA3XdFQ6tT0J7O2Au5IbwxB+a2Cl22atdxLiG4KrKgOrMc+eZDQ==", 1887 | "dev": true, 1888 | "optional": true, 1889 | "engines": { 1890 | "node": ">=0.6.6" 1891 | } 1892 | }, 1893 | "node_modules/repeat-string": { 1894 | "version": "1.6.1", 1895 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 1896 | "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", 1897 | "dev": true, 1898 | "engines": { 1899 | "node": ">=0.10" 1900 | } 1901 | }, 1902 | "node_modules/resolve": { 1903 | "version": "0.7.4", 1904 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.7.4.tgz", 1905 | "integrity": "sha512-zxmAcifDjKxmUbk7chQdKhDSn8ml08g+MYyU37xhEXBp+N81cfbYsm4e0Gn9jtLbAvbR8w8Ox09xqUZtPuCoeA==", 1906 | "dev": true 1907 | }, 1908 | "node_modules/rfile": { 1909 | "version": "1.0.0", 1910 | "resolved": "https://registry.npmjs.org/rfile/-/rfile-1.0.0.tgz", 1911 | "integrity": "sha512-aNeTpY8g6DYmqPvakau22B0SipQTskO8FtYXzn8qg4X4bN9ExIH8VAhq/L9w7N8HvESYeSSwk3e4GmW+rLLAxQ==", 1912 | "dev": true, 1913 | "dependencies": { 1914 | "callsite": "~1.0.0", 1915 | "resolve": "~0.3.0" 1916 | } 1917 | }, 1918 | "node_modules/rfile/node_modules/resolve": { 1919 | "version": "0.3.1", 1920 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.3.1.tgz", 1921 | "integrity": "sha512-mxx/I/wLjxtryDBtrrb0ZNzaYERVWaHpJ0W0Arm8N4l8b+jiX/U5yKcsj0zQpF9UuKN1uz80EUTOudON6OPuaQ==", 1922 | "dev": true 1923 | }, 1924 | "node_modules/right-align": { 1925 | "version": "0.1.3", 1926 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", 1927 | "integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==", 1928 | "dev": true, 1929 | "dependencies": { 1930 | "align-text": "^0.1.1" 1931 | }, 1932 | "engines": { 1933 | "node": ">=0.10.0" 1934 | } 1935 | }, 1936 | "node_modules/ripemd160": { 1937 | "version": "2.0.2", 1938 | "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", 1939 | "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", 1940 | "dev": true, 1941 | "dependencies": { 1942 | "hash-base": "^3.0.0", 1943 | "inherits": "^2.0.1" 1944 | } 1945 | }, 1946 | "node_modules/ruglify": { 1947 | "version": "1.0.0", 1948 | "resolved": "https://registry.npmjs.org/ruglify/-/ruglify-1.0.0.tgz", 1949 | "integrity": "sha512-XfRj1YJdm/gnZNvmpQ5L+2YGRHglDGMPgJRbitgCxC3GzKVQF/t+ij1aNcNg2AnEXGtLHJDwoSWrAq3TUm0EVg==", 1950 | "dev": true, 1951 | "dependencies": { 1952 | "rfile": "~1.0", 1953 | "uglify-js": "~2.2" 1954 | } 1955 | }, 1956 | "node_modules/ruglify/node_modules/uglify-js": { 1957 | "version": "2.2.5", 1958 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", 1959 | "integrity": "sha512-viLk+/8G0zm2aKt1JJAVcz5J/5ytdiNaIsKgrre3yvSUjwVG6ZUujGH7E2TiPigZUwLYCe7eaIUEP2Zka2VJPA==", 1960 | "dev": true, 1961 | "dependencies": { 1962 | "optimist": "~0.3.5", 1963 | "source-map": "~0.1.7" 1964 | }, 1965 | "bin": { 1966 | "uglifyjs": "bin/uglifyjs" 1967 | }, 1968 | "engines": { 1969 | "node": ">=0.4.0" 1970 | } 1971 | }, 1972 | "node_modules/safe-buffer": { 1973 | "version": "5.2.1", 1974 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1975 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1976 | "dev": true, 1977 | "funding": [ 1978 | { 1979 | "type": "github", 1980 | "url": "https://github.com/sponsors/feross" 1981 | }, 1982 | { 1983 | "type": "patreon", 1984 | "url": "https://www.patreon.com/feross" 1985 | }, 1986 | { 1987 | "type": "consulting", 1988 | "url": "https://feross.org/support" 1989 | } 1990 | ] 1991 | }, 1992 | "node_modules/sha.js": { 1993 | "version": "2.4.11", 1994 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", 1995 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", 1996 | "dev": true, 1997 | "dependencies": { 1998 | "inherits": "^2.0.1", 1999 | "safe-buffer": "^5.0.1" 2000 | }, 2001 | "bin": { 2002 | "sha.js": "bin.js" 2003 | } 2004 | }, 2005 | "node_modules/shallow-copy": { 2006 | "version": "0.0.1", 2007 | "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", 2008 | "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==", 2009 | "dev": true 2010 | }, 2011 | "node_modules/shasum": { 2012 | "version": "1.0.2", 2013 | "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", 2014 | "integrity": "sha512-UTzHm/+AzKfO9RgPgRpDIuMSNie1ubXRaljjlhFMNGYoG7z+rm9AHLPMf70R7887xboDH9Q+5YQbWKObFHEAtw==", 2015 | "dev": true, 2016 | "dependencies": { 2017 | "json-stable-stringify": "~0.0.0", 2018 | "sha.js": "~2.4.4" 2019 | } 2020 | }, 2021 | "node_modules/shell-quote": { 2022 | "version": "0.0.1", 2023 | "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-0.0.1.tgz", 2024 | "integrity": "sha512-uEWz7wa9vnCi9w4mvKZMgbHFk3DCKjLQlZcy0tJxUH4NwZjRrPPHXAYIEt2TmJs600Dcgj0Z3fZLZKVPVdGNbQ==", 2025 | "dev": true, 2026 | "engines": { 2027 | "node": "*" 2028 | } 2029 | }, 2030 | "node_modules/sigmund": { 2031 | "version": "1.0.1", 2032 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", 2033 | "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==", 2034 | "dev": true 2035 | }, 2036 | "node_modules/source-map": { 2037 | "version": "0.1.43", 2038 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", 2039 | "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", 2040 | "dev": true, 2041 | "dependencies": { 2042 | "amdefine": ">=0.0.4" 2043 | }, 2044 | "engines": { 2045 | "node": ">=0.8.0" 2046 | } 2047 | }, 2048 | "node_modules/stream-browserify": { 2049 | "version": "1.0.0", 2050 | "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-1.0.0.tgz", 2051 | "integrity": "sha512-e+V5xc4LlkOiRr64kZTUdb11exsbpSnwb9uwmXaHeDXCpfHg7vaefMJOxi21Pe74ZOqjZ87blBcqqpNAM4Ku0g==", 2052 | "dev": true, 2053 | "dependencies": { 2054 | "inherits": "~2.0.1", 2055 | "readable-stream": "^1.0.27-1" 2056 | } 2057 | }, 2058 | "node_modules/stream-combiner": { 2059 | "version": "0.0.4", 2060 | "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", 2061 | "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", 2062 | "dev": true, 2063 | "dependencies": { 2064 | "duplexer": "~0.1.1" 2065 | } 2066 | }, 2067 | "node_modules/stream-combiner2": { 2068 | "version": "1.0.2", 2069 | "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.0.2.tgz", 2070 | "integrity": "sha512-7DO1SfBVnyIyo9ytUjSyVojT5bp1ZY6h3pj7HUs6PwcRSd/r8mBOHbRwYC7nbHRakKzMKyNp5HWJRv4GgVherA==", 2071 | "dev": true, 2072 | "dependencies": { 2073 | "duplexer2": "~0.0.2", 2074 | "through2": "~0.5.1" 2075 | } 2076 | }, 2077 | "node_modules/stream-combiner2/node_modules/readable-stream": { 2078 | "version": "1.0.34", 2079 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 2080 | "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", 2081 | "dev": true, 2082 | "dependencies": { 2083 | "core-util-is": "~1.0.0", 2084 | "inherits": "~2.0.1", 2085 | "isarray": "0.0.1", 2086 | "string_decoder": "~0.10.x" 2087 | } 2088 | }, 2089 | "node_modules/stream-combiner2/node_modules/string_decoder": { 2090 | "version": "0.10.31", 2091 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 2092 | "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", 2093 | "dev": true 2094 | }, 2095 | "node_modules/stream-combiner2/node_modules/through2": { 2096 | "version": "0.5.1", 2097 | "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", 2098 | "integrity": "sha512-zexCrAOTbjkBCXGyozn7hhS3aEaqdrc59mAD2E3dKYzV1vFuEGQ1hEDJN2oQMQFwy4he2zyLqPZV+AlfS8ZWJA==", 2099 | "dev": true, 2100 | "dependencies": { 2101 | "readable-stream": "~1.0.17", 2102 | "xtend": "~3.0.0" 2103 | } 2104 | }, 2105 | "node_modules/stream-splicer": { 2106 | "version": "1.3.2", 2107 | "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-1.3.2.tgz", 2108 | "integrity": "sha512-nmUMEbdm/sZYqe9dZs7mqJvTYpunsDbIWI5FiBCMc/hMVd6vwzy+ITmo7C3gcLYqrn+uQ1w+EJwooWvJ997JAA==", 2109 | "dev": true, 2110 | "dependencies": { 2111 | "indexof": "0.0.1", 2112 | "inherits": "^2.0.1", 2113 | "isarray": "~0.0.1", 2114 | "readable-stream": "^1.1.13-1", 2115 | "readable-wrap": "^1.0.0", 2116 | "through2": "^1.0.0" 2117 | } 2118 | }, 2119 | "node_modules/string_decoder": { 2120 | "version": "0.0.1", 2121 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.0.1.tgz", 2122 | "integrity": "sha512-nWi0z/o2vMFV7SJoJDEGqCUPfcpdC/hzCNnbHWhzt6SenBdJ3vVK0aeZuqnVVQ8fPci2h2WXIL6N3O+OJHJhZA==", 2123 | "dev": true 2124 | }, 2125 | "node_modules/subarg": { 2126 | "version": "0.0.1", 2127 | "resolved": "https://registry.npmjs.org/subarg/-/subarg-0.0.1.tgz", 2128 | "integrity": "sha512-6HUY31sAPDdNBT4Gy1c2a2mfpzRiFPMOsR9eQkqO2ZMIVL11mPzywLgsSSGYJ+UVidEfds6XEsh4RnZiDbM60A==", 2129 | "dev": true, 2130 | "dependencies": { 2131 | "minimist": "~0.0.7" 2132 | } 2133 | }, 2134 | "node_modules/subarg/node_modules/minimist": { 2135 | "version": "0.0.10", 2136 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", 2137 | "integrity": "sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw==", 2138 | "dev": true 2139 | }, 2140 | "node_modules/supports-preserve-symlinks-flag": { 2141 | "version": "1.0.0", 2142 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 2143 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 2144 | "dev": true, 2145 | "engines": { 2146 | "node": ">= 0.4" 2147 | }, 2148 | "funding": { 2149 | "url": "https://github.com/sponsors/ljharb" 2150 | } 2151 | }, 2152 | "node_modules/syntax-error": { 2153 | "version": "1.4.0", 2154 | "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", 2155 | "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", 2156 | "dev": true, 2157 | "dependencies": { 2158 | "acorn-node": "^1.2.0" 2159 | } 2160 | }, 2161 | "node_modules/through": { 2162 | "version": "2.3.8", 2163 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2164 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", 2165 | "dev": true 2166 | }, 2167 | "node_modules/through2": { 2168 | "version": "1.1.1", 2169 | "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", 2170 | "integrity": "sha512-zEbpaeSMHxczpTzO1KkMHjBC1enTA68ojeaZGG4toqdASpb9t4xUZaYFBq2/9OHo5nTGFVSYd4c910OR+6wxbQ==", 2171 | "dev": true, 2172 | "dependencies": { 2173 | "readable-stream": ">=1.1.13-1 <1.2.0-0", 2174 | "xtend": ">=4.0.0 <4.1.0-0" 2175 | } 2176 | }, 2177 | "node_modules/through2/node_modules/xtend": { 2178 | "version": "4.0.2", 2179 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 2180 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 2181 | "dev": true, 2182 | "engines": { 2183 | "node": ">=0.4" 2184 | } 2185 | }, 2186 | "node_modules/timers-browserify": { 2187 | "version": "1.4.2", 2188 | "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", 2189 | "integrity": "sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q==", 2190 | "dev": true, 2191 | "dependencies": { 2192 | "process": "~0.11.0" 2193 | }, 2194 | "engines": { 2195 | "node": ">=0.6.0" 2196 | } 2197 | }, 2198 | "node_modules/timers-browserify/node_modules/process": { 2199 | "version": "0.11.10", 2200 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 2201 | "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", 2202 | "dev": true, 2203 | "engines": { 2204 | "node": ">= 0.6.0" 2205 | } 2206 | }, 2207 | "node_modules/tty-browserify": { 2208 | "version": "0.0.1", 2209 | "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", 2210 | "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", 2211 | "dev": true 2212 | }, 2213 | "node_modules/type-detect": { 2214 | "version": "0.1.1", 2215 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", 2216 | "integrity": "sha512-5rqszGVwYgBoDkIm2oUtvkfZMQ0vk29iDMU0W2qCa3rG0vPDNczCMT4hV/bLBgLg8k8ri6+u3Zbt+S/14eMzlA==", 2217 | "dev": true, 2218 | "engines": { 2219 | "node": "*" 2220 | } 2221 | }, 2222 | "node_modules/typedarray": { 2223 | "version": "0.0.7", 2224 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.7.tgz", 2225 | "integrity": "sha512-ueeb9YybpjhivjbHP2LdFDAjbS948fGEPj+ACAMs4xCMmh72OCOMQWBQKlaN4ZNQ04yfLSDLSx1tGRIoWimObQ==", 2226 | "dev": true, 2227 | "funding": { 2228 | "url": "https://github.com/sponsors/ljharb" 2229 | } 2230 | }, 2231 | "node_modules/uglify-js": { 2232 | "version": "2.8.29", 2233 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", 2234 | "integrity": "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==", 2235 | "dev": true, 2236 | "dependencies": { 2237 | "source-map": "~0.5.1", 2238 | "yargs": "~3.10.0" 2239 | }, 2240 | "bin": { 2241 | "uglifyjs": "bin/uglifyjs" 2242 | }, 2243 | "engines": { 2244 | "node": ">=0.8.0" 2245 | }, 2246 | "optionalDependencies": { 2247 | "uglify-to-browserify": "~1.0.0" 2248 | } 2249 | }, 2250 | "node_modules/uglify-js/node_modules/source-map": { 2251 | "version": "0.5.7", 2252 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 2253 | "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", 2254 | "dev": true, 2255 | "engines": { 2256 | "node": ">=0.10.0" 2257 | } 2258 | }, 2259 | "node_modules/uglify-to-browserify": { 2260 | "version": "1.0.2", 2261 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", 2262 | "integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==", 2263 | "dev": true 2264 | }, 2265 | "node_modules/umd": { 2266 | "version": "2.1.0", 2267 | "resolved": "https://registry.npmjs.org/umd/-/umd-2.1.0.tgz", 2268 | "integrity": "sha512-mEAJeceExHnblcAwN3BQtDPYOrTy4ALeBh6nQ9KW0cUCd0UU714jAfil2jvq09b67IizwJIiTVFOjE+/52Dyvw==", 2269 | "dev": true, 2270 | "dependencies": { 2271 | "rfile": "~1.0.0", 2272 | "ruglify": "~1.0.0", 2273 | "through": "~2.3.4", 2274 | "uglify-js": "~2.4.0" 2275 | }, 2276 | "bin": { 2277 | "umd": "bin/cli.js" 2278 | } 2279 | }, 2280 | "node_modules/umd/node_modules/source-map": { 2281 | "version": "0.1.34", 2282 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz", 2283 | "integrity": "sha512-yfCwDj0vR9RTwt3pEzglgb3ZgmcXHt6DjG3bjJvzPwTL+5zDQ2MhmSzAcTy0GTiQuCiriSWXvWM1/NhKdXuoQA==", 2284 | "dev": true, 2285 | "dependencies": { 2286 | "amdefine": ">=0.0.4" 2287 | }, 2288 | "engines": { 2289 | "node": ">=0.8.0" 2290 | } 2291 | }, 2292 | "node_modules/umd/node_modules/uglify-js": { 2293 | "version": "2.4.24", 2294 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz", 2295 | "integrity": "sha512-tktIjwackfZLd893KGJmXc1hrRHH1vH9Po3xFh1XBjjeGAnN02xJ3SuoA+n1L29/ZaCA18KzCFlckS+vfPugiA==", 2296 | "dev": true, 2297 | "dependencies": { 2298 | "async": "~0.2.6", 2299 | "source-map": "0.1.34", 2300 | "uglify-to-browserify": "~1.0.0", 2301 | "yargs": "~3.5.4" 2302 | }, 2303 | "bin": { 2304 | "uglifyjs": "bin/uglifyjs" 2305 | }, 2306 | "engines": { 2307 | "node": ">=0.4.0" 2308 | } 2309 | }, 2310 | "node_modules/umd/node_modules/yargs": { 2311 | "version": "3.5.4", 2312 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz", 2313 | "integrity": "sha512-5j382E4xQSs71p/xZQsU1PtRA2HXPAjX0E0DkoGLxwNASMOKX6A9doV1NrZmj85u2Pjquz402qonBzz/yLPbPA==", 2314 | "dev": true, 2315 | "dependencies": { 2316 | "camelcase": "^1.0.2", 2317 | "decamelize": "^1.0.0", 2318 | "window-size": "0.1.0", 2319 | "wordwrap": "0.0.2" 2320 | } 2321 | }, 2322 | "node_modules/url": { 2323 | "version": "0.10.3", 2324 | "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", 2325 | "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", 2326 | "dev": true, 2327 | "dependencies": { 2328 | "punycode": "1.3.2", 2329 | "querystring": "0.2.0" 2330 | } 2331 | }, 2332 | "node_modules/url/node_modules/punycode": { 2333 | "version": "1.3.2", 2334 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 2335 | "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", 2336 | "dev": true 2337 | }, 2338 | "node_modules/util": { 2339 | "version": "0.10.4", 2340 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", 2341 | "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", 2342 | "dev": true, 2343 | "dependencies": { 2344 | "inherits": "2.0.3" 2345 | } 2346 | }, 2347 | "node_modules/util-deprecate": { 2348 | "version": "1.0.2", 2349 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2350 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 2351 | "dev": true 2352 | }, 2353 | "node_modules/util/node_modules/inherits": { 2354 | "version": "2.0.3", 2355 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 2356 | "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", 2357 | "dev": true 2358 | }, 2359 | "node_modules/vm-browserify": { 2360 | "version": "0.0.4", 2361 | "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", 2362 | "integrity": "sha512-NyZNR3WDah+NPkjh/YmhuWSsT4a0mF0BJYgUmvrJ70zxjTXh5Y2Asobxlh0Nfs0PCFB5FVpRJft7NozAWFMwLQ==", 2363 | "dev": true, 2364 | "dependencies": { 2365 | "indexof": "0.0.1" 2366 | } 2367 | }, 2368 | "node_modules/watchify": { 2369 | "version": "1.0.6", 2370 | "resolved": "https://registry.npmjs.org/watchify/-/watchify-1.0.6.tgz", 2371 | "integrity": "sha512-70IUFiVNjdjnYuqJcLkMq8kLRNvRe55s9rfS7l9R0frL8pj2U40nUFKDR31TwZXsHIFG9uMWCrijPlZuHVGmXw==", 2372 | "dev": true, 2373 | "dependencies": { 2374 | "browserify": "^5.5.0", 2375 | "chokidar": "~0.8.2", 2376 | "through2": "~0.5.1" 2377 | }, 2378 | "bin": { 2379 | "watchify": "bin/cmd.js" 2380 | } 2381 | }, 2382 | "node_modules/watchify/node_modules/readable-stream": { 2383 | "version": "1.0.34", 2384 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 2385 | "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", 2386 | "dev": true, 2387 | "dependencies": { 2388 | "core-util-is": "~1.0.0", 2389 | "inherits": "~2.0.1", 2390 | "isarray": "0.0.1", 2391 | "string_decoder": "~0.10.x" 2392 | } 2393 | }, 2394 | "node_modules/watchify/node_modules/string_decoder": { 2395 | "version": "0.10.31", 2396 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 2397 | "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", 2398 | "dev": true 2399 | }, 2400 | "node_modules/watchify/node_modules/through2": { 2401 | "version": "0.5.1", 2402 | "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", 2403 | "integrity": "sha512-zexCrAOTbjkBCXGyozn7hhS3aEaqdrc59mAD2E3dKYzV1vFuEGQ1hEDJN2oQMQFwy4he2zyLqPZV+AlfS8ZWJA==", 2404 | "dev": true, 2405 | "dependencies": { 2406 | "readable-stream": "~1.0.17", 2407 | "xtend": "~3.0.0" 2408 | } 2409 | }, 2410 | "node_modules/window-size": { 2411 | "version": "0.1.0", 2412 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", 2413 | "integrity": "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==", 2414 | "dev": true, 2415 | "engines": { 2416 | "node": ">= 0.8.0" 2417 | } 2418 | }, 2419 | "node_modules/wordwrap": { 2420 | "version": "0.0.2", 2421 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", 2422 | "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", 2423 | "dev": true, 2424 | "engines": { 2425 | "node": ">=0.4.0" 2426 | } 2427 | }, 2428 | "node_modules/wrappy": { 2429 | "version": "1.0.2", 2430 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2431 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 2432 | "dev": true 2433 | }, 2434 | "node_modules/xtend": { 2435 | "version": "3.0.0", 2436 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", 2437 | "integrity": "sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg==", 2438 | "dev": true, 2439 | "engines": { 2440 | "node": ">=0.4" 2441 | } 2442 | }, 2443 | "node_modules/yargs": { 2444 | "version": "3.10.0", 2445 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", 2446 | "integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==", 2447 | "dev": true, 2448 | "dependencies": { 2449 | "camelcase": "^1.0.2", 2450 | "cliui": "^2.1.0", 2451 | "decamelize": "^1.0.0", 2452 | "window-size": "0.1.0" 2453 | } 2454 | } 2455 | } 2456 | } 2457 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "geojson-equality", 3 | "version": "0.2.1", 4 | "description": "Check two valid geojson geometries for equality.", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "mocha test/test.js", 8 | "build-debug": "browserify index.js --debug --standalone GeojsonEquality | exorcist dist/geojson-equality.js.map > dist/geojson-equality.js", 9 | "build-min": "browserify index.js --standalone GeojsonEquality | uglifyjs -c -m > dist/geojson-equality.min.js", 10 | "build": "npm run build-debug && npm run build-min" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "git://github.com/geosquare/geojson-equality.git" 15 | }, 16 | "bugs": { 17 | "url": "https://github.com/geosquare/geojson-equality/issues" 18 | }, 19 | "homepage": "https://github.com/geosquare/geojson-equality", 20 | "keywords": [ 21 | "geojson", 22 | "equality", 23 | "equal", 24 | "assertion" 25 | ], 26 | "author": "Gagan Bansal ", 27 | "contributors": [ 28 | "Tim Oram ", 29 | "Wojciech Maj < kontakt@wojtekmaj.pl" 30 | ], 31 | "license": "MIT", 32 | "dependencies": { 33 | "dequal": "^2.0.3" 34 | }, 35 | "devDependencies": { 36 | "browserify": "~5.10.1", 37 | "chai": "~1.9.1", 38 | "exorcist": "^0.4.0", 39 | "mocha": "~1.21.4", 40 | "uglify-js": "^2.6.0", 41 | "watchify": "~1.0.2" 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /test/mocha.opts: -------------------------------------------------------------------------------- 1 | --check-leaks 2 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | var expect = require('chai').expect, 2 | Equality = require('../'); 3 | describe('geojson-equality for Points', function() { 4 | var g1 = { "type": "Point", "coordinates": [30, 10] }, 5 | g2 = { "type": "Point", "coordinates": [30, 10] }, 6 | g3 = { "type": "Point", "coordinates": [30, 11] }, 7 | g4 = { "type": "Point", "coordinates": [30, 10, 5]}, 8 | g5 = { "type": "Point", "coordinates": [30, 10, 5]}, 9 | eq = new Equality(); 10 | it('are equal', function() { 11 | expect(eq.compare(g1,g2)).to.be.true; 12 | }); 13 | it('are not equal', function() { 14 | expect(eq.compare(g1,g3)).to.be.false; 15 | }); 16 | it('are not equal with different point dimensions', function() { 17 | expect(eq.compare(g1,g4)).to.be.false; 18 | }); 19 | it('are equal with 3d points', function() { 20 | expect(eq.compare(g4,g5)).to.be.true; 21 | }); 22 | }); 23 | describe('geojson-equality for LineStrings', function() { 24 | var g1 = { "type": "LineString", "coordinates": 25 | [ [30, 10], [10, 30], [40, 40] ] }, 26 | g2 = { "type": "LineString", "coordinates": 27 | [ [30, 10], [10, 30], [40, 40] ] }; 28 | it('are equal', function() { 29 | var eq = new Equality(); 30 | expect(eq.compare(g1,g2)).to.be.true; 31 | }); 32 | var g3 = { "type": "LineString", "coordinates": 33 | [ [31, 10], [10, 30], [40, 40] ] }; 34 | it('are not equal', function() { 35 | var eq = new Equality(); 36 | expect(eq.compare(g1,g3)).to.be.false; 37 | }); 38 | var g4 = { "type": "LineString", "coordinates": 39 | [ [40, 40], [10, 30], [30, 10]] }; 40 | it('reverse direction, direction is not matched, so both are equal', function() { 41 | var eq = new Equality(); 42 | expect(eq.compare(g1,g4)).to.be.true; 43 | }); 44 | it('reverse direction, direction is matched, so both are not equal', function() { 45 | var eq = new Equality({direction: true}); 46 | expect(eq.compare(g1,g4)).to.be.false; 47 | }); 48 | }); 49 | describe('geojson-equality for Polygons', function() { 50 | var g1 = { "type": "Polygon", "coordinates": [ 51 | [[30, 10], [40, 40], [20, 40], [10, 20], [30, 10]] 52 | ]}; 53 | var g2 = { "type": "Polygon", "coordinates": [ 54 | [[30, 10], [40, 40], [20, 40], [10, 20], [30, 10]] 55 | ]}; 56 | it('are equal', function() { 57 | var eq = new Equality(); 58 | expect(eq.compare(g1,g2)).to.be.true; 59 | }); 60 | var g3 = { "type": "Polygon", "coordinates": [ 61 | [[30, 10], [41, 40], [20, 40], [10, 20], [30, 10]] 62 | ]}; 63 | it('are not equal', function() { 64 | var eq = new Equality(); 65 | expect(eq.compare(g1,g3)).to.be.false; 66 | }); 67 | var g4 = { "type": "Polygon", "coordinates": [ 68 | [[30,10], [10,20], [20,40], [40,40], [30,10]] 69 | ]}; 70 | it('reverse direction, direction is not matched, so both are equal', function() { 71 | var eq = new Equality(); 72 | expect(eq.compare(g1,g4)).to.be.true; 73 | }); 74 | it('reverse direction, direction is matched, so both are not equal', function() { 75 | var eq = new Equality({direction: true}); 76 | expect(eq.compare(g1,g4)).to.be.false; 77 | }); 78 | var g5 = { "type": "Polygon", "coordinates": [ 79 | [[10,20], [20,40], [40,40], [30,10], [10,20]] 80 | ]}; 81 | it('reverse direction, diff start index, direction is not matched, so both are equal', 82 | function() { 83 | var eq = new Equality(); 84 | expect(eq.compare(g1,g5)).to.be.true; 85 | }); 86 | it('reverse direction, diff start index, direction is matched, so both are not equal', 87 | function() { 88 | var eq = new Equality({direction: true}); 89 | expect(eq.compare(g1,g5)).to.be.false; 90 | }); 91 | var gh1 = { "type": "Polygon", "coordinates": [ 92 | [[45, 45], [15, 40], [10, 20], [35, 10],[45, 45]], 93 | [[20, 30], [35, 35], [30, 20], [20, 30]] 94 | ]}; 95 | var gh2 = { "type": "Polygon", "coordinates": [ 96 | [[35, 10], [45, 45], [15, 40], [10, 20], [35, 10]], 97 | [[20, 30], [35, 35], [30, 20], [20, 30]] 98 | ]}; 99 | it('have holes too and diff start ind, direction is not matched, both are equal', 100 | function() { 101 | var eq = new Equality({direction: false}); 102 | expect(eq.compare(gh1,gh2)).to.be.true; 103 | }); 104 | it('have holes too and diff start ind, direction is matched, so both are not equal', 105 | function() { 106 | var eq = new Equality({direction: true}); 107 | expect(eq.compare(gh1,gh2)).to.be.true; 108 | }); 109 | var gprecision1 = { "type": "Polygon", "coordinates": [ 110 | [[30, 10], [40.12345, 40.12345], [20, 40], [10, 20], [30, 10]] 111 | ]}; 112 | var gprecision2 = { "type": "Polygon", "coordinates": [ 113 | [[30, 10], [40.123389, 40.123378], [20, 40], [10, 20], [30, 10]] 114 | ]}; 115 | it('after limiting precision, are equal', function() { 116 | var eq = new Equality({precision: 3}); 117 | expect(eq.compare(gprecision1,gprecision2)).to.be.true; 118 | }); 119 | it('with high precision, are not equal', function() { 120 | var eq = new Equality({precision: 10}); 121 | expect(eq.compare(gprecision1,gprecision2)).to.be.false; 122 | }); 123 | 124 | }); 125 | 126 | describe ('geojson-equality for Feature', function() { 127 | it ('will not be equal with changed id', function() { 128 | var f1 = {"type": "Feature", "id": "id1"}; 129 | var f2 = {"type": "Feature", "id": "id2"}; 130 | var eq = new Equality(); 131 | expect(eq.compare(f1, f2)).to.be.false; 132 | }); 133 | it ('will not be equal with different count of properties', function() { 134 | var f1 = {"type": "Feature", "id": "id1", "properties": {"foo": "bar"}}; 135 | var f2 = {"type": "Feature", "id": "id1", "properties": {"foo1": "bar", "foo2": "bar"}}; 136 | var eq = new Equality(); 137 | expect(eq.compare(f1, f2)).to.be.false; 138 | }); 139 | it ('will not be equal with different keys in properties', function() { 140 | var f1 = {"type": "Feature", "id": "id1", "properties": {"foo1": "bar"}}; 141 | var f2 = {"type": "Feature", "id": "id1", "properties": {"foo2": "bar"}}; 142 | var eq = new Equality(); 143 | expect(eq.compare(f1, f2)).to.be.false; 144 | }); 145 | it ('will not be equal with different properties', function() { 146 | var f1 = {"type": "Feature", "id": "id1", "properties": {"foo": "bar1"}}; 147 | var f2 = {"type": "Feature", "id": "id1", "properties": {"foo": "bar2"}}; 148 | var eq = new Equality(); 149 | expect(eq.compare(f1, f2)).to.be.false; 150 | }); 151 | it ('will not be equal with different geometry', function() { 152 | var f1 = { 153 | "type": "Feature", 154 | "id": "id1", 155 | "properties": {"foo": "bar1"}, 156 | "geometry": { "type": "Polygon", "coordinates": [ 157 | [[30, 10], [41, 40], [20, 40], [10, 20], [30, 10]] 158 | ]} 159 | }; 160 | var f2 = { 161 | "type": "Feature", 162 | "id": "id1", 163 | "properties": {"foo": "bar1"}, 164 | "geometry": { "type": "Polygon", "coordinates": [ 165 | [[40, 20], [31, 10], [30, 20], [30, 10], [10, 40]] 166 | ]} 167 | }; 168 | var eq = new Equality(); 169 | expect(eq.compare(f1, f2)).to.be.false; 170 | }); 171 | it ('will be equal with nested properties', function() { 172 | var f1 = {"type": "Feature", "id": "id1", "properties": {"foo": {"bar": "baz"}}, 173 | "geometry": {"type": "Point", "coordinates": [0, 1]} 174 | }; 175 | var f2 = {"type": "Feature", "id": "id1", "properties": {"foo": {"bar": "baz"}}, 176 | "geometry": {"type": "Point", "coordinates": [0, 1]} 177 | }; 178 | var eq = new Equality(); 179 | expect(eq.compare(f1, f2)).to.be.true; 180 | }); 181 | it ('will not be equal with different nested properties', function() { 182 | var f1 = {"type": "Feature", "id": "id1", "properties": {"foo": {"bar": "baz"}}, 183 | "geometry": {"type": "Point", "coordinates": [0, 1]} 184 | }; 185 | var f2 = {"type": "Feature", "id": "id1", "properties": {"foo": {"bar": "baz2"}}, 186 | "geometry": {"type": "Point", "coordinates": [0, 1]} 187 | }; 188 | var eq = new Equality(); 189 | expect(eq.compare(f1, f2)).to.be.false; 190 | }); 191 | it ('will use a custom comparator if provided', function() { 192 | var f1 = { 193 | "type": "Feature", 194 | "id": "id1", 195 | "properties": {"foo_123": "bar"}, 196 | "geometry": { "type": "Polygon", "coordinates": [ 197 | [[40, 20], [31, 10], [30, 20], [30, 10], [10, 40]] 198 | ]} 199 | }; 200 | var f2 = { 201 | "type": "Feature", 202 | "id": "id1", 203 | "properties": {"foo_456": "bar"}, 204 | "geometry": { "type": "Polygon", "coordinates": [ 205 | [[40, 20], [31, 10], [30, 20], [30, 10], [10, 40]] 206 | ]} 207 | }; 208 | var eq = new Equality({objectComparator: function(obj1, obj2) { 209 | return ('foo_123' in obj1 && 'foo_456' in obj2); 210 | }}); 211 | expect(eq.compare(f1, f2)).to.be.true; 212 | }); 213 | it ('will not be equal if one has bbox and other not', function() { 214 | var f1 = {"type": "Feature", "id": "id1", "bbox": [1, 2, 3, 4]}, 215 | f2 = {"type": "Feature", "id": "id1"}, 216 | eq = new Equality(); 217 | expect(eq.compare(f1, f2)).to.be.false; 218 | }); 219 | it ('will not be equal if bboxes are not equal', function() { 220 | var f1 = {"type": "Feature", "id": "id1", "bbox": [1, 2, 3, 4]}, 221 | f2 = {"type": "Feature", "id": "id1", "bbox": [1, 2, 3, 5]}, 222 | eq = new Equality(); 223 | expect(eq.compare(f1, f2)).to.be.false; 224 | }); 225 | it ('equal features with bboxes', function() { 226 | var f1 = { 227 | "type": "Feature", 228 | "id": "id1", 229 | "properties": {"foo": "bar1"}, 230 | "geometry": { "type": "Polygon", "coordinates": [ 231 | [[30, 10], [41, 40], [20, 40], [10, 20], [30, 10]] 232 | ]}, 233 | "bbox": [10, 10, 41, 40] 234 | }; 235 | var f2 = { 236 | "type": "Feature", 237 | "id": "id1", 238 | "properties": {"foo": "bar1"}, 239 | "geometry": { "type": "Polygon", "coordinates": [ 240 | [[30, 10], [41, 40], [20, 40], [10, 20], [30, 10]] 241 | ]}, 242 | "bbox": [10, 10, 41, 40] 243 | }; 244 | var eq = new Equality(); 245 | expect(eq.compare(f1, f2)).to.be.true; 246 | }); 247 | it ('not equal features with equal bboxes', function() { 248 | var f1 = { 249 | "type": "Feature", 250 | "id": "id1", 251 | "properties": {"foo": "bar1"}, 252 | "geometry": { "type": "Polygon", "coordinates": [ 253 | [[30, 10], [41, 40], [20, 40], [10, 20], [30, 10]] 254 | ]}, 255 | "bbox": [10, 10, 41, 40] 256 | }; 257 | var f2 = { 258 | "type": "Feature", 259 | "id": "id1", 260 | "properties": {"foo": "bar1"}, 261 | "geometry": { "type": "Polygon", "coordinates": [ 262 | [[30, 10], [41, 40], [20, 40], [10, 20], [30, 1]] 263 | ]}, 264 | "bbox": [10, 10, 41, 40] 265 | }; 266 | var eq = new Equality(); 267 | expect(eq.compare(f1, f2)).to.be.false; 268 | }); 269 | }); 270 | 271 | describe ('geojson-equality for FeatureCollection', function() { 272 | it ('will not be equal with different number of features', function() { 273 | var f1 = { 274 | "type": "FeatureCollection", 275 | "features": [{ 276 | "type": "Feature", 277 | "geometry": { "type": "Point", "coordinates": [0, 0] } 278 | }] 279 | }; 280 | var f2 = { 281 | "type": "FeatureCollection", 282 | "features": [{ 283 | "type": "Feature", 284 | "geometry": { "type": "Point", "coordinates": [0, 0] } 285 | },{ 286 | "type": "Feature", 287 | "geometry": { "type": "Point", "coordinates": [0, 0] } 288 | }] 289 | }; 290 | var eq = new Equality(); 291 | expect(eq.compare(f1, f2)).to.be.false; 292 | }); 293 | it ('will not be equal with different features', function() { 294 | var f1 = { 295 | "type": "FeatureCollection", 296 | "features": [{ 297 | "type": "Feature", 298 | "geometry": { "type": "Point", "coordinates": [0, 0] } 299 | }] 300 | }; 301 | var f2 = { 302 | "type": "FeatureCollection", 303 | "features": [{ 304 | "type": "Feature", 305 | "geometry": { "type": "Point", "coordinates": [1, 1] } 306 | }] 307 | }; 308 | var eq = new Equality(); 309 | expect(eq.compare(f1, f2)).to.be.false; 310 | }); 311 | it ('will not be equal with different order of features', function() { 312 | var f1 = { 313 | "type": "FeatureCollection", 314 | "features": [{ 315 | "type": "Feature", 316 | "geometry": { "type": "Point", "coordinates": [0, 0] } 317 | },{ 318 | "type": "Feature", 319 | "geometry": { "type": "Point", "coordinates": [1, 1] } 320 | }] 321 | }; 322 | var f2 = { 323 | "type": "FeatureCollection", 324 | "features": [{ 325 | "type": "Feature", 326 | "geometry": { "type": "Point", "coordinates": [1, 1] } 327 | },{ 328 | "type": "Feature", 329 | "geometry": { "type": "Point", "coordinates": [0, 0] } 330 | }] 331 | }; 332 | var eq = new Equality(); 333 | expect(eq.compare(f1, f2)).to.be.false; 334 | }); 335 | it ('will be equal with equal features', function() { 336 | var f1 = { 337 | "type": "FeatureCollection", 338 | "features": [{ 339 | "type": "Feature", 340 | "geometry": { "type": "Point", "coordinates": [1, 1] } 341 | }] 342 | }; 343 | var f2 = { 344 | "type": "FeatureCollection", 345 | "features": [{ 346 | "type": "Feature", 347 | "geometry": { "type": "Point", "coordinates": [1, 1] } 348 | }] 349 | }; 350 | var eq = new Equality(); 351 | expect(eq.compare(f1, f2)).to.be.true; 352 | }); 353 | it ('will be equal with equal with no features', function() { 354 | var f1 = { 355 | "type": "FeatureCollection", 356 | "features": [] 357 | }; 358 | var f2 = { 359 | "type": "FeatureCollection", 360 | "features": [] 361 | }; 362 | var eq = new Equality(); 363 | expect(eq.compare(f1, f2)).to.be.true; 364 | }); 365 | it ('will use a custom comparator if provided', function() { 366 | var f1 = { 367 | "type": "FeatureCollection", 368 | "features": [{ 369 | "type": "Feature", 370 | "id": "id1", 371 | "properties": {"foo_123": "bar"}, 372 | "geometry": { "type": "Polygon", "coordinates": [ 373 | [[40, 20], [31, 10], [30, 20], [30, 10], [10, 40]] 374 | ]} 375 | }] 376 | }; 377 | var f2 = { 378 | "type": "FeatureCollection", 379 | "features": [{ 380 | "type": "Feature", 381 | "id": "id1", 382 | "properties": {"foo_456": "bar"}, 383 | "geometry": { "type": "Polygon", "coordinates": [ 384 | [[40, 20], [31, 10], [30, 20], [30, 10], [10, 40]] 385 | ]} 386 | }] 387 | }; 388 | var eq = new Equality({objectComparator: function(obj1, obj2) { 389 | return ('foo_123' in obj1 && 'foo_456' in obj2); 390 | }}); 391 | expect(eq.compare(f1, f2)).to.be.true; 392 | }); 393 | it ('will not be equal if one has bbox and other not', function() { 394 | var f1 = {"type": "FeatureCollection", "features": [], "bbox": [1, 2, 3, 4]}, 395 | f2 = {"type": "FeatureCollection", "features": "[]"}, 396 | eq = new Equality(); 397 | expect(eq.compare(f1, f2)).to.be.false; 398 | }); 399 | it ('will not be equal if bboxes are not equal', function() { 400 | var f1 = {"type": "FeatureCollection", "features": [], "bbox": [1, 2, 3, 4]}, 401 | f2 = {"type": "FeatureCollection", "features": [], "bbox": [1, 2, 3, 5]}, 402 | eq = new Equality(); 403 | expect(eq.compare(f1, f2)).to.be.false; 404 | }); 405 | it ('equal feature collections with bboxes', function() { 406 | var f1 = { 407 | "type": "FeatureCollection", 408 | "features": [{ 409 | "type": "Feature", 410 | "id": "id1", 411 | "properties": {"foo": "bar1"}, 412 | "geometry": { "type": "Polygon", "coordinates": [ 413 | [[30, 10], [41, 40], [20, 40], [10, 20], [30, 10]] 414 | ]} 415 | }], 416 | "bbox": [10, 10, 41, 40] 417 | }; 418 | var f2 = { 419 | "type": "FeatureCollection", 420 | "features": [{ 421 | "type": "Feature", 422 | "id": "id1", 423 | "properties": {"foo": "bar1"}, 424 | "geometry": { "type": "Polygon", "coordinates": [ 425 | [[30, 10], [41, 40], [20, 40], [10, 20], [30, 10]] 426 | ]} 427 | }], 428 | "bbox": [10, 10, 41, 40] 429 | }; 430 | var eq = new Equality(); 431 | expect(eq.compare(f1, f2)).to.be.true; 432 | }); 433 | it ('not equal features with equal bboxes', function() { 434 | var f1 = { 435 | "type": "FeatureCollection", 436 | "features": [{ 437 | "type": "Feature", 438 | "id": "id1", 439 | "properties": {"foo": "bar1"}, 440 | "geometry": { "type": "Polygon", "coordinates": [ 441 | [[30, 10], [41, 40], [20, 40], [10, 20], [30, 10]] 442 | ]} 443 | }], 444 | "bbox": [10, 10, 41, 40] 445 | }; 446 | var f2 = { 447 | "type": "FeatureCollection", 448 | "features": [{ 449 | "type": "Feature", 450 | "id": "id1", 451 | "properties": {"foo": "bar1"}, 452 | "geometry": { "type": "Polygon", "coordinates": [ 453 | [[30, 10], [41, 40], [20, 40], [10, 20], [30, 1]] 454 | ]} 455 | }], 456 | "bbox": [10, 10, 41, 40] 457 | }; 458 | var eq = new Equality(); 459 | expect(eq.compare(f1, f2)).to.be.false; 460 | }); 461 | }); 462 | 463 | describe('geojson-equality for MultiPoints', function() { 464 | var g1 = { "type": "MultiPoint", "coordinates": [ 465 | [0, 40], [40, 30], [20, 20], [30, 10] 466 | ]}; 467 | var g2 = { "type": "MultiPoint", "coordinates": [ 468 | [0, 40], [20, 20], [40, 30], [30, 10] 469 | ]}; 470 | it('are equal', function() { 471 | var eq = new Equality(); 472 | expect(eq.compare(g1,g2)).to.be.true; 473 | }); 474 | var g3 = { "type": "MultiPoint", "coordinates": [ 475 | [10, 40], [20, 20], [40, 30], [30, 10] 476 | ]}; 477 | it('are not equal', function() { 478 | var eq = new Equality(); 479 | expect(eq.compare(g1,g3)).to.be.false; 480 | }); 481 | }); 482 | 483 | describe('geojson-equality for MultiLineString', function() { 484 | var g1 = { "type": "MultiLineString", "coordinates": [ 485 | [[30, 10], [10, 30], [40, 40]], 486 | [[0, 10], [10, 0], [40, 40]] 487 | ]}; 488 | var g2 = { "type": "MultiLineString", "coordinates": [ 489 | [[40, 40],[10, 30], [30, 10]], 490 | [[0, 10], [10, 0], [40, 40]] 491 | ]}; 492 | it('reverse direction, direction is not matched, so both are equal', 493 | function() { 494 | var eq = new Equality(); 495 | expect(eq.compare(g1,g2)).to.be.true; 496 | } 497 | ); 498 | it('reverse direction, direction is matched, so both are not equal', 499 | function() { 500 | var eq = new Equality({direction: true}); 501 | expect(eq.compare(g1,g2)).to.be.false; 502 | } 503 | ); 504 | var g3 = { "type": "MultiLineString", "coordinates": [ 505 | [[10, 10], [20, 20], [10, 40]], 506 | [[40, 40], [30, 30], [40, 20], [30, 10]] ] }; 507 | it('both are not equal', 508 | function() { 509 | var eq = new Equality(); 510 | expect(eq.compare(g1,g3)).to.be.false; 511 | } 512 | ); 513 | }); 514 | describe('geojson-equality for MultiPolygon', function() { 515 | var g1 = { "type": "MultiPolygon", "coordinates": [ 516 | [[[30, 20], [45, 40], [10, 40], [30, 20]]], 517 | [[[15, 5], [40, 10], [10, 20], [5, 10], [15, 5]]] 518 | ]}; 519 | var g2 = { "type": "MultiPolygon", "coordinates": [ 520 | [[[30, 20], [45, 40], [10, 40], [30, 20]]], 521 | [[[15, 5], [40, 10], [10, 20], [5, 10], [15, 5]]] 522 | ]}; 523 | it('both are equal', function() { 524 | var eq = new Equality(); 525 | expect(eq.compare(g1,g2)).to.be.true; 526 | }); 527 | var g3 = { "type": "MultiPolygon", "coordinates": [ 528 | [[[30, 20], [45, 40], [10, 40], [30, 20]]], 529 | [[[15, 5], [400, 10], [10, 20], [5, 10], [15, 5]]] 530 | ]}; 531 | it('both are not equal', function() { 532 | var eq = new Equality(); 533 | expect(eq.compare(g1,g3)).to.be.false; 534 | }); 535 | var gh1 = { "type": "MultiPolygon", "coordinates": [ 536 | [[[40, 40], [20, 45], [45, 30], [40, 40]]], 537 | [ 538 | [[20, 35], [10, 30], [10, 10], [30, 5], [45, 20], [20, 35]], 539 | [[30, 20], [20, 15], [20, 25], [30, 20]], 540 | [[20, 10], [30, 10], [30, 15], [20, 10]] 541 | ] 542 | ]}; 543 | var gh2 = { "type": "MultiPolygon", "coordinates": [ 544 | [ 545 | [[20, 35], [10, 30], [10, 10], [30, 5], [45, 20], [20, 35]], 546 | [[20, 10], [30, 10], [30, 15], [20, 10]], 547 | [[30, 20], [20, 15], [20, 25], [30, 20]] 548 | ], 549 | [[[40, 40], [20, 45], [45, 30], [40, 40]]] 550 | ]}; 551 | it('having holes, both are equal', function() { 552 | var eq = new Equality(); 553 | expect(eq.compare(gh1,gh2)).to.be.true; 554 | }); 555 | }); 556 | 557 | describe ('geojson-equality for GeometryCollection', function() { 558 | it ('will not be equal with different number of geometries', function() { 559 | var f1 = { 560 | "type": "GeometryCollection", 561 | "geometries": [{ "type": "Point", "coordinates": [0, 0] }] 562 | }; 563 | var f2 = { 564 | "type": "GeometryCollection", 565 | "geometries": [ 566 | { "type": "Point", "coordinates": [0, 0] }, 567 | { "type": "Point", "coordinates": [0, 0] } 568 | ] 569 | }; 570 | var eq = new Equality(); 571 | expect(eq.compare(f1, f2)).to.be.false; 572 | }); 573 | it ('will not be equal with different geometries', function() { 574 | var f1 = { 575 | "type": "GeometryCollection", 576 | "geometries": [{ "type": "Point", "coordinates": [0, 0] }] 577 | }; 578 | var f2 = { 579 | "type": "GeometryCollection", 580 | "geometries": [{ "type": "Point", "coordinates": [1, 1] }] 581 | }; 582 | var eq = new Equality(); 583 | expect(eq.compare(f1, f2)).to.be.false; 584 | }); 585 | it ('will not be equal with different order of geometries', function() { 586 | var f1 = { 587 | "type": "GeometryCollection", 588 | "geometries": [ 589 | { "type": "Point", "coordinates": [0, 0] }, 590 | { "type": "Point", "coordinates": [1, 1] } 591 | ] 592 | }; 593 | var f2 = { 594 | "type": "GeometryCollection", 595 | "geometries": [ 596 | { "type": "Point", "coordinates": [1, 1] }, 597 | { "type": "Point", "coordinates": [0, 0] } 598 | ] 599 | }; 600 | var eq = new Equality(); 601 | expect(eq.compare(f1, f2)).to.be.false; 602 | }); 603 | it ('will be equal with equal geometries', function() { 604 | var f1 = { 605 | "type": "GeometryCollection", 606 | "geometries": [{ "type": "Point", "coordinates": [0, 0] }] 607 | }; 608 | var f2 = { 609 | "type": "GeometryCollection", 610 | "geometries": [{ "type": "Point", "coordinates": [0, 0] }] 611 | }; 612 | var eq = new Equality(); 613 | expect(eq.compare(f1, f2)).to.be.true; 614 | }); 615 | it ('will be equal with equal with no geometries', function() { 616 | var f1 = { 617 | "type": "GeometryCollection", 618 | "geometries": [] 619 | }; 620 | var f2 = { 621 | "type": "GeometryCollection", 622 | "geometries": [] 623 | }; 624 | var eq = new Equality(); 625 | expect(eq.compare(f1, f2)).to.be.true; 626 | }); 627 | it ('will not be equal if one has bbox and other not', function() { 628 | var f1 = {"type": "GeometryCollection", "geometries": [], "bbox": [1, 2, 3, 4]}, 629 | f2 = {"type": "GeometryCollection", "geometries": "[]"}, 630 | eq = new Equality(); 631 | expect(eq.compare(f1, f2)).to.be.false; 632 | }); 633 | it ('will not be equal if bboxes are not equal', function() { 634 | var f1 = {"type": "GeometryCollection", "geometries": [], "bbox": [1, 2, 3, 4]}, 635 | f2 = {"type": "GeometryCollection", "geometries": [], "bbox": [1, 2, 3, 5]}, 636 | eq = new Equality(); 637 | expect(eq.compare(f1, f2)).to.be.false; 638 | }); 639 | it ('equal geometry collections with bboxes', function() { 640 | var f1 = { 641 | "type": "GeometryCollection", 642 | "geometries": [{ "type": "Polygon", "coordinates": [ 643 | [[30, 10], [41, 40], [20, 40], [10, 20], [30, 10]] 644 | ]} 645 | ], 646 | "bbox": [10, 10, 41, 40] 647 | }; 648 | var f2 = { 649 | "type": "GeometryCollection", 650 | "geometries": [{ "type": "Polygon", "coordinates": [ 651 | [[30, 10], [41, 40], [20, 40], [10, 20], [30, 10]] 652 | ]} 653 | ], 654 | "bbox": [10, 10, 41, 40] 655 | }; 656 | var eq = new Equality(); 657 | expect(eq.compare(f1, f2)).to.be.true; 658 | }); 659 | it ('not equal geometries with equal bboxes', function() { 660 | var f1 = { 661 | "type": "GeometryCollection", 662 | "geometries": [{ "type": "Polygon", "coordinates": [ 663 | [[30, 10], [41, 40], [20, 40], [10, 20], [30, 10]] 664 | ]} 665 | ], 666 | "bbox": [10, 10, 41, 40] 667 | }; 668 | var f2 = { 669 | "type": "GeometryCollection", 670 | "geometries": [{ "type": "Polygon", "coordinates": [ 671 | [[30, 10], [41, 40], [20, 40], [10, 20], [30, 1]] 672 | ]} 673 | ], 674 | "bbox": [10, 10, 41, 40] 675 | }; 676 | var eq = new Equality(); 677 | expect(eq.compare(f1, f2)).to.be.false; 678 | }); 679 | }); 680 | --------------------------------------------------------------------------------