UNPKG

kepler.gl

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

230 lines (228 loc) 30.2 kB
"use strict"; var _typeAnalyzer = require("type-analyzer"); var _constants = require("@kepler.gl/constants"); var _vectorTileUtils = require("./vector-tile-utils"); var _tileMetadata = require("../../../../test/fixtures/tile-metadata"); // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project describe('getTileUrl', function () { [{ name: 'empty string', input: '', expected: null }, { name: 'invalid URL', input: '/foo/bar/baz.mvt', expected: null }, { name: 'Valid URL, no placeholders', input: 'http://www.example.com', expected: 'http://www.example.com/{z}/{x}/{y}.pbf' }, { name: 'Valid URL, no placeholders, trailing slash', input: 'http://www.example.com/', expected: 'http://www.example.com/{z}/{x}/{y}.pbf' }, { name: 'Valid URL, placeholders', input: 'http://www.example.com/{z}/{x}/{y}.pbf', expected: 'http://www.example.com/{z}/{x}/{y}.pbf' }, { name: 'Valid URL, placeholders, mvt', input: 'http://www.example.com/{z}/{x}/{y}.mvt', expected: 'http://www.example.com/{z}/{x}/{y}.mvt' }, { name: 'Valid URL, placeholders, mvt, access token', input: 'https://api.mapbox.com/v4/spam/{z}/{x}/{y}.mvt?access_token=sk.fobar.baz', expected: 'https://api.mapbox.com/v4/spam/{z}/{x}/{y}.mvt?access_token=sk.fobar.baz' }].forEach(function (_ref) { var name = _ref.name, input = _ref.input, expected = _ref.expected; test(name, function () { expect((0, _vectorTileUtils.getTileUrl)(input)).toBe(expected); }); }); }); describe('getMetaUrl', function () { [{ name: 'empty string', input: '', expected: null }, { name: 'invalid URL', input: '/foo/bar/baz.mvt', expected: null }, { name: 'Valid URL, unknown domain', input: 'http://www.example.com/some_tiles', expected: 'http://www.example.com/some_tiles/metadata.json' }, { name: 'Valid URL, unknown domain, trailing slash', input: 'http://www.example.com/some_tiles/', expected: 'http://www.example.com/some_tiles/metadata.json' }, { name: 'Valid URL, Mapbox domain', input: 'https://api.mapbox.com/v4/spam/{z}/{x}/{y}.mvt', expected: 'https://api.mapbox.com/v4/spam.json' }, { name: 'Valid URL, placeholders, mvt, access token', input: 'https://api.mapbox.com/v4/spam/{z}/{x}/{y}.mvt?access_token=sk.fobar.baz', expected: 'https://api.mapbox.com/v4/spam.json?access_token=sk.fobar.baz' }, { name: 'Valid URL, placeholders, mvt, access token, published style version', input: 'https://api.mapbox.com/v4/spam/{z}/{x}/{y}.mvt?style=mapbox://styles/user/styleId@00&access_token=pk.xxx.zzz', expected: 'https://api.mapbox.com/v4/spam.json?style=mapbox://styles/user/styleId@00&access_token=pk.xxx.zzz' }].forEach(function (_ref2) { var name = _ref2.name, input = _ref2.input, expected = _ref2.expected; test(name, function () { expect((0, _vectorTileUtils.getMetaUrl)(input)).toBe(expected); }); }); }); test('parseMetadata, metadata from MVTSource and Mapbox URL', function () { expect((0, _vectorTileUtils.parseVectorMetadata)(_tileMetadata.MVT_METADATA, { tileUrl: 'https://api.mapbox.com/v4/spam/{z}/{x}/{y}.mvt' })).toEqual({ attributions: [], metaJson: null, bounds: [-180, -85, 180, 85], center: [0, 0, 0], maxZoom: 16, minZoom: 0, fields: [{ name: 'class', id: 'class', format: '', filterProps: { domain: [], value: [], type: 'multiSelect', gpu: false }, type: 'string', analyzerType: 'STRING' }], name: 'Mapbox Streets v8', description: '' }); }); test('parseMetadata, PMTiles from PMTileSource', function () { expect((0, _vectorTileUtils.parseVectorMetadata)(_tileMetadata.PMTILES_METADATA, { tileUrl: 'https://4sq-studio-data-staging.s3.us-west-2.amazonaws.com/some_path/some_file.pmtiles' })).toEqual({ attributions: [], name: 'My Custom Tiles', description: 'My Custom Tiles Description', metaJson: null, bounds: [-150.1122219, -51.8952777, 179.3577783, 69.6043747], center: [14.0625, 50.7026397, 6], maxZoom: 6, minZoom: 0, fields: [{ id: 'metric', name: 'metric', format: '', type: _constants.ALL_FIELD_TYPES.real, analyzerType: _typeAnalyzer.DATA_TYPES.FLOAT, filterProps: { domain: [-1, 10], value: [-1, 10], type: _constants.FILTER_TYPES.range, typeOptions: [_constants.FILTER_TYPES.range], gpu: true, step: 0.01 } }, { id: 'continent', name: 'continent', format: '', type: _constants.ALL_FIELD_TYPES.string, analyzerType: _typeAnalyzer.DATA_TYPES.STRING, filterProps: { domain: ['Africa', 'Asia', 'Europe', 'North America', 'Oceania', 'South America'], value: ['Africa', 'Asia', 'Europe', 'North America', 'Oceania', 'South America'], type: _constants.FILTER_TYPES.multiSelect, gpu: false } }], pmtilesType: 'mvt' }); }); test('parseMetadata, empty input', function () { expect((0, _vectorTileUtils.parseVectorMetadata)({})).toEqual({ attributions: [], name: '', description: '', metaJson: null, bounds: null, center: null, maxZoom: null, minZoom: null, fields: [] }); expect((0, _vectorTileUtils.parseVectorMetadata)({}, { tileUrl: 'http://xyz.api.here.com/some_id/tile/web/{z}_{x}_{y}.pbf' })).toEqual({ attributions: [], name: '', description: '', metaJson: null, bounds: null, center: null, maxZoom: null, minZoom: null, fields: [] }); expect((0, _vectorTileUtils.parseVectorMetadata)({}, { tileUrl: 'https://api.mapbox.com/v4/spam/{z}/{x}/{y}.mvt' })).toEqual({ attributions: [], name: '', description: '', metaJson: null, bounds: null, center: null, maxZoom: null, minZoom: null, fields: [] }); }); describe('parseMetadata, bad cases', function () { [{ name: 'empty string', input: '', expected: null }, { name: 'null', input: null, expected: null }, { name: 'undefined', input: undefined, expected: null }, { name: 'string', input: 'spam', expected: null }].forEach(function (_ref3) { var name = _ref3.name, input = _ref3.input, expected = _ref3.expected; test(name, function () { expect((0, _vectorTileUtils.parseVectorMetadata)(input)).toBe(expected); }); }); }); describe('getTileUrl', function () { test.each([['', null], ['foo', null], ['http', null], ['http://', null], ['https://', null], ['http://mytiles.com', 'http://mytiles.com/{z}/{x}/{y}.pbf'], ['https://mytiles.com', 'https://mytiles.com/{z}/{x}/{y}.pbf'], ['http://mytiles.com/', 'http://mytiles.com/{z}/{x}/{y}.pbf'], ['http://mytiles.com/foo', 'http://mytiles.com/foo/{z}/{x}/{y}.pbf'], ['http://mytiles.com/foo/', 'http://mytiles.com/foo/{z}/{x}/{y}.pbf'], ['https://mytiles.com/foo/bar.baz', 'https://mytiles.com/foo/bar.baz/{z}/{x}/{y}.pbf'], ['http://localhost', 'http://localhost/{z}/{x}/{y}.pbf'], ['http://localhost/', 'http://localhost/{z}/{x}/{y}.pbf'], ['http://localhost:8080', 'http://localhost:8080/{z}/{x}/{y}.pbf'], ['http://localhost:8080/', 'http://localhost:8080/{z}/{x}/{y}.pbf'], ['http://mytiles.com/foo/{z}/{x}/{y}.mvt', 'http://mytiles.com/foo/{z}/{x}/{y}.mvt']])('%s', function (input, expected) { expect((0, _vectorTileUtils.getTileUrl)(input)).toEqual(expected); }); }); describe('getMetaUrl', function () { test.each([['', null], ['foo', null], ['http', null], ['http://', null], ['https://', null], ['http://mytiles.com', 'http://mytiles.com/metadata.json'], ['https://mytiles.com', 'https://mytiles.com/metadata.json'], ['http://mytiles.com/', 'http://mytiles.com/metadata.json'], ['http://mytiles.com/foo', 'http://mytiles.com/foo/metadata.json'], ['http://mytiles.com/foo/', 'http://mytiles.com/foo/metadata.json'], ['https://mytiles.com/foo/bar.baz', 'https://mytiles.com/foo/bar.baz/metadata.json'], ['http://localhost', 'http://localhost/metadata.json'], ['http://localhost/', 'http://localhost/metadata.json'], ['http://localhost:8080', 'http://localhost:8080/metadata.json'], ['http://localhost:8080/', 'http://localhost:8080/metadata.json'], ['http://mytiles.com/foo/{z}/{x}/{y}.mvt', 'http://mytiles.com/foo/metadata.json']])('%s', function (input, expected) { expect((0, _vectorTileUtils.getMetaUrl)(input)).toEqual(expected); }); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdHlwZUFuYWx5emVyIiwicmVxdWlyZSIsIl9jb25zdGFudHMiLCJfdmVjdG9yVGlsZVV0aWxzIiwiX3RpbGVNZXRhZGF0YSIsImRlc2NyaWJlIiwibmFtZSIsImlucHV0IiwiZXhwZWN0ZWQiLCJmb3JFYWNoIiwiX3JlZiIsInRlc3QiLCJleHBlY3QiLCJnZXRUaWxlVXJsIiwidG9CZSIsIl9yZWYyIiwiZ2V0TWV0YVVybCIsInBhcnNlTWV0YWRhdGEiLCJNVlRfTUVUQURBVEEiLCJ0aWxlVXJsIiwidG9FcXVhbCIsImF0dHJpYnV0aW9ucyIsIm1ldGFKc29uIiwiYm91bmRzIiwiY2VudGVyIiwibWF4Wm9vbSIsIm1pblpvb20iLCJmaWVsZHMiLCJpZCIsImZvcm1hdCIsImZpbHRlclByb3BzIiwiZG9tYWluIiwidmFsdWUiLCJ0eXBlIiwiZ3B1IiwiYW5hbHl6ZXJUeXBlIiwiZGVzY3JpcHRpb24iLCJQTVRJTEVTX01FVEFEQVRBIiwiQUxMX0ZJRUxEX1RZUEVTIiwicmVhbCIsIkRBVEFfVFlQRVMiLCJGTE9BVCIsIkZJTFRFUl9UWVBFUyIsInJhbmdlIiwidHlwZU9wdGlvbnMiLCJzdGVwIiwic3RyaW5nIiwiU1RSSU5HIiwibXVsdGlTZWxlY3QiLCJwbXRpbGVzVHlwZSIsInVuZGVmaW5lZCIsIl9yZWYzIiwiZWFjaCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90aWxlc2V0L3ZlY3Rvci10aWxlLXV0aWxzLnNwZWMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHtEQVRBX1RZUEVTfSBmcm9tICd0eXBlLWFuYWx5emVyJztcblxuaW1wb3J0IHtBTExfRklFTERfVFlQRVMsIEZJTFRFUl9UWVBFU30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuXG5pbXBvcnQge2dldFRpbGVVcmwsIGdldE1ldGFVcmwsIHBhcnNlVmVjdG9yTWV0YWRhdGEgYXMgcGFyc2VNZXRhZGF0YX0gZnJvbSAnLi92ZWN0b3ItdGlsZS11dGlscyc7XG5pbXBvcnQge1BNVElMRVNfTUVUQURBVEEsIE1WVF9NRVRBREFUQX0gZnJvbSAnLi4vLi4vLi4vLi4vdGVzdC9maXh0dXJlcy90aWxlLW1ldGFkYXRhJztcblxuZGVzY3JpYmUoJ2dldFRpbGVVcmwnLCAoKSA9PiB7XG4gIFtcbiAgICB7bmFtZTogJ2VtcHR5IHN0cmluZycsIGlucHV0OiAnJywgZXhwZWN0ZWQ6IG51bGx9LFxuICAgIHtuYW1lOiAnaW52YWxpZCBVUkwnLCBpbnB1dDogJy9mb28vYmFyL2Jhei5tdnQnLCBleHBlY3RlZDogbnVsbH0sXG4gICAge1xuICAgICAgbmFtZTogJ1ZhbGlkIFVSTCwgbm8gcGxhY2Vob2xkZXJzJyxcbiAgICAgIGlucHV0OiAnaHR0cDovL3d3dy5leGFtcGxlLmNvbScsXG4gICAgICBleHBlY3RlZDogJ2h0dHA6Ly93d3cuZXhhbXBsZS5jb20ve3p9L3t4fS97eX0ucGJmJ1xuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ1ZhbGlkIFVSTCwgbm8gcGxhY2Vob2xkZXJzLCB0cmFpbGluZyBzbGFzaCcsXG4gICAgICBpbnB1dDogJ2h0dHA6Ly93d3cuZXhhbXBsZS5jb20vJyxcbiAgICAgIGV4cGVjdGVkOiAnaHR0cDovL3d3dy5leGFtcGxlLmNvbS97en0ve3h9L3t5fS5wYmYnXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnVmFsaWQgVVJMLCBwbGFjZWhvbGRlcnMnLFxuICAgICAgaW5wdXQ6ICdodHRwOi8vd3d3LmV4YW1wbGUuY29tL3t6fS97eH0ve3l9LnBiZicsXG4gICAgICBleHBlY3RlZDogJ2h0dHA6Ly93d3cuZXhhbXBsZS5jb20ve3p9L3t4fS97eX0ucGJmJ1xuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ1ZhbGlkIFVSTCwgcGxhY2Vob2xkZXJzLCBtdnQnLFxuICAgICAgaW5wdXQ6ICdodHRwOi8vd3d3LmV4YW1wbGUuY29tL3t6fS97eH0ve3l9Lm12dCcsXG4gICAgICBleHBlY3RlZDogJ2h0dHA6Ly93d3cuZXhhbXBsZS5jb20ve3p9L3t4fS97eX0ubXZ0J1xuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ1ZhbGlkIFVSTCwgcGxhY2Vob2xkZXJzLCBtdnQsIGFjY2VzcyB0b2tlbicsXG4gICAgICBpbnB1dDogJ2h0dHBzOi8vYXBpLm1hcGJveC5jb20vdjQvc3BhbS97en0ve3h9L3t5fS5tdnQ/YWNjZXNzX3Rva2VuPXNrLmZvYmFyLmJheicsXG4gICAgICBleHBlY3RlZDogJ2h0dHBzOi8vYXBpLm1hcGJveC5jb20vdjQvc3BhbS97en0ve3h9L3t5fS5tdnQ/YWNjZXNzX3Rva2VuPXNrLmZvYmFyLmJheidcbiAgICB9XG4gIF0uZm9yRWFjaCgoe25hbWUsIGlucHV0LCBleHBlY3RlZH0pID0+IHtcbiAgICB0ZXN0KG5hbWUsICgpID0+IHtcbiAgICAgIGV4cGVjdChnZXRUaWxlVXJsKGlucHV0KSkudG9CZShleHBlY3RlZCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdnZXRNZXRhVXJsJywgKCkgPT4ge1xuICBbXG4gICAge25hbWU6ICdlbXB0eSBzdHJpbmcnLCBpbnB1dDogJycsIGV4cGVjdGVkOiBudWxsfSxcbiAgICB7bmFtZTogJ2ludmFsaWQgVVJMJywgaW5wdXQ6ICcvZm9vL2Jhci9iYXoubXZ0JywgZXhwZWN0ZWQ6IG51bGx9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdWYWxpZCBVUkwsIHVua25vd24gZG9tYWluJyxcbiAgICAgIGlucHV0OiAnaHR0cDovL3d3dy5leGFtcGxlLmNvbS9zb21lX3RpbGVzJyxcbiAgICAgIGV4cGVjdGVkOiAnaHR0cDovL3d3dy5leGFtcGxlLmNvbS9zb21lX3RpbGVzL21ldGFkYXRhLmpzb24nXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnVmFsaWQgVVJMLCB1bmtub3duIGRvbWFpbiwgdHJhaWxpbmcgc2xhc2gnLFxuICAgICAgaW5wdXQ6ICdodHRwOi8vd3d3LmV4YW1wbGUuY29tL3NvbWVfdGlsZXMvJyxcbiAgICAgIGV4cGVjdGVkOiAnaHR0cDovL3d3dy5leGFtcGxlLmNvbS9zb21lX3RpbGVzL21ldGFkYXRhLmpzb24nXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnVmFsaWQgVVJMLCBNYXBib3ggZG9tYWluJyxcbiAgICAgIGlucHV0OiAnaHR0cHM6Ly9hcGkubWFwYm94LmNvbS92NC9zcGFtL3t6fS97eH0ve3l9Lm12dCcsXG4gICAgICBleHBlY3RlZDogJ2h0dHBzOi8vYXBpLm1hcGJveC5jb20vdjQvc3BhbS5qc29uJ1xuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ1ZhbGlkIFVSTCwgcGxhY2Vob2xkZXJzLCBtdnQsIGFjY2VzcyB0b2tlbicsXG4gICAgICBpbnB1dDogJ2h0dHBzOi8vYXBpLm1hcGJveC5jb20vdjQvc3BhbS97en0ve3h9L3t5fS5tdnQ/YWNjZXNzX3Rva2VuPXNrLmZvYmFyLmJheicsXG4gICAgICBleHBlY3RlZDogJ2h0dHBzOi8vYXBpLm1hcGJveC5jb20vdjQvc3BhbS5qc29uP2FjY2Vzc190b2tlbj1zay5mb2Jhci5iYXonXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnVmFsaWQgVVJMLCBwbGFjZWhvbGRlcnMsIG12dCwgYWNjZXNzIHRva2VuLCBwdWJsaXNoZWQgc3R5bGUgdmVyc2lvbicsXG4gICAgICBpbnB1dDpcbiAgICAgICAgJ2h0dHBzOi8vYXBpLm1hcGJveC5jb20vdjQvc3BhbS97en0ve3h9L3t5fS5tdnQ/c3R5bGU9bWFwYm94Oi8vc3R5bGVzL3VzZXIvc3R5bGVJZEAwMCZhY2Nlc3NfdG9rZW49cGsueHh4Lnp6eicsXG4gICAgICBleHBlY3RlZDpcbiAgICAgICAgJ2h0dHBzOi8vYXBpLm1hcGJveC5jb20vdjQvc3BhbS5qc29uP3N0eWxlPW1hcGJveDovL3N0eWxlcy91c2VyL3N0eWxlSWRAMDAmYWNjZXNzX3Rva2VuPXBrLnh4eC56enonXG4gICAgfVxuICBdLmZvckVhY2goKHtuYW1lLCBpbnB1dCwgZXhwZWN0ZWR9KSA9PiB7XG4gICAgdGVzdChuYW1lLCAoKSA9PiB7XG4gICAgICBleHBlY3QoZ2V0TWV0YVVybChpbnB1dCkpLnRvQmUoZXhwZWN0ZWQpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG50ZXN0KCdwYXJzZU1ldGFkYXRhLCBtZXRhZGF0YSBmcm9tIE1WVFNvdXJjZSBhbmQgTWFwYm94IFVSTCcsICgpID0+IHtcbiAgZXhwZWN0KFxuICAgIHBhcnNlTWV0YWRhdGEoTVZUX01FVEFEQVRBLCB7dGlsZVVybDogJ2h0dHBzOi8vYXBpLm1hcGJveC5jb20vdjQvc3BhbS97en0ve3h9L3t5fS5tdnQnfSlcbiAgKS50b0VxdWFsKHtcbiAgICBhdHRyaWJ1dGlvbnM6IFtdLFxuICAgIG1ldGFKc29uOiBudWxsLFxuICAgIGJvdW5kczogWy0xODAsIC04NSwgMTgwLCA4NV0sXG4gICAgY2VudGVyOiBbMCwgMCwgMF0sXG4gICAgbWF4Wm9vbTogMTYsXG4gICAgbWluWm9vbTogMCxcbiAgICBmaWVsZHM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2NsYXNzJyxcbiAgICAgICAgaWQ6ICdjbGFzcycsXG4gICAgICAgIGZvcm1hdDogJycsXG4gICAgICAgIGZpbHRlclByb3BzOiB7XG4gICAgICAgICAgZG9tYWluOiBbXSxcbiAgICAgICAgICB2YWx1ZTogW10sXG4gICAgICAgICAgdHlwZTogJ211bHRpU2VsZWN0JyxcbiAgICAgICAgICBncHU6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBhbmFseXplclR5cGU6ICdTVFJJTkcnXG4gICAgICB9XG4gICAgXSxcbiAgICBuYW1lOiAnTWFwYm94IFN0cmVldHMgdjgnLFxuICAgIGRlc2NyaXB0aW9uOiAnJ1xuICB9KTtcbn0pO1xuXG50ZXN0KCdwYXJzZU1ldGFkYXRhLCBQTVRpbGVzIGZyb20gUE1UaWxlU291cmNlJywgKCkgPT4ge1xuICBleHBlY3QoXG4gICAgcGFyc2VNZXRhZGF0YShQTVRJTEVTX01FVEFEQVRBLCB7XG4gICAgICB0aWxlVXJsOlxuICAgICAgICAnaHR0cHM6Ly80c3Etc3R1ZGlvLWRhdGEtc3RhZ2luZy5zMy51cy13ZXN0LTIuYW1hem9uYXdzLmNvbS9zb21lX3BhdGgvc29tZV9maWxlLnBtdGlsZXMnXG4gICAgfSlcbiAgKS50b0VxdWFsKHtcbiAgICBhdHRyaWJ1dGlvbnM6IFtdLFxuICAgIG5hbWU6ICdNeSBDdXN0b20gVGlsZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnTXkgQ3VzdG9tIFRpbGVzIERlc2NyaXB0aW9uJyxcbiAgICBtZXRhSnNvbjogbnVsbCxcbiAgICBib3VuZHM6IFstMTUwLjExMjIyMTksIC01MS44OTUyNzc3LCAxNzkuMzU3Nzc4MywgNjkuNjA0Mzc0N10sXG4gICAgY2VudGVyOiBbMTQuMDYyNSwgNTAuNzAyNjM5NywgNl0sXG4gICAgbWF4Wm9vbTogNixcbiAgICBtaW5ab29tOiAwLFxuICAgIGZpZWxkczogW1xuICAgICAge1xuICAgICAgICBpZDogJ21ldHJpYycsXG4gICAgICAgIG5hbWU6ICdtZXRyaWMnLFxuICAgICAgICBmb3JtYXQ6ICcnLFxuICAgICAgICB0eXBlOiBBTExfRklFTERfVFlQRVMucmVhbCxcbiAgICAgICAgYW5hbHl6ZXJUeXBlOiBEQVRBX1RZUEVTLkZMT0FULFxuICAgICAgICBmaWx0ZXJQcm9wczoge1xuICAgICAgICAgIGRvbWFpbjogWy0xLCAxMF0sXG4gICAgICAgICAgdmFsdWU6IFstMSwgMTBdLFxuICAgICAgICAgIHR5cGU6IEZJTFRFUl9UWVBFUy5yYW5nZSxcbiAgICAgICAgICB0eXBlT3B0aW9uczogW0ZJTFRFUl9UWVBFUy5yYW5nZV0sXG4gICAgICAgICAgZ3B1OiB0cnVlLFxuICAgICAgICAgIHN0ZXA6IDAuMDFcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaWQ6ICdjb250aW5lbnQnLFxuICAgICAgICBuYW1lOiAnY29udGluZW50JyxcbiAgICAgICAgZm9ybWF0OiAnJyxcbiAgICAgICAgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZyxcbiAgICAgICAgYW5hbHl6ZXJUeXBlOiBEQVRBX1RZUEVTLlNUUklORyxcbiAgICAgICAgZmlsdGVyUHJvcHM6IHtcbiAgICAgICAgICBkb21haW46IFsnQWZyaWNhJywgJ0FzaWEnLCAnRXVyb3BlJywgJ05vcnRoIEFtZXJpY2EnLCAnT2NlYW5pYScsICdTb3V0aCBBbWVyaWNhJ10sXG4gICAgICAgICAgdmFsdWU6IFsnQWZyaWNhJywgJ0FzaWEnLCAnRXVyb3BlJywgJ05vcnRoIEFtZXJpY2EnLCAnT2NlYW5pYScsICdTb3V0aCBBbWVyaWNhJ10sXG4gICAgICAgICAgdHlwZTogRklMVEVSX1RZUEVTLm11bHRpU2VsZWN0LFxuICAgICAgICAgIGdwdTogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgIF0sXG4gICAgcG10aWxlc1R5cGU6ICdtdnQnXG4gIH0pO1xufSk7XG5cbnRlc3QoJ3BhcnNlTWV0YWRhdGEsIGVtcHR5IGlucHV0JywgKCkgPT4ge1xuICBleHBlY3QocGFyc2VNZXRhZGF0YSh7fSkpLnRvRXF1YWwoe1xuICAgIGF0dHJpYnV0aW9uczogW10sXG4gICAgbmFtZTogJycsXG4gICAgZGVzY3JpcHRpb246ICcnLFxuICAgIG1ldGFKc29uOiBudWxsLFxuICAgIGJvdW5kczogbnVsbCxcbiAgICBjZW50ZXI6IG51bGwsXG4gICAgbWF4Wm9vbTogbnVsbCxcbiAgICBtaW5ab29tOiBudWxsLFxuICAgIGZpZWxkczogW11cbiAgfSk7XG5cbiAgZXhwZWN0KFxuICAgIHBhcnNlTWV0YWRhdGEoe30sIHt0aWxlVXJsOiAnaHR0cDovL3h5ei5hcGkuaGVyZS5jb20vc29tZV9pZC90aWxlL3dlYi97en1fe3h9X3t5fS5wYmYnfSlcbiAgKS50b0VxdWFsKHtcbiAgICBhdHRyaWJ1dGlvbnM6IFtdLFxuICAgIG5hbWU6ICcnLFxuICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICBtZXRhSnNvbjogbnVsbCxcbiAgICBib3VuZHM6IG51bGwsXG4gICAgY2VudGVyOiBudWxsLFxuICAgIG1heFpvb206IG51bGwsXG4gICAgbWluWm9vbTogbnVsbCxcbiAgICBmaWVsZHM6IFtdXG4gIH0pO1xuXG4gIGV4cGVjdChwYXJzZU1ldGFkYXRhKHt9LCB7dGlsZVVybDogJ2h0dHBzOi8vYXBpLm1hcGJveC5jb20vdjQvc3BhbS97en0ve3h9L3t5fS5tdnQnfSkpLnRvRXF1YWwoe1xuICAgIGF0dHJpYnV0aW9uczogW10sXG4gICAgbmFtZTogJycsXG4gICAgZGVzY3JpcHRpb246ICcnLFxuICAgIG1ldGFKc29uOiBudWxsLFxuICAgIGJvdW5kczogbnVsbCxcbiAgICBjZW50ZXI6IG51bGwsXG4gICAgbWF4Wm9vbTogbnVsbCxcbiAgICBtaW5ab29tOiBudWxsLFxuICAgIGZpZWxkczogW11cbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ3BhcnNlTWV0YWRhdGEsIGJhZCBjYXNlcycsICgpID0+IHtcbiAgW1xuICAgIHtuYW1lOiAnZW1wdHkgc3RyaW5nJywgaW5wdXQ6ICcnLCBleHBlY3RlZDogbnVsbH0sXG4gICAge25hbWU6ICdudWxsJywgaW5wdXQ6IG51bGwsIGV4cGVjdGVkOiBudWxsfSxcbiAgICB7bmFtZTogJ3VuZGVmaW5lZCcsIGlucHV0OiB1bmRlZmluZWQsIGV4cGVjdGVkOiBudWxsfSxcbiAgICB7bmFtZTogJ3N0cmluZycsIGlucHV0OiAnc3BhbScsIGV4cGVjdGVkOiBudWxsfVxuICBdLmZvckVhY2goKHtuYW1lLCBpbnB1dCwgZXhwZWN0ZWR9KSA9PiB7XG4gICAgdGVzdChuYW1lLCAoKSA9PiB7XG4gICAgICBleHBlY3QocGFyc2VNZXRhZGF0YShpbnB1dCBhcyBhbnkpKS50b0JlKGV4cGVjdGVkKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2dldFRpbGVVcmwnLCAoKSA9PiB7XG4gIHRlc3QuZWFjaChbXG4gICAgWycnLCBudWxsXSxcbiAgICBbJ2ZvbycsIG51bGxdLFxuICAgIFsnaHR0cCcsIG51bGxdLFxuICAgIFsnaHR0cDovLycsIG51bGxdLFxuICAgIFsnaHR0cHM6Ly8nLCBudWxsXSxcbiAgICBbJ2h0dHA6Ly9teXRpbGVzLmNvbScsICdodHRwOi8vbXl0aWxlcy5jb20ve3p9L3t4fS97eX0ucGJmJ10sXG4gICAgWydodHRwczovL215dGlsZXMuY29tJywgJ2h0dHBzOi8vbXl0aWxlcy5jb20ve3p9L3t4fS97eX0ucGJmJ10sXG4gICAgWydodHRwOi8vbXl0aWxlcy5jb20vJywgJ2h0dHA6Ly9teXRpbGVzLmNvbS97en0ve3h9L3t5fS5wYmYnXSxcbiAgICBbJ2h0dHA6Ly9teXRpbGVzLmNvbS9mb28nLCAnaHR0cDovL215dGlsZXMuY29tL2Zvby97en0ve3h9L3t5fS5wYmYnXSxcbiAgICBbJ2h0dHA6Ly9teXRpbGVzLmNvbS9mb28vJywgJ2h0dHA6Ly9teXRpbGVzLmNvbS9mb28ve3p9L3t4fS97eX0ucGJmJ10sXG4gICAgWydodHRwczovL215dGlsZXMuY29tL2Zvby9iYXIuYmF6JywgJ2h0dHBzOi8vbXl0aWxlcy5jb20vZm9vL2Jhci5iYXove3p9L3t4fS97eX0ucGJmJ10sXG4gICAgWydodHRwOi8vbG9jYWxob3N0JywgJ2h0dHA6Ly9sb2NhbGhvc3Qve3p9L3t4fS97eX0ucGJmJ10sXG4gICAgWydodHRwOi8vbG9jYWxob3N0LycsICdodHRwOi8vbG9jYWxob3N0L3t6fS97eH0ve3l9LnBiZiddLFxuICAgIFsnaHR0cDovL2xvY2FsaG9zdDo4MDgwJywgJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4MC97en0ve3h9L3t5fS5wYmYnXSxcbiAgICBbJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8nLCAnaHR0cDovL2xvY2FsaG9zdDo4MDgwL3t6fS97eH0ve3l9LnBiZiddLFxuICAgIFsnaHR0cDovL215dGlsZXMuY29tL2Zvby97en0ve3h9L3t5fS5tdnQnLCAnaHR0cDovL215dGlsZXMuY29tL2Zvby97en0ve3h9L3t5fS5tdnQnXVxuICBdKSgnJXMnLCAoaW5wdXQsIGV4cGVjdGVkKSA9PiB7XG4gICAgZXhwZWN0KGdldFRpbGVVcmwoaW5wdXQpKS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2dldE1ldGFVcmwnLCAoKSA9PiB7XG4gIHRlc3QuZWFjaChbXG4gICAgWycnLCBudWxsXSxcbiAgICBbJ2ZvbycsIG51bGxdLFxuICAgIFsnaHR0cCcsIG51bGxdLFxuICAgIFsnaHR0cDovLycsIG51bGxdLFxuICAgIFsnaHR0cHM6Ly8nLCBudWxsXSxcbiAgICBbJ2h0dHA6Ly9teXRpbGVzLmNvbScsICdodHRwOi8vbXl0aWxlcy5jb20vbWV0YWRhdGEuanNvbiddLFxuICAgIFsnaHR0cHM6Ly9teXRpbGVzLmNvbScsICdodHRwczovL215dGlsZXMuY29tL21ldGFkYXRhLmpzb24nXSxcbiAgICBbJ2h0dHA6Ly9teXRpbGVzLmNvbS8nLCAnaHR0cDovL215dGlsZXMuY29tL21ldGFkYXRhLmpzb24nXSxcbiAgICBbJ2h0dHA6Ly9teXRpbGVzLmNvbS9mb28nLCAnaHR0cDovL215dGlsZXMuY29tL2Zvby9tZXRhZGF0YS5qc29uJ10sXG4gICAgWydodHRwOi8vbXl0aWxlcy5jb20vZm9vLycsICdodHRwOi8vbXl0aWxlcy5jb20vZm9vL21ldGFkYXRhLmpzb24nXSxcbiAgICBbJ2h0dHBzOi8vbXl0aWxlcy5jb20vZm9vL2Jhci5iYXonLCAnaHR0cHM6Ly9teXRpbGVzLmNvbS9mb28vYmFyLmJhei9tZXRhZGF0YS5qc29uJ10sXG4gICAgWydodHRwOi8vbG9jYWxob3N0JywgJ2h0dHA6Ly9sb2NhbGhvc3QvbWV0YWRhdGEuanNvbiddLFxuICAgIFsnaHR0cDovL2xvY2FsaG9zdC8nLCAnaHR0cDovL2xvY2FsaG9zdC9tZXRhZGF0YS5qc29uJ10sXG4gICAgWydodHRwOi8vbG9jYWxob3N0OjgwODAnLCAnaHR0cDovL2xvY2FsaG9zdDo4MDgwL21ldGFkYXRhLmpzb24nXSxcbiAgICBbJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8nLCAnaHR0cDovL2xvY2FsaG9zdDo4MDgwL21ldGFkYXRhLmpzb24nXSxcbiAgICBbJ2h0dHA6Ly9teXRpbGVzLmNvbS9mb28ve3p9L3t4fS97eX0ubXZ0JywgJ2h0dHA6Ly9teXRpbGVzLmNvbS9mb28vbWV0YWRhdGEuanNvbiddXG4gIF0pKCclcycsIChpbnB1dCwgZXhwZWN0ZWQpID0+IHtcbiAgICBleHBlY3QoZ2V0TWV0YVVybChpbnB1dCkpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOztBQUdBLElBQUFBLGFBQUEsR0FBQUMsT0FBQTtBQUVBLElBQUFDLFVBQUEsR0FBQUQsT0FBQTtBQUVBLElBQUFFLGdCQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxhQUFBLEdBQUFILE9BQUE7QUFSQTtBQUNBOztBQVNBSSxRQUFRLENBQUMsWUFBWSxFQUFFLFlBQU07RUFDM0IsQ0FDRTtJQUFDQyxJQUFJLEVBQUUsY0FBYztJQUFFQyxLQUFLLEVBQUUsRUFBRTtJQUFFQyxRQUFRLEVBQUU7RUFBSSxDQUFDLEVBQ2pEO0lBQUNGLElBQUksRUFBRSxhQUFhO0lBQUVDLEtBQUssRUFBRSxrQkFBa0I7SUFBRUMsUUFBUSxFQUFFO0VBQUksQ0FBQyxFQUNoRTtJQUNFRixJQUFJLEVBQUUsNEJBQTRCO0lBQ2xDQyxLQUFLLEVBQUUsd0JBQXdCO0lBQy9CQyxRQUFRLEVBQUU7RUFDWixDQUFDLEVBQ0Q7SUFDRUYsSUFBSSxFQUFFLDRDQUE0QztJQUNsREMsS0FBSyxFQUFFLHlCQUF5QjtJQUNoQ0MsUUFBUSxFQUFFO0VBQ1osQ0FBQyxFQUNEO0lBQ0VGLElBQUksRUFBRSx5QkFBeUI7SUFDL0JDLEtBQUssRUFBRSx3Q0FBd0M7SUFDL0NDLFFBQVEsRUFBRTtFQUNaLENBQUMsRUFDRDtJQUNFRixJQUFJLEVBQUUsOEJBQThCO0lBQ3BDQyxLQUFLLEVBQUUsd0NBQXdDO0lBQy9DQyxRQUFRLEVBQUU7RUFDWixDQUFDLEVBQ0Q7SUFDRUYs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