@kepler.gl/reducers 3.3.0-alpha.0 → 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.
Files changed (84) hide show
  1. package/dist/cjs/combined-updaters.js +491 -0
  2. package/dist/cjs/composer-helpers.js +101 -0
  3. package/dist/cjs/composers.js +22 -0
  4. package/dist/cjs/core.js +105 -0
  5. package/dist/cjs/data-utils.js +53 -0
  6. package/dist/cjs/export-utils.js +91 -0
  7. package/dist/{index.js → cjs/index.js} +2 -3
  8. package/dist/cjs/interaction-utils.js +115 -0
  9. package/dist/cjs/layer-utils.js +635 -0
  10. package/dist/cjs/map-state-updaters.js +658 -0
  11. package/dist/cjs/map-state.js +35 -0
  12. package/dist/cjs/map-style-updaters.js +660 -0
  13. package/dist/cjs/map-style.js +33 -0
  14. package/dist/cjs/merger-handler.js +105 -0
  15. package/dist/cjs/middleware.js +27 -0
  16. package/dist/cjs/provider-state-updaters.js +465 -0
  17. package/dist/cjs/provider-state.js +34 -0
  18. package/dist/cjs/root.js +207 -0
  19. package/dist/cjs/ui-state-updaters.js +922 -0
  20. package/dist/cjs/ui-state.js +36 -0
  21. package/dist/cjs/vis-state-merger.js +1193 -0
  22. package/dist/cjs/vis-state-selectors.js +30 -0
  23. package/dist/cjs/vis-state-updaters.js +5100 -0
  24. package/dist/cjs/vis-state.js +35 -0
  25. package/dist/combined-updaters.d.ts +19 -2
  26. package/dist/composers.d.ts +2 -0
  27. package/dist/esm/combined-updaters.js +484 -0
  28. package/dist/esm/composer-helpers.js +85 -0
  29. package/dist/esm/composers.js +14 -0
  30. package/dist/esm/core.js +101 -0
  31. package/dist/esm/data-utils.js +47 -0
  32. package/dist/esm/export-utils.js +86 -0
  33. package/dist/esm/index.js +62 -0
  34. package/dist/esm/interaction-utils.js +106 -0
  35. package/dist/esm/layer-utils.js +602 -0
  36. package/dist/esm/map-state-updaters.js +650 -0
  37. package/dist/esm/map-state.js +29 -0
  38. package/dist/esm/map-style-updaters.js +652 -0
  39. package/dist/esm/map-style.js +27 -0
  40. package/dist/esm/merger-handler.js +96 -0
  41. package/dist/esm/middleware.js +19 -0
  42. package/dist/esm/provider-state-updaters.js +458 -0
  43. package/dist/esm/provider-state.js +28 -0
  44. package/dist/esm/root.js +201 -0
  45. package/dist/esm/ui-state-updaters.js +917 -0
  46. package/dist/esm/ui-state.js +30 -0
  47. package/dist/esm/vis-state-merger.js +1161 -0
  48. package/dist/esm/vis-state-selectors.js +24 -0
  49. package/dist/esm/vis-state-updaters.js +5006 -0
  50. package/dist/esm/vis-state.js +29 -0
  51. package/dist/interaction-utils.d.ts +1 -1
  52. package/dist/layer-utils.d.ts +30 -5
  53. package/dist/map-state-updaters.d.ts +27 -20
  54. package/dist/map-state.d.ts +2 -74
  55. package/dist/map-style-updaters.d.ts +1 -3
  56. package/dist/ui-state-updaters.d.ts +53 -3
  57. package/dist/vis-state-merger.d.ts +11 -0
  58. package/dist/vis-state-selectors.d.ts +42 -6
  59. package/dist/vis-state-updaters.d.ts +163 -2
  60. package/dist/vis-state.d.ts +24 -4
  61. package/package.json +43 -35
  62. package/dist/combined-updaters.js +0 -366
  63. package/dist/composer-helpers.js +0 -101
  64. package/dist/composers.js +0 -23
  65. package/dist/core.js +0 -105
  66. package/dist/data-utils.js +0 -53
  67. package/dist/export-utils.js +0 -91
  68. package/dist/interaction-utils.js +0 -105
  69. package/dist/layer-utils.js +0 -335
  70. package/dist/map-state-updaters.js +0 -436
  71. package/dist/map-state.js +0 -35
  72. package/dist/map-style-updaters.js +0 -661
  73. package/dist/map-style.js +0 -34
  74. package/dist/merger-handler.js +0 -105
  75. package/dist/middleware.js +0 -27
  76. package/dist/provider-state-updaters.js +0 -466
  77. package/dist/provider-state.js +0 -35
  78. package/dist/root.js +0 -207
  79. package/dist/ui-state-updaters.js +0 -803
  80. package/dist/ui-state.js +0 -37
  81. package/dist/vis-state-merger.js +0 -990
  82. package/dist/vis-state-selectors.js +0 -30
  83. package/dist/vis-state-updaters.js +0 -3611
  84. package/dist/vis-state.js +0 -36
@@ -0,0 +1,652 @@
1
+ import _typeof from "@babel/runtime/helpers/esm/typeof";
2
+ import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
3
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
4
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
5
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
6
+ 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; }
7
+ 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) { _defineProperty(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; }
8
+ // SPDX-License-Identifier: MIT
9
+ // Copyright contributors to the kepler.gl project
10
+
11
+ import Task, { withTask } from 'react-palm/tasks';
12
+ import cloneDeep from 'es-toolkit/compat/cloneDeep';
13
+ import Console from 'global/console';
14
+
15
+ // Utils
16
+ import { getDefaultLayerGroupVisibility, getStyleDownloadUrl, mergeLayerGroupVisibility, editTopMapStyle, editBottomMapStyle, getStyleImageIcon, isPlainObject, hexToRgb, colorMaybeToRGB, getApplicationConfig } from '@kepler.gl/utils';
17
+ import { generateHashId } from '@kepler.gl/common-utils';
18
+ import { DEFAULT_MAP_STYLES, DEFAULT_LAYER_GROUPS, DEFAULT_MAPBOX_API_URL, NO_MAP_ID, DEFAULT_BLDG_COLOR, DEFAULT_BACKGROUND_COLOR, BASE_MAP_BACKGROUND_LAYER_IDS, DEFAULT_BASE_MAP_STYLE } from '@kepler.gl/constants';
19
+ import { ACTION_TASK, LOAD_MAP_STYLE_TASK } from '@kepler.gl/tasks';
20
+ import { rgb } from 'd3-color';
21
+ import { loadMapStyles, loadMapStyleErr } from '@kepler.gl/actions';
22
+ export var getDefaultMapStyles = function getDefaultMapStyles(cdnUrl) {
23
+ return DEFAULT_MAP_STYLES.reduce(function (accu, curr) {
24
+ return _objectSpread(_objectSpread({}, accu), {}, _defineProperty({}, curr.id, _objectSpread(_objectSpread({}, curr), {}, {
25
+ icon: "".concat(cdnUrl, "/").concat(curr.icon)
26
+ })));
27
+ }, {});
28
+ };
29
+ var getDefaultState = function getDefaultState() {
30
+ var visibleLayerGroups = {};
31
+ var topLayerGroups = {};
32
+ return {
33
+ styleType: DEFAULT_BASE_MAP_STYLE,
34
+ visibleLayerGroups: visibleLayerGroups,
35
+ topLayerGroups: topLayerGroups,
36
+ mapStyles: getDefaultMapStyles(getApplicationConfig().cdnUrl),
37
+ // save mapbox access token
38
+ mapboxApiAccessToken: null,
39
+ mapboxApiUrl: DEFAULT_MAPBOX_API_URL,
40
+ mapStylesReplaceDefault: false,
41
+ inputStyle: getInitialInputStyle(),
42
+ threeDBuildingColor: hexToRgb(DEFAULT_BLDG_COLOR),
43
+ custom3DBuildingColor: false,
44
+ backgroundColor: hexToRgb(DEFAULT_BACKGROUND_COLOR),
45
+ isLoading: {},
46
+ bottomMapStyle: undefined,
47
+ topMapStyle: undefined
48
+ };
49
+ };
50
+
51
+ /**
52
+ * Updaters for `mapStyle`. Can be used in your root reducer to directly modify kepler.gl's state.
53
+ * Read more about [Using updaters](../advanced-usage/using-updaters.md)
54
+ * @public
55
+ * @example
56
+ *
57
+ * import keplerGlReducer, {mapStyleUpdaters} from '@kepler.gl/reducers';
58
+ * // Root Reducer
59
+ * const reducers = combineReducers({
60
+ * keplerGl: keplerGlReducer,
61
+ * app: appReducer
62
+ * });
63
+ *
64
+ * const composedReducer = (state, action) => {
65
+ * switch (action.type) {
66
+ * // click button to hide label from background map
67
+ * case 'CLICK_BUTTON':
68
+ * return {
69
+ * ...state,
70
+ * keplerGl: {
71
+ * ...state.keplerGl,
72
+ * foo: {
73
+ * ...state.keplerGl.foo,
74
+ * mapStyle: mapStyleUpdaters.mapConfigChangeUpdater(
75
+ * mapStyle,
76
+ * {payload: {visibleLayerGroups: {label: false, road: true, background: true}}}
77
+ * )
78
+ * }
79
+ * }
80
+ * };
81
+ * }
82
+ * return reducers(state, action);
83
+ * };
84
+ *
85
+ * export default composedReducer;
86
+ */
87
+
88
+ /* eslint-disable @typescript-eslint/no-unused-vars */
89
+ // @ts-ignore
90
+ var mapStyleUpdaters = null;
91
+ /* eslint-enable @typescript-eslint/no-unused-vars */
92
+ /**
93
+ * Default initial `mapStyle`
94
+ * @memberof mapStyleUpdaters
95
+ * @constant
96
+ * @property styleType - Default: `'dark'`
97
+ * @property visibleLayerGroups - Default: `{}`
98
+ * @property topLayerGroups - Default: `{}`
99
+ * @property mapStyles - mapping from style key to style object
100
+ * @property mapboxApiAccessToken - Default: `null`
101
+ * @Property mapboxApiUrl - Default null
102
+ * @Property mapStylesReplaceDefault - Default: `false`
103
+ * @property inputStyle - Default: `{}`
104
+ * @property threeDBuildingColor - Default: `[r, g, b]`
105
+ * @property backgroundColor - Default: `[r, g, b]`
106
+ * @public
107
+ */
108
+ export var INITIAL_MAP_STYLE = getDefaultState();
109
+ /**
110
+ * Create two map styles from preset map style, one for top map one for bottom
111
+ *
112
+ * @param {string} styleType - current map style
113
+ * @param {Object} visibleLayerGroups - visible layers of bottom map
114
+ * @param {Object} topLayerGroups - visible layers of top map
115
+ * @param {Object} mapStyles - a dictionary of all map styles
116
+ * @returns {Object} bottomMapStyle | topMapStyle | isRaster
117
+ */
118
+ export function getMapStyles(_ref) {
119
+ var styleType = _ref.styleType,
120
+ visibleLayerGroups = _ref.visibleLayerGroups,
121
+ topLayerGroups = _ref.topLayerGroups,
122
+ mapStyles = _ref.mapStyles;
123
+ var mapStyle = mapStyles[styleType];
124
+
125
+ // style might not be loaded yet
126
+ if (!mapStyle || !mapStyle.style) {
127
+ return {};
128
+ }
129
+ var editable = Object.keys(visibleLayerGroups).length;
130
+ var bottomMapStyle = !editable ? mapStyle.style : editBottomMapStyle({
131
+ id: styleType,
132
+ mapStyle: mapStyle,
133
+ visibleLayerGroups: visibleLayerGroups
134
+ });
135
+ var hasTopLayer = editable > 0 && Object.values(topLayerGroups).some(function (v) {
136
+ return v;
137
+ });
138
+
139
+ // mute top layer if not visible in bottom layer
140
+ var topLayers = hasTopLayer && Object.keys(topLayerGroups).reduce(function (accu, key) {
141
+ return _objectSpread(_objectSpread({}, accu), {}, _defineProperty({}, key, topLayerGroups[key] && visibleLayerGroups[key]));
142
+ }, {});
143
+ var topMapStyle = hasTopLayer ? editTopMapStyle({
144
+ id: styleType,
145
+ mapStyle: mapStyle,
146
+ visibleLayerGroups: topLayers
147
+ }) : null;
148
+ return {
149
+ bottomMapStyle: bottomMapStyle,
150
+ topMapStyle: topMapStyle,
151
+ editable: editable
152
+ };
153
+ }
154
+ function findLayerFillColor(layer) {
155
+ return layer && layer.paint && layer.paint['background-color'];
156
+ }
157
+
158
+ // need to be careful because some basemap layer.paint['background-color'] values may be an interpolate array expression instead of a color string
159
+ // https://docs.mapbox.com/mapbox-gl-js/style-spec/layers/#paint-background-background-color
160
+ // https://docs.mapbox.com/mapbox-gl-js/style-spec/expressions/#interpolate
161
+ function getPaintColor(color) {
162
+ if (Array.isArray(color) && color[0] === 'interpolate') {
163
+ // get color of first zoom break
164
+ // ["interpolate", ["linear"], ["zoom"], 11, "hsl(35, 32%, 91%)", 13, "hsl(35, 12%, 89%)"]
165
+ return color[4];
166
+ }
167
+ return color;
168
+ }
169
+ function get3DBuildingColor(style) {
170
+ // set building color to be the same as the background color.
171
+ if (!style.style) {
172
+ return hexToRgb(DEFAULT_BLDG_COLOR);
173
+ }
174
+ var backgroundLayer = (style.style.layers || []).find(function (_ref2) {
175
+ var id = _ref2.id;
176
+ return id === 'background';
177
+ });
178
+ var buildingLayer = (style.style.layers || []).find(function (_ref3) {
179
+ var id = _ref3.id;
180
+ return id.match(/building/);
181
+ });
182
+ var buildingColor = findLayerFillColor(buildingLayer) || findLayerFillColor(backgroundLayer) || DEFAULT_BLDG_COLOR;
183
+
184
+ // brighten or darken building based on style
185
+ var operation = style.id.match(/(?=(dark|night))/) ? 'brighter' : 'darker';
186
+ var alpha = 0.2;
187
+ var rgbObj = rgb(buildingColor)[operation]([alpha]);
188
+ return [rgbObj.r, rgbObj.g, rgbObj.b];
189
+ }
190
+ function getBackgroundColorFromStyleBaseLayer(style, backupBackgroundColor) {
191
+ var _colorMaybeToRGB;
192
+ if (!style.style) {
193
+ return colorMaybeToRGB(backupBackgroundColor) || backupBackgroundColor;
194
+ }
195
+
196
+ // @ts-expect-error style.style not typed
197
+ var baseLayer = (style.style.layers || []).find(function (_ref4) {
198
+ var id = _ref4.id;
199
+ return BASE_MAP_BACKGROUND_LAYER_IDS.includes(id);
200
+ });
201
+ var backgroundColorOfBaseLayer = getPaintColor(findLayerFillColor(baseLayer));
202
+ var newBackgroundColor = typeof backgroundColorOfBaseLayer === 'string' ? backgroundColorOfBaseLayer : backupBackgroundColor;
203
+ var newBackgroundColorAsRGBArray = (_colorMaybeToRGB = colorMaybeToRGB(newBackgroundColor)
204
+ // if newBackgroundColor was in string HSL format it can introduce RGB numbers with decimals,
205
+ // which may render the background-color CSS of the <StyledMap> container incorrectly when using our own color utils `rgbToHex()`
206
+ // so we attempt to round to nearest integer here
207
+ ) === null || _colorMaybeToRGB === void 0 ? void 0 : _colorMaybeToRGB.map(function (channelNumber) {
208
+ return Math.round(channelNumber);
209
+ });
210
+ return newBackgroundColorAsRGBArray || backupBackgroundColor;
211
+ }
212
+
213
+ // determine new backgroundColor from either previous state basemap style, previous state backgroundColor, or the DEFAULT_BACKGROUND_COLOR
214
+ function getBackgroundColor(previousState, styleType) {
215
+ var previousStateMapStyle = previousState.mapStyles[previousState.styleType];
216
+ var backupBackgroundColor = previousState.backgroundColor || DEFAULT_BACKGROUND_COLOR;
217
+ var backgroundColor = styleType === NO_MAP_ID ?
218
+ // if the style has switched to the "no basemap" style,
219
+ // attempt to detect backgroundColor of the previous basemap if it was a mapbox basemap
220
+ // and set it as the "no basemap" backgroundColor
221
+ getBackgroundColorFromStyleBaseLayer(previousStateMapStyle, backupBackgroundColor) :
222
+ // otherwise leave it alone and rely on the previous state's preexisting backgroundColor
223
+ // or DEFAULT_BACKGROUND_COLOR as a last resort
224
+ backupBackgroundColor;
225
+ return backgroundColor;
226
+ }
227
+ function getLayerGroupsFromStyle(style) {
228
+ return Array.isArray(style === null || style === void 0 ? void 0 : style.layers) ? DEFAULT_LAYER_GROUPS.filter(function (lg) {
229
+ return style.layers.filter(lg.filter).length;
230
+ }) : [];
231
+ }
232
+
233
+ // Updaters
234
+
235
+ /**
236
+ * @memberof mapStyleUpdaters
237
+ * @public
238
+ */
239
+ export var requestMapStylesUpdater = function requestMapStylesUpdater(state, _ref5) {
240
+ var _ref5$payload = _ref5.payload,
241
+ mapStyles = _ref5$payload.mapStyles,
242
+ onSuccess = _ref5$payload.onSuccess;
243
+ var toLoad = Object.keys(mapStyles).reduce(function (accu, id) {
244
+ return _objectSpread(_objectSpread({}, accu), !state.isLoading[id] ? _defineProperty({}, id, mapStyles[id]) : {});
245
+ }, {});
246
+ var loadMapStyleTasks = getLoadMapStyleTasks(toLoad, state.mapboxApiAccessToken, state.mapboxApiUrl, onSuccess);
247
+ var isLoading = Object.keys(toLoad).reduce(function (accu, key) {
248
+ return _objectSpread(_objectSpread({}, accu), {}, _defineProperty({}, key, true));
249
+ }, {});
250
+ var nextState = _objectSpread(_objectSpread({}, state), {}, {
251
+ isLoading: isLoading
252
+ });
253
+ return withTask(nextState, loadMapStyleTasks);
254
+ };
255
+
256
+ /**
257
+ * Propagate `mapStyle` reducer with `mapboxApiAccessToken` and `mapStylesReplaceDefault`.
258
+ * if mapStylesReplaceDefault is true mapStyles is emptied; loadMapStylesUpdater() will
259
+ * populate mapStyles.
260
+ *
261
+ * @memberof mapStyleUpdaters
262
+ * @public
263
+ */
264
+ export var initMapStyleUpdater = function initMapStyleUpdater(state, _ref7) {
265
+ var _ref7$payload = _ref7.payload,
266
+ payload = _ref7$payload === void 0 ? {} : _ref7$payload;
267
+ return _objectSpread(_objectSpread({}, state), {}, {
268
+ // save mapbox access token to map style state
269
+ mapboxApiAccessToken: payload.mapboxApiAccessToken || state.mapboxApiAccessToken,
270
+ mapboxApiUrl: payload.mapboxApiUrl || state.mapboxApiUrl,
271
+ mapStyles: !payload.mapStylesReplaceDefault ? state.mapStyles : {},
272
+ mapStylesReplaceDefault: payload.mapStylesReplaceDefault || false
273
+ });
274
+ };
275
+ // });
276
+
277
+ /**
278
+ * Update `visibleLayerGroups`to change layer group visibility
279
+ * @memberof mapStyleUpdaters
280
+ * @public
281
+ */
282
+ export var mapConfigChangeUpdater = function mapConfigChangeUpdater(state, action) {
283
+ return _objectSpread(_objectSpread(_objectSpread({}, state), action.payload), getMapStyles(_objectSpread(_objectSpread({}, state), action.payload)));
284
+ };
285
+ var hasStyleObject = function hasStyleObject(style) {
286
+ return isPlainObject(style === null || style === void 0 ? void 0 : style.style);
287
+ };
288
+
289
+ /**
290
+ * Change to another map style. The selected style should already been loaded into `mapStyle.mapStyles`
291
+ * @memberof mapStyleUpdaters
292
+ * @public
293
+ */
294
+ export var mapStyleChangeUpdater = function mapStyleChangeUpdater(state, _ref8) {
295
+ var _state$mapStyles$styl, _state$mapStyles$styl2;
296
+ var _ref8$payload = _ref8.payload,
297
+ styleType = _ref8$payload.styleType,
298
+ onSuccess = _ref8$payload.onSuccess;
299
+ if (
300
+ // we might not have received the style yet
301
+ !state.mapStyles[styleType] ||
302
+ // or if it is a managed custom style asset
303
+ // and if it has not been hydrated with URL info yet (during app first initialization)
304
+ // and it does not have a style object (during adding a custom style)
305
+ ((_state$mapStyles$styl = state.mapStyles[styleType]) === null || _state$mapStyles$styl === void 0 ? void 0 : _state$mapStyles$styl.custom) === 'MANAGED' && !((_state$mapStyles$styl2 = state.mapStyles[styleType]) !== null && _state$mapStyles$styl2 !== void 0 && _state$mapStyles$styl2.url) && !hasStyleObject(state.mapStyles[styleType])) {
306
+ return state;
307
+ }
308
+ if (!hasStyleObject(state.mapStyles[styleType])) {
309
+ // style hasn't loaded yet
310
+ return requestMapStylesUpdater(_objectSpread(_objectSpread({}, state), {}, {
311
+ styleType: styleType
312
+ }), {
313
+ payload: {
314
+ mapStyles: _defineProperty({}, styleType, state.mapStyles[styleType]),
315
+ onSuccess: onSuccess
316
+ }
317
+ });
318
+ }
319
+ var defaultLGVisibility = getDefaultLayerGroupVisibility(state.mapStyles[styleType]);
320
+ var visibleLayerGroups = mergeLayerGroupVisibility(defaultLGVisibility, state.visibleLayerGroups);
321
+ var threeDBuildingColor = state.custom3DBuildingColor ? state.threeDBuildingColor : get3DBuildingColor(state.mapStyles[styleType]);
322
+
323
+ // determine new backgroundColor from either previous state basemap style, previous state backgroundColor, or the DEFAULT_BACKGROUND_COLOR
324
+ var backgroundColor = getBackgroundColor(state, styleType);
325
+ return _objectSpread(_objectSpread({}, state), {}, {
326
+ styleType: styleType,
327
+ visibleLayerGroups: visibleLayerGroups,
328
+ threeDBuildingColor: threeDBuildingColor,
329
+ backgroundColor: backgroundColor
330
+ }, getMapStyles(_objectSpread(_objectSpread({}, state), {}, {
331
+ visibleLayerGroups: visibleLayerGroups,
332
+ styleType: styleType
333
+ })));
334
+ };
335
+
336
+ /**
337
+ * Callback when load map style success
338
+ * @memberof mapStyleUpdaters
339
+ * @public
340
+ */
341
+ export var loadMapStylesUpdater = function loadMapStylesUpdater(state, action) {
342
+ var _ref9 = action.payload || {},
343
+ newStyles = _ref9.newStyles,
344
+ onSuccess = _ref9.onSuccess;
345
+ var addLayerGroups = Object.keys(newStyles).reduce(function (accu, id) {
346
+ return _objectSpread(_objectSpread({}, accu), {}, _defineProperty({}, id, _objectSpread(_objectSpread({}, newStyles[id]), {}, {
347
+ layerGroups: newStyles[id].layerGroups || getLayerGroupsFromStyle(newStyles[id].style)
348
+ })));
349
+ }, {});
350
+ // reset isLoading
351
+ var isLoading = Object.keys(state.isLoading).reduce(function (accu, key) {
352
+ return _objectSpread(_objectSpread({}, accu), state.isLoading[key] && hasStyleObject(newStyles[key]) ? _defineProperty({}, key, false) : _defineProperty({}, key, state.isLoading[key]));
353
+ }, {});
354
+ // add new styles to state
355
+ var newState = _objectSpread(_objectSpread({}, state), {}, {
356
+ isLoading: isLoading,
357
+ mapStyles: _objectSpread(_objectSpread({}, state.mapStyles), addLayerGroups)
358
+ });
359
+ var tasks = createActionTask(onSuccess, {
360
+ styleType: state.styleType
361
+ });
362
+ var nextState = newStyles[state.styleType] ? mapStyleChangeUpdater(newState, {
363
+ payload: {
364
+ styleType: state.styleType
365
+ }
366
+ }) : newState;
367
+ return tasks ? withTask(nextState, tasks) : nextState;
368
+ };
369
+ function createActionTask(action, payload) {
370
+ if (typeof action === 'function') {
371
+ return ACTION_TASK().map(function () {
372
+ return action(payload);
373
+ });
374
+ }
375
+ return null;
376
+ }
377
+
378
+ /**
379
+ * Callback when load map style error
380
+ * @memberof mapStyleUpdaters
381
+ * @public
382
+ */
383
+ // do nothing for now, if didn't load, skip it
384
+ export var loadMapStyleErrUpdater = function loadMapStyleErrUpdater(state, _ref10) {
385
+ var _ref10$payload = _ref10.payload,
386
+ ids = _ref10$payload.ids,
387
+ error = _ref10$payload.error;
388
+ Console.error(error);
389
+ // reset isLoading
390
+ var isLoading = Object.keys(state.isLoading).reduce(function (accu, key) {
391
+ return _objectSpread(_objectSpread({}, accu), state.isLoading[key] && (ids || []).includes(key) ? _defineProperty({}, key, false) : _defineProperty({}, key, state.isLoading[key]));
392
+ }, {});
393
+ return _objectSpread(_objectSpread({}, state), {}, {
394
+ isLoading: isLoading
395
+ });
396
+ };
397
+
398
+ /**
399
+ * Load map style object when pass in saved map config
400
+ * @memberof mapStyleUpdaters
401
+ * @param state `mapStyle`
402
+ * @param action
403
+ * @param action.payload saved map config `{mapStyle, visState, mapState}`
404
+ * @returns nextState or `react-pam` tasks to load map style object
405
+ */
406
+ export var receiveMapConfigUpdater = function receiveMapConfigUpdater(state, _ref13) {
407
+ var config = _ref13.payload.config;
408
+ var _ref14 = config || {},
409
+ mapStyle = _ref14.mapStyle;
410
+ if (!mapStyle) {
411
+ return state;
412
+ }
413
+
414
+ // merge default mapStyles
415
+ var merged = mapStyle.mapStyles ? _objectSpread(_objectSpread({}, mapStyle), {}, {
416
+ mapStyles: _objectSpread(_objectSpread({}, mapStyle.mapStyles), state.mapStyles)
417
+ }) : mapStyle;
418
+
419
+ // set custom3DBuildingColor: true if mapStyle contains threeDBuildingColor
420
+ // @ts-expect-error
421
+ merged.custom3DBuildingColor =
422
+ // @ts-expect-error
423
+ Boolean(mapStyle.threeDBuildingColor) || merged.custom3DBuildingColor;
424
+ var newState = mapConfigChangeUpdater(state, {
425
+ payload: merged
426
+ });
427
+ return mapStyleChangeUpdater(newState, {
428
+ payload: {
429
+ styleType: newState.styleType
430
+ }
431
+ });
432
+ };
433
+ function getLoadMapStyleTasks(mapStyles, mapboxApiAccessToken, mapboxApiUrl, onSuccess) {
434
+ return [Task.all(Object.values(mapStyles)
435
+ // @ts-expect-error
436
+ .map(function (_ref15) {
437
+ var id = _ref15.id,
438
+ url = _ref15.url,
439
+ accessToken = _ref15.accessToken;
440
+ return {
441
+ id: id,
442
+ url: getStyleDownloadUrl(url, accessToken || mapboxApiAccessToken, mapboxApiUrl)
443
+ };
444
+ }).map(LOAD_MAP_STYLE_TASK)).bimap(
445
+ // success
446
+ function (results) {
447
+ return loadMapStyles(results.reduce(function (accu, _ref16) {
448
+ var id = _ref16.id,
449
+ style = _ref16.style;
450
+ return _objectSpread(_objectSpread({}, accu), {}, _defineProperty({}, id, _objectSpread(_objectSpread({}, mapStyles[id]), {}, {
451
+ style: style
452
+ })));
453
+ }, {}), onSuccess);
454
+ },
455
+ // error
456
+ function (err) {
457
+ return loadMapStyleErr(Object.keys(mapStyles), err);
458
+ })];
459
+ }
460
+ /**
461
+ * Reset map style config to initial state
462
+ * @memberof mapStyleUpdaters
463
+ * @param state `mapStyle`
464
+ * @returns nextState
465
+ * @public
466
+ */
467
+ export var resetMapConfigMapStyleUpdater = function resetMapConfigMapStyleUpdater(state) {
468
+ var emptyConfig = _objectSpread(_objectSpread(_objectSpread({}, INITIAL_MAP_STYLE), {}, {
469
+ mapboxApiAccessToken: state.mapboxApiAccessToken,
470
+ mapboxApiUrl: state.mapboxApiUrl,
471
+ mapStylesReplaceDefault: state.mapStylesReplaceDefault
472
+ }, state.initialState), {}, {
473
+ mapStyles: state.mapStyles,
474
+ initialState: state.initialState
475
+ });
476
+ return mapStyleChangeUpdater(emptyConfig, {
477
+ payload: {
478
+ styleType: emptyConfig.styleType
479
+ }
480
+ });
481
+ };
482
+
483
+ /**
484
+ * Callback when a custom map style object is received
485
+ * @memberof mapStyleUpdaters
486
+ * @public
487
+ */
488
+ export var loadCustomMapStyleUpdater = function loadCustomMapStyleUpdater(state, _ref17) {
489
+ var _ref17$payload = _ref17.payload,
490
+ icon = _ref17$payload.icon,
491
+ style = _ref17$payload.style,
492
+ error = _ref17$payload.error;
493
+ return _objectSpread(_objectSpread({}, state), {}, {
494
+ // @ts-expect-error
495
+ inputStyle: _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, state.inputStyle), style ? {
496
+ id: state.inputStyle.custom === 'MANAGED' ? state.inputStyle.id // custom MANAGED type
497
+ :
498
+ // @ts-expect-error
499
+ style.id || generateHashId(),
500
+ // custom LOCAL type
501
+ // make a copy of the style object
502
+ style: cloneDeep(style),
503
+ // @ts-expect-error
504
+ label: state.inputStyle.label || style.name,
505
+ // gathering layer group info from style json
506
+ layerGroups: getLayerGroupsFromStyle(style)
507
+ } : {}), icon ? {
508
+ icon: icon
509
+ } : {}), error !== undefined ? {
510
+ error: error
511
+ } : {})
512
+ });
513
+ };
514
+
515
+ /**
516
+ * Input a custom map style object
517
+ * @memberof mapStyleUpdaters
518
+ * @public
519
+ */
520
+ export var inputMapStyleUpdater = function inputMapStyleUpdater(state, _ref18) {
521
+ var _updated$icon, _updated$url, _updated$url2;
522
+ var _ref18$payload = _ref18.payload,
523
+ inputStyle = _ref18$payload.inputStyle,
524
+ mapState = _ref18$payload.mapState;
525
+ var updated = _objectSpread(_objectSpread({}, state.inputStyle), inputStyle);
526
+
527
+ // differentiate between either a url to hosted style json that needs an icon url,
528
+ // or an icon already available client-side as a data uri
529
+ var isUpdatedIconDataUri = (_updated$icon = updated.icon) === null || _updated$icon === void 0 ? void 0 : _updated$icon.startsWith('data:image');
530
+ var isMapboxStyleUrl = ((_updated$url = updated.url) === null || _updated$url === void 0 ? void 0 : _updated$url.startsWith('mapbox://')) || ((_updated$url2 = updated.url) === null || _updated$url2 === void 0 ? void 0 : _updated$url2.includes('mapbox.com'));
531
+ var icon = !isUpdatedIconDataUri && isMapboxStyleUrl ?
532
+ // Get image icon urls only for mapbox map lib.
533
+ getStyleImageIcon({
534
+ mapState: mapState,
535
+ styleUrl: updated.url || '',
536
+ mapboxApiAccessToken: updated.accessToken || state.mapboxApiAccessToken || '',
537
+ mapboxApiUrl: state.mapboxApiUrl || DEFAULT_MAPBOX_API_URL
538
+ }) : updated.icon;
539
+ return _objectSpread(_objectSpread({}, state), {}, {
540
+ inputStyle: _objectSpread(_objectSpread({}, updated), {}, {
541
+ isValid: true,
542
+ icon: icon
543
+ })
544
+ });
545
+ };
546
+
547
+ /**
548
+ * Add map style from user input to reducer and set it to current style
549
+ * This action is called when user click confirm after putting in a valid style url in the custom map style dialog.
550
+ * It should not be called from outside kepler.gl without a valid `inputStyle` in the `mapStyle` reducer.
551
+ * @memberof mapStyleUpdaters
552
+ */
553
+ export var addCustomMapStyleUpdater = function addCustomMapStyleUpdater(state) {
554
+ var styleId = state.inputStyle.id;
555
+ if (!styleId) return state;
556
+ var newState = getNewStateWithCustomMapStyle(state);
557
+ // set new style
558
+ return mapStyleChangeUpdater(newState, {
559
+ payload: {
560
+ styleType: styleId
561
+ }
562
+ });
563
+ };
564
+
565
+ /**
566
+ * Edit map style from user input to reducer.
567
+ * This action is called when user clicks confirm after editing an existing custom style in the custom map style dialog.
568
+ * It should not be called from outside kepler.gl without a valid `inputStyle` in the `mapStyle` reducer.
569
+ * @memberof mapStyleUpdaters
570
+ */
571
+ export var editCustomMapStyleUpdater = function editCustomMapStyleUpdater(state) {
572
+ return getNewStateWithCustomMapStyle(state);
573
+ };
574
+ function getNewStateWithCustomMapStyle(state) {
575
+ var styleId = state.inputStyle.id;
576
+ if (!styleId) return state;
577
+ return _objectSpread(_objectSpread({}, state), {}, {
578
+ // @ts-expect-error Property 'layerGroups' is missing in type 'InputStyle' but required in type 'BaseMapStyle'. Legacy case?
579
+ mapStyles: _objectSpread(_objectSpread({}, state.mapStyles), {}, _defineProperty({}, styleId, _objectSpread(_objectSpread({}, state.mapStyles[styleId]), state.inputStyle))),
580
+ // set to default
581
+ inputStyle: getInitialInputStyle()
582
+ });
583
+ }
584
+
585
+ /**
586
+ * Remove a custom map style from `state.mapStyle.mapStyles`.
587
+ * @memberof mapStyleUpdaters
588
+ */
589
+ export var removeCustomMapStyleUpdater = function removeCustomMapStyleUpdater(state, action) {
590
+ var id = action.payload.id;
591
+
592
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
593
+ var _state$mapStyles = state.mapStyles,
594
+ _ = _state$mapStyles[id],
595
+ restOfMapStyles = _objectWithoutProperties(_state$mapStyles, [id].map(_toPropertyKey));
596
+ var newState = _objectSpread(_objectSpread({}, state), {}, {
597
+ mapStyles: restOfMapStyles
598
+ });
599
+ if (state.styleType === id) {
600
+ // if removing a custom style that is also the current active base map,
601
+ // then reset to the default active base map (`mapStyle.styleType`)
602
+ return mapStyleChangeUpdater(newState, {
603
+ payload: {
604
+ styleType: getDefaultState().styleType
605
+ }
606
+ });
607
+ }
608
+ return newState;
609
+ };
610
+
611
+ /**
612
+ * Updates 3d building color
613
+ * @memberof mapStyleUpdaters
614
+ */
615
+ export var set3dBuildingColorUpdater = function set3dBuildingColorUpdater(state, _ref19) {
616
+ var color = _ref19.payload;
617
+ return _objectSpread(_objectSpread({}, state), {}, {
618
+ threeDBuildingColor: color,
619
+ custom3DBuildingColor: true
620
+ });
621
+ };
622
+
623
+ /**
624
+ * Updates background color
625
+ * @memberof mapStyleUpdaters
626
+ */
627
+ export var setBackgroundColorUpdater = function setBackgroundColorUpdater(state, _ref20) {
628
+ var color = _ref20.payload;
629
+ return _objectSpread(_objectSpread({}, state), {}, {
630
+ backgroundColor: color
631
+ });
632
+ };
633
+
634
+ /**
635
+ * Return the initial input style
636
+ * @return Object
637
+ */
638
+ export function getInitialInputStyle() {
639
+ return {
640
+ id: null,
641
+ accessToken: null,
642
+ error: false,
643
+ isValid: false,
644
+ label: null,
645
+ style: null,
646
+ url: null,
647
+ icon: null,
648
+ custom: 'LOCAL',
649
+ uploadedFile: null
650
+ };
651
+ }
652
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUYXNrIiwid2l0aFRhc2siLCJjbG9uZURlZXAiLCJDb25zb2xlIiwiZ2V0RGVmYXVsdExheWVyR3JvdXBWaXNpYmlsaXR5IiwiZ2V0U3R5bGVEb3dubG9hZFVybCIsIm1lcmdlTGF5ZXJHcm91cFZpc2liaWxpdHkiLCJlZGl0VG9wTWFwU3R5bGUiLCJlZGl0Qm90dG9tTWFwU3R5bGUiLCJnZXRTdHlsZUltYWdlSWNvbiIsImlzUGxhaW5PYmplY3QiLCJoZXhUb1JnYiIsImNvbG9yTWF5YmVUb1JHQiIsImdldEFwcGxpY2F0aW9uQ29uZmlnIiwiZ2VuZXJhdGVIYXNoSWQiLCJERUZBVUxUX01BUF9TVFlMRVMiLCJERUZBVUxUX0xBWUVSX0dST1VQUyIsIkRFRkFVTFRfTUFQQk9YX0FQSV9VUkwiLCJOT19NQVBfSUQiLCJERUZBVUxUX0JMREdfQ09MT1IiLCJERUZBVUxUX0JBQ0tHUk9VTkRfQ09MT1IiLCJCQVNFX01BUF9CQUNLR1JPVU5EX0xBWUVSX0lEUyIsIkRFRkFVTFRfQkFTRV9NQVBfU1RZTEUiLCJBQ1RJT05fVEFTSyIsIkxPQURfTUFQX1NUWUxFX1RBU0siLCJyZ2IiLCJsb2FkTWFwU3R5bGVzIiwibG9hZE1hcFN0eWxlRXJyIiwiZ2V0RGVmYXVsdE1hcFN0eWxlcyIsImNkblVybCIsInJlZHVjZSIsImFjY3UiLCJjdXJyIiwiX29iamVjdFNwcmVhZCIsIl9kZWZpbmVQcm9wZXJ0eSIsImlkIiwiaWNvbiIsImNvbmNhdCIsImdldERlZmF1bHRTdGF0ZSIsInZpc2libGVMYXllckdyb3VwcyIsInRvcExheWVyR3JvdXBzIiwic3R5bGVUeXBlIiwibWFwU3R5bGVzIiwibWFwYm94QXBpQWNjZXNzVG9rZW4iLCJtYXBib3hBcGlVcmwiLCJtYXBTdHlsZXNSZXBsYWNlRGVmYXVsdCIsImlucHV0U3R5bGUiLCJnZXRJbml0aWFsSW5wdXRTdHlsZSIsInRocmVlREJ1aWxkaW5nQ29sb3IiLCJjdXN0b20zREJ1aWxkaW5nQ29sb3IiLCJiYWNrZ3JvdW5kQ29sb3IiLCJpc0xvYWRpbmciLCJib3R0b21NYXBTdHlsZSIsInVuZGVmaW5lZCIsInRvcE1hcFN0eWxlIiwibWFwU3R5bGVVcGRhdGVycyIsIklOSVRJQUxfTUFQX1NUWUxFIiwiZ2V0TWFwU3R5bGVzIiwiX3JlZiIsIm1hcFN0eWxlIiwic3R5bGUiLCJlZGl0YWJsZSIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJoYXNUb3BMYXllciIsInZhbHVlcyIsInNvbWUiLCJ2IiwidG9wTGF5ZXJzIiwia2V5IiwiZmluZExheWVyRmlsbENvbG9yIiwibGF5ZXIiLCJwYWludCIsImdldFBhaW50Q29sb3IiLCJjb2xvciIsIkFycmF5IiwiaXNBcnJheSIsImdldDNEQnVpbGRpbmdDb2xvciIsImJhY2tncm91bmRMYXllciIsImxheWVycyIsImZpbmQiLCJfcmVmMiIsImJ1aWxkaW5nTGF5ZXIiLCJfcmVmMyIsIm1hdGNoIiwiYnVpbGRpbmdDb2xvciIsIm9wZXJhdGlvbiIsImFscGhhIiwicmdiT2JqIiwiciIsImciLCJiIiwiZ2V0QmFja2dyb3VuZENvbG9yRnJvbVN0eWxlQmFzZUxheWVyIiwiYmFja3VwQmFja2dyb3VuZENvbG9yIiwiX2NvbG9yTWF5YmVUb1JHQiIsImJhc2VMYXllciIsIl9yZWY0IiwiaW5jbHVkZXMiLCJiYWNrZ3JvdW5kQ29sb3JPZkJhc2VMYXllciIsIm5ld0JhY2tncm91bmRDb2xvciIsIm5ld0JhY2tncm91bmRDb2xvckFzUkdCQXJyYXkiLCJtYXAiLCJjaGFubmVsTnVtYmVyIiwiTWF0aCIsInJvdW5kIiwiZ2V0QmFja2dyb3VuZENvbG9yIiwicHJldmlvdXNTdGF0ZSIsInByZXZpb3VzU3RhdGVNYXBTdHlsZSIsImdldExheWVyR3JvdXBzRnJvbVN0eWxlIiwiZmlsdGVyIiwibGciLCJyZXF1ZXN0TWFwU3R5bGVzVXBkYXRlciIsInN0YXRlIiwiX3JlZjUiLCJfcmVmNSRwYXlsb2FkIiwicGF5bG9hZCIsIm9uU3VjY2VzcyIsInRvTG9hZCIsImxvYWRNYXBTdHlsZVRhc2tzIiwiZ2V0TG9hZE1hcFN0eWxlVGFza3MiLCJuZXh0U3RhdGUiLCJpbml0TWFwU3R5bGVVcGRhdGVyIiwiX3JlZjciLCJfcmVmNyRwYXlsb2FkIiwibWFwQ29uZmlnQ2hhbmdlVXBkYXRlciIsImFjdGlvbiIsImhhc1N0eWxlT2JqZWN0IiwibWFwU3R5bGVDaGFuZ2VVcGRhdGVyIiwiX3JlZjgiLCJfc3RhdGUkbWFwU3R5bGVzJHN0eWwiLCJfc3RhdGUkbWFwU3R5bGVzJHN0eWwyIiwiX3JlZjgkcGF5bG9hZCIsImN1c3RvbSIsInVybCIsImRlZmF1bHRMR1Zpc2liaWxpdHkiLCJsb2FkTWFwU3R5bGVzVXBkYXRlciIsIl9yZWY5IiwibmV3U3R5bGVzIiwiYWRkTGF5ZXJHcm91cHMiLCJsYXllckdyb3VwcyIsIm5ld1N0YXRlIiwidGFza3MiLCJjcmVhdGVBY3Rpb25UYXNrIiwibG9hZE1hcFN0eWxlRXJyVXBkYXRlciIsIl9yZWYxMCIsIl9yZWYxMCRwYXlsb2FkIiwiaWRzIiwiZXJyb3IiLCJyZWNlaXZlTWFwQ29uZmlnVXBkYXRlciIsIl9yZWYxMyIsImNvbmZpZyIsIl9yZWYxNCIsIm1lcmdlZCIsIkJvb2xlYW4iLCJhbGwiLCJfcmVmMTUiLCJhY2Nlc3NUb2tlbiIsImJpbWFwIiwicmVzdWx0cyIsIl9yZWYxNiIsImVyciIsInJlc2V0TWFwQ29uZmlnTWFwU3R5bGVVcGRhdGVyIiwiZW1wdHlDb25maWciLCJpbml0aWFsU3RhdGUiLCJsb2FkQ3VzdG9tTWFwU3R5bGVVcGRhdGVyIiwiX3JlZjE3IiwiX3JlZjE3JHBheWxvYWQiLCJsYWJlbCIsIm5hbWUiLCJpbnB1dE1hcFN0eWxlVXBkYXRlciIsIl9yZWYxOCIsIl91cGRhdGVkJGljb24iLCJfdXBkYXRlZCR1cmwiLCJfdXBkYXRlZCR1cmwyIiwiX3JlZjE4JHBheWxvYWQiLCJtYXBTdGF0ZSIsInVwZGF0ZWQiLCJpc1VwZGF0ZWRJY29uRGF0YVVyaSIsInN0YXJ0c1dpdGgiLCJpc01hcGJveFN0eWxlVXJsIiwic3R5bGVVcmwiLCJpc1ZhbGlkIiwiYWRkQ3VzdG9tTWFwU3R5bGVVcGRhdGVyIiwic3R5bGVJZCIsImdldE5ld1N0YXRlV2l0aEN1c3RvbU1hcFN0eWxlIiwiZWRpdEN1c3RvbU1hcFN0eWxlVXBkYXRlciIsInJlbW92ZUN1c3RvbU1hcFN0eWxlVXBkYXRlciIsIl9zdGF0ZSRtYXBTdHlsZXMiLCJfIiwicmVzdE9mTWFwU3R5bGVzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwiX3RvUHJvcGVydHlLZXkiLCJzZXQzZEJ1aWxkaW5nQ29sb3JVcGRhdGVyIiwiX3JlZjE5Iiwic2V0QmFja2dyb3VuZENvbG9yVXBkYXRlciIsIl9yZWYyMCIsInVwbG9hZGVkRmlsZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYXAtc3R5bGUtdXBkYXRlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFRhc2ssIHt3aXRoVGFza30gZnJvbSAncmVhY3QtcGFsbS90YXNrcyc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2VzLXRvb2xraXQvY29tcGF0L2Nsb25lRGVlcCc7XG5pbXBvcnQgQ29uc29sZSBmcm9tICdnbG9iYWwvY29uc29sZSc7XG5cbi8vIFV0aWxzXG5pbXBvcnQge1xuICBnZXREZWZhdWx0TGF5ZXJHcm91cFZpc2liaWxpdHksXG4gIGdldFN0eWxlRG93bmxvYWRVcmwsXG4gIG1lcmdlTGF5ZXJHcm91cFZpc2liaWxpdHksXG4gIGVkaXRUb3BNYXBTdHlsZSxcbiAgZWRpdEJvdHRvbU1hcFN0eWxlLFxuICBnZXRTdHlsZUltYWdlSWNvbixcbiAgaXNQbGFpbk9iamVjdCxcbiAgaGV4VG9SZ2IsXG4gIGNvbG9yTWF5YmVUb1JHQixcbiAgZ2V0QXBwbGljYXRpb25Db25maWdcbn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5pbXBvcnQge2dlbmVyYXRlSGFzaElkfSBmcm9tICdAa2VwbGVyLmdsL2NvbW1vbi11dGlscyc7XG5pbXBvcnQge1xuICBERUZBVUxUX01BUF9TVFlMRVMsXG4gIERFRkFVTFRfTEFZRVJfR1JPVVBTLFxuICBERUZBVUxUX01BUEJPWF9BUElfVVJMLFxuICBOT19NQVBfSUQsXG4gIERFRkFVTFRfQkxER19DT0xPUixcbiAgREVGQVVMVF9CQUNLR1JPVU5EX0NPTE9SLFxuICBCQVNFX01BUF9CQUNLR1JPVU5EX0xBWUVSX0lEUyxcbiAgREVGQVVMVF9CQVNFX01BUF9TVFlMRVxufSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQge0FDVElPTl9UQVNLLCBMT0FEX01BUF9TVFlMRV9UQVNLfSBmcm9tICdAa2VwbGVyLmdsL3Rhc2tzJztcbmltcG9ydCB7cmdifSBmcm9tICdkMy1jb2xvcic7XG5cbmltcG9ydCB7XG4gIFJHQkNvbG9yLFxuICBMYXllckdyb3VwLFxuICBCYXNlTWFwU3R5bGUsXG4gIE1hcFN0eWxlcyxcbiAgSW5wdXRTdHlsZSxcbiAgVmlzaWJsZUxheWVyR3JvdXBzXG59IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtcbiAgQWN0aW9uVHlwZXMsXG4gIFJlY2VpdmVNYXBDb25maWdQYXlsb2FkLFxuICBLZXBsZXJHbEluaXRQYXlsb2FkLFxuICBNYXBTdHlsZUFjdGlvbnMsXG4gIGxvYWRNYXBTdHlsZXMsXG4gIGxvYWRNYXBTdHlsZUVyclxufSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuXG5leHBvcnQgdHlwZSBNYXBib3hTdHlsZVVybCA9IHN0cmluZztcblxuZXhwb3J0IHR5cGUgTWFwU3R5bGUgPSB7XG4gIHN0eWxlVHlwZTogc3RyaW5nO1xuICB2aXNpYmxlTGF5ZXJHcm91cHM6IFZpc2libGVMYXllckdyb3VwcztcbiAgdG9wTGF5ZXJHcm91cHM6IFZpc2libGVMYXllckdyb3VwcztcbiAgbWFwU3R5bGVzOiBNYXBTdHlsZXM7XG4gIC8vIHNhdmUgbWFwYm94IGFjY2VzcyB0b2tlblxuICBtYXBib3hBcGlBY2Nlc3NUb2tlbjogc3RyaW5nIHwgbnVsbDtcbiAgbWFwYm94QXBpVXJsOiBzdHJpbmc7XG4gIG1hcFN0eWxlc1JlcGxhY2VEZWZhdWx0OiBib29sZWFuO1xuICBpbnB1dFN0eWxlOiBJbnB1dFN0eWxlO1xuICB0aHJlZURCdWlsZGluZ0NvbG9yOiBSR0JDb2xvcjtcbiAgYmFja2dyb3VuZENvbG9yOiBSR0JDb2xvcjtcbiAgY3VzdG9tM0RCdWlsZGluZ0NvbG9yOiBib29sZWFuO1xuICBib3R0b21NYXBTdHlsZTogYW55O1xuICB0b3BNYXBTdHlsZTogYW55O1xuICBpbml0aWFsU3RhdGU/OiBNYXBTdHlsZTtcbiAgaXNMb2FkaW5nOiB7XG4gICAgW2tleTogc3RyaW5nXTogYm9vbGVhbjtcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0TWFwU3R5bGVzID0gKGNkblVybDogc3RyaW5nKSA9PiB7XG4gIHJldHVybiBERUZBVUxUX01BUF9TVFlMRVMucmVkdWNlKFxuICAgIChhY2N1LCBjdXJyKSA9PiAoe1xuICAgICAgLi4uYWNjdSxcbiAgICAgIFtjdXJyLmlkXToge1xuICAgICAgICAuLi5jdXJyLFxuICAgICAgICBpY29uOiBgJHtjZG5Vcmx9LyR7Y3Vyci5pY29ufWBcbiAgICAgIH1cbiAgICB9KSxcbiAgICB7fVxuICApO1xufTtcblxuY29uc3QgZ2V0RGVmYXVsdFN0YXRlID0gKCk6IE1hcFN0eWxlID0+IHtcbiAgY29uc3QgdmlzaWJsZUxheWVyR3JvdXBzID0ge307XG4gIGNvbnN0IHRvcExheWVyR3JvdXBzID0ge307XG5cbiAgcmV0dXJuIHtcbiAgICBzdHlsZVR5cGU6IERFRkFVTFRfQkFTRV9NQVBfU1RZTEUsXG4gICAgdmlzaWJsZUxheWVyR3JvdXBzLFxuICAgIHRvcExheWVyR3JvdXBzLFxuICAgIG1hcFN0eWxlczogZ2V0RGVmYXVsdE1hcFN0eWxlcyhnZXRBcHBsaWNhdGlvbkNvbmZpZygpLmNkblVybCksXG4gICAgLy8gc2F2ZSBtYXBib3ggYWNjZXNzIHRva2VuXG4gICAgbWFwYm94QXBpQWNjZXNzVG9rZW46IG51bGwsXG4gICAgbWFwYm94QXBpVXJsOiBERUZBVUxUX01BUEJPWF9BUElfVVJMLFxuICAgIG1hcFN0eWxlc1JlcGxhY2VEZWZhdWx0OiBmYWxzZSxcbiAgICBpbnB1dFN0eWxlOiBnZXRJbml0aWFsSW5wdXRTdHlsZSgpLFxuICAgIHRocmVlREJ1aWxkaW5nQ29sb3I6IGhleFRvUmdiKERFRkFVTFRfQkxER19DT0xPUiksXG4gICAgY3VzdG9tM0RCdWlsZGluZ0NvbG9yOiBmYWxzZSxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IGhleFRvUmdiKERFRkFVTFRfQkFDS0dST1VORF9DT0xPUiksXG4gICAgaXNMb2FkaW5nOiB7fSxcbiAgICBib3R0b21NYXBTdHlsZTogdW5kZWZpbmVkLFxuICAgIHRvcE1hcFN0eWxlOiB1bmRlZmluZWRcbiAgfTtcbn07XG5cbi8qKlxuICogVXBkYXRlcnMgZm9yIGBtYXBTdHlsZWAuIENhbiBiZSB1c2VkIGluIHlvdXIgcm9vdCByZWR1Y2VyIHRvIGRpcmVjdGx5IG1vZGlmeSBrZXBsZXIuZ2wncyBzdGF0ZS5cbiAqIFJlYWQgbW9yZSBhYm91dCBbVXNpbmcgdXBkYXRlcnNdKC4uL2FkdmFuY2VkLXVzYWdlL3VzaW5nLXVwZGF0ZXJzLm1kKVxuICogQHB1YmxpY1xuICogQGV4YW1wbGVcbiAqXG4gKiBpbXBvcnQga2VwbGVyR2xSZWR1Y2VyLCB7bWFwU3R5bGVVcGRhdGVyc30gZnJvbSAnQGtlcGxlci5nbC9yZWR1Y2Vycyc7XG4gKiAvLyBSb290IFJlZHVjZXJcbiAqIGNvbnN0IHJlZHVjZXJzID0gY29tYmluZVJlZHVjZXJzKHtcbiAqICBrZXBsZXJHbDoga2VwbGVyR2xSZWR1Y2VyLFxuICogIGFwcDogYXBwUmVkdWNlclxuICogfSk7XG4gKlxuICogY29uc3QgY29tcG9zZWRSZWR1Y2VyID0gKHN0YXRlLCBhY3Rpb24pID0+IHtcbiAqICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gKiAgICAvLyBjbGljayBidXR0b24gdG8gaGlkZSBsYWJlbCBmcm9tIGJhY2tncm91bmQgbWFwXG4gKiAgICBjYXNlICdDTElDS19CVVRUT04nOlxuICogICAgICByZXR1cm4ge1xuICogICAgICAgIC4uLnN0YXRlLFxuICogICAgICAgIGtlcGxlckdsOiB7XG4gKiAgICAgICAgICAuLi5zdGF0ZS5rZXBsZXJHbCxcbiAqICAgICAgICAgIGZvbzoge1xuICogICAgICAgICAgICAgLi4uc3RhdGUua2VwbGVyR2wuZm9vLFxuICogICAgICAgICAgICAgbWFwU3R5bGU6IG1hcFN0eWxlVXBkYXRlcnMubWFwQ29uZmlnQ2hhbmdlVXBkYXRlcihcbiAqICAgICAgICAgICAgICAgbWFwU3R5bGUsXG4gKiAgICAgICAgICAgICAgIHtwYXlsb2FkOiB7dmlzaWJsZUxheWVyR3JvdXBzOiB7bGFiZWw6IGZhbHNlLCByb2FkOiB0cnVlLCBiYWNrZ3JvdW5kOiB0cnVlfX19XG4gKiAgICAgICAgICAgICApXG4gKiAgICAgICAgICB9XG4gKiAgICAgICAgfVxuICogICAgICB9O1xuICogIH1cbiAqICByZXR1cm4gcmVkdWNlcnMoc3RhdGUsIGFjdGlvbik7XG4gKiB9O1xuICpcbiAqIGV4cG9ydCBkZWZhdWx0IGNvbXBvc2VkUmVkdWNlcjtcbiAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbi8vIEB0cy1pZ25vcmVcbmNvbnN0IG1hcFN0eWxlVXBkYXRlcnMgPSBudWxsO1xuLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbi8qKlxuICogRGVmYXVsdCBpbml0aWFsIGBtYXBTdHlsZWBcbiAqIEBtZW1iZXJvZiBtYXBTdHlsZVVwZGF0ZXJzXG4gKiBAY29uc3RhbnRcbiAqIEBwcm9wZXJ0eSBzdHlsZVR5cGUgLSBEZWZhdWx0OiBgJ2RhcmsnYFxuICogQHByb3BlcnR5IHZpc2libGVMYXllckdyb3VwcyAtIERlZmF1bHQ6IGB7fWBcbiAqIEBwcm9wZXJ0eSB0b3BMYXllckdyb3VwcyAtIERlZmF1bHQ6IGB7fWBcbiAqIEBwcm9wZXJ0eSBtYXBTdHlsZXMgLSBtYXBwaW5nIGZyb20gc3R5bGUga2V5IHRvIHN0eWxlIG9iamVjdFxuICogQHByb3BlcnR5IG1hcGJveEFwaUFjY2Vzc1Rva2VuIC0gRGVmYXVsdDogYG51bGxgXG4gKiBAUHJvcGVydHkgbWFwYm94QXBpVXJsIC0gRGVmYXVsdCBudWxsXG4gKiBAUHJvcGVydHkgbWFwU3R5bGVzUmVwbGFjZURlZmF1bHQgLSBEZWZhdWx0OiBgZmFsc2VgXG4gKiBAcHJvcGVydHkgaW5wdXRTdHlsZSAtIERlZmF1bHQ6IGB7fWBcbiAqIEBwcm9wZXJ0eSB0aHJlZURCdWlsZGluZ0NvbG9yIC0gRGVmYXVsdDogYFtyLCBnLCBiXWBcbiAqIEBwcm9wZXJ0eSBiYWNrZ3JvdW5kQ29sb3IgLSBEZWZhdWx0OiBgW3IsIGcsIGJdYFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgSU5JVElBTF9NQVBfU1RZTEU6IE1hcFN0eWxlID0gZ2V0RGVmYXVsdFN0YXRlKCk7XG5cbmludGVyZmFjZSBHZXRNYXBTdHlsZXNQYXJhbSB7XG4gIHN0eWxlVHlwZTogc3RyaW5nO1xuICB2aXNpYmxlTGF5ZXJHcm91cHM6IHtbaWQ6IHN0cmluZ106IExheWVyR3JvdXAgfCBib29sZWFufTtcbiAgdG9wTGF5ZXJHcm91cHM6IHtbaWQ6IHN0cmluZ106IExheWVyR3JvdXAgfCBib29sZWFufTtcbiAgbWFwU3R5bGVzOiB7W2lkOiBzdHJpbmddOiBhbnl9O1xufVxuXG4vKipcbiAqIENyZWF0ZSB0d28gbWFwIHN0eWxlcyBmcm9tIHByZXNldCBtYXAgc3R5bGUsIG9uZSBmb3IgdG9wIG1hcCBvbmUgZm9yIGJvdHRvbVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHlsZVR5cGUgLSBjdXJyZW50IG1hcCBzdHlsZVxuICogQHBhcmFtIHtPYmplY3R9IHZpc2libGVMYXllckdyb3VwcyAtIHZpc2libGUgbGF5ZXJzIG9mIGJvdHRvbSBtYXBcbiAqIEBwYXJhbSB7T2JqZWN0fSB0b3BMYXllckdyb3VwcyAtIHZpc2libGUgbGF5ZXJzIG9mIHRvcCBtYXBcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXBTdHlsZXMgLSBhIGRpY3Rpb25hcnkgb2YgYWxsIG1hcCBzdHlsZXNcbiAqIEByZXR1cm5zIHtPYmplY3R9IGJvdHRvbU1hcFN0eWxlIHwgdG9wTWFwU3R5bGUgfCBpc1Jhc3RlclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFwU3R5bGVzKHtcbiAgc3R5bGVUeXBlLFxuICB2aXNpYmxlTGF5ZXJHcm91cHMsXG4gIHRvcExheWVyR3JvdXBzLFxuICBtYXBTdHlsZXNcbn06IEdldE1hcFN0eWxlc1BhcmFtKSB7XG4gIGNvbnN0IG1hcFN0eWxlID0gbWFwU3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgLy8gc3R5bGUgbWlnaHQgbm90IGJlIGxvYWRlZCB5ZXRcbiAgaWYgKCFtYXBTdHlsZSB8fCAhbWFwU3R5bGUuc3R5bGUpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zdCBlZGl0YWJsZSA9IE9iamVjdC5rZXlzKHZpc2libGVMYXllckdyb3VwcykubGVuZ3RoO1xuXG4gIGNvbnN0IGJvdHRvbU1hcFN0eWxlID0gIWVkaXRhYmxlXG4gICAgPyBtYXBTdHlsZS5zdHlsZVxuICAgIDogZWRpdEJvdHRvbU1hcFN0eWxlKHtcbiAgICAgICAgaWQ6IHN0eWxlVHlwZSxcbiAgICAgICAgbWFwU3R5bGUsXG4gICAgICAgIHZpc2libGVMYXllckdyb3Vwc1xuICAgICAgfSk7XG5cbiAgY29uc3QgaGFzVG9wTGF5ZXIgPSBlZGl0YWJsZSA+IDAgJiYgT2JqZWN0LnZhbHVlcyh0b3BMYXllckdyb3Vwcykuc29tZSh2ID0+IHYpO1xuXG4gIC8vIG11dGUgdG9wIGxheWVyIGlmIG5vdCB2aXNpYmxlIGluIGJvdHRvbSBsYXllclxuICBjb25zdCB0b3BMYXllcnMgPVxuICAgIGhhc1RvcExheWVyICYmXG4gICAgT2JqZWN0LmtleXModG9wTGF5ZXJHcm91cHMpLnJlZHVjZShcbiAgICAgIChhY2N1LCBrZXkpID0+ICh7XG4gICAgICAgIC4uLmFjY3UsXG4gICAgICAgIFtrZXldOiB0b3BMYXllckdyb3Vwc1trZXldICYmIHZpc2libGVMYXllckdyb3Vwc1trZXldXG4gICAgICB9KSxcbiAgICAgIHt9IGFzIHtbaWQ6IHN0cmluZ106IExheWVyR3JvdXAgfCBib29sZWFufVxuICAgICk7XG5cbiAgY29uc3QgdG9wTWFwU3R5bGUgPSBoYXNUb3BMYXllclxuICAgID8gZWRpdFRvcE1hcFN0eWxlKHtcbiAgICAgICAgaWQ6IHN0eWxlVHlwZSxcbiAgICAgICAgbWFwU3R5bGUsXG4gICAgICAgIHZpc2libGVMYXllckdyb3VwczogdG9wTGF5ZXJzXG4gICAgICB9KVxuICAgIDogbnVsbDtcblxuICByZXR1cm4ge2JvdHRvbU1hcFN0eWxlLCB0b3BNYXBTdHlsZSwgZWRpdGFibGV9O1xufVxuXG5mdW5jdGlvbiBmaW5kTGF5ZXJGaWxsQ29sb3IobGF5ZXIpIHtcbiAgcmV0dXJuIGxheWVyICYmIGxheWVyLnBhaW50ICYmIGxheWVyLnBhaW50WydiYWNrZ3JvdW5kLWNvbG9yJ107XG59XG5cbi8vIG5lZWQgdG8gYmUgY2FyZWZ1bCBiZWNhdXNlIHNvbWUgYmFzZW1hcCBsYXllci5wYWludFsnYmFja2dyb3VuZC1jb2xvciddIHZhbHVlcyBtYXkgYmUgYW4gaW50ZXJwb2xhdGUgYXJyYXkgZXhwcmVzc2lvbiBpbnN0ZWFkIG9mIGEgY29sb3Igc3RyaW5nXG4vLyBodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy9sYXllcnMvI3BhaW50LWJhY2tncm91bmQtYmFja2dyb3VuZC1jb2xvclxuLy8gaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvZXhwcmVzc2lvbnMvI2ludGVycG9sYXRlXG5mdW5jdGlvbiBnZXRQYWludENvbG9yKGNvbG9yKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbG9yKSAmJiBjb2xvclswXSA9PT0gJ2ludGVycG9sYXRlJykge1xuICAgIC8vIGdldCBjb2xvciBvZiBmaXJzdCB6b29tIGJyZWFrXG4gICAgLy8gW1wiaW50ZXJwb2xhdGVcIiwgW1wibGluZWFyXCJdLCBbXCJ6b29tXCJdLCAxMSwgXCJoc2woMzUsIDMyJSwgOTElKVwiLCAxMywgXCJoc2woMzUsIDEyJSwgODklKVwiXVxuICAgIHJldHVybiBjb2xvcls0XTtcbiAgfVxuICByZXR1cm4gY29sb3I7XG59XG5cbmZ1bmN0aW9uIGdldDNEQnVpbGRpbmdDb2xvcihzdHlsZSk6IFJHQkNvbG9yIHtcbiAgLy8gc2V0IGJ1aWxkaW5nIGNvbG9yIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLlxuICBpZiAoIXN0eWxlLnN0eWxlKSB7XG4gICAgcmV0dXJuIGhleFRvUmdiKERFRkFVTFRfQkxER19DT0xPUik7XG4gIH1cblxuICBjb25zdCBiYWNrZ3JvdW5kTGF5ZXIgPSAoc3R5bGUuc3R5bGUubGF5ZXJzIHx8IFtdKS5maW5kKCh7aWR9KSA9PiBpZCA9PT0gJ2JhY2tncm91bmQnKTtcblxuICBjb25zdCBidWlsZGluZ0xheWVyID0gKHN0eWxlLnN0eWxlLmxheWVycyB8fCBbXSkuZmluZCgoe2lkfSkgPT4gaWQubWF0Y2goL2J1aWxkaW5nLykpO1xuXG4gIGNvbnN0IGJ1aWxkaW5nQ29sb3IgPVxuICAgIGZpbmRMYXllckZpbGxDb2xvcihidWlsZGluZ0xheWVyKSB8fCBmaW5kTGF5ZXJGaWxsQ29sb3IoYmFja2dyb3VuZExheWVyKSB8fCBERUZBVUxUX0JMREdfQ09MT1I7XG5cbiAgLy8gYnJpZ2h0ZW4gb3IgZGFya2VuIGJ1aWxkaW5nIGJhc2VkIG9uIHN0eWxlXG4gIGNvbnN0IG9wZXJhdGlvbiA9IHN0eWxlLmlkLm1hdGNoKC8oPz0oZGFya3xuaWdodCkpLykgPyAnYnJpZ2h0ZXInIDogJ2Rhcmtlcic7XG5cbiAgY29uc3QgYWxwaGEgPSAwLjI7XG4gIGNvbnN0IHJnYk9iaiA9IHJnYihidWlsZGluZ0NvbG9yKVtvcGVyYXRpb25dKFthbHBoYV0pO1xuICByZXR1cm4gW3JnYk9iai5yLCByZ2JPYmouZywgcmdiT2JqLmJdO1xufVxuXG5mdW5jdGlvbiBnZXRCYWNrZ3JvdW5kQ29sb3JGcm9tU3R5bGVCYXNlTGF5ZXIoXG4gIHN0eWxlOiBCYXNlTWFwU3R5bGUsXG4gIGJhY2t1cEJhY2tncm91bmRDb2xvcjogUkdCQ29sb3Jcbik6IFJHQkNvbG9yIHtcbiAgaWYgKCFzdHlsZS5zdHlsZSkge1xuICAgIHJldHVybiBjb2xvck1heWJlVG9SR0IoYmFja3VwQmFja2dyb3VuZENvbG9yKSB8fCBiYWNrdXBCYWNrZ3JvdW5kQ29sb3I7XG4gIH1cblxuICAvLyBAdHMtZXhwZWN0LWVycm9yIHN0eWxlLnN0eWxlIG5vdCB0eXBlZFxuICBjb25zdCBiYXNlTGF5ZXIgPSAoc3R5bGUuc3R5bGUubGF5ZXJzIHx8IFtdKS5maW5kKCh7aWR9KSA9PlxuICAgIEJBU0VfTUFQX0JBQ0tHUk9VTkRfTEFZRVJfSURTLmluY2x1ZGVzKGlkKVxuICApO1xuXG4gIGNvbnN0IGJhY2tncm91bmRDb2xvck9mQmFzZUxheWVyID0gZ2V0UGFpbnRDb2xvcihmaW5kTGF5ZXJGaWxsQ29sb3IoYmFzZUxheWVyKSk7XG5cbiAgY29uc3QgbmV3QmFja2dyb3VuZENvbG9yID1cbiAgICB0eXBlb2YgYmFja2dyb3VuZENvbG9yT2ZCYXNlTGF5ZXIgPT09ICdzdHJpbmcnXG4gICAgICA/IGJhY2tncm91bmRDb2xvck9mQmFzZUxheWVyXG4gICAgICA6IGJhY2t1cEJhY2tncm91bmRDb2xvcjtcblxuICBjb25zdCBuZXdCYWNrZ3JvdW5kQ29sb3JBc1JHQkFycmF5ID0gY29sb3JNYXliZVRvUkdCKG5ld0JhY2tncm91bmRDb2xvcilcbiAgICAvLyBpZiBuZXdCYWNrZ3JvdW5kQ29sb3Igd2FzIGluIHN0cmluZyBIU0wgZm9ybWF0IGl0IGNhbiBpbnRyb2R1Y2UgUkdCIG51bWJlcnMgd2l0aCBkZWNpbWFscyxcbiAgICAvLyB3aGljaCBtYXkgcmVuZGVyIHRoZSBiYWNrZ3JvdW5kLWNvbG9yIENTUyBvZiB0aGUgPFN0eWxlZE1hcD4gY29udGFpbmVyIGluY29ycmVjdGx5IHdoZW4gdXNpbmcgb3VyIG93biBjb2xvciB1dGlscyBgcmdiVG9IZXgoKWBcbiAgICAvLyBzbyB3ZSBhdHRlbXB0IHRvIHJvdW5kIHRvIG5lYXJlc3QgaW50ZWdlciBoZXJlXG4gICAgPy5tYXAoY2hhbm5lbE51bWJlciA9PiBNYXRoLnJvdW5kKGNoYW5uZWxOdW1iZXIpKSBhcyBSR0JDb2xvciB8IG51bGw7XG5cbiAgcmV0dXJuIG5ld0JhY2tncm91bmRDb2xvckFzUkdCQXJyYXkgfHwgYmFja3VwQmFja2dyb3VuZENvbG9yO1xufVxuXG4vLyBkZXRlcm1pbmUgbmV3IGJhY2tncm91bmRDb2xvciBmcm9tIGVpdGhlciBwcmV2aW91cyBzdGF0ZSBiYXNlbWFwIHN0eWxlLCBwcmV2aW91cyBzdGF0ZSBiYWNrZ3JvdW5kQ29sb3IsIG9yIHRoZSBERUZBVUxUX0JBQ0tHUk9VTkRfQ09MT1JcbmZ1bmN0aW9uIGdldEJhY2tncm91bmRDb2xvcihwcmV2aW91c1N0YXRlOiBNYXBTdHlsZSwgc3R5bGVUeXBlOiBzdHJpbmcpIHtcbiAgY29uc3QgcHJldmlvdXNTdGF0ZU1hcFN0eWxlID0gcHJldmlvdXNTdGF0ZS5tYXBTdHlsZXNbcHJldmlvdXNTdGF0ZS5zdHlsZVR5cGVdO1xuICBjb25zdCBiYWNrdXBCYWNrZ3JvdW5kQ29sb3IgPSBwcmV2aW91c1N0YXRlLmJhY2tncm91bmRDb2xvciB8fCBERUZBVUxUX0JBQ0tHUk9VTkRfQ09MT1I7XG4gIGNvbnN0IGJhY2tncm91bmRDb2xvciA9XG4gICAgc3R5bGVUeXBlID09PSBOT19NQVBfSURcbiAgICAgID8gLy8gaWYgdGhlIHN0eWxlIGhhcyBzd2l0Y2hlZCB0byB0aGUgXCJubyBiYXNlbWFwXCIgc3R5bGUsXG4gICAgICAgIC8vIGF0dGVtcHQgdG8gZGV0ZWN0IGJhY2tncm91bmRDb2xvciBvZiB0aGUgcHJldmlvdXMgYmFzZW1hcCBpZiBpdCB3YXMgYSBtYXBib3ggYmFzZW1hcFxuICAgICAgICAvLyBhbmQgc2V0IGl0IGFzIHRoZSBcIm5vIGJhc2VtYXBcIiBiYWNrZ3JvdW5kQ29sb3JcbiAgICAgICAgZ2V0QmFja2dyb3VuZENvbG9yRnJvbVN0eWxlQmFzZUxheWVyKHByZXZpb3VzU3RhdGVNYXBTdHlsZSwgYmFja3VwQmFja2dyb3VuZENvbG9yKVxuICAgICAgOiAvLyBvdGhlcndpc2UgbGVhdmUgaXQgYWxvbmUgYW5kIHJlbHkgb24gdGhlIHByZXZpb3VzIHN0YXRlJ3MgcHJlZXhpc3RpbmcgYmFja2dyb3VuZENvbG9yXG4gICAgICAgIC8vIG9yIERFRkFVTFRfQkFDS0dST1VORF9DT0xPUiBhcyBhIGxhc3QgcmVzb3J0XG4gICAgICAgIGJhY2t1cEJhY2tncm91bmRDb2xvcjtcblxuICByZXR1cm4gYmFja2dyb3VuZENvbG9yO1xufVxuXG5mdW5jdGlvbiBnZXRMYXllckdyb3Vwc0Zyb21TdHlsZShzdHlsZSkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShzdHlsZT8ubGF5ZXJzKVxuICAgID8gREVGQVVMVF9MQVlFUl9HUk9VUFMuZmlsdGVyKGxnID0+IHN0eWxlLmxheWVycy5maWx0ZXIobGcuZmlsdGVyKS5sZW5ndGgpXG4gICAgOiBbXTtcbn1cblxuLy8gVXBkYXRlcnNcblxuLyoqXG4gKiBAbWVtYmVyb2YgbWFwU3R5bGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVxdWVzdE1hcFN0eWxlc1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBNYXBTdHlsZSxcbiAge3BheWxvYWQ6IHttYXBTdHlsZXMsIG9uU3VjY2Vzc319OiBNYXBTdHlsZUFjdGlvbnMuUmVxdWVzdE1hcFN0eWxlc1VwZGF0ZXJBY3Rpb25cbik6IE1hcFN0eWxlID0+IHtcbiAgY29uc3QgdG9Mb2FkID0gT2JqZWN0LmtleXMobWFwU3R5bGVzKS5yZWR1Y2UoXG4gICAgKGFjY3UsIGlkKSA9PiAoe1xuICAgICAgLi4uYWNjdSxcbiAgICAgIC4uLighc3RhdGUuaXNMb2FkaW5nW2lkXSA/IHtbaWRdOiBtYXBTdHlsZXNbaWRdfSA6IHt9KVxuICAgIH0pLFxuICAgIHt9XG4gICk7XG4gIGNvbnN0IGxvYWRNYXBTdHlsZVRhc2tzID0gZ2V0TG9hZE1hcFN0eWxlVGFza3MoXG4gICAgdG9Mb2FkLFxuICAgIHN0YXRlLm1hcGJveEFwaUFjY2Vzc1Rva2VuLFxuICAgIHN0YXRlLm1hcGJveEFwaVVybCxcbiAgICBvblN1Y2Nlc3NcbiAgKTtcblxuICBjb25zdCBpc0xvYWRpbmcgPSBPYmplY3Qua2V5cyh0b0xvYWQpLnJlZHVjZShcbiAgICAoYWNjdSwga2V5KSA9PiAoe1xuICAgICAgLi4uYWNjdSxcbiAgICAgIFtrZXldOiB0cnVlXG4gICAgfSksXG4gICAge31cbiAgKTtcbiAgY29uc3QgbmV4dFN0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGlzTG9hZGluZ1xuICB9O1xuICByZXR1cm4gd2l0aFRhc2sobmV4dFN0YXRlLCBsb2FkTWFwU3R5bGVUYXNrcyk7XG59O1xuXG4vKipcbiAqIFByb3BhZ2F0ZSBgbWFwU3R5bGVgIHJlZHVjZXIgd2l0aCBgbWFwYm94QXBpQWNjZXNzVG9rZW5gIGFuZCBgbWFwU3R5bGVzUmVwbGFjZURlZmF1bHRgLlxuICogaWYgbWFwU3R5bGVzUmVwbGFjZURlZmF1bHQgaXMgdHJ1ZSBtYXBTdHlsZXMgaXMgZW1wdGllZDsgbG9hZE1hcFN0eWxlc1VwZGF0ZXIoKSB3aWxsXG4gKiBwb3B1bGF0ZSBtYXBTdHlsZXMuXG4gKlxuICogQG1lbWJlcm9mIG1hcFN0eWxlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGluaXRNYXBTdHlsZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBNYXBTdHlsZSxcbiAge1xuICAgIHBheWxvYWQgPSB7fVxuICB9OiB7XG4gICAgdHlwZT86IHR5cGVvZiBBY3Rpb25UeXBlcy5JTklUO1xuICAgIHBheWxvYWQ6IEtlcGxlckdsSW5pdFBheWxvYWQ7XG4gIH1cbik6IE1hcFN0eWxlID0+ICh7XG4gIC4uLnN0YXRlLFxuICAvLyBzYXZlIG1hcGJveCBhY2Nlc3MgdG9rZW4gdG8gbWFwIHN0eWxlIHN0YXRlXG4gIG1hcGJveEFwaUFjY2Vzc1Rva2VuOiBwYXlsb2FkLm1hcGJveEFwaUFjY2Vzc1Rva2VuIHx8IHN0YXRlLm1hcGJveEFwaUFjY2Vzc1Rva2VuLFxuICBtYXBib3hBcGlVcmw6IHBheWxvYWQubWFwYm94QXBpVXJsIHx8IHN0YXRlLm1hcGJveEFwaVVybCxcbiAgbWFwU3R5bGVzOiAhcGF5bG9hZC5tYXBTdHlsZXNSZXBsYWNlRGVmYXVsdCA/IHN0YXRlLm1hcFN0eWxlcyA6IHt9LFxuICBtYXBTdHlsZXNSZXBsYWNlRGVmYXVsdDogcGF5bG9hZC5tYXBTdHlsZXNSZXBsYWNlRGVmYXVsdCB8fCBmYWxzZVxufSk7XG4vLyB9KTtcblxuLyoqXG4gKiBVcGRhdGUgYHZpc2libGVMYXllckdyb3Vwc2B0byBjaGFuZ2UgbGF5ZXIgZ3JvdXAgdmlzaWJpbGl0eVxuICogQG1lbWJlcm9mIG1hcFN0eWxlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IG1hcENvbmZpZ0NoYW5nZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBNYXBTdHlsZSxcbiAgYWN0aW9uOiBNYXBTdHlsZUFjdGlvbnMuTWFwQ29uZmlnQ2hhbmdlVXBkYXRlckFjdGlvblxuKTogTWFwU3R5bGUgPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIC4uLmFjdGlvbi5wYXlsb2FkLFxuICAgIC4uLmdldE1hcFN0eWxlcyh7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIC4uLmFjdGlvbi5wYXlsb2FkXG4gICAgfSlcbiAgfTtcbn07XG5cbmNvbnN0IGhhc1N0eWxlT2JqZWN0ID0gc3R5bGUgPT4gaXNQbGFpbk9iamVjdChzdHlsZT8uc3R5bGUpO1xuXG4vKipcbiAqIENoYW5nZSB0byBhbm90aGVyIG1hcCBzdHlsZS4gVGhlIHNlbGVjdGVkIHN0eWxlIHNob3VsZCBhbHJlYWR5IGJlZW4gbG9hZGVkIGludG8gYG1hcFN0eWxlLm1hcFN0eWxlc2BcbiAqIEBtZW1iZXJvZiBtYXBTdHlsZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBtYXBTdHlsZUNoYW5nZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBNYXBTdHlsZSxcbiAge3BheWxvYWQ6IHtzdHlsZVR5cGUsIG9uU3VjY2Vzc319OiBNYXBTdHlsZUFjdGlvbnMuTWFwU3R5bGVDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBNYXBTdHlsZSA9PiB7XG4gIGlmIChcbiAgICAvLyB3ZSBtaWdodCBub3QgaGF2ZSByZWNlaXZlZCB0aGUgc3R5bGUgeWV0XG4gICAgIXN0YXRlLm1hcFN0eWxlc1tzdHlsZVR5cGVdIHx8XG4gICAgLy8gb3IgaWYgaXQgaXMgYSBtYW5hZ2VkIGN1c3RvbSBzdHlsZSBhc3NldFxuICAgIC8vIGFuZCBpZiBpdCBoYXMgbm90IGJlZW4gaHlkcmF0ZWQgd2l0aCBVUkwgaW5mbyB5ZXQgKGR1cmluZyBhcHAgZmlyc3QgaW5pdGlhbGl6YXRpb24pXG4gICAgLy8gYW5kIGl0IGRvZXMgbm90IGhhdmUgYSBzdHlsZSBvYmplY3QgKGR1cmluZyBhZGRpbmcgYSBjdXN0b20gc3R5bGUpXG4gICAgKHN0YXRlLm1hcFN0eWxlc1tzdHlsZVR5cGVdPy5jdXN0b20gPT09ICdNQU5BR0VEJyAmJlxuICAgICAgIXN0YXRlLm1hcFN0eWxlc1tzdHlsZVR5cGVdPy51cmwgJiZcbiAgICAgICFoYXNTdHlsZU9iamVjdChzdGF0ZS5tYXBTdHlsZXNbc3R5bGVUeXBlXSkpXG4gICkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGlmICghaGFzU3R5bGVPYmplY3Qoc3RhdGUubWFwU3R5bGVzW3N0eWxlVHlwZV0pKSB7XG4gICAgLy8gc3R5bGUgaGFzbid0IGxvYWRlZCB5ZXRcbiAgICByZXR1cm4gcmVxdWVzdE1hcFN0eWxlc1VwZGF0ZXIoXG4gICAgICB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBzdHlsZVR5cGVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICBtYXBTdHlsZXM6IHtcbiAgICAgICAgICAgIFtzdHlsZVR5cGVdOiBzdGF0ZS5tYXBTdHlsZXNbc3R5bGVUeXBlXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25TdWNjZXNzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgY29uc3QgZGVmYXVsdExHVmlzaWJpbGl0eSA9IGdldERlZmF1bHRMYXllckdyb3VwVmlzaWJpbGl0eShzdGF0ZS5tYXBTdHlsZXNbc3R5bGVUeXBlXSk7XG5cbiAgY29uc3QgdmlzaWJsZUxheWVyR3JvdXBzID0gbWVyZ2VMYXllckdyb3VwVmlzaWJpbGl0eShcbiAgICBkZWZhdWx0TEdWaXNpYmlsaXR5LFxuICAgIHN0YXRlLnZpc2libGVMYXllckdyb3Vwc1xuICApO1xuXG4gIGNvbnN0IHRocmVlREJ1aWxkaW5nQ29sb3I6IFJHQkNvbG9yID0gc3RhdGUuY3VzdG9tM0RCdWlsZGluZ0NvbG9yXG4gICAgPyBzdGF0ZS50aHJlZURCdWlsZGluZ0NvbG9yXG4gICAgOiBnZXQzREJ1aWxkaW5nQ29sb3Ioc3RhdGUubWFwU3R5bGVzW3N0eWxlVHlwZV0pO1xuXG4gIC8vIGRldGVybWluZSBuZXcgYmFja2dyb3VuZENvbG9yIGZyb20gZWl0aGVyIHByZXZpb3VzIHN0YXRlIGJhc2VtYXAgc3R5bGUsIHByZXZpb3VzIHN0YXRlIGJhY2tncm91bmRDb2xvciwgb3IgdGhlIERFRkFVTFRfQkFDS0dST1VORF9DT0xPUlxuICBjb25zdCBiYWNrZ3JvdW5kQ29sb3IgPSBnZXRCYWNrZ3JvdW5kQ29sb3Ioc3RhdGUsIHN0eWxlVHlwZSk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBzdHlsZVR5cGUsXG4gICAgdmlzaWJsZUxheWVyR3JvdXBzLFxuICAgIHRocmVlREJ1aWxkaW5nQ29sb3IsXG4gICAgYmFja2dyb3VuZENvbG9yLFxuICAgIC4uLmdldE1hcFN0eWxlcyh7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIHZpc2libGVMYXllckdyb3VwcyxcbiAgICAgIHN0eWxlVHlwZVxuICAgIH0pXG4gIH07XG59O1xuXG4vKipcbiAqIENhbGxiYWNrIHdoZW4gbG9hZCBtYXAgc3R5bGUgc3VjY2Vzc1xuICogQG1lbWJlcm9mIG1hcFN0eWxlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGxvYWRNYXBTdHlsZXNVcGRhdGVyID0gKFxuICBzdGF0ZTogTWFwU3R5bGUsXG4gIGFjdGlvbjogTWFwU3R5bGVBY3Rpb25zLkxvYWRNYXBTdHlsZXNVcGRhdGVyQWN0aW9uXG4pOiBNYXBTdHlsZSA9PiB7XG4gIGNvbnN0IHtuZXdTdHlsZXMsIG9uU3VjY2Vzc30gPSBhY3Rpb24ucGF5bG9hZCB8fCB7fTtcblxuICBjb25zdCBhZGRMYXllckdyb3VwcyA9IE9iamVjdC5rZXlzKG5ld1N0eWxlcykucmVkdWNlKFxuICAgIChhY2N1LCBpZCkgPT4gKHtcbiAgICAgIC4uLmFjY3UsXG4gICAgICBbaWRdOiB7XG4gICAgICAgIC4uLm5ld1N0eWxlc1tpZF0sXG4gICAgICAgIGxheWVyR3JvdXBzOiBuZXdTdHlsZXNbaWRdLmxheWVyR3JvdXBzIHx8IGdldExheWVyR3JvdXBzRnJvbVN0eWxlKG5ld1N0eWxlc1tpZF0uc3R5bGUpXG4gICAgICB9XG4gICAgfSksXG4gICAge31cbiAgKTtcbiAgLy8gcmVzZXQgaXNMb2FkaW5nXG4gIGNvbnN0IGlzTG9hZGluZyA9IE9iamVjdC5rZXlzKHN0YXRlLmlzTG9hZGluZykucmVkdWNlKFxuICAgIChhY2N1LCBrZXkpID0+ICh7XG4gICAgICAuLi5hY2N1LFxuICAgICAgLi4uKHN0YXRlLmlzTG9hZGluZ1trZXldICYmIGhhc1N0eWxlT2JqZWN0KG5ld1N0eWxlc1trZXldKVxuICAgICAgICA/IHtba2V5XTogZmFsc2V9XG4gICAgICAgIDoge1trZXldOiBzdGF0ZS5pc0xvYWRpbmdba2V5XX0pXG4gICAgfSksXG4gICAge31cbiAgKTtcbiAgLy8gYWRkIG5ldyBzdHlsZXMgdG8gc3RhdGVcbiAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgaXNMb2FkaW5nLFxuICAgIG1hcFN0eWxlczoge1xuICAgICAgLi4uc3RhdGUubWFwU3R5bGVzLFxuICAgICAgLi4uYWRkTGF5ZXJHcm91cHNcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgdGFza3MgPSBjcmVhdGVBY3Rpb25UYXNrKG9uU3VjY2Vzcywge3N0eWxlVHlwZTogc3RhdGUuc3R5bGVUeXBlfSk7XG5cbiAgY29uc3QgbmV4dFN0YXRlID0gbmV3U3R5bGVzW3N0YXRlLnN0eWxlVHlwZV1cbiAgICA/IG1hcFN0eWxlQ2hhbmdlVXBkYXRlcihuZXdTdGF0ZSwge3BheWxvYWQ6IHtzdHlsZVR5cGU6IHN0YXRlLnN0eWxlVHlwZX19KVxuICAgIDogbmV3U3RhdGU7XG5cbiAgcmV0dXJuIHRhc2tzID8gd2l0aFRhc2sobmV4dFN0YXRlLCB0YXNrcykgOiBuZXh0U3RhdGU7XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVBY3Rpb25UYXNrKGFjdGlvbiwgcGF5bG9hZCkge1xuICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBBQ1RJT05fVEFTSygpLm1hcCgoKSA9PiBhY3Rpb24ocGF5bG9hZCkpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogQ2FsbGJhY2sgd2hlbiBsb2FkIG1hcCBzdHlsZSBlcnJvclxuICogQG1lbWJlcm9mIG1hcFN0eWxlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuLy8gZG8gbm90aGluZyBmb3Igbm93LCBpZiBkaWRuJ3QgbG9hZCwgc2tpcCBpdFxuZXhwb3J0IGNvbnN0IGxvYWRNYXBTdHlsZUVyclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBNYXBTdHlsZSxcbiAge3BheWxvYWQ6IHtpZHMsIGVycm9yfX06IE1hcFN0eWxlQWN0aW9ucy5Mb2FkTWFwU3R5bGVFcnJVcGRhdGVyQWN0aW9uXG4pOiBNYXBTdHlsZSA9PiB7XG4gIENvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAvLyByZXNldCBpc0xvYWRpbmdcbiAgY29uc3QgaXNMb2FkaW5nID0gT2JqZWN0LmtleXMoc3RhdGUuaXNMb2FkaW5nKS5yZWR1Y2UoXG4gICAgKGFjY3UsIGtleSkgPT4gKHtcbiAgICAgIC4uLmFjY3UsXG4gICAgICAuLi4oc3RhdGUuaXNMb2FkaW5nW2tleV0gJiYgKGlkcyB8fCBbXSkuaW5jbHVkZXMoa2V5KVxuICAgICAgICA/IHtba2V5XTogZmFsc2V9XG4gICAgICAgIDoge1trZXldOiBzdGF0ZS5pc0xvYWRpbmdba2V5XX0pXG4gICAgfSksXG4gICAge31cbiAgKTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGlzTG9hZGluZ1xuICB9O1xufTtcblxuLyoqXG4gKiBMb2FkIG1hcCBzdHlsZSBvYmplY3Qgd2hlbiBwYXNzIGluIHNhdmVkIG1hcCBjb25maWdcbiAqIEBtZW1iZXJvZiBtYXBTdHlsZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYG1hcFN0eWxlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkIHNhdmVkIG1hcCBjb25maWcgYHttYXBTdHlsZSwgdmlzU3RhdGUsIG1hcFN0YXRlfWBcbiAqIEByZXR1cm5zIG5leHRTdGF0ZSBvciBgcmVhY3QtcGFtYCB0YXNrcyB0byBsb2FkIG1hcCBzdHlsZSBvYmplY3RcbiAqL1xuZXhwb3J0IGNvbnN0IHJlY2VpdmVNYXBDb25maWdVcGRhdGVyID0gKFxuICBzdGF0ZTogTWFwU3R5bGUsXG4gIHtcbiAgICBwYXlsb2FkOiB7Y29uZmlnfVxuICB9OiB7XG4gICAgdHlwZT86IHR5cGVvZiBBY3Rpb25UeXBlcy5SRUNFSVZFX01BUF9DT05GSUc7XG4gICAgcGF5bG9hZDogUmVjZWl2ZU1hcENvbmZpZ1BheWxvYWQ7XG4gIH1cbik6IE1hcFN0eWxlID0+IHtcbiAgY29uc3Qge21hcFN0eWxlfSA9IGNvbmZpZyB8fCB7fTtcblxuICBpZiAoIW1hcFN0eWxlKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgLy8gbWVyZ2UgZGVmYXVsdCBtYXBTdHlsZXNcbiAgY29uc3QgbWVyZ2VkID0gbWFwU3R5bGUubWFwU3R5bGVzXG4gICAgPyB7XG4gICAgICAgIC4uLm1hcFN0eWxlLFxuICAgICAgICBtYXBTdHlsZXM6IHtcbiAgICAgICAgICAuLi5tYXBTdHlsZS5tYXBTdHlsZXMsXG4gICAgICAgICAgLi4uc3RhdGUubWFwU3R5bGVzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA6IG1hcFN0eWxlO1xuXG4gIC8vIHNldCBjdXN0b20zREJ1aWxkaW5nQ29sb3I6IHRydWUgaWYgbWFwU3R5bGUgY29udGFpbnMgdGhyZWVEQnVpbGRpbmdDb2xvclxuICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gIG1lcmdlZC5jdXN0b20zREJ1aWxkaW5nQ29sb3IgPVxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBCb29sZWFuKG1hcFN0eWxlLnRocmVlREJ1aWxkaW5nQ29sb3IpIHx8IG1lcmdlZC5jdXN0b20zREJ1aWxkaW5nQ29sb3I7XG4gIGNvbnN0IG5ld1N0YXRlID0gbWFwQ29uZmlnQ2hhbmdlVXBkYXRlcihzdGF0ZSwge3BheWxvYWQ6IG1lcmdlZH0pO1xuXG4gIHJldHVybiBtYXBTdHlsZUNoYW5nZVVwZGF0ZXIobmV3U3RhdGUsIHtwYXlsb2FkOiB7c3R5bGVUeXBlOiBuZXdTdGF0ZS5zdHlsZVR5cGV9fSk7XG59O1xuXG5mdW5jdGlvbiBnZXRMb2FkTWFwU3R5bGVUYXNrcyhtYXBTdHlsZXMsIG1hcGJveEFwaUFjY2Vzc1Rva2VuLCBtYXBib3hBcGlVcmwsIG9uU3VjY2Vzcykge1xuICByZXR1cm4gW1xuICAgIFRhc2suYWxsKFxuICAgICAgT2JqZWN0LnZhbHVlcyhtYXBTdHlsZXMpXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgLm1hcCgoe2lkLCB1cmwsIGFjY2Vzc1Rva2VufSkgPT4gKHtcbiAgICAgICAgICBpZCxcbiAgICAgICAgICB1cmw6IGdldFN0eWxlRG93bmxvYWRVcmwodXJsLCBhY2Nlc3NUb2tlbiB8fCBtYXBib3hBcGlBY2Nlc3NUb2tlbiwgbWFwYm94QXBpVXJsKVxuICAgICAgICB9KSlcbiAgICAgICAgLm1hcChMT0FEX01BUF9TVFlMRV9UQVNLKVxuICAgICkuYmltYXAoXG4gICAgICAvLyBzdWNjZXNzXG4gICAgICByZXN1bHRzID0+XG4gICAgICAgIGxvYWRNYXBTdHlsZXMoXG4gICAgICAgICAgcmVzdWx0cy5yZWR1Y2UoXG4gICAgICAgICAgICAoYWNjdSwge2lkLCBzdHlsZX0pID0+ICh7XG4gICAgICAgICAgICAgIC4uLmFjY3UsXG4gICAgICAgICAgICAgIFtpZF06IHtcbiAgICAgICAgICAgICAgICAuLi5tYXBTdHlsZXNbaWRdLFxuICAgICAgICAgICAgICAgIHN0eWxlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAge31cbiAgICAgICAgICApLFxuICAgICAgICAgIG9uU3VjY2Vzc1xuICAgICAgICApLFxuICAgICAgLy8gZXJyb3JcbiAgICAgIGVyciA9PiBsb2FkTWFwU3R5bGVFcnIoT2JqZWN0LmtleXMobWFwU3R5bGVzKSwgZXJyKVxuICAgIClcbiAgXTtcbn1cbi8qKlxuICogUmVzZXQgbWFwIHN0eWxlIGNvbmZpZyB0byBpbml0aWFsIHN0YXRlXG4gKiBAbWVtYmVyb2YgbWFwU3R5bGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGBtYXBTdHlsZWBcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVzZXRNYXBDb25maWdNYXBTdHlsZVVwZGF0ZXIgPSAoc3RhdGU6IE1hcFN0eWxlKTogTWFwU3R5bGUgPT4ge1xuICBjb25zdCBlbXB0eUNvbmZpZyA9IHtcbiAgICAuLi5JTklUSUFMX01BUF9TVFlMRSxcbiAgICBtYXBib3hBcGlBY2Nlc3NUb2tlbjogc3RhdGUubWFwYm94QXBpQWNjZXNzVG9rZW4sXG4gICAgbWFwYm94QXBpVXJsOiBzdGF0ZS5tYXBib3hBcGlVcmwsXG4gICAgbWFwU3R5bGVzUmVwbGFjZURlZmF1bHQ6IHN0YXRlLm1hcFN0eWxlc1JlcGxhY2VEZWZhdWx0LFxuICAgIC4uLnN0YXRlLmluaXRpYWxTdGF0ZSxcbiAgICBtYXBTdHlsZXM6IHN0YXRlLm1hcFN0eWxlcyxcbiAgICBpbml0aWFsU3RhdGU6IHN0YXRlLmluaXRpYWxTdGF0ZVxuICB9O1xuXG4gIHJldHVybiBtYXBTdHlsZUNoYW5nZVVwZGF0ZXIoZW1wdHlDb25maWcsIHtwYXlsb2FkOiB7c3R5bGVUeXBlOiBlbXB0eUNvbmZpZy5zdHlsZVR5cGV9fSk7XG59O1xuXG4vKipcbiAqIENhbGxiYWNrIHdoZW4gYSBjdXN0b20gbWFwIHN0eWxlIG9iamVjdCBpcyByZWNlaXZlZFxuICogQG1lbWJlcm9mIG1hcFN0eWxlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGxvYWRDdXN0b21NYXBTdHlsZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBNYXBTdHlsZSxcbiAge3BheWxvYWQ6IHtpY29uLCBzdHlsZSwgZXJyb3J9fTogTWFwU3R5bGVBY3Rpb25zLkxvYWRDdXN0b21NYXBTdHlsZVVwZGF0ZXJBY3Rpb25cbik6IE1hcFN0eWxlID0+ICh7XG4gIC4uLnN0YXRlLFxuICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gIGlucHV0U3R5bGU6IHtcbiAgICAuLi5zdGF0ZS5pbnB1dFN0eWxlLFxuICAgIC8vIHN0eWxlIGpzb24gYW5kIGljb24gd2lsbCBsb2FkIGFzeW5jaHJvbm91c2x5XG4gICAgLi4uKHN0eWxlXG4gICAgICA/IHtcbiAgICAgICAgICBpZDpcbiAgICAgICAgICAgIHN0YXRlLmlucHV0U3R5bGUuY3VzdG9tID09PSAnTUFOQUdFRCdcbiAgICAgICAgICAgICAgPyBzdGF0ZS5pbnB1dFN0eWxlLmlkIC8vIGN1c3RvbSBNQU5BR0VEIHR5cGVcbiAgICAgICAgICAgICAgOiAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICAgICAgc3R5bGUuaWQgfHwgZ2VuZXJhdGVIYXNoSWQoKSwgLy8gY3VzdG9tIExPQ0FMIHR5cGVcbiAgICAgICAgICAvLyBtYWtlIGEgY29weSBvZiB0aGUgc3R5bGUgb2JqZWN0XG4gICAgICAgICAgc3R5bGU6IGNsb25lRGVlcChzdHlsZSksXG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgIGxhYmVsOiBzdGF0ZS5pbnB1dFN0eWxlLmxhYmVsIHx8IHN0eWxlLm5hbWUsXG4gICAgICAgICAgLy8gZ2F0aGVyaW5nIGxheWVyIGdyb3VwIGluZm8gZnJvbSBzdHlsZSBqc29uXG4gICAgICAgICAgbGF5ZXJHcm91cHM6IGdldExheWVyR3JvdXBzRnJvbVN0eWxlKHN0eWxlKVxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgICAuLi4oaWNvbiA/IHtpY29ufSA6IHt9KSxcbiAgICAuLi4oZXJyb3IgIT09IHVuZGVmaW5lZCA/IHtlcnJvcn0gOiB7fSlcbiAgfVxufSk7XG5cbi8qKlxuICogSW5wdXQgYSBjdXN0b20gbWFwIHN0eWxlIG9iamVjdFxuICogQG1lbWJlcm9mIG1hcFN0eWxlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGlucHV0TWFwU3R5bGVVcGRhdGVyID0gKFxuICBzdGF0ZTogTWFwU3R5bGUsXG4gIHtwYXlsb2FkOiB7aW5wdXRTdHlsZSwgbWFwU3RhdGV9fTogTWFwU3R5bGVBY3Rpb25zLklucHV0TWFwU3R5bGVVcGRhdGVyQWN0aW9uXG4pOiBNYXBTdHlsZSA9PiB7XG4gIGNvbnN0IHVwZGF0ZWQgPSB7XG4gICAgLi4uc3RhdGUuaW5wdXRTdHlsZSxcbiAgICAuLi5pbnB1dFN0eWxlXG4gIH07XG5cbiAgLy8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGVpdGhlciBhIHVybCB0byBob3N0ZWQgc3R5bGUganNvbiB0aGF0IG5lZWRzIGFuIGljb24gdXJsLFxuICAvLyBvciBhbiBpY29uIGFscmVhZHkgYXZhaWxhYmxlIGNsaWVudC1zaWRlIGFzIGEgZGF0YSB1cmlcbiAgY29uc3QgaXNVcGRhdGVkSWNvbkRhdGFVcmkgPSB1cGRhdGVkLmljb24/LnN0YXJ0c1dpdGgoJ2RhdGE6aW1hZ2UnKTtcbiAgY29uc3QgaXNNYXBib3hTdHlsZVVybCA9XG4gICAgdXBkYXRlZC51cmw/LnN0YXJ0c1dpdGgoJ21hcGJveDovLycpIHx8IHVwZGF0ZWQudXJsPy5pbmNsdWRlcygnbWFwYm94LmNvbScpO1xuXG4gIGNvbnN0IGljb24gPVxuICAgICFpc1VwZGF0ZWRJY29uRGF0YVVyaSAmJiBpc01hcGJveFN0eWxlVXJsXG4gICAgICA/IC8vIEdldCBpbWFnZSBpY29uIHVybHMgb25seSBmb3IgbWFwYm94IG1hcCBsaWIuXG4gICAgICAgIGdldFN0eWxlSW1hZ2VJY29uKHtcbiAgICAgICAgICBtYXBTdGF0ZSxcbiAgICAgICAgICBzdHlsZVVybDogdXBkYXRlZC51cmwgfHwgJycsXG4gICAgICAgICAgbWFwYm94QXBpQWNjZXNzVG9rZW46IHVwZGF0ZWQuYWNjZXNzVG9rZW4gfHwgc3RhdGUubWFwYm94QXBpQWNjZXNzVG9rZW4gfHwgJycsXG4gICAgICAgICAgbWFwYm94QXBpVXJsOiBzdGF0ZS5tYXBib3hBcGlVcmwgfHwgREVGQVVMVF9NQVBCT1hfQVBJX1VSTFxuICAgICAgICB9KVxuICAgICAgOiB1cGRhdGVkLmljb247XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBpbnB1dFN0eWxlOiB7XG4gICAgICAuLi51cGRhdGVkLFxuICAgICAgaXNWYWxpZDogdHJ1ZSxcbiAgICAgIGljb25cbiAgICB9XG4gIH07XG59O1xuXG4vKipcbiAqIEFkZCBtYXAgc3R5bGUgZnJvbSB1c2VyIGlucHV0IHRvIHJlZHVjZXIgYW5kIHNldCBpdCB0byBjdXJyZW50IHN0eWxlXG4gKiBUaGlzIGFjdGlvbiBpcyBjYWxsZWQgd2hlbiB1c2VyIGNsaWNrIGNvbmZpcm0gYWZ0ZXIgcHV0dGluZyBpbiBhIHZhbGlkIHN0eWxlIHVybCBpbiB0aGUgY3VzdG9tIG1hcCBzdHlsZSBkaWFsb2cuXG4gKiBJdCBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIG91dHNpZGUga2VwbGVyLmdsIHdpdGhvdXQgYSB2YWxpZCBgaW5wdXRTdHlsZWAgaW4gdGhlIGBtYXBTdHlsZWAgcmVkdWNlci5cbiAqIEBtZW1iZXJvZiBtYXBTdHlsZVVwZGF0ZXJzXG4gKi9cbmV4cG9ydCBjb25zdCBhZGRDdXN0b21NYXBTdHlsZVVwZGF0ZXIgPSAoc3RhdGU6IE1hcFN0eWxlKTogTWFwU3R5bGUgPT4ge1xuICBjb25zdCBzdHlsZUlkID0gc3RhdGUuaW5wdXRTdHlsZS5pZDtcbiAgaWYgKCFzdHlsZUlkKSByZXR1cm4gc3RhdGU7XG5cbiAgY29uc3QgbmV3U3RhdGUgPSBnZXROZXdTdGF0ZVdpdGhDdXN0b21NYXBTdHlsZShzdGF0ZSk7XG4gIC8vIHNldCBuZXcgc3R5bGVcbiAgcmV0dXJuIG1hcFN0eWxlQ2hhbmdlVXBkYXRlcihuZXdTdGF0ZSwge3BheWxvYWQ6IHtzdHlsZVR5cGU6IHN0eWxlSWR9fSk7XG59O1xuXG4vKipcbiAqIEVkaXQgbWFwIHN0eWxlIGZyb20gdXNlciBpbnB1dCB0byByZWR1Y2VyLlxuICogVGhpcyBhY3Rpb24gaXMgY2FsbGVkIHdoZW4gdXNlciBjbGlja3MgY29uZmlybSBhZnRlciBlZGl0aW5nIGFuIGV4aXN0aW5nIGN1c3RvbSBzdHlsZSBpbiB0aGUgY3VzdG9tIG1hcCBzdHlsZSBkaWFsb2cuXG4gKiBJdCBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIG91dHNpZGUga2VwbGVyLmdsIHdpdGhvdXQgYSB2YWxpZCBgaW5wdXRTdHlsZWAgaW4gdGhlIGBtYXBTdHlsZWAgcmVkdWNlci5cbiAqIEBtZW1iZXJvZiBtYXBTdHlsZVVwZGF0ZXJzXG4gKi9cbmV4cG9ydCBjb25zdCBlZGl0Q3VzdG9tTWFwU3R5bGVVcGRhdGVyID0gKHN0YXRlOiBNYXBTdHlsZSk6IE1hcFN0eWxlID0+IHtcbiAgcmV0dXJuIGdldE5ld1N0YXRlV2l0aEN1c3RvbU1hcFN0eWxlKHN0YXRlKTtcbn07XG5cbmZ1bmN0aW9uIGdldE5ld1N0YXRlV2l0aEN1c3RvbU1hcFN0eWxlKHN0YXRlOiBNYXBTdHlsZSk6IE1hcFN0eWxlIHtcbiAgY29uc3Qgc3R5bGVJZCA9IHN0YXRlLmlucHV0U3R5bGUuaWQ7XG4gIGlmICghc3R5bGVJZCkgcmV0dXJuIHN0YXRlO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBQcm9wZXJ0eSAnbGF5ZXJHcm91cHMnIGlzIG1pc3NpbmcgaW4gdHlwZSAnSW5wdXRTdHlsZScgYnV0IHJlcXVpcmVkIGluIHR5cGUgJ0Jhc2VNYXBTdHlsZScuIExlZ2FjeSBjYXNlP1xuICAgIG1hcFN0eWxlczoge1xuICAgICAgLi4uc3RhdGUubWFwU3R5bGVzLFxuICAgICAgW3N0eWxlSWRdOiB7XG4gICAgICAgIC4uLnN0YXRlLm1hcFN0eWxlc1tzdHlsZUlkXSwgLy8gZG8gbm90IHVuaW50ZW50aW9uYWxseSBkcm9wIGFueSBhZGRpdGlvbmFsIHByb3BlcnRpZXNcbiAgICAgICAgLi4uc3RhdGUuaW5wdXRTdHlsZVxuICAgICAgfVxuICAgIH0sXG4gICAgLy8gc2V0IHRvIGRlZmF1bHRcbiAgICBpbnB1dFN0eWxlOiBnZXRJbml0aWFsSW5wdXRTdHlsZSgpXG4gIH07XG59XG5cbi8qKlxuICogUmVtb3ZlIGEgY3VzdG9tIG1hcCBzdHlsZSBmcm9tIGBzdGF0ZS5tYXBTdHlsZS5tYXBTdHlsZXNgLlxuICogQG1lbWJlcm9mIG1hcFN0eWxlVXBkYXRlcnNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlbW92ZUN1c3RvbU1hcFN0eWxlVXBkYXRlciA9IChcbiAgc3RhdGU6IE1hcFN0eWxlLFxuICBhY3Rpb246IE1hcFN0eWxlQWN0aW9ucy5SZW1vdmVDdXN0b21NYXBTdHlsZVVwZGF0ZXJBY3Rpb25cbik6IE1hcFN0eWxlID0+IHtcbiAgY29uc3Qge2lkfSA9IGFjdGlvbi5wYXlsb2FkO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgY29uc3Qge1tpZF06IF8sIC4uLnJlc3RPZk1hcFN0eWxlc30gPSBzdGF0ZS5tYXBTdHlsZXM7XG5cbiAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgbWFwU3R5bGVzOiByZXN0T2ZNYXBTdHlsZXNcbiAgfTtcblxuICBpZiAoc3RhdGUuc3R5bGVUeXBlID09PSBpZCkge1xuICAgIC8vIGlmIHJlbW92aW5nIGEgY3VzdG9tIHN0eWxlIHRoYXQgaXMgYWxzbyB0aGUgY3VycmVudCBhY3RpdmUgYmFzZSBtYXAsXG4gICAgLy8gdGhlbiByZXNldCB0byB0aGUgZGVmYXVsdCBhY3RpdmUgYmFzZSBtYXAgKGBtYXBTdHlsZS5zdHlsZVR5cGVgKVxuICAgIHJldHVybiBtYXBTdHlsZUNoYW5nZVVwZGF0ZXIobmV3U3RhdGUsIHtwYXlsb2FkOiB7c3R5bGVUeXBlOiBnZXREZWZhdWx0U3RhdGUoKS5zdHlsZVR5cGV9fSk7XG4gIH1cblxuICByZXR1cm4gbmV3U3RhdGU7XG59O1xuXG4vKipcbiAqIFVwZGF0ZXMgM2QgYnVpbGRpbmcgY29sb3JcbiAqIEBtZW1iZXJvZiBtYXBTdHlsZVVwZGF0ZXJzXG4gKi9cbmV4cG9ydCBjb25zdCBzZXQzZEJ1aWxkaW5nQ29sb3JVcGRhdGVyID0gKFxuICBzdGF0ZTogTWFwU3R5bGUsXG4gIHtwYXlsb2FkOiBjb2xvcn06IE1hcFN0eWxlQWN0aW9ucy5TZXQzZEJ1aWxkaW5nQ29sb3JVcGRhdGVyQWN0aW9uXG4pOiBNYXBTdHlsZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgdGhyZWVEQnVpbGRpbmdDb2xvcjogY29sb3IsXG4gIGN1c3RvbTNEQnVpbGRpbmdDb2xvcjogdHJ1ZVxufSk7XG5cbi8qKlxuICogVXBkYXRlcyBiYWNrZ3JvdW5kIGNvbG9yXG4gKiBAbWVtYmVyb2YgbWFwU3R5bGVVcGRhdGVyc1xuICovXG5leHBvcnQgY29uc3Qgc2V0QmFja2dyb3VuZENvbG9yVXBkYXRlciA9IChcbiAgc3RhdGU6IE1hcFN0eWxlLFxuICB7cGF5bG9hZDogY29sb3J9OiBNYXBTdHlsZUFjdGlvbnMuU2V0QmFja2dyb3VuZENvbG9yVXBkYXRlckFjdGlvblxuKTogTWFwU3R5bGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGJhY2tncm91bmRDb2xvcjogY29sb3Jcbn0pO1xuXG4vKipcbiAqIFJldHVybiB0aGUgaW5pdGlhbCBpbnB1dCBzdHlsZVxuICogQHJldHVybiBPYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEluaXRpYWxJbnB1dFN0eWxlKCk6IElucHV0U3R5bGUge1xuICByZXR1cm4ge1xuICAgIGlkOiBudWxsLFxuICAgIGFjY2Vzc1Rva2VuOiBudWxsLFxuICAgIGVycm9yOiBmYWxzZSxcbiAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICBsYWJlbDogbnVsbCxcbiAgICBzdHlsZTogbnVsbCxcbiAgICB1cmw6IG51bGwsXG4gICAgaWNvbjogbnVsbCxcbiAgICBjdXN0b206ICdMT0NBTCcsXG4gICAgdXBsb2FkZWRGaWxlOiBudWxsXG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBLE9BQU9BLElBQUksSUFBR0MsUUFBUSxRQUFPLGtCQUFrQjtBQUMvQyxPQUFPQyxTQUFTLE1BQU0sNkJBQTZCO0FBQ25ELE9BQU9DLE9BQU8sTUFBTSxnQkFBZ0I7O0FBRXBDO0FBQ0EsU0FDRUMsOEJBQThCLEVBQzlCQyxtQkFBbUIsRUFDbkJDLHlCQUF5QixFQUN6QkMsZUFBZSxFQUNmQyxrQkFBa0IsRUFDbEJDLGlCQUFpQixFQUNqQkMsYUFBYSxFQUNiQyxRQUFRLEVBQ1JDLGVBQWUsRUFDZkMsb0JBQW9CLFFBQ2Ysa0JBQWtCO0FBQ3pCLFNB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