ngx-image-cropper 8.0.0 → 8.1.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.
@@ -0,0 +1,239 @@
1
+ export function checkCropperPosition(cropperPosition, cropperState, maintainSize) {
2
+ cropperPosition = checkCropperSizeRestriction(cropperPosition, cropperState);
3
+ return checkCropperWithinMaxSizeBounds(cropperPosition, cropperState, maintainSize);
4
+ }
5
+ export function checkCropperSizeRestriction(cropperPosition, cropperState) {
6
+ let cropperWidth = cropperPosition.x2 - cropperPosition.x1;
7
+ let cropperHeight = cropperPosition.y2 - cropperPosition.y1;
8
+ const centerX = cropperPosition.x1 + cropperWidth / 2;
9
+ const centerY = cropperPosition.y1 + cropperHeight / 2;
10
+ if (cropperState.options.cropperStaticHeight && cropperState.options.cropperStaticWidth) {
11
+ cropperWidth = cropperState.maxSize.width > cropperState.options.cropperStaticWidth
12
+ ? cropperState.options.cropperStaticWidth
13
+ : cropperState.maxSize.width;
14
+ cropperHeight = cropperState.maxSize.height > cropperState.options.cropperStaticHeight
15
+ ? cropperState.options.cropperStaticHeight
16
+ : cropperState.maxSize.height;
17
+ }
18
+ else {
19
+ cropperWidth = Math.max(cropperState.cropperScaledMinWidth, Math.min(cropperWidth, cropperState.cropperScaledMaxWidth, cropperState.maxSize.width));
20
+ cropperHeight = Math.max(cropperState.cropperScaledMinHeight, Math.min(cropperHeight, cropperState.cropperScaledMaxHeight, cropperState.maxSize.height));
21
+ if (cropperState.options.maintainAspectRatio) {
22
+ if (cropperState.maxSize.width / cropperState.options.aspectRatio < cropperState.maxSize.height) {
23
+ cropperHeight = cropperWidth / cropperState.options.aspectRatio;
24
+ }
25
+ else {
26
+ cropperWidth = cropperHeight * cropperState.options.aspectRatio;
27
+ }
28
+ }
29
+ }
30
+ const x1 = centerX - cropperWidth / 2;
31
+ const x2 = x1 + cropperWidth;
32
+ const y1 = centerY - cropperHeight / 2;
33
+ const y2 = y1 + cropperHeight;
34
+ return { x1, x2, y1, y2 };
35
+ }
36
+ export function checkCropperWithinMaxSizeBounds(position, cropperState, maintainSize = false) {
37
+ if (position.x1 < 0) {
38
+ position = {
39
+ ...position,
40
+ x1: 0,
41
+ x2: position.x2 - (maintainSize ? position.x1 : 0)
42
+ };
43
+ }
44
+ if (position.y1 < 0) {
45
+ position = {
46
+ ...position,
47
+ y2: position.y2 - (maintainSize ? position.y1 : 0),
48
+ y1: 0
49
+ };
50
+ }
51
+ if (position.x2 > cropperState.maxSize.width) {
52
+ position = {
53
+ ...position,
54
+ x1: position.x1 - (maintainSize ? (position.x2 - cropperState.maxSize.width) : 0),
55
+ x2: cropperState.maxSize.width
56
+ };
57
+ }
58
+ if (position.y2 > cropperState.maxSize.height) {
59
+ position = {
60
+ ...position,
61
+ y1: position.y1 - (maintainSize ? (position.y2 - cropperState.maxSize.height) : 0),
62
+ y2: cropperState.maxSize.height
63
+ };
64
+ }
65
+ return position;
66
+ }
67
+ export function moveCropper(event, moveStart) {
68
+ const diffX = getClientX(event) - moveStart.clientX;
69
+ const diffY = getClientY(event) - moveStart.clientY;
70
+ return {
71
+ x1: moveStart.cropper.x1 + diffX,
72
+ y1: moveStart.cropper.y1 + diffY,
73
+ x2: moveStart.cropper.x2 + diffX,
74
+ y2: moveStart.cropper.y2 + diffY
75
+ };
76
+ }
77
+ export function resizeCropper(event, moveStart, cropperState) {
78
+ const cropperPosition = { ...cropperState.cropper };
79
+ const moveX = getClientX(event) - moveStart.clientX;
80
+ const moveY = getClientY(event) - moveStart.clientY;
81
+ switch (moveStart.position) {
82
+ case 'left':
83
+ cropperPosition.x1 = Math.min(Math.max(moveStart.cropper.x1 + moveX, cropperPosition.x2 - cropperState.cropperScaledMaxWidth), cropperPosition.x2 - cropperState.cropperScaledMinWidth);
84
+ break;
85
+ case 'topleft':
86
+ cropperPosition.x1 = Math.min(Math.max(moveStart.cropper.x1 + moveX, cropperPosition.x2 - cropperState.cropperScaledMaxWidth), cropperPosition.x2 - cropperState.cropperScaledMinWidth);
87
+ cropperPosition.y1 = Math.min(Math.max(moveStart.cropper.y1 + moveY, cropperPosition.y2 - cropperState.cropperScaledMaxHeight), cropperPosition.y2 - cropperState.cropperScaledMinHeight);
88
+ break;
89
+ case 'top':
90
+ cropperPosition.y1 = Math.min(Math.max(moveStart.cropper.y1 + moveY, cropperPosition.y2 - cropperState.cropperScaledMaxHeight), cropperPosition.y2 - cropperState.cropperScaledMinHeight);
91
+ break;
92
+ case 'topright':
93
+ cropperPosition.x2 = Math.max(Math.min(moveStart.cropper.x2 + moveX, cropperPosition.x1 + cropperState.cropperScaledMaxWidth), cropperPosition.x1 + cropperState.cropperScaledMinWidth);
94
+ cropperPosition.y1 = Math.min(Math.max(moveStart.cropper.y1 + moveY, cropperPosition.y2 - cropperState.cropperScaledMaxHeight), cropperPosition.y2 - cropperState.cropperScaledMinHeight);
95
+ break;
96
+ case 'right':
97
+ cropperPosition.x2 = Math.max(Math.min(moveStart.cropper.x2 + moveX, cropperPosition.x1 + cropperState.cropperScaledMaxWidth), cropperPosition.x1 + cropperState.cropperScaledMinWidth);
98
+ break;
99
+ case 'bottomright':
100
+ cropperPosition.x2 = Math.max(Math.min(moveStart.cropper.x2 + moveX, cropperPosition.x1 + cropperState.cropperScaledMaxWidth), cropperPosition.x1 + cropperState.cropperScaledMinWidth);
101
+ cropperPosition.y2 = Math.max(Math.min(moveStart.cropper.y2 + moveY, cropperPosition.y1 + cropperState.cropperScaledMaxHeight), cropperPosition.y1 + cropperState.cropperScaledMinHeight);
102
+ break;
103
+ case 'bottom':
104
+ cropperPosition.y2 = Math.max(Math.min(moveStart.cropper.y2 + moveY, cropperPosition.y1 + cropperState.cropperScaledMaxHeight), cropperPosition.y1 + cropperState.cropperScaledMinHeight);
105
+ break;
106
+ case 'bottomleft':
107
+ cropperPosition.x1 = Math.min(Math.max(moveStart.cropper.x1 + moveX, cropperPosition.x2 - cropperState.cropperScaledMaxWidth), cropperPosition.x2 - cropperState.cropperScaledMinWidth);
108
+ cropperPosition.y2 = Math.max(Math.min(moveStart.cropper.y2 + moveY, cropperPosition.y1 + cropperState.cropperScaledMaxHeight), cropperPosition.y1 + cropperState.cropperScaledMinHeight);
109
+ break;
110
+ case 'center':
111
+ const scale = 'scale' in event ? event.scale : 1;
112
+ const newWidth = Math.min(Math.max(cropperState.cropperScaledMinWidth, (Math.abs(moveStart.cropper.x2 - moveStart.cropper.x1)) * scale), cropperState.cropperScaledMaxWidth);
113
+ const newHeight = Math.min(Math.max(cropperState.cropperScaledMinHeight, (Math.abs(moveStart.cropper.y2 - moveStart.cropper.y1)) * scale), cropperState.cropperScaledMaxHeight);
114
+ cropperPosition.x1 = moveStart.clientX - newWidth / 2;
115
+ cropperPosition.x2 = moveStart.clientX + newWidth / 2;
116
+ cropperPosition.y1 = moveStart.clientY - newHeight / 2;
117
+ cropperPosition.y2 = moveStart.clientY + newHeight / 2;
118
+ if (cropperPosition.x1 < 0) {
119
+ cropperPosition.x2 -= cropperPosition.x1;
120
+ cropperPosition.x1 = 0;
121
+ }
122
+ else if (cropperPosition.x2 > cropperState.maxSize.width) {
123
+ cropperPosition.x1 -= (cropperPosition.x2 - cropperState.maxSize.width);
124
+ cropperPosition.x2 = cropperState.maxSize.width;
125
+ }
126
+ if (cropperPosition.y1 < 0) {
127
+ cropperPosition.y2 -= cropperPosition.y1;
128
+ cropperPosition.y1 = 0;
129
+ }
130
+ else if (cropperPosition.y2 > cropperState.maxSize.height) {
131
+ cropperPosition.y1 -= (cropperPosition.y2 - cropperState.maxSize.height);
132
+ cropperPosition.y2 = cropperState.maxSize.height;
133
+ }
134
+ break;
135
+ }
136
+ if (cropperState.options.maintainAspectRatio) {
137
+ return checkAspectRatio(moveStart.position, cropperPosition, cropperState);
138
+ }
139
+ else {
140
+ return cropperPosition;
141
+ }
142
+ }
143
+ export function checkAspectRatio(position, cropperPosition, cropperState) {
144
+ cropperPosition = { ...cropperPosition };
145
+ let overflowX = 0;
146
+ let overflowY = 0;
147
+ switch (position) {
148
+ case 'top':
149
+ cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * cropperState.options.aspectRatio;
150
+ overflowX = Math.max(cropperPosition.x2 - cropperState.maxSize.width, 0);
151
+ overflowY = Math.max(0 - cropperPosition.y1, 0);
152
+ if (overflowX > 0 || overflowY > 0) {
153
+ cropperPosition.x2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;
154
+ cropperPosition.y1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;
155
+ }
156
+ break;
157
+ case 'bottom':
158
+ cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * cropperState.options.aspectRatio;
159
+ overflowX = Math.max(cropperPosition.x2 - cropperState.maxSize.width, 0);
160
+ overflowY = Math.max(cropperPosition.y2 - cropperState.maxSize.height, 0);
161
+ if (overflowX > 0 || overflowY > 0) {
162
+ cropperPosition.x2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;
163
+ cropperPosition.y2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : (overflowX / cropperState.options.aspectRatio);
164
+ }
165
+ break;
166
+ case 'topleft':
167
+ cropperPosition.y1 = cropperPosition.y2 - (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;
168
+ overflowX = Math.max(0 - cropperPosition.x1, 0);
169
+ overflowY = Math.max(0 - cropperPosition.y1, 0);
170
+ if (overflowX > 0 || overflowY > 0) {
171
+ cropperPosition.x1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;
172
+ cropperPosition.y1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;
173
+ }
174
+ break;
175
+ case 'topright':
176
+ cropperPosition.y1 = cropperPosition.y2 - (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;
177
+ overflowX = Math.max(cropperPosition.x2 - cropperState.maxSize.width, 0);
178
+ overflowY = Math.max(0 - cropperPosition.y1, 0);
179
+ if (overflowX > 0 || overflowY > 0) {
180
+ cropperPosition.x2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;
181
+ cropperPosition.y1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;
182
+ }
183
+ break;
184
+ case 'right':
185
+ case 'bottomright':
186
+ cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;
187
+ overflowX = Math.max(cropperPosition.x2 - cropperState.maxSize.width, 0);
188
+ overflowY = Math.max(cropperPosition.y2 - cropperState.maxSize.height, 0);
189
+ if (overflowX > 0 || overflowY > 0) {
190
+ cropperPosition.x2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;
191
+ cropperPosition.y2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;
192
+ }
193
+ break;
194
+ case 'left':
195
+ case 'bottomleft':
196
+ cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;
197
+ overflowX = Math.max(0 - cropperPosition.x1, 0);
198
+ overflowY = Math.max(cropperPosition.y2 - cropperState.maxSize.height, 0);
199
+ if (overflowX > 0 || overflowY > 0) {
200
+ cropperPosition.x1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;
201
+ cropperPosition.y2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;
202
+ }
203
+ break;
204
+ case 'center':
205
+ cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * cropperState.options.aspectRatio;
206
+ cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;
207
+ const overflowX1 = Math.max(0 - cropperPosition.x1, 0);
208
+ const overflowX2 = Math.max(cropperPosition.x2 - cropperState.maxSize.width, 0);
209
+ const overflowY1 = Math.max(cropperPosition.y2 - cropperState.maxSize.height, 0);
210
+ const overflowY2 = Math.max(0 - cropperPosition.y1, 0);
211
+ if (overflowX1 > 0 || overflowX2 > 0 || overflowY1 > 0 || overflowY2 > 0) {
212
+ cropperPosition.x1 += (overflowY1 * cropperState.options.aspectRatio) > overflowX1 ? (overflowY1 * cropperState.options.aspectRatio) : overflowX1;
213
+ cropperPosition.x2 -= (overflowY2 * cropperState.options.aspectRatio) > overflowX2 ? (overflowY2 * cropperState.options.aspectRatio) : overflowX2;
214
+ cropperPosition.y1 += (overflowY2 * cropperState.options.aspectRatio) > overflowX2 ? overflowY2 : overflowX2 / cropperState.options.aspectRatio;
215
+ cropperPosition.y2 -= (overflowY1 * cropperState.options.aspectRatio) > overflowX1 ? overflowY1 : overflowX1 / cropperState.options.aspectRatio;
216
+ }
217
+ break;
218
+ }
219
+ return cropperPosition;
220
+ }
221
+ export function getClientX(event) {
222
+ if ('touches' in event && event.touches[0]) {
223
+ return event.touches[0].clientX;
224
+ }
225
+ else if ('clientX' in event) {
226
+ return event.clientX;
227
+ }
228
+ return 0;
229
+ }
230
+ export function getClientY(event) {
231
+ if ('touches' in event && event.touches[0]) {
232
+ return event.touches[0].clientY;
233
+ }
234
+ else if ('clientX' in event) {
235
+ return event.clientY;
236
+ }
237
+ return 0;
238
+ }
239
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcHBlci1wb3NpdGlvbi51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1pbWFnZS1jcm9wcGVyL3NyYy9saWIvdXRpbHMvY3JvcHBlci1wb3NpdGlvbi51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxNQUFNLFVBQVUsb0JBQW9CLENBQUMsZUFBZ0MsRUFBRSxZQUEwQixFQUFFLFlBQXFCO0lBQ3RILGVBQWUsR0FBRywyQkFBMkIsQ0FBQyxlQUFlLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDN0UsT0FBTywrQkFBK0IsQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ3RGLENBQUM7QUFFRCxNQUFNLFVBQVUsMkJBQTJCLENBQUMsZUFBZ0MsRUFBRSxZQUEwQjtJQUN0RyxJQUFJLFlBQVksR0FBRyxlQUFlLENBQUMsRUFBRSxHQUFHLGVBQWUsQ0FBQyxFQUFFLENBQUM7SUFDM0QsSUFBSSxhQUFhLEdBQUcsZUFBZSxDQUFDLEVBQUUsR0FBRyxlQUFlLENBQUMsRUFBRSxDQUFDO0lBQzVELE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxFQUFFLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUN0RCxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsRUFBRSxHQUFHLGFBQWEsR0FBRyxDQUFDLENBQUM7SUFFdkQsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLG1CQUFtQixJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUU7UUFDdkYsWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFRLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsa0JBQWtCO1lBQ2xGLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGtCQUFrQjtZQUN6QyxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQVEsQ0FBQyxLQUFLLENBQUM7UUFDaEMsYUFBYSxHQUFH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QUssQ0FBQyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFDcEQsUUFBUSxTQUFTLENBQUMsUUFBUSxFQUFFO1FBQzFCLEtBQUssTUFBTTtZQUNULGVBQWUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxlQUFlLENBQUMsRUFBRSxHQUFHLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxFQUMzSCxlQUFlLENBQUMsRUFBRSxHQUFHLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQzNELE1BQU07UUFDUixLQUFLLFNBQVM7WUFDWixlQUFlLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsZUFBZSxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUMscUJBQXFCLENBQUMsRUFDM0gsZUFBZSxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUMzRCxlQUFlLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsZUFBZSxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUMsc0JBQXNCLENBQUMsRUFDNUgsZUFBZSxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUM1RCxNQUFNO1FBQ1IsS0FBSyxLQUFLO1lBQ1IsZUFBZSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLGVBQWUsQ0FBQyxFQUFFLEdBQUcsWUFBWSxDQUFDLHNCQUFzQixDQUFDLEVBQzVILGVBQWUsQ0FBQyxFQUFF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RUQsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3JvcHBlclBvc2l0aW9uLCBNb3ZlU3RhcnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IENyb3BwZXJTdGF0ZSB9IGZyb20gJy4uL2NvbXBvbmVudC9jcm9wcGVyLnN0YXRlJztcbmltcG9ydCB7IEJhc2ljRXZlbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2Jhc2ljLWV2ZW50LmludGVyZmFjZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0Nyb3BwZXJQb3NpdGlvbihjcm9wcGVyUG9zaXRpb246IENyb3BwZXJQb3NpdGlvbiwgY3JvcHBlclN0YXRlOiBDcm9wcGVyU3RhdGUsIG1haW50YWluU2l6ZTogYm9vbGVhbik6IENyb3BwZXJQb3NpdGlvbiB7XG4gIGNyb3BwZXJQb3NpdGlvbiA9IGNoZWNrQ3JvcHBlclNpemVSZXN0cmljdGlvbihjcm9wcGVyUG9zaXRpb24sIGNyb3BwZXJTdGF0ZSk7XG4gIHJldHVybiBjaGVja0Nyb3BwZXJXaXRoaW5NYXhTaXplQm91bmRzKGNyb3BwZXJQb3NpdGlvbiwgY3JvcHBlclN0YXRlLCBtYWludGFpblNpemUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tDcm9wcGVyU2l6ZVJlc3RyaWN0aW9uKGNyb3BwZXJQb3NpdGlvbjogQ3JvcHBlclBvc2l0aW9uLCBjcm9wcGVyU3RhdGU6IENyb3BwZXJTdGF0ZSk6IENyb3BwZXJQb3NpdGlvbiB7XG4gIGxldCBjcm9wcGVyV2lkdGggPSBjcm9wcGVyUG9zaXRpb24ueDIgLSBjcm9wcGVyUG9zaXRpb24ueDE7XG4gIGxldCBjcm9wcGVySGVpZ2h0ID0gY3JvcHBlclBvc2l0aW9uLnkyIC0gY3JvcHBlclBvc2l0aW9uLnkxO1xuICBjb25zdCBjZW50ZXJYID0gY3JvcHBlclBvc2l0aW9uLngxICsgY3JvcHBlcldpZHRoIC8gMjtcbiAgY29uc3QgY2VudGVyWSA9IGNyb3BwZXJQb3NpdGlvbi55MSArIGNyb3BwZXJIZWlnaHQgLyAyO1xuXG4gIGlmIChjcm9wcGVyU3RhdGUub3B0aW9ucy5jcm9wcGVyU3RhdGljSGVpZ2h0ICYmIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmNyb3BwZXJTdGF0aWNXaWR0aCkge1xuICAgIGNyb3BwZXJXaWR0aCA9IGNyb3BwZXJTdGF0ZS5tYXhTaXplIS53aWR0aCA+IGNyb3BwZXJTdGF0ZS5vcHRpb25zLmNyb3BwZXJTdGF0aWNXaWR0aFxuICAgICAgPyBjcm9wcGVyU3RhdGUub3B0aW9ucy5jcm9wcGVyU3RhdGljV2lkdGhcbiAgICAgIDogY3JvcHBlclN0YXRlLm1heFNpemUhLndpZHRoO1xuICAgIGNyb3BwZXJIZWlnaHQgPSBjcm9wcGVyU3RhdGUubWF4U2l6ZSEuaGVpZ2h0ID4gY3JvcHBlclN0YXRlLm9wdGlvbnMuY3JvcHBlclN0YXRpY0hlaWdodFxuICAgICAgPyBjcm9wcGVyU3RhdGUub3B0aW9ucy5jcm9wcGVyU3RhdGljSGVpZ2h0XG4gICAgICA6IGNyb3BwZXJTdGF0ZS5tYXhTaXplIS5oZWlnaHQ7XG4gIH0gZWxzZSB7XG4gICAgY3JvcHBlcldpZHRoID0gTWF0aC5tYXgoY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNaW5XaWR0aCwgTWF0aC5taW4oY3JvcHBlcldpZHRoLCBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1heFdpZHRoLCBjcm9wcGVyU3RhdGUubWF4U2l6ZSEud2lkdGgpKTtcbiAgICBjcm9wcGVySGVpZ2h0ID0gTWF0aC5tYXgoY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNaW5IZWlnaHQsIE1hdGgubWluKGNyb3BwZXJIZWlnaHQsIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWF4SGVpZ2h0LCBjcm9wcGVyU3RhdGUubWF4U2l6ZSEuaGVpZ2h0KSk7XG4gICAgaWYgKGNyb3BwZXJTdGF0ZS5vcHRpb25zLm1haW50YWluQXNwZWN0UmF0aW8pIHtcbiAgICAgIGlmIChjcm9wcGVyU3RhdGUubWF4U2l6ZSEud2lkdGggLyBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbyA8IGNyb3BwZXJTdGF0ZS5tYXhTaXplIS5oZWlnaHQpIHtcbiAgICAgICAgY3JvcHBlckhlaWdodCA9IGNyb3BwZXJXaWR0aCAvIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3JvcHBlcldpZHRoID0gY3JvcHBlckhlaWdodCAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHgxID0gY2VudGVyWCAtIGNyb3BwZXJXaWR0aCAvIDI7XG4gIGNvbnN0IHgyID0geDEgKyBjcm9wcGVyV2lkdGg7XG4gIGNvbnN0IHkxID0gY2VudGVyWSAtIGNyb3BwZXJIZWlnaHQgLyAyO1xuICBjb25zdCB5MiA9IHkxICsgY3JvcHBlckhlaWdodDtcbiAgcmV0dXJuIHt4MSwgeDIsIHkxLCB5Mn07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0Nyb3BwZXJXaXRoaW5NYXhTaXplQm91bmRzKHBvc2l0aW9uOiBDcm9wcGVyUG9zaXRpb24sIGNyb3BwZXJTdGF0ZTogQ3JvcHBlclN0YXRlLCBtYWludGFpblNpemUgPSBmYWxzZSk6IENyb3BwZXJQb3NpdGlvbiB7XG4gIGlmIChwb3NpdGlvbi54MSA8IDApIHtcbiAgICBwb3NpdGlvbiA9IHtcbiAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgeDE6IDAsXG4gICAgICB4MjogcG9zaXRpb24ueDIgLSAobWFpbnRhaW5TaXplID8gcG9zaXRpb24ueDEgOiAwKVxuICAgIH07XG4gIH1cbiAgaWYgKHBvc2l0aW9uLnkxIDwgMCkge1xuICAgIHBvc2l0aW9uID0ge1xuICAgICAgLi4ucG9zaXRpb24sXG4gICAgICB5MjogcG9zaXRpb24ueTIgLSAobWFpbnRhaW5TaXplID8gcG9zaXRpb24ueTEgOiAwKSxcbiAgICAgIHkxOiAwXG4gICAgfTtcbiAgfVxuICBpZiAocG9zaXRpb24ueDIgPiBjcm9wcGVyU3RhdGUubWF4U2l6ZSEud2lkdGgpIHtcbiAgICBwb3NpdGlvbiA9IHtcbiAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgeDE6IHBvc2l0aW9uLngxIC0gKG1haW50YWluU2l6ZSA/IChwb3NpdGlvbi54MiAtIGNyb3BwZXJTdGF0ZS5tYXhTaXplIS53aWR0aCkgOiAwKSxcbiAgICAgIHgyOiBjcm9wcGVyU3RhdGUubWF4U2l6ZSEud2lkdGhcbiAgICB9O1xuICB9XG4gIGlmIChwb3NpdGlvbi55MiA+IGNyb3BwZXJTdGF0ZS5tYXhTaXplIS5oZWlnaHQpIHtcbiAgICBwb3NpdGlvbiA9IHtcbiAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgeTE6IHBvc2l0aW9uLnkxIC0gKG1haW50YWluU2l6ZSA/IChwb3NpdGlvbi55MiAtIGNyb3BwZXJTdGF0ZS5tYXhTaXplIS5oZWlnaHQpIDogMCksXG4gICAgICB5MjogY3JvcHBlclN0YXRlLm1heFNpemUhLmhlaWdodFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHBvc2l0aW9uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbW92ZUNyb3BwZXIoZXZlbnQ6IEV2ZW50IHwgQmFzaWNFdmVudCwgbW92ZVN0YXJ0OiBNb3ZlU3RhcnQpOiBDcm9wcGVyUG9zaXRpb24ge1xuICBjb25zdCBkaWZmWCA9IGdldENsaWVudFgoZXZlbnQpIC0gbW92ZVN0YXJ0LmNsaWVudFg7XG4gIGNvbnN0IGRpZmZZID0gZ2V0Q2xpZW50WShldmVudCkgLSBtb3ZlU3RhcnQuY2xpZW50WTtcblxuICByZXR1cm4ge1xuICAgIHgxOiBtb3ZlU3RhcnQuY3JvcHBlci54MSArIGRpZmZYLFxuICAgIHkxOiBtb3ZlU3RhcnQuY3JvcHBlci55MSArIGRpZmZZLFxuICAgIHgyOiBtb3ZlU3RhcnQuY3JvcHBlci54MiArIGRpZmZYLFxuICAgIHkyOiBtb3ZlU3RhcnQuY3JvcHBlci55MiArIGRpZmZZXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNpemVDcm9wcGVyKGV2ZW50OiBFdmVudCB8IEJhc2ljRXZlbnQsIG1vdmVTdGFydDogTW92ZVN0YXJ0LCBjcm9wcGVyU3RhdGU6IENyb3BwZXJTdGF0ZSk6IENyb3BwZXJQb3NpdGlvbiB7XG4gIGNvbnN0IGNyb3BwZXJQb3NpdGlvbiA9IHsuLi5jcm9wcGVyU3RhdGUuY3JvcHBlcn07XG4gIGNvbnN0IG1vdmVYID0gZ2V0Q2xpZW50WChldmVudCkgLSBtb3ZlU3RhcnQuY2xpZW50WDtcbiAgY29uc3QgbW92ZVkgPSBnZXRDbGllbnRZKGV2ZW50KSAtIG1vdmVTdGFydC5jbGllbnRZO1xuICBzd2l0Y2ggKG1vdmVTdGFydC5wb3NpdGlvbikge1xuICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgY3JvcHBlclBvc2l0aW9uLngxID0gTWF0aC5taW4oTWF0aC5tYXgobW92ZVN0YXJ0LmNyb3BwZXIueDEgKyBtb3ZlWCwgY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNYXhXaWR0aCksXG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiAtIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWluV2lkdGgpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndG9wbGVmdCc6XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueDEgPSBNYXRoLm1pbihNYXRoLm1heChtb3ZlU3RhcnQuY3JvcHBlci54MSArIG1vdmVYLCBjcm9wcGVyUG9zaXRpb24ueDIgLSBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1heFdpZHRoKSxcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNaW5XaWR0aCk7XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueTEgPSBNYXRoLm1pbihNYXRoLm1heChtb3ZlU3RhcnQuY3JvcHBlci55MSArIG1vdmVZLCBjcm9wcGVyUG9zaXRpb24ueTIgLSBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1heEhlaWdodCksXG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiAtIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWluSGVpZ2h0KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RvcCc6XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueTEgPSBNYXRoLm1pbihNYXRoLm1heChtb3ZlU3RhcnQuY3JvcHBlci55MSArIG1vdmVZLCBjcm9wcGVyUG9zaXRpb24ueTIgLSBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1heEhlaWdodCksXG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiAtIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWluSGVpZ2h0KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RvcHJpZ2h0JzpcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiA9IE1hdGgubWF4KE1hdGgubWluKG1vdmVTdGFydC5jcm9wcGVyLngyICsgbW92ZVgsIGNyb3BwZXJQb3NpdGlvbi54MSArIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWF4V2lkdGgpLFxuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDEgKyBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1pbldpZHRoKTtcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi55MSA9IE1hdGgubWluKE1hdGgubWF4KG1vdmVTdGFydC5jcm9wcGVyLnkxICsgbW92ZVksIGNyb3BwZXJQb3NpdGlvbi55MiAtIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWF4SGVpZ2h0KSxcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkyIC0gY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNaW5IZWlnaHQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncmlnaHQnOlxuICAgICAgY3JvcHBlclBvc2l0aW9uLngyID0gTWF0aC5tYXgoTWF0aC5taW4obW92ZVN0YXJ0LmNyb3BwZXIueDIgKyBtb3ZlWCwgY3JvcHBlclBvc2l0aW9uLngxICsgY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNYXhXaWR0aCksXG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MSArIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWluV2lkdGgpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYm90dG9tcmlnaHQnOlxuICAgICAgY3JvcHBlclBvc2l0aW9uLngyID0gTWF0aC5tYXgoTWF0aC5taW4obW92ZVN0YXJ0LmNyb3BwZXIueDIgKyBtb3ZlWCwgY3JvcHBlclBvc2l0aW9uLngxICsgY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNYXhXaWR0aCksXG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MSArIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWluV2lkdGgpO1xuICAgICAgY3JvcHBlclBvc2l0aW9uLnkyID0gTWF0aC5tYXgoTWF0aC5taW4obW92ZVN0YXJ0LmNyb3BwZXIueTIgKyBtb3ZlWSwgY3JvcHBlclBvc2l0aW9uLnkxICsgY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNYXhIZWlnaHQpLFxuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTEgKyBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1pbkhlaWdodCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdib3R0b20nOlxuICAgICAgY3JvcHBlclBvc2l0aW9uLnkyID0gTWF0aC5tYXgoTWF0aC5taW4obW92ZVN0YXJ0LmNyb3BwZXIueTIgKyBtb3ZlWSwgY3JvcHBlclBvc2l0aW9uLnkxICsgY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNYXhIZWlnaHQpLFxuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTEgKyBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1pbkhlaWdodCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdib3R0b21sZWZ0JzpcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi54MSA9IE1hdGgubWluKE1hdGgubWF4KG1vdmVTdGFydC5jcm9wcGVyLngxICsgbW92ZVgsIGNyb3BwZXJQb3NpdGlvbi54MiAtIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWF4V2lkdGgpLFxuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDIgLSBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1pbldpZHRoKTtcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiA9IE1hdGgubWF4KE1hdGgubWluKG1vdmVTdGFydC5jcm9wcGVyLnkyICsgbW92ZVksIGNyb3BwZXJQb3NpdGlvbi55MSArIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWF4SGVpZ2h0KSxcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkxICsgY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNaW5IZWlnaHQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnY2VudGVyJzpcbiAgICAgIGNvbnN0IHNjYWxlID0gJ3NjYWxlJyBpbiBldmVudCA/IGV2ZW50LnNjYWxlIGFzIG51bWJlciA6IDE7XG4gICAgICBjb25zdCBuZXdXaWR0aCA9IE1hdGgubWluKFxuICAgICAgICBNYXRoLm1heChjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1pbldpZHRoLCAoTWF0aC5hYnMobW92ZVN0YXJ0LmNyb3BwZXIueDIgLSBtb3ZlU3RhcnQuY3JvcHBlci54MSkpICogc2NhbGUpLFxuICAgICAgICBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1heFdpZHRoKTtcbiAgICAgIGNvbnN0IG5ld0hlaWdodCA9IE1hdGgubWluKFxuICAgICAgICBNYXRoLm1heChjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1pbkhlaWdodCwgKE1hdGguYWJzKG1vdmVTdGFydC5jcm9wcGVyLnkyIC0gbW92ZVN0YXJ0LmNyb3BwZXIueTEpKSAqIHNjYWxlKSxcbiAgICAgICAgY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNYXhIZWlnaHQpO1xuICAgICAgY3JvcHBlclBvc2l0aW9uLngxID0gbW92ZVN0YXJ0LmNsaWVudFggLSBuZXdXaWR0aCAvIDI7XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueDIgPSBtb3ZlU3RhcnQuY2xpZW50WCArIG5ld1dpZHRoIC8gMjtcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi55MSA9IG1vdmVTdGFydC5jbGllbnRZIC0gbmV3SGVpZ2h0IC8gMjtcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiA9IG1vdmVTdGFydC5jbGllbnRZICsgbmV3SGVpZ2h0IC8gMjtcbiAgICAgIGlmIChjcm9wcGVyUG9zaXRpb24ueDEgPCAwKSB7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiAtPSBjcm9wcGVyUG9zaXRpb24ueDE7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MSA9IDA7XG4gICAgICB9IGVsc2UgaWYgKGNyb3BwZXJQb3NpdGlvbi54MiA+IGNyb3BwZXJTdGF0ZS5tYXhTaXplIS53aWR0aCkge1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDEgLT0gKGNyb3BwZXJQb3NpdGlvbi54MiAtIGNyb3BwZXJTdGF0ZS5tYXhTaXplIS53aWR0aCk7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiA9IGNyb3BwZXJTdGF0ZS5tYXhTaXplIS53aWR0aDtcbiAgICAgIH1cbiAgICAgIGlmIChjcm9wcGVyUG9zaXRpb24ueTEgPCAwKSB7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiAtPSBjcm9wcGVyUG9zaXRpb24ueTE7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MSA9IDA7XG4gICAgICB9IGVsc2UgaWYgKGNyb3BwZXJQb3NpdGlvbi55MiA+IGNyb3BwZXJTdGF0ZS5tYXhTaXplIS5oZWlnaHQpIHtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkxIC09IChjcm9wcGVyUG9zaXRpb24ueTIgLSBjcm9wcGVyU3RhdGUubWF4U2l6ZSEuaGVpZ2h0KTtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkyID0gY3JvcHBlclN0YXRlLm1heFNpemUhLmhlaWdodDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgaWYgKGNyb3BwZXJTdGF0ZS5vcHRpb25zLm1haW50YWluQXNwZWN0UmF0aW8pIHtcbiAgICByZXR1cm4gY2hlY2tBc3BlY3RSYXRpbyhtb3ZlU3RhcnQucG9zaXRpb24hLCBjcm9wcGVyUG9zaXRpb24sIGNyb3BwZXJTdGF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNyb3BwZXJQb3NpdGlvbjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tBc3BlY3RSYXRpbyhwb3NpdGlvbjogc3RyaW5nLCBjcm9wcGVyUG9zaXRpb246IENyb3BwZXJQb3NpdGlvbiwgY3JvcHBlclN0YXRlOiBDcm9wcGVyU3RhdGUpOiBDcm9wcGVyUG9zaXRpb24ge1xuICBjcm9wcGVyUG9zaXRpb24gPSB7Li4uY3JvcHBlclBvc2l0aW9ufTtcbiAgbGV0IG92ZXJmbG93WCA9IDA7XG4gIGxldCBvdmVyZmxvd1kgPSAwO1xuICBzd2l0Y2ggKHBvc2l0aW9uKSB7XG4gICAgY2FzZSAndG9wJzpcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiA9IGNyb3BwZXJQb3NpdGlvbi54MSArIChjcm9wcGVyUG9zaXRpb24ueTIgLSBjcm9wcGVyUG9zaXRpb24ueTEpICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW87XG4gICAgICBvdmVyZmxvd1ggPSBNYXRoLm1heChjcm9wcGVyUG9zaXRpb24ueDIgLSBjcm9wcGVyU3RhdGUubWF4U2l6ZSEud2lkdGgsIDApO1xuICAgICAgb3ZlcmZsb3dZID0gTWF0aC5tYXgoMCAtIGNyb3BwZXJQb3NpdGlvbi55MSwgMCk7XG4gICAgICBpZiAob3ZlcmZsb3dYID4gMCB8fCBvdmVyZmxvd1kgPiAwKSB7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiAtPSAob3ZlcmZsb3dZICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pID4gb3ZlcmZsb3dYID8gKG92ZXJmbG93WSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKSA6IG92ZXJmbG93WDtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkxICs9IChvdmVyZmxvd1kgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgPiBvdmVyZmxvd1ggPyBvdmVyZmxvd1kgOiBvdmVyZmxvd1ggLyBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueDIgPSBjcm9wcGVyUG9zaXRpb24ueDEgKyAoY3JvcHBlclBvc2l0aW9uLnkyIC0gY3JvcHBlclBvc2l0aW9uLnkxKSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgb3ZlcmZsb3dYID0gTWF0aC5tYXgoY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclN0YXRlLm1heFNpemUhLndpZHRoLCAwKTtcbiAgICAgIG92ZXJmbG93WSA9IE1hdGgubWF4KGNyb3BwZXJQb3NpdGlvbi55MiAtIGNyb3BwZXJTdGF0ZS5tYXhTaXplIS5oZWlnaHQsIDApO1xuICAgICAgaWYgKG92ZXJmbG93WCA+IDAgfHwgb3ZlcmZsb3dZID4gMCkge1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDIgLT0gKG92ZXJmbG93WSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKSA+IG92ZXJmbG93WCA/IChvdmVyZmxvd1kgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgOiBvdmVyZmxvd1g7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiAtPSAob3ZlcmZsb3dZICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pID4gb3ZlcmZsb3dYID8gb3ZlcmZsb3dZIDogKG92ZXJmbG93WCAvIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RvcGxlZnQnOlxuICAgICAgY3JvcHBlclBvc2l0aW9uLnkxID0gY3JvcHBlclBvc2l0aW9uLnkyIC0gKGNyb3BwZXJQb3NpdGlvbi54MiAtIGNyb3BwZXJQb3NpdGlvbi54MSkgLyBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbztcbiAgICAgIG92ZXJmbG93WCA9IE1hdGgubWF4KDAgLSBjcm9wcGVyUG9zaXRpb24ueDEsIDApO1xuICAgICAgb3ZlcmZsb3dZID0gTWF0aC5tYXgoMCAtIGNyb3BwZXJQb3NpdGlvbi55MSwgMCk7XG4gICAgICBpZiAob3ZlcmZsb3dYID4gMCB8fCBvdmVyZmxvd1kgPiAwKSB7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MSArPSAob3ZlcmZsb3dZICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pID4gb3ZlcmZsb3dYID8gKG92ZXJmbG93WSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKSA6IG92ZXJmbG93WDtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkxICs9IChvdmVyZmxvd1kgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgPiBvdmVyZmxvd1ggPyBvdmVyZmxvd1kgOiBvdmVyZmxvd1ggLyBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RvcHJpZ2h0JzpcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi55MSA9IGNyb3BwZXJQb3NpdGlvbi55MiAtIChjcm9wcGVyUG9zaXRpb24ueDIgLSBjcm9wcGVyUG9zaXRpb24ueDEpIC8gY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW87XG4gICAgICBvdmVyZmxvd1ggPSBNYXRoLm1heChjcm9wcGVyUG9zaXRpb24ueDIgLSBjcm9wcGVyU3RhdGUubWF4U2l6ZSEud2lkdGgsIDApO1xuICAgICAgb3ZlcmZsb3dZID0gTWF0aC5tYXgoMCAtIGNyb3BwZXJQb3NpdGlvbi55MSwgMCk7XG4gICAgICBpZiAob3ZlcmZsb3dYID4gMCB8fCBvdmVyZmxvd1kgPiAwKSB7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiAtPSAob3ZlcmZsb3dZICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pID4gb3ZlcmZsb3dYID8gKG92ZXJmbG93WSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKSA6IG92ZXJmbG93WDtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkxICs9IChvdmVyZmxvd1kgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgPiBvdmVyZmxvd1ggPyBvdmVyZmxvd1kgOiBvdmVyZmxvd1ggLyBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICBjYXNlICdib3R0b21yaWdodCc6XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueTIgPSBjcm9wcGVyUG9zaXRpb24ueTEgKyAoY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclBvc2l0aW9uLngxKSAvIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgb3ZlcmZsb3dYID0gTWF0aC5tYXgoY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclN0YXRlLm1heFNpemUhLndpZHRoLCAwKTtcbiAgICAgIG92ZXJmbG93WSA9IE1hdGgubWF4KGNyb3BwZXJQb3NpdGlvbi55MiAtIGNyb3BwZXJTdGF0ZS5tYXhTaXplIS5oZWlnaHQsIDApO1xuICAgICAgaWYgKG92ZXJmbG93WCA+IDAgfHwgb3ZlcmZsb3dZID4gMCkge1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDIgLT0gKG92ZXJmbG93WSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKSA+IG92ZXJmbG93WCA/IChvdmVyZmxvd1kgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgOiBvdmVyZmxvd1g7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiAtPSAob3ZlcmZsb3dZICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pID4gb3ZlcmZsb3dYID8gb3ZlcmZsb3dZIDogb3ZlcmZsb3dYIC8gY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW87XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdsZWZ0JzpcbiAgICBjYXNlICdib3R0b21sZWZ0JzpcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiA9IGNyb3BwZXJQb3NpdGlvbi55MSArIChjcm9wcGVyUG9zaXRpb24ueDIgLSBjcm9wcGVyUG9zaXRpb24ueDEpIC8gY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW87XG4gICAgICBvdmVyZmxvd1ggPSBNYXRoLm1heCgwIC0gY3JvcHBlclBvc2l0aW9uLngxLCAwKTtcbiAgICAgIG92ZXJmbG93WSA9IE1hdGgubWF4KGNyb3BwZXJQb3NpdGlvbi55MiAtIGNyb3BwZXJTdGF0ZS5tYXhTaXplIS5oZWlnaHQsIDApO1xuICAgICAgaWYgKG92ZXJmbG93WCA+IDAgfHwgb3ZlcmZsb3dZID4gMCkge1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDEgKz0gKG92ZXJmbG93WSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKSA+IG92ZXJmbG93WCA/IChvdmVyZmxvd1kgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgOiBvdmVyZmxvd1g7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiAtPSAob3ZlcmZsb3dZICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pID4gb3ZlcmZsb3dYID8gb3ZlcmZsb3dZIDogb3ZlcmZsb3dYIC8gY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW87XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdjZW50ZXInOlxuICAgICAgY3JvcHBlclBvc2l0aW9uLngyID0gY3JvcHBlclBvc2l0aW9uLngxICsgKGNyb3BwZXJQb3NpdGlvbi55MiAtIGNyb3BwZXJQb3NpdGlvbi55MSkgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbztcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiA9IGNyb3BwZXJQb3NpdGlvbi55MSArIChjcm9wcGVyUG9zaXRpb24ueDIgLSBjcm9wcGVyUG9zaXRpb24ueDEpIC8gY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW87XG4gICAgICBjb25zdCBvdmVyZmxvd1gxID0gTWF0aC5tYXgoMCAtIGNyb3BwZXJQb3NpdGlvbi54MSwgMCk7XG4gICAgICBjb25zdCBvdmVyZmxvd1gyID0gTWF0aC5tYXgoY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclN0YXRlLm1heFNpemUhLndpZHRoLCAwKTtcbiAgICAgIGNvbnN0IG92ZXJmbG93WTEgPSBNYXRoLm1heChjcm9wcGVyUG9zaXRpb24ueTIgLSBjcm9wcGVyU3RhdGUubWF4U2l6ZSEuaGVpZ2h0LCAwKTtcbiAgICAgIGNvbnN0IG92ZXJmbG93WTIgPSBNYXRoLm1heCgwIC0gY3JvcHBlclBvc2l0aW9uLnkxLCAwKTtcbiAgICAgIGlmIChvdmVyZmxvd1gxID4gMCB8fCBvdmVyZmxvd1gyID4gMCB8fCBvdmVyZmxvd1kxID4gMCB8fCBvdmVyZmxvd1kyID4gMCkge1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDEgKz0gKG92ZXJmbG93WTEgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgPiBvdmVyZmxvd1gxID8gKG92ZXJmbG93WTEgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgOiBvdmVyZmxvd1gxO1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDIgLT0gKG92ZXJmbG93WTIgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgPiBvdmVyZmxvd1gyID8gKG92ZXJmbG93WTIgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgOiBvdmVyZmxvd1gyO1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTEgKz0gKG92ZXJmbG93WTIgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgPiBvdmVyZmxvd1gyID8gb3ZlcmZsb3dZMiA6IG92ZXJmbG93WDIgLyBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbztcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkyIC09IChvdmVyZmxvd1kxICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pID4gb3ZlcmZsb3dYMSA/IG92ZXJmbG93WTEgOiBvdmVyZmxvd1gxIC8gY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW87XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgfVxuICByZXR1cm4gY3JvcHBlclBvc2l0aW9uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2xpZW50WChldmVudDogRXZlbnQgfCBCYXNpY0V2ZW50IHwgVG91Y2hFdmVudCk6IG51bWJlciB7XG4gIGlmICgndG91Y2hlcycgaW4gZXZlbnQgJiYgZXZlbnQudG91Y2hlc1swXSkge1xuICAgIHJldHVybiBldmVudC50b3VjaGVzWzBdLmNsaWVudFg7XG4gIH0gZWxzZSBpZiAoJ2NsaWVudFgnIGluIGV2ZW50KSB7XG4gICAgcmV0dXJuIGV2ZW50LmNsaWVudFg7XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENsaWVudFkoZXZlbnQ6IEV2ZW50IHwgQmFzaWNFdmVudCB8IFRvdWNoRXZlbnQpOiBudW1iZXIge1xuICBpZiAoJ3RvdWNoZXMnIGluIGV2ZW50ICYmIGV2ZW50LnRvdWNoZXNbMF0pIHtcbiAgICByZXR1cm4gZXZlbnQudG91Y2hlc1swXS5jbGllbnRZO1xuICB9IGVsc2UgaWYgKCdjbGllbnRYJyBpbiBldmVudCkge1xuICAgIHJldHVybiBldmVudC5jbGllbnRZO1xuICB9XG5cbiAgcmV0dXJuIDA7XG59XG4iXX0=
@@ -37,4 +37,4 @@ export function getEventForKey(key, stepSize) {
37
37
  return { clientX: stepSize * -1, clientY: 0 };
38
38
  }
39
39
  }
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Ym9hcmQudXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtaW1hZ2UtY3JvcHBlci9zcmMvbGliL3V0aWxzL2tleWJvYXJkLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxHQUFXO0lBQzNDLFFBQVEsR0FBRyxFQUFFO1FBQ1gsS0FBSyxTQUFTO1lBQ1osT0FBTyxLQUFLLENBQUM7UUFDZixLQUFLLFlBQVk7WUFDZixPQUFPLE9BQU8sQ0FBQztRQUNqQixLQUFLLFdBQVc7WUFDZCxPQUFPLFFBQVEsQ0FBQztRQUNsQixLQUFLLFdBQVcsQ0FBQztRQUNqQjtZQUNFLE9BQU8sTUFBTSxDQUFDO0tBQ2pCO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxHQUFXO0lBQ25ELFFBQVEsR0FBRyxFQUFFO1FBQ1gsS0FBSyxTQUFTO1lBQ1osT0FBTyxRQUFRLENBQUM7UUFDbEIsS0FBSyxZQUFZO1lBQ2YsT0FBTyxNQUFNLENBQUM7UUFDaEIsS0FBSyxXQUFXO1lBQ2QsT0FBTyxLQUFLLENBQUM7UUFDZixLQUFLLFdBQVcsQ0FBQztRQUNqQjtZQUNFLE9BQU8sT0FBTyxDQUFDO0tBQ2xCO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsR0FBVyxFQUFFLFFBQWdCO0lBQzFELFFBQVEsR0FBRyxFQUFFO1FBQ1gsS0FBSyxTQUFTO1lBQ1osT0FBTyxFQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBQyxDQUFDO1FBQzlDLEtBQUssWUFBWTtZQUNmLE9BQU8sRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUMsQ0FBQztRQUN6QyxLQUFLLFdBQVc7WUFDZCxPQUFPLEVBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFDLENBQUM7UUFDekMsS0FBSyxXQUFXLENBQUM7UUFDakI7WUFDRSxPQUFPLEVBQUMsT0FBTyxFQUFFLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFDLENBQUM7S0FDL0M7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtCYXNpY0V2ZW50fSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9iYXNpYy1ldmVudC5pbnRlcmZhY2VcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBvc2l0aW9uRm9yS2V5KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgc3dpdGNoIChrZXkpIHtcbiAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgIHJldHVybiAndG9wJztcbiAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgIHJldHVybiAncmlnaHQnO1xuICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICByZXR1cm4gJ2JvdHRvbSc7XG4gICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICdsZWZ0JztcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW52ZXJ0ZWRQb3NpdGlvbkZvcktleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHN3aXRjaCAoa2V5KSB7XG4gICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICByZXR1cm4gJ2JvdHRvbSc7XG4gICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICByZXR1cm4gJ2xlZnQnO1xuICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICByZXR1cm4gJ3RvcCc7XG4gICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICdyaWdodCc7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV2ZW50Rm9yS2V5KGtleTogc3RyaW5nLCBzdGVwU2l6ZTogbnVtYmVyKTogQmFzaWNFdmVudCB7XG4gIHN3aXRjaCAoa2V5KSB7XG4gICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICByZXR1cm4ge2NsaWVudFg6IDAsIGNsaWVudFk6IHN0ZXBTaXplICogLTF9O1xuICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxuICAgICAgcmV0dXJuIHtjbGllbnRYOiBzdGVwU2l6ZSwgY2xpZW50WTogMH07XG4gICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgIHJldHVybiB7Y2xpZW50WDogMCwgY2xpZW50WTogc3RlcFNpemV9O1xuICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7Y2xpZW50WDogc3RlcFNpemUgKiAtMSwgY2xpZW50WTogMH07XG4gIH1cbn1cbiJdfQ==
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Ym9hcmQudXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtaW1hZ2UtY3JvcHBlci9zcmMvbGliL3V0aWxzL2tleWJvYXJkLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxHQUFXO0lBQzNDLFFBQVEsR0FBRyxFQUFFO1FBQ1gsS0FBSyxTQUFTO1lBQ1osT0FBTyxLQUFLLENBQUM7UUFDZixLQUFLLFlBQVk7WUFDZixPQUFPLE9BQU8sQ0FBQztRQUNqQixLQUFLLFdBQVc7WUFDZCxPQUFPLFFBQVEsQ0FBQztRQUNsQixLQUFLLFdBQVcsQ0FBQztRQUNqQjtZQUNFLE9BQU8sTUFBTSxDQUFDO0tBQ2pCO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxHQUFXO0lBQ25ELFFBQVEsR0FBRyxFQUFFO1FBQ1gsS0FBSyxTQUFTO1lBQ1osT0FBTyxRQUFRLENBQUM7UUFDbEIsS0FBSyxZQUFZO1lBQ2YsT0FBTyxNQUFNLENBQUM7UUFDaEIsS0FBSyxXQUFXO1lBQ2QsT0FBTyxLQUFLLENBQUM7UUFDZixLQUFLLFdBQVcsQ0FBQztRQUNqQjtZQUNFLE9BQU8sT0FBTyxDQUFDO0tBQ2xCO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsR0FBVyxFQUFFLFFBQWdCO0lBQzFELFFBQVEsR0FBRyxFQUFFO1FBQ1gsS0FBSyxTQUFTO1lBQ1osT0FBTyxFQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBQyxDQUFDO1FBQzlDLEtBQUssWUFBWTtZQUNmLE9BQU8sRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUMsQ0FBQztRQUN6QyxLQUFLLFdBQVc7WUFDZCxPQUFPLEVBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFDLENBQUM7UUFDekMsS0FBSyxXQUFXLENBQUM7UUFDakI7WUFDRSxPQUFPLEVBQUMsT0FBTyxFQUFFLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFDLENBQUM7S0FDL0M7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtCYXNpY0V2ZW50fSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9iYXNpYy1ldmVudC5pbnRlcmZhY2VcIjtcbmltcG9ydCB7UG9zaXRpb259IGZyb20gXCIuLi9pbnRlcmZhY2VzL21vdmUtc3RhcnQuaW50ZXJmYWNlXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb3NpdGlvbkZvcktleShrZXk6IHN0cmluZyk6IFBvc2l0aW9uIHtcbiAgc3dpdGNoIChrZXkpIHtcbiAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgIHJldHVybiAndG9wJztcbiAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgIHJldHVybiAncmlnaHQnO1xuICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICByZXR1cm4gJ2JvdHRvbSc7XG4gICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICdsZWZ0JztcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW52ZXJ0ZWRQb3NpdGlvbkZvcktleShrZXk6IHN0cmluZyk6IFBvc2l0aW9uIHtcbiAgc3dpdGNoIChrZXkpIHtcbiAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgIHJldHVybiAnYm90dG9tJztcbiAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgIHJldHVybiAnbGVmdCc7XG4gICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgIHJldHVybiAndG9wJztcbiAgICBjYXNlICdBcnJvd0xlZnQnOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJ3JpZ2h0JztcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXZlbnRGb3JLZXkoa2V5OiBzdHJpbmcsIHN0ZXBTaXplOiBudW1iZXIpOiBCYXNpY0V2ZW50IHtcbiAgc3dpdGNoIChrZXkpIHtcbiAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgIHJldHVybiB7Y2xpZW50WDogMCwgY2xpZW50WTogc3RlcFNpemUgKiAtMX07XG4gICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICByZXR1cm4ge2NsaWVudFg6IHN0ZXBTaXplLCBjbGllbnRZOiAwfTtcbiAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgcmV0dXJuIHtjbGllbnRYOiAwLCBjbGllbnRZOiBzdGVwU2l6ZX07XG4gICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHtjbGllbnRYOiBzdGVwU2l6ZSAqIC0xLCBjbGllbnRZOiAwfTtcbiAgfVxufVxuIl19