UNPKG

68.9 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports["default"] = void 0;
7
8var _react = _interopRequireDefault(require("react"));
9
10var _constants = require("./constants");
11
12var _modeHandler = _interopRequireDefault(require("./mode-handler"));
13
14var _utils = require("./edit-modes/utils");
15
16var _style = require("./style");
17
18function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
19
20function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
21
22function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }
23
24function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }
25
26function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }
27
28function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }
29
30function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
31
32function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
33
34function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
35
36function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
37
38function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
39
40function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
41
42function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
43
44function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }
45
46function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
47
48function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
49
50function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
51
52function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
53
54function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
55
56function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
57
58function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
59
60var defaultProps = _objectSpread({}, _modeHandler["default"].defaultProps, {
61 clickRadius: 0,
62 featureShape: 'circle',
63 editHandleShape: 'rect',
64 editHandleStyle: _style.editHandleStyle,
65 featureStyle: _style.featureStyle
66});
67
68var Editor =
69/*#__PURE__*/
70function (_ModeHandler) {
71 _inherits(Editor, _ModeHandler);
72
73 function Editor() {
74 var _getPrototypeOf2;
75
76 var _this;
77
78 _classCallCheck(this, Editor);
79
80 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
81 args[_key] = arguments[_key];
82 }
83
84 _this = _possibleConstructorReturn(this, (_getPrototypeOf2 = _getPrototypeOf(Editor)).call.apply(_getPrototypeOf2, [this].concat(args)));
85
86 _defineProperty(_assertThisInitialized(_this), "_getEditHandleState", function (editHandle, renderState) {
87 var _this$state = _this.state,
88 pointerDownPicks = _this$state.pointerDownPicks,
89 hovered = _this$state.hovered;
90
91 if (renderState) {
92 return renderState;
93 }
94
95 var editHandleIndex = editHandle.properties.positionIndexes[0];
96 var draggingEditHandleIndex = null;
97 var pickedObject = pointerDownPicks && pointerDownPicks[0] && pointerDownPicks[0].object;
98
99 if (pickedObject && pickedObject.guideType === _constants.GUIDE_TYPE.EDIT_HANDLE) {
100 draggingEditHandleIndex = pickedObject.index;
101 }
102
103 if (editHandleIndex === draggingEditHandleIndex) {
104 return _constants.RENDER_STATE.SELECTED;
105 }
106
107 if (hovered && hovered.type === _constants.ELEMENT_TYPE.EDIT_HANDLE) {
108 if (hovered.index === editHandleIndex) {
109 return _constants.RENDER_STATE.HOVERED;
110 } // cursor hovered on first vertex when drawing polygon
111
112
113 if (hovered.index === 0 && editHandle.properties.guideType === _constants.GUIDE_TYPE.CURSOR_EDIT_HANDLE) {
114 return _constants.RENDER_STATE.CLOSING;
115 }
116 }
117
118 return _constants.RENDER_STATE.INACTIVE;
119 });
120
121 _defineProperty(_assertThisInitialized(_this), "_getFeatureRenderState", function (index, renderState) {
122 var hovered = _this.state.hovered;
123
124 var selectedFeatureIndex = _this._getSelectedFeatureIndex();
125
126 if (renderState) {
127 return renderState;
128 }
129
130 if (index === selectedFeatureIndex) {
131 return _constants.RENDER_STATE.SELECTED;
132 }
133
134 if (hovered && hovered.type === _constants.ELEMENT_TYPE.FEATURE && hovered.featureIndex === index) {
135 return _constants.RENDER_STATE.HOVERED;
136 }
137
138 return _constants.RENDER_STATE.INACTIVE;
139 });
140
141 _defineProperty(_assertThisInitialized(_this), "_getStyleProp", function (styleProp, params) {
142 return typeof styleProp === 'function' ? styleProp(params) : styleProp;
143 });
144
145 _defineProperty(_assertThisInitialized(_this), "_renderEditHandle", function (editHandle, feature) {
146 /* eslint-enable max-params */
147 var coordinates = (0, _utils.getFeatureCoordinates)(editHandle);
148
149 var p = _this.project(coordinates && coordinates[0]);
150
151 if (!p) {
152 return null;
153 }
154
155 var _editHandle$propertie = editHandle.properties,
156 featureIndex = _editHandle$propertie.featureIndex,
157 positionIndexes = _editHandle$propertie.positionIndexes;
158 var _this$props = _this.props,
159 clickRadius = _this$props.clickRadius,
160 editHandleShape = _this$props.editHandleShape,
161 editHandleStyle = _this$props.editHandleStyle;
162 var index = positionIndexes[0];
163
164 var shape = _this._getStyleProp(editHandleShape, {
165 feature: feature || editHandle,
166 index: index,
167 featureIndex: featureIndex,
168 state: _this._getEditHandleState(editHandle)
169 });
170
171 var style = _this._getStyleProp(editHandleStyle, {
172 feature: feature || editHandle,
173 index: index,
174 featureIndex: featureIndex,
175 shape: shape,
176 state: _this._getEditHandleState(editHandle)
177 }); // disable events for cursor editHandle
178
179
180 if (editHandle.properties.guideType === _constants.GUIDE_TYPE.CURSOR_EDIT_HANDLE) {
181 style = _objectSpread({}, style, {
182 // disable pointer events for cursor
183 pointerEvents: 'none'
184 });
185 }
186
187 var elemKey = "".concat(_constants.ELEMENT_TYPE.EDIT_HANDLE, ".").concat(featureIndex, ".").concat(index); // first <circle|rect> is to make path easily interacted with
188
189 switch (shape) {
190 case 'circle':
191 return _react["default"].createElement("g", {
192 key: elemKey,
193 transform: "translate(".concat(p[0], ", ").concat(p[1], ")")
194 }, _react["default"].createElement("circle", {
195 "data-type": _constants.ELEMENT_TYPE.EDIT_HANDLE,
196 "data-index": index,
197 "data-feature-index": featureIndex,
198 key: "".concat(elemKey, ".hidden"),
199 style: _objectSpread({}, style, {
200 stroke: 'none',
201 fill: '#000',
202 fillOpacity: 0
203 }),
204 cx: 0,
205 cy: 0,
206 r: clickRadius
207 }), _react["default"].createElement("circle", {
208 "data-type": _constants.ELEMENT_TYPE.EDIT_HANDLE,
209 "data-index": index,
210 "data-feature-index": featureIndex,
211 key: elemKey,
212 style: style,
213 cx: 0,
214 cy: 0
215 }));
216
217 case 'rect':
218 return _react["default"].createElement("g", {
219 key: elemKey,
220 transform: "translate(".concat(p[0], ", ").concat(p[1], ")")
221 }, _react["default"].createElement("rect", {
222 "data-type": _constants.ELEMENT_TYPE.EDIT_HANDLE,
223 "data-index": index,
224 "data-feature-index": featureIndex,
225 key: "".concat(elemKey, ".hidden"),
226 style: _objectSpread({}, style, {
227 height: clickRadius,
228 width: clickRadius,
229 fill: '#000',
230 fillOpacity: 0
231 }),
232 r: clickRadius
233 }), _react["default"].createElement("rect", {
234 "data-type": _constants.ELEMENT_TYPE.EDIT_HANDLE,
235 "data-index": index,
236 "data-feature-index": featureIndex,
237 key: "".concat(elemKey),
238 style: style
239 }));
240
241 default:
242 return null;
243 }
244 });
245
246 _defineProperty(_assertThisInitialized(_this), "_renderSegment", function (featureIndex, index, coordinates, style) {
247 var path = _this._getPathInScreenCoords(coordinates, _constants.GEOJSON_TYPE.LINE_STRING);
248
249 var radius = style.radius,
250 others = _objectWithoutProperties(style, ["radius"]);
251
252 var clickRadius = _this.props.clickRadius;
253 var elemKey = "".concat(_constants.ELEMENT_TYPE.SEGMENT, ".").concat(featureIndex, ".").concat(index);
254 return _react["default"].createElement("g", {
255 key: elemKey
256 }, _react["default"].createElement("path", {
257 key: "".concat(elemKey, ".hidden"),
258 "data-type": _constants.ELEMENT_TYPE.SEGMENT,
259 "data-index": index,
260 "data-feature-index": featureIndex,
261 style: _objectSpread({}, others, {
262 strokeWidth: clickRadius || radius,
263 opacity: 0
264 }),
265 d: path
266 }), _react["default"].createElement("path", {
267 key: elemKey,
268 "data-type": _constants.ELEMENT_TYPE.SEGMENT,
269 "data-index": index,
270 "data-feature-index": featureIndex,
271 style: others,
272 d: path
273 }));
274 });
275
276 _defineProperty(_assertThisInitialized(_this), "_renderSegments", function (featureIndex, coordinates, style) {
277 var segments = [];
278
279 for (var i = 0; i < coordinates.length - 1; i++) {
280 segments.push(_this._renderSegment(featureIndex, i, [coordinates[i], coordinates[i + 1]], style));
281 }
282
283 return segments;
284 });
285
286 _defineProperty(_assertThisInitialized(_this), "_renderFill", function (featureIndex, coordinates, style) {
287 var path = _this._getPathInScreenCoords(coordinates, _constants.GEOJSON_TYPE.POLYGON);
288
289 return _react["default"].createElement("path", {
290 key: "".concat(_constants.ELEMENT_TYPE.FILL, ".").concat(featureIndex),
291 "data-type": _constants.ELEMENT_TYPE.FILL,
292 "data-feature-index": featureIndex,
293 style: _objectSpread({}, style, {
294 stroke: 'none'
295 }),
296 d: path
297 });
298 });
299
300 _defineProperty(_assertThisInitialized(_this), "_renderTentativeFeature", function (feature, cursorEditHandle) {
301 var featureStyle = _this.props.featureStyle;
302 var coordinates = feature.geometry.coordinates,
303 renderType = feature.properties.renderType;
304
305 if (!coordinates || coordinates.length < 2) {
306 return null;
307 } // >= 2 coordinates
308
309
310 var firstCoords = coordinates[0];
311 var lastCoords = coordinates[coordinates.length - 1];
312
313 var uncommittedStyle = _this._getStyleProp(featureStyle, {
314 feature: feature,
315 index: null,
316 state: _constants.RENDER_STATE.UNCOMMITTED
317 });
318
319 var committedPath;
320 var uncommittedPath;
321 var closingPath;
322
323 var fill = _this._renderFill('tentative', coordinates, uncommittedStyle);
324
325 switch (renderType) {
326 case _constants.RENDER_TYPE.LINE_STRING:
327 case _constants.RENDER_TYPE.POLYGON:
328 var committedStyle = _this._getStyleProp(featureStyle, {
329 feature: feature,
330 state: _constants.RENDER_STATE.SELECTED
331 });
332
333 if (cursorEditHandle) {
334 var cursorCoords = coordinates[coordinates.length - 2];
335 committedPath = _this._renderSegments('tentative', coordinates.slice(0, coordinates.length - 1), committedStyle);
336 uncommittedPath = _this._renderSegment('tentative-uncommitted', coordinates.length - 2, [cursorCoords, lastCoords], uncommittedStyle);
337 } else {
338 committedPath = _this._renderSegments('tentative', coordinates, committedStyle);
339 }
340
341 if (renderType === _constants.RENDER_TYPE.POLYGON) {
342 var closingStyle = _this._getStyleProp(featureStyle, {
343 feature: feature,
344 index: null,
345 state: _constants.RENDER_STATE.CLOSING
346 });
347
348 closingPath = _this._renderSegment('tentative-closing', coordinates.length - 1, [lastCoords, firstCoords], closingStyle);
349 }
350
351 break;
352
353 case _constants.RENDER_TYPE.RECTANGLE:
354 uncommittedPath = _this._renderSegments('tentative', [].concat(_toConsumableArray(coordinates), [firstCoords]), uncommittedStyle);
355 break;
356
357 default:
358 }
359
360 return [fill, committedPath, uncommittedPath, closingPath].filter(Boolean);
361 });
362
363 _defineProperty(_assertThisInitialized(_this), "_renderGuides", function (_ref) {
364 var tentativeFeature = _ref.tentativeFeature,
365 editHandles = _ref.editHandles;
366
367 var features = _this.getFeatures();
368
369 var cursorEditHandle = editHandles.find(function (f) {
370 return f.properties.guideType === _constants.GUIDE_TYPE.CURSOR_EDIT_HANDLE;
371 });
372 return _react["default"].createElement("g", {
373 key: "feature-guides"
374 }, tentativeFeature && _this._renderTentativeFeature(tentativeFeature, cursorEditHandle), editHandles && editHandles.map(function (editHandle) {
375 var feature = features && features[editHandle.properties.featureIndex] || tentativeFeature;
376 return _this._renderEditHandle(editHandle, feature);
377 }));
378 });
379
380 _defineProperty(_assertThisInitialized(_this), "_renderPoint", function (feature, index, path) {
381 var renderState = _this._getFeatureRenderState(index);
382
383 var _this$props2 = _this.props,
384 featureStyle = _this$props2.featureStyle,
385 featureShape = _this$props2.featureShape,
386 clickRadius = _this$props2.clickRadius;
387
388 var shape = _this._getStyleProp(featureShape, {
389 feature: feature,
390 index: index,
391 state: renderState
392 });
393
394 var style = _this._getStyleProp(featureStyle, {
395 feature: feature,
396 index: index,
397 state: renderState
398 });
399
400 var elemKey = "feature.".concat(index);
401
402 if (shape === 'rect') {
403 return _react["default"].createElement("g", {
404 key: elemKey,
405 transform: "translate(".concat(path[0][0], ", ").concat(path[0][1], ")")
406 }, _react["default"].createElement("rect", {
407 "data-type": _constants.ELEMENT_TYPE.FEATURE,
408 "data-feature-index": index,
409 key: "".concat(elemKey, ".hidden"),
410 style: _objectSpread({}, style, {
411 width: clickRadius,
412 height: clickRadius,
413 fill: '#000',
414 fillOpacity: 0
415 })
416 }), _react["default"].createElement("rect", {
417 "data-type": _constants.ELEMENT_TYPE.FEATURE,
418 "data-feature-index": index,
419 key: elemKey,
420 style: style
421 }));
422 }
423
424 return _react["default"].createElement("g", {
425 key: "feature.".concat(index),
426 transform: "translate(".concat(path[0][0], ", ").concat(path[0][1], ")")
427 }, _react["default"].createElement("circle", {
428 "data-type": _constants.ELEMENT_TYPE.FEATURE,
429 "data-feature-index": index,
430 key: "".concat(elemKey, ".hidden"),
431 style: _objectSpread({}, style, {
432 opacity: 0
433 }),
434 cx: 0,
435 cy: 0,
436 r: clickRadius
437 }), _react["default"].createElement("circle", {
438 "data-type": _constants.ELEMENT_TYPE.FEATURE,
439 "data-feature-index": index,
440 key: elemKey,
441 style: style,
442 cx: 0,
443 cy: 0
444 }));
445 });
446
447 _defineProperty(_assertThisInitialized(_this), "_renderPath", function (feature, index, path) {
448 var _this$props3 = _this.props,
449 featureStyle = _this$props3.featureStyle,
450 clickRadius = _this$props3.clickRadius;
451
452 var selectedFeatureIndex = _this._getSelectedFeatureIndex();
453
454 var selected = index === selectedFeatureIndex;
455
456 var renderState = _this._getFeatureRenderState(index);
457
458 var style = _this._getStyleProp(featureStyle, {
459 feature: feature,
460 index: index,
461 state: renderState
462 });
463
464 var elemKey = "feature.".concat(index);
465
466 if (selected) {
467 return _react["default"].createElement("g", {
468 key: elemKey
469 }, _this._renderSegments(index, feature.geometry.coordinates, style));
470 } // first <path> is to make path easily interacted with
471
472
473 return _react["default"].createElement("g", {
474 key: elemKey
475 }, _react["default"].createElement("path", {
476 "data-type": _constants.ELEMENT_TYPE.FEATURE,
477 "data-feature-index": index,
478 key: "".concat(elemKey, ".hidden"),
479 style: _objectSpread({}, style, {
480 strokeWidth: clickRadius,
481 opacity: 0
482 }),
483 d: path
484 }), _react["default"].createElement("path", {
485 "data-type": _constants.ELEMENT_TYPE.FEATURE,
486 "data-feature-index": index,
487 key: elemKey,
488 style: style,
489 d: path
490 }));
491 });
492
493 _defineProperty(_assertThisInitialized(_this), "_renderPolygon", function (feature, index, path) {
494 var featureStyle = _this.props.featureStyle;
495
496 var selectedFeatureIndex = _this._getSelectedFeatureIndex();
497
498 var selected = index === selectedFeatureIndex;
499
500 var renderState = _this._getFeatureRenderState(index);
501
502 var style = _this._getStyleProp(featureStyle, {
503 feature: feature,
504 index: index,
505 state: renderState
506 });
507
508 var elemKey = "feature.".concat(index);
509
510 if (selected) {
511 var coordinates = (0, _utils.getFeatureCoordinates)(feature);
512
513 if (!coordinates) {
514 return null;
515 }
516
517 return _react["default"].createElement("g", {
518 key: elemKey
519 }, _this._renderFill(index, coordinates, style), _this._renderSegments(index, coordinates, style));
520 }
521
522 return _react["default"].createElement("path", {
523 "data-type": _constants.ELEMENT_TYPE.FEATURE,
524 "data-feature-index": index,
525 key: elemKey,
526 style: style,
527 d: path
528 });
529 });
530
531 _defineProperty(_assertThisInitialized(_this), "_renderFeature", function (feature, index) {
532 var coordinates = (0, _utils.getFeatureCoordinates)(feature);
533
534 if (!coordinates || !coordinates.length) {
535 return null;
536 }
537
538 var renderType = feature.properties.renderType,
539 type = feature.geometry.type;
540
541 var path = _this._getPathInScreenCoords(coordinates, type);
542
543 if (!path) {
544 return null;
545 }
546
547 switch (renderType) {
548 case _constants.RENDER_TYPE.POINT:
549 return _this._renderPoint(feature, index, path);
550
551 case _constants.RENDER_TYPE.LINE_STRING:
552 return _this._renderPath(feature, index, path);
553
554 case _constants.RENDER_TYPE.POLYGON:
555 case _constants.RENDER_TYPE.RECTANGLE:
556 return _this._renderPolygon(feature, index, path);
557
558 default:
559 return null;
560 }
561 });
562
563 _defineProperty(_assertThisInitialized(_this), "_renderCanvas", function () {
564 var features = _this.getFeatures();
565
566 var guides = _this._modeHandler && _this._modeHandler.getGuides(_this.getModeProps());
567
568 return _react["default"].createElement("svg", {
569 key: "draw-canvas",
570 width: "100%",
571 height: "100%"
572 }, features && features.length > 0 && _react["default"].createElement("g", {
573 key: "feature-group"
574 }, features.map(_this._renderFeature)), guides && _react["default"].createElement("g", {
575 key: "feature-guides"
576 }, _this._renderGuides(guides)));
577 });
578
579 _defineProperty(_assertThisInitialized(_this), "_renderEditor", function () {
580 var viewport = _this._context && _this._context.viewport || {};
581 if (!_this._context) return null;
582 var style = _this.props.style;
583 var width = viewport.width,
584 height = viewport.height;
585 return _react["default"].createElement("div", {
586 id: "editor",
587 style: _objectSpread({
588 width: width,
589 height: height
590 }, style),
591 ref: function ref(_) {
592 _this._containerRef = _;
593 }
594 }, _this._renderCanvas());
595 });
596
597 return _this;
598 }
599
600 _createClass(Editor, [{
601 key: "_getPathInScreenCoords",
602
603 /* HELPERS */
604 value: function _getPathInScreenCoords(coordinates, type) {
605 var _this2 = this;
606
607 if (coordinates.length === 0) {
608 return '';
609 }
610
611 var screenCoords = coordinates.map(function (p) {
612 return _this2.project(p);
613 });
614 var pathString = '';
615
616 switch (type) {
617 case _constants.GEOJSON_TYPE.POINT:
618 return screenCoords;
619
620 case _constants.GEOJSON_TYPE.LINE_STRING:
621 pathString = screenCoords.map(function (p) {
622 return "".concat(p[0], ",").concat(p[1]);
623 }).join('L');
624 return "M ".concat(pathString);
625
626 case _constants.GEOJSON_TYPE.POLYGON:
627 pathString = screenCoords.map(function (p) {
628 return "".concat(p[0], ",").concat(p[1]);
629 }).join('L');
630 return "M ".concat(pathString, " z");
631
632 default:
633 return null;
634 }
635 }
636 }, {
637 key: "render",
638 value: function render() {
639 return _get(_getPrototypeOf(Editor.prototype), "render", this).call(this, this._renderEditor());
640 }
641 }]);
642
643 return Editor;
644}(_modeHandler["default"]);
645
646exports["default"] = Editor;
647
648_defineProperty(Editor, "defaultProps", defaultProps);
649//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9lZGl0b3IuanMiXSwibmFtZXMiOlsiZGVmYXVsdFByb3BzIiwiTW9kZUhhbmRsZXIiLCJjbGlja1JhZGl1cyIsImZlYXR1cmVTaGFwZSIsImVkaXRIYW5kbGVTaGFwZSIsImVkaXRIYW5kbGVTdHlsZSIsImRlZmF1bHRFZGl0SGFuZGxlU3R5bGUiLCJmZWF0dXJlU3R5bGUiLCJkZWZhdWx0RmVhdHVyZVN0eWxlIiwiRWRpdG9yIiwiZWRpdEhhbmRsZSIsInJlbmRlclN0YXRlIiwic3RhdGUiLCJwb2ludGVyRG93blBpY2tzIiwiaG92ZXJlZCIsImVkaXRIYW5kbGVJbmRleCIsInByb3BlcnRpZXMiLCJwb3NpdGlvbkluZGV4ZXMiLCJkcmFnZ2luZ0VkaXRIYW5kbGVJbmRleCIsInBpY2tlZE9iamVjdCIsIm9iamVjdCIsImd1aWRlVHlwZSIsIkdVSURFX1RZUEUiLCJFRElUX0hBTkRMRSIsImluZGV4IiwiUkVOREVSX1NUQVRFIiwiU0VMRUNURUQiLCJ0eXBlIiwiRUxFTUVOVF9UWVBFIiwiSE9WRVJFRCIsIkNVUlNPUl9FRElUX0hBTkRMRSIsIkNMT1NJTkciLCJJTkFDVElWRSIsInNlbGVjdGVkRmVhdHVyZUluZGV4IiwiX2dldFNlbGVjdGVkRmVhdHVyZUluZGV4IiwiRkVBVFVSRSIsImZlYXR1cmVJbmRleCIsInN0eWxlUHJvcCIsInBhcmFtcyIsImZlYXR1cmUiLCJjb29yZGluYXRlcyIsInAiLCJwcm9qZWN0IiwicHJvcHMiLCJzaGFwZSIsIl9nZXRTdHlsZVByb3AiLCJfZ2V0RWRpdEhhbmRsZVN0YXRlIiwic3R5bGUiLCJwb2ludGVyRXZlbnRzIiwiZWxlbUtleSIsInN0cm9rZSIsImZpbGwiLCJmaWxsT3BhY2l0eSIsImhlaWdodCIsIndpZHRoIiwicGF0aCIsIl9nZXRQYXRoSW5TY3JlZW5Db29yZHMiLCJHRU9KU09OX1RZUEUiLCJMSU5FX1NUUklORyIsInJhZGl1cyIsIm90aGVycyIsIlNFR01FTlQiLCJzdHJva2VXaWR0aCIsIm9wYWNpdHkiLCJzZWdtZW50cyIsImkiLCJsZW5ndGgiLCJwdXNoIiwiX3JlbmRlclNlZ21lbnQiLCJQT0xZR09OIiwiRklMTCIsImN1cnNvckVkaXRIYW5kbGUiLCJnZW9tZXRyeSIsInJlbmRlclR5cGUiLCJmaXJzdENvb3JkcyIsImxhc3RDb29yZHMiLCJ1bmNvbW1pdHRlZFN0eWxlIiwiVU5DT01NSVRURUQiLCJjb21taXR0ZWRQYXRoIiwidW5jb21taXR0ZWRQYXRoIiwiY2xvc2luZ1BhdGgiLCJfcmVuZGVyRmlsbCIsIlJFTkRFUl9UWVBFIiwiY29tbWl0dGVkU3R5bGUiLCJjdXJzb3JDb29yZHMiLCJfcmVuZGVyU2VnbWVudHMiLCJzbGljZSIsImNsb3NpbmdTdHlsZSIsIlJFQ1RBTkdMRSIsImZpbHRlciIsIkJvb2xlYW4iLCJ0ZW50YXRpdmVGZWF0dXJlIiwiZWRpdEhhbmRsZXMiLCJmZWF0dXJlcyIsImdldEZlYXR1cmVzIiwiZmluZCIsImYiLCJfcmVuZGVyVGVudGF0aXZlRmVhdHVyZSIsIm1hcCIsIl9yZW5kZXJFZGl0SGFuZGxlIiwiX2dldEZlYXR1cmVSZW5kZXJTdGF0ZSIsInNlbGVjdGVkIiwiUE9JTlQiLCJfcmVuZGVyUG9pbnQiLCJfcmVuZGVyUGF0aCIsIl9yZW5kZXJQb2x5Z29uIiwiZ3VpZGVzIiwiX21vZGVIYW5kbGVyIiwiZ2V0R3VpZGVzIiwiZ2V0TW9kZVByb3BzIiwiX3JlbmRlckZlYXR1cmUiLCJfcmVuZGVyR3VpZGVzIiwidmlld3BvcnQiLCJfY29udGV4dCIsIl8iLCJfY29udGFpbmVyUmVmIiwiX3JlbmRlckNhbnZhcyIsInNjcmVlbkNvb3JkcyIsInBhdGhTdHJpbmciLCJqb2luIiwiX3JlbmRlckVkaXRvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUVBOztBQUtBOztBQUNBOztBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUtBLElBQU1BLFlBQVkscUJBQ2JDLHdCQUFZRCxZQURDO0FBRWhCRSxFQUFB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LE9BQWpCLENBQXJCO0FBRUEsVUFBSTZFLFVBQVUsR0FBRyxFQUFqQjs7QUFDQSxjQUFRM0YsSUFBUjtBQUNFLGFBQUs4Qix3QkFBYTZDLEtBQWxCO0FBQ0UsaUJBQU9lLFlBQVA7O0FBRUYsYUFBSzVELHdCQUFhQyxXQUFsQjtBQUNFNEQsVUFBQUEsVUFBVSxHQUFHRCxZQUFZLENBQUNuQixHQUFiLENBQWlCLFVBQUF6RCxDQUFDO0FBQUEsNkJBQU9BLENBQUMsQ0FBQyxDQUFELENBQVIsY0FBZUEsQ0FBQyxDQUFDLENBQUQsQ0FBaEI7QUFBQSxXQUFsQixFQUF5QzhFLElBQXpDLENBQThDLEdBQTlDLENBQWI7QUFDQSw2QkFBWUQsVUFBWjs7QUFFRixhQUFLN0Qsd0JBQWFZLE9BQWxCO0FBRUVpRCxVQUFBQSxVQUFVLEdBQUdELFlBQVksQ0FBQ25CLEdBQWIsQ0FBaUIsVUFBQXpELENBQUM7QUFBQSw2QkFBT0EsQ0FBQyxDQUFDLENBQUQsQ0FBUixjQUFlQSxDQUFDLENBQUMsQ0FBRCxDQUFoQjtBQUFBLFdBQWxCLEVBQXlDOEUsSUFBekMsQ0FBOEMsR0FBOUMsQ0FBYjtBQUNBLDZCQUFZRCxVQUFaOztBQUVGO0FBQ0UsaUJBQU8sSUFBUDtBQWRKO0FBZ0JEOzs7NkJBZ2dCUTtBQUNQLGdGQUFvQixLQUFLRSxhQUFMLEVBQXBCO0FBQ0Q7Ozs7RUE3aEJpQ3ZILHVCOzs7O2dCQUFmUSxNLGtCQUNHVCxZIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQGZsb3dcblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHR5cGUgeyBGZWF0dXJlIH0gZnJvbSAnQG5lYnVsYS5nbC9lZGl0LW1vZGVzJztcbmltcG9ydCB0eXBlIHsgR2VvSnNvblR5cGUsIFJlbmRlclN0YXRlLCBJZCB9IGZyb20gJy4vdHlwZXMnO1xuXG5pbXBvcnQgeyBSRU5ERVJfU1RBVEUsIFJFTkRFUl9UWVBFLCBHRU9KU09OX1RZUEUsIEdVSURFX1RZUEUsIEVMRU1FTlRfVFlQRSB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCBNb2RlSGFuZGxlciBmcm9tICcuL21vZGUtaGFuZGxlcic7XG5pbXBvcnQgeyBnZXRGZWF0dXJlQ29vcmRpbmF0ZXMgfSBmcm9tICcuL2VkaXQtbW9kZXMvdXRpbHMnO1xuXG5pbXBvcnQge1xuICBlZGl0SGFuZGxlU3R5bGUgYXMgZGVmYXVsdEVkaXRIYW5kbGVTdHlsZSxcbiAgZmVhdHVyZVN0eWxlIGFzIGRlZmF1bHRGZWF0dXJlU3R5bGVcbn0gZnJvbSAnLi9zdHlsZSc7XG5cbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgLi4uTW9kZUhhbmRsZXIuZGVmYXVsdFByb3BzLFxuICBjbGlja1JhZGl1czogMCxcbiAgZmVhdHVyZVNoYXBlOiAnY2lyY2xlJyxcbiAgZWRpdEhhbmRsZVNoYXBlOiAncmVjdCcsXG4gIGVkaXRIYW5kbGVTdHlsZTogZGVmYXVsdEVkaXRIYW5kbGVTdHlsZSxcbiAgZmVhdHVyZVN0eWxlOiBkZWZhdWx0RmVhdHVyZVN0eWxlXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFZGl0b3IgZXh0ZW5kcyBNb2RlSGFuZGxlciB7XG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbiAgLyogSEVMUEVSUyAqL1xuICBfZ2V0UGF0aEluU2NyZWVuQ29vcmRzKGNvb3JkaW5hdGVzOiBhbnksIHR5cGU6IEdlb0pzb25UeXBlKSB7XG4gICAgaWYgKGNvb3JkaW5hdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCBzY3JlZW5Db29yZHMgPSBjb29yZGluYXRlcy5tYXAocCA9PiB0aGlzLnByb2plY3QocCkpO1xuXG4gICAgbGV0IHBhdGhTdHJpbmcgPSAnJztcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgR0VPSlNPTl9UWVBFLlBPSU5UOlxuICAgICAgICByZXR1cm4gc2NyZWVuQ29vcmRzO1xuXG4gICAgICBjYXNlIEdFT0pTT05fVFlQRS5MSU5FX1NUUklORzpcbiAgICAgICAgcGF0aFN0cmluZyA9IHNjcmVlbkNvb3Jkcy5tYXAocCA9PiBgJHtwWzBdfSwke3BbMV19YCkuam9pbignTCcpO1xuICAgICAgICByZXR1cm4gYE0gJHtwYXRoU3RyaW5nfWA7XG5cbiAgICAgIGNhc2UgR0VPSlNPTl9UWVBFLlBPTFlHT046XG5cbiAgICAgICAgcGF0aFN0cmluZyA9IHNjcmVlbkNvb3Jkcy5tYXAocCA9PiBgJHtwWzBdfSwke3BbMV19YCkuam9pbignTCcpO1xuICAgICAgICByZXR1cm4gYE0gJHtwYXRoU3RyaW5nfSB6YDtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgX2dldEVkaXRIYW5kbGVTdGF0ZSA9IChlZGl0SGFuZGxlOiBGZWF0dXJlLCByZW5kZXJTdGF0ZTogP3N0cmluZykgPT4ge1xuICAgIGNvbnN0IHsgcG9pbnRlckRvd25QaWNrcywgaG92ZXJlZCB9ID0gdGhpcy5zdGF0ZTtcblxuICAgIGlmIChyZW5kZXJTdGF0ZSkge1xuICAgICAgcmV0dXJuIHJlbmRlclN0YXRlO1xuICAgIH1cblxuICAgIGNvbnN0IGVkaXRIYW5kbGVJbmRleCA9IGVkaXRIYW5kbGUucHJvcGVydGllcy5wb3NpdGlvbkluZGV4ZXNbMF07XG4gICAgbGV0IGRyYWdnaW5nRWRpdEhhbmRsZUluZGV4ID0gbnVsbDtcbiAgICBjb25zdCBwaWNrZWRPYmplY3QgPSBwb2ludGVyRG93blBpY2tzICYmIHBvaW50ZXJEb3duUGlja3NbMF0gJiYgcG9pbnRlckRvd25QaWNrc1swXS5vYmplY3Q7XG4gICAgaWYgKHBpY2tlZE9iamVjdCAmJiBwaWNrZWRPYmplY3QuZ3VpZGVUeXBlID09PSBHVUlERV9UWVBFLkVESVRfSEFORExFKSB7XG4gICAgICBkcmFnZ2luZ0VkaXRIYW5kbGVJbmRleCA9IHBpY2tlZE9iamVjdC5pbmRleDtcbiAgICB9XG5cbiAgICBpZiAoZWRpdEhhbmRsZUluZGV4ID09PSBkcmFnZ2luZ0VkaXRIYW5kbGVJbmRleCkge1xuICAgICAgcmV0dXJuIFJFTkRFUl9TVEFURS5TRUxFQ1RFRDtcbiAgICB9XG5cbiAgICBpZiAoaG92ZXJlZCAmJiBob3ZlcmVkLnR5cGUgPT09IEVMRU1FTlRfVFlQRS5FRElUX0hBTkRMRSkge1xuICAgICAgaWYgKGhvdmVyZWQuaW5kZXggPT09IGVkaXRIYW5kbGVJbmRleCkge1xuICAgICAgICByZXR1cm4gUkVOREVSX1NUQVRFLkhPVkVSRUQ7XG4gICAgICB9XG5cbiAgICAgIC8vIGN1cnNvciBob3ZlcmVkIG9uIGZpcnN0IHZlcnRleCB3aGVuIGRyYXdpbmcgcG9seWdvblxuICAgICAgaWYgKFxuICAgICAgICBob3ZlcmVkLmluZGV4ID09PSAwICYmXG4gICAgICAgIGVkaXRIYW5kbGUucHJvcGVydGllcy5ndWlkZVR5cGUgPT09IEdVSURFX1RZUEUuQ1VSU09SX0VESVRfSEFORExFXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIFJFTkRFUl9TVEFURS5DTE9TSU5HO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBSRU5ERVJfU1RBVEUuSU5BQ1RJVkU7XG4gIH07XG5cbiAgX2dldEZlYXR1cmVSZW5kZXJTdGF0ZSA9IChpbmRleDogbnVtYmVyLCByZW5kZXJTdGF0ZTogP1JlbmRlclN0YXRlKSA9PiB7XG4gICAgY29uc3QgeyBob3ZlcmVkIH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IHNlbGVjdGVkRmVhdHVyZUluZGV4ID0gdGhpcy5fZ2V0U2VsZWN0ZWRGZWF0dXJlSW5kZXgoKTtcbiAgICBpZiAocmVuZGVyU3RhdGUpIHtcbiAgICAgIHJldHVybiByZW5kZXJTdGF0ZTtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggPT09IHNlbGVjdGVkRmVhdHVyZUluZGV4KSB7XG4gICAgICByZXR1cm4gUkVOREVSX1NUQVRFLlNFTEVDVEVEO1xuICAgIH1cblxuICAgIGlmIChob3ZlcmVkICYmIGhvdmVyZWQudHlwZSA9PT0gRUxFTUVOVF9UWVBFLkZFQVRVUkUgJiYgaG92ZXJlZC5mZWF0dXJlSW5kZXggPT09IGluZGV4KSB7XG4gICAgICByZXR1cm4gUkVOREVSX1NUQVRFLkhPVkVSRUQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIFJFTkRFUl9TVEFURS5JTkFDVElWRTtcbiAgfTtcblxuICBfZ2V0U3R5bGVQcm9wID0gKHN0eWxlUHJvcDogYW55LCBwYXJhbXM6IGFueSkgPT4ge1xuICAgIHJldHVybiB0eXBlb2Ygc3R5bGVQcm9wID09PSAnZnVuY3Rpb24nID8gc3R5bGVQcm9wKHBhcmFtcykgOiBzdHlsZVByb3A7XG4gIH07XG5cbiAgLyogUkVOREVSICovXG4gIC8qIGVzbGludC1kaXNhYmxlIG1heC1wYXJhbXMgKi9cbiAgX3JlbmRlckVkaXRIYW5kbGUgPSAoZWRpdEhhbmRsZTogRmVhdHVyZSwgZmVhdHVyZTogRmVhdHVyZSkgPT4ge1xuICAgIC8qIGVzbGludC1lbmFibGUgbWF4LXBhcmFtcyAqL1xuICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gZ2V0RmVhdHVyZUNvb3JkaW5hdGVzKGVkaXRIYW5kbGUpO1xuICAgIGNvbnN0IHAgPSB0aGlzLnByb2plY3QoY29vcmRpbmF0ZXMgJiYgY29vcmRpbmF0ZXNbMF0pO1xuICAgIGlmICghcCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgcHJvcGVydGllczogeyBmZWF0dXJlSW5kZXgsIHBvc2l0aW9uSW5kZXhlcyB9XG4gICAgfSA9IGVkaXRIYW5kbGU7XG4gICAgY29uc3QgeyBjbGlja1JhZGl1cywgZWRpdEhhbmRsZVNoYXBlLCBlZGl0SGFuZGxlU3R5bGUgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBjb25zdCBpbmRleCA9IHBvc2l0aW9uSW5kZXhlc1swXTtcblxuICAgIGNvbnN0IHNoYXBlID0gdGhpcy5fZ2V0U3R5bGVQcm9wKGVkaXRIYW5kbGVTaGFwZSwge1xuICAgICAgZmVhdHVyZTogZmVhdHVyZSB8fCBlZGl0SGFuZGxlLFxuICAgICAgaW5kZXgsXG4gICAgICBmZWF0dXJlSW5kZXgsXG4gICAgICBzdGF0ZTogdGhpcy5fZ2V0RWRpdEhhbmRsZVN0YXRlKGVkaXRIYW5kbGUpXG4gICAgfSk7XG5cbiAgICBsZXQgc3R5bGUgPSB0aGlzLl9nZXRTdHlsZVByb3AoZWRpdEhhbmRsZVN0eWxlLCB7XG4gICAgICBmZWF0dXJlOiBmZWF0dXJlIHx8IGVkaXRIYW5kbGUsXG4gICAgICBpbmRleCxcbiAgICAgIGZlYXR1cmVJbmRleCxcbiAgICAgIHNoYXBlLFxuICAgICAgc3RhdGU6IHRoaXMuX2dldEVkaXRIYW5kbGVTdGF0ZShlZGl0SGFuZGxlKVxuICAgIH0pO1xuXG4gICAgLy8gZGlzYWJsZSBldmVudHMgZm9yIGN1cnNvciBlZGl0SGFuZGxlXG4gICAgaWYgKGVkaXRIYW5kbGUucHJvcGVydGllcy5ndWlkZVR5cGUgPT09IEdVSURFX1RZUEUuQ1VSU09SX0VESVRfSEFORExFKSB7XG4gICAgICBzdHlsZSA9IHtcbiAgICAgICAgLi4uc3R5bGUsXG4gICAgICAgIC8vIGRpc2FibGUgcG9pbnRlciBldmVudHMgZm9yIGN1cnNvclxuICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZSdcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbUtleSA9IGAke0VMRU1FTlRfVFlQRS5FRElUX0hBTkRMRX0uJHtmZWF0dXJlSW5kZXh9LiR7aW5kZXh9YDtcbiAgICAvLyBmaXJzdCA8Y2lyY2xlfHJlY3Q+IGlzIHRvIG1ha2UgcGF0aCBlYXNpbHkgaW50ZXJhY3RlZCB3aXRoXG4gICAgc3dpdGNoIChzaGFwZSkge1xuICAgICAgY2FzZSAnY2lyY2xlJzpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8ZyBrZXk9e2VsZW1LZXl9IHRyYW5zZm9ybT17YHRyYW5zbGF0ZSgke3BbMF19LCAke3BbMV19KWB9PlxuICAgICAgICAgICAgPGNpcmNsZVxuICAgICAgICAgICAgICBkYXRhLXR5cGU9e0VMRU1FTlRfVFlQRS5FRElUX0hBTkRMRX1cbiAgICAgICAgICAgICAgZGF0YS1pbmRleD17aW5kZXh9XG4gICAgICAgICAgICAgIGRhdGEtZmVhdHVyZS1pbmRleD17ZmVhdHVyZUluZGV4fVxuICAgICAgICAgICAgICBrZXk9e2Ake2VsZW1LZXl9LmhpZGRlbmB9XG4gICAgICAgICAgICAgIHN0eWxlPXt7IC4uLnN0eWxlLCBzdHJva2U6ICdub25lJywgZmlsbDogJyMwMDAnLCBmaWxsT3BhY2l0eTogMCB9fVxuICAgICAgICAgICAgICBjeD17MH1cbiAgICAgICAgICAgICAgY3k9ezB9XG4gICAgICAgICAgICAgIHI9e2NsaWNrUmFkaXVzfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxjaXJjbGVcbiAgICAgICAgICAgICAgZGF0YS10eXBlPXtFTEVNRU5UX1RZUEUuRURJVF9IQU5ETEV9XG4gICAgICAgICAgICAgIGRhdGEtaW5kZXg9e2luZGV4fVxuICAgICAgICAgICAgICBkYXRhLWZlYXR1cmUtaW5kZXg9e2ZlYXR1cmVJbmRleH1cbiAgICAgICAgICAgICAga2V5PXtlbGVtS2V5fVxuICAgICAgICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgICAgICAgIGN4PXswfVxuICAgICAgICAgICAgICBjeT17MH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9nPlxuICAgICAgICApO1xuICAgICAgY2FzZSAncmVjdCc6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPGcga2V5PXtlbGVtS2V5fSB0cmFuc2Zvcm09e2B0cmFuc2xhdGUoJHtwWzBdfSwgJHtwWzFdfSlgfT5cbiAgICAgICAgICAgIDxyZWN0XG4gICAgICAgICAgICAgIGRhdGEtdHlwZT17RUxFTUVOVF9UWVBFLkVESVRfSEFORExFfVxuICAgICAgICAgICAgICBkYXRhLWluZGV4PXtpbmRleH1cbiAgICAgICAgICAgICAgZGF0YS1mZWF0dXJlLWluZGV4PXtmZWF0dXJlSW5kZXh9XG4gICAgICAgICAgICAgIGtleT17YCR7ZWxlbUtleX0uaGlkZGVuYH1cbiAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAuLi5zdHlsZSxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGNsaWNrUmFkaXVzLFxuICAgICAgICAgICAgICAgIHdpZHRoOiBjbGlja1JhZGl1cyxcbiAgICAgICAgICAgICAgICBmaWxsOiAnIzAwMCcsXG4gICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDBcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgcj17Y2xpY2tSYWRpdXN9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHJlY3RcbiAgICAgICAgICAgICAgZGF0YS10eXBlPXtFTEVNRU5UX1RZUEUuRURJVF9IQU5ETEV9XG4gICAgICAgICAgICAgIGRhdGEtaW5kZXg9e2luZGV4fVxuICAgICAgICAgICAgICBkYXRhLWZlYXR1cmUtaW5kZXg9e2ZlYXR1cmVJbmRleH1cbiAgICAgICAgICAgICAga2V5PXtgJHtlbGVtS2V5fWB9XG4gICAgICAgICAgICAgIHN0eWxlPXtzdHlsZX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9nPlxuICAgICAgICApO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgX3JlbmRlclNlZ21lbnQgPSAoZmVhdHVyZUluZGV4OiBJZCwgaW5kZXg6IG51bWJlciwgY29vcmRpbmF0ZXM6IG51bWJlcltdLCBzdHlsZTogT2JqZWN0KSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IHRoaXMuX2dldFBhdGhJblNjcmVlbkNvb3Jkcyhjb29yZGluYXRlcywgR0VPSlNPTl9UWVBFLkxJTkVfU1RSSU5HKTtcbiAgICBjb25zdCB7IHJhZGl1cywgLi4ub3RoZXJzIH0gPSBzdHlsZTtcbiAgICBjb25zdCB7IGNsaWNrUmFkaXVzIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgY29uc3QgZWxlbUtleSA9IGAke0VMRU1FTlRfVFlQRS5TRUdNRU5UfS4ke2ZlYXR1cmVJbmRleH0uJHtpbmRleH1gO1xuICAgIHJldHVybiAoXG4gICAgICA8ZyBrZXk9e2VsZW1LZXl9PlxuICAgICAgICA8cGF0aFxuICAgICAgICAgIGtleT17YCR7ZWxlbUtleX0uaGlkZGVuYH1cbiAgICAgICAgICBkYXRhLXR5cGU9e0VMRU1FTlRfVFlQRS5TRUdNRU5UfVxuICAgICAgICAgIGRhdGEtaW5kZXg9e2luZGV4fVxuICAgICAgICAgIGRhdGEtZmVhdHVyZS1pbmRleD17ZmVhdHVyZUluZGV4fVxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAuLi5vdGhlcnMsXG4gICAgICAgICAgICBzdHJva2VXaWR0aDogY2xpY2tSYWRpdXMgfHwgcmFkaXVzLFxuICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgIH19XG4gICAgICAgICAgZD17cGF0aH1cbiAgICAgICAgLz5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBrZXk9e2VsZW1LZXl9XG4gICAgICAgICAgZGF0YS10eXBlPXtFTEVNRU5UX1RZUEUuU0VHTUVOVH1cbiAgICAgICAgICBkYXRhLWluZGV4PXtpbmRleH1cbiAgICAgICAgICBkYXRhLWZlYXR1cmUtaW5kZXg9e2ZlYXR1cmVJbmRleH1cbiAgICAgICAgICBzdHlsZT17b3RoZXJzfVxuICAgICAgICAgIGQ9e3BhdGh9XG4gICAgICAgIC8+XG4gICAgICA8L2c+XG4gICAgKTtcbiAgfTtcblxuICBfcmVuZGVyU2VnbWVudHMgPSAoZmVhdHVyZUluZGV4OiBJZCwgY29vcmRpbmF0ZXM6IG51bWJlcltdLCBzdHlsZTogT2JqZWN0KSA9PiB7XG4gICAgY29uc3Qgc2VnbWVudHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvb3JkaW5hdGVzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgc2VnbWVudHMucHVzaChcbiAgICAgICAgdGhpcy5fcmVuZGVyU2VnbWVudChmZWF0dXJlSW5kZXgsIGksIFtjb29yZGluYXRlc1tpXSwgY29vcmRpbmF0ZXNbaSArIDFdXSwgc3R5bGUpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gc2VnbWVudHM7XG4gIH07XG5cbiAgX3JlbmRlckZpbGwgPSAoZmVhdHVyZUluZGV4OiBJZCwgY29vcmRpbmF0ZXM6IG51bWJlcltdLCBzdHlsZTogT2JqZWN0KSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IHRoaXMuX2dldFBhdGhJblNjcmVlbkNvb3Jkcyhjb29yZGluYXRlcywgR0VPSlNPTl9UWVBFLlBPTFlHT04pO1xuICAgIHJldHVybiAoXG4gICAgICA8cGF0aFxuICAgICAgICBrZXk9e2Ake0VMRU1FTlRfVFlQRS5GSUxMfS4ke2ZlYXR1cmVJbmRleH1gfVxuICAgICAgICBkYXRhLXR5cGU9e0VMRU1FTlRfVFlQRS5GSUxMfVxuICAgICAgICBkYXRhLWZlYXR1cmUtaW5kZXg9e2ZlYXR1cmVJbmRleH1cbiAgICAgICAgc3R5bGU9e3sgLi4uc3R5bGUsIHN0cm9rZTogJ25vbmUnIH19XG4gICAgICAgIGQ9e3BhdGh9XG4gICAgICAvPlxuICAgICk7XG4gIH07XG5cbiAgX3JlbmRlclRlbnRhdGl2ZUZlYXR1cmUgPSAoZmVhdHVyZTogRmVhdHVyZSwgY3Vyc29yRWRpdEhhbmRsZTogRmVhdHVyZSkgPT4ge1xuICAgIGNvbnN0IHsgZmVhdHVyZVN0eWxlIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHtcbiAgICAgIGdlb21ldHJ5OiB7IGNvb3JkaW5hdGVzIH0sXG4gICAgICBwcm9wZXJ0aWVzOiB7IHJlbmRlclR5cGUgfVxuICAgIH0gPSBmZWF0dXJlO1xuXG4gICAgaWYgKCFjb29yZGluYXRlcyB8fCBjb29yZGluYXRlcy5sZW5ndGggPCAyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyA+PSAyIGNvb3JkaW5hdGVzXG4gICAgY29uc3QgZmlyc3RDb29yZHMgPSBjb29yZGluYXRlc1swXTtcbiAgICBjb25zdCBsYXN0Q29vcmRzID0gY29vcmRpbmF0ZXNbY29vcmRpbmF0ZXMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgdW5jb21taXR0ZWRTdHlsZSA9IHRoaXMuX2dldFN0eWxlUHJvcChmZWF0dXJlU3R5bGUsIHtcbiAgICAgIGZlYXR1cmUsXG4gICAgICBpbmRleDogbnVsbCxcbiAgICAgIHN0YXRlOiBSRU5ERVJfU1RBVEUuVU5DT01NSVRURURcbiAgICB9KTtcblxuICAgIGxldCBjb21taXR0ZWRQYXRoO1xuICAgIGxldCB1bmNvbW1pdHRlZFBhdGg7XG4gICAgbGV0IGNsb3NpbmdQYXRoO1xuICAgIGNvbnN0IGZpbGwgPSB0aGlzLl9yZW5kZXJGaWxsKCd0ZW50YXRpdmUnLCBjb29yZGluYXRlcywgdW5jb21taXR0ZWRTdHlsZSk7XG5cbiAgICBzd2l0Y2ggKHJlbmRlclR5cGUpIHtcbiAgICAgIGNhc2UgUkVOREVSX1RZUEUuTElORV9TVFJJTkc6XG4gICAgICBjYXNlIFJFTkRFUl9UWVBFLlBPTFlHT046XG4gICAgICAgIGNvbnN0IGNvbW1pdHRlZFN0eWxlID0gdGhpcy5fZ2V0U3R5bGVQcm9wKGZlYXR1cmVTdHlsZSwge1xuICAgICAgICAgIGZlYXR1cmUsXG4gICAgICAgICAgc3RhdGU6IFJFTkRFUl9TVEFURS5TRUxFQ1RFRFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY3Vyc29yRWRpdEhhbmRsZSkge1xuICAgICAgICAgIGNvbnN0IGN1cnNvckNvb3JkcyA9IGNvb3JkaW5hdGVzW2Nvb3JkaW5hdGVzLmxlbmd0aCAtIDJdO1xuICAgICAgICAgIGNvbW1pdHRlZFBhdGggPSB0aGlzLl9yZW5kZXJTZWdtZW50cyhcbiAgICAgICAgICAgICd0ZW50YXRpdmUnLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXMuc2xpY2UoMCwgY29vcmRpbmF0ZXMubGVuZ3RoIC0gMSksXG4gICAgICAgICAgICBjb21taXR0ZWRTdHlsZVxuICAgICAgICAgICk7XG4gICAgICAgICAgdW5jb21taXR0ZWRQYXRoID0gdGhpcy5fcmVuZGVyU2VnbWVudChcbiAgICAgICAgICAgICd0ZW50YXRpdmUtdW5jb21taXR0ZWQnLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXMubGVuZ3RoIC0gMixcbiAgICAgICAgICAgIFtjdXJzb3JDb29yZHMsIGxhc3RDb29yZHNdLFxuICAgICAgICAgICAgdW5jb21taXR0ZWRTdHlsZVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tbWl0dGVkUGF0aCA9IHRoaXMuX3JlbmRlclNlZ21lbnRzKCd0ZW50YXRpdmUnLCBjb29yZGluYXRlcywgY29tbWl0dGVkU3R5bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlbmRlclR5cGUgPT09IFJFTkRFUl9UWVBFLlBPTFlHT04pIHtcbiAgICAgICAgICBjb25zdCBjbG9zaW5nU3R5bGUgPSB0aGlzLl9nZXRTdHlsZVByb3AoZmVhdHVyZVN0eWxlLCB7XG4gICAgICAgICAgICBmZWF0dXJlLFxuICAgICAgICAgICAgaW5kZXg6IG51bGwsXG4gICAgICAgICAgICBzdGF0ZTogUkVOREVSX1NUQVRFLkNMT1NJTkdcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNsb3NpbmdQYXRoID0gdGhpcy5fcmVuZGVyU2VnbWVudChcbiAgICAgICAgICAgICd0ZW50YXRpdmUtY2xvc2luZycsXG4gICAgICAgICAgICBjb29yZGluYXRlcy5sZW5ndGggLSAxLFxuICAgICAgICAgICAgW2xhc3RDb29yZHMsIGZpcnN0Q29vcmRzXSxcbiAgICAgICAgICAgIGNsb3NpbmdTdHlsZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBSRU5ERVJfVFlQRS5SRUNUQU5HTEU6XG4gICAgICAgIHVuY29tbWl0dGVkUGF0aCA9IHRoaXMuX3JlbmRlclNlZ21lbnRzKFxuICAgICAgICAgICd0ZW50YXRpdmUnLFxuICAgICAgICAgIFsuLi5jb29yZGluYXRlcywgZmlyc3RDb29yZHNdLFxuICAgICAgICAgIHVuY29tbWl0dGVkU3R5bGVcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuXG4gICAgcmV0dXJuIFtmaWxsLCBjb21taXR0ZWRQYXRoLCB1bmNvbW1pdHRlZFBhdGgsIGNsb3NpbmdQYXRoXS5maWx0ZXIoQm9vbGVhbik7XG4gIH07XG5cbiAgX3JlbmRlckd1aWRlcyA9ICh7IHRlbnRhdGl2ZUZlYXR1cmUsIGVkaXRIYW5kbGVzIH06IE9iamVjdCkgPT4ge1xuICAgIGNvbnN0IGZlYXR1cmVzID0gdGhpcy5nZXRGZWF0dXJlcygpO1xuICAgIGNvbnN0IGN1cnNvckVkaXRIYW5kbGUgPSBlZGl0SGFuZGxlcy5maW5kKFxuICAgICAgZiA9PiBmLnByb3BlcnRpZXMuZ3VpZGVUeXBlID09PSBHVUlERV9UWVBFLkNVUlNPUl9FRElUX0hBTkRMRVxuICAgICk7XG4gICAgcmV0dXJuIChcbiAgICAgIDxnIGtleT1cImZlYXR1cmUtZ3VpZGVzXCI+XG4gICAgICAgIHt0ZW50YXRpdmVGZWF0dXJlICYmIHRoaXMuX3JlbmRlclRlbnRhdGl2ZUZlYXR1cmUodGVudGF0aXZlRmVhdHVyZSwgY3Vyc29yRWRpdEhhbmRsZSl9XG4gICAgICAgIHtlZGl0SGFuZGxlcyAmJlxuICAgICAgICAgIGVkaXRIYW5kbGVzLm1hcChlZGl0SGFuZGxlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPVxuICAgICAgICAgICAgICAoZmVhdHVyZXMgJiYgZmVhdHVyZXNbZWRpdEhhbmRsZS5wcm9wZXJ0aWVzLmZlYXR1cmVJbmRleF0pIHx8IHRlbnRhdGl2ZUZlYXR1cmU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyRWRpdEhhbmRsZShlZGl0SGFuZGxlLCBmZWF0dXJlKTtcbiAgICAgICAgICB9KX1cbiAgICAgIDwvZz5cbiAgICApO1xuICB9O1xuXG4gIF9yZW5kZXJQb2ludCA9IChmZWF0dXJlOiBGZWF0dXJlLCBpbmRleDogbnVtYmVyLCBwYXRoOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByZW5kZXJTdGF0ZSA9IHRoaXMuX2dldEZlYXR1cmVSZW5kZXJTdGF0ZShpbmRleCk7XG4gICAgY29uc3QgeyBmZWF0dXJlU3R5bGUsIGZlYXR1cmVTaGFwZSwgY2xpY2tSYWRpdXMgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qgc2hhcGUgPSB0aGlzLl9nZXRTdHlsZVByb3AoZmVhdHVyZVNoYXBlLCB7IGZlYXR1cmUsIGluZGV4LCBzdGF0ZTogcmVuZGVyU3RhdGUgfSk7XG4gICAgY29uc3Qgc3R5bGUgPSB0aGlzLl9nZXRTdHlsZVByb3AoZmVhdHVyZVN0eWxlLCB7IGZlYXR1cmUsIGluZGV4LCBzdGF0ZTogcmVuZGVyU3RhdGUgfSk7XG5cbiAgICBjb25zdCBlbGVtS2V5ID0gYGZlYXR1cmUuJHtpbmRleH1gO1xuICAgIGlmIChzaGFwZSA9PT0gJ3JlY3QnKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8ZyBrZXk9e2VsZW1LZXl9IHRyYW5zZm9ybT17YHRyYW5zbGF0ZSgke3BhdGhbMF1bMF19LCAke3BhdGhbMF1bMV19KWB9PlxuICAgICAgICAgIDxyZWN0XG4gICAgICAgICAgICBkYXRhLXR5cGU9e0VMRU1FTlRfVFlQRS5GRUFUVVJFfVxuICAgICAgICAgICAgZGF0YS1mZWF0dXJlLWluZGV4PXtpbmRleH1cbiAgICAgICAgICAgIGtleT17YCR7ZWxlbUtleX0uaGlkZGVuYH1cbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIC4uLnN0eWxlLFxuICAgICAgICAgICAgICB3aWR0aDogY2xpY2tSYWRpdXMsXG4gICAgICAgICAgICAgIGhlaWdodDogY2xpY2tSYWRpdXMsXG4gICAgICAgICAgICAgIGZpbGw6ICcjMDAwJyxcbiAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDBcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8cmVjdFxuICAgICAgICAgICAgZGF0YS10eXBlPXtFTEVNRU5UX1RZUEUuRkVBVFVSRX1cbiAgICAgICAgICAgIGRhdGEtZmVhdHVyZS1pbmRleD17aW5kZXh9XG4gICAgICAgICAgICBrZXk9e2VsZW1LZXl9XG4gICAgICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9nPlxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGcga2V5PXtgZmVhdHVyZS4ke2luZGV4fWB9IHRyYW5zZm9ybT17YHRyYW5zbGF0ZSgke3BhdGhbMF1bMF19LCAke3BhdGhbMF1bMV19KWB9PlxuICAgICAgICA8Y2lyY2xlXG4gICAgICAgICAgZGF0YS10eXBlPXtFTEVNRU5UX1RZUEUuRkVBVFVSRX1cbiAgICAgICAgICBkYXRhLWZlYXR1cmUtaW5kZXg9e2luZGV4fVxuICAgICAgICAgIGtleT17YCR7ZWxlbUtleX0uaGlkZGVuYH1cbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgLi4uc3R5bGUsXG4gICAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgICAgfX1cbiAgICAgICAgICBjeD17MH1cbiAgICAgICAgICBjeT17MH1cbiAgICAgICAgICByPXtjbGlja1JhZGl1c31cbiAgICAgICAgLz5cbiAgICAgICAgPGNpcmNsZVxuICAgICAgICAgIGRhdGEtdHlwZT17RUxFTUVOVF9UWVBFLkZFQVRVUkV9XG4gICAgICAgICAgZGF0YS1mZWF0dXJlLWluZGV4PXtpbmRleH1cbiAgICAgICAgICBrZXk9e2VsZW1LZXl9XG4gICAgICAgICAgc3R5bGU9e3N0eWxlfVxuICAgICAgICAgIGN4PXswfVxuICAgICAgICAgIGN5PXswfVxuICAgICAgICAvPlxuICAgICAgPC9nPlxuICAgICk7XG4gIH07XG5cbiAgX3JlbmRlclBhdGggPSAoZmVhdHVyZTogRmVhdHVyZSwgaW5kZXg6IG51bWJlciwgcGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgeyBmZWF0dXJlU3R5bGUsIGNsaWNrUmFkaXVzIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHNlbGVjdGVkRmVhdHVyZUluZGV4ID0gdGhpcy5fZ2V0U2VsZWN0ZWRGZWF0dXJlSW5kZXgoKTtcbiAgICBjb25zdCBzZWxlY3RlZCA9IGluZGV4ID09PSBzZWxlY3RlZEZlYXR1cmVJbmRleDtcbiAgICBjb25zdCByZW5kZXJTdGF0ZSA9IHRoaXMuX2dldEZlYXR1cmVSZW5kZXJTdGF0ZShpbmRleCk7XG4gICAgY29uc3Qgc3R5bGUgPSB0aGlzLl9nZXRTdHlsZVByb3AoZmVhdHVyZVN0eWxlLCB7IGZlYXR1cmUsIGluZGV4LCBzdGF0ZTogcmVuZGVyU3RhdGUgfSk7XG5cbiAgICBjb25zdCBlbGVtS2V5ID0gYGZlYXR1cmUuJHtpbmRleH1gO1xuICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGcga2V5PXtlbGVtS2V5fT57dGhpcy5fcmVuZGVyU2VnbWVudHMoaW5kZXgsIGZlYXR1cmUuZ2VvbWV0cnkuY29vcmRpbmF0ZXMsIHN0eWxlKX08L2c+XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGZpcnN0IDxwYXRoPiBpcyB0byBtYWtlIHBhdGggZWFzaWx5IGludGVyYWN0ZWQgd2l0aFxuICAgIHJldHVybiAoXG4gICAgICA8ZyBrZXk9e2VsZW1LZXl9PlxuICAgICAgICA8cGF0aFxuICAgICAgICAgIGRhdGEtdHlwZT17RUxFTUVOVF9UWVBFLkZFQVRVUkV9XG4gICAgICAgICAgZGF0YS1mZWF0dXJlLWluZGV4PXtpbmRleH1cbiAgICAgICAgICBrZXk9e2Ake2VsZW1LZXl9LmhpZGRlbmB9XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIC4uLnN0eWxlLFxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IGNsaWNrUmFkaXVzLFxuICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgIH19XG4gICAgICAgICAgZD17cGF0aH1cbiAgICAgICAgLz5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBkYXRhLXR5cGU9e0VMRU1FTlRfVFlQRS5GRUFUVVJFfVxuICAgICAgICAgIGRhdGEtZmVhdHVyZS1pbmRleD17aW5kZXh9XG4gICAgICAgICAga2V5PXtlbGVtS2V5fVxuICAgICAgICAgIHN0eWxlPXtzdHlsZX1cbiAgICAgICAgICBkPXtwYXRofVxuICAgICAgICAvPlxuICAgICAgPC9nPlxuICAgICk7XG4gIH07XG5cbiAgX3JlbmRlclBvbHlnb24gPSAoZmVhdHVyZTogRmVhdHVyZSwgaW5kZXg6IG51bWJlciwgcGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgeyBmZWF0dXJlU3R5bGUgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qgc2VsZWN0ZWRGZWF0dXJlSW5kZXggPSB0aGlzLl9nZXRTZWxlY3RlZEZlYXR1cmVJbmRleCgpO1xuICAgIGNvbnN0IHNlbGVjdGVkID0gaW5kZXggPT09IHNlbGVjdGVkRmVhdHVyZUluZGV4O1xuXG4gICAgY29uc3QgcmVuZGVyU3RhdGUgPSB0aGlzLl9nZXRGZWF0dXJlUmVuZGVyU3RhdGUoaW5kZXgpO1xuICAgIGNvbnN0IHN0eWxlID0gdGhpcy5fZ2V0U3R5bGVQcm9wKGZlYXR1cmVTdHlsZSwgeyBmZWF0dXJlLCBpbmRleCwgc3RhdGU6IHJlbmRlclN0YXRlIH0pO1xuXG4gICAgY29uc3QgZWxlbUtleSA9IGBmZWF0dXJlLiR7aW5kZXh9YDtcbiAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gZ2V0RmVhdHVyZUNvb3JkaW5hdGVzKGZlYXR1cmUpO1xuICAgICAgaWYgKCFjb29yZGluYXRlcykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxnIGtleT17ZWxlbUtleX0+XG4gICAgICAgICAge3RoaXMuX3JlbmRlckZpbGwoaW5kZXgsIGNvb3JkaW5hdGVzLCBzdHlsZSl9XG4gICAgICAgICAge3RoaXMuX3JlbmRlclNlZ21lbnRzKGluZGV4LCBjb29yZGluYXRlcywgc3R5bGUpfVxuICAgICAgICA8L2c+XG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8cGF0aFxuICAgICAgICBkYXRhLXR5cGU9e0VMRU1FTlRfVFlQRS5GRUFUVVJFfVxuICAgICAgICBkYXRhLWZlYXR1cmUtaW5kZXg9e2luZGV4fVxuICAgICAgICBrZXk9e2VsZW1LZXl9XG4gICAgICAgIHN0eWxlPXtzdHlsZX1cbiAgICAgICAgZD17cGF0aH1cbiAgICAgIC8+XG4gICAgKTtcbiAgfTtcblxuICBfcmVuZGVyRmVhdHVyZSA9IChmZWF0dXJlOiBGZWF0dXJlLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSBnZXRGZWF0dXJlQ29vcmRpbmF0ZXMoZmVhdHVyZSk7XG5cbiAgICBpZiAoIWNvb3JkaW5hdGVzIHx8ICFjb29yZGluYXRlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBwcm9wZXJ0aWVzOiB7IHJlbmRlclR5cGUgfSxcbiAgICAgIGdlb21ldHJ5OiB7IHR5cGUgfVxuICAgIH0gPSBmZWF0dXJlO1xuXG4gICAgY29uc3QgcGF0aCA9IHRoaXMuX2dldFBhdGhJblNjcmVlbkNvb3Jkcyhjb29yZGluYXRlcywgdHlwZSk7XG4gICAgaWYgKCFwYXRoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHJlbmRlclR5cGUpIHtcbiAgICAgIGNhc2UgUkVOREVSX1RZUEUuUE9JTlQ6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJQb2ludChmZWF0dXJlLCBpbmRleCwgcGF0aCk7XG4gICAgICBjYXNlIFJFTkRFUl9UWVBFLkxJTkVfU1RSSU5HOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyUGF0aChmZWF0dXJlLCBpbmRleCwgcGF0aCk7XG5cbiAgICAgIGNhc2UgUkVOREVSX1RZUEUuUE9MWUdPTjpcbiAgICAgIGNhc2UgUkVOREVSX1RZUEUuUkVDVEFOR0xFOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyUG9seWdvbihmZWF0dXJlLCBpbmRleCwgcGF0aCk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfTtcblxuICBfcmVuZGVyQ2FudmFzID0gKCkgPT4ge1xuXG4gICAgY29uc3QgZmVhdHVyZXMgPSB0aGlzLmdldEZlYXR1cmVzKCk7XG4gICAgY29uc3QgZ3VpZGVzID0gdGhpcy5fbW9kZUhhbmRsZXIgJiYgdGhpcy5fbW9kZUhhbmRsZXIuZ2V0R3VpZGVzKHRoaXMuZ2V0TW9kZVByb3BzKCkpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxzdmcga2V5PVwiZHJhdy1jYW52YXNcIiB3aWR0aD1cIjEwMCVcIiBoZWlnaHQ9XCIxMDAlXCI+XG4gICAgICAgIHtmZWF0dXJlcyAmJlxuICAgICAgICAgIGZlYXR1cmVzLmxlbmd0aCA+IDAgJiYgPGcga2V5PVwiZmVhdHVyZS1ncm91cFwiPntmZWF0dXJlcy5tYXAodGhpcy5fcmVuZGVyRmVhdHVyZSl9PC9nPn1cbiAgICAgICAge2d1aWRlcyAmJiA8ZyBrZXk9XCJmZWF0dXJlLWd1aWRlc1wiPnt0aGlzLl9yZW5kZXJHdWlkZXMoZ3VpZGVzKX08L2c+fVxuICAgICAgPC9zdmc+XG4gICAgKTtcbiAgfTtcblxuICBfcmVuZGVyRWRpdG9yID0gKCkgPT4ge1xuICAgIGNvbnN0IHZpZXdwb3J0ID0gKHRoaXMuX2NvbnRleHQgJiYgdGhpcy5fY29udGV4dC52aWV3cG9ydCkgfHwge307XG4gIFxuICAgIGlmKCF0aGlzLl9jb250ZXh0KSByZXR1cm4gbnVsbFxuICAgIGNvbnN0IHsgc3R5bGUgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSB2aWV3cG9ydDtcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIGlkPVwiZWRpdG9yXCJcbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgLi4uc3R5bGVcbiAgICAgICAgfX1cbiAgICAgICAgcmVmPXtfID0+IHtcbiAgICAgICAgICB0aGlzLl9jb250YWluZXJSZWYgPSBfO1xuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICB7dGhpcy5fcmVuZGVyQ2FudmFzKCl9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9O1xuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gc3VwZXIucmVuZGVyKHRoaXMuX3JlbmRlckVkaXRvcigpKTtcbiAgfVxufVxuIl19
\No newline at end of file