@pie-element/hotspot 4.10.16-next.1 → 4.11.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 (52) hide show
  1. package/CHANGELOG.md +88 -0
  2. package/LICENSE.md +5 -0
  3. package/configure/CHANGELOG.md +75 -0
  4. package/configure/lib/button.js +1 -1
  5. package/configure/lib/defaults.js +3 -2
  6. package/configure/lib/defaults.js.map +1 -1
  7. package/configure/lib/hotspot-container.js +1 -1
  8. package/configure/lib/hotspot-drawable.js +2 -2
  9. package/configure/lib/hotspot-palette.js +1 -1
  10. package/configure/lib/hotspot-polygon.js +1 -1
  11. package/configure/lib/hotspot-rectangle.js +1 -1
  12. package/configure/lib/index.js +1 -1
  13. package/configure/lib/root.js +23 -18
  14. package/configure/lib/root.js.map +1 -1
  15. package/configure/lib/upload-control.js +1 -1
  16. package/configure/lib/utils.js +14 -2
  17. package/configure/lib/utils.js.map +1 -1
  18. package/configure/package.json +3 -3
  19. package/configure/src/__tests__/__snapshots__/root.test.js.snap +32 -4
  20. package/configure/src/defaults.js +2 -1
  21. package/configure/src/hotspot-drawable.jsx +1 -1
  22. package/configure/src/root.jsx +33 -26
  23. package/configure/src/utils.js +23 -1
  24. package/controller/CHANGELOG.md +12 -0
  25. package/controller/lib/defaults.js +1 -1
  26. package/controller/lib/index.js +1 -1
  27. package/controller/lib/index.js.map +1 -1
  28. package/controller/lib/utils.js +1 -1
  29. package/controller/package.json +1 -1
  30. package/lib/hotspot/container.js +1 -1
  31. package/lib/hotspot/icons.js +1 -1
  32. package/lib/hotspot/image.js +1 -1
  33. package/lib/hotspot/index.js +1 -1
  34. package/lib/hotspot/polygon.js +1 -1
  35. package/lib/hotspot/rectangle.js +1 -1
  36. package/lib/index.js +4 -1
  37. package/lib/session-updater.js +1 -1
  38. package/package.json +4 -4
  39. package/src/index.js +5 -0
  40. package/configure/lib/__tests__/hotspot-container.test.js +0 -281
  41. package/configure/lib/__tests__/hotspot-drawable.test.js +0 -241
  42. package/configure/lib/__tests__/index.test.js +0 -224
  43. package/configure/lib/__tests__/root.test.js +0 -443
  44. package/configure/lib/__tests__/utils.test.js +0 -335
  45. package/controller/lib/__tests__/index.test.js +0 -921
  46. package/controller/lib/__tests__/utils.test.js +0 -8
  47. package/docs/demo/pie.manifest.json +0 -11
  48. package/lib/__tests__/container-test.js +0 -185
  49. package/lib/__tests__/image-test.js +0 -63
  50. package/lib/__tests__/polygon-test.js +0 -99
  51. package/lib/__tests__/rectangle-test.js +0 -92
  52. package/lib/__tests__/session-updater-test.js +0 -78
@@ -1,443 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
6
-
7
- var _enzyme = require("enzyme");
8
-
9
- var _react = _interopRequireDefault(require("react"));
10
-
11
- var _root = require("../root");
12
-
13
- var _defaults = _interopRequireDefault(require("../defaults"));
14
-
15
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
16
-
17
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
18
-
19
- jest.mock('@pie-lib/config-ui', function () {
20
- return {
21
- choiceUtils: {
22
- firstAvailableIndex: jest.fn()
23
- },
24
- settings: {
25
- Panel: function Panel(props) {
26
- return /*#__PURE__*/_react["default"].createElement("div", props);
27
- },
28
- toggle: jest.fn(),
29
- radio: jest.fn()
30
- },
31
- layout: {
32
- ConfigLayout: function ConfigLayout(_ref) {
33
- var children = _ref.children;
34
- return /*#__PURE__*/_react["default"].createElement("div", null, children);
35
- }
36
- }
37
- };
38
- });
39
-
40
- var model = function model() {
41
- return {
42
- prompt: 'This is the question prompt',
43
- imageUrl: 'https://cdn.fluence.net/image/0240eb1455ce4c4bb6180232347b6aef_W',
44
- shapes: {
45
- rectangles: [{
46
- id: '0',
47
- height: 140,
48
- width: 130,
49
- x: 1,
50
- y: 1,
51
- correct: true
52
- }, {
53
- id: '1',
54
- height: 140,
55
- width: 130,
56
- x: 140,
57
- y: 1
58
- }, {
59
- id: '2',
60
- height: 140,
61
- width: 130,
62
- x: 280,
63
- y: 1
64
- }],
65
- polygons: [{
66
- points: [{
67
- x: 1,
68
- y: 148
69
- }, {
70
- x: 1,
71
- y: 288
72
- }, {
73
- y: 288,
74
- x: 129
75
- }, {
76
- y: 148,
77
- x: 129
78
- }],
79
- correct: true,
80
- id: '3'
81
- }, {
82
- id: '4',
83
- points: [{
84
- y: 151,
85
- x: 141
86
- }, {
87
- y: 289,
88
- x: 141
89
- }, {
90
- y: 289,
91
- x: 269
92
- }, {
93
- x: 269,
94
- y: 151
95
- }],
96
- correct: false
97
- }, {
98
- points: [{
99
- x: 279,
100
- y: 149.99999999999997
101
- }, {
102
- x: 279,
103
- y: 289
104
- }, {
105
- x: 407,
106
- y: 289
107
- }, {
108
- x: 407,
109
- y: 149.99999999999997
110
- }],
111
- correct: false,
112
- id: '5'
113
- }]
114
- },
115
- dimensions: {
116
- height: 300,
117
- width: 400
118
- },
119
- hotspotColor: 'rgba(137, 183, 244, 0.65)',
120
- hotspotList: ['rgba(137, 183, 244, 0.65)', 'rgba(217, 30, 24, 0.65)', 'rgba(254, 241, 96, 0.65)'],
121
- outlineColor: 'blue',
122
- outlineList: ['blue', 'red', 'yellow'],
123
- configure: {},
124
- multipleCorrect: true,
125
- partialScoring: false
126
- };
127
- };
128
-
129
- describe('Root', function () {
130
- var initialModel = model();
131
- describe('render', function () {
132
- it('renders', function () {
133
- var props = {
134
- classes: {},
135
- configuration: _defaults["default"].configuration,
136
- model: initialModel
137
- };
138
- expect((0, _enzyme.shallow)( /*#__PURE__*/_react["default"].createElement(_root.Root, props))).toMatchSnapshot();
139
- });
140
- });
141
- describe('logic', function () {
142
- var w,
143
- onColorChanged = jest.fn();
144
- beforeEach(function () {
145
- w = function w(config, onUpdateImageDimension, onUpdateShapes) {
146
- var props = {
147
- classes: {},
148
- configuration: config || _defaults["default"].configuration,
149
- model: _objectSpread(_objectSpread({}, initialModel), {}, {
150
- dimensions: {
151
- width: 200,
152
- height: 300
153
- },
154
- shapes: {
155
- rectangles: [{
156
- x: 10,
157
- y: 10,
158
- height: 100,
159
- width: 100
160
- }],
161
- polygons: [{
162
- points: [{
163
- x: 0,
164
- y: 200
165
- }, {
166
- x: 200,
167
- y: 200
168
- }, {
169
- x: 100,
170
- y: 300
171
- }]
172
- }]
173
- }
174
- }),
175
- onColorChanged: onColorChanged,
176
- onUpdateImageDimension: onUpdateImageDimension,
177
- onUpdateShapes: onUpdateShapes
178
- };
179
- return (0, _enzyme.shallow)( /*#__PURE__*/_react["default"].createElement(_root.Root, props));
180
- };
181
- });
182
- describe('handleColorChange', function () {
183
- it('calls onColorChanged', function () {
184
- var wrapper = w();
185
- wrapper.instance().handleColorChange('type', 'color');
186
- expect(onColorChanged).toHaveBeenLastCalledWith('typeColor', 'color');
187
- });
188
- });
189
- describe('KEEP IMAGE ASPECT RATIO: handleOnUpdateImageDimensions: calls onUpdateImageDimension & onUpdateShapes', function () {
190
- var wrapper;
191
- var onUpdateImageDimension = jest.fn();
192
- var onUpdateShapes = jest.fn();
193
- beforeEach(function () {
194
- wrapper = w(undefined, onUpdateImageDimension, onUpdateShapes);
195
- });
196
- it('increase width with 100%:', function () {
197
- wrapper.instance().handleOnUpdateImageDimensions(400, 'width');
198
- expect(onUpdateImageDimension).toBeCalledWith({
199
- width: 400,
200
- height: 600
201
- });
202
- expect(onUpdateShapes).toBeCalledWith({
203
- rectangles: [{
204
- x: 20,
205
- y: 20,
206
- height: 200,
207
- width: 200,
208
- index: 0
209
- }],
210
- polygons: [{
211
- points: [{
212
- x: 0,
213
- y: 400
214
- }, {
215
- x: 400,
216
- y: 400
217
- }, {
218
- x: 200,
219
- y: 600
220
- }],
221
- index: 1
222
- }]
223
- });
224
- });
225
- it('decrease width with 50%', function () {
226
- wrapper.instance().handleOnUpdateImageDimensions(100, 'width');
227
- expect(onUpdateImageDimension).toBeCalledWith({
228
- width: 100,
229
- height: 150
230
- });
231
- expect(onUpdateShapes).toBeCalledWith({
232
- rectangles: [{
233
- x: 5,
234
- y: 5,
235
- height: 50,
236
- width: 50,
237
- index: 0
238
- }],
239
- polygons: [{
240
- points: [{
241
- x: 0,
242
- y: 100
243
- }, {
244
- x: 100,
245
- y: 100
246
- }, {
247
- x: 50,
248
- y: 150
249
- }],
250
- index: 1
251
- }]
252
- });
253
- });
254
- it('increase height with 50%:', function () {
255
- wrapper.instance().handleOnUpdateImageDimensions(450, 'height');
256
- expect(onUpdateImageDimension).toBeCalledWith({
257
- width: 300,
258
- height: 450
259
- });
260
- expect(onUpdateShapes).toBeCalledWith({
261
- rectangles: [{
262
- x: 15,
263
- y: 15,
264
- height: 150,
265
- width: 150,
266
- index: 0
267
- }],
268
- polygons: [{
269
- points: [{
270
- x: 0,
271
- y: 300
272
- }, {
273
- x: 300,
274
- y: 300
275
- }, {
276
- x: 150,
277
- y: 450
278
- }],
279
- index: 1
280
- }]
281
- });
282
- });
283
- it('decrease height with 10%', function () {
284
- wrapper.instance().handleOnUpdateImageDimensions(270, 'height');
285
- expect(onUpdateImageDimension).toBeCalledWith({
286
- width: 180,
287
- height: 270
288
- });
289
- expect(onUpdateShapes).toBeCalledWith({
290
- rectangles: [{
291
- x: 9,
292
- y: 9,
293
- height: 90,
294
- width: 90,
295
- index: 0
296
- }],
297
- polygons: [{
298
- points: [{
299
- x: 0,
300
- y: 180
301
- }, {
302
- x: 180,
303
- y: 180
304
- }, {
305
- x: 90,
306
- y: 270
307
- }],
308
- index: 1
309
- }]
310
- });
311
- });
312
- });
313
- describe('DO NOT KEEP IMAGE ASPECT RATIO: handleOnUpdateImageDimensions: calls onUpdateImageDimension & onUpdateShapes', function () {
314
- var wrapper;
315
- var onUpdateImageDimension = jest.fn();
316
- var onUpdateShapes = jest.fn();
317
- beforeEach(function () {
318
- wrapper = w(_objectSpread(_objectSpread({}, _defaults["default"].configuration), {}, {
319
- preserveAspectRatio: {
320
- enabled: false
321
- }
322
- }), onUpdateImageDimension, onUpdateShapes);
323
- });
324
- it('increase width with 100%:', function () {
325
- wrapper.instance().handleOnUpdateImageDimensions(400, 'width');
326
- expect(onUpdateImageDimension).toBeCalledWith({
327
- width: 400,
328
- height: 300
329
- });
330
- expect(onUpdateShapes).toBeCalledWith({
331
- rectangles: [{
332
- x: 20,
333
- y: 10,
334
- height: 100,
335
- width: 200,
336
- index: 0
337
- }],
338
- polygons: [{
339
- points: [{
340
- x: 0,
341
- y: 200
342
- }, {
343
- x: 400,
344
- y: 200
345
- }, {
346
- x: 200,
347
- y: 300
348
- }],
349
- index: 1
350
- }]
351
- });
352
- });
353
- it('decrease width with 50%', function () {
354
- wrapper.instance().handleOnUpdateImageDimensions(100, 'width');
355
- expect(onUpdateImageDimension).toBeCalledWith({
356
- width: 100,
357
- height: 300
358
- });
359
- expect(onUpdateShapes).toBeCalledWith({
360
- rectangles: [{
361
- x: 5,
362
- y: 10,
363
- height: 100,
364
- width: 50,
365
- index: 0
366
- }],
367
- polygons: [{
368
- points: [{
369
- x: 0,
370
- y: 200
371
- }, {
372
- x: 100,
373
- y: 200
374
- }, {
375
- x: 50,
376
- y: 300
377
- }],
378
- index: 1
379
- }]
380
- });
381
- });
382
- it('increase height with 50%:', function () {
383
- wrapper.instance().handleOnUpdateImageDimensions(450, 'height');
384
- expect(onUpdateImageDimension).toBeCalledWith({
385
- width: 200,
386
- height: 450
387
- });
388
- expect(onUpdateShapes).toBeCalledWith({
389
- rectangles: [{
390
- x: 10,
391
- y: 15,
392
- height: 150,
393
- width: 100,
394
- index: 0
395
- }],
396
- polygons: [{
397
- index: 1,
398
- points: [{
399
- x: 0,
400
- y: 300
401
- }, {
402
- x: 200,
403
- y: 300
404
- }, {
405
- x: 100,
406
- y: 450
407
- }]
408
- }]
409
- });
410
- });
411
- it('decrease height with 10%', function () {
412
- wrapper.instance().handleOnUpdateImageDimensions(270, 'height');
413
- expect(onUpdateImageDimension).toBeCalledWith({
414
- width: 200,
415
- height: 270
416
- });
417
- expect(onUpdateShapes).toBeCalledWith({
418
- rectangles: [{
419
- x: 10,
420
- y: 9,
421
- height: 90,
422
- width: 100,
423
- index: 0
424
- }],
425
- polygons: [{
426
- points: [{
427
- x: 0,
428
- y: 180
429
- }, {
430
- x: 200,
431
- y: 180
432
- }, {
433
- x: 100,
434
- y: 270
435
- }],
436
- index: 1
437
- }]
438
- });
439
- });
440
- });
441
- });
442
- });
443
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vcm9vdC50ZXN0LmpzIl0sIm5hbWVzIjpbImplc3QiLCJtb2NrIiwiY2hvaWNlVXRpbHMiLCJmaXJzdEF2YWlsYWJsZUluZGV4IiwiZm4iLCJzZXR0aW5ncyIsIlBhbmVsIiwicHJvcHMiLCJ0b2dnbGUiLCJyYWRpbyIsImxheW91dCIsIkNvbmZpZ0xheW91dCIsImNoaWxkcmVuIiwibW9kZWwiLCJwcm9tcHQiLCJpbWFnZVVybCIsInNoYXBlcyIsInJlY3RhbmdsZXMiLCJpZCIsImhlaWdodCIsIndpZHRoIiwieCIsInkiLCJjb3JyZWN0IiwicG9seWdvbnMiLCJwb2ludHMiLCJkaW1lbnNpb25zIiwiaG90c3BvdENvbG9yIiwiaG90c3BvdExpc3QiLCJvdXRsaW5lQ29sb3IiLCJvdXRsaW5lTGlzdCIsImNvbmZpZ3VyZSIsIm11bHRpcGxlQ29ycmVjdCIsInBhcnRpYWxTY29yaW5nIiwiZGVzY3JpYmUiLCJpbml0aWFsTW9kZWwiLCJpdCIsImNsYXNzZXMiLCJjb25maWd1cmF0aW9uIiwiZGVmYXVsdFZhbHVlcyIsImV4cGVjdCIsInRvTWF0Y2hTbmFwc2hvdCIsInciLCJvbkNvbG9yQ2hhbmdlZCIsImJlZm9yZUVhY2giLCJjb25maWciLCJvblVwZGF0ZUltYWdlRGltZW5zaW9uIiwib25VcGRhdGVTaGFwZXMiLCJ3cmFwcGVyIiwiaW5zdGFuY2UiLCJoYW5kbGVDb2xvckNoYW5nZSIsInRvSGF2ZUJlZW5MYXN0Q2FsbGVkV2l0aCIsInVuZGVmaW5lZCIsImhhbmRsZU9uVXBkYXRlSW1hZ2VEaW1lbnNpb25zIiwidG9CZUNhbGxlZFdpdGgiLCJpbmRleCIsInByZXNlcnZlQXNwZWN0UmF0aW8iLCJlbmFibGVkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7O0FBRUFBLElBQUksQ0FBQ0MsSUFBTCxDQUFVLG9CQUFWLEVBQWdDO0FBQUEsU0FBTztBQUNyQ0MsSUFBQUEsV0FBVyxF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O0FBQWIsYUFBbkIsRUFBdUM7QUFBRUQsY0FBQUEsQ0FBQyxFQUFFLEdBQUw7QUFBVUMsY0FBQUEsQ0FBQyxFQUFFO0FBQWIsYUFBdkMsQ0FEQztBQUVUaUMsWUFBQUEsS0FBSyxFQUFFO0FBRkUsV0FBRDtBQUZ3QixTQUF0QztBQVFELE9BZkMsQ0FBRjtBQWdCRCxLQTlFTyxDQUFSO0FBK0VELEdBekxPLENBQVI7QUEwTEQsQ0F6TU8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNoYWxsb3cgfSBmcm9tICdlbnp5bWUnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFJvb3QgfSBmcm9tICcuLi9yb290JztcbmltcG9ydCBkZWZhdWx0VmFsdWVzIGZyb20gJy4uL2RlZmF1bHRzJztcblxuamVzdC5tb2NrKCdAcGllLWxpYi9jb25maWctdWknLCAoKSA9PiAoe1xuICBjaG9pY2VVdGlsczoge1xuICAgIGZpcnN0QXZhaWxhYmxlSW5kZXg6IGplc3QuZm4oKVxuICB9LFxuICBzZXR0aW5nczoge1xuICAgIFBhbmVsOiBwcm9wcyA9PiA8ZGl2IHsuLi5wcm9wc30gLz4sXG4gICAgdG9nZ2xlOiBqZXN0LmZuKCksXG4gICAgcmFkaW86IGplc3QuZm4oKVxuICB9LFxuICBsYXlvdXQ6IHtcbiAgICBDb25maWdMYXlvdXQ6ICh7IGNoaWxkcmVuIH0pID0+IDxkaXY+e2NoaWxkcmVufTwvZGl2PlxuICB9XG59KSk7XG5cbmNvbnN0IG1vZGVsID0gKCkgPT4gKHtcbiAgcHJvbXB0OiAnVGhpcyBpcyB0aGUgcXVlc3Rpb24gcHJvbXB0JyxcbiAgaW1hZ2VVcmw6ICdodHRwczovL2Nkbi5mbHVlbmNlLm5ldC9pbWFnZS8wMjQwZWIxNDU1Y2U0YzRiYjYxODAyMzIzNDdiNmFlZl9XJyxcbiAgc2hhcGVzOiB7XG4gICAgcmVjdGFuZ2xlczogW1xuICAgICAge1xuICAgICAgICBpZDogJzAnLFxuICAgICAgICBoZWlnaHQ6IDE0MCxcbiAgICAgICAgd2lkdGg6IDEzMCxcbiAgICAgICAgeDogMSxcbiAgICAgICAgeTogMSxcbiAgICAgICAgY29ycmVjdDogdHJ1ZVxuICAgICAgfSwge1xuICAgICAgICBpZDogJzEnLFxuICAgICAgICBoZWlnaHQ6IDE0MCxcbiAgICAgICAgd2lkdGg6IDEzMCxcbiAgICAgICAgeDogMTQwLFxuICAgICAgICB5OiAxXG4gICAgICB9LCB7XG4gICAgICAgIGlkOiAnMicsXG4gICAgICAgIGhlaWdodDogMTQwLFxuICAgICAgICB3aWR0aDogMTMwLFxuICAgICAgICB4OiAyODAsXG4gICAgICAgIHk6IDFcbiAgICAgIH1cbiAgICBdLFxuICAgIHBvbHlnb25zOiBbXG4gICAgICB7XG4gICAgICAgIHBvaW50czogW3sgeDogMSwgeTogMTQ4IH0sIHsgeDogMSwgeTogMjg4IH0sIHsgeTogMjg4LCB4OiAxMjkgfSwgeyB5OiAxNDgsIHg6IDEyOSB9XSxcbiAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgaWQ6ICczJ1xuICAgICAgfSwge1xuICAgICAgICBpZDogJzQnLFxuICAgICAgICBwb2ludHM6IFt7IHk6IDE1MSwgeDogMTQxIH0sIHsgeTogMjg5LCB4OiAxNDEgfSwgeyB5OiAyODksIHg6IDI2OSB9LCB7IHg6IDI2OSwgeTogMTUxIH1dLFxuICAgICAgICBjb3JyZWN0OiBmYWxzZVxuICAgICAgfSwge1xuICAgICAgICBwb2ludHM6IFt7IHg6IDI3OSwgeTogMTQ5Ljk5OTk5OTk5OTk5OTk3IH0sIHsgeDogMjc5LCB5OiAyODkgfSwgeyB4OiA0MDcsIHk6IDI4OSB9LCB7XG4gICAgICAgICAgeDogNDA3LFxuICAgICAgICAgIHk6IDE0OS45OTk5OTk5OTk5OTk5N1xuICAgICAgICB9XSwgY29ycmVjdDogZmFsc2UsIGlkOiAnNSdcbiAgICAgIH1dXG4gIH0sXG4gIGRpbWVuc2lvbnM6IHsgaGVpZ2h0OiAzMDAsIHdpZHRoOiA0MDAgfSxcbiAgaG90c3BvdENvbG9yOiAncmdiYSgxMzcsIDE4MywgMjQ0LCAwLjY1KScsXG4gIGhvdHNwb3RMaXN0OiBbXG4gICAgJ3JnYmEoMTM3LCAxODMsIDI0NCwgMC42NSknLFxuICAgICdyZ2JhKDIxNywgMzAsIDI0LCAwLjY1KScsXG4gICAgJ3JnYmEoMjU0LCAyNDEsIDk2LCAwLjY1KSdcbiAgXSxcbiAgb3V0bGluZUNvbG9yOiAnYmx1ZScsXG4gIG91dGxpbmVMaXN0OiBbJ2JsdWUnLCAncmVkJywgJ3llbGxvdyddLFxuICBjb25maWd1cmU6IHt9LFxuICBtdWx0aXBsZUNvcnJlY3Q6IHRydWUsXG4gIHBhcnRpYWxTY29yaW5nOiBmYWxzZSxcbn0pO1xuXG5kZXNjcmliZSgnUm9vdCcsICgpID0+IHtcbiAgbGV0IGluaXRpYWxNb2RlbCA9IG1vZGVsKCk7XG5cbiAgZGVzY3JpYmUoJ3JlbmRlcicsICgpID0+IHtcbiAgICBpdCgncmVuZGVycycsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICBjbGFzc2VzOiB7fSxcbiAgICAgICAgY29uZmlndXJhdGlvbjogZGVmYXVsdFZhbHVlcy5jb25maWd1cmF0aW9uLFxuICAgICAgICBtb2RlbDogaW5pdGlhbE1vZGVsLFxuICAgICAgfTtcblxuICAgICAgZXhwZWN0KHNoYWxsb3coPFJvb3Qgey4uLnByb3BzfSAvPikpLnRvTWF0Y2hTbmFwc2hvdCgpO1xuICAgIH0pXG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdsb2dpYycsICgpID0+IHtcbiAgICBsZXQgdywgb25Db2xvckNoYW5nZWQgPSBqZXN0LmZuKCk7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIHcgPSAoY29uZmlnLCBvblVwZGF0ZUltYWdlRGltZW5zaW9uLCBvblVwZGF0ZVNoYXBlcykgPT4ge1xuICAgICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgICBjbGFzc2VzOiB7fSxcbiAgICAgICAgICBjb25maWd1cmF0aW9uOiBjb25maWcgfHwgZGVmYXVsdFZhbHVlcy5jb25maWd1cmF0aW9uLFxuICAgICAgICAgIG1vZGVsOiB7XG4gICAgICAgICAgICAuLi5pbml0aWFsTW9kZWwsXG4gICAgICAgICAgICBkaW1lbnNpb25zOiB7IHdpZHRoOiAyMDAsIGhlaWdodDogMzAwIH0sXG4gICAgICAgICAgICBzaGFwZXM6IHtcbiAgICAgICAgICAgICAgcmVjdGFuZ2xlczogW3sgeDogMTAsIHk6IDEwLCBoZWlnaHQ6IDEwMCwgd2lkdGg6IDEwMCB9XSxcbiAgICAgICAgICAgICAgcG9seWdvbnM6IFt7XG4gICAgICAgICAgICAgICAgcG9pbnRzOiBbeyB4OiAwLCB5OiAyMDAgfSwgeyB4OiAyMDAsIHk6IDIwMCB9LCB7IHg6IDEwMCwgeTogMzAwIH1dXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkNvbG9yQ2hhbmdlZCxcbiAgICAgICAgICBvblVwZGF0ZUltYWdlRGltZW5zaW9uLFxuICAgICAgICAgIG9uVXBkYXRlU2hhcGVzLFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBzaGFsbG93KDxSb290IHsuLi5wcm9wc30gLz4pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2hhbmRsZUNvbG9yQ2hhbmdlJywgKCkgPT4ge1xuICAgICAgaXQoJ2NhbGxzIG9uQ29sb3JDaGFuZ2VkJywgKCkgPT4ge1xuICAgICAgICBsZXQgd3JhcHBlciA9IHcoKTtcbiAgICAgICAgd3JhcHBlci5pbnN0YW5jZSgpLmhhbmRsZUNvbG9yQ2hhbmdlKCd0eXBlJywgJ2NvbG9yJyk7XG5cbiAgICAgICAgZXhwZWN0KG9uQ29sb3JDaGFuZ2VkKS50b0hhdmVCZWVuTGFzdENhbGxlZFdpdGgoJ3R5cGVDb2xvcicsICdjb2xvcicpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnS0VFUCBJTUFHRSBBU1BFQ1QgUkFUSU86IGhhbmRsZU9uVXBkYXRlSW1hZ2VEaW1lbnNpb25zOiBjYWxscyBvblVwZGF0ZUltYWdlRGltZW5zaW9uICYgb25VcGRhdGVTaGFwZXMnLCAoKSA9PiB7XG4gICAgICBsZXQgd3JhcHBlcjtcbiAgICAgIGxldCBvblVwZGF0ZUltYWdlRGltZW5zaW9uID0gamVzdC5mbigpO1xuICAgICAgbGV0IG9uVXBkYXRlU2hhcGVzID0gamVzdC5mbigpO1xuXG4gICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgd3JhcHBlciA9IHcodW5kZWZpbmVkLCBvblVwZGF0ZUltYWdlRGltZW5zaW9uLCBvblVwZGF0ZVNoYXBlcyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2luY3JlYXNlIHdpZHRoIHdpdGggMTAwJTonLCAoKSA9PiB7XG4gICAgICAgIHdyYXBwZXIuaW5zdGFuY2UoKS5oYW5kbGVPblVwZGF0ZUltYWdlRGltZW5zaW9ucyg0MDAsICd3aWR0aCcpO1xuXG4gICAgICAgIGV4cGVjdChvblVwZGF0ZUltYWdlRGltZW5zaW9uKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgd2lkdGg6IDQwMCxcbiAgICAgICAgICBoZWlnaHQ6IDYwMFxuICAgICAgICB9KTtcbiAgICAgICAgZXhwZWN0KG9uVXBkYXRlU2hhcGVzKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgcmVjdGFuZ2xlczogW3sgeDogMjAsIHk6IDIwLCBoZWlnaHQ6IDIwMCwgd2lkdGg6IDIwMCwgaW5kZXg6IDAgfV0sXG4gICAgICAgICAgcG9seWdvbnM6IFt7XG4gICAgICAgICAgICBwb2ludHM6IFt7IHg6IDAsIHk6IDQwMCB9LCB7IHg6IDQwMCwgeTogNDAwIH0sIHsgeDogMjAwLCB5OiA2MDAgfV0sIGluZGV4OiAxXG4gICAgICAgICAgfV1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2RlY3JlYXNlIHdpZHRoIHdpdGggNTAlJywgKCkgPT4ge1xuICAgICAgICB3cmFwcGVyLmluc3RhbmNlKCkuaGFuZGxlT25VcGRhdGVJbWFnZURpbWVuc2lvbnMoMTAwLCAnd2lkdGgnKTtcblxuICAgICAgICBleHBlY3Qob25VcGRhdGVJbWFnZURpbWVuc2lvbikudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIHdpZHRoOiAxMDAsXG4gICAgICAgICAgaGVpZ2h0OiAxNTBcbiAgICAgICAgfSk7XG4gICAgICAgIGV4cGVjdChvblVwZGF0ZVNoYXBlcykudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIHJlY3RhbmdsZXM6IFt7IHg6IDUsIHk6IDUsIGhlaWdodDogNTAsIHdpZHRoOiA1MCwgaW5kZXg6IDAgfV0sXG4gICAgICAgICAgcG9seWdvbnM6IFt7XG4gICAgICAgICAgICBwb2ludHM6IFt7IHg6IDAsIHk6IDEwMCB9LCB7IHg6IDEwMCwgeTogMTAwIH0sIHsgeDogNTAsIHk6IDE1MCB9XSwgaW5kZXg6IDFcbiAgICAgICAgICB9XVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnaW5jcmVhc2UgaGVpZ2h0IHdpdGggNTAlOicsICgpID0+IHtcbiAgICAgICAgd3JhcHBlci5pbnN0YW5jZSgpLmhhbmRsZU9uVXBkYXRlSW1hZ2VEaW1lbnNpb25zKDQ1MCwgJ2hlaWdodCcpO1xuXG4gICAgICAgIGV4cGVjdChvblVwZGF0ZUltYWdlRGltZW5zaW9uKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgd2lkdGg6IDMwMCxcbiAgICAgICAgICBoZWlnaHQ6IDQ1MFxuICAgICAgICB9KTtcbiAgICAgICAgZXhwZWN0KG9uVXBkYXRlU2hhcGVzKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgcmVjdGFuZ2xlczogW3sgeDogMTUsIHk6IDE1LCBoZWlnaHQ6IDE1MCwgd2lkdGg6IDE1MCwgaW5kZXg6IDAgfV0sXG4gICAgICAgICAgcG9seWdvbnM6IFt7XG4gICAgICAgICAgICBwb2ludHM6IFt7IHg6IDAsIHk6IDMwMCB9LCB7IHg6IDMwMCwgeTogMzAwIH0sIHsgeDogMTUwLCB5OiA0NTAgfV0sIGluZGV4OiAxXG4gICAgICAgICAgfV1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2RlY3JlYXNlIGhlaWdodCB3aXRoIDEwJScsICgpID0+IHtcbiAgICAgICAgd3JhcHBlci5pbnN0YW5jZSgpLmhhbmRsZU9uVXBkYXRlSW1hZ2VEaW1lbnNpb25zKDI3MCwgJ2hlaWdodCcpO1xuXG4gICAgICAgIGV4cGVjdChvblVwZGF0ZUltYWdlRGltZW5zaW9uKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgd2lkdGg6IDE4MCxcbiAgICAgICAgICBoZWlnaHQ6IDI3MFxuICAgICAgICB9KTtcbiAgICAgICAgZXhwZWN0KG9uVXBkYXRlU2hhcGVzKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgcmVjdGFuZ2xlczogW3sgeDogOSwgeTogOSwgaGVpZ2h0OiA5MCwgd2lkdGg6IDkwLCBpbmRleDogMCB9XSxcbiAgICAgICAgICBwb2x5Z29uczogW3tcbiAgICAgICAgICAgIHBvaW50czogW3sgeDogMCwgeTogMTgwIH0sIHsgeDogMTgwLCB5OiAxODAgfSwgeyB4OiA5MCwgeTogMjcwIH1dLCBpbmRleDogMVxuICAgICAgICAgIH1dXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnRE8gTk9UIEtFRVAgSU1BR0UgQVNQRUNUIFJBVElPOiBoYW5kbGVPblVwZGF0ZUltYWdlRGltZW5zaW9uczogY2FsbHMgb25VcGRhdGVJbWFnZURpbWVuc2lvbiAmIG9uVXBkYXRlU2hhcGVzJywgKCkgPT4ge1xuICAgICAgbGV0IHdyYXBwZXI7XG4gICAgICBsZXQgb25VcGRhdGVJbWFnZURpbWVuc2lvbiA9IGplc3QuZm4oKTtcbiAgICAgIGxldCBvblVwZGF0ZVNoYXBlcyA9IGplc3QuZm4oKTtcblxuICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIHdyYXBwZXIgPSB3KHtcbiAgICAgICAgICAuLi5kZWZhdWx0VmFsdWVzLmNvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbzoge1xuICAgICAgICAgICAgZW5hYmxlZDogZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0sIG9uVXBkYXRlSW1hZ2VEaW1lbnNpb24sIG9uVXBkYXRlU2hhcGVzKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnaW5jcmVhc2Ugd2lkdGggd2l0aCAxMDAlOicsICgpID0+IHtcbiAgICAgICAgd3JhcHBlci5pbnN0YW5jZSgpLmhhbmRsZU9uVXBkYXRlSW1hZ2VEaW1lbnNpb25zKDQwMCwgJ3dpZHRoJyk7XG5cbiAgICAgICAgZXhwZWN0KG9uVXBkYXRlSW1hZ2VEaW1lbnNpb24pLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICB3aWR0aDogNDAwLFxuICAgICAgICAgIGhlaWdodDogMzAwXG4gICAgICAgIH0pO1xuICAgICAgICBleHBlY3Qob25VcGRhdGVTaGFwZXMpLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICByZWN0YW5nbGVzOiBbeyB4OiAyMCwgeTogMTAsIGhlaWdodDogMTAwLCB3aWR0aDogMjAwLCBpbmRleDogMCB9XSxcbiAgICAgICAgICBwb2x5Z29uczogW3tcbiAgICAgICAgICAgIHBvaW50czogW3sgeDogMCwgeTogMjAwIH0sIHsgeDogNDAwLCB5OiAyMDAgfSwgeyB4OiAyMDAsIHk6IDMwMCB9XSwgaW5kZXg6IDFcbiAgICAgICAgICB9XVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnZGVjcmVhc2Ugd2lkdGggd2l0aCA1MCUnLCAoKSA9PiB7XG4gICAgICAgIHdyYXBwZXIuaW5zdGFuY2UoKS5oYW5kbGVPblVwZGF0ZUltYWdlRGltZW5zaW9ucygxMDAsICd3aWR0aCcpO1xuXG4gICAgICAgIGV4cGVjdChvblVwZGF0ZUltYWdlRGltZW5zaW9uKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgd2lkdGg6IDEwMCxcbiAgICAgICAgICBoZWlnaHQ6IDMwMFxuICAgICAgICB9KTtcbiAgICAgICAgZXhwZWN0KG9uVXBkYXRlU2hhcGVzKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgICByZWN0YW5nbGVzOiBbeyB4OiA1LCB5OiAxMCwgaGVpZ2h0OiAxMDAsIHdpZHRoOiA1MCwgaW5kZXg6IDAgfV0sXG4gICAgICAgICAgICBwb2x5Z29uczogW3tcbiAgICAgICAgICAgICAgcG9pbnRzOiBbeyB4OiAwLCB5OiAyMDAgfSwgeyB4OiAxMDAsIHk6IDIwMCB9LCB7IHg6IDUwLCB5OiAzMDAgfV0sIGluZGV4OiAxXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnaW5jcmVhc2UgaGVpZ2h0IHdpdGggNTAlOicsICgpID0+IHtcbiAgICAgICAgd3JhcHBlci5pbnN0YW5jZSgpLmhhbmRsZU9uVXBkYXRlSW1hZ2VEaW1lbnNpb25zKDQ1MCwgJ2hlaWdodCcpO1xuXG4gICAgICAgIGV4cGVjdChvblVwZGF0ZUltYWdlRGltZW5zaW9uKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgd2lkdGg6IDIwMCxcbiAgICAgICAgICBoZWlnaHQ6IDQ1MFxuICAgICAgICB9KTtcbiAgICAgICAgZXhwZWN0KG9uVXBkYXRlU2hhcGVzKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgICByZWN0YW5nbGVzOiBbeyB4OiAxMCwgeTogMTUsIGhlaWdodDogMTUwLCB3aWR0aDogMTAwLCBpbmRleDogMCB9XSxcbiAgICAgICAgICAgIHBvbHlnb25zOiBbe1xuICAgICAgICAgICAgICBpbmRleDogMSxcbiAgICAgICAgICAgICAgcG9pbnRzOiBbeyB4OiAwLCB5OiAzMDAgfSwgeyB4OiAyMDAsIHk6IDMwMCB9LCB7IHg6IDEwMCwgeTogNDUwIH1dXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnZGVjcmVhc2UgaGVpZ2h0IHdpdGggMTAlJywgKCkgPT4ge1xuICAgICAgICB3cmFwcGVyLmluc3RhbmNlKCkuaGFuZGxlT25VcGRhdGVJbWFnZURpbWVuc2lvbnMoMjcwLCAnaGVpZ2h0Jyk7XG5cbiAgICAgICAgZXhwZWN0KG9uVXBkYXRlSW1hZ2VEaW1lbnNpb24pLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICB3aWR0aDogMjAwLFxuICAgICAgICAgIGhlaWdodDogMjcwXG4gICAgICAgIH0pO1xuICAgICAgICBleHBlY3Qob25VcGRhdGVTaGFwZXMpLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICAgIHJlY3RhbmdsZXM6IFt7IHg6IDEwLCB5OiA5LCBoZWlnaHQ6IDkwLCB3aWR0aDogMTAwLCBpbmRleDogMCB9XSxcbiAgICAgICAgICAgIHBvbHlnb25zOiBbe1xuICAgICAgICAgICAgICBwb2ludHM6IFt7IHg6IDAsIHk6IDE4MCB9LCB7IHg6IDIwMCwgeTogMTgwIH0sIHsgeDogMTAwLCB5OiAyNzAgfV0sXG4gICAgICAgICAgICAgIGluZGV4OiAxXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19