@pie-element/drawing-response 10.1.0 → 10.2.0-mui-update.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/configure/CHANGELOG.md +66 -0
  3. package/configure/lib/__tests__/image-container.test.js +176 -0
  4. package/configure/lib/__tests__/index.test.js +53 -0
  5. package/configure/lib/__tests__/root.test.js +84 -0
  6. package/configure/lib/button.js +24 -48
  7. package/configure/lib/button.js.map +1 -1
  8. package/configure/lib/defaults.js +3 -4
  9. package/configure/lib/defaults.js.map +1 -1
  10. package/configure/lib/image-container.js +239 -328
  11. package/configure/lib/image-container.js.map +1 -1
  12. package/configure/lib/index.js +116 -183
  13. package/configure/lib/index.js.map +1 -1
  14. package/configure/lib/root.js +195 -261
  15. package/configure/lib/root.js.map +1 -1
  16. package/configure/package.json +9 -7
  17. package/configure/src/__tests__/index.test.js +10 -4
  18. package/configure/src/button.jsx +14 -24
  19. package/configure/src/image-container.jsx +73 -77
  20. package/configure/src/index.js +12 -2
  21. package/configure/src/root.jsx +24 -25
  22. package/controller/CHANGELOG.md +24 -0
  23. package/controller/lib/__tests__/index.test.js +177 -0
  24. package/controller/lib/defaults.js +3 -4
  25. package/controller/lib/defaults.js.map +1 -1
  26. package/controller/lib/index.js +40 -66
  27. package/controller/lib/index.js.map +1 -1
  28. package/controller/package.json +1 -1
  29. package/docs/demo/pie.manifest.json +11 -0
  30. package/lib/__tests__/drawing-index-test.js +36 -0
  31. package/lib/drawing-response/__tests__/container.test.js +66 -0
  32. package/lib/drawing-response/__tests__/drawable-helper.test.js +23 -0
  33. package/lib/drawing-response/__tests__/drawing-main.test.js +684 -0
  34. package/lib/drawing-response/__tests__/factory.test.js +15 -0
  35. package/lib/drawing-response/button.js +36 -61
  36. package/lib/drawing-response/button.js.map +1 -1
  37. package/lib/drawing-response/constants.js +3 -4
  38. package/lib/drawing-response/constants.js.map +1 -1
  39. package/lib/drawing-response/container.js +271 -352
  40. package/lib/drawing-response/container.js.map +1 -1
  41. package/lib/drawing-response/drawable-circle.js +66 -105
  42. package/lib/drawing-response/drawable-circle.js.map +1 -1
  43. package/lib/drawing-response/drawable-eraser.js +51 -87
  44. package/lib/drawing-response/drawable-eraser.js.map +1 -1
  45. package/lib/drawing-response/drawable-free-path.js +57 -98
  46. package/lib/drawing-response/drawable-free-path.js.map +1 -1
  47. package/lib/drawing-response/drawable-helper.js +17 -29
  48. package/lib/drawing-response/drawable-helper.js.map +1 -1
  49. package/lib/drawing-response/drawable-image.js +31 -50
  50. package/lib/drawing-response/drawable-image.js.map +1 -1
  51. package/lib/drawing-response/drawable-line.js +61 -100
  52. package/lib/drawing-response/drawable-line.js.map +1 -1
  53. package/lib/drawing-response/drawable-main.js +274 -346
  54. package/lib/drawing-response/drawable-main.js.map +1 -1
  55. package/lib/drawing-response/drawable-palette.js +124 -167
  56. package/lib/drawing-response/drawable-palette.js.map +1 -1
  57. package/lib/drawing-response/drawable-rectangle.js +66 -105
  58. package/lib/drawing-response/drawable-rectangle.js.map +1 -1
  59. package/lib/drawing-response/drawable-text.js +202 -314
  60. package/lib/drawing-response/drawable-text.js.map +1 -1
  61. package/lib/drawing-response/drawable-transformer.js +37 -80
  62. package/lib/drawing-response/drawable-transformer.js.map +1 -1
  63. package/lib/drawing-response/factory.js +7 -20
  64. package/lib/drawing-response/factory.js.map +1 -1
  65. package/lib/drawing-response/icon.js +9 -25
  66. package/lib/drawing-response/icon.js.map +1 -1
  67. package/lib/drawing-response/index.js +75 -117
  68. package/lib/drawing-response/index.js.map +1 -1
  69. package/lib/index.js +52 -103
  70. package/lib/index.js.map +1 -1
  71. package/package.json +13 -11
  72. package/src/drawing-response/button.jsx +23 -34
  73. package/src/drawing-response/container.jsx +39 -40
  74. package/src/drawing-response/drawable-image.jsx +17 -20
  75. package/src/drawing-response/drawable-main.jsx +67 -60
  76. package/src/drawing-response/drawable-palette.jsx +48 -54
  77. package/src/drawing-response/drawable-text.jsx +26 -38
  78. package/src/drawing-response/index.jsx +21 -20
  79. package/src/index.js +17 -2
  80. package/LICENSE.md +0 -5
  81. package/configure/node_modules/debug/CHANGELOG.md +0 -395
  82. package/configure/node_modules/debug/LICENSE +0 -19
  83. package/configure/node_modules/debug/README.md +0 -437
  84. package/configure/node_modules/debug/node.js +0 -1
  85. package/configure/node_modules/debug/package.json +0 -51
  86. package/configure/node_modules/debug/src/browser.js +0 -180
  87. package/configure/node_modules/debug/src/common.js +0 -249
  88. package/configure/node_modules/debug/src/index.js +0 -12
  89. package/configure/node_modules/debug/src/node.js +0 -177
@@ -0,0 +1,684 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _react = _interopRequireDefault(require("react"));
5
+ var _enzyme = require("enzyme");
6
+ var _cloneDeep = _interopRequireDefault(require("lodash/cloneDeep"));
7
+ var _drawableFreePath = _interopRequireDefault(require("../drawable-free-path"));
8
+ var _drawableLine = _interopRequireDefault(require("../drawable-line"));
9
+ var _drawableRectangle = _interopRequireDefault(require("../drawable-rectangle"));
10
+ var _drawableCircle = _interopRequireDefault(require("../drawable-circle"));
11
+ var _drawableEraser = _interopRequireDefault(require("../drawable-eraser"));
12
+ var _drawableText = _interopRequireDefault(require("../drawable-text"));
13
+ var _drawableMain = require("../drawable-main");
14
+ const drawableClasses = {
15
+ FreePathDrawable: _drawableFreePath.default,
16
+ LineDrawable: _drawableLine.default,
17
+ RectangleDrawable: _drawableRectangle.default,
18
+ CircleDrawable: _drawableCircle.default,
19
+ EraserDrawable: _drawableEraser.default,
20
+ DrawableText: _drawableText.default
21
+ };
22
+ describe('DrawingResponse', () => {
23
+ let element;
24
+ let wrapper;
25
+ const mkWrapper = (type, props, WrapperEl) => {
26
+ element = new drawableClasses[type](props);
27
+ let content = element.render(props);
28
+ if (WrapperEl) {
29
+ content = /*#__PURE__*/_react.default.createElement(WrapperEl, null, content);
30
+ }
31
+ return (0, _enzyme.shallow)(content);
32
+ };
33
+ describe('DrawableMain', () => {
34
+ let onSessionChange = jest.fn();
35
+ const TextEntry = new _drawableText.default();
36
+ const wrapperMain = (extras, renderOpts) => {
37
+ const defaults = {
38
+ classes: {},
39
+ disabled: false,
40
+ className: 'className',
41
+ onSessionChange,
42
+ imageDimensions: {},
43
+ imageUrl: 'url',
44
+ drawableDimensions: {
45
+ height: 350,
46
+ width: 353
47
+ },
48
+ fillColor: 'white',
49
+ outlineColor: 'black',
50
+ paintColor: 'red',
51
+ session: {},
52
+ toolActive: {
53
+ type: 'Select',
54
+ label: 'Select',
55
+ icon: 'mdiCursorDefault'
56
+ },
57
+ TextEntry
58
+ };
59
+ const props = {
60
+ ...defaults,
61
+ ...extras
62
+ };
63
+ return (0, _enzyme.shallow)(/*#__PURE__*/_react.default.createElement(_drawableMain.DrawableMain, props), {
64
+ ...renderOpts
65
+ });
66
+ };
67
+ describe('snapshot', () => {
68
+ it('renders', () => {
69
+ const w = wrapperMain();
70
+ expect(w).toMatchSnapshot();
71
+ });
72
+ it('renders disabled', () => {
73
+ const w = wrapperMain({
74
+ disabled: true
75
+ });
76
+ expect(w).toMatchSnapshot();
77
+ });
78
+ });
79
+ describe('logic', () => {
80
+ const handleSessionChange = jest.fn();
81
+ const forceUpdate = jest.fn();
82
+ const props = {
83
+ handleSessionChange,
84
+ forceUpdate,
85
+ paint: true,
86
+ paintColor: 'green',
87
+ startx: 200,
88
+ starty: 200,
89
+ x: 300,
90
+ y: 300,
91
+ createdAt: new Date()
92
+ };
93
+ it('handleUndo', () => {
94
+ const w = wrapperMain();
95
+ w.setState({
96
+ drawables: [new _drawableRectangle.default(props), new _drawableRectangle.default(props)]
97
+ });
98
+ w.instance().handleUndo();
99
+ expect(w.state('drawables').length).toEqual(1);
100
+ w.instance().handleUndo();
101
+ expect(w.state('drawables')).toEqual([]);
102
+ });
103
+ it('handleClearAll', () => {
104
+ const w = wrapperMain();
105
+ w.setState({
106
+ drawables: [new _drawableRectangle.default(props), new _drawableRectangle.default(props)]
107
+ });
108
+ w.instance().handleClearAll();
109
+ expect(w.state('drawables')).toEqual([]);
110
+ });
111
+ });
112
+ });
113
+ describe('CircleDrawable', () => {
114
+ let handleSessionChange = jest.fn();
115
+ let forceUpdate = jest.fn();
116
+ let props;
117
+ beforeEach(() => {
118
+ props = {
119
+ handleSessionChange,
120
+ forceUpdate,
121
+ paint: true,
122
+ paintColor: 'green',
123
+ startx: 200,
124
+ starty: 200,
125
+ x: 300,
126
+ y: 200,
127
+ createdAt: new Date()
128
+ };
129
+ wrapper = mkWrapper('CircleDrawable', props);
130
+ });
131
+ describe('snapshot', () => {
132
+ it('renders', () => {
133
+ expect(wrapper).toMatchSnapshot();
134
+ });
135
+ });
136
+ describe('logic', () => {
137
+ it('calls forceUpdate', () => {
138
+ wrapper.simulate('click');
139
+ expect(forceUpdate).toHaveBeenCalled();
140
+ });
141
+ it('changes x and y', () => {
142
+ element.registerMovement(400, 400);
143
+ expect(element.x).toEqual(400);
144
+ expect(element.y).toEqual(400);
145
+ });
146
+ it('changes session when needed', () => {
147
+ const event = {
148
+ target: {
149
+ getX: jest.fn().mockReturnValue(300),
150
+ getY: jest.fn().mockReturnValue(300)
151
+ }
152
+ };
153
+ element.handleDragEnd(props, event);
154
+ expect(event.target.getX).toHaveBeenCalled();
155
+ expect(event.target.getY).toHaveBeenCalled();
156
+ expect(handleSessionChange).toHaveBeenCalled();
157
+ });
158
+ it('changes startx and starty', () => {
159
+ const event = {
160
+ target: {
161
+ getX: jest.fn().mockReturnValue(300),
162
+ getY: jest.fn().mockReturnValue(300)
163
+ }
164
+ };
165
+ element.handleDragEnd(props, event);
166
+ expect(element.startx).toEqual(300);
167
+ expect(element.starty).toEqual(300);
168
+ expect(element.x).toEqual(400);
169
+ expect(element.y).toEqual(300);
170
+ });
171
+ });
172
+ });
173
+ describe('EraserDrawable', () => {
174
+ let handleSessionChange = jest.fn();
175
+ let forceUpdate = jest.fn();
176
+ let props;
177
+ beforeEach(() => {
178
+ props = {
179
+ handleSessionChange,
180
+ forceUpdate,
181
+ points: [200, 200, 300, 300],
182
+ posX: 200,
183
+ posY: 200,
184
+ startx: 200,
185
+ starty: 200,
186
+ createdAt: new Date()
187
+ };
188
+ wrapper = mkWrapper('EraserDrawable', props);
189
+ });
190
+ describe('snapshot', () => {
191
+ it('renders', () => {
192
+ expect(wrapper).toMatchSnapshot();
193
+ });
194
+ });
195
+ describe('logic', () => {
196
+ it('changes points', () => {
197
+ element.registerMovement(400, 400);
198
+ expect(element.points).toEqual([200, 200, 300, 300, 400, 400]);
199
+ });
200
+ it('changes session when needed', () => {
201
+ const event = {
202
+ target: {
203
+ getX: jest.fn().mockReturnValue(300),
204
+ getY: jest.fn().mockReturnValue(300)
205
+ }
206
+ };
207
+ element.handleDragEnd(props, event);
208
+ expect(event.target.getX).toHaveBeenCalled();
209
+ expect(event.target.getY).toHaveBeenCalled();
210
+ expect(handleSessionChange).toHaveBeenCalled();
211
+ });
212
+ it('changes posX and posY', () => {
213
+ const event = {
214
+ target: {
215
+ getX: jest.fn().mockReturnValue(300),
216
+ getY: jest.fn().mockReturnValue(300)
217
+ }
218
+ };
219
+ element.handleDragEnd(props, event);
220
+ expect(element.posX).toEqual(300);
221
+ expect(element.posY).toEqual(300);
222
+ });
223
+ });
224
+ });
225
+ describe('FreePathDrawable', () => {
226
+ let handleSessionChange = jest.fn();
227
+ let forceUpdate = jest.fn();
228
+ let props;
229
+ beforeEach(() => {
230
+ props = {
231
+ handleSessionChange,
232
+ forceUpdate,
233
+ paint: true,
234
+ paintColor: 'green',
235
+ points: [200, 200, 300, 300],
236
+ posX: 200,
237
+ posY: 200,
238
+ startx: 200,
239
+ starty: 200,
240
+ createdAt: new Date()
241
+ };
242
+ wrapper = mkWrapper('FreePathDrawable', props);
243
+ });
244
+ describe('snapshot', () => {
245
+ it('renders', () => {
246
+ expect(wrapper).toMatchSnapshot();
247
+ });
248
+ });
249
+ describe('logic', () => {
250
+ it('calls forceUpdate', () => {
251
+ wrapper.simulate('click');
252
+ expect(forceUpdate).toHaveBeenCalled();
253
+ });
254
+ it('changes points', () => {
255
+ element.registerMovement(400, 400);
256
+ expect(element.points).toEqual([200, 200, 300, 300, 400, 400]);
257
+ });
258
+ it('changes session when needed', () => {
259
+ const spy = jest.spyOn(element, 'handleDragEnd');
260
+ const event = {
261
+ target: {
262
+ getX: jest.fn().mockReturnValue(300),
263
+ getY: jest.fn().mockReturnValue(300)
264
+ }
265
+ };
266
+ element.handleDragEnd(props, event);
267
+ expect(event.target.getX).toHaveBeenCalled();
268
+ expect(event.target.getY).toHaveBeenCalled();
269
+ expect(handleSessionChange).toHaveBeenCalled();
270
+ });
271
+ it('changes posX and posY', () => {
272
+ const event = {
273
+ target: {
274
+ getX: jest.fn().mockReturnValue(300),
275
+ getY: jest.fn().mockReturnValue(300)
276
+ }
277
+ };
278
+ element.handleDragEnd(props, event);
279
+ expect(element.posX).toEqual(300);
280
+ expect(element.posY).toEqual(300);
281
+ });
282
+ });
283
+ });
284
+ describe('LineDrawable', () => {
285
+ let handleSessionChange = jest.fn();
286
+ let forceUpdate = jest.fn();
287
+ let props;
288
+ beforeEach(() => {
289
+ props = {
290
+ handleSessionChange,
291
+ forceUpdate,
292
+ paint: true,
293
+ paintColor: 'green',
294
+ startx: 200,
295
+ starty: 200,
296
+ posX: 200,
297
+ posY: 200,
298
+ x: 300,
299
+ y: 200,
300
+ createdAt: new Date()
301
+ };
302
+ wrapper = mkWrapper('LineDrawable', props);
303
+ });
304
+ describe('snapshot', () => {
305
+ it('renders', () => {
306
+ expect(wrapper).toMatchSnapshot();
307
+ });
308
+ });
309
+ describe('logic', () => {
310
+ it('calls forceUpdate', () => {
311
+ wrapper.simulate('click');
312
+ expect(forceUpdate).toHaveBeenCalled();
313
+ });
314
+ it('changes x and y', () => {
315
+ element.registerMovement(400, 400);
316
+ expect(element.x).toEqual(400);
317
+ expect(element.y).toEqual(400);
318
+ });
319
+ it('changes session when needed', () => {
320
+ const event = {
321
+ target: {
322
+ getX: jest.fn().mockReturnValue(300),
323
+ getY: jest.fn().mockReturnValue(300)
324
+ }
325
+ };
326
+ element.handleDragEnd(props, event);
327
+ expect(event.target.getX).toHaveBeenCalled();
328
+ expect(event.target.getY).toHaveBeenCalled();
329
+ expect(handleSessionChange).toHaveBeenCalled();
330
+ });
331
+ it('changes posX and posY', () => {
332
+ const event = {
333
+ target: {
334
+ getX: jest.fn().mockReturnValue(300),
335
+ getY: jest.fn().mockReturnValue(300)
336
+ }
337
+ };
338
+ element.handleDragEnd(props, event);
339
+ expect(element.posX).toEqual(300);
340
+ expect(element.posY).toEqual(300);
341
+ });
342
+ });
343
+ });
344
+ describe('RectangleDrawable', () => {
345
+ let handleSessionChange = jest.fn();
346
+ let forceUpdate = jest.fn();
347
+ let props;
348
+ beforeEach(() => {
349
+ props = {
350
+ handleSessionChange,
351
+ forceUpdate,
352
+ paint: true,
353
+ paintColor: 'green',
354
+ startx: 200,
355
+ starty: 200,
356
+ x: 300,
357
+ y: 300,
358
+ createdAt: new Date()
359
+ };
360
+ wrapper = mkWrapper('RectangleDrawable', props);
361
+ });
362
+ describe('snapshot', () => {
363
+ it('renders', () => {
364
+ expect(wrapper).toMatchSnapshot();
365
+ });
366
+ });
367
+ describe('logic', () => {
368
+ it('calls forceUpdate', () => {
369
+ wrapper.simulate('click');
370
+ expect(forceUpdate).toHaveBeenCalled();
371
+ });
372
+ it('changes x and y', () => {
373
+ element.registerMovement(400, 400);
374
+ expect(element.x).toEqual(400);
375
+ expect(element.y).toEqual(400);
376
+ });
377
+ it('changes session when needed', () => {
378
+ const event = {
379
+ target: {
380
+ getX: jest.fn().mockReturnValue(300),
381
+ getY: jest.fn().mockReturnValue(300)
382
+ }
383
+ };
384
+ element.handleDragEnd(props, event);
385
+ expect(event.target.getX).toHaveBeenCalled();
386
+ expect(event.target.getY).toHaveBeenCalled();
387
+ expect(handleSessionChange).toHaveBeenCalled();
388
+ });
389
+ it('changes posX and posY', () => {
390
+ const event = {
391
+ target: {
392
+ getX: jest.fn().mockReturnValue(300),
393
+ getY: jest.fn().mockReturnValue(300)
394
+ }
395
+ };
396
+ element.handleDragEnd(props, event);
397
+ expect(element.startx).toEqual(300);
398
+ expect(element.starty).toEqual(300);
399
+ expect(element.x).toEqual(400);
400
+ expect(element.y).toEqual(400);
401
+ });
402
+ });
403
+ });
404
+ describe('DrawableText', () => {
405
+ const all = [{
406
+ id: 'gcifqhhimf8k2d6g8hs',
407
+ isDefault: true,
408
+ label: 'Double click to edit this text. Press Enter to submit.',
409
+ value: 'This is what the user entered',
410
+ width: 200,
411
+ x: 2 * 5 + 50,
412
+ y: 2 * 5 + 50,
413
+ textVisible: true,
414
+ transformerVisible: true,
415
+ textareaVisible: false,
416
+ createdAt: new Date(),
417
+ type: 'text-entry'
418
+ }];
419
+ let handleSessionChange = jest.fn();
420
+ let forceUpdate = jest.fn();
421
+ let toggleTextSelected = jest.fn();
422
+ let props;
423
+ let stage;
424
+ beforeEach(() => {
425
+ stage = {
426
+ on: jest.fn(),
427
+ off: jest.fn()
428
+ };
429
+ props = {
430
+ all,
431
+ handleSessionChange,
432
+ forceUpdate,
433
+ stage,
434
+ toggleTextSelected,
435
+ paint: true,
436
+ paintColor: 'green',
437
+ startx: 200,
438
+ starty: 200,
439
+ x: 300,
440
+ y: 300,
441
+ scale: 1
442
+ };
443
+ wrapper = mkWrapper('DrawableText', props, 'div');
444
+ });
445
+ describe('snapshot', () => {
446
+ it('renders', () => {
447
+ expect(wrapper).toMatchSnapshot();
448
+ });
449
+ it('renders textAreas', () => {
450
+ element = new drawableClasses['DrawableText'](props);
451
+ wrapper = (0, _enzyme.shallow)(/*#__PURE__*/_react.default.createElement("div", null, element.renderTextareas()));
452
+ expect(wrapper).toMatchSnapshot();
453
+ });
454
+ });
455
+ describe('snapshot when there is no value', () => {
456
+ beforeEach(() => {
457
+ props.all.forEach(a => {
458
+ delete a.value;
459
+ });
460
+ wrapper = mkWrapper('DrawableText', props, 'div');
461
+ });
462
+ it('renders', () => {
463
+ expect(wrapper).toMatchSnapshot();
464
+ });
465
+ });
466
+ describe('logic', () => {
467
+ it('shoud change the all property and call forceUpdate', () => {
468
+ element.setAll([]);
469
+ expect(element.all).toEqual([]);
470
+ expect(forceUpdate).toHaveBeenCalled();
471
+ });
472
+ describe('addNewTextEntry', () => {
473
+ it('shoud add a new element and call the appropriate functions', () => {
474
+ element.addNewTextEntry();
475
+ expect(element.all.length).toEqual(2);
476
+ expect(element.all).toEqual(expect.arrayContaining([expect.objectContaining({
477
+ isDefault: true,
478
+ label: 'Double click to edit this text. Press Enter to submit.',
479
+ width: 200,
480
+ textVisible: true,
481
+ transformerVisible: true,
482
+ textareaVisible: false,
483
+ type: 'text-entry'
484
+ })]));
485
+ expect(stage.on).toHaveBeenCalled();
486
+ expect(handleSessionChange).toHaveBeenCalled();
487
+ });
488
+ });
489
+ describe('showOnlyTextNodes', () => {
490
+ it('should change properties for the "all" array', () => {
491
+ element.showOnlyTextNodes();
492
+ expect(element.all).toEqual(expect.arrayContaining([expect.objectContaining({
493
+ textVisible: true,
494
+ transformerVisible: false,
495
+ textareaVisible: false
496
+ })]));
497
+ });
498
+ });
499
+ describe('showOnltoggleTextareayTextNodes', () => {
500
+ it('should change the item with the right id in the "all" array and call forceUpdate', () => {
501
+ element.toggleTextarea('gcifqhhimf8k2d6g8hs', true);
502
+ expect(element.all[0]).toEqual(expect.objectContaining({
503
+ textVisible: false,
504
+ transformerVisible: false,
505
+ textareaVisible: true
506
+ }));
507
+ expect(forceUpdate).toHaveBeenCalled();
508
+ element.toggleTextarea('gcifqhhimf8k2d6g8hs', false);
509
+ expect(element.all[0]).toEqual(expect.objectContaining({
510
+ textVisible: true,
511
+ transformerVisible: true,
512
+ textareaVisible: false
513
+ }));
514
+ expect(forceUpdate).toHaveBeenCalled();
515
+ });
516
+ });
517
+ describe('initializeDefault', () => {
518
+ it('should make the item with the right id default', () => {
519
+ element.initializeDefault('gcifqhhimf8k2d6g8hs', true);
520
+ expect(element.all[0]).toEqual(expect.objectContaining({
521
+ isDefault: false
522
+ }));
523
+ });
524
+ });
525
+ describe('saveValue', () => {
526
+ it('should make the item with the right id default and call handleSessionChange', () => {
527
+ const textNode = {
528
+ text: jest.fn()
529
+ };
530
+ const textareaNode = {
531
+ value: 'Foo bar'
532
+ };
533
+ element.saveValue('gcifqhhimf8k2d6g8hs', textNode, textareaNode);
534
+ expect(textNode.text).toHaveBeenCalledWith('Foo bar');
535
+ expect(handleSessionChange).toHaveBeenCalled();
536
+ textareaNode.value = '';
537
+ element.saveValue('gcifqhhimf8k2d6g8hs', textNode, textareaNode);
538
+ expect(element.all).toEqual(expect.not.arrayContaining([expect.objectContaining({
539
+ id: 'gcifqhhimf8k2d6g8hs'
540
+ })]));
541
+ expect(forceUpdate).toHaveBeenCalled();
542
+ expect(handleSessionChange).toHaveBeenCalled();
543
+ });
544
+ });
545
+ describe('handleMouseEvents', () => {
546
+ it('should call the right functions on mouse down and up', () => {
547
+ element.handleMouseDown();
548
+ expect(toggleTextSelected).toHaveBeenCalledWith(true);
549
+ element.handleMouseUp();
550
+ expect(toggleTextSelected).toHaveBeenCalledWith(false);
551
+ });
552
+ it('should call the right functions onClick', () => {
553
+ element.handleClick(null, 'gcifqhhimf8k2d6g8hs');
554
+ expect(element.all).toEqual(expect.arrayContaining([expect.objectContaining({
555
+ transformerVisible: true
556
+ })]));
557
+ expect(forceUpdate).toHaveBeenCalled();
558
+ });
559
+ it('should call the right functions onDblClick', () => {
560
+ const text = {
561
+ id: 'gcifqhhimf8k2d6g8hs',
562
+ isDefault: false
563
+ };
564
+ const textNode = element[`text_${text.id}`] = {
565
+ _lastPos: {
566
+ x: 200,
567
+ y: 200
568
+ },
569
+ align: jest.fn().mockReturnValue('center'),
570
+ fill: jest.fn().mockReturnValue('green'),
571
+ fontFamily: jest.fn().mockReturnValue('FooBarFamily'),
572
+ fontSize: jest.fn().mockReturnValue('16'),
573
+ height: jest.fn().mockReturnValue(40),
574
+ lineHeight: jest.fn().mockReturnValue('40px'),
575
+ padding: jest.fn().mockReturnValue(0),
576
+ rotation: jest.fn().mockReturnValue(0),
577
+ text: jest.fn().mockReturnValue('foo bar'),
578
+ width: jest.fn().mockReturnValue(200)
579
+ };
580
+ const textareaNode = element[`textarea_${text.id}`] = {
581
+ focus: jest.fn(),
582
+ addEventListener: jest.fn(),
583
+ style: {},
584
+ scrollHeight: 205
585
+ };
586
+ const initSpy = jest.spyOn(element, 'initializeDefault');
587
+ const saveValueSpy = jest.spyOn(element, 'saveValue');
588
+ const toggleSpy = jest.spyOn(element, 'toggleTextarea');
589
+ element.handleDblClick(null, text);
590
+ expect(toggleSpy).toHaveBeenCalledWith(text.id, true);
591
+ expect(textareaNode.value).toEqual('foo bar');
592
+ expect(textareaNode.style).toEqual({
593
+ background: 'none',
594
+ border: 'none',
595
+ color: 'green',
596
+ fontFamily: 'FooBarFamily',
597
+ fontSize: '16px',
598
+ height: '208px',
599
+ left: '200px',
600
+ lineHeight: '40px',
601
+ margin: '0px',
602
+ outline: 'none',
603
+ overflow: 'hidden',
604
+ padding: '0px',
605
+ position: 'absolute',
606
+ resize: 'none',
607
+ top: '200px',
608
+ transformOrigin: 'left top',
609
+ textAlign: 'center',
610
+ transform: 'translateY(-0px)',
611
+ width: '200px'
612
+ });
613
+ expect(textareaNode.focus).toHaveBeenCalled();
614
+ expect(stage.on).toHaveBeenCalled();
615
+ expect(initSpy).toHaveBeenCalledWith('gcifqhhimf8k2d6g8hs', false);
616
+ expect(forceUpdate).toHaveBeenCalled();
617
+ expect(textareaNode.addEventListener.mock.calls[0][0]).toEqual('keydown');
618
+ expect(textareaNode.addEventListener.mock.calls[1][0]).toEqual('blur');
619
+ const event = {
620
+ keyCode: 13,
621
+ shiftKey: true
622
+ };
623
+ textareaNode.addEventListener.mock.calls[0][1](event);
624
+
625
+ // Make sure it's not called the second time
626
+ expect(toggleSpy).toHaveBeenCalledTimes(1);
627
+ expect(saveValueSpy).not.toHaveBeenCalled();
628
+ event.shiftKey = false;
629
+ textareaNode.addEventListener.mock.calls[0][1](event);
630
+ expect(toggleSpy).toHaveBeenCalledWith('gcifqhhimf8k2d6g8hs', false);
631
+ expect(saveValueSpy).toHaveBeenCalledWith('gcifqhhimf8k2d6g8hs', textNode, textareaNode);
632
+ event.keyCode = 27;
633
+ textareaNode.addEventListener.mock.calls[0][1](event);
634
+ expect(toggleSpy).toHaveBeenCalledWith('gcifqhhimf8k2d6g8hs', false);
635
+ const showTextSpy = jest.spyOn(element, 'showOnlyTextNodes');
636
+ event.target = stage;
637
+ stage.on.mock.calls[0][1](event);
638
+ expect(showTextSpy).toHaveBeenCalled();
639
+ expect(saveValueSpy).toHaveBeenCalledWith('gcifqhhimf8k2d6g8hs', textNode, textareaNode);
640
+ });
641
+ });
642
+ describe('handleTransform', () => {
643
+ it('should change attrs when called', () => {
644
+ const textNode = element[`text_gcifqhhimf8k2d6g8hs`] = {
645
+ setAttrs: jest.fn(),
646
+ width: jest.fn().mockReturnValue(100),
647
+ scaleX: jest.fn().mockReturnValue(1)
648
+ };
649
+ element.handleTransform(null, 'text_gcifqhhimf8k2d6g8hs');
650
+ expect(textNode.setAttrs).toHaveBeenCalledWith({
651
+ width: 100,
652
+ scaleX: 1
653
+ });
654
+ });
655
+ });
656
+ describe('setInitialProps', () => {
657
+ it('should set the props if not set already', () => {
658
+ element.props = undefined;
659
+ element.setInitialProps(props);
660
+ expect(element.props).toEqual(props);
661
+ });
662
+ });
663
+ describe('render', () => {
664
+ it('should set the stage listener only once', () => {
665
+ const separateStage = {
666
+ on: jest.fn(),
667
+ off: jest.fn()
668
+ };
669
+ const newProps = {
670
+ ...(0, _cloneDeep.default)(props),
671
+ stage: separateStage
672
+ };
673
+ const newElement = new drawableClasses['DrawableText'](newProps);
674
+ expect(newElement.stage).toEqual(undefined);
675
+ newElement.render(newProps);
676
+ expect(newElement.stage).toEqual(separateStage);
677
+ newElement.render(newProps);
678
+ expect(separateStage.on.mock.calls.length).toEqual(1);
679
+ });
680
+ });
681
+ });
682
+ });
683
+ });
684
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9lbnp5bWUiLCJfY2xvbmVEZWVwIiwiX2RyYXdhYmxlRnJlZVBhdGgiLCJfZHJhd2FibGVMaW5lIiwiX2RyYXdhYmxlUmVjdGFuZ2xlIiwiX2RyYXdhYmxlQ2lyY2xlIiwiX2RyYXdhYmxlRXJhc2VyIiwiX2RyYXdhYmxlVGV4dCIsIl9kcmF3YWJsZU1haW4iLCJkcmF3YWJsZUNsYXNzZXMiLCJGcmVlUGF0aERyYXdhYmxlIiwiTGluZURyYXdhYmxlIiwiUmVjdGFuZ2xlRHJhd2FibGUiLCJDaXJjbGVEcmF3YWJsZSIsIkVyYXNlckRyYXdhYmxlIiwiRHJhd2FibGVUZXh0IiwiZGVzY3JpYmUiLCJlbGVtZW50Iiwid3JhcHBlciIsIm1rV3JhcHBlciIsInR5cGUiLCJwcm9wcyIsIldyYXBwZXJFbCIsImNvbnRlbnQiLCJyZW5kZXIiLCJkZWZhdWx0IiwiY3JlYXRlRWxlbWVudCIsInNoYWxsb3ciLCJvblNlc3Npb25DaGFuZ2UiLCJqZXN0IiwiZm4iLCJUZXh0RW50cnkiLCJ3cmFwcGVyTWFpbiIsImV4dHJhcyIsInJlbmRlck9wdHMiLCJkZWZhdWx0cyIsImNsYXNzZXMiLCJkaXNhYmxlZCIsImNsYXNzTmFtZSIsImltYWdlRGltZW5zaW9ucyIsImltYWdlVXJsIiwiZHJhd2FibGVEaW1lbnNpb25zIiwiaGVpZ2h0Iiwid2lkdGgiLCJmaWxsQ29sb3IiLCJvdXRsaW5lQ29sb3IiLCJwYWludENvbG9yIiwic2Vzc2lvbiIsInRvb2xBY3RpdmUiLCJsYWJlbCIsImljb24iLCJEcmF3YWJsZU1haW4iLCJpdCIsInciLCJleHBlY3QiLCJ0b01hdGNoU25hcHNob3QiLCJoYW5kbGVTZXNzaW9uQ2hhbmdlIiwiZm9yY2VVcGRhdGUiLCJwYWludCIsInN0YXJ0eCIsInN0YXJ0eSIsIngiLCJ5IiwiY3JlYXRlZEF0IiwiRGF0ZSIsInNldFN0YXRlIiwiZHJhd2FibGVzIiwiaW5zdGFuY2UiLCJoYW5kbGVVbmRvIiwic3RhdGUiLCJsZW5ndGgiLCJ0b0VxdWFsIiwiaGFuZGxlQ2xlYXJBbGwiLCJiZWZvcmVFYWNoIiwic2ltdWxhdGUiLCJ0b0hhdmVCZWVuQ2FsbGVkIiwicmVnaXN0ZXJNb3ZlbWVudCIsImV2ZW50IiwidGFyZ2V0IiwiZ2V0WCIsIm1vY2tSZXR1cm5WYWx1ZSIsImdldFkiLCJoYW5kbGVEcmFnRW5kIiwicG9pbnRzIiwicG9zWCIsInBvc1kiLCJzcHkiLCJzcHlPbiIsImFsbCIsImlkIiwiaXNEZWZhdWx0IiwidmFsdWUiLCJ0ZXh0VmlzaWJsZSIsInRyYW5zZm9ybWVyVmlzaWJsZSIsInRleHRhcmVhVmlzaWJsZSIsInRvZ2dsZVRleHRTZWxlY3RlZCIsInN0YWdlIiwib24iLCJvZmYiLCJzY2FsZSIsInJlbmRlclRleHRhcmVhcyIsImZvckVhY2giLCJhIiwic2V0QWxsIiwiYWRkTmV3VGV4dEVudHJ5IiwiYXJyYXlDb250YWluaW5nIiwib2JqZWN0Q29udGFpbmluZyIsInNob3dPbmx5VGV4dE5vZGVzIiwidG9nZ2xlVGV4dGFyZWEiLCJpbml0aWFsaXplRGVmYXVsdCIsInRleHROb2RlIiwidGV4dCIsInRleHRhcmVhTm9kZSIsInNhdmVWYWx1ZSIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwibm90IiwiaGFuZGxlTW91c2VEb3duIiwiaGFuZGxlTW91c2VVcCIsImhhbmRsZUNsaWNrIiwiX2xhc3RQb3MiLCJhbGlnbiIsImZpbGwiLCJmb250RmFtaWx5IiwiZm9udFNpemUiLCJsaW5lSGVpZ2h0IiwicGFkZGluZyIsInJvdGF0aW9uIiwiZm9jdXMiLCJhZGRFdmVudExpc3RlbmVyIiwic3R5bGUiLCJzY3JvbGxIZWlnaHQiLCJpbml0U3B5Iiwic2F2ZVZhbHVlU3B5IiwidG9nZ2xlU3B5IiwiaGFuZGxlRGJsQ2xpY2siLCJiYWNrZ3JvdW5kIiwiYm9yZGVyIiwiY29sb3IiLCJsZWZ0IiwibWFyZ2luIiwib3V0bGluZSIsIm92ZXJmbG93IiwicG9zaXRpb24iLCJyZXNpemUiLCJ0b3AiLCJ0cmFuc2Zvcm1PcmlnaW4iLCJ0ZXh0QWxpZ24iLCJ0cmFuc2Zvcm0iLCJtb2NrIiwiY2FsbHMiLCJrZXlDb2RlIiwic2hpZnRLZXkiLCJ0b0hhdmVCZWVuQ2FsbGVkVGltZXMiLCJzaG93VGV4dFNweSIsInNldEF0dHJzIiwic2NhbGVYIiwiaGFuZGxlVHJhbnNmb3JtIiwidW5kZWZpbmVkIiwic2V0SW5pdGlhbFByb3BzIiwic2VwYXJhdGVTdGFnZSIsIm5ld1Byb3BzIiwiY2xvbmVEZWVwIiwibmV3RWxlbWVudCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kcmF3aW5nLXJlc3BvbnNlL19fdGVzdHNfXy9kcmF3aW5nLW1haW4udGVzdC5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHNoYWxsb3cgfSBmcm9tICdlbnp5bWUnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2gvY2xvbmVEZWVwJztcbmltcG9ydCBGcmVlUGF0aERyYXdhYmxlIGZyb20gJy4uL2RyYXdhYmxlLWZyZWUtcGF0aCc7XG5pbXBvcnQgTGluZURyYXdhYmxlIGZyb20gJy4uL2RyYXdhYmxlLWxpbmUnO1xuaW1wb3J0IFJlY3RhbmdsZURyYXdhYmxlIGZyb20gJy4uL2RyYXdhYmxlLXJlY3RhbmdsZSc7XG5pbXBvcnQgQ2lyY2xlRHJhd2FibGUgZnJvbSAnLi4vZHJhd2FibGUtY2lyY2xlJztcbmltcG9ydCBFcmFzZXJEcmF3YWJsZSBmcm9tICcuLi9kcmF3YWJsZS1lcmFzZXInO1xuaW1wb3J0IERyYXdhYmxlVGV4dCBmcm9tICcuLi9kcmF3YWJsZS10ZXh0JztcbmltcG9ydCB7IERyYXdhYmxlTWFpbiB9IGZyb20gJy4uL2RyYXdhYmxlLW1haW4nO1xuXG5jb25zdCBkcmF3YWJsZUNsYXNzZXMgPSB7XG4gIEZyZWVQYXRoRHJhd2FibGUsXG4gIExpbmVEcmF3YWJsZSxcbiAgUmVjdGFuZ2xlRHJhd2FibGUsXG4gIENpcmNsZURyYXdhYmxlLFxuICBFcmFzZXJEcmF3YWJsZSxcbiAgRHJhd2FibGVUZXh0LFxufTtcblxuZGVzY3JpYmUoJ0RyYXdpbmdSZXNwb25zZScsICgpID0+IHtcbiAgbGV0IGVsZW1lbnQ7XG4gIGxldCB3cmFwcGVyO1xuXG4gIGNvbnN0IG1rV3JhcHBlciA9ICh0eXBlLCBwcm9wcywgV3JhcHBlckVsKSA9PiB7XG4gICAgZWxlbWVudCA9IG5ldyBkcmF3YWJsZUNsYXNzZXNbdHlwZV0ocHJvcHMpO1xuXG4gICAgbGV0IGNvbnRlbnQgPSBlbGVtZW50LnJlbmRlcihwcm9wcyk7XG5cbiAgICBpZiAoV3JhcHBlckVsKSB7XG4gICAgICBjb250ZW50ID0gPFdyYXBwZXJFbD57Y29udGVudH08L1dyYXBwZXJFbD47XG4gICAgfVxuXG4gICAgcmV0dXJuIHNoYWxsb3coY29udGVudCk7XG4gIH07XG5cbiAgZGVzY3JpYmUoJ0RyYXdhYmxlTWFpbicsICgpID0+IHtcbiAgICBsZXQgb25TZXNzaW9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgIGNvbnN0IFRleHRFbnRyeSA9IG5ldyBEcmF3YWJsZVRleHQoKTtcblxuICAgIGNvbnN0IHdyYXBwZXJNYWluID0gKGV4dHJhcywgcmVuZGVyT3B0cykgPT4ge1xuICAgICAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICAgIGNsYXNzTmFtZTogJ2NsYXNzTmFtZScsXG4gICAgICAgIG9uU2Vzc2lvbkNoYW5nZSxcbiAgICAgICAgaW1hZ2VEaW1lbnNpb25zOiB7fSxcbiAgICAgICAgaW1hZ2VVcmw6ICd1cmwnLFxuICAgICAgICBkcmF3YWJsZURpbWVuc2lvbnM6IHsgaGVpZ2h0OiAzNTAsIHdpZHRoOiAzNTMgfSxcbiAgICAgICAgZmlsbENvbG9yOiAnd2hpdGUnLFxuICAgICAgICBvdXRsaW5lQ29sb3I6ICdibGFjaycsXG4gICAgICAgIHBhaW50Q29sb3I6ICdyZWQnLFxuICAgICAgICBzZXNzaW9uOiB7fSxcbiAgICAgICAgdG9vbEFjdGl2ZTogeyB0eXBlOiAnU2VsZWN0JywgbGFiZWw6ICdTZWxlY3QnLCBpY29uOiAnbWRpQ3Vyc29yRGVmYXVsdCcgfSxcbiAgICAgICAgVGV4dEVudHJ5LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHByb3BzID0geyAuLi5kZWZhdWx0cywgLi4uZXh0cmFzIH07XG4gICAgICByZXR1cm4gc2hhbGxvdyg8RHJhd2FibGVNYWluIHsuLi5wcm9wc30gLz4sIHtcbiAgICAgICAgLi4ucmVuZGVyT3B0cyxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBkZXNjcmliZSgnc25hcHNob3QnLCAoKSA9PiB7XG4gICAgICBpdCgncmVuZGVycycsICgpID0+IHtcbiAgICAgICAgY29uc3QgdyA9IHdyYXBwZXJNYWluKCk7XG4gICAgICAgIGV4cGVjdCh3KS50b01hdGNoU25hcHNob3QoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmVuZGVycyBkaXNhYmxlZCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgdyA9IHdyYXBwZXJNYWluKHsgZGlzYWJsZWQ6IHRydWUgfSk7XG4gICAgICAgIGV4cGVjdCh3KS50b01hdGNoU25hcHNob3QoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2xvZ2ljJywgKCkgPT4ge1xuICAgICAgY29uc3QgaGFuZGxlU2Vzc2lvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IGZvcmNlVXBkYXRlID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIGhhbmRsZVNlc3Npb25DaGFuZ2UsXG4gICAgICAgIGZvcmNlVXBkYXRlLFxuICAgICAgICBwYWludDogdHJ1ZSxcbiAgICAgICAgcGFpbnRDb2xvcjogJ2dyZWVuJyxcbiAgICAgICAgc3RhcnR4OiAyMDAsXG4gICAgICAgIHN0YXJ0eTogMjAwLFxuICAgICAgICB4OiAzMDAsXG4gICAgICAgIHk6IDMwMCxcbiAgICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgfTtcblxuICAgICAgaXQoJ2hhbmRsZVVuZG8nLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHcgPSB3cmFwcGVyTWFpbigpO1xuXG4gICAgICAgIHcuc2V0U3RhdGUoeyBkcmF3YWJsZXM6IFtuZXcgUmVjdGFuZ2xlRHJhd2FibGUocHJvcHMpLCBuZXcgUmVjdGFuZ2xlRHJhd2FibGUocHJvcHMpXSB9KTtcbiAgICAgICAgdy5pbnN0YW5jZSgpLmhhbmRsZVVuZG8oKTtcblxuICAgICAgICBleHBlY3Qody5zdGF0ZSgnZHJhd2FibGVzJykubGVuZ3RoKS50b0VxdWFsKDEpO1xuXG4gICAgICAgIHcuaW5zdGFuY2UoKS5oYW5kbGVVbmRvKCk7XG5cbiAgICAgICAgZXhwZWN0KHcuc3RhdGUoJ2RyYXdhYmxlcycpKS50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnaGFuZGxlQ2xlYXJBbGwnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHcgPSB3cmFwcGVyTWFpbigpO1xuXG4gICAgICAgIHcuc2V0U3RhdGUoeyBkcmF3YWJsZXM6IFtuZXcgUmVjdGFuZ2xlRHJhd2FibGUocHJvcHMpLCBuZXcgUmVjdGFuZ2xlRHJhd2FibGUocHJvcHMpXSB9KTtcbiAgICAgICAgdy5pbnN0YW5jZSgpLmhhbmRsZUNsZWFyQWxsKCk7XG5cbiAgICAgICAgZXhwZWN0KHcuc3RhdGUoJ2RyYXdhYmxlcycpKS50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQ2lyY2xlRHJhd2FibGUnLCAoKSA9PiB7XG4gICAgbGV0IGhhbmRsZVNlc3Npb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgbGV0IGZvcmNlVXBkYXRlID0gamVzdC5mbigpO1xuICAgIGxldCBwcm9wcztcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgcHJvcHMgPSB7XG4gICAgICAgIGhhbmRsZVNlc3Npb25DaGFuZ2UsXG4gICAgICAgIGZvcmNlVXBkYXRlLFxuICAgICAgICBwYWludDogdHJ1ZSxcbiAgICAgICAgcGFpbnRDb2xvcjogJ2dyZWVuJyxcbiAgICAgICAgc3RhcnR4OiAyMDAsXG4gICAgICAgIHN0YXJ0eTogMjAwLFxuICAgICAgICB4OiAzMDAsXG4gICAgICAgIHk6IDIwMCxcbiAgICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgfTtcbiAgICAgIHdyYXBwZXIgPSBta1dyYXBwZXIoJ0NpcmNsZURyYXdhYmxlJywgcHJvcHMpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NuYXBzaG90JywgKCkgPT4ge1xuICAgICAgaXQoJ3JlbmRlcnMnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdCh3cmFwcGVyKS50b01hdGNoU25hcHNob3QoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2xvZ2ljJywgKCkgPT4ge1xuICAgICAgaXQoJ2NhbGxzIGZvcmNlVXBkYXRlJywgKCkgPT4ge1xuICAgICAgICB3cmFwcGVyLnNpbXVsYXRlKCdjbGljaycpO1xuICAgICAgICBleHBlY3QoZm9yY2VVcGRhdGUpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnY2hhbmdlcyB4IGFuZCB5JywgKCkgPT4ge1xuICAgICAgICBlbGVtZW50LnJlZ2lzdGVyTW92ZW1lbnQoNDAwLCA0MDApO1xuXG4gICAgICAgIGV4cGVjdChlbGVtZW50LngpLnRvRXF1YWwoNDAwKTtcbiAgICAgICAgZXhwZWN0KGVsZW1lbnQueSkudG9FcXVhbCg0MDApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdjaGFuZ2VzIHNlc3Npb24gd2hlbiBuZWVkZWQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgICAgIHRhcmdldDoge1xuICAgICAgICAgICAgZ2V0WDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgzMDApLFxuICAgICAgICAgICAgZ2V0WTogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgzMDApLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgZWxlbWVudC5oYW5kbGVEcmFnRW5kKHByb3BzLCBldmVudCk7XG5cbiAgICAgICAgZXhwZWN0KGV2ZW50LnRhcmdldC5nZXRYKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIGV4cGVjdChldmVudC50YXJnZXQuZ2V0WSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuXG4gICAgICAgIGV4cGVjdChoYW5kbGVTZXNzaW9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2NoYW5nZXMgc3RhcnR4IGFuZCBzdGFydHknLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgICAgIHRhcmdldDoge1xuICAgICAgICAgICAgZ2V0WDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgzMDApLFxuICAgICAgICAgICAgZ2V0WTogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgzMDApLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgZWxlbWVudC5oYW5kbGVEcmFnRW5kKHByb3BzLCBldmVudCk7XG5cbiAgICAgICAgZXhwZWN0KGVsZW1lbnQuc3RhcnR4KS50b0VxdWFsKDMwMCk7XG4gICAgICAgIGV4cGVjdChlbGVtZW50LnN0YXJ0eSkudG9FcXVhbCgzMDApO1xuICAgICAgICBleHBlY3QoZWxlbWVudC54KS50b0VxdWFsKDQwMCk7XG4gICAgICAgIGV4cGVjdChlbGVtZW50LnkpLnRvRXF1YWwoMzAwKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRXJhc2VyRHJhd2FibGUnLCAoKSA9PiB7XG4gICAgbGV0IGhhbmRsZVNlc3Npb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgbGV0IGZvcmNlVXBkYXRlID0gamVzdC5mbigpO1xuICAgIGxldCBwcm9wcztcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgcHJvcHMgPSB7XG4gICAgICAgIGhhbmRsZVNlc3Npb25DaGFuZ2UsXG4gICAgICAgIGZvcmNlVXBkYXRlLFxuICAgICAgICBwb2ludHM6IFsyMDAsIDIwMCwgMzAwLCAzMDBdLFxuICAgICAgICBwb3NYOiAyMDAsXG4gICAgICAgIHBvc1k6IDIwMCxcbiAgICAgICAgc3RhcnR4OiAyMDAsXG4gICAgICAgIHN0YXJ0eTogMjAwLFxuICAgICAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICB9O1xuICAgICAgd3JhcHBlciA9IG1rV3JhcHBlcignRXJhc2VyRHJhd2FibGUnLCBwcm9wcyk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc25hcHNob3QnLCAoKSA9PiB7XG4gICAgICBpdCgncmVuZGVycycsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHdyYXBwZXIpLnRvTWF0Y2hTbmFwc2hvdCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbG9naWMnLCAoKSA9PiB7XG4gICAgICBpdCgnY2hhbmdlcyBwb2ludHMnLCAoKSA9PiB7XG4gICAgICAgIGVsZW1lbnQucmVnaXN0ZXJNb3ZlbWVudCg0MDAsIDQwMCk7XG5cbiAgICAgICAgZXhwZWN0KGVsZW1lbnQucG9pbnRzKS50b0VxdWFsKFsyMDAsIDIwMCwgMzAwLCAzMDAsIDQwMCwgNDAwXSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2NoYW5nZXMgc2Vzc2lvbiB3aGVuIG5lZWRlZCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgICBnZXRYOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDMwMCksXG4gICAgICAgICAgICBnZXRZOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDMwMCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICBlbGVtZW50LmhhbmRsZURyYWdFbmQocHJvcHMsIGV2ZW50KTtcblxuICAgICAgICBleHBlY3QoZXZlbnQudGFyZ2V0LmdldFgpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgICAgZXhwZWN0KGV2ZW50LnRhcmdldC5nZXRZKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG5cbiAgICAgICAgZXhwZWN0KGhhbmRsZVNlc3Npb25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnY2hhbmdlcyBwb3NYIGFuZCBwb3NZJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICAgIGdldFg6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoMzAwKSxcbiAgICAgICAgICAgIGdldFk6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoMzAwKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGVsZW1lbnQuaGFuZGxlRHJhZ0VuZChwcm9wcywgZXZlbnQpO1xuXG4gICAgICAgIGV4cGVjdChlbGVtZW50LnBvc1gpLnRvRXF1YWwoMzAwKTtcbiAgICAgICAgZXhwZWN0KGVsZW1lbnQucG9zWSkudG9FcXVhbCgzMDApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdGcmVlUGF0aERyYXdhYmxlJywgKCkgPT4ge1xuICAgIGxldCBoYW5kbGVTZXNzaW9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgIGxldCBmb3JjZVVwZGF0ZSA9IGplc3QuZm4oKTtcbiAgICBsZXQgcHJvcHM7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIHByb3BzID0ge1xuICAgICAgICBoYW5kbGVTZXNzaW9uQ2hhbmdlLFxuICAgICAgICBmb3JjZVVwZGF0ZSxcbiAgICAgICAgcGFpbnQ6IHRydWUsXG4gICAgICAgIHBhaW50Q29sb3I6ICdncmVlbicsXG4gICAgICAgIHBvaW50czogWzIwMCwgMjAwLCAzMDAsIDMwMF0sXG4gICAgICAgIHBvc1g6IDIwMCxcbiAgICAgICAgcG9zWTogMjAwLFxuICAgICAgICBzdGFydHg6IDIwMCxcbiAgICAgICAgc3RhcnR5OiAyMDAsXG4gICAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgIH07XG4gICAgICB3cmFwcGVyID0gbWtXcmFwcGVyKCdGcmVlUGF0aERyYXdhYmxlJywgcHJvcHMpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NuYXBzaG90JywgKCkgPT4ge1xuICAgICAgaXQoJ3JlbmRlcnMnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdCh3cmFwcGVyKS50b01hdGNoU25hcHNob3QoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2xvZ2ljJywgKCkgPT4ge1xuICAgICAgaXQoJ2NhbGxzIGZvcmNlVXBkYXRlJywgKCkgPT4ge1xuICAgICAgICB3cmFwcGVyLnNpbXVsYXRlKCdjbGljaycpO1xuICAgICAgICBleHBlY3QoZm9yY2VVcGRhdGUpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnY2hhbmdlcyBwb2ludHMnLCAoKSA9PiB7XG4gICAgICAgIGVsZW1lbnQucmVnaXN0ZXJNb3ZlbWVudCg0MDAsIDQwMCk7XG5cbiAgICAgICAgZXhwZWN0KGVsZW1lbnQucG9pbnRzKS50b0VxdWFsKFsyMDAsIDIwMCwgMzAwLCAzMDAsIDQwMCwgNDAwXSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2NoYW5nZXMgc2Vzc2lvbiB3aGVuIG5lZWRlZCcsICgpID0+IHtcbiAgICAgICAgY29uc3Qgc3B5ID0gamVzdC5zcHlPbihlbGVtZW50LCAnaGFuZGxlRHJhZ0VuZCcpO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgICAgIHRhcmdldDoge1xuICAgICAgICAgICAgZ2V0WDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgzMDApLFxuICAgICAgICAgICAgZ2V0WTogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgzMDApLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgZWxlbWVudC5oYW5kbGVEcmFnRW5kKHByb3BzLCBldmVudCk7XG5cbiAgICAgICAgZXhwZWN0KGV2ZW50LnRhcmdldC5nZXRYKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIGV4cGVjdChldmVudC50YXJnZXQuZ2V0WSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuXG4gICAgICAgIGV4cGVjdChoYW5kbGVTZXNzaW9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2NoYW5nZXMgcG9zWCBhbmQgcG9zWScsICgpID0+IHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgICBnZXRYOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDMwMCksXG4gICAgICAgICAgICBnZXRZOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDMwMCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICBlbGVtZW50LmhhbmRsZURyYWdFbmQocHJvcHMsIGV2ZW50KTtcblxuICAgICAgICBleHBlY3QoZWxlbWVudC5wb3NYKS50b0VxdWFsKDMwMCk7XG4gICAgICAgIGV4cGVjdChlbGVtZW50LnBvc1kpLnRvRXF1YWwoMzAwKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnTGluZURyYXdhYmxlJywgKCkgPT4ge1xuICAgIGxldCBoYW5kbGVTZXNzaW9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgIGxldCBmb3JjZVVwZGF0ZSA9IGplc3QuZm4oKTtcbiAgICBsZXQgcHJvcHM7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIHByb3BzID0ge1xuICAgICAgICBoYW5kbGVTZXNzaW9uQ2hhbmdlLFxuICAgICAgICBmb3JjZVVwZGF0ZSxcbiAgICAgICAgcGFpbnQ6IHRydWUsXG4gICAgICAgIHBhaW50Q29sb3I6ICdncmVlbicsXG4gICAgICAgIHN0YXJ0eDogMjAwLFxuICAgICAgICBzdGFydHk6IDIwMCxcbiAgICAgICAgcG9zWDogMjAwLFxuICAgICAgICBwb3NZOiAyMDAsXG4gICAgICAgIHg6IDMwMCxcbiAgICAgICAgeTogMjAwLFxuICAgICAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICB9O1xuICAgICAgd3JhcHBlciA9IG1rV3JhcHBlcignTGluZURyYXdhYmxlJywgcHJvcHMpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NuYXBzaG90JywgKCkgPT4ge1xuICAgICAgaXQoJ3JlbmRlcnMnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdCh3cmFwcGVyKS50b01hdGNoU25hcHNob3QoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2xvZ2ljJywgKCkgPT4ge1xuICAgICAgaXQoJ2NhbGxzIGZvcmNlVXBkYXRlJywgKCkgPT4ge1xuICAgICAgICB3cmFwcGVyLnNpbXVsYXRlKCdjbGljaycpO1xuICAgICAgICBleHBlY3QoZm9yY2VVcGRhdGUpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnY2hhbmdlcyB4IGFuZCB5JywgKCkgPT4ge1xuICAgICAgICBlbGVtZW50LnJlZ2lzdGVyTW92ZW1lbnQoNDAwLCA0MDApO1xuXG4gICAgICAgIGV4cGVjdChlbGVtZW50LngpLnRvRXF1YWwoNDAwKTtcbiAgICAgICAgZXhwZWN0KGVsZW1lbnQueSkudG9FcXVhbCg0MDApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdjaGFuZ2VzIHNlc3Npb24gd2hlbiBuZWVkZWQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgICAgIHRhcmdldDoge1xuICAgICAgICAgICAgZ2V0WDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgzMDApLFxuICAgICAgICAgICAgZ2V0WTogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgzMDApLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgZWxlbWVudC5oYW5kbGVEcmFnRW5kKHByb3BzLCBldmVudCk7XG5cbiAgICAgICAgZXhwZWN0KGV2ZW50LnRhcmdldC5nZXRYKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIGV4cGVjdChldmVudC50YXJnZXQuZ2V0WSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuXG4gICAgICAgIGV4cGVjdChoYW5kbGVTZXNzaW9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2NoYW5nZXMgcG9zWCBhbmQgcG9zWScsICgpID0+IHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgICBnZXRYOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDMwMCksXG4gICAgICAgICAgICBnZXRZOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDMwMCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICBlbGVtZW50LmhhbmRsZURyYWdFbmQocHJvcHMsIGV2ZW50KTtcblxuICAgICAgICBleHBlY3QoZWxlbWVudC5wb3NYKS50b0VxdWFsKDMwMCk7XG4gICAgICAgIGV4cGVjdChlbGVtZW50LnBvc1kpLnRvRXF1YWwoMzAwKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUmVjdGFuZ2xlRHJhd2FibGUnLCAoKSA9PiB7XG4gICAgbGV0IGhhbmRsZVNlc3Npb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgbGV0IGZvcmNlVXBkYXRlID0gamVzdC5mbigpO1xuICAgIGxldCBwcm9wcztcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgcHJvcHMgPSB7XG4gICAgICAgIGhhbmRsZVNlc3Npb25DaGFuZ2UsXG4gICAgICAgIGZvcmNlVXBkYXRlLFxuICAgICAgICBwYWludDogdHJ1ZSxcbiAgICAgICAgcGFpbnRDb2xvcjogJ2dyZWVuJyxcbiAgICAgICAgc3RhcnR4OiAyMDAsXG4gICAgICAgIHN0YXJ0eTogMjAwLFxuICAgICAgICB4OiAzMDAsXG4gICAgICAgIHk6IDMwMCxcbiAgICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgfTtcbiAgICAgIHdyYXBwZXIgPSBta1dyYXBwZXIoJ1JlY3RhbmdsZURyYXdhYmxlJywgcHJvcHMpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NuYXBzaG90JywgKCkgPT4ge1xuICAgICAgaXQoJ3JlbmRlcnMnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdCh3cmFwcGVyKS50b01hdGNoU25hcHNob3QoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2xvZ2ljJywgKCkgPT4ge1xuICAgICAgaXQoJ2NhbGxzIGZvcmNlVXBkYXRlJywgKCkgPT4ge1xuICAgICAgICB3cmFwcGVyLnNpbXVsYXRlKCdjbGljaycpO1xuICAgICAgICBleHBlY3QoZm9yY2VVcGRhdGUpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnY2hhbmdlcyB4IGFuZCB5JywgKCkgPT4ge1xuICAgICAgICBlbGVtZW50LnJlZ2lzdGVyTW92ZW1lbnQoNDAwLCA0MDApO1xuXG4gICAgICAgIGV4cGVjdChlbGVtZW50LngpLnRvRXF1YWwoNDAwKTtcbiAgICAgICAgZXhwZWN0KGVsZW1lbnQueSkudG9FcXVhbCg0MDApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdjaGFuZ2VzIHNlc3Npb24gd2hlbiBuZWVkZWQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgICAgIHRhcmdldDoge1xuICAgICAgICAgICAgZ2V0WDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgzMDApLFxuICAgICAgICAgICAgZ2V0WTogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgzMDApLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgZWxlbWVudC5oYW5kbGVEcmFnRW5kKHByb3BzLCBldmVudCk7XG5cbiAgICAgICAgZXhwZWN0KGV2ZW50LnRhcmdldC5nZXRYKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIGV4cGVjdChldmVudC50YXJnZXQuZ2V0WSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuXG4gICAgICAgIGV4cGVjdChoYW5kbGVTZXNzaW9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2NoYW5nZXMgcG9zWCBhbmQgcG9zWScsICgpID0+IHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgICBnZXRYOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDMwMCksXG4gICAgICAgICAgICBnZXRZOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDMwMCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICBlbGVtZW50LmhhbmRsZURyYWdFbmQocHJvcHMsIGV2ZW50KTtcblxuICAgICAgICBleHBlY3QoZWxlbWVudC5zdGFydHgpLnRvRXF1YWwoMzAwKTtcbiAgICAgICAgZXhwZWN0KGVsZW1lbnQuc3RhcnR5KS50b0VxdWFsKDMwMCk7XG4gICAgICAgIGV4cGVjdChlbGVtZW50LngpLnRvRXF1YWwoNDAwKTtcbiAgICAgICAgZXhwZWN0KGVsZW1lbnQueSkudG9FcXVhbCg0MDApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdEcmF3YWJsZVRleHQnLCAoKSA9PiB7XG4gICAgY29uc3QgYWxsID0gW1xuICAgICAge1xuICAgICAgICBpZDogJ2djaWZxaGhpbWY4azJkNmc4aHMnLFxuICAgICAgICBpc0RlZmF1bHQ6IHRydWUsXG4gICAgICAgIGxhYmVsOiAnRG91YmxlIGNsaWNrIHRvIGVkaXQgdGhpcyB0ZXh0LiBQcmVzcyBFbnRlciB0byBzdWJtaXQuJyxcbiAgICAgICAgdmFsdWU6ICdUaGlzIGlzIHdoYXQgdGhlIHVzZXIgZW50ZXJlZCcsXG4gICAgICAgIHdpZHRoOiAyMDAsXG4gICAgICAgIHg6IDIgKiA1ICsgNTAsXG4gICAgICAgIHk6IDIgKiA1ICsgNTAsXG4gICAgICAgIHRleHRWaXNpYmxlOiB0cnVlLFxuICAgICAgICB0cmFuc2Zvcm1lclZpc2libGU6IHRydWUsXG4gICAgICAgIHRleHRhcmVhVmlzaWJsZTogZmFsc2UsXG4gICAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgdHlwZTogJ3RleHQtZW50cnknLFxuICAgICAgfSxcbiAgICBdO1xuICAgIGxldCBoYW5kbGVTZXNzaW9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgIGxldCBmb3JjZVVwZGF0ZSA9IGplc3QuZm4oKTtcbiAgICBsZXQgdG9nZ2xlVGV4dFNlbGVjdGVkID0gamVzdC5mbigpO1xuICAgIGxldCBwcm9wcztcbiAgICBsZXQgc3RhZ2U7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIHN0YWdlID0ge1xuICAgICAgICBvbjogamVzdC5mbigpLFxuICAgICAgICBvZmY6IGplc3QuZm4oKSxcbiAgICAgIH07XG5cbiAgICAgIHByb3BzID0ge1xuICAgICAgICBhbGwsXG4gICAgICAgIGhhbmRsZVNlc3Npb25DaGFuZ2UsXG4gICAgICAgIGZvcmNlVXBkYXRlLFxuICAgICAgICBzdGFnZSxcbiAgICAgICAgdG9nZ2xlVGV4dFNlbGVjdGVkLFxuICAgICAgICBwYWludDogdHJ1ZSxcbiAgICAgICAgcGFpbnRDb2xvcjogJ2dyZWVuJyxcbiAgICAgICAgc3RhcnR4OiAyMDAsXG4gICAgICAgIHN0YXJ0eTogMjAwLFxuICAgICAgICB4OiAzMDAsXG4gICAgICAgIHk6IDMwMCxcbiAgICAgICAgc2NhbGU6IDEsXG4gICAgICB9O1xuICAgICAgd3JhcHBlciA9IG1rV3JhcHBlcignRHJhd2FibGVUZXh0JywgcHJvcHMsICdkaXYnKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzbmFwc2hvdCcsICgpID0+IHtcbiAgICAgIGl0KCdyZW5kZXJzJywgKCkgPT4ge1xuICAgICAgICBleHBlY3Qod3JhcHBlcikudG9NYXRjaFNuYXBzaG90KCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JlbmRlcnMgdGV4dEFyZWFzJywgKCkgPT4ge1xuICAgICAgICBlbGVtZW50ID0gbmV3IGRyYXdhYmxlQ2xhc3Nlc1snRHJhd2FibGVUZXh0J10ocHJvcHMpO1xuXG4gICAgICAgIHdyYXBwZXIgPSBzaGFsbG93KDxkaXY+e2VsZW1lbnQucmVuZGVyVGV4dGFyZWFzKCl9PC9kaXY+KTtcblxuICAgICAgICBleHBlY3Qod3JhcHBlcikudG9NYXRjaFNuYXBzaG90KCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzbmFwc2hvdCB3aGVuIHRoZXJlIGlzIG5vIHZhbHVlJywgKCkgPT4ge1xuICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIHByb3BzLmFsbC5mb3JFYWNoKChhKSA9PiB7XG4gICAgICAgICAgZGVsZXRlIGEudmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgICB3cmFwcGVyID0gbWtXcmFwcGVyKCdEcmF3YWJsZVRleHQnLCBwcm9wcywgJ2RpdicpO1xuICAgICAgfSk7XG4gICAgICBpdCgncmVuZGVycycsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHdyYXBwZXIpLnRvTWF0Y2hTbmFwc2hvdCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbG9naWMnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWQgY2hhbmdlIHRoZSBhbGwgcHJvcGVydHkgYW5kIGNhbGwgZm9yY2VVcGRhdGUnLCAoKSA9PiB7XG4gICAgICAgIGVsZW1lbnQuc2V0QWxsKFtdKTtcblxuICAgICAgICBleHBlY3QoZWxlbWVudC5hbGwpLnRvRXF1YWwoW10pO1xuICAgICAgICBleHBlY3QoZm9yY2VVcGRhdGUpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnYWRkTmV3VGV4dEVudHJ5JywgKCkgPT4ge1xuICAgICAgICBpdCgnc2hvdWQgYWRkIGEgbmV3IGVsZW1lbnQgYW5kIGNhbGwgdGhlIGFwcHJvcHJpYXRlIGZ1bmN0aW9ucycsICgpID0+IHtcbiAgICAgICAgICBlbGVtZW50LmFkZE5ld1RleHRFbnRyeSgpO1xuXG4gICAgICAgICAgZXhwZWN0KGVsZW1lbnQuYWxsLmxlbmd0aCkudG9FcXVhbCgyKTtcbiAgICAgICAgICBleHBlY3QoZWxlbWVudC5hbGwpLnRvRXF1YWwoXG4gICAgICAgICAgICBleHBlY3QuYXJyYXlDb250YWluaW5nKFtcbiAgICAgICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICAgIGlzRGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0RvdWJsZSBjbGljayB0byBlZGl0IHRoaXMgdGV4dC4gUHJlc3MgRW50ZXIgdG8gc3VibWl0LicsXG4gICAgICAgICAgICAgICAgd2lkdGg6IDIwMCxcbiAgICAgICAgICAgICAgICB0ZXh0VmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lclZpc2libGU6IHRydWUsXG4gICAgICAgICAgICAgICAgdGV4dGFyZWFWaXNpYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0eXBlOiAndGV4dC1lbnRyeScsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGV4cGVjdChzdGFnZS5vbikudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgICAgIGV4cGVjdChoYW5kbGVTZXNzaW9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCdzaG93T25seVRleHROb2RlcycsICgpID0+IHtcbiAgICAgICAgaXQoJ3Nob3VsZCBjaGFuZ2UgcHJvcGVydGllcyBmb3IgdGhlIFwiYWxsXCIgYXJyYXknLCAoKSA9PiB7XG4gICAgICAgICAgZWxlbWVudC5zaG93T25seVRleHROb2RlcygpO1xuXG4gICAgICAgICAgZXhwZWN0KGVsZW1lbnQuYWxsKS50b0VxdWFsKFxuICAgICAgICAgICAgZXhwZWN0LmFycmF5Q29udGFpbmluZyhbXG4gICAgICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgICAgICB0ZXh0VmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lclZpc2libGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHRleHRhcmVhVmlzaWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ3Nob3dPbmx0b2dnbGVUZXh0YXJlYXlUZXh0Tm9kZXMnLCAoKSA9PiB7XG4gICAgICAgIGl0KCdzaG91bGQgY2hhbmdlIHRoZSBpdGVtIHdpdGggdGhlIHJpZ2h0IGlkIGluIHRoZSBcImFsbFwiIGFycmF5IGFuZCBjYWxsIGZvcmNlVXBkYXRlJywgKCkgPT4ge1xuICAgICAgICAgIGVsZW1lbnQudG9nZ2xlVGV4dGFyZWEoJ2djaWZxaGhpbWY4azJkNmc4aHMnLCB0cnVlKTtcblxuICAgICAgICAgIGV4cGVjdChlbGVtZW50LmFsbFswXSkudG9FcXVhbChcbiAgICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgICAgdGV4dFZpc2libGU6IGZhbHNlLFxuICAgICAgICAgICAgICB0cmFuc2Zvcm1lclZpc2libGU6IGZhbHNlLFxuICAgICAgICAgICAgICB0ZXh0YXJlYVZpc2libGU6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgZXhwZWN0KGZvcmNlVXBkYXRlKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG5cbiAgICAgICAgICBlbGVtZW50LnRvZ2dsZVRleHRhcmVhKCdnY2lmcWhoaW1mOGsyZDZnOGhzJywgZmFsc2UpO1xuXG4gICAgICAgICAgZXhwZWN0KGVsZW1lbnQuYWxsWzBdKS50b0VxdWFsKFxuICAgICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICB0ZXh0VmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgdHJhbnNmb3JtZXJWaXNpYmxlOiB0cnVlLFxuICAgICAgICAgICAgICB0ZXh0YXJlYVZpc2libGU6IGZhbHNlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGV4cGVjdChmb3JjZVVwZGF0ZSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnaW5pdGlhbGl6ZURlZmF1bHQnLCAoKSA9PiB7XG4gICAgICAgIGl0KCdzaG91bGQgbWFrZSB0aGUgaXRlbSB3aXRoIHRoZSByaWdodCBpZCBkZWZhdWx0JywgKCkgPT4ge1xuICAgICAgICAgIGVsZW1lbnQuaW5pdGlhbGl6ZURlZmF1bHQoJ2djaWZxaGhpbWY4azJkNmc4aHMnLCB0cnVlKTtcblxuICAgICAgICAgIGV4cGVjdChlbGVtZW50LmFsbFswXSkudG9FcXVhbChcbiAgICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgICAgaXNEZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCdzYXZlVmFsdWUnLCAoKSA9PiB7XG4gICAgICAgIGl0KCdzaG91bGQgbWFrZSB0aGUgaXRlbSB3aXRoIHRoZSByaWdodCBpZCBkZWZhdWx0IGFuZCBjYWxsIGhhbmRsZVNlc3Npb25DaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSB7XG4gICAgICAgICAgICB0ZXh0OiBqZXN0LmZuKCksXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCB0ZXh0YXJlYU5vZGUgPSB7XG4gICAgICAgICAgICB2YWx1ZTogJ0ZvbyBiYXInLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBlbGVtZW50LnNhdmVWYWx1ZSgnZ2NpZnFoaGltZjhrMmQ2ZzhocycsIHRleHROb2RlLCB0ZXh0YXJlYU5vZGUpO1xuXG4gICAgICAgICAgZXhwZWN0KHRleHROb2RlLnRleHQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdGb28gYmFyJyk7XG4gICAgICAgICAgZXhwZWN0KGhhbmRsZVNlc3Npb25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcblxuICAgICAgICAgIHRleHRhcmVhTm9kZS52YWx1ZSA9ICcnO1xuXG4gICAgICAgICAgZWxlbWVudC5zYXZlVmFsdWUoJ2djaWZxaGhpbWY4azJkNmc4aHMnLCB0ZXh0Tm9kZSwgdGV4dGFyZWFOb2RlKTtcblxuICAgICAgICAgIGV4cGVjdChlbGVtZW50LmFsbCkudG9FcXVhbChcbiAgICAgICAgICAgIGV4cGVjdC5ub3QuYXJyYXlDb250YWluaW5nKFtcbiAgICAgICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICAgIGlkOiAnZ2NpZnFoaGltZjhrMmQ2ZzhocycsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBleHBlY3QoZm9yY2VVcGRhdGUpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgICAgICBleHBlY3QoaGFuZGxlU2Vzc2lvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnaGFuZGxlTW91c2VFdmVudHMnLCAoKSA9PiB7XG4gICAgICAgIGl0KCdzaG91bGQgY2FsbCB0aGUgcmlnaHQgZnVuY3Rpb25zIG9uIG1vdXNlIGRvd24gYW5kIHVwJywgKCkgPT4ge1xuICAgICAgICAgIGVsZW1lbnQuaGFuZGxlTW91c2VEb3duKCk7XG4gICAgICAgICAgZXhwZWN0KHRvZ2dsZVRleHRTZWxlY3RlZCkudG9IYXZlQmVlbkNhbGxlZFdpdGgodHJ1ZSk7XG5cbiAgICAgICAgICBlbGVtZW50LmhhbmRsZU1vdXNlVXAoKTtcbiAgICAgICAgICBleHBlY3QodG9nZ2xlVGV4dFNlbGVjdGVkKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChmYWxzZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgY2FsbCB0aGUgcmlnaHQgZnVuY3Rpb25zIG9uQ2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgZWxlbWVudC5oYW5kbGVDbGljayhudWxsLCAnZ2NpZnFoaGltZjhrMmQ2ZzhocycpO1xuXG4gICAgICAgICAgZXhwZWN0KGVsZW1lbnQuYWxsKS50b0VxdWFsKFxuICAgICAgICAgICAgZXhwZWN0LmFycmF5Q29udGFpbmluZyhbXG4gICAgICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lclZpc2libGU6IHRydWUsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGV4cGVjdChmb3JjZVVwZGF0ZSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGNhbGwgdGhlIHJpZ2h0IGZ1bmN0aW9ucyBvbkRibENsaWNrJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRleHQgPSB7XG4gICAgICAgICAgICBpZDogJ2djaWZxaGhpbWY4azJkNmc4aHMnLFxuICAgICAgICAgICAgaXNEZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSAoZWxlbWVudFtgdGV4dF8ke3RleHQuaWR9YF0gPSB7XG4gICAgICAgICAgICBfbGFzdFBvczoge1xuICAgICAgICAgICAgICB4OiAyMDAsXG4gICAgICAgICAgICAgIHk6IDIwMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhbGlnbjogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgnY2VudGVyJyksXG4gICAgICAgICAgICBmaWxsOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKCdncmVlbicpLFxuICAgICAgICAgICAgZm9udEZhbWlseTogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgnRm9vQmFyRmFtaWx5JyksXG4gICAgICAgICAgICBmb250U2l6ZTogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgnMTYnKSxcbiAgICAgICAgICAgIGhlaWdodDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSg0MCksXG4gICAgICAgICAgICBsaW5lSGVpZ2h0OiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKCc0MHB4JyksXG4gICAgICAgICAgICBwYWRkaW5nOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDApLFxuICAgICAgICAgICAgcm90YXRpb246IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoMCksXG4gICAgICAgICAgICB0ZXh0OiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKCdmb28gYmFyJyksXG4gICAgICAgICAgICB3aWR0aDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgyMDApLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHRleHRhcmVhTm9kZSA9IChlbGVtZW50W2B0ZXh0YXJlYV8ke3RleHQuaWR9YF0gPSB7XG4gICAgICAgICAgICBmb2N1czogamVzdC5mbigpLFxuICAgICAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcjogamVzdC5mbigpLFxuICAgICAgICAgICAgc3R5bGU6IHt9LFxuICAgICAgICAgICAgc2Nyb2xsSGVpZ2h0OiAyMDUsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCBpbml0U3B5ID0gamVzdC5zcHlPbihlbGVtZW50LCAnaW5pdGlhbGl6ZURlZmF1bHQnKTtcbiAgICAgICAgICBjb25zdCBzYXZlVmFsdWVTcHkgPSBqZXN0LnNweU9uKGVsZW1lbnQsICdzYXZlVmFsdWUnKTtcbiAgICAgICAgICBjb25zdCB0b2dnbGVTcHkgPSBqZXN0LnNweU9uKGVsZW1lbnQsICd0b2dnbGVUZXh0YXJlYScpO1xuXG4gICAgICAgICAgZWxlbWVudC5oYW5kbGVEYmxDbGljayhudWxsLCB0ZXh0KTtcblxuICAgICAgICAgIGV4cGVjdCh0b2dnbGVTcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHRleHQuaWQsIHRydWUpO1xuXG4gICAgICAgICAgZXhwZWN0KHRleHRhcmVhTm9kZS52YWx1ZSkudG9FcXVhbCgnZm9vIGJhcicpO1xuICAgICAgICAgIGV4cGVjdCh0ZXh0YXJlYU5vZGUuc3R5bGUpLnRvRXF1YWwoe1xuICAgICAgICAgICAgYmFja2dyb3VuZDogJ25vbmUnLFxuICAgICAgICAgICAgYm9yZGVyOiAnbm9uZScsXG4gICAgICAgICAgICBjb2xvcjogJ2dyZWVuJyxcbiAgICAgICAgICAgIGZvbnRGYW1pbHk6ICdGb29CYXJGYW1pbHknLFxuICAgICAgICAgICAgZm9udFNpemU6ICcxNnB4JyxcbiAgICAgICAgICAgIGhlaWdodDogJzIwOHB4JyxcbiAgICAgICAgICAgIGxlZnQ6ICcyMDBweCcsXG4gICAgICAgICAgICBsaW5lSGVpZ2h0OiAnNDBweCcsXG4gICAgICAgICAgICBtYXJnaW46ICcwcHgnLFxuICAgICAgICAgICAgb3V0bGluZTogJ25vbmUnLFxuICAgICAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICAgICAgcGFkZGluZzogJzBweCcsXG4gICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgIHJlc2l6ZTogJ25vbmUnLFxuICAgICAgICAgICAgdG9wOiAnMjAwcHgnLFxuICAgICAgICAgICAgdHJhbnNmb3JtT3JpZ2luOiAnbGVmdCB0b3AnLFxuICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTBweCknLFxuICAgICAgICAgICAgd2lkdGg6ICcyMDBweCcsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBleHBlY3QodGV4dGFyZWFOb2RlLmZvY3VzKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgICAgZXhwZWN0KHN0YWdlLm9uKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgICAgZXhwZWN0KGluaXRTcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdnY2lmcWhoaW1mOGsyZDZnOGhzJywgZmFsc2UpO1xuICAgICAgICAgIGV4cGVjdChmb3JjZVVwZGF0ZSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgICAgIGV4cGVjdCh0ZXh0YXJlYU5vZGUuYWRkRXZlbnRMaXN0ZW5lci5tb2NrLmNhbGxzWzBdWzBdKS50b0VxdWFsKCdrZXlkb3duJyk7XG4gICAgICAgICAgZXhwZWN0KHRleHRhcmVhTm9kZS5hZGRFdmVudExpc3RlbmVyLm1vY2suY2FsbHNbMV1bMF0pLnRvRXF1YWwoJ2JsdXInKTtcblxuICAgICAgICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgICAgICAga2V5Q29kZTogMTMsXG4gICAgICAgICAgICBzaGlmdEtleTogdHJ1ZSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdGV4dGFyZWFOb2RlLmFkZEV2ZW50TGlzdGVuZXIubW9jay5jYWxsc1swXVsxXShldmVudCk7XG5cbiAgICAgICAgICAvLyBNYWtlIHN1cmUgaXQncyBub3QgY2FsbGVkIHRoZSBzZWNvbmQgdGltZVxuICAgICAgICAgIGV4cGVjdCh0b2dnbGVTcHkpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgICAgICBleHBlY3Qoc2F2ZVZhbHVlU3B5KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuXG4gICAgICAgICAgZXZlbnQuc2hpZnRLZXkgPSBmYWxzZTtcblxuICAgICAgICAgIHRleHRhcmVhTm9kZS5hZGRFdmVudExpc3RlbmVyLm1vY2suY2FsbHNbMF1bMV0oZXZlbnQpO1xuXG4gICAgICAgICAgZXhwZWN0KHRvZ2dsZVNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2djaWZxaGhpbWY4azJkNmc4aHMnLCBmYWxzZSk7XG4gICAgICAgICAgZXhwZWN0KHNhdmVWYWx1ZVNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2djaWZxaGhpbWY4azJkNmc4aHMnLCB0ZXh0Tm9kZSwgdGV4dGFyZWFOb2RlKTtcblxuICAgICAgICAgIGV2ZW50LmtleUNvZGUgPSAyNztcblxuICAgICAgICAgIHRleHRhcmVhTm9kZS5hZGRFdmVudExpc3RlbmVyLm1vY2suY2FsbHNbMF1bMV0oZXZlbnQpO1xuXG4gICAgICAgICAgZXhwZWN0KHRvZ2dsZVNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2djaWZxaGhpbWY4azJkNmc4aHMnLCBmYWxzZSk7XG5cbiAgICAgICAgICBjb25zdCBzaG93VGV4dFNweSA9IGplc3Quc3B5T24oZWxlbWVudCwgJ3Nob3dPbmx5VGV4dE5vZGVzJyk7XG5cbiAgICAgICAgICBldmVudC50YXJnZXQgPSBzdGFnZTtcblxuICAgICAgICAgIHN0YWdlLm9uLm1vY2suY2FsbHNbMF1bMV0oZXZlbnQpO1xuXG4gICAgICAgICAgZXhwZWN0KHNob3dUZXh0U3B5KS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgICAgZXhwZWN0KHNhdmVWYWx1ZVNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2djaWZxaGhpbWY4azJkNmc4aHMnLCB0ZXh0Tm9kZSwgdGV4dGFyZWFOb2RlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ2hhbmRsZVRyYW5zZm9ybScsICgpID0+IHtcbiAgICAgICAgaXQoJ3Nob3VsZCBjaGFuZ2UgYXR0cnMgd2hlbiBjYWxsZWQnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSAoZWxlbWVudFtgdGV4dF9nY2lmcWhoaW1mOGsyZDZnOGhzYF0gPSB7XG4gICAgICAgICAgICBzZXRBdHRyczogamVzdC5mbigpLFxuICAgICAgICAgICAgd2lkdGg6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoMTAwKSxcbiAgICAgICAgICAgIHNjYWxlWDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgxKSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGVsZW1lbnQuaGFuZGxlVHJhbnNmb3JtKG51bGwsICd0ZXh0X2djaWZxaGhpbWY4azJkNmc4aHMnKTtcblxuICAgICAgICAgIGV4cGVjdCh0ZXh0Tm9kZS5zZXRBdHRycykudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgICAgICAgICAgd2lkdGg6IDEwMCxcbiAgICAgICAgICAgIHNjYWxlWDogMSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ3NldEluaXRpYWxQcm9wcycsICgpID0+IHtcbiAgICAgICAgaXQoJ3Nob3VsZCBzZXQgdGhlIHByb3BzIGlmIG5vdCBzZXQgYWxyZWFkeScsICgpID0+IHtcbiAgICAgICAgICBlbGVtZW50LnByb3BzID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgZWxlbWVudC5zZXRJbml0aWFsUHJvcHMocHJvcHMpO1xuXG4gICAgICAgICAgZXhwZWN0KGVsZW1lbnQucHJvcHMpLnRvRXF1YWwocHJvcHMpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgncmVuZGVyJywgKCkgPT4ge1xuICAgICAgICBpdCgnc2hvdWxkIHNldCB0aGUgc3RhZ2UgbGlzdGVuZXIgb25seSBvbmNlJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNlcGFyYXRlU3RhZ2UgPSB7XG4gICAgICAgICAgICBvbjogamVzdC5mbigpLFxuICAgICAgICAgICAgb2ZmOiBqZXN0LmZuKCksXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBuZXdQcm9wcyA9IHtcbiAgICAgICAgICAgIC4uLmNsb25lRGVlcChwcm9wcyksXG4gICAgICAgICAgICBzdGFnZTogc2VwYXJhdGVTdGFnZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IG5ld0VsZW1lbnQgPSBuZXcgZHJhd2FibGVDbGFzc2VzWydEcmF3YWJsZVRleHQnXShuZXdQcm9wcyk7XG5cbiAgICAgICAgICBleHBlY3QobmV3RWxlbWVudC5zdGFnZSkudG9FcXVhbCh1bmRlZmluZWQpO1xuXG4gICAgICAgICAgbmV3RWxlbWVudC5yZW5kZXIobmV3UHJvcHMpO1xuICAgICAgICAgIGV4cGVjdChuZXdFbGVtZW50LnN0YWdlKS50b0VxdWFsKHNlcGFyYXRlU3RhZ2UpO1xuXG4gICAgICAgICAgbmV3RWxlbWVudC5yZW5kZXIobmV3UHJvcHMpO1xuXG4gICAgICAgICAgZXhwZWN0KHNlcGFyYXRlU3RhZ2Uub24ubW9jay5jYWxscy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFVBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLGlCQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxhQUFBLEdBQUFMLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSyxrQkFBQSxHQUFBTixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQU0sZUFBQSxHQUFBUCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQU8sZUFBQSxHQUFBUixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVEsYUFBQSxH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