@pie-element/extended-text-entry 6.6.3 → 6.7.0-annotations.1

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.
@@ -0,0 +1,702 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
+
12
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
13
+
14
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
15
+
16
+ var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
17
+
18
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
19
+
20
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
21
+
22
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
23
+
24
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
25
+
26
+ var _react = _interopRequireDefault(require("react"));
27
+
28
+ var _styles = require("@material-ui/core/styles");
29
+
30
+ var _classnames = _interopRequireDefault(require("classnames"));
31
+
32
+ var _propTypes = _interopRequireDefault(require("prop-types"));
33
+
34
+ var _annotationUtils = require("./annotation-utils");
35
+
36
+ var _editableHtml = _interopRequireDefault(require("@pie-lib/editable-html"));
37
+
38
+ var _configUi = require("@pie-lib/config-ui");
39
+
40
+ var _freeformEditor = _interopRequireDefault(require("./freeform-editor"));
41
+
42
+ var _annotationMenu = _interopRequireDefault(require("./annotation-menu"));
43
+
44
+ function 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; }
45
+
46
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
47
+
48
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
49
+
50
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
51
+
52
+ var style = {
53
+ textContainer: {
54
+ padding: '10px 16px',
55
+ backgroundColor: 'rgba(0, 0, 0, 0.06)',
56
+ border: '1px solid #ccc',
57
+ borderRadius: '4px',
58
+ overflowY: 'scroll',
59
+ lineHeight: '36px',
60
+ whiteSpace: 'pre-wrap',
61
+ overflowWrap: 'break-word',
62
+ '& p': {
63
+ margin: 0
64
+ },
65
+ '& span[data-latex]': {
66
+ userSelect: 'none',
67
+ '-webkit-user-select': 'none',
68
+ '-moz-user-select': 'none',
69
+ '-ms-user-select': 'none'
70
+ }
71
+ },
72
+ labelsContainer: {
73
+ width: '230px'
74
+ },
75
+ wrapper: {
76
+ position: 'relative',
77
+ overflowX: 'hidden',
78
+ display: 'flex'
79
+ },
80
+ commentContainer: {
81
+ paddingTop: 16,
82
+ marginBottom: 16,
83
+ marginTop: 16,
84
+ width: '100%'
85
+ },
86
+ annotation: {
87
+ position: 'relative',
88
+ cursor: 'pointer',
89
+ '&.positive': {
90
+ backgroundColor: 'rgb(51, 255, 51, 0.5)'
91
+ },
92
+ '&.negative': {
93
+ backgroundColor: 'rgba(255, 102, 204, 0.4)'
94
+ }
95
+ },
96
+ annotationLabel: {
97
+ backgroundColor: 'rgb(242, 242, 242)',
98
+ padding: '2px',
99
+ position: 'absolute',
100
+ userSelect: 'none',
101
+ whiteSpace: 'nowrap',
102
+ top: '-10px',
103
+ left: '-2px',
104
+ fontSize: '12px',
105
+ fontStyle: 'normal',
106
+ fontWeight: 'normal',
107
+ lineHeight: '6px',
108
+ '-webkit-user-select': 'none',
109
+ '-moz-user-select': 'none',
110
+ '-ms-user-select': 'none',
111
+ '&.positive': {
112
+ color: 'rgb(0, 128, 0)'
113
+ },
114
+ '&.negative': {
115
+ color: 'rgb(204, 0, 136)'
116
+ }
117
+ },
118
+ labelHover: {
119
+ zIndex: 20,
120
+ '&.positive': {
121
+ color: 'rgb(0, 77, 0)'
122
+ },
123
+ '&.negative': {
124
+ color: 'rgb(153, 0, 102)'
125
+ }
126
+ },
127
+ highlight: {
128
+ zIndex: 10
129
+ },
130
+ hover: {
131
+ zIndex: 20,
132
+ '&.positive': {
133
+ backgroundColor: 'rgb(51, 255, 51, 0.7)'
134
+ },
135
+ '&.negative': {
136
+ backgroundColor: 'rgba(255, 102, 204, 0.55)'
137
+ }
138
+ },
139
+ sideAnnotationHover: {
140
+ zIndex: 20,
141
+ '&.negative': {
142
+ backgroundColor: 'rgb(255, 179, 230) !important',
143
+ '&:before': {
144
+ borderRightColor: 'rgb(255, 179, 230) !important'
145
+ }
146
+ },
147
+ '&.positive': {
148
+ backgroundColor: 'rgb(128, 255, 128) !important',
149
+ '&:before': {
150
+ borderRightColor: 'rgb(153, 255, 153) !important'
151
+ }
152
+ }
153
+ },
154
+ sideAnnotation: {
155
+ position: 'absolute',
156
+ padding: '4px',
157
+ borderRadius: '4px',
158
+ marginLeft: '8px',
159
+ width: '180px',
160
+ whiteSpace: 'pre-wrap',
161
+ wordBreak: 'break-word',
162
+ border: '2px solid #ffffff',
163
+ fontSize: '14px',
164
+ fontStyle: 'normal',
165
+ fontWeight: 'normal',
166
+ '&:before': {
167
+ position: 'absolute',
168
+ right: '100%',
169
+ top: '5px',
170
+ border: 'solid transparent',
171
+ content: '""',
172
+ height: 0,
173
+ width: 0,
174
+ pointerEvents: 'none',
175
+ borderWidth: '7px'
176
+ },
177
+ '&.negative': {
178
+ backgroundColor: 'rgb(255, 204, 238)',
179
+ '&:before': {
180
+ borderRightColor: 'rgb(255, 204, 238)'
181
+ }
182
+ },
183
+ '&.positive': {
184
+ backgroundColor: 'rgb(153, 255, 153)',
185
+ '&:before': {
186
+ borderRightColor: 'rgb(153, 255, 153)'
187
+ }
188
+ }
189
+ }
190
+ };
191
+
192
+ var AnnotationEditor = /*#__PURE__*/function (_React$Component) {
193
+ (0, _inherits2["default"])(AnnotationEditor, _React$Component);
194
+
195
+ var _super = _createSuper(AnnotationEditor);
196
+
197
+ function AnnotationEditor(props) {
198
+ var _this;
199
+
200
+ (0, _classCallCheck2["default"])(this, AnnotationEditor);
201
+ _this = _super.call(this, props);
202
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "adjustAnnotationsPosition", function () {
203
+ if (_this.textRef && _this.labelsRef) {
204
+ var left = _this.textRef.offsetLeft + _this.textRef.offsetWidth + 8;
205
+ Array.from(_this.labelsRef.children).forEach(function (label) {
206
+ var spans = (0, _annotationUtils.getAnnotationElements)(label.dataset.annId);
207
+ var spanOffset = spans[0].offsetTop ? spans[0].offsetTop : spans[0].offsetParent.offsetTop;
208
+ var top = spanOffset - _this.textRef.scrollTop - 6;
209
+ label.style.top = "".concat(top, "px");
210
+ label.style.left = "".concat(left, "px");
211
+ });
212
+ }
213
+ });
214
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleClick", function (event) {
215
+ var _this$props = _this.props,
216
+ annotations = _this$props.annotations,
217
+ classes = _this$props.classes;
218
+ var selectionDetails = _this.state.selectionDetails;
219
+
220
+ if (selectionDetails) {
221
+ // new selection was made inside another annotation and should not update that annotation
222
+ return;
223
+ }
224
+
225
+ var _event$target$dataset = event.target.dataset,
226
+ id = _event$target$dataset.id,
227
+ annId = _event$target$dataset.annId;
228
+ var annotationId = id || annId;
229
+ var selectedElems = (0, _annotationUtils.getAnnotationElements)(annotationId);
230
+ var labelElem = (0, _annotationUtils.getLabelElement)(annotationId);
231
+ var annotationIndex = annotations.findIndex(function (annotation) {
232
+ return annotation.id === annotationId;
233
+ });
234
+ var isSideLabel = labelElem.hasAttribute('data-freeform');
235
+
236
+ if (isSideLabel) {
237
+ labelElem.classList.add(classes.highlight);
238
+ }
239
+
240
+ _this.setState({
241
+ anchorEl: selectedElems[0],
242
+ openedMenu: !!id || !!annId && !isSideLabel,
243
+ // true if the annotation or the label was clicked
244
+ openedEditor: !!annId && isSideLabel,
245
+ // true if the side label was clicked
246
+ selectedElems: selectedElems,
247
+ labelElem: labelElem,
248
+ annotationIndex: annotationIndex,
249
+ annotation: annotations[annotationIndex],
250
+ selectionDetails: null
251
+ });
252
+ });
253
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleHover", function (event) {
254
+ var classes = _this.props.classes;
255
+ var _event$target$dataset2 = event.target.dataset,
256
+ id = _event$target$dataset2.id,
257
+ annId = _event$target$dataset2.annId;
258
+ var annotationId = id || annId;
259
+ var selectedElems = (0, _annotationUtils.getAnnotationElements)(annotationId);
260
+ var labelElem = (0, _annotationUtils.getLabelElement)(annotationId);
261
+ var isSideLabel = labelElem.hasAttribute('data-freeform');
262
+ selectedElems.forEach(function (elem) {
263
+ return elem.classList.add(classes.hover);
264
+ });
265
+ labelElem.classList.add(isSideLabel ? classes.sideAnnotationHover : classes.labelHover);
266
+ });
267
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleCancelHover", function (event) {
268
+ var classes = _this.props.classes;
269
+ var _event$target$dataset3 = event.target.dataset,
270
+ id = _event$target$dataset3.id,
271
+ annId = _event$target$dataset3.annId;
272
+ var annotationId = id || annId;
273
+ var selectedElems = (0, _annotationUtils.getAnnotationElements)(annotationId);
274
+ var labelElem = (0, _annotationUtils.getLabelElement)(annotationId);
275
+ var isSideLabel = labelElem.hasAttribute('data-freeform');
276
+ selectedElems.forEach(function (elem) {
277
+ return elem.classList.remove(classes.hover);
278
+ });
279
+ labelElem.classList.remove(isSideLabel ? classes.sideAnnotationHover : classes.labelHover);
280
+ });
281
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleClose", function (event) {
282
+ var classes = _this.props.classes;
283
+ var _this$state = _this.state,
284
+ selectedElems = _this$state.selectedElems,
285
+ labelElem = _this$state.labelElem;
286
+
287
+ if (selectedElems.length && !selectedElems[0].hasAttribute('data-id')) {
288
+ (0, _annotationUtils.removeElemsWrapping)(selectedElems, _this.textRef);
289
+ }
290
+
291
+ if (labelElem) {
292
+ labelElem.classList.remove(classes.highlight);
293
+ }
294
+
295
+ _this.setState({
296
+ anchorEl: null,
297
+ openedMenu: false,
298
+ openedEditor: false,
299
+ selectedElems: [],
300
+ labelElem: null,
301
+ selectionDetails: null,
302
+ annotationIndex: null,
303
+ annotation: null
304
+ });
305
+
306
+ (0, _annotationUtils.clearSelection)();
307
+ });
308
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleSelection", function (event) {
309
+ var selection = window.getSelection(); // prevent unwanted selections
310
+
311
+ if (event.detail > 2) {
312
+ (0, _annotationUtils.clearSelection)();
313
+ return;
314
+ }
315
+
316
+ if (selection && selection.rangeCount > 0) {
317
+ var selectedRange = selection.getRangeAt(0);
318
+ var selectedText = selectedRange.toString();
319
+
320
+ var isSelectionInside = _this.textRef.contains(selectedRange.commonAncestorContainer);
321
+
322
+ if (!selection.isCollapsed && selectedText !== '' && isSelectionInside) {
323
+ var selectionDetails = (0, _annotationUtils.getRangeDetails)(selectedRange, _this.textRef);
324
+ var selectedElems = (0, _annotationUtils.wrapRange)(selectedRange);
325
+
326
+ _this.setState({
327
+ anchorEl: selectedElems[0],
328
+ openedMenu: true,
329
+ selectedElems: selectedElems,
330
+ selectionDetails: selectionDetails
331
+ });
332
+ }
333
+ }
334
+ });
335
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "deleteAnnotation", function () {
336
+ var _this$props2 = _this.props,
337
+ annotations = _this$props2.annotations,
338
+ onChange = _this$props2.onChange;
339
+ var _this$state2 = _this.state,
340
+ selectedElems = _this$state2.selectedElems,
341
+ labelElem = _this$state2.labelElem,
342
+ annotationIndex = _this$state2.annotationIndex,
343
+ annotation = _this$state2.annotation;
344
+ var parentRef = (0, _annotationUtils.isSideLabel)(annotation.label) ? _this.labelsRef : selectedElems[0];
345
+ parentRef.removeChild(labelElem);
346
+ (0, _annotationUtils.removeElemsWrapping)(selectedElems, _this.textRef);
347
+ annotations.splice(annotationIndex, 1);
348
+ onChange(annotations);
349
+
350
+ _this.handleClose();
351
+ });
352
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "createDOMAnnotation", function (elems, annotation) {
353
+ var _this$props3 = _this.props,
354
+ classes = _this$props3.classes,
355
+ disabled = _this$props3.disabled;
356
+ var id = annotation.id,
357
+ label = annotation.label,
358
+ type = annotation.type;
359
+ (elems || []).forEach(function (elem) {
360
+ elem.dataset.id = id;
361
+ elem.className = (0, _classnames["default"])(classes.annotation, type);
362
+ elem.onclick = !disabled && _this.handleClick;
363
+ elem.onmouseover = _this.handleHover;
364
+ elem.onmouseout = _this.handleCancelHover;
365
+ });
366
+ var firstSpan = elems && elems[0] || {};
367
+ var labelElem = document.createElement('SPAN');
368
+ labelElem.dataset.annId = id;
369
+ labelElem.innerHTML = label;
370
+ labelElem.onclick = !disabled && _this.handleClick;
371
+ labelElem.onmouseover = _this.handleHover;
372
+ labelElem.onmouseout = _this.handleCancelHover;
373
+
374
+ if ((0, _annotationUtils.isSideLabel)(label)) {
375
+ var spanOffset = firstSpan.offsetTop ? firstSpan.offsetTop : firstSpan.offsetParent.offsetTop;
376
+ var top = spanOffset - _this.textRef.scrollTop;
377
+ var left = _this.textRef.offsetLeft + _this.textRef.offsetWidth + 8;
378
+ labelElem.dataset.freeform = true;
379
+ labelElem.className = (0, _classnames["default"])(classes.sideAnnotation, type);
380
+ labelElem.style.top = "".concat(top, "px");
381
+ labelElem.style.left = "".concat(left, "px");
382
+
383
+ _this.labelsRef.appendChild(labelElem);
384
+ } else {
385
+ labelElem.className = (0, _classnames["default"])(classes.annotationLabel, type);
386
+ firstSpan.insertBefore(labelElem, firstSpan.firstChild);
387
+ }
388
+ });
389
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "createNewAnnotation", function (label, type) {
390
+ var _this$state3 = _this.state,
391
+ selectedElems = _this$state3.selectedElems,
392
+ selectionDetails = _this$state3.selectionDetails;
393
+
394
+ var annotation = _objectSpread({
395
+ id: [selectionDetails.start, selectionDetails.end, new Date().getTime()].join('-'),
396
+ label: label,
397
+ type: type
398
+ }, selectionDetails);
399
+
400
+ _this.createDOMAnnotation(selectedElems, annotation);
401
+
402
+ return annotation;
403
+ });
404
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleMenuClick", function (newAnnotation) {
405
+ var _this$props4 = _this.props,
406
+ annotations = _this$props4.annotations,
407
+ onChange = _this$props4.onChange;
408
+ var _this$state4 = _this.state,
409
+ annotation = _this$state4.annotation,
410
+ annotationIndex = _this$state4.annotationIndex;
411
+ var type = newAnnotation.type,
412
+ label = newAnnotation.text;
413
+
414
+ if (annotation) {
415
+ var updatedAnnotation = _objectSpread(_objectSpread({}, annotation), {}, {
416
+ label: label,
417
+ type: type
418
+ });
419
+
420
+ var oldType = annotation.type,
421
+ oldLabel = annotation.label;
422
+
423
+ _this.updateLabel(oldLabel, updatedAnnotation, type !== oldType && oldType);
424
+
425
+ annotations.splice(annotationIndex, 1, updatedAnnotation);
426
+ } else {
427
+ var _newAnnotation = _this.createNewAnnotation(label, type);
428
+
429
+ annotations.push(_newAnnotation);
430
+ }
431
+
432
+ onChange(annotations);
433
+
434
+ _this.handleClose();
435
+ });
436
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "editAnnotation", function () {
437
+ _this.setState({
438
+ openedMenu: false,
439
+ openedEditor: true
440
+ });
441
+ });
442
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "addAnnotation", function (type) {
443
+ var _this$props5 = _this.props,
444
+ annotations = _this$props5.annotations,
445
+ onChange = _this$props5.onChange;
446
+
447
+ var annotation = _this.createNewAnnotation('', type);
448
+
449
+ var labelElem = (0, _annotationUtils.getLabelElement)(annotation.id);
450
+ annotations.push(annotation);
451
+
452
+ _this.setState({
453
+ openedMenu: false,
454
+ openedEditor: true,
455
+ annotationIndex: annotations.length - 1,
456
+ annotation: annotation,
457
+ labelElem: labelElem
458
+ });
459
+
460
+ onChange(annotations);
461
+ });
462
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "updateLabel", function (oldLabel, annotation, oldType) {
463
+ var _this$state5 = _this.state,
464
+ selectedElems = _this$state5.selectedElems,
465
+ labelElem = _this$state5.labelElem;
466
+ var label = annotation.label,
467
+ type = annotation.type;
468
+
469
+ if ((0, _annotationUtils.isSideLabel)(label) && (0, _annotationUtils.isSideLabel)(oldLabel) || !(0, _annotationUtils.isSideLabel)(label) && !(0, _annotationUtils.isSideLabel)(oldLabel)) {
470
+ labelElem.innerHTML = label;
471
+
472
+ if (oldType) {
473
+ labelElem.classList.remove(oldType);
474
+ labelElem.classList.add(type);
475
+ selectedElems.forEach(function (elem) {
476
+ elem.classList.remove(oldType);
477
+ elem.classList.add(type);
478
+ });
479
+ }
480
+ } else if ((0, _annotationUtils.isSideLabel)(label) && !(0, _annotationUtils.isSideLabel)(oldLabel)) {
481
+ selectedElems[0].removeChild(labelElem);
482
+
483
+ _this.createDOMAnnotation(selectedElems, annotation);
484
+ } else if (!(0, _annotationUtils.isSideLabel)(label) && (0, _annotationUtils.isSideLabel)(oldLabel)) {
485
+ _this.labelsRef.removeChild(labelElem);
486
+
487
+ _this.createDOMAnnotation(selectedElems, annotation);
488
+ }
489
+ });
490
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "changeAnnotationType", function (newLabel) {
491
+ var _this$props6 = _this.props,
492
+ annotations = _this$props6.annotations,
493
+ onChange = _this$props6.onChange;
494
+ var _this$state6 = _this.state,
495
+ annotationIndex = _this$state6.annotationIndex,
496
+ selectedElems = _this$state6.selectedElems;
497
+ var _annotations$annotati = annotations[annotationIndex],
498
+ oldType = _annotations$annotati.type,
499
+ oldLabel = _annotations$annotati.label;
500
+ var type = oldType === 'positive' ? 'negative' : 'positive';
501
+
502
+ var updatedAnnotation = _objectSpread(_objectSpread({}, annotations[annotationIndex]), {}, {
503
+ type: type,
504
+ label: newLabel
505
+ });
506
+
507
+ selectedElems.forEach(function (span) {
508
+ span.classList.remove(oldType);
509
+ span.classList.add(type);
510
+ });
511
+
512
+ _this.updateLabel(oldLabel, updatedAnnotation, oldType);
513
+
514
+ annotations.splice(annotationIndex, 1, updatedAnnotation);
515
+ onChange(annotations);
516
+
517
+ _this.handleClose();
518
+ });
519
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "updateAnnotation", function (oldLabel, newLabel) {
520
+ var _this$props7 = _this.props,
521
+ annotations = _this$props7.annotations,
522
+ onChange = _this$props7.onChange;
523
+ var annotationIndex = _this.state.annotationIndex;
524
+
525
+ var updatedAnnotation = _objectSpread(_objectSpread({}, annotations[annotationIndex]), {}, {
526
+ label: newLabel
527
+ });
528
+
529
+ _this.updateLabel(oldLabel, updatedAnnotation);
530
+
531
+ annotations.splice(annotationIndex, 1, updatedAnnotation);
532
+ onChange(annotations);
533
+ });
534
+ _this.state = {
535
+ anchorEl: null,
536
+ openedMenu: false,
537
+ openedEditor: false,
538
+ selectedElems: [],
539
+ labelElem: null,
540
+ selectionDetails: null,
541
+ annotation: null,
542
+ annotationIndex: null
543
+ };
544
+ return _this;
545
+ }
546
+
547
+ (0, _createClass2["default"])(AnnotationEditor, [{
548
+ key: "componentDidMount",
549
+ value: function componentDidMount() {
550
+ var _this2 = this;
551
+
552
+ var _this$props8 = this.props,
553
+ annotations = _this$props8.annotations,
554
+ text = _this$props8.text;
555
+
556
+ if (text) {
557
+ annotations.forEach(function (annotation) {
558
+ var _getDOMNodes = (0, _annotationUtils.getDOMNodes)(annotation.start, annotation.end, _this2.textRef),
559
+ _getDOMNodes2 = (0, _slicedToArray2["default"])(_getDOMNodes, 2),
560
+ domStart = _getDOMNodes2[0],
561
+ domEnd = _getDOMNodes2[1];
562
+
563
+ if (domStart && domEnd) {
564
+ var range = document.createRange();
565
+ range.setStart(domStart.node, domStart.offset);
566
+ range.setEnd(domEnd.node, domEnd.offset);
567
+ var spans = (0, _annotationUtils.wrapRange)(range);
568
+
569
+ _this2.createDOMAnnotation(spans, annotation);
570
+ }
571
+ });
572
+ }
573
+
574
+ if (this.textRef) {
575
+ this.adjustAnnotationsPosition();
576
+ this.textRef.addEventListener('scroll', this.adjustAnnotationsPosition);
577
+ }
578
+ }
579
+ }, {
580
+ key: "componentWillUnmount",
581
+ value: function componentWillUnmount() {
582
+ this.textRef.removeEventListener('scroll', this.adjustAnnotationsPosition);
583
+ }
584
+ }, {
585
+ key: "render",
586
+ value: function render() {
587
+ var _this3 = this;
588
+
589
+ var _this$props9 = this.props,
590
+ classes = _this$props9.classes,
591
+ comment = _this$props9.comment,
592
+ customKeys = _this$props9.customKeys,
593
+ disabled = _this$props9.disabled,
594
+ disabledMath = _this$props9.disabledMath,
595
+ keypadMode = _this$props9.keypadMode,
596
+ height = _this$props9.height,
597
+ width = _this$props9.width,
598
+ maxHeight = _this$props9.maxHeight,
599
+ onCommentChange = _this$props9.onCommentChange,
600
+ predefinedAnnotations = _this$props9.predefinedAnnotations,
601
+ text = _this$props9.text;
602
+ var _this$state7 = this.state,
603
+ anchorEl = _this$state7.anchorEl,
604
+ annotation = _this$state7.annotation,
605
+ openedMenu = _this$state7.openedMenu,
606
+ openedEditor = _this$state7.openedEditor,
607
+ selectionDetails = _this$state7.selectionDetails;
608
+ var anchorOffset = anchorEl && (anchorEl.offsetTop ? anchorEl.offsetTop : anchorEl.offsetParent.offsetTop);
609
+ var topOffset = this.textRef && anchorOffset ? anchorOffset - this.textRef.scrollTop - 8 : 0;
610
+ return /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("div", {
611
+ className: classes.wrapper
612
+ }, /*#__PURE__*/_react["default"].createElement("div", {
613
+ className: classes.textContainer,
614
+ style: {
615
+ width: width - 34,
616
+ minHeight: height,
617
+ maxHeight: maxHeight
618
+ },
619
+ ref: function ref(r) {
620
+ return _this3.textRef = r;
621
+ },
622
+ onMouseDown: !disabled ? _annotationUtils.clearSelection : function () {},
623
+ onMouseUp: !disabled ? this.handleSelection : function () {},
624
+ dangerouslySetInnerHTML: {
625
+ __html: text
626
+ }
627
+ }), /*#__PURE__*/_react["default"].createElement("div", {
628
+ className: classes.labelsContainer,
629
+ ref: function ref(r) {
630
+ return _this3.labelsRef = r;
631
+ }
632
+ })), /*#__PURE__*/_react["default"].createElement(_configUi.InputContainer, {
633
+ label: 'Comment',
634
+ className: classes.commentContainer
635
+ }, /*#__PURE__*/_react["default"].createElement(_editableHtml["default"], {
636
+ className: classes.prompt,
637
+ markup: comment || '',
638
+ onChange: onCommentChange,
639
+ width: width && width.toString(),
640
+ disabled: disabled,
641
+ pluginProps: {
642
+ math: {
643
+ disabled: disabledMath,
644
+ customKeys: customKeys,
645
+ keypadMode: keypadMode,
646
+ controlledKeypadMode: false
647
+ },
648
+ video: {
649
+ disabled: true
650
+ },
651
+ audio: {
652
+ disabled: true
653
+ }
654
+ }
655
+ })), /*#__PURE__*/_react["default"].createElement(_annotationMenu["default"], {
656
+ anchorEl: anchorEl,
657
+ open: openedMenu && !disabled,
658
+ annotations: predefinedAnnotations,
659
+ isNewAnnotation: !!selectionDetails,
660
+ onClose: this.handleClose,
661
+ onDelete: this.deleteAnnotation,
662
+ onEdit: this.editAnnotation,
663
+ onWrite: this.addAnnotation,
664
+ onAnnotate: this.handleMenuClick
665
+ }), /*#__PURE__*/_react["default"].createElement(_freeformEditor["default"], {
666
+ anchorEl: this.textRef,
667
+ open: openedEditor && !disabled,
668
+ offset: topOffset,
669
+ value: annotation && annotation.label || '',
670
+ type: annotation && annotation.type,
671
+ onClose: this.handleClose,
672
+ onDelete: this.deleteAnnotation,
673
+ onSave: this.updateAnnotation,
674
+ onTypeChange: this.changeAnnotationType
675
+ }));
676
+ }
677
+ }]);
678
+ return AnnotationEditor;
679
+ }(_react["default"].Component);
680
+
681
+ (0, _defineProperty2["default"])(AnnotationEditor, "propTypes", {
682
+ text: _propTypes["default"].string,
683
+ comment: _propTypes["default"].string,
684
+ annotations: _propTypes["default"].array,
685
+ predefinedAnnotations: _propTypes["default"].array,
686
+ onChange: _propTypes["default"].func.isRequired,
687
+ onCommentChange: _propTypes["default"].func.isRequired,
688
+ width: _propTypes["default"].number,
689
+ height: _propTypes["default"].number,
690
+ maxHeight: _propTypes["default"].string,
691
+ disabled: _propTypes["default"].bool,
692
+ disabledMath: _propTypes["default"].bool,
693
+ customKeys: _propTypes["default"].array,
694
+ keypadMode: _propTypes["default"].string,
695
+ classes: _propTypes["default"].object.isRequired
696
+ });
697
+ ;
698
+
699
+ var _default = (0, _styles.withStyles)(style)(AnnotationEditor);
700
+
701
+ exports["default"] = _default;
702
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbm5vdGF0aW9uL2Fubm90YXRpb24tZWRpdG9yLmpzeCJdLCJuYW1lcyI6WyJzdHlsZSIsInRleHRDb250YWluZXIiLCJwYWRkaW5nIiwiYmFja2dyb3VuZENvbG9yIiwiYm9yZGVyIiwiYm9yZGVyUmFkaXVzIiwib3ZlcmZsb3dZIiwibGluZUhlaWdodCIsIndoaXRlU3BhY2UiLCJvdmVyZmxvd1dyYXAiLCJtYXJnaW4iLCJ1c2VyU2VsZWN0IiwibGFiZWxzQ29udGFpbmVyIiwid2lkdGgiLCJ3cmFwcGVyIiwicG9zaXRpb24iLCJvdmVyZmxvd1giLCJkaXNwbGF5IiwiY29tbWVudENvbnRhaW5lciIsInBhZGRpbmdUb3AiLCJtYXJnaW5Cb3R0b20iLCJtYXJnaW5Ub3AiLCJhbm5vdGF0aW9uIiwiY3Vyc29yIiwiYW5ub3RhdGlvbkxhYmVsIiwidG9wIiwibGVmdCIsImZvbnRTaXplIiwiZm9udFN0eWxlIiwiZm9udFdlaWdodCIsImNvbG9yIiwibGFiZWxIb3ZlciIsInpJbmRleCIsImhpZ2hsaWdodCIsImhvdmVyIiwic2lkZUFubm90YXRpb25Ib3ZlciIsImJvcmRlclJpZ2h0Q29sb3IiLCJzaWRlQW5ub3RhdGlvbiIsIm1hcmdpbkxlZnQiLCJ3b3JkQnJlYWsiLCJyaWdodCIsImNvbnRlbnQiLCJoZWlnaHQiLCJwb2ludGVyRXZlbnRzIiwiYm9yZGVyV2lkdGgiLCJBbm5vdGF0aW9uRWRpdG9yIiwicHJvcHMiLCJ0ZXh0UmVmIiwibGFiZWxzUmVmIiwib2Zmc2V0TGVmdCIsIm9mZnNldFdpZHRoIiwiQXJyYXkiLCJmcm9tIiwiY2hpbGRyZW4iLCJmb3JFYWNoIiwibGFiZWwiLCJzcGFucyIsImRhdGFzZXQiLCJhbm5JZCIsInNwYW5PZmZzZXQiLCJvZmZzZXRUb3AiLCJvZmZzZXRQYXJlbnQiLCJzY3JvbGxUb3AiLCJldmVudCIsImFubm90YXRpb25zIiwiY2xhc3NlcyIsInNlbGVjdGlvbkRldGFpbHMiLCJzdGF0ZSIsInRhcmdldCIsImlkIiwiYW5ub3RhdGlvbklkIiwic2VsZWN0ZWRFbGVtcyIsImxhYmVsRWxlbSIsImFubm90YXRpb25JbmRleCIsImZpbmRJbmRleCIsImlzU2lkZUxhYmVsIiwiaGFzQXR0cmlidXRlIiwiY2xhc3NMaXN0IiwiYWRkIiwic2V0U3RhdGUiLCJhbmNob3JFbCIsIm9wZW5lZE1lbnUiLCJvcGVuZWRFZGl0b3IiLCJlbGVtIiwicmVtb3ZlIiwibGVuZ3RoIiwic2VsZWN0aW9uIiwid2luZG93IiwiZ2V0U2VsZWN0aW9uIiwiZGV0YWlsIiwicmFuZ2VDb3VudCIsInNlbGVjdGVkUmFuZ2UiLCJnZXRSYW5nZUF0Iiwic2VsZWN0ZWRUZXh0IiwidG9TdHJpbmciLCJpc1NlbGVjdGlvbkluc2lkZSIsImNvbnRhaW5zIiwiY29tbW9uQW5jZXN0b3JDb250YWluZXIiLCJpc0NvbGxhcHNlZCIsIm9uQ2hhbmdlIiwicGFyZW50UmVmIiwicmVtb3ZlQ2hpbGQiLCJzcGxpY2UiLCJoYW5kbGVDbG9zZSIsImVsZW1zIiwiZGlzYWJsZWQiLCJ0eXBlIiwiY2xhc3NOYW1lIiwib25jbGljayIsImhhbmRsZUNsaWNrIiwib25tb3VzZW92ZXIiLCJoYW5kbGVIb3ZlciIsIm9ubW91c2VvdXQiLCJoYW5kbGVDYW5jZWxIb3ZlciIsImZpcnN0U3BhbiIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImlubmVySFRNTCIsImZyZWVmb3JtIiwiYXBwZW5kQ2hpbGQiLCJpbnNlcnRCZWZvcmUiLCJmaXJzdENoaWxkIiwic3RhcnQiLCJlbmQiLCJEYXRlIiwiZ2V0VGltZSIsImpvaW4iLCJjcmVhdGVET01Bbm5vdGF0aW9uIiwibmV3QW5ub3RhdGlvbiIsInRleHQiLCJ1cGRhdGVkQW5ub3RhdGlvbiIsIm9sZFR5cGUiLCJvbGRMYWJlbCIsInVwZGF0ZUxhYmVsIiwiY3JlYXRlTmV3QW5ub3RhdGlvbiIsInB1c2giLCJuZXdMYWJlbCIsInNwYW4iLCJkb21TdGFydCIsImRvbUVuZCIsInJhbmdlIiwiY3JlYXRlUmFuZ2UiLCJzZXRTdGFydCIsIm5vZGUiLCJvZmZzZXQiLCJzZXRFbmQiLCJhZGp1c3RBbm5vdGF0aW9uc1Bvc2l0aW9uIiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJjb21tZW50IiwiY3VzdG9tS2V5cyIsImRpc2FibGVkTWF0aCIsImtleXBhZE1vZGUiLCJtYXhIZWlnaHQiLCJvbkNvbW1lbnRDaGFuZ2UiLCJwcmVkZWZpbmVkQW5ub3RhdGlvbnMiLCJhbmNob3JPZmZzZXQiLCJ0b3BPZmZzZXQiLCJtaW5IZWlnaHQiLCJyIiwiY2xlYXJTZWxlY3Rpb24iLCJoYW5kbGVTZWxlY3Rpb24iLCJfX2h0bWwiLCJwcm9tcHQiLCJtYXRoIiwiY29udHJvbGxlZEtleXBhZE1vZGUiLCJ2aWRlbyIsImF1ZGlvIiwiZGVsZXRlQW5ub3RhdGlvbiIsImVkaXRBbm5vdGF0aW9uIiwiYWRkQW5ub3RhdGlvbiIsImhhbmRsZU1lbnVDbGljayIsInVwZGF0ZUFubm90YXRpb24iLCJjaGFuZ2VBbm5vdGF0aW9uVHlwZSIsIlJlYWN0IiwiQ29tcG9uZW50IiwiUHJvcFR5cGVzIiwic3RyaW5nIiwiYXJyYXkiLCJmdW5jIiwiaXNSZXF1aXJlZCIsIm51bWJlciIsImJvb2wiLCJvYmplY3QiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFVQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7OztBQUVBLElBQU1BLEtBQUssR0FBRztBQUNaQyxFQUFBQSxhQUFhLEVBQUU7QUFDYkMsSUFBQUEsT0FBTyxFQUFFLFdBREk7QUFFYkMsSUFBQUEsZUFBZSxFQUFFLHFCQUZKO0FBR2JDLElBQUFBLE1BQU0sRUFBRSxnQkFISztBQUliQyxJQUFBQSxZQUFZLEVBQUUsS0FKRDtBQUtiQyxJQUFBQSxTQUFTLEVBQUUsUUFMRTtBQU1iQyxJQUFBQSxVQUFVLEVBQUUsTUFOQztBQU9iQyxJQUFBQSxVQUFVLEVBQUUsVUFQQztBQVFiQyxJ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dGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgd2l0aFN0eWxlcyB9IGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL3N0eWxlcyc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQge1xuICBjbGVhclNlbGVjdGlvbixcbiAgaXNTaWRlTGFiZWwsXG4gIGdldEFubm90YXRpb25FbGVtZW50cyxcbiAgZ2V0RE9NTm9kZXMsXG4gIGdldExhYmVsRWxlbWVudCxcbiAgZ2V0UmFuZ2VEZXRhaWxzLFxuICByZW1vdmVFbGVtc1dyYXBwaW5nLFxuICB3cmFwUmFuZ2Vcbn0gZnJvbSAnLi9hbm5vdGF0aW9uLXV0aWxzJztcbmltcG9ydCBFZGl0YWJsZUh0bWwgZnJvbSAnQHBpZS1saWIvZWRpdGFibGUtaHRtbCc7XG5pbXBvcnQgeyBJbnB1dENvbnRhaW5lciB9IGZyb20gJ0BwaWUtbGliL2NvbmZpZy11aSc7XG5pbXBvcnQgRnJlZWZvcm1FZGl0b3IgZnJvbSAnLi9mcmVlZm9ybS1lZGl0b3InO1xuaW1wb3J0IEFubm90YXRpb25NZW51IGZyb20gJy4vYW5ub3RhdGlvbi1tZW51JztcblxuY29uc3Qgc3R5bGUgPSB7XG4gIHRleHRDb250YWluZXI6IHtcbiAgICBwYWRkaW5nOiAnMTBweCAxNnB4JyxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDAsIDAsIDAsIDAuMDYpJyxcbiAgICBib3JkZXI6ICcxcHggc29saWQgI2NjYycsXG4gICAgYm9yZGVyUmFkaXVzOiAnNHB4JyxcbiAgICBvdmVyZmxvd1k6ICdzY3JvbGwnLFxuICAgIGxpbmVIZWlnaHQ6ICczNnB4JyxcbiAgICB3aGl0ZVNwYWNlOiAncHJlLXdyYXAnLFxuICAgIG92ZXJmbG93V3JhcDogJ2JyZWFrLXdvcmQnLFxuICAgICcmIHAnOiB7XG4gICAgICBtYXJnaW46IDBcbiAgICB9LFxuICAgICcmIHNwYW5bZGF0YS1sYXRleF0nOiB7XG4gICAgICB1c2VyU2VsZWN0OiAnbm9uZScsXG4gICAgICAnLXdlYmtpdC11c2VyLXNlbGVjdCc6ICdub25lJyxcbiAgICAgICctbW96LXVzZXItc2VsZWN0JzogJ25vbmUnLFxuICAgICAgJy1tcy11c2VyLXNlbGVjdCc6ICdub25lJ1xuICAgIH1cbiAgfSxcbiAgbGFiZWxzQ29udGFpbmVyOiB7XG4gICAgd2lkdGg6ICcyMzBweCdcbiAgfSxcbiAgd3JhcHBlcjoge1xuICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgIG92ZXJmbG93WDogJ2hpZGRlbicsXG4gICAgZGlzcGxheTogJ2ZsZXgnXG4gIH0sXG4gIGNvbW1lbnRDb250YWluZXI6IHtcbiAgICBwYWRkaW5nVG9wOiAxNixcbiAgICBtYXJnaW5Cb3R0b206IDE2LFxuICAgIG1hcmdpblRvcDogMTYsXG4gICAgd2lkdGg6ICcxMDAlJ1xuICB9LFxuICBhbm5vdGF0aW9uOiB7XG4gICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgY3Vyc29yOiAncG9pbnRlcicsXG5cbiAgICAnJi5wb3NpdGl2ZSc6IHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYig1MSwgMjU1LCA1MSwgMC41KScsXG4gICAgfSxcblxuICAgICcmLm5lZ2F0aXZlJzoge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgyNTUsIDEwMiwgMjA0LCAwLjQpJyxcbiAgICB9XG4gIH0sXG4gIGFubm90YXRpb25MYWJlbDoge1xuICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYigyNDIsIDI0MiwgMjQyKScsXG4gICAgcGFkZGluZzogJzJweCcsXG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgdXNlclNlbGVjdDogJ25vbmUnLFxuICAgIHdoaXRlU3BhY2U6ICdub3dyYXAnLFxuICAgIHRvcDogJy0xMHB4JyxcbiAgICBsZWZ0OiAnLTJweCcsXG4gICAgZm9udFNpemU6ICcxMnB4JyxcbiAgICBmb250U3R5bGU6ICdub3JtYWwnLFxuICAgIGZvbnRXZWlnaHQ6ICdub3JtYWwnLFxuICAgIGxpbmVIZWlnaHQ6ICc2cHgnLFxuICAgICctd2Via2l0LXVzZXItc2VsZWN0JzogJ25vbmUnLFxuICAgICctbW96LXVzZXItc2VsZWN0JzogJ25vbmUnLFxuICAgICctbXMtdXNlci1zZWxlY3QnOiAnbm9uZScsXG5cbiAgICAnJi5wb3NpdGl2ZSc6IHtcbiAgICAgIGNvbG9yOiAncmdiKDAsIDEyOCwgMCknLFxuICAgIH0sXG5cbiAgICAnJi5uZWdhdGl2ZSc6IHtcbiAgICAgIGNvbG9yOiAncmdiKDIwNCwgMCwgMTM2KScsXG4gICAgfVxuICB9LFxuICBsYWJlbEhvdmVyOiB7XG4gICAgekluZGV4OiAyMCxcblxuICAgICcmLnBvc2l0aXZlJzoge1xuICAgICAgY29sb3I6ICdyZ2IoMCwgNzcsIDApJyxcbiAgICB9LFxuXG4gICAgJyYubmVnYXRpdmUnOiB7XG4gICAgICBjb2xvcjogJ3JnYigxNTMsIDAsIDEwMiknLFxuICAgIH1cbiAgfSxcbiAgaGlnaGxpZ2h0OiB7XG4gICAgekluZGV4OiAxMFxuICB9LFxuICBob3Zlcjoge1xuICAgIHpJbmRleDogMjAsXG5cbiAgICAnJi5wb3NpdGl2ZSc6IHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYig1MSwgMjU1LCA1MSwgMC43KScsXG4gICAgfSxcblxuICAgICcmLm5lZ2F0aXZlJzoge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgyNTUsIDEwMiwgMjA0LCAwLjU1KScsXG4gICAgfVxuICB9LFxuICBzaWRlQW5ub3RhdGlvbkhvdmVyOiB7XG4gICAgekluZGV4OiAyMCxcblxuICAgICcmLm5lZ2F0aXZlJzoge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiAncmdiKDI1NSwgMTc5LCAyMzApICFpbXBvcnRhbnQnLFxuICAgICAgJyY6YmVmb3JlJzoge1xuICAgICAgICBib3JkZXJSaWdodENvbG9yOiAncmdiKDI1NSwgMTc5LCAyMzApICFpbXBvcnRhbnQnXG4gICAgICB9XG4gICAgfSxcblxuICAgICcmLnBvc2l0aXZlJzoge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiAncmdiKDEyOCwgMjU1LCAxMjgpICFpbXBvcnRhbnQnLFxuICAgICAgJyY6YmVmb3JlJzoge1xuICAgICAgICBib3JkZXJSaWdodENvbG9yOiAncmdiKDE1MywgMjU1LCAxNTMpICFpbXBvcnRhbnQnXG4gICAgICB9XG4gICAgfVxuICB9LFxuICBzaWRlQW5ub3RhdGlvbjoge1xuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIHBhZGRpbmc6ICc0cHgnLFxuICAgIGJvcmRlclJhZGl1czogJzRweCcsXG4gICAgbWFyZ2luTGVmdDogJzhweCcsXG4gICAgd2lkdGg6ICcxODBweCcsXG4gICAgd2hpdGVTcGFjZTogJ3ByZS13cmFwJyxcbiAgICB3b3JkQnJlYWs6ICdicmVhay13b3JkJyxcbiAgICBib3JkZXI6ICcycHggc29saWQgI2ZmZmZmZicsXG4gICAgZm9udFNpemU6ICcxNHB4JyxcbiAgICBmb250U3R5bGU6ICdub3JtYWwnLFxuICAgIGZvbnRXZWlnaHQ6ICdub3JtYWwnLFxuXG4gICAgJyY6YmVmb3JlJzoge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICByaWdodDogJzEwMCUnLFxuICAgICAgdG9wOiAnNXB4JyxcbiAgICAgIGJvcmRlcjogJ3NvbGlkIHRyYW5zcGFyZW50JyxcbiAgICAgIGNvbnRlbnQ6ICdcIlwiJyxcbiAgICAgIGhlaWdodDogMCxcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgYm9yZGVyV2lkdGg6ICc3cHgnLFxuICAgIH0sXG5cbiAgICAnJi5uZWdhdGl2ZSc6IHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYigyNTUsIDIwNCwgMjM4KScsXG4gICAgICAnJjpiZWZvcmUnOiB7XG4gICAgICAgIGJvcmRlclJpZ2h0Q29sb3I6ICdyZ2IoMjU1LCAyMDQsIDIzOCknXG4gICAgICB9XG4gICAgfSxcblxuICAgICcmLnBvc2l0aXZlJzoge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiAncmdiKDE1MywgMjU1LCAxNTMpJyxcbiAgICAgICcmOmJlZm9yZSc6IHtcbiAgICAgICAgYm9yZGVyUmlnaHRDb2xvcjogJ3JnYigxNTMsIDI1NSwgMTUzKSdcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5jbGFzcyBBbm5vdGF0aW9uRWRpdG9yIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICB0ZXh0OiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGNvbW1lbnQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgYW5ub3RhdGlvbnM6IFByb3BUeXBlcy5hcnJheSxcbiAgICBwcmVkZWZpbmVkQW5ub3RhdGlvbnM6IFByb3BUeXBlcy5hcnJheSxcbiAgICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBvbkNvbW1lbnRDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgd2lkdGg6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgaGVpZ2h0OiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIG1heEhlaWdodDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG4gICAgZGlzYWJsZWRNYXRoOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBjdXN0b21LZXlzOiBQcm9wVHlwZXMuYXJyYXksXG4gICAga2V5cGFkTW9kZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gIH07XG5cbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGFuY2hvckVsOiBudWxsLFxuICAgICAgb3BlbmVkTWVudTogZmFsc2UsXG4gICAgICBvcGVuZWRFZGl0b3I6IGZhbHNlLFxuICAgICAgc2VsZWN0ZWRFbGVtczogW10sXG4gICAgICBsYWJlbEVsZW06IG51bGwsXG4gICAgICBzZWxlY3Rpb25EZXRhaWxzOiBudWxsLFxuICAgICAgYW5ub3RhdGlvbjogbnVsbCxcbiAgICAgIGFubm90YXRpb25JbmRleDogbnVsbFxuICAgIH07XG4gIH07XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgY29uc3QgeyBhbm5vdGF0aW9ucywgdGV4dCB9ID0gdGhpcy5wcm9wcztcblxuICAgIGlmICh0ZXh0KSB7XG4gICAgICBhbm5vdGF0aW9ucy5mb3JFYWNoKGFubm90YXRpb24gPT4ge1xuICAgICAgICBjb25zdCBbIGRvbVN0YXJ0LCBkb21FbmQgXSA9IGdldERPTU5vZGVzKGFubm90YXRpb24uc3RhcnQsIGFubm90YXRpb24uZW5kLCB0aGlzLnRleHRSZWYpO1xuXG4gICAgICAgIGlmIChkb21TdGFydCAmJiBkb21FbmQpIHtcbiAgICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG5cbiAgICAgICAgICByYW5nZS5zZXRTdGFydChkb21TdGFydC5ub2RlLCBkb21TdGFydC5vZmZzZXQpO1xuICAgICAgICAgIHJhbmdlLnNldEVuZChkb21FbmQubm9kZSwgZG9tRW5kLm9mZnNldCk7XG5cbiAgICAgICAgICBjb25zdCBzcGFucyA9IHdyYXBSYW5nZShyYW5nZSk7XG5cbiAgICAgICAgICB0aGlzLmNyZWF0ZURPTUFubm90YXRpb24oc3BhbnMsIGFubm90YXRpb24pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50ZXh0UmVmKSB7XG4gICAgICB0aGlzLmFkanVzdEFubm90YXRpb25zUG9zaXRpb24oKTtcbiAgICAgIHRoaXMudGV4dFJlZi5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLmFkanVzdEFubm90YXRpb25zUG9zaXRpb24pO1xuICAgIH1cbiAgfTtcblxuICBhZGp1c3RBbm5vdGF0aW9uc1Bvc2l0aW9uID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLnRleHRSZWYgJiYgdGhpcy5sYWJlbHNSZWYpIHtcbiAgICAgIGNvbnN0IGxlZnQgPSB0aGlzLnRleHRSZWYub2Zmc2V0TGVmdCArIHRoaXMudGV4dFJlZi5vZmZzZXRXaWR0aCArIDg7XG5cbiAgICAgIEFycmF5LmZyb20odGhpcy5sYWJlbHNSZWYuY2hpbGRyZW4pLmZvckVhY2gobGFiZWwgPT4ge1xuICAgICAgICBjb25zdCBzcGFucyA9IGdldEFubm90YXRpb25FbGVtZW50cyhsYWJlbC5kYXRhc2V0LmFubklkKTtcbiAgICAgICAgY29uc3Qgc3Bhbk9mZnNldCA9IHNwYW5zWzBdLm9mZnNldFRvcCA/IHNwYW5zWzBdLm9mZnNldFRvcCA6IHNwYW5zWzBdLm9mZnNldFBhcmVudC5vZmZzZXRUb3A7XG4gICAgICAgIGNvbnN0IHRvcCA9IHNwYW5PZmZzZXQgLSB0aGlzLnRleHRSZWYuc2Nyb2xsVG9wIC0gNjtcblxuICAgICAgICBsYWJlbC5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xuICAgICAgICBsYWJlbC5zdHlsZS5sZWZ0ID0gYCR7bGVmdH1weGA7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgaGFuZGxlQ2xpY2sgPSBldmVudCA9PiB7XG4gICAgY29uc3QgeyBhbm5vdGF0aW9ucywgY2xhc3NlcyB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7IHNlbGVjdGlvbkRldGFpbHMgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICBpZiAoc2VsZWN0aW9uRGV0YWlscykge1xuICAgICAgLy8gbmV3IHNlbGVjdGlvbiB3YXMgbWFkZSBpbnNpZGUgYW5vdGhlciBhbm5vdGF0aW9uIGFuZCBzaG91bGQgbm90IHVwZGF0ZSB0aGF0IGFubm90YXRpb25cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGlkLCBhbm5JZCB9ID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQ7XG4gICAgY29uc3QgYW5ub3RhdGlvbklkID0gaWQgfHwgYW5uSWQ7XG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtcyA9IGdldEFubm90YXRpb25FbGVtZW50cyhhbm5vdGF0aW9uSWQpO1xuICAgIGNvbnN0IGxhYmVsRWxlbSA9IGdldExhYmVsRWxlbWVudChhbm5vdGF0aW9uSWQpXG4gICAgY29uc3QgYW5ub3RhdGlvbkluZGV4ID0gYW5ub3RhdGlvbnMuZmluZEluZGV4KGFubm90YXRpb24gPT4gYW5ub3RhdGlvbi5pZCA9PT0gYW5ub3RhdGlvbklkKTtcbiAgICBjb25zdCBpc1NpZGVMYWJlbCA9IGxhYmVsRWxlbS5oYXNBdHRyaWJ1dGUoJ2RhdGEtZnJlZWZvcm0nKTtcblxuICAgIGlmIChpc1NpZGVMYWJlbCkge1xuICAgICAgbGFiZWxFbGVtLmNsYXNzTGlzdC5hZGQoY2xhc3Nlcy5oaWdobGlnaHQpO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgYW5jaG9yRWw6IHNlbGVjdGVkRWxlbXNbMF0sXG4gICAgICBvcGVuZWRNZW51OiAhIWlkIHx8ICEhYW5uSWQgJiYgIWlzU2lkZUxhYmVsLCAvLyB0cnVlIGlmIHRoZSBhbm5vdGF0aW9uIG9yIHRoZSBsYWJlbCB3YXMgY2xpY2tlZFxuICAgICAgb3BlbmVkRWRpdG9yOiAhIWFubklkICYmIGlzU2lkZUxhYmVsLCAvLyB0cnVlIGlmIHRoZSBzaWRlIGxhYmVsIHdhcyBjbGlja2VkXG4gICAgICBzZWxlY3RlZEVsZW1zLFxuICAgICAgbGFiZWxFbGVtLFxuICAgICAgYW5ub3RhdGlvbkluZGV4LFxuICAgICAgYW5ub3RhdGlvbjogYW5ub3RhdGlvbnNbYW5ub3RhdGlvbkluZGV4XSxcbiAgICAgIHNlbGVjdGlvbkRldGFpbHM6IG51bGxcbiAgICB9KTtcbiAgfTtcblxuICBoYW5kbGVIb3ZlciA9IGV2ZW50ID0+IHtcbiAgICBjb25zdCB7IGNsYXNzZXMgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgeyBpZCwgYW5uSWQgfSA9IGV2ZW50LnRhcmdldC5kYXRhc2V0O1xuICAgIGNvbnN0IGFubm90YXRpb25JZCA9IGlkIHx8IGFubklkO1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbXMgPSBnZXRBbm5vdGF0aW9uRWxlbWVudHMoYW5ub3RhdGlvbklkKTtcbiAgICBjb25zdCBsYWJlbEVsZW0gPSBnZXRMYWJlbEVsZW1lbnQoYW5ub3RhdGlvbklkKTtcbiAgICBjb25zdCBpc1NpZGVMYWJlbCA9IGxhYmVsRWxlbS5oYXNBdHRyaWJ1dGUoJ2RhdGEtZnJlZWZvcm0nKTtcblxuICAgIHNlbGVjdGVkRWxlbXMuZm9yRWFjaChlbGVtID0+IGVsZW0uY2xhc3NMaXN0LmFkZChjbGFzc2VzLmhvdmVyKSk7XG4gICAgbGFiZWxFbGVtLmNsYXNzTGlzdC5hZGQoaXNTaWRlTGFiZWwgPyBjbGFzc2VzLnNpZGVBbm5vdGF0aW9uSG92ZXIgOiBjbGFzc2VzLmxhYmVsSG92ZXIpO1xuICB9O1xuXG4gIGhhbmRsZUNhbmNlbEhvdmVyID0gZXZlbnQgPT4ge1xuICAgIGNvbnN0IHsgY2xhc3NlcyB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7IGlkLCBhbm5JZCB9ID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQ7XG4gICAgY29uc3QgYW5ub3RhdGlvbklkID0gaWQgfHwgYW5uSWQ7XG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtcyA9IGdldEFubm90YXRpb25FbGVtZW50cyhhbm5vdGF0aW9uSWQpO1xuICAgIGNvbnN0IGxhYmVsRWxlbSA9IGdldExhYmVsRWxlbWVudChhbm5vdGF0aW9uSWQpO1xuICAgIGNvbnN0IGlzU2lkZUxhYmVsID0gbGFiZWxFbGVtLmhhc0F0dHJpYnV0ZSgnZGF0YS1mcmVlZm9ybScpO1xuXG4gICAgc2VsZWN0ZWRFbGVtcy5mb3JFYWNoKGVsZW0gPT4gZWxlbS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzZXMuaG92ZXIpKTtcbiAgICBsYWJlbEVsZW0uY2xhc3NMaXN0LnJlbW92ZShpc1NpZGVMYWJlbCA/IGNsYXNzZXMuc2lkZUFubm90YXRpb25Ib3ZlciA6IGNsYXNzZXMubGFiZWxIb3Zlcik7XG4gIH07XG5cbiAgaGFuZGxlQ2xvc2UgPSBldmVudCA9PiB7XG4gICAgY29uc3QgeyBjbGFzc2VzIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHsgc2VsZWN0ZWRFbGVtcywgbGFiZWxFbGVtIH0gPSB0aGlzLnN0YXRlO1xuXG4gICAgaWYgKHNlbGVjdGVkRWxlbXMubGVuZ3RoICYmICFzZWxlY3RlZEVsZW1zWzBdLmhhc0F0dHJpYnV0ZSgnZGF0YS1pZCcpKSB7XG4gICAgICByZW1vdmVFbGVtc1dyYXBwaW5nKHNlbGVjdGVkRWxlbXMsIHRoaXMudGV4dFJlZik7XG4gICAgfVxuXG4gICAgaWYgKGxhYmVsRWxlbSkge1xuICAgICAgbGFiZWxFbGVtLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3Nlcy5oaWdobGlnaHQpO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgYW5jaG9yRWw6IG51bGwsXG4gICAgICBvcGVuZWRNZW51OiBmYWxzZSxcbiAgICAgIG9wZW5lZEVkaXRvcjogZmFsc2UsXG4gICAgICBzZWxlY3RlZEVsZW1zOiBbXSxcbiAgICAgIGxhYmVsRWxlbTogbnVsbCxcbiAgICAgIHNlbGVjdGlvbkRldGFpbHM6IG51bGwsXG4gICAgICBhbm5vdGF0aW9uSW5kZXg6IG51bGwsXG4gICAgICBhbm5vdGF0aW9uOiBudWxsXG4gICAgfSk7XG5cbiAgICBjbGVhclNlbGVjdGlvbigpO1xuICB9O1xuXG4gIGhhbmRsZVNlbGVjdGlvbiA9IGV2ZW50ID0+IHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAvLyBwcmV2ZW50IHVud2FudGVkIHNlbGVjdGlvbnNcbiAgICBpZiAoZXZlbnQuZGV0YWlsID4gMikge1xuICAgICAgY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRSYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0ZWRSYW5nZS50b1N0cmluZygpO1xuICAgICAgY29uc3QgaXNTZWxlY3Rpb25JbnNpZGUgPSB0aGlzLnRleHRSZWYuY29udGFpbnMoc2VsZWN0ZWRSYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcik7XG5cbiAgICAgIGlmICghc2VsZWN0aW9uLmlzQ29sbGFwc2VkICYmIHNlbGVjdGVkVGV4dCAhPT0gJycgJiYgaXNTZWxlY3Rpb25JbnNpZGUpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uRGV0YWlscyA9IGdldFJhbmdlRGV0YWlscyhzZWxlY3RlZFJhbmdlLCB0aGlzLnRleHRSZWYpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1zID0gd3JhcFJhbmdlKHNlbGVjdGVkUmFuZ2UpO1xuXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGFuY2hvckVsOiBzZWxlY3RlZEVsZW1zWzBdLFxuICAgICAgICAgIG9wZW5lZE1lbnU6IHRydWUsXG4gICAgICAgICAgc2VsZWN0ZWRFbGVtcyxcbiAgICAgICAgICBzZWxlY3Rpb25EZXRhaWxzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBkZWxldGVBbm5vdGF0aW9uID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgYW5ub3RhdGlvbnMsIG9uQ2hhbmdlIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHsgc2VsZWN0ZWRFbGVtcywgbGFiZWxFbGVtLCBhbm5vdGF0aW9uSW5kZXgsIGFubm90YXRpb24gfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgcGFyZW50UmVmID0gaXNTaWRlTGFiZWwoYW5ub3RhdGlvbi5sYWJlbCkgPyB0aGlzLmxhYmVsc1JlZiA6IHNlbGVjdGVkRWxlbXNbMF07XG5cbiAgICBwYXJlbnRSZWYucmVtb3ZlQ2hpbGQobGFiZWxFbGVtKTtcbiAgICByZW1vdmVFbGVtc1dyYXBwaW5nKHNlbGVjdGVkRWxlbXMsIHRoaXMudGV4dFJlZik7XG4gICAgYW5ub3RhdGlvbnMuc3BsaWNlKGFubm90YXRpb25JbmRleCwgMSk7XG5cbiAgICBvbkNoYW5nZShhbm5vdGF0aW9ucyk7XG4gICAgdGhpcy5oYW5kbGVDbG9zZSgpO1xuICB9O1xuXG4gIGNyZWF0ZURPTUFubm90YXRpb24gPSAoZWxlbXMsIGFubm90YXRpb24pID0+IHtcbiAgICBjb25zdCB7IGNsYXNzZXMsIGRpc2FibGVkIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHsgaWQsIGxhYmVsLCB0eXBlIH0gPSBhbm5vdGF0aW9uO1xuXG4gICAgKGVsZW1zIHx8IFtdKS5mb3JFYWNoKGVsZW0gPT4ge1xuICAgICAgZWxlbS5kYXRhc2V0LmlkID0gaWQ7XG4gICAgICBlbGVtLmNsYXNzTmFtZSA9IGNsYXNzTmFtZXMoY2xhc3Nlcy5hbm5vdGF0aW9uLCB0eXBlKTtcbiAgICAgIGVsZW0ub25jbGljayA9ICFkaXNhYmxlZCAmJiB0aGlzLmhhbmRsZUNsaWNrO1xuICAgICAgZWxlbS5vbm1vdXNlb3ZlciA9IHRoaXMuaGFuZGxlSG92ZXI7XG4gICAgICBlbGVtLm9ubW91c2VvdXQgPSB0aGlzLmhhbmRsZUNhbmNlbEhvdmVyO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZmlyc3RTcGFuID0gZWxlbXMgJiYgZWxlbXNbMF0gfHwge307XG4gICAgY29uc3QgbGFiZWxFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnU1BBTicpO1xuXG4gICAgbGFiZWxFbGVtLmRhdGFzZXQuYW5uSWQgPSBpZDtcbiAgICBsYWJlbEVsZW0uaW5uZXJIVE1MID0gbGFiZWw7XG4gICAgbGFiZWxFbGVtLm9uY2xpY2sgPSAhZGlzYWJsZWQgJiYgdGhpcy5oYW5kbGVDbGljaztcbiAgICBsYWJlbEVsZW0ub25tb3VzZW92ZXIgPSB0aGlzLmhhbmRsZUhvdmVyO1xuICAgIGxhYmVsRWxlbS5vbm1vdXNlb3V0ID0gdGhpcy5oYW5kbGVDYW5jZWxIb3ZlcjtcblxuICAgIGlmIChpc1NpZGVMYWJlbChsYWJlbCkpIHtcbiAgICAgIGNvbnN0IHNwYW5PZmZzZXQgPSBmaXJzdFNwYW4ub2Zmc2V0VG9wID8gZmlyc3RTcGFuLm9mZnNldFRvcCA6IGZpcnN0U3Bhbi5vZmZzZXRQYXJlbnQub2Zmc2V0VG9wO1xuICAgICAgY29uc3QgdG9wID0gc3Bhbk9mZnNldCAtIHRoaXMudGV4dFJlZi5zY3JvbGxUb3A7XG4gICAgICBjb25zdCBsZWZ0ID0gdGhpcy50ZXh0UmVmLm9mZnNldExlZnQgKyB0aGlzLnRleHRSZWYub2Zmc2V0V2lkdGggKyA4O1xuXG4gICAgICBsYWJlbEVsZW0uZGF0YXNldC5mcmVlZm9ybSA9IHRydWU7XG4gICAgICBsYWJlbEVsZW0uY2xhc3NOYW1lID0gY2xhc3NOYW1lcyhjbGFzc2VzLnNpZGVBbm5vdGF0aW9uLCB0eXBlKTtcbiAgICAgIGxhYmVsRWxlbS5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xuICAgICAgbGFiZWxFbGVtLnN0eWxlLmxlZnQgPSBgJHtsZWZ0fXB4YDtcblxuICAgICAgdGhpcy5sYWJlbHNSZWYuYXBwZW5kQ2hpbGQobGFiZWxFbGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGFiZWxFbGVtLmNsYXNzTmFtZSA9IGNsYXNzTmFtZXMoY2xhc3Nlcy5hbm5vdGF0aW9uTGFiZWwsIHR5cGUpO1xuICAgICAgZmlyc3RTcGFuLmluc2VydEJlZm9yZShsYWJlbEVsZW0sIGZpcnN0U3Bhbi5maXJzdENoaWxkKTtcbiAgICB9XG4gIH07XG5cbiAgY3JlYXRlTmV3QW5ub3RhdGlvbiA9IChsYWJlbCwgdHlwZSkgPT4ge1xuICAgIGNvbnN0IHsgc2VsZWN0ZWRFbGVtcywgc2VsZWN0aW9uRGV0YWlscyB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCBhbm5vdGF0aW9uID0ge1xuICAgICAgaWQ6IFtzZWxlY3Rpb25EZXRhaWxzLnN0YXJ0LCBzZWxlY3Rpb25EZXRhaWxzLmVuZCwgbmV3IERhdGUoKS5nZXRUaW1lKCldLmpvaW4oJy0nKSxcbiAgICAgIGxhYmVsLFxuICAgICAgdHlwZSxcbiAgICAgIC4uLnNlbGVjdGlvbkRldGFpbHNcbiAgICB9O1xuXG4gICAgdGhpcy5jcmVhdGVET01Bbm5vdGF0aW9uKHNlbGVjdGVkRWxlbXMsIGFubm90YXRpb24pO1xuXG4gICAgcmV0dXJuIGFubm90YXRpb247XG4gIH07XG5cbiAgaGFuZGxlTWVudUNsaWNrID0gbmV3QW5ub3RhdGlvbiA9PiB7XG4gICAgY29uc3QgeyBhbm5vdGF0aW9ucywgb25DaGFuZ2UgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgeyBhbm5vdGF0aW9uLCBhbm5vdGF0aW9uSW5kZXggfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgeyB0eXBlLCB0ZXh0OiBsYWJlbCB9ID0gbmV3QW5ub3RhdGlvbjtcblxuICAgIGlmIChhbm5vdGF0aW9uKSB7XG4gICAgICBjb25zdCB1cGRhdGVkQW5ub3RhdGlvbiA9IHsgLi4uYW5ub3RhdGlvbiwgbGFiZWwsIHR5cGUgfTtcbiAgICAgIGNvbnN0IHsgdHlwZTogb2xkVHlwZSwgbGFiZWw6IG9sZExhYmVsIH0gPSBhbm5vdGF0aW9uO1xuXG4gICAgICB0aGlzLnVwZGF0ZUxhYmVsKG9sZExhYmVsLCB1cGRhdGVkQW5ub3RhdGlvbiwgdHlwZSAhPT0gb2xkVHlwZSAmJiBvbGRUeXBlKTtcbiAgICAgIGFubm90YXRpb25zLnNwbGljZShhbm5vdGF0aW9uSW5kZXgsIDEsIHVwZGF0ZWRBbm5vdGF0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbmV3QW5ub3RhdGlvbiA9IHRoaXMuY3JlYXRlTmV3QW5ub3RhdGlvbihsYWJlbCwgdHlwZSk7XG5cbiAgICAgIGFubm90YXRpb25zLnB1c2gobmV3QW5ub3RhdGlvbik7XG4gICAgfVxuXG4gICAgb25DaGFuZ2UoYW5ub3RhdGlvbnMpO1xuICAgIHRoaXMuaGFuZGxlQ2xvc2UoKTtcbiAgfTtcblxuICBlZGl0QW5ub3RhdGlvbiA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIG9wZW5lZE1lbnU6IGZhbHNlLFxuICAgICAgb3BlbmVkRWRpdG9yOiB0cnVlXG4gICAgfSk7XG4gIH07XG5cbiAgYWRkQW5ub3RhdGlvbiA9IHR5cGUgPT4ge1xuICAgIGNvbnN0IHsgYW5ub3RhdGlvbnMsIG9uQ2hhbmdlIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IGFubm90YXRpb24gPSB0aGlzLmNyZWF0ZU5ld0Fubm90YXRpb24oJycsIHR5cGUpO1xuICAgIGNvbnN0IGxhYmVsRWxlbSA9IGdldExhYmVsRWxlbWVudChhbm5vdGF0aW9uLmlkKTtcblxuICAgIGFubm90YXRpb25zLnB1c2goYW5ub3RhdGlvbik7XG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIG9wZW5lZE1lbnU6IGZhbHNlLFxuICAgICAgb3BlbmVkRWRpdG9yOiB0cnVlLFxuICAgICAgYW5ub3RhdGlvbkluZGV4OiBhbm5vdGF0aW9ucy5sZW5ndGggLSAxLFxuICAgICAgYW5ub3RhdGlvbixcbiAgICAgIGxhYmVsRWxlbVxuICAgIH0pO1xuXG4gICAgb25DaGFuZ2UoYW5ub3RhdGlvbnMpO1xuICB9O1xuXG4gIHVwZGF0ZUxhYmVsID0gKG9sZExhYmVsLCBhbm5vdGF0aW9uLCBvbGRUeXBlKSA9PiB7XG4gICAgY29uc3QgeyBzZWxlY3RlZEVsZW1zLCBsYWJlbEVsZW0gfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgeyBsYWJlbCwgdHlwZSB9ID0gYW5ub3RhdGlvbjtcblxuICAgIGlmIChpc1NpZGVMYWJlbChsYWJlbCkgJiYgaXNTaWRlTGFiZWwob2xkTGFiZWwpIHx8ICFpc1NpZGVMYWJlbChsYWJlbCkgJiYgIWlzU2lkZUxhYmVsKG9sZExhYmVsKSkge1xuICAgICAgbGFiZWxFbGVtLmlubmVySFRNTCA9IGxhYmVsO1xuXG4gICAgICBpZiAob2xkVHlwZSkge1xuICAgICAgICBsYWJlbEVsZW0uY2xhc3NMaXN0LnJlbW92ZShvbGRUeXBlKTtcbiAgICAgICAgbGFiZWxFbGVtLmNsYXNzTGlzdC5hZGQodHlwZSk7XG5cbiAgICAgICAgc2VsZWN0ZWRFbGVtcy5mb3JFYWNoKGVsZW0gPT4ge1xuICAgICAgICAgIGVsZW0uY2xhc3NMaXN0LnJlbW92ZShvbGRUeXBlKTtcbiAgICAgICAgICBlbGVtLmNsYXNzTGlzdC5hZGQodHlwZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNTaWRlTGFiZWwobGFiZWwpICYmICFpc1NpZGVMYWJlbChvbGRMYWJlbCkpIHtcbiAgICAgIHNlbGVjdGVkRWxlbXNbMF0ucmVtb3ZlQ2hpbGQobGFiZWxFbGVtKTtcbiAgICAgIHRoaXMuY3JlYXRlRE9NQW5ub3RhdGlvbihzZWxlY3RlZEVsZW1zLCBhbm5vdGF0aW9uKTtcbiAgICB9IGVsc2UgaWYgKCFpc1NpZGVMYWJlbChsYWJlbCkgJiYgaXNTaWRlTGFiZWwob2xkTGFiZWwpKSB7XG4gICAgICB0aGlzLmxhYmVsc1JlZi5yZW1vdmVDaGlsZChsYWJlbEVsZW0pO1xuICAgICAgdGhpcy5jcmVhdGVET01Bbm5vdGF0aW9uKHNlbGVjdGVkRWxlbXMsIGFubm90YXRpb24pO1xuICAgIH1cbiAgfTtcblxuICBjaGFuZ2VBbm5vdGF0aW9uVHlwZSA9IChuZXdMYWJlbCkgPT4ge1xuICAgIGNvbnN0IHsgYW5ub3RhdGlvbnMsIG9uQ2hhbmdlIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHsgYW5ub3RhdGlvbkluZGV4LCBzZWxlY3RlZEVsZW1zIH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IHsgdHlwZTogb2xkVHlwZSwgbGFiZWw6IG9sZExhYmVsIH0gPSBhbm5vdGF0aW9uc1thbm5vdGF0aW9uSW5kZXhdO1xuICAgIGNvbnN0IHR5cGUgPSBvbGRUeXBlID09PSAncG9zaXRpdmUnID8gJ25lZ2F0aXZlJyA6ICdwb3NpdGl2ZSc7XG4gICAgY29uc3QgdXBkYXRlZEFubm90YXRpb24gPSB7IC4uLmFubm90YXRpb25zW2Fubm90YXRpb25JbmRleF0sIHR5cGUsIGxhYmVsOiBuZXdMYWJlbCB9O1xuXG4gICAgc2VsZWN0ZWRFbGVtcy5mb3JFYWNoKHNwYW4gPT4ge1xuICAgICAgc3Bhbi5jbGFzc0xpc3QucmVtb3ZlKG9sZFR5cGUpO1xuICAgICAgc3Bhbi5jbGFzc0xpc3QuYWRkKHR5cGUpO1xuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVMYWJlbChvbGRMYWJlbCwgdXBkYXRlZEFubm90YXRpb24sIG9sZFR5cGUpO1xuICAgIGFubm90YXRpb25zLnNwbGljZShhbm5vdGF0aW9uSW5kZXgsIDEsIHVwZGF0ZWRBbm5vdGF0aW9uKTtcblxuICAgIG9uQ2hhbmdlKGFubm90YXRpb25zKTtcbiAgICB0aGlzLmhhbmRsZUNsb3NlKCk7XG4gIH07XG5cbiAgdXBkYXRlQW5ub3RhdGlvbiA9IChvbGRMYWJlbCwgbmV3TGFiZWwpID0+IHtcbiAgICBjb25zdCB7IGFubm90YXRpb25zLCBvbkNoYW5nZSB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7IGFubm90YXRpb25JbmRleCB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCB1cGRhdGVkQW5ub3RhdGlvbiA9IHsgLi4uYW5ub3RhdGlvbnNbYW5ub3RhdGlvbkluZGV4XSwgbGFiZWw6IG5ld0xhYmVsIH07XG5cbiAgICB0aGlzLnVwZGF0ZUxhYmVsKG9sZExhYmVsLCB1cGRhdGVkQW5ub3RhdGlvbik7XG4gICAgYW5ub3RhdGlvbnMuc3BsaWNlKGFubm90YXRpb25JbmRleCwgMSwgdXBkYXRlZEFubm90YXRpb24pO1xuXG4gICAgb25DaGFuZ2UoYW5ub3RhdGlvbnMpO1xuICB9O1xuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMudGV4dFJlZi5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLmFkanVzdEFubm90YXRpb25zUG9zaXRpb24pO1xuICB9O1xuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBjbGFzc2VzLFxuICAgICAgY29tbWVudCxcbiAgICAgIGN1c3RvbUtleXMsXG4gICAgICBkaXNhYmxlZCxcbiAgICAgIGRpc2FibGVkTWF0aCxcbiAgICAgIGtleXBhZE1vZGUsXG4gICAgICBoZWlnaHQsXG4gICAgICB3aWR0aCxcbiAgICAgIG1heEhlaWdodCxcbiAgICAgIG9uQ29tbWVudENoYW5nZSxcbiAgICAgIHByZWRlZmluZWRBbm5vdGF0aW9ucyxcbiAgICAgIHRleHRcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7IGFuY2hvckVsLCBhbm5vdGF0aW9uLCBvcGVuZWRNZW51LCBvcGVuZWRFZGl0b3IsIHNlbGVjdGlvbkRldGFpbHMgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgYW5jaG9yT2Zmc2V0ID0gYW5jaG9yRWwgJiYgKGFuY2hvckVsLm9mZnNldFRvcCA/IGFuY2hvckVsLm9mZnNldFRvcCA6IGFuY2hvckVsLm9mZnNldFBhcmVudC5vZmZzZXRUb3ApO1xuICAgIGNvbnN0IHRvcE9mZnNldCA9IHRoaXMudGV4dFJlZiAmJiBhbmNob3JPZmZzZXQgPyAoYW5jaG9yT2Zmc2V0IC0gdGhpcy50ZXh0UmVmLnNjcm9sbFRvcCAtIDgpIDogMDtcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Y2xhc3Nlcy53cmFwcGVyfT5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXMudGV4dENvbnRhaW5lcn1cbiAgICAgICAgICAgIHN0eWxlPXt7IHdpZHRoOiB3aWR0aCAtIDM0LCBtaW5IZWlnaHQ6IGhlaWdodCwgbWF4SGVpZ2h0OiBtYXhIZWlnaHQgfX1cbiAgICAgICAgICAgIHJlZj17ciA9PiAodGhpcy50ZXh0UmVmID0gcil9XG4gICAgICAgICAgICBvbk1vdXNlRG93bj17IWRpc2FibGVkID8gY2xlYXJTZWxlY3Rpb24gOiAoKSA9PiB7fX1cbiAgICAgICAgICAgIG9uTW91c2VVcD17IWRpc2FibGVkID8gdGhpcy5oYW5kbGVTZWxlY3Rpb24gOiAoKSA9PiB7fX1cbiAgICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7IF9faHRtbDogdGV4dCB9fVxuICAgICAgICAgIC8+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc2VzLmxhYmVsc0NvbnRhaW5lcn1cbiAgICAgICAgICAgIHJlZj17ciA9PiAodGhpcy5sYWJlbHNSZWYgPSByKX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8SW5wdXRDb250YWluZXIgbGFiZWw9eydDb21tZW50J30gY2xhc3NOYW1lPXtjbGFzc2VzLmNvbW1lbnRDb250YWluZXJ9PlxuICAgICAgICAgIDxFZGl0YWJsZUh0bWxcbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlcy5wcm9tcHR9XG4gICAgICAgICAgICBtYXJrdXA9e2NvbW1lbnR8fCAnJ31cbiAgICAgICAgICAgIG9uQ2hhbmdlPXtvbkNvbW1lbnRDaGFuZ2V9XG4gICAgICAgICAgICB3aWR0aD17d2lkdGggJiYgd2lkdGgudG9TdHJpbmcoKX1cbiAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICAgIHBsdWdpblByb3BzPXt7XG4gICAgICAgICAgICAgIG1hdGg6IHtcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWRNYXRoLFxuICAgICAgICAgICAgICAgIGN1c3RvbUtleXM6IGN1c3RvbUtleXMsXG4gICAgICAgICAgICAgICAga2V5cGFkTW9kZToga2V5cGFkTW9kZSxcbiAgICAgICAgICAgICAgICBjb250cm9sbGVkS2V5cGFkTW9kZTogZmFsc2VcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdmlkZW86IHtcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogdHJ1ZVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBhdWRpbzoge1xuICAgICAgICAgICAgICAgIGRpc2FibGVkOiB0cnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH19XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9JbnB1dENvbnRhaW5lcj5cblxuICAgICAgICA8QW5ub3RhdGlvbk1lbnVcbiAgICAgICAgICBhbmNob3JFbD17YW5jaG9yRWx9XG4gICAgICAgICAgb3Blbj17b3BlbmVkTWVudSAmJiAhZGlzYWJsZWR9XG4gICAgICAgICAgYW5ub3RhdGlvbnM9e3ByZWRlZmluZWRBbm5vdGF0aW9uc31cbiAgICAgICAgICBpc05ld0Fubm90YXRpb249eyEhc2VsZWN0aW9uRGV0YWlsc31cbiAgICAgICAgICBvbkNsb3NlPXt0aGlzLmhhbmRsZUNsb3NlfVxuICAgICAgICAgIG9uRGVsZXRlPXt0aGlzLmRlbGV0ZUFubm90YXRpb259XG4gICAgICAgICAgb25FZGl0PXt0aGlzLmVkaXRBbm5vdGF0aW9ufVxuICAgICAgICAgIG9uV3JpdGU9e3RoaXMuYWRkQW5ub3RhdGlvbn1cbiAgICAgICAgICBvbkFubm90YXRlPXt0aGlzLmhhbmRsZU1lbnVDbGlja31cbiAgICAgICAgLz5cblxuICAgICAgICA8RnJlZWZvcm1FZGl0b3JcbiAgICAgICAgICBhbmNob3JFbD17dGhpcy50ZXh0UmVmfVxuICAgICAgICAgIG9wZW49e29wZW5lZEVkaXRvciAmJiAhZGlzYWJsZWR9XG4gICAgICAgICAgb2Zmc2V0PXt0b3BPZmZzZXR9XG4gICAgICAgICAgdmFsdWU9e2Fubm90YXRpb24gJiYgYW5ub3RhdGlvbi5sYWJlbCB8fCAnJ31cbiAgICAgICAgICB0eXBlPXthbm5vdGF0aW9uICYmIGFubm90YXRpb24udHlwZX1cbiAgICAgICAgICBvbkNsb3NlPXt0aGlzLmhhbmRsZUNsb3NlfVxuICAgICAgICAgIG9uRGVsZXRlPXt0aGlzLmRlbGV0ZUFubm90YXRpb259XG4gICAgICAgICAgb25TYXZlPXt0aGlzLnVwZGF0ZUFubm90YXRpb259XG4gICAgICAgICAgb25UeXBlQ2hhbmdlPXt0aGlzLmNoYW5nZUFubm90YXRpb25UeXBlfVxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZSkoQW5ub3RhdGlvbkVkaXRvcik7XG4iXX0=