@pie-lib/graphing 3.2.0-next.2 → 3.2.0-next.4

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 (114) hide show
  1. package/CHANGELOG.md +18 -30
  2. package/LICENSE.md +5 -0
  3. package/lib/axis/arrow.js +1 -1
  4. package/lib/axis/axes.js +1 -1
  5. package/lib/axis/index.js +1 -1
  6. package/lib/bg.js +1 -1
  7. package/lib/container/actions.js +1 -1
  8. package/lib/container/index.js +1 -1
  9. package/lib/container/marks.js +1 -1
  10. package/lib/container/middleware.js +1 -1
  11. package/lib/container/reducer.js +1 -1
  12. package/lib/coordinates-label.js +1 -1
  13. package/lib/graph-with-controls.js +1 -1
  14. package/lib/graph.js +1 -1
  15. package/lib/grid-setup.js +1 -1
  16. package/lib/grid.js +1 -1
  17. package/lib/index.js +1 -1
  18. package/lib/key-legend.js +1 -1
  19. package/lib/label-svg-icon.js +1 -1
  20. package/lib/labels.js +1 -1
  21. package/lib/mark-label.js +1 -1
  22. package/lib/toggle-bar.js +1 -1
  23. package/lib/tool-menu.js +1 -1
  24. package/lib/tools/absolute/component.js +1 -1
  25. package/lib/tools/absolute/index.js +1 -1
  26. package/lib/tools/circle/bg-circle.js +1 -1
  27. package/lib/tools/circle/component.js +1 -1
  28. package/lib/tools/circle/index.js +1 -1
  29. package/lib/tools/exponential/component.js +1 -1
  30. package/lib/tools/exponential/index.js +1 -1
  31. package/lib/tools/index.js +1 -1
  32. package/lib/tools/line/component.js +1 -1
  33. package/lib/tools/line/index.js +1 -1
  34. package/lib/tools/parabola/component.js +1 -1
  35. package/lib/tools/parabola/index.js +1 -1
  36. package/lib/tools/point/component.js +1 -1
  37. package/lib/tools/point/index.js +1 -1
  38. package/lib/tools/polygon/component.js +1 -1
  39. package/lib/tools/polygon/index.js +1 -1
  40. package/lib/tools/polygon/line.js +1 -1
  41. package/lib/tools/polygon/polygon.js +1 -1
  42. package/lib/tools/ray/component.js +1 -1
  43. package/lib/tools/ray/index.js +1 -1
  44. package/lib/tools/segment/component.js +1 -1
  45. package/lib/tools/segment/index.js +1 -1
  46. package/lib/tools/shared/arrow-head.js +1 -1
  47. package/lib/tools/shared/icons/CorrectSVG.js +1 -1
  48. package/lib/tools/shared/icons/IncorrectSVG.js +1 -1
  49. package/lib/tools/shared/icons/MissingSVG.js +1 -1
  50. package/lib/tools/shared/line/index.js +1 -1
  51. package/lib/tools/shared/line/line-path.js +1 -1
  52. package/lib/tools/shared/line/with-root-edge.js +1 -1
  53. package/lib/tools/shared/point/arrow-point.js +1 -1
  54. package/lib/tools/shared/point/arrow.js +1 -1
  55. package/lib/tools/shared/point/base-point.js +1 -1
  56. package/lib/tools/shared/point/index.js +1 -1
  57. package/lib/tools/shared/styles.js +1 -1
  58. package/lib/tools/shared/types.js +1 -1
  59. package/lib/tools/sine/component.js +1 -1
  60. package/lib/tools/sine/index.js +1 -1
  61. package/lib/tools/vector/component.js +1 -1
  62. package/lib/tools/vector/index.js +1 -1
  63. package/lib/undo-redo.js +1 -1
  64. package/lib/use-debounce.js +1 -1
  65. package/lib/utils.js +1 -1
  66. package/package.json +4 -4
  67. package/lib/__tests__/bg.test.js +0 -282
  68. package/lib/__tests__/coordinates-label.test.js +0 -276
  69. package/lib/__tests__/graph-with-controls.test.js +0 -275
  70. package/lib/__tests__/graph.test.js +0 -927
  71. package/lib/__tests__/grid-setup.test.js +0 -729
  72. package/lib/__tests__/grid.test.js +0 -29
  73. package/lib/__tests__/key-legend.test.js +0 -321
  74. package/lib/__tests__/label-svg-icon.test.js +0 -373
  75. package/lib/__tests__/labels.test.js +0 -61
  76. package/lib/__tests__/mark-label.test.js +0 -133
  77. package/lib/__tests__/toggle-bar.test.js +0 -197
  78. package/lib/__tests__/tool-menu.test.js +0 -151
  79. package/lib/__tests__/undo-redo.test.js +0 -31
  80. package/lib/__tests__/use-debounce.test.js +0 -24
  81. package/lib/__tests__/utils.js +0 -70
  82. package/lib/__tests__/utils.test.js +0 -123
  83. package/lib/axis/__tests__/arrow.test.js +0 -60
  84. package/lib/axis/__tests__/axes.test.js +0 -195
  85. package/lib/container/__tests__/actions.test.js +0 -108
  86. package/lib/container/__tests__/index.test.js +0 -503
  87. package/lib/container/__tests__/marks.test.js +0 -259
  88. package/lib/container/__tests__/middleware.test.js +0 -244
  89. package/lib/container/__tests__/reducer.test.js +0 -450
  90. package/lib/tools/absolute/__tests__/component.test.js +0 -65
  91. package/lib/tools/circle/__tests__/bg-circle.test.js +0 -33
  92. package/lib/tools/circle/__tests__/component.test.js +0 -615
  93. package/lib/tools/circle/__tests__/index.test.js +0 -576
  94. package/lib/tools/exponential/__tests__/component.test.js +0 -64
  95. package/lib/tools/exponential/__tests__/index.test.js +0 -828
  96. package/lib/tools/line/__tests__/component.test.js +0 -45
  97. package/lib/tools/parabola/__tests__/component.test.js +0 -64
  98. package/lib/tools/parabola/__tests__/index.test.js +0 -564
  99. package/lib/tools/point/__tests__/component.test.js +0 -434
  100. package/lib/tools/point/__tests__/index.test.js +0 -262
  101. package/lib/tools/polygon/__tests__/component.test.js +0 -485
  102. package/lib/tools/polygon/__tests__/index.test.js +0 -303
  103. package/lib/tools/polygon/__tests__/line.test.js +0 -50
  104. package/lib/tools/polygon/__tests__/polygon.test.js +0 -85
  105. package/lib/tools/ray/__tests__/component.test.js +0 -35
  106. package/lib/tools/segment/__tests__/component.test.js +0 -35
  107. package/lib/tools/shared/__tests__/arrow-head.test.js +0 -45
  108. package/lib/tools/shared/line/__tests__/index.test.js +0 -124
  109. package/lib/tools/shared/line/__tests__/line-path.test.js +0 -62
  110. package/lib/tools/shared/line/__tests__/with-root-edge.test.js +0 -90
  111. package/lib/tools/shared/point/__tests__/arrow-point.test.js +0 -127
  112. package/lib/tools/shared/point/__tests__/base-point.test.js +0 -122
  113. package/lib/tools/sine/__tests__/component.test.js +0 -72
  114. package/lib/tools/vector/__tests__/component.test.js +0 -32
@@ -1,262 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _index = require("../index");
5
- var _component = _interopRequireDefault(require("../component"));
6
- describe('point tool', function () {
7
- var pointTool;
8
- beforeEach(function () {
9
- pointTool = (0, _index.tool)();
10
- });
11
- describe('tool structure', function () {
12
- it('returns an object with required properties', function () {
13
- expect(pointTool).toHaveProperty('label', 'Point');
14
- expect(pointTool).toHaveProperty('type', 'point');
15
- expect(pointTool).toHaveProperty('Component', _component["default"]);
16
- expect(pointTool).toHaveProperty('addPoint');
17
- });
18
- it('has correct label', function () {
19
- expect(pointTool.label).toBe('Point');
20
- });
21
- it('has correct type', function () {
22
- expect(pointTool.type).toBe('point');
23
- });
24
- it('uses Point component', function () {
25
- expect(pointTool.Component).toBe(_component["default"]);
26
- });
27
- it('does not have complete method', function () {
28
- expect(pointTool.complete).toBeUndefined();
29
- });
30
- });
31
- describe('addPoint', function () {
32
- it('creates a point mark from coordinates', function () {
33
- var point = {
34
- x: 1,
35
- y: 2
36
- };
37
- var result = pointTool.addPoint(point);
38
- expect(result).toEqual({
39
- type: 'point',
40
- x: 1,
41
- y: 2
42
- });
43
- });
44
- it('creates point with integer coordinates', function () {
45
- var point = {
46
- x: 5,
47
- y: 10
48
- };
49
- var result = pointTool.addPoint(point);
50
- expect(result).toEqual({
51
- type: 'point',
52
- x: 5,
53
- y: 10
54
- });
55
- });
56
- it('creates point with decimal coordinates', function () {
57
- var point = {
58
- x: 1.5,
59
- y: 2.75
60
- };
61
- var result = pointTool.addPoint(point);
62
- expect(result).toEqual({
63
- type: 'point',
64
- x: 1.5,
65
- y: 2.75
66
- });
67
- });
68
- it('creates point with negative coordinates', function () {
69
- var point = {
70
- x: -3,
71
- y: -7
72
- };
73
- var result = pointTool.addPoint(point);
74
- expect(result).toEqual({
75
- type: 'point',
76
- x: -3,
77
- y: -7
78
- });
79
- });
80
- it('creates point with zero coordinates', function () {
81
- var point = {
82
- x: 0,
83
- y: 0
84
- };
85
- var result = pointTool.addPoint(point);
86
- expect(result).toEqual({
87
- type: 'point',
88
- x: 0,
89
- y: 0
90
- });
91
- });
92
- it('creates point at origin', function () {
93
- var result = pointTool.addPoint({
94
- x: 0,
95
- y: 0
96
- });
97
- expect(result.x).toBe(0);
98
- expect(result.y).toBe(0);
99
- });
100
- it('spreads all point properties', function () {
101
- var point = {
102
- x: 1,
103
- y: 2,
104
- label: 'A',
105
- color: 'red'
106
- };
107
- var result = pointTool.addPoint(point);
108
- expect(result).toEqual({
109
- type: 'point',
110
- x: 1,
111
- y: 2,
112
- label: 'A',
113
- color: 'red'
114
- });
115
- });
116
- it('preserves additional properties from point object', function () {
117
- var point = {
118
- x: 3,
119
- y: 4,
120
- id: 'point-1',
121
- fill: 'blue',
122
- stroke: 'black'
123
- };
124
- var result = pointTool.addPoint(point);
125
- expect(result.type).toBe('point');
126
- expect(result.x).toBe(3);
127
- expect(result.y).toBe(4);
128
- expect(result.id).toBe('point-1');
129
- expect(result.fill).toBe('blue');
130
- expect(result.stroke).toBe('black');
131
- });
132
- it('ignores existing mark parameter', function () {
133
- var point = {
134
- x: 1,
135
- y: 2
136
- };
137
- var existingMark = {
138
- type: 'point',
139
- x: 5,
140
- y: 5
141
- };
142
- var result = pointTool.addPoint(point, existingMark);
143
-
144
- // Point tool always creates new mark, ignoring existing
145
- expect(result).toEqual({
146
- type: 'point',
147
- x: 1,
148
- y: 2
149
- });
150
- });
151
- it('creates new point even with same coordinates', function () {
152
- var point = {
153
- x: 1,
154
- y: 2
155
- };
156
- var result1 = pointTool.addPoint(point);
157
- var result2 = pointTool.addPoint(point);
158
- expect(result1).toEqual(result2);
159
- expect(result1).not.toBe(result2); // Different object references
160
- });
161
- it('handles very large coordinates', function () {
162
- var point = {
163
- x: 1000000,
164
- y: -1000000
165
- };
166
- var result = pointTool.addPoint(point);
167
- expect(result.x).toBe(1000000);
168
- expect(result.y).toBe(-1000000);
169
- });
170
- it('handles very small coordinates', function () {
171
- var point = {
172
- x: 0.0001,
173
- y: 0.0002
174
- };
175
- var result = pointTool.addPoint(point);
176
- expect(result.x).toBe(0.0001);
177
- expect(result.y).toBe(0.0002);
178
- });
179
- });
180
- describe('edge cases', function () {
181
- it('handles point with only x coordinate', function () {
182
- var point = {
183
- x: 5
184
- };
185
- var result = pointTool.addPoint(point);
186
- expect(result.type).toBe('point');
187
- expect(result.x).toBe(5);
188
- expect(result.y).toBeUndefined();
189
- });
190
- it('handles point with only y coordinate', function () {
191
- var point = {
192
- y: 5
193
- };
194
- var result = pointTool.addPoint(point);
195
- expect(result.type).toBe('point');
196
- expect(result.x).toBeUndefined();
197
- expect(result.y).toBe(5);
198
- });
199
- it('handles empty point object', function () {
200
- var point = {};
201
- var result = pointTool.addPoint(point);
202
- expect(result).toEqual({
203
- type: 'point'
204
- });
205
- });
206
- it('handles NaN coordinates', function () {
207
- var point = {
208
- x: NaN,
209
- y: NaN
210
- };
211
- var result = pointTool.addPoint(point);
212
- expect(result.type).toBe('point');
213
- expect(Number.isNaN(result.x)).toBe(true);
214
- expect(Number.isNaN(result.y)).toBe(true);
215
- });
216
- it('handles Infinity coordinates', function () {
217
- var point = {
218
- x: Infinity,
219
- y: -Infinity
220
- };
221
- var result = pointTool.addPoint(point);
222
- expect(result.x).toBe(Infinity);
223
- expect(result.y).toBe(-Infinity);
224
- });
225
- });
226
- describe('multiple points', function () {
227
- it('creates multiple distinct points', function () {
228
- var points = [{
229
- x: 1,
230
- y: 1
231
- }, {
232
- x: 2,
233
- y: 2
234
- }, {
235
- x: 3,
236
- y: 3
237
- }];
238
- var results = points.map(function (p) {
239
- return pointTool.addPoint(p);
240
- });
241
- expect(results).toHaveLength(3);
242
- results.forEach(function (result, i) {
243
- expect(result.type).toBe('point');
244
- expect(result.x).toBe(points[i].x);
245
- expect(result.y).toBe(points[i].y);
246
- });
247
- });
248
- it('each point is independent', function () {
249
- var point1 = pointTool.addPoint({
250
- x: 1,
251
- y: 1
252
- });
253
- var point2 = pointTool.addPoint({
254
- x: 2,
255
- y: 2
256
- });
257
- point1.label = 'A';
258
- expect(point2.label).toBeUndefined();
259
- });
260
- });
261
- });
262
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfaW5kZXgiLCJyZXF1aXJlIiwiX2NvbXBvbmVudCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJkZXNjcmliZSIsInBvaW50VG9vbCIsImJlZm9yZUVhY2giLCJ0b29sIiwiaXQiLCJleHBlY3QiLCJ0b0hhdmVQcm9wZXJ0eSIsIlBvaW50IiwibGFiZWwiLCJ0b0JlIiwidHlwZSIsIkNvbXBvbmVudCIsImNvbXBsZXRlIiwidG9CZVVuZGVmaW5lZCIsInBvaW50IiwieCIsInkiLCJyZXN1bHQiLCJhZGRQb2ludCIsInRvRXF1YWwiLCJjb2xvciIsImlkIiwiZmlsbCIsInN0cm9rZSIsImV4aXN0aW5nTWFyayIsInJlc3VsdDEiLCJyZXN1bHQyIiwibm90IiwiTmFOIiwiTnVtYmVyIiwiaXNOYU4iLCJJbmZpbml0eSIsInBvaW50cyIsInJlc3VsdHMiLCJtYXAiLCJwIiwidG9IYXZlTGVuZ3RoIiwiZm9yRWFjaCIsImkiLCJwb2ludDEiLCJwb2ludDIiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdG9vbHMvcG9pbnQvX190ZXN0c19fL2luZGV4LnRlc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdG9vbCB9IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCBQb2ludCBmcm9tICcuLi9jb21wb25lbnQnO1xuXG5kZXNjcmliZSgncG9pbnQgdG9vbCcsICgpID0+IHtcbiAgbGV0IHBvaW50VG9vbDtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBwb2ludFRvb2wgPSB0b29sKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd0b29sIHN0cnVjdHVyZScsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBhbiBvYmplY3Qgd2l0aCByZXF1aXJlZCBwcm9wZXJ0aWVzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHBvaW50VG9vbCkudG9IYXZlUHJvcGVydHkoJ2xhYmVsJywgJ1BvaW50Jyk7XG4gICAgICBleHBlY3QocG9pbnRUb29sKS50b0hhdmVQcm9wZXJ0eSgndHlwZScsICdwb2ludCcpO1xuICAgICAgZXhwZWN0KHBvaW50VG9vbCkudG9IYXZlUHJvcGVydHkoJ0NvbXBvbmVudCcsIFBvaW50KTtcbiAgICAgIGV4cGVjdChwb2ludFRvb2wpLnRvSGF2ZVByb3BlcnR5KCdhZGRQb2ludCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhcyBjb3JyZWN0IGxhYmVsJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHBvaW50VG9vbC5sYWJlbCkudG9CZSgnUG9pbnQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYXMgY29ycmVjdCB0eXBlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHBvaW50VG9vbC50eXBlKS50b0JlKCdwb2ludCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3VzZXMgUG9pbnQgY29tcG9uZW50JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHBvaW50VG9vbC5Db21wb25lbnQpLnRvQmUoUG9pbnQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IGhhdmUgY29tcGxldGUgbWV0aG9kJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHBvaW50VG9vbC5jb21wbGV0ZSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYWRkUG9pbnQnLCAoKSA9PiB7XG4gICAgaXQoJ2NyZWF0ZXMgYSBwb2ludCBtYXJrIGZyb20gY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwb2ludCA9IHsgeDogMSwgeTogMiB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gcG9pbnRUb29sLmFkZFBvaW50KHBvaW50KTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh7XG4gICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgIHg6IDEsXG4gICAgICAgIHk6IDIsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdjcmVhdGVzIHBvaW50IHdpdGggaW50ZWdlciBjb29yZGluYXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHBvaW50ID0geyB4OiA1LCB5OiAxMCB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gcG9pbnRUb29sLmFkZFBvaW50KHBvaW50KTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh7XG4gICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgIHg6IDUsXG4gICAgICAgIHk6IDEwLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY3JlYXRlcyBwb2ludCB3aXRoIGRlY2ltYWwgY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwb2ludCA9IHsgeDogMS41LCB5OiAyLjc1IH07XG4gICAgICBjb25zdCByZXN1bHQgPSBwb2ludFRvb2wuYWRkUG9pbnQocG9pbnQpO1xuXG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHtcbiAgICAgICAgdHlwZTogJ3BvaW50JyxcbiAgICAgICAgeDogMS41LFxuICAgICAgICB5OiAyLjc1LFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY3JlYXRlcyBwb2ludCB3aXRoIG5lZ2F0aXZlIGNvb3JkaW5hdGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcG9pbnQgPSB7IHg6IC0zLCB5OiAtNyB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gcG9pbnRUb29sLmFkZFBvaW50KHBvaW50KTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh7XG4gICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgIHg6IC0zLFxuICAgICAgICB5OiAtNyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NyZWF0ZXMgcG9pbnQgd2l0aCB6ZXJvIGNvb3JkaW5hdGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcG9pbnQgPSB7IHg6IDAsIHk6IDAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBvaW50VG9vbC5hZGRQb2ludChwb2ludCk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoe1xuICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY3JlYXRlcyBwb2ludCBhdCBvcmlnaW4nLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBwb2ludFRvb2wuYWRkUG9pbnQoeyB4OiAwLCB5OiAwIH0pO1xuXG4gICAgICBleHBlY3QocmVzdWx0LngpLnRvQmUoMCk7XG4gICAgICBleHBlY3QocmVzdWx0LnkpLnRvQmUoMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc3ByZWFkcyBhbGwgcG9pbnQgcHJvcGVydGllcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHBvaW50ID0geyB4OiAxLCB5OiAyLCBsYWJlbDogJ0EnLCBjb2xvcjogJ3JlZCcgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBvaW50VG9vbC5hZGRQb2ludChwb2ludCk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoe1xuICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgICB4OiAxLFxuICAgICAgICB5OiAyLFxuICAgICAgICBsYWJlbDogJ0EnLFxuICAgICAgICBjb2xvcjogJ3JlZCcsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdwcmVzZXJ2ZXMgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZyb20gcG9pbnQgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgcG9pbnQgPSB7XG4gICAgICAgIHg6IDMsXG4gICAgICAgIHk6IDQsXG4gICAgICAgIGlkOiAncG9pbnQtMScsXG4gICAgICAgIGZpbGw6ICdibHVlJyxcbiAgICAgICAgc3Ryb2tlOiAnYmxhY2snLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBvaW50VG9vbC5hZGRQb2ludChwb2ludCk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQudHlwZSkudG9CZSgncG9pbnQnKTtcbiAgICAgIGV4cGVjdChyZXN1bHQueCkudG9CZSgzKTtcbiAgICAgIGV4cGVjdChyZXN1bHQueSkudG9CZSg0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQuaWQpLnRvQmUoJ3BvaW50LTEnKTtcbiAgICAgIGV4cGVjdChyZXN1bHQuZmlsbCkudG9CZSgnYmx1ZScpO1xuICAgICAgZXhwZWN0KHJlc3VsdC5zdHJva2UpLnRvQmUoJ2JsYWNrJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaWdub3JlcyBleGlzdGluZyBtYXJrIHBhcmFtZXRlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHBvaW50ID0geyB4OiAxLCB5OiAyIH07XG4gICAgICBjb25zdCBleGlzdGluZ01hcmsgPSB7IHR5cGU6ICdwb2ludCcsIHg6IDUsIHk6IDUgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBvaW50VG9vbC5hZGRQb2ludChwb2ludCwgZXhpc3RpbmdNYXJrKTtcblxuICAgICAgLy8gUG9pbnQgdG9vbCBhbHdheXMgY3JlYXRlcyBuZXcgbWFyaywgaWdub3JpbmcgZXhpc3RpbmdcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoe1xuICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgICB4OiAxLFxuICAgICAgICB5OiAyLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY3JlYXRlcyBuZXcgcG9pbnQgZXZlbiB3aXRoIHNhbWUgY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwb2ludCA9IHsgeDogMSwgeTogMiB9O1xuICAgICAgY29uc3QgcmVzdWx0MSA9IHBvaW50VG9vbC5hZGRQb2ludChwb2ludCk7XG4gICAgICBjb25zdCByZXN1bHQyID0gcG9pbnRUb29sLmFkZFBvaW50KHBvaW50KTtcblxuICAgICAgZXhwZWN0KHJlc3VsdDEpLnRvRXF1YWwocmVzdWx0Mik7XG4gICAgICBleHBlY3QocmVzdWx0MSkubm90LnRvQmUocmVzdWx0Mik7IC8vIERpZmZlcmVudCBvYmplY3QgcmVmZXJlbmNlc1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgdmVyeSBsYXJnZSBjb29yZGluYXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHBvaW50ID0geyB4OiAxMDAwMDAwLCB5OiAtMTAwMDAwMCB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gcG9pbnRUb29sLmFkZFBvaW50KHBvaW50KTtcblxuICAgICAgZXhwZWN0KHJlc3VsdC54KS50b0JlKDEwMDAwMDApO1xuICAgICAgZXhwZWN0KHJlc3VsdC55KS50b0JlKC0xMDAwMDAwKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIHZlcnkgc21hbGwgY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwb2ludCA9IHsgeDogMC4wMDAxLCB5OiAwLjAwMDIgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBvaW50VG9vbC5hZGRQb2ludChwb2ludCk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQueCkudG9CZSgwLjAwMDEpO1xuICAgICAgZXhwZWN0KHJlc3VsdC55KS50b0JlKDAuMDAwMik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdlZGdlIGNhc2VzJywgKCkgPT4ge1xuICAgIGl0KCdoYW5kbGVzIHBvaW50IHdpdGggb25seSB4IGNvb3JkaW5hdGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwb2ludCA9IHsgeDogNSB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gcG9pbnRUb29sLmFkZFBvaW50KHBvaW50KTtcblxuICAgICAgZXhwZWN0KHJlc3VsdC50eXBlKS50b0JlKCdwb2ludCcpO1xuICAgICAgZXhwZWN0KHJlc3VsdC54KS50b0JlKDUpO1xuICAgICAgZXhwZWN0KHJlc3VsdC55KS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBwb2ludCB3aXRoIG9ubHkgeSBjb29yZGluYXRlJywgKCkgPT4ge1xuICAgICAgY29uc3QgcG9pbnQgPSB7IHk6IDUgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBvaW50VG9vbC5hZGRQb2ludChwb2ludCk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQudHlwZSkudG9CZSgncG9pbnQnKTtcbiAgICAgIGV4cGVjdChyZXN1bHQueCkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KHJlc3VsdC55KS50b0JlKDUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgZW1wdHkgcG9pbnQgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgcG9pbnQgPSB7fTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBvaW50VG9vbC5hZGRQb2ludChwb2ludCk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoe1xuICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBOYU4gY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwb2ludCA9IHsgeDogTmFOLCB5OiBOYU4gfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBvaW50VG9vbC5hZGRQb2ludChwb2ludCk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQudHlwZSkudG9CZSgncG9pbnQnKTtcbiAgICAgIGV4cGVjdChOdW1iZXIuaXNOYU4ocmVzdWx0LngpKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KE51bWJlci5pc05hTihyZXN1bHQueSkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBJbmZpbml0eSBjb29yZGluYXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHBvaW50ID0geyB4OiBJbmZpbml0eSwgeTogLUluZmluaXR5IH07XG4gICAgICBjb25zdCByZXN1bHQgPSBwb2ludFRvb2wuYWRkUG9pbnQocG9pbnQpO1xuXG4gICAgICBleHBlY3QocmVzdWx0LngpLnRvQmUoSW5maW5pdHkpO1xuICAgICAgZXhwZWN0KHJlc3VsdC55KS50b0JlKC1JbmZpbml0eSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdtdWx0aXBsZSBwb2ludHMnLCAoKSA9PiB7XG4gICAgaXQoJ2NyZWF0ZXMgbXVsdGlwbGUgZGlzdGluY3QgcG9pbnRzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcG9pbnRzID0gW1xuICAgICAgICB7IHg6IDEsIHk6IDEgfSxcbiAgICAgICAgeyB4OiAyLCB5OiAyIH0sXG4gICAgICAgIHsgeDogMywgeTogMyB9LFxuICAgICAgXTtcblxuICAgICAgY29uc3QgcmVzdWx0cyA9IHBvaW50cy5tYXAoKHApID0+IHBvaW50VG9vbC5hZGRQb2ludChwKSk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHRzKS50b0hhdmVMZW5ndGgoMyk7XG4gICAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCwgaSkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LnR5cGUpLnRvQmUoJ3BvaW50Jyk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQueCkudG9CZShwb2ludHNbaV0ueCk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQueSkudG9CZShwb2ludHNbaV0ueSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdlYWNoIHBvaW50IGlzIGluZGVwZW5kZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgcG9pbnQxID0gcG9pbnRUb29sLmFkZFBvaW50KHsgeDogMSwgeTogMSB9KTtcbiAgICAgIGNvbnN0IHBvaW50MiA9IHBvaW50VG9vbC5hZGRQb2ludCh7IHg6IDIsIHk6IDIgfSk7XG5cbiAgICAgIHBvaW50MS5sYWJlbCA9ICdBJztcbiAgICAgIGV4cGVjdChwb2ludDIubGFiZWwpLnRvQmVVbmRlZmluZWQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsVUFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBRUFHLFFBQVEsQ0FBQyxZQUFZLEVBQUUsWUFBTTtFQUMzQixJQUFJQyxTQUFTO0VBRWJDLFVBQVUsQ0FBQyxZQUFNO0lBQ2ZELFNBQVMsR0FBRyxJQUFB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