├── .gitattributes ├── .gitignore ├── example ├── .env.example ├── src │ ├── png-decoder-worker.js │ ├── config.js │ ├── quantized-mesh-decoder-worker.js │ ├── constants.js │ ├── fetch-nextzen-tile.js │ ├── fetch-sample-tile.js │ ├── fetch-float32-png-tile.js │ ├── fetch-cesium-tile.js │ ├── attribution-ui.js │ ├── get-tile-material.js │ └── app.js ├── package.json ├── README.md ├── webpack.config.js └── index.html ├── harp-terrain-datasource.png ├── .travis.yml ├── src ├── png │ ├── tile-decoder-worker.js │ └── tile-decoder.js ├── quantized-mesh │ ├── tile-decoder-worker.js │ └── tile-decoder.js ├── terrain-data-provider.js ├── shaders │ ├── vertex.glsl.js │ └── fragment.glsl.js ├── index.d.ts ├── index.js ├── elevation-styling.js └── terrain-tile.js ├── package.json ├── README.md ├── docs ├── APIReference.md └── GettingStartedGuide.md ├── LICENSE └── yarn.lock /.gitattributes: -------------------------------------------------------------------------------- 1 | *.terrain binary 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | *_tiles 4 | *-tiles 5 | .env 6 | -------------------------------------------------------------------------------- /example/.env.example: -------------------------------------------------------------------------------- 1 | APP_ID= 2 | APP_CODE= 3 | CESIUM_USER_ACCESS_TOKEN= 4 | -------------------------------------------------------------------------------- /harp-terrain-datasource.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/heremaps/harp-terrain-datasource/HEAD/harp-terrain-datasource.png -------------------------------------------------------------------------------- /example/src/png-decoder-worker.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright © 2017-2019 HERE Europe B.V. 3 | * Licensed under Apache 2.0, see full license in LICENSE 4 | * SPDX-License-Identifier: Apache-2.0 5 | */ 6 | 7 | require('@here/harp-terrain-datasource/src/png/tile-decoder-worker') 8 | -------------------------------------------------------------------------------- /example/src/config.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright © 2017-2019 HERE Europe B.V. 3 | * Licensed under Apache 2.0, see full license in LICENSE 4 | * SPDX-License-Identifier: Apache-2.0 5 | */ 6 | 7 | export default { 8 | APP_ID: process.env.APP_ID, 9 | APP_CODE: process.env.APP_CODE, 10 | CESIUM_USER_ACCESS_TOKEN: process.env.CESIUM_USER_ACCESS_TOKEN 11 | } 12 | -------------------------------------------------------------------------------- /example/src/quantized-mesh-decoder-worker.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright © 2017-2019 HERE Europe B.V. 3 | * Licensed under Apache 2.0, see full license in LICENSE 4 | * SPDX-License-Identifier: Apache-2.0 5 | */ 6 | 7 | /* eslint-env worker */ 8 | importScripts('three/build/three.js') 9 | 10 | // Must be require(), not import, to be loaded after importScript() 11 | require('@here/harp-terrain-datasource/src/quantized-mesh/tile-decoder-worker') 12 | -------------------------------------------------------------------------------- /example/src/constants.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright © 2017-2019 HERE Europe B.V. 3 | * Licensed under Apache 2.0, see full license in LICENSE 4 | * SPDX-License-Identifier: Apache-2.0 5 | */ 6 | 7 | export const datasetList = [ 8 | 'Grand Teton National Park (Quantized Mesh)', 9 | 'Cesium World Terrain (Quantized Mesh)' /* , 10 | 'Nextzen Terrain (PNG)' */ 11 | ] 12 | 13 | export const stylesList = [ 14 | 'Elevation Styling', 15 | 'Texture', 16 | 'Wireframe' 17 | ] 18 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | dist: xenial 3 | node_js: 4 | - "10" 5 | cache: 6 | yarn: true 7 | 8 | addons: 9 | chrome: stable 10 | firefox: latest 11 | 12 | branches: 13 | only: 14 | - master 15 | - /^@here\// 16 | 17 | # upgrade yarn to a more recent version 18 | before_install: 19 | - curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.13.0 20 | - export PATH="$HOME/.yarn/bin:$PATH" 21 | 22 | jobs: 23 | include: 24 | - name: "Build & test" 25 | script: | 26 | set -ex 27 | yarn test 28 | -------------------------------------------------------------------------------- /src/png/tile-decoder-worker.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright © 2017-2020 HERE Europe B.V. 3 | * Licensed under Apache 2.0, see full license in LICENSE 4 | * SPDX-License-Identifier: Apache-2.0 5 | */ 6 | 7 | import { WorkerServiceManager, TileDecoderService } from '@here/harp-mapview-decoder/index-worker' 8 | import { PNG_TILE_DECODER_ID, PNGTileDecoder } from './tile-decoder' 9 | 10 | WorkerServiceManager.getInstance().register({ 11 | serviceType: PNG_TILE_DECODER_ID, 12 | factory: (serviceId) => { 13 | return TileDecoderService.start(serviceId, new PNGTileDecoder()) 14 | } 15 | }) 16 | -------------------------------------------------------------------------------- /src/quantized-mesh/tile-decoder-worker.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright © 2017-2020 HERE Europe B.V. 3 | * Licensed under Apache 2.0, see full license in LICENSE 4 | * SPDX-License-Identifier: Apache-2.0 5 | */ 6 | 7 | import { WorkerServiceManager, TileDecoderService } from '@here/harp-mapview-decoder/index-worker' 8 | import { QUANTIZED_MESH_TILE_DECODER_ID, QuantizedMeshTileDecoder } from './tile-decoder' 9 | 10 | WorkerServiceManager.getInstance().register({ 11 | serviceType: QUANTIZED_MESH_TILE_DECODER_ID, 12 | factory: (serviceId) => { 13 | return TileDecoderService.start(serviceId, new QuantizedMeshTileDecoder()) 14 | } 15 | }) 16 | -------------------------------------------------------------------------------- /src/terrain-data-provider.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright © 2017-2019 HERE Europe B.V. 3 | * Licensed under Apache 2.0, see full license in LICENSE 4 | * SPDX-License-Identifier: Apache-2.0 5 | */ 6 | 7 | export class TerrainDataProvider { 8 | constructor (fetchTile) { 9 | if (fetchTile === undefined) { 10 | throw new Error('"fetchTile()" method was not provided') 11 | } 12 | 13 | this.fetchTile = fetchTile 14 | } 15 | 16 | connect () { 17 | return Promise.resolve() 18 | } 19 | 20 | ready () { 21 | return true 22 | } 23 | 24 | getTile (tileKey) { 25 | return this.fetchTile(tileKey) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /example/src/fetch-nextzen-tile.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright © 2017-2019 HERE Europe B.V. 3 | * Licensed under Apache 2.0, see full license in LICENSE 4 | * SPDX-License-Identifier: Apache-2.0 5 | */ 6 | 7 | export default function fetchNextzenTile (tileKey) { 8 | const column = tileKey.column 9 | const row = tileKey.rowCount() - tileKey.row - 1 10 | const level = tileKey.level 11 | 12 | const url = `https://s3.amazonaws.com/elevation-tiles-prod/terrarium/${level}/${column}/${row}.png` 13 | 14 | return window.fetch(url) 15 | .then(res => { 16 | if (res.status !== 200) { 17 | throw new Error(`Unable to load tile ${url}`) 18 | } 19 | 20 | return res.arrayBuffer() 21 | }) 22 | .catch(err => { 23 | console.log(err) 24 | }) 25 | } 26 | -------------------------------------------------------------------------------- /example/src/fetch-sample-tile.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright © 2017-2019 HERE Europe B.V. 3 | * Licensed under Apache 2.0, see full license in LICENSE 4 | * SPDX-License-Identifier: Apache-2.0 5 | */ 6 | 7 | export default function fetchSampleTile (tileKey) { 8 | const column = tileKey.column 9 | const row = tileKey.rowCount() - tileKey.row - 1 10 | const level = tileKey.level 11 | 12 | const url = `https://mykolaharmash.github.io/grand-teton-tiles/tiles/${level}/${column}/${row}.terrain` 13 | 14 | return window.fetch(url) 15 | .then(res => { 16 | if (res.status !== 200) { 17 | throw new Error(`Unable to load tile ${url}`) 18 | } 19 | 20 | return res.arrayBuffer() 21 | }) 22 | .catch(err => { 23 | console.log(err) 24 | }) 25 | } 26 | -------------------------------------------------------------------------------- /example/src/fetch-float32-png-tile.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright © 2017-2019 HERE Europe B.V. 3 | * Licensed under Apache 2.0, see full license in LICENSE 4 | * SPDX-License-Identifier: Apache-2.0 5 | */ 6 | 7 | /** 8 | * Fetches tiles PNGa tiles with elevation encoded as float32 numbers. 9 | * Tiles are using webMercator tiling scheme 10 | * @param tileKey 11 | * @returns {Promise} 12 | */ 13 | export default function fetchFloat32PNGTile (tileKey) { 14 | const column = tileKey.column 15 | const row = tileKey.rowCount() - tileKey.row - 1 16 | const level = tileKey.level 17 | 18 | const url = `https://tile-server.concept.here.com/ned-sf/heights/${level}/${column}/${row}.png` 19 | 20 | return window.fetch(url) 21 | .then(res => { 22 | if (res.status !== 200) { 23 | throw new Error(`Unable to load tile ${url}`) 24 | } 25 | 26 | return res.arrayBuffer() 27 | }) 28 | .catch(err => { 29 | console.log(err) 30 | }) 31 | } 32 | -------------------------------------------------------------------------------- /example/src/fetch-cesium-tile.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright © 2017-2020 HERE Europe B.V. 3 | * Licensed under Apache 2.0, see full license in LICENSE 4 | * SPDX-License-Identifier: Apache-2.0 5 | */ 6 | 7 | export default function fetchCesiumWorldTerrainTile (tileKey, worldTerrainToken) { 8 | const column = tileKey.column 9 | const row = tileKey.row 10 | const level = tileKey.level - 1 11 | 12 | const url = `https://assets.cesium.com/1/${level}/${column}/${row}.terrain?extensions=octvertexnormals&v=1.1.0` 13 | const qmContentType = 'application/vnd.quantized-mesh,application/octet-stream;q=0.9' 14 | 15 | return window.fetch(url, { 16 | headers: { 17 | Accept: `${qmContentType};access_token=${worldTerrainToken};` 18 | } 19 | }) 20 | .then(res => { 21 | if (res.status !== 200) { 22 | throw new Error(`Unable to load tile ${url}`) 23 | } 24 | 25 | return res.arrayBuffer() 26 | }) 27 | .catch(err => { 28 | console.log(err) 29 | }) 30 | } 31 | -------------------------------------------------------------------------------- /example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@here/harp-terrain-datasource-example", 3 | "version": "0.0.3", 4 | "description": "", 5 | "main": "./src/app.js", 6 | "scripts": { 7 | "start": "webpack-dev-server -d", 8 | "build": "webpack -p" 9 | }, 10 | "keywords": [], 11 | "author": { 12 | "name": "HERE Europe B.V.", 13 | "url": "https://here.com" 14 | }, 15 | "repository": { 16 | "type": "git", 17 | "url": "git://github.com:heremaps/harp-terrain-datasource.git" 18 | }, 19 | "license": "Apache-2.0", 20 | "devDependencies": { 21 | "copy-webpack-plugin": "^4.5.2", 22 | "webpack": "^4.28.3", 23 | "webpack-cli": "^3.3.0", 24 | "webpack-dev-server": "^3.10.3" 25 | }, 26 | "dependencies": { 27 | "@here/harp-geoutils": "^0.3.1", 28 | "@here/harp-map-controls": "^0.2.1", 29 | "@here/harp-mapview": "^0.8.1", 30 | "@here/harp-terrain-datasource": "github:heremaps/harp-terrain-datasource", 31 | "dat.gui": "^0.7.2", 32 | "three": "^0.102.0" 33 | }, 34 | "publishConfig": { 35 | "access": "public" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/shaders/vertex.glsl.js: -------------------------------------------------------------------------------- 1 | // Copyright © 2017-2019 HERE Europe B.V. 2 | // Licensed under Apache 2.0, see full license in LICENSE 3 | // SPDX-License-Identifier: Apache-2.0 4 | 5 | const vertexShader = () => ` 6 | varying float vAltitude; 7 | varying vec3 vNormal; 8 | varying vec2 vUv; 9 | 10 | attribute vec2 octNormal; 11 | 12 | uniform bool useOctNormal; 13 | 14 | #include 15 | 16 | vec2 signNotZero(vec2 v) { 17 | return vec2((v.x >= 0.0) ? +1.0 : -1.0, (v.y >= 0.0) ? +1.0 : -1.0); 18 | } 19 | 20 | vec3 oct_to_float32x3(vec2 e) { 21 | vec3 v = vec3(e.xy, 1.0 - abs(e.x) - abs(e.y)); 22 | if (v.z < 0.0) { 23 | v.xy = (1.0 - abs(v.yx)) * signNotZero(v.xy); 24 | } 25 | return normalize(v); 26 | } 27 | 28 | vec2 snorm_to_float32x2(vec2 s) { 29 | vec2 v = ((s / 255.0) * 2.0) - 1.0; 30 | return v; 31 | } 32 | 33 | void main() { 34 | vAltitude = position[2]; // z value 35 | 36 | if (useOctNormal) { 37 | vec2 floatOctNormal = snorm_to_float32x2(octNormal); 38 | vec3 decNormal = oct_to_float32x3(floatOctNormal); 39 | vNormal = decNormal; 40 | } else { 41 | vNormal = normal; 42 | } 43 | 44 | vUv = uv; 45 | gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); 46 | 47 | #include 48 | #include 49 | #include 50 | } 51 | ` 52 | 53 | export default vertexShader 54 | -------------------------------------------------------------------------------- /src/index.d.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright © 2017-2019 HERE Europe B.V. 3 | * Licensed under Apache 2.0, see full license in LICENSE 4 | * SPDX-License-Identifier: Apache-2.0 5 | */ 6 | 7 | import { 8 | TileKey, 9 | TilingScheme 10 | } from '@here/geoutils' 11 | import { DecodedTile } from '@here/datasource-protocol' 12 | import { Tile } from '@here/mapview' 13 | import { Material } from 'three' 14 | import { PNG_TILE_DECODER_ID } from './png/tile-decoder' 15 | import { QUANTIZED_MESH_TILE_DECODER_ID } from './quantized-mesh/tile-decoder' 16 | 17 | export type TileDecodeId = PNG_TILE_DECODER_ID | QUANTIZED_MESH_TILE_DECODER_ID; 18 | 19 | export type DEMEncodingType = 'float32' | 'terrarium'; 20 | 21 | export interface PNGDecoderOptions { 22 | widthSegments?: number; 23 | heightSegments?: number; 24 | demEncoding?: DEMEncodingType; 25 | } 26 | 27 | export interface QuantizedMeshDecoderOptions {} 28 | 29 | export interface TerrainDataSourceOptions { 30 | concurrentDecoderServiceName: TileDecodeId; 31 | concurrentDecoderScriptUrl: string; 32 | tilingScheme: TilingScheme; 33 | fetchTile: (tileKey: TileKey) => Promise; 34 | getTileMaterial?: (mapTile: Tile, decodedTile: DecodedTile) => Material; 35 | decoderOptions?: PNGDecoderOptions | QuantizedMeshDecoderOptions; 36 | getCustomObjects?: (terrainTile: TerrainTile) => Promise | void; 37 | } 38 | 39 | export class TerrainDataSource { 40 | constructor(options: TerrainDataSourceOptions); 41 | connect(): Promise; 42 | ready(): boolean; 43 | shouldPreloadTiles(): boolean; 44 | } 45 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@here/harp-terrain-datasource", 3 | "version": "0.7.2", 4 | "description": "Datasource to render terrain data in quantized-mesh and terrarium formats with harp.gl", 5 | "main": "src/index.js", 6 | "types": "src/index.d.ts", 7 | "scripts": { 8 | "test": "standard ./src/**/*.js ./example/src/**/*.js", 9 | "build-example": "cd example && yarn build", 10 | "deploy-example": "yarn build-example && gh-pages -d ./example -s '{dist/**,index.html}'" 11 | }, 12 | "author": { 13 | "name": "HERE Europe B.V.", 14 | "url": "https://here.com" 15 | }, 16 | "repository": { 17 | "type": "git", 18 | "url": "https://github.com/heremaps/harp-terrain-datasource.git" 19 | }, 20 | "files": [ 21 | "src", 22 | "README.md", 23 | "LICENSE" 24 | ], 25 | "keywords": [ 26 | "HERE", 27 | "HERE technologies", 28 | "Terrain", 29 | "3D Terrain", 30 | "Data Source", 31 | "harp.gl", 32 | "Quantized Mesh", 33 | "Terrarium" 34 | ], 35 | "license": "Apache-2.0", 36 | "dependencies": { 37 | "@here/harp-mapview": "^0.16.0", 38 | "@here/harp-mapview-decoder": "^0.16.0", 39 | "@here/quantized-mesh-decoder": "^1.2.0", 40 | "gh-pages": "^3.0.0", 41 | "upng-js": "^2.1.0" 42 | }, 43 | "peerDependencies": { 44 | "three": "^0.117.1" 45 | }, 46 | "devDependencies": { 47 | "@here/harp-datasource-protocol": "^0.16.0", 48 | "@here/harp-geoutils": "^0.16.0", 49 | "@types/three": "^0.103.2", 50 | "dotenv-safe": "^8.2.0", 51 | "standard": "^14.3.4", 52 | "three": "^0.117.1" 53 | }, 54 | "publishConfig": { 55 | "access": "public" 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /example/README.md: -------------------------------------------------------------------------------- 1 | # Harp.gl Terrain Datasource Example 2 | 3 | This module contains an example usage of the [Terrain Datasource](https://github.com/heremaps/harp-terrain-datasource) with multiple data providers. 4 | 5 | ## Data Providers 6 | 7 | * [Cesium World Terrain](https://cesium.com/content/cesium-world-terrain/) 8 | * [Grand Teton sample tiles](https://github.com/nik-garmash/grand-teton-tiles) generated using [TIN Terrain](https://github.com/heremaps/tin-terrain) 9 | * [Mapzen Terrain Tiles](https://mapzen.com/documentation/terrain-tiles/) 10 | 11 | ## HERE Credentials 12 | 13 | In order to use some of the HERE Services, such as Map Tile API, you would need to register 14 | and generate credentials. 15 | 16 | First, you need to become a [HERE Developer](https://www.here.xyz/getting-started/). 17 | 18 | For Map Tile API, in order to get Satellite Images, you need to generate a pair of `app_id` 19 | and `app_code`, that you can do directly from your Developer Dashboard, see a step-by-step guide 20 | [here](https://www.here.xyz/getting-started/). 21 | 22 | These credentials need to be passed to the Service in order to retrieve tiles, please see the 23 | examples to check how it is done. 24 | 25 | ## Cesium Credentials 26 | 27 | In order to use the Cesium services, you need a [Cesium ion](https://cesium.com/ion) token. It is used to fetch Cesium World Terrain tiles. 28 | 29 | ## Run The App 30 | 31 | ```bash 32 | APP_ID=… APP_CODE=… CESIUM_USER_ACCESS_TOKEN=… yarn start 33 | ``` 34 | 35 | * `APP_ID` and `APP_CODE` are the HERE Developer credentials. 36 | 37 | * `CESIUM_USER_ACCESS_TOKEN` is the Cesium credential. 38 | 39 | ## License 40 | 41 | See the [LICENSE](../LICENSE) file in the root of this project for license details about using `harp-terrain-datasource`. 42 | 43 | For other use cases not listed in the license terms, please [contact us](https://developer.here.com/contact-us). 44 | Copyright © 2017-2019 HERE Europe B.V. -------------------------------------------------------------------------------- /src/shaders/fragment.glsl.js: -------------------------------------------------------------------------------- 1 | // Copyright © 2017-2019 HERE Europe B.V. 2 | // Licensed under Apache 2.0, see full license in LICENSE 3 | // SPDX-License-Identifier: Apache-2.0 4 | 5 | const fragmentShader = vars => ` 6 | #define COLOR_STEPS_COUNT ${vars.COLOR_STEPS_COUNT} 7 | 8 | varying float vAltitude; 9 | varying vec2 vUv; 10 | varying vec3 vNormal; 11 | 12 | uniform vec3 colorSteps[COLOR_STEPS_COUNT]; 13 | uniform float altitudeSteps[COLOR_STEPS_COUNT]; 14 | 15 | uniform sampler2D texture; 16 | uniform int hasTexture; 17 | uniform float textureIntensity; 18 | uniform vec3 lightVector; 19 | uniform float opacity; 20 | 21 | #include 22 | 23 | void main() { 24 | vec3 altitudeColor; 25 | float lowestAltitude = altitudeSteps[0]; 26 | float highestAlttitude = altitudeSteps[COLOR_STEPS_COUNT - 1]; 27 | vec3 lowestAltitudeColor = colorSteps[0]; 28 | vec3 highestAltitudeColor = colorSteps[COLOR_STEPS_COUNT - 1]; 29 | 30 | if (vAltitude < lowestAltitude) { 31 | altitudeColor = lowestAltitudeColor; 32 | } 33 | 34 | if (vAltitude > highestAlttitude) { 35 | altitudeColor = highestAltitudeColor; 36 | } 37 | 38 | for(int i = 0; i < COLOR_STEPS_COUNT - 1; i++) { 39 | if (vAltitude > altitudeSteps[i] && vAltitude <= altitudeSteps[i + 1]) { 40 | altitudeColor = mix( 41 | colorSteps[i], 42 | colorSteps[i + 1], 43 | (vAltitude - altitudeSteps[i]) / (altitudeSteps[i + 1] - altitudeSteps[i]) 44 | ); 45 | } 46 | } 47 | 48 | if (hasTexture == 1) { 49 | vec4 texColor = texture2D(texture, vUv); 50 | 51 | gl_FragColor = vec4(mix(altitudeColor.xyz, texColor.xyz, textureIntensity), 1.0); 52 | } else { 53 | vec3 color = altitudeColor * clamp(dot(vNormal, normalize(lightVector)), 0.3, 1.0); 54 | 55 | gl_FragColor = vec4(color, opacity); 56 | } 57 | 58 | #include 59 | } 60 | ` 61 | 62 | export default fragmentShader 63 | -------------------------------------------------------------------------------- /example/src/attribution-ui.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright © 2017-2019 HERE Europe B.V. 3 | * Licensed under Apache 2.0, see full license in LICENSE 4 | * SPDX-License-Identifier: Apache-2.0 5 | */ 6 | 7 | import { datasetList } from './constants' 8 | 9 | const state = { 10 | currentDataset: datasetList[0], 11 | isAttributionPopupVisible: false 12 | } 13 | 14 | const attributionTrigger = document.querySelector('.attribution-trigger') 15 | const attributionPopup = document.querySelector('.attribution-popup') 16 | const cesiumAttribution = document.querySelector('.cesium-attribution') 17 | // const nextzenAttribution = document.querySelector('.nextzen-attribution') 18 | const sampleAttribution = document.querySelector('.sample-attribution') 19 | const cesiumIonLogo = document.querySelector('.cesium-ion-logo') 20 | 21 | attributionTrigger.addEventListener('click', onAttributionTriggerClick) 22 | window.addEventListener('message', onWindowMessage) 23 | 24 | updateUi(state) 25 | 26 | function onAttributionTriggerClick () { 27 | state.isAttributionPopupVisible = !state.isAttributionPopupVisible 28 | 29 | updateUi(state) 30 | } 31 | 32 | function onWindowMessage (event) { 33 | if (typeof event.data !== 'object' || event.data.type !== 'dataset-change') { 34 | return 35 | } 36 | 37 | state.currentDataset = event.data.dataset 38 | updateUi(state) 39 | } 40 | 41 | function updateUi (state) { 42 | attributionTrigger.classList.toggle('active', state.isAttributionPopupVisible) 43 | attributionPopup.style.display = state.isAttributionPopupVisible ? 'block' : 'none' 44 | sampleAttribution.style.display = state.currentDataset === datasetList[0] ? 'block' : 'none' 45 | cesiumAttribution.style.display = state.currentDataset === datasetList[1] ? 'block' : 'none' 46 | // nextzenAttribution.style.display = state.currentDataset === datasetList[2] ? 'block' : 'none' 47 | 48 | cesiumIonLogo.style.display = state.currentDataset === datasetList[1] ? 'block' : 'none' 49 | } 50 | -------------------------------------------------------------------------------- /example/webpack.config.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright © 2017-2019 HERE Europe B.V. 3 | * Licensed under Apache 2.0, see full license in LICENSE 4 | * SPDX-License-Identifier: Apache-2.0 5 | */ 6 | 7 | require('dotenv-safe').config() 8 | 9 | const path = require('path') 10 | const webpack = require('webpack') 11 | const CopyWebpackPlugin = require('copy-webpack-plugin') 12 | 13 | module.exports = [ 14 | { 15 | target: 'webworker', 16 | entry: './src/quantized-mesh-decoder-worker.js', 17 | output: { 18 | path: path.resolve(__dirname, 'dist'), 19 | filename: 'quantized-mesh-decoder.bundle.js' 20 | }, 21 | devServer: { 22 | contentBase: path.join(__dirname, './'), 23 | publicPath: '/dist/' 24 | }, 25 | externals: { 26 | three: 'THREE' 27 | }, 28 | devtool: 'source-map' 29 | }, 30 | { 31 | target: 'webworker', 32 | entry: './src/png-decoder-worker.js', 33 | output: { 34 | path: path.resolve(__dirname, 'dist'), 35 | filename: 'png-decoder.bundle.js' 36 | }, 37 | devServer: { 38 | contentBase: path.join(__dirname, './'), 39 | publicPath: '/dist/' 40 | }, 41 | devtool: 'source-map' 42 | }, 43 | { 44 | devServer: { 45 | contentBase: path.join(__dirname, './'), 46 | publicPath: '/dist/' 47 | }, 48 | devtool: 'source-map', 49 | entry: './src/app.js', 50 | externals: { 51 | three: 'THREE' 52 | }, 53 | output: { 54 | path: path.resolve(__dirname, 'dist'), 55 | filename: 'app.bundle.js' 56 | }, 57 | plugins: [ 58 | new CopyWebpackPlugin([ 59 | { from: './node_modules/three', to: './three' } 60 | ]), 61 | new webpack.DefinePlugin({ 62 | 'process.env.APP_ID': JSON.stringify(process.env.APP_ID), 63 | 'process.env.APP_CODE': JSON.stringify(process.env.APP_CODE), 64 | 'process.env.CESIUM_USER_ACCESS_TOKEN': JSON.stringify(process.env.CESIUM_USER_ACCESS_TOKEN) 65 | }) 66 | ] 67 | } 68 | ] 69 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright © 2017-2019 HERE Europe B.V. 3 | * Licensed under Apache 2.0, see full license in LICENSE 4 | * SPDX-License-Identifier: Apache-2.0 5 | */ 6 | 7 | import { TileDataSource } from '@here/harp-mapview-decoder' 8 | 9 | import { TerrainTileFactory } from './terrain-tile' 10 | import { TerrainDataProvider } from './terrain-data-provider' 11 | 12 | export class TerrainDataSource extends TileDataSource { 13 | constructor (options) { 14 | if (options.tilingScheme === undefined) { 15 | throw new Error('No "tilingScheme" option provided.') 16 | } 17 | 18 | if (options.concurrentDecoderServiceName === undefined) { 19 | throw new Error( 20 | 'No "concurrentDecoderServiceName" option provided. ' + 21 | 'It should be an ID of one of the supported decoders.' 22 | ) 23 | } 24 | 25 | if (options.concurrentDecoderScriptUrl === undefined) { 26 | throw new Error( 27 | 'No "concurrentDecoderScriptUrl" option provided. ' + 28 | 'It should be URL of a decoder worker used to decode tiles.' 29 | ) 30 | } 31 | 32 | const tileFactory = new TerrainTileFactory( 33 | options 34 | ) 35 | 36 | super(tileFactory, { 37 | id: 'terrain', 38 | tilingScheme: options.tilingScheme, 39 | dataProvider: new TerrainDataProvider(options.fetchTile), 40 | useWorker: true, 41 | concurrentDecoderServiceName: options.concurrentDecoderServiceName, 42 | concurrentDecoderScriptUrl: options.concurrentDecoderScriptUrl 43 | }) 44 | 45 | this.options = options 46 | 47 | if (options.decoderOptions !== undefined) { 48 | this.decoder.connect().then(() => { 49 | this.decoder.configure(options.decoderOptions) 50 | }) 51 | } 52 | } 53 | 54 | connect () { 55 | return this.decoder.connect() 56 | } 57 | 58 | ready () { 59 | return true 60 | } 61 | 62 | shouldPreloadTiles () { 63 | return true 64 | } 65 | 66 | getDisplayZoomLevel (level) { 67 | if (this.options.getDisplayZoomLevel !== undefined) { 68 | return this.options.getDisplayZoomLevel(level) 69 | } 70 | 71 | return level 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/elevation-styling.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright © 2017-2019 HERE Europe B.V. 3 | * Licensed under Apache 2.0, see full license in LICENSE 4 | * SPDX-License-Identifier: Apache-2.0 5 | */ 6 | 7 | import * as THREE from 'three' 8 | 9 | import vertexShader from './shaders/vertex.glsl' 10 | import fragmentShader from './shaders/fragment.glsl' 11 | 12 | const stylingOptionsDefaults = { 13 | colorSteps: [ 14 | { 15 | color: new THREE.Vector3(0, 0, 0), 16 | altitude: -300 17 | }, 18 | { 19 | color: new THREE.Vector3(1, 1, 1), 20 | altitude: 8848 21 | } 22 | ], 23 | texture: null, 24 | textureIntensity: 0.4, 25 | lightVector: new THREE.Vector3(1.0, 0.0, 0.5), 26 | opacity: 1 27 | } 28 | 29 | export class ElevationMaterial extends THREE.ShaderMaterial { 30 | constructor (decodedTile, stylingOptions) { 31 | const options = Object.assign({}, stylingOptionsDefaults, stylingOptions) 32 | const sortedColorSteps = options.colorSteps.slice().sort((a, b) => a.altitude >= b.altitude) 33 | const colors = sortedColorSteps.map(item => item.color) 34 | const altitudes = sortedColorSteps.map(item => item.altitude) 35 | 36 | const uniforms = THREE.UniformsUtils.merge([ 37 | { 38 | useOctNormal: { value: ElevationMaterial.containsOctNormals(decodedTile) }, 39 | colorSteps: { value: colors }, 40 | altitudeSteps: { value: altitudes }, 41 | textureIntensity: { value: options.textureIntensity }, 42 | hasTexture: { value: options.texture === null ? 0 : 1 }, 43 | texture: { value: options.texture }, 44 | lightVector: { value: options.lightVector }, 45 | opacity: { value: options.opacity } 46 | }, 47 | THREE.UniformsLib.fog 48 | ]) 49 | 50 | super({ 51 | vertexShader: vertexShader(), 52 | fragmentShader: fragmentShader({ 53 | COLOR_STEPS_COUNT: sortedColorSteps.length 54 | }), 55 | uniforms 56 | }) 57 | } 58 | 59 | static containsOctNormals (decodedTile) { 60 | const geometry = decodedTile.geometries[0] 61 | return geometry.vertexAttributes.find(this.isOctNormalAttribute) !== undefined 62 | } 63 | 64 | static isOctNormalAttribute (attribute) { 65 | return attribute.name === 'octNormal' 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # harp.gl Terrain Datasource 2 | 3 | [![Build Status](https://travis-ci.com/heremaps/harp-terrain-datasource.svg?token=XqJjRxFbW25Pc73LNRB9&branch=master)](https://travis-ci.com/heremaps/harp-terrain-datasource) 4 | 5 | The `harp.gl` Terrain Datasource is a module of [harp.gl](https://github.com/heremaps/harp.gl) to render terrain data encoded using [Quantized Mesh](https://github.com/AnalyticalGraphicsInc/quantized-mesh) or [Mapzen Terrarium](https://mapzen.com/documentation/terrain-tiles/formats/#terrarium). 6 | 7 | The image below contains terrain with partially overlaid wireframe. 8 | 9 | ![Terrain with partially overlaid wireframe](./harp-terrain-datasource.png) 10 | 11 | ## About This Repository 12 | 13 | This repository is organized in a `yarn workspace`. 14 | 15 | ## Installation 16 | 17 | ### In Node.js 18 | 19 | The module is installable via yarn (or npm): 20 | 21 | ```sh 22 | yarn add @here/harp-terrain-datasource 23 | ``` 24 | 25 | ```sh 26 | npm install @here/harp-terrain-datasource 27 | ``` 28 | 29 | ## Development 30 | 31 | ### Prerequisites 32 | 33 | - **Node.js** - Please see [nodejs.org](https://nodejs.org/) for installation instructions 34 | - **Yarn** - Please see [yarnpkg.com](https://yarnpkg.com/en/) for installation instructions. 35 | 36 | ### Download dependencies 37 | 38 | Run: 39 | 40 | ```sh 41 | yarn install 42 | ``` 43 | 44 | to download and install all required packages and set up the yarn workspace. 45 | 46 | ### Example Application 47 | 48 | The [./example](./example) folder contains source code of [the demo application](https://heremaps.github.io/harp-terrain-datasource/) of harp.gl with Terrain Datasource. See [example's README](./example/README.md). 49 | 50 | If you want to learn more about the applications you can create, please check the [Getting Started Guide](docs/GettingStartedGuide.md). 51 | 52 | ### See Also 53 | 54 | * [API Reference](docs/APIReference.md). Introduction to our API. 55 | 56 | * [harp.gl](https://github.com/heremaps/harp.gl). 3D map rendering engine based on three.js. 57 | 58 | * [TIN Terrain](https://github.com/heremaps/tin-terrain). CLI tool to generate quantized mesh and OBJ tiles out of raster data. 59 | 60 | * [Quantized Mesh Viewer](https://github.com/heremaps/quantized-mesh-viewer). Tool for debuging quantized mesh tiles. 61 | 62 | * [Quantized Mesh Decoder](https://github.com/heremaps/quantized-mesh-decoder). JavaScript implementation of quantized mesh format decoding. 63 | 64 | ## License 65 | 66 | Copyright © 2017-2020 HERE Europe B.V. 67 | 68 | See the [LICENSE](./LICENSE) file in the root of this project for license details about using `harp-terrain-datasource`. 69 | 70 | For other use cases not listed in the license terms, please [contact us](https://developer.here.com/contact-us). 71 | -------------------------------------------------------------------------------- /example/src/get-tile-material.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright © 2017-2019 HERE Europe B.V. 3 | * Licensed under Apache 2.0, see full license in LICENSE 4 | * SPDX-License-Identifier: Apache-2.0 5 | */ 6 | 7 | import * as THREE from 'three' 8 | import { mercatorTilingScheme } from '@here/harp-geoutils' 9 | import { ElevationMaterial } from '@here/harp-terrain-datasource/src/terrain-tile' 10 | 11 | import config from './config' 12 | import { 13 | datasetList, 14 | stylesList 15 | } from './constants' 16 | 17 | const textureLoader = new THREE.TextureLoader() 18 | textureLoader.crossOrigin = '' 19 | 20 | function getTileTextureUrl (tile) { 21 | const textureTileKey = mercatorTilingScheme.getTileKey(tile.geoBox.center, tile.tileKey.level) 22 | const shard = Math.round(Math.random() * 3) + 1 23 | 24 | return `https://${shard}.aerial.maps.api.here.com/maptile/2.1/basetile/newest/satellite.day/${textureTileKey.level}/${textureTileKey.column}/${textureTileKey.rowCount() - textureTileKey.row - 1}/512/png?app_id=${config.APP_ID}&app_code=${config.APP_CODE}` 25 | } 26 | 27 | function fetchTileTexture (tile) { 28 | const textureUrl = getTileTextureUrl(tile) 29 | 30 | return new Promise((resolve, reject) => { 31 | textureLoader.load(textureUrl, resolve, undefined, reject) 32 | }) 33 | } 34 | 35 | const defaultColorSteps = [ 36 | { 37 | color: new THREE.Vector3(0.670588235, 0.850980392, 0.91372549), 38 | altitude: 700 39 | }, 40 | { 41 | color: new THREE.Vector3(0.109803922, 0.564705882, 0.6), 42 | altitude: 1500 43 | }, 44 | { 45 | color: new THREE.Vector3(0.403921569, 0.662745098, 0.811764706), 46 | altitude: 2000 47 | }, 48 | { 49 | color: new THREE.Vector3(0.741176471, 0.788235294, 0.882352941), 50 | altitude: 2800 51 | }, 52 | { 53 | color: new THREE.Vector3(1, 1, 1), 54 | altitude: 3000 55 | } 56 | ] 57 | 58 | const defaultLighting = new THREE.Vector3(0.7, 0, 0.5) 59 | const cesiumLighting = new THREE.Vector3(0, -1, 0) 60 | 61 | export default function getTileMaterial (mapTile, decodedTile, options) { 62 | switch (options.style) { 63 | // Elevation Styling 64 | case stylesList[0]: { 65 | return Promise.resolve(new ElevationMaterial( 66 | decodedTile, 67 | { 68 | colorSteps: defaultColorSteps, 69 | lightVector: options.dataset === datasetList[1] 70 | ? cesiumLighting 71 | : defaultLighting 72 | } 73 | )) 74 | } 75 | 76 | // Texture 77 | case stylesList[1]: { 78 | return fetchTileTexture(mapTile).then((texture) => { 79 | texture.minFilter = THREE.LinearFilter 80 | texture.magFilter = THREE.LinearFilter 81 | texture.generateMipmaps = false 82 | texture.wrapS = texture.wrapT = THREE.ClampToEdgeWrapping 83 | 84 | return new THREE.MeshBasicMaterial({ 85 | map: texture 86 | }) 87 | }) 88 | } 89 | 90 | // Wireframe 91 | case stylesList[2]: { 92 | return Promise.resolve(new THREE.MeshBasicMaterial({ 93 | color: 0x000000, 94 | wireframe: true 95 | })) 96 | } 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /src/quantized-mesh/tile-decoder.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright © 2017-2020 HERE Europe B.V. 3 | * Licensed under Apache 2.0, see full license in LICENSE 4 | * SPDX-License-Identifier: Apache-2.0 5 | */ 6 | 7 | import decode from '@here/quantized-mesh-decoder' 8 | 9 | export const QUANTIZED_MESH_TILE_DECODER_ID = 'quantized-mesh-tile-decoder' 10 | 11 | export class QuantizedMeshTileDecoder { 12 | connect () { 13 | return Promise.resolve() 14 | } 15 | 16 | /** 17 | * Rearranges vertices components in more THREE.js-friendly 18 | * way [x, y, z, x, y, z, ...] instead of 19 | * [x, x, x,..., y, y, y,... z, z, z, ...]. 20 | * 21 | * Also, scales x, y, z to be in [0, 1] range. 22 | * 23 | * @param {Uint16Array} vertexData 24 | * @returns {Float32Array} 25 | */ 26 | constructPositionArray (vertexData) { 27 | const elementsPerVertex = 3 28 | const vertexCount = vertexData.length / 3 29 | const positionAttributeArray = new Float32Array(vertexData.length) 30 | 31 | const vertexMaxPosition = 32767 32 | 33 | for (let i = 0; i < vertexCount; i++) { 34 | positionAttributeArray[i * elementsPerVertex] = vertexData[i] / vertexMaxPosition 35 | positionAttributeArray[i * elementsPerVertex + 1] = vertexData[i + vertexCount] / vertexMaxPosition 36 | positionAttributeArray[i * elementsPerVertex + 2] = vertexData[i + vertexCount * 2] / vertexMaxPosition 37 | } 38 | 39 | return positionAttributeArray 40 | } 41 | 42 | /** 43 | * Drops z-coordinate of each vertex to make a UV-map. 44 | * 45 | * @param {Float32Array} positionArray 46 | * @returns {Float32Array} 47 | */ 48 | constructUvArray (positionArray) { 49 | return positionArray.filter((item, index) => index % 3 < 2) 50 | } 51 | 52 | decodeTile (data) { 53 | const decodedTile = decode(data) 54 | const positionArray = this.constructPositionArray(decodedTile.vertexData) 55 | const uvArray = this.constructUvArray(positionArray) 56 | const vertexAttributes = [] 57 | 58 | vertexAttributes.push( 59 | { 60 | name: 'position', 61 | type: 'float', 62 | buffer: positionArray, 63 | itemCount: 3, 64 | metadata: decodedTile.header 65 | }, 66 | { 67 | name: 'uv', 68 | type: 'float', 69 | buffer: uvArray, 70 | itemCount: 2 71 | } 72 | ) 73 | 74 | Object.keys(decodedTile.extensions).forEach(key => { 75 | if (key === 'vertexNormals' && decodedTile.extensions[key].byteLength > 0) { 76 | const array = new Uint8Array(decodedTile.extensions[key]) 77 | vertexAttributes.push({ 78 | name: 'octNormal', 79 | type: 'float', 80 | buffer: array, 81 | itemCount: 2 82 | }) 83 | } 84 | }) 85 | 86 | const verityTile = { 87 | techniques: [], 88 | geometries: [ 89 | { 90 | index: { 91 | name: 'index', 92 | type: 'uint16', 93 | buffer: decodedTile.triangleIndices, 94 | itemCount: 1 95 | }, 96 | vertexAttributes 97 | } 98 | ] 99 | } 100 | 101 | return Promise.resolve(verityTile) 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /docs/APIReference.md: -------------------------------------------------------------------------------- 1 | # API Reference 2 | 3 | ```javascript 4 | import { TerrainDataSource } from '@here/harp-terrain-datasource' 5 | 6 | new TerrainDataSource(TerrainDataSourceOptions) 7 | ``` 8 | 9 | ##### TerrainDataSourceOptions 10 | 11 | - `concurrentDecoderScriptUrl`: string 12 | URL from which to fetch decoder worker script. See [Getting Started Guide](./GettingStartedGuide.md) on how to setup worker. 13 | - `concurrentDecoderServiceName`: string 14 | Arbitrary string to identify the decoder. 15 | - `fetchTile`: (tileKey: [TileKey](https://heremaps.github.io/harp.gl/doc/classes/_here_harp_geoutils.tilekey.html)) → Promise 16 | Fetches a tile using provided tileKey. 17 | - `tilingScheme`: [TilingScheme](https://heremaps.github.io/harp.gl/doc/classes/_here_harp_geoutils.tilingscheme.html) 18 | Tiling scheme used by the data source. See [predefined tiling schemes](https://github.com/heremaps/harp.gl/tree/master/%40here/harp-geoutils/lib/tiling) by harp.gl. 19 | - `getTileMaterial?`: (tile: [Tile](https://heremaps.github.io/harp.gl/doc/classes/_here_harp_mapview.tile.html), decodedTile: [DecodedTile](https://heremaps.github.io/harp.gl/doc/interfaces/_here_harp_datasource_protocol.decodedtile.html)) → Promise<[THREE.Material](https://threejs.org/docs/index.html#api/materials/Material)\> 20 | Constructs material of a tile. Can be used also to fetch texture using the tile key. 21 | Default: [ElevationMaterial](#elevation-material) 22 | - `decoderOptions?`: [PNGDecoderOptions](#PNGDecoderOptions) 23 | - `getDisplayZoomLevel?`: (level: number) → number 24 | Generates custom zoom level for the data source depending on map's zoom. 25 | - `getCustomObjects?`:(terrainTile: [TerrainTile](https://github.com/heremaps/harp-terrain-datasource/blob/master/src/terrain-tile.js)) → Promise | void 26 | Allows you to add custom objects on top of the terrain. 27 | 28 | ##### PNGDecoderOptions 29 | 30 | * `widthSegments?`: number 31 | Amount of width segments of [Plane Buffer Geometry](https://threejs.org/docs/index.html#api/geometries/PlaneBufferGeometry) which will be created for each tile. 32 | Default: 63 33 | * `heightSegments?`: number 34 | Default: 63 35 | 36 | ### Elevation Material 37 | 38 | Terrain Datasource comes with three.js material for elevation based styling. You can specify different colors for different altitudes. 39 | 40 | ```js 41 | import { ElevationMaterial } from '@here/harp-terrain-datasource/src/terrain-tile' 42 | 43 | new ElevationMaterial(ElevationMaterialOptions) 44 | ``` 45 | 46 | ##### ElevationMaterialOptions 47 | 48 | * `colorStreps`: [[ColorStep](#colorstep)] 49 | Defines how colors specific altitudes of your terrain. 50 | * `texture?`: [THREE.Texture](https://threejs.org/docs/index.html#api/en/textures/Texture) 51 | * `textureIntensity?`: number 52 | Defines how to mix texture color (if present) and elevation based color. Ratio in the [0, 1] range, 1 means only texture color, 0 — only elevation based color. 53 | * `lightVector?`: [THREE.Vector3](https://threejs.org/docs/index.html#api/en/math/Vector3) 54 | Direction of the light, used to shade the terrain. 55 | Default: `new THREE.Vector3(1.0, 0.0, 0.5)` 56 | 57 | ##### ColorStep 58 | 59 | * `altitude`: number 60 | Altitude where to apply color. 61 | * `color`: [THREE.Vector3](https://threejs.org/docs/index.html#api/en/math/Vector3) 62 | Color of the specified altitude. Defined as a vector with RGB components. 63 | 64 | See also TypeScript typings in [../src/index.d.ts](../src/index.d.ts) -------------------------------------------------------------------------------- /example/src/app.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright © 2017-2020 HERE Europe B.V. 3 | * Licensed under Apache 2.0, see full license in LICENSE 4 | * SPDX-License-Identifier: Apache-2.0 5 | */ 6 | 7 | import * as dat from 'dat.gui' 8 | import * as THREE from 'three' 9 | import { MapView } from '@here/harp-mapview' 10 | import { 11 | GeoCoordinates, 12 | hereTilingScheme, /* 13 | mercatorTilingScheme, */ 14 | webMercatorTilingScheme 15 | } from '@here/harp-geoutils' 16 | import { MapControls } from '@here/harp-map-controls' 17 | import { TerrainDataSource } from '@here/harp-terrain-datasource' 18 | import { QUANTIZED_MESH_TILE_DECODER_ID } from '@here/harp-terrain-datasource/src/quantized-mesh/tile-decoder' 19 | /* import { 20 | PNG_TILE_DECODER_ID, 21 | DEM_ENCODINGS 22 | } from '@here/harp-terrain-datasource/src/png/tile-decoder' */ 23 | 24 | import config from './config' 25 | import { 26 | datasetList, 27 | stylesList 28 | } from './constants' 29 | import fetchCesiumWorldTerrainTile from './fetch-cesium-tile' 30 | import fetchSampleTile from './fetch-sample-tile' 31 | import getTileMaterial from './get-tile-material' 32 | // import fetchNextzenTile from './fetch-nextzen-tile' 33 | import './attribution-ui' 34 | 35 | const QUANTIZED_MESH_DECODER_URL = './dist/quantized-mesh-decoder.bundle.js' 36 | // const PNG_DECODER_URL = './dist/png-decoder.bundle.js' 37 | 38 | function fetchWorldTerrainToken () { 39 | const url = `https://api.cesium.com/v1/assets/1/endpoint?access_token=${config.CESIUM_USER_ACCESS_TOKEN}` 40 | 41 | return window.fetch(url) 42 | .then(res => res.json()) 43 | .then(endpoint => endpoint.accessToken) 44 | .catch(err => console.log(err)) 45 | } 46 | 47 | function initializeMapView (canvas) { 48 | const mapView = new MapView({ 49 | minZoomLevel: 8, 50 | maxZoomLevel: 14, 51 | canvas, 52 | maxVisibleDataSourceTiles: 300, 53 | tileCacheSize: 1000 54 | }) 55 | 56 | /* eslint-disable no-new */ 57 | new MapControls(mapView) 58 | /* eslint-enable no-new */ 59 | 60 | mapView.resize(window.innerWidth, window.innerHeight) 61 | 62 | mapView.zoomLevelBias = 0.5 63 | 64 | window.addEventListener('resize', () => { 65 | mapView.resize(window.innerWidth, window.innerHeight) 66 | }) 67 | 68 | return mapView 69 | } 70 | 71 | function createCesiumWorldTerrainDataSource (worldTerrainToken, options) { 72 | return new TerrainDataSource({ 73 | concurrentDecoderServiceName: QUANTIZED_MESH_TILE_DECODER_ID, 74 | concurrentDecoderScriptUrl: QUANTIZED_MESH_DECODER_URL, 75 | tilingScheme: hereTilingScheme, 76 | fetchTile: (tileKey) => fetchCesiumWorldTerrainTile(tileKey, worldTerrainToken), 77 | getTileMaterial: (mapTile, decodedTile) => getTileMaterial(mapTile, decodedTile, options) 78 | }) 79 | } 80 | 81 | function createSampleTilesDataSource (options) { 82 | return new TerrainDataSource({ 83 | concurrentDecoderServiceName: QUANTIZED_MESH_TILE_DECODER_ID, 84 | concurrentDecoderScriptUrl: QUANTIZED_MESH_DECODER_URL, 85 | tilingScheme: webMercatorTilingScheme, 86 | fetchTile: (tileKey) => fetchSampleTile(tileKey), 87 | getTileMaterial: (mapTile, decodedTile) => getTileMaterial(mapTile, decodedTile, options), 88 | getDisplayZoomLevel: level => { 89 | return THREE.Math.clamp(level + 2, 8, 14) 90 | } 91 | }) 92 | } 93 | 94 | /* function createPNGDataSource (options, decoderOptions) { 95 | return new TerrainDataSource({ 96 | concurrentDecoderServiceName: PNG_TILE_DECODER_ID, 97 | concurrentDecoderScriptUrl: PNG_DECODER_URL, 98 | tilingScheme: mercatorTilingScheme, 99 | fetchTile: fetchNextzenTile, 100 | getTileMaterial: (mapTile, decodedTile) => getTileMaterial(mapTile, decodedTile, options), 101 | decoderOptions 102 | }) 103 | } */ 104 | 105 | fetchWorldTerrainToken().then(worldTerrainToken => { 106 | const uiOptions = { 107 | dataset: datasetList[0], 108 | style: stylesList[0] 109 | } 110 | const mapView = initializeMapView(document.getElementById('map')) 111 | 112 | const cesiumWorldTerrainDataSource = createCesiumWorldTerrainDataSource(worldTerrainToken, uiOptions) 113 | const sampleDataSource = createSampleTilesDataSource(uiOptions) 114 | /* const nextzenDataSource = createPNGDataSource(uiOptions, { 115 | widthSegments: 63, 116 | heightSegments: 63, 117 | demEncoding: DEM_ENCODINGS.terrarium 118 | }) */ 119 | 120 | mapView.addDataSource(cesiumWorldTerrainDataSource) 121 | mapView.addDataSource(sampleDataSource) 122 | // mapView.addDataSource(nextzenDataSource) 123 | 124 | sampleDataSource.enabled = uiOptions.dataset === datasetList[0] 125 | cesiumWorldTerrainDataSource.enabled = uiOptions.dataset === datasetList[1] 126 | // nextzenDataSource.enabled = uiOptions.dataset === datasetList[2] 127 | 128 | mapView.setCameraGeolocationAndZoom( 129 | new GeoCoordinates(43.751997519592596, -110.73214288570348), 130 | 12 131 | ) 132 | mapView.camera.rotateX(THREE.Math.degToRad(35)) 133 | 134 | const gui = new dat.GUI({ width: 300 }) 135 | const datasetController = gui.add(uiOptions, 'dataset', datasetList) 136 | const styleController = gui.add(uiOptions, 'style', stylesList) 137 | 138 | function updateTiles () { 139 | mapView.clearTileCache() 140 | mapView.update() 141 | } 142 | 143 | datasetController.onChange(dataset => { 144 | sampleDataSource.enabled = dataset === datasetList[0] 145 | cesiumWorldTerrainDataSource.enabled = dataset === datasetList[1] 146 | // nextzenDataSource.enabled = dataset === datasetList[2] 147 | 148 | styleController.setValue(stylesList[0]) 149 | styleController.updateDisplay() 150 | 151 | // Disable texture style for Cesium World Terrain tiles for now 152 | // as we have only texture tiles in mercator tiling 153 | // scheme and Cesium tiles are using Equirectangular. 154 | styleController 155 | .domElement 156 | .querySelectorAll('option[value*=Texture]') 157 | .forEach(option => { option.disabled = dataset === datasetList[1] }) 158 | 159 | updateTiles() 160 | window.postMessage({ type: 'dataset-change', dataset }, '*') 161 | }) 162 | styleController.onChange(updateTiles) 163 | }) 164 | -------------------------------------------------------------------------------- /src/terrain-tile.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright © 2017-2019 HERE Europe B.V. 3 | * Licensed under Apache 2.0, see full license in LICENSE 4 | * SPDX-License-Identifier: Apache-2.0 5 | */ 6 | 7 | import * as THREE from 'three' 8 | 9 | import { ElevationMaterial } from './elevation-styling' 10 | import { Tile } from '@here/harp-mapview' 11 | import { TileFactory } from '@here/harp-mapview-decoder' 12 | 13 | export class TerrainTileFactory extends TileFactory { 14 | constructor (options) { 15 | super(TerrainTile) 16 | this.options = options 17 | } 18 | 19 | create (dataSource, tileKey) { 20 | return new TerrainTile(dataSource, tileKey, this.options) 21 | } 22 | } 23 | 24 | class TerrainTile extends Tile { 25 | constructor (dataSource, tileKey, options) { 26 | super(dataSource, tileKey) 27 | 28 | this.getTileMaterial = options.getTileMaterial 29 | this.getCustomObjects = options.getCustomObjects 30 | 31 | this.decodedTileGeometry = null 32 | this.scaledPositionArray = null 33 | this.tileSize = this.getTileSize( 34 | this.tileKey, 35 | this.projection, 36 | this.dataSource.getTilingScheme() 37 | ) 38 | } 39 | 40 | generateTileMaterial (decodedTile) { 41 | return this.getTileMaterial 42 | ? this.getTileMaterial(this, decodedTile) 43 | : Promise.resolve(new ElevationMaterial(decodedTile)) 44 | } 45 | 46 | getTileSize (tileKey, projection, tilingScheme) { 47 | const boundingBox = new THREE.Box3() 48 | const size = new THREE.Vector3() 49 | const geoBox = tilingScheme.getGeoBox(tileKey) 50 | 51 | projection.projectBox(geoBox, boundingBox) 52 | boundingBox.getSize(size) 53 | 54 | return size 55 | } 56 | 57 | scaleVertices (positionArray, tileHeader, tileSize) { 58 | const xScale = tileSize.x 59 | const yScale = tileSize.y 60 | const zScale = tileHeader.maxHeight - tileHeader.minHeight 61 | const scaledPositionArray = new Float32Array(positionArray.length) 62 | 63 | for (let i = 0; i < positionArray.length; i += 3) { 64 | scaledPositionArray[i] = positionArray[i] * xScale - tileSize.x / 2 65 | scaledPositionArray[i + 1] = positionArray[i + 1] * yScale - tileSize.y / 2 66 | scaledPositionArray[i + 2] = positionArray[i + 2] * zScale + tileHeader.minHeight 67 | } 68 | 69 | return scaledPositionArray 70 | } 71 | 72 | findVertexAttribute (attributeArray, name) { 73 | return attributeArray.find(attr => attr.name === name) 74 | } 75 | 76 | createObjects (decodedTile, objects) { 77 | this.decodedTileGeometry = decodedTile.geometries[0] 78 | 79 | const vertexPosition = this.findVertexAttribute(this.decodedTileGeometry.vertexAttributes, 'position') 80 | const buffer = vertexPosition.buffer 81 | const metadata = vertexPosition.metadata 82 | 83 | this.scaledPositionArray = this.scaleVertices(buffer, metadata, this.tileSize) 84 | 85 | this.generateTileMaterial(decodedTile).then((material) => 86 | this.createTileObjects(material, decodedTile.geometries[0], objects) 87 | ) 88 | if (this.getCustomObjects) { 89 | Promise.resolve(this.getCustomObjects(this)) 90 | .then(() => this.dataSource.requestUpdate()) 91 | } 92 | } 93 | 94 | createTileObjects (material, decodedTileGeometry, objects) { 95 | const tileGeometry = new THREE.BufferGeometry() 96 | const tileMesh = new THREE.Mesh(tileGeometry, material) 97 | 98 | decodedTileGeometry.vertexAttributes.forEach((attr) => { 99 | const buffer = 100 | attr.name === 'position' 101 | ? this.scaledPositionArray 102 | : attr.buffer 103 | 104 | tileGeometry.addAttribute(attr.name, new THREE.BufferAttribute(buffer, attr.itemCount)) 105 | }) 106 | 107 | if (decodedTileGeometry.index !== undefined) { 108 | tileGeometry.setIndex(new THREE.BufferAttribute(decodedTileGeometry.index.buffer, 1)) 109 | } 110 | 111 | if (!tileGeometry.attributes.normal && !tileGeometry.attributes.octNormal) { 112 | tileGeometry.computeVertexNormals() 113 | } 114 | 115 | this.registerTileObject(tileMesh) 116 | 117 | objects.push(tileMesh) 118 | 119 | this.dataSource.requestUpdate() 120 | } 121 | 122 | calculateLocalDisplacement (geoCoordinates) { 123 | const worldCoordinates = this.projection.projectPoint(geoCoordinates, new THREE.Vector3()) 124 | const localCoordinates = worldCoordinates.sub(this.center) 125 | 126 | const indexBuffer = this.decodedTileGeometry.index.buffer 127 | const scaledPositionArray = this.scaledPositionArray 128 | const displacement = new THREE.Vector3(0, 0, 0) 129 | 130 | for (let i = 0; i < indexBuffer.length; i += 3) { 131 | const index1 = indexBuffer[i] * 3 132 | const index2 = indexBuffer[i + 1] * 3 133 | const index3 = indexBuffer[i + 2] * 3 134 | 135 | const v1 = new THREE.Vector3(scaledPositionArray[index1], scaledPositionArray[index1 + 1], scaledPositionArray[index1 + 2]) 136 | const v2 = new THREE.Vector3(scaledPositionArray[index2], scaledPositionArray[index2 + 1], scaledPositionArray[index2 + 2]) 137 | const v3 = new THREE.Vector3(scaledPositionArray[index3], scaledPositionArray[index3 + 1], scaledPositionArray[index3 + 2]) 138 | 139 | const triangle = new THREE.Triangle(v1, v2, v3) 140 | const planeTriangle = new THREE.Triangle( 141 | v1.clone().setZ(0), 142 | v2.clone().setZ(0), 143 | v3.clone().setZ(0) 144 | ) 145 | 146 | if (planeTriangle.containsPoint(localCoordinates)) { 147 | const rationVector = planeTriangle.getBarycoord(localCoordinates, new THREE.Vector3()) 148 | 149 | const displacementZ = rationVector.x * triangle.a.z + rationVector.y * triangle.b.z + rationVector.z * triangle.c.z 150 | 151 | displacement.set(localCoordinates.x, localCoordinates.y, displacementZ) 152 | 153 | break 154 | } 155 | } 156 | 157 | return displacement 158 | } 159 | 160 | addObject (geoCoordinates, object) { 161 | if (this.geoBox.contains(geoCoordinates)) { 162 | object.displacement = this.calculateLocalDisplacement(geoCoordinates) 163 | 164 | this.registerTileObject(object) 165 | this.objects.push(object) 166 | } 167 | } 168 | } 169 | 170 | export { ElevationMaterial } 171 | -------------------------------------------------------------------------------- /example/index.html: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | harp.gl Terrain Datasource 11 | 12 | 13 | 14 | 15 | 109 | 110 | 111 | 112 | 113 | 209 | 210 | 211 | 212 | 213 | 214 | -------------------------------------------------------------------------------- /src/png/tile-decoder.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright © 2017-2019 HERE Europe B.V. 3 | * Licensed under Apache 2.0, see full license in LICENSE 4 | * SPDX-License-Identifier: Apache-2.0 5 | */ 6 | 7 | import UPNG from 'upng-js' 8 | 9 | export const DEM_ENCODINGS = { 10 | float32: 'float32', 11 | terrarium: 'terrarium' 12 | } 13 | 14 | const DEFAULT_WIDTH_SEGMENTS = 63 15 | const DEFAULT_HEIGHT_SEGMENTS = 63 16 | const DEFAULT_DEM_ENCODING = DEM_ENCODINGS.terrarium 17 | 18 | export const PNG_TILE_DECODER_ID = 'png-tile-decoder' 19 | 20 | export class PNGTileDecoder { 21 | connect () { 22 | return Promise.resolve() 23 | } 24 | 25 | configure (options) { 26 | // Data source calls .setTheme() when initialized 27 | // which triggers configure() call without options 28 | if (options === undefined) { 29 | return 30 | } 31 | 32 | this.options = Object.assign({ 33 | widthSegments: DEFAULT_WIDTH_SEGMENTS, 34 | heightSegments: DEFAULT_HEIGHT_SEGMENTS, 35 | demEncoding: DEFAULT_DEM_ENCODING 36 | }, options) 37 | 38 | this.indexArray = this.constructIndexArray( 39 | this.options.widthSegments, 40 | this.options.heightSegments 41 | ) 42 | } 43 | 44 | getVerticesCount () { 45 | const width = this.options.widthSegments + 1 46 | const height = this.options.heightSegments + 1 47 | return { 48 | width, 49 | height, 50 | total: width * height 51 | } 52 | } 53 | 54 | validateImg (img) { 55 | const { width, height } = this.getVerticesCount() 56 | 57 | if ( 58 | img.width % width !== 0 || 59 | img.height % height !== 0 60 | ) { 61 | throw new Error( 62 | 'Number of vertices in the plane must be ' + 63 | 'multiple of number of pixels in DEM tile in both dimensions.\n' + 64 | `DEM tile: ${img.width}x${img.height} pixels\n` + 65 | `Plane geometry: ${width}x${height} vertices` 66 | ) 67 | } 68 | } 69 | 70 | decodeFloat32Pixel (img, pixelIndex) { 71 | const BYTES_PER_PIXEL = 4 72 | const startByte = pixelIndex * BYTES_PER_PIXEL 73 | const pixel = Uint8Array.from( 74 | img.data.slice(startByte, startByte + BYTES_PER_PIXEL) 75 | ) 76 | const view = new DataView(pixel.buffer) 77 | 78 | return view.getFloat32(0, true) 79 | } 80 | 81 | decodeTerrariumPixel (img, pixelIndex) { 82 | const BYTES_PER_PIXEL = 3 83 | const startByte = pixelIndex * BYTES_PER_PIXEL 84 | const pixel = Uint8Array.from( 85 | img.data.slice(startByte, startByte + BYTES_PER_PIXEL) 86 | ) 87 | const view = new DataView(pixel.buffer) 88 | 89 | const red = view.getUint8(0) 90 | const green = view.getUint8(1) 91 | const blue = view.getUint8(2) 92 | 93 | return (red * 256 + green + blue / 256) - 32768 94 | } 95 | 96 | readHeightsFromImg (img) { 97 | const pixelsCount = img.width * img.height 98 | const heights = new Float32Array(pixelsCount) 99 | let maxHeight = 0 100 | let minHeight = 0 101 | 102 | let pixelDecodingFn 103 | 104 | switch (this.options.demEncoding) { 105 | case DEM_ENCODINGS.float32: { 106 | pixelDecodingFn = (img, i) => this.decodeFloat32Pixel(img, i) 107 | break 108 | } 109 | case DEM_ENCODINGS.terrarium: { 110 | pixelDecodingFn = (img, i) => this.decodeTerrariumPixel(img, i) 111 | break 112 | } 113 | default: { 114 | throw new Error(`"${this.options.demEncoding}" is unsupported DEM encoding`) 115 | } 116 | } 117 | 118 | for (let i = 0; i < pixelsCount; i++) { 119 | const height = pixelDecodingFn(img, i) 120 | 121 | heights[i] = height 122 | 123 | if (height > maxHeight) { 124 | maxHeight = height 125 | } 126 | 127 | if (height < minHeight) { 128 | minHeight = height 129 | } 130 | } 131 | 132 | return { heights, minHeight, maxHeight } 133 | } 134 | 135 | calculateSegmentVertexIndices (segmentIndex, widthSegments) { 136 | const calculateTopLeft = (i, ws) => Math.floor(i / ws) + i 137 | 138 | const topLeft = calculateTopLeft(segmentIndex, widthSegments) 139 | const topRight = topLeft + 1 140 | const bottomLeft = calculateTopLeft(segmentIndex + widthSegments, widthSegments) 141 | const bottomRight = bottomLeft + 1 142 | 143 | return { topLeft, topRight, bottomLeft, bottomRight } 144 | } 145 | 146 | constructIndexArray (widthSegments, heightSegments) { 147 | const segmentsCount = widthSegments * heightSegments 148 | const vertexCount = this.getVerticesCount().total 149 | const trianglesCount = segmentsCount * 2 150 | const indexArray = vertexCount > Math.pow(2, 16) 151 | ? new Uint32Array(trianglesCount * 3) 152 | : new Uint16Array(trianglesCount * 3) 153 | const indicesPerSegment = 6 154 | 155 | for (let i = 0, ii = 0; i < segmentsCount; i++, ii += indicesPerSegment) { 156 | const segmentVertexIndices = this.calculateSegmentVertexIndices(i, widthSegments) 157 | 158 | // Left triangle 159 | indexArray[ii] = segmentVertexIndices.topLeft 160 | indexArray[ii + 1] = segmentVertexIndices.bottomLeft 161 | indexArray[ii + 2] = segmentVertexIndices.topRight 162 | // Right triangle 163 | indexArray[ii + 3] = segmentVertexIndices.bottomLeft 164 | indexArray[ii + 4] = segmentVertexIndices.bottomRight 165 | indexArray[ii + 5] = segmentVertexIndices.topRight 166 | } 167 | 168 | return indexArray 169 | } 170 | 171 | constructPositionArray (img, heights, minHeight, maxHeight) { 172 | const vertexCount = this.getVerticesCount() 173 | const elementsPerVertex = 3 174 | const positionArray = new Float32Array(vertexCount.total * elementsPerVertex) 175 | const widthScale = img.width / vertexCount.width 176 | const heightScale = img.height / vertexCount.height 177 | 178 | for (let vertexIndex = 0; vertexIndex < vertexCount.total; vertexIndex++) { 179 | const vertexX = vertexIndex % vertexCount.width 180 | const vertexY = Math.floor(vertexIndex / vertexCount.width) 181 | const heightX = vertexX * widthScale 182 | const heightY = vertexY * heightScale 183 | const heightIndex = heightY * img.width + heightX 184 | 185 | // X, Y and Z are converted to [0, 1] space. 186 | // Y is inverted as in THREE.js Y axis goes bottom-up. 187 | const x = vertexX / (vertexCount.width - 1) 188 | const y = 1 - vertexY / (vertexCount.height - 1) 189 | let z = 0 190 | if (maxHeight - minHeight !== 0) { 191 | z = (heights[heightIndex] - minHeight) / (maxHeight - minHeight) 192 | } 193 | 194 | positionArray[elementsPerVertex * vertexIndex] = x 195 | positionArray[elementsPerVertex * vertexIndex + 1] = y 196 | positionArray[elementsPerVertex * vertexIndex + 2] = z 197 | } 198 | 199 | return positionArray 200 | } 201 | 202 | /** 203 | * Drops z-coordinate of each vertex to make a UV-map. 204 | * 205 | * @param {Float32Array} positionArray 206 | * @returns {Float32Array} 207 | */ 208 | constructUvArray (positionArray) { 209 | return positionArray.filter((item, index) => index % 3 < 2) 210 | } 211 | 212 | decodeTile (data) { 213 | const img = UPNG.decode(data) 214 | 215 | this.validateImg(img) 216 | 217 | const { heights, minHeight, maxHeight } = this.readHeightsFromImg(img) 218 | const positionArray = this.constructPositionArray(img, heights, minHeight, maxHeight) 219 | const uvArray = this.constructUvArray(positionArray) 220 | const decodedTile = { 221 | techniques: [], 222 | geometries: [ 223 | { 224 | index: { 225 | name: 'index', 226 | type: 'uint16', 227 | buffer: this.indexArray, 228 | itemCount: 1 229 | }, 230 | vertexAttributes: [ 231 | { 232 | name: 'position', 233 | type: 'float', 234 | buffer: positionArray, 235 | itemCount: 3, 236 | metadata: { minHeight, maxHeight } 237 | }, 238 | { 239 | name: 'uv', 240 | type: 'float', 241 | buffer: uvArray, 242 | itemCount: 2 243 | } 244 | ] 245 | } 246 | ] 247 | } 248 | 249 | return Promise.resolve(decodedTile) 250 | } 251 | } 252 | -------------------------------------------------------------------------------- /docs/GettingStartedGuide.md: -------------------------------------------------------------------------------- 1 | # Getting Started Guide 2 | 3 | Following these instructions you can create from scratch a minimal application using `harp.gl` and Terrain Datasource to render [Cesium World Terrain](https://cesium.com/content/cesium-world-terrain/). 4 | 5 | #### Prerequisites 6 | 7 | Before you can run the examples you will need to obtain a [Cesium ion](https://cesium.com/ion/) access token to be able to download terrain data. 8 | 9 | #### HTML 10 | 11 | *index.html* 12 | 13 | ```html 14 | 20 | 21 | 22 | 23 | 24 | 25 | ``` 26 | 27 | Later you'll configure webpack to populate `./dist` folder. harp.gl modules rely on three.js in the global scope, so we put it right in `index.html`. 28 | 29 | #### JavaScript 30 | 31 | Create `./src/app.js` and import dependencies. 32 | 33 | *./src/app.js* 34 | 35 | ```javascript 36 | import * as THREE from 'three' 37 | import { MapView } from '@here/harp-mapview' 38 | import { GeoCoordinates, hereTilingScheme } from '@here/harp-geoutils' 39 | import { MapControls } from '@here/harp-map-controls' 40 | import { TerrainDataSource } from '@here/harp-terrain-datasource' 41 | import { QUANTIZED_MESH_TILE_DECODER_ID } from '@here/harp-terrain-datasource/src/quantized-mesh/tile-decoder' 42 | ``` 43 | 44 | > Cesium World Terrain uses equirectangular tiling scheme, which is what `hereTilingSchene` is based on. 45 | 46 | Cesium ion requires you to fetch an endpoint token using your user access token, add a function which does that. 47 | 48 | ```javascript 49 | const CESIUM_USER_ACCESS_TOKEN = '__REPLACE_WITH_YOUR_CESIUM_ION_TOKEN__' 50 | 51 | function fetchWorldTerrainToken () { 52 | const url = `https://api.cesium.com/v1/assets/1/endpoint?access_token=${ CESIUM_USER_ACCESS_TOKEN }` 53 | 54 | return window.fetch(url) 55 | .then(res => res.json()) 56 | .then(endpoint => endpoint.accessToken) 57 | .catch(err => console.log(err)) 58 | } 59 | ``` 60 | 61 | > Assign your Cesium ion token to the `CESIUM_USER_ACCESS_TOKEN` constant. 62 | 63 | Now add function which takes a tile key as an argument and fetches tile for a given key. 64 | 65 | ```javascript 66 | function fetchTile (tileKey, worldTerrainToken) { 67 | const column = tileKey.column 68 | const row = tileKey.row 69 | const level = tileKey.level - 1 70 | 71 | const url = `https://assets.cesium.com/1/${ level }/${ column }/${ row }.terrain?v=1.1.0` 72 | const qmContentType = 'application/vnd.quantized-mesh,application/octet-stream;q=0.9' 73 | 74 | return window.fetch(url, { 75 | headers: { 76 | 'Accept': `${ qmContentType };access_token=${ worldTerrainToken }` 77 | } 78 | }) 79 | .then(res => { 80 | if (res.status !== 200) { 81 | throw new Error(`Unable to load tile ${ url }`) 82 | } 83 | 84 | return res.arrayBuffer() 85 | }) 86 | .catch(err => { 87 | console.log(err) 88 | }) 89 | } 90 | ``` 91 | Using tile key, the function creates URL to request corresponding tile from Cesium server. It also adds necessary headers including access token you requested in the previous function. 92 | 93 | > HERE Tiling Scheme has one additional parent level compared to regular equirectengular scheme. Thus `const level = tileKey.level - 1` is needed. 94 | 95 | Create another function which initializes harp.gl map view. 96 | 97 | ```javascript 98 | function initializeMapView (canvas) { 99 | const mapView = new MapView({ 100 | canvas, 101 | maxVisibleDataSourceTiles: 200, 102 | tileCacheSize: 400 103 | }) 104 | 105 | new MapControls(mapView) 106 | 107 | mapView.resize(window.innerWidth, window.innerHeight) 108 | 109 | window.addEventListener('resize', () => { 110 | mapView.resize(window.innerWidth, window.innerHeight) 111 | }) 112 | 113 | return mapView 114 | } 115 | ``` 116 | 117 | The canvas DOM element is the only argument for this function. `new MapControls(mapView)` adds user-interactions to a map, so you can pan, zoom and tilt. 118 | 119 | The last function creates a Terrain Datasource. 120 | 121 | ```javascript 122 | function createDataSource (worldTerrainToken) { 123 | return new TerrainDataSource({ 124 | concurrentDecoderServiceName: QUANTIZED_MESH_TILE_DECODER_ID, 125 | concurrentDecoderScriptUrl: './dist/tile-decoder.bundle.js', 126 | tilingScheme: hereTilingScheme, 127 | fetchTile: (tileKey) => fetchTile(tileKey, worldTerrainToken), 128 | getTileMaterial: () => { 129 | return Promise.resolve(new THREE.MeshNormalMaterial()) 130 | } 131 | }) 132 | } 133 | ``` 134 | 135 | Note that function takes Cesium endpoint token as the only argument and passes it to the `fetchTile` function which you created earlier. 136 | 137 | You can use any three.js material for the tiles, in this case it's `MeshNormalMaterial` which colors the mesh depending on a vertex normal direction. 138 | 139 | `concurrentDecoderServiceName` takes the quantized mesh decoder id you imported in the first step. 140 | 141 | `concurrentDecoderScriptUrl` option specifies URL where to fetch a decoder code from, it will be run in a worker. You're going to create decoder later. 142 | 143 | See [API Reference](APIReference.md) for the full Datasource specs. 144 | 145 | Now assemble together all the functions you've written. 146 | 147 | ```javascript 148 | fetchWorldTerrainToken().then(worldTerrainToken => { 149 | const mapView = initializeMapView(document.getElementById('map')) 150 | const terrainDataSource = createDataSource(worldTerrainToken) 151 | 152 | mapView.addDataSource(terrainDataSource) 153 | 154 | mapView.setCameraGeolocationAndZoom( 155 | new GeoCoordinates(43.818897519592596, -110.76214288570348), 156 | 13 157 | ) 158 | mapView.camera.rotateX(THREE.Math.degToRad(45)) 159 | }) 160 | ``` 161 | 162 | ` mapView.setCameraGeolocationAndZoom()` places camera on a specific point and sets zoom level and `mapView.camera.rotateX()` rotates it by a given degree. 163 | 164 | You're done with `./src/app.js`, now create `./src/tile-decoder-worker.js` which will be bundled into `./dist/tile-decoder.bundle.js`. 165 | 166 | *./src/tile-decoder-worker.js* 167 | 168 | ```javascript 169 | importScripts('three/build/three.js') 170 | require('@here/harp-terrain-datasource/src/quantized-mesh/tile-decoder-worker') 171 | ``` 172 | 173 | harp.gl modules require three.js in the global space, thus `importScripts('three/build/three.js')`. Second line imports all needed code to setup a quantized mesh decoder worker and it must be `require()` , not `import`, in order to be loaded after three.js. 174 | 175 | #### Webpack Configuration 176 | 177 | Last step is to bundle files you've just created with webpack. Create `./webpack.config.js`. 178 | 179 | *./webpack.config.js* 180 | 181 | ```javascript 182 | const path = require('path') 183 | const CopyWebpackPlugin = require('copy-webpack-plugin') 184 | 185 | module.exports = [ 186 | { 187 | target: 'webworker', 188 | entry: './src/tile-decoder-worker.js', 189 | output: { 190 | path: path.resolve(__dirname, 'dist'), 191 | filename: 'tile-decoder.bundle.js' 192 | }, 193 | devServer: { 194 | contentBase: path.join(__dirname, './'), 195 | publicPath: '/dist/' 196 | }, 197 | externals: { 198 | three: "THREE" 199 | }, 200 | devtool: 'source-map' 201 | }, 202 | { 203 | entry: './src/app.js', 204 | output: { 205 | path: path.resolve(__dirname, 'dist'), 206 | filename: 'app.bundle.js' 207 | }, 208 | devServer: { 209 | contentBase: path.join(__dirname, './'), 210 | publicPath: '/dist/' 211 | }, 212 | devtool: 'source-map', 213 | externals: { 214 | three: "THREE" 215 | }, 216 | plugins: [ 217 | new CopyWebpackPlugin([ 218 | { from: './node_modules/three', to: './three' } 219 | ]) 220 | ] 221 | } 222 | ] 223 | ``` 224 | 225 | The configuration has two modules, one for the decoder worker and one for the main app. Bundled files will end up in `./dist` folder along with three.js build which is copied from `node_modules/three` using `CopyWebpackPlugin`. 226 | 227 | Webpack dev server serves statics from root app directory and bundles under `/dist/` path. 228 | 229 | #### Run The App 230 | 231 | If you've done everything correct, you can start dev server and see the app running on `http://localhost:8080`. 232 | 233 | ```bash 234 | npx webpack-dev-server -d 235 | ``` 236 | 237 | In case of issues, check `./example` folder which contain source of a similar example application. It also has example of a PNG data source in the [Mapzen Terrarium](https://mapzen.com/documentation/terrain-tiles/formats/#terrarium) format and custom elevation based styling. -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0": 6 | version "7.10.1" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.1.tgz#d5481c5095daa1c57e16e54c6f9198443afb49ff" 8 | integrity sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw== 9 | dependencies: 10 | "@babel/highlight" "^7.10.1" 11 | 12 | "@babel/helper-validator-identifier@^7.10.1": 13 | version "7.10.1" 14 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz#5770b0c1a826c4f53f5ede5e153163e0318e94b5" 15 | integrity sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw== 16 | 17 | "@babel/highlight@^7.10.1": 18 | version "7.10.1" 19 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.1.tgz#841d098ba613ba1a427a2b383d79e35552c38ae0" 20 | integrity sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg== 21 | dependencies: 22 | "@babel/helper-validator-identifier" "^7.10.1" 23 | chalk "^2.0.0" 24 | js-tokens "^4.0.0" 25 | 26 | "@here/harp-datasource-protocol@^0.16.0": 27 | version "0.16.0" 28 | resolved "https://registry.yarnpkg.com/@here/harp-datasource-protocol/-/harp-datasource-protocol-0.16.0.tgz#c0d87155b06e7bf71a52eeeee605c6ea213e7d55" 29 | integrity sha512-0aEjvRjVqUWKTAiHskLxuJOtdDmPMjxyabEkauKsh7uqwxLkpqAmiYuePaNm3tegHRZyjBXyL8kTHiwl6niqzQ== 30 | dependencies: 31 | "@here/harp-geometry" "^0.16.0" 32 | "@here/harp-geoutils" "^0.16.0" 33 | "@here/harp-utils" "^0.16.0" 34 | 35 | "@here/harp-fetch@^0.16.0": 36 | version "0.16.0" 37 | resolved "https://registry.yarnpkg.com/@here/harp-fetch/-/harp-fetch-0.16.0.tgz#21a35be82035ed92d984589f878f1585c669ca81" 38 | integrity sha512-uv+lKgBXE2ZMbltyZ+XZV9xucPL4YrOLKPLsG7pIVxRpyQj3aXwNmuzQ+QFbxR69aJx/b++P/Qk2tNvJI4bEYw== 39 | dependencies: 40 | node-fetch "^2.2.0" 41 | 42 | "@here/harp-geometry@^0.16.0": 43 | version "0.16.0" 44 | resolved "https://registry.yarnpkg.com/@here/harp-geometry/-/harp-geometry-0.16.0.tgz#40a81b83e0953eae57cec195f348692e52ef66ed" 45 | integrity sha512-RbLbOwDmqxy67DM/xftmKXGC0b2h5u1h0RuWCLXX0RkPXIqEh2TtUfp4BekvG35Rhxt8c8ZSHgQYCAtmZQc85Q== 46 | dependencies: 47 | "@here/harp-geoutils" "^0.16.0" 48 | "@here/harp-utils" "^0.16.0" 49 | 50 | "@here/harp-geoutils@^0.16.0": 51 | version "0.16.0" 52 | resolved "https://registry.yarnpkg.com/@here/harp-geoutils/-/harp-geoutils-0.16.0.tgz#b531567ac411fb07be43c8ee114634535b3e3276" 53 | integrity sha512-Z+VGfTdij1kiQLu2lpIc52PIAiToSCgI/ag6ISOB6EzQaYzq9+shc758inZOzN2m1s0PU/AtKINiIcwgDMREsA== 54 | 55 | "@here/harp-lines@^0.16.0": 56 | version "0.16.0" 57 | resolved "https://registry.yarnpkg.com/@here/harp-lines/-/harp-lines-0.16.0.tgz#def4dd3d54181ff46591d10ea639ca5e5b942f25" 58 | integrity sha512-3msBJeWrmwFF1ZJ5B7GXIjNPtHVM9wNpeIWXoiRSAqtszmdaHr8WwxoqsSAqwieDUF1wlMOKqTb56BnJlAFsqA== 59 | dependencies: 60 | "@here/harp-materials" "^0.16.0" 61 | 62 | "@here/harp-lrucache@^0.16.0": 63 | version "0.16.0" 64 | resolved "https://registry.yarnpkg.com/@here/harp-lrucache/-/harp-lrucache-0.16.0.tgz#030ffe4ddf7c8500c584ccaa661552bcdd9ee539" 65 | integrity sha512-Sr1VB0Qd/v26KYAfJfq6KCF2ubGCaIovGUJwdA2gdcA3SgQOxk1VHbR7pODQjdDW96RuRllMf3XzqHl/Cdv0kw== 66 | dependencies: 67 | "@here/harp-utils" "^0.16.0" 68 | 69 | "@here/harp-mapview-decoder@^0.16.0": 70 | version "0.16.0" 71 | resolved "https://registry.yarnpkg.com/@here/harp-mapview-decoder/-/harp-mapview-decoder-0.16.0.tgz#432d0f60b473c025231ff4b487abe9982a8c7a8f" 72 | integrity sha512-9YW1sflm5g3WTppRs1s1xvrIdJnk9284TNEM9gSkZg+JwR5hclKhIiix6fo/J9CQyFHapC4b/i7wcuvb020/2A== 73 | dependencies: 74 | "@here/harp-datasource-protocol" "^0.16.0" 75 | "@here/harp-fetch" "^0.16.0" 76 | "@here/harp-geoutils" "^0.16.0" 77 | "@here/harp-lrucache" "^0.16.0" 78 | "@here/harp-mapview" "^0.16.0" 79 | "@here/harp-utils" "^0.16.0" 80 | geojson-vt "^3.2.1" 81 | 82 | "@here/harp-mapview@^0.16.0": 83 | version "0.16.0" 84 | resolved "https://registry.yarnpkg.com/@here/harp-mapview/-/harp-mapview-0.16.0.tgz#a021140bf32527889caa13526caeb61674588447" 85 | integrity sha512-nxSVErUvKk2QZN9WyFADNPvNS1CZGyMqN2xM2Pk6dgvR3dZg4H9puMqQRYbREOSABK5KltNEjuSN12AffvJpfg== 86 | dependencies: 87 | "@here/harp-datasource-protocol" "^0.16.0" 88 | "@here/harp-fetch" "^0.16.0" 89 | "@here/harp-geometry" "^0.16.0" 90 | "@here/harp-geoutils" "^0.16.0" 91 | "@here/harp-lines" "^0.16.0" 92 | "@here/harp-lrucache" "^0.16.0" 93 | "@here/harp-materials" "^0.16.0" 94 | "@here/harp-text-canvas" "^0.16.0" 95 | "@here/harp-transfer-manager" "^0.16.0" 96 | "@here/harp-utils" "^0.16.0" 97 | rbush "^3.0.1" 98 | 99 | "@here/harp-materials@^0.16.0": 100 | version "0.16.0" 101 | resolved "https://registry.yarnpkg.com/@here/harp-materials/-/harp-materials-0.16.0.tgz#f47c0f914046f728a57f273c2e6fc73cbacafb61" 102 | integrity sha512-ln2+AvconWJusYpNydKFyzUM3UUgXrO2OY96AybZIo+/anHjtJHVJnqXJZh1n6/m2BtePnno3RuTVZkF3i0zQQ== 103 | dependencies: 104 | "@here/harp-datasource-protocol" "^0.16.0" 105 | "@here/harp-utils" "^0.16.0" 106 | 107 | "@here/harp-text-canvas@^0.16.0": 108 | version "0.16.0" 109 | resolved "https://registry.yarnpkg.com/@here/harp-text-canvas/-/harp-text-canvas-0.16.0.tgz#fb67ddcf818d4a675eeb2a78152efcec6f0e6b25" 110 | integrity sha512-6EAllmDyi8v2V66Z6dqS0qCavFWh54KtcJGdCrDLnXmigkVrpgysQpWtK+Zhunt90d80c75Cc57eETEDCbVlmA== 111 | dependencies: 112 | "@here/harp-lrucache" "^0.16.0" 113 | 114 | "@here/harp-transfer-manager@^0.16.0": 115 | version "0.16.0" 116 | resolved "https://registry.yarnpkg.com/@here/harp-transfer-manager/-/harp-transfer-manager-0.16.0.tgz#677b28bf9ab78b75fad1c6a9a54384a0ab7dc799" 117 | integrity sha512-Xe8Na6eUDAZ4Dtnr/BevrK5qgsyKtejUY0bzEU97bpuvUtdxg1rmHE9kZiuhEwsKDvaw/y/59iM6V88ZzEvH6g== 118 | dependencies: 119 | "@here/harp-fetch" "^0.16.0" 120 | 121 | "@here/harp-utils@^0.16.0": 122 | version "0.16.0" 123 | resolved "https://registry.yarnpkg.com/@here/harp-utils/-/harp-utils-0.16.0.tgz#4972b4b0f998c47588425ce9fa3e122026a2b653" 124 | integrity sha512-SKQh7GjzX4Hivs5wPHuMj4WyMH/pIO6cjN+Zw3iDrsCNzbuFAnvDXrgvNgsLOKjQVVkmnfTLME+iqOqKci3iDw== 125 | 126 | "@here/quantized-mesh-decoder@^1.2.0": 127 | version "1.2.0" 128 | resolved "https://registry.yarnpkg.com/@here/quantized-mesh-decoder/-/quantized-mesh-decoder-1.2.0.tgz#38d5053e2c7d7ac686f5644387f03c5e35f43391" 129 | integrity sha512-9Oki1ZK+JQ3DjfPPhsROSUKiS/5xUn1vj9CPzxAP7uJirufXNpa9clbH0zBIExbK8IgqEL0L6kC+As60mcbWXg== 130 | 131 | "@types/color-name@^1.1.1": 132 | version "1.1.1" 133 | resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" 134 | integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== 135 | 136 | "@types/three@^0.103.2": 137 | version "0.103.2" 138 | resolved "https://registry.yarnpkg.com/@types/three/-/three-0.103.2.tgz#f7d49130001c551941a0ded757def810579aafc4" 139 | integrity sha512-zhtf0Qs5wLJpIn1+VWCpzSgpKayj/GSWZ6woiuz09FW59KEDeLpnBkYz6lbblVpRmGdlnG8nd0unaASshOvcXw== 140 | dependencies: 141 | three "*" 142 | 143 | acorn-jsx@^5.2.0: 144 | version "5.2.0" 145 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" 146 | integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== 147 | 148 | acorn@^7.1.1: 149 | version "7.2.0" 150 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.2.0.tgz#17ea7e40d7c8640ff54a694c889c26f31704effe" 151 | integrity sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ== 152 | 153 | ajv@^6.10.0, ajv@^6.10.2: 154 | version "6.12.2" 155 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" 156 | integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ== 157 | dependencies: 158 | fast-deep-equal "^3.1.1" 159 | fast-json-stable-stringify "^2.0.0" 160 | json-schema-traverse "^0.4.1" 161 | uri-js "^4.2.2" 162 | 163 | ansi-escapes@^4.2.1: 164 | version "4.3.1" 165 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" 166 | integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== 167 | dependencies: 168 | type-fest "^0.11.0" 169 | 170 | ansi-regex@^4.1.0: 171 | version "4.1.0" 172 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 173 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== 174 | 175 | ansi-regex@^5.0.0: 176 | version "5.0.0" 177 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 178 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 179 | 180 | ansi-styles@^3.2.0, ansi-styles@^3.2.1: 181 | version "3.2.1" 182 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 183 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 184 | dependencies: 185 | color-convert "^1.9.0" 186 | 187 | ansi-styles@^4.1.0: 188 | version "4.2.1" 189 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" 190 | integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== 191 | dependencies: 192 | "@types/color-name" "^1.1.1" 193 | color-convert "^2.0.1" 194 | 195 | argparse@^1.0.7: 196 | version "1.0.10" 197 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 198 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 199 | dependencies: 200 | sprintf-js "~1.0.2" 201 | 202 | array-includes@^3.0.3, array-includes@^3.1.1: 203 | version "3.1.1" 204 | resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" 205 | integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== 206 | dependencies: 207 | define-properties "^1.1.3" 208 | es-abstract "^1.17.0" 209 | is-string "^1.0.5" 210 | 211 | array-union@^1.0.1: 212 | version "1.0.2" 213 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 214 | integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= 215 | dependencies: 216 | array-uniq "^1.0.1" 217 | 218 | array-uniq@^1.0.1: 219 | version "1.0.3" 220 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 221 | integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= 222 | 223 | astral-regex@^1.0.0: 224 | version "1.0.0" 225 | resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" 226 | integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== 227 | 228 | async@^2.6.1: 229 | version "2.6.3" 230 | resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" 231 | integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== 232 | dependencies: 233 | lodash "^4.17.14" 234 | 235 | balanced-match@^1.0.0: 236 | version "1.0.0" 237 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 238 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 239 | 240 | brace-expansion@^1.1.7: 241 | version "1.1.11" 242 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 243 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 244 | dependencies: 245 | balanced-match "^1.0.0" 246 | concat-map "0.0.1" 247 | 248 | callsites@^3.0.0: 249 | version "3.1.0" 250 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 251 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 252 | 253 | chalk@^2.0.0, chalk@^2.1.0: 254 | version "2.4.2" 255 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 256 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 257 | dependencies: 258 | ansi-styles "^3.2.1" 259 | escape-string-regexp "^1.0.5" 260 | supports-color "^5.3.0" 261 | 262 | chalk@^3.0.0: 263 | version "3.0.0" 264 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" 265 | integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== 266 | dependencies: 267 | ansi-styles "^4.1.0" 268 | supports-color "^7.1.0" 269 | 270 | chardet@^0.7.0: 271 | version "0.7.0" 272 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" 273 | integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== 274 | 275 | cli-cursor@^3.1.0: 276 | version "3.1.0" 277 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" 278 | integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== 279 | dependencies: 280 | restore-cursor "^3.1.0" 281 | 282 | cli-width@^2.0.0: 283 | version "2.2.1" 284 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" 285 | integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== 286 | 287 | color-convert@^1.9.0: 288 | version "1.9.3" 289 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 290 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 291 | dependencies: 292 | color-name "1.1.3" 293 | 294 | color-convert@^2.0.1: 295 | version "2.0.1" 296 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 297 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 298 | dependencies: 299 | color-name "~1.1.4" 300 | 301 | color-name@1.1.3: 302 | version "1.1.3" 303 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 304 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 305 | 306 | color-name@~1.1.4: 307 | version "1.1.4" 308 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 309 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 310 | 311 | commander@^2.18.0: 312 | version "2.20.3" 313 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 314 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 315 | 316 | concat-map@0.0.1: 317 | version "0.0.1" 318 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 319 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 320 | 321 | contains-path@^0.1.0: 322 | version "0.1.0" 323 | resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" 324 | integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= 325 | 326 | cross-spawn@^6.0.5: 327 | version "6.0.5" 328 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 329 | integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== 330 | dependencies: 331 | nice-try "^1.0.4" 332 | path-key "^2.0.1" 333 | semver "^5.5.0" 334 | shebang-command "^1.2.0" 335 | which "^1.2.9" 336 | 337 | debug-log@^1.0.0: 338 | version "1.0.1" 339 | resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" 340 | integrity sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8= 341 | 342 | debug@^2.6.9: 343 | version "2.6.9" 344 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 345 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 346 | dependencies: 347 | ms "2.0.0" 348 | 349 | debug@^4.0.1: 350 | version "4.1.1" 351 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 352 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 353 | dependencies: 354 | ms "^2.1.1" 355 | 356 | deep-is@~0.1.3: 357 | version "0.1.3" 358 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 359 | integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= 360 | 361 | define-properties@^1.1.2, define-properties@^1.1.3: 362 | version "1.1.3" 363 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 364 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 365 | dependencies: 366 | object-keys "^1.0.12" 367 | 368 | deglob@^4.0.1: 369 | version "4.0.1" 370 | resolved "https://registry.yarnpkg.com/deglob/-/deglob-4.0.1.tgz#0685c6383992fd6009be10653a2b1116696fad55" 371 | integrity sha512-/g+RDZ7yf2HvoW+E5Cy+K94YhgcFgr6C8LuHZD1O5HoNPkf3KY6RfXJ0DBGlB/NkLi5gml+G9zqRzk9S0mHZCg== 372 | dependencies: 373 | find-root "^1.0.0" 374 | glob "^7.0.5" 375 | ignore "^5.0.0" 376 | pkg-config "^1.1.0" 377 | run-parallel "^1.1.2" 378 | uniq "^1.0.1" 379 | 380 | doctrine@1.5.0: 381 | version "1.5.0" 382 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" 383 | integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= 384 | dependencies: 385 | esutils "^2.0.2" 386 | isarray "^1.0.0" 387 | 388 | doctrine@^2.1.0: 389 | version "2.1.0" 390 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" 391 | integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== 392 | dependencies: 393 | esutils "^2.0.2" 394 | 395 | doctrine@^3.0.0: 396 | version "3.0.0" 397 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 398 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 399 | dependencies: 400 | esutils "^2.0.2" 401 | 402 | dotenv-safe@^8.2.0: 403 | version "8.2.0" 404 | resolved "https://registry.yarnpkg.com/dotenv-safe/-/dotenv-safe-8.2.0.tgz#8d548c7318a62c09a66c4dc8c31864cc007c78ba" 405 | integrity sha512-uWwWWdUQkSs5a3mySDB22UtNwyEYi0JtEQu+vDzIqr9OjbDdC2Ip13PnSpi/fctqlYmzkxCeabiyCAOROuAIaA== 406 | dependencies: 407 | dotenv "^8.2.0" 408 | 409 | dotenv@^8.2.0: 410 | version "8.2.0" 411 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" 412 | integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== 413 | 414 | email-addresses@^3.0.1: 415 | version "3.1.0" 416 | resolved "https://registry.yarnpkg.com/email-addresses/-/email-addresses-3.1.0.tgz#cabf7e085cbdb63008a70319a74e6136188812fb" 417 | integrity sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg== 418 | 419 | emoji-regex@^7.0.1: 420 | version "7.0.3" 421 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" 422 | integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== 423 | 424 | emoji-regex@^8.0.0: 425 | version "8.0.0" 426 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 427 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 428 | 429 | error-ex@^1.2.0, error-ex@^1.3.1: 430 | version "1.3.2" 431 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 432 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 433 | dependencies: 434 | is-arrayish "^0.2.1" 435 | 436 | es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: 437 | version "1.17.5" 438 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" 439 | integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== 440 | dependencies: 441 | es-to-primitive "^1.2.1" 442 | function-bind "^1.1.1" 443 | has "^1.0.3" 444 | has-symbols "^1.0.1" 445 | is-callable "^1.1.5" 446 | is-regex "^1.0.5" 447 | object-inspect "^1.7.0" 448 | object-keys "^1.1.1" 449 | object.assign "^4.1.0" 450 | string.prototype.trimleft "^2.1.1" 451 | string.prototype.trimright "^2.1.1" 452 | 453 | es-to-primitive@^1.2.1: 454 | version "1.2.1" 455 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 456 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== 457 | dependencies: 458 | is-callable "^1.1.4" 459 | is-date-object "^1.0.1" 460 | is-symbol "^1.0.2" 461 | 462 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 463 | version "1.0.5" 464 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 465 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 466 | 467 | eslint-config-standard-jsx@8.1.0: 468 | version "8.1.0" 469 | resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-8.1.0.tgz#314c62a0e6f51f75547f89aade059bec140edfc7" 470 | integrity sha512-ULVC8qH8qCqbU792ZOO6DaiaZyHNS/5CZt3hKqHkEhVlhPEPN3nfBqqxJCyp59XrjIBZPu1chMYe9T2DXZ7TMw== 471 | 472 | eslint-config-standard@14.1.1: 473 | version "14.1.1" 474 | resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz#830a8e44e7aef7de67464979ad06b406026c56ea" 475 | integrity sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg== 476 | 477 | eslint-import-resolver-node@^0.3.2: 478 | version "0.3.3" 479 | resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz#dbaa52b6b2816b50bc6711af75422de808e98404" 480 | integrity sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg== 481 | dependencies: 482 | debug "^2.6.9" 483 | resolve "^1.13.1" 484 | 485 | eslint-module-utils@^2.4.0: 486 | version "2.6.0" 487 | resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" 488 | integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== 489 | dependencies: 490 | debug "^2.6.9" 491 | pkg-dir "^2.0.0" 492 | 493 | eslint-plugin-es@^2.0.0: 494 | version "2.0.0" 495 | resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-2.0.0.tgz#0f5f5da5f18aa21989feebe8a73eadefb3432976" 496 | integrity sha512-f6fceVtg27BR02EYnBhgWLFQfK6bN4Ll0nQFrBHOlCsAyxeZkn0NHns5O0YZOPrV1B3ramd6cgFwaoFLcSkwEQ== 497 | dependencies: 498 | eslint-utils "^1.4.2" 499 | regexpp "^3.0.0" 500 | 501 | eslint-plugin-import@~2.18.0: 502 | version "2.18.2" 503 | resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz#02f1180b90b077b33d447a17a2326ceb400aceb6" 504 | integrity sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ== 505 | dependencies: 506 | array-includes "^3.0.3" 507 | contains-path "^0.1.0" 508 | debug "^2.6.9" 509 | doctrine "1.5.0" 510 | eslint-import-resolver-node "^0.3.2" 511 | eslint-module-utils "^2.4.0" 512 | has "^1.0.3" 513 | minimatch "^3.0.4" 514 | object.values "^1.1.0" 515 | read-pkg-up "^2.0.0" 516 | resolve "^1.11.0" 517 | 518 | eslint-plugin-node@~10.0.0: 519 | version "10.0.0" 520 | resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-10.0.0.tgz#fd1adbc7a300cf7eb6ac55cf4b0b6fc6e577f5a6" 521 | integrity sha512-1CSyM/QCjs6PXaT18+zuAXsjXGIGo5Rw630rSKwokSs2jrYURQc4R5JZpoanNCqwNmepg+0eZ9L7YiRUJb8jiQ== 522 | dependencies: 523 | eslint-plugin-es "^2.0.0" 524 | eslint-utils "^1.4.2" 525 | ignore "^5.1.1" 526 | minimatch "^3.0.4" 527 | resolve "^1.10.1" 528 | semver "^6.1.0" 529 | 530 | eslint-plugin-promise@~4.2.1: 531 | version "4.2.1" 532 | resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a" 533 | integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw== 534 | 535 | eslint-plugin-react@~7.14.2: 536 | version "7.14.3" 537 | resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.14.3.tgz#911030dd7e98ba49e1b2208599571846a66bdf13" 538 | integrity sha512-EzdyyBWC4Uz2hPYBiEJrKCUi2Fn+BJ9B/pJQcjw5X+x/H2Nm59S4MJIvL4O5NEE0+WbnQwEBxWY03oUk+Bc3FA== 539 | dependencies: 540 | array-includes "^3.0.3" 541 | doctrine "^2.1.0" 542 | has "^1.0.3" 543 | jsx-ast-utils "^2.1.0" 544 | object.entries "^1.1.0" 545 | object.fromentries "^2.0.0" 546 | object.values "^1.1.0" 547 | prop-types "^15.7.2" 548 | resolve "^1.10.1" 549 | 550 | eslint-plugin-standard@~4.0.0: 551 | version "4.0.1" 552 | resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz#ff0519f7ffaff114f76d1bd7c3996eef0f6e20b4" 553 | integrity sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ== 554 | 555 | eslint-scope@^5.0.0: 556 | version "5.0.0" 557 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" 558 | integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== 559 | dependencies: 560 | esrecurse "^4.1.0" 561 | estraverse "^4.1.1" 562 | 563 | eslint-utils@^1.4.2, eslint-utils@^1.4.3: 564 | version "1.4.3" 565 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" 566 | integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== 567 | dependencies: 568 | eslint-visitor-keys "^1.1.0" 569 | 570 | eslint-visitor-keys@^1.1.0: 571 | version "1.1.0" 572 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" 573 | integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== 574 | 575 | eslint@~6.8.0: 576 | version "6.8.0" 577 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" 578 | integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== 579 | dependencies: 580 | "@babel/code-frame" "^7.0.0" 581 | ajv "^6.10.0" 582 | chalk "^2.1.0" 583 | cross-spawn "^6.0.5" 584 | debug "^4.0.1" 585 | doctrine "^3.0.0" 586 | eslint-scope "^5.0.0" 587 | eslint-utils "^1.4.3" 588 | eslint-visitor-keys "^1.1.0" 589 | espree "^6.1.2" 590 | esquery "^1.0.1" 591 | esutils "^2.0.2" 592 | file-entry-cache "^5.0.1" 593 | functional-red-black-tree "^1.0.1" 594 | glob-parent "^5.0.0" 595 | globals "^12.1.0" 596 | ignore "^4.0.6" 597 | import-fresh "^3.0.0" 598 | imurmurhash "^0.1.4" 599 | inquirer "^7.0.0" 600 | is-glob "^4.0.0" 601 | js-yaml "^3.13.1" 602 | json-stable-stringify-without-jsonify "^1.0.1" 603 | levn "^0.3.0" 604 | lodash "^4.17.14" 605 | minimatch "^3.0.4" 606 | mkdirp "^0.5.1" 607 | natural-compare "^1.4.0" 608 | optionator "^0.8.3" 609 | progress "^2.0.0" 610 | regexpp "^2.0.1" 611 | semver "^6.1.2" 612 | strip-ansi "^5.2.0" 613 | strip-json-comments "^3.0.1" 614 | table "^5.2.3" 615 | text-table "^0.2.0" 616 | v8-compile-cache "^2.0.3" 617 | 618 | espree@^6.1.2: 619 | version "6.2.1" 620 | resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" 621 | integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== 622 | dependencies: 623 | acorn "^7.1.1" 624 | acorn-jsx "^5.2.0" 625 | eslint-visitor-keys "^1.1.0" 626 | 627 | esprima@^4.0.0: 628 | version "4.0.1" 629 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 630 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 631 | 632 | esquery@^1.0.1: 633 | version "1.3.1" 634 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" 635 | integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== 636 | dependencies: 637 | estraverse "^5.1.0" 638 | 639 | esrecurse@^4.1.0: 640 | version "4.2.1" 641 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" 642 | integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== 643 | dependencies: 644 | estraverse "^4.1.0" 645 | 646 | estraverse@^4.1.0, estraverse@^4.1.1: 647 | version "4.3.0" 648 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 649 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 650 | 651 | estraverse@^5.1.0: 652 | version "5.1.0" 653 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" 654 | integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== 655 | 656 | esutils@^2.0.2: 657 | version "2.0.3" 658 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 659 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 660 | 661 | external-editor@^3.0.3: 662 | version "3.1.0" 663 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" 664 | integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== 665 | dependencies: 666 | chardet "^0.7.0" 667 | iconv-lite "^0.4.24" 668 | tmp "^0.0.33" 669 | 670 | fast-deep-equal@^3.1.1: 671 | version "3.1.1" 672 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" 673 | integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== 674 | 675 | fast-json-stable-stringify@^2.0.0: 676 | version "2.1.0" 677 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 678 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 679 | 680 | fast-levenshtein@~2.0.6: 681 | version "2.0.6" 682 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 683 | integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= 684 | 685 | figures@^3.0.0: 686 | version "3.2.0" 687 | resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" 688 | integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== 689 | dependencies: 690 | escape-string-regexp "^1.0.5" 691 | 692 | file-entry-cache@^5.0.1: 693 | version "5.0.1" 694 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" 695 | integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== 696 | dependencies: 697 | flat-cache "^2.0.1" 698 | 699 | filename-reserved-regex@^1.0.0: 700 | version "1.0.0" 701 | resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz#e61cf805f0de1c984567d0386dc5df50ee5af7e4" 702 | integrity sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q= 703 | 704 | filenamify-url@^1.0.0: 705 | version "1.0.0" 706 | resolved "https://registry.yarnpkg.com/filenamify-url/-/filenamify-url-1.0.0.tgz#b32bd81319ef5863b73078bed50f46a4f7975f50" 707 | integrity sha1-syvYExnvWGO3MHi+1Q9GpPeXX1A= 708 | dependencies: 709 | filenamify "^1.0.0" 710 | humanize-url "^1.0.0" 711 | 712 | filenamify@^1.0.0: 713 | version "1.2.1" 714 | resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-1.2.1.tgz#a9f2ffd11c503bed300015029272378f1f1365a5" 715 | integrity sha1-qfL/0RxQO+0wABUCknI3jx8TZaU= 716 | dependencies: 717 | filename-reserved-regex "^1.0.0" 718 | strip-outer "^1.0.0" 719 | trim-repeated "^1.0.0" 720 | 721 | find-root@^1.0.0: 722 | version "1.1.0" 723 | resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" 724 | integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== 725 | 726 | find-up@^2.0.0, find-up@^2.1.0: 727 | version "2.1.0" 728 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" 729 | integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= 730 | dependencies: 731 | locate-path "^2.0.0" 732 | 733 | find-up@^3.0.0: 734 | version "3.0.0" 735 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" 736 | integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== 737 | dependencies: 738 | locate-path "^3.0.0" 739 | 740 | flat-cache@^2.0.1: 741 | version "2.0.1" 742 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" 743 | integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== 744 | dependencies: 745 | flatted "^2.0.0" 746 | rimraf "2.6.3" 747 | write "1.0.3" 748 | 749 | flatted@^2.0.0: 750 | version "2.0.2" 751 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" 752 | integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== 753 | 754 | fs-extra@^8.1.0: 755 | version "8.1.0" 756 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" 757 | integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== 758 | dependencies: 759 | graceful-fs "^4.2.0" 760 | jsonfile "^4.0.0" 761 | universalify "^0.1.0" 762 | 763 | fs.realpath@^1.0.0: 764 | version "1.0.0" 765 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 766 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 767 | 768 | function-bind@^1.1.1: 769 | version "1.1.1" 770 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 771 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 772 | 773 | functional-red-black-tree@^1.0.1: 774 | version "1.0.1" 775 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 776 | integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= 777 | 778 | geojson-vt@^3.2.1: 779 | version "3.2.1" 780 | resolved "https://registry.yarnpkg.com/geojson-vt/-/geojson-vt-3.2.1.tgz#f8adb614d2c1d3f6ee7c4265cad4bbf3ad60c8b7" 781 | integrity sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg== 782 | 783 | get-stdin@^7.0.0: 784 | version "7.0.0" 785 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-7.0.0.tgz#8d5de98f15171a125c5e516643c7a6d0ea8a96f6" 786 | integrity sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ== 787 | 788 | gh-pages@^3.0.0: 789 | version "3.0.0" 790 | resolved "https://registry.yarnpkg.com/gh-pages/-/gh-pages-3.0.0.tgz#65f3ccd424bfbc7906f31c4bdb524a1147fa8da2" 791 | integrity sha512-oaOfVcrSwnqoWUgZ6cmCDM6mUuWyOSG+SHjqxGBawN0F3SKaF5NwbeYDG+w2RNXO2HJ/5Iam4o7dP5NAtoHuwQ== 792 | dependencies: 793 | async "^2.6.1" 794 | commander "^2.18.0" 795 | email-addresses "^3.0.1" 796 | filenamify-url "^1.0.0" 797 | fs-extra "^8.1.0" 798 | globby "^6.1.0" 799 | 800 | glob-parent@^5.0.0: 801 | version "5.1.1" 802 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" 803 | integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== 804 | dependencies: 805 | is-glob "^4.0.1" 806 | 807 | glob@^7.0.3, glob@^7.0.5, glob@^7.1.3: 808 | version "7.1.6" 809 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 810 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 811 | dependencies: 812 | fs.realpath "^1.0.0" 813 | inflight "^1.0.4" 814 | inherits "2" 815 | minimatch "^3.0.4" 816 | once "^1.3.0" 817 | path-is-absolute "^1.0.0" 818 | 819 | globals@^12.1.0: 820 | version "12.4.0" 821 | resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" 822 | integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== 823 | dependencies: 824 | type-fest "^0.8.1" 825 | 826 | globby@^6.1.0: 827 | version "6.1.0" 828 | resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" 829 | integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= 830 | dependencies: 831 | array-union "^1.0.1" 832 | glob "^7.0.3" 833 | object-assign "^4.0.1" 834 | pify "^2.0.0" 835 | pinkie-promise "^2.0.0" 836 | 837 | graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: 838 | version "4.2.4" 839 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" 840 | integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== 841 | 842 | has-flag@^3.0.0: 843 | version "3.0.0" 844 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 845 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 846 | 847 | has-flag@^4.0.0: 848 | version "4.0.0" 849 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 850 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 851 | 852 | has-symbols@^1.0.0, has-symbols@^1.0.1: 853 | version "1.0.1" 854 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" 855 | integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== 856 | 857 | has@^1.0.3: 858 | version "1.0.3" 859 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 860 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 861 | dependencies: 862 | function-bind "^1.1.1" 863 | 864 | hosted-git-info@^2.1.4: 865 | version "2.8.8" 866 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" 867 | integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== 868 | 869 | humanize-url@^1.0.0: 870 | version "1.0.1" 871 | resolved "https://registry.yarnpkg.com/humanize-url/-/humanize-url-1.0.1.tgz#f4ab99e0d288174ca4e1e50407c55fbae464efff" 872 | integrity sha1-9KuZ4NKIF0yk4eUEB8VfuuRk7/8= 873 | dependencies: 874 | normalize-url "^1.0.0" 875 | strip-url-auth "^1.0.0" 876 | 877 | iconv-lite@^0.4.24: 878 | version "0.4.24" 879 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 880 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 881 | dependencies: 882 | safer-buffer ">= 2.1.2 < 3" 883 | 884 | ignore@^4.0.6: 885 | version "4.0.6" 886 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" 887 | integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== 888 | 889 | ignore@^5.0.0, ignore@^5.1.1: 890 | version "5.1.8" 891 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" 892 | integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== 893 | 894 | import-fresh@^3.0.0: 895 | version "3.2.1" 896 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" 897 | integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== 898 | dependencies: 899 | parent-module "^1.0.0" 900 | resolve-from "^4.0.0" 901 | 902 | imurmurhash@^0.1.4: 903 | version "0.1.4" 904 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 905 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 906 | 907 | inflight@^1.0.4: 908 | version "1.0.6" 909 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 910 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 911 | dependencies: 912 | once "^1.3.0" 913 | wrappy "1" 914 | 915 | inherits@2: 916 | version "2.0.4" 917 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 918 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 919 | 920 | inquirer@^7.0.0: 921 | version "7.1.0" 922 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" 923 | integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== 924 | dependencies: 925 | ansi-escapes "^4.2.1" 926 | chalk "^3.0.0" 927 | cli-cursor "^3.1.0" 928 | cli-width "^2.0.0" 929 | external-editor "^3.0.3" 930 | figures "^3.0.0" 931 | lodash "^4.17.15" 932 | mute-stream "0.0.8" 933 | run-async "^2.4.0" 934 | rxjs "^6.5.3" 935 | string-width "^4.1.0" 936 | strip-ansi "^6.0.0" 937 | through "^2.3.6" 938 | 939 | is-arrayish@^0.2.1: 940 | version "0.2.1" 941 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 942 | integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= 943 | 944 | is-callable@^1.1.4, is-callable@^1.1.5: 945 | version "1.2.0" 946 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" 947 | integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== 948 | 949 | is-date-object@^1.0.1: 950 | version "1.0.2" 951 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" 952 | integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== 953 | 954 | is-extglob@^2.1.1: 955 | version "2.1.1" 956 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 957 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 958 | 959 | is-fullwidth-code-point@^2.0.0: 960 | version "2.0.0" 961 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 962 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 963 | 964 | is-fullwidth-code-point@^3.0.0: 965 | version "3.0.0" 966 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 967 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 968 | 969 | is-glob@^4.0.0, is-glob@^4.0.1: 970 | version "4.0.1" 971 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 972 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 973 | dependencies: 974 | is-extglob "^2.1.1" 975 | 976 | is-plain-obj@^1.0.0: 977 | version "1.1.0" 978 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" 979 | integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= 980 | 981 | is-regex@^1.0.5: 982 | version "1.1.0" 983 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff" 984 | integrity sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw== 985 | dependencies: 986 | has-symbols "^1.0.1" 987 | 988 | is-string@^1.0.5: 989 | version "1.0.5" 990 | resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" 991 | integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== 992 | 993 | is-symbol@^1.0.2: 994 | version "1.0.3" 995 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" 996 | integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== 997 | dependencies: 998 | has-symbols "^1.0.1" 999 | 1000 | isarray@^1.0.0: 1001 | version "1.0.0" 1002 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1003 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 1004 | 1005 | isexe@^2.0.0: 1006 | version "2.0.0" 1007 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1008 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 1009 | 1010 | "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: 1011 | version "4.0.0" 1012 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1013 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1014 | 1015 | js-yaml@^3.13.1: 1016 | version "3.14.0" 1017 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" 1018 | integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== 1019 | dependencies: 1020 | argparse "^1.0.7" 1021 | esprima "^4.0.0" 1022 | 1023 | json-parse-better-errors@^1.0.1: 1024 | version "1.0.2" 1025 | resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" 1026 | integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== 1027 | 1028 | json-schema-traverse@^0.4.1: 1029 | version "0.4.1" 1030 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1031 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1032 | 1033 | json-stable-stringify-without-jsonify@^1.0.1: 1034 | version "1.0.1" 1035 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1036 | integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= 1037 | 1038 | jsonfile@^4.0.0: 1039 | version "4.0.0" 1040 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 1041 | integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= 1042 | optionalDependencies: 1043 | graceful-fs "^4.1.6" 1044 | 1045 | jsx-ast-utils@^2.1.0: 1046 | version "2.3.0" 1047 | resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.3.0.tgz#edd727794ea284d7fda575015ed1b0cde0289ab6" 1048 | integrity sha512-3HNoc7nZ1hpZIKB3hJ7BlFRkzCx2BynRtfSwbkqZdpRdvAPsGMnzclPwrvDBS7/lalHTj21NwIeaEpysHBOudg== 1049 | dependencies: 1050 | array-includes "^3.1.1" 1051 | object.assign "^4.1.0" 1052 | 1053 | levn@^0.3.0, levn@~0.3.0: 1054 | version "0.3.0" 1055 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 1056 | integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= 1057 | dependencies: 1058 | prelude-ls "~1.1.2" 1059 | type-check "~0.3.2" 1060 | 1061 | load-json-file@^2.0.0: 1062 | version "2.0.0" 1063 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" 1064 | integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= 1065 | dependencies: 1066 | graceful-fs "^4.1.2" 1067 | parse-json "^2.2.0" 1068 | pify "^2.0.0" 1069 | strip-bom "^3.0.0" 1070 | 1071 | load-json-file@^5.2.0: 1072 | version "5.3.0" 1073 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-5.3.0.tgz#4d3c1e01fa1c03ea78a60ac7af932c9ce53403f3" 1074 | integrity sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw== 1075 | dependencies: 1076 | graceful-fs "^4.1.15" 1077 | parse-json "^4.0.0" 1078 | pify "^4.0.1" 1079 | strip-bom "^3.0.0" 1080 | type-fest "^0.3.0" 1081 | 1082 | locate-path@^2.0.0: 1083 | version "2.0.0" 1084 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" 1085 | integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= 1086 | dependencies: 1087 | p-locate "^2.0.0" 1088 | path-exists "^3.0.0" 1089 | 1090 | locate-path@^3.0.0: 1091 | version "3.0.0" 1092 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" 1093 | integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== 1094 | dependencies: 1095 | p-locate "^3.0.0" 1096 | path-exists "^3.0.0" 1097 | 1098 | lodash@^4.17.14, lodash@^4.17.15: 1099 | version "4.17.19" 1100 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" 1101 | integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== 1102 | 1103 | loose-envify@^1.4.0: 1104 | version "1.4.0" 1105 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 1106 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 1107 | dependencies: 1108 | js-tokens "^3.0.0 || ^4.0.0" 1109 | 1110 | mimic-fn@^2.1.0: 1111 | version "2.1.0" 1112 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 1113 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 1114 | 1115 | minimatch@^3.0.4: 1116 | version "3.0.4" 1117 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1118 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1119 | dependencies: 1120 | brace-expansion "^1.1.7" 1121 | 1122 | minimist@^1.2.5: 1123 | version "1.2.5" 1124 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 1125 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 1126 | 1127 | mkdirp@^0.5.1: 1128 | version "0.5.5" 1129 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" 1130 | integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== 1131 | dependencies: 1132 | minimist "^1.2.5" 1133 | 1134 | ms@2.0.0: 1135 | version "2.0.0" 1136 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1137 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1138 | 1139 | ms@^2.1.1: 1140 | version "2.1.2" 1141 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1142 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1143 | 1144 | mute-stream@0.0.8: 1145 | version "0.0.8" 1146 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" 1147 | integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== 1148 | 1149 | natural-compare@^1.4.0: 1150 | version "1.4.0" 1151 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1152 | integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= 1153 | 1154 | nice-try@^1.0.4: 1155 | version "1.0.5" 1156 | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 1157 | integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== 1158 | 1159 | node-fetch@^2.2.0: 1160 | version "2.6.0" 1161 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" 1162 | integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== 1163 | 1164 | normalize-package-data@^2.3.2: 1165 | version "2.5.0" 1166 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" 1167 | integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== 1168 | dependencies: 1169 | hosted-git-info "^2.1.4" 1170 | resolve "^1.10.0" 1171 | semver "2 || 3 || 4 || 5" 1172 | validate-npm-package-license "^3.0.1" 1173 | 1174 | normalize-url@^1.0.0: 1175 | version "1.9.1" 1176 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" 1177 | integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= 1178 | dependencies: 1179 | object-assign "^4.0.1" 1180 | prepend-http "^1.0.0" 1181 | query-string "^4.1.0" 1182 | sort-keys "^1.0.0" 1183 | 1184 | object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: 1185 | version "4.1.1" 1186 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1187 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1188 | 1189 | object-inspect@^1.7.0: 1190 | version "1.7.0" 1191 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" 1192 | integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== 1193 | 1194 | object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: 1195 | version "1.1.1" 1196 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 1197 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 1198 | 1199 | object.assign@^4.1.0: 1200 | version "4.1.0" 1201 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" 1202 | integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== 1203 | dependencies: 1204 | define-properties "^1.1.2" 1205 | function-bind "^1.1.1" 1206 | has-symbols "^1.0.0" 1207 | object-keys "^1.0.11" 1208 | 1209 | object.entries@^1.1.0: 1210 | version "1.1.2" 1211 | resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add" 1212 | integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA== 1213 | dependencies: 1214 | define-properties "^1.1.3" 1215 | es-abstract "^1.17.5" 1216 | has "^1.0.3" 1217 | 1218 | object.fromentries@^2.0.0: 1219 | version "2.0.2" 1220 | resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" 1221 | integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== 1222 | dependencies: 1223 | define-properties "^1.1.3" 1224 | es-abstract "^1.17.0-next.1" 1225 | function-bind "^1.1.1" 1226 | has "^1.0.3" 1227 | 1228 | object.values@^1.1.0: 1229 | version "1.1.1" 1230 | resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" 1231 | integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== 1232 | dependencies: 1233 | define-properties "^1.1.3" 1234 | es-abstract "^1.17.0-next.1" 1235 | function-bind "^1.1.1" 1236 | has "^1.0.3" 1237 | 1238 | once@^1.3.0: 1239 | version "1.4.0" 1240 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1241 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1242 | dependencies: 1243 | wrappy "1" 1244 | 1245 | onetime@^5.1.0: 1246 | version "5.1.0" 1247 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" 1248 | integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== 1249 | dependencies: 1250 | mimic-fn "^2.1.0" 1251 | 1252 | optionator@^0.8.3: 1253 | version "0.8.3" 1254 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" 1255 | integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== 1256 | dependencies: 1257 | deep-is "~0.1.3" 1258 | fast-levenshtein "~2.0.6" 1259 | levn "~0.3.0" 1260 | prelude-ls "~1.1.2" 1261 | type-check "~0.3.2" 1262 | word-wrap "~1.2.3" 1263 | 1264 | os-tmpdir@~1.0.2: 1265 | version "1.0.2" 1266 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1267 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 1268 | 1269 | p-limit@^1.1.0: 1270 | version "1.3.0" 1271 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" 1272 | integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== 1273 | dependencies: 1274 | p-try "^1.0.0" 1275 | 1276 | p-limit@^2.0.0: 1277 | version "2.3.0" 1278 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 1279 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 1280 | dependencies: 1281 | p-try "^2.0.0" 1282 | 1283 | p-locate@^2.0.0: 1284 | version "2.0.0" 1285 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" 1286 | integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= 1287 | dependencies: 1288 | p-limit "^1.1.0" 1289 | 1290 | p-locate@^3.0.0: 1291 | version "3.0.0" 1292 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" 1293 | integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== 1294 | dependencies: 1295 | p-limit "^2.0.0" 1296 | 1297 | p-try@^1.0.0: 1298 | version "1.0.0" 1299 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" 1300 | integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= 1301 | 1302 | p-try@^2.0.0: 1303 | version "2.2.0" 1304 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1305 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1306 | 1307 | pako@^1.0.5: 1308 | version "1.0.11" 1309 | resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" 1310 | integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== 1311 | 1312 | parent-module@^1.0.0: 1313 | version "1.0.1" 1314 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1315 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1316 | dependencies: 1317 | callsites "^3.0.0" 1318 | 1319 | parse-json@^2.2.0: 1320 | version "2.2.0" 1321 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 1322 | integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= 1323 | dependencies: 1324 | error-ex "^1.2.0" 1325 | 1326 | parse-json@^4.0.0: 1327 | version "4.0.0" 1328 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" 1329 | integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= 1330 | dependencies: 1331 | error-ex "^1.3.1" 1332 | json-parse-better-errors "^1.0.1" 1333 | 1334 | path-exists@^3.0.0: 1335 | version "3.0.0" 1336 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1337 | integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 1338 | 1339 | path-is-absolute@^1.0.0: 1340 | version "1.0.1" 1341 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1342 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1343 | 1344 | path-key@^2.0.1: 1345 | version "2.0.1" 1346 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 1347 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 1348 | 1349 | path-parse@^1.0.6: 1350 | version "1.0.6" 1351 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 1352 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 1353 | 1354 | path-type@^2.0.0: 1355 | version "2.0.0" 1356 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" 1357 | integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= 1358 | dependencies: 1359 | pify "^2.0.0" 1360 | 1361 | pify@^2.0.0: 1362 | version "2.3.0" 1363 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1364 | integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= 1365 | 1366 | pify@^4.0.1: 1367 | version "4.0.1" 1368 | resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" 1369 | integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== 1370 | 1371 | pinkie-promise@^2.0.0: 1372 | version "2.0.1" 1373 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1374 | integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= 1375 | dependencies: 1376 | pinkie "^2.0.0" 1377 | 1378 | pinkie@^2.0.0: 1379 | version "2.0.4" 1380 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1381 | integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= 1382 | 1383 | pkg-conf@^3.1.0: 1384 | version "3.1.0" 1385 | resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-3.1.0.tgz#d9f9c75ea1bae0e77938cde045b276dac7cc69ae" 1386 | integrity sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ== 1387 | dependencies: 1388 | find-up "^3.0.0" 1389 | load-json-file "^5.2.0" 1390 | 1391 | pkg-config@^1.1.0: 1392 | version "1.1.1" 1393 | resolved "https://registry.yarnpkg.com/pkg-config/-/pkg-config-1.1.1.tgz#557ef22d73da3c8837107766c52eadabde298fe4" 1394 | integrity sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q= 1395 | dependencies: 1396 | debug-log "^1.0.0" 1397 | find-root "^1.0.0" 1398 | xtend "^4.0.1" 1399 | 1400 | pkg-dir@^2.0.0: 1401 | version "2.0.0" 1402 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" 1403 | integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= 1404 | dependencies: 1405 | find-up "^2.1.0" 1406 | 1407 | prelude-ls@~1.1.2: 1408 | version "1.1.2" 1409 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 1410 | integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= 1411 | 1412 | prepend-http@^1.0.0: 1413 | version "1.0.4" 1414 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" 1415 | integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= 1416 | 1417 | progress@^2.0.0: 1418 | version "2.0.3" 1419 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" 1420 | integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== 1421 | 1422 | prop-types@^15.7.2: 1423 | version "15.7.2" 1424 | resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" 1425 | integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== 1426 | dependencies: 1427 | loose-envify "^1.4.0" 1428 | object-assign "^4.1.1" 1429 | react-is "^16.8.1" 1430 | 1431 | punycode@^2.1.0: 1432 | version "2.1.1" 1433 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1434 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1435 | 1436 | query-string@^4.1.0: 1437 | version "4.3.4" 1438 | resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" 1439 | integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= 1440 | dependencies: 1441 | object-assign "^4.1.0" 1442 | strict-uri-encode "^1.0.0" 1443 | 1444 | quickselect@^2.0.0: 1445 | version "2.0.0" 1446 | resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-2.0.0.tgz#f19680a486a5eefb581303e023e98faaf25dd018" 1447 | integrity sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw== 1448 | 1449 | rbush@^3.0.1: 1450 | version "3.0.1" 1451 | resolved "https://registry.yarnpkg.com/rbush/-/rbush-3.0.1.tgz#5fafa8a79b3b9afdfe5008403a720cc1de882ecf" 1452 | integrity sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w== 1453 | dependencies: 1454 | quickselect "^2.0.0" 1455 | 1456 | react-is@^16.8.1: 1457 | version "16.13.1" 1458 | resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" 1459 | integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== 1460 | 1461 | read-pkg-up@^2.0.0: 1462 | version "2.0.0" 1463 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" 1464 | integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= 1465 | dependencies: 1466 | find-up "^2.0.0" 1467 | read-pkg "^2.0.0" 1468 | 1469 | read-pkg@^2.0.0: 1470 | version "2.0.0" 1471 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" 1472 | integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= 1473 | dependencies: 1474 | load-json-file "^2.0.0" 1475 | normalize-package-data "^2.3.2" 1476 | path-type "^2.0.0" 1477 | 1478 | regexpp@^2.0.1: 1479 | version "2.0.1" 1480 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" 1481 | integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== 1482 | 1483 | regexpp@^3.0.0: 1484 | version "3.1.0" 1485 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" 1486 | integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== 1487 | 1488 | resolve-from@^4.0.0: 1489 | version "4.0.0" 1490 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1491 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1492 | 1493 | resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.0, resolve@^1.13.1: 1494 | version "1.17.0" 1495 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" 1496 | integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== 1497 | dependencies: 1498 | path-parse "^1.0.6" 1499 | 1500 | restore-cursor@^3.1.0: 1501 | version "3.1.0" 1502 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" 1503 | integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== 1504 | dependencies: 1505 | onetime "^5.1.0" 1506 | signal-exit "^3.0.2" 1507 | 1508 | rimraf@2.6.3: 1509 | version "2.6.3" 1510 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" 1511 | integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== 1512 | dependencies: 1513 | glob "^7.1.3" 1514 | 1515 | run-async@^2.4.0: 1516 | version "2.4.1" 1517 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" 1518 | integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== 1519 | 1520 | run-parallel@^1.1.2: 1521 | version "1.1.9" 1522 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" 1523 | integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== 1524 | 1525 | rxjs@^6.5.3: 1526 | version "6.5.5" 1527 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" 1528 | integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== 1529 | dependencies: 1530 | tslib "^1.9.0" 1531 | 1532 | "safer-buffer@>= 2.1.2 < 3": 1533 | version "2.1.2" 1534 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1535 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1536 | 1537 | "semver@2 || 3 || 4 || 5", semver@^5.5.0: 1538 | version "5.7.1" 1539 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1540 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1541 | 1542 | semver@^6.1.0, semver@^6.1.2: 1543 | version "6.3.0" 1544 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 1545 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 1546 | 1547 | shebang-command@^1.2.0: 1548 | version "1.2.0" 1549 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1550 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 1551 | dependencies: 1552 | shebang-regex "^1.0.0" 1553 | 1554 | shebang-regex@^1.0.0: 1555 | version "1.0.0" 1556 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1557 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 1558 | 1559 | signal-exit@^3.0.2: 1560 | version "3.0.3" 1561 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 1562 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 1563 | 1564 | slice-ansi@^2.1.0: 1565 | version "2.1.0" 1566 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" 1567 | integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== 1568 | dependencies: 1569 | ansi-styles "^3.2.0" 1570 | astral-regex "^1.0.0" 1571 | is-fullwidth-code-point "^2.0.0" 1572 | 1573 | sort-keys@^1.0.0: 1574 | version "1.1.2" 1575 | resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" 1576 | integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= 1577 | dependencies: 1578 | is-plain-obj "^1.0.0" 1579 | 1580 | spdx-correct@^3.0.0: 1581 | version "3.1.1" 1582 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" 1583 | integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== 1584 | dependencies: 1585 | spdx-expression-parse "^3.0.0" 1586 | spdx-license-ids "^3.0.0" 1587 | 1588 | spdx-exceptions@^2.1.0: 1589 | version "2.3.0" 1590 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" 1591 | integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== 1592 | 1593 | spdx-expression-parse@^3.0.0: 1594 | version "3.0.1" 1595 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" 1596 | integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== 1597 | dependencies: 1598 | spdx-exceptions "^2.1.0" 1599 | spdx-license-ids "^3.0.0" 1600 | 1601 | spdx-license-ids@^3.0.0: 1602 | version "3.0.5" 1603 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" 1604 | integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== 1605 | 1606 | sprintf-js@~1.0.2: 1607 | version "1.0.3" 1608 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1609 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 1610 | 1611 | standard-engine@^12.0.0: 1612 | version "12.1.0" 1613 | resolved "https://registry.yarnpkg.com/standard-engine/-/standard-engine-12.1.0.tgz#b13dbae583de54c06805207b991ef48a582c0e62" 1614 | integrity sha512-DVJnWM1CGkag4ucFLGdiYWa5/kJURPONmMmk17p8FT5NE4UnPZB1vxWnXnRo2sPSL78pWJG8xEM+1Tu19z0deg== 1615 | dependencies: 1616 | deglob "^4.0.1" 1617 | get-stdin "^7.0.0" 1618 | minimist "^1.2.5" 1619 | pkg-conf "^3.1.0" 1620 | 1621 | standard@^14.3.4: 1622 | version "14.3.4" 1623 | resolved "https://registry.yarnpkg.com/standard/-/standard-14.3.4.tgz#748e80e8cd7b535844a85a12f337755a7e3a0f6e" 1624 | integrity sha512-+lpOkFssMkljJ6eaILmqxHQ2n4csuEABmcubLTb9almFi1ElDzXb1819fjf/5ygSyePCq4kU2wMdb2fBfb9P9Q== 1625 | dependencies: 1626 | eslint "~6.8.0" 1627 | eslint-config-standard "14.1.1" 1628 | eslint-config-standard-jsx "8.1.0" 1629 | eslint-plugin-import "~2.18.0" 1630 | eslint-plugin-node "~10.0.0" 1631 | eslint-plugin-promise "~4.2.1" 1632 | eslint-plugin-react "~7.14.2" 1633 | eslint-plugin-standard "~4.0.0" 1634 | standard-engine "^12.0.0" 1635 | 1636 | strict-uri-encode@^1.0.0: 1637 | version "1.1.0" 1638 | resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" 1639 | integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= 1640 | 1641 | string-width@^3.0.0: 1642 | version "3.1.0" 1643 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" 1644 | integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== 1645 | dependencies: 1646 | emoji-regex "^7.0.1" 1647 | is-fullwidth-code-point "^2.0.0" 1648 | strip-ansi "^5.1.0" 1649 | 1650 | string-width@^4.1.0: 1651 | version "4.2.0" 1652 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" 1653 | integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== 1654 | dependencies: 1655 | emoji-regex "^8.0.0" 1656 | is-fullwidth-code-point "^3.0.0" 1657 | strip-ansi "^6.0.0" 1658 | 1659 | string.prototype.trimend@^1.0.0: 1660 | version "1.0.1" 1661 | resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" 1662 | integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== 1663 | dependencies: 1664 | define-properties "^1.1.3" 1665 | es-abstract "^1.17.5" 1666 | 1667 | string.prototype.trimleft@^2.1.1: 1668 | version "2.1.2" 1669 | resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" 1670 | integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw== 1671 | dependencies: 1672 | define-properties "^1.1.3" 1673 | es-abstract "^1.17.5" 1674 | string.prototype.trimstart "^1.0.0" 1675 | 1676 | string.prototype.trimright@^2.1.1: 1677 | version "2.1.2" 1678 | resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" 1679 | integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg== 1680 | dependencies: 1681 | define-properties "^1.1.3" 1682 | es-abstract "^1.17.5" 1683 | string.prototype.trimend "^1.0.0" 1684 | 1685 | string.prototype.trimstart@^1.0.0: 1686 | version "1.0.1" 1687 | resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" 1688 | integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== 1689 | dependencies: 1690 | define-properties "^1.1.3" 1691 | es-abstract "^1.17.5" 1692 | 1693 | strip-ansi@^5.1.0, strip-ansi@^5.2.0: 1694 | version "5.2.0" 1695 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" 1696 | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 1697 | dependencies: 1698 | ansi-regex "^4.1.0" 1699 | 1700 | strip-ansi@^6.0.0: 1701 | version "6.0.0" 1702 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 1703 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 1704 | dependencies: 1705 | ansi-regex "^5.0.0" 1706 | 1707 | strip-bom@^3.0.0: 1708 | version "3.0.0" 1709 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 1710 | integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= 1711 | 1712 | strip-json-comments@^3.0.1: 1713 | version "3.1.0" 1714 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180" 1715 | integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== 1716 | 1717 | strip-outer@^1.0.0: 1718 | version "1.0.1" 1719 | resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" 1720 | integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== 1721 | dependencies: 1722 | escape-string-regexp "^1.0.2" 1723 | 1724 | strip-url-auth@^1.0.0: 1725 | version "1.0.1" 1726 | resolved "https://registry.yarnpkg.com/strip-url-auth/-/strip-url-auth-1.0.1.tgz#22b0fa3a41385b33be3f331551bbb837fa0cd7ae" 1727 | integrity sha1-IrD6OkE4WzO+PzMVUbu4N/oM164= 1728 | 1729 | supports-color@^5.3.0: 1730 | version "5.5.0" 1731 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1732 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1733 | dependencies: 1734 | has-flag "^3.0.0" 1735 | 1736 | supports-color@^7.1.0: 1737 | version "7.1.0" 1738 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" 1739 | integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== 1740 | dependencies: 1741 | has-flag "^4.0.0" 1742 | 1743 | table@^5.2.3: 1744 | version "5.4.6" 1745 | resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" 1746 | integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== 1747 | dependencies: 1748 | ajv "^6.10.2" 1749 | lodash "^4.17.14" 1750 | slice-ansi "^2.1.0" 1751 | string-width "^3.0.0" 1752 | 1753 | text-table@^0.2.0: 1754 | version "0.2.0" 1755 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1756 | integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= 1757 | 1758 | three@*, three@^0.117.1: 1759 | version "0.117.1" 1760 | resolved "https://registry.yarnpkg.com/three/-/three-0.117.1.tgz#a49bcb1a6ddea2f250003e42585dc3e78e92b9d3" 1761 | integrity sha512-t4zeJhlNzUIj9+ub0l6nICVimSuRTZJOqvk3Rmlu+YGdTOJ49Wna8p7aumpkXJakJfITiybfpYE1XN1o1Z34UQ== 1762 | 1763 | through@^2.3.6: 1764 | version "2.3.8" 1765 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1766 | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 1767 | 1768 | tmp@^0.0.33: 1769 | version "0.0.33" 1770 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 1771 | integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== 1772 | dependencies: 1773 | os-tmpdir "~1.0.2" 1774 | 1775 | trim-repeated@^1.0.0: 1776 | version "1.0.0" 1777 | resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" 1778 | integrity sha1-42RqLqTokTEr9+rObPsFOAvAHCE= 1779 | dependencies: 1780 | escape-string-regexp "^1.0.2" 1781 | 1782 | tslib@^1.9.0: 1783 | version "1.13.0" 1784 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" 1785 | integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== 1786 | 1787 | type-check@~0.3.2: 1788 | version "0.3.2" 1789 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 1790 | integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= 1791 | dependencies: 1792 | prelude-ls "~1.1.2" 1793 | 1794 | type-fest@^0.11.0: 1795 | version "0.11.0" 1796 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" 1797 | integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== 1798 | 1799 | type-fest@^0.3.0: 1800 | version "0.3.1" 1801 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" 1802 | integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== 1803 | 1804 | type-fest@^0.8.1: 1805 | version "0.8.1" 1806 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" 1807 | integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== 1808 | 1809 | uniq@^1.0.1: 1810 | version "1.0.1" 1811 | resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" 1812 | integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= 1813 | 1814 | universalify@^0.1.0: 1815 | version "0.1.2" 1816 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 1817 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 1818 | 1819 | upng-js@^2.1.0: 1820 | version "2.1.0" 1821 | resolved "https://registry.yarnpkg.com/upng-js/-/upng-js-2.1.0.tgz#7176e73973db361ca95d0fa14f958385db6b9dd2" 1822 | integrity sha512-d3xzZzpMP64YkjP5pr8gNyvBt7dLk/uGI67EctzDuVp4lCZyVMo0aJO6l/VDlgbInJYDY6cnClLoBp29eKWI6g== 1823 | dependencies: 1824 | pako "^1.0.5" 1825 | 1826 | uri-js@^4.2.2: 1827 | version "4.2.2" 1828 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 1829 | integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== 1830 | dependencies: 1831 | punycode "^2.1.0" 1832 | 1833 | v8-compile-cache@^2.0.3: 1834 | version "2.1.1" 1835 | resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" 1836 | integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== 1837 | 1838 | validate-npm-package-license@^3.0.1: 1839 | version "3.0.4" 1840 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 1841 | integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== 1842 | dependencies: 1843 | spdx-correct "^3.0.0" 1844 | spdx-expression-parse "^3.0.0" 1845 | 1846 | which@^1.2.9: 1847 | version "1.3.1" 1848 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1849 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 1850 | dependencies: 1851 | isexe "^2.0.0" 1852 | 1853 | word-wrap@~1.2.3: 1854 | version "1.2.3" 1855 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" 1856 | integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== 1857 | 1858 | wrappy@1: 1859 | version "1.0.2" 1860 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1861 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1862 | 1863 | write@1.0.3: 1864 | version "1.0.3" 1865 | resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" 1866 | integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== 1867 | dependencies: 1868 | mkdirp "^0.5.1" 1869 | 1870 | xtend@^4.0.1: 1871 | version "4.0.2" 1872 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" 1873 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 1874 | --------------------------------------------------------------------------------