@carto/kepler.gl 0.0.88 → 0.0.89
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/components/common/animation-control/playback-controls.js +11 -21
- package/dist/components/common/info-helper.js +3 -5
- package/dist/components/common/styled-components.d.ts +3 -2
- package/dist/components/common/styled-components.js +13 -14
- package/dist/components/editor/editor.js +2 -2
- package/dist/components/editor/feature-styles.js +2 -2
- package/dist/components/editor/handle-style.js +2 -2
- package/dist/components/map/layer-selector-panel.js +2 -3
- package/dist/components/map/map-control-tooltip.js +2 -3
- package/dist/components/side-panel/common/dataset-tag.js +4 -7
- package/dist/components/side-panel/common/dataset-title.js +5 -9
- package/dist/components/side-panel/layer-panel/color-range-selector.js +3 -7
- package/dist/components/side-panel/layer-panel/layer-config-group.js +2 -4
- package/dist/components/side-panel/layer-panel/panel-view-list-toggle.js +2 -4
- package/dist/components/side-panel/panel-header-action.d.ts +2 -2
- package/dist/components/side-panel/panel-header-action.js +3 -5
- package/dist/components/side-panel/panel-header.js +3 -5
- package/dist/components/side-panel/panel-tab.js +2 -4
- package/dist/constants/default-settings.js +3 -3
- package/dist/vendor/react-map-gl-draw/constants.js +55 -0
- package/dist/vendor/react-map-gl-draw/editor.js +1122 -0
- package/dist/vendor/react-map-gl-draw/feature.js +191 -0
- package/dist/vendor/react-map-gl-draw/index.js +33 -0
- package/dist/vendor/react-map-gl-draw/style.js +93 -0
- package/dist/vendor/react-map-gl-draw/utils.js +51 -0
- package/package.json +5 -4
- package/src/components/common/animation-control/playback-controls.tsx +11 -16
- package/src/components/common/info-helper.tsx +2 -3
- package/src/components/common/styled-components.tsx +17 -31
- package/src/components/editor/editor.tsx +1 -1
- package/src/components/editor/feature-styles.ts +1 -1
- package/src/components/editor/handle-style.ts +1 -1
- package/src/components/map/layer-selector-panel.tsx +1 -2
- package/src/components/map/map-control-tooltip.tsx +1 -1
- package/src/components/side-panel/common/dataset-tag.tsx +3 -5
- package/src/components/side-panel/common/dataset-title.tsx +4 -8
- package/src/components/side-panel/layer-panel/color-range-selector.tsx +4 -6
- package/src/components/side-panel/layer-panel/layer-config-group.tsx +2 -2
- package/src/components/side-panel/layer-panel/panel-view-list-toggle.tsx +2 -3
- package/src/components/side-panel/panel-header-action.tsx +4 -5
- package/src/components/side-panel/panel-header.tsx +2 -2
- package/src/components/side-panel/panel-tab.tsx +2 -2
- package/src/constants/default-settings.ts +1 -1
- package/src/vendor/react-map-gl-draw/LICENSE +9 -0
- package/src/vendor/react-map-gl-draw/constants.js +70 -0
- package/src/vendor/react-map-gl-draw/editor.js +1207 -0
- package/src/vendor/react-map-gl-draw/feature.js +171 -0
- package/src/vendor/react-map-gl-draw/index.js +7 -0
- package/src/vendor/react-map-gl-draw/style.js +153 -0
- package/src/vendor/react-map-gl-draw/utils.js +55 -0
- package/CHANGELOG.md +0 -1015
- package/src/.DS_Store +0 -0
- package/src/reducers/trips-to-geojson.mjs +0 -8
|
@@ -0,0 +1,1122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports["default"] = void 0;
|
|
9
|
+
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
10
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
11
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
12
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
13
|
+
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
14
|
+
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
15
|
+
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
16
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
17
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
18
|
+
var _reactMapGl = require("react-map-gl");
|
|
19
|
+
var _uuid = require("uuid");
|
|
20
|
+
var _feature2 = _interopRequireDefault(require("./feature"));
|
|
21
|
+
var _style = require("./style");
|
|
22
|
+
var _constants = require("./constants");
|
|
23
|
+
var _utils = require("./utils");
|
|
24
|
+
var _excluded = ["radius"];
|
|
25
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
26
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
|
|
27
|
+
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; }
|
|
28
|
+
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; }
|
|
29
|
+
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
|
|
30
|
+
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } // Vendored from react-map-gl-draw@0.14.8 (MIT, Copyright (c) 2018 Uber Technologies, Inc.), see ./LICENSE
|
|
31
|
+
/* eslint-disable complexity, max-statements */
|
|
32
|
+
var defaultProps = {
|
|
33
|
+
mode: _constants.MODES.READ_ONLY,
|
|
34
|
+
clickRadius: 0,
|
|
35
|
+
getEditHandleStyle: _style.getEditHandleStyle,
|
|
36
|
+
getFeatureStyle: _style.getFeatureStyle,
|
|
37
|
+
getFeatureShape: 'circle',
|
|
38
|
+
getEditHandleShape: 'circle',
|
|
39
|
+
onSelect: function onSelect() {}
|
|
40
|
+
};
|
|
41
|
+
var UNCOMMITTED_ID = 'uncommitted';
|
|
42
|
+
var Editor = exports["default"] = /*#__PURE__*/function (_PureComponent) {
|
|
43
|
+
function Editor(props) {
|
|
44
|
+
var _this;
|
|
45
|
+
(0, _classCallCheck2["default"])(this, Editor);
|
|
46
|
+
_this = _callSuper(this, Editor, [props]);
|
|
47
|
+
(0, _defineProperty2["default"])(_this, "_containerRef", void 0);
|
|
48
|
+
(0, _defineProperty2["default"])(_this, "_events", void 0);
|
|
49
|
+
(0, _defineProperty2["default"])(_this, "_context", void 0);
|
|
50
|
+
/* FEATURE OPERATIONS */
|
|
51
|
+
(0, _defineProperty2["default"])(_this, "_update", function (features) {
|
|
52
|
+
if (features) {
|
|
53
|
+
_this.props.onUpdate(features.map(function (f) {
|
|
54
|
+
return f.toFeature();
|
|
55
|
+
}));
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
(0, _defineProperty2["default"])(_this, "_updateRectangle", function (feature, options) {
|
|
59
|
+
var vertexIndex = options.vertexIndex,
|
|
60
|
+
lngLat = options.lngLat;
|
|
61
|
+
/*
|
|
62
|
+
* p0.x, p0.y ---------- diagonal.x, p0.y
|
|
63
|
+
* | |
|
|
64
|
+
* | |
|
|
65
|
+
* p0.x, diagonal.y ----- diagonal.x, diagonal.y
|
|
66
|
+
*/
|
|
67
|
+
var diagonal = vertexIndex;
|
|
68
|
+
var p0 = feature.points[(diagonal + 2) % 4];
|
|
69
|
+
feature.replacePoint(diagonal, [lngLat[0], lngLat[1]]);
|
|
70
|
+
feature.replacePoint((diagonal + 1) % 4, [lngLat[0], p0[1]]);
|
|
71
|
+
feature.replacePoint((diagonal + 3) % 4, [p0[0], lngLat[1]]);
|
|
72
|
+
_this._update(_this.state.features);
|
|
73
|
+
});
|
|
74
|
+
(0, _defineProperty2["default"])(_this, "_updateFeature", function (feature, mode, options) {
|
|
75
|
+
switch (mode) {
|
|
76
|
+
case 'vertex':
|
|
77
|
+
if (feature.renderType === _constants.RENDER_TYPE.RECTANGLE) {
|
|
78
|
+
_this._updateRectangle(feature, options);
|
|
79
|
+
} else {
|
|
80
|
+
feature.replacePoint(options.vertexIndex, [options.lngLat[0], options.lngLat[1]]);
|
|
81
|
+
_this._update(_this.state.features);
|
|
82
|
+
}
|
|
83
|
+
break;
|
|
84
|
+
case 'feature':
|
|
85
|
+
var dx = options.dx,
|
|
86
|
+
dy = options.dy;
|
|
87
|
+
feature.points = feature.points.map(function (lngLat) {
|
|
88
|
+
var pixels = _this._project(lngLat);
|
|
89
|
+
if (pixels) {
|
|
90
|
+
pixels[0] += dx;
|
|
91
|
+
pixels[1] += dy;
|
|
92
|
+
return _this._unproject(pixels);
|
|
93
|
+
}
|
|
94
|
+
return null;
|
|
95
|
+
}).filter(Boolean);
|
|
96
|
+
_this._update(_this.state.features);
|
|
97
|
+
break;
|
|
98
|
+
case 'Rectangle':
|
|
99
|
+
_this._updateRectangle(feature, options);
|
|
100
|
+
break;
|
|
101
|
+
default:
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
(0, _defineProperty2["default"])(_this, "_addPoint", function (x, y, feature) {
|
|
105
|
+
var isNew = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
106
|
+
feature = feature || _this._getSelectedFeature();
|
|
107
|
+
if (!feature) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
var lngLat = _this._unproject([x, y]);
|
|
111
|
+
if (!lngLat) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
feature.addPoint([lngLat[0], lngLat[1]]);
|
|
115
|
+
var features = _this.state.features || [];
|
|
116
|
+
if (isNew) {
|
|
117
|
+
features.push(feature);
|
|
118
|
+
}
|
|
119
|
+
var validPath = feature.points && feature.points.length >= 2;
|
|
120
|
+
var _this$props = _this.props,
|
|
121
|
+
mode = _this$props.mode,
|
|
122
|
+
onSelect = _this$props.onSelect;
|
|
123
|
+
if (mode === _constants.MODES.DRAW_POINT || mode === _constants.MODES.DRAW_PATH && validPath) {
|
|
124
|
+
_this._update(features);
|
|
125
|
+
onSelect({
|
|
126
|
+
selectedFeatureId: feature && feature.id
|
|
127
|
+
});
|
|
128
|
+
} else {
|
|
129
|
+
_this.setState({
|
|
130
|
+
features: (0, _toConsumableArray2["default"])(features),
|
|
131
|
+
selectedFeatureId: feature && feature.id
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
(0, _defineProperty2["default"])(_this, "_clearCache", function () {
|
|
136
|
+
_this.setState({
|
|
137
|
+
selectedFeatureId: null,
|
|
138
|
+
uncommittedLngLat: null,
|
|
139
|
+
hoveredFeatureId: null,
|
|
140
|
+
hoveredLngLat: null,
|
|
141
|
+
hoveredVertexIndex: -1,
|
|
142
|
+
draggingVertexIndex: -1,
|
|
143
|
+
startDragPos: null,
|
|
144
|
+
isDragging: false,
|
|
145
|
+
didDrag: false
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
(0, _defineProperty2["default"])(_this, "_closePath", function () {
|
|
149
|
+
var selectedFeature = _this._getSelectedFeature();
|
|
150
|
+
if (selectedFeature) {
|
|
151
|
+
selectedFeature.closePath();
|
|
152
|
+
_this._update(_this.state.features);
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
(0, _defineProperty2["default"])(_this, "_addFeature", function (mode, point) {
|
|
156
|
+
var type = _constants.MODE_TO_GEOJSON_TYPE[mode];
|
|
157
|
+
var renderType = _constants.MODE_TO_RENDER_TYPE[mode];
|
|
158
|
+
var feature = new _feature2["default"]({
|
|
159
|
+
id: (0, _uuid.v4)(),
|
|
160
|
+
type: type,
|
|
161
|
+
renderType: renderType
|
|
162
|
+
});
|
|
163
|
+
_this._addPoint(point.x, point.y, feature, true);
|
|
164
|
+
if (mode === _constants.MODES.DRAW_RECTANGLE) {
|
|
165
|
+
for (var i = 0; i < 3; i++) {
|
|
166
|
+
_this._addPoint(point.x, point.y, feature, false);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
(0, _defineProperty2["default"])(_this, "_onEvent", function (handler, evt, stopPropagation) {
|
|
171
|
+
var mode = _this.props.mode;
|
|
172
|
+
if (mode === _constants.MODES.READ_ONLY) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
for (var _len = arguments.length, args = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {
|
|
176
|
+
args[_key - 3] = arguments[_key];
|
|
177
|
+
}
|
|
178
|
+
handler.apply(void 0, [evt].concat(args));
|
|
179
|
+
if (stopPropagation) {
|
|
180
|
+
evt.stopImmediatePropagation();
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
(0, _defineProperty2["default"])(_this, "_onMouseUp", function (evt) {
|
|
184
|
+
_this.setState({
|
|
185
|
+
isDragging: false,
|
|
186
|
+
didDrag: false
|
|
187
|
+
});
|
|
188
|
+
var draggingVertexIndex = _this.state.draggingVertexIndex;
|
|
189
|
+
if (Number(draggingVertexIndex) >= 0) {
|
|
190
|
+
_this.setState({
|
|
191
|
+
draggingVertexIndex: -1
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
(0, _defineProperty2["default"])(_this, "_onMouseDown", function (evt) {
|
|
196
|
+
var _this$_getEventPositi = _this._getEventPosition(evt),
|
|
197
|
+
x = _this$_getEventPositi.x,
|
|
198
|
+
y = _this$_getEventPositi.y;
|
|
199
|
+
var attributes = (0, _utils.parseElemDataAttributes)(evt.target);
|
|
200
|
+
|
|
201
|
+
// click segment
|
|
202
|
+
if (attributes && attributes.type === _constants.ELEMENT_TYPE.VERTEX) {
|
|
203
|
+
var vertexIndex = attributes.vertexIndex;
|
|
204
|
+
_this.setState({
|
|
205
|
+
draggingVertexIndex: vertexIndex,
|
|
206
|
+
startDragPos: {
|
|
207
|
+
x: x,
|
|
208
|
+
y: y
|
|
209
|
+
},
|
|
210
|
+
isDragging: true
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
// click selected feature
|
|
214
|
+
} else if (_this._matchesFeature(attributes, _this._getSelectedFeature())) {
|
|
215
|
+
_this.setState({
|
|
216
|
+
startDragPos: {
|
|
217
|
+
x: x,
|
|
218
|
+
y: y
|
|
219
|
+
},
|
|
220
|
+
isDragging: true
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
/* eslint-disable max-depth */
|
|
225
|
+
(0, _defineProperty2["default"])(_this, "_onMouseMove", function (evt) {
|
|
226
|
+
var attributes = (0, _utils.parseElemDataAttributes)(evt.target) || {};
|
|
227
|
+
var vertexIndex = attributes.vertexIndex,
|
|
228
|
+
featureIndex = attributes.featureIndex,
|
|
229
|
+
type = attributes.type;
|
|
230
|
+
var _this$state = _this.state,
|
|
231
|
+
startDragPos = _this$state.startDragPos,
|
|
232
|
+
isDragging = _this$state.isDragging,
|
|
233
|
+
didDrag = _this$state.didDrag;
|
|
234
|
+
var mode = _this.props.mode;
|
|
235
|
+
var _this$_getEventPositi2 = _this._getEventPosition(evt),
|
|
236
|
+
x = _this$_getEventPositi2.x,
|
|
237
|
+
y = _this$_getEventPositi2.y;
|
|
238
|
+
var lngLat = _this._unproject([x, y]);
|
|
239
|
+
if (isDragging && !didDrag && startDragPos) {
|
|
240
|
+
var dx = x - startDragPos.x;
|
|
241
|
+
var dy = y - startDragPos.y;
|
|
242
|
+
if (dx * dx + dy * dy > 5) {
|
|
243
|
+
_this.setState({
|
|
244
|
+
didDrag: true
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
var selectedFeature = _this._getSelectedFeature();
|
|
249
|
+
var isDrawing = _constants.DRAWING_MODES.indexOf(mode) !== -1;
|
|
250
|
+
var isEditing = mode === _constants.MODES.EDIT_VERTEX;
|
|
251
|
+
if (selectedFeature) {
|
|
252
|
+
// dragging
|
|
253
|
+
if (didDrag && startDragPos) {
|
|
254
|
+
var draggingVertexIndex = Number(_this.state.draggingVertexIndex);
|
|
255
|
+
if (draggingVertexIndex >= 0) {
|
|
256
|
+
// dragging vertex
|
|
257
|
+
_this._updateFeature(selectedFeature, 'vertex', {
|
|
258
|
+
vertexIndex: draggingVertexIndex,
|
|
259
|
+
lngLat: lngLat
|
|
260
|
+
});
|
|
261
|
+
} else {
|
|
262
|
+
// dragging feature
|
|
263
|
+
var _dx = x - startDragPos.x;
|
|
264
|
+
var _dy = y - startDragPos.y;
|
|
265
|
+
_this.setState({
|
|
266
|
+
startDragPos: {
|
|
267
|
+
x: x,
|
|
268
|
+
y: y
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
_this._updateFeature(selectedFeature, 'feature', {
|
|
272
|
+
dx: _dx,
|
|
273
|
+
dy: _dy
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
} else if (mode === _constants.MODES.DRAW_RECTANGLE) {
|
|
277
|
+
// drawing rectangle
|
|
278
|
+
_this._updateFeature(selectedFeature, 'Rectangle', {
|
|
279
|
+
vertexIndex: 2,
|
|
280
|
+
lngLat: lngLat
|
|
281
|
+
});
|
|
282
|
+
} else if (isDrawing) {
|
|
283
|
+
// drawing other shapes
|
|
284
|
+
_this.setState({
|
|
285
|
+
uncommittedLngLat: lngLat
|
|
286
|
+
});
|
|
287
|
+
} else if (isEditing) {
|
|
288
|
+
if ((selectedFeature.renderType === _constants.RENDER_TYPE.LINE_STRING || selectedFeature.renderType === _constants.RENDER_TYPE.POLYGON) && type === _constants.ELEMENT_TYPE.SEGMENT) {
|
|
289
|
+
// segmentId is start vertexIndex
|
|
290
|
+
var uncommittedLngLat = null;
|
|
291
|
+
if (lngLat && typeof vertexIndex === 'number') {
|
|
292
|
+
uncommittedLngLat = _this._getClosestPositionOnSegment(vertexIndex, lngLat, selectedFeature);
|
|
293
|
+
}
|
|
294
|
+
_this.setState({
|
|
295
|
+
uncommittedLngLat: uncommittedLngLat
|
|
296
|
+
});
|
|
297
|
+
} else {
|
|
298
|
+
_this.setState({
|
|
299
|
+
uncommittedLngLat: null
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
var _this$state2 = _this.state,
|
|
305
|
+
features = _this$state2.features,
|
|
306
|
+
selectedFeatureId = _this$state2.selectedFeatureId;
|
|
307
|
+
if (selectedFeatureId && type === _constants.ELEMENT_TYPE.VERTEX && typeof featureIndex === 'number') {
|
|
308
|
+
var feature = features && features[featureIndex];
|
|
309
|
+
if (selectedFeatureId === (feature && feature.id)) {
|
|
310
|
+
_this.setState({
|
|
311
|
+
hoveredVertexIndex: vertexIndex
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
} else if (type !== _constants.ELEMENT_TYPE.VERTEX) {
|
|
315
|
+
_this.setState({
|
|
316
|
+
hoveredVertexIndex: null
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
if (type === _constants.ELEMENT_TYPE.FEATURE && typeof featureIndex === 'number') {
|
|
320
|
+
var _feature = features && features[featureIndex];
|
|
321
|
+
_this.setState({
|
|
322
|
+
hoveredFeatureId: _feature && _feature.id
|
|
323
|
+
});
|
|
324
|
+
} else {
|
|
325
|
+
_this.setState({
|
|
326
|
+
hoveredFeatureId: null
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
/* eslint-enable max-depth */
|
|
331
|
+
(0, _defineProperty2["default"])(_this, "_onClickFeature", function (evt, attributes) {
|
|
332
|
+
var featureIndex = attributes.featureIndex;
|
|
333
|
+
var features = _this.state.features;
|
|
334
|
+
var selectedFeature = features && typeof featureIndex === 'number' && features[featureIndex];
|
|
335
|
+
if (selectedFeature) {
|
|
336
|
+
_this.props.onSelect({
|
|
337
|
+
selectedFeatureId: selectedFeature.id,
|
|
338
|
+
sourceEvent: evt
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
(0, _defineProperty2["default"])(_this, "_onClickVertex", function (evt, attributes) {
|
|
343
|
+
var mode = _this.props.mode;
|
|
344
|
+
var operation = attributes.operation;
|
|
345
|
+
if (operation === _constants.OPERATIONS.INTERSECT || operation === _constants.OPERATIONS.SET && mode === _constants.MODES.DRAW_RECTANGLE) {
|
|
346
|
+
_this._closePath();
|
|
347
|
+
_this._clearCache();
|
|
348
|
+
}
|
|
349
|
+
});
|
|
350
|
+
(0, _defineProperty2["default"])(_this, "_onClickSegment", function (evt, attributes) {
|
|
351
|
+
var feature = _this._getSelectedFeature();
|
|
352
|
+
if (feature && (feature.renderType === _constants.RENDER_TYPE.POLYGON || feature.renderType === _constants.RENDER_TYPE.LINE_STRING) && attributes) {
|
|
353
|
+
var vertexIndex = attributes.vertexIndex;
|
|
354
|
+
var uncommittedLngLat = _this.state.uncommittedLngLat;
|
|
355
|
+
var lngLat = uncommittedLngLat;
|
|
356
|
+
if (!lngLat && typeof vertexIndex === 'number') {
|
|
357
|
+
var _this$_getEventPositi3 = _this._getEventPosition(evt),
|
|
358
|
+
x = _this$_getEventPositi3.x,
|
|
359
|
+
y = _this$_getEventPositi3.y;
|
|
360
|
+
lngLat = _this._unproject([x, y]);
|
|
361
|
+
lngLat = _this._getClosestPositionOnSegment(vertexIndex, lngLat, feature);
|
|
362
|
+
}
|
|
363
|
+
if (lngLat) {
|
|
364
|
+
var insertPosition = (vertexIndex + 1) % feature.points.length;
|
|
365
|
+
feature.insertPoint(lngLat, insertPosition);
|
|
366
|
+
_this._update(_this.state.features);
|
|
367
|
+
}
|
|
368
|
+
_this.setState({
|
|
369
|
+
uncommittedLngLat: null,
|
|
370
|
+
hoveredLngLat: null
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
});
|
|
374
|
+
(0, _defineProperty2["default"])(_this, "_onClick", function (evt) {
|
|
375
|
+
var mode = _this.props.mode;
|
|
376
|
+
var attributes = (0, _utils.parseElemDataAttributes)(evt.target);
|
|
377
|
+
if (attributes && attributes.type === _constants.ELEMENT_TYPE.VERTEX) {
|
|
378
|
+
_this._onClickVertex(evt, attributes);
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
if (mode === _constants.MODES.EDIT_VERTEX && attributes && attributes.type === _constants.ELEMENT_TYPE.SEGMENT) {
|
|
382
|
+
_this._onClickSegment(evt, attributes);
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
if ((mode === _constants.MODES.SELECT_FEATURE || mode === _constants.MODES.EDIT_VERTEX) && attributes && attributes.type === _constants.ELEMENT_TYPE.FEATURE) {
|
|
386
|
+
_this._onClickFeature(evt, attributes);
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
var selectedFeature = _this._getSelectedFeature();
|
|
390
|
+
var _this$_getEventPositi4 = _this._getEventPosition(evt),
|
|
391
|
+
x = _this$_getEventPositi4.x,
|
|
392
|
+
y = _this$_getEventPositi4.y;
|
|
393
|
+
switch (mode) {
|
|
394
|
+
case _constants.MODES.EDIT_VERTEX:
|
|
395
|
+
if (selectedFeature) {
|
|
396
|
+
_this.props.onSelect({
|
|
397
|
+
selectedFeatureId: null,
|
|
398
|
+
sourceEvent: evt
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
break;
|
|
402
|
+
case _constants.MODES.DRAW_POINT:
|
|
403
|
+
_this._addFeature(mode, {
|
|
404
|
+
x: x,
|
|
405
|
+
y: y
|
|
406
|
+
});
|
|
407
|
+
break;
|
|
408
|
+
case _constants.MODES.DRAW_PATH:
|
|
409
|
+
case _constants.MODES.DRAW_POLYGON:
|
|
410
|
+
if (selectedFeature && selectedFeature.isClosed) {
|
|
411
|
+
// clicked outside
|
|
412
|
+
_this._clearCache();
|
|
413
|
+
} else if (selectedFeature) {
|
|
414
|
+
_this._addPoint(x, y, selectedFeature);
|
|
415
|
+
} else {
|
|
416
|
+
_this._addFeature(mode, {
|
|
417
|
+
x: x,
|
|
418
|
+
y: y
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
break;
|
|
422
|
+
case _constants.MODES.DRAW_RECTANGLE:
|
|
423
|
+
if (selectedFeature && selectedFeature.isClosed) {
|
|
424
|
+
// clicked outside
|
|
425
|
+
_this._clearCache();
|
|
426
|
+
_this.props.onSelect({
|
|
427
|
+
selectedFeatureId: null,
|
|
428
|
+
sourceEvent: evt
|
|
429
|
+
});
|
|
430
|
+
} else {
|
|
431
|
+
_this._addFeature(mode, {
|
|
432
|
+
x: x,
|
|
433
|
+
y: y
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
break;
|
|
437
|
+
default:
|
|
438
|
+
}
|
|
439
|
+
});
|
|
440
|
+
// don't forward pan events to the underlying map when:
|
|
441
|
+
// - the pan target is a vertex/line/the currently selected feature
|
|
442
|
+
// - the user is dragging something around
|
|
443
|
+
// - there is currently an uncommitted position
|
|
444
|
+
// (i.e. the user is creating a feature/vertex/line)
|
|
445
|
+
(0, _defineProperty2["default"])(_this, "_onPan", function (evt) {
|
|
446
|
+
var attributes = (0, _utils.parseElemDataAttributes)(evt.target);
|
|
447
|
+
var type = attributes && attributes.type;
|
|
448
|
+
if (type === _constants.ELEMENT_TYPE.VERTEX || type === _constants.ELEMENT_TYPE.SEGMENT || _this.state.isDragging || _this.state.uncommittedLngLat !== null) {
|
|
449
|
+
evt.stopImmediatePropagation();
|
|
450
|
+
}
|
|
451
|
+
});
|
|
452
|
+
/* HELPERS */
|
|
453
|
+
// lngLat to pixels
|
|
454
|
+
(0, _defineProperty2["default"])(_this, "_project", function (pt) {
|
|
455
|
+
return _this._context && _this._context.viewport && _this._context.viewport.project(pt);
|
|
456
|
+
});
|
|
457
|
+
// pixels to lngLat
|
|
458
|
+
(0, _defineProperty2["default"])(_this, "_unproject", function (pt) {
|
|
459
|
+
return _this._context && _this._context.viewport && _this._context.viewport.unproject(pt);
|
|
460
|
+
});
|
|
461
|
+
(0, _defineProperty2["default"])(_this, "_matchesFeature", function (attributes, feature) {
|
|
462
|
+
if (!attributes || attributes.type !== _constants.ELEMENT_TYPE.FEATURE || !feature) {
|
|
463
|
+
return false;
|
|
464
|
+
}
|
|
465
|
+
var featureIndex = attributes.featureIndex;
|
|
466
|
+
var features = _this.props.features;
|
|
467
|
+
var elemFeature = features && features[featureIndex];
|
|
468
|
+
return elemFeature && feature.id === elemFeature.id;
|
|
469
|
+
});
|
|
470
|
+
(0, _defineProperty2["default"])(_this, "_getClosestPositionOnSegment", function (vertexIndex, pointLngLat, feature) {
|
|
471
|
+
var points = feature && feature.points;
|
|
472
|
+
if (!points || !points.length) {
|
|
473
|
+
return null;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
// segmentId is start vertexIndex
|
|
477
|
+
var startPos = points[vertexIndex];
|
|
478
|
+
var endPos = points[(vertexIndex + 1) % points.length];
|
|
479
|
+
return (0, _utils.findClosestPointOnLineSegment)(startPos, endPos, pointLngLat);
|
|
480
|
+
});
|
|
481
|
+
(0, _defineProperty2["default"])(_this, "_getEventPosition", function (evt) {
|
|
482
|
+
var _evt$offsetCenter = evt.offsetCenter,
|
|
483
|
+
x = _evt$offsetCenter.x,
|
|
484
|
+
y = _evt$offsetCenter.y;
|
|
485
|
+
return {
|
|
486
|
+
x: Number(x),
|
|
487
|
+
y: Number(y)
|
|
488
|
+
};
|
|
489
|
+
});
|
|
490
|
+
(0, _defineProperty2["default"])(_this, "_getSelectedFeature", function () {
|
|
491
|
+
var _this$state3 = _this.state,
|
|
492
|
+
features = _this$state3.features,
|
|
493
|
+
selectedFeatureId = _this$state3.selectedFeatureId;
|
|
494
|
+
return features && features.find(function (f) {
|
|
495
|
+
return f.id === selectedFeatureId;
|
|
496
|
+
});
|
|
497
|
+
});
|
|
498
|
+
(0, _defineProperty2["default"])(_this, "_getEditHandleState", function (index, renderState) {
|
|
499
|
+
var mode = _this.props.mode;
|
|
500
|
+
var _this$state4 = _this.state,
|
|
501
|
+
draggingVertexIndex = _this$state4.draggingVertexIndex,
|
|
502
|
+
hoveredVertexIndex = _this$state4.hoveredVertexIndex;
|
|
503
|
+
var selectedFeature = _this._getSelectedFeature();
|
|
504
|
+
var isSelected = index === draggingVertexIndex || selectedFeature && selectedFeature.renderType === _constants.RENDER_TYPE.POINT;
|
|
505
|
+
var isClosing = mode === _constants.MODES.DRAW_POLYGON && hoveredVertexIndex === 0 && index === -1;
|
|
506
|
+
if (renderState) {
|
|
507
|
+
return renderState;
|
|
508
|
+
}
|
|
509
|
+
if (isClosing) {
|
|
510
|
+
return _constants.RENDER_STATE.CLOSING;
|
|
511
|
+
}
|
|
512
|
+
if (isSelected) {
|
|
513
|
+
return _constants.RENDER_STATE.SELECTED;
|
|
514
|
+
}
|
|
515
|
+
switch (index) {
|
|
516
|
+
case hoveredVertexIndex:
|
|
517
|
+
return _constants.RENDER_STATE.HOVERED;
|
|
518
|
+
case UNCOMMITTED_ID:
|
|
519
|
+
return _constants.RENDER_STATE.UNCOMMITTED;
|
|
520
|
+
default:
|
|
521
|
+
return _constants.RENDER_STATE.INACTIVE;
|
|
522
|
+
}
|
|
523
|
+
});
|
|
524
|
+
(0, _defineProperty2["default"])(_this, "_getFeatureRenderState", function (id, renderState) {
|
|
525
|
+
var _this$state5 = _this.state,
|
|
526
|
+
selectedFeatureId = _this$state5.selectedFeatureId,
|
|
527
|
+
hoveredFeatureId = _this$state5.hoveredFeatureId;
|
|
528
|
+
if (renderState) {
|
|
529
|
+
return renderState;
|
|
530
|
+
}
|
|
531
|
+
switch (id) {
|
|
532
|
+
case selectedFeatureId:
|
|
533
|
+
return _constants.RENDER_STATE.SELECTED;
|
|
534
|
+
case hoveredFeatureId:
|
|
535
|
+
return _constants.RENDER_STATE.HOVERED;
|
|
536
|
+
case UNCOMMITTED_ID:
|
|
537
|
+
return _constants.RENDER_STATE.UNCOMMITTED;
|
|
538
|
+
default:
|
|
539
|
+
return _constants.RENDER_STATE.INACTIVE;
|
|
540
|
+
}
|
|
541
|
+
});
|
|
542
|
+
/* RENDER */
|
|
543
|
+
/* eslint-disable max-params */
|
|
544
|
+
(0, _defineProperty2["default"])(_this, "_renderVertex", function (position, featureIndex, vertexIndex, operation, style, shape) {
|
|
545
|
+
/* eslint-enable max-params */
|
|
546
|
+
var p = _this._project(position);
|
|
547
|
+
if (!p) {
|
|
548
|
+
return null;
|
|
549
|
+
}
|
|
550
|
+
var clickRadius = _this.props.clickRadius;
|
|
551
|
+
var elemKey = "".concat(_constants.ELEMENT_TYPE.VERTEX, ".").concat(featureIndex, ".").concat(vertexIndex, ".").concat(operation);
|
|
552
|
+
// first <circle|rect> is to make path easily interacted with
|
|
553
|
+
switch (shape) {
|
|
554
|
+
case 'circle':
|
|
555
|
+
return /*#__PURE__*/_react["default"].createElement("g", {
|
|
556
|
+
key: elemKey,
|
|
557
|
+
transform: "translate(".concat(p[0], ", ").concat(p[1], ")")
|
|
558
|
+
}, /*#__PURE__*/_react["default"].createElement("circle", {
|
|
559
|
+
"data-type": _constants.ELEMENT_TYPE.VERTEX,
|
|
560
|
+
"data-feature-index": featureIndex,
|
|
561
|
+
"data-vertex-index": vertexIndex,
|
|
562
|
+
"data-operation": operation,
|
|
563
|
+
key: "".concat(elemKey, ".hidden"),
|
|
564
|
+
style: _objectSpread(_objectSpread(_objectSpread({}, style), _style.HIDDEN_CLICKABLE_STYLE), {}, {
|
|
565
|
+
stroke: 'none'
|
|
566
|
+
}),
|
|
567
|
+
cx: 0,
|
|
568
|
+
cy: 0,
|
|
569
|
+
r: clickRadius
|
|
570
|
+
}), /*#__PURE__*/_react["default"].createElement("circle", {
|
|
571
|
+
"data-type": _constants.ELEMENT_TYPE.VERTEX,
|
|
572
|
+
"data-feature-index": featureIndex,
|
|
573
|
+
"data-vertex-index": vertexIndex,
|
|
574
|
+
"data-operation": operation,
|
|
575
|
+
key: elemKey,
|
|
576
|
+
style: style,
|
|
577
|
+
cx: 0,
|
|
578
|
+
cy: 0
|
|
579
|
+
}));
|
|
580
|
+
case 'rect':
|
|
581
|
+
return /*#__PURE__*/_react["default"].createElement("g", {
|
|
582
|
+
key: "vertex.".concat(vertexIndex),
|
|
583
|
+
transform: "translate(".concat(p[0], ", ").concat(p[1], ")")
|
|
584
|
+
}, /*#__PURE__*/_react["default"].createElement("rect", {
|
|
585
|
+
"data-type": _constants.ELEMENT_TYPE.VERTEX,
|
|
586
|
+
"data-feature-index": featureIndex,
|
|
587
|
+
"data-vertex-index": vertexIndex,
|
|
588
|
+
"data-operation": operation,
|
|
589
|
+
key: "".concat(elemKey, ".hidden"),
|
|
590
|
+
style: _objectSpread(_objectSpread(_objectSpread({}, style), _style.HIDDEN_CLICKABLE_STYLE), {}, {
|
|
591
|
+
width: clickRadius,
|
|
592
|
+
height: clickRadius
|
|
593
|
+
})
|
|
594
|
+
}), /*#__PURE__*/_react["default"].createElement("rect", {
|
|
595
|
+
"data-type": _constants.ELEMENT_TYPE.VERTEX,
|
|
596
|
+
"data-feature-index": featureIndex,
|
|
597
|
+
"data-vertex-index": vertexIndex,
|
|
598
|
+
"data-operation": operation,
|
|
599
|
+
key: elemKey,
|
|
600
|
+
style: style
|
|
601
|
+
}));
|
|
602
|
+
default:
|
|
603
|
+
return null;
|
|
604
|
+
}
|
|
605
|
+
});
|
|
606
|
+
(0, _defineProperty2["default"])(_this, "_renderSegment", function (featureIndex, startVertexId, startPos, endPos) {
|
|
607
|
+
var style = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
|
|
608
|
+
var clickRadius = _this.props.clickRadius;
|
|
609
|
+
var projected = _this._getProjectedData([startPos, endPos], _constants.RENDER_TYPE.LINE_STRING);
|
|
610
|
+
var radius = style.radius,
|
|
611
|
+
others = (0, _objectWithoutProperties2["default"])(style, _excluded);
|
|
612
|
+
var elemKey = "".concat(_constants.ELEMENT_TYPE.SEGMENT, ".").concat(featureIndex, ".").concat(startVertexId);
|
|
613
|
+
return /*#__PURE__*/_react["default"].createElement("g", {
|
|
614
|
+
key: elemKey
|
|
615
|
+
}, /*#__PURE__*/_react["default"].createElement("path", {
|
|
616
|
+
"data-type": _constants.ELEMENT_TYPE.SEGMENT,
|
|
617
|
+
"data-feature-index": featureIndex,
|
|
618
|
+
"data-vertex-index": startVertexId,
|
|
619
|
+
key: "".concat(elemKey, ".hidden"),
|
|
620
|
+
style: _objectSpread(_objectSpread({}, others), {}, {
|
|
621
|
+
strokeWidth: clickRadius || radius,
|
|
622
|
+
opacity: 0
|
|
623
|
+
}),
|
|
624
|
+
d: projected
|
|
625
|
+
}), /*#__PURE__*/_react["default"].createElement("path", {
|
|
626
|
+
"data-type": _constants.ELEMENT_TYPE.SEGMENT,
|
|
627
|
+
"data-feature-index": featureIndex,
|
|
628
|
+
"data-vertex-index": startVertexId,
|
|
629
|
+
key: elemKey,
|
|
630
|
+
style: others,
|
|
631
|
+
d: projected
|
|
632
|
+
}));
|
|
633
|
+
});
|
|
634
|
+
(0, _defineProperty2["default"])(_this, "_renderCommittedStroke", function (featureIndex, feature, style) {
|
|
635
|
+
var points = feature.points,
|
|
636
|
+
isClosed = feature.isClosed,
|
|
637
|
+
renderType = feature.renderType;
|
|
638
|
+
if (!points || points.length < 2 || renderType === _constants.RENDER_TYPE.RECTANGLE && !isClosed) {
|
|
639
|
+
return null;
|
|
640
|
+
}
|
|
641
|
+
var segments = [];
|
|
642
|
+
for (var i = 0; i < points.length - 1; i++) {
|
|
643
|
+
segments.push(_this._renderSegment(featureIndex, i, points[i], points[i + 1], style));
|
|
644
|
+
}
|
|
645
|
+
if (isClosed) {
|
|
646
|
+
var lastIndex = points.length - 1;
|
|
647
|
+
segments.push(_this._renderSegment(featureIndex, lastIndex, points[lastIndex], points[0], style));
|
|
648
|
+
}
|
|
649
|
+
return /*#__PURE__*/_react["default"].createElement("g", {
|
|
650
|
+
key: "committed group"
|
|
651
|
+
}, segments);
|
|
652
|
+
});
|
|
653
|
+
(0, _defineProperty2["default"])(_this, "_renderUncommittedStrokes", function (featureIndex, feature, style) {
|
|
654
|
+
var points = feature.points,
|
|
655
|
+
isClosed = feature.isClosed,
|
|
656
|
+
renderType = feature.renderType;
|
|
657
|
+
var mode = _this.props.mode;
|
|
658
|
+
var uncommittedLngLat = _this.state.uncommittedLngLat;
|
|
659
|
+
var isDrawing = _constants.DRAWING_MODES.find(function (m) {
|
|
660
|
+
return m === mode;
|
|
661
|
+
});
|
|
662
|
+
if (!points || isClosed || !isDrawing) {
|
|
663
|
+
return null;
|
|
664
|
+
}
|
|
665
|
+
var uncommittedSegments = [];
|
|
666
|
+
if (renderType === _constants.RENDER_TYPE.RECTANGLE) {
|
|
667
|
+
for (var i = 0; i < points.length - 1; i++) {
|
|
668
|
+
uncommittedSegments.push(_this._renderSegment(featureIndex, i, points[i], points[i + 1], style));
|
|
669
|
+
}
|
|
670
|
+
if (points.length === 4) {
|
|
671
|
+
uncommittedSegments.push(_this._renderSegment(featureIndex, 3, points[3], points[0], style));
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
if (!uncommittedLngLat) {
|
|
675
|
+
return uncommittedSegments.length ? uncommittedSegments : null;
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
/* eslint-disable no-inline-comments */
|
|
679
|
+
uncommittedSegments.push(_this._renderSegment(featureIndex, points.length - 1,
|
|
680
|
+
// id
|
|
681
|
+
points.slice(-1)[0],
|
|
682
|
+
// startPos
|
|
683
|
+
uncommittedLngLat,
|
|
684
|
+
// endPos
|
|
685
|
+
style));
|
|
686
|
+
/* eslint-enable no-inline-comments */
|
|
687
|
+
|
|
688
|
+
return uncommittedSegments.filter(Boolean);
|
|
689
|
+
});
|
|
690
|
+
(0, _defineProperty2["default"])(_this, "_renderClosingStroke", function (featureIndex, feature, style) {
|
|
691
|
+
var points = feature.points,
|
|
692
|
+
isClosed = feature.isClosed;
|
|
693
|
+
var mode = _this.props.mode;
|
|
694
|
+
var uncommittedLngLat = _this.state.uncommittedLngLat;
|
|
695
|
+
if (uncommittedLngLat && mode === _constants.MODES.DRAW_POLYGON && points.length > 2 && !isClosed) {
|
|
696
|
+
// from uncommitted position to the first point of the polygon
|
|
697
|
+
return _this._renderSegment(featureIndex, 'uncommitted-close', uncommittedLngLat, points[0], style);
|
|
698
|
+
}
|
|
699
|
+
return null;
|
|
700
|
+
});
|
|
701
|
+
(0, _defineProperty2["default"])(_this, "_renderFill", function (index, feature, style) {
|
|
702
|
+
var mode = _this.props.mode;
|
|
703
|
+
var isDrawing = _constants.DRAWING_MODES.find(function (m) {
|
|
704
|
+
return m === mode;
|
|
705
|
+
});
|
|
706
|
+
var points = feature.points,
|
|
707
|
+
renderType = feature.renderType,
|
|
708
|
+
isClosed = feature.isClosed;
|
|
709
|
+
if (renderType !== _constants.RENDER_TYPE.POLYGON && renderType !== _constants.RENDER_TYPE.RECTANGLE) {
|
|
710
|
+
return null;
|
|
711
|
+
}
|
|
712
|
+
var uncommittedLngLat = _this.state.uncommittedLngLat;
|
|
713
|
+
var fillPoints = points;
|
|
714
|
+
if (uncommittedLngLat && isDrawing) {
|
|
715
|
+
fillPoints = [].concat((0, _toConsumableArray2["default"])(points), [uncommittedLngLat]);
|
|
716
|
+
}
|
|
717
|
+
var fillPath = _this._getProjectedData(fillPoints, renderType, isClosed);
|
|
718
|
+
return /*#__PURE__*/_react["default"].createElement("path", {
|
|
719
|
+
"data-type": _constants.ELEMENT_TYPE.FEATURE,
|
|
720
|
+
"data-feature-index": index,
|
|
721
|
+
key: "".concat(_constants.ELEMENT_TYPE.FEATURE, ".").concat(index, ".fill"),
|
|
722
|
+
style: _objectSpread(_objectSpread({}, style), {}, {
|
|
723
|
+
stroke: 'none'
|
|
724
|
+
}),
|
|
725
|
+
d: fillPath
|
|
726
|
+
});
|
|
727
|
+
});
|
|
728
|
+
(0, _defineProperty2["default"])(_this, "_renderCurrentPath", function (feature, index) {
|
|
729
|
+
var points = feature.points,
|
|
730
|
+
renderType = feature.renderType;
|
|
731
|
+
if (!points || !points.length || renderType === _constants.RENDER_TYPE.POINT) {
|
|
732
|
+
return null;
|
|
733
|
+
}
|
|
734
|
+
var getFeatureStyle = _this.props.getFeatureStyle;
|
|
735
|
+
var geoJson = feature.toFeature();
|
|
736
|
+
var committedStyle = getFeatureStyle({
|
|
737
|
+
feature: geoJson,
|
|
738
|
+
state: _constants.RENDER_STATE.SELECTED
|
|
739
|
+
});
|
|
740
|
+
var uncommittedStyle = getFeatureStyle({
|
|
741
|
+
feature: geoJson,
|
|
742
|
+
state: _constants.RENDER_STATE.UNCOMMITTED
|
|
743
|
+
});
|
|
744
|
+
var closingStyle = getFeatureStyle({
|
|
745
|
+
feature: geoJson,
|
|
746
|
+
state: _constants.RENDER_STATE.CLOSING
|
|
747
|
+
});
|
|
748
|
+
var committedStroke = _this._renderCommittedStroke(index, feature, committedStyle);
|
|
749
|
+
var uncommittedStrokes = _this._renderUncommittedStrokes(index, feature, uncommittedStyle) || [];
|
|
750
|
+
var closingStroke = _this._renderClosingStroke(index, feature, closingStyle);
|
|
751
|
+
var fill = _this._renderFill(index, feature, uncommittedStyle);
|
|
752
|
+
return [fill, committedStroke].concat((0, _toConsumableArray2["default"])(uncommittedStrokes), [closingStroke]).filter(Boolean);
|
|
753
|
+
});
|
|
754
|
+
(0, _defineProperty2["default"])(_this, "_renderCommittedVertices", function (featureIndex, feature, geoJson) {
|
|
755
|
+
var _this$props2 = _this.props,
|
|
756
|
+
mode = _this$props2.mode,
|
|
757
|
+
getEditHandleStyle = _this$props2.getEditHandleStyle,
|
|
758
|
+
getEditHandleShape = _this$props2.getEditHandleShape;
|
|
759
|
+
var isClosed = feature.isClosed,
|
|
760
|
+
points = feature.points;
|
|
761
|
+
var committedVertices = [];
|
|
762
|
+
for (var i = 0; i < points.length; i++) {
|
|
763
|
+
var p = points[i];
|
|
764
|
+
var operation = _constants.OPERATIONS.SET;
|
|
765
|
+
var style = getEditHandleStyle({
|
|
766
|
+
feature: geoJson,
|
|
767
|
+
index: i,
|
|
768
|
+
state: _this._getEditHandleState(i)
|
|
769
|
+
});
|
|
770
|
+
var shape = typeof getEditHandleShape === 'function' ? getEditHandleShape({
|
|
771
|
+
feature: geoJson,
|
|
772
|
+
index: i,
|
|
773
|
+
state: _this._getEditHandleState(i)
|
|
774
|
+
}) : getEditHandleShape;
|
|
775
|
+
if (isClosed) {
|
|
776
|
+
committedVertices.push(_this._renderVertex(p, featureIndex, i, operation, style, shape));
|
|
777
|
+
} else {
|
|
778
|
+
if (mode === _constants.MODES.DRAW_POLYGON && i === 0 && points.length > 2) {
|
|
779
|
+
operation = _constants.OPERATIONS.INTERSECT;
|
|
780
|
+
}
|
|
781
|
+
committedVertices.push(_this._renderVertex(p, featureIndex, i, operation, style, shape));
|
|
782
|
+
}
|
|
783
|
+
}
|
|
784
|
+
return committedVertices;
|
|
785
|
+
});
|
|
786
|
+
(0, _defineProperty2["default"])(_this, "_renderUncommittedVertex", function (featureIndex, feature, geoJson) {
|
|
787
|
+
var _this$props3 = _this.props,
|
|
788
|
+
getEditHandleStyle = _this$props3.getEditHandleStyle,
|
|
789
|
+
getEditHandleShape = _this$props3.getEditHandleShape;
|
|
790
|
+
var _this$state6 = _this.state,
|
|
791
|
+
selectedFeatureId = _this$state6.selectedFeatureId,
|
|
792
|
+
uncommittedLngLat = _this$state6.uncommittedLngLat;
|
|
793
|
+
var id = feature.id;
|
|
794
|
+
var uncommittedVertex = null;
|
|
795
|
+
if (selectedFeatureId === id && uncommittedLngLat) {
|
|
796
|
+
var style = getEditHandleStyle({
|
|
797
|
+
feature: geoJson,
|
|
798
|
+
index: 'uncommitted',
|
|
799
|
+
state: _this._getEditHandleState(-1, _constants.RENDER_STATE.UNCOMMITTED)
|
|
800
|
+
});
|
|
801
|
+
var shape = typeof getEditHandleShape === 'function' ? getEditHandleShape({
|
|
802
|
+
feature: geoJson,
|
|
803
|
+
index: null,
|
|
804
|
+
state: _this._getEditHandleState(-1)
|
|
805
|
+
}) : getEditHandleShape;
|
|
806
|
+
uncommittedVertex = _this._renderVertex(uncommittedLngLat, featureIndex, 'uncommitted', _constants.OPERATIONS.INSERT, _objectSpread(_objectSpread({}, style), {}, {
|
|
807
|
+
pointerEvents: 'none'
|
|
808
|
+
}), shape);
|
|
809
|
+
}
|
|
810
|
+
return uncommittedVertex;
|
|
811
|
+
});
|
|
812
|
+
(0, _defineProperty2["default"])(_this, "_renderCurrentVertices", function (feature, featureIndex) {
|
|
813
|
+
var points = feature.points;
|
|
814
|
+
if (!points || !points.length) {
|
|
815
|
+
return null;
|
|
816
|
+
}
|
|
817
|
+
var geoJson = feature.toFeature();
|
|
818
|
+
var committedVertices = _this._renderCommittedVertices(featureIndex, feature, geoJson);
|
|
819
|
+
var uncommittedVertex = _this._renderUncommittedVertex(featureIndex, feature, geoJson);
|
|
820
|
+
return /*#__PURE__*/_react["default"].createElement("g", {
|
|
821
|
+
key: "edit-handles"
|
|
822
|
+
}, committedVertices, uncommittedVertex);
|
|
823
|
+
});
|
|
824
|
+
(0, _defineProperty2["default"])(_this, "_renderCurrent", function () {
|
|
825
|
+
var features = _this.state.features;
|
|
826
|
+
var feature = _this._getSelectedFeature();
|
|
827
|
+
if (!features || !feature || !feature.points) {
|
|
828
|
+
return null;
|
|
829
|
+
}
|
|
830
|
+
var mode = _this.props.mode;
|
|
831
|
+
var index = features.findIndex(function (f) {
|
|
832
|
+
return f.id === feature.id;
|
|
833
|
+
});
|
|
834
|
+
return /*#__PURE__*/_react["default"].createElement("g", {
|
|
835
|
+
key: "feature current",
|
|
836
|
+
style: mode === _constants.MODES.READ_ONLY || mode === _constants.MODES.SELECT_FEATURE ? _constants.STATIC_STYLE : null
|
|
837
|
+
}, _this._renderCurrentPath(feature, index), _this._renderCurrentVertices(feature, index));
|
|
838
|
+
});
|
|
839
|
+
(0, _defineProperty2["default"])(_this, "_renderFeature", function (feature, index) {
|
|
840
|
+
if (feature === _this._getSelectedFeature()) {
|
|
841
|
+
return null;
|
|
842
|
+
}
|
|
843
|
+
var clickRadius = _this.props.clickRadius;
|
|
844
|
+
var id = feature.id,
|
|
845
|
+
points = feature.points,
|
|
846
|
+
renderType = feature.renderType,
|
|
847
|
+
isClosed = feature.isClosed;
|
|
848
|
+
if (!points || !points.length) {
|
|
849
|
+
return null;
|
|
850
|
+
}
|
|
851
|
+
var projected = _this._getProjectedData(points, renderType, isClosed);
|
|
852
|
+
if (!projected) {
|
|
853
|
+
return null;
|
|
854
|
+
}
|
|
855
|
+
var geoJson = feature.toFeature();
|
|
856
|
+
var renderState = _this._getFeatureRenderState(id);
|
|
857
|
+
var _this$props4 = _this.props,
|
|
858
|
+
getFeatureStyle = _this$props4.getFeatureStyle,
|
|
859
|
+
getFeatureShape = _this$props4.getFeatureShape;
|
|
860
|
+
var style = getFeatureStyle({
|
|
861
|
+
feature: geoJson,
|
|
862
|
+
state: renderState
|
|
863
|
+
});
|
|
864
|
+
var shape = typeof getFeatureShape === 'function' ? getFeatureShape({
|
|
865
|
+
feature: geoJson,
|
|
866
|
+
state: renderState
|
|
867
|
+
}) : getFeatureShape;
|
|
868
|
+
var elemKey = "".concat(_constants.ELEMENT_TYPE.FEATURE, ".").concat(index);
|
|
869
|
+
switch (renderType) {
|
|
870
|
+
case _constants.RENDER_TYPE.POINT:
|
|
871
|
+
if (shape === 'rect') {
|
|
872
|
+
return /*#__PURE__*/_react["default"].createElement("g", {
|
|
873
|
+
key: elemKey,
|
|
874
|
+
transform: "translate(".concat(projected[0][0], ", ").concat(projected[0][1], ")")
|
|
875
|
+
}, /*#__PURE__*/_react["default"].createElement("rect", {
|
|
876
|
+
"data-type": _constants.ELEMENT_TYPE.FEATURE,
|
|
877
|
+
"data-feature-index": index,
|
|
878
|
+
key: "".concat(elemKey, ".hidden"),
|
|
879
|
+
style: _objectSpread(_objectSpread(_objectSpread({}, style), _style.HIDDEN_CLICKABLE_STYLE), {}, {
|
|
880
|
+
width: clickRadius,
|
|
881
|
+
height: clickRadius
|
|
882
|
+
})
|
|
883
|
+
}), /*#__PURE__*/_react["default"].createElement("rect", {
|
|
884
|
+
"data-type": _constants.ELEMENT_TYPE.FEATURE,
|
|
885
|
+
"data-feature-index": index,
|
|
886
|
+
key: elemKey,
|
|
887
|
+
style: style
|
|
888
|
+
}));
|
|
889
|
+
}
|
|
890
|
+
return /*#__PURE__*/_react["default"].createElement("g", {
|
|
891
|
+
key: elemKey,
|
|
892
|
+
transform: "translate(".concat(projected[0][0], ", ").concat(projected[0][1], ")")
|
|
893
|
+
}, /*#__PURE__*/_react["default"].createElement("circle", {
|
|
894
|
+
"data-type": _constants.ELEMENT_TYPE.FEATURE,
|
|
895
|
+
"data-feature-index": index,
|
|
896
|
+
key: "".concat(elemKey, ".hidden"),
|
|
897
|
+
style: _objectSpread(_objectSpread({}, style), {}, {
|
|
898
|
+
opacity: 0
|
|
899
|
+
}),
|
|
900
|
+
cx: 0,
|
|
901
|
+
cy: 0,
|
|
902
|
+
r: clickRadius
|
|
903
|
+
}), /*#__PURE__*/_react["default"].createElement("circle", {
|
|
904
|
+
"data-type": _constants.ELEMENT_TYPE.FEATURE,
|
|
905
|
+
"data-feature-index": index,
|
|
906
|
+
key: "feature.".concat(index),
|
|
907
|
+
style: style,
|
|
908
|
+
cx: 0,
|
|
909
|
+
cy: 0
|
|
910
|
+
}));
|
|
911
|
+
|
|
912
|
+
// first <path> is to make path easily interacted with
|
|
913
|
+
case _constants.RENDER_TYPE.LINE_STRING:
|
|
914
|
+
return /*#__PURE__*/_react["default"].createElement("g", {
|
|
915
|
+
key: elemKey
|
|
916
|
+
}, /*#__PURE__*/_react["default"].createElement("path", {
|
|
917
|
+
"data-type": _constants.ELEMENT_TYPE.FEATURE,
|
|
918
|
+
"data-feature-index": index,
|
|
919
|
+
key: "".concat(elemKey, ".hidden"),
|
|
920
|
+
style: _objectSpread(_objectSpread({}, style), {}, {
|
|
921
|
+
strokeWidth: clickRadius,
|
|
922
|
+
opacity: 0
|
|
923
|
+
}),
|
|
924
|
+
d: projected
|
|
925
|
+
}), /*#__PURE__*/_react["default"].createElement("path", {
|
|
926
|
+
"data-type": _constants.ELEMENT_TYPE.FEATURE,
|
|
927
|
+
"data-feature-index": index,
|
|
928
|
+
key: elemKey,
|
|
929
|
+
style: style,
|
|
930
|
+
d: projected
|
|
931
|
+
}));
|
|
932
|
+
case 'Polygon':
|
|
933
|
+
case 'Rectangle':
|
|
934
|
+
return /*#__PURE__*/_react["default"].createElement("path", {
|
|
935
|
+
"data-type": _constants.ELEMENT_TYPE.FEATURE,
|
|
936
|
+
"data-feature-index": index,
|
|
937
|
+
key: elemKey,
|
|
938
|
+
style: style,
|
|
939
|
+
d: projected
|
|
940
|
+
});
|
|
941
|
+
default:
|
|
942
|
+
return null;
|
|
943
|
+
}
|
|
944
|
+
});
|
|
945
|
+
(0, _defineProperty2["default"])(_this, "_renderFeatures", function () {
|
|
946
|
+
var features = _this.state.features;
|
|
947
|
+
return features && features.map(_this._renderFeature);
|
|
948
|
+
});
|
|
949
|
+
(0, _defineProperty2["default"])(_this, "_renderCanvas", function () {
|
|
950
|
+
var _this$state7 = _this.state,
|
|
951
|
+
selectedFeatureId = _this$state7.selectedFeatureId,
|
|
952
|
+
features = _this$state7.features;
|
|
953
|
+
return /*#__PURE__*/_react["default"].createElement("svg", {
|
|
954
|
+
key: "draw-canvas",
|
|
955
|
+
width: "100%",
|
|
956
|
+
height: "100%"
|
|
957
|
+
}, features && features.length > 0 && /*#__PURE__*/_react["default"].createElement("g", {
|
|
958
|
+
key: "feature-group"
|
|
959
|
+
}, _this._renderFeatures()), selectedFeatureId && _this._renderCurrent());
|
|
960
|
+
});
|
|
961
|
+
(0, _defineProperty2["default"])(_this, "_renderEditor", function () {
|
|
962
|
+
var viewport = _this._context && _this._context.viewport || {};
|
|
963
|
+
var style = _this.props.style;
|
|
964
|
+
var width = viewport.width,
|
|
965
|
+
height = viewport.height;
|
|
966
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
967
|
+
id: "editor",
|
|
968
|
+
style: _objectSpread({
|
|
969
|
+
width: width,
|
|
970
|
+
height: height
|
|
971
|
+
}, style),
|
|
972
|
+
ref: function ref(_) {
|
|
973
|
+
_this._containerRef = _;
|
|
974
|
+
}
|
|
975
|
+
}, _this._renderCanvas());
|
|
976
|
+
});
|
|
977
|
+
_this.state = {
|
|
978
|
+
features: props.features ? props.features.map(function (f) {
|
|
979
|
+
return _feature2["default"].fromFeature(f);
|
|
980
|
+
}).filter(Boolean) : null,
|
|
981
|
+
selectedFeatureId: -1,
|
|
982
|
+
hoveredFeatureId: null,
|
|
983
|
+
hoveredLngLat: null,
|
|
984
|
+
hoveredVertexIndex: -1,
|
|
985
|
+
// intermediate mouse position when drawing
|
|
986
|
+
uncommittedLngLat: null,
|
|
987
|
+
draggingVertexIndex: -1,
|
|
988
|
+
startDragPos: null,
|
|
989
|
+
isDragging: false,
|
|
990
|
+
didDrag: false
|
|
991
|
+
};
|
|
992
|
+
_this._containerRef = null;
|
|
993
|
+
_this._events = {};
|
|
994
|
+
_this._context = null;
|
|
995
|
+
return _this;
|
|
996
|
+
}
|
|
997
|
+
(0, _inherits2["default"])(Editor, _PureComponent);
|
|
998
|
+
return (0, _createClass2["default"])(Editor, [{
|
|
999
|
+
key: "componentDidMount",
|
|
1000
|
+
value: function componentDidMount() {
|
|
1001
|
+
if (this.props.mode && this.props.mode !== _constants.MODES.READ_ONLY) {
|
|
1002
|
+
this._setupEvents();
|
|
1003
|
+
}
|
|
1004
|
+
}
|
|
1005
|
+
}, {
|
|
1006
|
+
key: "componentWillReceiveProps",
|
|
1007
|
+
value: function componentWillReceiveProps(nextProps) {
|
|
1008
|
+
if (this.props.mode !== nextProps.mode) {
|
|
1009
|
+
if (!nextProps.mode || nextProps.mode === _constants.MODES.READ_ONLY) {
|
|
1010
|
+
this._removeEvents();
|
|
1011
|
+
}
|
|
1012
|
+
if (!this.props.mode || this.props.mode === _constants.MODES.READ_ONLY) {
|
|
1013
|
+
this._setupEvents();
|
|
1014
|
+
}
|
|
1015
|
+
}
|
|
1016
|
+
if (this.props.mode !== nextProps.mode || this.props.features !== nextProps.features) {
|
|
1017
|
+
this.setState({
|
|
1018
|
+
features: nextProps.features && nextProps.features.map(function (f) {
|
|
1019
|
+
return _feature2["default"].fromFeature(f);
|
|
1020
|
+
}).filter(Boolean)
|
|
1021
|
+
});
|
|
1022
|
+
}
|
|
1023
|
+
if (this.props.mode !== nextProps.mode || this.props.selectedFeatureId !== nextProps.selectedFeatureId) {
|
|
1024
|
+
this._clearCache();
|
|
1025
|
+
this.setState({
|
|
1026
|
+
selectedFeatureId: nextProps.selectedFeatureId
|
|
1027
|
+
});
|
|
1028
|
+
}
|
|
1029
|
+
}
|
|
1030
|
+
}, {
|
|
1031
|
+
key: "componentWillUnmount",
|
|
1032
|
+
value: function componentWillUnmount() {
|
|
1033
|
+
this._removeEvents();
|
|
1034
|
+
}
|
|
1035
|
+
}, {
|
|
1036
|
+
key: "_setupEvents",
|
|
1037
|
+
value: /* EVENTS */
|
|
1038
|
+
function _setupEvents() {
|
|
1039
|
+
var _this2 = this;
|
|
1040
|
+
var ref = this._containerRef;
|
|
1041
|
+
if (!ref || !this._context || !this._context.eventManager) {
|
|
1042
|
+
return;
|
|
1043
|
+
}
|
|
1044
|
+
this._events = {
|
|
1045
|
+
anyclick: function anyclick(evt) {
|
|
1046
|
+
return _this2._onEvent(_this2._onClick, evt, true);
|
|
1047
|
+
},
|
|
1048
|
+
click: function click(evt) {
|
|
1049
|
+
return evt.stopImmediatePropagation();
|
|
1050
|
+
},
|
|
1051
|
+
pointermove: function pointermove(evt) {
|
|
1052
|
+
return _this2._onEvent(_this2._onMouseMove, evt, true);
|
|
1053
|
+
},
|
|
1054
|
+
pointerdown: function pointerdown(evt) {
|
|
1055
|
+
return _this2._onEvent(_this2._onMouseDown, evt, true);
|
|
1056
|
+
},
|
|
1057
|
+
pointerup: function pointerup(evt) {
|
|
1058
|
+
return _this2._onEvent(_this2._onMouseUp, evt, true);
|
|
1059
|
+
},
|
|
1060
|
+
panmove: function panmove(evt) {
|
|
1061
|
+
return _this2._onEvent(_this2._onPan, evt, false);
|
|
1062
|
+
},
|
|
1063
|
+
panstart: function panstart(evt) {
|
|
1064
|
+
return _this2._onEvent(_this2._onPan, evt, false);
|
|
1065
|
+
},
|
|
1066
|
+
panend: function panend(evt) {
|
|
1067
|
+
return _this2._onEvent(_this2._onPan, evt, false);
|
|
1068
|
+
}
|
|
1069
|
+
};
|
|
1070
|
+
this._context.eventManager.on(this._events, ref);
|
|
1071
|
+
}
|
|
1072
|
+
}, {
|
|
1073
|
+
key: "_removeEvents",
|
|
1074
|
+
value: function _removeEvents() {
|
|
1075
|
+
if (!this._context || !this._context.eventManager || !this._events) {
|
|
1076
|
+
return;
|
|
1077
|
+
}
|
|
1078
|
+
this._context.eventManager.off(this._events);
|
|
1079
|
+
this._events = null;
|
|
1080
|
+
}
|
|
1081
|
+
}, {
|
|
1082
|
+
key: "_getProjectedData",
|
|
1083
|
+
value: function _getProjectedData(points, renderType) {
|
|
1084
|
+
var _this3 = this;
|
|
1085
|
+
var isClosed = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
1086
|
+
if (points.length === 0) {
|
|
1087
|
+
return '';
|
|
1088
|
+
}
|
|
1089
|
+
var projected = points.map(function (p) {
|
|
1090
|
+
return _this3._project(p);
|
|
1091
|
+
});
|
|
1092
|
+
switch (renderType) {
|
|
1093
|
+
case _constants.RENDER_TYPE.POINT:
|
|
1094
|
+
return projected;
|
|
1095
|
+
case _constants.RENDER_TYPE.LINE_STRING:
|
|
1096
|
+
case _constants.RENDER_TYPE.POLYGON:
|
|
1097
|
+
case _constants.RENDER_TYPE.RECTANGLE:
|
|
1098
|
+
var pathString = projected.map(function (p) {
|
|
1099
|
+
return "".concat(p[0], ",").concat(p[1]);
|
|
1100
|
+
}).join('L');
|
|
1101
|
+
return "M ".concat(pathString, " ").concat(isClosed ? 'z' : '');
|
|
1102
|
+
default:
|
|
1103
|
+
return null;
|
|
1104
|
+
}
|
|
1105
|
+
}
|
|
1106
|
+
}, {
|
|
1107
|
+
key: "render",
|
|
1108
|
+
value: function render() {
|
|
1109
|
+
var _this4 = this;
|
|
1110
|
+
return /*#__PURE__*/_react["default"].createElement(_reactMapGl._MapContext.Consumer, null, function (context) {
|
|
1111
|
+
_this4._context = context;
|
|
1112
|
+
var viewport = context && context.viewport;
|
|
1113
|
+
if (!viewport || viewport.height <= 0 || viewport.width <= 0) {
|
|
1114
|
+
return null;
|
|
1115
|
+
}
|
|
1116
|
+
return _this4._renderEditor();
|
|
1117
|
+
});
|
|
1118
|
+
}
|
|
1119
|
+
}]);
|
|
1120
|
+
}(_react.PureComponent);
|
|
1121
|
+
(0, _defineProperty2["default"])(Editor, "defaultProps", defaultProps);
|
|
1122
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3RNYXBHbCIsIl91dWlkIiwiX2ZlYXR1cmUyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9zdHlsZSIsIl9jb25zdGFudHMiLCJfdXRpbHMiLCJfZXhjbHVkZWQiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJfY2FsbFN1cGVyIiwiX2dldFByb3RvdHlwZU9mMiIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiY29uc3RydWN0b3IiLCJCb29sZWFuIiwicHJvdG90eXBlIiwidmFsdWVPZiIsImRlZmF1bHRQcm9wcyIsIm1vZGUiLCJNT0RFUyIsIlJFQURfT05MWSIsImNsaWNrUmFkaXVzIiwiZ2V0RWRpdEhhbmRsZVN0eWxlIiwiZGVmYXVsdEdldEVkaXRIYW5kbGVTdHlsZSIsImdldEZlYXR1cmVTdHlsZSIsImRlZmF1bHRHZXRGZWF0dXJlU3R5bGUiLCJnZXRGZWF0dXJlU2hhcGUiLCJnZXRFZGl0SGFuZGxlU2hhcGUiLCJvblNlbGVjdCIsIlVOQ09NTUlUVEVEX0lEIiwiRWRpdG9yIiwiZXhwb3J0cyIsIl9QdXJlQ29tcG9uZW50IiwicHJvcHMiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjazIiLCJmZWF0dXJlcyIsIm9uVXBkYXRlIiwibWFwIiwiZiIsInRvRmVhdHVyZSIsImZlYXR1cmUiLCJvcHRpb25zIiwidmVydGV4SW5kZXgiLCJsbmdMYXQiLCJkaWFnb25hbCIsInAwIiwicG9pbnRzIiwicmVwbGFjZVBvaW50IiwiX3VwZGF0ZSIsInN0YXRlIiwicmVuZGVyVHlwZSIsIlJFTkRFUl9UWVBFIiwiUkVDVEFOR0xFIiwiX3VwZGF0ZVJlY3RhbmdsZSIsImR4IiwiZHkiLCJwaXhlbHMiLCJfcHJvamVjdCIsIl91bnByb2plY3QiLCJ4IiwieSIsImlzTmV3IiwidW5kZWZpbmVkIiwiX2dldFNlbGVjdGVkRmVhdHVyZSIsImFkZFBvaW50IiwidmFsaWRQYXRoIiwiX3RoaXMkcHJvcHMiLCJEUkFXX1BPSU5UIiwiRFJBV19QQVRIIiwic2VsZWN0ZWRGZWF0dXJlSWQiLCJpZCIsInNldFN0YXRlIiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsInVuY29tbWl0dGVkTG5nTGF0IiwiaG92ZXJlZEZlYXR1cmVJZCIsImhvdmVyZWRMbmdMYXQiLCJob3ZlcmVkVmVydGV4SW5kZXgiLCJkcmFnZ2luZ1ZlcnRleEluZGV4Iiwic3RhcnREcmFnUG9zIiwiaXNEcmFnZ2luZyIsImRpZERyYWciLCJzZWxlY3RlZEZlYXR1cmUiLCJjbG9zZVBhdGgiLCJwb2ludCIsInR5cGUiLCJNT0RFX1RPX0dFT0pTT05fVFlQRSIsIk1PREVfVE9fUkVOREVSX1RZUEUiLCJGZWF0dXJlIiwidXVpZCIsIl9hZGRQb2ludCIsIkRSQVdfUkVDVEFOR0xFIiwiaGFuZGxlciIsImV2dCIsInN0b3BQcm9wYWdhdGlvbiIsIl9sZW4iLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiY29uY2F0Iiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwiTnVtYmVyIiwiX3RoaXMkX2dldEV2ZW50UG9zaXRpIiwiX2dldEV2ZW50UG9zaXRpb24iLCJhdHRyaWJ1dGVzIiwicGFyc2VFbGVtRGF0YUF0dHJpYnV0ZXMiLCJ0YXJnZXQiLCJFTEVNRU5UX1RZUEUiLCJWRVJURVgiLCJfbWF0Y2hlc0ZlYXR1cmUiLCJmZWF0dXJlSW5kZXgiLCJfdGhpcyRzdGF0ZSIsIl90aGlzJF9nZXRFdmVudFBvc2l0aTIiLCJpc0RyYXdpbmciLCJEUkFXSU5HX01PREVTIiwiaW5kZXhPZiIsImlzRWRpdGluZyIsIkVESVRfVkVSVEVYIiwiX3VwZGF0ZUZlYXR1cmUiLCJMSU5FX1NUUklORyIsIlBPTFlHT04iLCJTRUdNRU5UIiwiX2dldENsb3Nlc3RQb3NpdGlvbk9uU2VnbWVudCIsIl90aGlzJHN0YXRlMiIsIkZFQVRVUkUiLCJzb3VyY2VFdmVudCIsIm9wZXJhdGlvbiIsIk9QRVJBVElPTlMiLCJJTlRFUlNFQ1QiLCJTRVQiLCJfY2xvc2VQYXRoIiwiX2NsZWFyQ2FjaGUiLCJfdGhpcyRfZ2V0RXZlbnRQb3NpdGkzIiwiaW5zZXJ0UG9zaXRpb24iLCJpbnNlcnRQb2ludCIsIl9vbkNsaWNrVmVydGV4IiwiX29uQ2xpY2tTZWdtZW50IiwiU0VMRUNUX0ZFQVRVUkUiLCJfb25DbGlja0ZlYXR1cmUiLCJfdGhpcyRfZ2V0RXZlbnRQb3NpdGk0IiwiX2FkZEZlYXR1cmUiLCJEUkFXX1BPTFlHT04iLCJpc0Nsb3NlZCIsInB0IiwiX2NvbnRleHQiLCJ2aWV3cG9ydCIsInByb2plY3QiLCJ1bnByb2plY3QiLCJlbGVtRmVhdHVyZSIsInBvaW50TG5nTGF0Iiwic3RhcnRQb3MiLCJlbmRQb3MiLCJmaW5kQ2xvc2VzdFBvaW50T25MaW5lU2VnbWVudCIsIl9ldnQkb2Zmc2V0Q2VudGVyIiwib2Zmc2V0Q2VudGVyIiwiX3RoaXMkc3RhdGUzIiwiZmluZCIsImluZGV4IiwicmVuZGVyU3RhdGUiLCJfdGhpcyRzdGF0ZTQiLCJpc1NlbGVjdGVkIiwiUE9JTlQiLCJpc0Nsb3NpbmciLCJSRU5ERVJfU1RBVEUiLCJDTE9TSU5HIiwiU0VMRUNURUQiLCJIT1ZFUkVEIiwiVU5DT01NSVRURUQiLCJJTkFDVElWRSIsIl90aGlzJHN0YXRlNSIsInBvc2l0aW9uIiwic3R5bGUiLCJzaGFwZSIsInAiLCJlbGVtS2V5IiwiY3JlYXRlRWxlbWVudCIsImtleSIsInRyYW5zZm9ybSIsIkhJRERFTl9DTElDS0FCTEVfU1RZTEUiLCJzdHJva2UiLCJjeCIsImN5Iiwid2lkdGgiLCJoZWlnaHQiLCJzdGFydFZlcnRleElkIiwicHJvamVjdGVkIiwiX2dldFByb2plY3RlZERhdGEiLCJyYWRpdXMiLCJvdGhlcnMiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyIiwic3Ryb2tlV2lkdGgiLCJvcGFjaXR5IiwiZCIsInNlZ21lbnRzIiwiX3JlbmRlclNlZ21lbnQiLCJsYXN0SW5kZXgiLCJtIiwidW5jb21taXR0ZWRTZWdtZW50cyIsInNsaWNlIiwiZmlsbFBvaW50cyIsImZpbGxQYXRoIiwiZ2VvSnNvbiIsImNvbW1pdHRlZFN0eWxlIiwidW5jb21taXR0ZWRTdHlsZSIsImNsb3NpbmdTdHlsZSIsImNvbW1pdHRlZFN0cm9rZSIsIl9yZW5kZXJDb21taXR0ZWRTdHJva2UiLCJ1bmNvbW1pdHRlZFN0cm9rZXMiLCJfcmVuZGVyVW5jb21taXR0ZWRTdHJva2VzIiwiY2xvc2luZ1N0cm9rZSIsIl9yZW5kZXJDbG9zaW5nU3Ryb2tlIiwiZmlsbCIsIl9yZW5kZXJGaWxsIiwiX3RoaXMkcHJvcHMyIiwiY29tbWl0dGVkVmVydGljZXMiLCJfZ2V0RWRpdEhhbmRsZVN0YXRlIiwiX3JlbmRlclZlcnRleCIsIl90aGlzJHByb3BzMyIsIl90aGlzJHN0YXRlNiIsInVuY29tbWl0dGVkVmVydGV4IiwiSU5TRVJUIiwicG9pbnRlckV2ZW50cyIsIl9yZW5kZXJDb21taXR0ZWRWZXJ0aWNlcyIsIl9yZW5kZXJVbmNvbW1pdHRlZFZlcnRleCIsImZpbmRJbmRleCIsIlNUQVRJQ19TVFlMRSIsIl9yZW5kZXJDdXJyZW50UGF0aCIsIl9yZW5kZXJDdXJyZW50VmVydGljZXMiLCJfZ2V0RmVhdHVyZVJlbmRlclN0YXRlIiwiX3RoaXMkcHJvcHM0IiwiX3JlbmRlckZlYXR1cmUiLCJfdGhpcyRzdGF0ZTciLCJfcmVuZGVyRmVhdHVyZXMiLCJfcmVuZGVyQ3VycmVudCIsInJlZiIsIl8iLCJfY29udGFpbmVyUmVmIiwiX3JlbmRlckNhbnZhcyIsImZyb21GZWF0dXJlIiwiX2V2ZW50cyIsIl9pbmhlcml0czIiLCJfY3JlYXRlQ2xhc3MyIiwidmFsdWUiLCJjb21wb25lbnREaWRNb3VudCIsIl9zZXR1cEV2ZW50cyIsImNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMiLCJuZXh0UHJvcHMiLCJfcmVtb3ZlRXZlbnRzIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJfdGhpczIiLCJldmVudE1hbmFnZXIiLCJhbnljbGljayIsIl9vbkV2ZW50IiwiX29uQ2xpY2siLCJjbGljayIsInBvaW50ZXJtb3ZlIiwiX29uTW91c2VNb3ZlIiwicG9pbnRlcmRvd24iLCJfb25Nb3VzZURvd24iLCJwb2ludGVydXAiLCJfb25Nb3VzZVVwIiwicGFubW92ZSIsIl9vblBhbiIsInBhbnN0YXJ0IiwicGFuZW5kIiwib24iLCJvZmYiLCJfdGhpczMiLCJwYXRoU3RyaW5nIiwiam9pbiIsInJlbmRlciIsIl90aGlzNCIsIl9NYXBDb250ZXh0IiwiQ29uc3VtZXIiLCJjb250ZXh0IiwiX3JlbmRlckVkaXRvciIsIlB1cmVDb21wb25lbnQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdmVuZG9yL3JlYWN0LW1hcC1nbC1kcmF3L2VkaXRvci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBWZW5kb3JlZCBmcm9tIHJlYWN0LW1hcC1nbC1kcmF3QDAuMTQuOCAoTUlULCBDb3B5cmlnaHQgKGMpIDIwMTggVWJlciBUZWNobm9sb2dpZXMsIEluYy4pLCBzZWUgLi9MSUNFTlNFXG4vKiBlc2xpbnQtZGlzYWJsZSBjb21wbGV4aXR5LCBtYXgtc3RhdGVtZW50cyAqL1xuaW1wb3J0IFJlYWN0LCB7UHVyZUNvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtfTWFwQ29udGV4dCBhcyBNYXBDb250ZXh0fSBmcm9tICdyZWFjdC1tYXAtZ2wnO1xuaW1wb3J0IHt2NCBhcyB1dWlkfSBmcm9tICd1dWlkJztcblxuaW1wb3J0IEZlYXR1cmUgZnJvbSAnLi9mZWF0dXJlJztcbmltcG9ydCB7XG4gIGdldEVkaXRIYW5kbGVTdHlsZSBhcyBkZWZhdWx0R2V0RWRpdEhhbmRsZVN0eWxlLFxuICBnZXRGZWF0dXJlU3R5bGUgYXMgZGVmYXVsdEdldEZlYXR1cmVTdHlsZSxcbiAgSElEREVOX0NMSUNLQUJMRV9TVFlMRVxufSBmcm9tICcuL3N0eWxlJztcblxuaW1wb3J0IHtcbiAgT1BFUkFUSU9OUyxcbiAgTU9ERVMsXG4gIERSQVdJTkdfTU9ERVMsXG4gIE1PREVfVE9fR0VPSlNPTl9UWVBFLFxuICBNT0RFX1RPX1JFTkRFUl9UWVBFLFxuICBSRU5ERVJfU1RBVEUsXG4gIFJFTkRFUl9UWVBFLFxuICBTVEFUSUNfU1RZTEUsXG4gIEVMRU1FTlRfVFlQRVxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge3BhcnNlRWxlbURhdGFBdHRyaWJ1dGVzLCBmaW5kQ2xvc2VzdFBvaW50T25MaW5lU2VnbWVudH0gZnJvbSAnLi91dGlscyc7XG5cbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgbW9kZTogTU9ERVMuUkVBRF9PTkxZLFxuICBjbGlja1JhZGl1czogMCxcbiAgZ2V0RWRpdEhhbmRsZVN0eWxlOiBkZWZhdWx0R2V0RWRpdEhhbmRsZVN0eWxlLFxuICBnZXRGZWF0dXJlU3R5bGU6IGRlZmF1bHRHZXRGZWF0dXJlU3R5bGUsXG4gIGdldEZlYXR1cmVTaGFwZTogJ2NpcmNsZScsXG4gIGdldEVkaXRIYW5kbGVTaGFwZTogJ2NpcmNsZScsXG4gIG9uU2VsZWN0OiAoKSA9PiB7fVxufTtcblxuY29uc3QgVU5DT01NSVRURURfSUQgPSAndW5jb21taXR0ZWQnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFZGl0b3IgZXh0ZW5kcyBQdXJlQ29tcG9uZW50IHtcbiAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgZmVhdHVyZXM6IHByb3BzLmZlYXR1cmVzXG4gICAgICAgID8gcHJvcHMuZmVhdHVyZXMubWFwKGYgPT4gRmVhdHVyZS5mcm9tRmVhdHVyZShmKSkuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIDogbnVsbCxcblxuICAgICAgc2VsZWN0ZWRGZWF0dXJlSWQ6IC0xLFxuXG4gICAgICBob3ZlcmVkRmVhdHVyZUlkOiBudWxsLFxuICAgICAgaG92ZXJlZExuZ0xhdDogbnVsbCxcbiAgICAgIGhvdmVyZWRWZXJ0ZXhJbmRleDogLTEsXG5cbiAgICAgIC8vIGludGVybWVkaWF0ZSBtb3VzZSBwb3NpdGlvbiB3aGVuIGRyYXdpbmdcbiAgICAgIHVuY29tbWl0dGVkTG5nTGF0OiBudWxsLFxuXG4gICAgICBkcmFnZ2luZ1ZlcnRleEluZGV4OiAtMSxcbiAgICAgIHN0YXJ0RHJhZ1BvczogbnVsbCxcbiAgICAgIGlzRHJhZ2dpbmc6IGZhbHNlLFxuICAgICAgZGlkRHJhZzogZmFsc2VcbiAgICB9O1xuXG4gICAgdGhpcy5fY29udGFpbmVyUmVmID0gbnVsbDtcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICB0aGlzLl9jb250ZXh0ID0gbnVsbDtcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGlmICh0aGlzLnByb3BzLm1vZGUgJiYgdGhpcy5wcm9wcy5tb2RlICE9PSBNT0RFUy5SRUFEX09OTFkpIHtcbiAgICAgIHRoaXMuX3NldHVwRXZlbnRzKCk7XG4gICAgfVxuICB9XG5cbiAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5tb2RlICE9PSBuZXh0UHJvcHMubW9kZSkge1xuICAgICAgaWYgKCFuZXh0UHJvcHMubW9kZSB8fCBuZXh0UHJvcHMubW9kZSA9PT0gTU9ERVMuUkVBRF9PTkxZKSB7XG4gICAgICAgIHRoaXMuX3JlbW92ZUV2ZW50cygpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLnByb3BzLm1vZGUgfHwgdGhpcy5wcm9wcy5tb2RlID09PSBNT0RFUy5SRUFEX09OTFkpIHtcbiAgICAgICAgdGhpcy5fc2V0dXBFdmVudHMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9wcy5tb2RlICE9PSBuZXh0UHJvcHMubW9kZSB8fCB0aGlzLnByb3BzLmZlYXR1cmVzICE9PSBuZXh0UHJvcHMuZmVhdHVyZXMpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBmZWF0dXJlczpcbiAgICAgICAgICBuZXh0UHJvcHMuZmVhdHVyZXMgJiYgbmV4dFByb3BzLmZlYXR1cmVzLm1hcChmID0+IEZlYXR1cmUuZnJvbUZlYXR1cmUoZikpLmZpbHRlcihCb29sZWFuKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5wcm9wcy5tb2RlICE9PSBuZXh0UHJvcHMubW9kZSB8fFxuICAgICAgdGhpcy5wcm9wcy5zZWxlY3RlZEZlYXR1cmVJZCAhPT0gbmV4dFByb3BzLnNlbGVjdGVkRmVhdHVyZUlkXG4gICAgKSB7XG4gICAgICB0aGlzLl9jbGVhckNhY2hlKCk7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2VsZWN0ZWRGZWF0dXJlSWQ6IG5leHRQcm9wcy5zZWxlY3RlZEZlYXR1cmVJZFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy5fcmVtb3ZlRXZlbnRzKCk7XG4gIH1cblxuICBfY29udGFpbmVyUmVmO1xuICBfZXZlbnRzO1xuICBfY29udGV4dDtcblxuICAvKiBGRUFUVVJFIE9QRVJBVElPTlMgKi9cbiAgX3VwZGF0ZSA9IGZlYXR1cmVzID0+IHtcbiAgICBpZiAoZmVhdHVyZXMpIHtcbiAgICAgIHRoaXMucHJvcHMub25VcGRhdGUoZmVhdHVyZXMubWFwKGYgPT4gZi50b0ZlYXR1cmUoKSkpO1xuICAgIH1cbiAgfTtcblxuICBfdXBkYXRlUmVjdGFuZ2xlID0gKGZlYXR1cmUsIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCB7dmVydGV4SW5kZXgsIGxuZ0xhdH0gPSBvcHRpb25zO1xuICAgIC8qXG4gICAgICogICBwMC54LCBwMC55ICAgLS0tLS0tLS0tLSAgZGlhZ29uYWwueCwgcDAueVxuICAgICAqICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogICBwMC54LCBkaWFnb25hbC55IC0tLS0tIGRpYWdvbmFsLngsIGRpYWdvbmFsLnlcbiAgICAgKi9cbiAgICBjb25zdCBkaWFnb25hbCA9IHZlcnRleEluZGV4O1xuICAgIGNvbnN0IHAwID0gZmVhdHVyZS5wb2ludHNbKGRpYWdvbmFsICsgMikgJSA0XTtcblxuICAgIGZlYXR1cmUucmVwbGFjZVBvaW50KGRpYWdvbmFsLCBbbG5nTGF0WzBdLCBsbmdMYXRbMV1dKTtcbiAgICBmZWF0dXJlLnJlcGxhY2VQb2ludCgoZGlhZ29uYWwgKyAxKSAlIDQsIFtsbmdMYXRbMF0sIHAwWzFdXSk7XG4gICAgZmVhdHVyZS5yZXBsYWNlUG9pbnQoKGRpYWdvbmFsICsgMykgJSA0LCBbcDBbMF0sIGxuZ0xhdFsxXV0pO1xuXG4gICAgdGhpcy5fdXBkYXRlKHRoaXMuc3RhdGUuZmVhdHVyZXMpO1xuICB9O1xuXG4gIF91cGRhdGVGZWF0dXJlID0gKGZlYXR1cmUsIG1vZGUsIG9wdGlvbnMpID0+IHtcbiAgICBzd2l0Y2ggKG1vZGUpIHtcbiAgICAgIGNhc2UgJ3ZlcnRleCc6XG4gICAgICAgIGlmIChmZWF0dXJlLnJlbmRlclR5cGUgPT09IFJFTkRFUl9UWVBFLlJFQ1RBTkdMRSkge1xuICAgICAgICAgIHRoaXMuX3VwZGF0ZVJlY3RhbmdsZShmZWF0dXJlLCBvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmZWF0dXJlLnJlcGxhY2VQb2ludChvcHRpb25zLnZlcnRleEluZGV4LCBbb3B0aW9ucy5sbmdMYXRbMF0sIG9wdGlvbnMubG5nTGF0WzFdXSk7XG4gICAgICAgICAgdGhpcy5fdXBkYXRlKHRoaXMuc3RhdGUuZmVhdHVyZXMpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdmZWF0dXJlJzpcbiAgICAgICAgY29uc3Qge2R4LCBkeX0gPSBvcHRpb25zO1xuICAgICAgICBmZWF0dXJlLnBvaW50cyA9IGZlYXR1cmUucG9pbnRzXG4gICAgICAgICAgLm1hcChsbmdMYXQgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGl4ZWxzID0gdGhpcy5fcHJvamVjdChsbmdMYXQpO1xuICAgICAgICAgICAgaWYgKHBpeGVscykge1xuICAgICAgICAgICAgICBwaXhlbHNbMF0gKz0gZHg7XG4gICAgICAgICAgICAgIHBpeGVsc1sxXSArPSBkeTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VucHJvamVjdChwaXhlbHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgICAgIHRoaXMuX3VwZGF0ZSh0aGlzLnN0YXRlLmZlYXR1cmVzKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ1JlY3RhbmdsZSc6XG4gICAgICAgIHRoaXMuX3VwZGF0ZVJlY3RhbmdsZShmZWF0dXJlLCBvcHRpb25zKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuICB9O1xuXG4gIF9hZGRQb2ludCA9ICh4LCB5LCBmZWF0dXJlLCBpc05ldyA9IGZhbHNlKSA9PiB7XG4gICAgZmVhdHVyZSA9IGZlYXR1cmUgfHwgdGhpcy5fZ2V0U2VsZWN0ZWRGZWF0dXJlKCk7XG5cbiAgICBpZiAoIWZlYXR1cmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsbmdMYXQgPSB0aGlzLl91bnByb2plY3QoW3gsIHldKTtcbiAgICBpZiAoIWxuZ0xhdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZlYXR1cmUuYWRkUG9pbnQoW2xuZ0xhdFswXSwgbG5nTGF0WzFdXSk7XG5cbiAgICBjb25zdCBmZWF0dXJlcyA9IHRoaXMuc3RhdGUuZmVhdHVyZXMgfHwgW107XG4gICAgaWYgKGlzTmV3KSB7XG4gICAgICBmZWF0dXJlcy5wdXNoKGZlYXR1cmUpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkUGF0aCA9IGZlYXR1cmUucG9pbnRzICYmIGZlYXR1cmUucG9pbnRzLmxlbmd0aCA+PSAyO1xuICAgIGNvbnN0IHttb2RlLCBvblNlbGVjdH0gPSB0aGlzLnByb3BzO1xuXG4gICAgaWYgKG1vZGUgPT09IE1PREVTLkRSQVdfUE9JTlQgfHwgKG1vZGUgPT09IE1PREVTLkRSQVdfUEFUSCAmJiB2YWxpZFBhdGgpKSB7XG4gICAgICB0aGlzLl91cGRhdGUoZmVhdHVyZXMpO1xuICAgICAgb25TZWxlY3Qoe3NlbGVjdGVkRmVhdHVyZUlkOiBmZWF0dXJlICYmIGZlYXR1cmUuaWR9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGZlYXR1cmVzOiBbLi4uZmVhdHVyZXNdLFxuICAgICAgICBzZWxlY3RlZEZlYXR1cmVJZDogZmVhdHVyZSAmJiBmZWF0dXJlLmlkXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgX2NsZWFyQ2FjaGUgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzZWxlY3RlZEZlYXR1cmVJZDogbnVsbCxcbiAgICAgIHVuY29tbWl0dGVkTG5nTGF0OiBudWxsLFxuXG4gICAgICBob3ZlcmVkRmVhdHVyZUlkOiBudWxsLFxuICAgICAgaG92ZXJlZExuZ0xhdDogbnVsbCxcbiAgICAgIGhvdmVyZWRWZXJ0ZXhJbmRleDogLTEsXG5cbiAgICAgIGRyYWdnaW5nVmVydGV4SW5kZXg6IC0xLFxuICAgICAgc3RhcnREcmFnUG9zOiBudWxsLFxuICAgICAgaXNEcmFnZ2luZzogZmFsc2UsXG4gICAgICBkaWREcmFnOiBmYWxzZVxuICAgIH0pO1xuICB9O1xuXG4gIF9jbG9zZVBhdGggPSAoKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRGZWF0dXJlID0gdGhpcy5fZ2V0U2VsZWN0ZWRGZWF0dXJlKCk7XG4gICAgaWYgKHNlbGVjdGVkRmVhdHVyZSkge1xuICAgICAgc2VsZWN0ZWRGZWF0dXJlLmNsb3NlUGF0aCgpO1xuICAgICAgdGhpcy5fdXBkYXRlKHRoaXMuc3RhdGUuZmVhdHVyZXMpO1xuICAgIH1cbiAgfTtcblxuICBfYWRkRmVhdHVyZSA9IChtb2RlLCBwb2ludCkgPT4ge1xuICAgIGNvbnN0IHR5cGUgPSBNT0RFX1RPX0dFT0pTT05fVFlQRVttb2RlXTtcbiAgICBjb25zdCByZW5kZXJUeXBlID0gTU9ERV9UT19SRU5ERVJfVFlQRVttb2RlXTtcblxuICAgIGNvbnN0IGZlYXR1cmUgPSBuZXcgRmVhdHVyZSh7XG4gICAgICBpZDogdXVpZCgpLFxuICAgICAgdHlwZSxcbiAgICAgIHJlbmRlclR5cGVcbiAgICB9KTtcblxuICAgIHRoaXMuX2FkZFBvaW50KHBvaW50LngsIHBvaW50LnksIGZlYXR1cmUsIHRydWUpO1xuXG4gICAgaWYgKG1vZGUgPT09IE1PREVTLkRSQVdfUkVDVEFOR0xFKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDM7IGkrKykge1xuICAgICAgICB0aGlzLl9hZGRQb2ludChwb2ludC54LCBwb2ludC55LCBmZWF0dXJlLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qIEVWRU5UUyAqL1xuICBfc2V0dXBFdmVudHMoKSB7XG4gICAgY29uc3QgcmVmID0gdGhpcy5fY29udGFpbmVyUmVmO1xuXG4gICAgaWYgKCFyZWYgfHwgIXRoaXMuX2NvbnRleHQgfHwgIXRoaXMuX2NvbnRleHQuZXZlbnRNYW5hZ2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fZXZlbnRzID0ge1xuICAgICAgYW55Y2xpY2s6IGV2dCA9PiB0aGlzLl9vbkV2ZW50KHRoaXMuX29uQ2xpY2ssIGV2dCwgdHJ1ZSksXG4gICAgICBjbGljazogZXZ0ID0+IGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSxcbiAgICAgIHBvaW50ZXJtb3ZlOiBldnQgPT4gdGhpcy5fb25FdmVudCh0aGlzLl9vbk1vdXNlTW92ZSwgZXZ0LCB0cnVlKSxcbiAgICAgIHBvaW50ZXJkb3duOiBldnQgPT4gdGhpcy5fb25FdmVudCh0aGlzLl9vbk1vdXNlRG93biwgZXZ0LCB0cnVlKSxcbiAgICAgIHBvaW50ZXJ1cDogZXZ0ID0+IHRoaXMuX29uRXZlbnQodGhpcy5fb25Nb3VzZVVwLCBldnQsIHRydWUpLFxuICAgICAgcGFubW92ZTogZXZ0ID0+IHRoaXMuX29uRXZlbnQodGhpcy5fb25QYW4sIGV2dCwgZmFsc2UpLFxuICAgICAgcGFuc3RhcnQ6IGV2dCA9PiB0aGlzLl9vbkV2ZW50KHRoaXMuX29uUGFuLCBldnQsIGZhbHNlKSxcbiAgICAgIHBhbmVuZDogZXZ0ID0+IHRoaXMuX29uRXZlbnQodGhpcy5fb25QYW4sIGV2dCwgZmFsc2UpXG4gICAgfTtcblxuICAgIHRoaXMuX2NvbnRleHQuZXZlbnRNYW5hZ2VyLm9uKHRoaXMuX2V2ZW50cywgcmVmKTtcbiAgfVxuXG4gIF9yZW1vdmVFdmVudHMoKSB7XG4gICAgaWYgKCF0aGlzLl9jb250ZXh0IHx8ICF0aGlzLl9jb250ZXh0LmV2ZW50TWFuYWdlciB8fCAhdGhpcy5fZXZlbnRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2NvbnRleHQuZXZlbnRNYW5hZ2VyLm9mZih0aGlzLl9ldmVudHMpO1xuICAgIHRoaXMuX2V2ZW50cyA9IG51bGw7XG4gIH1cblxuICBfb25FdmVudCA9IChoYW5kbGVyLCBldnQsIHN0b3BQcm9wYWdhdGlvbiwgLi4uYXJncykgPT4ge1xuICAgIGNvbnN0IHttb2RlfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKG1vZGUgPT09IE1PREVTLlJFQURfT05MWSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGhhbmRsZXIoZXZ0LCAuLi5hcmdzKTtcblxuICAgIGlmIChzdG9wUHJvcGFnYXRpb24pIHtcbiAgICAgIGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gIH07XG5cbiAgX29uTW91c2VVcCA9IGV2dCA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBpc0RyYWdnaW5nOiBmYWxzZSxcbiAgICAgIGRpZERyYWc6IGZhbHNlXG4gICAgfSk7XG4gICAgY29uc3Qge2RyYWdnaW5nVmVydGV4SW5kZXh9ID0gdGhpcy5zdGF0ZTtcblxuICAgIGlmIChOdW1iZXIoZHJhZ2dpbmdWZXJ0ZXhJbmRleCkgPj0gMCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGRyYWdnaW5nVmVydGV4SW5kZXg6IC0xXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgX29uTW91c2VEb3duID0gZXZ0ID0+IHtcbiAgICBjb25zdCB7eCwgeX0gPSB0aGlzLl9nZXRFdmVudFBvc2l0aW9uKGV2dCk7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHBhcnNlRWxlbURhdGFBdHRyaWJ1dGVzKGV2dC50YXJnZXQpO1xuXG4gICAgLy8gY2xpY2sgc2VnbWVudFxuICAgIGlmIChhdHRyaWJ1dGVzICYmIGF0dHJpYnV0ZXMudHlwZSA9PT0gRUxFTUVOVF9UWVBFLlZFUlRFWCkge1xuICAgICAgY29uc3Qge3ZlcnRleEluZGV4fSA9IGF0dHJpYnV0ZXM7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJhZ2dpbmdWZXJ0ZXhJbmRleDogdmVydGV4SW5kZXgsXG4gICAgICAgIHN0YXJ0RHJhZ1Bvczoge3gsIHl9LFxuICAgICAgICBpc0RyYWdnaW5nOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgLy8gY2xpY2sgc2VsZWN0ZWQgZmVhdHVyZVxuICAgIH0gZWxzZSBpZiAodGhpcy5fbWF0Y2hlc0ZlYXR1cmUoYXR0cmlidXRlcywgdGhpcy5fZ2V0U2VsZWN0ZWRGZWF0dXJlKCkpKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc3RhcnREcmFnUG9zOiB7eCwgeX0sXG4gICAgICAgIGlzRHJhZ2dpbmc6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICAvKiBlc2xpbnQtZGlzYWJsZSBtYXgtZGVwdGggKi9cbiAgX29uTW91c2VNb3ZlID0gZXZ0ID0+IHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gcGFyc2VFbGVtRGF0YUF0dHJpYnV0ZXMoZXZ0LnRhcmdldCkgfHwge307XG4gICAgY29uc3Qge3ZlcnRleEluZGV4LCBmZWF0dXJlSW5kZXgsIHR5cGV9ID0gYXR0cmlidXRlcztcblxuICAgIGNvbnN0IHtzdGFydERyYWdQb3MsIGlzRHJhZ2dpbmcsIGRpZERyYWd9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCB7bW9kZX0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHt4LCB5fSA9IHRoaXMuX2dldEV2ZW50UG9zaXRpb24oZXZ0KTtcbiAgICBjb25zdCBsbmdMYXQgPSB0aGlzLl91bnByb2plY3QoW3gsIHldKTtcblxuICAgIGlmIChpc0RyYWdnaW5nICYmICFkaWREcmFnICYmIHN0YXJ0RHJhZ1Bvcykge1xuICAgICAgY29uc3QgZHggPSB4IC0gc3RhcnREcmFnUG9zLng7XG4gICAgICBjb25zdCBkeSA9IHkgLSBzdGFydERyYWdQb3MueTtcbiAgICAgIGlmIChkeCAqIGR4ICsgZHkgKiBkeSA+IDUpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7ZGlkRHJhZzogdHJ1ZX0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGVkRmVhdHVyZSA9IHRoaXMuX2dldFNlbGVjdGVkRmVhdHVyZSgpO1xuICAgIGNvbnN0IGlzRHJhd2luZyA9IERSQVdJTkdfTU9ERVMuaW5kZXhPZihtb2RlKSAhPT0gLTE7XG4gICAgY29uc3QgaXNFZGl0aW5nID0gbW9kZSA9PT0gTU9ERVMuRURJVF9WRVJURVg7XG5cbiAgICBpZiAoc2VsZWN0ZWRGZWF0dXJlKSB7XG4gICAgICAvLyBkcmFnZ2luZ1xuICAgICAgaWYgKGRpZERyYWcgJiYgc3RhcnREcmFnUG9zKSB7XG4gICAgICAgIGNvbnN0IGRyYWdnaW5nVmVydGV4SW5kZXggPSBOdW1iZXIodGhpcy5zdGF0ZS5kcmFnZ2luZ1ZlcnRleEluZGV4KTtcblxuICAgICAgICBpZiAoZHJhZ2dpbmdWZXJ0ZXhJbmRleCA+PSAwKSB7XG4gICAgICAgICAgLy8gZHJhZ2dpbmcgdmVydGV4XG4gICAgICAgICAgdGhpcy5fdXBkYXRlRmVhdHVyZShzZWxlY3RlZEZlYXR1cmUsICd2ZXJ0ZXgnLCB7XG4gICAgICAgICAgICB2ZXJ0ZXhJbmRleDogZHJhZ2dpbmdWZXJ0ZXhJbmRleCxcbiAgICAgICAgICAgIGxuZ0xhdFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGRyYWdnaW5nIGZlYXR1cmVcbiAgICAgICAgICBjb25zdCBkeCA9IHggLSBzdGFydERyYWdQb3MueDtcbiAgICAgICAgICBjb25zdCBkeSA9IHkgLSBzdGFydERyYWdQb3MueTtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtzdGFydERyYWdQb3M6IHt4LCB5fX0pO1xuXG4gICAgICAgICAgdGhpcy5fdXBkYXRlRmVhdHVyZShzZWxlY3RlZEZlYXR1cmUsICdmZWF0dXJlJywge2R4LCBkeX0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG1vZGUgPT09IE1PREVTLkRSQVdfUkVDVEFOR0xFKSB7XG4gICAgICAgIC8vIGRyYXdpbmcgcmVjdGFuZ2xlXG4gICAgICAgIHRoaXMuX3VwZGF0ZUZlYXR1cmUoc2VsZWN0ZWRGZWF0dXJlLCAnUmVjdGFuZ2xlJywge3ZlcnRleEluZGV4OiAyLCBsbmdMYXR9KTtcbiAgICAgIH0gZWxzZSBpZiAoaXNEcmF3aW5nKSB7XG4gICAgICAgIC8vIGRyYXdpbmcgb3RoZXIgc2hhcGVzXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3VuY29tbWl0dGVkTG5nTGF0OiBsbmdMYXR9KTtcbiAgICAgIH0gZWxzZSBpZiAoaXNFZGl0aW5nKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAoc2VsZWN0ZWRGZWF0dXJlLnJlbmRlclR5cGUgPT09IFJFTkRFUl9UWVBFLkxJTkVfU1RSSU5HIHx8XG4gICAgICAgICAgICBzZWxlY3RlZEZlYXR1cmUucmVuZGVyVHlwZSA9PT0gUkVOREVSX1RZUEUuUE9MWUdPTikgJiZcbiAgICAgICAgICB0eXBlID09PSBFTEVNRU5UX1RZUEUuU0VHTUVOVFxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBzZWdtZW50SWQgaXMgc3RhcnQgdmVydGV4SW5kZXhcbiAgICAgICAgICBsZXQgdW5jb21taXR0ZWRMbmdMYXQgPSBudWxsO1xuICAgICAgICAgIGlmIChsbmdMYXQgJiYgdHlwZW9mIHZlcnRleEluZGV4ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdW5jb21taXR0ZWRMbmdMYXQgPSB0aGlzLl9nZXRDbG9zZXN0UG9zaXRpb25PblNlZ21lbnQoXG4gICAgICAgICAgICAgIHZlcnRleEluZGV4LFxuICAgICAgICAgICAgICBsbmdMYXQsXG4gICAgICAgICAgICAgIHNlbGVjdGVkRmVhdHVyZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHVuY29tbWl0dGVkTG5nTGF0XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICB1bmNvbW1pdHRlZExuZ0xhdDogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qge2ZlYXR1cmVzLCBzZWxlY3RlZEZlYXR1cmVJZH0gPSB0aGlzLnN0YXRlO1xuICAgIGlmIChzZWxlY3RlZEZlYXR1cmVJZCAmJiB0eXBlID09PSBFTEVNRU5UX1RZUEUuVkVSVEVYICYmIHR5cGVvZiBmZWF0dXJlSW5kZXggPT09ICdudW1iZXInKSB7XG4gICAgICBjb25zdCBmZWF0dXJlID0gZmVhdHVyZXMgJiYgZmVhdHVyZXNbZmVhdHVyZUluZGV4XTtcbiAgICAgIGlmIChzZWxlY3RlZEZlYXR1cmVJZCA9PT0gKGZlYXR1cmUgJiYgZmVhdHVyZS5pZCkpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgaG92ZXJlZFZlcnRleEluZGV4OiB2ZXJ0ZXhJbmRleFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgIT09IEVMRU1FTlRfVFlQRS5WRVJURVgpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBob3ZlcmVkVmVydGV4SW5kZXg6IG51bGxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0eXBlID09PSBFTEVNRU5UX1RZUEUuRkVBVFVSRSAmJiB0eXBlb2YgZmVhdHVyZUluZGV4ID09PSAnbnVtYmVyJykge1xuICAgICAgY29uc3QgZmVhdHVyZSA9IGZlYXR1cmVzICYmIGZlYXR1cmVzW2ZlYXR1cmVJbmRleF07XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaG92ZXJlZEZlYXR1cmVJZDogZmVhdHVyZSAmJiBmZWF0dXJlLmlkXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGhvdmVyZWRGZWF0dXJlSWQ6IG51bGxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgLyogZXNsaW50LWVuYWJsZSBtYXgtZGVwdGggKi9cblxuICBfb25DbGlja0ZlYXR1cmUgPSAoZXZ0LCBhdHRyaWJ1dGVzKSA9PiB7XG4gICAgY29uc3Qge2ZlYXR1cmVJbmRleH0gPSBhdHRyaWJ1dGVzO1xuICAgIGNvbnN0IHtmZWF0dXJlc30gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IHNlbGVjdGVkRmVhdHVyZSA9IGZlYXR1cmVzICYmIHR5cGVvZiBmZWF0dXJlSW5kZXggPT09ICdudW1iZXInICYmIGZlYXR1cmVzW2ZlYXR1cmVJbmRleF07XG5cbiAgICBpZiAoc2VsZWN0ZWRGZWF0dXJlKSB7XG4gICAgICB0aGlzLnByb3BzLm9uU2VsZWN0KHtcbiAgICAgICAgc2VsZWN0ZWRGZWF0dXJlSWQ6IHNlbGVjdGVkRmVhdHVyZS5pZCxcbiAgICAgICAgc291cmNlRXZlbnQ6IGV2dFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIF9vbkNsaWNrVmVydGV4ID0gKGV2dCwgYXR0cmlidXRlcykgPT4ge1xuICAgIGNvbnN0IHttb2RlfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qgb3BlcmF0aW9uID0gYXR0cmlidXRlcy5vcGVyYXRpb247XG4gICAgaWYgKFxuICAgICAgb3BlcmF0aW9uID09PSBPUEVSQVRJT05TLklOVEVSU0VDVCB8fFxuICAgICAgKG9wZXJhdGlvbiA9PT0gT1BFUkFUSU9OUy5TRVQgJiYgbW9kZSA9PT0gTU9ERVMuRFJBV19SRUNUQU5HTEUpXG4gICAgKSB7XG4gICAgICB0aGlzLl9jbG9zZVBhdGgoKTtcbiAgICAgIHRoaXMuX2NsZWFyQ2FjaGUoKTtcbiAgICB9XG4gIH07XG5cbiAgX29uQ2xpY2tTZWdtZW50ID0gKGV2dCwgYXR0cmlidXRlcykgPT4ge1xuICAgIGNvbnN0IGZlYXR1cmUgPSB0aGlzLl9nZXRTZWxlY3RlZEZlYXR1cmUoKTtcblxuICAgIGlmIChcbiAgICAgIGZlYXR1cmUgJiZcbiAgICAgIChmZWF0dXJlLnJlbmRlclR5cGUgPT09IFJFTkRFUl9UWVBFLlBPTFlHT04gfHxcbiAgICAgICAgZmVhdHVyZS5yZW5kZXJUeXBlID09PSBSRU5ERVJfVFlQRS5MSU5FX1NUUklORykgJiZcbiAgICAgIGF0dHJpYnV0ZXNcbiAgICApIHtcbiAgICAgIGNvbnN0IHt2ZXJ0ZXhJbmRleH0gPSBhdHRyaWJ1dGVzO1xuXG4gICAgICBjb25zdCB7dW5jb21taXR0ZWRMbmdMYXR9ID0gdGhpcy5zdGF0ZTtcblxuICAgICAgbGV0IGxuZ0xhdCA9IHVuY29tbWl0dGVkTG5nTGF0O1xuICAgICAgaWYgKCFsbmdMYXQgJiYgdHlwZW9mIHZlcnRleEluZGV4ID09PSAnbnVtYmVyJykge1xuICAgICAgICBjb25zdCB7eCwgeX0gPSB0aGlzLl9nZXRFdmVudFBvc2l0aW9uKGV2dCk7XG4gICAgICAgIGxuZ0xhdCA9IHRoaXMuX3VucHJvamVjdChbeCwgeV0pO1xuICAgICAgICBsbmdMYXQgPSB0aGlzLl9nZXRDbG9zZXN0UG9zaXRpb25PblNlZ21lbnQodmVydGV4SW5kZXgsIGxuZ0xhdCwgZmVhdHVyZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChsbmdMYXQpIHtcbiAgICAgICAgY29uc3QgaW5zZXJ0UG9zaXRpb24gPSAodmVydGV4SW5kZXggKyAxKSAlIGZlYXR1cmUucG9pbnRzLmxlbmd0aDtcbiAgICAgICAgZmVhdHVyZS5pbnNlcnRQb2ludChsbmdMYXQsIGluc2VydFBvc2l0aW9uKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKHRoaXMuc3RhdGUuZmVhdHVyZXMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgdW5jb21taXR0ZWRMbmdMYXQ6IG51bGwsXG4gICAgICAgIGhvdmVyZWRMbmdMYXQ6IG51bGxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBfb25DbGljayA9IGV2dCA9PiB7XG4gICAgY29uc3Qge21vZGV9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gcGFyc2VFbGVtRGF0YUF0dHJpYnV0ZXMoZXZ0LnRhcmdldCk7XG5cbiAgICBpZiAoYXR0cmlidXRlcyAmJiBhdHRyaWJ1dGVzLnR5cGUgPT09IEVMRU1FTlRfVFlQRS5WRVJURVgpIHtcbiAgICAgIHRoaXMuX29uQ2xpY2tWZXJ0ZXgoZXZ0LCBhdHRyaWJ1dGVzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobW9kZSA9PT0gTU9ERVMuRURJVF9WRVJURVggJiYgYXR0cmlidXRlcyAmJiBhdHRyaWJ1dGVzLnR5cGUgPT09IEVMRU1FTlRfVFlQRS5TRUdNRU5UKSB7XG4gICAgICB0aGlzLl9vbkNsaWNrU2VnbWVudChldnQsIGF0dHJpYnV0ZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChtb2RlID09PSBNT0RFUy5TRUxFQ1RfRkVBVFVSRSB8fCBtb2RlID09PSBNT0RFUy5FRElUX1ZFUlRFWCkgJiZcbiAgICAgIGF0dHJpYnV0ZXMgJiZcbiAgICAgIGF0dHJpYnV0ZXMudHlwZSA9PT0gRUxFTUVOVF9UWVBFLkZFQVRVUkVcbiAgICApIHtcbiAgICAgIHRoaXMuX29uQ2xpY2tGZWF0dXJlKGV2dCwgYXR0cmlidXRlcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRGZWF0dXJlID0gdGhpcy5fZ2V0U2VsZWN0ZWRGZWF0dXJlKCk7XG4gICAgY29uc3Qge3gsIHl9ID0gdGhpcy5fZ2V0RXZlbnRQb3NpdGlvbihldnQpO1xuXG4gICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICBjYXNlIE1PREVTLkVESVRfVkVSVEVYOlxuICAgICAgICBpZiAoc2VsZWN0ZWRGZWF0dXJlKSB7XG4gICAgICAgICAgdGhpcy5wcm9wcy5vblNlbGVjdCh7XG4gICAgICAgICAgICBzZWxlY3RlZEZlYXR1cmVJZDogbnVsbCxcbiAgICAgICAgICAgIHNvdXJjZUV2ZW50OiBldnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNT0RFUy5EUkFXX1BPSU5UOlxuICAgICAgICB0aGlzLl9hZGRGZWF0dXJlKG1vZGUsIHt4LCB5fSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIE1PREVTLkRSQVdfUEFUSDpcbiAgICAgIGNhc2UgTU9ERVMuRFJBV19QT0xZR09OOlxuICAgICAgICBpZiAoc2VsZWN0ZWRGZWF0dXJlICYmIHNlbGVjdGVkRmVhdHVyZS5pc0Nsb3NlZCkge1xuICAgICAgICAgIC8vIGNsaWNrZWQgb3V0c2lkZVxuICAgICAgICAgIHRoaXMuX2NsZWFyQ2FjaGUoKTtcbiAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZEZlYXR1cmUpIHtcbiAgICAgICAgICB0aGlzLl9hZGRQb2ludCh4LCB5LCBzZWxlY3RlZEZlYXR1cmUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2FkZEZlYXR1cmUobW9kZSwge3gsIHl9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBNT0RFUy5EUkFXX1JFQ1RBTkdMRTpcbiAgICAgICAgaWYgKHNlbGVjdGVkRmVhdHVyZSAmJiBzZWxlY3RlZEZlYXR1cmUuaXNDbG9zZWQpIHtcbiAgICAgICAgICAvLyBjbGlja2VkIG91dHNpZGVcbiAgICAgICAgICB0aGlzLl9jbGVhckNhY2hlKCk7XG4gICAgICAgICAgdGhpcy5wcm9wcy5vblNlbGVjdCh7XG4gICAgICAgICAgICBzZWxlY3RlZEZlYXR1cmVJZDogbnVsbCxcbiAgICAgICAgICAgIHNvdXJjZUV2ZW50OiBldnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9hZGRGZWF0dXJlKG1vZGUsIHt4LCB5fSk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICB9XG4gIH07XG5cbiAgLy8gZG9uJ3QgZm9yd2FyZCBwYW4gZXZlbnRzIHRvIHRoZSB1bmRlcmx5aW5nIG1hcCB3aGVuOlxuICAvLyAtIHRoZSBwYW4gdGFyZ2V0IGlzIGEgdmVydGV4L2xpbmUvdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBmZWF0dXJlXG4gIC8vIC0gdGhlIHVzZXIgaXMgZHJhZ2dpbmcgc29tZXRoaW5nIGFyb3VuZFxuICAvLyAtIHRoZXJlIGlzIGN1cnJlbnRseSBhbiB1bmNvbW1pdHRlZCBwb3NpdGlvblxuICAvLyAoaS5lLiB0aGUgdXNlciBpcyBjcmVhdGluZyBhIGZlYXR1cmUvdmVydGV4L2xpbmUpXG4gIF9vblBhbiA9IGV2dCA9PiB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHBhcnNlRWxlbURhdGFBdHRyaWJ1dGVzKGV2dC50YXJnZXQpO1xuICAgIGNvbnN0IHR5cGUgPSBhdHRyaWJ1dGVzICYmIGF0dHJpYnV0ZXMudHlwZTtcbiAgICBpZiAoXG4gICAgICB0eXBlID09PSBFTEVNRU5UX1RZUEUuVkVSVEVYIHx8XG4gICAgICB0eXBlID09PSBFTEVNRU5UX1RZUEUuU0VHTUVOVCB8fFxuICAgICAgdGhpcy5zdGF0ZS5pc0RyYWdnaW5nIHx8XG4gICAgICB0aGlzLnN0YXRlLnVuY29tbWl0dGVkTG5nTGF0ICE9PSBudWxsXG4gICAgKSB7XG4gICAgICBldnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICB9O1xuXG4gIC8qIEhFTFBFUlMgKi9cbiAgLy8gbG5nTGF0IHRvIHBpeGVsc1xuICBfcHJvamVjdCA9IHB0ID0+IHtcbiAgICByZXR1cm4gdGhpcy5fY29udGV4dCAmJiB0aGlzLl9jb250ZXh0LnZpZXdwb3J0ICYmIHRoaXMuX2NvbnRleHQudmlld3BvcnQucHJvamVjdChwdCk7XG4gIH07XG5cbiAgLy8gcGl4ZWxzIHRvIGxuZ0xhdFxuICBfdW5wcm9qZWN0ID0gcHQgPT4ge1xuICAgIHJldHVybiB0aGlzLl9jb250ZXh0ICYmIHRoaXMuX2NvbnRleHQudmlld3BvcnQgJiYgdGhpcy5fY29udGV4dC52aWV3cG9ydC51bnByb2plY3QocHQpO1xuICB9O1xuXG4gIF9tYXRjaGVzRmVhdHVyZSA9IChhdHRyaWJ1dGVzLCBmZWF0dXJlKSA9PiB7XG4gICAgaWYgKCFhdHRyaWJ1dGVzIHx8IGF0dHJpYnV0ZXMudHlwZSAhPT0gRUxFTUVOVF9UWVBFLkZFQVRVUkUgfHwgIWZlYXR1cmUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB7ZmVhdHVyZUluZGV4fSA9IGF0dHJpYnV0ZXM7XG4gICAgY29uc3Qge2ZlYXR1cmVzfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgZWxlbUZlYXR1cmUgPSBmZWF0dXJlcyAmJiBmZWF0dXJlc1tmZWF0dXJlSW5kZXhdO1xuICAgIHJldHVybiBlbGVtRmVhdHVyZSAmJiBmZWF0dXJlLmlkID09PSBlbGVtRmVhdHVyZS5pZDtcbiAgfTtcblxuICBfZ2V0Q2xvc2VzdFBvc2l0aW9uT25TZWdtZW50ID0gKHZlcnRleEluZGV4LCBwb2ludExuZ0xhdCwgZmVhdHVyZSkgPT4ge1xuICAgIGNvbnN0IHBvaW50cyA9IGZlYXR1cmUgJiYgZmVhdHVyZS5wb2ludHM7XG4gICAgaWYgKCFwb2ludHMgfHwgIXBvaW50cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIHNlZ21lbnRJZCBpcyBzdGFydCB2ZXJ0ZXhJbmRleFxuICAgIGNvbnN0IHN0YXJ0UG9zID0gcG9pbnRzW3ZlcnRleEluZGV4XTtcbiAgICBjb25zdCBlbmRQb3MgPSBwb2ludHNbKHZlcnRleEluZGV4ICsgMSkgJSBwb2ludHMubGVuZ3RoXTtcbiAgICByZXR1cm4gZmluZENsb3Nlc3RQb2ludE9uTGluZVNlZ21lbnQoc3RhcnRQb3MsIGVuZFBvcywgcG9pbnRMbmdMYXQpO1xuICB9O1xuXG4gIF9nZXRFdmVudFBvc2l0aW9uID0gZXZ0ID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBvZmZzZXRDZW50ZXI6IHt4LCB5fVxuICAgIH0gPSBldnQ7XG4gICAgcmV0dXJuIHt4OiBOdW1iZXIoeCksIHk6IE51bWJlcih5KX07XG4gIH07XG5cbiAgX2dldFByb2plY3RlZERhdGEocG9pbnRzLCByZW5kZXJUeXBlLCBpc0Nsb3NlZCA9IGZhbHNlKSB7XG4gICAgaWYgKHBvaW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBjb25zdCBwcm9qZWN0ZWQgPSBwb2ludHMubWFwKHAgPT4gdGhpcy5fcHJvamVjdChwKSk7XG4gICAgc3dpdGNoIChyZW5kZXJUeXBlKSB7XG4gICAgICBjYXNlIFJFTkRFUl9UWVBFLlBPSU5UOlxuICAgICAgICByZXR1cm4gcHJvamVjdGVkO1xuICAgICAgY2FzZSBSRU5ERVJfVFlQRS5MSU5FX1NUUklORzpcbiAgICAgIGNhc2UgUkVOREVSX1RZUEUuUE9MWUdPTjpcbiAgICAgIGNhc2UgUkVOREVSX1RZUEUuUkVDVEFOR0xFOlxuICAgICAgICBjb25zdCBwYXRoU3RyaW5nID0gcHJvamVjdGVkXG4gICAgICAgICAgLm1hcChwID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgJHtwWzBdfSwke3BbMV19YDtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5qb2luKCdMJyk7XG4gICAgICAgIHJldHVybiBgTSAke3BhdGhTdHJpbmd9ICR7aXNDbG9zZWQgPyAneicgOiAnJ31gO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgX2dldFNlbGVjdGVkRmVhdHVyZSA9ICgpID0+IHtcbiAgICBjb25zdCB7ZmVhdHVyZXMsIHNlbGVjdGVkRmVhdHVyZUlkfSA9IHRoaXMuc3RhdGU7XG4gICAgcmV0dXJuIGZlYXR1cmVzICYmIGZlYXR1cmVzLmZpbmQoZiA9PiBmLmlkID09PSBzZWxlY3RlZEZlYXR1cmVJZCk7XG4gIH07XG5cbiAgX2dldEVkaXRIYW5kbGVTdGF0ZSA9IChpbmRleCwgcmVuZGVyU3RhdGUpID0+IHtcbiAgICBjb25zdCB7bW9kZX0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHtkcmFnZ2luZ1ZlcnRleEluZGV4LCBob3ZlcmVkVmVydGV4SW5kZXh9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCBzZWxlY3RlZEZlYXR1cmUgPSB0aGlzLl9nZXRTZWxlY3RlZEZlYXR1cmUoKTtcbiAgICBjb25zdCBpc1NlbGVjdGVkID1cbiAgICAgIGluZGV4ID09PSBkcmFnZ2luZ1ZlcnRleEluZGV4IHx8XG4gICAgICAoc2VsZWN0ZWRGZWF0dXJlICYmIHNlbGVjdGVkRmVhdHVyZS5yZW5kZXJUeXBlID09PSBSRU5ERVJfVFlQRS5QT0lOVCk7XG4gICAgY29uc3QgaXNDbG9zaW5nID0gbW9kZSA9PT0gTU9ERVMuRFJBV19QT0xZR09OICYmIGhvdmVyZWRWZXJ0ZXhJbmRleCA9PT0gMCAmJiBpbmRleCA9PT0gLTE7XG5cbiAgICBpZiAocmVuZGVyU3RhdGUpIHtcbiAgICAgIHJldHVybiByZW5kZXJTdGF0ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNDbG9zaW5nKSB7XG4gICAgICByZXR1cm4gUkVOREVSX1NUQVRFLkNMT1NJTkc7XG4gICAgfVxuXG4gICAgaWYgKGlzU2VsZWN0ZWQpIHtcbiAgICAgIHJldHVybiBSRU5ERVJfU1RBVEUuU0VMRUNURUQ7XG4gICAgfVxuXG4gICAgc3dpdGNoIChpbmRleCkge1xuICAgICAgY2FzZSBob3ZlcmVkVmVydGV4SW5kZXg6XG4gICAgICAgIHJldHVybiBSRU5ERVJfU1RBVEUuSE9WRVJFRDtcbiAgICAgIGNhc2UgVU5DT01NSVRURURfSUQ6XG4gICAgICAgIHJldHVybiBSRU5ERVJfU1RBVEUuVU5DT01NSVRURUQ7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gUkVOREVSX1NUQVRFLklOQUNUSVZFO1xuICAgIH1cbiAgfTtcblxuICBfZ2V0RmVhdHVyZVJlbmRlclN0YXRlID0gKGlkLCByZW5kZXJTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHtzZWxlY3RlZEZlYXR1cmVJZCwgaG92ZXJlZEZlYXR1cmVJZH0gPSB0aGlzLnN0YXRlO1xuICAgIGlmIChyZW5kZXJTdGF0ZSkge1xuICAgICAgcmV0dXJuIHJlbmRlclN0YXRlO1xuICAgIH1cbiAgICBzd2l0Y2ggKGlkKSB7XG4gICAgICBjYXNlIHNlbGVjdGVkRmVhdHVyZUlkOlxuICAgICAgICByZXR1cm4gUkVOREVSX1NUQVRFLlNFTEVDVEVEO1xuICAgICAgY2FzZSBob3ZlcmVkRmVhdHVyZUlkOlxuICAgICAgICByZXR1cm4gUkVOREVSX1NUQVRFLkhPVkVSRUQ7XG4gICAgICBjYXNlIFVOQ09NTUlUVEVEX0lEOlxuICAgICAgICByZXR1cm4gUkVOREVSX1NUQVRFLlVOQ09NTUlUVEVEO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFJFTkRFUl9TVEFURS5JTkFDVElWRTtcbiAgICB9XG4gIH07XG5cbiAgLyogUkVOREVSICovXG4gIC8qIGVzbGludC1kaXNhYmxlIG1heC1wYXJhbXMgKi9cbiAgX3JlbmRlclZlcnRleCA9IChwb3NpdGlvbiwgZmVhdHVyZUluZGV4LCB2ZXJ0ZXhJbmRleCwgb3BlcmF0aW9uLCBzdHlsZSwgc2hhcGUpID0+IHtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIG1heC1wYXJhbXMgKi9cbiAgICBjb25zdCBwID0gdGhpcy5fcHJvamVjdChwb3NpdGlvbik7XG4gICAgaWYgKCFwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB7Y2xpY2tSYWRpdXN9ID0gdGhpcy5wcm9wcztcblxuICAgIGNvbnN0IGVsZW1LZXkgPSBgJHtFTEVNRU5UX1RZUEUuVkVSVEVYfS4ke2ZlYXR1cmVJbmRleH0uJHt2ZXJ0ZXhJbmRleH0uJHtvcGVyYXRpb259YDtcbiAgICAvLyBmaXJzdCA8Y2lyY2xlfHJlY3Q+IGlzIHRvIG1ha2UgcGF0aCBlYXNpbHkgaW50ZXJhY3RlZCB3aXRoXG4gICAgc3dpdGNoIChzaGFwZSkge1xuICAgICAgY2FzZSAnY2lyY2xlJzpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8ZyBrZXk9e2VsZW1LZXl9IHRyYW5zZm9ybT17YHRyYW5zbGF0ZSgke3BbMF19LCAke3BbMV19KWB9PlxuICAgICAgICAgICAgPGNpcmNsZVxuICAgICAgICAgICAgICBkYXRhLXR5cGU9e0VMRU1FTlRfVFlQRS5WRVJURVh9XG4gICAgICAgICAgICAgIGRhdGEtZmVhdHVyZS1pbmRleD17ZmVhdHVyZUluZGV4fVxuICAgICAgICAgICAgICBkYXRhLXZlcnRleC1pbmRleD17dmVydGV4SW5kZXh9XG4gICAgICAgICAgICAgIGRhdGEtb3BlcmF0aW9uPXtvcGVyYXRpb259XG4gICAgICAgICAgICAgIGtleT17YCR7ZWxlbUtleX0uaGlkZGVuYH1cbiAgICAgICAgICAgICAgc3R5bGU9e3suLi5zdHlsZSwgLi4uSElEREVOX0NMSUNLQUJMRV9TVFlMRSwgc3Ryb2tlOiAnbm9uZSd9fVxuICAgICAgICAgICAgICBjeD17MH1cbiAgICAgICAgICAgICAgY3k9ezB9XG4gICAgICAgICAgICAgIHI9e2NsaWNrUmFkaXVzfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxjaXJjbGVcbiAgICAgICAgICAgICAgZGF0YS10eXBlPXtFTEVNRU5UX1RZUEUuVkVSVEVYfVxuICAgICAgICAgICAgICBkYXRhLWZlYXR1cmUtaW5kZXg9e2ZlYXR1cmVJbmRleH1cbiAgICAgICAgICAgICAgZGF0YS12ZXJ0ZXgtaW5kZXg9e3ZlcnRleEluZGV4fVxuICAgICAgICAgICAgICBkYXRhLW9wZXJhdGlvbj17b3BlcmF0aW9ufVxuICAgICAgICAgICAgICBrZXk9e2VsZW1LZXl9XG4gICAgICAgICAgICAgIHN0eWxlPXtzdHlsZX1cbiAgICAgICAgICAgICAgY3g9ezB9XG4gICAgICAgICAgICAgIGN5PXswfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2c+XG4gICAgICAgICk7XG4gICAgICBjYXNlICdyZWN0JzpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8ZyBrZXk9e2B2ZXJ0ZXguJHt2ZXJ0ZXhJbmRleH1gfSB0cmFuc2Zvcm09e2B0cmFuc2xhdGUoJHtwWzBdfSwgJHtwWzFdfSlgfT5cbiAgICAgICAgICAgIDxyZWN0XG4gICAgICAgICAgICAgIGRhdGEtdHlwZT17RUxFTUVOVF9UWVBFLlZFUlRFWH1cbiAgICAgICAgICAgICAgZGF0YS1mZWF0dXJlLWluZGV4PXtmZWF0dXJlSW5kZXh9XG4gICAgICAgICAgICAgIGRhdGEtdmVydGV4LWluZGV4PXt2ZXJ0ZXhJbmRleH1cbiAgICAgICAgICAgICAgZGF0YS1vcGVyYXRpb249e29wZXJhdGlvbn1cbiAgICAgICAgICAgICAga2V5PXtgJHtlbGVtS2V5fS5oaWRkZW5gfVxuICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgIC4uLnN0eWxlLFxuICAgICAgICAgICAgICAgIC4uLkhJRERFTl9DTElDS0FCTEVfU1RZTEUsXG4gICAgICAgICAgICAgICAgd2lkdGg6IGNsaWNrUmFkaXVzLFxuICAgICAgICAgICAgICAgIGhlaWdodDogY2xpY2tSYWRpdXNcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8cmVjdFxuICAgICAgICAgICAgICBkYXRhLXR5cGU9e0VMRU1FTlRfVFlQRS5WRVJURVh9XG4gICAgICAgICAgICAgIGRhdGEtZmVhdHVyZS1pbmRleD17ZmVhdHVyZUluZGV4fVxuICAgICAgICAgICAgICBkYXRhLXZlcnRleC1pbmRleD17dmVydGV4SW5kZXh9XG4gICAgICAgICAgICAgIGRhdGEtb3BlcmF0aW9uPXtvcGVyYXRpb259XG4gICAgICAgICAgICAgIGtleT17ZWxlbUtleX1cbiAgICAgICAgICAgICAgc3R5bGU9e3N0eWxlfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2c+XG4gICAgICAgICk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfTtcblxuICBfcmVuZGVyU2VnbWVudCA9IChmZWF0dXJlSW5kZXgsIHN0YXJ0VmVydGV4SWQsIHN0YXJ0UG9zLCBlbmRQb3MsIHN0eWxlID0ge30pID0+IHtcbiAgICBjb25zdCB7Y2xpY2tSYWRpdXN9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBwcm9qZWN0ZWQgPSB0aGlzLl9nZXRQcm9qZWN0ZWREYXRhKFtzdGFydFBvcywgZW5kUG9zXSwgUkVOREVSX1RZUEUuTElORV9TVFJJTkcpO1xuICAgIGNvbnN0IHtyYWRpdXMsIC4uLm90aGVyc30gPSBzdHlsZTtcblxuICAgIGNvbnN0IGVsZW1LZXkgPSBgJHtFTEVNRU5UX1RZUEUuU0VHTUVOVH0uJHtmZWF0dXJlSW5kZXh9LiR7c3RhcnRWZXJ0ZXhJZH1gO1xuICAgIHJldHVybiAoXG4gICAgICA8ZyBrZXk9e2VsZW1LZXl9PlxuICAgICAgICA8cGF0aFxuICAgICAgICAgIGRhdGEtdHlwZT17RUxFTUVOVF9UWVBFLlNFR01FTlR9XG4gICAgICAgICAgZGF0YS1mZWF0dXJlLWluZGV4PXtmZWF0dXJlSW5kZXh9XG4gICAgICAgICAgZGF0YS12ZXJ0ZXgtaW5kZXg9e3N0YXJ0VmVydGV4SWR9XG4gICAgICAgICAga2V5PXtgJHtlbGVtS2V5fS5oaWRkZW5gfVxuICAgICAgICAgIHN0eWxlPXt7Li4ub3RoZXJzLCBzdHJva2VXaWR0aDogY2xpY2tSYWRpdXMgfHwgcmFkaXVzLCBvcGFjaXR5OiAwfX1cbiAgICAgICAgICBkPXtwcm9qZWN0ZWR9XG4gICAgICAgIC8+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgZGF0YS10eXBlPXtFTEVNRU5UX1RZUEUuU0VHTUVOVH1cbiAgICAgICAgICBkYXRhLWZlYXR1cmUtaW5kZXg9e2ZlYXR1cmVJbmRleH1cbiAgICAgICAgICBkYXRhLXZlcnRleC1pbmRleD17c3RhcnRWZXJ0ZXhJZH1cbiAgICAgICAgICBrZXk9e2VsZW1LZXl9XG4gICAgICAgICAgc3R5bGU9e290aGVyc31cbiAgICAgICAgICBkPXtwcm9qZWN0ZWR9XG4gICAgICAgIC8+XG4gICAgICA8L2c+XG4gICAgKTtcbiAgfTtcblxuICBfcmVuZGVyQ29tbWl0dGVkU3Ryb2tlID0gKGZlYXR1cmVJbmRleCwgZmVhdHVyZSwgc3R5bGUpID0+IHtcbiAgICBjb25zdCB7cG9pbnRzLCBpc0Nsb3NlZCwgcmVuZGVyVHlwZX0gPSBmZWF0dXJlO1xuICAgIGlmICghcG9pbnRzIHx8IHBvaW50cy5sZW5ndGggPCAyIHx8IChyZW5kZXJUeXBlID09PSBSRU5ERVJfVFlQRS5SRUNUQU5HTEUgJiYgIWlzQ2xvc2VkKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VnbWVudHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIHNlZ21lbnRzLnB1c2godGhpcy5fcmVuZGVyU2VnbWVudChmZWF0dXJlSW5kZXgsIGksIHBvaW50c1tpXSwgcG9pbnRzW2kgKyAxXSwgc3R5bGUpKTtcbiAgICB9XG5cbiAgICBpZiAoaXNDbG9zZWQpIHtcbiAgICAgIGNvbnN0IGxhc3RJbmRleCA9IHBvaW50cy5sZW5ndGggLSAxO1xuICAgICAgc2VnbWVudHMucHVzaChcbiAgICAgICAgdGhpcy5fcmVuZGVyU2VnbWVudChmZWF0dXJlSW5kZXgsIGxhc3RJbmRleCwgcG9pbnRzW2xhc3RJbmRleF0sIHBvaW50c1swXSwgc3R5bGUpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiA8ZyBrZXk9XCJjb21taXR0ZWQgZ3JvdXBcIj57c2VnbWVudHN9PC9nPjtcbiAgfTtcblxuICBfcmVuZGVyVW5jb21taXR0ZWRTdHJva2VzID0gKGZlYXR1cmVJbmRleCwgZmVhdHVyZSwgc3R5bGUpID0+IHtcbiAgICBjb25zdCB7cG9pbnRzLCBpc0Nsb3NlZCwgcmVuZGVyVHlwZX0gPSBmZWF0dXJlO1xuICAgIGNvbnN0IHttb2RlfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qge3VuY29tbWl0dGVkTG5nTGF0fSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgaXNEcmF3aW5nID0gRFJBV0lOR19NT0RFUy5maW5kKG0gPT4gbSA9PT0gbW9kZSk7XG5cbiAgICBpZiAoIXBvaW50cyB8fCBpc0Nsb3NlZCB8fCAhaXNEcmF3aW5nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB1bmNvbW1pdHRlZFNlZ21lbnRzID0gW107XG5cbiAgICBpZiAocmVuZGVyVHlwZSA9PT0gUkVOREVSX1RZUEUuUkVDVEFOR0xFKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgdW5jb21taXR0ZWRTZWdtZW50cy5wdXNoKFxuICAgICAgICAgIHRoaXMuX3JlbmRlclNlZ21lbnQoZmVhdHVyZUluZGV4LCBpLCBwb2ludHNbaV0sIHBvaW50c1tpICsgMV0sIHN0eWxlKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHBvaW50cy5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgdW5jb21taXR0ZWRTZWdtZW50cy5wdXNoKHRoaXMuX3JlbmRlclNlZ21lbnQoZmVhdHVyZUluZGV4LCAzLCBwb2ludHNbM10sIHBvaW50c1swXSwgc3R5bGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXVuY29tbWl0dGVkTG5nTGF0KSB7XG4gICAgICByZXR1cm4gdW5jb21taXR0ZWRTZWdtZW50cy5sZW5ndGggPyB1bmNvbW1pdHRlZFNlZ21lbnRzIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1pbmxpbmUtY29tbWVudHMgKi9cbiAgICB1bmNvbW1pdHRlZFNlZ21lbnRzLnB1c2goXG4gICAgICB0aGlzLl9yZW5kZXJTZWdtZW50KFxuICAgICAgICBmZWF0dXJlSW5kZXgsXG4gICAgICAgIHBvaW50cy5sZW5ndGggLSAxLCAvLyBpZFxuICAgICAgICBwb2ludHMuc2xpY2UoLTEpWzBdLCAvLyBzdGFydFBvc1xuICAgICAgICB1bmNvbW1pdHRlZExuZ0xhdCwgLy8gZW5kUG9zXG4gICAgICAgIHN0eWxlXG4gICAgICApXG4gICAgKTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWlubGluZS1jb21tZW50cyAqL1xuXG4gICAgcmV0dXJuIHVuY29tbWl0dGVkU2VnbWVudHMuZmlsdGVyKEJvb2xlYW4pO1xuICB9O1xuXG4gIF9yZW5kZXJDbG9zaW5nU3Ryb2tlID0gKGZlYXR1cmVJbmRleCwgZmVhdHVyZSwgc3R5bGUpID0+IHtcbiAgICBjb25zdCB7cG9pbnRzLCBpc0Nsb3NlZH0gPSBmZWF0dXJlO1xuICAgIGNvbnN0IHttb2RlfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qge3VuY29tbWl0dGVkTG5nTGF0fSA9IHRoaXMuc3RhdGU7XG4gICAgaWYgKHVuY29tbWl0dGVkTG5nTGF0ICYmIG1vZGUgPT09IE1PREVTLkRSQVdfUE9MWUdPTiAmJiBwb2ludHMubGVuZ3RoID4gMiAmJiAhaXNDbG9zZWQpIHtcbiAgICAgIC8vIGZyb20gdW5jb21taXR0ZWQgcG9zaXRpb24gdG8gdGhlIGZpcnN0IHBvaW50IG9mIHRoZSBwb2x5Z29uXG4gICAgICByZXR1cm4gdGhpcy5fcmVuZGVyU2VnbWVudChcbiAgICAgICAgZmVhdHVyZUluZGV4LFxuICAgICAgICAndW5jb21taXR0ZWQtY2xvc2UnLFxuICAgICAgICB1bmNvbW1pdHRlZExuZ0xhdCxcbiAgICAgICAgcG9pbnRzWzBdLFxuICAgICAgICBzdHlsZVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgX3JlbmRlckZpbGwgPSAoaW5kZXgsIGZlYXR1cmUsIHN0eWxlKSA9PiB7XG4gICAgY29uc3Qge21vZGV9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBpc0RyYXdpbmcgPSBEUkFXSU5HX01PREVTLmZpbmQobSA9PiBtID09PSBtb2RlKTtcbiAgICBjb25zdCB7cG9pbnRzLCByZW5kZXJUeXBlLCBpc0Nsb3NlZH0gPSBmZWF0dXJlO1xuICAgIGlmIChyZW5kZXJUeXBlICE9PSBSRU5ERVJfVFlQRS5QT0xZR09OICYmIHJlbmRlclR5cGUgIT09IFJFTkRFUl9UWVBFLlJFQ1RBTkdMRSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qge3VuY29tbWl0dGVkTG5nTGF0fSA9IHRoaXMuc3RhdGU7XG5cbiAgICBsZXQgZmlsbFBvaW50cyA9IHBvaW50cztcbiAgICBpZiAodW5jb21taXR0ZWRMbmdMYXQgJiYgaXNEcmF3aW5nKSB7XG4gICAgICBmaWxsUG9pbnRzID0gWy4uLnBvaW50cywgdW5jb21taXR0ZWRMbmdMYXRdO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGxQYXRoID0gdGhpcy5fZ2V0UHJvamVjdGVkRGF0YShmaWxsUG9pbnRzLCByZW5kZXJUeXBlLCBpc0Nsb3NlZCk7XG4gICAgcmV0dXJuIChcbiAgICAgIDxwYXRoXG4gICAgICAgIGRhdGEtdHlwZT17RUxFTUVOVF9UWVBFLkZFQVRVUkV9XG4gICAgICAgIGRhdGEtZmVhdHVyZS1pbmRleD17aW5kZXh9XG4gICAgICAgIGtleT17YCR7RUxFTUVOVF9UWVBFLkZFQVRVUkV9LiR7aW5kZXh9LmZpbGxgfVxuICAgICAgICBzdHlsZT17ey4uLnN0eWxlLCBzdHJva2U6ICdub25lJ319XG4gICAgICAgIGQ9e2ZpbGxQYXRofVxuICAgICAgLz5cbiAgICApO1xuICB9O1xuXG4gIF9yZW5kZXJDdXJyZW50UGF0aCA9IChmZWF0dXJlLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHtwb2ludHMsIHJlbmRlclR5cGV9ID0gZmVhdHVyZTtcbiAgICBpZiAoIXBvaW50cyB8fCAhcG9pbnRzLmxlbmd0aCB8fCByZW5kZXJUeXBlID09PSBSRU5ERVJfVFlQRS5QT0lOVCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qge2dldEZlYXR1cmVTdHlsZX0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IGdlb0pzb24gPSBmZWF0dXJlLnRvRmVhdHVyZSgpO1xuICAgIGNvbnN0IGNvbW1pdHRlZFN0eWxlID0gZ2V0RmVhdHVyZVN0eWxlKHtmZWF0dXJlOiBnZW9Kc29uLCBzdGF0ZTogUkVOREVSX1NUQVRFLlNFTEVDVEVEfSk7XG4gICAgY29uc3QgdW5jb21taXR0ZWRTdHlsZSA9IGdldEZlYXR1cmVTdHlsZSh7ZmVhdHVyZTogZ2VvSnNvbiwgc3RhdGU6IFJFTkRFUl9TVEFURS5VTkNPTU1JVFRFRH0pO1xuICAgIGNvbnN0IGNsb3NpbmdTdHlsZSA9IGdldEZlYXR1cmVTdHlsZSh7ZmVhdHVyZTogZ2VvSnNvbiwgc3RhdGU6IFJFTkRFUl9TVEFURS5DTE9TSU5HfSk7XG5cbiAgICBjb25zdCBjb21taXR0ZWRTdHJva2UgPSB0aGlzLl9yZW5kZXJDb21taXR0ZWRTdHJva2UoaW5kZXgsIGZlYXR1cmUsIGNvbW1pdHRlZFN0eWxlKTtcbiAgICBjb25zdCB1bmNvbW1pdHRlZFN0cm9rZXMgPVxuICAgICAgdGhpcy5fcmVuZGVyVW5jb21taXR0ZWRTdHJva2VzKGluZGV4LCBmZWF0dXJlLCB1bmNvbW1pdHRlZFN0eWxlKSB8fCBbXTtcbiAgICBjb25zdCBjbG9zaW5nU3Ryb2tlID0gdGhpcy5fcmVuZGVyQ2xvc2luZ1N0cm9rZShpbmRleCwgZmVhdHVyZSwgY2xvc2luZ1N0eWxlKTtcbiAgICBjb25zdCBmaWxsID0gdGhpcy5fcmVuZGVyRmlsbChpbmRleCwgZmVhdHVyZSwgdW5jb21taXR0ZWRTdHlsZSk7XG5cbiAgICByZXR1cm4gW2ZpbGwsIGNvbW1pdHRlZFN0cm9rZSwgLi4udW5jb21taXR0ZWRTdHJva2VzLCBjbG9zaW5nU3Ryb2tlXS5maWx0ZXIoQm9vbGVhbik7XG4gIH07XG5cbiAgX3JlbmRlckNvbW1pdHRlZFZlcnRpY2VzID0gKGZlYXR1cmVJbmRleCwgZmVhdHVyZSwgZ2VvSnNvbikgPT4ge1xuICAgIGNvbnN0IHttb2RlLCBnZXRFZGl0SGFuZGxlU3R5bGUsIGdldEVkaXRIYW5kbGVTaGFwZX0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHtpc0Nsb3NlZCwgcG9pbnRzfSA9IGZlYXR1cmU7XG5cbiAgICBjb25zdCBjb21taXR0ZWRWZXJ0aWNlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwID0gcG9pbnRzW2ldO1xuICAgICAgbGV0IG9wZXJhdGlvbiA9IE9QRVJBVElPTlMuU0VUO1xuXG4gICAgICBjb25zdCBzdHlsZSA9IGdldEVkaXRIYW5kbGVTdHlsZSh7XG4gICAgICAgIGZlYXR1cmU6IGdlb0pzb24sXG4gICAgICAgIGluZGV4OiBpLFxuICAgICAgICBzdGF0ZTogdGhpcy5fZ2V0RWRpdEhhbmRsZVN0YXRlKGkpXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNoYXBlID1cbiAgICAgICAgdHlwZW9mIGdldEVkaXRIYW5kbGVTaGFwZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gZ2V0RWRpdEhhbmRsZVNoYXBlKHtcbiAgICAgICAgICAgICAgZmVhdHVyZTogZ2VvSnNvbixcbiAgICAgICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgICAgIHN0YXRlOiB0aGlzLl9nZXRFZGl0SGFuZGxlU3RhdGUoaSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiBnZXRFZGl0SGFuZGxlU2hhcGU7XG5cbiAgICAgIGlmIChpc0Nsb3NlZCkge1xuICAgICAgICBjb21taXR0ZWRWZXJ0aWNlcy5wdXNoKHRoaXMuX3JlbmRlclZlcnRleChwLCBmZWF0dXJlSW5kZXgsIGksIG9wZXJhdGlvbiwgc3R5bGUsIHNoYXBlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobW9kZSA9PT0gTU9ERVMuRFJBV19QT0xZR09OICYmIGkgPT09IDAgJiYgcG9pbnRzLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICBvcGVyYXRpb24gPSBPUEVSQVRJT05TLklOVEVSU0VDVDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbW1pdHRlZFZlcnRpY2VzLnB1c2godGhpcy5fcmVuZGVyVmVydGV4KHAsIGZlYXR1cmVJbmRleCwgaSwgb3BlcmF0aW9uLCBzdHlsZSwgc2hhcGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29tbWl0dGVkVmVydGljZXM7XG4gIH07XG5cbiAgX3JlbmRlclVuY29tbWl0dGVkVmVydGV4ID0gKGZlYXR1cmVJbmRleCwgZmVhdHVyZSwgZ2VvSnNvbikgPT4ge1xuICAgIGNvbnN0IHtnZXRFZGl0SGFuZGxlU3R5bGUsIGdldEVkaXRIYW5kbGVTaGFwZX0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHtzZWxlY3RlZEZlYXR1cmVJZCwgdW5jb21taXR0ZWRMbmdMYXR9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCB7aWR9ID0gZmVhdHVyZTtcblxuICAgIGxldCB1bmNvbW1pdHRlZFZlcnRleCA9IG51bGw7XG4gICAgaWYgKHNlbGVjdGVkRmVhdHVyZUlkID09PSBpZCAmJiB1bmNvbW1pdHRlZExuZ0xhdCkge1xuICAgICAgY29uc3Qgc3R5bGUgPSBnZXRFZGl0SGFuZGxlU3R5bGUoe1xuICAgICAgICBmZWF0dXJlOiBnZW9Kc29uLFxuICAgICAgICBpbmRleDogJ3VuY29tbWl0dGVkJyxcbiAgICAgICAgc3RhdGU6IHRoaXMuX2dldEVkaXRIYW5kbGVTdGF0ZSgtMSwgUkVOREVSX1NUQVRFLlVOQ09NTUlUVEVEKVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNoYXBlID1cbiAgICAgICAgdHlwZW9mIGdldEVkaXRIYW5kbGVTaGFwZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gZ2V0RWRpdEhhbmRsZVNoYXBlKHtcbiAgICAgICAgICAgICAgZmVhdHVyZTogZ2VvSnNvbixcbiAgICAgICAgICAgICAgaW5kZXg6IG51bGwsXG4gICAgICAgICAgICAgIHN0YXRlOiB0aGlzLl9nZXRFZGl0SGFuZGxlU3RhdGUoLTEpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogZ2V0RWRpdEhhbmRsZVNoYXBlO1xuXG4gICAgICB1bmNvbW1pdHRlZFZlcnRleCA9IHRoaXMuX3JlbmRlclZlcnRleChcbiAgICAgICAgdW5jb21taXR0ZWRMbmdMYXQsXG4gICAgICAgIGZlYXR1cmVJbmRleCxcbiAgICAgICAgJ3VuY29tbWl0dGVkJyxcbiAgICAgICAgT1BFUkFUSU9OUy5JTlNFUlQsXG4gICAgICAgIHsuLi5zdHlsZSwgcG9pbnRlckV2ZW50czogJ25vbmUnfSxcbiAgICAgICAgc2hhcGVcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuY29tbWl0dGVkVmVydGV4O1xuICB9O1xuXG4gIF9yZW5kZXJDdXJyZW50VmVydGljZXMgPSAoZmVhdHVyZSwgZmVhdHVyZUluZGV4KSA9PiB7XG4gICAgY29uc3Qge3BvaW50c30gPSBmZWF0dXJlO1xuXG4gICAgaWYgKCFwb2ludHMgfHwgIXBvaW50cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGdlb0pzb24gPSBmZWF0dXJlLnRvRmVhdHVyZSgpO1xuICAgIGNvbnN0IGNvbW1pdHRlZFZlcnRpY2VzID0gdGhpcy5fcmVuZGVyQ29tbWl0dGVkVmVydGljZXMoZmVhdHVyZUluZGV4LCBmZWF0dXJlLCBnZW9Kc29uKTtcbiAgICBjb25zdCB1bmNvbW1pdHRlZFZlcnRleCA9IHRoaXMuX3JlbmRlclVuY29tbWl0dGVkVmVydGV4KGZlYXR1cmVJbmRleCwgZmVhdHVyZSwgZ2VvSnNvbik7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGcga2V5PVwiZWRpdC1oYW5kbGVzXCI+XG4gICAgICAgIHtjb21taXR0ZWRWZXJ0aWNlc31cbiAgICAgICAge3VuY29tbWl0dGVkVmVydGV4fVxuICAgICAgPC9nPlxuICAgICk7XG4gIH07XG5cbiAgX3JlbmRlckN1cnJlbnQgPSAoKSA9PiB7XG4gICAgY29uc3Qge2ZlYXR1cmVzfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgZmVhdHVyZSA9IHRoaXMuX2dldFNlbGVjdGVkRmVhdHVyZSgpO1xuXG4gICAgaWYgKCFmZWF0dXJlcyB8fCAhZmVhdHVyZSB8fCAhZmVhdHVyZS5wb2ludHMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHttb2RlfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgaW5kZXggPSBmZWF0dXJlcy5maW5kSW5kZXgoZiA9PiBmLmlkID09PSBmZWF0dXJlLmlkKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8Z1xuICAgICAgICBrZXk9XCJmZWF0dXJlIGN1cnJlbnRcIlxuICAgICAgICBzdHlsZT17bW9kZSA9PT0gTU9ERVMuUkVBRF9PTkxZIHx8IG1vZGUgPT09IE1PREVTLlNFTEVDVF9GRUFUVVJFID8gU1RBVElDX1NUWUxFIDogbnVsbH1cbiAgICAgID5cbiAgICAgICAge3RoaXMuX3JlbmRlckN1cnJlbnRQYXRoKGZlYXR1cmUsIGluZGV4KX1cbiAgICAgICAge3RoaXMuX3JlbmRlckN1cnJlbnRWZXJ0aWNlcyhmZWF0dXJlLCBpbmRleCl9XG4gICAgICA8L2c+XG4gICAgKTtcbiAgfTtcblxuICBfcmVuZGVyRmVhdHVyZSA9IChmZWF0dXJlLCBpbmRleCkgPT4ge1xuICAgIGlmIChmZWF0dXJlID09PSB0aGlzLl9nZXRTZWxlY3RlZEZlYXR1cmUoKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qge2NsaWNrUmFkaXVzfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qge2lkLCBwb2ludHMsIHJlbmRlclR5cGUsIGlzQ2xvc2VkfSA9IGZlYXR1cmU7XG4gICAgaWYgKCFwb2ludHMgfHwgIXBvaW50cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2plY3RlZCA9IHRoaXMuX2dldFByb2plY3RlZERhdGEocG9pbnRzLCByZW5kZXJUeXBlLCBpc0Nsb3NlZCk7XG5cbiAgICBpZiAoIXByb2plY3RlZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZ2VvSnNvbiA9IGZlYXR1cmUudG9GZWF0dXJlKCk7XG4gICAgY29uc3QgcmVuZGVyU3RhdGUgPSB0aGlzLl9nZXRGZWF0dXJlUmVuZGVyU3RhdGUoaWQpO1xuICAgIGNvbnN0IHtnZXRGZWF0dXJlU3R5bGUsIGdldEZlYXR1cmVTaGFwZX0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHN0eWxlID0gZ2V0RmVhdHVyZVN0eWxlKHtmZWF0dXJlOiBnZW9Kc29uLCBzdGF0ZTogcmVuZGVyU3RhdGV9KTtcbiAgICBjb25zdCBzaGFwZSA9XG4gICAgICB0eXBlb2YgZ2V0RmVhdHVyZVNoYXBlID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gZ2V0RmVhdHVyZVNoYXBlKHtmZWF0dXJlOiBnZW9Kc29uLCBzdGF0ZTogcmVuZGVyU3RhdGV9KVxuICAgICAgICA6IGdldEZlYXR1cmVTaGFwZTtcblxuICAgIGNvbnN0IGVsZW1LZXkgPSBgJHtFTEVNRU5UX1RZUEUuRkVBVFVSRX0uJHtpbmRleH1gO1xuXG4gICAgc3dpdGNoIChyZW5kZXJUeXBlKSB7XG4gICAgICBjYXNlIFJFTkRFUl9UWVBFLlBPSU5UOlxuICAgICAgICBpZiAoc2hhcGUgPT09ICdyZWN0Jykge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZyBrZXk9e2VsZW1LZXl9IHRyYW5zZm9ybT17YHRyYW5zbGF0ZSgke3Byb2plY3RlZFswXVswXX0sICR7cHJvamVjdGVkWzBdWzFdfSlgfT5cbiAgICAgICAgICAgICAgPHJlY3RcbiAgICAgICAgICAgICAgICBkYXRhLXR5cGU9e0VMRU1FTlRfVFlQRS5GRUFUVVJFfVxuICAgICAgICAgICAgICAgIGRhdGEtZmVhdHVyZS1pbmRleD17aW5kZXh9XG4gICAgICAgICAgICAgICAga2V5PXtgJHtlbGVtS2V5fS5oaWRkZW5gfVxuICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAuLi5zdHlsZSxcbiAgICAgICAgICAgICAgICAgIC4uLkhJRERFTl9DTElDS0FCTEVfU1RZTEUsXG4gICAgICAgICAgICAgICAgICB3aWR0aDogY2xpY2tSYWRpdXMsXG4gICAgICAgICAgICAgICAgICBoZWlnaHQ6IGNsaWNrUmFkaXVzXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHJlY3RcbiAgICAgICAgICAgICAgICBkYXRhLXR5cGU9e0VMRU1FTlRfVFlQRS5GRUFUVVJFfVxuICAgICAgICAgICAgICAgIGRhdGEtZmVhdHVyZS1pbmRleD17aW5kZXh9XG4gICAgICAgICAgICAgICAga2V5PXtlbGVtS2V5fVxuICAgICAgICAgICAgICAgIHN0eWxlPXtzdHlsZX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8ZyBrZXk9e2VsZW1LZXl9IHRyYW5zZm9ybT17YHRyYW5zbGF0ZSgke3Byb2plY3RlZFswXVswXX0sICR7cHJvamVjdGVkWzBdWzFdfSlgfT5cbiAgICAgICAgICAgIDxjaXJjbGVcbiAgICAgICAgICAgICAgZGF0YS10eXBlPXtFTEVNRU5UX1RZUEUuRkVBVFVSRX1cbiAgICAgICAgICAgICAgZGF0YS1mZWF0dXJlLWluZGV4PXtpbmRleH1cbiAgICAgICAgICAgICAga2V5PXtgJHtlbGVtS2V5fS5oaWRkZW5gfVxuICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgIC4uLnN0eWxlLFxuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgY3g9ezB9XG4gICAgICAgICAgICAgIGN5PXswfVxuICAgICAgICAgICAgICByPXtjbGlja1JhZGl1c31cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8Y2lyY2xlXG4gICAgICAgICAgICAgIGRhdGEtdHlwZT17RUxFTUVOVF9UWVBFLkZFQVRVUkV9XG4gICAgICAgICAgICAgIGRhdGEtZmVhdHVyZS1pbmRleD17aW5kZXh9XG4gICAgICAgICAgICAgIGtleT17YGZlYXR1cmUuJHtpbmRleH1gfVxuICAgICAgICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgICAgICAgIGN4PXswfVxuICAgICAgICAgICAgICBjeT17MH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9nPlxuICAgICAgICApO1xuXG4gICAgICAvLyBmaXJzdCA8cGF0aD4gaXMgdG8gbWFrZSBwYXRoIGVhc2lseSBpbnRlcmFjdGVkIHdpdGhcbiAgICAgIGNhc2UgUkVOREVSX1RZUEUuTElORV9TVFJJTkc6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPGcga2V5PXtlbGVtS2V5fT5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGRhdGEtdHlwZT17RUxFTUVOVF9UWVBFLkZFQVRVUkV9XG4gICAgICAgICAgICAgIGRhdGEtZmVhdHVyZS1pbmRleD17aW5kZXh9XG4gICAgICAgICAgICAgIGtleT17YCR7ZWxlbUtleX0uaGlkZGVuYH1cbiAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAuLi5zdHlsZSxcbiAgICAgICAgICAgICAgICBzdHJva2VXaWR0aDogY2xpY2tSYWRpdXMsXG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICBkPXtwcm9qZWN0ZWR9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZGF0YS10eXBlPXtFTEVNRU5UX1RZUEUuRkVBVFVSRX1cbiAgICAgICAgICAgICAgZGF0YS1mZWF0dXJlLWluZGV4PXtpbmRleH1cbiAgICAgICAgICAgICAga2V5PXtlbGVtS2V5fVxuICAgICAgICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgICAgICAgIGQ9e3Byb2plY3RlZH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9nPlxuICAgICAgICApO1xuXG4gICAgICBjYXNlICdQb2x5Z29uJzpcbiAgICAgIGNhc2UgJ1JlY3RhbmdsZSc6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgIGRhdGEtdHlwZT17RUxFTUVOVF9UWVBFLkZFQVRVUkV9XG4gICAgICAgICAgICBkYXRhLWZlYXR1cmUtaW5kZXg9e2luZGV4fVxuICAgICAgICAgICAga2V5PXtlbGVtS2V5fVxuICAgICAgICAgICAgc3R5bGU9e3N0eWxlfVxuICAgICAgICAgICAgZD17cHJvamVjdGVkfVxuICAgICAgICAgIC8+XG4gICAgICAgICk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfTtcblxuICBfcmVuZGVyRmVhdHVyZXMgPSAoKSA9PiB7XG4gICAgY29uc3Qge2ZlYXR1cmVzfSA9IHRoaXMuc3RhdGU7XG4gICAgcmV0dXJuIGZlYXR1cmVzICYmIGZlYXR1cmVzLm1hcCh0aGlzLl9yZW5kZXJGZWF0dXJlKTtcbiAgfTtcblxuICBfcmVuZGVyQ2FudmFzID0gKCkgPT4ge1xuICAgIGNvbnN0IHtzZWxlY3RlZEZlYXR1cmVJZCwgZmVhdHVyZXN9ID0gdGhpcy5zdGF0ZTtcblxuICAgIHJldHVybiAoXG4gICAgICA8c3ZnIGtleT1cImRyYXctY2FudmFzXCIgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiMTAwJVwiPlxuICAgICAgICB7ZmVhdHVyZXMgJiYgZmVhdHVyZXMubGVuZ3RoID4gMCAmJiA8ZyBrZXk9XCJmZWF0dXJlLWdyb3VwXCI+e3RoaXMuX3JlbmRlckZlYXR1cmVzKCl9PC9nPn1cbiAgICAgICAge3NlbGVjdGVkRmVhdHVyZUlkICYmIHRoaXMuX3JlbmRlckN1cnJlbnQoKX1cbiAgICAgIDwvc3ZnPlxuICAgICk7XG4gIH07XG5cbiAgX3JlbmRlckVkaXRvciA9ICgpID0+IHtcbiAgICBjb25zdCB2aWV3cG9ydCA9ICh0aGlzLl9jb250ZXh0ICYmIHRoaXMuX2NvbnRleHQudmlld3BvcnQpIHx8IHt9O1xuICAgIGNvbnN0IHtzdHlsZX0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IHZpZXdwb3J0O1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXZcbiAgICAgICAgaWQ9XCJlZGl0b3JcIlxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAuLi5zdHlsZVxuICAgICAgICB9fVxuICAgICAgICByZWY9e18gPT4ge1xuICAgICAgICAgIHRoaXMuX2NvbnRhaW5lclJlZiA9IF87XG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIHt0aGlzLl9yZW5kZXJDYW52YXMoKX1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8TWFwQ29udGV4dC5Db25zdW1lcj5cbiAgICAgICAge2NvbnRleHQgPT4ge1xuICAgICAgICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICAgIGNvbnN0IHZpZXdwb3J0ID0gY29udGV4dCAmJiBjb250ZXh0LnZpZXdwb3J0O1xuXG4gICAgICAgICAgaWYgKCF2aWV3cG9ydCB8fCB2aWV3cG9ydC5oZWlnaHQgPD0gMCB8fCB2aWV3cG9ydC53aWR0aCA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyRWRpdG9yKCk7XG4gICAgICAgIH19XG4gICAgICA8L01hcENvbnRleHQuQ29uc3VtZXI+XG4gICAgKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsV0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsS0FBQSxHQUFBRixPQUFBO0FBRUEsSUFBQUcsU0FBQSxHQUFBQyxzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQUssTUFBQSxHQUFBTCxPQUFBO0FBTUEsSUFBQU0sVUFBQSxHQUFBTixPQUFBO0FBV0EsSUFBQU8sTUFBQSxHQUFBUCxPQUFBO0FBQStFLElBQUFRLFNBQUE7QUFBQSxTQUFBQyx5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
|