@pie-lib/graphing 2.16.0-beta.0 → 2.16.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.
- package/CHANGELOG.json +1 -1017
- package/CHANGELOG.md +104 -27
- package/package.json +13 -9
- package/src/axis/axes.jsx +1 -1
- package/src/coordinates-label.jsx +1 -1
- package/src/graph-with-controls.jsx +1 -1
- package/src/grid-setup.jsx +7 -10
- package/src/key-legend.jsx +131 -101
- package/src/labels.jsx +1 -1
- package/src/mark-label.jsx +1 -1
- package/src/toggle-bar.jsx +1 -1
- package/src/tools/circle/bg-circle.jsx +1 -1
- package/src/tools/circle/component.jsx +1 -1
- package/src/tools/polygon/line.jsx +1 -1
- package/src/tools/polygon/polygon.jsx +3 -3
- package/src/tools/shared/line/index.jsx +1 -1
- package/src/tools/shared/line/line-path.jsx +1 -1
- package/src/tools/shared/point/index.jsx +1 -1
- package/src/tools/shared/styles.js +1 -1
- package/src/undo-redo.jsx +1 -1
- package/lib/__tests__/graph-with-controls.test.js +0 -215
- package/lib/__tests__/graph.test.js +0 -290
- package/lib/__tests__/grid.test.js +0 -40
- package/lib/__tests__/labels.test.js +0 -59
- package/lib/__tests__/mark-label.test.js +0 -154
- package/lib/__tests__/toggle-bar.test.js +0 -54
- package/lib/__tests__/tool-menu.test.js +0 -43
- package/lib/__tests__/undo-redo.test.js +0 -42
- package/lib/__tests__/use-debounce.test.js +0 -28
- package/lib/__tests__/utils.js +0 -72
- package/lib/__tests__/utils.test.js +0 -133
- package/lib/axis/__tests__/arrow.test.js +0 -68
- package/lib/axis/__tests__/axes.test.js +0 -214
- package/lib/axis/arrow.js +0 -115
- package/lib/axis/axes.js +0 -415
- package/lib/axis/index.js +0 -26
- package/lib/bg.js +0 -139
- package/lib/container/actions.js +0 -24
- package/lib/container/index.js +0 -163
- package/lib/container/marks.js +0 -27
- package/lib/container/middleware.js +0 -25
- package/lib/container/reducer.js +0 -25
- package/lib/coordinates-label.js +0 -109
- package/lib/graph-with-controls.js +0 -359
- package/lib/graph.js +0 -371
- package/lib/grid-setup.js +0 -462
- package/lib/grid.js +0 -176
- package/lib/index.js +0 -59
- package/lib/key-legend.js +0 -246
- package/lib/label-svg-icon.js +0 -56
- package/lib/labels.js +0 -299
- package/lib/mark-label.js +0 -321
- package/lib/toggle-bar.js +0 -336
- package/lib/tool-menu.js +0 -112
- package/lib/tools/absolute/__tests__/component.test.js +0 -74
- package/lib/tools/absolute/component.js +0 -35
- package/lib/tools/absolute/index.js +0 -63
- package/lib/tools/circle/__tests__/bg-circle.test.js +0 -46
- package/lib/tools/circle/__tests__/component.test.js +0 -259
- package/lib/tools/circle/bg-circle.js +0 -173
- package/lib/tools/circle/component.js +0 -406
- package/lib/tools/circle/index.js +0 -51
- package/lib/tools/exponential/__tests__/component.test.js +0 -73
- package/lib/tools/exponential/component.js +0 -34
- package/lib/tools/exponential/index.js +0 -71
- package/lib/tools/index.js +0 -99
- package/lib/tools/line/__tests__/component.test.js +0 -56
- package/lib/tools/line/component.js +0 -103
- package/lib/tools/line/index.js +0 -16
- package/lib/tools/parabola/__tests__/component.test.js +0 -73
- package/lib/tools/parabola/component.js +0 -34
- package/lib/tools/parabola/index.js +0 -63
- package/lib/tools/point/__tests__/component.test.js +0 -97
- package/lib/tools/point/component.js +0 -186
- package/lib/tools/point/index.js +0 -32
- package/lib/tools/polygon/__tests__/component.test.js +0 -255
- package/lib/tools/polygon/__tests__/index.test.js +0 -95
- package/lib/tools/polygon/__tests__/line.test.js +0 -43
- package/lib/tools/polygon/__tests__/polygon.test.js +0 -73
- package/lib/tools/polygon/component.js +0 -518
- package/lib/tools/polygon/index.js +0 -106
- package/lib/tools/polygon/line.js +0 -157
- package/lib/tools/polygon/polygon.js +0 -165
- package/lib/tools/ray/__tests__/component.test.js +0 -48
- package/lib/tools/ray/component.js +0 -102
- package/lib/tools/ray/index.js +0 -16
- package/lib/tools/segment/__tests__/component.test.js +0 -48
- package/lib/tools/segment/component.js +0 -75
- package/lib/tools/segment/index.js +0 -16
- package/lib/tools/shared/__tests__/arrow-head.test.js +0 -62
- package/lib/tools/shared/arrow-head.js +0 -70
- package/lib/tools/shared/icons/CorrectSVG.js +0 -36
- package/lib/tools/shared/icons/IncorrectSVG.js +0 -36
- package/lib/tools/shared/icons/MissingSVG.js +0 -35
- package/lib/tools/shared/line/__tests__/index.test.js +0 -301
- package/lib/tools/shared/line/__tests__/line-path.test.js +0 -78
- package/lib/tools/shared/line/__tests__/with-root-edge.test.js +0 -122
- package/lib/tools/shared/line/index.js +0 -599
- package/lib/tools/shared/line/line-path.js +0 -151
- package/lib/tools/shared/line/with-root-edge.js +0 -155
- package/lib/tools/shared/point/__tests__/arrow-point.test.js +0 -137
- package/lib/tools/shared/point/__tests__/base-point.test.js +0 -134
- package/lib/tools/shared/point/arrow-point.js +0 -113
- package/lib/tools/shared/point/arrow.js +0 -96
- package/lib/tools/shared/point/base-point.js +0 -175
- package/lib/tools/shared/point/index.js +0 -97
- package/lib/tools/shared/styles.js +0 -58
- package/lib/tools/shared/types.js +0 -23
- package/lib/tools/sine/__tests__/component.test.js +0 -81
- package/lib/tools/sine/component.js +0 -51
- package/lib/tools/sine/index.js +0 -63
- package/lib/tools/vector/__tests__/component.test.js +0 -45
- package/lib/tools/vector/component.js +0 -88
- package/lib/tools/vector/index.js +0 -16
- package/lib/undo-redo.js +0 -123
- package/lib/use-debounce.js +0 -32
- package/lib/utils.js +0 -307
package/lib/utils.js
DELETED
|
@@ -1,307 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
Object.defineProperty(exports, "__esModule", {
|
|
6
|
-
value: true
|
|
7
|
-
});
|
|
8
|
-
exports.tickCount = exports.thinnerShapesNeeded = exports.sameAxes = exports.roundNumber = exports.polygonToArea = exports.pointsToArea = exports.point = exports.lineToArea = exports.isDuplicatedMark = exports.isDomainRangeEqual = exports.getTickValues = exports.getRightestPoints = exports.getMiddleOfTwoPoints = exports.getDistanceBetweenTwoPoints = exports.getAngleDeg = exports.getAdjustedGraphLimits = exports.findLongestWord = exports.equalPoints = exports.countWords = exports.bounds = exports.arrowDimensions = exports.amountToIncreaseWidth = void 0;
|
|
9
|
-
|
|
10
|
-
var _head = _interopRequireDefault(require("lodash/head"));
|
|
11
|
-
|
|
12
|
-
var _tail = _interopRequireDefault(require("lodash/tail"));
|
|
13
|
-
|
|
14
|
-
var _plot = require("@pie-lib/plot");
|
|
15
|
-
|
|
16
|
-
var _invariant = _interopRequireDefault(require("invariant"));
|
|
17
|
-
|
|
18
|
-
var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
|
|
19
|
-
|
|
20
|
-
var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
|
|
21
|
-
|
|
22
|
-
var _cloneDeep = _interopRequireDefault(require("lodash/cloneDeep"));
|
|
23
|
-
|
|
24
|
-
var tickCount = _plot.utils.tickCount;
|
|
25
|
-
exports.tickCount = tickCount;
|
|
26
|
-
var bounds = _plot.utils.bounds;
|
|
27
|
-
exports.bounds = bounds;
|
|
28
|
-
var point = _plot.utils.point; //TODO: This can be removed?
|
|
29
|
-
|
|
30
|
-
exports.point = point;
|
|
31
|
-
|
|
32
|
-
var getAngleDeg = function getAngleDeg() {
|
|
33
|
-
return 0;
|
|
34
|
-
}; //TODO: This can be removed?
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
exports.getAngleDeg = getAngleDeg;
|
|
38
|
-
|
|
39
|
-
var arrowDimensions = function arrowDimensions() {
|
|
40
|
-
return 0;
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
exports.arrowDimensions = arrowDimensions;
|
|
44
|
-
|
|
45
|
-
var getTickValues = function getTickValues(prop) {
|
|
46
|
-
var tickValues = [];
|
|
47
|
-
var tickVal = 0;
|
|
48
|
-
|
|
49
|
-
while (tickVal >= prop.min && tickValues.indexOf(tickVal) < 0) {
|
|
50
|
-
tickValues.push(tickVal);
|
|
51
|
-
tickVal = Math.round((tickVal - prop.step) * 10000) / 10000;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
tickVal = Math.round(prop.step * 10000) / 10000;
|
|
55
|
-
|
|
56
|
-
while (tickVal <= prop.max && tickValues.indexOf(tickVal) < 0) {
|
|
57
|
-
tickValues.push(tickVal);
|
|
58
|
-
tickVal = Math.round((tickVal + prop.step) * 10000) / 10000;
|
|
59
|
-
} // return only ticks that are inside the min-max interval
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
if (tickValues) {
|
|
63
|
-
return tickValues.filter(function (tV) {
|
|
64
|
-
return tV >= prop.min && tV <= prop.max;
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
return [];
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
exports.getTickValues = getTickValues;
|
|
72
|
-
|
|
73
|
-
var countWords = function countWords(label) {
|
|
74
|
-
if (label == null || (0, _isEmpty["default"])(label)) {
|
|
75
|
-
return 1;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
var words = label.split(' ');
|
|
79
|
-
return words.length;
|
|
80
|
-
}; // findLongestWord is also used in plot
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
exports.countWords = countWords;
|
|
84
|
-
|
|
85
|
-
var findLongestWord = function findLongestWord(label) {
|
|
86
|
-
var longestWord = (label || '').replace(/<[^>]+>/g, '').split(' ').sort(function (a, b) {
|
|
87
|
-
return b.length - a.length;
|
|
88
|
-
});
|
|
89
|
-
return longestWord[0].length;
|
|
90
|
-
}; // amountToIncreaseWidth is also used in plot
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
exports.findLongestWord = findLongestWord;
|
|
94
|
-
|
|
95
|
-
var amountToIncreaseWidth = function amountToIncreaseWidth(longestWord) {
|
|
96
|
-
if (!longestWord) {
|
|
97
|
-
return 0;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
return longestWord * 10;
|
|
101
|
-
};
|
|
102
|
-
|
|
103
|
-
exports.amountToIncreaseWidth = amountToIncreaseWidth;
|
|
104
|
-
|
|
105
|
-
var polygonToArea = function polygonToArea(points) {
|
|
106
|
-
var h = (0, _head["default"])(points);
|
|
107
|
-
var area = {
|
|
108
|
-
left: h.x,
|
|
109
|
-
top: h.y,
|
|
110
|
-
bottom: h.y,
|
|
111
|
-
right: h.x
|
|
112
|
-
};
|
|
113
|
-
return (0, _tail["default"])(points).reduce(function (a, p) {
|
|
114
|
-
a.left = Math.min(a.left, p.x);
|
|
115
|
-
a.top = Math.max(a.top, p.y);
|
|
116
|
-
a.bottom = Math.min(a.bottom, p.y);
|
|
117
|
-
a.right = Math.max(a.right, p.x);
|
|
118
|
-
return a;
|
|
119
|
-
}, area);
|
|
120
|
-
};
|
|
121
|
-
|
|
122
|
-
exports.polygonToArea = polygonToArea;
|
|
123
|
-
|
|
124
|
-
var lineToArea = function lineToArea(from, to) {
|
|
125
|
-
return pointsToArea(from, to);
|
|
126
|
-
};
|
|
127
|
-
|
|
128
|
-
exports.lineToArea = lineToArea;
|
|
129
|
-
|
|
130
|
-
var pointsToArea = function pointsToArea(a, b) {
|
|
131
|
-
(0, _invariant["default"])(!!a && !!b, 'a or b is undefined');
|
|
132
|
-
var left = Math.min(a.x, b.x);
|
|
133
|
-
var top = Math.max(a.y, b.y);
|
|
134
|
-
var bottom = Math.min(a.y, b.y);
|
|
135
|
-
var right = Math.max(a.x, b.x);
|
|
136
|
-
return {
|
|
137
|
-
left: left,
|
|
138
|
-
top: top,
|
|
139
|
-
bottom: bottom,
|
|
140
|
-
right: right
|
|
141
|
-
};
|
|
142
|
-
};
|
|
143
|
-
|
|
144
|
-
exports.pointsToArea = pointsToArea;
|
|
145
|
-
|
|
146
|
-
var isDomainRangeEqual = function isDomainRangeEqual(graphProps, nextGraphProps) {
|
|
147
|
-
return (0, _isEqual["default"])(graphProps.domain, nextGraphProps.domain) && (0, _isEqual["default"])(graphProps.range, nextGraphProps.range);
|
|
148
|
-
};
|
|
149
|
-
|
|
150
|
-
exports.isDomainRangeEqual = isDomainRangeEqual;
|
|
151
|
-
|
|
152
|
-
var getRightestPoints = function getRightestPoints(points) {
|
|
153
|
-
var sortedPoints = (0, _cloneDeep["default"])(points);
|
|
154
|
-
sortedPoints.sort(function (a, b) {
|
|
155
|
-
return b.x - a.x;
|
|
156
|
-
});
|
|
157
|
-
return {
|
|
158
|
-
a: sortedPoints[0],
|
|
159
|
-
b: sortedPoints[1]
|
|
160
|
-
};
|
|
161
|
-
};
|
|
162
|
-
|
|
163
|
-
exports.getRightestPoints = getRightestPoints;
|
|
164
|
-
|
|
165
|
-
var getMiddleOfTwoPoints = function getMiddleOfTwoPoints(a, b) {
|
|
166
|
-
return {
|
|
167
|
-
x: (a.x + b.x) / 2,
|
|
168
|
-
y: (a.y + b.y) / 2
|
|
169
|
-
};
|
|
170
|
-
};
|
|
171
|
-
|
|
172
|
-
exports.getMiddleOfTwoPoints = getMiddleOfTwoPoints;
|
|
173
|
-
|
|
174
|
-
var roundNumber = function roundNumber(number) {
|
|
175
|
-
return parseFloat(number.toFixed(4));
|
|
176
|
-
};
|
|
177
|
-
|
|
178
|
-
exports.roundNumber = roundNumber;
|
|
179
|
-
|
|
180
|
-
var sameAxes = function sameAxes(p1, p2) {
|
|
181
|
-
return p1 && p2 && (roundNumber(p1.x) === roundNumber(p2.x) || roundNumber(p1.y) === roundNumber(p2.y));
|
|
182
|
-
};
|
|
183
|
-
|
|
184
|
-
exports.sameAxes = sameAxes;
|
|
185
|
-
|
|
186
|
-
var equalPoints = function equalPoints(p1, p2) {
|
|
187
|
-
return p1 && p2 && (0, _isEqual["default"])({
|
|
188
|
-
x: roundNumber(p1.x),
|
|
189
|
-
y: roundNumber(p1.y)
|
|
190
|
-
}, {
|
|
191
|
-
x: roundNumber(p2.x),
|
|
192
|
-
y: roundNumber(p2.y)
|
|
193
|
-
});
|
|
194
|
-
};
|
|
195
|
-
|
|
196
|
-
exports.equalPoints = equalPoints;
|
|
197
|
-
|
|
198
|
-
var getDistanceBetweenTicks = function getDistanceBetweenTicks(axis, size) {
|
|
199
|
-
var min = axis.min,
|
|
200
|
-
max = axis.max,
|
|
201
|
-
step = axis.step;
|
|
202
|
-
var nbOfTicks = (max - min) / step;
|
|
203
|
-
return size / nbOfTicks;
|
|
204
|
-
};
|
|
205
|
-
|
|
206
|
-
var thinnerShapesNeeded = function thinnerShapesNeeded(graphProps) {
|
|
207
|
-
var domain = graphProps.domain,
|
|
208
|
-
range = graphProps.range,
|
|
209
|
-
_graphProps$size = graphProps.size,
|
|
210
|
-
width = _graphProps$size.width,
|
|
211
|
-
height = _graphProps$size.height; // 14 is the default width of a point
|
|
212
|
-
|
|
213
|
-
return getDistanceBetweenTicks(domain, width) < 14 || getDistanceBetweenTicks(range, height) < 14;
|
|
214
|
-
};
|
|
215
|
-
|
|
216
|
-
exports.thinnerShapesNeeded = thinnerShapesNeeded;
|
|
217
|
-
|
|
218
|
-
var getAdjustedGraphLimits = function getAdjustedGraphLimits(graphProps) {
|
|
219
|
-
var domain = graphProps.domain,
|
|
220
|
-
range = graphProps.range,
|
|
221
|
-
_graphProps$size2 = graphProps.size,
|
|
222
|
-
width = _graphProps$size2.width,
|
|
223
|
-
height = _graphProps$size2.height;
|
|
224
|
-
var domainTicksDistance = getDistanceBetweenTicks(domain, width);
|
|
225
|
-
var rangeTicksDistance = getDistanceBetweenTicks(range, height); // 15 is the distance required for the arrow to extend the graph
|
|
226
|
-
|
|
227
|
-
var domainPadding = domain.step / (domainTicksDistance / 15);
|
|
228
|
-
var rangePadding = range.step / (rangeTicksDistance / 15);
|
|
229
|
-
return {
|
|
230
|
-
domain: {
|
|
231
|
-
min: domain.min - domainPadding,
|
|
232
|
-
max: domain.max + domainPadding
|
|
233
|
-
},
|
|
234
|
-
range: {
|
|
235
|
-
min: range.min - rangePadding,
|
|
236
|
-
max: range.max + rangePadding
|
|
237
|
-
}
|
|
238
|
-
};
|
|
239
|
-
};
|
|
240
|
-
|
|
241
|
-
exports.getAdjustedGraphLimits = getAdjustedGraphLimits;
|
|
242
|
-
|
|
243
|
-
var getDistanceBetweenTwoPoints = function getDistanceBetweenTwoPoints(a, b) {
|
|
244
|
-
return Math.sqrt((b.x - a.x) * (b.x - a.x) + (b.y - a.y) * (b.y - a.y));
|
|
245
|
-
};
|
|
246
|
-
|
|
247
|
-
exports.getDistanceBetweenTwoPoints = getDistanceBetweenTwoPoints;
|
|
248
|
-
|
|
249
|
-
var sortPoints = function sortPoints(array) {
|
|
250
|
-
return (array || []).sort(function (a, b) {
|
|
251
|
-
return a.x - b.x || a.y - b.y;
|
|
252
|
-
});
|
|
253
|
-
}; // check colliniarity of 3 points (source: https://www.geeksforgeeks.org/program-check-three-points-collinear/)
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
var checkCollinearity = function checkCollinearity(a, b, c) {
|
|
257
|
-
return (a.x - b.x) * (c.y - b.y) === (c.x - b.x) * (a.y - b.y);
|
|
258
|
-
}; // 2 lines are overlapping if all 4 points are collinear
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
var isSameLine = function isSameLine(markA, markB) {
|
|
262
|
-
return checkCollinearity(markA.from, markB.from, markB.to) && checkCollinearity(markA.to, markB.from, markB.to);
|
|
263
|
-
};
|
|
264
|
-
|
|
265
|
-
var isSameCircle = function isSameCircle(markA, markB) {
|
|
266
|
-
return equalPoints(markA.root, markB.root) && getDistanceBetweenTwoPoints(markB.root, markB.edge) === getDistanceBetweenTwoPoints(markA.root, markA.edge);
|
|
267
|
-
};
|
|
268
|
-
|
|
269
|
-
var isDuplicatedMark = function isDuplicatedMark(mark, marks, oldMark) {
|
|
270
|
-
var type = mark.type,
|
|
271
|
-
building = mark.building;
|
|
272
|
-
|
|
273
|
-
if (building) {
|
|
274
|
-
return false;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
var filteredMarks = (marks || []).filter(function (m) {
|
|
278
|
-
return m.type === type && !m.building;
|
|
279
|
-
});
|
|
280
|
-
var index = filteredMarks.findIndex(function (m) {
|
|
281
|
-
return (0, _isEqual["default"])(m, oldMark);
|
|
282
|
-
});
|
|
283
|
-
|
|
284
|
-
if (index !== -1) {
|
|
285
|
-
filteredMarks.splice(index, 1);
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
var duplicated = filteredMarks.find(function (m) {
|
|
289
|
-
if (type === 'circle' || type === 'parabola' || type === 'sine' || type === 'absolute' || type === 'exponential') {
|
|
290
|
-
var root = mark.root,
|
|
291
|
-
edge = mark.edge;
|
|
292
|
-
return equalPoints(root, m.root) && equalPoints(edge, m.edge) || type === 'circle' && isSameCircle(m, mark);
|
|
293
|
-
} else if (type === 'line' || type === 'ray' || type === 'segment' || type === 'vector') {
|
|
294
|
-
var from = mark.from,
|
|
295
|
-
to = mark.to;
|
|
296
|
-
return equalPoints(from, m.from) && equalPoints(to, m.to) || equalPoints(from, m.to) && equalPoints(to, m.from) || type === 'line' && isSameLine(m, mark);
|
|
297
|
-
} else if (type === 'polygon') {
|
|
298
|
-
return (0, _isEqual["default"])(sortPoints((0, _cloneDeep["default"])(mark.points)), sortPoints((0, _cloneDeep["default"])(m.points)));
|
|
299
|
-
} else if (type === 'point') {
|
|
300
|
-
return equalPoints(m, mark);
|
|
301
|
-
}
|
|
302
|
-
});
|
|
303
|
-
return !!duplicated;
|
|
304
|
-
};
|
|
305
|
-
|
|
306
|
-
exports.isDuplicatedMark = isDuplicatedMark;
|
|
307
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlscy5qcyJdLCJuYW1lcyI6WyJ0aWNrQ291bnQiLCJ1dGlscyIsImJvdW5kcyIsInBvaW50IiwiZ2V0QW5nbGVEZWciLCJhcnJvd0RpbWVuc2lvbnMiLCJnZXRUaWNrVmFsdWVzIiwicHJvcCIsInRpY2tWYWx1ZXMiLCJ0aWNrVmFsIiwibWluIiwiaW5kZXhPZiIsInB1c2giLCJNYXRoIiwicm91bmQiLCJzdGVwIiwibWF4IiwiZmlsdGVyIiwidFYiLCJjb3VudFdvcmRzIiwibGFiZWwiLCJ3b3JkcyIsInNwbGl0IiwibGVuZ3RoIiwiZmluZExvbmdlc3RXb3JkIiwibG9uZ2VzdFdvcmQiLCJyZXBsYWNlIiwic29ydCIsImEiLCJiIiwiYW1vdW50VG9JbmNyZWFzZVdpZHRoIiwicG9seWdvblRvQXJlYSIsInBvaW50cyIsImgiLCJhcmVhIiwibGVmdCIsIngiLCJ0b3AiLCJ5IiwiYm90dG9tIiwicmlnaHQiLCJyZWR1Y2UiLCJwIiwibGluZVRvQXJlYSIsImZyb20iLCJ0byIsInBvaW50c1RvQXJlYSIsImlzRG9tYWluUmFuZ2VFcXVhbCIsImdyYXBoUHJvcHMiLCJuZXh0R3JhcGhQcm9wcyIsImRvbWFpbiIsInJhbmdlIiwiZ2V0UmlnaHRlc3RQb2ludHMiLCJzb3J0ZWRQb2ludHMiLCJnZXRNaWRkbGVPZlR3b1BvaW50cyIsInJvdW5kTnVtYmVyIiwibnVtYmVyIiwicGFyc2VGbG9hdCIsInRvRml4ZWQiLCJzYW1lQXhlcyIsInAxIiwicDIiLCJlcXVhbFBvaW50cyIsImdldERpc3RhbmNlQmV0d2VlblRpY2tzIiwiYXhpcyIsInNpemUiLCJuYk9mVGlja3MiLCJ0aGlubmVyU2hhcGVzTmVlZGVkIiwid2lkdGgiLCJoZWlnaHQiLCJnZXRBZGp1c3RlZEdyYXBoTGltaXRzIiwiZG9tYWluVGlja3NEaXN0YW5jZSIsInJhbmdlVGlja3NEaXN0YW5jZSIsImRvbWFpblBhZGRpbmciLCJyYW5nZVBhZGRpbmciLCJnZXREaXN0YW5jZUJldHdlZW5Ud29Qb2ludHMiLCJzcXJ0Iiwic29ydFBvaW50cyIsImFycmF5IiwiY2hlY2tDb2xsaW5lYXJpdHkiLCJjIiwiaXNTYW1lTGluZSIsIm1hcmtBIiwibWFya0IiLCJpc1NhbWVDaXJjbGUiLCJyb290IiwiZWRnZSIsImlzRHVwbGljYXRlZE1hcmsiLCJtYXJrIiwibWFya3MiLCJvbGRNYXJrIiwidHlwZSIsImJ1aWxkaW5nIiwiZmlsdGVyZWRNYXJrcyIsIm0iLCJpbmRleCIsImZpbmRJbmRleCIsInNwbGljZSIsImR1cGxpY2F0ZWQiLCJmaW5kIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFTyxJQUFNQSxTQUFTLEdBQUdDLFlBQU1ELFNBQXhCOztBQUNBLElBQU1FLE1BQU0sR0FBR0QsWUFBTUMsTUFBckI7O0FBQ0EsSUFBTUMsS0FBSyxHQUFHRixZQUFNRSxLQUFwQixDLENBRVA7Ozs7QUFDTyxJQUFNQyxXQUFXLEdBQUcsU0FBZEEsV0FBYztBQUFBLFNBQU0sQ0FBTjtBQUFBLENBQXBCLEMsQ0FDUDs7Ozs7QUFDTyxJQUFNQyxlQUFlLEdBQUcsU0FBbEJBLGVBQWtCO0FBQUEsU0FBTSxDQUFOO0FBQUEsQ0FBeEI7Ozs7QUFFQSxJQUFNQyxhQUFhLEdBQUcsU0FBaEJBLGFBQWdCLENBQUNDLElBQUQsRUFBVTtBQUNyQyxNQUFNQyxVQUFVLEdBQUcsRUFBbkI7QUFDQSxNQUFJQyxPQUFPLEdBQUcsQ0FBZDs7QUFFQSxTQUFPQSxPQUFPLElBQUlGLElBQUksQ0FBQ0csR0FBaEIsSUFBdUJGLFVBQVUsQ0FBQ0csT0FBWCxDQUFtQkYsT0FBbkIsSUFBOEIsQ0FBNUQsRUFBK0Q7QUFDN0RELElBQUFBLFVBQVUsQ0FBQ0ksSUFBWCxDQUFnQkgsT0FBaEI7QUFDQUEsSUFBQUEsT0FBTyxHQUFHSSxJQUFJLENBQUNDLEtBQUwsQ0FBVyxDQUFDTCxPQUFPLEdBQUdGLElBQUksQ0FBQ1EsSUFBaEIsSUFBd0IsS0FBbkMsSUFBNEMs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RUFBSU4sSUFBSixDQUFyRztBQUNELEtBSkQsTUFJTyxJQUFJRyxJQUFJLEtBQUssTUFBVCxJQUFtQkEsSUFBSSxLQUFLLEtBQTVCLElBQXFDQSxJQUFJLEtBQUssU0FBOUMsSUFBMkRBLElBQUksS0FBSyxRQUF4RSxFQUFrRjtBQUN2RixVQUFRL0MsSUFBUixHQUFxQjRDLElBQXJCLENBQVE1QyxJQUFSO0FBQUEsVUFBY0MsRUFBZCxHQUFxQjJDLElBQXJCLENBQWMzQyxFQUFkO0FBRUEsYUFDR2lCLFdBQVcsQ0FBQ2xCLElBQUQsRUFBT2tELENBQUMsQ0FBQ2xELElBQVQsQ0FBWCxJQUE2QmtCLFdBQVcsQ0FBQ2pCLEVBQUQsRUFBS2lELENBQUMsQ0FBQ2pELEVBQVAsQ0FBekMsSUFDQ2lCLFdBQVcsQ0FBQ2xCLElBQUQsRUFBT2tELENBQUMsQ0FBQ2pELEVBQVQsQ0FBWCxJQUEyQmlCLFdBQVcsQ0FBQ2pCLEVBQUQsRUFBS2lELENBQUMsQ0FBQ2xELElBQVAsQ0FEdkMsSUFFQytDLElBQUksS0FBSyxNQUFULElBQW1CVixVQUFVLENBQUNhLENBQUQsRUFBSU4sSUFBSixDQUhoQztBQUtELEtBUk0sTUFRQSxJQUFJRyxJQUFJLEtBQUssU0FBYixFQUF3QjtBQUM3QixhQUFPLHlCQUFRZCxVQUFVLENBQUMsMkJBQVVXLElBQUksQ0FBQ3hELE1BQWYsQ0FBRCxDQUFsQixFQUE0QzZDLFVBQVUsQ0FBQywyQkFBVWlCLENBQUMsQ0FBQzlELE1BQVosQ0FBRCxDQUF0RCxDQUFQO0FBQ0QsS0FGTSxNQUVBLElBQUkyRCxJQUFJLEtBQUssT0FBYixFQUFzQjtBQUMzQixhQUFPN0IsV0FBVyxDQUFDZ0MsQ0FBRCxFQUFJTixJQUFKLENBQWxCO0FBQ0Q7QUFDRixHQWxCa0IsQ0FBbkI7QUFvQkEsU0FBTyxDQUFDLENBQUNVLFVBQVQ7QUFDRCxDQW5DTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBoZWFkIGZyb20gJ2xvZGFzaC9oZWFkJztcbmltcG9ydCB0YWlsIGZyb20gJ2xvZGFzaC90YWlsJztcbmltcG9ydCB7IHV0aWxzIH0gZnJvbSAnQHBpZS1saWIvcGxvdCc7XG5pbXBvcnQgaW52YXJpYW50IGZyb20gJ2ludmFyaWFudCc7XG5pbXBvcnQgaXNFcXVhbCBmcm9tICdsb2Rhc2gvaXNFcXVhbCc7XG5pbXBvcnQgaXNFbXB0eSBmcm9tICdsb2Rhc2gvaXNFbXB0eSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC9jbG9uZURlZXAnO1xuXG5leHBvcnQgY29uc3QgdGlja0NvdW50ID0gdXRpbHMudGlja0NvdW50O1xuZXhwb3J0IGNvbnN0IGJvdW5kcyA9IHV0aWxzLmJvdW5kcztcbmV4cG9ydCBjb25zdCBwb2ludCA9IHV0aWxzLnBvaW50O1xuXG4vL1RPRE86IFRoaXMgY2FuIGJlIHJlbW92ZWQ/XG5leHBvcnQgY29uc3QgZ2V0QW5nbGVEZWcgPSAoKSA9PiAwO1xuLy9UT0RPOiBUaGlzIGNhbiBiZSByZW1vdmVkP1xuZXhwb3J0IGNvbnN0IGFycm93RGltZW5zaW9ucyA9ICgpID0+IDA7XG5cbmV4cG9ydCBjb25zdCBnZXRUaWNrVmFsdWVzID0gKHByb3ApID0+IHtcbiAgY29uc3QgdGlja1ZhbHVlcyA9IFtdO1xuICBsZXQgdGlja1ZhbCA9IDA7XG5cbiAgd2hpbGUgKHRpY2tWYWwgPj0gcHJvcC5taW4gJiYgdGlja1ZhbHVlcy5pbmRleE9mKHRpY2tWYWwpIDwgMCkge1xuICAgIHRpY2tWYWx1ZXMucHVzaCh0aWNrVmFsKTtcbiAgICB0aWNrVmFsID0gTWF0aC5yb3VuZCgodGlja1ZhbCAtIHByb3Auc3RlcCkgKiAxMDAwMCkgLyAxMDAwMDtcbiAgfVxuXG4gIHRpY2tWYWwgPSBNYXRoLnJvdW5kKHByb3Auc3RlcCAqIDEwMDAwKSAvIDEwMDAwO1xuXG4gIHdoaWxlICh0aWNrVmFsIDw9IHByb3AubWF4ICYmIHRpY2tWYWx1ZXMuaW5kZXhPZih0aWNrVmFsKSA8IDApIHtcbiAgICB0aWNrVmFsdWVzLnB1c2godGlja1ZhbCk7XG4gICAgdGlja1ZhbCA9IE1hdGgucm91bmQoKHRpY2tWYWwgKyBwcm9wLnN0ZXApICogMTAwMDApIC8gMTAwMDA7XG4gIH1cblxuICAvLyByZXR1cm4gb25seSB0aWNrcyB0aGF0IGFyZSBpbnNpZGUgdGhlIG1pbi1tYXggaW50ZXJ2YWxcbiAgaWYgKHRpY2tWYWx1ZXMpIHtcbiAgICByZXR1cm4gdGlja1ZhbHVlcy5maWx0ZXIoKHRWKSA9PiB0ViA+PSBwcm9wLm1pbiAmJiB0ViA8PSBwcm9wLm1heCk7XG4gIH1cblxuICByZXR1cm4gW107XG59O1xuXG5leHBvcnQgY29uc3QgY291bnRXb3JkcyA9IChsYWJlbCkgPT4ge1xuICBpZiAobGFiZWwgPT0gbnVsbCB8fCBpc0VtcHR5KGxhYmVsKSkge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgY29uc3Qgd29yZHMgPSBsYWJlbC5zcGxpdCgnICcpO1xuICByZXR1cm4gd29yZHMubGVuZ3RoO1xufTtcblxuLy8gZmluZExvbmdlc3RXb3JkIGlzIGFsc28gdXNlZCBpbiBwbG90XG5leHBvcnQgY29uc3QgZmluZExvbmdlc3RXb3JkID0gKGxhYmVsKSA9PiB7XG4gIGxldCBsb25nZXN0V29yZCA9IChsYWJlbCB8fCAnJylcbiAgICAucmVwbGFjZSgvPFtePl0rPi9nLCAnJylcbiAgICAuc3BsaXQoJyAnKVxuICAgIC5zb3J0KChhLCBiKSA9PiBiLmxlbmd0aCAtIGEubGVuZ3RoKTtcblxuICByZXR1cm4gbG9uZ2VzdFdvcmRbMF0ubGVuZ3RoO1xufTtcblxuLy8gYW1vdW50VG9JbmNyZWFzZVdpZHRoIGlzIGFsc28gdXNlZCBpbiBwbG90XG5leHBvcnQgY29uc3QgYW1vdW50VG9JbmNyZWFzZVdpZHRoID0gKGxvbmdlc3RXb3JkKSA9PiB7XG4gIGlmICghbG9uZ2VzdFdvcmQpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHJldHVybiBsb25nZXN0V29yZCAqIDEwO1xufTtcblxuZXhwb3J0IGNvbnN0IHBvbHlnb25Ub0FyZWEgPSAocG9pbnRzKSA9PiB7XG4gIGNvbnN0IGggPSBoZWFkKHBvaW50cyk7XG4gIGNvbnN0IGFyZWEgPSB7XG4gICAgbGVmdDogaC54LFxuICAgIHRvcDogaC55LFxuICAgIGJvdHRvbTogaC55LFxuICAgIHJpZ2h0OiBoLngsXG4gIH07XG4gIHJldHVybiB0YWlsKHBvaW50cykucmVkdWNlKChhLCBwKSA9PiB7XG4gICAgYS5sZWZ0ID0gTWF0aC5taW4oYS5sZWZ0LCBwLngpO1xuICAgIGEudG9wID0gTWF0aC5tYXgoYS50b3AsIHAueSk7XG4gICAgYS5ib3R0b20gPSBNYXRoLm1pbihhLmJvdHRvbSwgcC55KTtcbiAgICBhLnJpZ2h0ID0gTWF0aC5tYXgoYS5yaWdodCwgcC54KTtcbiAgICByZXR1cm4gYTtcbiAgfSwgYXJlYSk7XG59O1xuXG5leHBvcnQgY29uc3QgbGluZVRvQXJlYSA9IChmcm9tLCB0bykgPT4gcG9pbnRzVG9BcmVhKGZyb20sIHRvKTtcblxuZXhwb3J0IGNvbnN0IHBvaW50c1RvQXJlYSA9IChhLCBiKSA9PiB7XG4gIGludmFyaWFudCghIWEgJiYgISFiLCAnYSBvciBiIGlzIHVuZGVmaW5lZCcpO1xuICBjb25zdCBsZWZ0ID0gTWF0aC5taW4oYS54LCBiLngpO1xuICBjb25zdCB0b3AgPSBNYXRoLm1heChhLnksIGIueSk7XG4gIGNvbnN0IGJvdHRvbSA9IE1hdGgubWluKGEueSwgYi55KTtcbiAgY29uc3QgcmlnaHQgPSBNYXRoLm1heChhLngsIGIueCk7XG4gIHJldHVybiB7IGxlZnQsIHRvcCwgYm90dG9tLCByaWdodCB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGlzRG9tYWluUmFuZ2VFcXVhbCA9IChncmFwaFByb3BzLCBuZXh0R3JhcGhQcm9wcykgPT4ge1xuICByZXR1cm4gaXNFcXVhbChncmFwaFByb3BzLmRvbWFpbiwgbmV4dEdyYXBoUHJvcHMuZG9tYWluKSAmJiBpc0VxdWFsKGdyYXBoUHJvcHMucmFuZ2UsIG5leHRHcmFwaFByb3BzLnJhbmdlKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSaWdodGVzdFBvaW50cyA9IChwb2ludHMpID0+IHtcbiAgY29uc3Qgc29ydGVkUG9pbnRzID0gY2xvbmVEZWVwKHBvaW50cyk7XG4gIHNvcnRlZFBvaW50cy5zb3J0KChhLCBiKSA9PiBiLnggLSBhLngpO1xuXG4gIHJldHVybiB7IGE6IHNvcnRlZFBvaW50c1swXSwgYjogc29ydGVkUG9pbnRzWzFdIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TWlkZGxlT2ZUd29Qb2ludHMgPSAoYSwgYikgPT4gKHtcbiAgeDogKGEueCArIGIueCkgLyAyLFxuICB5OiAoYS55ICsgYi55KSAvIDIsXG59KTtcblxuZXhwb3J0IGNvbnN0IHJvdW5kTnVtYmVyID0gKG51bWJlcikgPT4gcGFyc2VGbG9hdChudW1iZXIudG9GaXhlZCg0KSk7XG5cbmV4cG9ydCBjb25zdCBzYW1lQXhlcyA9IChwMSwgcDIpID0+XG4gIHAxICYmIHAyICYmIChyb3VuZE51bWJlcihwMS54KSA9PT0gcm91bmROdW1iZXIocDIueCkgfHwgcm91bmROdW1iZXIocDEueSkgPT09IHJvdW5kTnVtYmVyKHAyLnkpKTtcblxuZXhwb3J0IGNvbnN0IGVxdWFsUG9pbnRzID0gKHAxLCBwMikgPT5cbiAgcDEgJiZcbiAgcDIgJiZcbiAgaXNFcXVhbChcbiAgICB7XG4gICAgICB4OiByb3VuZE51bWJlcihwMS54KSxcbiAgICAgIHk6IHJvdW5kTnVtYmVyKHAxLnkpLFxuICAgIH0sXG4gICAge1xuICAgICAgeDogcm91bmROdW1iZXIocDIueCksXG4gICAgICB5OiByb3VuZE51bWJlcihwMi55KSxcbiAgICB9LFxuICApO1xuXG5jb25zdCBnZXREaXN0YW5jZUJldHdlZW5UaWNrcyA9IChheGlzLCBzaXplKSA9PiB7XG4gIGNvbnN0IHsgbWluLCBtYXgsIHN0ZXAgfSA9IGF4aXM7XG4gIGNvbnN0IG5iT2ZUaWNrcyA9IChtYXggLSBtaW4pIC8gc3RlcDtcblxuICByZXR1cm4gc2l6ZSAvIG5iT2ZUaWNrcztcbn07XG5cbmV4cG9ydCBjb25zdCB0aGlubmVyU2hhcGVzTmVlZGVkID0gKGdyYXBoUHJvcHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGRvbWFpbixcbiAgICByYW5nZSxcbiAgICBzaXplOiB7IHdpZHRoLCBoZWlnaHQgfSxcbiAgfSA9IGdyYXBoUHJvcHM7XG5cbiAgLy8gMTQgaXMgdGhlIGRlZmF1bHQgd2lkdGggb2YgYSBwb2ludFxuICByZXR1cm4gZ2V0RGlzdGFuY2VCZXR3ZWVuVGlja3MoZG9tYWluLCB3aWR0aCkgPCAxNCB8fCBnZXREaXN0YW5jZUJldHdlZW5UaWNrcyhyYW5nZSwgaGVpZ2h0KSA8IDE0O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFkanVzdGVkR3JhcGhMaW1pdHMgPSAoZ3JhcGhQcm9wcykgPT4ge1xuICBjb25zdCB7XG4gICAgZG9tYWluLFxuICAgIHJhbmdlLFxuICAgIHNpemU6IHsgd2lkdGgsIGhlaWdodCB9LFxuICB9ID0gZ3JhcGhQcm9wcztcbiAgY29uc3QgZG9tYWluVGlja3NEaXN0YW5jZSA9IGdldERpc3RhbmNlQmV0d2VlblRpY2tzKGRvbWFpbiwgd2lkdGgpO1xuICBjb25zdCByYW5nZVRpY2tzRGlzdGFuY2UgPSBnZXREaXN0YW5jZUJldHdlZW5UaWNrcyhyYW5nZSwgaGVpZ2h0KTtcblxuICAvLyAxNSBpcyB0aGUgZGlzdGFuY2UgcmVxdWlyZWQgZm9yIHRoZSBhcnJvdyB0byBleHRlbmQgdGhlIGdyYXBoXG4gIGNvbnN0IGRvbWFpblBhZGRpbmcgPSBkb21haW4uc3RlcCAvIChkb21haW5UaWNrc0Rpc3RhbmNlIC8gMTUpO1xuICBjb25zdCByYW5nZVBhZGRpbmcgPSByYW5nZS5zdGVwIC8gKHJhbmdlVGlja3NEaXN0YW5jZSAvIDE1KTtcblxuICByZXR1cm4ge1xuICAgIGRvbWFpbjoge1xuICAgICAgbWluOiBkb21haW4ubWluIC0gZG9tYWluUGFkZGluZyxcbiAgICAgIG1heDogZG9tYWluLm1heCArIGRvbWFpblBhZGRpbmcsXG4gICAgfSxcbiAgICByYW5nZToge1xuICAgICAgbWluOiByYW5nZS5taW4gLSByYW5nZVBhZGRpbmcsXG4gICAgICBtYXg6IHJhbmdlLm1heCArIHJhbmdlUGFkZGluZyxcbiAgICB9LFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERpc3RhbmNlQmV0d2VlblR3b1BvaW50cyA9IChhLCBiKSA9PiBNYXRoLnNxcnQoKGIueCAtIGEueCkgKiAoYi54IC0gYS54KSArIChiLnkgLSBhLnkpICogKGIueSAtIGEueSkpO1xuXG5jb25zdCBzb3J0UG9pbnRzID0gKGFycmF5KSA9PiAoYXJyYXkgfHwgW10pLnNvcnQoKGEsIGIpID0+IGEueCAtIGIueCB8fCBhLnkgLSBiLnkpO1xuXG4vLyBjaGVjayBjb2xsaW5pYXJpdHkgb2YgMyBwb2ludHMgKHNvdXJjZTogaHR0cHM6Ly93d3cuZ2Vla3Nmb3JnZWVrcy5vcmcvcHJvZ3JhbS1jaGVjay10aHJlZS1wb2ludHMtY29sbGluZWFyLylcbmNvbnN0IGNoZWNrQ29sbGluZWFyaXR5ID0gKGEsIGIsIGMpID0+IChhLnggLSBiLngpICogKGMueSAtIGIueSkgPT09IChjLnggLSBiLngpICogKGEueSAtIGIueSk7XG5cbi8vIDIgbGluZXMgYXJlIG92ZXJsYXBwaW5nIGlmIGFsbCA0IHBvaW50cyBhcmUgY29sbGluZWFyXG5jb25zdCBpc1NhbWVMaW5lID0gKG1hcmtBLCBtYXJrQikgPT5cbiAgY2hlY2tDb2xsaW5lYXJpdHkobWFya0EuZnJvbSwgbWFya0IuZnJvbSwgbWFya0IudG8pICYmIGNoZWNrQ29sbGluZWFyaXR5KG1hcmtBLnRvLCBtYXJrQi5mcm9tLCBtYXJrQi50byk7XG5cbmNvbnN0IGlzU2FtZUNpcmNsZSA9IChtYXJrQSwgbWFya0IpID0+XG4gIGVxdWFsUG9pbnRzKG1hcmtBLnJvb3QsIG1hcmtCLnJvb3QpICYmXG4gIGdldERpc3RhbmNlQmV0d2VlblR3b1BvaW50cyhtYXJrQi5yb290LCBtYXJrQi5lZGdlKSA9PT0gZ2V0RGlzdGFuY2VCZXR3ZWVuVHdvUG9pbnRzKG1hcmtBLnJvb3QsIG1hcmtBLmVkZ2UpO1xuXG5leHBvcnQgY29uc3QgaXNEdXBsaWNhdGVkTWFyayA9IChtYXJrLCBtYXJrcywgb2xkTWFyaykgPT4ge1xuICBjb25zdCB7IHR5cGUsIGJ1aWxkaW5nIH0gPSBtYXJrO1xuXG4gIGlmIChidWlsZGluZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGZpbHRlcmVkTWFya3MgPSAobWFya3MgfHwgW10pLmZpbHRlcigobSkgPT4gbS50eXBlID09PSB0eXBlICYmICFtLmJ1aWxkaW5nKTtcbiAgY29uc3QgaW5kZXggPSBmaWx0ZXJlZE1hcmtzLmZpbmRJbmRleCgobSkgPT4gaXNFcXVhbChtLCBvbGRNYXJrKSk7XG5cbiAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgIGZpbHRlcmVkTWFya3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuXG4gIGNvbnN0IGR1cGxpY2F0ZWQgPSBmaWx0ZXJlZE1hcmtzLmZpbmQoKG0pID0+IHtcbiAgICBpZiAodHlwZSA9PT0gJ2NpcmNsZScgfHwgdHlwZSA9PT0gJ3BhcmFib2xhJyB8fCB0eXBlID09PSAnc2luZScgfHwgdHlwZSA9PT0gJ2Fic29sdXRlJyB8fCB0eXBlID09PSAnZXhwb25lbnRpYWwnKSB7XG4gICAgICBjb25zdCB7IHJvb3QsIGVkZ2UgfSA9IG1hcms7XG5cbiAgICAgIHJldHVybiAoZXF1YWxQb2ludHMocm9vdCwgbS5yb290KSAmJiBlcXVhbFBvaW50cyhlZGdlLCBtLmVkZ2UpKSB8fCAodHlwZSA9PT0gJ2NpcmNsZScgJiYgaXNTYW1lQ2lyY2xlKG0sIG1hcmspKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdsaW5lJyB8fCB0eXBlID09PSAncmF5JyB8fCB0eXBlID09PSAnc2VnbWVudCcgfHwgdHlwZSA9PT0gJ3ZlY3RvcicpIHtcbiAgICAgIGNvbnN0IHsgZnJvbSwgdG8gfSA9IG1hcms7XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIChlcXVhbFBvaW50cyhmcm9tLCBtLmZyb20pICYmIGVxdWFsUG9pbnRzKHRvLCBtLnRvKSkgfHxcbiAgICAgICAgKGVxdWFsUG9pbnRzKGZyb20sIG0udG8pICYmIGVxdWFsUG9pbnRzKHRvLCBtLmZyb20pKSB8fFxuICAgICAgICAodHlwZSA9PT0gJ2xpbmUnICYmIGlzU2FtZUxpbmUobSwgbWFyaykpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3BvbHlnb24nKSB7XG4gICAgICByZXR1cm4gaXNFcXVhbChzb3J0UG9pbnRzKGNsb25lRGVlcChtYXJrLnBvaW50cykpLCBzb3J0UG9pbnRzKGNsb25lRGVlcChtLnBvaW50cykpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdwb2ludCcpIHtcbiAgICAgIHJldHVybiBlcXVhbFBvaW50cyhtLCBtYXJrKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiAhIWR1cGxpY2F0ZWQ7XG59O1xuIl19
|