@kepler.gl/reducers 3.3.0-alpha.1 → 3.3.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/combined-updaters.js +491 -0
- package/dist/cjs/composer-helpers.js +101 -0
- package/dist/cjs/composers.js +22 -0
- package/dist/cjs/core.js +105 -0
- package/dist/cjs/data-utils.js +53 -0
- package/dist/cjs/export-utils.js +91 -0
- package/dist/{index.js → cjs/index.js} +2 -3
- package/dist/cjs/interaction-utils.js +115 -0
- package/dist/cjs/layer-utils.js +635 -0
- package/dist/cjs/map-state-updaters.js +658 -0
- package/dist/cjs/map-state.js +35 -0
- package/dist/cjs/map-style-updaters.js +660 -0
- package/dist/cjs/map-style.js +33 -0
- package/dist/cjs/merger-handler.js +105 -0
- package/dist/cjs/middleware.js +27 -0
- package/dist/cjs/provider-state-updaters.js +465 -0
- package/dist/cjs/provider-state.js +34 -0
- package/dist/cjs/root.js +207 -0
- package/dist/cjs/ui-state-updaters.js +922 -0
- package/dist/cjs/ui-state.js +36 -0
- package/dist/cjs/vis-state-merger.js +1193 -0
- package/dist/cjs/vis-state-selectors.js +30 -0
- package/dist/cjs/vis-state-updaters.js +5100 -0
- package/dist/cjs/vis-state.js +35 -0
- package/dist/combined-updaters.d.ts +19 -2
- package/dist/composers.d.ts +2 -0
- package/dist/esm/combined-updaters.js +484 -0
- package/dist/esm/composer-helpers.js +85 -0
- package/dist/esm/composers.js +14 -0
- package/dist/esm/core.js +101 -0
- package/dist/esm/data-utils.js +47 -0
- package/dist/esm/export-utils.js +86 -0
- package/dist/esm/index.js +62 -0
- package/dist/esm/interaction-utils.js +106 -0
- package/dist/esm/layer-utils.js +602 -0
- package/dist/esm/map-state-updaters.js +650 -0
- package/dist/esm/map-state.js +29 -0
- package/dist/esm/map-style-updaters.js +652 -0
- package/dist/esm/map-style.js +27 -0
- package/dist/esm/merger-handler.js +96 -0
- package/dist/esm/middleware.js +19 -0
- package/dist/esm/provider-state-updaters.js +458 -0
- package/dist/esm/provider-state.js +28 -0
- package/dist/esm/root.js +201 -0
- package/dist/esm/ui-state-updaters.js +917 -0
- package/dist/esm/ui-state.js +30 -0
- package/dist/esm/vis-state-merger.js +1161 -0
- package/dist/esm/vis-state-selectors.js +24 -0
- package/dist/esm/vis-state-updaters.js +5006 -0
- package/dist/esm/vis-state.js +29 -0
- package/dist/interaction-utils.d.ts +1 -1
- package/dist/layer-utils.d.ts +23 -5
- package/dist/map-state-updaters.d.ts +26 -21
- package/dist/map-state.d.ts +2 -78
- package/dist/map-style-updaters.d.ts +1 -3
- package/dist/ui-state-updaters.d.ts +17 -2
- package/dist/vis-state-merger.d.ts +7 -0
- package/dist/vis-state-selectors.d.ts +42 -6
- package/dist/vis-state-updaters.d.ts +123 -1
- package/dist/vis-state.d.ts +8 -4
- package/package.json +37 -31
- package/dist/combined-updaters.js +0 -363
- package/dist/composer-helpers.js +0 -101
- package/dist/composers.js +0 -23
- package/dist/core.js +0 -105
- package/dist/data-utils.js +0 -53
- package/dist/export-utils.js +0 -91
- package/dist/interaction-utils.js +0 -105
- package/dist/layer-utils.js +0 -376
- package/dist/map-state-updaters.js +0 -438
- package/dist/map-state.js +0 -35
- package/dist/map-style-updaters.js +0 -661
- package/dist/map-style.js +0 -34
- package/dist/merger-handler.js +0 -105
- package/dist/middleware.js +0 -27
- package/dist/provider-state-updaters.js +0 -466
- package/dist/provider-state.js +0 -35
- package/dist/root.js +0 -207
- package/dist/ui-state-updaters.js +0 -887
- package/dist/ui-state.js +0 -37
- package/dist/vis-state-merger.js +0 -1032
- package/dist/vis-state-selectors.js +0 -30
- package/dist/vis-state-updaters.js +0 -3859
- package/dist/vis-state.js +0 -36
package/dist/vis-state.d.ts
CHANGED
|
@@ -4,7 +4,8 @@ export declare const visStateReducerFactory: (initialState?: {}) => import("redu
|
|
|
4
4
|
layers: import("@kepler.gl/layers").Layer[];
|
|
5
5
|
layerData: any[];
|
|
6
6
|
layerToBeMerged: any[];
|
|
7
|
-
layerOrder:
|
|
7
|
+
layerOrder: import("@kepler.gl/types").LayerOrder;
|
|
8
|
+
layerOrderToBeMerged: any[] | null;
|
|
8
9
|
effects: import("@kepler.gl/types").Effect[];
|
|
9
10
|
effectOrder: string[];
|
|
10
11
|
annotations: import("@kepler.gl/types").Annotation[];
|
|
@@ -47,7 +48,8 @@ export declare const visStateReducerFactory: (initialState?: {}) => import("redu
|
|
|
47
48
|
layers: import("@kepler.gl/layers").Layer[];
|
|
48
49
|
layerData: any[];
|
|
49
50
|
layerToBeMerged: any[];
|
|
50
|
-
layerOrder:
|
|
51
|
+
layerOrder: import("@kepler.gl/types").LayerOrder;
|
|
52
|
+
layerOrderToBeMerged: any[] | null;
|
|
51
53
|
effects: import("@kepler.gl/types").Effect[];
|
|
52
54
|
effectOrder: string[];
|
|
53
55
|
annotations: import("@kepler.gl/types").Annotation[];
|
|
@@ -91,7 +93,8 @@ declare const _default: import("redux-actions").ReduxCompatibleReducer<{
|
|
|
91
93
|
layers: import("@kepler.gl/layers").Layer[];
|
|
92
94
|
layerData: any[];
|
|
93
95
|
layerToBeMerged: any[];
|
|
94
|
-
layerOrder:
|
|
96
|
+
layerOrder: import("@kepler.gl/types").LayerOrder;
|
|
97
|
+
layerOrderToBeMerged: any[] | null;
|
|
95
98
|
effects: import("@kepler.gl/types").Effect[];
|
|
96
99
|
effectOrder: string[];
|
|
97
100
|
annotations: import("@kepler.gl/types").Annotation[];
|
|
@@ -134,7 +137,8 @@ declare const _default: import("redux-actions").ReduxCompatibleReducer<{
|
|
|
134
137
|
layers: import("@kepler.gl/layers").Layer[];
|
|
135
138
|
layerData: any[];
|
|
136
139
|
layerToBeMerged: any[];
|
|
137
|
-
layerOrder:
|
|
140
|
+
layerOrder: import("@kepler.gl/types").LayerOrder;
|
|
141
|
+
layerOrderToBeMerged: any[] | null;
|
|
138
142
|
effects: import("@kepler.gl/types").Effect[];
|
|
139
143
|
effectOrder: string[];
|
|
140
144
|
annotations: import("@kepler.gl/types").Annotation[];
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kepler.gl/reducers",
|
|
3
3
|
"author": "Shan He <shan@uber.com>",
|
|
4
|
-
"version": "3.3.0-alpha.
|
|
4
|
+
"version": "3.3.0-alpha.10",
|
|
5
5
|
"description": "kepler.gl constants used by kepler.gl components, actions and reducers",
|
|
6
6
|
"license": "MIT",
|
|
7
|
-
"main": "dist/index.js",
|
|
7
|
+
"main": "dist/cjs/index.js",
|
|
8
8
|
"types": "dist/index.d.ts",
|
|
9
9
|
"keywords": [
|
|
10
10
|
"babel",
|
|
@@ -19,50 +19,47 @@
|
|
|
19
19
|
"url": "https://github.com/keplergl/kepler.gl.git"
|
|
20
20
|
},
|
|
21
21
|
"scripts": {
|
|
22
|
-
"build": "rm -fr dist && babel src --out-dir dist --source-maps inline --extensions '.ts,.tsx,.js,.jsx' --ignore '**/*.d.ts'",
|
|
23
|
-
"build:umd": "NODE_OPTIONS=--openssl-legacy-provider webpack --config ./webpack/umd.js --progress --env.prod",
|
|
22
|
+
"build": "rm -fr dist && babel src --out-dir dist/cjs --source-maps inline --extensions '.ts,.tsx,.js,.jsx' --ignore '**/*.d.ts' && BABEL_ENV=esm babel src --out-dir dist/esm --source-maps inline --extensions '.ts,.tsx,.js,.jsx' --ignore '**/*.d.ts'",
|
|
24
23
|
"build:types": "tsc --project ./tsconfig.production.json",
|
|
25
24
|
"prepublishOnly": "babel-node ../../scripts/license-header/bin --license ../../FILE-HEADER && yarn build && yarn build:types",
|
|
26
|
-
"stab": "mkdir -p dist && touch dist/index.js"
|
|
25
|
+
"stab": "mkdir -p dist/cjs dist/esm && touch dist/cjs/index.js dist/esm/index.js"
|
|
27
26
|
},
|
|
28
27
|
"files": [
|
|
29
|
-
"dist"
|
|
30
|
-
"umd"
|
|
28
|
+
"dist"
|
|
31
29
|
],
|
|
32
30
|
"dependencies": {
|
|
33
|
-
"@kepler.gl/actions": "3.3.0-alpha.
|
|
34
|
-
"@kepler.gl/cloud-providers": "3.3.0-alpha.
|
|
35
|
-
"@kepler.gl/common-utils": "3.3.0-alpha.
|
|
36
|
-
"@kepler.gl/constants": "3.3.0-alpha.
|
|
37
|
-
"@kepler.gl/deckgl-arrow-layers": "3.3.0-alpha.
|
|
38
|
-
"@kepler.gl/deckgl-layers": "3.3.0-alpha.
|
|
39
|
-
"@kepler.gl/effects": "3.3.0-alpha.
|
|
40
|
-
"@kepler.gl/layers": "3.3.0-alpha.
|
|
41
|
-
"@kepler.gl/localization": "3.3.0-alpha.
|
|
42
|
-
"@kepler.gl/processors": "3.3.0-alpha.
|
|
43
|
-
"@kepler.gl/schemas": "3.3.0-alpha.
|
|
44
|
-
"@kepler.gl/table": "3.3.0-alpha.
|
|
45
|
-
"@kepler.gl/tasks": "3.3.0-alpha.
|
|
46
|
-
"@kepler.gl/types": "3.3.0-alpha.
|
|
47
|
-
"@kepler.gl/utils": "3.3.0-alpha.
|
|
31
|
+
"@kepler.gl/actions": "3.3.0-alpha.10",
|
|
32
|
+
"@kepler.gl/cloud-providers": "3.3.0-alpha.10",
|
|
33
|
+
"@kepler.gl/common-utils": "3.3.0-alpha.10",
|
|
34
|
+
"@kepler.gl/constants": "3.3.0-alpha.10",
|
|
35
|
+
"@kepler.gl/deckgl-arrow-layers": "3.3.0-alpha.10",
|
|
36
|
+
"@kepler.gl/deckgl-layers": "3.3.0-alpha.10",
|
|
37
|
+
"@kepler.gl/effects": "3.3.0-alpha.10",
|
|
38
|
+
"@kepler.gl/layers": "3.3.0-alpha.10",
|
|
39
|
+
"@kepler.gl/localization": "3.3.0-alpha.10",
|
|
40
|
+
"@kepler.gl/processors": "3.3.0-alpha.10",
|
|
41
|
+
"@kepler.gl/schemas": "3.3.0-alpha.10",
|
|
42
|
+
"@kepler.gl/table": "3.3.0-alpha.10",
|
|
43
|
+
"@kepler.gl/tasks": "3.3.0-alpha.10",
|
|
44
|
+
"@kepler.gl/types": "3.3.0-alpha.10",
|
|
45
|
+
"@kepler.gl/utils": "3.3.0-alpha.10",
|
|
48
46
|
"@loaders.gl/loader-utils": "^4.4.1",
|
|
49
47
|
"@mapbox/geo-viewport": "^0.4.1",
|
|
50
48
|
"@math.gl/web-mercator": "^4.1.0",
|
|
51
|
-
"@turf/bbox": "^
|
|
52
|
-
"@turf/bbox-polygon": "^
|
|
53
|
-
"@turf/boolean-within": "^
|
|
54
|
-
"@types/lodash": "4.17.5",
|
|
49
|
+
"@turf/bbox": "^7.2.0",
|
|
50
|
+
"@turf/bbox-polygon": "^7.2.0",
|
|
51
|
+
"@turf/boolean-within": "^7.2.0",
|
|
55
52
|
"@types/redux-actions": "^2.6.2",
|
|
56
53
|
"copy-to-clipboard": "^3.3.1",
|
|
57
|
-
"d3-color": "^
|
|
54
|
+
"d3-color": "^3.1.0",
|
|
58
55
|
"d3-dsv": "^2.0.0",
|
|
59
56
|
"deepmerge": "^4.2.2",
|
|
57
|
+
"es-toolkit": "^1.39.10",
|
|
60
58
|
"global": "^4.3.0",
|
|
61
|
-
"lodash": "4.17.23",
|
|
62
59
|
"react-palm": "^3.3.8",
|
|
63
|
-
"redux": "^
|
|
60
|
+
"redux": "^5.0.0",
|
|
64
61
|
"redux-actions": "^2.2.1",
|
|
65
|
-
"reselect": "^
|
|
62
|
+
"reselect": "^5.0.0"
|
|
66
63
|
},
|
|
67
64
|
"nyc": {
|
|
68
65
|
"sourceMap": false,
|
|
@@ -81,5 +78,14 @@
|
|
|
81
78
|
"node": "20.19.3",
|
|
82
79
|
"yarn": "4.4.0"
|
|
83
80
|
},
|
|
84
|
-
"packageManager": "yarn@4.4.0"
|
|
81
|
+
"packageManager": "yarn@4.4.0",
|
|
82
|
+
"module": "dist/esm/index.js",
|
|
83
|
+
"exports": {
|
|
84
|
+
".": {
|
|
85
|
+
"types": "./dist/index.d.ts",
|
|
86
|
+
"import": "./dist/esm/index.js",
|
|
87
|
+
"require": "./dist/cjs/index.js",
|
|
88
|
+
"default": "./dist/cjs/index.js"
|
|
89
|
+
}
|
|
90
|
+
}
|
|
85
91
|
}
|
|
@@ -1,363 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
Object.defineProperty(exports, "__esModule", {
|
|
5
|
-
value: true
|
|
6
|
-
});
|
|
7
|
-
exports.toggleSplitMapUpdater = exports.replaceDataInMapUpdater = exports.loadFilesSuccessUpdater = exports.isValidConfig = exports.defaultAddDataToMapOptions = exports.combinedMapStyleChangeUpdater = exports.combinedLayerTypeChangeUpdater = exports.addDataToMapUpdater = exports.addDataToMapComposed = void 0;
|
|
8
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
9
|
-
var _uiStateUpdaters = require("./ui-state-updaters");
|
|
10
|
-
var _visStateUpdaters = require("./vis-state-updaters");
|
|
11
|
-
var _mapStateUpdaters = require("./map-state-updaters");
|
|
12
|
-
var _mapStyleUpdaters = require("./map-style-updaters");
|
|
13
|
-
var _processors = require("@kepler.gl/processors");
|
|
14
|
-
var _composerHelpers = require("./composer-helpers");
|
|
15
|
-
var _utils = require("@kepler.gl/utils");
|
|
16
|
-
var _dataUtils = require("./data-utils");
|
|
17
|
-
var _constants = require("@kepler.gl/constants");
|
|
18
|
-
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
19
|
-
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // SPDX-License-Identifier: MIT
|
|
20
|
-
// Copyright contributors to the kepler.gl project
|
|
21
|
-
// compose action to apply result multiple reducers, with the output of one
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Some actions will affect the entire kepler.lg instance state.
|
|
25
|
-
* The updaters for these actions is exported as `combinedUpdaters`. These updater take the entire instance state
|
|
26
|
-
* as the first argument. Read more about [Using updaters](../advanced-usage/using-updaters.md)
|
|
27
|
-
* @public
|
|
28
|
-
* @example
|
|
29
|
-
*
|
|
30
|
-
* import keplerGlReducer, {combinedUpdaters} from '@kepler.gl/reducers';
|
|
31
|
-
* // Root Reducer
|
|
32
|
-
* const reducers = combineReducers({
|
|
33
|
-
* keplerGl: keplerGlReducer,
|
|
34
|
-
* app: appReducer
|
|
35
|
-
* });
|
|
36
|
-
*
|
|
37
|
-
* const composedReducer = (state, action) => {
|
|
38
|
-
* switch (action.type) {
|
|
39
|
-
* // add data to map after receiving data from remote sources
|
|
40
|
-
* case 'LOAD_REMOTE_RESOURCE_SUCCESS':
|
|
41
|
-
* return {
|
|
42
|
-
* ...state,
|
|
43
|
-
* keplerGl: {
|
|
44
|
-
* ...state.keplerGl,
|
|
45
|
-
* // pass in kepler.gl instance state to combinedUpdaters
|
|
46
|
-
* map: combinedUpdaters.addDataToMapUpdater(
|
|
47
|
-
* state.keplerGl.map,
|
|
48
|
-
* {
|
|
49
|
-
* payload: {
|
|
50
|
-
* datasets: action.datasets,
|
|
51
|
-
* options: {readOnly: true},
|
|
52
|
-
* config: action.config
|
|
53
|
-
* }
|
|
54
|
-
* }
|
|
55
|
-
* )
|
|
56
|
-
* }
|
|
57
|
-
* };
|
|
58
|
-
* }
|
|
59
|
-
* return reducers(state, action);
|
|
60
|
-
* };
|
|
61
|
-
*
|
|
62
|
-
* export default composedReducer;
|
|
63
|
-
*/
|
|
64
|
-
|
|
65
|
-
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
66
|
-
// @ts-ignore
|
|
67
|
-
var combinedUpdaters = null;
|
|
68
|
-
/* eslint-enable @typescript-eslint/no-unused-vars */
|
|
69
|
-
|
|
70
|
-
var isValidConfig = exports.isValidConfig = function isValidConfig(config) {
|
|
71
|
-
return (0, _utils.isPlainObject)(config) && (0, _utils.isPlainObject)(config.config) && config.version;
|
|
72
|
-
};
|
|
73
|
-
var defaultAddDataToMapOptions = exports.defaultAddDataToMapOptions = {
|
|
74
|
-
centerMap: true,
|
|
75
|
-
keepExistingConfig: false,
|
|
76
|
-
autoCreateLayers: true,
|
|
77
|
-
autoCreateTooltips: true
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Combine data and full configuration update in a single action
|
|
82
|
-
*
|
|
83
|
-
* @memberof combinedUpdaters
|
|
84
|
-
* @param {Object} state kepler.gl instance state, containing all subreducer state
|
|
85
|
-
* @param {Object} action
|
|
86
|
-
* @param {Object} action.payload `{datasets, options, config}`
|
|
87
|
-
* @param action.payload.datasets - ***required** datasets can be a dataset or an array of datasets
|
|
88
|
-
* Each dataset object needs to have `info` and `data` property.
|
|
89
|
-
* @param [action.payload.options] option object `{centerMap: true}`
|
|
90
|
-
* @param [action.payload.config] map config
|
|
91
|
-
* @param [action.payload.info] map info contains title and description
|
|
92
|
-
* @returns nextState
|
|
93
|
-
*
|
|
94
|
-
* @typedef {Object} Dataset
|
|
95
|
-
* @property info -info of a dataset
|
|
96
|
-
* @property info.id - id of this dataset. If config is defined, `id` should matches the `dataId` in config.
|
|
97
|
-
* @property info.label - A display name of this dataset
|
|
98
|
-
* @property data - ***required** The data object, in a tabular format with 2 properties `fields` and `rows`
|
|
99
|
-
* @property data.fields - ***required** Array of fields,
|
|
100
|
-
* @property data.fields.name - ***required** Name of the field,
|
|
101
|
-
* @property data.rows - ***required** Array of rows, in a tabular format with `fields` and `rows`
|
|
102
|
-
*
|
|
103
|
-
* @public
|
|
104
|
-
*/
|
|
105
|
-
var addDataToMapUpdater = exports.addDataToMapUpdater = function addDataToMapUpdater(state, _ref) {
|
|
106
|
-
var _datasets$, _datasets$2, _datasets$3;
|
|
107
|
-
var payload = _ref.payload;
|
|
108
|
-
var datasets = payload.datasets,
|
|
109
|
-
config = payload.config,
|
|
110
|
-
info = payload.info;
|
|
111
|
-
var options = _objectSpread(_objectSpread({}, defaultAddDataToMapOptions), payload.options);
|
|
112
|
-
|
|
113
|
-
// check if progressive loading dataset by batches, and update visState directly
|
|
114
|
-
var isProgressiveLoading = Array.isArray(datasets) && ((_datasets$ = datasets[0]) === null || _datasets$ === void 0 ? void 0 : _datasets$.info.format) === 'arrow' && ((_datasets$2 = datasets[0]) === null || _datasets$2 === void 0 ? void 0 : _datasets$2.info.id) && ((_datasets$3 = datasets[0]) === null || _datasets$3 === void 0 ? void 0 : _datasets$3.info.id) in state.visState.datasets;
|
|
115
|
-
if (isProgressiveLoading) {
|
|
116
|
-
return (0, _composerHelpers.compose_)([(0, _composerHelpers.pick_)('visState')((0, _composerHelpers.apply_)(_visStateUpdaters.updateVisDataUpdater, {
|
|
117
|
-
datasets: datasets,
|
|
118
|
-
options: options,
|
|
119
|
-
config: config
|
|
120
|
-
}))])(state);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
// @ts-expect-error
|
|
124
|
-
var parsedConfig = config;
|
|
125
|
-
if (isValidConfig(config)) {
|
|
126
|
-
// if passed in saved config
|
|
127
|
-
// @ts-expect-error
|
|
128
|
-
parsedConfig = state.visState.schema.parseSavedConfig(config);
|
|
129
|
-
}
|
|
130
|
-
var oldLayers = state.visState.layers;
|
|
131
|
-
var filterNewlyAddedLayers = function filterNewlyAddedLayers(layers) {
|
|
132
|
-
return layers.filter(function (nl) {
|
|
133
|
-
return !oldLayers.find(function (ol) {
|
|
134
|
-
return ol === nl;
|
|
135
|
-
});
|
|
136
|
-
});
|
|
137
|
-
};
|
|
138
|
-
|
|
139
|
-
// Returns undefined if not found, to make typescript happy
|
|
140
|
-
var findMapBoundsIfCentered = function findMapBoundsIfCentered(layers) {
|
|
141
|
-
var bounds = options.centerMap && (0, _dataUtils.findMapBounds)(layers);
|
|
142
|
-
return bounds ? bounds : undefined;
|
|
143
|
-
};
|
|
144
|
-
return (0, _composerHelpers.compose_)([(0, _composerHelpers.pick_)('visState')(
|
|
145
|
-
// this part can be async
|
|
146
|
-
(0, _composerHelpers.apply_)(_visStateUpdaters.updateVisDataUpdater, {
|
|
147
|
-
datasets: datasets,
|
|
148
|
-
options: options,
|
|
149
|
-
config: parsedConfig
|
|
150
|
-
})), (0, _composerHelpers.if_)(Boolean(info), (0, _composerHelpers.pick_)('visState')((0, _composerHelpers.apply_)(_visStateUpdaters.setMapInfoUpdater, {
|
|
151
|
-
info: info
|
|
152
|
-
}))),
|
|
153
|
-
// Note that fit bounds here won't be called in case datasets are created in Tasks.
|
|
154
|
-
// A separate Task to update bounds is created once the datasets are ready.
|
|
155
|
-
(0, _composerHelpers.with_)(function (_ref2) {
|
|
156
|
-
var visState = _ref2.visState;
|
|
157
|
-
return (0, _composerHelpers.pick_)('mapState')((0, _composerHelpers.apply_)(_mapStateUpdaters.receiveMapConfigUpdater, (0, _composerHelpers.payload_)({
|
|
158
|
-
config: parsedConfig,
|
|
159
|
-
options: options,
|
|
160
|
-
bounds: findMapBoundsIfCentered(filterNewlyAddedLayers(visState.layers))
|
|
161
|
-
})));
|
|
162
|
-
}), (0, _composerHelpers.pick_)('mapStyle')((0, _composerHelpers.apply_)(_mapStyleUpdaters.receiveMapConfigUpdater, (0, _composerHelpers.payload_)({
|
|
163
|
-
config: parsedConfig,
|
|
164
|
-
options: options
|
|
165
|
-
}))), (0, _composerHelpers.pick_)('uiState')((0, _composerHelpers.apply_)(_uiStateUpdaters.receiveMapConfigUpdater, (0, _composerHelpers.payload_)({
|
|
166
|
-
config: parsedConfig,
|
|
167
|
-
options: options
|
|
168
|
-
}))), (0, _composerHelpers.pick_)('uiState')((0, _composerHelpers.apply_)(_uiStateUpdaters.loadFilesSuccessUpdater, (0, _composerHelpers.payload_)(null))), (0, _composerHelpers.pick_)('uiState')((0, _composerHelpers.apply_)(_uiStateUpdaters.toggleModalUpdater, (0, _composerHelpers.payload_)(null))), (0, _composerHelpers.pick_)('uiState')((0, _composerHelpers.merge_)(Object.prototype.hasOwnProperty.call(options, 'readOnly') ? {
|
|
169
|
-
readOnly: options.readOnly
|
|
170
|
-
} : {}))])(state);
|
|
171
|
-
};
|
|
172
|
-
var loadFilesSuccessUpdater = exports.loadFilesSuccessUpdater = function loadFilesSuccessUpdater(state, action) {
|
|
173
|
-
// still more to load
|
|
174
|
-
var payloads = (0, _processors.filesToDataPayload)(action.result);
|
|
175
|
-
var nextState = (0, _composerHelpers.compose_)([(0, _composerHelpers.pick_)('visState')((0, _composerHelpers.merge_)({
|
|
176
|
-
fileLoading: false,
|
|
177
|
-
fileLoadingProgress: {}
|
|
178
|
-
}))])(state);
|
|
179
|
-
// make multiple add data to map calls
|
|
180
|
-
var stateWithData = (0, _composerHelpers.compose_)(payloads.map(function (p) {
|
|
181
|
-
return (0, _composerHelpers.apply_)(addDataToMapUpdater, (0, _composerHelpers.payload_)(p));
|
|
182
|
-
}))(nextState);
|
|
183
|
-
return stateWithData;
|
|
184
|
-
};
|
|
185
|
-
var addDataToMapComposed = exports.addDataToMapComposed = addDataToMapUpdater;
|
|
186
|
-
|
|
187
|
-
/**
|
|
188
|
-
* Helper which updates map overlay blending mode in visState,
|
|
189
|
-
* but only if it's not currently in the `normal` mode.
|
|
190
|
-
*/
|
|
191
|
-
var updateOverlayBlending = function updateOverlayBlending(overlayBlending) {
|
|
192
|
-
return function (visState) {
|
|
193
|
-
if (visState.overlayBlending !== _constants.OVERLAY_BLENDINGS.normal.value) {
|
|
194
|
-
return _objectSpread(_objectSpread({}, visState), {}, {
|
|
195
|
-
overlayBlending: overlayBlending
|
|
196
|
-
});
|
|
197
|
-
}
|
|
198
|
-
return visState;
|
|
199
|
-
};
|
|
200
|
-
};
|
|
201
|
-
|
|
202
|
-
/**
|
|
203
|
-
* Helper which updates `darkBaseMapEnabled` in all the layers in visState which
|
|
204
|
-
* have this config setting (or in one specific layer if the `layerId` param is provided).
|
|
205
|
-
*/
|
|
206
|
-
var updateDarkBaseMapLayers = function updateDarkBaseMapLayers(darkBaseMapEnabled) {
|
|
207
|
-
var layerId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
|
208
|
-
return function (visState) {
|
|
209
|
-
return _objectSpread(_objectSpread({}, visState), {}, {
|
|
210
|
-
layers: visState.layers.map(function (layer) {
|
|
211
|
-
if (!layerId || layer.id === layerId) {
|
|
212
|
-
if (Object.prototype.hasOwnProperty.call(layer.visConfigSettings, 'darkBaseMapEnabled')) {
|
|
213
|
-
var visConfig = layer.config.visConfig;
|
|
214
|
-
return layer.updateLayerConfig({
|
|
215
|
-
visConfig: _objectSpread(_objectSpread({}, visConfig), {}, {
|
|
216
|
-
darkBaseMapEnabled: darkBaseMapEnabled
|
|
217
|
-
})
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
return layer;
|
|
222
|
-
})
|
|
223
|
-
});
|
|
224
|
-
};
|
|
225
|
-
};
|
|
226
|
-
|
|
227
|
-
/**
|
|
228
|
-
* Updater that changes the map style by calling mapStyleChangeUpdater on visState.
|
|
229
|
-
* In addition to that, it does the following:
|
|
230
|
-
*
|
|
231
|
-
* 1. Update map overlay blending mode in accordance with the colorMode of the
|
|
232
|
-
* base map, but only if it's not in the `normal` mode.
|
|
233
|
-
*
|
|
234
|
-
* 2. Update all the layers which have the `darkBaseMapEnabled` config setting
|
|
235
|
-
* adjusting it in accordance with the colorMode of the base map.
|
|
236
|
-
*
|
|
237
|
-
*/
|
|
238
|
-
var combinedMapStyleChangeUpdater = exports.combinedMapStyleChangeUpdater = function combinedMapStyleChangeUpdater(state, action) {
|
|
239
|
-
var payload = action.payload;
|
|
240
|
-
var mapStyle = state.mapStyle;
|
|
241
|
-
var getColorMode = function getColorMode(key) {
|
|
242
|
-
var _mapStyle$mapStyles$k;
|
|
243
|
-
return (_mapStyle$mapStyles$k = mapStyle.mapStyles[key]) === null || _mapStyle$mapStyles$k === void 0 ? void 0 : _mapStyle$mapStyles$k.colorMode;
|
|
244
|
-
};
|
|
245
|
-
var prevColorMode = getColorMode(mapStyle.styleType);
|
|
246
|
-
var nextColorMode = getColorMode(payload.styleType);
|
|
247
|
-
var visState = state.visState;
|
|
248
|
-
if (nextColorMode !== prevColorMode) {
|
|
249
|
-
switch (nextColorMode) {
|
|
250
|
-
case _constants.BASE_MAP_COLOR_MODES.DARK:
|
|
251
|
-
visState = (0, _composerHelpers.compose_)([updateOverlayBlending(_constants.OVERLAY_BLENDINGS.screen.value), updateDarkBaseMapLayers(true)])(visState);
|
|
252
|
-
break;
|
|
253
|
-
case _constants.BASE_MAP_COLOR_MODES.LIGHT:
|
|
254
|
-
visState = (0, _composerHelpers.compose_)([updateOverlayBlending(_constants.OVERLAY_BLENDINGS.darken.value), updateDarkBaseMapLayers(false)])(visState);
|
|
255
|
-
break;
|
|
256
|
-
default:
|
|
257
|
-
// do nothing
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
261
|
-
visState: visState,
|
|
262
|
-
mapStyle: (0, _mapStyleUpdaters.mapStyleChangeUpdater)(mapStyle, {
|
|
263
|
-
payload: _objectSpread({}, payload)
|
|
264
|
-
})
|
|
265
|
-
});
|
|
266
|
-
};
|
|
267
|
-
|
|
268
|
-
/**
|
|
269
|
-
* Updater that changes the layer type by calling `layerTypeChangeUpdater` on visState.
|
|
270
|
-
* In addition to that, if the new layer type has the `darkBaseMapEnabled` config
|
|
271
|
-
* setting, we adjust it in accordance with the colorMode of the base map.s
|
|
272
|
-
*/
|
|
273
|
-
var combinedLayerTypeChangeUpdater = exports.combinedLayerTypeChangeUpdater = function combinedLayerTypeChangeUpdater(state, action) {
|
|
274
|
-
var visState = state.visState;
|
|
275
|
-
var oldLayerIndex = visState.layers.findIndex(function (layer) {
|
|
276
|
-
return layer === action.oldLayer;
|
|
277
|
-
});
|
|
278
|
-
visState = (0, _visStateUpdaters.layerTypeChangeUpdater)(visState, action);
|
|
279
|
-
var newLayer = visState.layers[oldLayerIndex];
|
|
280
|
-
if (Object.prototype.hasOwnProperty.call(newLayer === null || newLayer === void 0 ? void 0 : newLayer.visConfigSettings, 'darkBaseMapEnabled')) {
|
|
281
|
-
var mapStyle = state.mapStyle;
|
|
282
|
-
var colorMode = mapStyle.mapStyles[mapStyle.styleType].colorMode;
|
|
283
|
-
var darkBaseMapEnabled = newLayer.config.visConfig.darkBaseMapEnabled;
|
|
284
|
-
switch (colorMode) {
|
|
285
|
-
case _constants.BASE_MAP_COLOR_MODES.DARK:
|
|
286
|
-
if (!darkBaseMapEnabled) {
|
|
287
|
-
visState = updateDarkBaseMapLayers(true, newLayer.id)(visState);
|
|
288
|
-
}
|
|
289
|
-
break;
|
|
290
|
-
case _constants.BASE_MAP_COLOR_MODES.LIGHT:
|
|
291
|
-
if (darkBaseMapEnabled) {
|
|
292
|
-
visState = updateDarkBaseMapLayers(false, newLayer.id)(visState);
|
|
293
|
-
}
|
|
294
|
-
break;
|
|
295
|
-
default:
|
|
296
|
-
// do nothing
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
300
|
-
visState: visState
|
|
301
|
-
});
|
|
302
|
-
};
|
|
303
|
-
|
|
304
|
-
/**
|
|
305
|
-
* Make mapLegend active when toggleSplitMap action is called
|
|
306
|
-
*/
|
|
307
|
-
var toggleSplitMapUpdater = exports.toggleSplitMapUpdater = function toggleSplitMapUpdater(state, action) {
|
|
308
|
-
var _newState$uiState$map;
|
|
309
|
-
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
310
|
-
visState: (0, _visStateUpdaters.toggleSplitMapUpdater)(state.visState, action),
|
|
311
|
-
uiState: (0, _uiStateUpdaters.toggleSplitMapUpdater)(state.uiState),
|
|
312
|
-
mapState: (0, _mapStateUpdaters.toggleSplitMapUpdater)(state.mapState)
|
|
313
|
-
});
|
|
314
|
-
var isSplit = newState.visState.splitMaps.length !== 0;
|
|
315
|
-
var isLegendActive = (_newState$uiState$map = newState.uiState.mapControls) === null || _newState$uiState$map === void 0 || (_newState$uiState$map = _newState$uiState$map.mapLegend) === null || _newState$uiState$map === void 0 ? void 0 : _newState$uiState$map.active;
|
|
316
|
-
if (isSplit && !isLegendActive) {
|
|
317
|
-
newState.uiState = (0, _uiStateUpdaters.toggleMapControlUpdater)(newState.uiState, {
|
|
318
|
-
payload: {
|
|
319
|
-
panelId: 'mapLegend',
|
|
320
|
-
index: action.payload
|
|
321
|
-
}
|
|
322
|
-
});
|
|
323
|
-
}
|
|
324
|
-
return newState;
|
|
325
|
-
};
|
|
326
|
-
var defaultReplaceDataToMapOptions = {
|
|
327
|
-
keepExistingConfig: true,
|
|
328
|
-
centerMap: true,
|
|
329
|
-
autoCreateLayers: false
|
|
330
|
-
};
|
|
331
|
-
|
|
332
|
-
/**
|
|
333
|
-
* Updater replace a dataset in state
|
|
334
|
-
*/
|
|
335
|
-
var replaceDataInMapUpdater = exports.replaceDataInMapUpdater = function replaceDataInMapUpdater(state, _ref3) {
|
|
336
|
-
var payload = _ref3.payload;
|
|
337
|
-
var datasetToReplaceId = payload.datasetToReplaceId,
|
|
338
|
-
datasetToUse = payload.datasetToUse,
|
|
339
|
-
_payload$options = payload.options,
|
|
340
|
-
options = _payload$options === void 0 ? {} : _payload$options;
|
|
341
|
-
var addDataToMapOptions = _objectSpread(_objectSpread({}, defaultReplaceDataToMapOptions), options);
|
|
342
|
-
|
|
343
|
-
// check if dataset is there
|
|
344
|
-
if (!state.visState.datasets[datasetToReplaceId]) {
|
|
345
|
-
return state;
|
|
346
|
-
}
|
|
347
|
-
// datasetToUse is ProtoDataset
|
|
348
|
-
var dataIdToUse = datasetToUse.info.id;
|
|
349
|
-
if (!dataIdToUse) {
|
|
350
|
-
return state;
|
|
351
|
-
}
|
|
352
|
-
// remove dataset and put dependencies in toBeMerged
|
|
353
|
-
var preparedState = _objectSpread(_objectSpread({}, state), {}, {
|
|
354
|
-
visState: (0, _visStateUpdaters.prepareStateForDatasetReplace)(state.visState, datasetToReplaceId, dataIdToUse)
|
|
355
|
-
});
|
|
356
|
-
var nextState = addDataToMapUpdater(preparedState, (0, _composerHelpers.payload_)({
|
|
357
|
-
datasets: datasetToUse,
|
|
358
|
-
// should zoom to new dataset
|
|
359
|
-
options: addDataToMapOptions
|
|
360
|
-
}));
|
|
361
|
-
return nextState;
|
|
362
|
-
};
|
|
363
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdWlTdGF0ZVVwZGF0ZXJzIiwicmVxdWlyZSIsIl92aXNTdGF0ZVVwZGF0ZXJzIiwiX21hcFN0YXRlVXBkYXRlcnMiLCJfbWFwU3R5bGVVcGRhdGVycyIsIl9wcm9jZXNzb3JzIiwiX2NvbXBvc2VySGVscGVycyIsIl91dGlscyIsIl9kYXRhVXRpbHMiLCJfY29uc3RhbnRzIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJjb21iaW5lZFVwZGF0ZXJzIiwiaXNWYWxpZENvbmZpZyIsImV4cG9ydHMiLCJjb25maWciLCJpc1BsYWluT2JqZWN0IiwidmVyc2lvbiIsImRlZmF1bHRBZGREYXRhVG9NYXBPcHRpb25zIiwiY2VudGVyTWFwIiwia2VlcEV4aXN0aW5nQ29uZmlnIiwiYXV0b0NyZWF0ZUxheWVycyIsImF1dG9DcmVhdGVUb29sdGlwcyIsImFkZERhdGFUb01hcFVwZGF0ZXIiLCJzdGF0ZSIsIl9yZWYiLCJfZGF0YXNldHMkIiwiX2RhdGFzZXRzJDIiLCJfZGF0YXNldHMkMyIsInBheWxvYWQiLCJkYXRhc2V0cyIsImluZm8iLCJvcHRpb25zIiwiaXNQcm9ncmVzc2l2ZUxvYWRpbmciLCJBcnJheSIsImlzQXJyYXkiLCJmb3JtYXQiLCJpZCIsInZpc1N0YXRlIiwiY29tcG9zZV8iLCJwaWNrXyIsImFwcGx5XyIsInZpc1N0YXRlVXBkYXRlVmlzRGF0YVVwZGF0ZXIiLCJwYXJzZWRDb25maWciLCJzY2hlbWEiLCJwYXJzZVNhdmVkQ29uZmlnIiwib2xkTGF5ZXJzIiwibGF5ZXJzIiwiZmlsdGVyTmV3bHlBZGRlZExheWVycyIsIm5sIiwiZmluZCIsIm9sIiwiZmluZE1hcEJvdW5kc0lmQ2VudGVyZWQiLCJib3VuZHMiLCJmaW5kTWFwQm91bmRzIiwidW5kZWZpbmVkIiwiaWZfIiwiQm9vbGVhbiIsInNldE1hcEluZm9VcGRhdGVyIiwid2l0aF8iLCJfcmVmMiIsInN0YXRlTWFwQ29uZmlnVXBkYXRlciIsInBheWxvYWRfIiwic3R5bGVNYXBDb25maWdVcGRhdGVyIiwidWlTdGF0ZVJlY2VpdmVNYXBDb25maWdVcGRhdGVyIiwidWlTdGF0ZUxvYWRGaWxlc1N1Y2Nlc3NVcGRhdGVyIiwidG9nZ2xlTW9kYWxVcGRhdGVyIiwibWVyZ2VfIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwicmVhZE9ubHkiLCJsb2FkRmlsZXNTdWNjZXNzVXBkYXRlciIsImFjdGlvbiIsInBheWxvYWRzIiwiZmlsZXNUb0RhdGFQYXlsb2FkIiwicmVzdWx0IiwibmV4dFN0YXRlIiwiZmlsZUxvYWRpbmciLCJmaWxlTG9hZGluZ1Byb2dyZXNzIiwic3RhdGVXaXRoRGF0YSIsIm1hcCIsInAiLCJhZGREYXRhVG9NYXBDb21wb3NlZCIsInVwZGF0ZU92ZXJsYXlCbGVuZGluZyIsIm92ZXJsYXlCbGVuZGluZyIsIk9WRVJMQVlfQkxFTkRJTkdTIiwibm9ybWFsIiwidmFsdWUiLCJ1cGRhdGVEYXJrQmFzZU1hcExheWVycyIsImRhcmtCYXNlTWFwRW5hYmxlZCIsImxheWVySWQiLCJsYXllciIsInZpc0NvbmZpZ1NldHRpbmdzIiwidmlzQ29uZmlnIiwidXBkYXRlTGF5ZXJDb25maWciLCJjb21iaW5lZE1hcFN0eWxlQ2hhbmdlVXBkYXRlciIsIm1hcFN0eWxlIiwiZ2V0Q29sb3JNb2RlIiwia2V5IiwiX21hcFN0eWxlJG1hcFN0eWxlcyRrIiwibWFwU3R5bGVzIiwiY29sb3JNb2RlIiwicHJldkNvbG9yTW9kZSIsInN0eWxlVHlwZSIsIm5leHRDb2xvck1vZGUiLCJCQVNFX01BUF9DT0xPUl9NT0RFUyIsIkRBUksiLCJzY3JlZW4iLCJMSUdIVCIsImRhcmtlbiIsIm1hcFN0eWxlQ2hhbmdlVXBkYXRlciIsImNvbWJpbmVkTGF5ZXJUeXBlQ2hhbmdlVXBkYXRlciIsIm9sZExheWVySW5kZXgiLCJmaW5kSW5kZXgiLCJvbGRMYXllciIsImxheWVyVHlwZUNoYW5nZVVwZGF0ZXIiLCJuZXdMYXllciIsInRvZ2dsZVNwbGl0TWFwVXBkYXRlciIsIl9uZXdTdGF0ZSR1aVN0YXRlJG1hcCIsIm5ld1N0YXRlIiwidmlzU3RhdGVUb2dnbGVTcGxpdE1hcFVwZGF0ZXIiLCJ1aVN0YXRlIiwidWlTdGF0ZVRvZ2dsZVNwbGl0TWFwVXBkYXRlciIsIm1hcFN0YXRlIiwibWFwU3RhdGVUb2dnbGVTcGxpdE1hcFVwZGF0ZXIiLCJpc1NwbGl0Iiwic3BsaXRNYXBzIiwiaXNMZWdlbmRBY3RpdmUiLCJtYXBDb250cm9scyIsIm1hcExlZ2VuZCIsImFjdGl2ZSIsInRvZ2dsZU1hcENvbnRyb2xVcGRhdGVyIiwicGFuZWxJZCIsImluZGV4IiwiZGVmYXVsdFJlcGxhY2VEYXRhVG9NYXBPcHRpb25zIiwicmVwbGFjZURhdGFJbk1hcFVwZGF0ZXIiLCJfcmVmMyIsImRhdGFzZXRUb1JlcGxhY2VJZCIsImRhdGFzZXRUb1VzZSIsIl9wYXlsb2FkJG9wdGlvbnMiLCJhZGREYXRhVG9NYXBPcHRpb25zIiwiZGF0YUlkVG9Vc2UiLCJwcmVwYXJlZFN0YXRlIiwicHJlcGFyZVN0YXRlRm9yRGF0YXNldFJlcGxhY2UiXSwic291cmNlcyI6WyIuLi9zcmMvY29tYmluZWQtdXBkYXRlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHtcbiAgdG9nZ2xlTW9kYWxVcGRhdGVyLFxuICBsb2FkRmlsZXNTdWNjZXNzVXBkYXRlciBhcyB1aVN0YXRlTG9hZEZpbGVzU3VjY2Vzc1VwZGF0ZXIsXG4gIHRvZ2dsZU1hcENvbnRyb2xVcGRhdGVyLFxuICB0b2dnbGVTcGxpdE1hcFVwZGF0ZXIgYXMgdWlTdGF0ZVRvZ2dsZVNwbGl0TWFwVXBkYXRlcixcbiAgcmVjZWl2ZU1hcENvbmZpZ1VwZGF0ZXIgYXMgdWlTdGF0ZVJlY2VpdmVNYXBDb25maWdVcGRhdGVyXG59IGZyb20gJy4vdWktc3RhdGUtdXBkYXRlcnMnO1xuaW1wb3J0IHtcbiAgdXBkYXRlVmlzRGF0YVVwZGF0ZXIgYXMgdmlzU3RhdGVVcGRhdGVWaXNEYXRhVXBkYXRlcixcbiAgc2V0TWFwSW5mb1VwZGF0ZXIsXG4gIGxheWVyVHlwZUNoYW5nZVVwZGF0ZXIsXG4gIHRvZ2dsZVNwbGl0TWFwVXBkYXRlciBhcyB2aXNTdGF0ZVRvZ2dsZVNwbGl0TWFwVXBkYXRlcixcbiAgcHJlcGFyZVN0YXRlRm9yRGF0YXNldFJlcGxhY2Vcbn0gZnJvbSAnLi92aXMtc3RhdGUtdXBkYXRlcnMnO1xuaW1wb3J0IHtcbiAgcmVjZWl2ZU1hcENvbmZpZ1VwZGF0ZXIgYXMgc3RhdGVNYXBDb25maWdVcGRhdGVyLFxuICB0b2dnbGVTcGxpdE1hcFVwZGF0ZXIgYXMgbWFwU3RhdGVUb2dnbGVTcGxpdE1hcFVwZGF0ZXJcbn0gZnJvbSAnLi9tYXAtc3RhdGUtdXBkYXRlcnMnO1xuaW1wb3J0IHtcbiAgbWFwU3R5bGVDaGFuZ2VVcGRhdGVyLFxuICByZWNlaXZlTWFwQ29uZmlnVXBkYXRlciBhcyBzdHlsZU1hcENvbmZpZ1VwZGF0ZXJcbn0gZnJvbSAnLi9tYXAtc3R5bGUtdXBkYXRlcnMnO1xuaW1wb3J0IHtmaWxlc1RvRGF0YVBheWxvYWR9IGZyb20gJ0BrZXBsZXIuZ2wvcHJvY2Vzc29ycyc7XG5pbXBvcnQge3BheWxvYWRfLCBhcHBseV8sIHdpdGhfLCBpZl8sIGNvbXBvc2VfLCBtZXJnZV8sIHBpY2tffSBmcm9tICcuL2NvbXBvc2VyLWhlbHBlcnMnO1xuaW1wb3J0IHtNYXBTdGF0ZSwgVWlTdGF0ZSwgQWRkRGF0YVRvTWFwUGF5bG9hZCwgUGFyc2VkQ29uZmlnfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7TWFwU3R5bGV9IGZyb20gJy4vbWFwLXN0eWxlLXVwZGF0ZXJzJztcbmltcG9ydCB7UHJvdmlkZXJTdGF0ZX0gZnJvbSAnLi9wcm92aWRlci1zdGF0ZS11cGRhdGVycyc7XG5pbXBvcnQge1xuICBsb2FkRmlsZXNTdWNjZXNzVXBkYXRlckFjdGlvbixcbiAgTWFwU3R5bGVDaGFuZ2VVcGRhdGVyQWN0aW9uLFxuICBMYXllclR5cGVDaGFuZ2VVcGRhdGVyQWN0aW9uLFxuICBUb2dnbGVTcGxpdE1hcFVwZGF0ZXJBY3Rpb24sXG4gIFJlcGxhY2VEYXRhSW5NYXBQYXlsb2FkXG59IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQge1Zpc1N0YXRlfSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuaW1wb3J0IHtMYXllcn0gZnJvbSAnQGtlcGxlci5nbC9sYXllcnMnO1xuaW1wb3J0IHtpc1BsYWluT2JqZWN0fSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7ZmluZE1hcEJvdW5kc30gZnJvbSAnLi9kYXRhLXV0aWxzJztcbmltcG9ydCB7QkFTRV9NQVBfQ09MT1JfTU9ERVMsIE9WRVJMQVlfQkxFTkRJTkdTfSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5cbmV4cG9ydCB0eXBlIEtlcGxlckdsU3RhdGUgPSB7XG4gIHZpc1N0YXRlOiBWaXNTdGF0ZTtcbiAgbWFwU3RhdGU6IE1hcFN0YXRlO1xuICBtYXBTdHlsZTogTWFwU3R5bGU7XG4gIHVpU3RhdGU6IFVpU3RhdGU7XG4gIHByb3ZpZGVyU3RhdGU6IFByb3ZpZGVyU3RhdGU7XG59O1xuXG4vLyBjb21wb3NlIGFjdGlvbiB0byBhcHBseSByZXN1bHQgbXVsdGlwbGUgcmVkdWNlcnMsIHdpdGggdGhlIG91dHB1dCBvZiBvbmVcblxuLyoqXG4gKiBTb21lIGFjdGlvbnMgd2lsbCBhZmZlY3QgdGhlIGVudGlyZSBrZXBsZXIubGcgaW5zdGFuY2Ugc3RhdGUuXG4gKiBUaGUgdXBkYXRlcnMgZm9yIHRoZXNlIGFjdGlvbnMgaXMgZXhwb3J0ZWQgYXMgYGNvbWJpbmVkVXBkYXRlcnNgLiBUaGVzZSB1cGRhdGVyIHRha2UgdGhlIGVudGlyZSBpbnN0YW5jZSBzdGF0ZVxuICogYXMgdGhlIGZpcnN0IGFyZ3VtZW50LiBSZWFkIG1vcmUgYWJvdXQgW1VzaW5nIHVwZGF0ZXJzXSguLi9hZHZhbmNlZC11c2FnZS91c2luZy11cGRhdGVycy5tZClcbiAqIEBwdWJsaWNcbiAqIEBleGFtcGxlXG4gKlxuICogaW1wb3J0IGtlcGxlckdsUmVkdWNlciwge2NvbWJpbmVkVXBkYXRlcnN9IGZyb20gJ0BrZXBsZXIuZ2wvcmVkdWNlcnMnO1xuICogLy8gUm9vdCBSZWR1Y2VyXG4gKiBjb25zdCByZWR1Y2VycyA9IGNvbWJpbmVSZWR1Y2Vycyh7XG4gKiAga2VwbGVyR2w6IGtlcGxlckdsUmVkdWNlcixcbiAqICBhcHA6IGFwcFJlZHVjZXJcbiAqIH0pO1xuICpcbiAqIGNvbnN0IGNvbXBvc2VkUmVkdWNlciA9IChzdGF0ZSwgYWN0aW9uKSA9PiB7XG4gKiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICogICAgLy8gYWRkIGRhdGEgdG8gbWFwIGFmdGVyIHJlY2VpdmluZyBkYXRhIGZyb20gcmVtb3RlIHNvdXJjZXNcbiAqICAgIGNhc2UgJ0xPQURfUkVNT1RFX1JFU09VUkNFX1NVQ0NFU1MnOlxuICogICAgICByZXR1cm4ge1xuICogICAgICAgIC4uLnN0YXRlLFxuICogICAgICAgIGtlcGxlckdsOiB7XG4gKiAgICAgICAgICAuLi5zdGF0ZS5rZXBsZXJHbCxcbiAqICAgICAgICAgIC8vIHBhc3MgaW4ga2VwbGVyLmdsIGluc3RhbmNlIHN0YXRlIHRvIGNvbWJpbmVkVXBkYXRlcnNcbiAqICAgICAgICAgIG1hcDogIGNvbWJpbmVkVXBkYXRlcnMuYWRkRGF0YVRvTWFwVXBkYXRlcihcbiAqICAgICAgICAgICBzdGF0ZS5rZXBsZXJHbC5tYXAsXG4gKiAgICAgICAgICAge1xuICogICAgICAgICAgICAgcGF5bG9hZDoge1xuICogICAgICAgICAgICAgICBkYXRhc2V0czogYWN0aW9uLmRhdGFzZXRzLFxuICogICAgICAgICAgICAgICBvcHRpb25zOiB7cmVhZE9ubHk6IHRydWV9LFxuICogICAgICAgICAgICAgICBjb25maWc6IGFjdGlvbi5jb25maWdcbiAqICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgIH1cbiAqICAgICAgICAgIClcbiAqICAgICAgICB9XG4gKiAgICAgIH07XG4gKiAgfVxuICogIHJldHVybiByZWR1Y2VycyhzdGF0ZSwgYWN0aW9uKTtcbiAqIH07XG4gKlxuICogZXhwb3J0IGRlZmF1bHQgY29tcG9zZWRSZWR1Y2VyO1xuICovXG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuLy8gQHRzLWlnbm9yZVxuY29uc3QgY29tYmluZWRVcGRhdGVycyA9IG51bGw7XG4vKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuXG5leHBvcnQgY29uc3QgaXNWYWxpZENvbmZpZyA9IGNvbmZpZyA9PlxuICBpc1BsYWluT2JqZWN0KGNvbmZpZykgJiYgaXNQbGFpbk9iamVjdChjb25maWcuY29uZmlnKSAmJiBjb25maWcudmVyc2lvbjtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRBZGREYXRhVG9NYXBPcHRpb25zID0ge1xuICBjZW50ZXJNYXA6IHRydWUsXG4gIGtlZXBFeGlzdGluZ0NvbmZpZzogZmFsc2UsXG4gIGF1dG9DcmVhdGVMYXllcnM6IHRydWUsXG4gIGF1dG9DcmVhdGVUb29sdGlwczogdHJ1ZVxufTtcblxuLyoqXG4gKiBDb21iaW5lIGRhdGEgYW5kIGZ1bGwgY29uZmlndXJhdGlvbiB1cGRhdGUgaW4gYSBzaW5nbGUgYWN0aW9uXG4gKlxuICogQG1lbWJlcm9mIGNvbWJpbmVkVXBkYXRlcnNcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZSBrZXBsZXIuZ2wgaW5zdGFuY2Ugc3RhdGUsIGNvbnRhaW5pbmcgYWxsIHN1YnJlZHVjZXIgc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb24ucGF5bG9hZCBge2RhdGFzZXRzLCBvcHRpb25zLCBjb25maWd9YFxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkLmRhdGFzZXRzIC0gKioqcmVxdWlyZWQqKiBkYXRhc2V0cyBjYW4gYmUgYSBkYXRhc2V0IG9yIGFuIGFycmF5IG9mIGRhdGFzZXRzXG4gKiBFYWNoIGRhdGFzZXQgb2JqZWN0IG5lZWRzIHRvIGhhdmUgYGluZm9gIGFuZCBgZGF0YWAgcHJvcGVydHkuXG4gKiBAcGFyYW0gW2FjdGlvbi5wYXlsb2FkLm9wdGlvbnNdIG9wdGlvbiBvYmplY3QgYHtjZW50ZXJNYXA6IHRydWV9YFxuICogQHBhcmFtIFthY3Rpb24ucGF5bG9hZC5jb25maWddIG1hcCBjb25maWdcbiAqIEBwYXJhbSBbYWN0aW9uLnBheWxvYWQuaW5mb10gbWFwIGluZm8gY29udGFpbnMgdGl0bGUgYW5kIGRlc2NyaXB0aW9uXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEYXRhc2V0XG4gKiBAcHJvcGVydHkgaW5mbyAtaW5mbyBvZiBhIGRhdGFzZXRcbiAqIEBwcm9wZXJ0eSBpbmZvLmlkIC0gaWQgb2YgdGhpcyBkYXRhc2V0LiBJZiBjb25maWcgaXMgZGVmaW5lZCwgYGlkYCBzaG91bGQgbWF0Y2hlcyB0aGUgYGRhdGFJZGAgaW4gY29uZmlnLlxuICogQHByb3BlcnR5IGluZm8ubGFiZWwgLSBBIGRpc3BsYXkgbmFtZSBvZiB0aGlzIGRhdGFzZXRcbiAqIEBwcm9wZXJ0eSBkYXRhIC0gKioqcmVxdWlyZWQqKiBUaGUgZGF0YSBvYmplY3QsIGluIGEgdGFidWxhciBmb3JtYXQgd2l0aCAyIHByb3BlcnRpZXMgYGZpZWxkc2AgYW5kIGByb3dzYFxuICogQHByb3BlcnR5IGRhdGEuZmllbGRzIC0gKioqcmVxdWlyZWQqKiBBcnJheSBvZiBmaWVsZHMsXG4gKiBAcHJvcGVydHkgZGF0YS5maWVsZHMubmFtZSAtICoqKnJlcXVpcmVkKiogTmFtZSBvZiB0aGUgZmllbGQsXG4gKiBAcHJvcGVydHkgZGF0YS5yb3dzIC0gKioqcmVxdWlyZWQqKiBBcnJheSBvZiByb3dzLCBpbiBhIHRhYnVsYXIgZm9ybWF0IHdpdGggYGZpZWxkc2AgYW5kIGByb3dzYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGFkZERhdGFUb01hcFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBLZXBsZXJHbFN0YXRlLFxuICB7cGF5bG9hZH06IHtwYXlsb2FkOiBBZGREYXRhVG9NYXBQYXlsb2FkfVxuKTogS2VwbGVyR2xTdGF0ZSA9PiB7XG4gIGNvbnN0IHtkYXRhc2V0cywgY29uZmlnLCBpbmZvfSA9IHBheWxvYWQ7XG5cbiAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAuLi5kZWZhdWx0QWRkRGF0YVRvTWFwT3B0aW9ucyxcbiAgICAuLi5wYXlsb2FkLm9wdGlvbnNcbiAgfTtcblxuICAvLyBjaGVjayBpZiBwcm9ncmVzc2l2ZSBsb2FkaW5nIGRhdGFzZXQgYnkgYmF0Y2hlcywgYW5kIHVwZGF0ZSB2aXNTdGF0ZSBkaXJlY3RseVxuICBjb25zdCBpc1Byb2dyZXNzaXZlTG9hZGluZyA9XG4gICAgQXJyYXkuaXNBcnJheShkYXRhc2V0cykgJiZcbiAgICBkYXRhc2V0c1swXT8uaW5mby5mb3JtYXQgPT09ICdhcnJvdycgJiZcbiAgICBkYXRhc2V0c1swXT8uaW5mby5pZCAmJlxuICAgIGRhdGFzZXRzWzBdPy5pbmZvLmlkIGluIHN0YXRlLnZpc1N0YXRlLmRhdGFzZXRzO1xuICBpZiAoaXNQcm9ncmVzc2l2ZUxvYWRpbmcpIHtcbiAgICByZXR1cm4gY29tcG9zZV88S2VwbGVyR2xTdGF0ZT4oW1xuICAgICAgcGlja18oJ3Zpc1N0YXRlJykoXG4gICAgICAgIGFwcGx5XzxWaXNTdGF0ZSwgYW55Pih2aXNTdGF0ZVVwZGF0ZVZpc0RhdGFVcGRhdGVyLCB7XG4gICAgICAgICAgZGF0YXNldHMsXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICBjb25maWdcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICBdKShzdGF0ZSk7XG4gIH1cblxuICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gIGxldCBwYXJzZWRDb25maWc6IFBhcnNlZENvbmZpZyA9IGNvbmZpZztcblxuICBpZiAoaXNWYWxpZENvbmZpZyhjb25maWcpKSB7XG4gICAgLy8gaWYgcGFzc2VkIGluIHNhdmVkIGNvbmZpZ1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBwYXJzZWRDb25maWcgPSBzdGF0ZS52aXNTdGF0ZS5zY2hlbWEucGFyc2VTYXZlZENvbmZpZyhjb25maWcpO1xuICB9XG4gIGNvbnN0IG9sZExheWVycyA9IHN0YXRlLnZpc1N0YXRlLmxheWVycztcbiAgY29uc3QgZmlsdGVyTmV3bHlBZGRlZExheWVycyA9IChsYXllcnM6IExheWVyW10pID0+XG4gICAgbGF5ZXJzLmZpbHRlcihubCA9PiAhb2xkTGF5ZXJzLmZpbmQob2wgPT4gb2wgPT09IG5sKSk7XG5cbiAgLy8gUmV0dXJucyB1bmRlZmluZWQgaWYgbm90IGZvdW5kLCB0byBtYWtlIHR5cGVzY3JpcHQgaGFwcHlcbiAgY29uc3QgZmluZE1hcEJvdW5kc0lmQ2VudGVyZWQgPSAobGF5ZXJzOiBMYXllcltdKSA9PiB7XG4gICAgY29uc3QgYm91bmRzID0gb3B0aW9ucy5jZW50ZXJNYXAgJiYgZmluZE1hcEJvdW5kcyhsYXllcnMpO1xuICAgIHJldHVybiBib3VuZHMgPyBib3VuZHMgOiB1bmRlZmluZWQ7XG4gIH07XG5cbiAgcmV0dXJuIGNvbXBvc2VfPEtlcGxlckdsU3RhdGU+KFtcbiAgICBwaWNrXygndmlzU3RhdGUnKShcbiAgICAgIC8vIHRoaXMgcGFydCBjYW4gYmUgYXN5bmNcbiAgICAgIGFwcGx5XzxWaXNTdGF0ZSwgYW55Pih2aXNTdGF0ZVVwZGF0ZVZpc0RhdGFVcGRhdGVyLCB7XG4gICAgICAgIGRhdGFzZXRzLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBjb25maWc6IHBhcnNlZENvbmZpZ1xuICAgICAgfSlcbiAgICApLFxuXG4gICAgaWZfKEJvb2xlYW4oaW5mbyksIHBpY2tfKCd2aXNTdGF0ZScpKGFwcGx5XzxWaXNTdGF0ZSwgYW55PihzZXRNYXBJbmZvVXBkYXRlciwge2luZm99KSkpLFxuICAgIC8vIE5vdGUgdGhhdCBmaXQgYm91bmRzIGhlcmUgd29uJ3QgYmUgY2FsbGVkIGluIGNhc2UgZGF0YXNldHMgYXJlIGNyZWF0ZWQgaW4gVGFza3MuXG4gICAgLy8gQSBzZXBhcmF0ZSBUYXNrIHRvIHVwZGF0ZSBib3VuZHMgaXMgY3JlYXRlZCBvbmNlIHRoZSBkYXRhc2V0cyBhcmUgcmVhZHkuXG4gICAgd2l0aF8oKHt2aXNTdGF0ZX0pID0+XG4gICAgICBwaWNrXygnbWFwU3RhdGUnKShcbiAgICAgICAgYXBwbHlfKFxuICAgICAgICAgIHN0YXRlTWFwQ29uZmlnVXBkYXRlcixcbiAgICAgICAgICBwYXlsb2FkXyh7XG4gICAgICAgICAgICBjb25maWc6IHBhcnNlZENvbmZpZyxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBib3VuZHM6IGZpbmRNYXBCb3VuZHNJZkNlbnRlcmVkKGZpbHRlck5ld2x5QWRkZWRMYXllcnModmlzU3RhdGUubGF5ZXJzKSlcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApXG4gICAgKSxcbiAgICBwaWNrXygnbWFwU3R5bGUnKShhcHBseV8oc3R5bGVNYXBDb25maWdVcGRhdGVyLCBwYXlsb2FkXyh7Y29uZmlnOiBwYXJzZWRDb25maWcsIG9wdGlvbnN9KSkpLFxuICAgIHBpY2tfKCd1aVN0YXRlJykoXG4gICAgICBhcHBseV8odWlTdGF0ZVJlY2VpdmVNYXBDb25maWdVcGRhdGVyLCBwYXlsb2FkXyh7Y29uZmlnOiBwYXJzZWRDb25maWcsIG9wdGlvbnN9KSlcbiAgICApLFxuICAgIHBpY2tfKCd1aVN0YXRlJykoYXBwbHlfKHVpU3RhdGVMb2FkRmlsZXNTdWNjZXNzVXBkYXRlciwgcGF5bG9hZF8obnVsbCkpKSxcblxuICAgIHBpY2tfKCd1aVN0YXRlJykoYXBwbHlfKHRvZ2dsZU1vZGFsVXBkYXRlciwgcGF5bG9hZF8obnVsbCkpKSxcbiAgICBwaWNrXygndWlTdGF0ZScpKFxuICAgICAgbWVyZ2VfKFxuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgJ3JlYWRPbmx5JylcbiAgICAgICAgICA/IHtyZWFkT25seTogb3B0aW9ucy5yZWFkT25seX1cbiAgICAgICAgICA6IHt9XG4gICAgICApXG4gICAgKVxuICBdKShzdGF0ZSk7XG59O1xuXG5leHBvcnQgY29uc3QgbG9hZEZpbGVzU3VjY2Vzc1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBLZXBsZXJHbFN0YXRlLFxuICBhY3Rpb246IGxvYWRGaWxlc1N1Y2Nlc3NVcGRhdGVyQWN0aW9uXG4pOiBLZXBsZXJHbFN0YXRlID0+IHtcbiAgLy8gc3RpbGwgbW9yZSB0byBsb2FkXG4gIGNvbnN0IHBheWxvYWRzID0gZmlsZXNUb0RhdGFQYXlsb2FkKGFjdGlvbi5yZXN1bHQpO1xuICBjb25zdCBuZXh0U3RhdGUgPSBjb21wb3NlXyhbXG4gICAgcGlja18oJ3Zpc1N0YXRlJykoXG4gICAgICBtZXJnZV8oe1xuICAgICAgICBmaWxlTG9hZGluZzogZmFsc2UsXG4gICAgICAgIGZpbGVMb2FkaW5nUHJvZ3Jlc3M6IHt9XG4gICAgICB9KVxuICAgIClcbiAgXSkoc3RhdGUpO1xuICAvLyBtYWtlIG11bHRpcGxlIGFkZCBkYXRhIHRvIG1hcCBjYWxsc1xuICBjb25zdCBzdGF0ZVdpdGhEYXRhID0gY29tcG9zZV8ocGF5bG9hZHMubWFwKHAgPT4gYXBwbHlfKGFkZERhdGFUb01hcFVwZGF0ZXIsIHBheWxvYWRfKHApKSkpKFxuICAgIG5leHRTdGF0ZVxuICApO1xuICByZXR1cm4gc3RhdGVXaXRoRGF0YSBhcyBLZXBsZXJHbFN0YXRlO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZERhdGFUb01hcENvbXBvc2VkID0gYWRkRGF0YVRvTWFwVXBkYXRlcjtcblxuLyoqXG4gKiBIZWxwZXIgd2hpY2ggdXBkYXRlcyBtYXAgb3ZlcmxheSBibGVuZGluZyBtb2RlIGluIHZpc1N0YXRlLFxuICogYnV0IG9ubHkgaWYgaXQncyBub3QgY3VycmVudGx5IGluIHRoZSBgbm9ybWFsYCBtb2RlLlxuICovXG5jb25zdCB1cGRhdGVPdmVybGF5QmxlbmRpbmcgPSBvdmVybGF5QmxlbmRpbmcgPT4gdmlzU3RhdGUgPT4ge1xuICBpZiAodmlzU3RhdGUub3ZlcmxheUJsZW5kaW5nICE9PSBPVkVSTEFZX0JMRU5ESU5HUy5ub3JtYWwudmFsdWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udmlzU3RhdGUsXG4gICAgICBvdmVybGF5QmxlbmRpbmdcbiAgICB9O1xuICB9XG4gIHJldHVybiB2aXNTdGF0ZTtcbn07XG5cbi8qKlxuICogSGVscGVyIHdoaWNoIHVwZGF0ZXMgYGRhcmtCYXNlTWFwRW5hYmxlZGAgaW4gYWxsIHRoZSBsYXllcnMgaW4gdmlzU3RhdGUgd2hpY2hcbiAqIGhhdmUgdGhpcyBjb25maWcgc2V0dGluZyAob3IgaW4gb25lIHNwZWNpZmljIGxheWVyIGlmIHRoZSBgbGF5ZXJJZGAgcGFyYW0gaXMgcHJvdmlkZWQpLlxuICovXG5jb25zdCB1cGRhdGVEYXJrQmFzZU1hcExheWVycyA9XG4gIChkYXJrQmFzZU1hcEVuYWJsZWQ6IGJvb2xlYW4sIGxheWVySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsKSA9PlxuICB2aXNTdGF0ZSA9PiAoe1xuICAgIC4uLnZpc1N0YXRlLFxuICAgIGxheWVyczogdmlzU3RhdGUubGF5ZXJzLm1hcChsYXllciA9PiB7XG4gICAgICBpZiAoIWxheWVySWQgfHwgbGF5ZXIuaWQgPT09IGxheWVySWQpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChsYXllci52aXNDb25maWdTZXR0aW5ncywgJ2RhcmtCYXNlTWFwRW5hYmxlZCcpKSB7XG4gICAgICAgICAgY29uc3Qge3Zpc0NvbmZpZ30gPSBsYXllci5jb25maWc7XG4gICAgICAgICAgcmV0dXJuIGxheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgICAgICAgIHZpc0NvbmZpZzogey4uLnZpc0NvbmZpZywgZGFya0Jhc2VNYXBFbmFibGVkfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbGF5ZXI7XG4gICAgfSlcbiAgfSk7XG5cbi8qKlxuICogVXBkYXRlciB0aGF0IGNoYW5nZXMgdGhlIG1hcCBzdHlsZSBieSBjYWxsaW5nIG1hcFN0eWxlQ2hhbmdlVXBkYXRlciBvbiB2aXNTdGF0ZS5cbiAqIEluIGFkZGl0aW9uIHRvIHRoYXQsIGl0IGRvZXMgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiAgIDEuIFVwZGF0ZSBtYXAgb3ZlcmxheSBibGVuZGluZyBtb2RlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgY29sb3JNb2RlIG9mIHRoZVxuICogICAgICBiYXNlIG1hcCwgYnV0IG9ubHkgaWYgaXQncyBub3QgaW4gdGhlIGBub3JtYWxgIG1vZGUuXG4gKlxuICogICAyLiBVcGRhdGUgYWxsIHRoZSBsYXllcnMgd2hpY2ggaGF2ZSB0aGUgYGRhcmtCYXNlTWFwRW5hYmxlZGAgY29uZmlnIHNldHRpbmdcbiAqICAgICAgYWRqdXN0aW5nIGl0IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgY29sb3JNb2RlIG9mIHRoZSBiYXNlIG1hcC5cbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBjb21iaW5lZE1hcFN0eWxlQ2hhbmdlVXBkYXRlciA9IChcbiAgc3RhdGU6IEtlcGxlckdsU3RhdGUsXG4gIGFjdGlvbjogTWFwU3R5bGVDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBLZXBsZXJHbFN0YXRlID0+IHtcbiAgY29uc3Qge3BheWxvYWR9ID0gYWN0aW9uO1xuICBjb25zdCB7bWFwU3R5bGV9ID0gc3RhdGU7XG4gIGNvbnN0IGdldENvbG9yTW9kZSA9IGtleSA9PiBtYXBTdHlsZS5tYXBTdHlsZXNba2V5XT8uY29sb3JNb2RlO1xuICBjb25zdCBwcmV2Q29sb3JNb2RlID0gZ2V0Q29sb3JNb2RlKG1hcFN0eWxlLnN0eWxlVHlwZSk7XG4gIGNvbnN0IG5leHRDb2xvck1vZGUgPSBnZXRDb2xvck1vZGUocGF5bG9hZC5zdHlsZVR5cGUpO1xuICBsZXQge3Zpc1N0YXRlfSA9IHN0YXRlO1xuICBpZiAobmV4dENvbG9yTW9kZSAhPT0gcHJldkNvbG9yTW9kZSkge1xuICAgIHN3aXRjaCAobmV4dENvbG9yTW9kZSkge1xuICAgICAgY2FzZSBCQVNFX01BUF9DT0xPUl9NT0RFUy5EQVJLOlxuICAgICAgICB2aXNTdGF0ZSA9IGNvbXBvc2VfKFtcbiAgICAgICAgICB1cGRhdGVPdmVybGF5QmxlbmRpbmcoT1ZFUkxBWV9CTEVORElOR1Muc2NyZWVuLnZhbHVlKSxcbiAgICAgICAgICB1cGRhdGVEYXJrQmFzZU1hcExheWVycyh0cnVlKVxuICAgICAgICBdKSh2aXNTdGF0ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBCQVNFX01BUF9DT0xPUl9NT0RFUy5MSUdIVDpcbiAgICAgICAgdmlzU3RhdGUgPSBjb21wb3NlXyhbXG4gICAgICAgICAgdXBkYXRlT3ZlcmxheUJsZW5kaW5nKE9WRVJMQVlfQkxFTkRJTkdTLmRhcmtlbi52YWx1ZSksXG4gICAgICAgICAgdXBkYXRlRGFya0Jhc2VNYXBMYXllcnMoZmFsc2UpXG4gICAgICAgIF0pKHZpc1N0YXRlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIHZpc1N0YXRlLFxuICAgIG1hcFN0eWxlOiBtYXBTdHlsZUNoYW5nZVVwZGF0ZXIobWFwU3R5bGUsIHtwYXlsb2FkOiB7Li4ucGF5bG9hZH19KVxuICB9O1xufTtcblxuLyoqXG4gKiBVcGRhdGVyIHRoYXQgY2hhbmdlcyB0aGUgbGF5ZXIgdHlwZSBieSBjYWxsaW5nIGBsYXllclR5cGVDaGFuZ2VVcGRhdGVyYCBvbiB2aXNTdGF0ZS5cbiAqIEluIGFkZGl0aW9uIHRvIHRoYXQsIGlmIHRoZSBuZXcgbGF5ZXIgdHlwZSBoYXMgdGhlIGBkYXJrQmFzZU1hcEVuYWJsZWRgIGNvbmZpZ1xuICogc2V0dGluZywgd2UgYWRqdXN0IGl0IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgY29sb3JNb2RlIG9mIHRoZSBiYXNlIG1hcC5zXG4gKi9cbmV4cG9ydCBjb25zdCBjb21iaW5lZExheWVyVHlwZUNoYW5nZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBLZXBsZXJHbFN0YXRlLFxuICBhY3Rpb246IExheWVyVHlwZUNoYW5nZVVwZGF0ZXJBY3Rpb25cbik6IEtlcGxlckdsU3RhdGUgPT4ge1xuICBsZXQge3Zpc1N0YXRlfSA9IHN0YXRlO1xuICBjb25zdCBvbGRMYXllckluZGV4ID0gdmlzU3RhdGUubGF5ZXJzLmZpbmRJbmRleChsYXllciA9PiBsYXllciA9PT0gYWN0aW9uLm9sZExheWVyKTtcbiAgdmlzU3RhdGUgPSBsYXllclR5cGVDaGFuZ2VVcGRhdGVyKHZpc1N0YXRlLCBhY3Rpb24pO1xuICBjb25zdCBuZXdMYXllciA9IHZpc1N0YXRlLmxheWVyc1tvbGRMYXllckluZGV4XTtcbiAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuZXdMYXllcj8udmlzQ29uZmlnU2V0dGluZ3MsICdkYXJrQmFzZU1hcEVuYWJsZWQnKSkge1xuICAgIGNvbnN0IHttYXBTdHlsZX0gPSBzdGF0ZTtcbiAgICBjb25zdCB7Y29sb3JNb2RlfSA9IG1hcFN0eWxlLm1hcFN0eWxlc1ttYXBTdHlsZS5zdHlsZVR5cGVdO1xuICAgIGNvbnN0IHtkYXJrQmFzZU1hcEVuYWJsZWR9ID0gbmV3TGF5ZXIuY29uZmlnLnZpc0NvbmZpZztcbiAgICBzd2l0Y2ggKGNvbG9yTW9kZSkge1xuICAgICAgY2FzZSBCQVNFX01BUF9DT0xPUl9NT0RFUy5EQVJLOlxuICAgICAgICBpZiAoIWRhcmtCYXNlTWFwRW5hYmxlZCkge1xuICAgICAgICAgIHZpc1N0YXRlID0gdXBkYXRlRGFya0Jhc2VNYXBMYXllcnModHJ1ZSwgbmV3TGF5ZXIuaWQpKHZpc1N0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQkFTRV9NQVBfQ09MT1JfTU9ERVMuTElHSFQ6XG4gICAgICAgIGlmIChkYXJrQmFzZU1hcEVuYWJsZWQpIHtcbiAgICAgICAgICB2aXNTdGF0ZSA9IHVwZGF0ZURhcmtCYXNlTWFwTGF5ZXJzKGZhbHNlLCBuZXdMYXllci5pZCkodmlzU3RhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICB2aXNTdGF0ZVxuICB9O1xufTtcblxuLyoqXG4gKiBNYWtlIG1hcExlZ2VuZCBhY3RpdmUgd2hlbiB0b2dnbGVTcGxpdE1hcCBhY3Rpb24gaXMgY2FsbGVkXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVTcGxpdE1hcFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBLZXBsZXJHbFN0YXRlLFxuICBhY3Rpb246IFRvZ2dsZVNwbGl0TWFwVXBkYXRlckFjdGlvblxuKTogS2VwbGVyR2xTdGF0ZSA9PiB7XG4gIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIHZpc1N0YXRlOiB2aXNTdGF0ZVRvZ2dsZVNwbGl0TWFwVXBkYXRlcihzdGF0ZS52aXNTdGF0ZSwgYWN0aW9uKSxcbiAgICB1aVN0YXRlOiB1aVN0YXRlVG9nZ2xlU3BsaXRNYXBVcGRhdGVyKHN0YXRlLnVpU3RhdGUpLFxuICAgIG1hcFN0YXRlOiBtYXBTdGF0ZVRvZ2dsZVNwbGl0TWFwVXBkYXRlcihzdGF0ZS5tYXBTdGF0ZSlcbiAgfTtcblxuICBjb25zdCBpc1NwbGl0ID0gbmV3U3RhdGUudmlzU3RhdGUuc3BsaXRNYXBzLmxlbmd0aCAhPT0gMDtcbiAgY29uc3QgaXNMZWdlbmRBY3RpdmUgPSBuZXdTdGF0ZS51aVN0YXRlLm1hcENvbnRyb2xzPy5tYXBMZWdlbmQ/LmFjdGl2ZTtcbiAgaWYgKGlzU3BsaXQgJiYgIWlzTGVnZW5kQWN0aXZlKSB7XG4gICAgbmV3U3RhdGUudWlTdGF0ZSA9IHRvZ2dsZU1hcENvbnRyb2xVcGRhdGVyKG5ld1N0YXRlLnVpU3RhdGUsIHtcbiAgICAgIHBheWxvYWQ6IHtwYW5lbElkOiAnbWFwTGVnZW5kJywgaW5kZXg6IGFjdGlvbi5wYXlsb2FkfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufTtcblxuY29uc3QgZGVmYXVsdFJlcGxhY2VEYXRhVG9NYXBPcHRpb25zID0ge1xuICBrZWVwRXhpc3RpbmdDb25maWc6IHRydWUsXG4gIGNlbnRlck1hcDogdHJ1ZSxcbiAgYXV0b0NyZWF0ZUxheWVyczogZmFsc2Vcbn07XG5cbi8qKlxuICogVXBkYXRlciByZXBsYWNlIGEgZGF0YXNldCBpbiBzdGF0ZVxuICovXG5leHBvcnQgY29uc3QgcmVwbGFjZURhdGFJbk1hcFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBLZXBsZXJHbFN0YXRlLFxuICB7cGF5bG9hZH06IHtwYXlsb2FkOiBSZXBsYWNlRGF0YUluTWFwUGF5bG9hZH1cbik6IEtlcGxlckdsU3RhdGUgPT4ge1xuICBjb25zdCB7ZGF0YXNldFRvUmVwbGFjZUlkLCBkYXRhc2V0VG9Vc2UsIG9wdGlvbnMgPSB7fX0gPSBwYXlsb2FkO1xuICBjb25zdCBhZGREYXRhVG9NYXBPcHRpb25zID0gey4uLmRlZmF1bHRSZXBsYWNlRGF0YVRvTWFwT3B0aW9ucywgLi4ub3B0aW9uc307XG5cbiAgLy8gY2hlY2sgaWYgZGF0YXNldCBpcyB0aGVyZVxuICBpZiAoIXN0YXRlLnZpc1N0YXRlLmRhdGFzZXRzW2RhdGFzZXRUb1JlcGxhY2VJZF0pIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgLy8gZGF0YXNldFRvVXNlIGlzIFByb3RvRGF0YXNldFxuICBjb25zdCBkYXRhSWRUb1VzZSA9IGRhdGFzZXRUb1VzZS5pbmZvLmlkO1xuICBpZiAoIWRhdGFJZFRvVXNlKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIC8vIHJlbW92ZSBkYXRhc2V0IGFuZCBwdXQgZGVwZW5kZW5jaWVzIGluIHRvQmVNZXJnZWRcbiAgY29uc3QgcHJlcGFyZWRTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICB2aXNTdGF0ZTogcHJlcGFyZVN0YXRlRm9yRGF0YXNldFJlcGxhY2Uoc3RhdGUudmlzU3RhdGUsIGRhdGFzZXRUb1JlcGxhY2VJZCwgZGF0YUlkVG9Vc2UpXG4gIH07XG5cbiAgY29uc3QgbmV4dFN0YXRlID0gYWRkRGF0YVRvTWFwVXBkYXRlcihcbiAgICBwcmVwYXJlZFN0YXRlLFxuICAgIHBheWxvYWRfKHtcbiAgICAgIGRhdGFzZXRzOiBkYXRhc2V0VG9Vc2UsXG4gICAgICAvLyBzaG91bGQgem9vbSB0byBuZXcgZGF0YXNldFxuICAgICAgb3B0aW9uczogYWRkRGF0YVRvTWFwT3B0aW9uc1xuICAgIH0pXG4gICk7XG5cbiAgcmV0dXJuIG5leHRTdGF0ZTtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBR0EsSUFBQUEsZ0JBQUEsR0FBQUMsT0FBQTtBQU9BLElBQUFDLGlCQUFBLEdBQUFELE9BQUE7QUFPQSxJQUFBRSxpQkFBQSxHQUFBRixPQUFBO0FBSUEsSUFBQUcsaUJBQUEsR0FBQUgsT0FBQTtBQUlBLElBQUFJLFdBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLGdCQUFBLEdBQUFMLE9BQUE7QUFhQSxJQUFBTSxNQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxVQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxVQUFBLEdBQUFSLE9BQUE7QUFBNkUsU0FBQVMsUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFBQyxNQUFBLFdBQUFOLENBQUEsV0FBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBUixDQUFBLEVBQUFDLENBQUEsRUFBQVEsVUFBQSxPQUFBUCxDQUFBLENBQUFRLElBQUEsQ0FBQUMsS0FBQSxDQUFBVCxDQUFBLEVBQUFJLENBQUEsWUFBQUosQ0FBQTtBQUFBLFNBQUFVLGNBQUFaLENBQUEsYUFBQUMsQ0FBQSxNQUFBQSxDQUFBLEdBQUFZLFNBQUEsQ0FBQUMsTUFBQSxFQUFBYixDQUFBLFVBQUFDLENBQUEsV0FBQVcsU0FBQSxDQUFBWixDQUFBLElBQUFZLFNBQUEsQ0FBQVosQ0FBQSxRQUFBQSxDQUFBLE9BQUFGLE9BQUEsQ0FBQUksTUFBQSxDQUFBRCxDQUFBLE9BQUFhLE9BQUEsV0FBQWQsQ0FBQSxRQUFBZSxnQkFBQSxhQUFBaEIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsQ0FBQUQsQ0FBQSxTQUFBRSxNQUFBLENBQUFjLHlCQUFBLEdBQUFkLE1BQUEsQ0FBQWUsZ0JBQUEsQ0FBQWxCLENBQUEsRUFBQUcsTUFBQSxDQUFBYyx5QkFBQSxDQUFBZixDQUFBLEtBQUFILE9BQUEsQ0FBQUksTUFBQSxDQUFBRCxDQUFBLEdBQUFhLE9BQUEsV0FBQWQsQ0FBQSxJQUFBRSxNQUFBLENBQUFnQixjQUFBLENBQUFuQixDQUFBLEVBQUFDLENBQUEsRUFBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBTixDQUFBLEVBQUFELENBQUEsaUJBQUFELENBQUEsSUF6QzdFO0FBQ0E7QUFrREE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBTW9CLGdCQUFnQixHQUFHLElBQUk7QUFDN0I7O0FBRU8sSUFBTUMsYUFBYSxHQUFBQyxPQUFBLENBQUFELGFBQUEsR0FBRyxTQUFoQkEsYUFBYUEsQ0FBR0UsTUFBTTtFQUFBLE9BQ2pDLElBQUFDLG9CQUFhLEVBQUNELE1BQU0sQ0FBQyxJQUFJLElBQUFDLG9CQUFhLEVBQUNELE1BQU0sQ0FBQ0EsTUFBTSxDQUFDLElBQUlBLE1BQU0sQ0FBQ0UsT0FBTztBQUFBO0FBRWxFLElBQU1DLDBCQUEwQixHQUFBSixPQUFBLENBQUFJLDBCQUFBLEdBQUc7RUFDeENDLFNBQVMsRUFBRSxJQUFJO0VBQ2ZDLGtCQUFrQixFQUFFLEtBQUs7RUFDekJDLGdCQUFnQixFQUFFLElBQUk7RUFDdEJDLGtCQUFrQixFQUFFO0FBQ3RCLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxJQUFNQyxtQkFBbUIsR0FBQVQsT0FBQSxDQUFBUyxtQkFBQSxHQUFHLFNBQXRCQSxtQkFBbUJBLENBQzlCQyxLQUFvQixFQUFBQyxJQUFBLEVBRUY7RUFBQSxJQUFBQyxVQUFBLEVBQUFDLFdBQUEsRUFBQUMsV0FBQTtFQUFBLElBRGpCQyxPQUFPLEdBQUFKLElBQUEsQ0FBUEksT0FBTztFQUVSLElBQU9DLFFBQVEsR0FBa0JELE9BQU8sQ0FBakNDLFFBQVE7SUFBRWYsTUFBTSxHQUFVYyxPQUFPLENBQXZCZCxNQUFNO0lBQUVnQixJQUFJLEdBQUlGLE9BQU8sQ0FBZkUsSUFBSTtFQUU3QixJQUFNQyxPQUFPLEdBQUE1QixhQUFBLENBQUFBLGFBQUEsS0FDUmMsMEJBQTBCLEdBQzFCVyxPQUFPLENBQUNHLE9BQU8sQ0FDbkI7O0VBRUQ7RUFDQSxJQUFNQyxvQkFBb0IsR0FDeEJDLEtBQUssQ0FBQ0MsT0FBTyxDQUFDTCxRQUFRLENBQUMsSUFDdkIsRUFBQUosVUFBQSxHQUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLGNBQUFKLFVBQUEsdUJBQVhBLFVBQUEsQ0FBYUssSUFBSSxDQUFDSyxNQUFNLE1BQUssT0FBTyxNQUFBVCxXQUFBLEdBQ3BDRyxRQUFRLENBQUMsQ0FBQyxDQUFDLGNBQUFILFdBQUEsdUJBQVhBLFdBQUEsQ0FBYUksSUFBSSxDQUFDTSxFQUFFLEtBQ3BCLEVBQUFULFdBQUEsR0FBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxjQUFBRixXQUFBLHVCQUFYQSxXQUFBLENBQWFHLElBQUksQ0FBQ00sRUFBRSxLQUFJYixLQUFLLENBQUNjLFFBQVEsQ0FBQ1IsUUFBUTtFQUNqRCxJQUFJRyxvQkFBb0IsRUFBRTtJQUN4QixPQUFPLElBQUFNLHlCQUFRLEVBQWdCLENBQzdCLElBQUFDLHNCQUFLLEVBQUMsVUFBVSxDQUFDLENBQ2YsSUFBQUMsdUJBQU0sRUFBZ0JDLHNDQUE0QixFQUFFO01BQ2xEWixRQUFRLEVBQVJBLFFBQVE7TUFDUkUsT0FBTyxFQUFQQSxPQUFPO01BQ1BqQixNQUFNLEVBQU5BO0lBQ0YsQ0FBQyxDQUNILENBQUMsQ0FDRixDQUFDLENBQUNTLEtBQUssQ0FBQztFQUNYOztFQUVBO0VBQ0EsSUFBSW1CLFlBQTBCLEdBQUc1QixNQUFNO0VBRXZDLElBQUlGLGFBQWEsQ0FBQ0UsTUFBTSxDQUFDLEVBQUU7SUFDekI7SUFDQTtJQUNBNEIsWUFBWSxHQUFHbkIsS0FBSyxDQUFDYyxRQUFRLENBQUNNLE1BQU0sQ0FBQ0MsZ0JBQWdCLENBQUM5QixNQUFNLENBQUM7RUFDL0Q7RUFDQSxJQUFNK0IsU0FBUyxHQUFHdEIsS0FBSyxDQUFDYyxRQUFRLENBQUNTLE1BQU07RUFDdkMsSUFBTUMsc0JBQXNCLEdBQUcsU0FBekJBLHNCQUFzQkEsQ0FBSUQsTUFBZTtJQUFBLE9BQzdDQSxNQUFNLENBQUNoRCxNQUFNLENBQUMsVUFBQWtELEVBQUU7TUFBQSxPQUFJLENBQUNILFNBQVMsQ0FBQ0ksSUFBSSxDQUFDLFVBQUFDLEVBQUU7UUFBQSxPQUFJQSxFQUFFLEtBQUtGLEVBQUU7TUFBQSxFQUFDO0lBQUEsRUFBQztFQUFBOztFQUV2RDtFQUNBLElBQU1HLHVCQUF1QixHQUFHLFNBQTFCQSx1QkFBdUJBLENBQUlMLE1BQWUsRUFBSztJQUNuRCxJQUFNTSxNQUFNLEdBQUdyQixPQUFPLENBQUNiLFNBQVMsSUFBSSxJQUFBbUMsd0JBQWEsRUFBQ1AsTUFBTSxDQUFDO0lBQ3pELE9BQU9NLE1BQU0sR0FBR0EsTUFBTSxHQUFHRSxTQUFTO0VBQ3BDLENBQUM7RUFFRCxPQUFPLElBQUFoQix5QkFBUSxFQUFnQixDQUM3QixJQUFBQyxzQkFBSyxFQUFDLFVBQVUsQ0FBQztFQUNmO0VBQ0EsSUFBQUMsdUJBQU0sRUFBZ0JDLHNDQUE0QixFQUFFO0lBQ2xEWixRQUFRLEVBQVJBLFFBQVE7SUFDUkUsT0FBTyxFQUFQQSxPQUFPO0lBQ1BqQixNQUFNLEVBQUU0QjtFQUNWLENBQUMsQ0FDSCxDQUFDLEVBRUQsSUFBQWEsb0JBQUcsRUFBQ0MsT0FBTyxDQUFDMUIsSUFBSSxDQUFDLEVBQUUsSUFBQVMsc0JBQUssRUFBQyxVQUFVLENBQUMsQ0FBQyxJQUFBQyx1QkFBTSxFQUFnQmlCLG1DQUFpQixFQUFFO0lBQUMzQixJQUFJLEVBQUpBO0VBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUN2RjtFQUNBO0VBQ0EsSUFBQTRCLHNCQUFLLEVBQUMsVUFBQUMsS0FBQTtJQUFBLElBQUV0QixRQUFRLEdBQUFzQixLQUFBLENBQVJ0QixRQUFRO0lBQUEsT0FDZCxJQUFBRSxzQkFBSyxFQUFDLFVBQVUsQ0FBQyxDQUNmLElBQUFDLHVCQUFNLEVBQ0pvQix5Q0FBcUIsRUFDckIsSUFBQUMseUJBQVEsRUFBQztNQUNQL0MsTUFBTSxFQUFFNEIsWUFBWTtNQUNwQlgsT0FBTyxFQUFQQSxPQUFPO01BQ1BxQixNQUFNLEVBQUVELHVCQUF1QixDQUFDSixzQkFBc0IsQ0FBQ1YsUUFBUSxDQUFDUyxNQUFNLENBQUM7SUFDekUsQ0FBQyxDQUNILENBQ0YsQ0FBQztFQUFBLENBQ0gsQ0FBQyxFQUNELElBQUFQLHNCQUFLLEVBQUMsVUFBVSxDQUFDLENBQUMsSUFBQUMsdUJBQU0sRUFBQ3NCLHlDQUFxQixFQUFFLElBQUFELHlCQUFRLEVBQUM7SUFBQy9DLE1BQU0sRUFBRTRCLFlBQVk7SUFBRVgsT0FBTyxFQUFQQTtFQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDM0YsSUFBQVEsc0JBQUssRUFBQyxTQUFTLENBQUMsQ0FDZCxJQUFBQyx1QkFBTSxFQUFDdUIsd0NBQThCLEVBQUUsSUFBQUYseUJBQVEsRUFBQztJQUFDL0MsTUFBTSxFQUFFNEIsWUFBWTtJQUFFWCxPQUFPLEVBQVBBO0VBQU8sQ0FBQyxDQUFDLENBQ2xGLENBQUMsRUFDRCxJQUFBUSxzQkFBSyxFQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUFDLHVCQUFNLEVBQUN3Qix3Q0FBOEIsRUFBRSxJQUFBSCx5QkFBUSxFQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFFeEUsSUFBQXRCLHNCQUFLLEVBQUMsU0FBUyxDQUFDLENBQUMsSUFBQUMsdUJBQU0sRUFBQ3lCLG1DQUFrQixFQUFFLElBQUFKLHlCQUFRLEVBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUM1RCxJQUFBdEIsc0JBQUssRUFBQyxTQUFTLENBQUMsQ0FDZCxJQUFBMkIsdUJBQU0sRUFDSnhFLE1BQU0sQ0FBQ3lFLFNBQVMsQ0FBQ0MsY0FBYyxDQUFDQyxJQUFJLENBQUN0QyxPQUFPLEVBQUUsVUFBVSxDQUFDLEdBQ3JEO0lBQUN1QyxRQUFRLEVBQUV2QyxPQUFPLENBQUN1QztFQUFRLENBQUMsR0FDNUIsQ0FBQyxDQUNQLENBQ0YsQ0FBQyxDQUNGLENBQUMsQ0FBQy9DLEtBQUssQ0FBQztBQUNYLENBQUM7QUFFTSxJQUFNZ0QsdUJBQXVCLEdBQUExRCxPQUFBLENBQUEwRCx1QkFBQSxHQUFHLFNBQTFCQSx1QkFBdUJBLENBQ2xDaEQsS0FBb0IsRUFDcEJpRCxNQUFxQyxFQUNuQjtFQUNsQjtFQUNBLElBQU1DLFFBQVEsR0FBRyxJQUFBQyw4QkFBa0IsRUFBQ0YsTUFBTSxDQUFDRyxNQUFNLENBQUM7RUFDbEQsSUFBTUMsU0FBUyxHQUFHLElBQUF0Qyx5QkFBUSxFQUFDLENBQ3pCLElBQUFDLHNCQUFLLEVBQUMsVUFBVSxDQUFDLENBQ2YsSUFBQTJCLHVCQUFNLEVBQUM7SUFDTFcsV0FBVyxFQUFFLEtBQUs7SUFDbEJDLG1CQUFtQixFQUFFLENBQUM7RUFDeEIsQ0FBQyxDQUNILENBQUMsQ0FDRixDQUFDLENBQUN2RCxLQUFLLENBQUM7RUFDVDtFQUNBLElBQU13RCxhQUFhLEdBQUcsSUFBQXpDLHlCQUFRLEVBQUNtQyxRQUFRLENBQUNPLEdBQUcsQ0FBQyxVQUFBQyxDQUFDO0lBQUEsT0FBSSxJQUFBekMsdUJBQU0sRUFBQ2xCLG1CQUFtQixFQUFFLElBQUF1Qyx5QkFBUSxFQUFDb0IsQ0FBQyxDQUFDLENBQUM7RUFBQSxFQUFDLENBQUMsQ0FDekZMLFNBQ0YsQ0FBQztFQUNELE9BQU9HLGFBQWE7QUFDdEIsQ0FBQztBQUVNLElBQU1HLG9CQUFvQixHQUFBckUsT0FBQSxDQUFBcUUsb0JBQUEsR0FBRzVELG1CQUFtQjs7QUFFdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFNNkQscUJBQXFCLEdBQUcsU0FBeEJBLHFCQUFxQkEsQ0FBR0MsZUFBZTtFQUFBLE9BQUksVUFBQS9DLFFBQVEsRUFBSTtJQUMzRCxJQUFJQSxRQUFRLENBQUMrQyxlQUFlLEtBQUtDLDRCQUFpQixDQUFDQyxNQUFNLENBQUNDLEtBQUssRUFBRTtNQUMvRCxPQUFBcEYsYUFBQSxDQUFBQSxhQUFBLEtBQ0trQyxRQUFRO1FBQ1grQyxlQUFlLEVBQWZBO01BQWU7SUFFbkI7SUFDQSxPQUFPL0MsUUFBUTtFQUNqQixDQUFDO0FBQUE7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFNbUQsdUJBQXVCLEdBQzNCLFNBRElBLHVCQUF1QkEsQ0FDMUJDLGtCQUEyQjtFQUFBLElBQUVDLE9BQXNCLEdBQUF0RixTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBa0QsU0FBQSxHQUFBbEQsU0FBQSxNQUFHLElBQUk7RUFBQSxPQUMzRCxVQUFBaUMsUUFBUTtJQUFBLE9BQUFsQyxhQUFBLENBQUFBLGFBQUEsS0FDSGtDLFFBQVE7TUFDWFMsTUFBTSxFQUFFVCxRQUFRLENBQUNTLE1BQU0sQ0FBQ2tDLEdBQUcsQ0FBQyxVQUFBVyxLQUFLLEVBQUk7UUFDbkMsSUFBSSxDQUFDRCxPQUFPLElBQUlDLEtBQUssQ0FBQ3ZELEVBQUUsS0FBS3NELE9BQU8sRUFBRTtVQUNwQyxJQUFJaEcsTUFBTSxDQUFDeUUsU0FBUyxDQUFDQyxjQUFjLENBQUNDLElBQUksQ0FBQ3NCLEtBQUssQ0FBQ0MsaUJBQWlCLEVBQUUsb0JBQW9CLENBQUMsRUFBRTtZQUN2RixJQUFPQyxTQUFTLEdBQUlGLEtBQUssQ0FBQzdFLE1BQU0sQ0FBekIrRSxTQUFTO1lBQ2hCLE9BQU9GLEtBQUssQ0FBQ0csaUJBQWlCLENBQUM7Y0FDN0JELFNBQVMsRUFBQTFGLGFBQUEsQ0FBQUEsYUFBQSxLQUFNMEYsU0FBUztnQkFBRUosa0JBQWtCLEVBQWxCQTtjQUFrQjtZQUM5QyxDQUFDLENBQUM7VUFDSjtRQUNGO1FBQ0EsT0FBT0UsS0FBSztNQUNkLENBQUM7SUFBQztFQUFBLENBQ0Y7QUFBQTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBTUksNkJBQTZCLEdBQUFsRixPQUFBLENBQUFrRiw2QkFBQSxHQUFHLFNBQWhDQSw2QkFBNkJBLENBQ3hDeEUsS0FBb0IsRUFDcEJpRCxNQUFtQyxFQUNqQjtFQUNsQixJQUFPNUMsT0FBTyxHQUFJNEMsTUFBTSxDQUFqQjVDLE9BQU87RUFDZCxJQUFPb0UsUUFBUSxHQUFJekUsS0FBSyxDQUFqQnlFLFFBQVE7RUFDZixJQUFNQyxZQUFZLEdBQUcsU0FBZkEsWUFBWUEsQ0FBR0MsR0FBRztJQUFBLElBQUFDLHFCQUFBO0lBQUEsUUFBQUEscUJBQUEsR0FBSUgsUUFBUSxDQUFDSSxTQUFTLENBQUNGLEdBQUcsQ0FBQyxjQUFBQyxxQkFBQSx1QkFBdkJBLHFCQUFBLENBQXlCRSxTQUFTO0VBQUE7RUFDOUQsSUFBTUMsYUFBYSxHQUFHTCxZQUFZLENBQUNELFFBQVEsQ0FBQ08sU0FBUyxDQUFDO0VBQ3RELElBQU1DLGFBQWEsR0FBR1AsWUFBWSxDQUFDckUsT0FBTyxDQUFDMkUsU0FBUyxDQUFDO0VBQ3JELElBQUtsRSxRQUFRLEdBQUlkLEtBQUssQ0FBakJjLFFBQVE7RUFDYixJQUFJbUUsYUFBYSxLQUFLRixhQUFhLEVBQUU7SUFDbkMsUUFBUUUsYUFBYTtNQUNuQixLQUFLQywrQkFBb0IsQ0FBQ0MsSUFBSTtRQUM1QnJFLFFBQVEsR0FBRyxJQUFBQyx5QkFBUSxFQUFDLENBQ2xCNkMscUJBQXFCLENBQUNFLDRCQUFpQixDQUFDc0IsTUFBTSxDQUFDcEIsS0FBSyxDQUFDLEVBQ3JEQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FDOUIsQ0FBQyxDQUFDbkQsUUFBUSxDQUFDO1FBQ1o7TUFDRixLQUFLb0UsK0JBQW9CLENBQUNHLEtBQUs7UUFDN0J2RSxRQUFRLEdBQUcsSUFBQUMseUJBQVEsRUFBQyxDQUNsQjZDLHFCQUFxQixDQUFDRSw0QkFBaUIsQ0FBQ3dCLE1BQU0sQ0FBQ3RCLEtBQUssQ0FBQyxFQUNyREMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQy9CLENBQUMsQ0FBQ25ELFFBQVEsQ0FBQztRQUNaO01BQ0Y7TUFDQTtJQUNGO0VBQ0Y7RUFDQSxPQUFBbEMsYUFBQSxDQUFBQSxhQUFBLEtBQ0tvQixLQUFLO0lBQ1JjLFFBQVEsRUFBUkEsUUFBUTtJQUNSMkQsUUFBUSxFQUFFLElBQUFjLHVDQUFxQixFQUFDZCxRQUFRLEVBQUU7TUFBQ3BFLE9BQU8sRUFBQXpCLGFBQUEsS0FBTXlCLE9BQU87SUFBQyxDQUFDO0VBQUM7QUFFdEUsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBTW1GLDhCQUE4QixHQUFBbEcsT0FBQSxDQUFBa0csOEJBQUEsR0FBRyxTQUFqQ0EsOEJBQThCQSxDQUN6Q3hGLEtBQW9CLEVBQ3BCaUQsTUFBb0MsRUFDbEI7RUFDbEIsSUFBS25DLFFBQVEsR0FBSWQsS0FBSyxDQUFqQmMsUUFBUTtFQUNiLElBQU0yRSxhQUFhLEdBQUczRSxRQUFRLENBQUNTLE1BQU0sQ0FBQ21FLFNBQVMsQ0FBQyxVQUFBdEIsS0FBSztJQUFBLE9BQUlBLEtBQUssS0FBS25CLE1BQU0sQ0FBQzBDLFFBQVE7RUFBQSxFQUFDO0VBQ25GN0UsUUFBUSxHQUFHLElBQUE4RSx3Q0FBc0IsRUFBQzlFLFFBQVEsRUFBRW1DLE1BQU0sQ0FBQztFQUNuRCxJQUFNNEMsUUFBUSxHQUFHL0UsUUFBUSxDQUFDUyxNQUFNLENBQUNrRSxhQUFhLENBQUM7RUFDL0MsSUFBSXRILE1BQU0sQ0FBQ3lFLFNBQVMsQ0FBQ0MsY0FBYyxDQUFDQyxJQUFJLENBQUMrQyxRQUFRLGFBQVJBLFFBQVEsdUJBQVJBLFFBQVEsQ0FBRXhCLGlCQUFpQixFQUFFLG9CQUFvQixDQUFDLEVBQUU7SUFDM0YsSUFBT0ksUUFBUSxHQUFJekUsS0FBSyxDQUFqQnlFLFFBQVE7SUFDZixJQUFPSyxTQUFTLEdBQUlMLFFBQVEsQ0FBQ0ksU0FBUyxDQUFDSixRQUFRLENBQUNPLFNBQVMsQ0FBQyxDQUFuREYsU0FBUztJQUNoQixJQUFPWixrQkFBa0IsR0FBSTJCLFFBQVEsQ0FBQ3RHLE1BQU0sQ0FBQytFLFNBQVMsQ0FBL0NKLGtCQUFrQjtJQUN6QixRQUFRWSxTQUFTO01BQ2YsS0FBS0ksK0JBQW9CLENBQUNDLElBQUk7UUFDNUIsSUFBSSxDQUFDakIsa0JBQWtCLEVBQUU7VUFDdkJwRCxRQUFRLEdBQUdtRCx1QkFBdUIsQ0FBQyxJQUFJLEVBQUU0QixRQUFRLENBQUNoRixFQUFFLENBQUMsQ0FBQ0MsUUFBUSxDQUFDO1FBQ2pFO1FBQ0E7TUFDRixLQUFLb0UsK0JBQW9CLENBQUNHLEtBQUs7UUFDN0IsSUFBSW5CLGtCQUFrQixFQUFFO1VBQ3RCcEQsUUFBUSxHQUFHbUQsdUJBQXVCLENBQUMsS0FBSyxFQUFFNEIsUUFBUSxDQUFDaEYsRUFBRSxDQUFDLENBQUNDLFFBQVEsQ0FBQztRQUNsRTtRQUNBO01BQ0Y7TUFDQTtJQUNGO0VBQ0Y7RUFDQSxPQUFBbEMsYUFBQSxDQUFBQSxhQUFBLEtBQ0tvQixLQUFLO0lBQ1JjLFFBQVEsRUFBUkE7RUFBUTtBQUVaLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ08sSUFBTWdGLHFCQUFxQixHQUFBeEcsT0FBQSxDQUFBd0cscUJBQUEsR0FBRyxTQUF4QkEscUJBQXFCQSxDQUNoQzlGLEtBQW9CLEVBQ3BCaUQsTUFBbUMsRUFDakI7RUFBQSxJQUFBOEMscUJBQUE7RUFDbEIsSUFBTUMsUUFBUSxHQUFBcEgsYUFBQSxDQUFBQSxhQUFBLEtBQ1RvQixLQUFLO0lBQ1JjLFFBQVEsRUFBRSxJQUFBbUYsdUNBQTZCLEVBQUNqRyxLQUFLLENBQUNjLFFBQVEsRUFBRW1DLE1BQU0sQ0FBQztJQUMvRGlELE9BQU8sRUFBRSxJQUFBQyxzQ0FBNEIsRUFBQ25HLEtBQUssQ0FBQ2tHLE9BQU8sQ0FBQztJQUNwREUsUUFBUSxFQUFFLElBQUFDLHVDQUE2QixFQUFDckcsS0FBSyxDQUFDb0csUUFBUTtFQUFDLEVBQ3hEO0VBRUQsSUFBTUUsT0FBTyxHQUFHTixRQUFRLENBQUNsRixRQUFRLENBQUN5RixTQUFTLENBQUN6SCxNQUFNLEtBQUssQ0FBQztFQUN4RCxJQUFNMEgsY0FBYyxJQUFBVCxxQkFBQSxHQUFHQyxRQUFRLENBQUNFLE9BQU8sQ0FBQ08sV0FBVyxjQUFBVixxQkFBQSxnQkFBQUEscUJBQUEsR0FBNUJBLHFCQUFBLENBQThCVyxTQUFTLGNBQUFYLHFCQUFBLHVCQUF2Q0EscUJBQUEsQ0FBeUNZLE1BQU07RUFDdEUsSUFBSUwsT0FBTyxJQUFJLENBQUNFLGNBQWMsRUFBRTtJQUM5QlIsUUFBUSxDQUFDRSxPQUFPLEdBQUcsSUFBQVUsd0NBQXVCLEVBQUNaLFFBQVEsQ0FBQ0UsT0FBTyxFQUFFO01BQzNEN0YsT0FBTyxFQUFFO1FBQUN3RyxPQUFPLEVBQUUsV0FBVztRQUFFQyxLQUFLLEVBQUU3RCxNQUFNLENBQUM1QztNQUFPO0lBQ3ZELENBQUMsQ0FBQztFQUNKO0VBRUEsT0FBTzJGLFFBQVE7QUFDakIsQ0FBQztBQUVELElBQU1lLDhCQUE4QixHQUFHO0VBQ3JDbkgsa0JBQWtCLEVBQUUsSUFBSTtFQUN4QkQsU0FBUyxFQUFFLElBQUk7RUFDZkUsZ0JBQWdCLEVBQUU7QUFDcEIsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDTyxJQUFNbUgsdUJBQXVCLEdBQUExSCxPQUFBLENBQUEwSCx1QkFBQSxHQUFHLFNBQTFCQSx1QkFBdUJBLENBQ2xDaEgsS0FBb0IsRUFBQWlILEtBQUEsRUFFRjtFQUFBLElBRGpCNUcsT0FBTyxHQUFBNEcsS0FBQSxDQUFQNUcsT0FBTztFQUVSLElBQU82RyxrQkFBa0IsR0FBZ0M3RyxPQUFPLENBQXpENkcsa0JBQWtCO0lBQUVDLFlBQVksR0FBa0I5RyxPQUFPLENBQXJDOEcsWUFBWTtJQUFBQyxnQkFBQSxHQUFrQi9HLE9BQU8sQ0FBdkJHLE9BQU87SUFBUEEsT0FBTyxHQUFBNEcsZ0JBQUEsY0FBRyxDQUFDLENBQUMsR0FBQUEsZ0JBQUE7RUFDckQsSUFBTUMsbUJBQW1CLEdBQUF6SSxhQUFBLENBQUFBLGFBQUEsS0FBT21JLDhCQUE4QixHQUFLdkcsT0FBTyxDQUFDOztFQUUzRTtFQUNBLElBQUksQ0FBQ1IsS0FBSyxDQUFDYyxRQUFRLENBQUNSLFFBQVEsQ0FBQzRHLGtCQUFrQixDQUFDLEVBQUU7SUFDaEQsT0FBT2xILEtBQUs7RUFDZDtFQUNBO0VBQ0EsSUFBTXNILFdBQVcsR0FBR0gsWUFBWSxDQUFDNUcsSUFBSSxDQUFDTSxFQUFFO0VBQ3hDLElBQUksQ0FBQ3lHLFdBQVcsRUFBRTtJQUNoQixPQUFPdEgsS0FBSztFQUNkO0VBQ0E7RUFDQSxJQUFNdUgsYUFBYSxHQUFBM0ksYUFBQSxDQUFBQSxhQUFBLEtBQ2RvQixLQUFLO0lBQ1JjLFFBQVEsRUFBRSxJQUFBMEcsK0NBQTZCLEVBQUN4SCxLQUFLLENBQUNjLFFBQVEsRUFBRW9HLGtCQUFrQixFQUFFSSxXQUFXO0VBQUMsRUFDekY7RUFFRCxJQUFNakUsU0FBUyxHQUFHdEQsbUJBQW1CLENBQ25Dd0gsYUFBYSxFQUNiLElBQUFqRix5QkFBUSxFQUFDO0lBQ1BoQyxRQUFRLEVBQUU2RyxZQUFZO0lBQ3RCO0lBQ0EzRyxPQUFPLEVBQUU2RztFQUNYLENBQUMsQ0FDSCxDQUFDO0VBRUQsT0FBT2hFLFNBQVM7QUFDbEIsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==
|